git.openpandora.org
/
pandora-kernel.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge branch 'pm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
[pandora-kernel.git]
/
arch
/
arm
/
mach-shmobile
/
pm-sh7372.c
diff --git
a/arch/arm/mach-shmobile/pm-sh7372.c
b/arch/arm/mach-shmobile/pm-sh7372.c
index
0a5b229
..
34bbcbf
100644
(file)
--- a/
arch/arm/mach-shmobile/pm-sh7372.c
+++ b/
arch/arm/mach-shmobile/pm-sh7372.c
@@
-20,6
+20,7
@@
#include <linux/delay.h>
#include <linux/irq.h>
#include <linux/bitrev.h>
#include <linux/delay.h>
#include <linux/irq.h>
#include <linux/bitrev.h>
+#include <linux/console.h>
#include <asm/system.h>
#include <asm/io.h>
#include <asm/tlbflush.h>
#include <asm/system.h>
#include <asm/io.h>
#include <asm/tlbflush.h>
@@
-106,9
+107,8
@@
static int pd_power_down(struct generic_pm_domain *genpd)
return 0;
}
return 0;
}
-static int
pd_power_up(struct generic_pm_domain *genpd
)
+static int
__pd_power_up(struct sh7372_pm_domain *sh7372_pd, bool do_resume
)
{
{
- struct sh7372_pm_domain *sh7372_pd = to_sh7372_pd(genpd);
unsigned int mask = 1 << sh7372_pd->bit_shift;
unsigned int retry_count;
int ret = 0;
unsigned int mask = 1 << sh7372_pd->bit_shift;
unsigned int retry_count;
int ret = 0;
@@
-123,13
+123,13
@@
static int pd_power_up(struct generic_pm_domain *genpd)
for (retry_count = 2 * PSTR_RETRIES; retry_count; retry_count--) {
if (!(__raw_readl(SWUCR) & mask))
for (retry_count = 2 * PSTR_RETRIES; retry_count; retry_count--) {
if (!(__raw_readl(SWUCR) & mask))
-
goto out
;
+
break
;
if (retry_count > PSTR_RETRIES)
udelay(PSTR_DELAY_US);
else
cpu_relax();
}
if (retry_count > PSTR_RETRIES)
udelay(PSTR_DELAY_US);
else
cpu_relax();
}
- if (
__raw_readl(SWUCR) & mask
)
+ if (
!retry_count
)
ret = -EIO;
if (!sh7372_pd->no_debug)
ret = -EIO;
if (!sh7372_pd->no_debug)
@@
-137,12
+137,17
@@
static int pd_power_up(struct generic_pm_domain *genpd)
mask, __raw_readl(PSTR));
out:
mask, __raw_readl(PSTR));
out:
- if (ret == 0 && sh7372_pd->resume)
+ if (ret == 0 && sh7372_pd->resume
&& do_resume
)
sh7372_pd->resume();
return ret;
}
sh7372_pd->resume();
return ret;
}
+static int pd_power_up(struct generic_pm_domain *genpd)
+{
+ return __pd_power_up(to_sh7372_pd(genpd), true);
+}
+
static void sh7372_a4r_suspend(void)
{
sh7372_intcs_suspend();
static void sh7372_a4r_suspend(void)
{
sh7372_intcs_suspend();
@@
-174,7
+179,7
@@
void sh7372_init_pm_domain(struct sh7372_pm_domain *sh7372_pd)
genpd->active_wakeup = pd_active_wakeup;
genpd->power_off = pd_power_down;
genpd->power_on = pd_power_up;
genpd->active_wakeup = pd_active_wakeup;
genpd->power_off = pd_power_down;
genpd->power_on = pd_power_up;
-
genpd->power_on(&sh7372_pd->genpd
);
+
__pd_power_up(sh7372_pd, false
);
}
void sh7372_add_device_to_domain(struct sh7372_pm_domain *sh7372_pd,
}
void sh7372_add_device_to_domain(struct sh7372_pm_domain *sh7372_pd,
@@
-227,11
+232,23
@@
struct sh7372_pm_domain sh7372_a3sp = {
.no_debug = true,
};
.no_debug = true,
};
+static void sh7372_a3sp_init(void)
+{
+ /* serial consoles make use of SCIF hardware located in A3SP,
+ * keep such power domain on if "no_console_suspend" is set.
+ */
+ sh7372_a3sp.stay_on = !console_suspend_enabled;
+}
+
struct sh7372_pm_domain sh7372_a3sg = {
.bit_shift = 13,
};
struct sh7372_pm_domain sh7372_a3sg = {
.bit_shift = 13,
};
-#endif /* CONFIG_PM */
+#else /* !CONFIG_PM */
+
+static inline void sh7372_a3sp_init(void) {}
+
+#endif /* !CONFIG_PM */
#if defined(CONFIG_SUSPEND) || defined(CONFIG_CPU_IDLE)
static int sh7372_do_idle_core_standby(unsigned long unused)
#if defined(CONFIG_SUSPEND) || defined(CONFIG_CPU_IDLE)
static int sh7372_do_idle_core_standby(unsigned long unused)
@@
-465,6
+482,8
@@
void __init sh7372_pm_init(void)
/* do not convert A3SM, A3SP, A3SG, A4R power down into A4S */
__raw_writel(0, PDNSEL);
/* do not convert A3SM, A3SP, A3SG, A4R power down into A4S */
__raw_writel(0, PDNSEL);
+ sh7372_a3sp_init();
+
sh7372_suspend_init();
sh7372_cpuidle_init();
}
sh7372_suspend_init();
sh7372_cpuidle_init();
}