]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - drivers/macintosh/via-pmu.c
Merge tag 'for-4.19/post-20180822' of git://git.kernel.dk/linux-block
[linux.git] / drivers / macintosh / via-pmu.c
index a68e7a6f00cc36d60bced5476e230dc2c760df18..d72c450aebe5c3aa79bf8322d93507aef8ad990c 100644 (file)
@@ -172,7 +172,9 @@ static int drop_interrupts;
 static int option_lid_wakeup = 1;
 #endif /* CONFIG_SUSPEND && CONFIG_PPC32 */
 static unsigned long async_req_locks;
-static unsigned int pmu_irq_stats[11];
+
+#define NUM_IRQ_STATS 13
+static unsigned int pmu_irq_stats[NUM_IRQ_STATS];
 
 static struct proc_dir_entry *proc_pmu_root;
 static struct proc_dir_entry *proc_pmu_info;
@@ -873,9 +875,9 @@ static int pmu_info_proc_show(struct seq_file *m, void *v)
 static int pmu_irqstats_proc_show(struct seq_file *m, void *v)
 {
        int i;
-       static const char *irq_names[] = {
-               "Total CB1 triggered events",
-               "Total GPIO1 triggered events",
+       static const char *irq_names[NUM_IRQ_STATS] = {
+               "Unknown interrupt (type 0)",
+               "Unknown interrupt (type 1)",
                "PC-Card eject button",
                "Sound/Brightness button",
                "ADB message",
@@ -884,10 +886,12 @@ static int pmu_irqstats_proc_show(struct seq_file *m, void *v)
                "Tick timer",
                "Ghost interrupt (zero len)",
                "Empty interrupt (empty mask)",
-               "Max irqs in a row"
+               "Max irqs in a row",
+               "Total CB1 triggered events",
+               "Total GPIO1 triggered events",
         };
 
-       for (i=0; i<11; i++) {
+       for (i = 0; i < NUM_IRQ_STATS; i++) {
                seq_printf(m, " %2u: %10u (%s)\n",
                             i, pmu_irq_stats[i], irq_names[i]);
        }
@@ -1355,7 +1359,8 @@ pmu_resume(void)
 static void
 pmu_handle_data(unsigned char *data, int len)
 {
-       unsigned char ints, pirq;
+       unsigned char ints;
+       int idx;
        int i = 0;
 
        asleep = 0;
@@ -1377,25 +1382,24 @@ pmu_handle_data(unsigned char *data, int len)
                ints &= ~(PMU_INT_ADB_AUTO | PMU_INT_AUTO_SRQ_POLL);
 
 next:
-
        if (ints == 0) {
                if (i > pmu_irq_stats[10])
                        pmu_irq_stats[10] = i;
                return;
        }
-
-       for (pirq = 0; pirq < 8; pirq++)
-               if (ints & (1 << pirq))
-                       break;
-       pmu_irq_stats[pirq]++;
        i++;
-       ints &= ~(1 << pirq);
+
+       idx = ffs(ints) - 1;
+       ints &= ~BIT(idx);
+
+       pmu_irq_stats[idx]++;
 
        /* Note: for some reason, we get an interrupt with len=1,
         * data[0]==0 after each normal ADB interrupt, at least
         * on the Pismo. Still investigating...  --BenH
         */
-       if ((1 << pirq) & PMU_INT_ADB) {
+       switch (BIT(idx)) {
+       case PMU_INT_ADB:
                if ((data[0] & PMU_INT_ADB_AUTO) == 0) {
                        struct adb_request *req = req_awaiting_reply;
                        if (!req) {
@@ -1433,25 +1437,28 @@ pmu_handle_data(unsigned char *data, int len)
                                adb_input(data+1, len-1, 1);
 #endif /* CONFIG_ADB */                
                }
-       }
+               break;
+
        /* Sound/brightness button pressed */
-       else if ((1 << pirq) & PMU_INT_SNDBRT) {
+       case PMU_INT_SNDBRT:
 #ifdef CONFIG_PMAC_BACKLIGHT
                if (len == 3)
                        pmac_backlight_set_legacy_brightness_pmu(data[1] >> 4);
 #endif
-       }
+               break;
+
        /* Tick interrupt */
-       else if ((1 << pirq) & PMU_INT_TICK) {
-               /* Environement or tick interrupt, query batteries */
+       case PMU_INT_TICK:
+               /* Environment or tick interrupt, query batteries */
                if (pmu_battery_count) {
                        if ((--query_batt_timer) == 0) {
                                query_battery_state();
                                query_batt_timer = BATTERY_POLLING_COUNT;
                        }
                }
-        }
-       else if ((1 << pirq) & PMU_INT_ENVIRONMENT) {
+               break;
+
+       case PMU_INT_ENVIRONMENT:
                if (pmu_battery_count)
                        query_battery_state();
                pmu_pass_intr(data, len);
@@ -1461,7 +1468,9 @@ pmu_handle_data(unsigned char *data, int len)
                        via_pmu_event(PMU_EVT_POWER, !!(data[1]&8));
                        via_pmu_event(PMU_EVT_LID, data[1]&1);
                }
-       } else {
+               break;
+
+       default:
               pmu_pass_intr(data, len);
        }
        goto next;
@@ -1617,7 +1626,7 @@ via_pmu_interrupt(int irq, void *arg)
                }
                if (intr & CB1_INT) {
                        adb_int_pending = 1;
-                       pmu_irq_stats[0]++;
+                       pmu_irq_stats[11]++;
                }
                if (intr & SR_INT) {
                        req = pmu_sr_intr();
@@ -1704,7 +1713,7 @@ gpio1_interrupt(int irq, void *arg)
                        disable_irq_nosync(gpio_irq);
                        gpio_irq_enabled = 0;
                }
-               pmu_irq_stats[1]++;
+               pmu_irq_stats[12]++;
                adb_int_pending = 1;
                spin_unlock_irqrestore(&pmu_lock, flags);
                via_pmu_interrupt(0, NULL);