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: Sean Young <sean@mess.org> Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
This commit is contained in:
Родитель
766cbb3189
Коммит
fce4b371fe
|
@ -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)
|
||||||
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)
|
||||||
* 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)
|
||||||
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)
|
||||||
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,
|
||||||
|
|
||||||
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)
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче