[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: Sean Young <sean@mess.org> Signed-off-by: David Härdeman <david@hardeman.nu> Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
This commit is contained in:
parent
5704e76c86
commit
1ac7fdeeb5
@ -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 {
|
|||||||
|
|
||||||
/* 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)
|
|||||||
{
|
{
|
||||||
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)
|
|||||||
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)
|
|||||||
/* 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 @@ finish:
|
|||||||
*/
|
*/
|
||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
"(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 @@ exit_free_rc:
|
|||||||
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)
|
|||||||
|
|
||||||
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 */
|
||||||
|
Loading…
Reference in New Issue
Block a user