diff mbox

[v4] media: soc_camera: rcar_vin: Add ARGB8888 caputre format support

Message ID 1452773908-19260-1-git-send-email-ykaneko0929@gmail.com (mailing list archive)
State Superseded
Delegated to: Geert Uytterhoeven
Headers show

Commit Message

Yoshihiro Kaneko Jan. 14, 2016, 12:18 p.m. UTC
From: Koji Matsuoka <koji.matsuoka.xm@renesas.com>

This patch adds ARGB8888 capture format support for R-Car Gen3.

Signed-off-by: Koji Matsuoka <koji.matsuoka.xm@renesas.com>
Signed-off-by: Yoshihiro Kaneko <ykaneko0929@gmail.com>
---

This patch is based on the for-4.6-1 branch of Guennadi's v4l-dvb tree.

v4 [Yoshihiro Kaneko]
* As suggested by Sergei Shtylyov
  - revised an error message.

v3 [Yoshihiro Kaneko]
* rebased to for-4.6-1 branch of Guennadi's tree.

v2 [Yoshihiro Kaneko]
* As suggested by Sergei Shtylyov
  - fix the coding style of the braces.

 drivers/media/platform/soc_camera/rcar_vin.c | 21 +++++++++++++++++++--
 1 file changed, 19 insertions(+), 2 deletions(-)

Comments

Guennadi Liakhovetski Jan. 23, 2016, 6:38 p.m. UTC | #1
Hello Kaneko-san,

I've got a question to this patch:

On Thu, 14 Jan 2016, Yoshihiro Kaneko wrote:

> From: Koji Matsuoka <koji.matsuoka.xm@renesas.com>
> 
> This patch adds ARGB8888 capture format support for R-Car Gen3.
> 
> Signed-off-by: Koji Matsuoka <koji.matsuoka.xm@renesas.com>
> Signed-off-by: Yoshihiro Kaneko <ykaneko0929@gmail.com>
> ---
> 
> This patch is based on the for-4.6-1 branch of Guennadi's v4l-dvb tree.
> 
> v4 [Yoshihiro Kaneko]
> * As suggested by Sergei Shtylyov
>   - revised an error message.
> 
> v3 [Yoshihiro Kaneko]
> * rebased to for-4.6-1 branch of Guennadi's tree.
> 
> v2 [Yoshihiro Kaneko]
> * As suggested by Sergei Shtylyov
>   - fix the coding style of the braces.
> 
>  drivers/media/platform/soc_camera/rcar_vin.c | 21 +++++++++++++++++++--
>  1 file changed, 19 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/media/platform/soc_camera/rcar_vin.c b/drivers/media/platform/soc_camera/rcar_vin.c
> index dc75a80..07c67f6 100644
> --- a/drivers/media/platform/soc_camera/rcar_vin.c
> +++ b/drivers/media/platform/soc_camera/rcar_vin.c
> @@ -124,7 +124,7 @@
>  #define VNDMR_EXRGB		(1 << 8)
>  #define VNDMR_BPSM		(1 << 4)
>  #define VNDMR_DTMD_YCSEP	(1 << 1)
> -#define VNDMR_DTMD_ARGB1555	(1 << 0)
> +#define VNDMR_DTMD_ARGB		(1 << 0)
>  
>  /* Video n Data Mode Register 2 bits */
>  #define VNDMR2_VPS		(1 << 30)
> @@ -643,7 +643,7 @@ static int rcar_vin_setup(struct rcar_vin_priv *priv)
>  		output_is_yuv = true;
>  		break;
>  	case V4L2_PIX_FMT_RGB555X:
> -		dmr = VNDMR_DTMD_ARGB1555;
> +		dmr = VNDMR_DTMD_ARGB;
>  		break;
>  	case V4L2_PIX_FMT_RGB565:
>  		dmr = 0;
> @@ -654,6 +654,14 @@ static int rcar_vin_setup(struct rcar_vin_priv *priv)

Let me give a bit more context here for clarity:

		if (priv->chip == RCAR_GEN2 || priv->chip == RCAR_H1 ||
		    priv->chip == RCAR_E1) {
>  			dmr = VNDMR_EXRGB;
>  			break;
>  		}

