diff options
-rw-r--r-- | arch/m68k/mac/config.c | 4 | ||||
-rw-r--r-- | drivers/macintosh/via-pmu68k.c | 89 |
2 files changed, 65 insertions, 28 deletions
diff --git a/arch/m68k/mac/config.c b/arch/m68k/mac/config.c index 7890a8425710..36086cceb537 100644 --- a/arch/m68k/mac/config.c +++ b/arch/m68k/mac/config.c @@ -26,6 +26,7 @@ #include <linux/platform_device.h> #include <linux/adb.h> #include <linux/cuda.h> +#include <linux/pmu.h> #include <linux/rtc.h> #include <asm/setup.h> @@ -890,6 +891,9 @@ static void __init mac_identify(void) #ifdef CONFIG_ADB_CUDA find_via_cuda(); #endif +#ifdef CONFIG_ADB_PMU68K + find_via_pmu(); +#endif } static void __init mac_report_hardware(void) diff --git a/drivers/macintosh/via-pmu68k.c b/drivers/macintosh/via-pmu68k.c index 25465fb91ec9..7d9c4baf8c11 100644 --- a/drivers/macintosh/via-pmu68k.c +++ b/drivers/macintosh/via-pmu68k.c @@ -109,6 +109,7 @@ static int pmu_autopoll(int devs); void pmu_poll(void); static int pmu_reset_bus(void); +static int init_pmu(void); static void pmu_start(void); static void send_byte(int x); static void recv_byte(void); @@ -171,23 +172,76 @@ static s8 pmu_data_len[256][2] = { /*f8*/ {-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1}, }; -int pmu_probe(void) +int __init find_via_pmu(void) { - if (macintosh_config->adb_type == MAC_ADB_PB1) { + switch (macintosh_config->adb_type) { + case MAC_ADB_PB1: pmu_kind = PMU_68K_V1; - } else if (macintosh_config->adb_type == MAC_ADB_PB2) { + break; + case MAC_ADB_PB2: pmu_kind = PMU_68K_V2; - } else { + break; + default: + pmu_kind = PMU_UNKNOWN; return -ENODEV; } pmu_state = idle; + if (!init_pmu()) + goto fail_init; + + pr_info("adb: PMU 68K driver v0.5 for Unified ADB\n"); + + return 1; + +fail_init: + pmu_kind = PMU_UNKNOWN; return 0; } -static int -pmu_init(void) +static int pmu_probe(void) +{ + if (pmu_kind == PMU_UNKNOWN) + return -ENODEV; + return 0; +} + +static int pmu_init(void) +{ + if (pmu_kind == PMU_UNKNOWN) + return -ENODEV; + return 0; +} + +static int __init via_pmu_start(void) +{ + if (pmu_kind == PMU_UNKNOWN) + return -ENODEV; + + if (request_irq(IRQ_MAC_ADB_SR, pmu_interrupt, 0, "PMU_SR", + pmu_interrupt)) { + pr_err("%s: can't get SR irq\n", __func__); + return -ENODEV; + } + if (request_irq(IRQ_MAC_ADB_CL, pmu_interrupt, 0, "PMU_CL", + pmu_interrupt)) { + pr_err("%s: can't get CL irq\n", __func__); + free_irq(IRQ_MAC_ADB_SR, pmu_interrupt); + return -ENODEV; + } + + pmu_fully_inited = 1; + + /* Enable backlight */ + pmu_enable_backlight(1); + + return 0; +} + +arch_initcall(via_pmu_start); + +static int __init init_pmu(void) { int timeout; volatile struct adb_request req; @@ -238,28 +292,7 @@ pmu_init(void) bright_req_2.complete = 1; bright_req_3.complete = 1; - if (request_irq(IRQ_MAC_ADB_SR, pmu_interrupt, 0, "pmu-shift", - pmu_interrupt)) { - printk(KERN_ERR "pmu_init: can't get irq %d\n", - IRQ_MAC_ADB_SR); - return -EAGAIN; - } - if (request_irq(IRQ_MAC_ADB_CL, pmu_interrupt, 0, "pmu-clock", - pmu_interrupt)) { - printk(KERN_ERR "pmu_init: can't get irq %d\n", - IRQ_MAC_ADB_CL); - free_irq(IRQ_MAC_ADB_SR, pmu_interrupt); - return -EAGAIN; - } - - pmu_fully_inited = 1; - - /* Enable backlight */ - pmu_enable_backlight(1); - - printk("adb: PMU 68K driver v0.5 for Unified ADB.\n"); - - return 0; + return 1; } int |