diff options
author | Tomasz Figa <tomasz.figa@gmail.com> | 2014-09-19 14:27:43 -0400 |
---|---|---|
committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2014-09-22 09:57:40 -0400 |
commit | a4a8c2c4962bb655e7152c53a0eb6ca31c47f159 (patch) | |
tree | af36f6e73ca3bd4d653c485d8858e0fcc6b06f2b /arch/arm/mach-exynos | |
parent | 207f1a2d294e3781b56d1acecd48aaa3b4b7b2ad (diff) |
ARM: exynos: Move to generic PM domain DT bindings
This patch moves Exynos PM domain code to use the new generic PM domain
look-up framework introduced in previous patches, thus also allowing
the new code to be compiled with CONFIG_ARCH_EXYNOS.
This patch was originally submitted by Tomasz Figa when he was employed
by Samsung.
Link: http://marc.info/?l=linux-pm&m=139955336002083&w=2
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Reviewed-by: Kevin Hilman <khilman@linaro.org>
Reviewed-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Diffstat (limited to 'arch/arm/mach-exynos')
-rw-r--r-- | arch/arm/mach-exynos/pm_domains.c | 78 |
1 files changed, 1 insertions, 77 deletions
diff --git a/arch/arm/mach-exynos/pm_domains.c b/arch/arm/mach-exynos/pm_domains.c index fd76e1b5a471..20f267121b3e 100644 --- a/arch/arm/mach-exynos/pm_domains.c +++ b/arch/arm/mach-exynos/pm_domains.c | |||
@@ -105,78 +105,6 @@ static int exynos_pd_power_off(struct generic_pm_domain *domain) | |||
105 | return exynos_pd_power(domain, false); | 105 | return exynos_pd_power(domain, false); |
106 | } | 106 | } |
107 | 107 | ||
108 | static void exynos_add_device_to_domain(struct exynos_pm_domain *pd, | ||
109 | struct device *dev) | ||
110 | { | ||
111 | int ret; | ||
112 | |||
113 | dev_dbg(dev, "adding to power domain %s\n", pd->pd.name); | ||
114 | |||
115 | while (1) { | ||
116 | ret = pm_genpd_add_device(&pd->pd, dev); | ||
117 | if (ret != -EAGAIN) | ||
118 | break; | ||
119 | cond_resched(); | ||
120 | } | ||
121 | |||
122 | pm_genpd_dev_need_restore(dev, true); | ||
123 | } | ||
124 | |||
125 | static void exynos_remove_device_from_domain(struct device *dev) | ||
126 | { | ||
127 | struct generic_pm_domain *genpd = dev_to_genpd(dev); | ||
128 | int ret; | ||
129 | |||
130 | dev_dbg(dev, "removing from power domain %s\n", genpd->name); | ||
131 | |||
132 | while (1) { | ||
133 | ret = pm_genpd_remove_device(genpd, dev); | ||
134 | if (ret != -EAGAIN) | ||
135 | break; | ||
136 | cond_resched(); | ||
137 | } | ||
138 | } | ||
139 | |||
140 | static void exynos_read_domain_from_dt(struct device *dev) | ||
141 | { | ||
142 | struct platform_device *pd_pdev; | ||
143 | struct exynos_pm_domain *pd; | ||
144 | struct device_node *node; | ||
145 | |||
146 | node = of_parse_phandle(dev->of_node, "samsung,power-domain", 0); | ||
147 | if (!node) | ||
148 | return; | ||
149 | pd_pdev = of_find_device_by_node(node); | ||
150 | if (!pd_pdev) | ||
151 | return; | ||
152 | pd = platform_get_drvdata(pd_pdev); | ||
153 | exynos_add_device_to_domain(pd, dev); | ||
154 | } | ||
155 | |||
156 | static int exynos_pm_notifier_call(struct notifier_block *nb, | ||
157 | unsigned long event, void *data) | ||
158 | { | ||
159 | struct device *dev = data; | ||
160 | |||
161 | switch (event) { | ||
162 | case BUS_NOTIFY_BIND_DRIVER: | ||
163 | if (dev->of_node) | ||
164 | exynos_read_domain_from_dt(dev); | ||
165 | |||
166 | break; | ||
167 | |||
168 | case BUS_NOTIFY_UNBOUND_DRIVER: | ||
169 | exynos_remove_device_from_domain(dev); | ||
170 | |||
171 | break; | ||
172 | } | ||
173 | return NOTIFY_DONE; | ||
174 | } | ||
175 | |||
176 | static struct notifier_block platform_nb = { | ||
177 | .notifier_call = exynos_pm_notifier_call, | ||
178 | }; | ||
179 | |||
180 | static __init int exynos4_pm_init_power_domain(void) | 108 | static __init int exynos4_pm_init_power_domain(void) |
181 | { | 109 | { |
182 | struct platform_device *pdev; | 110 | struct platform_device *pdev; |
@@ -202,7 +130,6 @@ static __init int exynos4_pm_init_power_domain(void) | |||
202 | pd->base = of_iomap(np, 0); | 130 | pd->base = of_iomap(np, 0); |
203 | pd->pd.power_off = exynos_pd_power_off; | 131 | pd->pd.power_off = exynos_pd_power_off; |
204 | pd->pd.power_on = exynos_pd_power_on; | 132 | pd->pd.power_on = exynos_pd_power_on; |
205 | pd->pd.of_node = np; | ||
206 | 133 | ||
207 | pd->oscclk = clk_get(dev, "oscclk"); | 134 | pd->oscclk = clk_get(dev, "oscclk"); |
208 | if (IS_ERR(pd->oscclk)) | 135 | if (IS_ERR(pd->oscclk)) |
@@ -228,15 +155,12 @@ static __init int exynos4_pm_init_power_domain(void) | |||
228 | clk_put(pd->oscclk); | 155 | clk_put(pd->oscclk); |
229 | 156 | ||
230 | no_clk: | 157 | no_clk: |
231 | platform_set_drvdata(pdev, pd); | ||
232 | |||
233 | on = __raw_readl(pd->base + 0x4) & INT_LOCAL_PWR_EN; | 158 | on = __raw_readl(pd->base + 0x4) & INT_LOCAL_PWR_EN; |
234 | 159 | ||
235 | pm_genpd_init(&pd->pd, NULL, !on); | 160 | pm_genpd_init(&pd->pd, NULL, !on); |
161 | of_genpd_add_provider_simple(np, &pd->pd); | ||
236 | } | 162 | } |
237 | 163 | ||
238 | bus_register_notifier(&platform_bus_type, &platform_nb); | ||
239 | |||
240 | return 0; | 164 | return 0; |
241 | } | 165 | } |
242 | arch_initcall(exynos4_pm_init_power_domain); | 166 | arch_initcall(exynos4_pm_init_power_domain); |