[PATCH] update legacy io handling for pmac
authorOlaf Hering <olaf@aepfle.de>
Sun, 1 Oct 2006 06:27:57 +0000 (23:27 -0700)
committerLinus Torvalds <torvalds@g5.osdl.org>
Sun, 1 Oct 2006 07:39:23 +0000 (00:39 -0700)
ppc can boot one single binary on prep, chrp and pmac boards.  ppc64 can
boot one single binary on pseries and G5 boards.  pmac has no legacy io,
probing for PC style legacy hardware (or accessing the legacy io area
regulary) may lead to a hard crash:

* add check for parport_pc, exit on pmac.  32bit chrp has no
  ->check_legacy_ioport, the probe is always called.  64bit chrp has
  check_legacy_ioport, check for a "parallel" node

* add check for isapnp, only PReP boards may have real ISA slots.  32bit
  PReP will have no ->check_legacy_ioport, the probe is always called.

* update code in i8042_platform_init.  Run ->check_legacy_ioport first,
  always call request_region.  No functional change.  Remove whitespace
  before i8042_reset init.

Signed-off-by: Olaf Hering <olaf@aepfle.de>
Acked-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Adam Belay <ambx1@neo.rr.com>
Cc: Dmitry Torokhov <dtor@mail.ru>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
arch/powerpc/platforms/pseries/setup.c
drivers/input/serio/i8042-io.h
drivers/parport/parport_pc.c
drivers/pnp/pnpbios/core.c
include/asm-powerpc/io.h

index a6398fbe530dc55ad8a79cb6baad66e586df429e..8ed362140452e850bb44c2bc2b32b1a68ff8bef3 100644 (file)
@@ -415,6 +415,12 @@ static int pSeries_check_legacy_ioport(unsigned int baseport)
                        return -ENODEV;
                of_node_put(np);
                break;
+       case PARALLEL_BASE:
+               np = of_find_node_by_type(NULL, "parallel");
+               if (np == NULL)
+                       return -ENODEV;
+               of_node_put(np);
+               break;
        }
        return 0;
 }
index cc21914fbc72360967c117138fe75eab3db907fe..3b4e13b9ce1b9ac7317335c49f7b5bed8f854524 100644 (file)
@@ -67,25 +67,22 @@ static inline int i8042_platform_init(void)
  * On some platforms touching the i8042 data register region can do really
  * bad things. Because of this the region is always reserved on such boxes.
  */
-#if !defined(__sh__) && !defined(__alpha__) && !defined(__mips__) && !defined(CONFIG_PPC_MERGE)
-       if (!request_region(I8042_DATA_REG, 16, "i8042"))
-               return -EBUSY;
-#endif
-
-        i8042_reset = 1;
-
 #if defined(CONFIG_PPC_MERGE)
        if (check_legacy_ioport(I8042_DATA_REG))
-               return -EBUSY;
+               return -ENODEV;
+#endif
+#if !defined(__sh__) && !defined(__alpha__) && !defined(__mips__)
        if (!request_region(I8042_DATA_REG, 16, "i8042"))
                return -EBUSY;
 #endif
+
+       i8042_reset = 1;
        return 0;
 }
 
 static inline void i8042_platform_exit(void)
 {
-#if !defined(__sh__) && !defined(__alpha__) && !defined(CONFIG_PPC64)
+#if !defined(__sh__) && !defined(__alpha__)
        release_region(I8042_DATA_REG, 16);
 #endif
 }
index fe800dc0be9f7fedfdf69e92ff262ebe0b51d787..43894ddec7dcfa9d4c8528703649baef60d9420b 100644 (file)
@@ -3374,6 +3374,10 @@ __setup("parport_init_mode=",parport_init_mode_setup);
 
 static int __init parport_pc_init(void)
 {
+#if defined(CONFIG_PPC_MERGE)
+       if (check_legacy_ioport(PARALLEL_BASE))
+               return -ENODEV;
+#endif
        if (parse_parport_params())
                return -EINVAL;
 
index 551f58e298106060b5708cb288d04c8c7da39043..81a6c83d89a644bb9400aef1ee2470f0a536784d 100644 (file)
@@ -526,6 +526,10 @@ static int __init pnpbios_init(void)
 {
        int ret;
 
+#if defined(CONFIG_PPC_MERGE)
+       if (check_legacy_ioport(PNPBIOS_BASE))
+               return -ENODEV;
+#endif
        if (pnpbios_disabled || dmi_check_system(pnpbios_dmi_table)) {
                printk(KERN_INFO "PnPBIOS: Disabled\n");
                return -ENODEV;
@@ -575,6 +579,10 @@ subsys_initcall(pnpbios_init);
 
 static int __init pnpbios_thread_init(void)
 {
+#if defined(CONFIG_PPC_MERGE)
+       if (check_legacy_ioport(PNPBIOS_BASE))
+               return 0;
+#endif
        if (pnpbios_disabled)
                return 0;
 #ifdef CONFIG_HOTPLUG
index 46bae1cf385b9e26c2d05b9463bd09f2a7f2119b..19b2ec1ec665c4b016525c5147851f7943c8f2ca 100644 (file)
@@ -11,6 +11,8 @@
 
 /* Check of existence of legacy devices */
 extern int check_legacy_ioport(unsigned long base_port);
+#define PARALLEL_BASE  0x378
+#define PNPBIOS_BASE   0xf000  /* only relevant for PReP */
 
 #ifndef CONFIG_PPC64
 #include <asm-ppc/io.h>