Lines Matching +full:power +full:- +full:domain +full:- +full:node

1 // SPDX-License-Identifier: GPL-2.0
3 // Exynos Generic power domain support.
8 // Implementation of Exynos specific power domain control which is used in
9 // conjunction with runtime-pm. Support for both device-tree and non-device-tree
10 // based power domain support is included.
23 /* Value for LOCAL_PWR_CFG and STATUS fields for each domain */
28 * Exynos specific wrapper around the generic power domain
36 static int exynos_pd_power(struct generic_pm_domain *domain, bool power_on) in exynos_pd_power() argument
43 pd = container_of(domain, struct exynos_pm_domain, pd); in exynos_pd_power()
44 base = pd->base; in exynos_pd_power()
46 pwr = power_on ? pd->local_pwr_cfg : 0; in exynos_pd_power()
52 while ((readl_relaxed(base + 0x4) & pd->local_pwr_cfg) != pwr) { in exynos_pd_power()
55 pr_err("Power domain %s %s failed\n", domain->name, op); in exynos_pd_power()
56 return -ETIMEDOUT; in exynos_pd_power()
58 timeout--; in exynos_pd_power()
66 static int exynos_pd_power_on(struct generic_pm_domain *domain) in exynos_pd_power_on() argument
68 return exynos_pd_power(domain, true); in exynos_pd_power_on()
71 static int exynos_pd_power_off(struct generic_pm_domain *domain) in exynos_pd_power_off() argument
73 return exynos_pd_power(domain, false); in exynos_pd_power_off()
86 .compatible = "samsung,exynos4210-pd",
89 .compatible = "samsung,exynos5433-pd",
95 static const char *exynos_get_domain_name(struct device_node *node) in exynos_get_domain_name() argument
99 if (of_property_read_string(node, "label", &name) < 0) in exynos_get_domain_name()
100 name = kbasename(node->full_name); in exynos_get_domain_name()
107 struct device *dev = &pdev->dev; in exynos_pd_probe()
108 struct device_node *np = dev->of_node; in exynos_pd_probe()
116 return -ENOMEM; in exynos_pd_probe()
118 pd->pd.name = exynos_get_domain_name(np); in exynos_pd_probe()
119 if (!pd->pd.name) in exynos_pd_probe()
120 return -ENOMEM; in exynos_pd_probe()
122 pd->base = of_iomap(np, 0); in exynos_pd_probe()
123 if (!pd->base) { in exynos_pd_probe()
124 kfree_const(pd->pd.name); in exynos_pd_probe()
125 return -ENODEV; in exynos_pd_probe()
128 pd->pd.power_off = exynos_pd_power_off; in exynos_pd_probe()
129 pd->pd.power_on = exynos_pd_power_on; in exynos_pd_probe()
130 pd->local_pwr_cfg = pm_domain_cfg->local_pwr_cfg; in exynos_pd_probe()
132 on = readl_relaxed(pd->base + 0x4) & pd->local_pwr_cfg; in exynos_pd_probe()
134 pm_genpd_init(&pd->pd, NULL, !on); in exynos_pd_probe()
135 ret = of_genpd_add_provider_simple(np, &pd->pd); in exynos_pd_probe()
137 if (ret == 0 && of_parse_phandle_with_args(np, "power-domains", in exynos_pd_probe()
138 "#power-domain-cells", 0, &parent) == 0) { in exynos_pd_probe()
157 .name = "exynos-pd",