Commit b5c7ccca authored by Finn Thain's avatar Finn Thain Committed by Michael Ellerman

macintosh/via-pmu: Clean up interrupt statistics

Replace an open-coded ffs() with the function call.
Simplify an if-else cascade using a switch statement.
Correct a typo and an indentation issue.
Tested-by: default avatarStan Johnson <userm57@yahoo.com>
Signed-off-by: default avatarFinn Thain <fthain@telegraphics.com.au>
Reviewed-by: default avatarGeert Uytterhoeven <geert@linux-m68k.org>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent ebd72227
...@@ -1355,7 +1355,8 @@ pmu_resume(void) ...@@ -1355,7 +1355,8 @@ pmu_resume(void)
static void static void
pmu_handle_data(unsigned char *data, int len) pmu_handle_data(unsigned char *data, int len)
{ {
unsigned char ints, pirq; unsigned char ints;
int idx;
int i = 0; int i = 0;
asleep = 0; asleep = 0;
...@@ -1377,25 +1378,24 @@ pmu_handle_data(unsigned char *data, int len) ...@@ -1377,25 +1378,24 @@ pmu_handle_data(unsigned char *data, int len)
ints &= ~(PMU_INT_ADB_AUTO | PMU_INT_AUTO_SRQ_POLL); ints &= ~(PMU_INT_ADB_AUTO | PMU_INT_AUTO_SRQ_POLL);
next: next:
if (ints == 0) { if (ints == 0) {
if (i > pmu_irq_stats[10]) if (i > pmu_irq_stats[10])
pmu_irq_stats[10] = i; pmu_irq_stats[10] = i;
return; return;
} }
for (pirq = 0; pirq < 8; pirq++)
if (ints & (1 << pirq))
break;
pmu_irq_stats[pirq]++;
i++; 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, /* Note: for some reason, we get an interrupt with len=1,
* data[0]==0 after each normal ADB interrupt, at least * data[0]==0 after each normal ADB interrupt, at least
* on the Pismo. Still investigating... --BenH * 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) { if ((data[0] & PMU_INT_ADB_AUTO) == 0) {
struct adb_request *req = req_awaiting_reply; struct adb_request *req = req_awaiting_reply;
if (!req) { if (!req) {
...@@ -1433,25 +1433,28 @@ pmu_handle_data(unsigned char *data, int len) ...@@ -1433,25 +1433,28 @@ pmu_handle_data(unsigned char *data, int len)
adb_input(data+1, len-1, 1); adb_input(data+1, len-1, 1);
#endif /* CONFIG_ADB */ #endif /* CONFIG_ADB */
} }
} break;
/* Sound/brightness button pressed */ /* Sound/brightness button pressed */
else if ((1 << pirq) & PMU_INT_SNDBRT) { case PMU_INT_SNDBRT:
#ifdef CONFIG_PMAC_BACKLIGHT #ifdef CONFIG_PMAC_BACKLIGHT
if (len == 3) if (len == 3)
pmac_backlight_set_legacy_brightness_pmu(data[1] >> 4); pmac_backlight_set_legacy_brightness_pmu(data[1] >> 4);
#endif #endif
} break;
/* Tick interrupt */ /* Tick interrupt */
else if ((1 << pirq) & PMU_INT_TICK) { case PMU_INT_TICK:
/* Environement or tick interrupt, query batteries */ /* Environment or tick interrupt, query batteries */
if (pmu_battery_count) { if (pmu_battery_count) {
if ((--query_batt_timer) == 0) { if ((--query_batt_timer) == 0) {
query_battery_state(); query_battery_state();
query_batt_timer = BATTERY_POLLING_COUNT; query_batt_timer = BATTERY_POLLING_COUNT;
} }
} }
} break;
else if ((1 << pirq) & PMU_INT_ENVIRONMENT) {
case PMU_INT_ENVIRONMENT:
if (pmu_battery_count) if (pmu_battery_count)
query_battery_state(); query_battery_state();
pmu_pass_intr(data, len); pmu_pass_intr(data, len);
...@@ -1461,7 +1464,9 @@ pmu_handle_data(unsigned char *data, int len) ...@@ -1461,7 +1464,9 @@ pmu_handle_data(unsigned char *data, int len)
via_pmu_event(PMU_EVT_POWER, !!(data[1]&8)); via_pmu_event(PMU_EVT_POWER, !!(data[1]&8));
via_pmu_event(PMU_EVT_LID, data[1]&1); via_pmu_event(PMU_EVT_LID, data[1]&1);
} }
} else { break;
default:
pmu_pass_intr(data, len); pmu_pass_intr(data, len);
} }
goto next; goto next;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment