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