[POWERPC] Add bootwrapper function to get virtual reg from the device tree.
authorLaurent Pinchart <laurentp@cse-semaphore.com>
Thu, 10 Apr 2008 15:03:04 +0000 (17:03 +0200)
committerKumar Gala <galak@kernel.crashing.org>
Thu, 17 Apr 2008 06:01:37 +0000 (01:01 -0500)
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>
arch/powerpc/boot/cpm-serial.c
arch/powerpc/boot/devtree.c
arch/powerpc/boot/mpc52xx-psc.c
arch/powerpc/boot/ns16550.c
arch/powerpc/boot/ops.h

index 28296facb2ae921876c8859c2cee95db80f72b10..1f6225aad29897d9b84ff48454652650918f2129 100644 (file)
@@ -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")) {
@@ -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];
@@ -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)
@@ -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)
index 60f561e307a99090b423bc3e02e90891e9d51b48..5d12336dc3609d9d0cb9df0089f273ffc7fabe77 100644 (file)
@@ -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;
+}
+
index 1074626e6a37b24e7295e0aceb26486257f9fcdf..d4cb4e4e0938b049a68f4c2ff5ed5aeb1c09316f 100644 (file)
@@ -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;
index f8f1b2f31412accf4bdfded110af68c813b4a7b7..aef3bdc891605d30e664689bec5d7af43fae54d2 100644 (file)
@@ -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))
index 4b0544b03c640fb45d8f4aef229c7a019dc7a6ee..321e2f5afe714007443e4c8a39bad2f011c7e04e 100644 (file)
@@ -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)
 {