* [PATCH v3 0/2] media: staging: rkisp1: fix fwnode API usage and remove v4l2_mbus_config field
@ 2020-03-17 18:06 Dafna Hirschfeld
2020-03-17 18:07 ` [PATCH v3 1/2] media: staging: rkisp1: remove mbus field from rkisp1_sensor_async Dafna Hirschfeld
2020-03-17 18:07 ` [PATCH v3 2/2] media: staging: rkisp1: replace the call to v4l2_async_notifier_parse_fwnode_endpoints_by_port Dafna Hirschfeld
0 siblings, 2 replies; 5+ messages in thread
From: Dafna Hirschfeld @ 2020-03-17 18:06 UTC (permalink / raw)
To: linux-media
Cc: dafna.hirschfeld, helen.koike, ezequiel, hverkuil, kernel,
dafna3, mchehab, laurent.pinchart, sakari.ailus, linux-rockchip
This patchset fixes usage of the APIs.
This fixes the item in the TODO file:
* Don't use v4l2_async_notifier_parse_fwnode_endpoints_by_port().
e.g. isp_parse_of_endpoints in drivers/media/platform/omap3isp/isp.c
cio2_parse_firmware in drivers/media/pci/intel/ipu3/ipu3-cio2.c.
Patches summary:
- The first patch removes the field v4l2_mbus_config from
'struct rkisp1_sensor_async'.
- The second patch removes the usage of
v4l2_async_notifier_parse_fwnode_endpoints_by_port.
The code is very similar to the code in the function cio2_parse_firmware
but instead of iterating the ports it iterates the id's.
The patch also removes the relevant item from the TODO file.
changes since v1:
- patch 2 - in the function rkisp1_subdev_notifier:
1. move the test 'if (next_id == 0)' outside of the while loop
2. remove the 'end' label.
The changes are due to Helen Koike's comments
changes since v2:
patch 1: rename the field parallel_bus_flags to mbus_flags
and set it to vep->bus.mipi_csi2.flags instead of 0
so that the original logic does not change, but only the fields names.
patch 2: in the function rkisp1_subdev_notifier:
- remove a newline between a call to 'fwnode_graph_get_endpoint_by_id' to the test of its ret value.
- define 'next_id' as 'unsigned int' instead of 'int'
- rename 'parallel_bus_flags' to 'mbus_flags' and set it to vep.bus.mipi_csi2.flags instead of 0
(this follows previous patch of the series)
- when no remote sensor is found, log it with dev_dbg instead of dev_warn
Dafna Hirschfeld (2):
media: staging: rkisp1: remove mbus field from rkisp1_sensor_async
media: staging: rkisp1: replace the call to
v4l2_async_notifier_parse_fwnode_endpoints_by_port
drivers/staging/media/rkisp1/TODO | 3 -
drivers/staging/media/rkisp1/rkisp1-common.h | 3 +-
drivers/staging/media/rkisp1/rkisp1-dev.c | 104 ++++++++++---------
drivers/staging/media/rkisp1/rkisp1-isp.c | 52 +++-------
4 files changed, 72 insertions(+), 90 deletions(-)
--
2.17.1
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v3 1/2] media: staging: rkisp1: remove mbus field from rkisp1_sensor_async
2020-03-17 18:06 [PATCH v3 0/2] media: staging: rkisp1: fix fwnode API usage and remove v4l2_mbus_config field Dafna Hirschfeld
@ 2020-03-17 18:07 ` Dafna Hirschfeld
2020-03-31 22:40 ` Helen Koike
2020-03-17 18:07 ` [PATCH v3 2/2] media: staging: rkisp1: replace the call to v4l2_async_notifier_parse_fwnode_endpoints_by_port Dafna Hirschfeld
1 sibling, 1 reply; 5+ messages in thread
From: Dafna Hirschfeld @ 2020-03-17 18:07 UTC (permalink / raw)
To: linux-media
Cc: dafna.hirschfeld, helen.koike, ezequiel, hverkuil, kernel,
dafna3, mchehab, laurent.pinchart, sakari.ailus, linux-rockchip
'struct v4l2_mbus_config' is a legacy struct that should not be used
in new drivers. So replace it with the fields:
enum v4l2_mbus_type mbus_type;
unsigned int mbus_flags;
Signed-off-by: Dafna Hirschfeld <dafna.hirschfeld@collabora.com>
---
no changes since v1.
changes since v2:
- rename the field 'parallel_bus_flags' to 'mbus_flags'
and set it to vep->bus.mipi_csi2.flags instead of 0.
change the commit log accordingly.
drivers/staging/media/rkisp1/rkisp1-common.h | 3 +-
drivers/staging/media/rkisp1/rkisp1-dev.c | 20 ++------
drivers/staging/media/rkisp1/rkisp1-isp.c | 52 +++++++-------------
3 files changed, 22 insertions(+), 53 deletions(-)
diff --git a/drivers/staging/media/rkisp1/rkisp1-common.h b/drivers/staging/media/rkisp1/rkisp1-common.h
index b291cc60de8e..e7b2dcb831a1 100644
--- a/drivers/staging/media/rkisp1/rkisp1-common.h
+++ b/drivers/staging/media/rkisp1/rkisp1-common.h
@@ -80,8 +80,9 @@ enum rkisp1_isp_pad {
*/
struct rkisp1_sensor_async {
struct v4l2_async_subdev asd;
- struct v4l2_mbus_config mbus;
unsigned int lanes;
+ enum v4l2_mbus_type mbus_type;
+ unsigned int mbus_flags;
struct v4l2_subdev *sd;
struct v4l2_ctrl *pixel_rate_ctrl;
struct phy *dphy;
diff --git a/drivers/staging/media/rkisp1/rkisp1-dev.c b/drivers/staging/media/rkisp1/rkisp1-dev.c
index b1b3c058e957..fcd2a3a4cc78 100644
--- a/drivers/staging/media/rkisp1/rkisp1-dev.c
+++ b/drivers/staging/media/rkisp1/rkisp1-dev.c
@@ -250,26 +250,12 @@ static int rkisp1_fwnode_parse(struct device *dev,
return -EINVAL;
}
- s_asd->mbus.type = vep->bus_type;
- s_asd->mbus.flags = vep->bus.mipi_csi2.flags;
+ s_asd->mbus_type = vep->bus_type;
+ s_asd->mbus_flags = vep->bus.mipi_csi2.flags;
s_asd->lanes = vep->bus.mipi_csi2.num_data_lanes;
- switch (vep->bus.mipi_csi2.num_data_lanes) {
- case 1:
- s_asd->mbus.flags |= V4L2_MBUS_CSI2_1_LANE;
- break;
- case 2:
- s_asd->mbus.flags |= V4L2_MBUS_CSI2_2_LANE;
- break;
- case 3:
- s_asd->mbus.flags |= V4L2_MBUS_CSI2_3_LANE;
- break;
- case 4:
- s_asd->mbus.flags |= V4L2_MBUS_CSI2_4_LANE;
- break;
- default:
+ if (s_asd->lanes < 1 || s_asd->lanes > 4)
return -EINVAL;
- }
return 0;
}
diff --git a/drivers/staging/media/rkisp1/rkisp1-isp.c b/drivers/staging/media/rkisp1/rkisp1-isp.c
index fa53f05e37d8..c69442005d8b 100644
--- a/drivers/staging/media/rkisp1/rkisp1-isp.c
+++ b/drivers/staging/media/rkisp1/rkisp1-isp.c
@@ -291,7 +291,7 @@ static int rkisp1_config_isp(struct rkisp1_device *rkisp1)
if (sink_fmt->fmt_type == RKISP1_FMT_BAYER) {
acq_mult = 1;
if (src_fmt->fmt_type == RKISP1_FMT_BAYER) {
- if (sensor->mbus.type == V4L2_MBUS_BT656)
+ if (sensor->mbus_type == V4L2_MBUS_BT656)
isp_ctrl = RKISP1_CIF_ISP_CTRL_ISP_MODE_RAW_PICT_ITU656;
else
isp_ctrl = RKISP1_CIF_ISP_CTRL_ISP_MODE_RAW_PICT;
@@ -299,17 +299,17 @@ static int rkisp1_config_isp(struct rkisp1_device *rkisp1)
rkisp1_write(rkisp1, RKISP1_CIF_ISP_DEMOSAIC_TH(0xc),
RKISP1_CIF_ISP_DEMOSAIC);
- if (sensor->mbus.type == V4L2_MBUS_BT656)
+ if (sensor->mbus_type == V4L2_MBUS_BT656)
isp_ctrl = RKISP1_CIF_ISP_CTRL_ISP_MODE_BAYER_ITU656;
else
isp_ctrl = RKISP1_CIF_ISP_CTRL_ISP_MODE_BAYER_ITU601;
}
} else if (sink_fmt->fmt_type == RKISP1_FMT_YUV) {
acq_mult = 2;
- if (sensor->mbus.type == V4L2_MBUS_CSI2_DPHY) {
+ if (sensor->mbus_type == V4L2_MBUS_CSI2_DPHY) {
isp_ctrl = RKISP1_CIF_ISP_CTRL_ISP_MODE_ITU601;
} else {
- if (sensor->mbus.type == V4L2_MBUS_BT656)
+ if (sensor->mbus_type == V4L2_MBUS_BT656)
isp_ctrl = RKISP1_CIF_ISP_CTRL_ISP_MODE_ITU656;
else
isp_ctrl = RKISP1_CIF_ISP_CTRL_ISP_MODE_ITU601;
@@ -319,17 +319,17 @@ static int rkisp1_config_isp(struct rkisp1_device *rkisp1)
}
/* Set up input acquisition properties */
- if (sensor->mbus.type == V4L2_MBUS_BT656 ||
- sensor->mbus.type == V4L2_MBUS_PARALLEL) {
- if (sensor->mbus.flags & V4L2_MBUS_PCLK_SAMPLE_RISING)
+ if (sensor->mbus_type == V4L2_MBUS_BT656 ||
+ sensor->mbus_type == V4L2_MBUS_PARALLEL) {
+ if (sensor->mbus_flags & V4L2_MBUS_PCLK_SAMPLE_RISING)
signal = RKISP1_CIF_ISP_ACQ_PROP_POS_EDGE;
}
- if (sensor->mbus.type == V4L2_MBUS_PARALLEL) {
- if (sensor->mbus.flags & V4L2_MBUS_VSYNC_ACTIVE_LOW)
+ if (sensor->mbus_type == V4L2_MBUS_PARALLEL) {
+ if (sensor->mbus_flags & V4L2_MBUS_VSYNC_ACTIVE_LOW)
signal |= RKISP1_CIF_ISP_ACQ_PROP_VSYNC_LOW;
- if (sensor->mbus.flags & V4L2_MBUS_HSYNC_ACTIVE_LOW)
+ if (sensor->mbus_flags & V4L2_MBUS_HSYNC_ACTIVE_LOW)
signal |= RKISP1_CIF_ISP_ACQ_PROP_HSYNC_LOW;
}
@@ -401,29 +401,11 @@ static int rkisp1_config_dvp(struct rkisp1_device *rkisp1)
static int rkisp1_config_mipi(struct rkisp1_device *rkisp1)
{
const struct rkisp1_isp_mbus_info *sink_fmt = rkisp1->isp.sink_fmt;
- unsigned int lanes;
+ unsigned int lanes = rkisp1->active_sensor->lanes;
u32 mipi_ctrl;
- /*
- * rkisp1->active_sensor->mbus is set in isp or d-phy notifier_bound
- * function
- */
- switch (rkisp1->active_sensor->mbus.flags & V4L2_MBUS_CSI2_LANES) {
- case V4L2_MBUS_CSI2_4_LANE:
- lanes = 4;
- break;
- case V4L2_MBUS_CSI2_3_LANE:
- lanes = 3;
- break;
- case V4L2_MBUS_CSI2_2_LANE:
- lanes = 2;
- break;
- case V4L2_MBUS_CSI2_1_LANE:
- lanes = 1;
- break;
- default:
+ if (lanes < 1 || lanes > 4)
return -EINVAL;
- }
mipi_ctrl = RKISP1_CIF_MIPI_CTRL_NUM_LANES(lanes - 1) |
RKISP1_CIF_MIPI_CTRL_SHUTDOWNLANES(0xf) |
@@ -470,11 +452,11 @@ static int rkisp1_config_path(struct rkisp1_device *rkisp1)
u32 dpcl = rkisp1_read(rkisp1, RKISP1_CIF_VI_DPCL);
int ret = 0;
- if (sensor->mbus.type == V4L2_MBUS_BT656 ||
- sensor->mbus.type == V4L2_MBUS_PARALLEL) {
+ if (sensor->mbus_type == V4L2_MBUS_BT656 ||
+ sensor->mbus_type == V4L2_MBUS_PARALLEL) {
ret = rkisp1_config_dvp(rkisp1);
dpcl |= RKISP1_CIF_VI_DPCL_IF_SEL_PARALLEL;
- } else if (sensor->mbus.type == V4L2_MBUS_CSI2_DPHY) {
+ } else if (sensor->mbus_type == V4L2_MBUS_CSI2_DPHY) {
ret = rkisp1_config_mipi(rkisp1);
dpcl |= RKISP1_CIF_VI_DPCL_IF_SEL_MIPI;
}
@@ -561,7 +543,7 @@ static void rkisp1_isp_start(struct rkisp1_device *rkisp1)
rkisp1_config_clk(rkisp1);
/* Activate MIPI */
- if (sensor->mbus.type == V4L2_MBUS_CSI2_DPHY) {
+ if (sensor->mbus_type == V4L2_MBUS_CSI2_DPHY) {
val = rkisp1_read(rkisp1, RKISP1_CIF_MIPI_CTRL);
rkisp1_write(rkisp1, val | RKISP1_CIF_MIPI_CTRL_OUTPUT_ENA,
RKISP1_CIF_MIPI_CTRL);
@@ -956,7 +938,7 @@ static int rkisp1_isp_s_stream(struct v4l2_subdev *sd, int enable)
rkisp1->active_sensor = container_of(sensor_sd->asd,
struct rkisp1_sensor_async, asd);
- if (rkisp1->active_sensor->mbus.type != V4L2_MBUS_CSI2_DPHY)
+ if (rkisp1->active_sensor->mbus_type != V4L2_MBUS_CSI2_DPHY)
return -EINVAL;
atomic_set(&rkisp1->isp.frame_sequence, -1);
--
2.17.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v3 2/2] media: staging: rkisp1: replace the call to v4l2_async_notifier_parse_fwnode_endpoints_by_port
2020-03-17 18:06 [PATCH v3 0/2] media: staging: rkisp1: fix fwnode API usage and remove v4l2_mbus_config field Dafna Hirschfeld
2020-03-17 18:07 ` [PATCH v3 1/2] media: staging: rkisp1: remove mbus field from rkisp1_sensor_async Dafna Hirschfeld
@ 2020-03-17 18:07 ` Dafna Hirschfeld
2020-03-31 22:40 ` Helen Koike
1 sibling, 1 reply; 5+ messages in thread
From: Dafna Hirschfeld @ 2020-03-17 18:07 UTC (permalink / raw)
To: linux-media
Cc: dafna.hirschfeld, helen.koike, ezequiel, hverkuil, kernel,
dafna3, mchehab, laurent.pinchart, sakari.ailus, linux-rockchip
don't call 'v4l2_async_notifier_parse_fwnode_endpoints_by_port'
in order to register async subdevices. Instead call
'v4l2_fwnode_endpoint_parse' to parse the remote endpoints
and then register each async subdev with
'v4l2_async_notifier_add_fwnode_remote_subdev'
Also remove the relevant item in the TODO file
Signed-off-by: Dafna Hirschfeld <dafna.hirschfeld@collabora.com>
---
changes since v1:
in the function rkisp1_subdev_notifier:
1. move the test 'if (next_id == 0)' outside of the while loop
2. remove the 'end' label.
The changes are due to Helen Koike's comments
changes since v2:
in the function rkisp1_subdev_notifier:
1. remove a newline between a call to fwnode_graph_get_endpoint_by_id to the test of its ret value
2. define 'next_id' as 'unsigned int' instead of 'int'
3. rename 'parallel_bus_flags' to 'mbus_flags' and set it to vep.bus.mipi_csi2.flags instead of 0
(this follows previous patch of the series)
4. when no remote sensor is found, log it with dev_dbg instead of dev_warn
drivers/staging/media/rkisp1/TODO | 3 -
drivers/staging/media/rkisp1/rkisp1-dev.c | 90 +++++++++++++----------
2 files changed, 53 insertions(+), 40 deletions(-)
diff --git a/drivers/staging/media/rkisp1/TODO b/drivers/staging/media/rkisp1/TODO
index 0aa9877dd64a..1aa3bb9fd6cb 100644
--- a/drivers/staging/media/rkisp1/TODO
+++ b/drivers/staging/media/rkisp1/TODO
@@ -1,6 +1,3 @@
-* Don't use v4l2_async_notifier_parse_fwnode_endpoints_by_port().
-e.g. isp_parse_of_endpoints in drivers/media/platform/omap3isp/isp.c
-cio2_parse_firmware in drivers/media/pci/intel/ipu3/ipu3-cio2.c.
* Fix pad format size for statistics and parameters entities.
* Use threaded interrupt for rkisp1_stats_isr(), remove work queue.
* Fix checkpatch errors.
diff --git a/drivers/staging/media/rkisp1/rkisp1-dev.c b/drivers/staging/media/rkisp1/rkisp1-dev.c
index fcd2a3a4cc78..2eedabab4044 100644
--- a/drivers/staging/media/rkisp1/rkisp1-dev.c
+++ b/drivers/staging/media/rkisp1/rkisp1-dev.c
@@ -233,33 +233,6 @@ static int rkisp1_subdev_notifier_complete(struct v4l2_async_notifier *notifier)
return 0;
}
-static int rkisp1_fwnode_parse(struct device *dev,
- struct v4l2_fwnode_endpoint *vep,
- struct v4l2_async_subdev *asd)
-{
- struct rkisp1_sensor_async *s_asd =
- container_of(asd, struct rkisp1_sensor_async, asd);
-
- if (vep->bus_type != V4L2_MBUS_CSI2_DPHY) {
- dev_err(dev, "Only CSI2 bus type is currently supported\n");
- return -EINVAL;
- }
-
- if (vep->base.port != 0) {
- dev_err(dev, "The ISP has only port 0\n");
- return -EINVAL;
- }
-
- s_asd->mbus_type = vep->bus_type;
- s_asd->mbus_flags = vep->bus.mipi_csi2.flags;
- s_asd->lanes = vep->bus.mipi_csi2.num_data_lanes;
-
- if (s_asd->lanes < 1 || s_asd->lanes > 4)
- return -EINVAL;
-
- return 0;
-}
-
static const struct v4l2_async_notifier_operations rkisp1_subdev_notifier_ops = {
.bound = rkisp1_subdev_notifier_bound,
.unbind = rkisp1_subdev_notifier_unbind,
@@ -269,23 +242,66 @@ static const struct v4l2_async_notifier_operations rkisp1_subdev_notifier_ops =
static int rkisp1_subdev_notifier(struct rkisp1_device *rkisp1)
{
struct v4l2_async_notifier *ntf = &rkisp1->notifier;
- struct device *dev = rkisp1->dev;
+ unsigned int next_id = 0;
int ret;
v4l2_async_notifier_init(ntf);
- ret = v4l2_async_notifier_parse_fwnode_endpoints_by_port(dev, ntf,
- sizeof(struct rkisp1_sensor_async),
- 0, rkisp1_fwnode_parse);
- if (ret)
- return ret;
+ while (1) {
+ struct v4l2_fwnode_endpoint vep = {
+ .bus_type = V4L2_MBUS_CSI2_DPHY
+ };
+ struct rkisp1_sensor_async *rk_asd = NULL;
+ struct fwnode_handle *ep;
- if (list_empty(&ntf->asd_list))
- return -ENODEV;
+ ep = fwnode_graph_get_endpoint_by_id(dev_fwnode(rkisp1->dev),
+ 0, next_id, FWNODE_GRAPH_ENDPOINT_NEXT);
+ if (!ep)
+ break;
- ntf->ops = &rkisp1_subdev_notifier_ops;
+ ret = v4l2_fwnode_endpoint_parse(ep, &vep);
+ if (ret)
+ goto err_parse;
- return v4l2_async_notifier_register(&rkisp1->v4l2_dev, ntf);
+ rk_asd = kzalloc(sizeof(*rk_asd), GFP_KERNEL);
+ if (!rk_asd) {
+ ret = -ENOMEM;
+ goto err_parse;
+ }
+
+ rk_asd->mbus_type = vep.bus_type;
+ rk_asd->mbus_flags = vep.bus.mipi_csi2.flags;
+ rk_asd->lanes = vep.bus.mipi_csi2.num_data_lanes;
+
+ ret = v4l2_async_notifier_add_fwnode_remote_subdev(ntf, ep,
+ &rk_asd->asd);
+ if (ret)
+ goto err_parse;
+
+ dev_dbg(rkisp1->dev, "registered ep id %d with %d lanes\n",
+ vep.base.id, rk_asd->lanes);
+
+ next_id = vep.base.id + 1;
+
+ fwnode_handle_put(ep);
+
+ continue;
+err_parse:
+ fwnode_handle_put(ep);
+ kfree(rk_asd);
+ v4l2_async_notifier_cleanup(ntf);
+ return ret;
+ }
+
+ if (next_id == 0)
+ dev_dbg(rkisp1->dev, "no remote subdevice found\n");
+ ntf->ops = &rkisp1_subdev_notifier_ops;
+ ret = v4l2_async_notifier_register(&rkisp1->v4l2_dev, ntf);
+ if (ret) {
+ v4l2_async_notifier_cleanup(ntf);
+ return ret;
+ }
+ return 0;
}
/* ----------------------------------------------------------------------------
--
2.17.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v3 1/2] media: staging: rkisp1: remove mbus field from rkisp1_sensor_async
2020-03-17 18:07 ` [PATCH v3 1/2] media: staging: rkisp1: remove mbus field from rkisp1_sensor_async Dafna Hirschfeld
@ 2020-03-31 22:40 ` Helen Koike
0 siblings, 0 replies; 5+ messages in thread
From: Helen Koike @ 2020-03-31 22:40 UTC (permalink / raw)
To: Dafna Hirschfeld, linux-media
Cc: ezequiel, hverkuil, kernel, dafna3, mchehab, laurent.pinchart,
sakari.ailus, linux-rockchip
On 3/17/20 3:07 PM, Dafna Hirschfeld wrote:
> 'struct v4l2_mbus_config' is a legacy struct that should not be used
> in new drivers. So replace it with the fields:
>
> enum v4l2_mbus_type mbus_type;
> unsigned int mbus_flags;
>
> Signed-off-by: Dafna Hirschfeld <dafna.hirschfeld@collabora.com>
Acked-by: Helen Koike <helen.koike@collabora.com>
> ---
> no changes since v1.
>
> changes since v2:
> - rename the field 'parallel_bus_flags' to 'mbus_flags'
> and set it to vep->bus.mipi_csi2.flags instead of 0.
> change the commit log accordingly.
>
> drivers/staging/media/rkisp1/rkisp1-common.h | 3 +-
> drivers/staging/media/rkisp1/rkisp1-dev.c | 20 ++------
> drivers/staging/media/rkisp1/rkisp1-isp.c | 52 +++++++-------------
> 3 files changed, 22 insertions(+), 53 deletions(-)
>
> diff --git a/drivers/staging/media/rkisp1/rkisp1-common.h b/drivers/staging/media/rkisp1/rkisp1-common.h
> index b291cc60de8e..e7b2dcb831a1 100644
> --- a/drivers/staging/media/rkisp1/rkisp1-common.h
> +++ b/drivers/staging/media/rkisp1/rkisp1-common.h
> @@ -80,8 +80,9 @@ enum rkisp1_isp_pad {
> */
> struct rkisp1_sensor_async {
> struct v4l2_async_subdev asd;
> - struct v4l2_mbus_config mbus;
> unsigned int lanes;
> + enum v4l2_mbus_type mbus_type;
> + unsigned int mbus_flags;
> struct v4l2_subdev *sd;
> struct v4l2_ctrl *pixel_rate_ctrl;
> struct phy *dphy;
> diff --git a/drivers/staging/media/rkisp1/rkisp1-dev.c b/drivers/staging/media/rkisp1/rkisp1-dev.c
> index b1b3c058e957..fcd2a3a4cc78 100644
> --- a/drivers/staging/media/rkisp1/rkisp1-dev.c
> +++ b/drivers/staging/media/rkisp1/rkisp1-dev.c
> @@ -250,26 +250,12 @@ static int rkisp1_fwnode_parse(struct device *dev,
> return -EINVAL;
> }
>
> - s_asd->mbus.type = vep->bus_type;
> - s_asd->mbus.flags = vep->bus.mipi_csi2.flags;
> + s_asd->mbus_type = vep->bus_type;
> + s_asd->mbus_flags = vep->bus.mipi_csi2.flags;
> s_asd->lanes = vep->bus.mipi_csi2.num_data_lanes;
>
> - switch (vep->bus.mipi_csi2.num_data_lanes) {
> - case 1:
> - s_asd->mbus.flags |= V4L2_MBUS_CSI2_1_LANE;
> - break;
> - case 2:
> - s_asd->mbus.flags |= V4L2_MBUS_CSI2_2_LANE;
> - break;
> - case 3:
> - s_asd->mbus.flags |= V4L2_MBUS_CSI2_3_LANE;
> - break;
> - case 4:
> - s_asd->mbus.flags |= V4L2_MBUS_CSI2_4_LANE;
> - break;
> - default:
> + if (s_asd->lanes < 1 || s_asd->lanes > 4)
> return -EINVAL;
> - }
>
> return 0;
> }
> diff --git a/drivers/staging/media/rkisp1/rkisp1-isp.c b/drivers/staging/media/rkisp1/rkisp1-isp.c
> index fa53f05e37d8..c69442005d8b 100644
> --- a/drivers/staging/media/rkisp1/rkisp1-isp.c
> +++ b/drivers/staging/media/rkisp1/rkisp1-isp.c
> @@ -291,7 +291,7 @@ static int rkisp1_config_isp(struct rkisp1_device *rkisp1)
> if (sink_fmt->fmt_type == RKISP1_FMT_BAYER) {
> acq_mult = 1;
> if (src_fmt->fmt_type == RKISP1_FMT_BAYER) {
> - if (sensor->mbus.type == V4L2_MBUS_BT656)
> + if (sensor->mbus_type == V4L2_MBUS_BT656)
> isp_ctrl = RKISP1_CIF_ISP_CTRL_ISP_MODE_RAW_PICT_ITU656;
> else
> isp_ctrl = RKISP1_CIF_ISP_CTRL_ISP_MODE_RAW_PICT;
> @@ -299,17 +299,17 @@ static int rkisp1_config_isp(struct rkisp1_device *rkisp1)
> rkisp1_write(rkisp1, RKISP1_CIF_ISP_DEMOSAIC_TH(0xc),
> RKISP1_CIF_ISP_DEMOSAIC);
>
> - if (sensor->mbus.type == V4L2_MBUS_BT656)
> + if (sensor->mbus_type == V4L2_MBUS_BT656)
> isp_ctrl = RKISP1_CIF_ISP_CTRL_ISP_MODE_BAYER_ITU656;
> else
> isp_ctrl = RKISP1_CIF_ISP_CTRL_ISP_MODE_BAYER_ITU601;
> }
> } else if (sink_fmt->fmt_type == RKISP1_FMT_YUV) {
> acq_mult = 2;
> - if (sensor->mbus.type == V4L2_MBUS_CSI2_DPHY) {
> + if (sensor->mbus_type == V4L2_MBUS_CSI2_DPHY) {
> isp_ctrl = RKISP1_CIF_ISP_CTRL_ISP_MODE_ITU601;
> } else {
> - if (sensor->mbus.type == V4L2_MBUS_BT656)
> + if (sensor->mbus_type == V4L2_MBUS_BT656)
> isp_ctrl = RKISP1_CIF_ISP_CTRL_ISP_MODE_ITU656;
> else
> isp_ctrl = RKISP1_CIF_ISP_CTRL_ISP_MODE_ITU601;
> @@ -319,17 +319,17 @@ static int rkisp1_config_isp(struct rkisp1_device *rkisp1)
> }
>
> /* Set up input acquisition properties */
> - if (sensor->mbus.type == V4L2_MBUS_BT656 ||
> - sensor->mbus.type == V4L2_MBUS_PARALLEL) {
> - if (sensor->mbus.flags & V4L2_MBUS_PCLK_SAMPLE_RISING)
> + if (sensor->mbus_type == V4L2_MBUS_BT656 ||
> + sensor->mbus_type == V4L2_MBUS_PARALLEL) {
> + if (sensor->mbus_flags & V4L2_MBUS_PCLK_SAMPLE_RISING)
> signal = RKISP1_CIF_ISP_ACQ_PROP_POS_EDGE;
> }
>
> - if (sensor->mbus.type == V4L2_MBUS_PARALLEL) {
> - if (sensor->mbus.flags & V4L2_MBUS_VSYNC_ACTIVE_LOW)
> + if (sensor->mbus_type == V4L2_MBUS_PARALLEL) {
> + if (sensor->mbus_flags & V4L2_MBUS_VSYNC_ACTIVE_LOW)
> signal |= RKISP1_CIF_ISP_ACQ_PROP_VSYNC_LOW;
>
> - if (sensor->mbus.flags & V4L2_MBUS_HSYNC_ACTIVE_LOW)
> + if (sensor->mbus_flags & V4L2_MBUS_HSYNC_ACTIVE_LOW)
> signal |= RKISP1_CIF_ISP_ACQ_PROP_HSYNC_LOW;
> }
>
> @@ -401,29 +401,11 @@ static int rkisp1_config_dvp(struct rkisp1_device *rkisp1)
> static int rkisp1_config_mipi(struct rkisp1_device *rkisp1)
> {
> const struct rkisp1_isp_mbus_info *sink_fmt = rkisp1->isp.sink_fmt;
> - unsigned int lanes;
> + unsigned int lanes = rkisp1->active_sensor->lanes;
> u32 mipi_ctrl;
>
> - /*
> - * rkisp1->active_sensor->mbus is set in isp or d-phy notifier_bound
> - * function
> - */
> - switch (rkisp1->active_sensor->mbus.flags & V4L2_MBUS_CSI2_LANES) {
> - case V4L2_MBUS_CSI2_4_LANE:
> - lanes = 4;
> - break;
> - case V4L2_MBUS_CSI2_3_LANE:
> - lanes = 3;
> - break;
> - case V4L2_MBUS_CSI2_2_LANE:
> - lanes = 2;
> - break;
> - case V4L2_MBUS_CSI2_1_LANE:
> - lanes = 1;
> - break;
> - default:
> + if (lanes < 1 || lanes > 4)
> return -EINVAL;
> - }
>
> mipi_ctrl = RKISP1_CIF_MIPI_CTRL_NUM_LANES(lanes - 1) |
> RKISP1_CIF_MIPI_CTRL_SHUTDOWNLANES(0xf) |
> @@ -470,11 +452,11 @@ static int rkisp1_config_path(struct rkisp1_device *rkisp1)
> u32 dpcl = rkisp1_read(rkisp1, RKISP1_CIF_VI_DPCL);
> int ret = 0;
>
> - if (sensor->mbus.type == V4L2_MBUS_BT656 ||
> - sensor->mbus.type == V4L2_MBUS_PARALLEL) {
> + if (sensor->mbus_type == V4L2_MBUS_BT656 ||
> + sensor->mbus_type == V4L2_MBUS_PARALLEL) {
> ret = rkisp1_config_dvp(rkisp1);
> dpcl |= RKISP1_CIF_VI_DPCL_IF_SEL_PARALLEL;
> - } else if (sensor->mbus.type == V4L2_MBUS_CSI2_DPHY) {
> + } else if (sensor->mbus_type == V4L2_MBUS_CSI2_DPHY) {
> ret = rkisp1_config_mipi(rkisp1);
> dpcl |= RKISP1_CIF_VI_DPCL_IF_SEL_MIPI;
> }
> @@ -561,7 +543,7 @@ static void rkisp1_isp_start(struct rkisp1_device *rkisp1)
> rkisp1_config_clk(rkisp1);
>
> /* Activate MIPI */
> - if (sensor->mbus.type == V4L2_MBUS_CSI2_DPHY) {
> + if (sensor->mbus_type == V4L2_MBUS_CSI2_DPHY) {
> val = rkisp1_read(rkisp1, RKISP1_CIF_MIPI_CTRL);
> rkisp1_write(rkisp1, val | RKISP1_CIF_MIPI_CTRL_OUTPUT_ENA,
> RKISP1_CIF_MIPI_CTRL);
> @@ -956,7 +938,7 @@ static int rkisp1_isp_s_stream(struct v4l2_subdev *sd, int enable)
> rkisp1->active_sensor = container_of(sensor_sd->asd,
> struct rkisp1_sensor_async, asd);
>
> - if (rkisp1->active_sensor->mbus.type != V4L2_MBUS_CSI2_DPHY)
> + if (rkisp1->active_sensor->mbus_type != V4L2_MBUS_CSI2_DPHY)
> return -EINVAL;
>
> atomic_set(&rkisp1->isp.frame_sequence, -1);
>
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v3 2/2] media: staging: rkisp1: replace the call to v4l2_async_notifier_parse_fwnode_endpoints_by_port
2020-03-17 18:07 ` [PATCH v3 2/2] media: staging: rkisp1: replace the call to v4l2_async_notifier_parse_fwnode_endpoints_by_port Dafna Hirschfeld
@ 2020-03-31 22:40 ` Helen Koike
0 siblings, 0 replies; 5+ messages in thread
From: Helen Koike @ 2020-03-31 22:40 UTC (permalink / raw)
To: Dafna Hirschfeld, linux-media
Cc: ezequiel, hverkuil, kernel, dafna3, mchehab, laurent.pinchart,
sakari.ailus, linux-rockchip
On 3/17/20 3:07 PM, Dafna Hirschfeld wrote:
> don't call 'v4l2_async_notifier_parse_fwnode_endpoints_by_port'
> in order to register async subdevices. Instead call
> 'v4l2_fwnode_endpoint_parse' to parse the remote endpoints
> and then register each async subdev with
> 'v4l2_async_notifier_add_fwnode_remote_subdev'
>
> Also remove the relevant item in the TODO file
>
> Signed-off-by: Dafna Hirschfeld <dafna.hirschfeld@collabora.com>
Acked-by: Helen Koike <helen.koike@collabora.com>
> ---
> changes since v1:
> in the function rkisp1_subdev_notifier:
> 1. move the test 'if (next_id == 0)' outside of the while loop
> 2. remove the 'end' label.
> The changes are due to Helen Koike's comments
>
> changes since v2:
> in the function rkisp1_subdev_notifier:
> 1. remove a newline between a call to fwnode_graph_get_endpoint_by_id to the test of its ret value
> 2. define 'next_id' as 'unsigned int' instead of 'int'
> 3. rename 'parallel_bus_flags' to 'mbus_flags' and set it to vep.bus.mipi_csi2.flags instead of 0
> (this follows previous patch of the series)
> 4. when no remote sensor is found, log it with dev_dbg instead of dev_warn
>
> drivers/staging/media/rkisp1/TODO | 3 -
> drivers/staging/media/rkisp1/rkisp1-dev.c | 90 +++++++++++++----------
> 2 files changed, 53 insertions(+), 40 deletions(-)
>
> diff --git a/drivers/staging/media/rkisp1/TODO b/drivers/staging/media/rkisp1/TODO
> index 0aa9877dd64a..1aa3bb9fd6cb 100644
> --- a/drivers/staging/media/rkisp1/TODO
> +++ b/drivers/staging/media/rkisp1/TODO
> @@ -1,6 +1,3 @@
> -* Don't use v4l2_async_notifier_parse_fwnode_endpoints_by_port().
> -e.g. isp_parse_of_endpoints in drivers/media/platform/omap3isp/isp.c
> -cio2_parse_firmware in drivers/media/pci/intel/ipu3/ipu3-cio2.c.
> * Fix pad format size for statistics and parameters entities.
> * Use threaded interrupt for rkisp1_stats_isr(), remove work queue.
> * Fix checkpatch errors.
> diff --git a/drivers/staging/media/rkisp1/rkisp1-dev.c b/drivers/staging/media/rkisp1/rkisp1-dev.c
> index fcd2a3a4cc78..2eedabab4044 100644
> --- a/drivers/staging/media/rkisp1/rkisp1-dev.c
> +++ b/drivers/staging/media/rkisp1/rkisp1-dev.c
> @@ -233,33 +233,6 @@ static int rkisp1_subdev_notifier_complete(struct v4l2_async_notifier *notifier)
> return 0;
> }
>
> -static int rkisp1_fwnode_parse(struct device *dev,
> - struct v4l2_fwnode_endpoint *vep,
> - struct v4l2_async_subdev *asd)
> -{
> - struct rkisp1_sensor_async *s_asd =
> - container_of(asd, struct rkisp1_sensor_async, asd);
> -
> - if (vep->bus_type != V4L2_MBUS_CSI2_DPHY) {
> - dev_err(dev, "Only CSI2 bus type is currently supported\n");
> - return -EINVAL;
> - }
> -
> - if (vep->base.port != 0) {
> - dev_err(dev, "The ISP has only port 0\n");
> - return -EINVAL;
> - }
> -
> - s_asd->mbus_type = vep->bus_type;
> - s_asd->mbus_flags = vep->bus.mipi_csi2.flags;
> - s_asd->lanes = vep->bus.mipi_csi2.num_data_lanes;
> -
> - if (s_asd->lanes < 1 || s_asd->lanes > 4)
> - return -EINVAL;
> -
> - return 0;
> -}
> -
> static const struct v4l2_async_notifier_operations rkisp1_subdev_notifier_ops = {
> .bound = rkisp1_subdev_notifier_bound,
> .unbind = rkisp1_subdev_notifier_unbind,
> @@ -269,23 +242,66 @@ static const struct v4l2_async_notifier_operations rkisp1_subdev_notifier_ops =
> static int rkisp1_subdev_notifier(struct rkisp1_device *rkisp1)
> {
> struct v4l2_async_notifier *ntf = &rkisp1->notifier;
> - struct device *dev = rkisp1->dev;
> + unsigned int next_id = 0;
> int ret;
>
> v4l2_async_notifier_init(ntf);
>
> - ret = v4l2_async_notifier_parse_fwnode_endpoints_by_port(dev, ntf,
> - sizeof(struct rkisp1_sensor_async),
> - 0, rkisp1_fwnode_parse);
> - if (ret)
> - return ret;
> + while (1) {
> + struct v4l2_fwnode_endpoint vep = {
> + .bus_type = V4L2_MBUS_CSI2_DPHY
> + };
> + struct rkisp1_sensor_async *rk_asd = NULL;
> + struct fwnode_handle *ep;
>
> - if (list_empty(&ntf->asd_list))
> - return -ENODEV;
> + ep = fwnode_graph_get_endpoint_by_id(dev_fwnode(rkisp1->dev),
> + 0, next_id, FWNODE_GRAPH_ENDPOINT_NEXT);
> + if (!ep)
> + break;
>
> - ntf->ops = &rkisp1_subdev_notifier_ops;
> + ret = v4l2_fwnode_endpoint_parse(ep, &vep);
> + if (ret)
> + goto err_parse;
>
> - return v4l2_async_notifier_register(&rkisp1->v4l2_dev, ntf);
> + rk_asd = kzalloc(sizeof(*rk_asd), GFP_KERNEL);
> + if (!rk_asd) {
> + ret = -ENOMEM;
> + goto err_parse;
> + }
> +
> + rk_asd->mbus_type = vep.bus_type;
> + rk_asd->mbus_flags = vep.bus.mipi_csi2.flags;
> + rk_asd->lanes = vep.bus.mipi_csi2.num_data_lanes;
> +
> + ret = v4l2_async_notifier_add_fwnode_remote_subdev(ntf, ep,
> + &rk_asd->asd);
> + if (ret)
> + goto err_parse;
> +
> + dev_dbg(rkisp1->dev, "registered ep id %d with %d lanes\n",
> + vep.base.id, rk_asd->lanes);
> +
> + next_id = vep.base.id + 1;
> +
> + fwnode_handle_put(ep);
> +
> + continue;
> +err_parse:
> + fwnode_handle_put(ep);
> + kfree(rk_asd);
> + v4l2_async_notifier_cleanup(ntf);
> + return ret;
> + }
> +
> + if (next_id == 0)
> + dev_dbg(rkisp1->dev, "no remote subdevice found\n");
> + ntf->ops = &rkisp1_subdev_notifier_ops;
> + ret = v4l2_async_notifier_register(&rkisp1->v4l2_dev, ntf);
> + if (ret) {
> + v4l2_async_notifier_cleanup(ntf);
> + return ret;
> + }
> + return 0;
> }
>
> /* ----------------------------------------------------------------------------
>
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2020-03-31 22:41 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-03-17 18:06 [PATCH v3 0/2] media: staging: rkisp1: fix fwnode API usage and remove v4l2_mbus_config field Dafna Hirschfeld
2020-03-17 18:07 ` [PATCH v3 1/2] media: staging: rkisp1: remove mbus field from rkisp1_sensor_async Dafna Hirschfeld
2020-03-31 22:40 ` Helen Koike
2020-03-17 18:07 ` [PATCH v3 2/2] media: staging: rkisp1: replace the call to v4l2_async_notifier_parse_fwnode_endpoints_by_port Dafna Hirschfeld
2020-03-31 22:40 ` Helen Koike
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.