On Monday 14 December 2009 21:41:20 Guennadi Liakhovetski wrote:
> On Mon, 14 Dec 2009, Jonathan Cameron wrote:
>
> > Hi All,
> >
> > >> 3) it would be interesting to patch the other sensor drivers to be
> > >> compatible
> > >> with soc_camera (mt9v011/ov7670);
> > >
> > > Well, this could be done, yes, but does it make sense to do this blindly
> > > without any hardware to test? I would rather add such conversions on a
> > > one-by-one basis as need arises.
> > >
> > I'm working on the ov7670. I've added the media bus stuff to what I've
> > previously posted but I haven't tested as yet. For reference, a quick and
> > dirty
> > cut of the patch is below. Some thought is needed on how to deal with the
> > sections
> > that currently need to be different for the soc-camera and non soc camera
> > uses.
> > (mainly the registration code in probe).
>
> Look at my patch for mt9t031. First you do not have to fail if
> client->dev.platform_data == NULL. You have to look at the bridge driver,
> that's currently working with ov7670. If it is not setting platform_data,
> you can use it to detect whether you're in soc-camera environment or not.
> Otherwise, if the bridge driver were also using that pointer, we would
> have to come up with a ov7670-specific struct to be linked from that
> pointer. I was actually thinking about a way to pass soc-camera data to
> client drivers in a way, that would not imped non soc-camera use. So, how
> about:
>
>
> I soc-camera environment
>
> 1. platform defines a
>
> static struct ov7670_platform_data ov7670 = {
> .link = &ov7670_link,
> };
>
> 2. and a
>
> static struct soc_camera_link ov7670_link = {
> .client_data = &ov7670,
> };
>
> 3. soc-camera core gets &ov7670_link in its probe, same as this is done
> now, then it does
>
> icl->icd = icd;
> icl->board_info->platform_data = icl->client_data;
>
> subdev = v4l2_i2c_new_subdev_board(&ici->v4l2_dev, adap,
> icl->module_name, icl->board_info, NULL);
>
> 4. ov7670 probe is called with client platform data pointing to its own
> data:
>
> static int ov7670_probe(struct i2c_client *client,
> const struct i2c_device_id *did)
> {
> struct ov7670_platform_data *pdata = client->dev.platform_data;
> struct soc_camera_link *icl = pdata->link;
> struct soc_camera_device *icd;
>
> if (icl)
> icd = icl->icd;
>
>
> II Non soc-camera environment
>
> 1. the bridge driver fills in sensor data and does
>
> struct ov7670_platform_data *ov7670_pdata = kzalloc(sizeof(*pdata));
>
> ov7670_pdata->... = ...;
> board_info->platform_data = ov7670_pdata;
>
> subdev = v4l2_i2c_new_subdev_board(v4l2_dev, adap,
> module_name, board_info, NULL);
>
> 2. ov7670_probe() gets called and finds its data as above, but without an
> soc-camera link this time.
>
>
> The advantage of the above is, that each client driver is free to define
> its own platform data struct, and for soc-camera it only has to provide
> one pointer in it. The ugly side is the cross-referencing between I.1. and
> I.2. above.
>
> Alternatively we could agree, that all client drivers get in their i2c
> client platform data a standard struct with only pointers in it to client
> data and to various bridging models:
>
> struct v4l2_client {
> void *client;
> struct soc_camera_link *icl;
> struct int_device_link *int;
> ...
> };
>
> or a bit more hidden
>
> struct v4l2_client {
> void *client;
> void *bridge_data;
> enum V4L2_BRIDGE_TYPE bridge_type;
> };
Before this goes too far let me just say that I will NAK any attempt in this
direction. Subdevice drivers must eventually be completely independent from
bridge driver. The same driver should work out of the box for soc-camera,
gspca, omap3, davinci, saa7134 and whatever other bridge driver is out there.
Having bridge-specific code in a sub-device driver will be a disaster in the
long run. Well, we've seen what happens when you do it that way.
As far as I know the only soc-dependency left now is for bus configuration.
Proposals were made some time ago and we should pick that up again and remove
that last dependency.
Regards,
Hans
--
Hans Verkuil - video4linux developer - sponsored by TANDBERG
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html