summaryrefslogtreecommitdiffstats
path: root/arch/sparc64/prom
diff options
context:
space:
mode:
Diffstat (limited to 'arch/sparc64/prom')
-rw-r--r--arch/sparc64/prom/console.c18
-rw-r--r--arch/sparc64/prom/devops.c4
-rw-r--r--arch/sparc64/prom/tree.c59
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;