Skip to content

Commit

Permalink
[PATCH] update legacy io handling for pmac
Browse files Browse the repository at this point in the history
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 <[email protected]>
Acked-by: Benjamin Herrenschmidt <[email protected]>
Cc: Paul Mackerras <[email protected]>
Cc: Adam Belay <[email protected]>
Cc: Dmitry Torokhov <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
olafhering authored and Linus Torvalds committed Oct 1, 2006
1 parent c69c312 commit 30cbc22
Show file tree
Hide file tree
Showing 5 changed files with 26 additions and 9 deletions.
6 changes: 6 additions & 0 deletions arch/powerpc/platforms/pseries/setup.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down
15 changes: 6 additions & 9 deletions drivers/input/serio/i8042-io.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Expand Down
4 changes: 4 additions & 0 deletions drivers/parport/parport_pc.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
8 changes: 8 additions & 0 deletions drivers/pnp/pnpbios/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down
2 changes: 2 additions & 0 deletions include/asm-powerpc/io.h
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down

0 comments on commit 30cbc22

Please sign in to comment.