]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
media: qcom: camss: add management of supply regulators to CSIPHY
authorVladimir Zapolskiy <vladimir.zapolskiy@linaro.org>
Thu, 26 Sep 2024 21:19:56 +0000 (00:19 +0300)
committerHans Verkuil <hverkuil-cisco@xs4all.nl>
Sat, 12 Oct 2024 17:09:05 +0000 (19:09 +0200)
This change allows to properly assign and manage supply regulator
resources by CSIPHY subdevices of CAMSS, this is needed to fine tune
description of supply regulators on newer platforms, conversion of
old platforms to the new scheme is also anticipated.

Signed-off-by: Vladimir Zapolskiy <vladimir.zapolskiy@linaro.org>
Tested-by: Depeng Shao <quic_depengs@quicinc.com> # SM8550
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
drivers/media/platform/qcom/camss/camss-csiphy.c
drivers/media/platform/qcom/camss/camss-csiphy.h

index 2f7361dfd4614c32a062c8442b151fac70b71879..68a3ea1ba2a5299cf28289dfdb958cfdff3c91e0 100644 (file)
@@ -212,14 +212,25 @@ static int csiphy_set_power(struct v4l2_subdev *sd, int on)
                if (ret < 0)
                        return ret;
 
+               ret = regulator_bulk_enable(csiphy->num_supplies,
+                                           csiphy->supplies);
+               if (ret < 0) {
+                       pm_runtime_put_sync(dev);
+                       return ret;
+               }
+
                ret = csiphy_set_clock_rates(csiphy);
                if (ret < 0) {
+                       regulator_bulk_disable(csiphy->num_supplies,
+                                              csiphy->supplies);
                        pm_runtime_put_sync(dev);
                        return ret;
                }
 
                ret = camss_enable_clocks(csiphy->nclocks, csiphy->clock, dev);
                if (ret < 0) {
+                       regulator_bulk_disable(csiphy->num_supplies,
+                                              csiphy->supplies);
                        pm_runtime_put_sync(dev);
                        return ret;
                }
@@ -234,6 +245,8 @@ static int csiphy_set_power(struct v4l2_subdev *sd, int on)
 
                camss_disable_clocks(csiphy->nclocks, csiphy->clock);
 
+               regulator_bulk_disable(csiphy->num_supplies, csiphy->supplies);
+
                pm_runtime_put_sync(dev);
        }
 
@@ -676,7 +689,27 @@ int msm_csiphy_subdev_init(struct camss *camss,
                }
        }
 
-       return 0;
+       /* CSIPHY supplies */
+       for (i = 0; i < ARRAY_SIZE(res->regulators); i++) {
+               if (res->regulators[i])
+                       csiphy->num_supplies++;
+       }
+
+       if (csiphy->num_supplies) {
+               csiphy->supplies = devm_kmalloc_array(camss->dev,
+                                                     csiphy->num_supplies,
+                                                     sizeof(*csiphy->supplies),
+                                                     GFP_KERNEL);
+               if (!csiphy->supplies)
+                       return -ENOMEM;
+       }
+
+       for (i = 0; i < csiphy->num_supplies; i++)
+               csiphy->supplies[i].supply = res->regulators[i];
+
+       ret = devm_regulator_bulk_get(camss->dev, csiphy->num_supplies,
+                                     csiphy->supplies);
+       return ret;
 }
 
 /*
index 47f0b6b09eba4dcf69e7943e89356c2e2d34d4d0..eebc1ff1cfabc7d8b30e921371c23fff8a0918d8 100644 (file)
@@ -91,6 +91,8 @@ struct csiphy_device {
        bool *rate_set;
        int nclocks;
        u32 timer_clk_rate;
+       struct regulator_bulk_data *supplies;
+       int num_supplies;
        struct csiphy_config cfg;
        struct v4l2_mbus_framefmt fmt[MSM_CSIPHY_PADS_NUM];
        const struct csiphy_subdev_resources *res;