ite-cir: make IR receive work after resume

Message ID 1304953686-21805-1-git-send-email-jarod@redhat.com (mailing list archive)
State Superseded, archived
Headers

Commit Message

Jarod Wilson May 9, 2011, 3:08 p.m. UTC
  Just recently acquired an Asus Eee Box PC with an onboard IR receiver
driven by ite-cir (ITE8713 sub-variant). Works out of the box with the
ite-cir driver in 2.6.39, but stops working after a suspend/resume
cycle. Its fixed by simply reinitializing registers after resume,
similar to what's done in the nuvoton-cir driver. I've not tested with
any other ITE variant, but code inspection suggests this should be safe
on all variants.

Reported-by: Stephan Raue <sraue@openelec.tv>
CC: Juan Jesús García de Soria <skandalfo@gmail.com>
Signed-off-by: Jarod Wilson <jarod@redhat.com>
---
 drivers/media/rc/ite-cir.c |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)
  

Comments

Jarod Wilson May 9, 2011, 6:25 p.m. UTC | #1
Jarod Wilson wrote:
> Just recently acquired an Asus Eee Box PC with an onboard IR receiver
> driven by ite-cir (ITE8713 sub-variant). Works out of the box with the
> ite-cir driver in 2.6.39, but stops working after a suspend/resume
> cycle. Its fixed by simply reinitializing registers after resume,
> similar to what's done in the nuvoton-cir driver. I've not tested with
> any other ITE variant, but code inspection suggests this should be safe
> on all variants.
>
> Reported-by: Stephan Raue<sraue@openelec.tv>
> CC: Juan Jesús García de Soria<skandalfo@gmail.com>
> Signed-off-by: Jarod Wilson<jarod@redhat.com>
> ---
>   drivers/media/rc/ite-cir.c |    2 ++
>   1 files changed, 2 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/media/rc/ite-cir.c b/drivers/media/rc/ite-cir.c
> index 43908a7..8488e53 100644
> --- a/drivers/media/rc/ite-cir.c
> +++ b/drivers/media/rc/ite-cir.c
> @@ -1684,6 +1684,8 @@ static int ite_resume(struct pnp_dev *pdev)
>   		/* wake up the transmitter */
>   		wake_up_interruptible(&dev->tx_queue);
>   	} else {
> +		/* reinitialize hardware config registers */
> +		itdev->params.init_hardware(itdev);
>   		/* enable the receiver */
>   		dev->params.enable_rx(dev);


Gah. I've obviously screwed this one up. Tested a locally built version 
of the module on the machine itself, then did a copy/paste of the 
init_hardware line from elsewhere in the driver where struct ite_dev was 
called itdev instead of just dev. v2 momentarily.
  

Patch

diff --git a/drivers/media/rc/ite-cir.c b/drivers/media/rc/ite-cir.c
index 43908a7..8488e53 100644
--- a/drivers/media/rc/ite-cir.c
+++ b/drivers/media/rc/ite-cir.c
@@ -1684,6 +1684,8 @@  static int ite_resume(struct pnp_dev *pdev)
 		/* wake up the transmitter */
 		wake_up_interruptible(&dev->tx_queue);
 	} else {
+		/* reinitialize hardware config registers */
+		itdev->params.init_hardware(itdev);
 		/* enable the receiver */
 		dev->params.enable_rx(dev);
 	}