diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-02-28 03:22:47 +0300 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-02-28 03:22:47 +0300 |
commit | 847f9c606cad121cebf984639e3eeee1c4db82f8 (patch) | |
tree | ecd7aaef6cdfaf908d4d37db2e8f1951b490543a /drivers/macintosh | |
parent | 7981164791d18d5ed1dcdfa9598949ed158a5333 (diff) | |
parent | 00ebfe58b002f0ff387f60c7cd23bc2b274fce1a (diff) | |
download | linux-847f9c606cad121cebf984639e3eeee1c4db82f8.tar.xz |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/geert/linux-m68k
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/geert/linux-m68k: (24 commits)
m68k: Define sigcontext ABI of ColdFire
m68knommu: NPTL support for uClinux
m68k: Add NPTL support
m68k: Eliminate unused variable in page_to_phys()
m68k: Switch to generic siginfo layout
macfb: fix 24-bit visual and stuff
macfb: cleanup
fbdev: add some missing mac modes
mac68k: start CUDA early
valkyriefb: various fixes
fbdev: mac_var_to_mode() fix
mac68k: move macsonic and macmace platform devices
mac68k: move mac_esp platform device
mac68k: replace mac68k SCC code with platform device
pmac-zilog: add platform driver
pmac-zilog: cleanup
mac68k: rework SWIM platform device
mac68k: cleanup
ataflop: Killl warning about unused variable flags
m68k: Use DIV_ROUND_CLOSEST
...
Diffstat (limited to 'drivers/macintosh')
-rw-r--r-- | drivers/macintosh/adb.c | 6 | ||||
-rw-r--r-- | drivers/macintosh/via-cuda.c | 74 |
2 files changed, 45 insertions, 35 deletions
diff --git a/drivers/macintosh/adb.c b/drivers/macintosh/adb.c index d840a109f833..1c4ee6e77937 100644 --- a/drivers/macintosh/adb.c +++ b/drivers/macintosh/adb.c @@ -317,9 +317,11 @@ static int __init adb_init(void) break; } } - if ((adb_controller == NULL) || adb_controller->init()) { - printk(KERN_WARNING "Warning: no ADB interface detected\n"); + if (adb_controller != NULL && adb_controller->init && + adb_controller->init()) adb_controller = NULL; + if (adb_controller == NULL) { + printk(KERN_WARNING "Warning: no ADB interface detected\n"); } else { #ifdef CONFIG_PPC if (of_machine_is_compatible("AAPL,PowerBook1998") || diff --git a/drivers/macintosh/via-cuda.c b/drivers/macintosh/via-cuda.c index 62dd1fdafecf..971bc9582a5f 100644 --- a/drivers/macintosh/via-cuda.c +++ b/drivers/macintosh/via-cuda.c @@ -89,7 +89,6 @@ static int cuda_fully_inited; #ifdef CONFIG_ADB static int cuda_probe(void); -static int cuda_init(void); static int cuda_send_request(struct adb_request *req, int sync); static int cuda_adb_autopoll(int devs); static int cuda_reset_adb_bus(void); @@ -107,17 +106,42 @@ int cuda_request(struct adb_request *req, #ifdef CONFIG_ADB struct adb_driver via_cuda_driver = { - "CUDA", - cuda_probe, - cuda_init, - cuda_send_request, - cuda_adb_autopoll, - cuda_poll, - cuda_reset_adb_bus + .name = "CUDA", + .probe = cuda_probe, + .send_request = cuda_send_request, + .autopoll = cuda_adb_autopoll, + .poll = cuda_poll, + .reset_bus = cuda_reset_adb_bus, }; #endif /* CONFIG_ADB */ -#ifdef CONFIG_PPC +#ifdef CONFIG_MAC +int __init find_via_cuda(void) +{ + struct adb_request req; + int err; + + if (macintosh_config->adb_type != MAC_ADB_CUDA) + return 0; + + via = via1; + cuda_state = idle; + + err = cuda_init_via(); + if (err) { + printk(KERN_ERR "cuda_init_via() failed\n"); + via = NULL; + return 0; + } + + /* enable autopoll */ + cuda_request(&req, NULL, 3, CUDA_PACKET, CUDA_AUTOPOLL, 1); + while (!req.complete) + cuda_poll(); + + return 1; +} +#else int __init find_via_cuda(void) { struct adb_request req; @@ -175,7 +199,7 @@ int __init find_via_cuda(void) vias = NULL; return 0; } -#endif /* CONFIG_PPC */ +#endif /* !defined CONFIG_MAC */ static int __init via_cuda_start(void) { @@ -184,14 +208,14 @@ static int __init via_cuda_start(void) #ifdef CONFIG_MAC cuda_irq = IRQ_MAC_ADB; -#else /* CONFIG_MAC */ +#else cuda_irq = irq_of_parse_and_map(vias, 0); if (cuda_irq == NO_IRQ) { printk(KERN_ERR "via-cuda: can't map interrupts for %s\n", vias->full_name); return -ENODEV; } -#endif /* CONFIG_MAC */ +#endif if (request_irq(cuda_irq, cuda_interrupt, 0, "ADB", cuda_interrupt)) { printk(KERN_ERR "via-cuda: can't request irq %d\n", cuda_irq); @@ -216,28 +240,10 @@ cuda_probe(void) #else if (macintosh_config->adb_type != MAC_ADB_CUDA) return -ENODEV; - via = via1; #endif - return 0; -} - -static int __init -cuda_init(void) -{ -#ifdef CONFIG_PPC if (via == NULL) return -ENODEV; return 0; -#else - int err = cuda_init_via(); - if (err) { - printk(KERN_ERR "cuda_init_via() failed\n"); - return -ENODEV; - } - out_8(&via[IER], IER_SET|SR_INT); /* enable interrupt from SR */ - - return via_cuda_start(); -#endif } #endif /* CONFIG_ADB */ @@ -430,9 +436,11 @@ cuda_poll(void) /* cuda_interrupt only takes a normal lock, we disable * interrupts here to avoid re-entering and thus deadlocking. */ - disable_irq(cuda_irq); + if (cuda_irq) + disable_irq(cuda_irq); cuda_interrupt(0, NULL); - enable_irq(cuda_irq); + if (cuda_irq) + enable_irq(cuda_irq); } static irqreturn_t @@ -446,7 +454,7 @@ cuda_interrupt(int irq, void *arg) spin_lock(&cuda_lock); - /* On powermacs, this handler is registered for the VIA IRQ. But it uses + /* On powermacs, this handler is registered for the VIA IRQ. But they use * just the shift register IRQ -- other VIA interrupt sources are disabled. * On m68k macs, the VIA IRQ sources are dispatched individually. Unless * we are polling, the shift register IRQ flag has already been cleared. |