linux/arch/arm/mach-s3c24xx/pm-s3c2416.c
<<
>>
Prefs
   1/* linux/arch/arm/mach-s3c2416/pm.c
   2 *
   3 * Copyright (c) 2010 Samsung Electronics Co., Ltd.
   4 *              http://www.samsung.com
   5 *
   6 * S3C2416 - PM support (Based on Ben Dooks' S3C2412 PM support)
   7 *
   8 * This program is free software; you can redistribute it and/or modify
   9 * it under the terms of the GNU General Public License version 2 as
  10 * published by the Free Software Foundation.
  11*/
  12
  13#include <linux/device.h>
  14#include <linux/syscore_ops.h>
  15#include <linux/io.h>
  16
  17#include <asm/cacheflush.h>
  18
  19#include <mach/regs-s3c2443-clock.h>
  20
  21#include <plat/cpu.h>
  22#include <plat/pm.h>
  23
  24#include "s3c2412-power.h"
  25
  26#ifdef CONFIG_PM_SLEEP
  27extern void s3c2412_sleep_enter(void);
  28
  29static int s3c2416_cpu_suspend(unsigned long arg)
  30{
  31        /* enable wakeup sources regardless of battery state */
  32        __raw_writel(S3C2443_PWRCFG_SLEEP, S3C2443_PWRCFG);
  33
  34        /* set the mode as sleep, 2BED represents "Go to BED" */
  35        __raw_writel(0x2BED, S3C2443_PWRMODE);
  36
  37        s3c2412_sleep_enter();
  38
  39        pr_info("Failed to suspend the system\n");
  40        return 1; /* Aborting suspend */
  41}
  42
  43static void s3c2416_pm_prepare(void)
  44{
  45        /*
  46         * write the magic value u-boot uses to check for resume into
  47         * the INFORM0 register, and ensure INFORM1 is set to the
  48         * correct address to resume from.
  49         */
  50        __raw_writel(0x2BED, S3C2412_INFORM0);
  51        __raw_writel(virt_to_phys(s3c_cpu_resume), S3C2412_INFORM1);
  52}
  53
  54static int s3c2416_pm_add(struct device *dev, struct subsys_interface *sif)
  55{
  56        pm_cpu_prep = s3c2416_pm_prepare;
  57        pm_cpu_sleep = s3c2416_cpu_suspend;
  58
  59        return 0;
  60}
  61
  62static struct subsys_interface s3c2416_pm_interface = {
  63        .name           = "s3c2416_pm",
  64        .subsys         = &s3c2416_subsys,
  65        .add_dev        = s3c2416_pm_add,
  66};
  67
  68static __init int s3c2416_pm_init(void)
  69{
  70        return subsys_interface_register(&s3c2416_pm_interface);
  71}
  72
  73arch_initcall(s3c2416_pm_init);
  74#endif
  75
  76static void s3c2416_pm_resume(void)
  77{
  78        /* unset the return-from-sleep amd inform flags */
  79        __raw_writel(0x0, S3C2443_PWRMODE);
  80        __raw_writel(0x0, S3C2412_INFORM0);
  81        __raw_writel(0x0, S3C2412_INFORM1);
  82}
  83
  84struct syscore_ops s3c2416_pm_syscore_ops = {
  85        .resume         = s3c2416_pm_resume,
  86};
  87