diff options
Diffstat (limited to 'arch/sparc64/prom')
-rw-r--r-- | arch/sparc64/prom/console.c | 18 | ||||
-rw-r--r-- | arch/sparc64/prom/devops.c | 4 | ||||
-rw-r--r-- | arch/sparc64/prom/tree.c | 59 |
3 files changed, 73 insertions, 8 deletions
diff --git a/arch/sparc64/prom/console.c b/arch/sparc64/prom/console.c index 80ba5ec10..a60378e84 100644 --- a/arch/sparc64/prom/console.c +++ b/arch/sparc64/prom/console.c @@ -1,4 +1,4 @@ -/* $Id: console.c,v 1.8 1997/08/16 08:00:16 davem Exp $ +/* $Id: console.c,v 1.9 1997/10/29 07:41:43 ecd Exp $ * console.c: Routines that deal with sending and receiving IO * to/from the current console device using the PROM. * @@ -91,6 +91,14 @@ prom_query_input_device() memset(propb, 0, sizeof(propb)); st_p = prom_finddevice ("/options"); prom_getproperty(st_p, "input-device", propb, sizeof(propb)); + + /* + * If we get here with propb == 'keyboard', we are on ttya, as + * the PROM defaulted to this due to 'no input device'. + */ + if (!strncmp(propb, "keyboard", 8)) + return PROMDEV_ITTYA; + if (strncmp (propb, "tty", 3) || !propb[3]) return PROMDEV_I_UNK; switch (propb[3]) { @@ -120,6 +128,14 @@ prom_query_output_device() memset(propb, 0, sizeof(propb)); st_p = prom_finddevice ("/options"); prom_getproperty(st_p, "output-device", propb, sizeof(propb)); + + /* + * If we get here with propb == 'screen', we are on ttya, as + * the PROM defaulted to this due to 'no input device'. + */ + if (!strncmp(propb, "screen", 6)) + return PROMDEV_OTTYA; + if (strncmp (propb, "tty", 3) || !propb[3]) return PROMDEV_O_UNK; switch (propb[3]) { diff --git a/arch/sparc64/prom/devops.c b/arch/sparc64/prom/devops.c index 980717928..2c99b21b6 100644 --- a/arch/sparc64/prom/devops.c +++ b/arch/sparc64/prom/devops.c @@ -1,4 +1,4 @@ -/* $Id: devops.c,v 1.2 1997/02/25 12:40:20 jj Exp $ +/* $Id: devops.c,v 1.3 1997/10/29 07:43:28 ecd Exp $ * devops.c: Device operations using the PROM. * * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) @@ -13,7 +13,7 @@ /* Open the device described by the string 'dstr'. Returns the handle * to that device used for subsequent operations on that device. - * Returns -1 on failure. + * Returns 0 on failure. */ int prom_devopen(char *dstr) diff --git a/arch/sparc64/prom/tree.c b/arch/sparc64/prom/tree.c index c2b386641..ccf73258e 100644 --- a/arch/sparc64/prom/tree.c +++ b/arch/sparc64/prom/tree.c @@ -1,4 +1,4 @@ -/* $Id: tree.c,v 1.6 1997/08/12 16:32:48 davem Exp $ +/* $Id: tree.c,v 1.10 1998/01/10 22:39:00 ecd Exp $ * tree.c: Basic device tree traversal/scanning for the Linux * prom library. * @@ -195,6 +195,7 @@ int prom_getname (int node, char *buffer, int len) { int i, sbus = 0; + int pci = 0, ebus = 0, ide = 0; struct linux_prom_registers *reg; struct linux_prom64_registers reg64[PROMREG_MAX]; @@ -203,9 +204,37 @@ prom_getname (int node, char *buffer, int len) if (i > 0) { buffer [i] = 0; if (!strcmp (buffer, "sbus")) - break; + goto getit; } } + if ((pci = prom_getparent (node))) { + i = prom_getproperty (pci, "name", buffer, len); + if (i > 0) { + buffer [i] = 0; + if (!strcmp (buffer, "pci")) + goto getit; + } + pci = 0; + } + if ((ebus = prom_getparent (node))) { + i = prom_getproperty (ebus, "name", buffer, len); + if (i > 0) { + buffer[i] = 0; + if (!strcmp (buffer, "ebus")) + goto getit; + } + ebus = 0; + } + if ((ide = prom_getparent (node))) { + i = prom_getproperty (ide, "name", buffer, len); + if (i > 0) { + buffer [i] = 0; + if (!strcmp (buffer, "ide")) + goto getit; + } + ide = 0; + } +getit: i = prom_getproperty (node, "name", buffer, len); if (i <= 0) { buffer [0] = 0; @@ -220,8 +249,28 @@ prom_getname (int node, char *buffer, int len) if (sbus) { reg = (struct linux_prom_registers *)reg64; sprintf (buffer, "@%x,%x", reg[0].which_io, (uint)reg[0].phys_addr); + } else if (pci) { + int dev, fn; + reg = (struct linux_prom_registers *)reg64; + fn = (reg[0].which_io >> 8) & 0x07; + dev = (reg[0].which_io >> 11) & 0x1f; + if (fn) + sprintf (buffer, "@%x,%x", dev, fn); + else + sprintf (buffer, "@%x", dev); + } else if (ebus) { + reg = (struct linux_prom_registers *)reg64; + sprintf (buffer, "@%x,%x", reg[0].which_io, reg[0].phys_addr); + } else if (ide) { + reg = (struct linux_prom_registers *)reg64; + sprintf (buffer, "@%x,%x", reg[0].which_io, reg[0].phys_addr); + } else if (i == 4) { /* Happens on 8042's children on Ultra/PCI. */ + reg = (struct linux_prom_registers *)reg64; + sprintf (buffer, "@%x", reg[0].which_io); } else { - sprintf (buffer, "@%x,%x", (unsigned int)(reg64[0].phys_addr >> 36), (unsigned int)(reg64[0].phys_addr)); + sprintf (buffer, "@%x,%x", + (unsigned int)(reg64[0].phys_addr >> 36), + (unsigned int)(reg64[0].phys_addr)); } return 0; } @@ -318,9 +367,9 @@ int prom_pathtoinode(char *path) { int node, inst; - + inst = prom_devopen (path); - if (inst == -1) return 0; + if (inst == 0) return 0; node = prom_inst2pkg (inst); prom_devclose (inst); if (node == -1) return 0; |