Dear all, I have written a small patch to get the software reset working on the mpc5121. It is similar to the reset driver found in arch/powerpc/platforms/83xx/misc.c except it has been modified to look for the reset node in the device tree before writing to the reset module.
Comments are welcome. It's my first patch to the mailing list, so I'll apologise in advance for any problems with the submission procedure. Damien.
diff --git a/arch/powerpc/platforms/512x/mpc5121_ads.c b/arch/powerpc/platforms/512x/mpc5121_ads.c index a8976b4..16ca250 100644 --- a/arch/powerpc/platforms/512x/mpc5121_ads.c +++ b/arch/powerpc/platforms/512x/mpc5121_ads.c @@ -70,4 +70,5 @@ define_machine(mpc5121_ads) { .init_IRQ = mpc5121_ads_init_IRQ, .get_irq = ipic_get_irq, .calibrate_decr = generic_calibrate_decr, + .restart = mpc512x_restart, }; diff --git a/arch/powerpc/platforms/512x/mpc512x.h b/arch/powerpc/platforms/512x/mpc512x.h index f4db8a7..d77f0ab 100644 --- a/arch/powerpc/platforms/512x/mpc512x.h +++ b/arch/powerpc/platforms/512x/mpc512x.h @@ -14,5 +14,6 @@ extern unsigned long mpc512x_find_ips_freq(struct device_node *node); extern void __init mpc512x_init_IRQ(void); extern void __init mpc512x_init_i2c(void); +extern void mpc512x_restart(char *cmd); void __init mpc512x_declare_of_platform_devices(void); #endif /* __MPC512X_H__ */ diff --git a/arch/powerpc/platforms/512x/mpc512x_shared.c b/arch/powerpc/platforms/512x/mpc512x_shared.c index 135fd6b..deddafc 100644 --- a/arch/powerpc/platforms/512x/mpc512x_shared.c +++ b/arch/powerpc/platforms/512x/mpc512x_shared.c @@ -22,6 +22,7 @@ #include <asm/prom.h> #include <asm/time.h> +#include <asm/mpc512x.h> #include "mpc512x.h" unsigned long @@ -89,6 +90,33 @@ void __init mpc512x_init_i2c(void) } } +void mpc512x_restart(char *cmd) +{ + struct device_node *np; + struct mpc512x_reset_module *rm; + + local_irq_disable(); + + np = of_find_compatible_node(NULL, NULL, "fsl,mpc5121-reset"); + + if (np) { + + rm = of_iomap(np, 0); + if (rm) { + + /* Enable software reset "RSTE" (in hex) */ + out_be32( &(rm->rpr) , 0x52535445); + + /* Set the software hard reset */ + out_be32( &(rm->rcr), 0x2); + } + } + + printk (KERN_EMERG "Error: Unable to map reset module, spinning forever!\n"); + for(;;); +} + + /* * Nodes to do bus probe on, soc and localbus */
_______________________________________________ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev