Lines Matching refs:pfdev
19 static int panfrost_reset_init(struct panfrost_device *pfdev) in panfrost_reset_init() argument
21 pfdev->rstc = devm_reset_control_array_get_optional_exclusive(pfdev->dev); in panfrost_reset_init()
22 if (IS_ERR(pfdev->rstc)) { in panfrost_reset_init()
23 dev_err(pfdev->dev, "get reset failed %ld\n", PTR_ERR(pfdev->rstc)); in panfrost_reset_init()
24 return PTR_ERR(pfdev->rstc); in panfrost_reset_init()
27 return reset_control_deassert(pfdev->rstc); in panfrost_reset_init()
30 static void panfrost_reset_fini(struct panfrost_device *pfdev) in panfrost_reset_fini() argument
32 reset_control_assert(pfdev->rstc); in panfrost_reset_fini()
35 static int panfrost_clk_init(struct panfrost_device *pfdev) in panfrost_clk_init() argument
40 pfdev->clock = devm_clk_get(pfdev->dev, NULL); in panfrost_clk_init()
41 if (IS_ERR(pfdev->clock)) { in panfrost_clk_init()
42 dev_err(pfdev->dev, "get clock failed %ld\n", PTR_ERR(pfdev->clock)); in panfrost_clk_init()
43 return PTR_ERR(pfdev->clock); in panfrost_clk_init()
46 rate = clk_get_rate(pfdev->clock); in panfrost_clk_init()
47 dev_info(pfdev->dev, "clock rate = %lu\n", rate); in panfrost_clk_init()
49 err = clk_prepare_enable(pfdev->clock); in panfrost_clk_init()
53 pfdev->bus_clock = devm_clk_get_optional(pfdev->dev, "bus"); in panfrost_clk_init()
54 if (IS_ERR(pfdev->bus_clock)) { in panfrost_clk_init()
55 dev_err(pfdev->dev, "get bus_clock failed %ld\n", in panfrost_clk_init()
56 PTR_ERR(pfdev->bus_clock)); in panfrost_clk_init()
57 err = PTR_ERR(pfdev->bus_clock); in panfrost_clk_init()
61 if (pfdev->bus_clock) { in panfrost_clk_init()
62 rate = clk_get_rate(pfdev->bus_clock); in panfrost_clk_init()
63 dev_info(pfdev->dev, "bus_clock rate = %lu\n", rate); in panfrost_clk_init()
65 err = clk_prepare_enable(pfdev->bus_clock); in panfrost_clk_init()
73 clk_disable_unprepare(pfdev->clock); in panfrost_clk_init()
78 static void panfrost_clk_fini(struct panfrost_device *pfdev) in panfrost_clk_fini() argument
80 clk_disable_unprepare(pfdev->bus_clock); in panfrost_clk_fini()
81 clk_disable_unprepare(pfdev->clock); in panfrost_clk_fini()
84 static int panfrost_regulator_init(struct panfrost_device *pfdev) in panfrost_regulator_init() argument
88 pfdev->regulators = devm_kcalloc(pfdev->dev, pfdev->comp->num_supplies, in panfrost_regulator_init()
89 sizeof(*pfdev->regulators), in panfrost_regulator_init()
91 if (!pfdev->regulators) in panfrost_regulator_init()
94 for (i = 0; i < pfdev->comp->num_supplies; i++) in panfrost_regulator_init()
95 pfdev->regulators[i].supply = pfdev->comp->supply_names[i]; in panfrost_regulator_init()
97 ret = devm_regulator_bulk_get(pfdev->dev, in panfrost_regulator_init()
98 pfdev->comp->num_supplies, in panfrost_regulator_init()
99 pfdev->regulators); in panfrost_regulator_init()
102 dev_err(pfdev->dev, "failed to get regulators: %d\n", in panfrost_regulator_init()
107 ret = regulator_bulk_enable(pfdev->comp->num_supplies, in panfrost_regulator_init()
108 pfdev->regulators); in panfrost_regulator_init()
110 dev_err(pfdev->dev, "failed to enable regulators: %d\n", ret); in panfrost_regulator_init()
117 static void panfrost_regulator_fini(struct panfrost_device *pfdev) in panfrost_regulator_fini() argument
119 if (!pfdev->regulators) in panfrost_regulator_fini()
122 regulator_bulk_disable(pfdev->comp->num_supplies, pfdev->regulators); in panfrost_regulator_fini()
125 static void panfrost_pm_domain_fini(struct panfrost_device *pfdev) in panfrost_pm_domain_fini() argument
129 for (i = 0; i < ARRAY_SIZE(pfdev->pm_domain_devs); i++) { in panfrost_pm_domain_fini()
130 if (!pfdev->pm_domain_devs[i]) in panfrost_pm_domain_fini()
133 if (pfdev->pm_domain_links[i]) in panfrost_pm_domain_fini()
134 device_link_del(pfdev->pm_domain_links[i]); in panfrost_pm_domain_fini()
136 dev_pm_domain_detach(pfdev->pm_domain_devs[i], true); in panfrost_pm_domain_fini()
140 static int panfrost_pm_domain_init(struct panfrost_device *pfdev) in panfrost_pm_domain_init() argument
145 num_domains = of_count_phandle_with_args(pfdev->dev->of_node, in panfrost_pm_domain_init()
153 if (num_domains < 2 && pfdev->comp->num_pm_domains < 2) in panfrost_pm_domain_init()
156 if (num_domains != pfdev->comp->num_pm_domains) { in panfrost_pm_domain_init()
157 dev_err(pfdev->dev, in panfrost_pm_domain_init()
159 num_domains, pfdev->comp->num_pm_domains); in panfrost_pm_domain_init()
163 if (WARN(num_domains > ARRAY_SIZE(pfdev->pm_domain_devs), in panfrost_pm_domain_init()
168 pfdev->pm_domain_devs[i] = in panfrost_pm_domain_init()
169 dev_pm_domain_attach_by_name(pfdev->dev, in panfrost_pm_domain_init()
170 pfdev->comp->pm_domain_names[i]); in panfrost_pm_domain_init()
171 if (IS_ERR_OR_NULL(pfdev->pm_domain_devs[i])) { in panfrost_pm_domain_init()
172 err = PTR_ERR(pfdev->pm_domain_devs[i]) ? : -ENODATA; in panfrost_pm_domain_init()
173 pfdev->pm_domain_devs[i] = NULL; in panfrost_pm_domain_init()
174 dev_err(pfdev->dev, in panfrost_pm_domain_init()
176 pfdev->comp->pm_domain_names[i], i, err); in panfrost_pm_domain_init()
180 pfdev->pm_domain_links[i] = device_link_add(pfdev->dev, in panfrost_pm_domain_init()
181 pfdev->pm_domain_devs[i], DL_FLAG_PM_RUNTIME | in panfrost_pm_domain_init()
183 if (!pfdev->pm_domain_links[i]) { in panfrost_pm_domain_init()
184 dev_err(pfdev->pm_domain_devs[i], in panfrost_pm_domain_init()
194 panfrost_pm_domain_fini(pfdev); in panfrost_pm_domain_init()
198 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 res = platform_get_resource(pfdev->pdev, IORESOURCE_MEM, 0); in panfrost_device_init()
240 pfdev->iomem = devm_ioremap_resource(pfdev->dev, res); in panfrost_device_init()
241 if (IS_ERR(pfdev->iomem)) { in panfrost_device_init()
242 err = PTR_ERR(pfdev->iomem); in panfrost_device_init()
246 err = panfrost_gpu_init(pfdev); in panfrost_device_init()
250 err = panfrost_mmu_init(pfdev); in panfrost_device_init()
254 err = panfrost_job_init(pfdev); in panfrost_device_init()
258 err = panfrost_perfcnt_init(pfdev); in panfrost_device_init()
264 panfrost_job_fini(pfdev); in panfrost_device_init()
266 panfrost_mmu_fini(pfdev); in panfrost_device_init()
268 panfrost_gpu_fini(pfdev); in panfrost_device_init()
270 panfrost_pm_domain_fini(pfdev); in panfrost_device_init()
272 panfrost_reset_fini(pfdev); in panfrost_device_init()
274 panfrost_regulator_fini(pfdev); in panfrost_device_init()
276 panfrost_devfreq_fini(pfdev); in panfrost_device_init()
278 panfrost_clk_fini(pfdev); in panfrost_device_init()
282 void panfrost_device_fini(struct panfrost_device *pfdev) in panfrost_device_fini() argument
284 panfrost_perfcnt_fini(pfdev); in panfrost_device_fini()
285 panfrost_job_fini(pfdev); in panfrost_device_fini()
286 panfrost_mmu_fini(pfdev); in panfrost_device_fini()
287 panfrost_gpu_fini(pfdev); in panfrost_device_fini()
288 panfrost_pm_domain_fini(pfdev); in panfrost_device_fini()
289 panfrost_reset_fini(pfdev); in panfrost_device_fini()
290 panfrost_devfreq_fini(pfdev); in panfrost_device_fini()
291 panfrost_regulator_fini(pfdev); in panfrost_device_fini()
292 panfrost_clk_fini(pfdev); in panfrost_device_fini()
382 bool panfrost_exception_needs_reset(const struct panfrost_device *pfdev, in panfrost_exception_needs_reset() argument
391 void panfrost_device_reset(struct panfrost_device *pfdev) in panfrost_device_reset() argument
393 panfrost_gpu_soft_reset(pfdev); in panfrost_device_reset()
395 panfrost_gpu_power_on(pfdev); in panfrost_device_reset()
396 panfrost_mmu_reset(pfdev); in panfrost_device_reset()
397 panfrost_job_enable_interrupts(pfdev); in panfrost_device_reset()
404 struct panfrost_device *pfdev = platform_get_drvdata(pdev); in panfrost_device_resume() local
406 panfrost_device_reset(pfdev); in panfrost_device_resume()
407 panfrost_devfreq_resume(pfdev); in panfrost_device_resume()
415 struct panfrost_device *pfdev = platform_get_drvdata(pdev); in panfrost_device_suspend() local
417 if (!panfrost_job_is_idle(pfdev)) in panfrost_device_suspend()
420 panfrost_devfreq_suspend(pfdev); in panfrost_device_suspend()
421 panfrost_gpu_power_off(pfdev); in panfrost_device_suspend()