| /* |
| * Static Memory Controller |
| */ |
| |
| #include <linux/module.h> |
| #include <linux/kernel.h> |
| #include <linux/init.h> |
| #include <linux/io.h> |
| #include <linux/sysdev.h> |
| |
| #include <mach/hardware.h> |
| #include <mach/smemc.h> |
| |
| #ifdef CONFIG_PM |
| static unsigned long msc[2]; |
| static unsigned long sxcnfg, memclkcfg; |
| static unsigned long csadrcfg[4]; |
| |
| static int pxa3xx_smemc_suspend(struct sys_device *dev, pm_message_t state) |
| { |
| msc[0] = __raw_readl(MSC0); |
| msc[1] = __raw_readl(MSC1); |
| sxcnfg = __raw_readl(SXCNFG); |
| memclkcfg = __raw_readl(MEMCLKCFG); |
| csadrcfg[0] = __raw_readl(CSADRCFG0); |
| csadrcfg[1] = __raw_readl(CSADRCFG1); |
| csadrcfg[2] = __raw_readl(CSADRCFG2); |
| csadrcfg[3] = __raw_readl(CSADRCFG3); |
| |
| return 0; |
| } |
| |
| static int pxa3xx_smemc_resume(struct sys_device *dev) |
| { |
| __raw_writel(msc[0], MSC0); |
| __raw_writel(msc[1], MSC1); |
| __raw_writel(sxcnfg, SXCNFG); |
| __raw_writel(memclkcfg, MEMCLKCFG); |
| __raw_writel(csadrcfg[0], CSADRCFG0); |
| __raw_writel(csadrcfg[1], CSADRCFG1); |
| __raw_writel(csadrcfg[2], CSADRCFG2); |
| __raw_writel(csadrcfg[3], CSADRCFG3); |
| |
| return 0; |
| } |
| |
| static struct sysdev_class smemc_sysclass = { |
| .name = "smemc", |
| .suspend = pxa3xx_smemc_suspend, |
| .resume = pxa3xx_smemc_resume, |
| }; |
| |
| static struct sys_device smemc_sysdev = { |
| .id = 0, |
| .cls = &smemc_sysclass, |
| }; |
| |
| static int __init smemc_init(void) |
| { |
| int ret = 0; |
| |
| if (cpu_is_pxa3xx()) { |
| ret = sysdev_class_register(&smemc_sysclass); |
| if (ret) |
| return ret; |
| |
| ret = sysdev_register(&smemc_sysdev); |
| } |
| |
| return ret; |
| } |
| subsys_initcall(smemc_init); |
| #endif |