Skip to content

Commit

Permalink
media: gpio-ir-tx: allow transmission without carrier
Browse files Browse the repository at this point in the history
Some IR protocols do not use a carrier.

Signed-off-by: Sean Young <[email protected]>
Signed-off-by: Mauro Carvalho Chehab <[email protected]>
  • Loading branch information
seanyoung authored and mchehab committed May 12, 2020
1 parent ea8912b commit 1195a28
Showing 1 changed file with 40 additions and 4 deletions.
44 changes: 40 additions & 4 deletions drivers/media/rc/gpio-ir-tx.c
Original file line number Diff line number Diff line change
Expand Up @@ -42,18 +42,43 @@ static int gpio_ir_tx_set_carrier(struct rc_dev *dev, u32 carrier)
{
struct gpio_ir *gpio_ir = dev->priv;

if (!carrier)
if (carrier > 500000)
return -EINVAL;

gpio_ir->carrier = carrier;

return 0;
}

static int gpio_ir_tx(struct rc_dev *dev, unsigned int *txbuf,
unsigned int count)
static void gpio_ir_tx_unmodulated(struct gpio_ir *gpio_ir, uint *txbuf,
uint count)
{
unsigned long flags;
ktime_t edge;
s32 delta;
int i;

spin_lock_irqsave(&gpio_ir->lock, flags);

edge = ktime_get();

for (i = 0; i < count; i++) {
gpiod_set_value(gpio_ir->gpio, !(i % 2));

edge = ktime_add_us(edge, txbuf[i]);
delta = ktime_us_delta(edge, ktime_get());
if (delta > 0)
udelay(delta);
}

gpiod_set_value(gpio_ir->gpio, 0);

spin_unlock_irqrestore(&gpio_ir->lock, flags);
}

static void gpio_ir_tx_modulated(struct gpio_ir *gpio_ir, uint *txbuf,
uint count)
{
struct gpio_ir *gpio_ir = dev->priv;
unsigned long flags;
ktime_t edge;
/*
Expand Down Expand Up @@ -105,6 +130,17 @@ static int gpio_ir_tx(struct rc_dev *dev, unsigned int *txbuf,
}

spin_unlock_irqrestore(&gpio_ir->lock, flags);
}

static int gpio_ir_tx(struct rc_dev *dev, unsigned int *txbuf,
unsigned int count)
{
struct gpio_ir *gpio_ir = dev->priv;

if (gpio_ir->carrier)
gpio_ir_tx_modulated(gpio_ir, txbuf, count);
else
gpio_ir_tx_unmodulated(gpio_ir, txbuf, count);

return count;
}
Expand Down

0 comments on commit 1195a28

Please sign in to comment.