LinuxTV Patchwork [1/4] media: imx: csi: Allow unknown nearest upstream entities

login
register
mail settings
Submitter Steve Longerbeam
Date Jan. 19, 2019, 9:45 p.m.
Message ID <20190119214600.30897-2-slongerbeam@gmail.com>
Download mbox | patch
Permalink /patch/54043/
State Superseded
Delegated to: Hans Verkuil
Headers show

Comments

Steve Longerbeam - Jan. 19, 2019, 9:45 p.m.
On i.MX6, the nearest upstream entity to the CSI can only be the
CSI video muxes or the Synopsys DW MIPI CSI-2 receiver.

However the i.MX53 has no CSI video muxes or a MIPI CSI-2 receiver.
So allow for the nearest upstream entity to the CSI to be something
other than those.

Fixes: bf3cfaa712e5c ("media: staging/imx: get CSI bus type from nearest
upstream entity")

Signed-off-by: Steve Longerbeam <slongerbeam@gmail.com>
Cc: stable@vger.kernel.org
---
 drivers/staging/media/imx/imx-media-csi.c | 18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)
Philipp Zabel - Jan. 21, 2019, 4:50 p.m.
On Sat, 2019-01-19 at 13:45 -0800, Steve Longerbeam wrote:
> On i.MX6, the nearest upstream entity to the CSI can only be the
> CSI video muxes or the Synopsys DW MIPI CSI-2 receiver.
> 
> However the i.MX53 has no CSI video muxes or a MIPI CSI-2 receiver.
> So allow for the nearest upstream entity to the CSI to be something
> other than those.
> 
> Fixes: bf3cfaa712e5c ("media: staging/imx: get CSI bus type from nearest
> upstream entity")
> 
> Signed-off-by: Steve Longerbeam <slongerbeam@gmail.com>
> Cc: stable@vger.kernel.org
> ---
>  drivers/staging/media/imx/imx-media-csi.c | 18 ++++++++++++++----
>  1 file changed, 14 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/staging/media/imx/imx-media-csi.c b/drivers/staging/media/imx/imx-media-csi.c
> index 555aa45e02e3..b9af7d3d4974 100644
> --- a/drivers/staging/media/imx/imx-media-csi.c
> +++ b/drivers/staging/media/imx/imx-media-csi.c
> @@ -154,9 +154,10 @@ static inline bool requires_passthrough(struct v4l2_fwnode_endpoint *ep,
>  /*
>   * Parses the fwnode endpoint from the source pad of the entity
>   * connected to this CSI. This will either be the entity directly
> - * upstream from the CSI-2 receiver, or directly upstream from the
> - * video mux. The endpoint is needed to determine the bus type and
> - * bus config coming into the CSI.
> + * upstream from the CSI-2 receiver, directly upstream from the
> + * video mux, or directly upstream from the CSI itself. The endpoint
> + * is needed to determine the bus type and bus config coming into
> + * the CSI.
>   */
>  static int csi_get_upstream_endpoint(struct csi_priv *priv,
>  				     struct v4l2_fwnode_endpoint *ep)
> @@ -172,7 +173,8 @@ static int csi_get_upstream_endpoint(struct csi_priv *priv,
>  	if (!priv->src_sd)
>  		return -EPIPE;
>  
> -	src = &priv->src_sd->entity;
> +	sd = priv->src_sd;
> +	src = &sd->entity;
>  
>  	if (src->function == MEDIA_ENT_F_VID_MUX) {
>  		/*
> @@ -186,6 +188,14 @@ static int csi_get_upstream_endpoint(struct csi_priv *priv,
>  			src = &sd->entity;
>  	}
>  
> +	/*
> +	 * If the source is neither the video mux nor the CSI-2 receiver,
> +	 * get the source pad directly upstream from CSI itself.
> +	 */
> +	if (src->function != MEDIA_ENT_F_VID_MUX &&

Will it work correctly if there's an external MUX connected to the CSI?

> +	    sd->grp_id != IMX_MEDIA_GRP_ID_CSI2)
> +		src = &priv->sd.entity;
> +
>  	/* get source pad of entity directly upstream from src */
>  	pad = imx_media_find_upstream_pad(priv->md, src, 0);
>  	if (IS_ERR(pad))

regards
Philipp
Steve Longerbeam - Jan. 22, 2019, 12:21 a.m.
On 1/21/19 8:50 AM, Philipp Zabel wrote:
> On Sat, 2019-01-19 at 13:45 -0800, Steve Longerbeam wrote:
>> On i.MX6, the nearest upstream entity to the CSI can only be the
>> CSI video muxes or the Synopsys DW MIPI CSI-2 receiver.
>>
>> However the i.MX53 has no CSI video muxes or a MIPI CSI-2 receiver.
>> So allow for the nearest upstream entity to the CSI to be something
>> other than those.
>>
>> Fixes: bf3cfaa712e5c ("media: staging/imx: get CSI bus type from nearest
>> upstream entity")
>>
>> Signed-off-by: Steve Longerbeam <slongerbeam@gmail.com>
>> Cc: stable@vger.kernel.org
>> ---
>>   drivers/staging/media/imx/imx-media-csi.c | 18 ++++++++++++++----
>>   1 file changed, 14 insertions(+), 4 deletions(-)
>>
>> diff --git a/drivers/staging/media/imx/imx-media-csi.c b/drivers/staging/media/imx/imx-media-csi.c
>> index 555aa45e02e3..b9af7d3d4974 100644
>> --- a/drivers/staging/media/imx/imx-media-csi.c
>> +++ b/drivers/staging/media/imx/imx-media-csi.c
>> @@ -154,9 +154,10 @@ static inline bool requires_passthrough(struct v4l2_fwnode_endpoint *ep,
>>   /*
>>    * Parses the fwnode endpoint from the source pad of the entity
>>    * connected to this CSI. This will either be the entity directly
>> - * upstream from the CSI-2 receiver, or directly upstream from the
>> - * video mux. The endpoint is needed to determine the bus type and
>> - * bus config coming into the CSI.
>> + * upstream from the CSI-2 receiver, directly upstream from the
>> + * video mux, or directly upstream from the CSI itself. The endpoint
>> + * is needed to determine the bus type and bus config coming into
>> + * the CSI.
>>    */
>>   static int csi_get_upstream_endpoint(struct csi_priv *priv,
>>   				     struct v4l2_fwnode_endpoint *ep)
>> @@ -172,7 +173,8 @@ static int csi_get_upstream_endpoint(struct csi_priv *priv,
>>   	if (!priv->src_sd)
>>   		return -EPIPE;
>>   
>> -	src = &priv->src_sd->entity;
>> +	sd = priv->src_sd;
>> +	src = &sd->entity;
>>   
>>   	if (src->function == MEDIA_ENT_F_VID_MUX) {
>>   		/*
>> @@ -186,6 +188,14 @@ static int csi_get_upstream_endpoint(struct csi_priv *priv,
>>   			src = &sd->entity;
>>   	}
>>   
>> +	/*
>> +	 * If the source is neither the video mux nor the CSI-2 receiver,
>> +	 * get the source pad directly upstream from CSI itself.
>> +	 */
>> +	if (src->function != MEDIA_ENT_F_VID_MUX &&
> Will it work correctly if there's an external MUX connected to the CSI?

By external MUX are you referring to some MUX that's external to the SoC 
(e.g. not the CSI muxes which are external to the IPU but internal to 
the SoC)? If so then yes it will still work (and of course it works if 
the MUX in question is the CSI muxes).

The function csi_get_upstream_endpoint() is only looking for, and stops 
at, the first sub-device that is external to the SoC, in order to 
determine the bus type coming into the SoC of the currently enabled 
pipeline. And that sub-device could be anything, including another MUX.

Steve

>
>> +	    sd->grp_id != IMX_MEDIA_GRP_ID_CSI2)
>> +		src = &priv->sd.entity;
>> +
>>   	/* get source pad of entity directly upstream from src */
>>   	pad = imx_media_find_upstream_pad(priv->md, src, 0);
>>   	if (IS_ERR(pad))
> regards
> Philipp

Patch

diff --git a/drivers/staging/media/imx/imx-media-csi.c b/drivers/staging/media/imx/imx-media-csi.c
index 555aa45e02e3..b9af7d3d4974 100644
--- a/drivers/staging/media/imx/imx-media-csi.c
+++ b/drivers/staging/media/imx/imx-media-csi.c
@@ -154,9 +154,10 @@  static inline bool requires_passthrough(struct v4l2_fwnode_endpoint *ep,
 /*
  * Parses the fwnode endpoint from the source pad of the entity
  * connected to this CSI. This will either be the entity directly
- * upstream from the CSI-2 receiver, or directly upstream from the
- * video mux. The endpoint is needed to determine the bus type and
- * bus config coming into the CSI.
+ * upstream from the CSI-2 receiver, directly upstream from the
+ * video mux, or directly upstream from the CSI itself. The endpoint
+ * is needed to determine the bus type and bus config coming into
+ * the CSI.
  */
 static int csi_get_upstream_endpoint(struct csi_priv *priv,
 				     struct v4l2_fwnode_endpoint *ep)
@@ -172,7 +173,8 @@  static int csi_get_upstream_endpoint(struct csi_priv *priv,
 	if (!priv->src_sd)
 		return -EPIPE;
 
-	src = &priv->src_sd->entity;
+	sd = priv->src_sd;
+	src = &sd->entity;
 
 	if (src->function == MEDIA_ENT_F_VID_MUX) {
 		/*
@@ -186,6 +188,14 @@  static int csi_get_upstream_endpoint(struct csi_priv *priv,
 			src = &sd->entity;
 	}
 
+	/*
+	 * If the source is neither the video mux nor the CSI-2 receiver,
+	 * get the source pad directly upstream from CSI itself.
+	 */
+	if (src->function != MEDIA_ENT_F_VID_MUX &&
+	    sd->grp_id != IMX_MEDIA_GRP_ID_CSI2)
+		src = &priv->sd.entity;
+
 	/* get source pad of entity directly upstream from src */
 	pad = imx_media_find_upstream_pad(priv->md, src, 0);
 	if (IS_ERR(pad))

Privacy Policy