Commit 488ebc48 authored by David Härdeman's avatar David Härdeman Committed by Mauro Carvalho Chehab

[media] rc-core: use ir_raw_event_store_with_filter in winbond-cir

Using ir_raw_event_store_with_filter() saves about 20 lines of code.
Signed-off-by: default avatarDavid Härdeman <david@hardeman.nu>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 08ffff9f
...@@ -330,60 +330,38 @@ wbcir_to_rc6cells(u8 val) ...@@ -330,60 +330,38 @@ wbcir_to_rc6cells(u8 val)
*****************************************************************************/ *****************************************************************************/
static void static void
wbcir_irq_rx(struct wbcir_data *data, struct pnp_dev *device) wbcir_idle_rx(struct rc_dev *dev, bool idle)
{ {
u8 irdata[8]; struct wbcir_data *data = dev->priv;
bool disable = true;
unsigned int i;
if (data->rxstate == WBCIR_RXSTATE_INACTIVE) { if (!idle && data->rxstate == WBCIR_RXSTATE_INACTIVE) {
data->rxstate = WBCIR_RXSTATE_ACTIVE; data->rxstate = WBCIR_RXSTATE_ACTIVE;
led_trigger_event(data->rxtrigger, LED_FULL); led_trigger_event(data->rxtrigger, LED_FULL);
} }
/* Since RXHDLEV is set, at least 8 bytes are in the FIFO */ if (idle && data->rxstate != WBCIR_RXSTATE_INACTIVE)
insb(data->sbase + WBCIR_REG_SP3_RXDATA, &irdata[0], 8); /* Tell hardware to go idle by setting RXINACTIVE */
outb(WBCIR_RX_DISABLE, data->sbase + WBCIR_REG_SP3_ASCR);
for (i = 0; i < 8; i++) { }
u8 pulse;
u32 duration;
if (irdata[i] != 0xFF && irdata[i] != 0x00) static void
disable = false; wbcir_irq_rx(struct wbcir_data *data, struct pnp_dev *device)
{
u8 irdata;
DEFINE_IR_RAW_EVENT(rawir);
/* Since RXHDLEV is set, at least 8 bytes are in the FIFO */
while (inb(data->sbase + WBCIR_REG_SP3_LSR) & WBCIR_RX_AVAIL) {
irdata = inb(data->sbase + WBCIR_REG_SP3_RXDATA);
if (data->rxstate == WBCIR_RXSTATE_ERROR) if (data->rxstate == WBCIR_RXSTATE_ERROR)
continue; continue;
rawir.pulse = irdata & 0x80 ? false : true;
pulse = irdata[i] & 0x80 ? false : true; rawir.duration = US_TO_NS((irdata & 0x7F) * 10);
duration = (irdata[i] & 0x7F) * 10000; /* ns */ ir_raw_event_store_with_filter(data->dev, &rawir);
if (data->rxev.pulse != pulse) {
if (data->rxev.duration != 0) {
ir_raw_event_store(data->dev, &data->rxev);
data->rxev.duration = 0;
}
data->rxev.pulse = pulse;
}
data->rxev.duration += duration;
} }
if (disable) { /* Check if we should go idle */
if (data->rxev.duration != 0 && if (data->dev->idle) {
data->rxstate != WBCIR_RXSTATE_ERROR) {
ir_raw_event_store(data->dev, &data->rxev);
data->rxev.duration = 0;
}
/* Set RXINACTIVE */
outb(WBCIR_RX_DISABLE, data->sbase + WBCIR_REG_SP3_ASCR);
/* Drain the FIFO */
while (inb(data->sbase + WBCIR_REG_SP3_LSR) & WBCIR_RX_AVAIL)
inb(data->sbase + WBCIR_REG_SP3_RXDATA);
ir_raw_event_reset(data->dev);
led_trigger_event(data->rxtrigger, LED_OFF); led_trigger_event(data->rxtrigger, LED_OFF);
data->rxstate = WBCIR_RXSTATE_INACTIVE; data->rxstate = WBCIR_RXSTATE_INACTIVE;
} }
...@@ -1088,6 +1066,7 @@ wbcir_probe(struct pnp_dev *device, const struct pnp_device_id *dev_id) ...@@ -1088,6 +1066,7 @@ wbcir_probe(struct pnp_dev *device, const struct pnp_device_id *dev_id)
data->dev->input_id.product = WBCIR_ID_FAMILY; data->dev->input_id.product = WBCIR_ID_FAMILY;
data->dev->input_id.version = WBCIR_ID_CHIP; data->dev->input_id.version = WBCIR_ID_CHIP;
data->dev->map_name = RC_MAP_RC6_MCE; data->dev->map_name = RC_MAP_RC6_MCE;
data->dev->s_idle = wbcir_idle_rx;
data->dev->s_tx_mask = wbcir_txmask; data->dev->s_tx_mask = wbcir_txmask;
data->dev->s_tx_carrier = wbcir_txcarrier; data->dev->s_tx_carrier = wbcir_txcarrier;
data->dev->tx_ir = wbcir_tx; data->dev->tx_ir = wbcir_tx;
......
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