Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

media: serial_ir: fix tx timing calculation on 32-bit



Move the calculation to where it is needed, so the result doesn't
need to be stored in the device struct.

Signed-off-by: default avatarSean Young <sean@mess.org>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@s-opensource.com>
parent 766cbb31
Loading
Loading
Loading
Loading
+14 −20
Original line number Diff line number Diff line
@@ -139,10 +139,8 @@ struct serial_ir {
	struct platform_device *pdev;
	struct timer_list timeout_timer;

	unsigned int freq;
	unsigned int carrier;
	unsigned int duty_cycle;

	unsigned int pulse_width, space_width;
};

static struct serial_ir serial_ir;
@@ -183,18 +181,6 @@ static void off(void)
		soutp(UART_MCR, hardware[type].off);
}

static void init_timing_params(unsigned int new_duty_cycle,
			       unsigned int new_freq)
{
	serial_ir.duty_cycle = new_duty_cycle;
	serial_ir.freq = new_freq;

	serial_ir.pulse_width = DIV_ROUND_CLOSEST(
		new_duty_cycle * NSEC_PER_SEC, new_freq * 100l);
	serial_ir.space_width = DIV_ROUND_CLOSEST(
		(100l - new_duty_cycle) * NSEC_PER_SEC, new_freq * 100l);
}

static void send_pulse_irdeo(unsigned int length, ktime_t target)
{
	long rawbits;
@@ -241,13 +227,20 @@ static void send_pulse_homebrew_softcarrier(unsigned int length, ktime_t edge)
	 * ndelay(s64) does not compile; so use s32 rather than s64.
	 */
	s32 delta;
	unsigned int pulse, space;

	/* Ensure the dividend fits into 32 bit */
	pulse = DIV_ROUND_CLOSEST(serial_ir.duty_cycle * (NSEC_PER_SEC / 100),
				  serial_ir.carrier);
	space = DIV_ROUND_CLOSEST((100 - serial_ir.duty_cycle) *
				  (NSEC_PER_SEC / 100), serial_ir.carrier);

	for (;;) {
		now = ktime_get();
		if (ktime_compare(now, target) >= 0)
			break;
		on();
		edge = ktime_add_ns(edge, serial_ir.pulse_width);
		edge = ktime_add_ns(edge, pulse);
		delta = ktime_to_ns(ktime_sub(edge, now));
		if (delta > 0)
			ndelay(delta);
@@ -255,7 +248,7 @@ static void send_pulse_homebrew_softcarrier(unsigned int length, ktime_t edge)
		off();
		if (ktime_compare(now, target) >= 0)
			break;
		edge = ktime_add_ns(edge, serial_ir.space_width);
		edge = ktime_add_ns(edge, space);
		delta = ktime_to_ns(ktime_sub(edge, now));
		if (delta > 0)
			ndelay(delta);
@@ -580,7 +573,8 @@ static int serial_ir_probe(struct platform_device *dev)
		return result;

	/* Initialize pulse/space widths */
	init_timing_params(50, 38000);
	serial_ir.duty_cycle = 50;
	serial_ir.carrier = 38000;

	/* If pin is high, then this must be an active low receiver. */
	if (sense == -1) {
@@ -684,7 +678,7 @@ static int serial_ir_tx(struct rc_dev *dev, unsigned int *txbuf,

static int serial_ir_tx_duty_cycle(struct rc_dev *dev, u32 cycle)
{
	init_timing_params(cycle, serial_ir.freq);
	serial_ir.duty_cycle = cycle;
	return 0;
}

@@ -693,7 +687,7 @@ static int serial_ir_tx_carrier(struct rc_dev *dev, u32 carrier)
	if (carrier > 500000 || carrier < 20000)
		return -EINVAL;

	init_timing_params(serial_ir.duty_cycle, carrier);
	serial_ir.carrier = carrier;
	return 0;
}