All of lore.kernel.org
 help / color / mirror / Atom feed
From: Hans Verkuil <hansverk@cisco.com>
To: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Cc: Hans Verkuil <hverkuil@xs4all.nl>,
	linux-media@vger.kernel.org,
	Hans Verkuil <hans.verkuil@cisco.com>,
	Lars-Peter Clausen <lars@metafoo.de>
Subject: Re: [PATCH 36/47] adv7604: Make output format configurable through pad format operations
Date: Tue, 11 Mar 2014 12:29:03 +0100	[thread overview]
Message-ID: <531EF37F.6000206@cisco.com> (raw)
In-Reply-To: <5198476.Eg6VVVrCH7@avalon>

Hi Laurent,

On 03/11/14 12:16, Laurent Pinchart wrote:
> Hi Hans,
> 
> On Tuesday 11 March 2014 10:05:00 Hans Verkuil wrote:
>> On 03/10/14 23:43, Laurent Pinchart wrote:
>>> On Wednesday 12 February 2014 16:01:17 Hans Verkuil wrote:
>>>> On 02/05/14 17:42, Laurent Pinchart wrote:
>>>>> Replace the dummy video format operations by pad format operations that
>>>>> configure the output format.
>>>>>
>>>>> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
>>>>> ---
>>>>>
>>>>>  drivers/media/i2c/adv7604.c | 243 ++++++++++++++++++++++++++++++++-----
>>>>>  include/media/adv7604.h     |  47 ++-------
>>>>>  2 files changed, 225 insertions(+), 65 deletions(-)
>>>>
>>>> <snip>
>>>>
>>>>> diff --git a/include/media/adv7604.h b/include/media/adv7604.h
>>>>> index 22811d3..2cc8e16 100644
>>>>> --- a/include/media/adv7604.h
>>>>> +++ b/include/media/adv7604.h
>>>>> @@ -32,16 +32,6 @@ enum adv7604_ain_sel {
>>>>>  	ADV7604_AIN9_4_5_6_SYNC_2_1 = 4,
>>>>>  };
>>>>>
>>>>> -/* Bus rotation and reordering (IO register 0x04, [7:5]) */
>>>>> -enum adv7604_op_ch_sel {
>>>>> -	ADV7604_OP_CH_SEL_GBR = 0,
>>>>> -	ADV7604_OP_CH_SEL_GRB = 1,
>>>>> -	ADV7604_OP_CH_SEL_BGR = 2,
>>>>> -	ADV7604_OP_CH_SEL_RGB = 3,
>>>>> -	ADV7604_OP_CH_SEL_BRG = 4,
>>>>> -	ADV7604_OP_CH_SEL_RBG = 5,
>>>>> -};
>>>>> -
>>>>>  /* Input Color Space (IO register 0x02, [7:4]) */
>>>>>  enum adv7604_inp_color_space {
>>>>>  	ADV7604_INP_COLOR_SPACE_LIM_RGB = 0,
>>>>> @@ -55,29 +45,11 @@ enum adv7604_inp_color_space {
> 
> [snip]
> 
>>>>> @@ -104,11 +76,8 @@ struct adv7604_platform_data {
>>>>>
>>>>>  	/* Analog input muxing mode */
>>>>>  	enum adv7604_ain_sel ain_sel;
>>>>>
>>>>> -	/* Bus rotation and reordering */
>>>>> -	enum adv7604_op_ch_sel op_ch_sel;
>>>>
>>>> I would keep this as part of the platform_data. This is typically used if
>>>> things are wired up in a non-standard way and so is specific to the
>>>> hardware. It is not something that will change from format to format.
>>>
>>> Right, some level of configuration is needed to account for non-standard
>>> wiring. However I'm not sure where that should be handled.
>>>
>>> With exotic wiring the format at the receiver will be different than the
>>> format output by the ADV7604. From a pure ADV7604 point of view, the
>>> output format doesn't depend on the wiring. I wonder whether this
>>> shouldn't be a link property instead of being a subdev property. There's
>>> of course the question of where to store that link property if it's not
>>> part of either subdev.
>>>
>>> Even if we decide that the wiring is a property of the source subdev, I
>>> don't think we should duplicate bus reordering code in all subdev
>>> drivers. This should thus be handled by the v4l2 core (either directly or
>>> as helper functions).
>>
>> There are two reasons why you might want to use op_ch_sel: one is to
>> implement weird formats like RBG. Something like that would have to be
>> controlled through mbus and pixel fourcc codes and not by hardcoding this
>> register.
> 
> Agreed. This patch only adds a subset of the possible output formats. More 
> formats can be added later as needed.
> 
>> The other is to compensate for a wiring problem: we have a card where two
>> channels were accidentally swapped. You can either redo the board or just
>> set this register. In this case this register is IMHO a property of this
>> subdev. It needs to know about it, because if it ever needs to output RBG
>> in the future then it needs to compensate for reordering for wiring
>> issues.
>>
>> So you set this field if you have to compensate for wiring errors, making
>> this part of the DT/platform_data. You do not set this field when you
>> want to support special formats, that is done in the driver itself through
>> fourcc codes (or could be done as this isn't implemented at the moment).
> 
> I agree with the use case, but I'm not sure whether that's the best way to 
> support it. Let's say the system is design for RGB, but the G and B channels 
> have been swapped by mistake on the board. To make it work, the ADV7604 would 
> need to output RBG, and the bridge would receive RGB. Data reordering would 
> thus happen on the link.
> 
> There's two ways to expose this to userspace. One of them would be to make the 
> real formats visible to applications. We would need to extend the link API to 
> show that reordering occurs. Userspace would need to explicitly configure the 
> adv7604 driver with RBG at its source pad and the bridge driver with RGB at 
> its sink pad. This has the advantage of correctly modeling the hardware, and 
> not pushing workarounds for board-level issues to individual drivers.
> 
> Another solution would be to hide the wiring problem from userspace and handle 
> it inside the adv7604 driver. Note that, depending on the hardware 
> configuration, it could be the bridge driver that need to implement 
> reordering. Userspace would configure both ends of the link to RGB and 
> wouldn't be aware of the problem.  This has the advantage of hiding the 
> problem in the kernel. However, it would require implementing the same 
> workaround in potentially many drivers.
> 
> If we decide to go for the second solution I would like to make it a bit more 
> generic than just keeping the op_ch_sel field in platform data. I think we 
> should instead have a generic representation of the reordering in platform 
> data, and implement a V4L2 core function that would translate the format on 
> the link to the format required at the device. For instance, still assuming G 
> and B are swapped, userspace would configure the ADV7604 output to 
> V4L2_MBUS_FMT_RGB888_1X24, the adv7604 driver would pass 
> V4L2_MBUS_FMT_RGB888_1X24 along with the reordering information to a V4L2 core 
> function which would return V4L2_MBUS_FMT_RBG888_1X24, and the driver would 
> then configure the device to output RBG instead of RGB.
> 
> This leaves three open questions :
> 
> - Should the workaround be visible to userspace ?

Absolutely not. Userspace really, really does not want to care about this.
It would also lead to a crazy proliferation of different fourccs, one for
each 'reordering' combination of channels.

> - If not, how should reordering be expressed in platform data (and DT) ?

It could be a more generic reordering define (i.e. less ADV specific).
Proposals are welcome.

> - Does this need to be part of this patch set or can it be implemented later ?

Yes. I need it :-)

But it doesn't have to be in the DT, keeping it as platform_data for now is
perfectly fine with me, nor do I mind changing it in the future.

Regards,

	Hans

  reply	other threads:[~2014-03-11 11:29 UTC|newest]

Thread overview: 83+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-02-05 16:41 [PATCH 00/47] ADV7611 support Laurent Pinchart
2014-02-05 16:41 ` [PATCH 01/47] v4l: of: Support empty port nodes Laurent Pinchart
2014-02-05 16:41 ` [PATCH 02/47] v4l: Add UYVY10_2X10 and VYUY10_2X10 media bus pixel codes Laurent Pinchart
2014-02-05 16:41 ` [PATCH 03/47] v4l: Add UYVY10_1X20 and VYUY10_1X20 " Laurent Pinchart
2014-02-05 16:41 ` [PATCH 04/47] v4l: Add 12-bit YUV 4:2:0 " Laurent Pinchart
2014-02-05 16:41 ` [PATCH 05/47] v4l: Add 12-bit YUV 4:2:2 " Laurent Pinchart
2014-02-05 16:41 ` [PATCH 06/47] v4l: Add pad-level DV timings subdev operations Laurent Pinchart
2014-02-05 17:13   ` Hans Verkuil
2014-02-06 17:33   ` Sakari Ailus
2014-02-07  0:50     ` Laurent Pinchart
2014-02-05 16:41 ` [PATCH 07/47] ad9389b: Add pad-level DV timings operations Laurent Pinchart
2014-02-05 16:41 ` [PATCH 08/47] adv7511: " Laurent Pinchart
2014-02-05 16:42 ` [PATCH 09/47] adv7842: " Laurent Pinchart
2014-02-05 16:42 ` [PATCH 10/47] s5p-tv: hdmi: " Laurent Pinchart
2014-02-05 16:42 ` [PATCH 11/47] s5p-tv: hdmiphy: " Laurent Pinchart
2014-02-05 16:42 ` [PATCH 12/47] ths8200: " Laurent Pinchart
2014-02-05 16:42 ` [PATCH 13/47] tvp7002: " Laurent Pinchart
2014-02-05 16:42 ` [PATCH 14/47] media: bfin_capture: Switch to pad-level DV operations Laurent Pinchart
2014-02-05 16:42 ` [PATCH 15/47] media: davinci: vpif: " Laurent Pinchart
2014-02-05 16:42 ` [PATCH 16/47] media: staging: davinci: vpfe: " Laurent Pinchart
2014-02-05 16:42 ` [PATCH 17/47] s5p-tv: mixer: " Laurent Pinchart
2014-02-05 16:42 ` [PATCH 18/47] ad9389b: Remove deprecated video-level DV timings operations Laurent Pinchart
2014-02-05 16:42 ` [PATCH 19/47] adv7511: " Laurent Pinchart
2014-02-05 16:42 ` [PATCH 20/47] adv7842: " Laurent Pinchart
2014-02-05 16:42 ` [PATCH 21/47] s5p-tv: hdmi: " Laurent Pinchart
2014-02-05 16:42 ` [PATCH 22/47] s5p-tv: hdmiphy: Remove deprecated video-level DV timings operation Laurent Pinchart
2014-02-05 16:42 ` [PATCH 23/47] ths8200: Remove deprecated video-level DV timings operations Laurent Pinchart
2014-02-05 16:42 ` [PATCH 24/47] tvp7002: " Laurent Pinchart
2014-02-05 16:42 ` [PATCH 25/47] v4l: subdev: " Laurent Pinchart
2014-02-06 17:35   ` Sakari Ailus
2014-02-12 12:48   ` Hans Verkuil
2014-02-05 16:42 ` [PATCH 26/47] v4l: Improve readability by not wrapping ioctl number #define's Laurent Pinchart
2014-02-06 17:34   ` Sakari Ailus
2014-02-05 16:42 ` [PATCH 27/47] v4l: Add support for DV timings ioctls on subdev nodes Laurent Pinchart
2014-02-05 17:31   ` Hans Verkuil
2014-02-07  1:21     ` Laurent Pinchart
2014-02-07 11:07   ` Sakari Ailus
2014-02-10 12:53     ` Laurent Pinchart
2014-02-05 16:42 ` [PATCH 28/47] adv7604: Add missing include to linux/types.h Laurent Pinchart
2014-02-05 16:42 ` [PATCH 29/47] adv7604: Add support for asynchronous probing Laurent Pinchart
2014-02-05 16:42 ` [PATCH 30/47] adv7604: Don't put info string arrays on the stack Laurent Pinchart
2014-02-05 16:42 ` [PATCH 31/47] adv7604: Add 16-bit read functions for CP and HDMI Laurent Pinchart
2014-02-05 16:42 ` [PATCH 32/47] adv7604: Cache register contents when reading multiple bits Laurent Pinchart
2014-02-05 16:42 ` [PATCH 33/47] adv7604: Add adv7611 support Laurent Pinchart
2014-02-05 16:42 ` [PATCH 34/47] adv7604: Remove subdev control handlers Laurent Pinchart
2014-02-05 16:42 ` [PATCH 35/47] adv7604: Add sink pads Laurent Pinchart
2014-02-11 10:19   ` Hans Verkuil
2014-02-11 12:00     ` Laurent Pinchart
2014-02-11 12:07       ` Hans Verkuil
2014-02-11 12:23         ` Laurent Pinchart
2014-02-11 12:24           ` Hans Verkuil
2014-02-11 12:32             ` Laurent Pinchart
2014-02-11 12:33               ` Hans Verkuil
2014-02-05 16:42 ` [PATCH 36/47] adv7604: Make output format configurable through pad format operations Laurent Pinchart
2014-02-12 15:01   ` Hans Verkuil
2014-03-10 22:43     ` Laurent Pinchart
2014-03-11  9:05       ` Hans Verkuil
2014-03-11 11:16         ` Laurent Pinchart
2014-03-11 11:29           ` Hans Verkuil [this message]
2014-02-05 16:42 ` [PATCH 37/47] adv7604: Add pad-level DV timings support Laurent Pinchart
2014-02-05 16:42 ` [PATCH 38/47] adv7604: Remove deprecated video-level DV timings operations Laurent Pinchart
2014-02-05 16:42 ` [PATCH 39/47] adv7604: Inline the to_sd function Laurent Pinchart
2014-02-05 16:42 ` [PATCH 40/47] adv7604: Store I2C addresses and clients in arrays Laurent Pinchart
2014-02-05 16:42 ` [PATCH 41/47] adv7604: Replace *_and_or() functions with *_clr_set() Laurent Pinchart
2014-02-05 16:42 ` [PATCH 42/47] adv7604: Sort headers alphabetically Laurent Pinchart
2014-02-05 16:42 ` [PATCH 43/47] adv7604: Control hot-plug detect through a GPIO Laurent Pinchart
2014-02-06 13:10   ` Lars-Peter Clausen
2014-02-10 15:00     ` Laurent Pinchart
2014-02-11 10:09   ` Hans Verkuil
2014-02-11 12:03     ` Laurent Pinchart
2014-02-13  9:47       ` Hans Verkuil
2014-02-13 10:10         ` Lars-Peter Clausen
2014-02-13 14:33         ` Laurent Pinchart
2014-02-05 16:42 ` [PATCH 44/47] adv7604: Specify the default input through platform data Laurent Pinchart
2014-02-05 16:42 ` [PATCH 45/47] adv7604: Add DT support Laurent Pinchart
2014-02-11  9:23   ` Hans Verkuil
2014-02-11 12:08     ` Laurent Pinchart
2014-02-11 12:14       ` Hans Verkuil
2014-02-11 12:21         ` Lars-Peter Clausen
2014-02-11 12:30           ` Laurent Pinchart
2014-02-05 16:42 ` [PATCH 46/47] adv7604: Add LLC polarity configuration Laurent Pinchart
2014-02-05 16:42 ` [PATCH 47/47] adv7604: Add endpoint properties to DT bindings Laurent Pinchart
2014-02-05 17:12 ` [PATCH 00/47] ADV7611 support Hans Verkuil

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=531EF37F.6000206@cisco.com \
    --to=hansverk@cisco.com \
    --cc=hans.verkuil@cisco.com \
    --cc=hverkuil@xs4all.nl \
    --cc=lars@metafoo.de \
    --cc=laurent.pinchart@ideasonboard.com \
    --cc=linux-media@vger.kernel.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.