[PATCH 10/13] mac68k: start CUDA early, take 2

Geert Uytterhoeven geert at linux-m68k.org
Thu Dec 24 07:15:46 EST 2009


On Tue, Nov 17, 2009 at 10:03, Finn Thain <fthain at 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 <fthain at 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 -- geert at 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


More information about the Linuxppc-dev mailing list