Skip to content

Commit

Permalink
sh: Add notifiers chains for cpu/board code
Browse files Browse the repository at this point in the history
This patch adds atomic notifier chains for pre/post
sleep events. Useful for cpu code and boards that
need to save and restore register state before and
after entering a sleep mode.

Signed-off-by: Magnus Damm <damm@opensource.se>
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
  • Loading branch information
Magnus Damm authored and Paul Mundt committed Oct 30, 2009
1 parent eb3118f commit 49f4264
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 0 deletions.
11 changes: 11 additions & 0 deletions arch/sh/include/asm/suspend.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#define _ASM_SH_SUSPEND_H

#ifndef __ASSEMBLY__
#include <linux/notifier.h>
static inline int arch_prepare_suspend(void) { return 0; }

#include <asm/ptrace.h>
Expand All @@ -19,6 +20,16 @@ void sh_mobile_setup_cpuidle(void);
static inline void sh_mobile_setup_cpuidle(void) {}
#endif

/* notifier chains for pre/post sleep hooks */
extern struct atomic_notifier_head sh_mobile_pre_sleep_notifier_list;
extern struct atomic_notifier_head sh_mobile_post_sleep_notifier_list;

/* priority levels for notifiers */
#define SH_MOBILE_SLEEP_BOARD 0
#define SH_MOBILE_SLEEP_CPU 1
#define SH_MOBILE_PRE(x) (x)
#define SH_MOBILE_POST(x) (-(x))

#endif

/* flags passed to assembly suspend code */
Expand Down
12 changes: 12 additions & 0 deletions arch/sh/kernel/cpu/shmobile/pm.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,12 @@
#include <asm/suspend.h>
#include <asm/uaccess.h>

/*
* Notifier lists for pre/post sleep notification
*/
ATOMIC_NOTIFIER_HEAD(sh_mobile_pre_sleep_notifier_list);
ATOMIC_NOTIFIER_HEAD(sh_mobile_post_sleep_notifier_list);

/*
* Sleep modes available on SuperH Mobile:
*
Expand Down Expand Up @@ -44,8 +50,14 @@ void sh_mobile_call_standby(unsigned long mode)
void *onchip_mem = (void *)ILRAM_BASE;
void (*standby_onchip_mem)(unsigned long, unsigned long) = onchip_mem;

atomic_notifier_call_chain(&sh_mobile_pre_sleep_notifier_list,
mode, NULL);

/* Let assembly snippet in on-chip memory handle the rest */
standby_onchip_mem(mode, ILRAM_BASE);

atomic_notifier_call_chain(&sh_mobile_post_sleep_notifier_list,
mode, NULL);
}

static int sh_pm_enter(suspend_state_t state)
Expand Down

0 comments on commit 49f4264

Please sign in to comment.