Re: [PATCH v6 5/8] media: qcom: camss: Add support for named power-domains

From: Hans Verkuil
Date: Wed Dec 06 2023 - 06:35:43 EST


On 23/11/2023 18:03, Bryan O'Donoghue wrote:
> Right now we use fixed indexes to assign power-domains, with a
> requirement for the TOP GDSC to come last in the list.
>
> Adding support for named power-domains means the declaration in the dtsi
> can come in any order.
>
> After this change we continue to support the old indexing - if a SoC
> resource declaration or the in-use dtb doesn't declare power-domain names
> we fall back to the default legacy indexing.
>
> From this point on though new SoC additions should contain named
> power-domains, eventually we will drop support for legacy indexing.
>
> Tested-by: Matti Lehtimäki <matti.lehtimaki@xxxxxxxxx>
> Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@xxxxxxxxxx>
> ---
> drivers/media/platform/qcom/camss/camss-vfe.c | 24 +++++++++++++++++++++++-
> drivers/media/platform/qcom/camss/camss.c | 26 +++++++++++++++++++++-----
> drivers/media/platform/qcom/camss/camss.h | 2 ++
> 3 files changed, 46 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/media/platform/qcom/camss/camss-vfe.c b/drivers/media/platform/qcom/camss/camss-vfe.c
> index 60c4730e7c9d1..083d1445a6e25 100644
> --- a/drivers/media/platform/qcom/camss/camss-vfe.c
> +++ b/drivers/media/platform/qcom/camss/camss-vfe.c
> @@ -1382,7 +1382,29 @@ int msm_vfe_subdev_init(struct camss *camss, struct vfe_device *vfe,
> if (!res->line_num)
> return -EINVAL;
>
> - if (res->has_pd) {
> + /* Power domain */
> +
> + if (res->pd_name) {
> + vfe->genpd = dev_pm_domain_attach_by_name(camss->dev,
> + res->pd_name);
> + if (IS_ERR(vfe->genpd)) {
> + ret = PTR_ERR(vfe->genpd);
> + return ret;
> + }
> + }
> +
> + if (!vfe->genpd && res->has_pd) {
> + /*
> + * Legacy magic index.
> + * Requires
> + * power-domain = <VFE_X>,
> + * <VFE_Y>,
> + * <TITAN_TOP>
> + * id must correspondng to the index of the VFE which must
> + * come before the TOP GDSC. VFE Lite has no individually
> + * collapasible domain which is why id < vfe_num is a valid
> + * check.
> + */
> vfe->genpd = dev_pm_domain_attach_by_id(camss->dev, id);
> if (IS_ERR(vfe->genpd))
> return PTR_ERR(vfe->genpd);
> diff --git a/drivers/media/platform/qcom/camss/camss.c b/drivers/media/platform/qcom/camss/camss.c
> index 35918cf837bdd..f2d2317c38b5b 100644
> --- a/drivers/media/platform/qcom/camss/camss.c
> +++ b/drivers/media/platform/qcom/camss/camss.c
> @@ -1522,12 +1522,28 @@ static int camss_configure_pd(struct camss *camss)
> return 0;
>
> /*
> - * VFE power domains are in the beginning of the list, and while all
> - * power domains should be attached, only if TITAN_TOP power domain is
> - * found in the list, it should be linked over here.
> + * If a power-domain name is defined try to use it.
> + * It is possible we are running a new kernel with an old dtb so
> + * fallback to indexes even if a pd_name is defined but not found.
> */
> - camss->genpd = dev_pm_domain_attach_by_id(camss->dev, camss->genpd_num - 1);
> - if (IS_ERR(camss->genpd)) {
> + if (camss->res->pd_name) {
> + camss->genpd = dev_pm_domain_attach_by_name(camss->dev,
> + camss->res->pd_name);
> + if (IS_ERR(camss->genpd)) {
> + ret = PTR_ERR(camss->genpd);
> + goto fail_pm;
> + }
> + }
> +
> + if (!camss->genpd) {
> + /*
> + * Legacy magic index. TITAN_TOP GDSC must be the last
> + * item in the power-domain list.
> + */
> + camss->genpd = dev_pm_domain_attach_by_id(camss->dev,
> + camss->genpd_num - 1);
> + }
> + if (IS_ERR_OR_NULL(camss->genpd)) {
> ret = PTR_ERR(camss->genpd);

I get this smatch warning here:

drivers/media/platform/qcom/camss/camss.c:1555 camss_configure_pd() warn: passing zero to 'PTR_ERR'

I'm not really sure what the intent is here.

If the fix is small, then I can change it myself, otherwise I need an updated patch.

Regards,

Hans

> goto fail_pm;
> }
> diff --git a/drivers/media/platform/qcom/camss/camss.h b/drivers/media/platform/qcom/camss/camss.h
> index 1ba824a2cb76c..cd8186fe1797b 100644
> --- a/drivers/media/platform/qcom/camss/camss.h
> +++ b/drivers/media/platform/qcom/camss/camss.h
> @@ -48,6 +48,7 @@ struct camss_subdev_resources {
> u32 clock_rate[CAMSS_RES_MAX][CAMSS_RES_MAX];
> char *reg[CAMSS_RES_MAX];
> char *interrupt[CAMSS_RES_MAX];
> + char *pd_name;
> u8 line_num;
> bool has_pd;
> const void *ops;
> @@ -84,6 +85,7 @@ enum icc_count {
>
> struct camss_resources {
> enum camss_version version;
> + const char *pd_name;
> const struct camss_subdev_resources *csiphy_res;
> const struct camss_subdev_resources *csid_res;
> const struct camss_subdev_resources *ispif_res;
>