diff options
author | Finn Thain <fthain@telegraphics.com.au> | 2018-01-28 02:51:40 +0300 |
---|---|---|
committer | Geert Uytterhoeven <geert@linux-m68k.org> | 2018-03-19 12:22:59 +0300 |
commit | a64138ec15f4361c456563167bae12ed95a68d6b (patch) | |
tree | abb1bc384ff0859af962044415ec0b0c8079c5df /drivers/macintosh | |
parent | a1eb1cdf4e55e1ecdb4a474070450d8a648686bf (diff) | |
download | linux-a64138ec15f4361c456563167bae12ed95a68d6b.tar.xz |
macintosh/via-pmu68k: Initialize PMU driver with setup_arch and arch_initcall
The PMU watchdog will power down the system if the kernel is slow
to start up, e.g. due to unpacking a large initrd. The powerpc
version of this driver (via-pmu.c) has a solution for the same
problem. It uses this call sequence:
setup_arch
find_via_pmu
init_pmu
...
arch_initcall
via_pmu_start
Bring via-pmu68k.c into line with via-pmu.c to fix this issue.
Cc: Geert Uytterhoeven <geert@linux-m68k.org>
Tested-by: Stan Johnson <userm57@yahoo.com>
Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
Diffstat (limited to 'drivers/macintosh')
-rw-r--r-- | drivers/macintosh/via-pmu68k.c | 89 |
1 files changed, 61 insertions, 28 deletions
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 |