diff --git a/arch/powerpc/platforms/pseries/setup.c b/arch/powerpc/platforms/pseries/setup.c index a6398fbe530d..8ed362140452 100644 --- a/arch/powerpc/platforms/pseries/setup.c +++ b/arch/powerpc/platforms/pseries/setup.c @@ -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; } diff --git a/drivers/input/serio/i8042-io.h b/drivers/input/serio/i8042-io.h index cc21914fbc72..3b4e13b9ce1b 100644 --- a/drivers/input/serio/i8042-io.h +++ b/drivers/input/serio/i8042-io.h @@ -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 } diff --git a/drivers/parport/parport_pc.c b/drivers/parport/parport_pc.c index fe800dc0be9f..43894ddec7dc 100644 --- a/drivers/parport/parport_pc.c +++ b/drivers/parport/parport_pc.c @@ -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; diff --git a/drivers/pnp/pnpbios/core.c b/drivers/pnp/pnpbios/core.c index 551f58e29810..81a6c83d89a6 100644 --- a/drivers/pnp/pnpbios/core.c +++ b/drivers/pnp/pnpbios/core.c @@ -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 diff --git a/include/asm-powerpc/io.h b/include/asm-powerpc/io.h index 46bae1cf385b..19b2ec1ec665 100644 --- a/include/asm-powerpc/io.h +++ b/include/asm-powerpc/io.h @@ -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