Commit 44bdef5e authored by David S. Miller's avatar David S. Miller

[SPARC64]: Convert Cheetah memory controller driver to in-kernel PROM tree.

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent cecc4e92
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include <asm/spitfire.h> #include <asm/spitfire.h>
#include <asm/chmctrl.h> #include <asm/chmctrl.h>
#include <asm/oplib.h> #include <asm/oplib.h>
#include <asm/prom.h>
#include <asm/io.h> #include <asm/io.h>
#define CHMCTRL_NDGRPS 2 #define CHMCTRL_NDGRPS 2
...@@ -67,7 +68,6 @@ struct bank_info { ...@@ -67,7 +68,6 @@ struct bank_info {
struct mctrl_info { struct mctrl_info {
struct list_head list; struct list_head list;
int portid; int portid;
int index;
struct obp_mem_layout layout_prop; struct obp_mem_layout layout_prop;
int layout_size; int layout_size;
...@@ -339,12 +339,13 @@ static void fetch_decode_regs(struct mctrl_info *mp) ...@@ -339,12 +339,13 @@ static void fetch_decode_regs(struct mctrl_info *mp)
read_mcreg(mp, CHMCTRL_DECODE4)); read_mcreg(mp, CHMCTRL_DECODE4));
} }
static int init_one_mctrl(int node, int index) static int init_one_mctrl(struct device_node *dp)
{ {
struct mctrl_info *mp = kmalloc(sizeof(*mp), GFP_KERNEL); struct mctrl_info *mp = kmalloc(sizeof(*mp), GFP_KERNEL);
int portid = prom_getintdefault(node, "portid", -1); int portid = of_getintprop_default(dp, "portid", -1);
struct linux_prom64_registers p_reg_prop; struct linux_prom64_registers *regs;
int t; void *pval;
int len;
if (!mp) if (!mp)
return -1; return -1;
...@@ -353,24 +354,21 @@ static int init_one_mctrl(int node, int index) ...@@ -353,24 +354,21 @@ static int init_one_mctrl(int node, int index)
goto fail; goto fail;
mp->portid = portid; mp->portid = portid;
mp->layout_size = prom_getproplen(node, "memory-layout"); pval = of_get_property(dp, "memory-layout", &len);
if (mp->layout_size < 0) mp->layout_size = len;
if (!pval)
mp->layout_size = 0; mp->layout_size = 0;
else {
if (mp->layout_size > sizeof(mp->layout_prop)) if (mp->layout_size > sizeof(mp->layout_prop))
goto fail; goto fail;
memcpy(&mp->layout_prop, pval, len);
}
if (mp->layout_size > 0) regs = of_get_property(dp, "reg", NULL);
prom_getproperty(node, "memory-layout", if (!regs || regs->reg_size != 0x48)
(char *) &mp->layout_prop,
mp->layout_size);
t = prom_getproperty(node, "reg",
(char *) &p_reg_prop,
sizeof(p_reg_prop));
if (t < 0 || p_reg_prop.reg_size != 0x48)
goto fail; goto fail;
mp->regs = ioremap(p_reg_prop.phys_addr, p_reg_prop.reg_size); mp->regs = ioremap(regs->phys_addr, regs->reg_size);
if (mp->regs == NULL) if (mp->regs == NULL)
goto fail; goto fail;
...@@ -384,13 +382,11 @@ static int init_one_mctrl(int node, int index) ...@@ -384,13 +382,11 @@ static int init_one_mctrl(int node, int index)
fetch_decode_regs(mp); fetch_decode_regs(mp);
mp->index = index;
list_add(&mp->list, &mctrl_list); list_add(&mp->list, &mctrl_list);
/* Report the device. */ /* Report the device. */
printk(KERN_INFO "chmc%d: US3 memory controller at %p [%s]\n", printk(KERN_INFO "%s: US3 memory controller at %p [%s]\n",
mp->index, dp->full_name,
mp->regs, (mp->layout_size ? "ACTIVE" : "INACTIVE")); mp->regs, (mp->layout_size ? "ACTIVE" : "INACTIVE"));
return 0; return 0;
...@@ -404,34 +400,19 @@ static int init_one_mctrl(int node, int index) ...@@ -404,34 +400,19 @@ static int init_one_mctrl(int node, int index)
return -1; return -1;
} }
static int __init probe_for_string(char *name, int index)
{
int node = prom_getchild(prom_root_node);
while ((node = prom_searchsiblings(node, name)) != 0) {
int ret = init_one_mctrl(node, index);
if (!ret)
index++;
node = prom_getsibling(node);
if (!node)
break;
}
return index;
}
static int __init chmc_init(void) static int __init chmc_init(void)
{ {
int index; struct device_node *dp;
/* This driver is only for cheetah platforms. */ /* This driver is only for cheetah platforms. */
if (tlb_type != cheetah && tlb_type != cheetah_plus) if (tlb_type != cheetah && tlb_type != cheetah_plus)
return -ENODEV; return -ENODEV;
index = probe_for_string("memory-controller", 0); for_each_node_by_name(dp, "memory-controller")
index = probe_for_string("mc-us3", index); init_one_mctrl(dp);
for_each_node_by_name(dp, "mc-us3")
init_one_mctrl(dp);
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment