Commit e1b1ddbe authored by Maxim Levitsky's avatar Maxim Levitsky Committed by Mauro Carvalho Chehab

[media] IR: ene_ir: add support for carrier reports

Signed-off-by: default avatarMaxim Levitsky <maximlevitsky@gmail.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 4651918a
...@@ -193,10 +193,11 @@ static int ene_hw_detect(struct ene_device *dev) ...@@ -193,10 +193,11 @@ static int ene_hw_detect(struct ene_device *dev)
/* Sense current received carrier */ /* Sense current received carrier */
void ene_rx_sense_carrier(struct ene_device *dev) void ene_rx_sense_carrier(struct ene_device *dev)
{ {
DEFINE_IR_RAW_EVENT(ev);
int carrier, duty_cycle;
int period = ene_read_reg(dev, ENE_CIRCAR_PRD); int period = ene_read_reg(dev, ENE_CIRCAR_PRD);
int hperiod = ene_read_reg(dev, ENE_CIRCAR_HPRD); int hperiod = ene_read_reg(dev, ENE_CIRCAR_HPRD);
int carrier, duty_cycle;
if (!(period & ENE_CIRCAR_PRD_VALID)) if (!(period & ENE_CIRCAR_PRD_VALID))
return; return;
...@@ -209,13 +210,16 @@ void ene_rx_sense_carrier(struct ene_device *dev) ...@@ -209,13 +210,16 @@ void ene_rx_sense_carrier(struct ene_device *dev)
dbg("RX: hardware carrier period = %02x", period); dbg("RX: hardware carrier period = %02x", period);
dbg("RX: hardware carrier pulse period = %02x", hperiod); dbg("RX: hardware carrier pulse period = %02x", hperiod);
carrier = 2000000 / period; carrier = 2000000 / period;
duty_cycle = (hperiod * 100) / period; duty_cycle = (hperiod * 100) / period;
dbg("RX: sensed carrier = %d Hz, duty cycle %d%%", dbg("RX: sensed carrier = %d Hz, duty cycle %d%%",
carrier, duty_cycle); carrier, duty_cycle);
if (dev->carrier_detect_enabled) {
/* TODO: Send carrier & duty cycle to IR layer */ ev.carrier_report = true;
ev.carrier = carrier;
ev.duty_cycle = duty_cycle;
ir_raw_event_store(dev->idev, &ev);
}
} }
/* this enables/disables the CIR RX engine */ /* this enables/disables the CIR RX engine */
...@@ -724,7 +728,7 @@ static irqreturn_t ene_isr(int irq, void *data) ...@@ -724,7 +728,7 @@ static irqreturn_t ene_isr(int irq, void *data)
dbg_verbose("RX interrupt"); dbg_verbose("RX interrupt");
if (dev->carrier_detect_enabled || debug) if (dev->hw_learning_and_tx_capable)
ene_rx_sense_carrier(dev); ene_rx_sense_carrier(dev);
/* On hardware that don't support extra buffer we need to trust /* On hardware that don't support extra buffer we need to trust
...@@ -897,6 +901,23 @@ static int ene_set_learning_mode(void *data, int enable) ...@@ -897,6 +901,23 @@ static int ene_set_learning_mode(void *data, int enable)
return 0; return 0;
} }
static int ene_set_carrier_report(void *data, int enable)
{
struct ene_device *dev = (struct ene_device *)data;
unsigned long flags;
if (enable == dev->carrier_detect_enabled)
return 0;
spin_lock_irqsave(&dev->hw_lock, flags);
dev->carrier_detect_enabled = enable;
ene_rx_disable(dev);
ene_rx_setup(dev);
ene_rx_enable(dev);
spin_unlock_irqrestore(&dev->hw_lock, flags);
return 0;
}
/* outside interface: enable or disable idle mode */ /* outside interface: enable or disable idle mode */
static void ene_rx_set_idle(void *data, bool idle) static void ene_rx_set_idle(void *data, bool idle)
{ {
...@@ -1029,7 +1050,7 @@ static int ene_probe(struct pnp_dev *pnp_dev, const struct pnp_device_id *id) ...@@ -1029,7 +1050,7 @@ static int ene_probe(struct pnp_dev *pnp_dev, const struct pnp_device_id *id)
ir_props->s_tx_mask = ene_set_tx_mask; ir_props->s_tx_mask = ene_set_tx_mask;
ir_props->s_tx_carrier = ene_set_tx_carrier; ir_props->s_tx_carrier = ene_set_tx_carrier;
ir_props->s_tx_duty_cycle = ene_set_tx_duty_cycle; ir_props->s_tx_duty_cycle = ene_set_tx_duty_cycle;
/* ir_props->s_carrier_report = ene_set_carrier_report; */ ir_props->s_carrier_report = ene_set_carrier_report;
} }
ene_setup_hw_buffer(dev); ene_setup_hw_buffer(dev);
......
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