Commit 1ac7fdee authored by Sean Young's avatar Sean Young Committed by Mauro Carvalho Chehab

[media] winbond: wire up rc feedback led

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: default avatarSean Young <sean@mess.org>
Signed-off-by: default avatarDavid Härdeman <david@hardeman.nu>
Signed-off-by: default avatarMauro Carvalho Chehab <m.chehab@samsung.com>
parent 5704e76c
...@@ -250,7 +250,6 @@ config IR_WINBOND_CIR ...@@ -250,7 +250,6 @@ config IR_WINBOND_CIR
depends on RC_CORE depends on RC_CORE
select NEW_LEDS select NEW_LEDS
select LEDS_CLASS select LEDS_CLASS
select LEDS_TRIGGERS
select BITREVERSE select BITREVERSE
---help--- ---help---
Say Y here if you want to use the IR remote functionality found Say Y here if you want to use the IR remote functionality found
......
...@@ -213,13 +213,11 @@ struct wbcir_data { ...@@ -213,13 +213,11 @@ struct wbcir_data {
/* RX state */ /* RX state */
enum wbcir_rxstate rxstate; enum wbcir_rxstate rxstate;
struct led_trigger *rxtrigger;
int carrier_report_enabled; int carrier_report_enabled;
u32 pulse_duration; u32 pulse_duration;
/* TX state */ /* TX state */
enum wbcir_txstate txstate; enum wbcir_txstate txstate;
struct led_trigger *txtrigger;
u32 txlen; u32 txlen;
u32 txoff; u32 txoff;
u32 *txbuf; u32 *txbuf;
...@@ -366,14 +364,11 @@ wbcir_idle_rx(struct rc_dev *dev, bool idle) ...@@ -366,14 +364,11 @@ wbcir_idle_rx(struct rc_dev *dev, bool idle)
{ {
struct wbcir_data *data = dev->priv; 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; data->rxstate = WBCIR_RXSTATE_ACTIVE;
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; data->rxstate = WBCIR_RXSTATE_INACTIVE;
led_trigger_event(data->rxtrigger, LED_OFF);
if (data->carrier_report_enabled) if (data->carrier_report_enabled)
wbcir_carrier_report(data); wbcir_carrier_report(data);
...@@ -425,7 +420,6 @@ wbcir_irq_tx(struct wbcir_data *data) ...@@ -425,7 +420,6 @@ wbcir_irq_tx(struct wbcir_data *data)
case WBCIR_TXSTATE_INACTIVE: case WBCIR_TXSTATE_INACTIVE:
/* TX FIFO empty */ /* TX FIFO empty */
space = 16; space = 16;
led_trigger_event(data->txtrigger, LED_FULL);
break; break;
case WBCIR_TXSTATE_ACTIVE: case WBCIR_TXSTATE_ACTIVE:
/* TX FIFO low (3 bytes or less) */ /* TX FIFO low (3 bytes or less) */
...@@ -464,7 +458,6 @@ wbcir_irq_tx(struct wbcir_data *data) ...@@ -464,7 +458,6 @@ wbcir_irq_tx(struct wbcir_data *data)
/* Clear TX underrun bit */ /* Clear TX underrun bit */
outb(WBCIR_TX_UNDERRUN, data->sbase + WBCIR_REG_SP3_ASCR); outb(WBCIR_TX_UNDERRUN, data->sbase + WBCIR_REG_SP3_ASCR);
wbcir_set_irqmask(data, WBCIR_IRQ_RX | WBCIR_IRQ_ERR); wbcir_set_irqmask(data, WBCIR_IRQ_RX | WBCIR_IRQ_ERR);
led_trigger_event(data->txtrigger, LED_OFF);
kfree(data->txbuf); kfree(data->txbuf);
data->txbuf = NULL; data->txbuf = NULL;
data->txstate = WBCIR_TXSTATE_INACTIVE; data->txstate = WBCIR_TXSTATE_INACTIVE;
...@@ -878,15 +871,13 @@ wbcir_shutdown(struct pnp_dev *device) ...@@ -878,15 +871,13 @@ wbcir_shutdown(struct pnp_dev *device)
*/ */
wbcir_set_irqmask(data, WBCIR_IRQ_NONE); wbcir_set_irqmask(data, WBCIR_IRQ_NONE);
disable_irq(data->irq); disable_irq(data->irq);
/* Disable LED */
led_trigger_event(data->rxtrigger, LED_OFF);
led_trigger_event(data->txtrigger, LED_OFF);
} }
static int static int
wbcir_suspend(struct pnp_dev *device, pm_message_t state) 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); wbcir_shutdown(device);
return 0; return 0;
} }
...@@ -1015,6 +1006,7 @@ wbcir_resume(struct pnp_dev *device) ...@@ -1015,6 +1006,7 @@ wbcir_resume(struct pnp_dev *device)
wbcir_init_hw(data); wbcir_init_hw(data);
enable_irq(data->irq); enable_irq(data->irq);
led_classdev_resume(&data->led);
return 0; return 0;
} }
...@@ -1058,25 +1050,13 @@ wbcir_probe(struct pnp_dev *device, const struct pnp_device_id *dev_id) ...@@ -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", "(w: 0x%lX, e: 0x%lX, s: 0x%lX, i: %u)\n",
data->wbase, data->ebase, data->sbase, data->irq); 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.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_set = wbcir_led_brightness_set;
data->led.brightness_get = wbcir_led_brightness_get; data->led.brightness_get = wbcir_led_brightness_get;
err = led_classdev_register(&device->dev, &data->led); err = led_classdev_register(&device->dev, &data->led);
if (err) if (err)
goto exit_unregister_rxtrigger; goto exit_free_data;
data->dev = rc_allocate_device(); data->dev = rc_allocate_device();
if (!data->dev) { if (!data->dev) {
...@@ -1156,10 +1136,6 @@ wbcir_probe(struct pnp_dev *device, const struct pnp_device_id *dev_id) ...@@ -1156,10 +1136,6 @@ wbcir_probe(struct pnp_dev *device, const struct pnp_device_id *dev_id)
rc_free_device(data->dev); rc_free_device(data->dev);
exit_unregister_led: exit_unregister_led:
led_classdev_unregister(&data->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: exit_free_data:
kfree(data); kfree(data);
pnp_set_drvdata(device, NULL); pnp_set_drvdata(device, NULL);
...@@ -1187,8 +1163,6 @@ wbcir_remove(struct pnp_dev *device) ...@@ -1187,8 +1163,6 @@ wbcir_remove(struct pnp_dev *device)
rc_unregister_device(data->dev); rc_unregister_device(data->dev);
led_trigger_unregister_simple(data->rxtrigger);
led_trigger_unregister_simple(data->txtrigger);
led_classdev_unregister(&data->led); led_classdev_unregister(&data->led);
/* This is ok since &data->led isn't actually used */ /* This is ok since &data->led isn't actually used */
......
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