Lines Matching defs:pfdev

19 static int panfrost_reset_init(struct panfrost_device *pfdev)
23 pfdev->rstc = devm_reset_control_array_get(pfdev->dev, false, true);
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 err = reset_control_deassert(pfdev->rstc);
36 static void panfrost_reset_fini(struct panfrost_device *pfdev)
38 reset_control_assert(pfdev->rstc);
41 static int panfrost_clk_init(struct panfrost_device *pfdev)
46 pfdev->clock = devm_clk_get(pfdev->dev, NULL);
47 if (IS_ERR(pfdev->clock)) {
48 dev_err(pfdev->dev, "get clock failed %ld\n", PTR_ERR(pfdev->clock));
49 return PTR_ERR(pfdev->clock);
52 rate = clk_get_rate(pfdev->clock);
53 dev_info(pfdev->dev, "clock rate = %lu\n", rate);
55 err = clk_prepare_enable(pfdev->clock);
59 pfdev->bus_clock = devm_clk_get_optional(pfdev->dev, "bus");
60 if (IS_ERR(pfdev->bus_clock)) {
61 dev_err(pfdev->dev, "get bus_clock failed %ld\n",
62 PTR_ERR(pfdev->bus_clock));
63 err = PTR_ERR(pfdev->bus_clock);
67 if (pfdev->bus_clock) {
68 rate = clk_get_rate(pfdev->bus_clock);
69 dev_info(pfdev->dev, "bus_clock rate = %lu\n", rate);
71 err = clk_prepare_enable(pfdev->bus_clock);
79 clk_disable_unprepare(pfdev->clock);
84 static void panfrost_clk_fini(struct panfrost_device *pfdev)
86 clk_disable_unprepare(pfdev->bus_clock);
87 clk_disable_unprepare(pfdev->clock);
90 static int panfrost_regulator_init(struct panfrost_device *pfdev)
94 pfdev->regulators = devm_kcalloc(pfdev->dev, pfdev->comp->num_supplies,
95 sizeof(*pfdev->regulators),
97 if (!pfdev->regulators)
100 for (i = 0; i < pfdev->comp->num_supplies; i++)
101 pfdev->regulators[i].supply = pfdev->comp->supply_names[i];
103 ret = devm_regulator_bulk_get(pfdev->dev,
104 pfdev->comp->num_supplies,
105 pfdev->regulators);
108 dev_err(pfdev->dev, "failed to get regulators: %d\n",
113 ret = regulator_bulk_enable(pfdev->comp->num_supplies,
114 pfdev->regulators);
116 dev_err(pfdev->dev, "failed to enable regulators: %d\n", ret);
123 static void panfrost_regulator_fini(struct panfrost_device *pfdev)
125 if (!pfdev->regulators)
128 regulator_bulk_disable(pfdev->comp->num_supplies, pfdev->regulators);
131 static void panfrost_pm_domain_fini(struct panfrost_device *pfdev)
135 for (i = 0; i < ARRAY_SIZE(pfdev->pm_domain_devs); i++) {
136 if (!pfdev->pm_domain_devs[i])
139 if (pfdev->pm_domain_links[i])
140 device_link_del(pfdev->pm_domain_links[i]);
142 dev_pm_domain_detach(pfdev->pm_domain_devs[i], true);
146 static int panfrost_pm_domain_init(struct panfrost_device *pfdev)
151 num_domains = of_count_phandle_with_args(pfdev->dev->of_node,
159 if (num_domains < 2 && pfdev->comp->num_pm_domains < 2)
162 if (num_domains != pfdev->comp->num_pm_domains) {
163 dev_err(pfdev->dev,
165 num_domains, pfdev->comp->num_pm_domains);
169 if (WARN(num_domains > ARRAY_SIZE(pfdev->pm_domain_devs),
174 pfdev->pm_domain_devs[i] =
175 dev_pm_domain_attach_by_name(pfdev->dev,
176 pfdev->comp->pm_domain_names[i]);
177 if (IS_ERR_OR_NULL(pfdev->pm_domain_devs[i])) {
178 err = PTR_ERR(pfdev->pm_domain_devs[i]) ? : -ENODATA;
179 pfdev->pm_domain_devs[i] = NULL;
180 dev_err(pfdev->dev,
182 pfdev->comp->pm_domain_names[i], i, err);
186 pfdev->pm_domain_links[i] = device_link_add(pfdev->dev,
187 pfdev->pm_domain_devs[i], DL_FLAG_PM_RUNTIME |
189 if (!pfdev->pm_domain_links[i]) {
190 dev_err(pfdev->pm_domain_devs[i],
200 panfrost_pm_domain_fini(pfdev);
204 int panfrost_device_init(struct panfrost_device *pfdev)
209 mutex_init(&pfdev->sched_lock);
210 INIT_LIST_HEAD(&pfdev->scheduled_jobs);
211 INIT_LIST_HEAD(&pfdev->as_lru_list);
213 spin_lock_init(&pfdev->as_lock);
215 err = panfrost_clk_init(pfdev);
217 dev_err(pfdev->dev, "clk init failed %d\n", err);
221 err = panfrost_devfreq_init(pfdev);
224 dev_err(pfdev->dev, "devfreq init failed %d\n", err);
229 if (!pfdev->pfdevfreq.opp_of_table_added) {
230 err = panfrost_regulator_init(pfdev);
235 err = panfrost_reset_init(pfdev);
237 dev_err(pfdev->dev, "reset init failed %d\n", err);
241 err = panfrost_pm_domain_init(pfdev);
245 res = platform_get_resource(pfdev->pdev, IORESOURCE_MEM, 0);
246 pfdev->iomem = devm_ioremap_resource(pfdev->dev, res);
247 if (IS_ERR(pfdev->iomem)) {
248 dev_err(pfdev->dev, "failed to ioremap iomem\n");
249 err = PTR_ERR(pfdev->iomem);
253 err = panfrost_gpu_init(pfdev);
257 err = panfrost_mmu_init(pfdev);
261 err = panfrost_job_init(pfdev);
265 err = panfrost_perfcnt_init(pfdev);
271 panfrost_job_fini(pfdev);
273 panfrost_mmu_fini(pfdev);
275 panfrost_gpu_fini(pfdev);
277 panfrost_pm_domain_fini(pfdev);
279 panfrost_reset_fini(pfdev);
281 panfrost_regulator_fini(pfdev);
283 panfrost_devfreq_fini(pfdev);
285 panfrost_clk_fini(pfdev);
289 void panfrost_device_fini(struct panfrost_device *pfdev)
291 panfrost_perfcnt_fini(pfdev);
292 panfrost_job_fini(pfdev);
293 panfrost_mmu_fini(pfdev);
294 panfrost_gpu_fini(pfdev);
295 panfrost_pm_domain_fini(pfdev);
296 panfrost_reset_fini(pfdev);
297 panfrost_devfreq_fini(pfdev);
298 panfrost_regulator_fini(pfdev);
299 panfrost_clk_fini(pfdev);
302 const char *panfrost_exception_name(struct panfrost_device *pfdev, u32 exception_code)
353 void panfrost_device_reset(struct panfrost_device *pfdev)
355 panfrost_gpu_soft_reset(pfdev);
357 panfrost_gpu_power_on(pfdev);
358 panfrost_mmu_reset(pfdev);
359 panfrost_job_enable_interrupts(pfdev);
366 struct panfrost_device *pfdev = platform_get_drvdata(pdev);
368 panfrost_device_reset(pfdev);
369 panfrost_devfreq_resume(pfdev);
377 struct panfrost_device *pfdev = platform_get_drvdata(pdev);
379 if (!panfrost_job_is_idle(pfdev))
382 panfrost_devfreq_suspend(pfdev);
383 panfrost_gpu_power_off(pfdev);