On Wednesday 22 April 2009, Kumar Gala wrote: First of all, thanks for bringing this up, I'd love to see get_immrbase() gone. > arch/powerpc/sysdev/cpm1.c: mpc8xx_immr = ioremap(get_immrbase(), > 0x4000); > not sure? ideas? Nobody has commented on this, so I've taken a brief look at it. I'd suggest moving the logic up one step at a time. im_cpm, im_siu_conf and im_ioport could be defined locally in sysdev/cpm1.c rather than through mpc8xx_immr, all you need for this is to export accessor functions from cpm1 for iop_pcso and cp_cptr: void cpm1_set_iop_pcso(u16 pcso) { setbits16(cpm1_ioport.iop_pcso, pcso); } void cpm1_clear_iop_pcso(u16 pcso) { clearbits16(cpm1_ioport.iop_pcso, pcso); } ... im_sit, im_sitk, im_clkrst and im_clkrstk should be defined locally in m8xx_setup.c, which is the only place that they are used in. Fortunately, the are all contiguous in the address sapce, so they can be moved into one new data structure with a single static pointer to it in m8xx_setup.c: static struct { struct­ sys_int_timers sit; struct clk_and_reset clkrst; struct sitk sitk; struct cark clkrstk; } *m8xx_setup_regs; When this is done, 8xx_immap.h along with all the unused stuff therein can be removed. In the last step, the device trees can be cleaned up so that you can of_iomap the regions in those two files directly. Arnd <><