linux/arch/arm/mach-s3c2416/pm.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/sysdev.h>
  14#include <linux/syscore_ops.h>
  15#include <linux/io.h>
  16
  17#include <asm/cacheflush.h>
  18
  19#include <mach/regs-power.h>
  20#include <mach/regs-s3c2443-clock.h>
  21
  22#include <plat/cpu.h>
  23#include <plat/pm.h>
  24
  25extern void s3c2412_sleep_enter(void);
  26
  27static int s3c2416_cpu_suspend(unsigned long arg)
  28{
  29        /* enable wakeup sources regardless of battery state */
  30        __raw_writel(S3C2443_PWRCFG_SLEEP, S3C2443_PWRCFG);
  31
  32        /* set the mode as sleep, 2BED represents "Go to BED" */
  33        __raw_writel(0x2BED, S3C2443_PWRMODE);
  34
  35        s3c2412_sleep_enter();
  36
  37        panic("sleep resumed to originator?");
  38}
  39
  40static void s3c2416_pm_prepare(void)
  41{
  42        /*
  43         * write the magic value u-boot uses to check for resume into
  44         * the INFORM0 register, and ensure INFORM1 is set to the
  45         * correct address to resume from.
  46         */
  47        __raw_writel(0x2BED, S3C2412_INFORM0);
  48        __raw_writel(virt_to_phys(s3c_cpu_resume), S3C2412_INFORM1);
  49}
  50
  51static int s3c2416_pm_add(struct sys_device *sysdev)
  52{
  53        pm_cpu_prep = s3c2416_pm_prepare;
  54        pm_cpu_sleep = s3c2416_cpu_suspend;
  55
  56        return 0;
  57}
  58
  59static struct sysdev_driver s3c2416_pm_driver = {
  60        .add            = s3c2416_pm_add,
  61};
  62
  63static __init int s3c2416_pm_init(void)
  64{
  65        return sysdev_driver_register(&s3c2416_sysclass, &s3c2416_pm_driver);
  66}
  67
  68arch_initcall(s3c2416_pm_init);
  69
  70
  71static void s3c2416_pm_resume(void)
  72{
  73        /* unset the return-from-sleep amd inform flags */
  74        __raw_writel(0x0, S3C2443_PWRMODE);
  75        __raw_writel(0x0, S3C2412_INFORM0);
  76        __raw_writel(0x0, S3C2412_INFORM1);
  77}
  78
  79struct syscore_ops s3c2416_pm_syscore_ops = {
  80        .resume         = s3c2416_pm_resume,
  81};
  82
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.