As you can see, there's no common "break" in the "case" clause above, i.e. 
it is relying on falling through if the "if" condition isn't satisfied. 
Now you insert your new "case" here, so, the failing "if" above will fall 
through into your new case. Is this intended? This fall through was 
handling the "invalid for this SoC pixel format" case, same as your "else" 
case below. How about replacing all these cases with a "goto e_format" 
statement and put "e_format:" below "return 0;" at the end of this 
function? So, the above would become

		if (priv->chip != RCAR_GEN2 && priv->chip != RCAR_H1 &&
		    priv->chip != RCAR_E1)
			goto e_format;

		dmr = VNDMR_EXRGB;
		break;

And your addition would be

		if (priv->chip != RCAR_GEN3)
			goto e_format;

		dmr = VNDMR_EXRGB | VNDMR_DTMD_ARGB;
		break;

And then

		default:
			goto e_format;

Thanks
Guennadi

> +	case V4L2_PIX_FMT_ARGB32:
> +		if (priv->chip == RCAR_GEN3) {
> +			dmr = VNDMR_EXRGB | VNDMR_DTMD_ARGB;
> +		} else {
> +			dev_err(icd->parent, "Unsupported format\n");
> +			return -EINVAL;
> +		}
> +		break;
>  	default:
>  		dev_warn(icd->parent, "Invalid fourcc format (0x%x)\n",
>  			 icd->current_fmt->host_fmt->fourcc);
> @@ -1304,6 +1312,14 @@ static const struct soc_mbus_pixelfmt rcar_vin_formats[] = {
>  		.order			= SOC_MBUS_ORDER_LE,
>  		.layout			= SOC_MBUS_LAYOUT_PACKED,
>  	},
> +	{
> +		.fourcc			= V4L2_PIX_FMT_ARGB32,
> +		.name			= "ARGB8888",
> +		.bits_per_sample	= 32,
> +		.packing		= SOC_MBUS_PACKING_NONE,
> +		.order			= SOC_MBUS_ORDER_LE,
> +		.layout			= SOC_MBUS_LAYOUT_PACKED,
> +	},
>  };
>  
>  static int rcar_vin_get_formats(struct soc_camera_device *icd, unsigned int idx,
> @@ -1611,6 +1627,7 @@ static int rcar_vin_set_fmt(struct soc_camera_device *icd,
>  	case V4L2_PIX_FMT_RGB32:
>  		can_scale = priv->chip != RCAR_E1;
>  		break;
> +	case V4L2_PIX_FMT_ARGB32:
>  	case V4L2_PIX_FMT_UYVY:
>  	case V4L2_PIX_FMT_YUYV:
>  	case V4L2_PIX_FMT_RGB565:
> -- 
> 1.9.1
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-sh" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
kernel test robot Jan. 24, 2016, 3:55 a.m. UTC | #2
Hi Koji,

[auto build test ERROR on linuxtv-media/master]
[also build test ERROR on v4.4 next-20160122]
[if your patch is applied to the wrong git tree, please drop us a note to help improving the system]

url:    https://github.com/0day-ci/linux/commits/Yoshihiro-Kaneko/media-soc_camera-rcar_vin-Add-ARGB8888-caputre-format-support/20160114-202215
base:   git://linuxtv.org/media_tree.git master
config: parisc-allyesconfig (attached as .config)
reproduce:
        wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        make.cross ARCH=parisc 

All errors (new ones prefixed by >>):

   drivers/media/platform/soc_camera/rcar_vin.c: In function 'rcar_vin_setup':
>> drivers/media/platform/soc_camera/rcar_vin.c:657:21: error: 'RCAR_GEN3' undeclared (first use in this function)
      if (priv->chip == RCAR_GEN3) {
                        ^
   drivers/media/platform/soc_camera/rcar_vin.c:657:21: note: each undeclared identifier is reported only once for each function it appears in

vim +/RCAR_GEN3 +657 drivers/media/platform/soc_camera/rcar_vin.c

   651			if (priv->chip == RCAR_GEN2 || priv->chip == RCAR_H1 ||
   652			    priv->chip == RCAR_E1) {
   653				dmr = VNDMR_EXRGB;
   654				break;
   655			}
   656		case V4L2_PIX_FMT_ARGB32:
 > 657			if (priv->chip == RCAR_GEN3) {
   658				dmr = VNDMR_EXRGB | VNDMR_DTMD_ARGB;
   659			} else {
   660				dev_err(icd->parent, "Unsupported format\n");

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation
Yoshihiro Kaneko Jan. 24, 2016, 11:27 a.m. UTC | #3
Hi Guennadi-san,

Thanks for your review.

2016-01-24 3:38 GMT+09:00 Guennadi Liakhovetski <g.liakhovetski@gmx.de>:
> Hello Kaneko-san,
>
> I've got a question to this patch:
>
> On Thu, 14 Jan 2016, Yoshihiro Kaneko wrote:
>
>> From: Koji Matsuoka <koji.matsuoka.xm@renesas.com>
>>
>> This patch adds ARGB8888 capture format support for R-Car Gen3.
>>
>> Signed-off-by: Koji Matsuoka <koji.matsuoka.xm@renesas.com>
>> Signed-off-by: Yoshihiro Kaneko <ykaneko0929@gmail.com>
>> ---
>>
>> This patch is based on the for-4.6-1 branch of Guennadi's v4l-dvb tree.
>>
>> v4 [Yoshihiro Kaneko]
>> * As suggested by Sergei Shtylyov
>>   - revised an error message.
>>
>> v3 [Yoshihiro Kaneko]
>> * rebased to for-4.6-1 branch of Guennadi's tree.
>>
>> v2 [Yoshihiro Kaneko]
>> * As suggested by Sergei Shtylyov
>>   - fix the coding style of the braces.
>>
>>  drivers/media/platform/soc_camera/rcar_vin.c | 21 +++++++++++++++++++--
>>  1 file changed, 19 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/media/platform/soc_camera/rcar_vin.c b/drivers/media/platform/soc_camera/rcar_vin.c
>> index dc75a80..07c67f6 100644
>> --- a/drivers/media/platform/soc_camera/rcar_vin.c
>> +++ b/drivers/media/platform/soc_camera/rcar_vin.c
>> @@ -124,7 +124,7 @@
>>  #define VNDMR_EXRGB          (1 << 8)
>>  #define VNDMR_BPSM           (1 << 4)
>>  #define VNDMR_DTMD_YCSEP     (1 << 1)
>> -#define VNDMR_DTMD_ARGB1555  (1 << 0)
>> +#define VNDMR_DTMD_ARGB              (1 << 0)
>>
>>  /* Video n Data Mode Register 2 bits */
>>  #define VNDMR2_VPS           (1 << 30)
>> @@ -643,7 +643,7 @@ static int rcar_vin_setup(struct rcar_vin_priv *priv)
>>               output_is_yuv = true;
>>               break;
>>       case V4L2_PIX_FMT_RGB555X:
>> -             dmr = VNDMR_DTMD_ARGB1555;
>> +             dmr = VNDMR_DTMD_ARGB;
>>               break;
>>       case V4L2_PIX_FMT_RGB565:
>>               dmr = 0;
>> @@ -654,6 +654,14 @@ static int rcar_vin_setup(struct rcar_vin_priv *priv)
>
> Let me give a bit more context here for clarity:
>
>                 if (priv->chip == RCAR_GEN2 || priv->chip == RCAR_H1 ||
>                     priv->chip == RCAR_E1) {
>>                       dmr = VNDMR_EXRGB;
>>                       break;
>>               }
>
> As you can see, there's no common "break" in the "case" clause above, i.e.
> it is relying on falling through if the "if" condition isn't satisfied.
> Now you insert your new "case" here, so, the failing "if" above will fall
> through into your new case. Is this intended? This fall through was
> handling the "invalid for this SoC pixel format" case, same as your "else"
> case below. How about replacing all these cases with a "goto e_format"
> statement and put "e_format:" below "return 0;" at the end of this
> function? So, the above would become
>
>                 if (priv->chip != RCAR_GEN2 && priv->chip != RCAR_H1 &&
>                     priv->chip != RCAR_E1)
>                         goto e_format;
>
>                 dmr = VNDMR_EXRGB;
>                 break;
>
> And your addition would be
>
>                 if (priv->chip != RCAR_GEN3)
>                         goto e_format;
>
>                 dmr = VNDMR_EXRGB | VNDMR_DTMD_ARGB;
>                 break;
>
> And then
>
>                 default:
>                         goto e_format;

Sounds good.
I will fix it according to your suggestion.

Thanks,
kaneko

>
> Thanks
> Guennadi
>
>> +     case V4L2_PIX_FMT_ARGB32:
>> +             if (priv->chip == RCAR_GEN3) {
>> +                     dmr = VNDMR_EXRGB | VNDMR_DTMD_ARGB;
>> +             } else {
>> +                     dev_err(icd->parent, "Unsupported format\n");
>> +                     return -EINVAL;
>> +             }
>> +             break;
>>       default:
>>               dev_warn(icd->parent, "Invalid fourcc format (0x%x)\n",
>>                        icd->current_fmt->host_fmt->fourcc);
>> @@ -1304,6 +1312,14 @@ static const struct soc_mbus_pixelfmt rcar_vin_formats[] = {
>>               .order                  = SOC_MBUS_ORDER_LE,
>>               .layout                 = SOC_MBUS_LAYOUT_PACKED,
>>       },
>> +     {
>> +             .fourcc                 = V4L2_PIX_FMT_ARGB32,
>> +             .name                   = "ARGB8888",
>> +             .bits_per_sample        = 32,
>> +             .packing                = SOC_MBUS_PACKING_NONE,
>> +             .order                  = SOC_MBUS_ORDER_LE,
>> +             .layout                 = SOC_MBUS_LAYOUT_PACKED,
>> +     },
>>  };
>>
>>  static int rcar_vin_get_formats(struct soc_camera_device *icd, unsigned int idx,
>> @@ -1611,6 +1627,7 @@ static int rcar_vin_set_fmt(struct soc_camera_device *icd,
>>       case V4L2_PIX_FMT_RGB32:
>>               can_scale = priv->chip != RCAR_E1;
>>               break;
>> +     case V4L2_PIX_FMT_ARGB32:
>>       case V4L2_PIX_FMT_UYVY:
>>       case V4L2_PIX_FMT_YUYV:
>>       case V4L2_PIX_FMT_RGB565:
>> --
>> 1.9.1
>>
--
To unsubscribe from this list: send the line "unsubscribe linux-sh" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/media/platform/soc_camera/rcar_vin.c b/drivers/media/platform/soc_camera/rcar_vin.c
index dc75a80..07c67f6 100644
--- a/drivers/media/platform/soc_camera/rcar_vin.c
+++ b/drivers/media/platform/soc_camera/rcar_vin.c
@@ -124,7 +124,7 @@ 
 #define VNDMR_EXRGB		(1 << 8)
 #define VNDMR_BPSM		(1 << 4)
 #define VNDMR_DTMD_YCSEP	(1 << 1)
-#define VNDMR_DTMD_ARGB1555	(1 << 0)
+#define VNDMR_DTMD_ARGB		(1 << 0)
 
 /* Video n Data Mode Register 2 bits */
 #define VNDMR2_VPS		(1 << 30)
@@ -643,7 +643,7 @@  static int rcar_vin_setup(struct rcar_vin_priv *priv)
 		output_is_yuv = true;
 		break;
 	case V4L2_PIX_FMT_RGB555X:
-		dmr = VNDMR_DTMD_ARGB1555;
+		dmr = VNDMR_DTMD_ARGB;
 		break;
 	case V4L2_PIX_FMT_RGB565:
 		dmr = 0;
@@ -654,6 +654,14 @@  static int rcar_vin_setup(struct rcar_vin_priv *priv)
 			dmr = VNDMR_EXRGB;
 			break;
 		}
+	case V4L2_PIX_FMT_ARGB32:
+		if (priv->chip == RCAR_GEN3) {
+			dmr = VNDMR_EXRGB | VNDMR_DTMD_ARGB;
+		} else {
+			dev_err(icd->parent, "Unsupported format\n");
+			return -EINVAL;
+		}
+		break;
 	default:
 		dev_warn(icd->parent, "Invalid fourcc format (0x%x)\n",
 			 icd->current_fmt->host_fmt->fourcc);
@@ -1304,6 +1312,14 @@  static const struct soc_mbus_pixelfmt rcar_vin_formats[] = {
 		.order			= SOC_MBUS_ORDER_LE,
 		.layout			= SOC_MBUS_LAYOUT_PACKED,
 	},
+	{
+		.fourcc			= V4L2_PIX_FMT_ARGB32,
+		.name			= "ARGB8888",
+		.bits_per_sample	= 32,
+		.packing		= SOC_MBUS_PACKING_NONE,
+		.order			= SOC_MBUS_ORDER_LE,
+		.layout			= SOC_MBUS_LAYOUT_PACKED,
+	},
 };
 
 static int rcar_vin_get_formats(struct soc_camera_device *icd, unsigned int idx,
@@ -1611,6 +1627,7 @@  static int rcar_vin_set_fmt(struct soc_camera_device *icd,
 	case V4L2_PIX_FMT_RGB32:
 		can_scale = priv->chip != RCAR_E1;
 		break;
+	case V4L2_PIX_FMT_ARGB32:
 	case V4L2_PIX_FMT_UYVY:
 	case V4L2_PIX_FMT_YUYV:
 	case V4L2_PIX_FMT_RGB565: