Use available macro GENMASK to get the bitmask value of specific value.
Simplified the logic by adding expected_irqs & unexpected_irqs to check
the interrupt bits.

Signed-off-by: Ajay Singh <ajay.kat...@microchip.com>
---
 drivers/staging/wilc1000/wilc_spi.c | 46 +++++++++++++++----------------------
 1 file changed, 18 insertions(+), 28 deletions(-)

diff --git a/drivers/staging/wilc1000/wilc_spi.c 
b/drivers/staging/wilc1000/wilc_spi.c
index c63f534..12827c2 100644
--- a/drivers/staging/wilc1000/wilc_spi.c
+++ b/drivers/staging/wilc1000/wilc_spi.c
@@ -985,8 +985,9 @@ static int wilc_spi_clear_int_ext(struct wilc *wilc, u32 
val)
 {
        struct spi_device *spi = to_spi_device(wilc->dev);
        int ret;
-       u32 flags;
        u32 tbl_ctl;
+       u32 expected_irqs, unexpected_irqs;
+       int i;
 
        if (g_spi.has_thrpt_enh) {
                ret = spi_internal_write(wilc, 0xe844 - WILC_SPI_REG_BASE,
@@ -994,37 +995,26 @@ static int wilc_spi_clear_int_ext(struct wilc *wilc, u32 
val)
                return ret;
        }
 
-       flags = val & (BIT(MAX_NUM_INT) - 1);
-       if (flags) {
-               int i;
+       expected_irqs = val & GENMASK(g_spi.nint - 1, 0);
+       unexpected_irqs = val & GENMASK(MAX_NUM_INT - 1, g_spi.nint);
 
-               ret = 1;
-               for (i = 0; i < g_spi.nint; i++) {
-                       /*
-                        * No matter what you write 1 or 0,
-                        * it will clear interrupt.
-                        */
-                       if (flags & 1)
-                               ret = wilc_spi_write_reg(wilc,
-                                                        0x10c8 + i * 4, 1);
-                       if (!ret)
-                               break;
-                       flags >>= 1;
-               }
-               if (!ret) {
-                       dev_err(&spi->dev,
-                               "Failed wilc_spi_write_reg, set reg %x ...\n",
-                               0x10c8 + i * 4);
-                       goto _fail_;
-               }
-               for (i = g_spi.nint; i < MAX_NUM_INT; i++) {
-                       if (flags & 1)
+       for (i = 0; i < g_spi.nint && expected_irqs; i++) {
+               /* No matter what you write 1 or 0, it will clear interrupt. */
+               if (expected_irqs & BIT(i)) {
+                       ret = wilc_spi_write_reg(wilc, 0x10c8 + i * 4, 1);
+                       if (!ret) {
                                dev_err(&spi->dev,
-                                       "Unexpected interrupt cleared %d...\n",
-                                       i);
-                       flags >>= 1;
+                                       "Failed wilc_spi_write_reg, set reg %x 
...\n",
+                                       0x10c8 + i * 4);
+                               goto _fail_;
+                       }
                }
        }
+       for (i = g_spi.nint; i < MAX_NUM_INT && unexpected_irqs; i++) {
+               if (unexpected_irqs & BIT(i))
+                       dev_err(&spi->dev,
+                               "Unexpected interrupt cleared %d...\n", i);
+       }
 
        tbl_ctl = 0;
        /* select VMM table 0 */
-- 
2.7.4

_______________________________________________
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

Reply via email to