summaryrefslogtreecommitdiff
path: root/drivers/media/platform/ti-vpe
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2020-07-06 20:35:37 +0200
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>2020-07-19 08:35:18 +0200
commit5e19ffe77c096eab64f8a7893d58d80e725844c1 (patch)
treeb9820c53a3807737b07fc19028e6b5dc1f5226fb /drivers/media/platform/ti-vpe
parent649e9535f15772be3b4cfbd621a9327db7b0289a (diff)
media: ti-vpe: cal: Store PHY regmap fields in struct cc_data
The PHY regmap fields are created dynamically at runtime. They don't belong to the platform data that should be constant. Move them to the cc_data structure. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Tomi Valkeinen <tomi.valkeinen@ti.com> Reviewed-by: Benoit Parrot <bparrot@ti.com> Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl> Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
Diffstat (limited to 'drivers/media/platform/ti-vpe')
-rw-r--r--drivers/media/platform/ti-vpe/cal.c92
1 files changed, 47 insertions, 45 deletions
diff --git a/drivers/media/platform/ti-vpe/cal.c b/drivers/media/platform/ti-vpe/cal.c
index ff2afcfdff01..3df97708e044 100644
--- a/drivers/media/platform/ti-vpe/cal.c
+++ b/drivers/media/platform/ti-vpe/cal.c
@@ -215,13 +215,6 @@ struct cal_dmaqueue {
int ini_jiffies;
};
-struct cc_data {
- void __iomem *base;
- struct resource *res;
-
- struct platform_device *pdev;
-};
-
/* CTRL_CORE_CAMERRX_CONTROL register field id */
enum cal_camerarx_field {
F_CTRLCLKEN,
@@ -232,8 +225,17 @@ enum cal_camerarx_field {
F_MAX_FIELDS,
};
+struct cc_data {
+ void __iomem *base;
+ struct resource *res;
+ struct platform_device *pdev;
+
+ struct {
+ struct regmap_field *fields[F_MAX_FIELDS];
+ } phy;
+};
+
struct cal_csi2_phy {
- struct regmap_field *fields[F_MAX_FIELDS];
struct {
unsigned int lsb;
unsigned int msb;
@@ -477,37 +479,37 @@ static u32 cal_data_get_num_csi2_phy(struct cal_dev *dev)
return dev->data->num_csi2_phy;
}
-static int cal_camerarx_regmap_init(struct cal_dev *dev)
+static int cal_camerarx_regmap_init(struct cal_dev *dev, struct cc_data *cc,
+ unsigned int idx)
{
- struct cal_csi2_phy *phy;
- unsigned int i, j;
+ const struct cal_csi2_phy *phy;
+ unsigned int i;
if (!dev->data)
return -EINVAL;
- for (i = 0; i < cal_data_get_num_csi2_phy(dev); i++) {
- phy = &dev->data->csi2_phy_core[i];
- for (j = 0; j < F_MAX_FIELDS; j++) {
- struct reg_field field = {
- .reg = dev->syscon_camerrx_offset,
- .lsb = phy->base_fields[j].lsb,
- .msb = phy->base_fields[j].msb,
- };
-
- /*
- * Here we update the reg offset with the
- * value found in DT
- */
- phy->fields[j] =
- devm_regmap_field_alloc(&dev->pdev->dev,
- dev->syscon_camerrx,
- field);
- if (IS_ERR(phy->fields[j])) {
- cal_err(dev, "Unable to allocate regmap fields\n");
- return PTR_ERR(phy->fields[j]);
- }
+ phy = &dev->data->csi2_phy_core[idx];
+
+ for (i = 0; i < F_MAX_FIELDS; i++) {
+ struct reg_field field = {
+ .reg = dev->syscon_camerrx_offset,
+ .lsb = phy->base_fields[i].lsb,
+ .msb = phy->base_fields[i].msb,
+ };
+
+ /*
+ * Here we update the reg offset with the
+ * value found in DT
+ */
+ cc->phy.fields[i] = devm_regmap_field_alloc(&dev->pdev->dev,
+ dev->syscon_camerrx,
+ field);
+ if (IS_ERR(cc->phy.fields[i])) {
+ cal_err(dev, "Unable to allocate regmap fields\n");
+ return PTR_ERR(cc->phy.fields[i]);
}
}
+
return 0;
}
@@ -554,28 +556,26 @@ static struct regmap *cal_get_camerarx_regmap(struct cal_dev *dev)
*/
static void camerarx_phy_enable(struct cal_ctx *ctx)
{
- struct cal_csi2_phy *phy;
u32 phy_id = ctx->csi2_port;
+ struct cc_data *cc = ctx->dev->cc[phy_id];
u32 max_lanes;
- phy = &ctx->dev->data->csi2_phy_core[phy_id];
- regmap_field_write(phy->fields[F_CAMMODE], 0);
+ regmap_field_write(cc->phy.fields[F_CAMMODE], 0);
/* Always enable all lanes at the phy control level */
max_lanes = (1 << cal_data_get_phy_max_lanes(ctx)) - 1;
- regmap_field_write(phy->fields[F_LANEENABLE], max_lanes);
+ regmap_field_write(cc->phy.fields[F_LANEENABLE], max_lanes);
/* F_CSI_MODE is not present on every architecture */
- if (phy->fields[F_CSI_MODE])
- regmap_field_write(phy->fields[F_CSI_MODE], 1);
- regmap_field_write(phy->fields[F_CTRLCLKEN], 1);
+ if (cc->phy.fields[F_CSI_MODE])
+ regmap_field_write(cc->phy.fields[F_CSI_MODE], 1);
+ regmap_field_write(cc->phy.fields[F_CTRLCLKEN], 1);
}
static void camerarx_phy_disable(struct cal_ctx *ctx)
{
- struct cal_csi2_phy *phy;
u32 phy_id = ctx->csi2_port;
+ struct cc_data *cc = ctx->dev->cc[phy_id];
- phy = &ctx->dev->data->csi2_phy_core[phy_id];
- regmap_field_write(phy->fields[F_CTRLCLKEN], 0);
+ regmap_field_write(cc->phy.fields[F_CTRLCLKEN], 0);
}
/*
@@ -585,6 +585,7 @@ static struct cc_data *cc_create(struct cal_dev *dev, unsigned int core)
{
struct platform_device *pdev = dev->pdev;
struct cc_data *cc;
+ int ret;
cc = devm_kzalloc(&pdev->dev, sizeof(*cc), GFP_KERNEL);
if (!cc)
@@ -604,6 +605,10 @@ static struct cc_data *cc_create(struct cal_dev *dev, unsigned int core)
cal_dbg(1, dev, "ioresource %s at %pa - %pa\n",
cc->res->name, &cc->res->start, &cc->res->end);
+ ret = cal_camerarx_regmap_init(dev, cc, core);
+ if (ret)
+ return ERR_PTR(ret);
+
return cc;
}
@@ -2322,9 +2327,6 @@ static int cal_probe(struct platform_device *pdev)
dev->syscon_camerrx = syscon_camerrx;
dev->syscon_camerrx_offset = syscon_camerrx_offset;
- ret = cal_camerarx_regmap_init(dev);
- if (ret)
- return ret;
dev->res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
"cal_top");