diff mbox

[4/5,media] winbond: wire up rc feedback led

Message ID 1375225204-5082-4-git-send-email-sean@mess.org (mailing list archive)
State New, archived
Headers show

Commit Message

Sean Young July 30, 2013, 11 p.m. UTC
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>
---
 drivers/media/rc/Kconfig       |  1 -
 drivers/media/rc/winbond-cir.c | 38 ++++++--------------------------------
 2 files changed, 6 insertions(+), 33 deletions(-)

Comments

David Härdeman Aug. 4, 2013, 10:11 p.m. UTC | #1
On Wed, Jul 31, 2013 at 12:00:03AM +0100, Sean Young wrote:
>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>

>---
> drivers/media/rc/Kconfig       |  1 -
> drivers/media/rc/winbond-cir.c | 38 ++++++--------------------------------
> 2 files changed, 6 insertions(+), 33 deletions(-)
>
>diff --git a/drivers/media/rc/Kconfig b/drivers/media/rc/Kconfig
>index 5a79c33..7fa6b22 100644
>--- a/drivers/media/rc/Kconfig
>+++ b/drivers/media/rc/Kconfig
>@@ -248,7 +248,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
>diff --git a/drivers/media/rc/winbond-cir.c b/drivers/media/rc/winbond-cir.c
>index 87af2d3..98bd496 100644
>--- a/drivers/media/rc/winbond-cir.c
>+++ b/drivers/media/rc/winbond-cir.c
>@@ -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 */
>-- 
>1.8.3.1
>
diff mbox

Patch

diff --git a/drivers/media/rc/Kconfig b/drivers/media/rc/Kconfig
index 5a79c33..7fa6b22 100644
--- a/drivers/media/rc/Kconfig
+++ b/drivers/media/rc/Kconfig
@@ -248,7 +248,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
diff --git a/drivers/media/rc/winbond-cir.c b/drivers/media/rc/winbond-cir.c
index 87af2d3..98bd496 100644
--- a/drivers/media/rc/winbond-cir.c
+++ b/drivers/media/rc/winbond-cir.c
@@ -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 */