Lines Matching +full:scan +full:- +full:count

1 // SPDX-License-Identifier: GPL-2.0-or-later
19 #include "rc-core-priv.h"
35 * lirc_raw_event() - Send raw IR data to lirc to be relayed to userspace
55 dev_dbg(&dev->dev, "delivering overflow to lirc_dev\n"); in lirc_raw_event()
60 dev_dbg(&dev->dev, "carrier report (freq: %d)\n", sample); in lirc_raw_event()
64 dev->gap_start = ktime_get(); in lirc_raw_event()
67 dev_dbg(&dev->dev, "timeout report (duration: %d)\n", sample); in lirc_raw_event()
71 if (dev->gap_start) { in lirc_raw_event()
73 dev->gap_start); in lirc_raw_event()
78 spin_lock_irqsave(&dev->lirc_fh_lock, flags); in lirc_raw_event()
79 list_for_each_entry(fh, &dev->lirc_fh, list) in lirc_raw_event()
80 kfifo_put(&fh->rawir, LIRC_SPACE(duration)); in lirc_raw_event()
81 spin_unlock_irqrestore(&dev->lirc_fh_lock, flags); in lirc_raw_event()
82 dev->gap_start = 0; in lirc_raw_event()
87 dev_dbg(&dev->dev, "delivering %uus %s to lirc_dev\n", in lirc_raw_event()
97 spin_lock_irqsave(&dev->lirc_fh_lock, flags); in lirc_raw_event()
98 list_for_each_entry(fh, &dev->lirc_fh, list) { in lirc_raw_event()
99 if (kfifo_put(&fh->rawir, sample)) in lirc_raw_event()
100 wake_up_poll(&fh->wait_poll, EPOLLIN | EPOLLRDNORM); in lirc_raw_event()
102 spin_unlock_irqrestore(&dev->lirc_fh_lock, flags); in lirc_raw_event()
106 * lirc_scancode_event() - Send scancode data to lirc to be relayed to
116 lsc->timestamp = ktime_get_ns(); in lirc_scancode_event()
118 spin_lock_irqsave(&dev->lirc_fh_lock, flags); in lirc_scancode_event()
119 list_for_each_entry(fh, &dev->lirc_fh, list) { in lirc_scancode_event()
120 if (kfifo_put(&fh->scancodes, *lsc)) in lirc_scancode_event()
121 wake_up_poll(&fh->wait_poll, EPOLLIN | EPOLLRDNORM); in lirc_scancode_event()
123 spin_unlock_irqrestore(&dev->lirc_fh_lock, flags); in lirc_scancode_event()
129 struct rc_dev *dev = container_of(inode->i_cdev, struct rc_dev, in lirc_open()
136 return -ENOMEM; in lirc_open()
138 get_device(&dev->dev); in lirc_open()
140 if (!dev->registered) { in lirc_open()
141 retval = -ENODEV; in lirc_open()
145 if (dev->driver_type == RC_DRIVER_IR_RAW) { in lirc_open()
146 if (kfifo_alloc(&fh->rawir, MAX_IR_EVENT_SIZE, GFP_KERNEL)) { in lirc_open()
147 retval = -ENOMEM; in lirc_open()
152 if (dev->driver_type != RC_DRIVER_IR_RAW_TX) { in lirc_open()
153 if (kfifo_alloc(&fh->scancodes, 32, GFP_KERNEL)) { in lirc_open()
154 retval = -ENOMEM; in lirc_open()
159 fh->send_mode = LIRC_MODE_PULSE; in lirc_open()
160 fh->rc = dev; in lirc_open()
162 if (dev->driver_type == RC_DRIVER_SCANCODE) in lirc_open()
163 fh->rec_mode = LIRC_MODE_SCANCODE; in lirc_open()
165 fh->rec_mode = LIRC_MODE_MODE2; in lirc_open()
171 init_waitqueue_head(&fh->wait_poll); in lirc_open()
173 file->private_data = fh; in lirc_open()
174 spin_lock_irqsave(&dev->lirc_fh_lock, flags); in lirc_open()
175 list_add(&fh->list, &dev->lirc_fh); in lirc_open()
176 spin_unlock_irqrestore(&dev->lirc_fh_lock, flags); in lirc_open()
182 if (dev->driver_type != RC_DRIVER_IR_RAW_TX) in lirc_open()
183 kfifo_free(&fh->scancodes); in lirc_open()
185 if (dev->driver_type == RC_DRIVER_IR_RAW) in lirc_open()
186 kfifo_free(&fh->rawir); in lirc_open()
189 put_device(&dev->dev); in lirc_open()
196 struct lirc_fh *fh = file->private_data; in lirc_close()
197 struct rc_dev *dev = fh->rc; in lirc_close()
200 spin_lock_irqsave(&dev->lirc_fh_lock, flags); in lirc_close()
201 list_del(&fh->list); in lirc_close()
202 spin_unlock_irqrestore(&dev->lirc_fh_lock, flags); in lirc_close()
204 if (dev->driver_type == RC_DRIVER_IR_RAW) in lirc_close()
205 kfifo_free(&fh->rawir); in lirc_close()
206 if (dev->driver_type != RC_DRIVER_IR_RAW_TX) in lirc_close()
207 kfifo_free(&fh->scancodes); in lirc_close()
211 put_device(&dev->dev); in lirc_close()
219 struct lirc_fh *fh = file->private_data; in lirc_transmit()
220 struct rc_dev *dev = fh->rc; in lirc_transmit()
224 size_t count; in lirc_transmit() local
230 ret = mutex_lock_interruptible(&dev->lock); in lirc_transmit()
234 if (!dev->registered) { in lirc_transmit()
235 ret = -ENODEV; in lirc_transmit()
239 if (!dev->tx_ir) { in lirc_transmit()
240 ret = -EINVAL; in lirc_transmit()
244 if (fh->send_mode == LIRC_MODE_SCANCODE) { in lirc_transmit()
245 struct lirc_scancode scan; in lirc_transmit() local
247 if (n != sizeof(scan)) { in lirc_transmit()
248 ret = -EINVAL; in lirc_transmit()
252 if (copy_from_user(&scan, buf, sizeof(scan))) { in lirc_transmit()
253 ret = -EFAULT; in lirc_transmit()
257 if (scan.flags || scan.keycode || scan.timestamp || in lirc_transmit()
258 scan.rc_proto > RC_PROTO_MAX) { in lirc_transmit()
259 ret = -EINVAL; in lirc_transmit()
263 /* We only have encoders for 32-bit protocols. */ in lirc_transmit()
264 if (scan.scancode > U32_MAX || in lirc_transmit()
265 !rc_validate_scancode(scan.rc_proto, scan.scancode)) { in lirc_transmit()
266 ret = -EINVAL; in lirc_transmit()
272 ret = -ENOMEM; in lirc_transmit()
276 ret = ir_raw_encode_scancode(scan.rc_proto, scan.scancode, in lirc_transmit()
283 count = ret - 1; in lirc_transmit()
285 count = ret; in lirc_transmit()
287 txbuf = kmalloc_array(count, sizeof(unsigned int), GFP_KERNEL); in lirc_transmit()
289 ret = -ENOMEM; in lirc_transmit()
293 for (i = 0; i < count; i++) in lirc_transmit()
296 if (dev->s_tx_carrier) { in lirc_transmit()
297 int carrier = ir_raw_encode_carrier(scan.rc_proto); in lirc_transmit()
300 dev->s_tx_carrier(dev, carrier); in lirc_transmit()
304 ret = -EINVAL; in lirc_transmit()
308 count = n / sizeof(unsigned int); in lirc_transmit()
309 if (count > LIRCBUF_SIZE || count % 2 == 0) { in lirc_transmit()
310 ret = -EINVAL; in lirc_transmit()
321 for (i = 0; i < count; i++) { in lirc_transmit()
322 if (txbuf[i] > IR_MAX_DURATION - duration || !txbuf[i]) { in lirc_transmit()
323 ret = -EINVAL; in lirc_transmit()
332 ret = dev->tx_ir(dev, txbuf, count); in lirc_transmit()
338 mutex_unlock(&dev->lock); in lirc_transmit()
358 mutex_unlock(&dev->lock); in lirc_transmit()
364 struct lirc_fh *fh = file->private_data; in lirc_ioctl()
365 struct rc_dev *dev = fh->rc; in lirc_ioctl()
376 ret = mutex_lock_interruptible(&dev->lock); in lirc_ioctl()
380 if (!dev->registered) { in lirc_ioctl()
381 ret = -ENODEV; in lirc_ioctl()
387 if (dev->driver_type == RC_DRIVER_SCANCODE) in lirc_ioctl()
390 if (dev->driver_type == RC_DRIVER_IR_RAW) { in lirc_ioctl()
392 if (dev->rx_resolution) in lirc_ioctl()
396 if (dev->tx_ir) { in lirc_ioctl()
398 if (dev->s_tx_mask) in lirc_ioctl()
400 if (dev->s_tx_carrier) in lirc_ioctl()
402 if (dev->s_tx_duty_cycle) in lirc_ioctl()
406 if (dev->s_rx_carrier_range) in lirc_ioctl()
410 if (dev->s_wideband_receiver) in lirc_ioctl()
413 if (dev->s_carrier_report) in lirc_ioctl()
416 if (dev->max_timeout) in lirc_ioctl()
423 if (dev->driver_type == RC_DRIVER_IR_RAW_TX) in lirc_ioctl()
424 ret = -ENOTTY; in lirc_ioctl()
426 val = fh->rec_mode; in lirc_ioctl()
430 switch (dev->driver_type) { in lirc_ioctl()
432 ret = -ENOTTY; in lirc_ioctl()
436 ret = -EINVAL; in lirc_ioctl()
441 ret = -EINVAL; in lirc_ioctl()
446 fh->rec_mode = val; in lirc_ioctl()
450 if (!dev->tx_ir) in lirc_ioctl()
451 ret = -ENOTTY; in lirc_ioctl()
453 val = fh->send_mode; in lirc_ioctl()
457 if (!dev->tx_ir) in lirc_ioctl()
458 ret = -ENOTTY; in lirc_ioctl()
460 ret = -EINVAL; in lirc_ioctl()
462 fh->send_mode = val; in lirc_ioctl()
467 if (!dev->s_tx_mask) in lirc_ioctl()
468 ret = -ENOTTY; in lirc_ioctl()
470 ret = dev->s_tx_mask(dev, val); in lirc_ioctl()
474 if (!dev->s_tx_carrier) in lirc_ioctl()
475 ret = -ENOTTY; in lirc_ioctl()
477 ret = dev->s_tx_carrier(dev, val); in lirc_ioctl()
481 if (!dev->s_tx_duty_cycle) in lirc_ioctl()
482 ret = -ENOTTY; in lirc_ioctl()
484 ret = -EINVAL; in lirc_ioctl()
486 ret = dev->s_tx_duty_cycle(dev, val); in lirc_ioctl()
491 if (!dev->s_rx_carrier_range) in lirc_ioctl()
492 ret = -ENOTTY; in lirc_ioctl()
494 ret = -EINVAL; in lirc_ioctl()
496 ret = dev->s_rx_carrier_range(dev, fh->carrier_low, in lirc_ioctl()
501 if (!dev->s_rx_carrier_range) in lirc_ioctl()
502 ret = -ENOTTY; in lirc_ioctl()
504 ret = -EINVAL; in lirc_ioctl()
506 fh->carrier_low = val; in lirc_ioctl()
510 if (!dev->rx_resolution) in lirc_ioctl()
511 ret = -ENOTTY; in lirc_ioctl()
513 val = dev->rx_resolution; in lirc_ioctl()
517 if (!dev->s_wideband_receiver) in lirc_ioctl()
518 ret = -ENOTTY; in lirc_ioctl()
520 ret = dev->s_wideband_receiver(dev, !!val); in lirc_ioctl()
524 if (!dev->s_carrier_report) in lirc_ioctl()
525 ret = -ENOTTY; in lirc_ioctl()
527 ret = dev->s_carrier_report(dev, !!val); in lirc_ioctl()
532 if (!dev->max_timeout) in lirc_ioctl()
533 ret = -ENOTTY; in lirc_ioctl()
535 val = dev->min_timeout; in lirc_ioctl()
539 if (!dev->max_timeout) in lirc_ioctl()
540 ret = -ENOTTY; in lirc_ioctl()
542 val = dev->max_timeout; in lirc_ioctl()
546 if (!dev->max_timeout) { in lirc_ioctl()
547 ret = -ENOTTY; in lirc_ioctl()
549 if (val < dev->min_timeout || val > dev->max_timeout) in lirc_ioctl()
550 ret = -EINVAL; in lirc_ioctl()
551 else if (dev->s_timeout) in lirc_ioctl()
552 ret = dev->s_timeout(dev, val); in lirc_ioctl()
554 dev->timeout = val; in lirc_ioctl()
559 if (!dev->timeout) in lirc_ioctl()
560 ret = -ENOTTY; in lirc_ioctl()
562 val = dev->timeout; in lirc_ioctl()
566 if (dev->driver_type != RC_DRIVER_IR_RAW) in lirc_ioctl()
567 ret = -ENOTTY; in lirc_ioctl()
571 ret = -ENOTTY; in lirc_ioctl()
578 mutex_unlock(&dev->lock); in lirc_ioctl()
584 struct lirc_fh *fh = file->private_data; in lirc_poll()
585 struct rc_dev *rcdev = fh->rc; in lirc_poll()
588 poll_wait(file, &fh->wait_poll, wait); in lirc_poll()
590 if (!rcdev->registered) { in lirc_poll()
592 } else if (rcdev->driver_type != RC_DRIVER_IR_RAW_TX) { in lirc_poll()
593 if (fh->rec_mode == LIRC_MODE_SCANCODE && in lirc_poll()
594 !kfifo_is_empty(&fh->scancodes)) in lirc_poll()
597 if (fh->rec_mode == LIRC_MODE_MODE2 && in lirc_poll()
598 !kfifo_is_empty(&fh->rawir)) in lirc_poll()
608 struct lirc_fh *fh = file->private_data; in lirc_read_mode2()
609 struct rc_dev *rcdev = fh->rc; in lirc_read_mode2()
614 return -EINVAL; in lirc_read_mode2()
617 if (kfifo_is_empty(&fh->rawir)) { in lirc_read_mode2()
618 if (file->f_flags & O_NONBLOCK) in lirc_read_mode2()
619 return -EAGAIN; in lirc_read_mode2()
621 ret = wait_event_interruptible(fh->wait_poll, in lirc_read_mode2()
622 !kfifo_is_empty(&fh->rawir) || in lirc_read_mode2()
623 !rcdev->registered); in lirc_read_mode2()
628 if (!rcdev->registered) in lirc_read_mode2()
629 return -ENODEV; in lirc_read_mode2()
631 ret = mutex_lock_interruptible(&rcdev->lock); in lirc_read_mode2()
634 ret = kfifo_to_user(&fh->rawir, buffer, length, &copied); in lirc_read_mode2()
635 mutex_unlock(&rcdev->lock); in lirc_read_mode2()
646 struct lirc_fh *fh = file->private_data; in lirc_read_scancode()
647 struct rc_dev *rcdev = fh->rc; in lirc_read_scancode()
653 return -EINVAL; in lirc_read_scancode()
656 if (kfifo_is_empty(&fh->scancodes)) { in lirc_read_scancode()
657 if (file->f_flags & O_NONBLOCK) in lirc_read_scancode()
658 return -EAGAIN; in lirc_read_scancode()
660 ret = wait_event_interruptible(fh->wait_poll, in lirc_read_scancode()
661 !kfifo_is_empty(&fh->scancodes) || in lirc_read_scancode()
662 !rcdev->registered); in lirc_read_scancode()
667 if (!rcdev->registered) in lirc_read_scancode()
668 return -ENODEV; in lirc_read_scancode()
670 ret = mutex_lock_interruptible(&rcdev->lock); in lirc_read_scancode()
673 ret = kfifo_to_user(&fh->scancodes, buffer, length, &copied); in lirc_read_scancode()
674 mutex_unlock(&rcdev->lock); in lirc_read_scancode()
685 struct lirc_fh *fh = file->private_data; in lirc_read()
686 struct rc_dev *rcdev = fh->rc; in lirc_read()
688 if (rcdev->driver_type == RC_DRIVER_IR_RAW_TX) in lirc_read()
689 return -EINVAL; in lirc_read()
691 if (!rcdev->registered) in lirc_read()
692 return -ENODEV; in lirc_read()
694 if (fh->rec_mode == LIRC_MODE_MODE2) in lirc_read()
715 put_device(&rcdev->dev); in lirc_release_device()
723 minor = ida_alloc_max(&lirc_ida, RC_DEV_MAX - 1, GFP_KERNEL); in lirc_register()
727 device_initialize(&dev->lirc_dev); in lirc_register()
728 dev->lirc_dev.class = &lirc_class; in lirc_register()
729 dev->lirc_dev.parent = &dev->dev; in lirc_register()
730 dev->lirc_dev.release = lirc_release_device; in lirc_register()
731 dev->lirc_dev.devt = MKDEV(MAJOR(lirc_base_dev), minor); in lirc_register()
732 dev_set_name(&dev->lirc_dev, "lirc%d", minor); in lirc_register()
734 INIT_LIST_HEAD(&dev->lirc_fh); in lirc_register()
735 spin_lock_init(&dev->lirc_fh_lock); in lirc_register()
737 cdev_init(&dev->lirc_cdev, &lirc_fops); in lirc_register()
739 err = cdev_device_add(&dev->lirc_cdev, &dev->lirc_dev); in lirc_register()
743 get_device(&dev->dev); in lirc_register()
745 switch (dev->driver_type) { in lirc_register()
757 if (dev->tx_ir) in lirc_register()
762 dev_info(&dev->dev, "lirc_dev: driver %s registered at minor = %d, %s receiver, %s transmitter", in lirc_register()
763 dev->driver_name, minor, rx_type, tx_type); in lirc_register()
777 dev_dbg(&dev->dev, "lirc_dev: driver %s unregistered from minor = %d\n", in lirc_unregister()
778 dev->driver_name, MINOR(dev->lirc_dev.devt)); in lirc_unregister()
780 spin_lock_irqsave(&dev->lirc_fh_lock, flags); in lirc_unregister()
781 list_for_each_entry(fh, &dev->lirc_fh, list) in lirc_unregister()
782 wake_up_poll(&fh->wait_poll, EPOLLHUP | EPOLLERR); in lirc_unregister()
783 spin_unlock_irqrestore(&dev->lirc_fh_lock, flags); in lirc_unregister()
785 cdev_device_del(&dev->lirc_cdev, &dev->lirc_dev); in lirc_unregister()
786 ida_free(&lirc_ida, MINOR(dev->lirc_dev.devt)); in lirc_unregister()
823 return ERR_PTR(-EBADF); in rc_dev_get_from_fd()
825 if (fd_file(f)->f_op != &lirc_fops) in rc_dev_get_from_fd()
826 return ERR_PTR(-EINVAL); in rc_dev_get_from_fd()
828 if (write && !(fd_file(f)->f_mode & FMODE_WRITE)) in rc_dev_get_from_fd()
829 return ERR_PTR(-EPERM); in rc_dev_get_from_fd()
831 fh = fd_file(f)->private_data; in rc_dev_get_from_fd()
832 dev = fh->rc; in rc_dev_get_from_fd()
834 get_device(&dev->dev); in rc_dev_get_from_fd()