Re: [PATCH 5/5] go7007: subdev conversion

2009-11-15 Thread Hans Verkuil
On Tuesday 10 November 2009 20:21:44 Pete Eberlein wrote:
> From: Pete Eberlein 
> 
> Convert the go7007 driver to v4l2 subdev interface, using v4l2 i2c
> subdev functions instead of i2c functions directly.  The v4l2 ioctl ops
> functions call subdev ops instead of i2c commands.
> 
> Priority: normal
> 
> Signed-off-by: Pete Eberlein 

Signed-off-by: Hans Verkuil 

Again, nice work!

It's in much better shape now.

When all this is in we need to take a good look at this and see what
needs to be done to move this driver out of staging.

One thing that needs to be fixed before that can happen is that I
noticed the use of lock_kernel in s2250-loader.c: this should be done
differently. The BKL is slowly being removed throughout the kernel so it
should be removed here as well.

Regards,

Hans

-- 
Hans Verkuil - video4linux developer - sponsored by TANDBERG Telecom
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 5/5] go7007: subdev conversion

2009-11-10 Thread Pete Eberlein
From: Pete Eberlein 

Convert the go7007 driver to v4l2 subdev interface, using v4l2 i2c
subdev functions instead of i2c functions directly.  The v4l2 ioctl ops
functions call subdev ops instead of i2c commands.

Priority: normal

Signed-off-by: Pete Eberlein 

diff -r a44341b7bf67 -r 76b500418fae 
linux/drivers/staging/go7007/go7007-driver.c
--- a/linux/drivers/staging/go7007/go7007-driver.c  Tue Nov 10 10:56:51 
2009 -0800
+++ b/linux/drivers/staging/go7007/go7007-driver.c  Tue Nov 10 11:20:10 
2009 -0800
@@ -193,7 +193,8 @@
 static int init_i2c_module(struct i2c_adapter *adapter, const char *type,
   int id, int addr)
 {
-   struct i2c_board_info info;
+   struct go7007 *go = i2c_get_adapdata(adapter);
+   struct v4l2_device *v4l2_dev = &go->v4l2_dev;
char *modname;
 
switch (id) {
@@ -225,14 +226,10 @@
modname = NULL;
break;
}
-   if (modname != NULL)
-   request_module(modname);
 
-   memset(&info, 0, sizeof(struct i2c_board_info));
-   info.addr = addr;
-   strlcpy(info.type, type, I2C_NAME_SIZE);
-   if (!i2c_new_device(adapter, &info))
+   if (v4l2_i2c_new_subdev(v4l2_dev, adapter, modname, type, addr, NULL))
return 0;
+
if (modname != NULL)
printk(KERN_INFO
"go7007: probing for module %s failed\n", modname);
@@ -262,6 +259,11 @@
if (ret < 0)
return -1;
 
+   /* v4l2 init must happen before i2c subdevs */
+   ret = go7007_v4l2_init(go);
+   if (ret < 0)
+   return ret;
+
if (!go->i2c_adapter_online &&
go->board_info->flags & GO7007_BOARD_USE_ONBOARD_I2C) {
if (go7007_i2c_init(go) < 0)
@@ -282,7 +284,7 @@
go->audio_enabled = 1;
go7007_snd_init(go);
}
-   return go7007_v4l2_init(go);
+   return 0;
 }
 EXPORT_SYMBOL(go7007_register_encoder);
 
diff -r a44341b7bf67 -r 76b500418fae linux/drivers/staging/go7007/go7007-v4l2.c
--- a/linux/drivers/staging/go7007/go7007-v4l2.cTue Nov 10 10:56:51 
2009 -0800
+++ b/linux/drivers/staging/go7007/go7007-v4l2.cTue Nov 10 11:20:10 
2009 -0800
@@ -29,6 +29,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -46,6 +47,9 @@
 #defineV4L2_MPEG_VIDEO_ENCODING_MPEG_4   3
 #endif
 
+#define call_all(dev, o, f, args...) \
+   v4l2_device_call_until_err(dev, 0, o, f, ##args)
+
 static void deactivate_buffer(struct go7007_buffer *gobuf)
 {
int i;
@@ -247,19 +251,23 @@
go->modet_map[i] = 0;
 
if (go->board_info->sensor_flags & GO7007_SENSOR_SCALING) {
-   struct video_decoder_resolution res;
+   struct v4l2_format res;
 
-   res.width = width;
+   if (fmt != NULL) {
+   res = *fmt;
+   } else {
+   res.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+   res.fmt.pix.width = width;
+   }
+
if (height > sensor_height / 2) {
-   res.height = height / 2;
+   res.fmt.pix.height = height / 2;
go->encoder_v_halve = 0;
} else {
-   res.height = height;
+   res.fmt.pix.height = height;
go->encoder_v_halve = 1;
}
-   if (go->i2c_adapter_online)
-   i2c_clients_command(&go->i2c_adapter,
-   DECODER_SET_RESOLUTION, &res);
+   call_all(&go->v4l2_dev, video, s_fmt, &res);
} else {
if (width <= sensor_width / 4) {
go->encoder_h_halve = 1;
@@ -385,7 +393,7 @@
 }
 #endif
 
-static int mpeg_queryctrl(struct v4l2_queryctrl *ctrl)
+static int mpeg_query_ctrl(struct v4l2_queryctrl *ctrl)
 {
static const u32 mpeg_ctrls[] = {
V4L2_CID_MPEG_CLASS,
@@ -973,51 +981,35 @@
   struct v4l2_queryctrl *query)
 {
struct go7007 *go = ((struct go7007_file *) priv)->go;
+   int id = query->id;
 
-   if (!go->i2c_adapter_online)
-   return -EIO;
+   if (0 == call_all(&go->v4l2_dev, core, queryctrl, query))
+   return 0;
 
-   i2c_clients_command(&go->i2c_adapter, VIDIOC_QUERYCTRL, query);
-
-   return (!query->name[0]) ? mpeg_queryctrl(query) : 0;
+   query->id = id;
+   return mpeg_query_ctrl(query);
 }
 
 static int vidioc_g_ctrl(struct file *file, void *priv,
struct v4l2_control *ctrl)
 {
struct go7007 *go = ((struct go7007_file *) priv)->go;
-   struct v4l2_queryctrl query;
 
-   if (!go->i2c_adapter_online)
-   return -EIO;
+   if (0 == call_all(&go->v4l2_dev, core, g_ctrl, ctrl))
+