diff options
Diffstat (limited to 'drivers/macintosh/via-cuda.c')
| -rw-r--r-- | drivers/macintosh/via-cuda.c | 74 | 
1 files changed, 41 insertions, 33 deletions
diff --git a/drivers/macintosh/via-cuda.c b/drivers/macintosh/via-cuda.c index 62dd1fdafec..971bc9582a5 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.  |