]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/input/serio/hp_sdc_mlc.c
Input: HIL - fix rwlock recursion bug
[linux-2.6-omap-h63xx.git] / drivers / input / serio / hp_sdc_mlc.c
index cb0b28877e05f65c5d0904f9fc480d4979ae242f..c45ea74d53e4d27c887ab3ada74621020bc853ee 100644 (file)
@@ -142,14 +142,11 @@ static void hp_sdc_mlc_isr (int irq, void *dev_id,
 
 static int hp_sdc_mlc_in(hil_mlc *mlc, suseconds_t timeout)
 {
-       unsigned long flags;
        struct hp_sdc_mlc_priv_s *priv;
        int rc = 2;
 
        priv = mlc->priv;
 
-       write_lock_irqsave(&mlc->lock, flags);
-
        /* Try to down the semaphore */
        if (down_trylock(&mlc->isem)) {
                struct timeval tv;
@@ -178,21 +175,16 @@ static int hp_sdc_mlc_in(hil_mlc *mlc, suseconds_t timeout)
  wasup:
        up(&mlc->isem);
        rc = 0;
-       goto done;
  done:
-       write_unlock_irqrestore(&mlc->lock, flags);
        return rc;
 }
 
 static int hp_sdc_mlc_cts(hil_mlc *mlc)
 {
        struct hp_sdc_mlc_priv_s *priv;
-       unsigned long flags;
 
        priv = mlc->priv;
 
-       write_lock_irqsave(&mlc->lock, flags);
-
        /* Try to down the semaphores -- they should be up. */
        BUG_ON(down_trylock(&mlc->isem));
        BUG_ON(down_trylock(&mlc->osem));
@@ -221,26 +213,21 @@ static int hp_sdc_mlc_cts(hil_mlc *mlc)
        priv->tseq[2] = 1;
        priv->tseq[3] = 0;
        priv->tseq[4] = 0;
-       hp_sdc_enqueue_transaction(&priv->trans);
+       __hp_sdc_enqueue_transaction(&priv->trans);
  busy:
-       write_unlock_irqrestore(&mlc->lock, flags);
        return 1;
  done:
        priv->trans.act.semaphore = &mlc->osem;
        up(&mlc->csem);
-       write_unlock_irqrestore(&mlc->lock, flags);
        return 0;
 }
 
 static void hp_sdc_mlc_out(hil_mlc *mlc)
 {
        struct hp_sdc_mlc_priv_s *priv;
-       unsigned long flags;
 
        priv = mlc->priv;
 
-       write_lock_irqsave(&mlc->lock, flags);
-
        /* Try to down the semaphore -- it should be up. */
        BUG_ON(down_trylock(&mlc->osem));
 
@@ -250,7 +237,7 @@ static void hp_sdc_mlc_out(hil_mlc *mlc)
  do_data:
        if (priv->emtestmode) {
                up(&mlc->osem);
-               goto done;
+               return;
        }
        /* Shouldn't be sending commands when loop may be busy */
        BUG_ON(down_trylock(&mlc->csem));
@@ -313,8 +300,6 @@ static void hp_sdc_mlc_out(hil_mlc *mlc)
        }
  enqueue:
        hp_sdc_enqueue_transaction(&priv->trans);
- done:
-       write_unlock_irqrestore(&mlc->lock, flags);
 }
 
 static int __init hp_sdc_mlc_init(void)