sparc: prepare prom/ for unification
authorSam Ravnborg <sam@ravnborg.org>
Sun, 30 Nov 2008 06:15:38 +0000 (22:15 -0800)
committerDavid S. Miller <davem@davemloft.net>
Thu, 4 Dec 2008 17:17:16 +0000 (09:17 -0800)
- rename files where sparc64 uses identical names to *_32.c
- refactor Makefile (but keep linking order)

Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
15 files changed:
arch/sparc/prom/Makefile
arch/sparc/prom/bootstr.c [deleted file]
arch/sparc/prom/bootstr_32.c [new file with mode: 0644]
arch/sparc/prom/console.c [deleted file]
arch/sparc/prom/console_32.c [new file with mode: 0644]
arch/sparc/prom/devops.c [deleted file]
arch/sparc/prom/devops_32.c [new file with mode: 0644]
arch/sparc/prom/init.c [deleted file]
arch/sparc/prom/init_32.c [new file with mode: 0644]
arch/sparc/prom/misc.c [deleted file]
arch/sparc/prom/misc_32.c [new file with mode: 0644]
arch/sparc/prom/printf.c [deleted file]
arch/sparc/prom/printf_32.c [new file with mode: 0644]
arch/sparc/prom/tree.c [deleted file]
arch/sparc/prom/tree_32.c [new file with mode: 0644]

index 8f7e18546c974f6ba8fec1c6ec8befcc21d5d30d..74ca9cceaeea1d13814f48827335b6ae4ed0d886 100644 (file)
@@ -2,5 +2,16 @@
 # Linux.
 #
 
