From: "Steven J. Hill" <sjhill@mips.com>
Signed-off-by: Steven J. Hill <sjhill@mips.com>
---
.../mips/include/asm/pmc-sierra/msp71xx/msp_prom.h | 25 ----
arch/mips/pmc-sierra/msp71xx/msp_prom.c | 130 +++++++-------------
arch/mips/pmc-sierra/msp71xx/msp_serial.c | 9 +-
arch/mips/pmc-sierra/msp71xx/msp_setup.c | 10 +-
arch/mips/pmc-sierra/msp71xx/msp_time.c | 26 ++--
arch/mips/pmc-sierra/msp71xx/msp_usb.c | 17 +--
arch/mips/pmc-sierra/yosemite/prom.c | 32 +----
drivers/mtd/maps/pmcmsp-flash.c | 9 +-
8 files changed, 73 insertions(+), 185 deletions(-)
diff --git a/arch/mips/include/asm/pmc-sierra/msp71xx/msp_prom.h
b/arch/mips/include/asm/pmc-sierra/msp71xx/msp_prom.h
index 786d82d..b8c34ff 100644
--- a/arch/mips/include/asm/pmc-sierra/msp71xx/msp_prom.h
+++ b/arch/mips/include/asm/pmc-sierra/msp71xx/msp_prom.h
@@ -118,13 +118,9 @@
#define ZSP_DUET 'D' /* one DUET zsp engine */
#define ZSP_TRIAD 'T' /* two TRIAD zsp engines */
-extern char *prom_getenv(char *name);
-extern void prom_init_cmdline(void);
-extern void prom_meminit(void);
extern void prom_fixup_mem_map(unsigned long start_mem,
unsigned long end_mem);
-extern int get_ethernet_addr(char *ethaddr_name, char *ethernet_addr);
extern unsigned long get_deviceid(void);
extern char identify_enet(unsigned long interface_num);
extern char identify_enetTxD(unsigned long interface_num);
@@ -147,25 +143,4 @@ extern unsigned long identify_revision(void);
printk(_f, ## x); \
} while (0)
-/* Memory descriptor management. */
-#define PROM_MAX_PMEMBLOCKS 7 /* 6 used */
-
-enum yamon_memtypes {
- yamon_dontuse,
- yamon_prom,
- yamon_free,
-};
-
-struct prom_pmemblock {
- unsigned long base; /* Within KSEG0. */
- unsigned int size; /* In bytes. */
- unsigned int type; /* free or prom memory */
-};
-
-extern int prom_argc;
-extern char **prom_argv;
-extern char **prom_envp;
-extern int *prom_vec;
-extern struct prom_pmemblock *prom_getmdesc(void);
-
#endif /* !_ASM_MSP_PROM_H */
diff --git a/arch/mips/pmc-sierra/msp71xx/msp_prom.c
b/arch/mips/pmc-sierra/msp71xx/msp_prom.c
index db00deb..885256f 100644
--- a/arch/mips/pmc-sierra/msp71xx/msp_prom.c
+++ b/arch/mips/pmc-sierra/msp71xx/msp_prom.c
@@ -43,23 +43,18 @@
#include <linux/slab.h>
#include <asm/addrspace.h>
-#include <asm/bootinfo.h>
#include <asm-generic/sections.h>
#include <asm/page.h>
+#include <asm/fw/fw.h>
#include <msp_prom.h>
#include <msp_regs.h>
-/* global PROM environment variables and pointers */
-int prom_argc;
-char **prom_argv, **prom_envp;
-int *prom_vec;
-
-/* debug flag */
-int init_debug = 1;
+/* Global PROM vector */
+int *fw_vec;
/* memory blocks */
-struct prom_pmemblock mdesc[PROM_MAX_PMEMBLOCKS];
+fw_memblock_t mdesc[7];
/* default feature sets */
static char msp_default_features[] =
@@ -141,7 +136,7 @@ int get_ethernet_addr(char *ethaddr_name, char
*ethernet_addr)
{
char *ethaddr_str;
- ethaddr_str = prom_getenv(ethaddr_name);
+ ethaddr_str = fw_getenv(ethaddr_name);
if (!ethaddr_str) {
printk(KERN_WARNING "%s not set in boot prom\n", ethaddr_name);
return -1;
@@ -168,7 +163,7 @@ EXPORT_SYMBOL(get_ethernet_addr);
static char *get_features(void)
{
- char *feature = prom_getenv(FEATURES);
+ char *feature = fw_getenv(FEATURES);
if (feature == NULL) {
/* default features based on MACHINE_TYPE */
@@ -193,7 +188,7 @@ static char test_feature(char c)
unsigned long get_deviceid(void)
{
- char *deviceid = prom_getenv(DEVICEID);
+ char *deviceid = fw_getenv(DEVICEID);
if (deviceid == NULL)
return *DEV_ID_REG;
@@ -281,72 +276,30 @@ unsigned long identify_revision(void)
}
EXPORT_SYMBOL(identify_revision);
-/* PROM environment functions */
-char *prom_getenv(char *env_name)
-{
- /*
- * Return a pointer to the given environment variable. prom_envp
- * points to a null terminated array of pointers to variables.
- * Environment variables are stored in the form of "memsize=64"
- */
-
- char **var = prom_envp;
- int i = strlen(env_name);
-
- while (*var) {
- if (strncmp(env_name, *var, i) == 0) {
- return (*var + strlen(env_name) + 1);
- }
- var++;
- }
-
- return NULL;
-}
-
-/* PROM commandline functions */
-void __init prom_init_cmdline(void)
-{
- char *cp;
- int actr;
-
- actr = 1; /* Always ignore argv[0] */
-
- cp = &(arcs_cmdline[0]);
- while (actr < prom_argc) {
- strcpy(cp, prom_argv[actr]);
- cp += strlen(prom_argv[actr]);
- *cp++ = ' ';
- actr++;
- }
- if (cp != &(arcs_cmdline[0])) /* get rid of trailing space */
- --cp;
- *cp = '\0';
-}
-
/* memory allocation functions */
-static int __init prom_memtype_classify(unsigned int type)
+static int __init fw_memtype_classify(unsigned int type)
{
switch (type) {
- case yamon_free:
+ case fw_free:
return BOOT_MEM_RAM;
- case yamon_prom:
+ case fw_code:
return BOOT_MEM_ROM_DATA;
default:
return BOOT_MEM_RESERVED;
}
}
-void __init prom_meminit(void)
+void __init fw_meminit(void)
{
- struct prom_pmemblock *p;
+ fw_memblock_t *p;
- p = prom_getmdesc();
+ p = fw_getmdesc();
while (p->size) {
long type;
unsigned long base, size;
- type = prom_memtype_classify(p->type);
+ type = fw_memtype_classify(p->type);
base = p->base;
size = p->size;
@@ -369,43 +322,43 @@ void __init prom_free_prom_memory(void)
* preserve environment variables and command line from pmon/bbload
* first preserve the command line
*/
- for (argc = 0; argc < prom_argc; argc++) {
- len += sizeof(char *); /* length of pointer */
- len += strlen(prom_argv[argc]) + 1; /* length of string */
+ for (argc = 0; argc < fw_argc; argc++) {
+ len += sizeof(int *); /* length of pointer */
+ len += strlen(fw_argv(argc)) + 1; /* length of string */
}
len += sizeof(char *); /* plus length of null pointer */
argv = kmalloc(len, GFP_KERNEL);
- ptr = (char *) &argv[prom_argc + 1]; /* strings follow array */
+ ptr = (char *) &argv[fw_argc + 1]; /* strings follow array */
- for (argc = 0; argc < prom_argc; argc++) {
+ for (argc = 0; argc < fw_argc; argc++) {
argv[argc] = ptr;
- strcpy(ptr, prom_argv[argc]);
- ptr += strlen(prom_argv[argc]) + 1;
+ strcpy(ptr, fw_argv(argc));
+ ptr += strlen(fw_argv(argc)) + 1;
}
- argv[prom_argc] = NULL; /* end array with null pointer */
- prom_argv = argv;
+ argv[fw_argc] = NULL; /* end array with null pointer */
+ _fw_argv = (int *)argv;
/* next preserve the environment variables */
len = 0;
i = 0;
- for (envp = prom_envp; *envp != NULL; envp++) {
+ while (fw_envp(i) != NULL) {
+ len += sizeof(int *); /* length of pointer */
+ len += strlen(fw_envp(i)) + 1; /* length of string */
i++; /* count number of environment variables */
- len += sizeof(char *); /* length of pointer */
- len += strlen(*envp) + 1; /* length of string */
}
len += sizeof(char *); /* plus length of null pointer */
envp = kmalloc(len, GFP_KERNEL);
- ptr = (char *) &envp[i+1];
+ ptr = (char *) &envp[i + 1];
for (argc = 0; argc < i; argc++) {
envp[argc] = ptr;
- strcpy(ptr, prom_envp[argc]);
- ptr += strlen(prom_envp[argc]) + 1;
+ strcpy(ptr, fw_envp(argc));
+ ptr += strlen(fw_envp(argc)) + 1;
}
envp[i] = NULL; /* end array with null pointer */
- prom_envp = envp;
+ _fw_envp = (int *)envp;
for (i = 0; i < boot_mem_map.nr_map; i++) {
if (boot_mem_map.map[i].type != BOOT_MEM_ROM_DATA)
@@ -417,22 +370,23 @@ void __init prom_free_prom_memory(void)
}
}
-struct prom_pmemblock *__init prom_getmdesc(void)
+fw_memblock_t *__init fw_getmdesc(void)
{
static char memsz_env[] __initdata = "memsize";
static char heaptop_env[] __initdata = "heaptop";
char *str;
unsigned int memsize;
unsigned int heaptop;
- int i;
+ int i, tmp;
+ long val;
- str = prom_getenv(memsz_env);
+ str = fw_getenv(memsz_env);
if (!str) {
- ppfinit("memsize not set in boot prom, "
- "set to default (32Mb)\n");
+ ppfinit("memsize not set in firmware, set to default (32Mb)\n");
memsize = 0x02000000;
} else {
- memsize = simple_strtol(str, NULL, 0);
+ tmp = kstrtol(str, 0, &val);
+ memsize = (unsigned int)val;
if (memsize == 0) {
/* if memsize is a bad size, use reasonable default */
@@ -443,16 +397,18 @@ struct prom_pmemblock *__init prom_getmdesc(void)
memsize = CPHYSADDR(memsize);
}
- str = prom_getenv(heaptop_env);
+ str = fw_getenv(heaptop_env);
if (!str) {
heaptop = CPHYSADDR((u32)&_text);
ppfinit("heaptop not set in boot prom, "
"set to default 0x%08x\n", heaptop);
} else {
- heaptop = simple_strtol(str, NULL, 16);
+ tmp = kstrtol(str, 16, &val);
+ heaptop = (unsigned int)val;
if (heaptop == 0) {
/* heaptop conversion bad, might have 0xValue */
- heaptop = simple_strtol(str, NULL, 0);
+ tmp = kstrtol(str, 0, &val);
+ heaptop = (unsigned int)val;
if (heaptop == 0) {
/* heaptop still bad, use reasonable default */
@@ -495,7 +451,7 @@ struct prom_pmemblock *__init prom_getmdesc(void)
/* Remainder of RAM -- under memsize */
i++; /* 5 */
- mdesc[i].type = yamon_free;
+ mdesc[i].type = fw_free;
mdesc[i].base = mdesc[i-1].base + mdesc[i-1].size;
mdesc[i].size = memsize - mdesc[i].base;
diff --git a/arch/mips/pmc-sierra/msp71xx/msp_serial.c
b/arch/mips/pmc-sierra/msp71xx/msp_serial.c
index a1c7c7d..7080bce 100644
--- a/arch/mips/pmc-sierra/msp71xx/msp_serial.c
+++ b/arch/mips/pmc-sierra/msp71xx/msp_serial.c
@@ -29,12 +29,13 @@
#include <linux/serial_reg.h>
#include <linux/slab.h>
-#include <asm/bootinfo.h>
#include <asm/io.h>
#include <asm/processor.h>
#include <asm/serial.h>
#include <linux/serial_8250.h>
+#include <asm/fw/fw.h>
+
#include <msp_prom.h>
#include <msp_int.h>
#include <msp_regs.h>
@@ -90,16 +91,14 @@ static int msp_serial_handle_irq(struct uart_port *p)
void __init msp_serial_setup(void)
{
- char *s;
- char *endp;
struct uart_port up;
unsigned int uartclk;
memset(&up, 0, sizeof(up));
/* Check if clock was specified in environment */
- s = prom_getenv("uartfreqhz");
- if(!(s && *s && (uartclk = simple_strtoul(s, &endp, 10)) && *endp == 0))
+ uartclk = (unsigned int) fw_getenvl("uartfreqhz");
+ if (uartclk == 0)
uartclk = MSP_BASE_BAUD;
ppfinit("UART clock set to %d\n", uartclk);
diff --git a/arch/mips/pmc-sierra/msp71xx/msp_setup.c
b/arch/mips/pmc-sierra/msp71xx/msp_setup.c
index 7a834b2..6fa0d76 100644
--- a/arch/mips/pmc-sierra/msp71xx/msp_setup.c
+++ b/arch/mips/pmc-sierra/msp71xx/msp_setup.c
@@ -10,12 +10,12 @@
* option) any later version.
*/
-#include <asm/bootinfo.h>
#include <asm/cacheflush.h>
#include <asm/r4kcache.h>
#include <asm/reboot.h>
#include <asm/smp-ops.h>
#include <asm/time.h>
+#include <asm/fw/fw.h>
#include <msp_prom.h>
#include <msp_regs.h>
@@ -154,10 +154,6 @@ void __init prom_init(void)
unsigned long family;
unsigned long revision;
- prom_argc = fw_arg0;
- prom_argv = (char **)fw_arg1;
- prom_envp = (char **)fw_arg2;
-
/*
* Someday we can use this with PMON2000 to get a
* platform call prom routines for output etc. without
@@ -213,9 +209,9 @@ void __init prom_init(void)
break;
}
- prom_init_cmdline();
+ fw_init_cmdline();
- prom_meminit();
+ fw_meminit();
/*
* Sub-system setup follows.
diff --git a/arch/mips/pmc-sierra/msp71xx/msp_time.c
b/arch/mips/pmc-sierra/msp71xx/msp_time.c
index 8b42f30..d76cbdb 100644
--- a/arch/mips/pmc-sierra/msp71xx/msp_time.c
+++ b/arch/mips/pmc-sierra/msp71xx/msp_time.c
@@ -32,8 +32,8 @@
#include <asm/cevt-r4k.h>
#include <asm/mipsregs.h>
#include <asm/time.h>
+#include <asm/fw/fw.h>
-#include <msp_prom.h>
#include <msp_int.h>
#include <msp_regs.h>
@@ -45,26 +45,16 @@ static int tim_installed;
void __init plat_time_init(void)
{
- char *endp, *s;
- unsigned long cpu_rate = 0;
+ unsigned long cpu_rate;
- if (cpu_rate == 0) {
- s = prom_getenv("clkfreqhz");
- cpu_rate = simple_strtoul(s, &endp, 10);
- if (endp != NULL && *endp != 0) {
- printk(KERN_ERR
- "Clock rate in Hz parse error: %s\n", s);
- cpu_rate = 0;
- }
- }
+ cpu_rate = fw_getenvl("clkfreqhz");
+ if (cpu_rate == 0)
+ printk(KERN_ERR "Clock rate in Hz parse error: %s\n", s);
if (cpu_rate == 0) {
- s = prom_getenv("clkfreq");
- cpu_rate = 1000 * simple_strtoul(s, &endp, 10);
- if (endp != NULL && *endp != 0) {
- printk(KERN_ERR
- "Clock rate in MHz parse error: %s\n", s);
- cpu_rate = 0;
+ cpu_rate = 1000 * fw_getenvl("clkfreq");
+ if (cpu_rate == 0)
+ printk(KERN_ERR "Clock rate in MHz parse error: %s\n",
s);
}
}
diff --git a/arch/mips/pmc-sierra/msp71xx/msp_usb.c
b/arch/mips/pmc-sierra/msp71xx/msp_usb.c
index 9a1aef8..ee4ed9b 100644
--- a/arch/mips/pmc-sierra/msp71xx/msp_usb.c
+++ b/arch/mips/pmc-sierra/msp71xx/msp_usb.c
@@ -30,6 +30,7 @@
#include <linux/platform_device.h>
#include <asm/mipsregs.h>
+#include <asm/fw/fw.h>
#include <msp_regs.h>
#include <msp_int.h>
@@ -201,26 +202,20 @@ static struct mspusb_device msp_usbdev1_device = {
static int __init msp_usb_setup(void)
{
- char *strp;
- char envstr[32];
struct platform_device *msp_devs[NUM_USB_DEVS];
+ char *strp;
unsigned int val;
- /* construct environment name usbmode */
- /* set usbmode <host/device> as pmon environment var */
+ /* set default host mode */
+ val = 1;
+
/*
* Could this perhaps be integrated into the "features" env var?
* Use the features key "U", and follow with "H" for host-mode,
* "D" for device-mode. If it works for Ethernet, why not USB...
* -- hammtrev, 2007/03/22
*/
- snprintf((char *)&envstr[0], sizeof(envstr), "usbmode");
-
- /* set default host mode */
- val = 1;
-
- /* get environment string */
- strp = prom_getenv((char *)&envstr[0]);
+ strp = fw_getenv("usbmode");
if (strp) {
/* compare string */
if (!strcmp(strp, "device"))
diff --git a/arch/mips/pmc-sierra/yosemite/prom.c
b/arch/mips/pmc-sierra/yosemite/prom.c
index 6a2754c..b4ce648 100644
--- a/arch/mips/pmc-sierra/yosemite/prom.c
+++ b/arch/mips/pmc-sierra/yosemite/prom.c
@@ -20,7 +20,7 @@
#include <asm/processor.h>
#include <asm/reboot.h>
#include <asm/smp-ops.h>
-#include <asm/bootinfo.h>
+#include <asm/fw/fw.h>
#include <asm/pmon.h>
#ifdef CONFIG_SMP
@@ -85,11 +85,7 @@ extern struct plat_smp_ops yos_smp_ops;
*/
void __init prom_init(void)
{
- int argc = fw_arg0;
- char **arg = (char **) fw_arg1;
- char **env = (char **) fw_arg2;
struct callvectors *cv = (struct callvectors *) fw_arg3;
- int i = 0;
/* Callbacks for halt, restart */
_machine_restart = (void (*)(char *)) prom_exit;
@@ -97,36 +93,16 @@ void __init prom_init(void)
pm_power_off = prom_halt;
debug_vectors = cv;
- arcs_cmdline[0] = '\0';
- /* Get the boot parameters */
- for (i = 1; i < argc; i++) {
- if (strlen(arcs_cmdline) + strlen(arg[i]) + 1 >=
- sizeof(arcs_cmdline))
- break;
-
- strcat(arcs_cmdline, arg[i]);
- strcat(arcs_cmdline, " ");
- }
+ fw_init_cmdline();
#ifdef CONFIG_SERIAL_8250_CONSOLE
if ((strstr(arcs_cmdline, "console=ttyS")) == NULL)
strcat(arcs_cmdline, "console=ttyS0,115200");
#endif
- while (*env) {
- if (strncmp("ocd_base", *env, strlen("ocd_base")) == 0)
- yosemite_base =
- simple_strtol(*env + strlen("ocd_base="), NULL,
- 16);
-
- if (strncmp("cpuclock", *env, strlen("cpuclock")) == 0)
- cpu_clock_freq =
- simple_strtol(*env + strlen("cpuclock="), NULL,
- 10);
-
- env++;
- }
+ yosemite_base = fw_getenvl("ocd_base");
+ cpu_clock_freq = fw_getenvl("cpuclock");
prom_grab_secondary();
diff --git a/drivers/mtd/maps/pmcmsp-flash.c b/drivers/mtd/maps/pmcmsp-flash.c
index 744ca5c..c19d9e4 100644
--- a/drivers/mtd/maps/pmcmsp-flash.c
+++ b/drivers/mtd/maps/pmcmsp-flash.c
@@ -37,6 +37,7 @@
#include <linux/mtd/partitions.h>
#include <asm/io.h>
+#include <asm/fw/fw.h>
#include <msp_prom.h>
#include <msp_regs.h>
@@ -67,7 +68,7 @@ static int __init init_msp_flash(void)
}
/* examine the prom environment for flash devices */
- for (fcnt = 0; (env = prom_getenv(flash_name)); fcnt++)
+ for (fcnt = 0; (env = fw_getenv(flash_name)); fcnt++)
flash_name[5] = '0' + fcnt + 1;
if (fcnt < 1)
@@ -92,7 +93,7 @@ static int __init init_msp_flash(void)
/* examine the prom environment for flash partititions */
part_name[5] = '0' + i;
part_name[7] = '0';
- for (pcnt = 0; (env = prom_getenv(part_name)); pcnt++)
+ for (pcnt = 0; (env = fw_getenv(part_name)); pcnt++)
part_name[7] = '0' + pcnt + 1;
if (pcnt == 0) {
@@ -108,7 +109,7 @@ static int __init init_msp_flash(void)
/* now initialize the devices proper */
flash_name[5] = '0' + i;
- env = prom_getenv(flash_name);
+ env = fw_getenv(flash_name);
if (sscanf(env, "%x:%x", &addr, &size) < 2) {
ret = -ENXIO;
@@ -152,7 +153,7 @@ static int __init init_msp_flash(void)
part_name[5] = '0' + i;
part_name[7] = '0' + j;
- env = prom_getenv(part_name);
+ env = fw_getenv(part_name);
if (sscanf(env, "%x:%x:%n", &offset, &size,
&coff) < 2) {
--
1.7.10.3
|