|
@@ -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.
|