]> git.openfabrics.org - ~emulex/infiniband.git/commitdiff
Bluetooth: btmrvl: separate write-to-clear function from interrupt handler
authorBing Zhao <bzhao@marvell.com>
Fri, 28 Mar 2014 04:30:42 +0000 (21:30 -0700)
committerMarcel Holtmann <marcel@holtmann.org>
Fri, 28 Mar 2014 07:09:30 +0000 (00:09 -0700)
This patch improves readability and makes future changes easier.

Signed-off-by: Bing Zhao <bzhao@marvell.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
drivers/bluetooth/btmrvl_sdio.c

index 1b52c9f5230d324d0476a2d7dd3f308e7fd723d8..7883793717fd17aebd13d4e7d937cdc3a38eb658 100644 (file)
@@ -667,6 +667,36 @@ static int btmrvl_sdio_process_int_status(struct btmrvl_private *priv)
        return 0;
 }
 
+static int btmrvl_sdio_write_to_clear(struct btmrvl_sdio_card *card, u8 *ireg)
+{
+       int ret;
+
+       *ireg = sdio_readb(card->func, card->reg->host_intstatus, &ret);
+       if (ret) {
+               BT_ERR("sdio_readb: read int status failed: %d", ret);
+               return ret;
+       }
+
+       if (*ireg) {
+               /*
+                * DN_LD_HOST_INT_STATUS and/or UP_LD_HOST_INT_STATUS
+                * Clear the interrupt status register and re-enable the
+                * interrupt.
+                */
+               BT_DBG("int_status = 0x%x", *ireg);
+
+               sdio_writeb(card->func, ~(*ireg) & (DN_LD_HOST_INT_STATUS |
+                                                   UP_LD_HOST_INT_STATUS),
+                           card->reg->host_intstatus, &ret);
+               if (ret) {
+                       BT_ERR("sdio_writeb: clear int status failed: %d", ret);
+                       return ret;
+               }
+       }
+
+       return 0;
+}
+
 static void btmrvl_sdio_interrupt(struct sdio_func *func)
 {
        struct btmrvl_private *priv;
@@ -684,28 +714,9 @@ static void btmrvl_sdio_interrupt(struct sdio_func *func)
 
        priv = card->priv;
 
-       ireg = sdio_readb(card->func, card->reg->host_intstatus, &ret);
-       if (ret) {
-               BT_ERR("sdio_readb: read int status register failed");
+       ret = btmrvl_sdio_write_to_clear(card, &ireg);
+       if (ret)
                return;
-       }
-
-       if (ireg != 0) {
-               /*
-                * DN_LD_HOST_INT_STATUS and/or UP_LD_HOST_INT_STATUS
-                * Clear the interrupt status register and re-enable the
-                * interrupt.
-                */
-               BT_DBG("ireg = 0x%x", ireg);
-
-               sdio_writeb(card->func, ~(ireg) & (DN_LD_HOST_INT_STATUS |
-                                       UP_LD_HOST_INT_STATUS),
-                               card->reg->host_intstatus, &ret);
-               if (ret) {
-                       BT_ERR("sdio_writeb: clear int status register failed");
-                       return;
-               }
-       }
 
        spin_lock_irqsave(&priv->driver_lock, flags);
        sdio_ireg |= ireg;