Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[POWERPC] Add bootwrapper function to get virtual reg from the device 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>

authored by

Laurent Pinchart and committed by
Kumar Gala
da0a5f0c d464df26

+31 -43
+6 -28
arch/powerpc/boot/cpm-serial.c
··· 177 177 { 178 178 void *reg_virt[2]; 179 179 int is_smc = 0, is_cpm2 = 0, n; 180 - unsigned long reg_phys; 181 180 void *parent, *muram; 182 181 183 182 if (dt_is_compatible(devp, "fsl,cpm1-smc-uart")) { ··· 205 206 if (n < 4) 206 207 return -1; 207 208 208 - n = getprop(devp, "virtual-reg", reg_virt, sizeof(reg_virt)); 209 - if (n < (int)sizeof(reg_virt)) { 210 - for (n = 0; n < 2; n++) { 211 - if (!dt_xlate_reg(devp, n, &reg_phys, NULL)) 212 - return -1; 213 - 214 - reg_virt[n] = (void *)reg_phys; 215 - } 216 - } 209 + if (dt_get_virtual_reg(devp, reg_virt, 2) < 2) 210 + return -1; 217 211 218 212 if (is_smc) 219 213 smc = reg_virt[0]; ··· 219 227 if (!parent) 220 228 return -1; 221 229 222 - n = getprop(parent, "virtual-reg", reg_virt, sizeof(reg_virt)); 223 - if (n < (int)sizeof(reg_virt)) { 224 - if (!dt_xlate_reg(parent, 0, &reg_phys, NULL)) 225 - return -1; 226 - 227 - reg_virt[0] = (void *)reg_phys; 228 - } 229 - 230 - cpcr = reg_virt[0]; 230 + if (dt_get_virtual_reg(parent, &cpcr, 1) < 1) 231 + return -1; 231 232 232 233 muram = finddevice("/soc/cpm/muram/data"); 233 234 if (!muram) ··· 231 246 * is one for both parent and child. 232 247 */ 233 248 234 - n = getprop(muram, "virtual-reg", reg_virt, sizeof(reg_virt)); 235 - if (n < (int)sizeof(reg_virt)) { 236 - if (!dt_xlate_reg(muram, 0, &reg_phys, NULL)) 237 - return -1; 238 - 239 - reg_virt[0] = (void *)reg_phys; 240 - } 241 - 242 - muram_start = reg_virt[0]; 249 + if (dt_get_virtual_reg(muram, (void **)&muram_start, 1) < 1) 250 + return -1; 243 251 244 252 n = getprop(muram, "reg", &muram_offset, 4); 245 253 if (n < 4)
+20
arch/powerpc/boot/devtree.c
··· 350 350 351 351 return 0; 352 352 } 353 + 354 + int dt_get_virtual_reg(void *node, void **addr, int nres) 355 + { 356 + unsigned long xaddr; 357 + int n; 358 + 359 + n = getprop(node, "virtual-reg", addr, nres * 4); 360 + if (n > 0) 361 + return n / 4; 362 + 363 + for (n = 0; n < nres; n++) { 364 + if (!dt_xlate_reg(node, n, &xaddr, NULL)) 365 + break; 366 + 367 + addr[n] = (void *)xaddr; 368 + } 369 + 370 + return n; 371 + } 372 +
+2 -7
arch/powerpc/boot/mpc52xx-psc.c
··· 51 51 52 52 int mpc5200_psc_console_init(void *devp, struct serial_console_data *scdp) 53 53 { 54 - int n; 55 - 56 54 /* Get the base address of the psc registers */ 57 - n = getprop(devp, "virtual-reg", &psc, sizeof(psc)); 58 - if (n != sizeof(psc)) { 59 - if (!dt_xlate_reg(devp, 0, (void *)&psc, NULL)) 60 - return -1; 61 - } 55 + if (dt_get_virtual_reg(devp, &psc, 1) < 1) 56 + return -1; 62 57 63 58 scdp->open = psc_open; 64 59 scdp->putc = psc_putc;
+2 -8
arch/powerpc/boot/ns16550.c
··· 55 55 int ns16550_console_init(void *devp, struct serial_console_data *scdp) 56 56 { 57 57 int n; 58 - unsigned long reg_phys; 59 58 60 - n = getprop(devp, "virtual-reg", &reg_base, sizeof(reg_base)); 61 - if (n != sizeof(reg_base)) { 62 - if (!dt_xlate_reg(devp, 0, &reg_phys, NULL)) 63 - return -1; 64 - 65 - reg_base = (void *)reg_phys; 66 - } 59 + if (dt_get_virtual_reg(devp, (void **)&reg_base, 1) < 1) 60 + return -1; 67 61 68 62 n = getprop(devp, "reg-shift", &reg_shift, sizeof(reg_shift)); 69 63 if (n != sizeof(reg_shift))
+1
arch/powerpc/boot/ops.h
··· 95 95 int dt_xlate_addr(void *node, u32 *buf, int buflen, unsigned long *xlated_addr); 96 96 int dt_is_compatible(void *node, const char *compat); 97 97 void dt_get_reg_format(void *node, u32 *naddr, u32 *nsize); 98 + int dt_get_virtual_reg(void *node, void **addr, int nres); 98 99 99 100 static inline void *finddevice(const char *name) 100 101 {