Logo Search packages:      
Sourcecode: linux-2.6 version File versions

smemc.c

/*
 * 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

Generated by  Doxygen 1.6.0   Back to index