1 /* 2 * Static Memory Controller 3 */ 4 5 #include <linux/module.h> 6 #include <linux/kernel.h> 7 #include <linux/init.h> 8 #include <linux/io.h> 9 #include <linux/sysdev.h> 10 11 #include <mach/hardware.h> 12 #include <mach/smemc.h> 13 14 #ifdef CONFIG_PM 15 static unsigned long msc[2]; 16 static unsigned long sxcnfg, memclkcfg; 17 static unsigned long csadrcfg[4]; 18 19 static int pxa3xx_smemc_suspend(struct sys_device *dev, pm_message_t state) 20 { 21 msc[0] = __raw_readl(MSC0); 22 msc[1] = __raw_readl(MSC1); 23 sxcnfg = __raw_readl(SXCNFG); 24 memclkcfg = __raw_readl(MEMCLKCFG); 25 csadrcfg[0] = __raw_readl(CSADRCFG0); 26 csadrcfg[1] = __raw_readl(CSADRCFG1); 27 csadrcfg[2] = __raw_readl(CSADRCFG2); 28 csadrcfg[3] = __raw_readl(CSADRCFG3); 29 30 return 0; 31 } 32 33 static int pxa3xx_smemc_resume(struct sys_device *dev) 34 { 35 __raw_writel(msc[0], MSC0); 36 __raw_writel(msc[1], MSC1); 37 __raw_writel(sxcnfg, SXCNFG); 38 __raw_writel(memclkcfg, MEMCLKCFG); 39 __raw_writel(csadrcfg[0], CSADRCFG0); 40 __raw_writel(csadrcfg[1], CSADRCFG1); 41 __raw_writel(csadrcfg[2], CSADRCFG2); 42 __raw_writel(csadrcfg[3], CSADRCFG3); 43 44 return 0; 45 } 46 47 static struct sysdev_class smemc_sysclass = { 48 .name = "smemc", 49 .suspend = pxa3xx_smemc_suspend, 50 .resume = pxa3xx_smemc_resume, 51 }; 52 53 static struct sys_device smemc_sysdev = { 54 .id = 0, 55 .cls = &smemc_sysclass, 56 }; 57 58 static int __init smemc_init(void) 59 { 60 int ret = 0; 61 62 if (cpu_is_pxa3xx()) { 63 ret = sysdev_class_register(&smemc_sysclass); 64 if (ret) 65 return ret; 66 67 ret = sysdev_register(&smemc_sysdev); 68 } 69 70 return ret; 71 } 72 subsys_initcall(smemc_init); 73 #endif 74