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