ite-cir: finish tx before suspending

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

Commit Message

Jarod Wilson May 9, 2011, 7:59 p.m. UTC
  Continuing with IR transmit after resuming from suspend seems fairly
useless, given that the only place we can actually end up suspending is
after IR has been send and we're simply mdelay'ing. Lets simplify the
resume path by just waiting on tx to complete in the suspend path, then
we know we can't be transmitting on resume, and reinitialization of the
hardware registers becomes more straight-forward.

CC: Juan Jesús García de Soria <skandalfo@gmail.com>
Signed-off-by: Jarod Wilson <jarod@redhat.com>
---
Nb: this patch relies upon my earlier patch to add the init_hardware
calls to the resume path in the first place.

 drivers/media/rc/ite-cir.c |   16 +++++++---------
 1 files changed, 7 insertions(+), 9 deletions(-)
  

Comments

Jarod Wilson May 9, 2011, 8:07 p.m. UTC | #1
Jarod Wilson wrote:
> Continuing with IR transmit after resuming from suspend seems fairly
> useless, given that the only place we can actually end up suspending is
> after IR has been send and we're simply mdelay'ing. Lets simplify the
> resume path by just waiting on tx to complete in the suspend path, then
> we know we can't be transmitting on resume, and reinitialization of the
> hardware registers becomes more straight-forward.
>
> CC: Juan Jesús García de Soria<skandalfo@gmail.com>
> Signed-off-by: Jarod Wilson<jarod@redhat.com>
> ---
> Nb: this patch relies upon my earlier patch to add the init_hardware
> calls to the resume path in the first place.

Also note: I don't have tx-capable hardware (or at least, there's no
tx hardware wired up), so I haven't actually tested this, but the code 
added to ite_suspend is more or less cloned from ite_close.
  

Patch

diff --git a/drivers/media/rc/ite-cir.c b/drivers/media/rc/ite-cir.c
index d1dec5c..e716b93 100644
--- a/drivers/media/rc/ite-cir.c
+++ b/drivers/media/rc/ite-cir.c
@@ -1650,6 +1650,9 @@  static int ite_suspend(struct pnp_dev *pdev, pm_message_t state)
 
 	ite_dbg("%s called", __func__);
 
+	/* wait for any transmission to end */
+	wait_event_interruptible(dev->tx_ended, !dev->transmitting);
+
 	spin_lock_irqsave(&dev->lock, flags);
 
 	/* disable all interrupts */
@@ -1670,15 +1673,10 @@  static int ite_resume(struct pnp_dev *pdev)
 
 	spin_lock_irqsave(&dev->lock, flags);
 
-	if (dev->transmitting) {
-		/* wake up the transmitter */
-		wake_up_interruptible(&dev->tx_queue);
-	} else {
-		/* reinitialize hardware config registers */
-		dev->params.init_hardware(dev);
-		/* enable the receiver */
-		dev->params.enable_rx(dev);
-	}
+	/* reinitialize hardware config registers */
+	dev->params.init_hardware(dev);
+	/* enable the receiver */
+	dev->params.enable_rx(dev);
 
 	spin_unlock_irqrestore(&dev->lock, flags);