Commit 6edc22fc authored by Finn Thain's avatar Finn Thain Committed by Michael Ellerman

macintosh/via-pmu: Disambiguate interrupt statistics

Some of the event counters are overloaded which makes it very
difficult to interpret their values.

Counter 0 is supposed to report CB1 interrupts but it can also count

Counter 1 is supposed to report GPIO interrupts but it can also count
other events (depending upon the value of the PMU_INT_ADB bit).

Disambiguate these statistics with dedicated counters for GPIO and
CB1 interrupts.

Comments in the MkLinux source code say that the type 0 and type 1
interrupts are model-specific. Label them as "unknown".

This change to the contents of /proc/pmu/interrupts is by necessity
visible in userland. However, packages which interact with the PMU
(that is, pbbuttonsd, pmac-utils and pmud) don't open this file.
AFAIK, user software has no need to poll these counters.
Tested-by: default avatarStan Johnson <>
Signed-off-by: default avatarFinn Thain <>
Signed-off-by: Michael Ellerman's avatarMichael Ellerman <>
parent b5c7ccca
......@@ -172,7 +172,9 @@ static int drop_interrupts;
static int option_lid_wakeup = 1;
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]);
......@@ -1622,7 +1626,7 @@ via_pmu_interrupt(int irq, void *arg)
if (intr & CB1_INT) {
adb_int_pending = 1;
if (intr & SR_INT) {
req = pmu_sr_intr();
......@@ -1709,7 +1713,7 @@ gpio1_interrupt(int irq, void *arg)
gpio_irq_enabled = 0;
adb_int_pending = 1;
spin_unlock_irqrestore(&pmu_lock, flags);
via_pmu_interrupt(0, NULL);
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