V4L/DVB (10068): Change device ID selection method on ov772x driver
authorKuninori Morimoto <morimoto.kuninori@renesas.com>
Thu, 18 Dec 2008 14:05:49 +0000 (11:05 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Tue, 30 Dec 2008 11:40:15 +0000 (09:40 -0200)
Signed-off-by: Kuninori Morimoto <morimoto.kuninori@renesas.com>
Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/ov772x.c
include/media/v4l2-chip-ident.h

index a2d51e27e48d230bec2562898bedb73279b4a01b..305befab8943e410ebfff3740225a472eac0bc4f 100644 (file)
 #define OP_UV       0x00000001
 #define OP_SWAP_RGB 0x00000002
 
+/*
+ * ID
+ */
+#define OV7720  0x7720
+#define VERSION(pid, ver) ((pid<<8)|(ver&0xFF))
+
 /*
  * struct
  */
@@ -374,6 +380,7 @@ struct ov772x_priv {
        struct soc_camera_device          icd;
        const struct ov772x_color_format *fmt;
        const struct ov772x_win_size     *win;
+       int                               model;
 };
 
 #define ENDMARKER { 0xff, 0xff }
@@ -702,7 +709,9 @@ static unsigned long ov772x_query_bus_param(struct soc_camera_device *icd)
 static int ov772x_get_chip_id(struct soc_camera_device *icd,
                              struct v4l2_chip_ident   *id)
 {
-       id->ident    = V4L2_IDENT_OV772X;
+       struct ov772x_priv *priv = container_of(icd, struct ov772x_priv, icd);
+
+       id->ident    = priv->model;
        id->revision = 0;
 
        return 0;
@@ -796,6 +805,7 @@ static int ov772x_video_probe(struct soc_camera_device *icd)
 {
        struct ov772x_priv *priv = container_of(icd, struct ov772x_priv, icd);
        u8                  pid, ver;
+       const char         *devname;
 
        /*
         * We must have a parent by now. And it cannot be a wrong one.
@@ -822,15 +832,21 @@ static int ov772x_video_probe(struct soc_camera_device *icd)
         */
        pid = i2c_smbus_read_byte_data(priv->client, PID);
        ver = i2c_smbus_read_byte_data(priv->client, VER);
-       if (pid != 0x77 ||
-           ver != 0x21) {
+
+       switch (VERSION(pid, ver)) {
+       case OV7720:
+               devname     = "ov7720";
+               priv->model = V4L2_IDENT_OV7720;
+               break;
+       default:
                dev_err(&icd->dev,
                        "Product ID error %x:%x\n", pid, ver);
                return -ENODEV;
        }
 
        dev_info(&icd->dev,
-                "ov772x Product ID %0x:%0x Manufacturer ID %x:%x\n",
+                "%s Product ID %0x:%0x Manufacturer ID %x:%x\n",
+                devname,
                 pid,
                 ver,
                 i2c_smbus_read_byte_data(priv->client, MIDH),
@@ -921,7 +937,7 @@ static int ov772x_remove(struct i2c_client *client)
 }
 
 static const struct i2c_device_id ov772x_id[] = {
-       {"ov772x", 0},
+       { "ov772x", 0 },
        { }
 };
 MODULE_DEVICE_TABLE(i2c, ov772x_id);
@@ -941,7 +957,6 @@ static struct i2c_driver ov772x_i2c_driver = {
 
 static int __init ov772x_module_init(void)
 {
-       printk(KERN_INFO "ov772x driver\n");
        return i2c_add_driver(&ov772x_i2c_driver);
 }
 
index e3e5b53931deffdf70a59cf8fabed4c3a8352b6b..56974e689a4d9de00a7cfa87b5860e2d13406bf0 100644 (file)
@@ -60,7 +60,7 @@ enum {
 
        /* OmniVision sensors: reserved range 250-299 */
        V4L2_IDENT_OV7670 = 250,
-       V4L2_IDENT_OV772X = 251,
+       V4L2_IDENT_OV7720 = 251,
 
        /* Conexant MPEG encoder/decoders: reserved range 410-420 */
        V4L2_IDENT_CX23415 = 415,