Re: [PATCH 1/4] media: qcom: camss: Add PM clock support and integrate with runtime PM

Loic Poulain <[email protected]>
Newsgroups org.kernel.vger.linux-media,org.kernel.vger.linux-arm-msm,org.kernel.vger.linux-kernel
Message-ID <CAFEp6-0ZBEb6x52dabGjF1XLgq4j6Ty3dKtMDJ1qNUTPGS+kHw@mail.gmail.com>
Hi Bryan,

On Thu, Jul 30, 2026 at 10:39 AM Bryan O'Donoghue
<[email protected]> wrote:
>
> On 17/07/2026 15:20, Loic Poulain wrote:
> > Add optional PM clock support to the CAMSS driver using the PM clock
> > framework. This allows CAMSS clocks to be registered once and
> > automatically managed during runtime suspend and resume.
> >
> > This is especially useful for global CAMSS clocks that are shared across
> > multiple CAMSS subblocks.
> >
> > This avoids the need for each subblock to reference and manage the
> > shared clocks individually. A typical example is the set of clocks in
> > the top_group, which may be used by CSID, PHY, CCI, and other CAMSS
> > blocks.
> >
> > Introduce a small PM clock descriptor table in the CAMSS resources
> > structure to describe clocks and their optional rates. Initialize
> > these clocks at probe time and delegate clock ownership to the PM
> > core.
> >
> > Hook PM clock handling into the runtime PM callbacks to ensure clocks
> > are properly suspended and resumed alongside power domains and ICC
> > paths.
> >
> > Signed-off-by: Loic Poulain <[email protected]>
> > ---
> >   drivers/media/platform/qcom/camss/camss.c | 40 ++++++++++++++++++++++++++++++-
> >   drivers/media/platform/qcom/camss/camss.h |  1 +
> >   2 files changed, 40 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/media/platform/qcom/camss/camss.c b/drivers/media/platform/qcom/camss/camss.c
> > index 2123f6388e3d7eafe669efd6b033e22d8eb5cf79..6a2bf3373e8755805c8cd0f8fe5037b788d68fa2 100644
> > --- a/drivers/media/platform/qcom/camss/camss.c
> > +++ b/drivers/media/platform/qcom/camss/camss.c
> > @@ -18,6 +18,7 @@
> >   #include <linux/of_graph.h>
> >   #include <linux/pm_runtime.h>
> >   #include <linux/pm_domain.h>
> > +#include <linux/pm_clock.h>
> >   #include <linux/slab.h>
> >   #include <linux/videodev2.h>
> >
> > @@ -5346,6 +5347,35 @@ static void camss_genpd_cleanup(struct camss *camss)
> >       dev_pm_domain_detach(camss->genpd, true);
> >   }
> >
> > +/*
> > + * camss_init_pm_clks - register shared CAMSS clocks with the PM clock framework
> > + *
> > + * Clocks listed in res->pm_clks are shared across all CAMSS sub-devices (e.g.
> > + * top_ahb, axi). They are managed automatically by the PM framework.
> > + */
> > +static int camss_init_pm_clks(struct camss *camss)
> > +{
> > +     struct device *dev = camss->dev;
> > +     unsigned int i;
> > +     int ret;
> > +
> > +     if (!camss->res->pm_clks[0])
> > +             return 0;
> > +
> > +     ret = devm_pm_clk_create(dev);
> > +     if (ret)
> > +             return ret;
> > +
> > +     for (i = 0; i < CAMSS_RES_MAX && camss->res->pm_clks[i]; i++) {
> > +             ret = pm_clk_add(dev, camss->res->pm_clks[i]);
> > +             if (ret)
> > +                     dev_warn(dev, "failed to add pm_clk %s: %d\n",
> > +                              camss->res->pm_clks[i], ret);
> > +     }
> > +
> > +     return 0;
> > +}
> > +
> >   /*
> >    * camss_probe - Probe CAMSS platform device
> >    * @pdev: Pointer to CAMSS platform device
> > @@ -5434,6 +5464,10 @@ static int camss_probe(struct platform_device *pdev)
> >
> >       pm_runtime_enable(dev);
> >
> > +     ret = camss_init_pm_clks(camss);
> > +     if (ret)
> > +             goto err_v4l2_device_unregister;
> > +
> >       ret = camss_parse_ports(camss);
> >       if (ret < 0)
> >               goto err_v4l2_device_unregister;
> > @@ -5775,7 +5809,7 @@ static int __maybe_unused camss_runtime_suspend(struct device *dev)
> >                       return ret;
> >       }
> >
> > -     return 0;
> > +     return pm_clk_suspend(dev);
>    CC      drivers/media/platform/mediatek/vcodec/common/mtk_vcodec_dbgfs.o
>    CC      drivers/media/platform/mediatek/mdp3/mtk-mdp3-vpu.o
>    AR      drivers/staging/media/ipu7/built-in.a
> In file included from ./include/uapi/linux/posix_types.h:5,
>                   from ./include/uapi/linux/types.h:14,
>                   from ./include/linux/types.h:5,
>                   from ./include/linux/kasan-checks.h:5,
>                   from ./include/asm-generic/rwonce.h:26,
>                   from ./arch/x86/include/generated/asm/rwonce.h:1,
>                   from ./include/linux/compiler.h:369,
>                   from ./include/linux/err.h:5,
>                   from ./include/linux/clk.h:12,
>                   from drivers/media/platform/qcom/camss/camss.c:10:
> drivers/media/platform/qcom/camss/camss.c: In function
> ‘camss_runtime_suspend’:
> ./include/linux/stddef.h:8:14: error: called object is not a function or
> function pointer
>      8 | #define NULL ((void *)0)
>        |              ^
> ./include/linux/pm_clock.h:77:25: note: in expansion of macro ‘NULL’
>     77 | #define pm_clk_suspend  NULL
>        |                         ^~~~
> drivers/media/platform/qcom/camss/camss.c:5841:16: note: in expansion of
> macro ‘pm_clk_suspend’
>   5841 |         return pm_clk_suspend(dev);
>        |                ^~~~~~~~~~~~~~
> drivers/media/platform/qcom/camss/camss.c: In function
> ‘camss_runtime_resume’:
> ./include/linux/stddef.h:8:14: error: called object is not a function or
> function pointer
>      8 | #define NULL ((void *)0)
>        |              ^
> ./include/linux/pm_clock.h:78:25: note: in expansion of macro ‘NULL’
>     78 | #define pm_clk_resume   NULL
>        |                         ^~~~
> drivers/media/platform/qcom/camss/camss.c:5851:15: note: in expansion of
> macro ‘pm_clk_resume’
>   5851 |         ret = pm_clk_resume(dev);
>        |               ^~~~~~~~~~~~~
> make[7]: *** [scripts/Makefile.build:289:
> drivers/media/platform/qcom/camss/camss.o] Error 1
> make[7]: *** Waiting for unfinished jobs....
>    CC      drivers/media/usb/pwc/pwc-misc.o
>
> Please fix.

Thanks, I submitted a v3 with this fixed.

Regards,
Loic
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.