Re: About v4l2 subdev s_config (for core) API?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



2009/7/13 Hans Verkuil <hverkuil@xxxxxxxxx>:
> On Monday 13 July 2009 10:19:57 Dongsoo, Nathaniel Kim wrote:
>> 2009/7/12 Hans Verkuil <hverkuil@xxxxxxxxx>:
>> > On Saturday 11 July 2009 13:02:33 Dongsoo, Nathaniel Kim wrote:
>> >> Hi,
>> >>
>> >> The thing is - Is it possible to make the subdev device not to be
>> >> turned on in registering process using any of v4l2_i2c_new_subdev*** ?
>> >> You can say that I can ignore the i2c errors in booting process, but I
>> >> think it is not a pretty way.
>> >>
>> >> And for the reason I'm asking you about this, I need you to consider
>> >> following conditions I carry.
>> >>
>> >> 1. ARM embedded platform especially mobile handset.
>> >> 2. Mass production which is very concerned about power consumption.
>> >> 3. Strict and automated test process in product line.
>> >>
>> >> So, what I want to ask you is about s_config subdev call which is
>> >> called from every single I2C subdev load in some kind of probe
>> >> procedure. As s_config is supposed to do, it tries to initialize
>> >> subdev device. which means it needs to turn on the subdev to make that
>> >> initialized.
>> >
>> > Actually, all s_config does is to pass the irq and platform_data
>> > arguments to the subdev driver. The subdev driver can just store that
>> > information somewhere and only use it when needed. It does not
>> > necessarily have to turn on the sub-device.
>> >
>> > Whether to just store this info or turn on the sub-device is something
>> > that each subdev driver writer has to decide.
>> >
>> > Note that this really has nothing to do with the existance of s_config:
>> > s_config was only introduced in order to support legacy v4l2 drivers
>> > and subdev drivers. In the (far?) future this will probably disappear
>> > and this information will always be passed via struct i2c_board_info.
>> >
>> >> But as I mentioned above if we make the product go through the product
>> >> line, it turns on the subdev device even though nobody intended to
>> >> turn the subdev on. It might be an issue in product vendor's point of
>> >> view, because there should be a crystal clear reason for the
>> >> consumption of power the subdev made. I'm working on camera device and
>> >> speaking of which, camera devices are really power consuming device
>> >> and some camera devices even take ages to be initialized as well.
>> >>
>> >> So far I hope I made a good explanation about why I'm asking you about
>> >> following question.
>> >> By the way, it seems to be similar to the issue I've faced whe using
>> >> old i2c driver model..I mean probing i2c devices on boot up sequence.
>> >
>> > That at least should no longer be a problem anymore (as long as you
>> > don't use the address-probing variants).
>> >
>> > Regards,
>> >
>> >        Hans
>> >
>> > --
>> > Hans Verkuil - video4linux developer - sponsored by TANDBERG
>>
>> Hello Hans,
>>
>>
>> Actually I picked up s_config to make external camera module (subdev)
>> do initialization when we open camera device, but s_config seems to be
>> made for other purpose.
>> As you noted in comment for the "init" API, you recommended not to use
>> "init" subdev API and neither do I want to use any API to be removed.
>> So, I'm figuring out how to make camera device to be initialized under
>> subdev framework.
>> So, I re-checked the whole subdev API list we have in v4l2-subdev and
>> found s_crystal_freq.
>>
>> Here is a question:
>> Is s_crystal_freq for let the subdev know about the given clock like
>> MCLK(master clock) for external camera device?
>>
>> The thing is, if you are intending to get rid of the "init" subdev API
>> in the future and on the other hand some device like camera still
>> needs a direct way to be initialized, I think we can use one of API
>> which can be used during initializing process. I figured out that if
>> s_crystal_freq is for subdev to be noticed about the given clock
>> frequency to itself, it might be used for initialization programming
>> also.
>
> That would be abusing that function, I don't think that's a good idea.

ok, I got it

>
>> Let's assume that I'm turning on the camera which is working with 24MHz
>> MCLK.
>>
>> 1. power on
>> 2. give 24MHz MCLK from host to camera and let camera know about the
>> frequency given through s_crystal_freq (even though the camera device
>> supports for only one frequency value)
>> 3. reset device
>> 4. preview on
>>
>> If I'm getting wrong about s_crystal_freq, I think we need to keep
>> "init" for camera devices.
>
> This is actually the first valid use-case I've seen for init.
>
> I think that I need to do the following:
>
> 1) Remove the use of init() in all current i2c drivers. If I remember
> correctly, there aren't many that use it so it shouldn't be hard to do
> this.
>
> 2) Let the current v4l2_i2c_new_* functions call the init core op by
> default. Initializing on load is the default for all current drivers, so we
> have to keep that behavior.
>
> 3) Add a new v4l2_i2c_new_subdev_no_init() that does the same as
> v4l2_i2c_new_subdev_board, except without calling init(). It also omits the
> probe_addrs argument since probing requires power to the i2c device.
>

That seems to be the exact one I was looking for. If it is ok, I
should be using in my camera interface driver.

But to be sure, I wanna remind you why I need "init" for is just want
to program initialization registers every time I open the device node.
just like this.

- on booting time :
register i2c device (camera device) without programming initialization
registers on external camera device through i2c bus and no power on as
either.

- on device opening time :
give power and clock and also program initialization registers through
i2c to the external camera device. <= here I need any kind of subdev
call to let external camera device know that device node has been
opened.

And speaking of a camera module, every time it is being turned off (i
mean cut the power and clock) camera device needs to be re-programmed
when it is turned on again. (I think you are well aware of that)

> This does mean that the no_init function will only be available for kernels
>>= 2.6.26, but I don't expect that to be a problem.
>
> These changes allow i2c drivers to be written in such a manner that they can
> be loaded with the device powered off and only be initialized when init()
> is called.

Yes exactly what I was intending to do.
So, can you say that the "init" subdev call will survive?

>
> Comments?
>
> Regards,
>
>        Hans
>
> --
> Hans Verkuil - video4linux developer - sponsored by TANDBERG
>

Well arranged thanks to you. BTW, can you tell me about
"s_crystal_freq" in detail? I can see that ivtv and saa7115 are using
that but can't figure out what is exactly for. At the earlier mail, I
considered that as a function let subdev device know about the
frequency of clock "given" not "made by". Am I right? Please let me
know if I'm getting wrong.
Cheers,

Nate


-- 
=
DongSoo, Nathaniel Kim
Engineer
Mobile S/W Platform Lab.
Digital Media & Communications R&D Centre
Samsung Electronics CO., LTD.
e-mail : dongsoo.kim@xxxxxxxxx
          dongsoo45.kim@xxxxxxxxxxx
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux