Lines Matching +full:scan +full:- +full:count
1 // SPDX-License-Identifier: GPL-2.0-or-later
19 #include "rc-core-priv.h"
33 * lirc_raw_event() - Send raw IR data to lirc to be relayed to userspace
53 dev_dbg(&dev->dev, "delivering overflow to lirc_dev\n"); in lirc_raw_event()
58 dev_dbg(&dev->dev, "carrier report (freq: %d)\n", sample); in lirc_raw_event()
62 dev->gap_start = ktime_get(); in lirc_raw_event()
65 dev_dbg(&dev->dev, "timeout report (duration: %d)\n", sample); in lirc_raw_event()
69 if (dev->gap_start) { in lirc_raw_event()
71 dev->gap_start); in lirc_raw_event()
76 spin_lock_irqsave(&dev->lirc_fh_lock, flags); in lirc_raw_event()
77 list_for_each_entry(fh, &dev->lirc_fh, list) in lirc_raw_event()
78 kfifo_put(&fh->rawir, LIRC_SPACE(duration)); in lirc_raw_event()
79 spin_unlock_irqrestore(&dev->lirc_fh_lock, flags); in lirc_raw_event()
80 dev->gap_start = 0; in lirc_raw_event()
85 dev_dbg(&dev->dev, "delivering %uus %s to lirc_dev\n", in lirc_raw_event()
95 spin_lock_irqsave(&dev->lirc_fh_lock, flags); in lirc_raw_event()
96 list_for_each_entry(fh, &dev->lirc_fh, list) { in lirc_raw_event()
97 if (kfifo_put(&fh->rawir, sample)) in lirc_raw_event()
98 wake_up_poll(&fh->wait_poll, EPOLLIN | EPOLLRDNORM); in lirc_raw_event()
100 spin_unlock_irqrestore(&dev->lirc_fh_lock, flags); in lirc_raw_event()
104 * lirc_scancode_event() - Send scancode data to lirc to be relayed to
114 lsc->timestamp = ktime_get_ns(); in lirc_scancode_event()
116 spin_lock_irqsave(&dev->lirc_fh_lock, flags); in lirc_scancode_event()
117 list_for_each_entry(fh, &dev->lirc_fh, list) { in lirc_scancode_event()
118 if (kfifo_put(&fh->scancodes, *lsc)) in lirc_scancode_event()
119 wake_up_poll(&fh->wait_poll, EPOLLIN | EPOLLRDNORM); in lirc_scancode_event()
121 spin_unlock_irqrestore(&dev->lirc_fh_lock, flags); in lirc_scancode_event()
127 struct rc_dev *dev = container_of(inode->i_cdev, struct rc_dev, in lirc_open()
134 return -ENOMEM; in lirc_open()
136 get_device(&dev->dev); in lirc_open()
138 if (!dev->registered) { in lirc_open()
139 retval = -ENODEV; in lirc_open()
143 if (dev->driver_type == RC_DRIVER_IR_RAW) { in lirc_open()
144 if (kfifo_alloc(&fh->rawir, MAX_IR_EVENT_SIZE, GFP_KERNEL)) { in lirc_open()
145 retval = -ENOMEM; in lirc_open()
150 if (dev->driver_type != RC_DRIVER_IR_RAW_TX) { in lirc_open()
151 if (kfifo_alloc(&fh->scancodes, 32, GFP_KERNEL)) { in lirc_open()
152 retval = -ENOMEM; in lirc_open()
157 fh->send_mode = LIRC_MODE_PULSE; in lirc_open()
158 fh->rc = dev; in lirc_open()
160 if (dev->driver_type == RC_DRIVER_SCANCODE) in lirc_open()
161 fh->rec_mode = LIRC_MODE_SCANCODE; in lirc_open()
163 fh->rec_mode = LIRC_MODE_MODE2; in lirc_open()
169 init_waitqueue_head(&fh->wait_poll); in lirc_open()
171 file->private_data = fh; in lirc_open()
172 spin_lock_irqsave(&dev->lirc_fh_lock, flags); in lirc_open()
173 list_add(&fh->list, &dev->lirc_fh); in lirc_open()
174 spin_unlock_irqrestore(&dev->lirc_fh_lock, flags); in lirc_open()
180 if (dev->driver_type != RC_DRIVER_IR_RAW_TX) in lirc_open()
181 kfifo_free(&fh->scancodes); in lirc_open()
183 if (dev->driver_type == RC_DRIVER_IR_RAW) in lirc_open()
184 kfifo_free(&fh->rawir); in lirc_open()
187 put_device(&dev->dev); in lirc_open()
194 struct lirc_fh *fh = file->private_data; in lirc_close()
195 struct rc_dev *dev = fh->rc; in lirc_close()
198 spin_lock_irqsave(&dev->lirc_fh_lock, flags); in lirc_close()
199 list_del(&fh->list); in lirc_close()
200 spin_unlock_irqrestore(&dev->lirc_fh_lock, flags); in lirc_close()
202 if (dev->driver_type == RC_DRIVER_IR_RAW) in lirc_close()
203 kfifo_free(&fh->rawir); in lirc_close()
204 if (dev->driver_type != RC_DRIVER_IR_RAW_TX) in lirc_close()
205 kfifo_free(&fh->scancodes); in lirc_close()
209 put_device(&dev->dev); in lirc_close()
217 struct lirc_fh *fh = file->private_data; in lirc_transmit()
218 struct rc_dev *dev = fh->rc; in lirc_transmit()
222 size_t count; in lirc_transmit() local
228 ret = mutex_lock_interruptible(&dev->lock); in lirc_transmit()
232 if (!dev->registered) { in lirc_transmit()
233 ret = -ENODEV; in lirc_transmit()
237 if (!dev->tx_ir) { in lirc_transmit()
238 ret = -EINVAL; in lirc_transmit()
242 if (fh->send_mode == LIRC_MODE_SCANCODE) { in lirc_transmit()
243 struct lirc_scancode scan; in lirc_transmit() local
245 if (n != sizeof(scan)) { in lirc_transmit()
246 ret = -EINVAL; in lirc_transmit()
250 if (copy_from_user(&scan, buf, sizeof(scan))) { in lirc_transmit()
251 ret = -EFAULT; in lirc_transmit()
255 if (scan.flags || scan.keycode || scan.timestamp || in lirc_transmit()
256 scan.rc_proto > RC_PROTO_MAX) { in lirc_transmit()
257 ret = -EINVAL; in lirc_transmit()
261 /* We only have encoders for 32-bit protocols. */ in lirc_transmit()
262 if (scan.scancode > U32_MAX || in lirc_transmit()
263 !rc_validate_scancode(scan.rc_proto, scan.scancode)) { in lirc_transmit()
264 ret = -EINVAL; in lirc_transmit()
270 ret = -ENOMEM; in lirc_transmit()
274 ret = ir_raw_encode_scancode(scan.rc_proto, scan.scancode, in lirc_transmit()
281 count = ret - 1; in lirc_transmit()
283 count = ret; in lirc_transmit()
285 txbuf = kmalloc_array(count, sizeof(unsigned int), GFP_KERNEL); in lirc_transmit()
287 ret = -ENOMEM; in lirc_transmit()
291 for (i = 0; i < count; i++) in lirc_transmit()
294 if (dev->s_tx_carrier) { in lirc_transmit()
295 int carrier = ir_raw_encode_carrier(scan.rc_proto); in lirc_transmit()
298 dev->s_tx_carrier(dev, carrier); in lirc_transmit()
302 ret = -EINVAL; in lirc_transmit()
306 count = n / sizeof(unsigned int); in lirc_transmit()
307 if (count > LIRCBUF_SIZE || count % 2 == 0) { in lirc_transmit()
308 ret = -EINVAL; in lirc_transmit()
319 for (i = 0; i < count; i++) { in lirc_transmit()
320 if (txbuf[i] > IR_MAX_DURATION - duration || !txbuf[i]) { in lirc_transmit()
321 ret = -EINVAL; in lirc_transmit()
330 ret = dev->tx_ir(dev, txbuf, count); in lirc_transmit()
336 mutex_unlock(&dev->lock); in lirc_transmit()
356 mutex_unlock(&dev->lock); in lirc_transmit()
362 struct lirc_fh *fh = file->private_data; in lirc_ioctl()
363 struct rc_dev *dev = fh->rc; in lirc_ioctl()
374 ret = mutex_lock_interruptible(&dev->lock); in lirc_ioctl()
378 if (!dev->registered) { in lirc_ioctl()
379 ret = -ENODEV; in lirc_ioctl()
385 if (dev->driver_type == RC_DRIVER_SCANCODE) in lirc_ioctl()
388 if (dev->driver_type == RC_DRIVER_IR_RAW) { in lirc_ioctl()
390 if (dev->rx_resolution) in lirc_ioctl()
394 if (dev->tx_ir) { in lirc_ioctl()
396 if (dev->s_tx_mask) in lirc_ioctl()
398 if (dev->s_tx_carrier) in lirc_ioctl()
400 if (dev->s_tx_duty_cycle) in lirc_ioctl()
404 if (dev->s_rx_carrier_range) in lirc_ioctl()
408 if (dev->s_wideband_receiver) in lirc_ioctl()
411 if (dev->s_carrier_report) in lirc_ioctl()
414 if (dev->max_timeout) in lirc_ioctl()
421 if (dev->driver_type == RC_DRIVER_IR_RAW_TX) in lirc_ioctl()
422 ret = -ENOTTY; in lirc_ioctl()
424 val = fh->rec_mode; in lirc_ioctl()
428 switch (dev->driver_type) { in lirc_ioctl()
430 ret = -ENOTTY; in lirc_ioctl()
434 ret = -EINVAL; in lirc_ioctl()
439 ret = -EINVAL; in lirc_ioctl()
444 fh->rec_mode = val; in lirc_ioctl()
448 if (!dev->tx_ir) in lirc_ioctl()
449 ret = -ENOTTY; in lirc_ioctl()
451 val = fh->send_mode; in lirc_ioctl()
455 if (!dev->tx_ir) in lirc_ioctl()
456 ret = -ENOTTY; in lirc_ioctl()
458 ret = -EINVAL; in lirc_ioctl()
460 fh->send_mode = val; in lirc_ioctl()
465 if (!dev->s_tx_mask) in lirc_ioctl()
466 ret = -ENOTTY; in lirc_ioctl()
468 ret = dev->s_tx_mask(dev, val); in lirc_ioctl()
472 if (!dev->s_tx_carrier) in lirc_ioctl()
473 ret = -ENOTTY; in lirc_ioctl()
475 ret = dev->s_tx_carrier(dev, val); in lirc_ioctl()
479 if (!dev->s_tx_duty_cycle) in lirc_ioctl()
480 ret = -ENOTTY; in lirc_ioctl()
482 ret = -EINVAL; in lirc_ioctl()
484 ret = dev->s_tx_duty_cycle(dev, val); in lirc_ioctl()
489 if (!dev->s_rx_carrier_range) in lirc_ioctl()
490 ret = -ENOTTY; in lirc_ioctl()
492 ret = -EINVAL; in lirc_ioctl()
494 ret = dev->s_rx_carrier_range(dev, fh->carrier_low, in lirc_ioctl()
499 if (!dev->s_rx_carrier_range) in lirc_ioctl()
500 ret = -ENOTTY; in lirc_ioctl()
502 ret = -EINVAL; in lirc_ioctl()
504 fh->carrier_low = val; in lirc_ioctl()
508 if (!dev->rx_resolution) in lirc_ioctl()
509 ret = -ENOTTY; in lirc_ioctl()
511 val = dev->rx_resolution; in lirc_ioctl()
515 if (!dev->s_wideband_receiver) in lirc_ioctl()
516 ret = -ENOTTY; in lirc_ioctl()
518 ret = dev->s_wideband_receiver(dev, !!val); in lirc_ioctl()
522 if (!dev->s_carrier_report) in lirc_ioctl()
523 ret = -ENOTTY; in lirc_ioctl()
525 ret = dev->s_carrier_report(dev, !!val); in lirc_ioctl()
530 if (!dev->max_timeout) in lirc_ioctl()
531 ret = -ENOTTY; in lirc_ioctl()
533 val = dev->min_timeout; in lirc_ioctl()
537 if (!dev->max_timeout) in lirc_ioctl()
538 ret = -ENOTTY; in lirc_ioctl()
540 val = dev->max_timeout; in lirc_ioctl()
544 if (!dev->max_timeout) { in lirc_ioctl()
545 ret = -ENOTTY; in lirc_ioctl()
547 if (val < dev->min_timeout || val > dev->max_timeout) in lirc_ioctl()
548 ret = -EINVAL; in lirc_ioctl()
549 else if (dev->s_timeout) in lirc_ioctl()
550 ret = dev->s_timeout(dev, val); in lirc_ioctl()
552 dev->timeout = val; in lirc_ioctl()
557 if (!dev->timeout) in lirc_ioctl()
558 ret = -ENOTTY; in lirc_ioctl()
560 val = dev->timeout; in lirc_ioctl()
564 if (dev->driver_type != RC_DRIVER_IR_RAW) in lirc_ioctl()
565 ret = -ENOTTY; in lirc_ioctl()
569 ret = -ENOTTY; in lirc_ioctl()
576 mutex_unlock(&dev->lock); in lirc_ioctl()
582 struct lirc_fh *fh = file->private_data; in lirc_poll()
583 struct rc_dev *rcdev = fh->rc; in lirc_poll()
586 poll_wait(file, &fh->wait_poll, wait); in lirc_poll()
588 if (!rcdev->registered) { in lirc_poll()
590 } else if (rcdev->driver_type != RC_DRIVER_IR_RAW_TX) { in lirc_poll()
591 if (fh->rec_mode == LIRC_MODE_SCANCODE && in lirc_poll()
592 !kfifo_is_empty(&fh->scancodes)) in lirc_poll()
595 if (fh->rec_mode == LIRC_MODE_MODE2 && in lirc_poll()
596 !kfifo_is_empty(&fh->rawir)) in lirc_poll()
606 struct lirc_fh *fh = file->private_data; in lirc_read_mode2()
607 struct rc_dev *rcdev = fh->rc; in lirc_read_mode2()
612 return -EINVAL; in lirc_read_mode2()
615 if (kfifo_is_empty(&fh->rawir)) { in lirc_read_mode2()
616 if (file->f_flags & O_NONBLOCK) in lirc_read_mode2()
617 return -EAGAIN; in lirc_read_mode2()
619 ret = wait_event_interruptible(fh->wait_poll, in lirc_read_mode2()
620 !kfifo_is_empty(&fh->rawir) || in lirc_read_mode2()
621 !rcdev->registered); in lirc_read_mode2()
626 if (!rcdev->registered) in lirc_read_mode2()
627 return -ENODEV; in lirc_read_mode2()
629 ret = mutex_lock_interruptible(&rcdev->lock); in lirc_read_mode2()
632 ret = kfifo_to_user(&fh->rawir, buffer, length, &copied); in lirc_read_mode2()
633 mutex_unlock(&rcdev->lock); in lirc_read_mode2()
644 struct lirc_fh *fh = file->private_data; in lirc_read_scancode()
645 struct rc_dev *rcdev = fh->rc; in lirc_read_scancode()
651 return -EINVAL; in lirc_read_scancode()
654 if (kfifo_is_empty(&fh->scancodes)) { in lirc_read_scancode()
655 if (file->f_flags & O_NONBLOCK) in lirc_read_scancode()
656 return -EAGAIN; in lirc_read_scancode()
658 ret = wait_event_interruptible(fh->wait_poll, in lirc_read_scancode()
659 !kfifo_is_empty(&fh->scancodes) || in lirc_read_scancode()
660 !rcdev->registered); in lirc_read_scancode()
665 if (!rcdev->registered) in lirc_read_scancode()
666 return -ENODEV; in lirc_read_scancode()
668 ret = mutex_lock_interruptible(&rcdev->lock); in lirc_read_scancode()
671 ret = kfifo_to_user(&fh->scancodes, buffer, length, &copied); in lirc_read_scancode()
672 mutex_unlock(&rcdev->lock); in lirc_read_scancode()
683 struct lirc_fh *fh = file->private_data; in lirc_read()
684 struct rc_dev *rcdev = fh->rc; in lirc_read()
686 if (rcdev->driver_type == RC_DRIVER_IR_RAW_TX) in lirc_read()
687 return -EINVAL; in lirc_read()
689 if (!rcdev->registered) in lirc_read()
690 return -ENODEV; in lirc_read()
692 if (fh->rec_mode == LIRC_MODE_MODE2) in lirc_read()
714 put_device(&rcdev->dev); in lirc_release_device()
722 minor = ida_alloc_max(&lirc_ida, RC_DEV_MAX - 1, GFP_KERNEL); in lirc_register()
726 device_initialize(&dev->lirc_dev); in lirc_register()
727 dev->lirc_dev.class = lirc_class; in lirc_register()
728 dev->lirc_dev.parent = &dev->dev; in lirc_register()
729 dev->lirc_dev.release = lirc_release_device; in lirc_register()
730 dev->lirc_dev.devt = MKDEV(MAJOR(lirc_base_dev), minor); in lirc_register()
731 dev_set_name(&dev->lirc_dev, "lirc%d", minor); in lirc_register()
733 INIT_LIST_HEAD(&dev->lirc_fh); in lirc_register()
734 spin_lock_init(&dev->lirc_fh_lock); in lirc_register()
736 cdev_init(&dev->lirc_cdev, &lirc_fops); in lirc_register()
738 err = cdev_device_add(&dev->lirc_cdev, &dev->lirc_dev); in lirc_register()
742 get_device(&dev->dev); in lirc_register()
744 switch (dev->driver_type) { in lirc_register()
756 if (dev->tx_ir) in lirc_register()
761 dev_info(&dev->dev, "lirc_dev: driver %s registered at minor = %d, %s receiver, %s transmitter", in lirc_register()
762 dev->driver_name, minor, rx_type, tx_type); in lirc_register()
776 dev_dbg(&dev->dev, "lirc_dev: driver %s unregistered from minor = %d\n", in lirc_unregister()
777 dev->driver_name, MINOR(dev->lirc_dev.devt)); in lirc_unregister()
779 spin_lock_irqsave(&dev->lirc_fh_lock, flags); in lirc_unregister()
780 list_for_each_entry(fh, &dev->lirc_fh, list) in lirc_unregister()
781 wake_up_poll(&fh->wait_poll, EPOLLHUP | EPOLLERR); in lirc_unregister()
782 spin_unlock_irqrestore(&dev->lirc_fh_lock, flags); in lirc_unregister()
784 cdev_device_del(&dev->lirc_cdev, &dev->lirc_dev); in lirc_unregister()
785 ida_free(&lirc_ida, MINOR(dev->lirc_dev.devt)); in lirc_unregister()
824 return ERR_PTR(-EBADF); in rc_dev_get_from_fd()
826 if (f.file->f_op != &lirc_fops) { in rc_dev_get_from_fd()
828 return ERR_PTR(-EINVAL); in rc_dev_get_from_fd()
831 if (write && !(f.file->f_mode & FMODE_WRITE)) { in rc_dev_get_from_fd()
833 return ERR_PTR(-EPERM); in rc_dev_get_from_fd()
836 fh = f.file->private_data; in rc_dev_get_from_fd()
837 dev = fh->rc; in rc_dev_get_from_fd()
839 get_device(&dev->dev); in rc_dev_get_from_fd()