summaryrefslogtreecommitdiffstats
path: root/arch/sparc/prom
diff options
context:
space:
mode:
Diffstat (limited to 'arch/sparc/prom')
-rw-r--r--arch/sparc/prom/console.c18
-rw-r--r--arch/sparc/prom/devmap.c10
-rw-r--r--arch/sparc/prom/devops.c14
-rw-r--r--arch/sparc/prom/misc.c20
-rw-r--r--arch/sparc/prom/mp.c18
-rw-r--r--arch/sparc/prom/segment.c6
-rw-r--r--arch/sparc/prom/tree.c30
7 files changed, 59 insertions, 57 deletions
diff --git a/arch/sparc/prom/console.c b/arch/sparc/prom/console.c
index c2b857459..bf61ff1a7 100644
--- a/arch/sparc/prom/console.c
+++ b/arch/sparc/prom/console.c
@@ -1,4 +1,4 @@
-/* $Id: console.c,v 1.22 2000/02/08 20:24:23 davem Exp $
+/* $Id: console.c,v 1.23 2000/08/26 02:38:03 anton Exp $
* console.c: Routines that deal with sending and receiving IO
* to/from the current console device using the PROM.
*
@@ -30,7 +30,7 @@ prom_nbgetchar(void)
int i = -1;
unsigned long flags;
- save_flags(flags); cli();
+ spin_lock_irqsave(&prom_lock, flags);
switch(prom_vers) {
case PROM_V0:
case PROM_SUN4:
@@ -49,7 +49,7 @@ prom_nbgetchar(void)
break;
};
restore_current();
- restore_flags(flags);
+ spin_unlock_irqrestore(&prom_lock, flags);
return i; /* Ugh, we could spin forever on unsupported proms ;( */
}
@@ -63,7 +63,7 @@ prom_nbputchar(char c)
unsigned long flags;
int i = -1;
- save_flags(flags); cli();
+ spin_lock_irqsave(&prom_lock, flags);
switch(prom_vers) {
case PROM_V0:
case PROM_SUN4:
@@ -82,7 +82,7 @@ prom_nbputchar(char c)
break;
};
restore_current();
- restore_flags(flags);
+ spin_unlock_irqrestore(&prom_lock, flags);
return i; /* Ugh, we could spin forever on unsupported proms ;( */
}
@@ -125,10 +125,10 @@ prom_query_input_device()
return PROMDEV_I_UNK;
};
case PROM_V3:
- save_flags(flags); cli();
+ spin_lock_irqsave(&prom_lock, flags);
st_p = (*romvec->pv_v2devops.v2_inst2pkg)(*romvec->pv_v2bootargs.fd_stdin);
restore_current();
- restore_flags(flags);
+ spin_unlock_irqrestore(&prom_lock, flags);
if(prom_node_has_property(st_p, "keyboard"))
return PROMDEV_IKBD;
if (prom_getproperty(st_p, "name", propb, sizeof(propb)) != -1) {
@@ -174,10 +174,10 @@ prom_query_output_device()
break;
case PROM_V2:
case PROM_V3:
- save_flags(flags); cli();
+ spin_lock_irqsave(&prom_lock, flags);
st_p = (*romvec->pv_v2devops.v2_inst2pkg)(*romvec->pv_v2bootargs.fd_stdout);
restore_current();
- restore_flags(flags);
+ spin_unlock_irqrestore(&prom_lock, flags);
propl = prom_getproperty(st_p, "device_type", propb, sizeof(propb));
if (propl >= 0 && propl == sizeof("display") &&
strncmp("display", propb, sizeof("display")) == 0)
diff --git a/arch/sparc/prom/devmap.c b/arch/sparc/prom/devmap.c
index 463b07527..eb1207357 100644
--- a/arch/sparc/prom/devmap.c
+++ b/arch/sparc/prom/devmap.c
@@ -1,4 +1,4 @@
-/* $Id: devmap.c,v 1.6 1998/03/09 14:04:23 jj Exp $
+/* $Id: devmap.c,v 1.7 2000/08/26 02:38:03 anton Exp $
* promdevmap.c: Map device/IO areas to virtual addresses.
*
* Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
@@ -29,13 +29,13 @@ prom_mapio(char *vhint, int ios, unsigned int paddr, unsigned int num_bytes)
unsigned long flags;
char *ret;
- save_flags(flags); cli();
+ spin_lock_irqsave(&prom_lock, flags);
if((num_bytes == 0) || (paddr == 0)) ret = (char *) 0x0;
else
ret = (*(romvec->pv_v2devops.v2_dumb_mmap))(vhint, ios, paddr,
num_bytes);
restore_current();
- restore_flags(flags);
+ spin_unlock_irqrestore(&prom_lock, flags);
return ret;
}
@@ -46,9 +46,9 @@ prom_unmapio(char *vaddr, unsigned int num_bytes)
unsigned long flags;
if(num_bytes == 0x0) return;
- save_flags(flags); cli();
+ spin_lock_irqsave(&prom_lock, flags);
(*(romvec->pv_v2devops.v2_dumb_munmap))(vaddr, num_bytes);
restore_current();
- restore_flags(flags);
+ spin_unlock_irqrestore(&prom_lock, flags);
return;
}
diff --git a/arch/sparc/prom/devops.c b/arch/sparc/prom/devops.c
index 5a58efa0b..61919b54f 100644
--- a/arch/sparc/prom/devops.c
+++ b/arch/sparc/prom/devops.c
@@ -1,4 +1,4 @@
-/* $Id: devops.c,v 1.12 2000/01/29 01:09:12 anton Exp $
+/* $Id: devops.c,v 1.13 2000/08/26 02:38:03 anton Exp $
* devops.c: Device operations using the PROM.
*
* Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
@@ -21,7 +21,7 @@ prom_devopen(char *dstr)
{
int handle;
unsigned long flags;
- save_flags(flags); cli();
+ spin_lock_irqsave(&prom_lock, flags);
switch(prom_vers) {
case PROM_V0:
handle = (*(romvec->pv_v0devops.v0_devopen))(dstr);
@@ -36,7 +36,7 @@ prom_devopen(char *dstr)
break;
};
restore_current();
- restore_flags(flags);
+ spin_unlock_irqrestore(&prom_lock, flags);
return handle;
}
@@ -46,7 +46,7 @@ int
prom_devclose(int dhandle)
{
unsigned long flags;
- save_flags(flags); cli();
+ spin_lock_irqsave(&prom_lock, flags);
switch(prom_vers) {
case PROM_V0:
(*(romvec->pv_v0devops.v0_devclose))(dhandle);
@@ -59,7 +59,7 @@ prom_devclose(int dhandle)
break;
};
restore_current();
- restore_flags(flags);
+ spin_unlock_irqrestore(&prom_lock, flags);
return 0;
}
@@ -70,7 +70,7 @@ void
prom_seek(int dhandle, unsigned int seekhi, unsigned int seeklo)
{
unsigned long flags;
- save_flags(flags); cli();
+ spin_lock_irqsave(&prom_lock, flags);
switch(prom_vers) {
case PROM_V0:
(*(romvec->pv_v0devops.v0_seekdev))(dhandle, seekhi, seeklo);
@@ -83,7 +83,7 @@ prom_seek(int dhandle, unsigned int seekhi, unsigned int seeklo)
break;
};
restore_current();
- restore_flags(flags);
+ spin_unlock_irqrestore(&prom_lock, flags);
return;
}
diff --git a/arch/sparc/prom/misc.c b/arch/sparc/prom/misc.c
index 3c2f2434d..86ce39910 100644
--- a/arch/sparc/prom/misc.c
+++ b/arch/sparc/prom/misc.c
@@ -1,4 +1,4 @@
-/* $Id: misc.c,v 1.17 1998/07/21 10:36:22 jj Exp $
+/* $Id: misc.c,v 1.18 2000/08/26 02:38:03 anton Exp $
* misc.c: Miscellaneous prom functions that don't belong
* anywhere else.
*
@@ -15,16 +15,18 @@
extern void restore_current(void);
+spinlock_t prom_lock = SPIN_LOCK_UNLOCKED;
+
/* Reset and reboot the machine with the command 'bcommand'. */
void
prom_reboot(char *bcommand)
{
unsigned long flags;
- save_flags(flags); cli();
+ spin_lock_irqsave(&prom_lock, flags);
(*(romvec->pv_reboot))(bcommand);
/* Never get here. */
restore_current();
- restore_flags(flags);
+ spin_unlock_irqrestore(&prom_lock, flags);
}
/* Forth evaluate the expression contained in 'fstring'. */
@@ -34,13 +36,13 @@ prom_feval(char *fstring)
unsigned long flags;
if(!fstring || fstring[0] == 0)
return;
- save_flags(flags); cli();
+ 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();
- restore_flags(flags);
+ spin_unlock_irqrestore(&prom_lock, flags);
}
/* We want to do this more nicely some day. */
@@ -66,10 +68,10 @@ prom_cmdline(void)
prom_palette (1);
#endif
install_obp_ticker();
- save_flags(flags); cli();
+ spin_lock_irqsave(&prom_lock, flags);
(*(romvec->pv_abort))();
restore_current();
- restore_flags(flags);
+ spin_unlock_irqrestore(&prom_lock, flags);
install_linux_ticker();
#ifdef CONFIG_SUN_AUXIO
TURN_ON_LED;
@@ -88,11 +90,11 @@ prom_halt(void)
{
unsigned long flags;
again:
- save_flags(flags); cli();
+ spin_lock_irqsave(&prom_lock, flags);
(*(romvec->pv_halt))();
/* Never get here. */
restore_current();
- restore_flags(flags);
+ spin_unlock_irqrestore(&prom_lock, flags);
goto again; /* PROM is out to get me -DaveM */
}
diff --git a/arch/sparc/prom/mp.c b/arch/sparc/prom/mp.c
index ba624673f..92fe3739f 100644
--- a/arch/sparc/prom/mp.c
+++ b/arch/sparc/prom/mp.c
@@ -1,4 +1,4 @@
-/* $Id: mp.c,v 1.11 2000/01/29 01:09:12 anton Exp $
+/* $Id: mp.c,v 1.12 2000/08/26 02:38:03 anton Exp $
* mp.c: OpenBoot Prom Multiprocessor support routines. Don't call
* these on a UP or else you will halt and catch fire. ;)
*
@@ -25,7 +25,7 @@ prom_startcpu(int cpunode, struct linux_prom_registers *ctable_reg, int ctx, cha
int ret;
unsigned long flags;
- save_flags(flags); cli();
+ spin_lock_irqsave(&prom_lock, flags);
switch(prom_vers) {
case PROM_V0:
case PROM_V2:
@@ -37,7 +37,7 @@ prom_startcpu(int cpunode, struct linux_prom_registers *ctable_reg, int ctx, cha
break;
};
restore_current();
- restore_flags(flags);
+ spin_unlock_irqrestore(&prom_lock, flags);
return ret;
}
@@ -51,7 +51,7 @@ prom_stopcpu(int cpunode)
int ret;
unsigned long flags;
- save_flags(flags); cli();
+ spin_lock_irqsave(&prom_lock, flags);
switch(prom_vers) {
case PROM_V0:
case PROM_V2:
@@ -63,7 +63,7 @@ prom_stopcpu(int cpunode)
break;
};
restore_current();
- restore_flags(flags);
+ spin_unlock_irqrestore(&prom_lock, flags);
return ret;
}
@@ -77,7 +77,7 @@ prom_idlecpu(int cpunode)
int ret;
unsigned long flags;
- save_flags(flags); cli();
+ spin_lock_irqsave(&prom_lock, flags);
switch(prom_vers) {
case PROM_V0:
case PROM_V2:
@@ -89,7 +89,7 @@ prom_idlecpu(int cpunode)
break;
};
restore_current();
- restore_flags(flags);
+ spin_unlock_irqrestore(&prom_lock, flags);
return ret;
}
@@ -103,7 +103,7 @@ prom_restartcpu(int cpunode)
int ret;
unsigned long flags;
- save_flags(flags); cli();
+ spin_lock_irqsave(&prom_lock, flags);
switch(prom_vers) {
case PROM_V0:
case PROM_V2:
@@ -115,7 +115,7 @@ prom_restartcpu(int cpunode)
break;
};
restore_current();
- restore_flags(flags);
+ spin_unlock_irqrestore(&prom_lock, flags);
return ret;
}
diff --git a/arch/sparc/prom/segment.c b/arch/sparc/prom/segment.c
index 62b3f8542..09d646016 100644
--- a/arch/sparc/prom/segment.c
+++ b/arch/sparc/prom/segment.c
@@ -1,4 +1,4 @@
-/* $Id: segment.c,v 1.6 1998/03/09 14:04:27 jj Exp $
+/* $Id: segment.c,v 1.7 2000/08/26 02:38:03 anton Exp $
* segment.c: Prom routine to map segments in other contexts before
* a standalone is completely mapped. This is for sun4 and
* sun4c architectures only.
@@ -21,9 +21,9 @@ void
prom_putsegment(int ctx, unsigned long vaddr, int segment)
{
unsigned long flags;
- save_flags(flags); cli();
+ spin_lock_irqsave(&prom_lock, flags);
(*(romvec->pv_setctxt))(ctx, (char *) vaddr, segment);
restore_current();
- restore_flags(flags);
+ spin_unlock_irqrestore(&prom_lock, flags);
return;
}
diff --git a/arch/sparc/prom/tree.c b/arch/sparc/prom/tree.c
index 2e79057d8..adfe6e75a 100644
--- a/arch/sparc/prom/tree.c
+++ b/arch/sparc/prom/tree.c
@@ -1,4 +1,4 @@
-/* $Id: tree.c,v 1.25 1998/09/17 11:04:58 jj Exp $
+/* $Id: tree.c,v 1.26 2000/08/26 02:38:03 anton Exp $
* tree.c: Basic device tree traversal/scanning for the Linux
* prom library.
*
@@ -26,10 +26,10 @@ int __prom_getchild(int node)
unsigned long flags;
int cnode;
- save_and_cli(flags);
+ spin_lock_irqsave(&prom_lock, flags);
cnode = prom_nodeops->no_child(node);
restore_current();
- restore_flags(flags);
+ spin_unlock_irqrestore(&prom_lock, flags);
return cnode;
}
@@ -57,10 +57,10 @@ int __prom_getsibling(int node)
unsigned long flags;
int cnode;
- save_and_cli(flags);
+ spin_lock_irqsave(&prom_lock, flags);
cnode = prom_nodeops->no_nextnode(node);
restore_current();
- restore_flags(flags);
+ spin_unlock_irqrestore(&prom_lock, flags);
return cnode;
}
@@ -93,10 +93,10 @@ int prom_getproplen(int node, char *prop)
if((!node) || (!prop))
return -1;
- save_flags(flags); cli();
+ spin_lock_irqsave(&prom_lock, flags);
ret = prom_nodeops->no_proplen(node, prop);
restore_current();
- restore_flags(flags);
+ spin_unlock_irqrestore(&prom_lock, flags);
return ret;
}
@@ -113,10 +113,10 @@ int prom_getproperty(int node, char *prop, char *buffer, int bufsize)
if((plen > bufsize) || (plen == 0) || (plen == -1))
return -1;
/* Ok, things seem all right. */
- save_flags(flags); cli();
+ spin_lock_irqsave(&prom_lock, flags);
ret = prom_nodeops->no_getprop(node, prop, buffer);
restore_current();
- restore_flags(flags);
+ spin_unlock_irqrestore(&prom_lock, flags);
return ret;
}
@@ -226,10 +226,10 @@ char * __prom_nextprop(int node, char * oprop)
unsigned long flags;
char *prop;
- save_and_cli(flags);
+ spin_lock_irqsave(&prom_lock, flags);
prop = prom_nodeops->no_nextprop(node, oprop);
restore_current();
- restore_flags(flags);
+ spin_unlock_irqrestore(&prom_lock, flags);
return prop;
}
@@ -325,10 +325,10 @@ int prom_setprop(int node, char *pname, char *value, int size)
if(size == 0) return 0;
if((pname == 0) || (value == 0)) return 0;
- save_flags(flags); cli();
+ spin_lock_irqsave(&prom_lock, flags);
ret = prom_nodeops->no_setprop(node, pname, value, size);
restore_current();
- restore_flags(flags);
+ spin_unlock_irqrestore(&prom_lock, flags);
return ret;
}
@@ -337,10 +337,10 @@ int prom_inst2pkg(int inst)
int node;
unsigned long flags;
- save_flags(flags); cli();
+ spin_lock_irqsave(&prom_lock, flags);
node = (*romvec->pv_v2devops.v2_inst2pkg)(inst);
restore_current();
- restore_flags(flags);
+ spin_unlock_irqrestore(&prom_lock, flags);
if (node == -1) return 0;
return node;
}