Lines Matching refs:pfdev
20 static int panfrost_reset_init(struct panfrost_device *pfdev) in panfrost_reset_init() argument
22 pfdev->rstc = devm_reset_control_array_get_optional_exclusive(pfdev->dev); in panfrost_reset_init()
23 if (IS_ERR(pfdev->rstc)) { in panfrost_reset_init()
24 dev_err(pfdev->dev, "get reset failed %ld\n", PTR_ERR(pfdev->rstc)); in panfrost_reset_init()
25 return PTR_ERR(pfdev->rstc); in panfrost_reset_init()
28 return reset_control_deassert(pfdev->rstc); in panfrost_reset_init()
31 static void panfrost_reset_fini(struct panfrost_device *pfdev) in panfrost_reset_fini() argument
33 reset_control_assert(pfdev->rstc); in panfrost_reset_fini()
36 static int panfrost_clk_init(struct panfrost_device *pfdev) in panfrost_clk_init() argument
41 pfdev->clock = devm_clk_get(pfdev->dev, NULL); in panfrost_clk_init()
42 if (IS_ERR(pfdev->clock)) { in panfrost_clk_init()
43 dev_err(pfdev->dev, "get clock failed %ld\n", PTR_ERR(pfdev->clock)); in panfrost_clk_init()
44 return PTR_ERR(pfdev->clock); in panfrost_clk_init()
47 rate = clk_get_rate(pfdev->clock); in panfrost_clk_init()
48 dev_info(pfdev->dev, "clock rate = %lu\n", rate); in panfrost_clk_init()
50 err = clk_prepare_enable(pfdev->clock); in panfrost_clk_init()
54 pfdev->bus_clock = devm_clk_get_optional(pfdev->dev, "bus"); in panfrost_clk_init()
55 if (IS_ERR(pfdev->bus_clock)) { in panfrost_clk_init()
56 dev_err(pfdev->dev, "get bus_clock failed %ld\n", in panfrost_clk_init()
57 PTR_ERR(pfdev->bus_clock)); in panfrost_clk_init()
58 err = PTR_ERR(pfdev->bus_clock); in panfrost_clk_init()
62 if (pfdev->bus_clock) { in panfrost_clk_init()
63 rate = clk_get_rate(pfdev->bus_clock); in panfrost_clk_init()
64 dev_info(pfdev->dev, "bus_clock rate = %lu\n", rate); in panfrost_clk_init()
66 err = clk_prepare_enable(pfdev->bus_clock); in panfrost_clk_init()
74 clk_disable_unprepare(pfdev->clock); in panfrost_clk_init()
79 static void panfrost_clk_fini(struct panfrost_device *pfdev) in panfrost_clk_fini() argument
81 clk_disable_unprepare(pfdev->bus_clock); in panfrost_clk_fini()
82 clk_disable_unprepare(pfdev->clock); in panfrost_clk_fini()
85 static int panfrost_regulator_init(struct panfrost_device *pfdev) in panfrost_regulator_init() argument
89 pfdev->regulators = devm_kcalloc(pfdev->dev, pfdev->comp->num_supplies, in panfrost_regulator_init()
90 sizeof(*pfdev->regulators), in panfrost_regulator_init()
92 if (!pfdev->regulators) in panfrost_regulator_init()
95 for (i = 0; i < pfdev->comp->num_supplies; i++) in panfrost_regulator_init()
96 pfdev->regulators[i].supply = pfdev->comp->supply_names[i]; in panfrost_regulator_init()
98 ret = devm_regulator_bulk_get(pfdev->dev, in panfrost_regulator_init()
99 pfdev->comp->num_supplies, in panfrost_regulator_init()
100 pfdev->regulators); in panfrost_regulator_init()
103 dev_err(pfdev->dev, "failed to get regulators: %d\n", in panfrost_regulator_init()
108 ret = regulator_bulk_enable(pfdev->comp->num_supplies, in panfrost_regulator_init()
109 pfdev->regulators); in panfrost_regulator_init()
111 dev_err(pfdev->dev, "failed to enable regulators: %d\n", ret); in panfrost_regulator_init()
118 static void panfrost_regulator_fini(struct panfrost_device *pfdev) in panfrost_regulator_fini() argument
120 if (!pfdev->regulators) in panfrost_regulator_fini()
123 regulator_bulk_disable(pfdev->comp->num_supplies, pfdev->regulators); in panfrost_regulator_fini()
126 static void panfrost_pm_domain_fini(struct panfrost_device *pfdev) in panfrost_pm_domain_fini() argument
130 for (i = 0; i < ARRAY_SIZE(pfdev->pm_domain_devs); i++) { in panfrost_pm_domain_fini()
131 if (!pfdev->pm_domain_devs[i]) in panfrost_pm_domain_fini()
134 if (pfdev->pm_domain_links[i]) in panfrost_pm_domain_fini()
135 device_link_del(pfdev->pm_domain_links[i]); in panfrost_pm_domain_fini()
137 dev_pm_domain_detach(pfdev->pm_domain_devs[i], true); in panfrost_pm_domain_fini()
141 static int panfrost_pm_domain_init(struct panfrost_device *pfdev) in panfrost_pm_domain_init() argument
146 num_domains = of_count_phandle_with_args(pfdev->dev->of_node, in panfrost_pm_domain_init()
154 if (num_domains < 2 && pfdev->comp->num_pm_domains < 2) in panfrost_pm_domain_init()
157 if (num_domains != pfdev->comp->num_pm_domains) { in panfrost_pm_domain_init()
158 dev_err(pfdev->dev, in panfrost_pm_domain_init()
160 num_domains, pfdev->comp->num_pm_domains); in panfrost_pm_domain_init()
164 if (WARN(num_domains > ARRAY_SIZE(pfdev->pm_domain_devs), in panfrost_pm_domain_init()
169 pfdev->pm_domain_devs[i] = in panfrost_pm_domain_init()
170 dev_pm_domain_attach_by_name(pfdev->dev, in panfrost_pm_domain_init()
171 pfdev->comp->pm_domain_names[i]); in panfrost_pm_domain_init()
172 if (IS_ERR_OR_NULL(pfdev->pm_domain_devs[i])) { in panfrost_pm_domain_init()
173 err = PTR_ERR(pfdev->pm_domain_devs[i]) ? : -ENODATA; in panfrost_pm_domain_init()
174 pfdev->pm_domain_devs[i] = NULL; in panfrost_pm_domain_init()
175 dev_err(pfdev->dev, in panfrost_pm_domain_init()
177 pfdev->comp->pm_domain_names[i], i, err); in panfrost_pm_domain_init()
181 pfdev->pm_domain_links[i] = device_link_add(pfdev->dev, in panfrost_pm_domain_init()
182 pfdev->pm_domain_devs[i], DL_FLAG_PM_RUNTIME | in panfrost_pm_domain_init()
184 if (!pfdev->pm_domain_links[i]) { in panfrost_pm_domain_init()
185 dev_err(pfdev->pm_domain_devs[i], in panfrost_pm_domain_init()
195 panfrost_pm_domain_fini(pfdev); in panfrost_pm_domain_init()
199 int panfrost_device_init(struct panfrost_device *pfdev) in panfrost_device_init() argument
203 mutex_init(&pfdev->sched_lock); in panfrost_device_init()
204 INIT_LIST_HEAD(&pfdev->scheduled_jobs); in panfrost_device_init()
205 INIT_LIST_HEAD(&pfdev->as_lru_list); in panfrost_device_init()
207 spin_lock_init(&pfdev->as_lock); in panfrost_device_init()
209 err = panfrost_clk_init(pfdev); in panfrost_device_init()
211 dev_err(pfdev->dev, "clk init failed %d\n", err); in panfrost_device_init()
215 err = panfrost_devfreq_init(pfdev); in panfrost_device_init()
218 dev_err(pfdev->dev, "devfreq init failed %d\n", err); in panfrost_device_init()
223 if (!pfdev->pfdevfreq.opp_of_table_added) { in panfrost_device_init()
224 err = panfrost_regulator_init(pfdev); in panfrost_device_init()
229 err = panfrost_reset_init(pfdev); in panfrost_device_init()
231 dev_err(pfdev->dev, "reset init failed %d\n", err); in panfrost_device_init()
235 err = panfrost_pm_domain_init(pfdev); in panfrost_device_init()
239 pfdev->iomem = devm_platform_ioremap_resource(pfdev->pdev, 0); in panfrost_device_init()
240 if (IS_ERR(pfdev->iomem)) { in panfrost_device_init()
241 err = PTR_ERR(pfdev->iomem); in panfrost_device_init()
245 err = panfrost_gpu_init(pfdev); in panfrost_device_init()
249 err = panfrost_mmu_init(pfdev); in panfrost_device_init()
253 err = panfrost_job_init(pfdev); in panfrost_device_init()
257 err = panfrost_perfcnt_init(pfdev); in panfrost_device_init()
263 panfrost_job_fini(pfdev); in panfrost_device_init()
265 panfrost_mmu_fini(pfdev); in panfrost_device_init()
267 panfrost_gpu_fini(pfdev); in panfrost_device_init()
269 panfrost_pm_domain_fini(pfdev); in panfrost_device_init()
271 panfrost_reset_fini(pfdev); in panfrost_device_init()
273 panfrost_regulator_fini(pfdev); in panfrost_device_init()
275 panfrost_devfreq_fini(pfdev); in panfrost_device_init()
277 panfrost_clk_fini(pfdev); in panfrost_device_init()
281 void panfrost_device_fini(struct panfrost_device *pfdev) in panfrost_device_fini() argument
283 panfrost_perfcnt_fini(pfdev); in panfrost_device_fini()
284 panfrost_job_fini(pfdev); in panfrost_device_fini()
285 panfrost_mmu_fini(pfdev); in panfrost_device_fini()
286 panfrost_gpu_fini(pfdev); in panfrost_device_fini()
287 panfrost_pm_domain_fini(pfdev); in panfrost_device_fini()
288 panfrost_reset_fini(pfdev); in panfrost_device_fini()
289 panfrost_devfreq_fini(pfdev); in panfrost_device_fini()
290 panfrost_regulator_fini(pfdev); in panfrost_device_fini()
291 panfrost_clk_fini(pfdev); in panfrost_device_fini()
381 bool panfrost_exception_needs_reset(const struct panfrost_device *pfdev, in panfrost_exception_needs_reset() argument
388 return panfrost_has_hw_issue(pfdev, HW_ISSUE_TTRX_3076); in panfrost_exception_needs_reset()
394 void panfrost_device_reset(struct panfrost_device *pfdev) in panfrost_device_reset() argument
396 panfrost_gpu_soft_reset(pfdev); in panfrost_device_reset()
398 panfrost_gpu_power_on(pfdev); in panfrost_device_reset()
399 panfrost_mmu_reset(pfdev); in panfrost_device_reset()
400 panfrost_job_enable_interrupts(pfdev); in panfrost_device_reset()
406 struct panfrost_device *pfdev = dev_get_drvdata(dev); in panfrost_device_resume() local
408 panfrost_device_reset(pfdev); in panfrost_device_resume()
409 panfrost_devfreq_resume(pfdev); in panfrost_device_resume()
416 struct panfrost_device *pfdev = dev_get_drvdata(dev); in panfrost_device_suspend() local
418 if (!panfrost_job_is_idle(pfdev)) in panfrost_device_suspend()
421 panfrost_devfreq_suspend(pfdev); in panfrost_device_suspend()
422 panfrost_gpu_power_off(pfdev); in panfrost_device_suspend()