Skip to content

Commit 32c319b

Browse files
lategoodbyepelwell
authored andcommitted
drm/v3d: Add clock handling
[ Upstream commit 4dd40b5 ] Since the initial commit 57692c9 ("drm/v3d: Introduce a new DRM driver for Broadcom V3D V3.x+") the struct v3d_dev reserved a pointer for an optional V3D clock. But there wasn't any code, which fetched it. So add the missing clock handling before accessing any V3D registers. Signed-off-by: Stefan Wahren <wahrenst@gmx.net> Reviewed-by: Maíra Canal <mcanal@igalia.com> Signed-off-by: Maíra Canal <mcanal@igalia.com> Link: https://patchwork.freedesktop.org/patch/msgid/20250201125046.33030-1-wahrenst@gmx.net [ Maíra: Backported to the downstream repository ] Signed-off-by: Maíra Canal <mcanal@igalia.com>
1 parent ac56a22 commit 32c319b

1 file changed

Lines changed: 28 additions & 16 deletions

File tree

drivers/gpu/drm/v3d/v3d_drv.c

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -232,11 +232,21 @@ static int v3d_platform_drm_probe(struct platform_device *pdev)
232232
if (ret)
233233
return ret;
234234

235+
v3d->clk = devm_clk_get_optional(dev, NULL);
236+
if (IS_ERR(v3d->clk))
237+
return dev_err_probe(dev, PTR_ERR(v3d->clk), "Failed to get V3D clock\n");
238+
239+
ret = clk_prepare_enable(v3d->clk);
240+
if (ret) {
241+
dev_err(&pdev->dev, "Couldn't enable the V3D clock\n");
242+
return ret;
243+
}
244+
235245
mmu_debug = V3D_READ(V3D_MMU_DEBUG_INFO);
236246
mask = DMA_BIT_MASK(30 + V3D_GET_FIELD(mmu_debug, V3D_MMU_PA_WIDTH));
237247
ret = dma_set_mask_and_coherent(dev, mask);
238248
if (ret)
239-
return ret;
249+
goto clk_disable;
240250

241251
v3d->va_width = 30 + V3D_GET_FIELD(mmu_debug, V3D_MMU_VA_WIDTH);
242252

@@ -251,32 +261,29 @@ static int v3d_platform_drm_probe(struct platform_device *pdev)
251261
ret = PTR_ERR(v3d->reset);
252262

253263
if (ret == -EPROBE_DEFER)
254-
return ret;
264+
goto clk_disable;
255265

256266
v3d->reset = NULL;
257267
ret = map_regs(v3d, &v3d->bridge_regs, "bridge");
258268
if (ret) {
259269
dev_err(dev,
260270
"Failed to get reset control or bridge regs\n");
261-
return ret;
271+
goto clk_disable;
262272
}
263273
}
264274

265-
v3d->clk = devm_clk_get(dev, NULL);
266-
if (IS_ERR_OR_NULL(v3d->clk)) {
267-
if (PTR_ERR(v3d->clk) != -EPROBE_DEFER)
268-
dev_err(dev, "Failed to get clock (%ld)\n", PTR_ERR(v3d->clk));
269-
return PTR_ERR(v3d->clk);
270-
}
271-
272275
node = rpi_firmware_find_node();
273-
if (!node)
274-
return -EINVAL;
276+
if (!node) {
277+
ret = -EINVAL;
278+
goto clk_disable;
279+
}
275280

276281
firmware = rpi_firmware_get(node);
277282
of_node_put(node);
278-
if (!firmware)
279-
return -EPROBE_DEFER;
283+
if (!firmware) {
284+
ret = -EPROBE_DEFER;
285+
goto clk_disable;
286+
}
280287

281288
v3d->clk_up_rate = rpi_firmware_clk_get_max_rate(firmware,
282289
RPI_FIRMWARE_V3D_CLK_ID);
@@ -293,14 +300,15 @@ static int v3d_platform_drm_probe(struct platform_device *pdev)
293300
if (v3d->ver < 41) {
294301
ret = map_regs(v3d, &v3d->gca_regs, "gca");
295302
if (ret)
296-
return ret;
303+
goto clk_disable;
297304
}
298305

299306
v3d->mmu_scratch = dma_alloc_wc(dev, 4096, &v3d->mmu_scratch_paddr,
300307
GFP_KERNEL | __GFP_NOWARN | __GFP_ZERO);
301308
if (!v3d->mmu_scratch) {
302309
dev_err(dev, "Failed to allocate MMU scratch page\n");
303-
return -ENOMEM;
310+
ret = -ENOMEM;
311+
goto clk_disable;
304312
}
305313

306314
ret = v3d_gem_init(drm);
@@ -326,6 +334,8 @@ static int v3d_platform_drm_probe(struct platform_device *pdev)
326334
v3d_gem_destroy(drm);
327335
dma_free:
328336
dma_free_wc(dev, 4096, v3d->mmu_scratch, v3d->mmu_scratch_paddr);
337+
clk_disable:
338+
clk_disable_unprepare(v3d->clk);
329339
return ret;
330340
}
331341

@@ -340,6 +350,8 @@ static void v3d_platform_drm_remove(struct platform_device *pdev)
340350

341351
dma_free_wc(v3d->drm.dev, 4096, v3d->mmu_scratch,
342352
v3d->mmu_scratch_paddr);
353+
354+
clk_disable_unprepare(v3d->clk);
343355
}
344356

345357
static struct platform_driver v3d_platform_driver = {

0 commit comments

Comments
 (0)