All of lore.kernel.org
 help / color / mirror / Atom feed
From: josh.wu@atmel.com (Josh Wu)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 1/5] media: atmel-isi: correct yuv swap according to different sensor outputs
Date: Wed, 14 Oct 2015 14:46:14 +0800	[thread overview]
Message-ID: <561DFA36.2070705@atmel.com> (raw)
In-Reply-To: <Pine.LNX.4.64.1510041903460.26834@axis700.grange>

Dear Gueannadi,

On 10/5/2015 1:04 AM, Guennadi Liakhovetski wrote:
> Even simpler:
>
> On Sun, 4 Oct 2015, Guennadi Liakhovetski wrote:
>
>> Hi Josh,
>>
>> On Tue, 22 Sep 2015, Josh Wu wrote:
>>
>>> we need to configure the YCC_SWAP bits in ISI_CFG2 according to current
>>> sensor output and Atmel ISI output format.
>>>
>>> Current there are two cases Atmel ISI supported:
>>>    1. Atmel ISI outputs YUYV format.
>>>       This case we need to setup YCC_SWAP according to sensor output
>>>       format.
>>>    2. Atmel ISI output a pass-through formats, which means no swap.
>>>       Just setup YCC_SWAP as default with no swap.
>>>
>>> Signed-off-by: Josh Wu <josh.wu@atmel.com>
>>> ---
>>>
>>>   drivers/media/platform/soc_camera/atmel-isi.c | 43 ++++++++++++++++++++-------
>>>   1 file changed, 33 insertions(+), 10 deletions(-)
>>>
>>> diff --git a/drivers/media/platform/soc_camera/atmel-isi.c b/drivers/media/platform/soc_camera/atmel-isi.c
>>> index 45e304a..df64294 100644
>>> --- a/drivers/media/platform/soc_camera/atmel-isi.c
>>> +++ b/drivers/media/platform/soc_camera/atmel-isi.c
>>> @@ -103,13 +103,41 @@ static u32 isi_readl(struct atmel_isi *isi, u32 reg)
>>>   	return readl(isi->regs + reg);
>>>   }
>>>   
>>> +static u32 setup_cfg2_yuv_swap(struct atmel_isi *isi,
>>> +		const struct soc_camera_format_xlate *xlate)
>>> +{
>> This function will be called only for the four media codes from the
>> switch-case statement below, namely for
>>
>> MEDIA_BUS_FMT_VYUY8_2X8
>> MEDIA_BUS_FMT_UYVY8_2X8
>> MEDIA_BUS_FMT_YVYU8_2X8
>> MEDIA_BUS_FMT_YUYV8_2X8
>>
>>> +	/* By default, no swap for the codec path of Atmel ISI. So codec
>>> +	* output is same as sensor's output.
>>> +	* For instance, if sensor's output is YUYV, then codec outputs YUYV.
>>> +	* And if sensor's output is UYVY, then codec outputs UYVY.
>>> +	*/
>>> +	u32 cfg2_yuv_swap = ISI_CFG2_YCC_SWAP_DEFAULT;
>> Then this ISI_CFG2_YCC_SWAP_DEFAULT will only hold for
>> MEDIA_BUS_FMT_YUYV8_2X8? Why don't you just add one more case below? Don't
>> think this initialisation is really justified.
>>
>>> +
>>> +	if (xlate->host_fmt->fourcc == V4L2_PIX_FMT_YUYV) {
>>> +		/* all convert to YUYV */
>>> +		switch (xlate->code) {
>>> +		case MEDIA_BUS_FMT_VYUY8_2X8:
>>> +			cfg2_yuv_swap = ISI_CFG2_YCC_SWAP_MODE_3;
>>> +			break;
> Why don't you just return the result value here directly? Then you don't
> need the variable at all

yes, This sounds good. I'll take rid of the cfg2_yuv_swap variable. Thanks.

Best Regards,
Josh Wu
>
>>> +		case MEDIA_BUS_FMT_UYVY8_2X8:
>>> +			cfg2_yuv_swap = ISI_CFG2_YCC_SWAP_MODE_2;
>>> +			break;
>>> +		case MEDIA_BUS_FMT_YVYU8_2X8:
>>> +			cfg2_yuv_swap = ISI_CFG2_YCC_SWAP_MODE_1;
>>> +			break;
>>> +		}
>>> +	}
>>> +
>>> +	return cfg2_yuv_swap;
>>> +}
>>> +
>>>   static void configure_geometry(struct atmel_isi *isi, u32 width,
>>> -			u32 height, u32 code)
>>> +		u32 height, const struct soc_camera_format_xlate *xlate)
>>>   {
>>>   	u32 cfg2;
>>>   
>>>   	/* According to sensor's output format to set cfg2 */
>>> -	switch (code) {
>>> +	switch (xlate->code) {
>>>   	default:
>>>   	/* Grey */
>>>   	case MEDIA_BUS_FMT_Y8_1X8:
>>> @@ -117,16 +145,11 @@ static void configure_geometry(struct atmel_isi *isi, u32 width,
>>>   		break;
>>>   	/* YUV */
>>>   	case MEDIA_BUS_FMT_VYUY8_2X8:
>>> -		cfg2 = ISI_CFG2_YCC_SWAP_MODE_3 | ISI_CFG2_COL_SPACE_YCbCr;
>>> -		break;
>>>   	case MEDIA_BUS_FMT_UYVY8_2X8:
>>> -		cfg2 = ISI_CFG2_YCC_SWAP_MODE_2 | ISI_CFG2_COL_SPACE_YCbCr;
>>> -		break;
>>>   	case MEDIA_BUS_FMT_YVYU8_2X8:
>>> -		cfg2 = ISI_CFG2_YCC_SWAP_MODE_1 | ISI_CFG2_COL_SPACE_YCbCr;
>>> -		break;
>>>   	case MEDIA_BUS_FMT_YUYV8_2X8:
>>> -		cfg2 = ISI_CFG2_YCC_SWAP_DEFAULT | ISI_CFG2_COL_SPACE_YCbCr;
>>> +		cfg2 = ISI_CFG2_COL_SPACE_YCbCr |
>>> +				setup_cfg2_yuv_swap(isi, xlate);
>>>   		break;
>>>   	/* RGB, TODO */
>>>   	}
>> I would move this switch-case completely inside setup_cfg2_yuv_swap().
>> Just do
>>
>> 	cfg2 = setup_cfg2_yuv_swap(isi, xlate);
>>
>> and handle the
>>
>>   	case MEDIA_BUS_FMT_Y8_1X8:
>>
>> in the function too. These two switch-case statements really look
>> redundant.
>>
>>> @@ -407,7 +430,7 @@ static int start_streaming(struct vb2_queue *vq, unsigned int count)
>>>   	isi_writel(isi, ISI_INTDIS, (u32)~0UL);
>>>   
>>>   	configure_geometry(isi, icd->user_width, icd->user_height,
>>> -				icd->current_fmt->code);
>>> +				icd->current_fmt);
>>>   
>>>   	spin_lock_irq(&isi->lock);
>>>   	/* Clear any pending interrupt */
>>> -- 
>>> 1.9.1
>>>
>> Thanks
>> Guennadi
>>

WARNING: multiple messages have this Message-ID (diff)
From: Josh Wu <josh.wu@atmel.com>
To: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
Cc: Linux Media Mailing List <linux-media@vger.kernel.org>,
	<linux-arm-kernel@lists.infradead.org>,
	Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Subject: Re: [PATCH 1/5] media: atmel-isi: correct yuv swap according to different sensor outputs
Date: Wed, 14 Oct 2015 14:46:14 +0800	[thread overview]
Message-ID: <561DFA36.2070705@atmel.com> (raw)
In-Reply-To: <Pine.LNX.4.64.1510041903460.26834@axis700.grange>

Dear Gueannadi,

On 10/5/2015 1:04 AM, Guennadi Liakhovetski wrote:
> Even simpler:
>
> On Sun, 4 Oct 2015, Guennadi Liakhovetski wrote:
>
>> Hi Josh,
>>
>> On Tue, 22 Sep 2015, Josh Wu wrote:
>>
>>> we need to configure the YCC_SWAP bits in ISI_CFG2 according to current
>>> sensor output and Atmel ISI output format.
>>>
>>> Current there are two cases Atmel ISI supported:
>>>    1. Atmel ISI outputs YUYV format.
>>>       This case we need to setup YCC_SWAP according to sensor output
>>>       format.
>>>    2. Atmel ISI output a pass-through formats, which means no swap.
>>>       Just setup YCC_SWAP as default with no swap.
>>>
>>> Signed-off-by: Josh Wu <josh.wu@atmel.com>
>>> ---
>>>
>>>   drivers/media/platform/soc_camera/atmel-isi.c | 43 ++++++++++++++++++++-------
>>>   1 file changed, 33 insertions(+), 10 deletions(-)
>>>
>>> diff --git a/drivers/media/platform/soc_camera/atmel-isi.c b/drivers/media/platform/soc_camera/atmel-isi.c
>>> index 45e304a..df64294 100644
>>> --- a/drivers/media/platform/soc_camera/atmel-isi.c
>>> +++ b/drivers/media/platform/soc_camera/atmel-isi.c
>>> @@ -103,13 +103,41 @@ static u32 isi_readl(struct atmel_isi *isi, u32 reg)
>>>   	return readl(isi->regs + reg);
>>>   }
>>>   
>>> +static u32 setup_cfg2_yuv_swap(struct atmel_isi *isi,
>>> +		const struct soc_camera_format_xlate *xlate)
>>> +{
>> This function will be called only for the four media codes from the
>> switch-case statement below, namely for
>>
>> MEDIA_BUS_FMT_VYUY8_2X8
>> MEDIA_BUS_FMT_UYVY8_2X8
>> MEDIA_BUS_FMT_YVYU8_2X8
>> MEDIA_BUS_FMT_YUYV8_2X8
>>
>>> +	/* By default, no swap for the codec path of Atmel ISI. So codec
>>> +	* output is same as sensor's output.
>>> +	* For instance, if sensor's output is YUYV, then codec outputs YUYV.
>>> +	* And if sensor's output is UYVY, then codec outputs UYVY.
>>> +	*/
>>> +	u32 cfg2_yuv_swap = ISI_CFG2_YCC_SWAP_DEFAULT;
>> Then this ISI_CFG2_YCC_SWAP_DEFAULT will only hold for
>> MEDIA_BUS_FMT_YUYV8_2X8? Why don't you just add one more case below? Don't
>> think this initialisation is really justified.
>>
>>> +
>>> +	if (xlate->host_fmt->fourcc == V4L2_PIX_FMT_YUYV) {
>>> +		/* all convert to YUYV */
>>> +		switch (xlate->code) {
>>> +		case MEDIA_BUS_FMT_VYUY8_2X8:
>>> +			cfg2_yuv_swap = ISI_CFG2_YCC_SWAP_MODE_3;
>>> +			break;
> Why don't you just return the result value here directly? Then you don't
> need the variable at all

yes, This sounds good. I'll take rid of the cfg2_yuv_swap variable. Thanks.

Best Regards,
Josh Wu
>
>>> +		case MEDIA_BUS_FMT_UYVY8_2X8:
>>> +			cfg2_yuv_swap = ISI_CFG2_YCC_SWAP_MODE_2;
>>> +			break;
>>> +		case MEDIA_BUS_FMT_YVYU8_2X8:
>>> +			cfg2_yuv_swap = ISI_CFG2_YCC_SWAP_MODE_1;
>>> +			break;
>>> +		}
>>> +	}
>>> +
>>> +	return cfg2_yuv_swap;
>>> +}
>>> +
>>>   static void configure_geometry(struct atmel_isi *isi, u32 width,
>>> -			u32 height, u32 code)
>>> +		u32 height, const struct soc_camera_format_xlate *xlate)
>>>   {
>>>   	u32 cfg2;
>>>   
>>>   	/* According to sensor's output format to set cfg2 */
>>> -	switch (code) {
>>> +	switch (xlate->code) {
>>>   	default:
>>>   	/* Grey */
>>>   	case MEDIA_BUS_FMT_Y8_1X8:
>>> @@ -117,16 +145,11 @@ static void configure_geometry(struct atmel_isi *isi, u32 width,
>>>   		break;
>>>   	/* YUV */
>>>   	case MEDIA_BUS_FMT_VYUY8_2X8:
>>> -		cfg2 = ISI_CFG2_YCC_SWAP_MODE_3 | ISI_CFG2_COL_SPACE_YCbCr;
>>> -		break;
>>>   	case MEDIA_BUS_FMT_UYVY8_2X8:
>>> -		cfg2 = ISI_CFG2_YCC_SWAP_MODE_2 | ISI_CFG2_COL_SPACE_YCbCr;
>>> -		break;
>>>   	case MEDIA_BUS_FMT_YVYU8_2X8:
>>> -		cfg2 = ISI_CFG2_YCC_SWAP_MODE_1 | ISI_CFG2_COL_SPACE_YCbCr;
>>> -		break;
>>>   	case MEDIA_BUS_FMT_YUYV8_2X8:
>>> -		cfg2 = ISI_CFG2_YCC_SWAP_DEFAULT | ISI_CFG2_COL_SPACE_YCbCr;
>>> +		cfg2 = ISI_CFG2_COL_SPACE_YCbCr |
>>> +				setup_cfg2_yuv_swap(isi, xlate);
>>>   		break;
>>>   	/* RGB, TODO */
>>>   	}
>> I would move this switch-case completely inside setup_cfg2_yuv_swap().
>> Just do
>>
>> 	cfg2 = setup_cfg2_yuv_swap(isi, xlate);
>>
>> and handle the
>>
>>   	case MEDIA_BUS_FMT_Y8_1X8:
>>
>> in the function too. These two switch-case statements really look
>> redundant.
>>
>>> @@ -407,7 +430,7 @@ static int start_streaming(struct vb2_queue *vq, unsigned int count)
>>>   	isi_writel(isi, ISI_INTDIS, (u32)~0UL);
>>>   
>>>   	configure_geometry(isi, icd->user_width, icd->user_height,
>>> -				icd->current_fmt->code);
>>> +				icd->current_fmt);
>>>   
>>>   	spin_lock_irq(&isi->lock);
>>>   	/* Clear any pending interrupt */
>>> -- 
>>> 1.9.1
>>>
>> Thanks
>> Guennadi
>>


  reply	other threads:[~2015-10-14  6:46 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-09-22  5:14 [PATCH 0/5] media: atmel-isi: enable preview path to output RGB565 format Josh Wu
2015-09-22  5:14 ` Josh Wu
2015-09-22  5:14 ` [PATCH 1/5] media: atmel-isi: correct yuv swap according to different sensor outputs Josh Wu
2015-09-22  5:14   ` Josh Wu
2015-10-04 16:43   ` Guennadi Liakhovetski
2015-10-04 16:43     ` Guennadi Liakhovetski
2015-10-04 17:04     ` Guennadi Liakhovetski
2015-10-04 17:04       ` Guennadi Liakhovetski
2015-10-14  6:46       ` Josh Wu [this message]
2015-10-14  6:46         ` Josh Wu
2015-10-14  6:43     ` Josh Wu
2015-10-14  6:43       ` Josh Wu
2015-10-19  1:48       ` Guennadi Liakhovetski
2015-10-19  1:48         ` Guennadi Liakhovetski
2015-10-19  2:45         ` Josh Wu
2015-10-19  2:45           ` Josh Wu
2015-09-22  5:14 ` [PATCH 2/5] media: atmel-isi: prepare for the support of preview path Josh Wu
2015-09-22  5:14   ` Josh Wu
2015-09-22  5:14 ` [PATCH 3/5] media: atmel-isi: add code to setup correct resolution for " Josh Wu
2015-09-22  5:14   ` Josh Wu
2015-09-22  5:14 ` [PATCH 4/5] media: atmel-isi: setup YCC_SWAP correctly when using " Josh Wu
2015-09-22  5:14   ` Josh Wu
2015-10-04 16:50   ` Guennadi Liakhovetski
2015-10-04 16:50     ` Guennadi Liakhovetski
2015-10-14  6:44     ` Josh Wu
2015-10-14  6:44       ` Josh Wu
2015-09-22  5:14 ` [PATCH 5/5] media: atmel-isi: support RGB565 output when sensor output YUV formats Josh Wu
2015-09-22  5:14   ` Josh Wu
2015-10-04 17:02   ` Guennadi Liakhovetski
2015-10-04 17:02     ` Guennadi Liakhovetski
2015-10-14  6:57     ` Josh Wu
2015-10-14  6:57       ` Josh Wu
2015-10-19  2:03       ` Guennadi Liakhovetski
2015-10-19  2:03         ` Guennadi Liakhovetski
2015-10-19  2:50         ` Josh Wu
2015-10-19  2:50           ` Josh Wu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=561DFA36.2070705@atmel.com \
    --to=josh.wu@atmel.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.