Skip to content

Commit 876c499

Browse files
lategoodbyepopcornmix
authored andcommitted
drm/v3d: Add clock handling
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
1 parent 77f7e1a commit 876c499

File tree

1 file changed

+20
-5
lines changed

1 file changed

+20
-5
lines changed

drivers/gpu/drm/v3d/v3d_drv.c

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -301,11 +301,21 @@ static int v3d_platform_drm_probe(struct platform_device *pdev)
301301
if (ret)
302302
return ret;
303303

304+
v3d->clk = devm_clk_get_optional(dev, NULL);
305+
if (IS_ERR(v3d->clk))
306+
return dev_err_probe(dev, PTR_ERR(v3d->clk), "Failed to get V3D clock\n");
307+
308+
ret = clk_prepare_enable(v3d->clk);
309+
if (ret) {
310+
dev_err(&pdev->dev, "Couldn't enable the V3D clock\n");
311+
return ret;
312+
}
313+
304314
mmu_debug = V3D_READ(V3D_MMU_DEBUG_INFO);
305315
mask = DMA_BIT_MASK(30 + V3D_GET_FIELD(mmu_debug, V3D_MMU_PA_WIDTH));
306316
ret = dma_set_mask_and_coherent(dev, mask);
307317
if (ret)
308-
return ret;
318+
goto clk_disable;
309319

310320
v3d->va_width = 30 + V3D_GET_FIELD(mmu_debug, V3D_MMU_VA_WIDTH);
311321

@@ -325,14 +335,14 @@ static int v3d_platform_drm_probe(struct platform_device *pdev)
325335
ret = PTR_ERR(v3d->reset);
326336

327337
if (ret == -EPROBE_DEFER)
328-
return ret;
338+
goto clk_disable;
329339

330340
v3d->reset = NULL;
331341
ret = map_regs(v3d, &v3d->bridge_regs, "bridge");
332342
if (ret) {
333343
dev_err(dev,
334344
"Failed to get reset control or bridge regs\n");
335-
return ret;
345+
goto clk_disable;
336346
}
337347
}
338348

@@ -367,14 +377,15 @@ static int v3d_platform_drm_probe(struct platform_device *pdev)
367377
if (v3d->ver < 41) {
368378
ret = map_regs(v3d, &v3d->gca_regs, "gca");
369379
if (ret)
370-
return ret;
380+
goto clk_disable;
371381
}
372382

373383
v3d->mmu_scratch = dma_alloc_wc(dev, 4096, &v3d->mmu_scratch_paddr,
374384
GFP_KERNEL | __GFP_NOWARN | __GFP_ZERO);
375385
if (!v3d->mmu_scratch) {
376386
dev_err(dev, "Failed to allocate MMU scratch page\n");
377-
return -ENOMEM;
387+
ret = -ENOMEM;
388+
goto clk_disable;
378389
}
379390

380391
ret = v3d_gem_init(drm);
@@ -405,6 +416,8 @@ static int v3d_platform_drm_probe(struct platform_device *pdev)
405416
v3d_gem_destroy(drm);
406417
dma_free:
407418
dma_free_wc(dev, 4096, v3d->mmu_scratch, v3d->mmu_scratch_paddr);
419+
clk_disable:
420+
clk_disable_unprepare(v3d->clk);
408421
return ret;
409422
}
410423

@@ -422,6 +435,8 @@ static void v3d_platform_drm_remove(struct platform_device *pdev)
422435

423436
dma_free_wc(v3d->drm.dev, 4096, v3d->mmu_scratch,
424437
v3d->mmu_scratch_paddr);
438+
439+
clk_disable_unprepare(v3d->clk);
425440
}
426441

427442
static struct platform_driver v3d_platform_driver = {

0 commit comments

Comments
 (0)