* [PATCH 1/3] ARM: shmobile: R-Mobile: Consolidate rmobile_pd_suspend_*()
2015-01-20 1:27 [GIT PULL] Third Round of Renesas ARM Based SoC Updates for v3.20 Simon Horman
@ 2015-01-20 1:27 ` Simon Horman
2015-01-20 1:27 ` [PATCH 2/3] ARM: shmobile: R-Mobile: Generalize adding/looking up special PM domains Simon Horman
` (2 subsequent siblings)
3 siblings, 0 replies; 6+ messages in thread
From: Simon Horman @ 2015-01-20 1:27 UTC (permalink / raw)
To: linux-arm-kernel
From: Geert Uytterhoeven <geert+renesas@glider.be>
Consolidate the identical rmobile_pd_suspend_*() routines that just
return -EBUSY to prevent a PM domain from being powered down into a
single rmobile_pd_suspend_busy().
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
---
arch/arm/mach-shmobile/pm-rmobile.c | 28 +++++++++++++---------------
1 file changed, 13 insertions(+), 15 deletions(-)
diff --git a/arch/arm/mach-shmobile/pm-rmobile.c b/arch/arm/mach-shmobile/pm-rmobile.c
index 85a7fdd..e1be4b8 100644
--- a/arch/arm/mach-shmobile/pm-rmobile.c
+++ b/arch/arm/mach-shmobile/pm-rmobile.c
@@ -200,11 +200,10 @@ void rmobile_add_devices_to_domains(struct pm_domain_device data[],
#else /* !CONFIG_ARCH_SHMOBILE_LEGACY */
-static int rmobile_pd_suspend_cpu(void)
+static int rmobile_pd_suspend_busy(void)
{
/*
- * This domain contains the CPU core and therefore it should
- * only be turned off if the CPU is not in use.
+ * This domain should not be turned off.
*/
return -EBUSY;
}
@@ -218,16 +217,6 @@ static int rmobile_pd_suspend_console(void)
return console_suspend_enabled ? 0 : -EBUSY;
}
-static int rmobile_pd_suspend_debug(void)
-{
- /*
- * This domain contains the Coresight-ETM hardware block and
- * therefore it should only be turned off if the debug module is
- * not in use.
- */
- return -EBUSY;
-}
-
#define MAX_NUM_CPU_PDS 8
static unsigned int num_cpu_pds __initdata;
@@ -303,17 +292,26 @@ static void __init rmobile_setup_pm_domain(struct device_node *np,
const char *name = pd->genpd.name;
if (pd_contains_cpu(np)) {
+ /*
+ * This domain contains the CPU core and therefore it should
+ * only be turned off if the CPU is not in use.
+ */
pr_debug("PM domain %s contains CPU\n", name);
pd->gov = &pm_domain_always_on_gov;
- pd->suspend = rmobile_pd_suspend_cpu;
+ pd->suspend = rmobile_pd_suspend_busy;
} else if (np == console_pd) {
pr_debug("PM domain %s contains serial console\n", name);
pd->gov = &pm_domain_always_on_gov;
pd->suspend = rmobile_pd_suspend_console;
} else if (np == debug_pd) {
+ /*
+ * This domain contains the Coresight-ETM hardware block and
+ * therefore it should only be turned off if the debug module
+ * is not in use.
+ */
pr_debug("PM domain %s contains Coresight-ETM\n", name);
pd->gov = &pm_domain_always_on_gov;
- pd->suspend = rmobile_pd_suspend_debug;
+ pd->suspend = rmobile_pd_suspend_busy;
}
rmobile_init_pm_domain(pd);
--
2.1.4
^ permalink raw reply related [flat|nested] 6+ messages in thread* [PATCH 2/3] ARM: shmobile: R-Mobile: Generalize adding/looking up special PM domains
2015-01-20 1:27 [GIT PULL] Third Round of Renesas ARM Based SoC Updates for v3.20 Simon Horman
2015-01-20 1:27 ` [PATCH 1/3] ARM: shmobile: R-Mobile: Consolidate rmobile_pd_suspend_*() Simon Horman
@ 2015-01-20 1:27 ` Simon Horman
2015-01-20 1:27 ` [PATCH 3/3] ARM: shmobile: R-Mobile: Special-case PM domains with memory-controllers Simon Horman
2015-01-22 1:33 ` [GIT PULL] Third Round of Renesas ARM Based SoC Updates for v3.20 Olof Johansson
3 siblings, 0 replies; 6+ messages in thread
From: Simon Horman @ 2015-01-20 1:27 UTC (permalink / raw)
To: linux-arm-kernel
From: Geert Uytterhoeven <geert+renesas@glider.be>
Make adding special PM domains to an array, and looking them up
later, more generic, so it can be used for all special hardware blocks.
The type of PM domain is also stored, so rmobile_setup_pm_domain() can
use a switch() statement instead of a chain of if/else statements.
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
---
arch/arm/mach-shmobile/pm-rmobile.c | 102 ++++++++++++++++++++++--------------
1 file changed, 63 insertions(+), 39 deletions(-)
diff --git a/arch/arm/mach-shmobile/pm-rmobile.c b/arch/arm/mach-shmobile/pm-rmobile.c
index e1be4b8..e4c3f7d 100644
--- a/arch/arm/mach-shmobile/pm-rmobile.c
+++ b/arch/arm/mach-shmobile/pm-rmobile.c
@@ -217,50 +217,67 @@ static int rmobile_pd_suspend_console(void)
return console_suspend_enabled ? 0 : -EBUSY;
}
-#define MAX_NUM_CPU_PDS 8
+enum pd_types {
+ PD_NORMAL,
+ PD_CPU,
+ PD_CONSOLE,
+ PD_DEBUG,
+};
-static unsigned int num_cpu_pds __initdata;
-static struct device_node *cpu_pds[MAX_NUM_CPU_PDS] __initdata;
-static struct device_node *console_pd __initdata;
-static struct device_node *debug_pd __initdata;
+#define MAX_NUM_SPECIAL_PDS 16
-static void __init get_special_pds(void)
-{
- struct device_node *np, *pd;
- unsigned int i;
+static struct special_pd {
+ struct device_node *pd;
+ enum pd_types type;
+} special_pds[MAX_NUM_SPECIAL_PDS] __initdata;
- /* PM domains containing CPUs */
- for_each_node_by_type(np, "cpu") {
- pd = of_parse_phandle(np, "power-domains", 0);
- if (!pd)
- continue;
+static unsigned int num_special_pds __initdata;
- for (i = 0; i < num_cpu_pds; i++)
- if (pd == cpu_pds[i])
- break;
+static void __init add_special_pd(struct device_node *np, enum pd_types type)
+{
+ unsigned int i;
+ struct device_node *pd;
- if (i < num_cpu_pds) {
- of_node_put(pd);
- continue;
- }
+ pd = of_parse_phandle(np, "power-domains", 0);
+ if (!pd)
+ return;
- if (num_cpu_pds == MAX_NUM_CPU_PDS) {
- pr_warn("Too many CPU PM domains\n");
+ for (i = 0; i < num_special_pds; i++)
+ if (pd == special_pds[i].pd && type == special_pds[i].type) {
of_node_put(pd);
- continue;
+ return;
}
- cpu_pds[num_cpu_pds++] = pd;
+ if (num_special_pds == ARRAY_SIZE(special_pds)) {
+ pr_warn("Too many special PM domains\n");
+ of_node_put(pd);
+ return;
}
+ pr_debug("Special PM domain %s type %d for %s\n", pd->name, type,
+ np->full_name);
+
+ special_pds[num_special_pds].pd = pd;
+ special_pds[num_special_pds].type = type;
+ num_special_pds++;
+}
+
+static void __init get_special_pds(void)
+{
+ struct device_node *np;
+
+ /* PM domains containing CPUs */
+ for_each_node_by_type(np, "cpu")
+ add_special_pd(np, PD_CPU);
+
/* PM domain containing console */
if (of_stdout)
- console_pd = of_parse_phandle(of_stdout, "power-domains", 0);
+ add_special_pd(of_stdout, PD_CONSOLE);
/* PM domain containing Coresight-ETM */
np = of_find_compatible_node(NULL, NULL, "arm,coresight-etm3x");
if (np) {
- debug_pd = of_parse_phandle(np, "power-domains", 0);
+ add_special_pd(np, PD_DEBUG);
of_node_put(np);
}
}
@@ -269,21 +286,19 @@ static void __init put_special_pds(void)
{
unsigned int i;
- for (i = 0; i < num_cpu_pds; i++)
- of_node_put(cpu_pds[i]);
- of_node_put(console_pd);
- of_node_put(debug_pd);
+ for (i = 0; i < num_special_pds; i++)
+ of_node_put(special_pds[i].pd);
}
-static bool __init pd_contains_cpu(const struct device_node *pd)
+static enum pd_types __init pd_type(const struct device_node *pd)
{
unsigned int i;
- for (i = 0; i < num_cpu_pds; i++)
- if (pd == cpu_pds[i])
- return true;
+ for (i = 0; i < num_special_pds; i++)
+ if (pd == special_pds[i].pd)
+ return special_pds[i].type;
- return false;
+ return PD_NORMAL;
}
static void __init rmobile_setup_pm_domain(struct device_node *np,
@@ -291,7 +306,8 @@ static void __init rmobile_setup_pm_domain(struct device_node *np,
{
const char *name = pd->genpd.name;
- if (pd_contains_cpu(np)) {
+ switch (pd_type(np)) {
+ case PD_CPU:
/*
* This domain contains the CPU core and therefore it should
* only be turned off if the CPU is not in use.
@@ -299,11 +315,15 @@ static void __init rmobile_setup_pm_domain(struct device_node *np,
pr_debug("PM domain %s contains CPU\n", name);
pd->gov = &pm_domain_always_on_gov;
pd->suspend = rmobile_pd_suspend_busy;
- } else if (np == console_pd) {
+ break;
+
+ case PD_CONSOLE:
pr_debug("PM domain %s contains serial console\n", name);
pd->gov = &pm_domain_always_on_gov;
pd->suspend = rmobile_pd_suspend_console;
- } else if (np == debug_pd) {
+ break;
+
+ case PD_DEBUG:
/*
* This domain contains the Coresight-ETM hardware block and
* therefore it should only be turned off if the debug module
@@ -312,6 +332,10 @@ static void __init rmobile_setup_pm_domain(struct device_node *np,
pr_debug("PM domain %s contains Coresight-ETM\n", name);
pd->gov = &pm_domain_always_on_gov;
pd->suspend = rmobile_pd_suspend_busy;
+ break;
+
+ case PD_NORMAL:
+ break;
}
rmobile_init_pm_domain(pd);
--
2.1.4
^ permalink raw reply related [flat|nested] 6+ messages in thread* [PATCH 3/3] ARM: shmobile: R-Mobile: Special-case PM domains with memory-controllers
2015-01-20 1:27 [GIT PULL] Third Round of Renesas ARM Based SoC Updates for v3.20 Simon Horman
2015-01-20 1:27 ` [PATCH 1/3] ARM: shmobile: R-Mobile: Consolidate rmobile_pd_suspend_*() Simon Horman
2015-01-20 1:27 ` [PATCH 2/3] ARM: shmobile: R-Mobile: Generalize adding/looking up special PM domains Simon Horman
@ 2015-01-20 1:27 ` Simon Horman
2015-01-22 1:33 ` [GIT PULL] Third Round of Renesas ARM Based SoC Updates for v3.20 Olof Johansson
3 siblings, 0 replies; 6+ messages in thread
From: Simon Horman @ 2015-01-20 1:27 UTC (permalink / raw)
To: linux-arm-kernel
From: Geert Uytterhoeven <geert+renesas@glider.be>
Add a special case for PM domains containing a memory-controller.
Such a PM domain must not be turned off if memory is in use.
On sh73a0 PM domains A4BC0 and A4BC1 each contain an SDRAM Bus State
Controller (SBSC). On r8a73a4 PM domain A3BC contains two DDR Bus
Controllers (DBSC). In both cases, there are no other devices in these
PM domains, so they were eligible for power down, crashing the system.
On r8a7740 the DDR3 Bus State Controller (DBSC3) is located in A4S,
whose child domain A3SM contains the CPU core. Hence A4S is never turned
off, and no crash happened.
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
---
arch/arm/mach-shmobile/pm-rmobile.c | 29 +++++++++++++++++++++++------
1 file changed, 23 insertions(+), 6 deletions(-)
diff --git a/arch/arm/mach-shmobile/pm-rmobile.c b/arch/arm/mach-shmobile/pm-rmobile.c
index e4c3f7d..9501820 100644
--- a/arch/arm/mach-shmobile/pm-rmobile.c
+++ b/arch/arm/mach-shmobile/pm-rmobile.c
@@ -222,6 +222,7 @@ enum pd_types {
PD_CPU,
PD_CONSOLE,
PD_DEBUG,
+ PD_MEMCTL,
};
#define MAX_NUM_SPECIAL_PDS 16
@@ -233,6 +234,14 @@ static struct special_pd {
static unsigned int num_special_pds __initdata;
+static const struct of_device_id special_ids[] __initconst = {
+ { .compatible = "arm,coresight-etm3x", .data = (void *)PD_DEBUG },
+ { .compatible = "renesas,dbsc-r8a73a4", .data = (void *)PD_MEMCTL, },
+ { .compatible = "renesas,dbsc3-r8a7740", .data = (void *)PD_MEMCTL, },
+ { .compatible = "renesas,sbsc-sh73a0", .data = (void *)PD_MEMCTL, },
+ { /* sentinel */ },
+};
+
static void __init add_special_pd(struct device_node *np, enum pd_types type)
{
unsigned int i;
@@ -265,6 +274,7 @@ static void __init add_special_pd(struct device_node *np, enum pd_types type)
static void __init get_special_pds(void)
{
struct device_node *np;
+ const struct of_device_id *id;
/* PM domains containing CPUs */
for_each_node_by_type(np, "cpu")
@@ -274,12 +284,9 @@ static void __init get_special_pds(void)
if (of_stdout)
add_special_pd(of_stdout, PD_CONSOLE);
- /* PM domain containing Coresight-ETM */
- np = of_find_compatible_node(NULL, NULL, "arm,coresight-etm3x");
- if (np) {
- add_special_pd(np, PD_DEBUG);
- of_node_put(np);
- }
+ /* PM domains containing other special devices */
+ for_each_matching_node_and_match(np, special_ids, &id)
+ add_special_pd(np, (enum pd_types)id->data);
}
static void __init put_special_pds(void)
@@ -334,6 +341,16 @@ static void __init rmobile_setup_pm_domain(struct device_node *np,
pd->suspend = rmobile_pd_suspend_busy;
break;
+ case PD_MEMCTL:
+ /*
+ * This domain contains a memory-controller and therefore it
+ * should only be turned off if memory is not in use.
+ */
+ pr_debug("PM domain %s contains MEMCTL\n", name);
+ pd->gov = &pm_domain_always_on_gov;
+ pd->suspend = rmobile_pd_suspend_busy;
+ break;
+
case PD_NORMAL:
break;
}
--
2.1.4
^ permalink raw reply related [flat|nested] 6+ messages in thread* [GIT PULL] Third Round of Renesas ARM Based SoC Updates for v3.20
2015-01-20 1:27 [GIT PULL] Third Round of Renesas ARM Based SoC Updates for v3.20 Simon Horman
` (2 preceding siblings ...)
2015-01-20 1:27 ` [PATCH 3/3] ARM: shmobile: R-Mobile: Special-case PM domains with memory-controllers Simon Horman
@ 2015-01-22 1:33 ` Olof Johansson
2015-01-22 2:04 ` Simon Horman
3 siblings, 1 reply; 6+ messages in thread
From: Olof Johansson @ 2015-01-22 1:33 UTC (permalink / raw)
To: linux-arm-kernel
On Tue, Jan 20, 2015 at 10:27:08AM +0900, Simon Horman wrote:
> Hi Olof, Hi Kevin, Hi Arnd,
>
> Please consider these third round of Renesas ARM based SoC updates for v3.20.
>
> This pull request is based on the previous round of
> such requests, tagged as renesas-soc2-for-v3.20,
> which I have already sent a pull-request for.
>
>
> The following changes since commit 2173fc7cb681c38b9e5bc526211045caecf96e44:
>
> ARM: shmobile: R-Mobile: Add DT support for PM domains (2015-01-15 08:38:14 +0900)
>
> are available in the git repository at:
>
> git://git.kernel.org/pub/scm/linux/kernel/git/horms/renesas.git tags/renesas-soc3-for-v3.20
>
> for you to fetch changes up to 1632ff162f305f38667632c465e4bfaab8ef87a2:
>
> ARM: shmobile: R-Mobile: Special-case PM domains with memory-controllers (2015-01-16 11:02:42 +0900)
Simon,
Doing each merge of a pull request is an amount of work from us. You sent
a preceding pull request for the soc branch just three days before this one.
Can you try to reduce the frequency of how often you drain the queue
of pending patches, perhaps? I know there's a balance to be had between
merge early-merge often and getting more aggregated, but I wonder if it
can be tuned back a bit to avoid flooding us.
Maybe a good balance would be wait to send the next pull request of a
branch until the previous one has been taken care of.
That being said: Merged.
Thanks,
-Olof
^ permalink raw reply [flat|nested] 6+ messages in thread* [GIT PULL] Third Round of Renesas ARM Based SoC Updates for v3.20
2015-01-22 1:33 ` [GIT PULL] Third Round of Renesas ARM Based SoC Updates for v3.20 Olof Johansson
@ 2015-01-22 2:04 ` Simon Horman
0 siblings, 0 replies; 6+ messages in thread
From: Simon Horman @ 2015-01-22 2:04 UTC (permalink / raw)
To: linux-arm-kernel
On Wed, Jan 21, 2015 at 05:33:01PM -0800, Olof Johansson wrote:
> On Tue, Jan 20, 2015 at 10:27:08AM +0900, Simon Horman wrote:
> > Hi Olof, Hi Kevin, Hi Arnd,
> >
> > Please consider these third round of Renesas ARM based SoC updates for v3.20.
> >
> > This pull request is based on the previous round of
> > such requests, tagged as renesas-soc2-for-v3.20,
> > which I have already sent a pull-request for.
> >
> >
> > The following changes since commit 2173fc7cb681c38b9e5bc526211045caecf96e44:
> >
> > ARM: shmobile: R-Mobile: Add DT support for PM domains (2015-01-15 08:38:14 +0900)
> >
> > are available in the git repository at:
> >
> > git://git.kernel.org/pub/scm/linux/kernel/git/horms/renesas.git tags/renesas-soc3-for-v3.20
> >
> > for you to fetch changes up to 1632ff162f305f38667632c465e4bfaab8ef87a2:
> >
> > ARM: shmobile: R-Mobile: Special-case PM domains with memory-controllers (2015-01-16 11:02:42 +0900)
>
> Simon,
>
> Doing each merge of a pull request is an amount of work from us. You sent
> a preceding pull request for the soc branch just three days before this one.
>
> Can you try to reduce the frequency of how often you drain the queue
> of pending patches, perhaps? I know there's a balance to be had between
> merge early-merge often and getting more aggregated, but I wonder if it
> can be tuned back a bit to avoid flooding us.
>
> Maybe a good balance would be wait to send the next pull request of a
> branch until the previous one has been taken care of.
Thanks, I will try to find a better balance.
> That being said: Merged.
Thanks.
^ permalink raw reply [flat|nested] 6+ messages in thread