[v2,2/5] media: qcom: camss: Convert to per-VFE pointer for power-domain linkages
Commit Message
Right now we use the top-level camss structure to provide pointers via
VFE id index back to genpd linkages.
In effect this hard-codes VFE indexes to power-domain indexes in the
dtsi and mandates a very particular ordering of power domains in the
dtsi, which bears no relationship to a real hardware dependency.
As a first step to rationalising the VFE power-domain code and breaking
the magic indexing in dtsi use per-VFE pointers to genpd linkages.
The top-level index in msm_vfe_subdev_init is still used to attain the
initial so no functional or logical change arises from this change.
Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
---
drivers/media/platform/qcom/camss/camss-vfe-170.c | 15 +++++++--------
drivers/media/platform/qcom/camss/camss-vfe-4-7.c | 15 +++++----------
drivers/media/platform/qcom/camss/camss-vfe-4-8.c | 13 +++++--------
drivers/media/platform/qcom/camss/camss-vfe-480.c | 15 +++++++--------
drivers/media/platform/qcom/camss/camss-vfe.c | 3 +++
drivers/media/platform/qcom/camss/camss-vfe.h | 2 ++
6 files changed, 29 insertions(+), 34 deletions(-)
Comments
On 10/26/23 17:50, Bryan O'Donoghue wrote:
> Right now we use the top-level camss structure to provide pointers via
> VFE id index back to genpd linkages.
>
> In effect this hard-codes VFE indexes to power-domain indexes in the
> dtsi and mandates a very particular ordering of power domains in the
> dtsi, which bears no relationship to a real hardware dependency.
>
> As a first step to rationalising the VFE power-domain code and breaking
> the magic indexing in dtsi use per-VFE pointers to genpd linkages.
>
> The top-level index in msm_vfe_subdev_init is still used to attain the
> initial so no functional or logical change arises from this change.
>
> Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
> ---
Reviewed-by: Konrad Dybcio <konrad.dybcio@linaro.org>
Konrad
> + if (vfe->id >= camss->res->vfe_num)
> return 0;
P.S. this seems better suited for some warning, I think
On 26/10/2023 21:08, Konrad Dybcio wrote:
>> + if (vfe->id >= camss->res->vfe_num)
>> return 0;
> P.S. this seems better suited for some warning, I think
Noo this indicates VFE lite !
power-domains = <VFE_0>,
<VFE_1>,
<TITAN_TOP>; // the controller pd
vfe-set = <VFE_0>, // has its own PD vfe->id = 0
<VFE_1>, // has its own PD vfe->id = 1
<VFE_LITE_N>; // has no PD vfe->id = 2
The basic problem this series fixes is magic indexing.
In the first instance, using named power-domains so that the ordering of
declaration doesn't matter and we don't have funky code inferring if a
power-domain belongs to the TOP or not.
Secondly though, which is what the first patch in the series does - is
as I rebased I realised the VFE/VFE Lite thing was still there.
what vfe->id >= camss->res->vfe_num does is checks to see if the vfe->id
<= a VFE not a VFE Lite id.
in other words we have yet another magic indexing problem requiring
VFE_LITE_N to always be declared after VFE.
The solution here is
1. Make the driver support not caring about indexes any more
This series.
2. Name the power-domains in the various dtsis
Populating the struct resources in CAMSS to match
Next series
3. Gate new SoCs to _require_ named pds
Deprecate the legacy indexing support of 'n' kernel releases
4. Profit
So yeah the check above is I'm sorry to say not an error at all it
implies VFE Lite...
---
bod
On 27/10/2023 10:10, Bryan O'Donoghue wrote:
> power-domains = <VFE_0>,
> <VFE_1>,
> <TITAN_TOP>; // the controller pd
>
> vfe-set = <VFE_0>, // has its own PD vfe->id = 0
> <VFE_1>, // has its own PD vfe->id = 1
> <VFE_LITE_N>; // has no PD vfe->id = 2
>
> The basic problem this series fixes is magic indexing.
So be a little clearer; this would be an invalid declaration in dtsi
right now
power-domains = <TITAN_TOP>, // has to come last
<VFE_0>,
<VFE_1>; // the code would think this TOP
The TOP GDSC must come last.
Similarly this would an invalid declaration in our resource structure
vfe-set = <VFE_LITE_0>, //the code thinks this is a VFE
<VFE_LITE_1>, //the code thinks this is a VFE
<VFE_0>,
<VFE_1>; // and that this is VFE Lite
vfe_num = 2;
vfe-id = {0..3}
// don't hook a PD for VFE Lite
if (vfe->id >= camss->res->vfe_num)
return 0;
has_pd fixes checks like that. Eventually we will throw away has_pd when
legacy indexing is dropped - in which case if vfe->id has a res->pd_name
we hook it, if not, then not.
The order of declaration won't matter.
---
bod
@@ -638,7 +638,7 @@ static void vfe_pm_domain_off(struct vfe_device *vfe)
if (vfe->id >= camss->res->vfe_num)
return;
- device_link_del(camss->genpd_link[vfe->id]);
+ device_link_del(vfe->genpd_link);
}
/*
@@ -648,16 +648,15 @@ static void vfe_pm_domain_off(struct vfe_device *vfe)
static int vfe_pm_domain_on(struct vfe_device *vfe)
{
struct camss *camss = vfe->camss;
- enum vfe_line_id id = vfe->id;
- if (id >= camss->res->vfe_num)
+ if (vfe->id >= camss->res->vfe_num)
return 0;
- camss->genpd_link[id] = device_link_add(camss->dev, camss->genpd[id],
- DL_FLAG_STATELESS |
- DL_FLAG_PM_RUNTIME |
- DL_FLAG_RPM_ACTIVE);
- if (!camss->genpd_link[id])
+ vfe->genpd_link = device_link_add(camss->dev, vfe->genpd,
+ DL_FLAG_STATELESS |
+ DL_FLAG_PM_RUNTIME |
+ DL_FLAG_RPM_ACTIVE);
+ if (!vfe->genpd_link)
return -EINVAL;
return 0;
@@ -1109,14 +1109,10 @@ static void vfe_isr_read(struct vfe_device *vfe, u32 *value0, u32 *value1)
*/
static void vfe_pm_domain_off(struct vfe_device *vfe)
{
- struct camss *camss;
-
if (!vfe)
return;
- camss = vfe->camss;
-
- device_link_del(camss->genpd_link[vfe->id]);
+ device_link_del(vfe->genpd_link);
}
/*
@@ -1126,13 +1122,12 @@ static void vfe_pm_domain_off(struct vfe_device *vfe)
static int vfe_pm_domain_on(struct vfe_device *vfe)
{
struct camss *camss = vfe->camss;
- enum vfe_line_id id = vfe->id;
- camss->genpd_link[id] = device_link_add(camss->dev, camss->genpd[id], DL_FLAG_STATELESS |
- DL_FLAG_PM_RUNTIME | DL_FLAG_RPM_ACTIVE);
+ vfe->genpd_link = device_link_add(camss->dev, vfe->genpd, DL_FLAG_STATELESS |
+ DL_FLAG_PM_RUNTIME | DL_FLAG_RPM_ACTIVE);
- if (!camss->genpd_link[id]) {
- dev_err(vfe->camss->dev, "Failed to add VFE#%d to power domain\n", id);
+ if (!vfe->genpd_link) {
+ dev_err(vfe->camss->dev, "Failed to add VFE#%d to power domain\n", vfe->id);
return -EINVAL;
}
@@ -1099,9 +1099,7 @@ static void vfe_isr_read(struct vfe_device *vfe, u32 *value0, u32 *value1)
*/
static void vfe_pm_domain_off(struct vfe_device *vfe)
{
- struct camss *camss = vfe->camss;
-
- device_link_del(camss->genpd_link[vfe->id]);
+ device_link_del(vfe->genpd_link);
}
/*
@@ -1111,13 +1109,12 @@ static void vfe_pm_domain_off(struct vfe_device *vfe)
static int vfe_pm_domain_on(struct vfe_device *vfe)
{
struct camss *camss = vfe->camss;
- enum vfe_line_id id = vfe->id;
- camss->genpd_link[id] = device_link_add(camss->dev, camss->genpd[id], DL_FLAG_STATELESS |
- DL_FLAG_PM_RUNTIME | DL_FLAG_RPM_ACTIVE);
+ vfe->genpd_link = device_link_add(camss->dev, vfe->genpd, DL_FLAG_STATELESS |
+ DL_FLAG_PM_RUNTIME | DL_FLAG_RPM_ACTIVE);
- if (!camss->genpd_link[id]) {
- dev_err(vfe->camss->dev, "Failed to add VFE#%d to power domain\n", id);
+ if (!vfe->genpd_link) {
+ dev_err(vfe->camss->dev, "Failed to add VFE#%d to power domain\n", vfe->id);
return -EINVAL;
}
@@ -463,7 +463,7 @@ static void vfe_pm_domain_off(struct vfe_device *vfe)
if (vfe->id >= camss->res->vfe_num)
return;
- device_link_del(camss->genpd_link[vfe->id]);
+ device_link_del(vfe->genpd_link);
}
/*
@@ -473,16 +473,15 @@ static void vfe_pm_domain_off(struct vfe_device *vfe)
static int vfe_pm_domain_on(struct vfe_device *vfe)
{
struct camss *camss = vfe->camss;
- enum vfe_line_id id = vfe->id;
- if (id >= camss->res->vfe_num)
+ if (vfe->id >= camss->res->vfe_num)
return 0;
- camss->genpd_link[id] = device_link_add(camss->dev, camss->genpd[id],
- DL_FLAG_STATELESS |
- DL_FLAG_PM_RUNTIME |
- DL_FLAG_RPM_ACTIVE);
- if (!camss->genpd_link[id])
+ vfe->genpd_link = device_link_add(camss->dev, vfe->genpd,
+ DL_FLAG_STATELESS |
+ DL_FLAG_PM_RUNTIME |
+ DL_FLAG_RPM_ACTIVE);
+ if (!vfe->genpd_link)
return -EINVAL;
return 0;
@@ -1347,6 +1347,9 @@ int msm_vfe_subdev_init(struct camss *camss, struct vfe_device *vfe,
if (!res->line_num)
return -EINVAL;
+ if (res->has_pd)
+ vfe->genpd = camss->genpd[id];
+
vfe->line_num = res->line_num;
vfe->ops->subdev_init(dev, vfe);
@@ -150,6 +150,8 @@ struct vfe_device {
const struct vfe_hw_ops_gen1 *ops_gen1;
struct vfe_isr_ops isr_ops;
struct camss_video_ops video_ops;
+ struct device *genpd;
+ struct device_link *genpd_link;
};
struct camss_subdev_resources;