Skip to content

Commit

Permalink
[POWERPC] Add bootwrapper function to get virtual reg from the device…
Browse files Browse the repository at this point in the history
… tree.

This patch adds a new generic device tree processing function that retrieves
virtual reg addresses from the device tree to the bootwrapper code. It also
updates the bootwrapper code to use the new function.

dt_get_virtual_reg() retrieves the virtual reg addresses from the
"virtual-reg" property. If the property can't be found, it uses the "reg"
property and walks the tree to translate it to absolute addresses.

Signed-off-by: Laurent Pinchart <laurentp@cse-semaphore.com>
Acked-by: Scott Wood <scottwood@freescale.com>
Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
  • Loading branch information
Laurent Pinchart authored and Kumar Gala committed Apr 17, 2008
1 parent d464df2 commit da0a5f0
Show file tree
Hide file tree
Showing 5 changed files with 31 additions and 43 deletions.
34 changes: 6 additions & 28 deletions arch/powerpc/boot/cpm-serial.c
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,6 @@ int cpm_console_init(void *devp, struct serial_console_data *scdp)
{
void *reg_virt[2];
int is_smc = 0, is_cpm2 = 0, n;
unsigned long reg_phys;
void *parent, *muram;

if (dt_is_compatible(devp, "fsl,cpm1-smc-uart")) {
Expand Down Expand Up @@ -206,15 +205,8 @@ int cpm_console_init(void *devp, struct serial_console_data *scdp)
if (n < 4)
return -1;

n = getprop(devp, "virtual-reg", reg_virt, sizeof(reg_virt));
if (n < (int)sizeof(reg_virt)) {
for (n = 0; n < 2; n++) {
if (!dt_xlate_reg(devp, n, &reg_phys, NULL))
return -1;

reg_virt[n] = (void *)reg_phys;
}
}
if (dt_get_virtual_reg(devp, reg_virt, 2) < 2)
return -1;

if (is_smc)
smc = reg_virt[0];
Expand All @@ -227,15 +219,8 @@ int cpm_console_init(void *devp, struct serial_console_data *scdp)
if (!parent)
return -1;

n = getprop(parent, "virtual-reg", reg_virt, sizeof(reg_virt));
if (n < (int)sizeof(reg_virt)) {
if (!dt_xlate_reg(parent, 0, &reg_phys, NULL))
return -1;

reg_virt[0] = (void *)reg_phys;
}

cpcr = reg_virt[0];
if (dt_get_virtual_reg(parent, &cpcr, 1) < 1)
return -1;

muram = finddevice("/soc/cpm/muram/data");
if (!muram)
Expand All @@ -246,15 +231,8 @@ int cpm_console_init(void *devp, struct serial_console_data *scdp)
* is one for both parent and child.
*/

n = getprop(muram, "virtual-reg", reg_virt, sizeof(reg_virt));
if (n < (int)sizeof(reg_virt)) {
if (!dt_xlate_reg(muram, 0, &reg_phys, NULL))
return -1;

reg_virt[0] = (void *)reg_phys;
}

muram_start = reg_virt[0];
if (dt_get_virtual_reg(muram, (void **)&muram_start, 1) < 1)
return -1;

n = getprop(muram, "reg", &muram_offset, 4);
if (n < 4)
Expand Down
20 changes: 20 additions & 0 deletions arch/powerpc/boot/devtree.c
Original file line number Diff line number Diff line change
Expand Up @@ -350,3 +350,23 @@ int dt_is_compatible(void *node, const char *compat)

return 0;
}

int dt_get_virtual_reg(void *node, void **addr, int nres)
{
unsigned long xaddr;
int n;

n = getprop(node, "virtual-reg", addr, nres * 4);
if (n > 0)
return n / 4;

for (n = 0; n < nres; n++) {
if (!dt_xlate_reg(node, n, &xaddr, NULL))
break;

addr[n] = (void *)xaddr;
}

return n;
}

9 changes: 2 additions & 7 deletions arch/powerpc/boot/mpc52xx-psc.c
Original file line number Diff line number Diff line change
Expand Up @@ -51,14 +51,9 @@ static unsigned char psc_getc(void)

int mpc5200_psc_console_init(void *devp, struct serial_console_data *scdp)
{
int n;

/* Get the base address of the psc registers */
n = getprop(devp, "virtual-reg", &psc, sizeof(psc));
if (n != sizeof(psc)) {
if (!dt_xlate_reg(devp, 0, (void *)&psc, NULL))
return -1;
}
if (dt_get_virtual_reg(devp, &psc, 1) < 1)
return -1;

scdp->open = psc_open;
scdp->putc = psc_putc;
Expand Down
10 changes: 2 additions & 8 deletions arch/powerpc/boot/ns16550.c
Original file line number Diff line number Diff line change
Expand Up @@ -55,15 +55,9 @@ static u8 ns16550_tstc(void)
int ns16550_console_init(void *devp, struct serial_console_data *scdp)
{
int n;
unsigned long reg_phys;

n = getprop(devp, "virtual-reg", &reg_base, sizeof(reg_base));
if (n != sizeof(reg_base)) {
if (!dt_xlate_reg(devp, 0, &reg_phys, NULL))
return -1;

reg_base = (void *)reg_phys;
}
if (dt_get_virtual_reg(devp, (void **)&reg_base, 1) < 1)
return -1;

n = getprop(devp, "reg-shift", &reg_shift, sizeof(reg_shift));
if (n != sizeof(reg_shift))
Expand Down
1 change: 1 addition & 0 deletions arch/powerpc/boot/ops.h
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ int dt_xlate_reg(void *node, int res, unsigned long *addr, unsigned long *size);
int dt_xlate_addr(void *node, u32 *buf, int buflen, unsigned long *xlated_addr);
int dt_is_compatible(void *node, const char *compat);
void dt_get_reg_format(void *node, u32 *naddr, u32 *nsize);
int dt_get_virtual_reg(void *node, void **addr, int nres);

static inline void *finddevice(const char *name)
{
Expand Down

0 comments on commit da0a5f0

Please sign in to comment.