Commit d49a14a9 authored by Sean Young's avatar Sean Young Committed by Mauro Carvalho Chehab
Browse files

media: lirc: simplify gap calculation



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: default avatarSean Young <sean@mess.org>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@kernel.org>
parent 52cdb013
Loading
Loading
Loading
Loading
+6 −13
Original line number Diff line number Diff line
@@ -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) :
+1 −5
Original line number Diff line number Diff line
@@ -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