staging: wilc1000: refactor interrupt handling for sdio
authorAjay Singh <ajay.kathat@microchip.com>
Fri, 14 Feb 2020 11:52:17 +0000 (11:52 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 14 Feb 2020 16:20:11 +0000 (08:20 -0800)
Make use of FIELD_PREP/FIELD_GET macro to refactor the interrupt
handling for SDIO.

Signed-off-by: Ajay Singh <ajay.kathat@microchip.com>
Link: https://lore.kernel.org/r/20200214172250.13026-4-ajay.kathat@microchip.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/wilc1000/sdio.c
drivers/staging/wilc1000/spi.c
drivers/staging/wilc1000/wlan.h

index 77ef84f9cc37bdb376c1f17237e670e541eda5f9..66706efc5711c6ac21bb5c0d4af3d877e937e7c2 100644 (file)
@@ -26,7 +26,6 @@ static const struct sdio_device_id wilc_sdio_ids[] = {
 struct wilc_sdio {
        bool irq_gpio;
        u32 block_size;
-       int nint;
        int has_thrpt_enh3;
 };
 
@@ -790,6 +789,7 @@ static int wilc_sdio_read_int(struct wilc *wilc, u32 *int_status)
        struct sdio_func *func = dev_to_sdio_func(wilc->dev);
        struct wilc_sdio *sdio_priv = wilc->bus_data;
        u32 tmp;
+       u8 irq_flags;
        struct sdio_cmd52 cmd;
 
        wilc_sdio_read_size(wilc, &tmp);
@@ -798,44 +798,22 @@ static int wilc_sdio_read_int(struct wilc *wilc, u32 *int_status)
         *      Read IRQ flags
         **/
        if (!sdio_priv->irq_gpio) {
-               int i;
-
-               cmd.read_write = 0;
                cmd.function = 1;
                cmd.address = 0x04;
-               cmd.data = 0;
-               wilc_sdio_cmd52(wilc, &cmd);
-
-               if (cmd.data & BIT(0))
-                       tmp |= INT_0;
-               if (cmd.data & BIT(2))
-                       tmp |= INT_1;
-               if (cmd.data & BIT(3))
-                       tmp |= INT_2;
-               if (cmd.data & BIT(4))
-                       tmp |= INT_3;
-               if (cmd.data & BIT(5))
-                       tmp |= INT_4;
-               for (i = sdio_priv->nint; i < MAX_NUM_INT; i++) {
-                       if ((tmp >> (IRG_FLAGS_OFFSET + i)) & 0x1) {
-                               dev_err(&func->dev,
-                                       "Unexpected interrupt (1) : tmp=%x, data=%x\n",
-                                       tmp, cmd.data);
-                               break;
-                       }
-               }
        } else {
-               u32 irq_flags;
-
-               cmd.read_write = 0;
                cmd.function = 0;
-               cmd.raw = 0;
                cmd.address = 0xf7;
-               cmd.data = 0;
-               wilc_sdio_cmd52(wilc, &cmd);
-               irq_flags = cmd.data & 0x1f;
-               tmp |= ((irq_flags >> 0) << IRG_FLAGS_OFFSET);
        }
+       cmd.raw = 0;
+       cmd.read_write = 0;
+       cmd.data = 0;
+       wilc_sdio_cmd52(wilc, &cmd);
+       irq_flags = cmd.data;
+       tmp |= FIELD_PREP(IRG_FLAGS_MASK, cmd.data);
+
+       if (FIELD_GET(UNHANDLED_IRQ_MASK, irq_flags))
+               dev_err(&func->dev, "Unexpected interrupt (1) int=%lx\n",
+                       FIELD_GET(UNHANDLED_IRQ_MASK, irq_flags));
 
        *int_status = tmp;
 
@@ -890,38 +868,36 @@ static int wilc_sdio_clear_int_ext(struct wilc *wilc, u32 val)
                 * Must clear each interrupt individually.
                 */
                u32 flags;
+               int i;
 
                flags = val & (BIT(MAX_NUM_INT) - 1);
-               if (flags) {
-                       int i;
-
-                       for (i = 0; i < sdio_priv->nint; i++) {
-                               if (flags & 1) {
-                                       struct sdio_cmd52 cmd;
-
-                                       cmd.read_write = 1;
-                                       cmd.function = 0;
-                                       cmd.raw = 0;
-                                       cmd.address = 0xf8;
-                                       cmd.data = BIT(i);
-
-                                       ret = wilc_sdio_cmd52(wilc, &cmd);
-                                       if (ret) {
-                                               dev_err(&func->dev,
-                                                       "Failed cmd52, set 0xf8 data (%d) ...\n",
-                                                       __LINE__);
-                                               return ret;
-                                       }
+               for (i = 0; i < NUM_INT_EXT && flags; i++) {
+                       if (flags & BIT(i)) {
+                               struct sdio_cmd52 cmd;
+
+                               cmd.read_write = 1;
+                               cmd.function = 0;
+                               cmd.raw = 0;
+                               cmd.address = 0xf8;
+                               cmd.data = BIT(i);
+
+                               ret = wilc_sdio_cmd52(wilc, &cmd);
+                               if (ret) {
+                                       dev_err(&func->dev,
+                                               "Failed cmd52, set 0xf8 data (%d) ...\n",
+                                               __LINE__);
+                                       return ret;
                                }
-                               flags >>= 1;
+                               flags &= ~BIT(i);
                        }
+               }
 
-                       for (i = sdio_priv->nint; i < MAX_NUM_INT; i++) {
-                               if (flags & 1)
-                                       dev_err(&func->dev,
-                                               "Unexpected interrupt cleared %d...\n",
-                                               i);
-                               flags >>= 1;
+               for (i = NUM_INT_EXT; i < MAX_NUM_INT && flags; i++) {
+                       if (flags & BIT(i)) {
+                               dev_err(&func->dev,
+                                       "Unexpected interrupt cleared %d...\n",
+                                       i);
+                               flags &= ~BIT(i);
                        }
                }
        }
@@ -967,8 +943,6 @@ static int wilc_sdio_sync_ext(struct wilc *wilc, int nint)
                return -EINVAL;
        }
 
-       sdio_priv->nint = nint;
-
        /**
         *      Disable power sequencer
         **/
index 300c5c832572f7b1024d362b2a2d2d7024750688..37be627e72ce5d58e9369e14627868228d89f302 100644 (file)
@@ -12,7 +12,6 @@
 
 struct wilc_spi {
        int crc_off;
-       int nint;
 };
 
 static const struct wilc_hif_func wilc_hif_spi;
@@ -916,7 +915,6 @@ static int wilc_spi_clear_int_ext(struct wilc *wilc, u32 val)
 static int wilc_spi_sync_ext(struct wilc *wilc, int nint)
 {
        struct spi_device *spi = to_spi_device(wilc->dev);
-       struct wilc_spi *spi_priv = wilc->bus_data;
        u32 reg;
        int ret, i;
 
@@ -925,8 +923,6 @@ static int wilc_spi_sync_ext(struct wilc *wilc, int nint)
                return -EINVAL;
        }
 
-       spi_priv->nint = nint;
-
        /*
         * interrupt pin mux select
         */
index 876b02e93a813c6a16c0f1533008ec9cf82ec56e..27f08b37534598827b26c7a675dda854f0a2cae0 100644 (file)
 #define INT_4                  BIT(IRG_FLAGS_OFFSET + 4)
 #define INT_5                  BIT(IRG_FLAGS_OFFSET + 5)
 #define MAX_NUM_INT            5
+#define IRG_FLAGS_MASK         GENMASK(IRG_FLAGS_OFFSET + MAX_NUM_INT, \
+                                       IRG_FLAGS_OFFSET)
 
 /*******************************************/
 /*        E0 and later Interrupt flags.    */
 #define DATA_INT_EXT           INT_0
 #define ALL_INT_EXT            DATA_INT_EXT
 #define NUM_INT_EXT            1
+#define UNHANDLED_IRQ_MASK     GENMASK(MAX_NUM_INT - 1, NUM_INT_EXT)
 
 #define DATA_INT_CLR           CLR_INT0