media: lirc: simplify gap calculation
authorSean Young <sean@mess.org>
Thu, 13 Jan 2022 11:29:01 +0000 (12:29 +0100)
committerMauro Carvalho Chehab <mchehab@kernel.org>
Mon, 24 Jan 2022 00:38:32 +0000 (01:38 +0100)
When a driver reports a timeout, no more IR activity will be reported
until the next pulse. A space is inserted between the timeout and the
next pulse, based on ktime.

The timeout reports already a duration, so this duration should not be
added to the gap. Otherwise there is no change to the functionality.

Signed-off-by: Sean Young <sean@mess.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
drivers/media/rc/lirc_dev.c
include/media/rc-core.h

index c7c5157725f869b0346eb09cd732b98d6930988e..a080291c4b06985d261d895bb317be195340b460 100644 (file)
@@ -60,32 +60,25 @@ void lirc_raw_event(struct rc_dev *dev, struct ir_raw_event ev)
 
        /* Packet end */
        } else if (ev.timeout) {
-               if (dev->gap)
-                       return;
-
                dev->gap_start = ktime_get();
-               dev->gap = true;
-               dev->gap_duration = ev.duration;
 
                sample = LIRC_TIMEOUT(ev.duration);
                dev_dbg(&dev->dev, "timeout report (duration: %d)\n", sample);
 
        /* Normal sample */
        } else {
-               if (dev->gap) {
-                       dev->gap_duration += ktime_to_us(ktime_sub(ktime_get(),
-                                                        dev->gap_start));
+               if (dev->gap_start) {
+                       u64 duration = ktime_us_delta(ktime_get(),
+                                                     dev->gap_start);
 
                        /* Cap by LIRC_VALUE_MASK */
-                       dev->gap_duration = min_t(u64, dev->gap_duration,
-                                                 LIRC_VALUE_MASK);
+                       duration = min_t(u64, duration, LIRC_VALUE_MASK);
 
                        spin_lock_irqsave(&dev->lirc_fh_lock, flags);
                        list_for_each_entry(fh, &dev->lirc_fh, list)
-                               kfifo_put(&fh->rawir,
-                                         LIRC_SPACE(dev->gap_duration));
+                               kfifo_put(&fh->rawir, LIRC_SPACE(duration));
                        spin_unlock_irqrestore(&dev->lirc_fh_lock, flags);
-                       dev->gap = false;
+                       dev->gap_start = 0;
                }
 
                sample = ev.pulse ? LIRC_PULSE(ev.duration) :
index ab9d3b7cd7996fe18284238d26d27dc8ea1b9511..33b3f7fcf92e7bd3fce5642a45b4aa0688b12953 100644 (file)
@@ -130,9 +130,7 @@ struct lirc_fh {
  * @tx_resolution: resolution (in us) of output sampler
  * @lirc_dev: lirc device
  * @lirc_cdev: lirc char cdev
- * @gap_start: time when gap starts
- * @gap_duration: duration of initial gap
- * @gap: true if we're in a gap
+ * @gap_start: start time for gap after timeout if non-zero
  * @lirc_fh_lock: protects lirc_fh list
  * @lirc_fh: list of open files
  * @registered: set to true by rc_register_device(), false by
@@ -201,8 +199,6 @@ struct rc_dev {
        struct device                   lirc_dev;
        struct cdev                     lirc_cdev;
        ktime_t                         gap_start;
-       u64                             gap_duration;
-       bool                            gap;
        spinlock_t                      lirc_fh_lock;
        struct list_head                lirc_fh;
 #endif