[media] winbond-cir: fix idle mode
authorSean Young <sean@mess.org>
Wed, 24 Oct 2012 20:22:40 +0000 (17:22 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Wed, 21 Nov 2012 19:03:30 +0000 (17:03 -0200)
The receiver is never disabled by idle mode since rxstate never gets set
to RXSTATE_ACTIVE, so we keep on getting interrupts after the first IR
activity ends. Note that ir_raw_event_reset() already calls
ir_raw_event_handle().

Signed-off-by: Sean Young <sean@mess.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/rc/winbond-cir.c

index 45d2fff..16ba38e 100644 (file)
@@ -207,7 +207,6 @@ struct wbcir_data {
        /* RX state */
        enum wbcir_rxstate rxstate;
        struct led_trigger *rxtrigger;
-       struct ir_raw_event rxev;
 
        /* TX state */
        enum wbcir_txstate txstate;
@@ -339,9 +338,12 @@ wbcir_idle_rx(struct rc_dev *dev, bool idle)
                led_trigger_event(data->rxtrigger, LED_FULL);
        }
 
-       if (idle && data->rxstate != WBCIR_RXSTATE_INACTIVE)
+       if (idle && data->rxstate != WBCIR_RXSTATE_INACTIVE) {
+               data->rxstate = WBCIR_RXSTATE_INACTIVE;
+               led_trigger_event(data->rxtrigger, LED_OFF);
                /* Tell hardware to go idle by setting RXINACTIVE */
                outb(WBCIR_RX_DISABLE, data->sbase + WBCIR_REG_SP3_ASCR);
+       }
 }
 
 static void
@@ -360,12 +362,6 @@ wbcir_irq_rx(struct wbcir_data *data, struct pnp_dev *device)
                ir_raw_event_store_with_filter(data->dev, &rawir);
        }
 
-       /* Check if we should go idle */
-       if (data->dev->idle) {
-               led_trigger_event(data->rxtrigger, LED_OFF);
-               data->rxstate = WBCIR_RXSTATE_INACTIVE;
-       }
-
        ir_raw_event_handle(data->dev);
 }
 
@@ -915,9 +911,8 @@ wbcir_init_hw(struct wbcir_data *data)
 
        /* Clear RX state */
        data->rxstate = WBCIR_RXSTATE_INACTIVE;
-       data->rxev.duration = 0;
        ir_raw_event_reset(data->dev);
-       ir_raw_event_handle(data->dev);
+       ir_raw_event_set_idle(data->dev, true);
 
        /* Clear TX state */
        if (data->txstate == WBCIR_TXSTATE_ACTIVE) {