From: Valentine <valentine.barshak@cogentembedded.com>
To: linux-sh@vger.kernel.org
Subject: Re: [PATCH 1/3] media: i2c: Add ADV761X support
Date: Wed, 25 Sep 2013 17:19:05 +0000 [thread overview]
Message-ID: <52431B09.5080307@cogentembedded.com> (raw)
In-Reply-To: <1380029916-10331-2-git-send-email-valentine.barshak@cogentembedded.com>
On 09/25/2013 08:31 PM, Guennadi Liakhovetski wrote:
> On Wed, 25 Sep 2013, Valentine wrote:
>
>> On 09/25/2013 06:08 PM, Guennadi Liakhovetski wrote:
>
> [snip]
>
>>>>> Using module parameters has a disadvantage, that all instances of this
>>>>> driver will get the same values, and it is quite possible to have
>>>>> several
>>>>> HDMI receivers in a system, I believe? Wouldn't it be better to pass
>>>>> these
>>>>> addresses from the platform data / DT?
>>>>
>>>> Yes, that doesn't look quite right, but I couldn't find a better solution
>>>> ATM.
>>>>
>>>> The problem is that this subdevice is going to be used by a soc_camera
>>>> driver,
>>>> and the soc_camera interface uses its own platform data for all I2C
>>>> subdevices.
>>>> Thus, if I pass the I2C addresses in client->dev.platform_data here (as in
>>>> adv7604), it's doing to be overwritten by the soc_camera_i2c_init()
>>>> function
>>>> with a soc_camera_subdev_desc data.
>>>>
>>>> Not sure what the correct solution should be. Any suggestions are greatly
>>>> appreciated.
>>>
>>> You don't think, that soc-camera makes it impossible to pass
>>> device-specific platform data to subdevices, right? For an example have a
>>> look e.g. at mt9v022 and arch/arm/mach-pxa/pcm990-baseboard.c or at
>>> mt9t111 and arch/arm/mach-shmobile/board-armadillo800eva.c.
>>
>> Yes, but in this case adv761x.c has to be a soc_camera i2c subdevice driver.
>> Which means it will get its platform data from ssdd->drv_priv like mt9v022 AOT
>> client->dev.platform_data, like adv7604 does.
>>
>> What if a non-soc_camera needs to use the adv7612 decoder?
>> IMHO, Looks like there's a conflict in the soc/non-soc camera driver subdevice
>> usage.
>
> I don't think, that just using soc-camera platform data struct will make
> it impossible for non-soc-camera bridge / video input drivers to use this
> subdevice driver.
This is the only problem I can see at the moment.
Do you see any other issues?
As I've said earlier the driver is based much on the adv7604 which is
used for non-soc cameras.
I guess, implementing dv_timings and ISR for adv7612 will make it look
even closer.
Other subdevice drivers (like 7180) seem to work with both soc/non-soc
cameras.
Are you proposing to make it soc-cam-specific, move it to
i2c/soc_camera/ and deal with a non-soc variant later if needed?
>In general several attempts have been made earlier to
> finally make soc-camera originated subdevice drivers
> soc-camera-independent. This hasn't been finalised due to a lack of a real
> life use-case. As soon as one appears, finalising that work shouldn't be
> too difficult.
>
>> For example, there's an adv7180 decoder on the Lager board, and its driver can
>> be successfully used with a soc_camera (rcar_vin) as well as
>> a PCI STA2X11 Video Input device. However, if the adv7180 needed a platform
>> data, there would be a conflict, since soc_camera uses
>> a different method of passing platform data to the subdevice driver.
>>
>> I don't think that making adv7612 subdevice "SOC"-specific would be the way to
>> go here since it may lead us to code duplication for non-soc video devices
>> later.
>>
>>>
>>>>>> +
>>>>>> +struct adv761x_color_format {
>>>>>> + enum v4l2_mbus_pixelcode code;
>>>>>> + enum v4l2_colorspace colorspace;
>>>>>> +};
>>>>>> +
>>>>>> +/* Supported color format list */
>>>>>> +static const struct adv761x_color_format adv761x_cfmts[] = {
>>>>>> + {
>>>>>> + .code = V4L2_MBUS_FMT_RGB888_1X24,
>>>>>> + .colorspace = V4L2_COLORSPACE_SRGB,
>>>>>> + },
>>>>>> +};
>>>>>> +
>>>>>> +/* ADV761X descriptor structure */
>>>>>> +struct adv761x_state {
>>>>>> + struct v4l2_subdev sd;
>>>>>> + struct media_pad pad;
>>>>>> + struct v4l2_ctrl_handler ctrl_hdl;
>>>>>> +
>>>>>> + u8 edid[256];
>>>>>> + unsigned edid_blocks;
>>>>>> + const struct adv761x_color_format *cfmt;
>>>>>> + u32 width;
>>>>>> + u32 height;
>>>>>> + enum v4l2_field scanmode;
>>>>>> +
>>>>>> + struct workqueue_struct *work_queue;
>>>>>> + struct delayed_work enable_hotplug;
>>>>>> +
>>>>>> + /* I2C clients */
>>>>>> + struct i2c_client *i2c_cec;
>>>>>> + struct i2c_client *i2c_infoframe;
>>>>>> + struct i2c_client *i2c_dpll;
>>>>>> + struct i2c_client *i2c_repeater;
>>>>>> + struct i2c_client *i2c_edid;
>>>>>> + struct i2c_client *i2c_hdmi;
>>>>>> + struct i2c_client *i2c_cp;
>>>>>> +};
>>>>>> +
>>>>>> +static inline struct v4l2_subdev *to_sd(struct v4l2_ctrl *ctrl)
>>>>>> +{
>>>>>> + return &container_of(ctrl->handler, struct adv761x_state,
>>>>>> ctrl_hdl)->sd;
>>>>>> +}
>>>>>> +
>>>>>> +static inline struct adv761x_state *to_state(struct v4l2_subdev *sd)
>>>>>> +{
>>>>>> + return container_of(sd, struct adv761x_state, sd);
>>>>>> +}
>>>>>> +
>>>>>> +/* I2C I/O operations */
>>>>>> +static s32 adv_smbus_read_byte_data(struct i2c_client *client, u8
>>>>>> command)
>>>>>> +{
>>>>>> + s32 ret, i;
>>>>>> +
>>>>>> + for (i = 0; i < 3; i++) {
>>>>>> + ret = i2c_smbus_read_byte_data(client, command);
>>>>>
>>>>> Uhm, why do you need to do this 3 times?... I see adv7842 does that
>>>>> too...
>>>>> but e.g. adv7604 dies this only for writing and not for reading...
>>>>
>>>> Just thought it would be safe to retry in case of a failure.
>>>> Other drivers seem to retry I2C I/O as well. This is probably related to
>>>> the
>>>> possible cable issues. Not sure. Anyways, retrying doesn't seem to hurt,
>>>> does
>>>> it?
>>>
>>> It does, because it means there's something we don't understand. IMHO it
>>> should either work from the first time, or there should be an error, that
>>> we understand with a following error processing, that _might_ include
>>> re-trying. Re-trying just in case isn't good. Especially if no error has
>>> been observed.
>>
>> I have observed very rare errors when reading HDMI status. Just a couple of
>> times during this week. I'm not sure of the nature of those errors. Just
>> thought it would be OK to retry since other decoder drivers do so as well.
>
> Ok, understand. As I said, I personally don't like that, but, I think,
> Laurent will have a final word on this.
>
OK, thanks.
> [snip]
>
>>>>>> +/* Power management operations */
>>>>>> +#ifdef CONFIG_PM_SLEEP
>>>>>> +static int adv761x_suspend(struct device *dev)
>>>>>> +{
>>>>>> + struct i2c_client *client = to_i2c_client(dev);
>>>>>> + struct v4l2_subdev *sd = i2c_get_clientdata(client);
>>>>>> +
>>>>>> + /* Power off */
>>>>>> + return io_write(sd, 0x0c, 0x62);
>>>>>> +}
>>>>>> +
>>>>>> +static int adv761x_resume(struct device *dev)
>>>>>> +{
>>>>>> + struct i2c_client *client = to_i2c_client(dev);
>>>>>> + struct v4l2_subdev *sd = i2c_get_clientdata(client);
>>>>>> +
>>>>>> + /* Initializes ADV761X to its default values */
>>>>>> + return adv761x_core_init(sd);
>>>>>
>>>>> What if a system was suspended during capture? Is this enough to resume
>>>>> it
>>>>> automatically?
>>>>
>>>> Is it needed to auto-resume capture?
>>>> IIUC, adv7810 doesn't seem to do that in its resume callback.
>>>>
>>>> Since not many decoder drivers seem to implement PM, we probably could
>>>> drop it
>>>> altogether for now (in case capture auto-resume is needed).
>>>
>>> Yep, removing dummy PM is good, I think.
>>
>> OK, I can remove it.
>> I wouldn't call it dummy, though, since it does change the power state of the
>> chip.
>> The question of whether it needs to auto-resume the capture is still not clear
>> to me.
>
> I'm not 100% certain either, but at least what I am certain about, is that
> you need to restore the configuration before the suspend instead of just
> initialising to defaults. Or would the configuration be preserved. I mean
> in a sequence like
>
> set controls
> set EDID
> configure formats
> suspend
> resume
> start capture
>
> Would the controls, formats and EDID be preserved or lost?
>
OK, understood, thanks.
I guess PM could be dropped for now.
> In fact, looking a bit more at the driver, I've got a couple more
> questions.
>
> 1. Hotplug handling: you've got comments like "Pull down the hotplug pin,"
> but I don't see any code that would actually pull the pin? Am I missing it
> or is it permanently low?
It is supposed to be done by the camera driver that receives the hotplug
notification.
>
> 2. You're using an own work queue just to queue a work to notify users
> about the event. Wouldn't it suffice to just use the scheduler work queue?
It probably would. I just didn't want to deviate much from the code that
is already there (adv7604/adv7842/ad9389b/adv7511/cx25840).
>
>>>>>> diff --git a/include/media/adv761x.h b/include/media/adv761x.h
>>>>>> new file mode 100644
>>>>>> index 0000000..e6e6aea
>>>>>> --- /dev/null
>>>>>> +++ b/include/media/adv761x.h
>>>>>> @@ -0,0 +1,28 @@
>>>>>> +/*
>>>>>> + * adv761x Analog Devices ADV761X HDMI receiver driver
>>>>>> + *
>>>>>> + * Copyright (C) 2013 Cogent Embedded, Inc.
>>>>>> + * Copyright (C) 2013 Renesas Electronics Corporation
>>>>>> + *
>>>>>> + * This program is free software; you may redistribute it and/or
>>>>>> modify
>>>>>> + * it under the terms of the GNU General Public License as published
>>>>>> by
>>>>>> + * the Free Software Foundation; version 2 of the License.
>>>>>> + *
>>>>>> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
>>>>>> + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
>>>>>> + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
>>>>>> + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
>>>>>> HOLDERS
>>>>>> + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
>>>>>> + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
>>>>>> + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
>>>>>> + * SOFTWARE.
>>>>>> + *
>>>>>> + */
>>>>>> +
>>>>>> +#ifndef _ADV761X_H_
>>>>>> +#define _ADV761X_H_
>>>>>> +
>>>>>> +/* notify events */
>>>>>> +#define ADV761X_HOTPLUG 1
>>>>>
>>>>> Is this header needed at all and - if so - does it have to be exported
>>>>> under include/ or would it be enough to put it under drivers/media/?
>>>>
>>>> Well, the ADV761X_HOTPLUG is supposed to be used by a camera driver for
>>>> hotplug notification events (as in adv7604). If we find a way to use
>>>> platform
>>>> data with soc_camera, it should go into this header as well.
>>>
>>> As well or instead? Do you really need to export ADV761X_HOTPLUG? And for
>>> platform data it's now preferable to use the include/linux/platform_data/
>>> directory, I think.
>>
>> As well.
>> This code is based on the ADV7604 driver. The define is for other drivers to
>> use (the ones that need to be notified of the EDID change, for example). As it
>> is not used with rcar_vin, I have no problem with dropping the EDID handling
>> altogether.
>
> Uhm, so, that code is untested? Then yes, personally, I'd rather drop it
> for now.
OK.
BTW, the EDID read/write code *is* tested. It is just not used for the
soc_camera.
(It is impossible to use it for a soc_camera, as it doesn't support
subdev user-space API)
>
> Thanks
> Guennadi
> ---
> Guennadi Liakhovetski, Ph.D.
> Freelance Open-Source Software Developer
> http://www.open-technology.de/
>
Thanks,
Val.
next prev parent reply other threads:[~2013-09-25 17:19 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-09-24 13:38 [PATCH 1/3] media: i2c: Add ADV761X support Valentine Barshak
2013-09-24 14:17 ` Hans Verkuil
2013-09-24 15:54 ` Guennadi Liakhovetski
2013-09-24 16:19 ` Guennadi Liakhovetski
2013-09-24 17:37 ` Hans Verkuil
2013-09-24 18:09 ` Andy Walls
2013-09-25 9:57 ` Laurent Pinchart
2013-09-25 10:21 ` Laurent Pinchart
2013-09-25 12:33 ` Valentine
2013-09-25 13:02 ` Valentine
2013-09-25 14:08 ` Guennadi Liakhovetski
2013-09-25 15:16 ` Valentine
2013-09-25 16:31 ` Guennadi Liakhovetski
2013-09-25 17:19 ` Valentine [this message]
2013-09-25 18:33 ` Guennadi Liakhovetski
2013-09-25 20:36 ` Valentine
2013-09-25 22:04 ` Laurent Pinchart
2013-09-25 22:57 ` Laurent Pinchart
2013-09-26 6:31 ` Hans Verkuil
2013-09-26 6:45 ` Hans Verkuil
2013-09-26 6:57 ` Hans Verkuil
2013-09-26 9:36 ` Laurent Pinchart
2013-09-26 9:39 ` Laurent Pinchart
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=52431B09.5080307@cogentembedded.com \
--to=valentine.barshak@cogentembedded.com \
--cc=linux-sh@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.