Re: [PATCH] media: camss: Allocate power domain resources dynamically

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, 12 May 2022 at 10:23, Vladimir Zapolskiy
<vladimir.zapolskiy@xxxxxxxxxx> wrote:
>
> To simplify the driver's maintenance it makes sense to escape from
> hardcoded numbers of power domain resources per platform and statical
> allocation of the resources. For instance on a QCOM SM8450 platform
> the number of CAMSS power domains shall be bumped up to 6, also notably
> CAMSS on MSM8916 has only one power domain, however it expects to get 2,
> and thus it should result in a runtime error on driver probe.
>
> The change fixes an issue mentioned above and gives more flexibility
> to support more platforms in future.

This is a great idea, thanks for submitting this.

>
> Signed-off-by: Vladimir Zapolskiy <vladimir.zapolskiy@xxxxxxxxxx>
> ---
>  drivers/media/platform/qcom/camss/camss.c | 38 +++++++++++++----------
>  drivers/media/platform/qcom/camss/camss.h |  7 ++---
>  2 files changed, 24 insertions(+), 21 deletions(-)
>
> diff --git a/drivers/media/platform/qcom/camss/camss.c b/drivers/media/platform/qcom/camss/camss.c
> index 79ad82e233cb..32d72b4f947b 100644
> --- a/drivers/media/platform/qcom/camss/camss.c
> +++ b/drivers/media/platform/qcom/camss/camss.c
> @@ -1452,19 +1452,31 @@ static const struct media_device_ops camss_media_ops = {
>
>  static int camss_configure_pd(struct camss *camss)
>  {
> -       int nbr_pm_domains = 0;
> +       struct device *dev = camss->dev;
>         int last_pm_domain = 0;
>         int i;
>         int ret;
>
> -       if (camss->version == CAMSS_8x96 ||
> -           camss->version == CAMSS_660)
> -               nbr_pm_domains = PM_DOMAIN_GEN1_COUNT;
> -       else if (camss->version == CAMSS_845 ||
> -                camss->version == CAMSS_8250)
> -               nbr_pm_domains = PM_DOMAIN_GEN2_COUNT;
> +       camss->genpd_num = of_count_phandle_with_args(dev->of_node,
> +                                                     "power-domains",
> +                                                     "#power-domain-cells");
> +       if (camss->genpd_num < 0) {
> +               dev_err(dev, "Power domains are not defined for camss\n");
> +               return camss->genpd_num;
> +       }
> +
> +       camss->genpd = devm_kmalloc_array(dev, camss->genpd_num,
> +                                         sizeof(*camss->genpd), GFP_KERNEL);
> +       if (!camss->genpd)
> +               return -ENOMEM;
>
> -       for (i = 0; i < nbr_pm_domains; i++) {
> +       camss->genpd_link = devm_kmalloc_array(dev, camss->genpd_num,
> +                                              sizeof(*camss->genpd_link),
> +                                              GFP_KERNEL);
> +       if (!camss->genpd_link)
> +               return -ENOMEM;
> +
> +       for (i = 0; i < camss->genpd_num; i++) {
>                 camss->genpd[i] = dev_pm_domain_attach_by_id(camss->dev, i);
>                 if (IS_ERR(camss->genpd[i])) {
>                         ret = PTR_ERR(camss->genpd[i]);
> @@ -1689,7 +1701,6 @@ static int camss_probe(struct platform_device *pdev)
>
>  void camss_delete(struct camss *camss)
>  {
> -       int nbr_pm_domains = 0;
>         int i;
>
>         v4l2_device_unregister(&camss->v4l2_dev);
> @@ -1698,14 +1709,7 @@ void camss_delete(struct camss *camss)
>
>         pm_runtime_disable(camss->dev);
>
> -       if (camss->version == CAMSS_8x96 ||
> -           camss->version == CAMSS_660)
> -               nbr_pm_domains = PM_DOMAIN_GEN1_COUNT;
> -       else if (camss->version == CAMSS_845 ||
> -                camss->version == CAMSS_8250)
> -               nbr_pm_domains = PM_DOMAIN_GEN2_COUNT;
> -
> -       for (i = 0; i < nbr_pm_domains; i++) {
> +       for (i = 0; i < camss->genpd_num; i++) {
>                 device_link_del(camss->genpd_link[i]);
>                 dev_pm_domain_detach(camss->genpd[i], true);
>         }
> diff --git a/drivers/media/platform/qcom/camss/camss.h b/drivers/media/platform/qcom/camss/camss.h
> index c9b3e0df5be8..0db80cadbbaa 100644
> --- a/drivers/media/platform/qcom/camss/camss.h
> +++ b/drivers/media/platform/qcom/camss/camss.h
> @@ -69,9 +69,7 @@ struct resources_icc {
>  enum pm_domain {
>         PM_DOMAIN_VFE0 = 0,
>         PM_DOMAIN_VFE1 = 1,
> -       PM_DOMAIN_GEN1_COUNT = 2,       /* CAMSS series of ISPs */
>         PM_DOMAIN_VFELITE = 2,          /* VFELITE / TOP GDSC */
> -       PM_DOMAIN_GEN2_COUNT = 3,       /* Titan series of ISPs */
>  };
>
>  enum camss_version {
> @@ -101,8 +99,9 @@ struct camss {
>         int vfe_num;
>         struct vfe_device *vfe;
>         atomic_t ref_count;
> -       struct device *genpd[PM_DOMAIN_GEN2_COUNT];
> -       struct device_link *genpd_link[PM_DOMAIN_GEN2_COUNT];
> +       int genpd_num;
> +       struct device **genpd;
> +       struct device_link **genpd_link;
>         struct icc_path *icc_path[ICC_SM8250_COUNT];
>         struct icc_bw_tbl icc_bw_tbl[ICC_SM8250_COUNT];
>  };
> --
> 2.33.0
>

Reviewed-by: Robert Foss <robert.foss@xxxxxxxxxx>



[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux