On Tue, Nov 17, 2009 at 10:03, Finn Thain <fth...@telegraphics.com.au> wrote: > The valkyriefb driver needs the CUDA to work in order to set the video > mode at boot. So initialise the device earlier, and bring the m68k code > closer to the powermac code. > > Take 2 was changed as per Benjamin Herrenschmidt's review.
Ben, OK for you? > Signed-off-by: Finn Thain <fth...@telegraphics.com.au> > > --- > arch/m68k/mac/config.c | 6 +++ > drivers/macintosh/adb.c | 6 ++- > drivers/macintosh/via-cuda.c | 74 > +++++++++++++++++++++++-------------------- > 3 files changed, 51 insertions(+), 35 deletions(-) > > Index: linux-2.6.31/arch/m68k/mac/config.c > =================================================================== > --- linux-2.6.31.orig/arch/m68k/mac/config.c 2009-11-17 17:11:47.000000000 > +1100 > +++ linux-2.6.31/arch/m68k/mac/config.c 2009-11-17 17:11:47.000000000 +1100 > @@ -23,6 +23,8 @@ > #include <linux/init.h> > #include <linux/vt_kern.h> > #include <linux/platform_device.h> > +#include <linux/adb.h> > +#include <linux/cuda.h> > > #define BOOTINFO_COMPAT_1_0 > #include <asm/setup.h> > @@ -889,6 +891,10 @@ static void __init mac_identify(void) > oss_init(); > psc_init(); > baboon_init(); > + > +#ifdef CONFIG_ADB_CUDA > + find_via_cuda(); > +#endif > } > > static void __init mac_report_hardware(void) > Index: linux-2.6.31/drivers/macintosh/via-cuda.c > =================================================================== > --- linux-2.6.31.orig/drivers/macintosh/via-cuda.c 2009-11-17 > 17:07:58.000000000 +1100 > +++ linux-2.6.31/drivers/macintosh/via-cuda.c 2009-11-17 17:11:47.000000000 > +1100 > @@ -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. > Index: linux-2.6.31/drivers/macintosh/adb.c > =================================================================== > --- linux-2.6.31.orig/drivers/macintosh/adb.c 2009-11-17 17:07:58.000000000 > +1100 > +++ linux-2.6.31/drivers/macintosh/adb.c 2009-11-17 17:11:47.000000000 > +1100 > @@ -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 (machine_is_compatible("AAPL,PowerBook1998") || > -- Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- ge...@linux-m68k.org In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds _______________________________________________ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev