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

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
...@@ -139,10 +139,8 @@ struct serial_ir { ...@@ -139,10 +139,8 @@ struct serial_ir {
struct platform_device *pdev; struct platform_device *pdev;
struct timer_list timeout_timer; struct timer_list timeout_timer;
unsigned int freq; unsigned int carrier;
unsigned int duty_cycle; unsigned int duty_cycle;
unsigned int pulse_width, space_width;
}; };
static struct serial_ir serial_ir; static struct serial_ir serial_ir;
...@@ -183,18 +181,6 @@ static void off(void) ...@@ -183,18 +181,6 @@ static void off(void)
soutp(UART_MCR, hardware[type].off); 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) static void send_pulse_irdeo(unsigned int length, ktime_t target)
{ {
long rawbits; long rawbits;
...@@ -241,13 +227,20 @@ static void send_pulse_homebrew_softcarrier(unsigned int length, ktime_t edge) ...@@ -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. * ndelay(s64) does not compile; so use s32 rather than s64.
*/ */
s32 delta; 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 (;;) { for (;;) {
now = ktime_get(); now = ktime_get();
if (ktime_compare(now, target) >= 0) if (ktime_compare(now, target) >= 0)
break; break;
on(); on();
edge = ktime_add_ns(edge, serial_ir.pulse_width); edge = ktime_add_ns(edge, pulse);
delta = ktime_to_ns(ktime_sub(edge, now)); delta = ktime_to_ns(ktime_sub(edge, now));
if (delta > 0) if (delta > 0)
ndelay(delta); ndelay(delta);
...@@ -255,7 +248,7 @@ static void send_pulse_homebrew_softcarrier(unsigned int length, ktime_t edge) ...@@ -255,7 +248,7 @@ static void send_pulse_homebrew_softcarrier(unsigned int length, ktime_t edge)
off(); off();
if (ktime_compare(now, target) >= 0) if (ktime_compare(now, target) >= 0)
break; break;
edge = ktime_add_ns(edge, serial_ir.space_width); edge = ktime_add_ns(edge, space);
delta = ktime_to_ns(ktime_sub(edge, now)); delta = ktime_to_ns(ktime_sub(edge, now));
if (delta > 0) if (delta > 0)
ndelay(delta); ndelay(delta);
...@@ -580,7 +573,8 @@ static int serial_ir_probe(struct platform_device *dev) ...@@ -580,7 +573,8 @@ static int serial_ir_probe(struct platform_device *dev)
return result; return result;
/* Initialize pulse/space widths */ /* 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 pin is high, then this must be an active low receiver. */
if (sense == -1) { if (sense == -1) {
...@@ -684,7 +678,7 @@ static int serial_ir_tx(struct rc_dev *dev, unsigned int *txbuf, ...@@ -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) 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; return 0;
} }
...@@ -693,7 +687,7 @@ static int serial_ir_tx_carrier(struct rc_dev *dev, u32 carrier) ...@@ -693,7 +687,7 @@ static int serial_ir_tx_carrier(struct rc_dev *dev, u32 carrier)
if (carrier > 500000 || carrier < 20000) if (carrier > 500000 || carrier < 20000)
return -EINVAL; return -EINVAL;
init_timing_params(serial_ir.duty_cycle, carrier); serial_ir.carrier = carrier;
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment