Thread (35 messages) 35 messages, 5 authors, 2021-04-16

Re: [PATCH v2 08/10] drm/simpledrm: Acquire clocks from DT device node

From: Geert Uytterhoeven <geert@linux-m68k.org>
Date: 2021-03-18 10:39:59
Also in: dri-devel, virtualization

Hi Thomas,

On Thu, Mar 18, 2021 at 11:29 AM Thomas Zimmermann [off-list ref] wrote:
Make sure required hardware clocks are enabled while the firmware
framebuffer is in use.

The basic code has been taken from the simplefb driver and adapted
to DRM. Clocks are released automatically via devres helpers.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Tested-by: nerdopolis <redacted>
Thanks for your patch!
quoted hunk ↗ jump to hunk
--- a/drivers/gpu/drm/tiny/simpledrm.c
+++ b/drivers/gpu/drm/tiny/simpledrm.c
+static int simpledrm_device_init_clocks(struct simpledrm_device *sdev)
+{
+       struct drm_device *dev = &sdev->dev;
+       struct platform_device *pdev = sdev->pdev;
+       struct device_node *of_node = pdev->dev.of_node;
+       struct clk *clock;
+       unsigned int i;
+       int ret;
+
+       if (dev_get_platdata(&pdev->dev) || !of_node)
+               return 0;
+
+       sdev->clk_count = of_clk_get_parent_count(of_node);
+       if (!sdev->clk_count)
+               return 0;
+
+       sdev->clks = drmm_kzalloc(dev, sdev->clk_count * sizeof(sdev->clks[0]),
+                                 GFP_KERNEL);
+       if (!sdev->clks)
+               return -ENOMEM;
+
+       for (i = 0; i < sdev->clk_count; ++i) {
+               clock = of_clk_get(of_node, i);
+               if (IS_ERR(clock)) {
+                       ret = PTR_ERR(clock);
+                       if (ret == -EPROBE_DEFER)
+                               goto err;
+                       drm_err(dev, "clock %u not found: %d\n", i, ret);
+                       continue;
+               }
+               ret = clk_prepare_enable(clock);
+               if (ret) {
+                       drm_err(dev, "failed to enable clock %u: %d\n",
+                               i, ret);
+                       clk_put(clock);
+               }
+               sdev->clks[i] = clock;
+       }
of_clk_bulk_get_all() + clk_bulk_prepare_enable()?

There's also devm_clk_bulk_get_all(), but not for the OF variant.

Gr{oetje,eeting}s,

                        Geert

-- 
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help