Lines Matching +full:power +full:- +full:supplies
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (c) 2012-2020, The Linux Foundation. All rights reserved.
6 #define pr_fmt(fmt) "[drm-dp] %s: " fmt, __func__
9 #include <linux/clk-provider.h>
20 struct regulator_bulk_data supplies[DP_DEV_REGULATOR_MAX]; member
25 static void dp_power_regulator_disable(struct dp_power_private *power) in dp_power_regulator_disable() argument
27 struct regulator_bulk_data *s = power->supplies; in dp_power_regulator_disable()
28 const struct dp_reg_entry *regs = power->parser->regulator_cfg->regs; in dp_power_regulator_disable()
29 int num = power->parser->regulator_cfg->num; in dp_power_regulator_disable()
33 for (i = num - 1; i >= 0; i--) in dp_power_regulator_disable()
41 static int dp_power_regulator_enable(struct dp_power_private *power) in dp_power_regulator_enable() argument
43 struct regulator_bulk_data *s = power->supplies; in dp_power_regulator_enable()
44 const struct dp_reg_entry *regs = power->parser->regulator_cfg->regs; in dp_power_regulator_enable()
45 int num = power->parser->regulator_cfg->num; in dp_power_regulator_enable()
70 for (i--; i >= 0; i--) in dp_power_regulator_enable()
75 static int dp_power_regulator_init(struct dp_power_private *power) in dp_power_regulator_init() argument
77 struct regulator_bulk_data *s = power->supplies; in dp_power_regulator_init()
78 const struct dp_reg_entry *regs = power->parser->regulator_cfg->regs; in dp_power_regulator_init()
79 struct platform_device *pdev = power->pdev; in dp_power_regulator_init()
80 int num = power->parser->regulator_cfg->num; in dp_power_regulator_init()
86 ret = devm_regulator_bulk_get(&pdev->dev, num, s); in dp_power_regulator_init()
96 static int dp_power_clk_init(struct dp_power_private *power) in dp_power_clk_init() argument
100 struct device *dev = &power->pdev->dev; in dp_power_clk_init()
102 core = &power->parser->mp[DP_CORE_PM]; in dp_power_clk_init()
103 ctrl = &power->parser->mp[DP_CTRL_PM]; in dp_power_clk_init()
104 stream = &power->parser->mp[DP_STREAM_PM]; in dp_power_clk_init()
106 rc = msm_dss_get_clk(dev, core->clk_config, core->num_clk); in dp_power_clk_init()
113 rc = msm_dss_get_clk(dev, ctrl->clk_config, ctrl->num_clk); in dp_power_clk_init()
117 msm_dss_put_clk(core->clk_config, core->num_clk); in dp_power_clk_init()
118 return -ENODEV; in dp_power_clk_init()
121 rc = msm_dss_get_clk(dev, stream->clk_config, stream->num_clk); in dp_power_clk_init()
125 msm_dss_put_clk(core->clk_config, core->num_clk); in dp_power_clk_init()
126 return -ENODEV; in dp_power_clk_init()
132 static int dp_power_clk_deinit(struct dp_power_private *power) in dp_power_clk_deinit() argument
136 core = &power->parser->mp[DP_CORE_PM]; in dp_power_clk_deinit()
137 ctrl = &power->parser->mp[DP_CTRL_PM]; in dp_power_clk_deinit()
138 stream = &power->parser->mp[DP_STREAM_PM]; in dp_power_clk_deinit()
142 return -EINVAL; in dp_power_clk_deinit()
145 msm_dss_put_clk(ctrl->clk_config, ctrl->num_clk); in dp_power_clk_deinit()
146 msm_dss_put_clk(core->clk_config, core->num_clk); in dp_power_clk_deinit()
147 msm_dss_put_clk(stream->clk_config, stream->num_clk); in dp_power_clk_deinit()
151 static int dp_power_clk_set_rate(struct dp_power_private *power, in dp_power_clk_set_rate() argument
155 struct dss_module_power *mp = &power->parser->mp[module]; in dp_power_clk_set_rate()
158 rc = msm_dss_clk_set_rate(mp->clk_config, mp->num_clk); in dp_power_clk_set_rate()
165 rc = msm_dss_enable_clk(mp->clk_config, mp->num_clk, enable); in dp_power_clk_set_rate()
177 return dp_power->core_clks_on; in dp_power_clk_status()
180 return dp_power->link_clks_on; in dp_power_clk_status()
183 return dp_power->stream_clks_on; in dp_power_clk_status()
192 struct dp_power_private *power; in dp_power_clk_enable() local
194 power = container_of(dp_power, struct dp_power_private, dp_power); in dp_power_clk_enable()
198 DRM_ERROR("unsupported power module: %s\n", in dp_power_clk_enable()
200 return -EINVAL; in dp_power_clk_enable()
204 if (pm_type == DP_CORE_PM && dp_power->core_clks_on) { in dp_power_clk_enable()
209 if (pm_type == DP_CTRL_PM && dp_power->link_clks_on) { in dp_power_clk_enable()
214 if (pm_type == DP_STREAM_PM && dp_power->stream_clks_on) { in dp_power_clk_enable()
219 if ((pm_type == DP_CTRL_PM) && (!dp_power->core_clks_on)) { in dp_power_clk_enable()
222 rc = dp_power_clk_set_rate(power, DP_CORE_PM, enable); in dp_power_clk_enable()
228 dp_power->core_clks_on = true; in dp_power_clk_enable()
232 rc = dp_power_clk_set_rate(power, pm_type, enable); in dp_power_clk_enable()
241 dp_power->core_clks_on = enable; in dp_power_clk_enable()
243 dp_power->stream_clks_on = enable; in dp_power_clk_enable()
245 dp_power->link_clks_on = enable; in dp_power_clk_enable()
251 dp_power->stream_clks_on ? "on" : "off", in dp_power_clk_enable()
252 dp_power->link_clks_on ? "on" : "off", in dp_power_clk_enable()
253 dp_power->core_clks_on ? "on" : "off"); in dp_power_clk_enable()
261 struct dp_power_private *power; in dp_power_client_init() local
264 DRM_ERROR("invalid power data\n"); in dp_power_client_init()
265 return -EINVAL; in dp_power_client_init()
268 power = container_of(dp_power, struct dp_power_private, dp_power); in dp_power_client_init()
270 pm_runtime_enable(&power->pdev->dev); in dp_power_client_init()
272 rc = dp_power_regulator_init(power); in dp_power_client_init()
278 rc = dp_power_clk_init(power); in dp_power_client_init()
286 pm_runtime_disable(&power->pdev->dev); in dp_power_client_init()
292 struct dp_power_private *power; in dp_power_client_deinit() local
295 DRM_ERROR("invalid power data\n"); in dp_power_client_deinit()
299 power = container_of(dp_power, struct dp_power_private, dp_power); in dp_power_client_deinit()
301 dp_power_clk_deinit(power); in dp_power_client_deinit()
302 pm_runtime_disable(&power->pdev->dev); in dp_power_client_deinit()
309 struct dp_power_private *power = NULL; in dp_power_init() local
312 DRM_ERROR("invalid power data\n"); in dp_power_init()
313 return -EINVAL; in dp_power_init()
316 power = container_of(dp_power, struct dp_power_private, dp_power); in dp_power_init()
318 pm_runtime_get_sync(&power->pdev->dev); in dp_power_init()
319 rc = dp_power_regulator_enable(power); in dp_power_init()
334 dp_power_regulator_disable(power); in dp_power_init()
336 pm_runtime_put_sync(&power->pdev->dev); in dp_power_init()
342 struct dp_power_private *power; in dp_power_deinit() local
344 power = container_of(dp_power, struct dp_power_private, dp_power); in dp_power_deinit()
347 dp_power_regulator_disable(power); in dp_power_deinit()
348 pm_runtime_put_sync(&power->pdev->dev); in dp_power_deinit()
354 struct dp_power_private *power; in dp_power_get() local
359 return ERR_PTR(-EINVAL); in dp_power_get()
362 power = devm_kzalloc(&parser->pdev->dev, sizeof(*power), GFP_KERNEL); in dp_power_get()
363 if (!power) in dp_power_get()
364 return ERR_PTR(-ENOMEM); in dp_power_get()
366 power->parser = parser; in dp_power_get()
367 power->pdev = parser->pdev; in dp_power_get()
369 dp_power = &power->dp_power; in dp_power_get()