• Home
  • Raw
  • Download

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
54 dev_dbg(&dev->dev, "delivering reset sync space to lirc_dev\n"); in lirc_raw_event()
59 dev_dbg(&dev->dev, "carrier report (freq: %d)\n", sample); in lirc_raw_event()
63 if (dev->gap) in lirc_raw_event()
66 dev->gap_start = ktime_get(); in lirc_raw_event()
67 dev->gap = true; in lirc_raw_event()
68 dev->gap_duration = ev.duration; in lirc_raw_event()
71 dev_dbg(&dev->dev, "timeout report (duration: %d)\n", sample); in lirc_raw_event()
75 if (dev->gap) { in lirc_raw_event()
76 dev->gap_duration += ktime_to_us(ktime_sub(ktime_get(), in lirc_raw_event()
77 dev->gap_start)); in lirc_raw_event()
80 dev->gap_duration = min_t(u64, dev->gap_duration, in lirc_raw_event()
83 spin_lock_irqsave(&dev->lirc_fh_lock, flags); in lirc_raw_event()
84 list_for_each_entry(fh, &dev->lirc_fh, list) in lirc_raw_event()
85 kfifo_put(&fh->rawir, in lirc_raw_event()
86 LIRC_SPACE(dev->gap_duration)); in lirc_raw_event()
87 spin_unlock_irqrestore(&dev->lirc_fh_lock, flags); in lirc_raw_event()
88 dev->gap = false; in lirc_raw_event()
93 dev_dbg(&dev->dev, "delivering %uus %s to lirc_dev\n", in lirc_raw_event()
103 spin_lock_irqsave(&dev->lirc_fh_lock, flags); in lirc_raw_event()
104 list_for_each_entry(fh, &dev->lirc_fh, list) { in lirc_raw_event()
105 if (LIRC_IS_TIMEOUT(sample) && !fh->send_timeout_reports) in lirc_raw_event()
107 if (kfifo_put(&fh->rawir, sample)) in lirc_raw_event()
108 wake_up_poll(&fh->wait_poll, EPOLLIN | EPOLLRDNORM); in lirc_raw_event()
110 spin_unlock_irqrestore(&dev->lirc_fh_lock, flags); in lirc_raw_event()
114 * lirc_scancode_event() - Send scancode data to lirc to be relayed to
124 lsc->timestamp = ktime_get_ns(); in lirc_scancode_event()
126 spin_lock_irqsave(&dev->lirc_fh_lock, flags); in lirc_scancode_event()
127 list_for_each_entry(fh, &dev->lirc_fh, list) { in lirc_scancode_event()
128 if (kfifo_put(&fh->scancodes, *lsc)) in lirc_scancode_event()
129 wake_up_poll(&fh->wait_poll, EPOLLIN | EPOLLRDNORM); in lirc_scancode_event()
131 spin_unlock_irqrestore(&dev->lirc_fh_lock, flags); in lirc_scancode_event()
137 struct rc_dev *dev = container_of(inode->i_cdev, struct rc_dev, in lirc_open()
144 return -ENOMEM; in lirc_open()
146 get_device(&dev->dev); in lirc_open()
148 if (!dev->registered) { in lirc_open()
149 retval = -ENODEV; in lirc_open()
153 if (dev->driver_type == RC_DRIVER_IR_RAW) { in lirc_open()
154 if (kfifo_alloc(&fh->rawir, MAX_IR_EVENT_SIZE, GFP_KERNEL)) { in lirc_open()
155 retval = -ENOMEM; in lirc_open()
160 if (dev->driver_type != RC_DRIVER_IR_RAW_TX) { in lirc_open()
161 if (kfifo_alloc(&fh->scancodes, 32, GFP_KERNEL)) { in lirc_open()
162 retval = -ENOMEM; in lirc_open()
167 fh->send_mode = LIRC_MODE_PULSE; in lirc_open()
168 fh->rc = dev; in lirc_open()
169 fh->send_timeout_reports = true; in lirc_open()
171 if (dev->driver_type == RC_DRIVER_SCANCODE) in lirc_open()
172 fh->rec_mode = LIRC_MODE_SCANCODE; in lirc_open()
174 fh->rec_mode = LIRC_MODE_MODE2; in lirc_open()
180 init_waitqueue_head(&fh->wait_poll); in lirc_open()
182 file->private_data = fh; in lirc_open()
183 spin_lock_irqsave(&dev->lirc_fh_lock, flags); in lirc_open()
184 list_add(&fh->list, &dev->lirc_fh); in lirc_open()
185 spin_unlock_irqrestore(&dev->lirc_fh_lock, flags); in lirc_open()
191 if (dev->driver_type != RC_DRIVER_IR_RAW_TX) in lirc_open()
192 kfifo_free(&fh->scancodes); in lirc_open()
194 if (dev->driver_type == RC_DRIVER_IR_RAW) in lirc_open()
195 kfifo_free(&fh->rawir); in lirc_open()
198 put_device(&dev->dev); in lirc_open()
205 struct lirc_fh *fh = file->private_data; in lirc_close()
206 struct rc_dev *dev = fh->rc; in lirc_close()
209 spin_lock_irqsave(&dev->lirc_fh_lock, flags); in lirc_close()
210 list_del(&fh->list); in lirc_close()
211 spin_unlock_irqrestore(&dev->lirc_fh_lock, flags); in lirc_close()
213 if (dev->driver_type == RC_DRIVER_IR_RAW) in lirc_close()
214 kfifo_free(&fh->rawir); in lirc_close()
215 if (dev->driver_type != RC_DRIVER_IR_RAW_TX) in lirc_close()
216 kfifo_free(&fh->scancodes); in lirc_close()
220 put_device(&dev->dev); in lirc_close()
228 struct lirc_fh *fh = file->private_data; in lirc_transmit()
229 struct rc_dev *dev = fh->rc; in lirc_transmit()
233 size_t count; in lirc_transmit() local
239 ret = mutex_lock_interruptible(&dev->lock); in lirc_transmit()
243 if (!dev->registered) { in lirc_transmit()
244 ret = -ENODEV; in lirc_transmit()
248 if (!dev->tx_ir) { in lirc_transmit()
249 ret = -EINVAL; in lirc_transmit()
253 if (fh->send_mode == LIRC_MODE_SCANCODE) { in lirc_transmit()
254 struct lirc_scancode scan; in lirc_transmit() local
256 if (n != sizeof(scan)) { in lirc_transmit()
257 ret = -EINVAL; in lirc_transmit()
261 if (copy_from_user(&scan, buf, sizeof(scan))) { in lirc_transmit()
262 ret = -EFAULT; in lirc_transmit()
266 if (scan.flags || scan.keycode || scan.timestamp) { in lirc_transmit()
267 ret = -EINVAL; in lirc_transmit()
271 /* We only have encoders for 32-bit protocols. */ in lirc_transmit()
272 if (scan.scancode > U32_MAX || in lirc_transmit()
273 !rc_validate_scancode(scan.rc_proto, scan.scancode)) { in lirc_transmit()
274 ret = -EINVAL; in lirc_transmit()
280 ret = -ENOMEM; in lirc_transmit()
284 ret = ir_raw_encode_scancode(scan.rc_proto, scan.scancode, in lirc_transmit()
291 count = ret - 1; in lirc_transmit()
293 count = ret; in lirc_transmit()
295 txbuf = kmalloc_array(count, sizeof(unsigned int), GFP_KERNEL); in lirc_transmit()
297 ret = -ENOMEM; in lirc_transmit()
301 for (i = 0; i < count; i++) in lirc_transmit()
304 if (dev->s_tx_carrier) { in lirc_transmit()
305 int carrier = ir_raw_encode_carrier(scan.rc_proto); in lirc_transmit()
308 dev->s_tx_carrier(dev, carrier); in lirc_transmit()
312 ret = -EINVAL; in lirc_transmit()
316 count = n / sizeof(unsigned int); in lirc_transmit()
317 if (count > LIRCBUF_SIZE || count % 2 == 0) { in lirc_transmit()
318 ret = -EINVAL; in lirc_transmit()
329 for (i = 0; i < count; i++) { in lirc_transmit()
330 if (txbuf[i] > IR_MAX_DURATION - duration || !txbuf[i]) { in lirc_transmit()
331 ret = -EINVAL; in lirc_transmit()
340 ret = dev->tx_ir(dev, txbuf, count); in lirc_transmit()
346 mutex_unlock(&dev->lock); in lirc_transmit()
366 mutex_unlock(&dev->lock); in lirc_transmit()
372 struct lirc_fh *fh = file->private_data; in lirc_ioctl()
373 struct rc_dev *dev = fh->rc; in lirc_ioctl()
384 ret = mutex_lock_interruptible(&dev->lock); in lirc_ioctl()
388 if (!dev->registered) { in lirc_ioctl()
389 ret = -ENODEV; in lirc_ioctl()
395 if (dev->driver_type == RC_DRIVER_SCANCODE) in lirc_ioctl()
398 if (dev->driver_type == RC_DRIVER_IR_RAW) { in lirc_ioctl()
400 if (dev->rx_resolution) in lirc_ioctl()
404 if (dev->tx_ir) { in lirc_ioctl()
406 if (dev->s_tx_mask) in lirc_ioctl()
408 if (dev->s_tx_carrier) in lirc_ioctl()
410 if (dev->s_tx_duty_cycle) in lirc_ioctl()
414 if (dev->s_rx_carrier_range) in lirc_ioctl()
418 if (dev->s_learning_mode) in lirc_ioctl()
421 if (dev->s_carrier_report) in lirc_ioctl()
424 if (dev->max_timeout) in lirc_ioctl()
431 if (dev->driver_type == RC_DRIVER_IR_RAW_TX) in lirc_ioctl()
432 ret = -ENOTTY; in lirc_ioctl()
434 val = fh->rec_mode; in lirc_ioctl()
438 switch (dev->driver_type) { in lirc_ioctl()
440 ret = -ENOTTY; in lirc_ioctl()
444 ret = -EINVAL; in lirc_ioctl()
449 ret = -EINVAL; in lirc_ioctl()
454 fh->rec_mode = val; in lirc_ioctl()
458 if (!dev->tx_ir) in lirc_ioctl()
459 ret = -ENOTTY; in lirc_ioctl()
461 val = fh->send_mode; in lirc_ioctl()
465 if (!dev->tx_ir) in lirc_ioctl()
466 ret = -ENOTTY; in lirc_ioctl()
468 ret = -EINVAL; in lirc_ioctl()
470 fh->send_mode = val; in lirc_ioctl()
475 if (!dev->s_tx_mask) in lirc_ioctl()
476 ret = -ENOTTY; in lirc_ioctl()
478 ret = dev->s_tx_mask(dev, val); in lirc_ioctl()
482 if (!dev->s_tx_carrier) in lirc_ioctl()
483 ret = -ENOTTY; in lirc_ioctl()
485 ret = dev->s_tx_carrier(dev, val); in lirc_ioctl()
489 if (!dev->s_tx_duty_cycle) in lirc_ioctl()
490 ret = -ENOTTY; in lirc_ioctl()
492 ret = -EINVAL; in lirc_ioctl()
494 ret = dev->s_tx_duty_cycle(dev, val); 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 ret = dev->s_rx_carrier_range(dev, fh->carrier_low, in lirc_ioctl()
509 if (!dev->s_rx_carrier_range) in lirc_ioctl()
510 ret = -ENOTTY; in lirc_ioctl()
512 ret = -EINVAL; in lirc_ioctl()
514 fh->carrier_low = val; in lirc_ioctl()
518 if (!dev->rx_resolution) in lirc_ioctl()
519 ret = -ENOTTY; in lirc_ioctl()
521 val = dev->rx_resolution; in lirc_ioctl()
525 if (!dev->s_learning_mode) in lirc_ioctl()
526 ret = -ENOTTY; in lirc_ioctl()
528 ret = dev->s_learning_mode(dev, !!val); in lirc_ioctl()
532 if (!dev->s_carrier_report) in lirc_ioctl()
533 ret = -ENOTTY; in lirc_ioctl()
535 ret = dev->s_carrier_report(dev, !!val); in lirc_ioctl()
540 if (!dev->max_timeout) in lirc_ioctl()
541 ret = -ENOTTY; in lirc_ioctl()
543 val = dev->min_timeout; in lirc_ioctl()
547 if (!dev->max_timeout) in lirc_ioctl()
548 ret = -ENOTTY; in lirc_ioctl()
550 val = dev->max_timeout; in lirc_ioctl()
554 if (!dev->max_timeout) { in lirc_ioctl()
555 ret = -ENOTTY; in lirc_ioctl()
557 if (val < dev->min_timeout || val > dev->max_timeout) in lirc_ioctl()
558 ret = -EINVAL; in lirc_ioctl()
559 else if (dev->s_timeout) in lirc_ioctl()
560 ret = dev->s_timeout(dev, val); in lirc_ioctl()
562 dev->timeout = val; in lirc_ioctl()
567 if (!dev->timeout) in lirc_ioctl()
568 ret = -ENOTTY; in lirc_ioctl()
570 val = dev->timeout; in lirc_ioctl()
574 if (dev->driver_type != RC_DRIVER_IR_RAW) in lirc_ioctl()
575 ret = -ENOTTY; in lirc_ioctl()
577 fh->send_timeout_reports = !!val; in lirc_ioctl()
581 ret = -ENOTTY; in lirc_ioctl()
588 mutex_unlock(&dev->lock); in lirc_ioctl()
594 struct lirc_fh *fh = file->private_data; in lirc_poll()
595 struct rc_dev *rcdev = fh->rc; in lirc_poll()
598 poll_wait(file, &fh->wait_poll, wait); in lirc_poll()
600 if (!rcdev->registered) { in lirc_poll()
602 } else if (rcdev->driver_type != RC_DRIVER_IR_RAW_TX) { in lirc_poll()
603 if (fh->rec_mode == LIRC_MODE_SCANCODE && in lirc_poll()
604 !kfifo_is_empty(&fh->scancodes)) in lirc_poll()
607 if (fh->rec_mode == LIRC_MODE_MODE2 && in lirc_poll()
608 !kfifo_is_empty(&fh->rawir)) in lirc_poll()
618 struct lirc_fh *fh = file->private_data; in lirc_read_mode2()
619 struct rc_dev *rcdev = fh->rc; in lirc_read_mode2()
624 return -EINVAL; in lirc_read_mode2()
627 if (kfifo_is_empty(&fh->rawir)) { in lirc_read_mode2()
628 if (file->f_flags & O_NONBLOCK) in lirc_read_mode2()
629 return -EAGAIN; in lirc_read_mode2()
631 ret = wait_event_interruptible(fh->wait_poll, in lirc_read_mode2()
632 !kfifo_is_empty(&fh->rawir) || in lirc_read_mode2()
633 !rcdev->registered); in lirc_read_mode2()
638 if (!rcdev->registered) in lirc_read_mode2()
639 return -ENODEV; in lirc_read_mode2()
641 ret = mutex_lock_interruptible(&rcdev->lock); in lirc_read_mode2()
644 ret = kfifo_to_user(&fh->rawir, buffer, length, &copied); in lirc_read_mode2()
645 mutex_unlock(&rcdev->lock); in lirc_read_mode2()
656 struct lirc_fh *fh = file->private_data; in lirc_read_scancode()
657 struct rc_dev *rcdev = fh->rc; in lirc_read_scancode()
663 return -EINVAL; in lirc_read_scancode()
666 if (kfifo_is_empty(&fh->scancodes)) { in lirc_read_scancode()
667 if (file->f_flags & O_NONBLOCK) in lirc_read_scancode()
668 return -EAGAIN; in lirc_read_scancode()
670 ret = wait_event_interruptible(fh->wait_poll, in lirc_read_scancode()
671 !kfifo_is_empty(&fh->scancodes) || in lirc_read_scancode()
672 !rcdev->registered); in lirc_read_scancode()
677 if (!rcdev->registered) in lirc_read_scancode()
678 return -ENODEV; in lirc_read_scancode()
680 ret = mutex_lock_interruptible(&rcdev->lock); in lirc_read_scancode()
683 ret = kfifo_to_user(&fh->scancodes, buffer, length, &copied); in lirc_read_scancode()
684 mutex_unlock(&rcdev->lock); in lirc_read_scancode()
695 struct lirc_fh *fh = file->private_data; in lirc_read()
696 struct rc_dev *rcdev = fh->rc; in lirc_read()
698 if (rcdev->driver_type == RC_DRIVER_IR_RAW_TX) in lirc_read()
699 return -EINVAL; in lirc_read()
701 if (!rcdev->registered) in lirc_read()
702 return -ENODEV; in lirc_read()
704 if (fh->rec_mode == LIRC_MODE_MODE2) in lirc_read()
726 put_device(&rcdev->dev); in lirc_release_device()
738 device_initialize(&dev->lirc_dev); in lirc_register()
739 dev->lirc_dev.class = lirc_class; in lirc_register()
740 dev->lirc_dev.parent = &dev->dev; in lirc_register()
741 dev->lirc_dev.release = lirc_release_device; in lirc_register()
742 dev->lirc_dev.devt = MKDEV(MAJOR(lirc_base_dev), minor); in lirc_register()
743 dev_set_name(&dev->lirc_dev, "lirc%d", minor); in lirc_register()
745 INIT_LIST_HEAD(&dev->lirc_fh); in lirc_register()
746 spin_lock_init(&dev->lirc_fh_lock); in lirc_register()
748 cdev_init(&dev->lirc_cdev, &lirc_fops); in lirc_register()
750 err = cdev_device_add(&dev->lirc_cdev, &dev->lirc_dev); in lirc_register()
754 get_device(&dev->dev); in lirc_register()
756 switch (dev->driver_type) { in lirc_register()
768 if (dev->tx_ir) in lirc_register()
773 dev_info(&dev->dev, "lirc_dev: driver %s registered at minor = %d, %s receiver, %s transmitter", in lirc_register()
774 dev->driver_name, minor, rx_type, tx_type); in lirc_register()
788 dev_dbg(&dev->dev, "lirc_dev: driver %s unregistered from minor = %d\n", in lirc_unregister()
789 dev->driver_name, MINOR(dev->lirc_dev.devt)); in lirc_unregister()
791 spin_lock_irqsave(&dev->lirc_fh_lock, flags); in lirc_unregister()
792 list_for_each_entry(fh, &dev->lirc_fh, list) in lirc_unregister()
793 wake_up_poll(&fh->wait_poll, EPOLLHUP | EPOLLERR); in lirc_unregister()
794 spin_unlock_irqrestore(&dev->lirc_fh_lock, flags); in lirc_unregister()
796 cdev_device_del(&dev->lirc_cdev, &dev->lirc_dev); in lirc_unregister()
797 ida_simple_remove(&lirc_ida, MINOR(dev->lirc_dev.devt)); in lirc_unregister()
836 return ERR_PTR(-EBADF); in rc_dev_get_from_fd()
838 if (f.file->f_op != &lirc_fops) { in rc_dev_get_from_fd()
840 return ERR_PTR(-EINVAL); in rc_dev_get_from_fd()
843 if (write && !(f.file->f_mode & FMODE_WRITE)) in rc_dev_get_from_fd()
844 return ERR_PTR(-EPERM); in rc_dev_get_from_fd()
846 fh = f.file->private_data; in rc_dev_get_from_fd()
847 dev = fh->rc; in rc_dev_get_from_fd()
849 get_device(&dev->dev); in rc_dev_get_from_fd()