V4L/DVB (9970): em28xx: Allow get/set registers for debug on i2c slave chips
authorMauro Carvalho Chehab <mchehab@redhat.com>
Mon, 22 Dec 2008 23:58:41 +0000 (20:58 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Tue, 30 Dec 2008 11:39:34 +0000 (09:39 -0200)
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/em28xx/em28xx-video.c

index 4ea4920c927a13b9c2a8c4ed2101106fc6ab0bd4..b5ea18e1229007d46f730cdcf55758bed3696511 100644 (file)
@@ -39,6 +39,7 @@
 #include "em28xx.h"
 #include <media/v4l2-common.h>
 #include <media/v4l2-ioctl.h>
+#include <media/v4l2-chip-ident.h>
 #include <media/msp3400.h>
 #include <media/tuner.h>
 
@@ -1214,6 +1215,21 @@ static int em28xx_reg_len(int reg)
        }
 }
 
+static int vidioc_g_chip_ident(struct file *file, void *priv,
+              struct v4l2_chip_ident *chip)
+{
+       struct em28xx_fh      *fh  = priv;
+       struct em28xx         *dev = fh->dev;
+
+       chip->ident = V4L2_IDENT_NONE;
+       chip->revision = 0;
+
+       em28xx_i2c_call_clients(dev, VIDIOC_G_CHIP_IDENT, chip);
+
+       return 0;
+}
+
+
 static int vidioc_g_register(struct file *file, void *priv,
                             struct v4l2_register *reg)
 {
@@ -1221,7 +1237,8 @@ static int vidioc_g_register(struct file *file, void *priv,
        struct em28xx         *dev = fh->dev;
        int ret;
 
-       if (reg->match_type == V4L2_CHIP_MATCH_AC97) {
+       switch (reg->match_type) {
+       case V4L2_CHIP_MATCH_AC97:
                mutex_lock(&dev->lock);
                ret = em28xx_read_ac97(dev, reg->reg);
                mutex_unlock(&dev->lock);
@@ -1230,11 +1247,18 @@ static int vidioc_g_register(struct file *file, void *priv,
 
                reg->val = ret;
                return 0;
-       }
-
-       if (!v4l2_chip_match_host(reg->match_type, reg->match_chip))
+       case V4L2_CHIP_MATCH_I2C_DRIVER:
+               em28xx_i2c_call_clients(dev, VIDIOC_DBG_G_REGISTER, reg);
+               return 0;
+       case V4L2_CHIP_MATCH_I2C_ADDR:
+               /* Not supported yet */
                return -EINVAL;
+       default:
+               if (!v4l2_chip_match_host(reg->match_type, reg->match_chip))
+                       return -EINVAL;
+       }
 
+       /* Match host */
        if (em28xx_reg_len(reg->reg) == 1) {
                mutex_lock(&dev->lock);
                ret = em28xx_read_reg(dev, reg->reg);
@@ -1267,14 +1291,25 @@ static int vidioc_s_register(struct file *file, void *priv,
        __le64 buf;
        int    rc;
 
-       if (reg->match_type == V4L2_CHIP_MATCH_AC97) {
+       switch (reg->match_type) {
+       case V4L2_CHIP_MATCH_AC97:
                mutex_lock(&dev->lock);
                rc = em28xx_write_ac97(dev, reg->reg, reg->val);
                mutex_unlock(&dev->lock);
 
                return rc;
+       case V4L2_CHIP_MATCH_I2C_DRIVER:
+               em28xx_i2c_call_clients(dev, VIDIOC_DBG_S_REGISTER, reg);
+               return 0;
+       case V4L2_CHIP_MATCH_I2C_ADDR:
+               /* Not supported yet */
+               return -EINVAL;
+       default:
+               if (!v4l2_chip_match_host(reg->match_type, reg->match_chip))
+                       return -EINVAL;
        }
 
+       /* Match host */
        buf = cpu_to_le64(reg->val);
 
        mutex_lock(&dev->lock);
@@ -1927,6 +1962,7 @@ static const struct v4l2_ioctl_ops video_ioctl_ops = {
 #ifdef CONFIG_VIDEO_ADV_DEBUG
        .vidioc_g_register          = vidioc_g_register,
        .vidioc_s_register          = vidioc_s_register,
+       .vidioc_g_chip_ident        = vidioc_g_chip_ident,
 #endif
 #ifdef CONFIG_VIDEO_V4L1_COMPAT
        .vidiocgmbuf                = vidiocgmbuf,