Lines Matching defs:pfdev

21 static int panfrost_reset_init(struct panfrost_device *pfdev)
23 pfdev->rstc = devm_reset_control_array_get_optional_exclusive(pfdev->dev);
24 if (IS_ERR(pfdev->rstc)) {
25 dev_err(pfdev->dev, "get reset failed %ld\n", PTR_ERR(pfdev->rstc));
26 return PTR_ERR(pfdev->rstc);
29 return reset_control_deassert(pfdev->rstc);
32 static void panfrost_reset_fini(struct panfrost_device *pfdev)
34 reset_control_assert(pfdev->rstc);
37 static int panfrost_clk_init(struct panfrost_device *pfdev)
42 pfdev->clock = devm_clk_get(pfdev->dev, NULL);
43 if (IS_ERR(pfdev->clock)) {
44 dev_err(pfdev->dev, "get clock failed %ld\n", PTR_ERR(pfdev->clock));
45 return PTR_ERR(pfdev->clock);
48 rate = clk_get_rate(pfdev->clock);
49 dev_info(pfdev->dev, "clock rate = %lu\n", rate);
51 err = clk_prepare_enable(pfdev->clock);
55 pfdev->bus_clock = devm_clk_get_optional(pfdev->dev, "bus");
56 if (IS_ERR(pfdev->bus_clock)) {
57 dev_err(pfdev->dev, "get bus_clock failed %ld\n",
58 PTR_ERR(pfdev->bus_clock));
59 err = PTR_ERR(pfdev->bus_clock);
63 if (pfdev->bus_clock) {
64 rate = clk_get_rate(pfdev->bus_clock);
65 dev_info(pfdev->dev, "bus_clock rate = %lu\n", rate);
67 err = clk_prepare_enable(pfdev->bus_clock);
75 clk_disable_unprepare(pfdev->clock);
80 static void panfrost_clk_fini(struct panfrost_device *pfdev)
82 clk_disable_unprepare(pfdev->bus_clock);
83 clk_disable_unprepare(pfdev->clock);
86 static int panfrost_regulator_init(struct panfrost_device *pfdev)
90 pfdev->regulators = devm_kcalloc(pfdev->dev, pfdev->comp->num_supplies,
91 sizeof(*pfdev->regulators),
93 if (!pfdev->regulators)
96 for (i = 0; i < pfdev->comp->num_supplies; i++)
97 pfdev->regulators[i].supply = pfdev->comp->supply_names[i];
99 ret = devm_regulator_bulk_get(pfdev->dev,
100 pfdev->comp->num_supplies,
101 pfdev->regulators);
104 dev_err(pfdev->dev, "failed to get regulators: %d\n",
109 ret = regulator_bulk_enable(pfdev->comp->num_supplies,
110 pfdev->regulators);
112 dev_err(pfdev->dev, "failed to enable regulators: %d\n", ret);
119 static void panfrost_regulator_fini(struct panfrost_device *pfdev)
121 if (!pfdev->regulators)
124 regulator_bulk_disable(pfdev->comp->num_supplies, pfdev->regulators);
127 static void panfrost_pm_domain_fini(struct panfrost_device *pfdev)
131 for (i = 0; i < ARRAY_SIZE(pfdev->pm_domain_devs); i++) {
132 if (!pfdev->pm_domain_devs[i])
135 if (pfdev->pm_domain_links[i])
136 device_link_del(pfdev->pm_domain_links[i]);
138 dev_pm_domain_detach(pfdev->pm_domain_devs[i], true);
142 static int panfrost_pm_domain_init(struct panfrost_device *pfdev)
147 num_domains = of_count_phandle_with_args(pfdev->dev->of_node,
155 if (num_domains < 2 && pfdev->comp->num_pm_domains < 2)
158 if (num_domains != pfdev->comp->num_pm_domains) {
159 dev_err(pfdev->dev,
161 num_domains, pfdev->comp->num_pm_domains);
165 if (WARN(num_domains > ARRAY_SIZE(pfdev->pm_domain_devs),
170 pfdev->pm_domain_devs[i] =
171 dev_pm_domain_attach_by_name(pfdev->dev,
172 pfdev->comp->pm_domain_names[i]);
173 if (IS_ERR_OR_NULL(pfdev->pm_domain_devs[i])) {
174 err = PTR_ERR(pfdev->pm_domain_devs[i]) ? : -ENODATA;
175 pfdev->pm_domain_devs[i] = NULL;
176 dev_err(pfdev->dev,
178 pfdev->comp->pm_domain_names[i], i, err);
182 pfdev->pm_domain_links[i] = device_link_add(pfdev->dev,
183 pfdev->pm_domain_devs[i], DL_FLAG_PM_RUNTIME |
185 if (!pfdev->pm_domain_links[i]) {
186 dev_err(pfdev->pm_domain_devs[i],
196 panfrost_pm_domain_fini(pfdev);
200 int panfrost_device_init(struct panfrost_device *pfdev)
204 mutex_init(&pfdev->sched_lock);
205 INIT_LIST_HEAD(&pfdev->scheduled_jobs);
206 INIT_LIST_HEAD(&pfdev->as_lru_list);
208 spin_lock_init(&pfdev->as_lock);
210 err = panfrost_clk_init(pfdev);
212 dev_err(pfdev->dev, "clk init failed %d\n", err);
216 err = panfrost_devfreq_init(pfdev);
219 dev_err(pfdev->dev, "devfreq init failed %d\n", err);
224 if (!pfdev->pfdevfreq.opp_of_table_added) {
225 err = panfrost_regulator_init(pfdev);
230 err = panfrost_reset_init(pfdev);
232 dev_err(pfdev->dev, "reset init failed %d\n", err);
236 err = panfrost_pm_domain_init(pfdev);
240 pfdev->iomem = devm_platform_ioremap_resource(pfdev->pdev, 0);
241 if (IS_ERR(pfdev->iomem)) {
242 err = PTR_ERR(pfdev->iomem);
246 err = panfrost_gpu_init(pfdev);
250 err = panfrost_mmu_init(pfdev);
254 err = panfrost_job_init(pfdev);
258 err = panfrost_perfcnt_init(pfdev);
264 panfrost_job_fini(pfdev);
266 panfrost_mmu_fini(pfdev);
268 panfrost_gpu_fini(pfdev);
270 panfrost_pm_domain_fini(pfdev);
272 panfrost_reset_fini(pfdev);
274 panfrost_regulator_fini(pfdev);
276 panfrost_devfreq_fini(pfdev);
278 panfrost_clk_fini(pfdev);
282 void panfrost_device_fini(struct panfrost_device *pfdev)
284 panfrost_perfcnt_fini(pfdev);
285 panfrost_job_fini(pfdev);
286 panfrost_mmu_fini(pfdev);
287 panfrost_gpu_fini(pfdev);
288 panfrost_pm_domain_fini(pfdev);
289 panfrost_reset_fini(pfdev);
290 panfrost_devfreq_fini(pfdev);
291 panfrost_regulator_fini(pfdev);
292 panfrost_clk_fini(pfdev);
382 bool panfrost_exception_needs_reset(const struct panfrost_device *pfdev,
389 return panfrost_has_hw_issue(pfdev, HW_ISSUE_TTRX_3076);
395 void panfrost_device_reset(struct panfrost_device *pfdev)
397 panfrost_gpu_soft_reset(pfdev);
399 panfrost_gpu_power_on(pfdev);
400 panfrost_mmu_reset(pfdev);
401 panfrost_job_enable_interrupts(pfdev);
406 struct panfrost_device *pfdev = dev_get_drvdata(dev);
408 panfrost_device_reset(pfdev);
409 panfrost_devfreq_resume(pfdev);
416 struct panfrost_device *pfdev = dev_get_drvdata(dev);
418 if (!panfrost_job_is_idle(pfdev))
421 panfrost_devfreq_suspend(pfdev);
422 panfrost_gpu_power_off(pfdev);