Lines Matching refs:ir

75 static void lirc_irctl_init(struct irctl *ir)  in lirc_irctl_init()  argument
77 mutex_init(&ir->irctl_lock); in lirc_irctl_init()
78 ir->d.minor = NOPLUG; in lirc_irctl_init()
81 static void lirc_irctl_cleanup(struct irctl *ir) in lirc_irctl_cleanup() argument
83 dev_dbg(ir->d.dev, LOGHEAD "cleaning up\n", ir->d.name, ir->d.minor); in lirc_irctl_cleanup()
85 device_destroy(lirc_class, MKDEV(MAJOR(lirc_base_dev), ir->d.minor)); in lirc_irctl_cleanup()
87 if (ir->buf != ir->d.rbuf) { in lirc_irctl_cleanup()
88 lirc_buffer_free(ir->buf); in lirc_irctl_cleanup()
89 kfree(ir->buf); in lirc_irctl_cleanup()
91 ir->buf = NULL; in lirc_irctl_cleanup()
98 static int lirc_add_to_buf(struct irctl *ir) in lirc_add_to_buf() argument
100 if (ir->d.add_to_buf) { in lirc_add_to_buf()
109 res = ir->d.add_to_buf(ir->d.data, ir->buf); in lirc_add_to_buf()
116 kthread_stop(ir->task); in lirc_add_to_buf()
128 struct irctl *ir = irctl; in lirc_thread() local
130 dev_dbg(ir->d.dev, LOGHEAD "poll thread started\n", in lirc_thread()
131 ir->d.name, ir->d.minor); in lirc_thread()
134 if (ir->open) { in lirc_thread()
135 if (ir->jiffies_to_wait) { in lirc_thread()
137 schedule_timeout(ir->jiffies_to_wait); in lirc_thread()
141 if (!lirc_add_to_buf(ir)) in lirc_thread()
142 wake_up_interruptible(&ir->buf->wait_poll); in lirc_thread()
149 dev_dbg(ir->d.dev, LOGHEAD "poll thread ended\n", in lirc_thread()
150 ir->d.name, ir->d.minor); in lirc_thread()
170 static int lirc_cdev_add(struct irctl *ir) in lirc_cdev_add() argument
173 struct lirc_driver *d = &ir->d; in lirc_cdev_add()
197 ir->cdev = cdev; in lirc_cdev_add()
208 struct irctl *ir; in lirc_register_driver() local
298 ir = kzalloc(sizeof(struct irctl), GFP_KERNEL); in lirc_register_driver()
299 if (!ir) { in lirc_register_driver()
303 lirc_irctl_init(ir); in lirc_register_driver()
304 irctls[minor] = ir; in lirc_register_driver()
308 ir->jiffies_to_wait = HZ / d->sample_rate; in lirc_register_driver()
311 ir->jiffies_to_wait = 0; in lirc_register_driver()
323 ir->buf = d->rbuf; in lirc_register_driver()
325 ir->buf = kmalloc(sizeof(struct lirc_buffer), GFP_KERNEL); in lirc_register_driver()
326 if (!ir->buf) { in lirc_register_driver()
330 err = lirc_buffer_init(ir->buf, chunk_size, buffer_size); in lirc_register_driver()
332 kfree(ir->buf); in lirc_register_driver()
336 ir->chunk_size = ir->buf->chunk_size; in lirc_register_driver()
341 ir->d = *d; in lirc_register_driver()
343 device_create(lirc_class, ir->d.dev, in lirc_register_driver()
344 MKDEV(MAJOR(lirc_base_dev), ir->d.minor), NULL, in lirc_register_driver()
345 "lirc%u", ir->d.minor); in lirc_register_driver()
349 ir->task = kthread_run(lirc_thread, (void *)ir, "lirc_dev"); in lirc_register_driver()
350 if (IS_ERR(ir->task)) { in lirc_register_driver()
359 err = lirc_cdev_add(ir); in lirc_register_driver()
363 ir->attached = 1; in lirc_register_driver()
366 dev_info(ir->d.dev, "lirc_dev: driver %s registered at minor = %d\n", in lirc_register_driver()
367 ir->d.name, ir->d.minor); in lirc_register_driver()
371 device_destroy(lirc_class, MKDEV(MAJOR(lirc_base_dev), ir->d.minor)); in lirc_register_driver()
381 struct irctl *ir; in lirc_unregister_driver() local
390 ir = irctls[minor]; in lirc_unregister_driver()
391 if (!ir) { in lirc_unregister_driver()
397 cdev = ir->cdev; in lirc_unregister_driver()
401 if (ir->d.minor != minor) { in lirc_unregister_driver()
409 if (ir->task) in lirc_unregister_driver()
410 kthread_stop(ir->task); in lirc_unregister_driver()
412 dev_dbg(ir->d.dev, "lirc_dev: driver %s unregistered from minor = %d\n", in lirc_unregister_driver()
413 ir->d.name, ir->d.minor); in lirc_unregister_driver()
415 ir->attached = 0; in lirc_unregister_driver()
416 if (ir->open) { in lirc_unregister_driver()
417 dev_dbg(ir->d.dev, LOGHEAD "releasing opened driver\n", in lirc_unregister_driver()
418 ir->d.name, ir->d.minor); in lirc_unregister_driver()
419 wake_up_interruptible(&ir->buf->wait_poll); in lirc_unregister_driver()
420 mutex_lock(&ir->irctl_lock); in lirc_unregister_driver()
421 ir->d.set_use_dec(ir->d.data); in lirc_unregister_driver()
423 mutex_unlock(&ir->irctl_lock); in lirc_unregister_driver()
425 lirc_irctl_cleanup(ir); in lirc_unregister_driver()
428 kfree(ir); in lirc_unregister_driver()
440 struct irctl *ir; in lirc_dev_fop_open() local
453 ir = irctls[iminor(inode)]; in lirc_dev_fop_open()
454 if (!ir) { in lirc_dev_fop_open()
459 dev_dbg(ir->d.dev, LOGHEAD "open called\n", ir->d.name, ir->d.minor); in lirc_dev_fop_open()
461 if (ir->d.minor == NOPLUG) { in lirc_dev_fop_open()
466 if (ir->open) { in lirc_dev_fop_open()
471 if (ir->d.rdev) { in lirc_dev_fop_open()
472 retval = rc_open(ir->d.rdev); in lirc_dev_fop_open()
477 cdev = ir->cdev; in lirc_dev_fop_open()
479 ir->open++; in lirc_dev_fop_open()
480 retval = ir->d.set_use_inc(ir->d.data); in lirc_dev_fop_open()
484 ir->open--; in lirc_dev_fop_open()
486 lirc_buffer_clear(ir->buf); in lirc_dev_fop_open()
488 if (ir->task) in lirc_dev_fop_open()
489 wake_up_process(ir->task); in lirc_dev_fop_open()
493 if (ir) in lirc_dev_fop_open()
494 dev_dbg(ir->d.dev, LOGHEAD "open result = %d\n", in lirc_dev_fop_open()
495 ir->d.name, ir->d.minor, retval); in lirc_dev_fop_open()
507 struct irctl *ir = irctls[iminor(inode)]; in lirc_dev_fop_close() local
510 if (!ir) { in lirc_dev_fop_close()
515 cdev = ir->cdev; in lirc_dev_fop_close()
517 dev_dbg(ir->d.dev, LOGHEAD "close called\n", ir->d.name, ir->d.minor); in lirc_dev_fop_close()
521 rc_close(ir->d.rdev); in lirc_dev_fop_close()
523 ir->open--; in lirc_dev_fop_close()
524 if (ir->attached) { in lirc_dev_fop_close()
525 ir->d.set_use_dec(ir->d.data); in lirc_dev_fop_close()
528 lirc_irctl_cleanup(ir); in lirc_dev_fop_close()
530 irctls[ir->d.minor] = NULL; in lirc_dev_fop_close()
532 kfree(ir); in lirc_dev_fop_close()
543 struct irctl *ir = irctls[iminor(file_inode(file))]; in lirc_dev_fop_poll() local
546 if (!ir) { in lirc_dev_fop_poll()
551 dev_dbg(ir->d.dev, LOGHEAD "poll called\n", ir->d.name, ir->d.minor); in lirc_dev_fop_poll()
553 if (!ir->attached) in lirc_dev_fop_poll()
556 if (ir->buf) { in lirc_dev_fop_poll()
557 poll_wait(file, &ir->buf->wait_poll, wait); in lirc_dev_fop_poll()
559 if (lirc_buffer_empty(ir->buf)) in lirc_dev_fop_poll()
566 dev_dbg(ir->d.dev, LOGHEAD "poll result = %d\n", in lirc_dev_fop_poll()
567 ir->d.name, ir->d.minor, ret); in lirc_dev_fop_poll()
577 struct irctl *ir = irctls[iminor(file_inode(file))]; in lirc_dev_fop_ioctl() local
579 if (!ir) { in lirc_dev_fop_ioctl()
584 dev_dbg(ir->d.dev, LOGHEAD "ioctl called (0x%x)\n", in lirc_dev_fop_ioctl()
585 ir->d.name, ir->d.minor, cmd); in lirc_dev_fop_ioctl()
587 if (ir->d.minor == NOPLUG || !ir->attached) { in lirc_dev_fop_ioctl()
588 dev_dbg(ir->d.dev, LOGHEAD "ioctl result = -ENODEV\n", in lirc_dev_fop_ioctl()
589 ir->d.name, ir->d.minor); in lirc_dev_fop_ioctl()
593 mutex_lock(&ir->irctl_lock); in lirc_dev_fop_ioctl()
597 result = put_user(ir->d.features, (__u32 __user *)arg); in lirc_dev_fop_ioctl()
600 if (!(ir->d.features & LIRC_CAN_REC_MASK)) { in lirc_dev_fop_ioctl()
606 (ir->d.features & LIRC_CAN_REC_MASK), in lirc_dev_fop_ioctl()
610 if (!(ir->d.features & LIRC_CAN_REC_MASK)) { in lirc_dev_fop_ioctl()
616 if (!result && !(LIRC_MODE2REC(mode) & ir->d.features)) in lirc_dev_fop_ioctl()
624 result = put_user(ir->d.code_length, (__u32 __user *)arg); in lirc_dev_fop_ioctl()
627 if (!(ir->d.features & LIRC_CAN_SET_REC_TIMEOUT) || in lirc_dev_fop_ioctl()
628 ir->d.min_timeout == 0) { in lirc_dev_fop_ioctl()
633 result = put_user(ir->d.min_timeout, (__u32 __user *)arg); in lirc_dev_fop_ioctl()
636 if (!(ir->d.features & LIRC_CAN_SET_REC_TIMEOUT) || in lirc_dev_fop_ioctl()
637 ir->d.max_timeout == 0) { in lirc_dev_fop_ioctl()
642 result = put_user(ir->d.max_timeout, (__u32 __user *)arg); in lirc_dev_fop_ioctl()
648 dev_dbg(ir->d.dev, LOGHEAD "ioctl result = %d\n", in lirc_dev_fop_ioctl()
649 ir->d.name, ir->d.minor, result); in lirc_dev_fop_ioctl()
651 mutex_unlock(&ir->irctl_lock); in lirc_dev_fop_ioctl()
662 struct irctl *ir = irctls[iminor(file_inode(file))]; in lirc_dev_fop_read() local
667 if (!ir) { in lirc_dev_fop_read()
672 dev_dbg(ir->d.dev, LOGHEAD "read called\n", ir->d.name, ir->d.minor); in lirc_dev_fop_read()
674 buf = kzalloc(ir->chunk_size, GFP_KERNEL); in lirc_dev_fop_read()
678 if (mutex_lock_interruptible(&ir->irctl_lock)) { in lirc_dev_fop_read()
682 if (!ir->attached) { in lirc_dev_fop_read()
687 if (length % ir->chunk_size) { in lirc_dev_fop_read()
697 add_wait_queue(&ir->buf->wait_poll, &wait); in lirc_dev_fop_read()
705 if (lirc_buffer_empty(ir->buf)) { in lirc_dev_fop_read()
721 mutex_unlock(&ir->irctl_lock); in lirc_dev_fop_read()
725 if (mutex_lock_interruptible(&ir->irctl_lock)) { in lirc_dev_fop_read()
727 remove_wait_queue(&ir->buf->wait_poll, &wait); in lirc_dev_fop_read()
732 if (!ir->attached) { in lirc_dev_fop_read()
737 lirc_buffer_read(ir->buf, buf); in lirc_dev_fop_read()
739 ir->buf->chunk_size); in lirc_dev_fop_read()
741 written += ir->buf->chunk_size; in lirc_dev_fop_read()
747 remove_wait_queue(&ir->buf->wait_poll, &wait); in lirc_dev_fop_read()
751 mutex_unlock(&ir->irctl_lock); in lirc_dev_fop_read()
755 dev_dbg(ir->d.dev, LOGHEAD "read result = %s (%d)\n", in lirc_dev_fop_read()
756 ir->d.name, ir->d.minor, ret ? "<fail>" : "<ok>", ret); in lirc_dev_fop_read()
772 struct irctl *ir = irctls[iminor(file_inode(file))]; in lirc_dev_fop_write() local
774 if (!ir) { in lirc_dev_fop_write()
779 dev_dbg(ir->d.dev, LOGHEAD "write called\n", ir->d.name, ir->d.minor); in lirc_dev_fop_write()
781 if (!ir->attached) in lirc_dev_fop_write()