-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[ARM] pxa: introduce sysdev for pxa3xx static memory controller
Introduce a sysdev for pxa3xx static memory controller, mainly for register saving/restoring in PM Signed-off-by: eric miao <eric.miao@marvell.com> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
- Loading branch information
eric miao
authored and
Russell King
committed
Feb 4, 2008
1 parent
c4d1fb6
commit b1d907f
Showing
2 changed files
with
89 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,88 @@ | ||
/* | ||
* Static Memory Controller | ||
*/ | ||
|
||
#include <linux/module.h> | ||
#include <linux/kernel.h> | ||
#include <linux/init.h> | ||
#include <linux/io.h> | ||
#include <linux/sysdev.h> | ||
|
||
#define SMEMC_PHYS_BASE (0x4A000000) | ||
#define SMEMC_PHYS_SIZE (0x90) | ||
|
||
#define MSC0 (0x08) /* Static Memory Controller Register 0 */ | ||
#define MSC1 (0x0C) /* Static Memory Controller Register 1 */ | ||
#define SXCNFG (0x1C) /* Synchronous Static Memory Control Register */ | ||
#define MEMCLKCFG (0x68) /* Clock Configuration */ | ||
#define CSADRCFG0 (0x80) /* Address Configuration Register for CS0 */ | ||
#define CSADRCFG1 (0x84) /* Address Configuration Register for CS1 */ | ||
#define CSADRCFG2 (0x88) /* Address Configuration Register for CS2 */ | ||
#define CSADRCFG3 (0x8C) /* Address Configuration Register for CS3 */ | ||
|
||
#ifdef CONFIG_PM | ||
static void __iomem *smemc_mmio_base; | ||
|
||
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(smemc_mmio_base + MSC0); | ||
msc[1] = __raw_readl(smemc_mmio_base + MSC1); | ||
sxcnfg = __raw_readl(smemc_mmio_base + SXCNFG); | ||
memclkcfg = __raw_readl(smemc_mmio_base + MEMCLKCFG); | ||
csadrcfg[0] = __raw_readl(smemc_mmio_base + CSADRCFG0); | ||
csadrcfg[1] = __raw_readl(smemc_mmio_base + CSADRCFG1); | ||
csadrcfg[2] = __raw_readl(smemc_mmio_base + CSADRCFG2); | ||
csadrcfg[3] = __raw_readl(smemc_mmio_base + CSADRCFG3); | ||
|
||
return 0; | ||
} | ||
|
||
static int pxa3xx_smemc_resume(struct sys_device *dev) | ||
{ | ||
__raw_writel(msc[0], smemc_mmio_base + MSC0); | ||
__raw_writel(msc[1], smemc_mmio_base + MSC1); | ||
__raw_writel(sxcnfg, smemc_mmio_base + SXCNFG); | ||
__raw_writel(memclkcfg, smemc_mmio_base + MEMCLKCFG); | ||
__raw_writel(csadrcfg[0], smemc_mmio_base + CSADRCFG0); | ||
__raw_writel(csadrcfg[1], smemc_mmio_base + CSADRCFG1); | ||
__raw_writel(csadrcfg[2], smemc_mmio_base + CSADRCFG2); | ||
__raw_writel(csadrcfg[3], smemc_mmio_base + 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()) { | ||
smemc_mmio_base = ioremap(SMEMC_PHYS_BASE, SMEMC_PHYS_SIZE); | ||
if (smemc_mmio_base == NULL) | ||
return -ENODEV; | ||
|
||
ret = sysdev_class_register(&smemc_sysclass); | ||
if (ret) | ||
return ret; | ||
|
||
ret = sysdev_register(&smemc_sysdev); | ||
} | ||
|
||
return ret; | ||
} | ||
subsys_initcall(smemc_init); | ||
#endif |