media: qcom: camss: Convert to per-VFE pointer for power-domain linkages

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.

Reviewed-by: Konrad Dybcio <konrad.dybcio@linaro.org>
Tested-by: Matti Lehtimäki <matti.lehtimaki@gmail.com>
Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
This commit is contained in:
Bryan O'Donoghue 2023-11-23 17:03:01 +00:00 committed by Hans Verkuil
parent ac6494e0ca
commit a409b3f08d
6 changed files with 29 additions and 34 deletions

View File

@ -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;

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;

View File

@ -1345,6 +1345,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);

View File

@ -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;