Lines Matching refs:pfdev
21 static int panfrost_reset_init(struct panfrost_device *pfdev) in panfrost_reset_init() argument
23 pfdev->rstc = devm_reset_control_array_get_optional_exclusive(pfdev->dev); in panfrost_reset_init()
24 if (IS_ERR(pfdev->rstc)) { in panfrost_reset_init()
25 dev_err(pfdev->dev, "get reset failed %ld\n", PTR_ERR(pfdev->rstc)); in panfrost_reset_init()
26 return PTR_ERR(pfdev->rstc); in panfrost_reset_init()
29 return reset_control_deassert(pfdev->rstc); in panfrost_reset_init()
32 static void panfrost_reset_fini(struct panfrost_device *pfdev) in panfrost_reset_fini() argument
34 reset_control_assert(pfdev->rstc); in panfrost_reset_fini()
37 static int panfrost_clk_init(struct panfrost_device *pfdev) in panfrost_clk_init() argument
42 pfdev->clock = devm_clk_get(pfdev->dev, NULL); in panfrost_clk_init()
43 if (IS_ERR(pfdev->clock)) { in panfrost_clk_init()
44 dev_err(pfdev->dev, "get clock failed %ld\n", PTR_ERR(pfdev->clock)); in panfrost_clk_init()
45 return PTR_ERR(pfdev->clock); in panfrost_clk_init()
48 rate = clk_get_rate(pfdev->clock); in panfrost_clk_init()
49 dev_info(pfdev->dev, "clock rate = %lu\n", rate); in panfrost_clk_init()
51 err = clk_prepare_enable(pfdev->clock); in panfrost_clk_init()
55 pfdev->bus_clock = devm_clk_get_optional(pfdev->dev, "bus"); in panfrost_clk_init()
56 if (IS_ERR(pfdev->bus_clock)) { in panfrost_clk_init()
57 dev_err(pfdev->dev, "get bus_clock failed %ld\n", in panfrost_clk_init()
58 PTR_ERR(pfdev->bus_clock)); in panfrost_clk_init()
59 err = PTR_ERR(pfdev->bus_clock); in panfrost_clk_init()
63 if (pfdev->bus_clock) { in panfrost_clk_init()
64 rate = clk_get_rate(pfdev->bus_clock); in panfrost_clk_init()
65 dev_info(pfdev->dev, "bus_clock rate = %lu\n", rate); in panfrost_clk_init()
67 err = clk_prepare_enable(pfdev->bus_clock); in panfrost_clk_init()
75 clk_disable_unprepare(pfdev->clock); in panfrost_clk_init()
80 static void panfrost_clk_fini(struct panfrost_device *pfdev) in panfrost_clk_fini() argument
82 clk_disable_unprepare(pfdev->bus_clock); in panfrost_clk_fini()
83 clk_disable_unprepare(pfdev->clock); in panfrost_clk_fini()
86 static int panfrost_regulator_init(struct panfrost_device *pfdev) in panfrost_regulator_init() argument
90 pfdev->regulators = devm_kcalloc(pfdev->dev, pfdev->comp->num_supplies, in panfrost_regulator_init()
91 sizeof(*pfdev->regulators), in panfrost_regulator_init()
93 if (!pfdev->regulators) in panfrost_regulator_init()
96 for (i = 0; i < pfdev->comp->num_supplies; i++) in panfrost_regulator_init()
97 pfdev->regulators[i].supply = pfdev->comp->supply_names[i]; in panfrost_regulator_init()
99 ret = devm_regulator_bulk_get(pfdev->dev, in panfrost_regulator_init()
100 pfdev->comp->num_supplies, in panfrost_regulator_init()
101 pfdev->regulators); in panfrost_regulator_init()
104 dev_err(pfdev->dev, "failed to get regulators: %d\n", in panfrost_regulator_init()
109 ret = regulator_bulk_enable(pfdev->comp->num_supplies, in panfrost_regulator_init()
110 pfdev->regulators); in panfrost_regulator_init()
112 dev_err(pfdev->dev, "failed to enable regulators: %d\n", ret); in panfrost_regulator_init()
119 static void panfrost_regulator_fini(struct panfrost_device *pfdev) in panfrost_regulator_fini() argument
121 if (!pfdev->regulators) in panfrost_regulator_fini()
124 regulator_bulk_disable(pfdev->comp->num_supplies, pfdev->regulators); in panfrost_regulator_fini()
127 static void panfrost_pm_domain_fini(struct panfrost_device *pfdev) in panfrost_pm_domain_fini() argument
131 for (i = 0; i < ARRAY_SIZE(pfdev->pm_domain_devs); i++) { in panfrost_pm_domain_fini()
132 if (!pfdev->pm_domain_devs[i]) in panfrost_pm_domain_fini()
135 if (pfdev->pm_domain_links[i]) in panfrost_pm_domain_fini()
136 device_link_del(pfdev->pm_domain_links[i]); in panfrost_pm_domain_fini()
138 dev_pm_domain_detach(pfdev->pm_domain_devs[i], true); in panfrost_pm_domain_fini()
142 static int panfrost_pm_domain_init(struct panfrost_device *pfdev) in panfrost_pm_domain_init() argument
147 num_domains = of_count_phandle_with_args(pfdev->dev->of_node, in panfrost_pm_domain_init()
155 if (num_domains < 2 && pfdev->comp->num_pm_domains < 2) in panfrost_pm_domain_init()
158 if (num_domains != pfdev->comp->num_pm_domains) { in panfrost_pm_domain_init()
159 dev_err(pfdev->dev, in panfrost_pm_domain_init()
161 num_domains, pfdev->comp->num_pm_domains); in panfrost_pm_domain_init()
165 if (WARN(num_domains > ARRAY_SIZE(pfdev->pm_domain_devs), in panfrost_pm_domain_init()
170 pfdev->pm_domain_devs[i] = in panfrost_pm_domain_init()
171 dev_pm_domain_attach_by_name(pfdev->dev, in panfrost_pm_domain_init()
172 pfdev->comp->pm_domain_names[i]); in panfrost_pm_domain_init()
173 if (IS_ERR_OR_NULL(pfdev->pm_domain_devs[i])) { in panfrost_pm_domain_init()
174 err = PTR_ERR(pfdev->pm_domain_devs[i]) ? : -ENODATA; in panfrost_pm_domain_init()
175 pfdev->pm_domain_devs[i] = NULL; in panfrost_pm_domain_init()
176 dev_err(pfdev->dev, in panfrost_pm_domain_init()
178 pfdev->comp->pm_domain_names[i], i, err); in panfrost_pm_domain_init()
182 pfdev->pm_domain_links[i] = device_link_add(pfdev->dev, in panfrost_pm_domain_init()
183 pfdev->pm_domain_devs[i], DL_FLAG_PM_RUNTIME | in panfrost_pm_domain_init()
185 if (!pfdev->pm_domain_links[i]) { in panfrost_pm_domain_init()
186 dev_err(pfdev->pm_domain_devs[i], in panfrost_pm_domain_init()
196 panfrost_pm_domain_fini(pfdev); in panfrost_pm_domain_init()
200 int panfrost_device_init(struct panfrost_device *pfdev) in panfrost_device_init() argument
204 mutex_init(&pfdev->sched_lock); in panfrost_device_init()
205 INIT_LIST_HEAD(&pfdev->scheduled_jobs); in panfrost_device_init()
206 INIT_LIST_HEAD(&pfdev->as_lru_list); in panfrost_device_init()
208 spin_lock_init(&pfdev->as_lock); in panfrost_device_init()
210 err = panfrost_clk_init(pfdev); in panfrost_device_init()
212 dev_err(pfdev->dev, "clk init failed %d\n", err); in panfrost_device_init()
216 err = panfrost_devfreq_init(pfdev); in panfrost_device_init()
219 dev_err(pfdev->dev, "devfreq init failed %d\n", err); in panfrost_device_init()
224 if (!pfdev->pfdevfreq.opp_of_table_added) { in panfrost_device_init()
225 err = panfrost_regulator_init(pfdev); in panfrost_device_init()
230 err = panfrost_reset_init(pfdev); in panfrost_device_init()
232 dev_err(pfdev->dev, "reset init failed %d\n", err); in panfrost_device_init()
236 err = panfrost_pm_domain_init(pfdev); in panfrost_device_init()
240 pfdev->iomem = devm_platform_ioremap_resource(pfdev->pdev, 0); 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
389 return panfrost_has_hw_issue(pfdev, HW_ISSUE_TTRX_3076); in panfrost_exception_needs_reset()
395 void panfrost_device_reset(struct panfrost_device *pfdev) in panfrost_device_reset() argument
397 panfrost_gpu_soft_reset(pfdev); in panfrost_device_reset()
399 panfrost_gpu_power_on(pfdev); in panfrost_device_reset()
400 panfrost_mmu_reset(pfdev); in panfrost_device_reset()
401 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()