@@ -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;
}