[media] winbond: wire up rc feedback led
authorSean Young <sean@mess.org>
Tue, 30 Jul 2013 22:00:03 +0000 (19:00 -0300)
committerMauro Carvalho Chehab <m.chehab@samsung.com>
Thu, 22 Aug 2013 14:49:18 +0000 (11:49 -0300)
Note that with the rc-feedback trigger, the cir-rx trigger is now
redundant. The cir-tx trigger is not used by default; if this
functionality is desired then it should exist in rc-core, not in
a driver.
Also make sure that the led is suspended on suspend.

Signed-off-by: Sean Young <sean@mess.org>
Signed-off-by: David Härdeman <david@hardeman.nu>
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
drivers/media/rc/Kconfig
drivers/media/rc/winbond-cir.c

index 0bf4ac7276d6a9e6ce311e6a7180f5c079d472e4..11e84bcc23a169be3db8f8a3168a458bee0a31d0 100644 (file)
@@ -250,7 +250,6 @@ config IR_WINBOND_CIR
        depends on RC_CORE
        select NEW_LEDS
        select LEDS_CLASS
-       select LEDS_TRIGGERS
        select BITREVERSE
        ---help---
           Say Y here if you want to use the IR remote functionality found
index 87af2d3ba601228960b52d4ff87eac51660d6709..98bd4960c75ec1729ce1930c90e8e20d2db44bef 100644 (file)
@@ -213,13 +213,11 @@ struct wbcir_data {
 
        /* RX state */
        enum wbcir_rxstate rxstate;
-       struct led_trigger *rxtrigger;
        int carrier_report_enabled;
        u32 pulse_duration;
 
        /* TX state */
        enum wbcir_txstate txstate;
-       struct led_trigger *txtrigger;
        u32 txlen;
        u32 txoff;
        u32 *txbuf;
@@ -366,14 +364,11 @@ wbcir_idle_rx(struct rc_dev *dev, bool idle)
 {
        struct wbcir_data *data = dev->priv;
 
-       if (!idle && data->rxstate == WBCIR_RXSTATE_INACTIVE) {
+       if (!idle && data->rxstate == WBCIR_RXSTATE_INACTIVE)
                data->rxstate = WBCIR_RXSTATE_ACTIVE;
-               led_trigger_event(data->rxtrigger, LED_FULL);
-       }
 
        if (idle && data->rxstate != WBCIR_RXSTATE_INACTIVE) {
                data->rxstate = WBCIR_RXSTATE_INACTIVE;
-               led_trigger_event(data->rxtrigger, LED_OFF);
 
                if (data->carrier_report_enabled)
                        wbcir_carrier_report(data);
@@ -425,7 +420,6 @@ wbcir_irq_tx(struct wbcir_data *data)
        case WBCIR_TXSTATE_INACTIVE:
                /* TX FIFO empty */
                space = 16;
-               led_trigger_event(data->txtrigger, LED_FULL);
                break;
        case WBCIR_TXSTATE_ACTIVE:
                /* TX FIFO low (3 bytes or less) */
@@ -464,7 +458,6 @@ wbcir_irq_tx(struct wbcir_data *data)
                        /* Clear TX underrun bit */
                        outb(WBCIR_TX_UNDERRUN, data->sbase + WBCIR_REG_SP3_ASCR);
                wbcir_set_irqmask(data, WBCIR_IRQ_RX | WBCIR_IRQ_ERR);
-               led_trigger_event(data->txtrigger, LED_OFF);
                kfree(data->txbuf);
                data->txbuf = NULL;
                data->txstate = WBCIR_TXSTATE_INACTIVE;
@@ -878,15 +871,13 @@ finish:
         */
        wbcir_set_irqmask(data, WBCIR_IRQ_NONE);
        disable_irq(data->irq);
-
-       /* Disable LED */
-       led_trigger_event(data->rxtrigger, LED_OFF);
-       led_trigger_event(data->txtrigger, LED_OFF);
 }
 
 static int
 wbcir_suspend(struct pnp_dev *device, pm_message_t state)
 {
+       struct wbcir_data *data = pnp_get_drvdata(device);
+       led_classdev_suspend(&data->led);
        wbcir_shutdown(device);
        return 0;
 }
@@ -1015,6 +1006,7 @@ wbcir_resume(struct pnp_dev *device)
 
        wbcir_init_hw(data);
        enable_irq(data->irq);
+       led_classdev_resume(&data->led);
 
        return 0;
 }
@@ -1058,25 +1050,13 @@ wbcir_probe(struct pnp_dev *device, const struct pnp_device_id *dev_id)
                "(w: 0x%lX, e: 0x%lX, s: 0x%lX, i: %u)\n",
                data->wbase, data->ebase, data->sbase, data->irq);
 
-       led_trigger_register_simple("cir-tx", &data->txtrigger);
-       if (!data->txtrigger) {
-               err = -ENOMEM;
-               goto exit_free_data;
-       }
-
-       led_trigger_register_simple("cir-rx", &data->rxtrigger);
-       if (!data->rxtrigger) {
-               err = -ENOMEM;
-               goto exit_unregister_txtrigger;
-       }
-
        data->led.name = "cir::activity";
-       data->led.default_trigger = "cir-rx";
+       data->led.default_trigger = "rc-feedback";
        data->led.brightness_set = wbcir_led_brightness_set;
        data->led.brightness_get = wbcir_led_brightness_get;
        err = led_classdev_register(&device->dev, &data->led);
        if (err)
-               goto exit_unregister_rxtrigger;
+               goto exit_free_data;
 
        data->dev = rc_allocate_device();
        if (!data->dev) {
@@ -1156,10 +1136,6 @@ exit_free_rc:
        rc_free_device(data->dev);
 exit_unregister_led:
        led_classdev_unregister(&data->led);
-exit_unregister_rxtrigger:
-       led_trigger_unregister_simple(data->rxtrigger);
-exit_unregister_txtrigger:
-       led_trigger_unregister_simple(data->txtrigger);
 exit_free_data:
        kfree(data);
        pnp_set_drvdata(device, NULL);
@@ -1187,8 +1163,6 @@ wbcir_remove(struct pnp_dev *device)
 
        rc_unregister_device(data->dev);
 
-       led_trigger_unregister_simple(data->rxtrigger);
-       led_trigger_unregister_simple(data->txtrigger);
        led_classdev_unregister(&data->led);
 
        /* This is ok since &data->led isn't actually used */