-lib-y := bootstr.o devmap.o devops.o init.o memory.o misc.o mp.o \
-        palloc.o ranges.o segment.o console.o printf.o tree.o
+lib-y                 := bootstr_$(BITS).o
+lib-$(CONFIG_SPARC32) += devmap.o
+lib-y                 += devops_$(BITS).o
+lib-y                 += init_$(BITS).o
+lib-$(CONFIG_SPARC32) += memory.o
+lib-y                 += misc_$(BITS).o
+lib-$(CONFIG_SPARC32) += mp.o
+lib-$(CONFIG_SPARC32) += palloc.o
+lib-$(CONFIG_SPARC32) += ranges.o
+lib-$(CONFIG_SPARC32) += segment.o
+lib-y                 += console_$(BITS).o
+lib-y                 += printf_$(BITS).o
+lib-y                 += tree_$(BITS).o
diff --git a/arch/sparc/prom/bootstr.c b/arch/sparc/prom/bootstr.c
deleted file mode 100644 (file)
index 916831d..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * bootstr.c:  Boot string/argument acquisition from the PROM.
- *
- * Copyright(C) 1995 David S. Miller (davem@caip.rutgers.edu)
- */
-
-#include <linux/string.h>
-#include <asm/oplib.h>
-#include <linux/init.h>
-
-#define BARG_LEN  256
-static char barg_buf[BARG_LEN] = { 0 };
-static char fetched __initdata = 0;
-
-char * __init
-prom_getbootargs(void)
-{
-       int iter;
-       char *cp, *arg;
-
-       /* This check saves us from a panic when bootfd patches args. */
-       if (fetched) {
-               return barg_buf;
-       }
-
-       switch(prom_vers) {
-       case PROM_V0:
-               cp = barg_buf;
-               /* Start from 1 and go over fd(0,0,0)kernel */
-               for(iter = 1; iter < 8; iter++) {
-                       arg = (*(romvec->pv_v0bootargs))->argv[iter];
-                       if(arg == 0) break;
-                       while(*arg != 0) {
-                               /* Leave place for space and null. */
-                               if(cp >= barg_buf + BARG_LEN-2){
-                                       /* We might issue a warning here. */
-                                       break;
-                               }
-                               *cp++ = *arg++;
-                       }
-                       *cp++ = ' ';
-               }
-               *cp = 0;
-               break;
-       case PROM_V2:
-       case PROM_V3:
-               /*
-                * V3 PROM cannot supply as with more than 128 bytes
-                * of an argument. But a smart bootstrap loader can.
-                */
-               strlcpy(barg_buf, *romvec->pv_v2bootargs.bootargs, sizeof(barg_buf));
-               break;
-       default:
-               break;
-       }
-
-       fetched = 1;
-       return barg_buf;
-}
diff --git a/arch/sparc/prom/bootstr_32.c b/arch/sparc/prom/bootstr_32.c
new file mode 100644 (file)
index 0000000..916831d
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * bootstr.c:  Boot string/argument acquisition from the PROM.
+ *
+ * Copyright(C) 1995 David S. Miller (davem@caip.rutgers.edu)
+ */
+
+#include <linux/string.h>
+#include <asm/oplib.h>
+#include <linux/init.h>
+
+#define BARG_LEN  256
+static char barg_buf[BARG_LEN] = { 0 };
+static char fetched __initdata = 0;
+
+char * __init
+prom_getbootargs(void)
+{
+       int iter;
+       char *cp, *arg;
+
+       /* This check saves us from a panic when bootfd patches args. */
+       if (fetched) {
+               return barg_buf;
+       }
+
+       switch(prom_vers) {
+       case PROM_V0:
+               cp = barg_buf;
+               /* Start from 1 and go over fd(0,0,0)kernel */
+               for(iter = 1; iter < 8; iter++) {
+                       arg = (*(romvec->pv_v0bootargs))->argv[iter];
+                       if(arg == 0) break;
+                       while(*arg != 0) {
+                               /* Leave place for space and null. */
+                               if(cp >= barg_buf + BARG_LEN-2){
+                                       /* We might issue a warning here. */
+                                       break;
+                               }
+                               *cp++ = *arg++;
+                       }
+                       *cp++ = ' ';
+               }
+               *cp = 0;
+               break;
+       case PROM_V2:
+       case PROM_V3:
+               /*
+                * V3 PROM cannot supply as with more than 128 bytes
+                * of an argument. But a smart bootstrap loader can.
+                */
+               strlcpy(barg_buf, *romvec->pv_v2bootargs.bootargs, sizeof(barg_buf));
+               break;
+       default:
+               break;
+       }
+
+       fetched = 1;
+       return barg_buf;
+}
diff --git a/arch/sparc/prom/console.c b/arch/sparc/prom/console.c
deleted file mode 100644 (file)
index b3075d7..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * console.c: Routines that deal with sending and receiving IO
- *            to/from the current console device using the PROM.
- *
- * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
- * Copyright (C) 1998 Pete Zaitcev <zaitcev@yahoo.com>
- */
-
-#include <linux/types.h>
-#include <linux/kernel.h>
-#include <linux/sched.h>
-#include <asm/openprom.h>
-#include <asm/oplib.h>
-#include <asm/system.h>
-#include <linux/string.h>
-
-extern void restore_current(void);
-
-/* Non blocking get character from console input device, returns -1
- * if no input was taken.  This can be used for polling.
- */
-int
-prom_nbgetchar(void)
-{
-       static char inc;
-       int i = -1;
-       unsigned long flags;
-
-       spin_lock_irqsave(&prom_lock, flags);
-       switch(prom_vers) {
-       case PROM_V0:
-               i = (*(romvec->pv_nbgetchar))();
-               break;
-       case PROM_V2:
-       case PROM_V3:
-               if( (*(romvec->pv_v2devops).v2_dev_read)(*romvec->pv_v2bootargs.fd_stdin , &inc, 0x1) == 1) {
-                       i = inc;
-               } else {
-                       i = -1;
-               }
-               break;
-       default:
-               i = -1;
-               break;
-       };
-       restore_current();
-       spin_unlock_irqrestore(&prom_lock, flags);
-       return i; /* Ugh, we could spin forever on unsupported proms ;( */
-}
-
-/* Non blocking put character to console device, returns -1 if
- * unsuccessful.
- */
-int
-prom_nbputchar(char c)
-{
-       static char outc;
-       unsigned long flags;
-       int i = -1;
-
-       spin_lock_irqsave(&prom_lock, flags);
-       switch(prom_vers) {
-       case PROM_V0:
-               i = (*(romvec->pv_nbputchar))(c);
-               break;
-       case PROM_V2:
-       case PROM_V3:
-               outc = c;
-               if( (*(romvec->pv_v2devops).v2_dev_write)(*romvec->pv_v2bootargs.fd_stdout, &outc, 0x1) == 1)
-                       i = 0;
-               else
-                       i = -1;
-               break;
-       default:
-               i = -1;
-               break;
-       };
-       restore_current();
-       spin_unlock_irqrestore(&prom_lock, flags);
-       return i; /* Ugh, we could spin forever on unsupported proms ;( */
-}
-
-/* Blocking version of get character routine above. */
-char
-prom_getchar(void)
-{
-       int character;
-       while((character = prom_nbgetchar()) == -1) ;
-       return (char) character;
-}
-
-/* Blocking version of put character routine above. */
-void
-prom_putchar(char c)
-{
-       while(prom_nbputchar(c) == -1) ;
-       return;
-}
diff --git a/arch/sparc/prom/console_32.c b/arch/sparc/prom/console_32.c
new file mode 100644 (file)
index 0000000..b3075d7
--- /dev/null
@@ -0,0 +1,98 @@
+/*
+ * console.c: Routines that deal with sending and receiving IO
+ *            to/from the current console device using the PROM.
+ *
+ * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
+ * Copyright (C) 1998 Pete Zaitcev <zaitcev@yahoo.com>
+ */
+
+#include <linux/types.h>
+#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <asm/openprom.h>
+#include <asm/oplib.h>
+#include <asm/system.h>
+#include <linux/string.h>
+
+extern void restore_current(void);
+
+/* Non blocking get character from console input device, returns -1
+ * if no input was taken.  This can be used for polling.
+ */
+int
+prom_nbgetchar(void)
+{
+       static char inc;
+       int i = -1;
+       unsigned long flags;
+
+       spin_lock_irqsave(&prom_lock, flags);
+       switch(prom_vers) {
+       case PROM_V0:
+               i = (*(romvec->pv_nbgetchar))();
+               break;
+       case PROM_V2:
+       case PROM_V3:
+               if( (*(romvec->pv_v2devops).v2_dev_read)(*romvec->pv_v2bootargs.fd_stdin , &inc, 0x1) == 1) {
+                       i = inc;
+               } else {
+                       i = -1;
+               }
+               break;
+       default:
+               i = -1;
+               break;
+       };
+       restore_current();
+       spin_unlock_irqrestore(&prom_lock, flags);
+       return i; /* Ugh, we could spin forever on unsupported proms ;( */
+}
+
+/* Non blocking put character to console device, returns -1 if
+ * unsuccessful.
+ */
+int
+prom_nbputchar(char c)
+{
+       static char outc;
+       unsigned long flags;
+       int i = -1;
+
+       spin_lock_irqsave(&prom_lock, flags);
+       switch(prom_vers) {
+       case PROM_V0:
+               i = (*(romvec->pv_nbputchar))(c);
+               break;
+       case PROM_V2:
+       case PROM_V3:
+               outc = c;
+               if( (*(romvec->pv_v2devops).v2_dev_write)(*romvec->pv_v2bootargs.fd_stdout, &outc, 0x1) == 1)
+                       i = 0;
+               else
+                       i = -1;
+               break;
+       default:
+               i = -1;
+               break;
+       };
+       restore_current();
+       spin_unlock_irqrestore(&prom_lock, flags);
+       return i; /* Ugh, we could spin forever on unsupported proms ;( */
+}
+
+/* Blocking version of get character routine above. */
+char
+prom_getchar(void)
+{
+       int character;
+       while((character = prom_nbgetchar()) == -1) ;
+       return (char) character;
+}
+
+/* Blocking version of put character routine above. */
+void
+prom_putchar(char c)
+{
+       while(prom_nbputchar(c) == -1) ;
+       return;
+}
diff --git a/arch/sparc/prom/devops.c b/arch/sparc/prom/devops.c
deleted file mode 100644 (file)
index 9f1a95c..0000000
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * devops.c:  Device operations using the PROM.
- *
- * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
- */
-#include <linux/types.h>
-#include <linux/kernel.h>
-#include <linux/sched.h>
-
-#include <asm/openprom.h>
-#include <asm/oplib.h>
-
-extern void restore_current(void);
-
-/* 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.
- */
-int
-prom_devopen(char *dstr)
-{
-       int handle;
-       unsigned long flags;
-       spin_lock_irqsave(&prom_lock, flags);
-       switch(prom_vers) {
-       case PROM_V0:
-               handle = (*(romvec->pv_v0devops.v0_devopen))(dstr);
-               if(handle == 0) handle = -1;
-               break;
-       case PROM_V2:
-       case PROM_V3:
-               handle = (*(romvec->pv_v2devops.v2_dev_open))(dstr);
-               break;
-       default:
-               handle = -1;
-               break;
-       };
-       restore_current();
-       spin_unlock_irqrestore(&prom_lock, flags);
-
-       return handle;
-}
-
-/* Close the device described by device handle 'dhandle'. */
-int
-prom_devclose(int dhandle)
-{
-       unsigned long flags;
-       spin_lock_irqsave(&prom_lock, flags);
-       switch(prom_vers) {
-       case PROM_V0:
-               (*(romvec->pv_v0devops.v0_devclose))(dhandle);
-               break;
-       case PROM_V2:
-       case PROM_V3:
-               (*(romvec->pv_v2devops.v2_dev_close))(dhandle);
-               break;
-       default:
-               break;
-       };
-       restore_current();
-       spin_unlock_irqrestore(&prom_lock, flags);
-       return 0;
-}
-
-/* Seek to specified location described by 'seekhi' and 'seeklo'
- * for device 'dhandle'.
- */
-void
-prom_seek(int dhandle, unsigned int seekhi, unsigned int seeklo)
-{
-       unsigned long flags;
-       spin_lock_irqsave(&prom_lock, flags);
-       switch(prom_vers) {
-       case PROM_V0:
-               (*(romvec->pv_v0devops.v0_seekdev))(dhandle, seekhi, seeklo);
-               break;
-       case PROM_V2:
-       case PROM_V3:
-               (*(romvec->pv_v2devops.v2_dev_seek))(dhandle, seekhi, seeklo);
-               break;
-       default:
-               break;
-       };
-       restore_current();
-       spin_unlock_irqrestore(&prom_lock, flags);
-
-       return;
-}
diff --git a/arch/sparc/prom/devops_32.c b/arch/sparc/prom/devops_32.c
new file mode 100644 (file)
index 0000000..9f1a95c
--- /dev/null
@@ -0,0 +1,89 @@
+/*
+ * devops.c:  Device operations using the PROM.
+ *
+ * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
+ */
+#include <linux/types.h>
+#include <linux/kernel.h>
+#include <linux/sched.h>
+
+#include <asm/openprom.h>
+#include <asm/oplib.h>
+
+extern void restore_current(void);
+
+/* 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.
+ */
+int
+prom_devopen(char *dstr)
+{
+       int handle;
+       unsigned long flags;
+       spin_lock_irqsave(&prom_lock, flags);
+       switch(prom_vers) {
+       case PROM_V0:
+               handle = (*(romvec->pv_v0devops.v0_devopen))(dstr);
+               if(handle == 0) handle = -1;
+               break;
+       case PROM_V2:
+       case PROM_V3:
+               handle = (*(romvec->pv_v2devops.v2_dev_open))(dstr);
+               break;
+       default:
+               handle = -1;
+               break;
+       };
+       restore_current();
+       spin_unlock_irqrestore(&prom_lock, flags);
+
+       return handle;
+}
+
+/* Close the device described by device handle 'dhandle'. */
+int
+prom_devclose(int dhandle)
+{
+       unsigned long flags;
+       spin_lock_irqsave(&prom_lock, flags);
+       switch(prom_vers) {
+       case PROM_V0:
+               (*(romvec->pv_v0devops.v0_devclose))(dhandle);
+               break;
+       case PROM_V2:
+       case PROM_V3:
+               (*(romvec->pv_v2devops.v2_dev_close))(dhandle);
+               break;
+       default:
+               break;
+       };
+       restore_current();
+       spin_unlock_irqrestore(&prom_lock, flags);
+       return 0;
+}
+
+/* Seek to specified location described by 'seekhi' and 'seeklo'
+ * for device 'dhandle'.
+ */
+void
+prom_seek(int dhandle, unsigned int seekhi, unsigned int seeklo)
+{
+       unsigned long flags;
+       spin_lock_irqsave(&prom_lock, flags);
+       switch(prom_vers) {
+       case PROM_V0:
+               (*(romvec->pv_v0devops.v0_seekdev))(dhandle, seekhi, seeklo);
+               break;
+       case PROM_V2:
+       case PROM_V3:
+               (*(romvec->pv_v2devops.v2_dev_seek))(dhandle, seekhi, seeklo);
+               break;
+       default:
+               break;
+       };
+       restore_current();
+       spin_unlock_irqrestore(&prom_lock, flags);
+
+       return;
+}
diff --git a/arch/sparc/prom/init.c b/arch/sparc/prom/init.c
deleted file mode 100644 (file)
index 873217c..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * init.c:  Initialize internal variables used by the PROM
- *          library functions.
- *
- * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
- * Copyright (C) 1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
- */
-
-#include <linux/kernel.h>
-#include <linux/init.h>
-
-#include <asm/openprom.h>
-#include <asm/oplib.h>
-
-struct linux_romvec *romvec;
-enum prom_major_version prom_vers;
-unsigned int prom_rev, prom_prev;
-
-/* The root node of the prom device tree. */
-int prom_root_node;
-
-/* Pointer to the device tree operations structure. */
-struct linux_nodeops *prom_nodeops;
-
-/* You must call prom_init() before you attempt to use any of the
- * routines in the prom library.  It returns 0 on success, 1 on
- * failure.  It gets passed the pointer to the PROM vector.
- */
-
-extern void prom_meminit(void);
-extern void prom_ranges_init(void);
-
-void __init prom_init(struct linux_romvec *rp)
-{
-       romvec = rp;
-
-       switch(romvec->pv_romvers) {
-       case 0:
-               prom_vers = PROM_V0;
-               break;
-       case 2:
-               prom_vers = PROM_V2;
-               break;
-       case 3:
-               prom_vers = PROM_V3;
-               break;
-       default:
-               prom_printf("PROMLIB: Bad PROM version %d\n",
-                           romvec->pv_romvers);
-               prom_halt();
-               break;
-       };
-
-       prom_rev = romvec->pv_plugin_revision;
-       prom_prev = romvec->pv_printrev;
-       prom_nodeops = romvec->pv_nodeops;
-
-       prom_root_node = prom_getsibling(0);
-       if((prom_root_node == 0) || (prom_root_node == -1))
-               prom_halt();
-
-       if((((unsigned long) prom_nodeops) == 0) || 
-          (((unsigned long) prom_nodeops) == -1))
-               prom_halt();
-
-       prom_meminit();
-
-       prom_ranges_init();
-
-       printk("PROMLIB: Sun Boot Prom Version %d Revision %d\n",
-              romvec->pv_romvers, prom_rev);
-
-       /* Initialization successful. */
-       return;
-}
diff --git a/arch/sparc/prom/init_32.c b/arch/sparc/prom/init_32.c
new file mode 100644 (file)
index 0000000..873217c
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+ * init.c:  Initialize internal variables used by the PROM
+ *          library functions.
+ *
+ * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
+ * Copyright (C) 1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
+ */
+
+#include <linux/kernel.h>
+#include <linux/init.h>
+
+#include <asm/openprom.h>
+#include <asm/oplib.h>
+
+struct linux_romvec *romvec;
+enum prom_major_version prom_vers;
+unsigned int prom_rev, prom_prev;
+
+/* The root node of the prom device tree. */
+int prom_root_node;
+
+/* Pointer to the device tree operations structure. */
+struct linux_nodeops *prom_nodeops;
+
+/* You must call prom_init() before you attempt to use any of the
+ * routines in the prom library.  It returns 0 on success, 1 on
+ * failure.  It gets passed the pointer to the PROM vector.
+ */
+
+extern void prom_meminit(void);
+extern void prom_ranges_init(void);
+
+void __init prom_init(struct linux_romvec *rp)
+{
+       romvec = rp;
+
+       switch(romvec->pv_romvers) {
+       case 0:
+               prom_vers = PROM_V0;
+               break;
+       case 2:
+               prom_vers = PROM_V2;
+               break;
+       case 3:
+               prom_vers = PROM_V3;
+               break;
+       default:
+               prom_printf("PROMLIB: Bad PROM version %d\n",
+                           romvec->pv_romvers);
+               prom_halt();
+               break;
+       };
+
+       prom_rev = romvec->pv_plugin_revision;
+       prom_prev = romvec->pv_printrev;
+       prom_nodeops = romvec->pv_nodeops;
+
+       prom_root_node = prom_getsibling(0);
+       if((prom_root_node == 0) || (prom_root_node == -1))
+               prom_halt();
+
+       if((((unsigned long) prom_nodeops) == 0) || 
+          (((unsigned long) prom_nodeops) == -1))
+               prom_halt();
+
+       prom_meminit();
+
+       prom_ranges_init();
+
+       printk("PROMLIB: Sun Boot Prom Version %d Revision %d\n",
+              romvec->pv_romvers, prom_rev);
+
+       /* Initialization successful. */
+       return;
+}
diff --git a/arch/sparc/prom/misc.c b/arch/sparc/prom/misc.c
deleted file mode 100644 (file)
index 49b5057..0000000
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * misc.c:  Miscellaneous prom functions that don't belong
- *          anywhere else.
- *
- * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
- */
-
-#include <linux/types.h>
-#include <linux/kernel.h>
-#include <linux/sched.h>
-#include <asm/openprom.h>
-#include <asm/oplib.h>
-#include <asm/auxio.h>
-#include <asm/system.h>
-
-extern void restore_current(void);
-
-DEFINE_SPINLOCK(prom_lock);
-
-/* Reset and reboot the machine with the command 'bcommand'. */
-void
-prom_reboot(char *bcommand)
-{
-       unsigned long flags;
-       spin_lock_irqsave(&prom_lock, flags);
-       (*(romvec->pv_reboot))(bcommand);
-       /* Never get here. */
-       restore_current();
-       spin_unlock_irqrestore(&prom_lock, flags);
-}
-
-/* Forth evaluate the expression contained in 'fstring'. */
-void
-prom_feval(char *fstring)
-{
-       unsigned long flags;
-       if(!fstring || fstring[0] == 0)
-               return;
-       spin_lock_irqsave(&prom_lock, flags);
-       if(prom_vers == PROM_V0)
-               (*(romvec->pv_fortheval.v0_eval))(strlen(fstring), fstring);
-       else
-               (*(romvec->pv_fortheval.v2_eval))(fstring);
-       restore_current();
-       spin_unlock_irqrestore(&prom_lock, flags);
-}
-
-/* Drop into the prom, with the chance to continue with the 'go'
- * prom command.
- */
-void
-prom_cmdline(void)
-{
-       extern void install_obp_ticker(void);
-       extern void install_linux_ticker(void);
-       unsigned long flags;
-
-       spin_lock_irqsave(&prom_lock, flags);
-       install_obp_ticker();
-       (*(romvec->pv_abort))();
-       restore_current();
-       install_linux_ticker();
-       spin_unlock_irqrestore(&prom_lock, flags);
-#ifdef CONFIG_SUN_AUXIO
-       set_auxio(AUXIO_LED, 0);
-#endif
-}
-
-/* Drop into the prom, but completely terminate the program.
- * No chance of continuing.
- */
-void
-prom_halt(void)
-{
-       unsigned long flags;
-again:
-       spin_lock_irqsave(&prom_lock, flags);
-       (*(romvec->pv_halt))();
-       /* Never get here. */
-       restore_current();
-       spin_unlock_irqrestore(&prom_lock, flags);
-       goto again; /* PROM is out to get me -DaveM */
-}
-
-typedef void (*sfunc_t)(void);
-
-/* Set prom sync handler to call function 'funcp'. */
-void
-prom_setsync(sfunc_t funcp)
-{
-       if(!funcp) return;
-       *romvec->pv_synchook = funcp;
-}
-
-/* Get the idprom and stuff it into buffer 'idbuf'.  Returns the
- * format type.  'num_bytes' is the number of bytes that your idbuf
- * has space for.  Returns 0xff on error.
- */
-unsigned char
-prom_get_idprom(char *idbuf, int num_bytes)
-{
-       int len;
-
-       len = prom_getproplen(prom_root_node, "idprom");
-       if((len>num_bytes) || (len==-1)) return 0xff;
-       if(!prom_getproperty(prom_root_node, "idprom", idbuf, num_bytes))
-               return idbuf[0];
-
-       return 0xff;
-}
-
-/* Get the major prom version number. */
-int
-prom_version(void)
-{
-       return romvec->pv_romvers;
-}
-
-/* Get the prom plugin-revision. */
-int
-prom_getrev(void)
-{
-       return prom_rev;
-}
-
-/* Get the prom firmware print revision. */
-int
-prom_getprev(void)
-{
-       return prom_prev;
-}
diff --git a/arch/sparc/prom/misc_32.c b/arch/sparc/prom/misc_32.c
new file mode 100644 (file)
index 0000000..49b5057
--- /dev/null
@@ -0,0 +1,131 @@
+/*
+ * misc.c:  Miscellaneous prom functions that don't belong
+ *          anywhere else.
+ *
+ * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
+ */
+
+#include <linux/types.h>
+#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <asm/openprom.h>
+#include <asm/oplib.h>
+#include <asm/auxio.h>
+#include <asm/system.h>
+
+extern void restore_current(void);
+
+DEFINE_SPINLOCK(prom_lock);
+
+/* Reset and reboot the machine with the command 'bcommand'. */
+void
+prom_reboot(char *bcommand)
+{
+       unsigned long flags;
+       spin_lock_irqsave(&prom_lock, flags);
+       (*(romvec->pv_reboot))(bcommand);
+       /* Never get here. */
+       restore_current();
+       spin_unlock_irqrestore(&prom_lock, flags);
+}
+
+/* Forth evaluate the expression contained in 'fstring'. */
+void
+prom_feval(char *fstring)
+{
+       unsigned long flags;
+       if(!fstring || fstring[0] == 0)
+               return;
+       spin_lock_irqsave(&prom_lock, flags);
+       if(prom_vers == PROM_V0)
+               (*(romvec->pv_fortheval.v0_eval))(strlen(fstring), fstring);
+       else
+               (*(romvec->pv_fortheval.v2_eval))(fstring);
+       restore_current();
+       spin_unlock_irqrestore(&prom_lock, flags);
+}
+
+/* Drop into the prom, with the chance to continue with the 'go'
+ * prom command.
+ */
+void
+prom_cmdline(void)
+{
+       extern void install_obp_ticker(void);
+       extern void install_linux_ticker(void);
+       unsigned long flags;
+
+       spin_lock_irqsave(&prom_lock, flags);
+       install_obp_ticker();
+       (*(romvec->pv_abort))();
+       restore_current();
+       install_linux_ticker();
+       spin_unlock_irqrestore(&prom_lock, flags);
+#ifdef CONFIG_SUN_AUXIO
+       set_auxio(AUXIO_LED, 0);
+#endif
+}
+
+/* Drop into the prom, but completely terminate the program.
+ * No chance of continuing.
+ */
+void
+prom_halt(void)
+{
+       unsigned long flags;
+again:
+       spin_lock_irqsave(&prom_lock, flags);
+       (*(romvec->pv_halt))();
+       /* Never get here. */
+       restore_current();
+       spin_unlock_irqrestore(&prom_lock, flags);
+       goto again; /* PROM is out to get me -DaveM */
+}
+
+typedef void (*sfunc_t)(void);
+
+/* Set prom sync handler to call function 'funcp'. */
+void
+prom_setsync(sfunc_t funcp)
+{
+       if(!funcp) return;
+       *romvec->pv_synchook = funcp;
+}
+
+/* Get the idprom and stuff it into buffer 'idbuf'.  Returns the
+ * format type.  'num_bytes' is the number of bytes that your idbuf
+ * has space for.  Returns 0xff on error.
+ */
+unsigned char
+prom_get_idprom(char *idbuf, int num_bytes)
+{
+       int len;
+
+       len = prom_getproplen(prom_root_node, "idprom");
+       if((len>num_bytes) || (len==-1)) return 0xff;
+       if(!prom_getproperty(prom_root_node, "idprom", idbuf, num_bytes))
+               return idbuf[0];
+
+       return 0xff;
+}
+
+/* Get the major prom version number. */
+int
+prom_version(void)
+{
+       return romvec->pv_romvers;
+}
+
+/* Get the prom plugin-revision. */
+int
+prom_getrev(void)
+{
+       return prom_rev;
+}
+
+/* Get the prom firmware print revision. */
+int
+prom_getprev(void)
+{
+       return prom_prev;
+}
diff --git a/arch/sparc/prom/printf.c b/arch/sparc/prom/printf.c
deleted file mode 100644 (file)
index a36ab9c..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * printf.c:  Internal prom library printf facility.
- *
- * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
- * Copyright (c) 2002 Pete Zaitcev (zaitcev@yahoo.com)
- *
- * We used to warn all over the code: DO NOT USE prom_printf(),
- * and yet people do. Anton's banking code was outputting banks
- * with prom_printf for most of the 2.4 lifetime. Since an effective
- * stick is not available, we deployed a carrot: an early printk
- * through PROM by means of -p boot option. This ought to fix it.
- * USE printk; if you need, deploy -p.
- */
-
-#include <linux/kernel.h>
-#include <linux/module.h>
-
-#include <asm/openprom.h>
-#include <asm/oplib.h>
-
-static char ppbuf[1024];
-
-void
-prom_write(const char *buf, unsigned int n)
-{
-       char ch;
-
-       while (n != 0) {
-               --n;
-               if ((ch = *buf++) == '\n')
-                       prom_putchar('\r');
-               prom_putchar(ch);
-       }
-}
-
-void
-prom_printf(char *fmt, ...)
-{
-       va_list args;
-       int i;
-
-       va_start(args, fmt);
-       i = vscnprintf(ppbuf, sizeof(ppbuf), fmt, args);
-       va_end(args);
-
-       prom_write(ppbuf, i);
-}
-EXPORT_SYMBOL(prom_printf);
diff --git a/arch/sparc/prom/printf_32.c b/arch/sparc/prom/printf_32.c
new file mode 100644 (file)
index 0000000..a36ab9c
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * printf.c:  Internal prom library printf facility.
+ *
+ * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
+ * Copyright (c) 2002 Pete Zaitcev (zaitcev@yahoo.com)
+ *
+ * We used to warn all over the code: DO NOT USE prom_printf(),
+ * and yet people do. Anton's banking code was outputting banks
+ * with prom_printf for most of the 2.4 lifetime. Since an effective
+ * stick is not available, we deployed a carrot: an early printk
+ * through PROM by means of -p boot option. This ought to fix it.
+ * USE printk; if you need, deploy -p.
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+
+#include <asm/openprom.h>
+#include <asm/oplib.h>
+
+static char ppbuf[1024];
+
+void
+prom_write(const char *buf, unsigned int n)
+{
+       char ch;
+
+       while (n != 0) {
+               --n;
+               if ((ch = *buf++) == '\n')
+                       prom_putchar('\r');
+               prom_putchar(ch);
+       }
+}
+
+void
+prom_printf(char *fmt, ...)
+{
+       va_list args;
+       int i;
+
+       va_start(args, fmt);
+       i = vscnprintf(ppbuf, sizeof(ppbuf), fmt, args);
+       va_end(args);
+
+       prom_write(ppbuf, i);
+}
+EXPORT_SYMBOL(prom_printf);
diff --git a/arch/sparc/prom/tree.c b/arch/sparc/prom/tree.c
deleted file mode 100644 (file)
index f228fe0..0000000
+++ /dev/null
@@ -1,346 +0,0 @@
-/*
- * tree.c: Basic device tree traversal/scanning for the Linux
- *         prom library.
- *
- * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
- */
-
-#define PROMLIB_INTERNAL
-
-#include <linux/string.h>
-#include <linux/types.h>
-#include <linux/kernel.h>
-#include <linux/sched.h>
-#include <linux/ctype.h>
-
-#include <asm/openprom.h>
-#include <asm/oplib.h>
-
-extern void restore_current(void);
-
-static char promlib_buf[128];
-
-/* Internal version of prom_getchild that does not alter return values. */
-int __prom_getchild(int node)
-{
-       unsigned long flags;
-       int cnode;
-
-       spin_lock_irqsave(&prom_lock, flags);
-       cnode = prom_nodeops->no_child(node);
-       restore_current();
-       spin_unlock_irqrestore(&prom_lock, flags);
-
-       return cnode;
-}
-
-/* Return the child of node 'node' or zero if no this node has no
- * direct descendent.
- */
-int prom_getchild(int node)
-{
-       int cnode;
-
-       if (node == -1)
-               return 0;
-
-       cnode = __prom_getchild(node);
-       if (cnode == 0 || cnode == -1)
-               return 0;
-
-       return cnode;
-}
-
-/* Internal version of prom_getsibling that does not alter return values. */
-int __prom_getsibling(int node)
-{
-       unsigned long flags;
-       int cnode;
-
-       spin_lock_irqsave(&prom_lock, flags);
-       cnode = prom_nodeops->no_nextnode(node);
-       restore_current();
-       spin_unlock_irqrestore(&prom_lock, flags);
-
-       return cnode;
-}
-
-/* Return the next sibling of node 'node' or zero if no more siblings
- * at this level of depth in the tree.
- */
-int prom_getsibling(int node)
-{
-       int sibnode;
-
-       if (node == -1)
-               return 0;
-
-       sibnode = __prom_getsibling(node);
-       if (sibnode == 0 || sibnode == -1)
-               return 0;
-
-       return sibnode;
-}
-
-/* Return the length in bytes of property 'prop' at node 'node'.
- * Return -1 on error.
- */
-int prom_getproplen(int node, char *prop)
-{
-       int ret;
-       unsigned long flags;
-
-       if((!node) || (!prop))
-               return -1;
-               
-       spin_lock_irqsave(&prom_lock, flags);
-       ret = prom_nodeops->no_proplen(node, prop);
-       restore_current();
-       spin_unlock_irqrestore(&prom_lock, flags);
-       return ret;
-}
-
-/* Acquire a property 'prop' at node 'node' and place it in
- * 'buffer' which has a size of 'bufsize'.  If the acquisition
- * was successful the length will be returned, else -1 is returned.
- */
-int prom_getproperty(int node, char *prop, char *buffer, int bufsize)
-{
-       int plen, ret;
-       unsigned long flags;
-
-       plen = prom_getproplen(node, prop);
-       if((plen > bufsize) || (plen == 0) || (plen == -1))
-               return -1;
-       /* Ok, things seem all right. */
-       spin_lock_irqsave(&prom_lock, flags);
-       ret = prom_nodeops->no_getprop(node, prop, buffer);
-       restore_current();
-       spin_unlock_irqrestore(&prom_lock, flags);
-       return ret;
-}
-
-/* Acquire an integer property and return its value.  Returns -1
- * on failure.
- */
-int prom_getint(int node, char *prop)
-{
-       static int intprop;
-
-       if(prom_getproperty(node, prop, (char *) &intprop, sizeof(int)) != -1)
-               return intprop;
-
-       return -1;
-}
-
-/* Acquire an integer property, upon error return the passed default
- * integer.
- */
-int prom_getintdefault(int node, char *property, int deflt)
-{
-       int retval;
-
-       retval = prom_getint(node, property);
-       if(retval == -1) return deflt;
-
-       return retval;
-}
-
-/* Acquire a boolean property, 1=TRUE 0=FALSE. */
-int prom_getbool(int node, char *prop)
-{
-       int retval;
-
-       retval = prom_getproplen(node, prop);
-       if(retval == -1) return 0;
-       return 1;
-}
-
-/* Acquire a property whose value is a string, returns a null
- * string on error.  The char pointer is the user supplied string
- * buffer.
- */
-void prom_getstring(int node, char *prop, char *user_buf, int ubuf_size)
-{
-       int len;
-
-       len = prom_getproperty(node, prop, user_buf, ubuf_size);
-       if(len != -1) return;
-       user_buf[0] = 0;
-       return;
-}
-
-
-/* Does the device at node 'node' have name 'name'?
- * YES = 1   NO = 0
- */
-int prom_nodematch(int node, char *name)
-{
-       int error;
-
-       static char namebuf[128];
-       error = prom_getproperty(node, "name", namebuf, sizeof(namebuf));
-       if (error == -1) return 0;
-       if(strcmp(namebuf, name) == 0) return 1;
-       return 0;
-}
-
-/* Search siblings at 'node_start' for a node with name
- * 'nodename'.  Return node if successful, zero if not.
- */
-int prom_searchsiblings(int node_start, char *nodename)
-{
-
-       int thisnode, error;
-
-       for(thisnode = node_start; thisnode;
-           thisnode=prom_getsibling(thisnode)) {
-               error = prom_getproperty(thisnode, "name", promlib_buf,
-                                        sizeof(promlib_buf));
-               /* Should this ever happen? */
-               if(error == -1) continue;
-               if(strcmp(nodename, promlib_buf)==0) return thisnode;
-       }
-
-       return 0;
-}
-
-/* Interal version of nextprop that does not alter return values. */
-char * __prom_nextprop(int node, char * oprop)
-{
-       unsigned long flags;
-       char *prop;
-
-       spin_lock_irqsave(&prom_lock, flags);
-       prop = prom_nodeops->no_nextprop(node, oprop);
-       restore_current();
-       spin_unlock_irqrestore(&prom_lock, flags);
-
-       return prop;
-}
-
-/* Return the first property name for node 'node'. */
-/* buffer is unused argument, but as v9 uses it, we need to have the same interface */
-char * prom_firstprop(int node, char *bufer)
-{
-       if (node == 0 || node == -1)
-               return "";
-
-       return __prom_nextprop(node, "");
-}
-
-/* Return the property type string after property type 'oprop'
- * at node 'node' .  Returns empty string if no more
- * property types for this node.
- */
-char * prom_nextprop(int node, char *oprop, char *buffer)
-{
-       if (node == 0 || node == -1)
-               return "";
-
-       return __prom_nextprop(node, oprop);
-}
-
-int prom_finddevice(char *name)
-{
-       char nbuf[128];
-       char *s = name, *d;
-       int node = prom_root_node, node2;
-       unsigned int which_io, phys_addr;
-       struct linux_prom_registers reg[PROMREG_MAX];
-
-       while (*s++) {
-               if (!*s) return node; /* path '.../' is legal */
-               node = prom_getchild(node);
-
-               for (d = nbuf; *s != 0 && *s != '@' && *s != '/';)
-                       *d++ = *s++;
-               *d = 0;
-               
-               node = prom_searchsiblings(node, nbuf);
-               if (!node)
-                       return 0;
-
-               if (*s == '@') {
-                       if (isxdigit(s[1]) && s[2] == ',') {
-                               which_io = simple_strtoul(s+1, NULL, 16);
-                               phys_addr = simple_strtoul(s+3, &d, 16);
-                               if (d != s + 3 && (!*d || *d == '/')
-                                   && d <= s + 3 + 8) {
-                                       node2 = node;
-                                       while (node2 && node2 != -1) {
-                                               if (prom_getproperty (node2, "reg", (char *)reg, sizeof (reg)) > 0) {
-                                                       if (which_io == reg[0].which_io && phys_addr == reg[0].phys_addr) {
-                                                               node = node2;
-                                                               break;
-                                                       }
-                                               }
-                                               node2 = prom_getsibling(node2);
-                                               if (!node2 || node2 == -1)
-                                                       break;
-                                               node2 = prom_searchsiblings(prom_getsibling(node2), nbuf);
-                                       }
-                               }
-                       }
-                       while (*s != 0 && *s != '/') s++;
-               }
-       }
-       return node;
-}
-
-int prom_node_has_property(int node, char *prop)
-{
-       char *current_property = "";
-
-       do {
-               current_property = prom_nextprop(node, current_property, NULL);
-               if(!strcmp(current_property, prop))
-                  return 1;
-       } while (*current_property);
-       return 0;
-}
-
-/* Set property 'pname' at node 'node' to value 'value' which has a length
- * of 'size' bytes.  Return the number of bytes the prom accepted.
- */
-int prom_setprop(int node, char *pname, char *value, int size)
-{
-       unsigned long flags;
-       int ret;
-
-       if(size == 0) return 0;
-       if((pname == 0) || (value == 0)) return 0;
-       spin_lock_irqsave(&prom_lock, flags);
-       ret = prom_nodeops->no_setprop(node, pname, value, size);
-       restore_current();
-       spin_unlock_irqrestore(&prom_lock, flags);
-       return ret;
-}
-
-int prom_inst2pkg(int inst)
-{
-       int node;
-       unsigned long flags;
-       
-       spin_lock_irqsave(&prom_lock, flags);
-       node = (*romvec->pv_v2devops.v2_inst2pkg)(inst);
-       restore_current();
-       spin_unlock_irqrestore(&prom_lock, flags);
-       if (node == -1) return 0;
-       return node;
-}
-
-/* Return 'node' assigned to a particular prom 'path'
- * FIXME: Should work for v0 as well
- */
-int prom_pathtoinode(char *path)
-{
-       int node, inst;
-       
-       inst = prom_devopen (path);
-       if (inst == -1) return 0;
-       node = prom_inst2pkg (inst);
-       prom_devclose (inst);
-       if (node == -1) return 0;
-       return node;
-}
diff --git a/arch/sparc/prom/tree_32.c b/arch/sparc/prom/tree_32.c
new file mode 100644 (file)
index 0000000..f228fe0
--- /dev/null
@@ -0,0 +1,346 @@
+/*
+ * tree.c: Basic device tree traversal/scanning for the Linux
+ *         prom library.
+ *
+ * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
+ */
+
+#define PROMLIB_INTERNAL
+
+#include <linux/string.h>
+#include <linux/types.h>
+#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <linux/ctype.h>
+
+#include <asm/openprom.h>
+#include <asm/oplib.h>
+
+extern void restore_current(void);
+
+static char promlib_buf[128];
+
+/* Internal version of prom_getchild that does not alter return values. */
+int __prom_getchild(int node)
+{
+       unsigned long flags;
+       int cnode;
+
+       spin_lock_irqsave(&prom_lock, flags);
+       cnode = prom_nodeops->no_child(node);
+       restore_current();
+       spin_unlock_irqrestore(&prom_lock, flags);
+
+       return cnode;
+}
+
+/* Return the child of node 'node' or zero if no this node has no
+ * direct descendent.
+ */
+int prom_getchild(int node)
+{
+       int cnode;
+
+       if (node == -1)
+               return 0;
+
+       cnode = __prom_getchild(node);
+       if (cnode == 0 || cnode == -1)
+               return 0;
+
+       return cnode;
+}
+
+/* Internal version of prom_getsibling that does not alter return values. */
+int __prom_getsibling(int node)
+{
+       unsigned long flags;
+       int cnode;
+
+       spin_lock_irqsave(&prom_lock, flags);
+       cnode = prom_nodeops->no_nextnode(node);
+       restore_current();
+       spin_unlock_irqrestore(&prom_lock, flags);
+
+       return cnode;
+}
+
+/* Return the next sibling of node 'node' or zero if no more siblings
+ * at this level of depth in the tree.
+ */
+int prom_getsibling(int node)
+{
+       int sibnode;
+
+       if (node == -1)
+               return 0;
+
+       sibnode = __prom_getsibling(node);
+       if (sibnode == 0 || sibnode == -1)
+               return 0;
+
+       return sibnode;
+}
+
+/* Return the length in bytes of property 'prop' at node 'node'.
+ * Return -1 on error.
+ */
+int prom_getproplen(int node, char *prop)
+{
+       int ret;
+       unsigned long flags;
+
+       if((!node) || (!prop))
+               return -1;
+               
+       spin_lock_irqsave(&prom_lock, flags);
+       ret = prom_nodeops->no_proplen(node, prop);
+       restore_current();
+       spin_unlock_irqrestore(&prom_lock, flags);
+       return ret;
+}
+
+/* Acquire a property 'prop' at node 'node' and place it in
+ * 'buffer' which has a size of 'bufsize'.  If the acquisition
+ * was successful the length will be returned, else -1 is returned.
+ */
+int prom_getproperty(int node, char *prop, char *buffer, int bufsize)
+{
+       int plen, ret;
+       unsigned long flags;
+
+       plen = prom_getproplen(node, prop);
+       if((plen > bufsize) || (plen == 0) || (plen == -1))
+               return -1;
+       /* Ok, things seem all right. */
+       spin_lock_irqsave(&prom_lock, flags);
+       ret = prom_nodeops->no_getprop(node, prop, buffer);
+       restore_current();
+       spin_unlock_irqrestore(&prom_lock, flags);
+       return ret;
+}
+
+/* Acquire an integer property and return its value.  Returns -1
+ * on failure.
+ */
+int prom_getint(int node, char *prop)
+{
+       static int intprop;
+
+       if(prom_getproperty(node, prop, (char *) &intprop, sizeof(int)) != -1)
+               return intprop;
+
+       return -1;
+}
+
+/* Acquire an integer property, upon error return the passed default
+ * integer.
+ */
+int prom_getintdefault(int node, char *property, int deflt)
+{
+       int retval;
+
+       retval = prom_getint(node, property);
+       if(retval == -1) return deflt;
+
+       return retval;
+}
+
+/* Acquire a boolean property, 1=TRUE 0=FALSE. */
+int prom_getbool(int node, char *prop)
+{
+       int retval;
+
+       retval = prom_getproplen(node, prop);
+       if(retval == -1) return 0;
+       return 1;
+}
+
+/* Acquire a property whose value is a string, returns a null
+ * string on error.  The char pointer is the user supplied string
+ * buffer.
+ */
+void prom_getstring(int node, char *prop, char *user_buf, int ubuf_size)
+{
+       int len;
+
+       len = prom_getproperty(node, prop, user_buf, ubuf_size);
+       if(len != -1) return;
+       user_buf[0] = 0;
+       return;
+}
+
+
+/* Does the device at node 'node' have name 'name'?
+ * YES = 1   NO = 0
+ */
+int prom_nodematch(int node, char *name)
+{
+       int error;
+
+       static char namebuf[128];
+       error = prom_getproperty(node, "name", namebuf, sizeof(namebuf));
+       if (error == -1) return 0;
+       if(strcmp(namebuf, name) == 0) return 1;
+       return 0;
+}
+
+/* Search siblings at 'node_start' for a node with name
+ * 'nodename'.  Return node if successful, zero if not.
+ */
+int prom_searchsiblings(int node_start, char *nodename)
+{
+
+       int thisnode, error;
+
+       for(thisnode = node_start; thisnode;
+           thisnode=prom_getsibling(thisnode)) {
+               error = prom_getproperty(thisnode, "name", promlib_buf,
+                                        sizeof(promlib_buf));
+               /* Should this ever happen? */
+               if(error == -1) continue;
+               if(strcmp(nodename, promlib_buf)==0) return thisnode;
+       }
+
+       return 0;
+}
+
+/* Interal version of nextprop that does not alter return values. */
+char * __prom_nextprop(int node, char * oprop)
+{
+       unsigned long flags;
+       char *prop;
+
+       spin_lock_irqsave(&prom_lock, flags);
+       prop = prom_nodeops->no_nextprop(node, oprop);
+       restore_current();
+       spin_unlock_irqrestore(&prom_lock, flags);
+
+       return prop;
+}
+
+/* Return the first property name for node 'node'. */
+/* buffer is unused argument, but as v9 uses it, we need to have the same interface */
+char * prom_firstprop(int node, char *bufer)
+{
+       if (node == 0 || node == -1)
+               return "";
+
+       return __prom_nextprop(node, "");
+}
+
+/* Return the property type string after property type 'oprop'
+ * at node 'node' .  Returns empty string if no more
+ * property types for this node.
+ */
+char * prom_nextprop(int node, char *oprop, char *buffer)
+{
+       if (node == 0 || node == -1)
+               return "";
+
+       return __prom_nextprop(node, oprop);
+}
+
+int prom_finddevice(char *name)
+{
+       char nbuf[128];
+       char *s = name, *d;
+       int node = prom_root_node, node2;
+       unsigned int which_io, phys_addr;
+       struct linux_prom_registers reg[PROMREG_MAX];
+
+       while (*s++) {
+               if (!*s) return node; /* path '.../' is legal */
+               node = prom_getchild(node);
+
+               for (d = nbuf; *s != 0 && *s != '@' && *s != '/';)
+                       *d++ = *s++;
+               *d = 0;
+               
+               node = prom_searchsiblings(node, nbuf);
+               if (!node)
+                       return 0;
+
+               if (*s == '@') {
+                       if (isxdigit(s[1]) && s[2] == ',') {
+                               which_io = simple_strtoul(s+1, NULL, 16);
+                               phys_addr = simple_strtoul(s+3, &d, 16);
+                               if (d != s + 3 && (!*d || *d == '/')
+                                   && d <= s + 3 + 8) {
+                                       node2 = node;
+                                       while (node2 && node2 != -1) {
+                                               if (prom_getproperty (node2, "reg", (char *)reg, sizeof (reg)) > 0) {
+                                                       if (which_io == reg[0].which_io && phys_addr == reg[0].phys_addr) {
+                                                               node = node2;
+                                                               break;
+                                                       }
+                                               }
+                                               node2 = prom_getsibling(node2);
+                                               if (!node2 || node2 == -1)
+                                                       break;
+                                               node2 = prom_searchsiblings(prom_getsibling(node2), nbuf);
+                                       }
+                               }
+                       }
+                       while (*s != 0 && *s != '/') s++;
+               }
+       }
+       return node;
+}
+
+int prom_node_has_property(int node, char *prop)
+{
+       char *current_property = "";
+
+       do {
+               current_property = prom_nextprop(node, current_property, NULL);
+               if(!strcmp(current_property, prop))
+                  return 1;
+       } while (*current_property);
+       return 0;
+}
+
+/* Set property 'pname' at node 'node' to value 'value' which has a length
+ * of 'size' bytes.  Return the number of bytes the prom accepted.
+ */
+int prom_setprop(int node, char *pname, char *value, int size)
+{
+       unsigned long flags;
+       int ret;
+
+       if(size == 0) return 0;
+       if((pname == 0) || (value == 0)) return 0;
+       spin_lock_irqsave(&prom_lock, flags);
+       ret = prom_nodeops->no_setprop(node, pname, value, size);
+       restore_current();
+       spin_unlock_irqrestore(&prom_lock, flags);
+       return ret;
+}
+
+int prom_inst2pkg(int inst)
+{
+       int node;
+       unsigned long flags;
+       
+       spin_lock_irqsave(&prom_lock, flags);
+       node = (*romvec->pv_v2devops.v2_inst2pkg)(inst);
+       restore_current();
+       spin_unlock_irqrestore(&prom_lock, flags);
+       if (node == -1) return 0;
+       return node;
+}
+
+/* Return 'node' assigned to a particular prom 'path'
+ * FIXME: Should work for v0 as well
+ */
+int prom_pathtoinode(char *path)
+{
+       int node, inst;
+       
+       inst = prom_devopen (path);
+       if (inst == -1) return 0;
+       node = prom_inst2pkg (inst);
+       prom_devclose (inst);
+       if (node == -1) return 0;
+       return node;
+}