The patch number 10541 was added via Mauro Carvalho Chehab <mche...@redhat.com>
to http://linuxtv.org/hg/v4l-dvb master development tree.

Kernel patches in this development tree may be modified to be backward
compatible with older kernels. Compatibility modifications will be
removed before inclusion into the mainstream Kernel

If anyone has any objections, please let us know by sending a message to:
        Linux Media Mailing List <linux-me...@vger.kernel.org>

------

From: Mauro Carvalho Chehab  <mche...@redhat.com>
merge: http://www.linuxtv.org/hg/~hverkuil/v4l-dvb-rds


Signed-off-by: Mauro Carvalho Chehab <mche...@redhat.com>


---

 linux/drivers/media/video/cx2341x.c   |    2 
 linux/drivers/media/video/saa6588.c   |  209 +++++++++++++-------------
 linux/include/media/v4l2-chip-ident.h |    3 
 3 files changed, 114 insertions(+), 100 deletions(-)

diff -r 597ef8287239 -r 9a8fa2bd8bd7 linux/drivers/media/video/cx2341x.c
--- a/linux/drivers/media/video/cx2341x.c       Fri Feb 13 11:31:03 2009 -0200
+++ b/linux/drivers/media/video/cx2341x.c       Fri Feb 13 11:35:32 2009 -0200
@@ -46,12 +46,12 @@ const u32 cx2341x_mpeg_ctrls[] = {
        V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ,
        V4L2_CID_MPEG_AUDIO_ENCODING,
        V4L2_CID_MPEG_AUDIO_L2_BITRATE,
-       V4L2_CID_MPEG_AUDIO_AC3_BITRATE,
        V4L2_CID_MPEG_AUDIO_MODE,
        V4L2_CID_MPEG_AUDIO_MODE_EXTENSION,
        V4L2_CID_MPEG_AUDIO_EMPHASIS,
        V4L2_CID_MPEG_AUDIO_CRC,
        V4L2_CID_MPEG_AUDIO_MUTE,
+       V4L2_CID_MPEG_AUDIO_AC3_BITRATE,
        V4L2_CID_MPEG_VIDEO_ENCODING,
        V4L2_CID_MPEG_VIDEO_ASPECT,
        V4L2_CID_MPEG_VIDEO_B_FRAMES,
diff -r 597ef8287239 -r 9a8fa2bd8bd7 linux/drivers/media/video/saa6588.c
--- a/linux/drivers/media/video/saa6588.c       Fri Feb 13 11:31:03 2009 -0200
+++ b/linux/drivers/media/video/saa6588.c       Fri Feb 13 11:35:32 2009 -0200
@@ -32,6 +32,9 @@
 #include <asm/uaccess.h>
 
 #include <media/rds.h>
+#include <media/v4l2-device.h>
+#include <media/v4l2-chip-ident.h>
+#include <media/v4l2-i2c-drv-legacy.h>
 #include "compat.h"
 
 /* Addresses to scan */
@@ -73,7 +76,7 @@ MODULE_LICENSE("GPL");
 #define dprintk     if (debug) printk
 
 struct saa6588 {
-       struct i2c_client client;
+       struct v4l2_subdev sd;
        struct work_struct work;
        struct timer_list timer;
        spinlock_t lock;
@@ -87,8 +90,10 @@ struct saa6588 {
        int data_available_for_read;
 };
 
-static struct i2c_driver driver;
-static struct i2c_client client_template;
+static inline struct saa6588 *to_saa6588(struct v4l2_subdev *sd)
+{
+       return container_of(sd, struct saa6588, sd);
+}
 
 /* ---------------------------------------------------------------------- */
 
@@ -259,6 +264,7 @@ static void block_to_buf(struct saa6588 
 
 static void saa6588_i2c_poll(struct saa6588 *s)
 {
+       struct i2c_client *client = v4l2_get_subdevdata(&s->sd);
        unsigned long flags;
        unsigned char tmpbuf[6];
        unsigned char blocknum;
@@ -266,7 +272,7 @@ static void saa6588_i2c_poll(struct saa6
 
        /* Although we only need 3 bytes, we have to read at least 6.
           SAA6588 returns garbage otherwise */
-       if (6 != i2c_master_recv(&s->client, &tmpbuf[0], 6)) {
+       if (6 != i2c_master_recv(client, &tmpbuf[0], 6)) {
                if (debug > 1)
                        dprintk(PREFIX "read error!\n");
                return;
@@ -342,6 +348,7 @@ static void saa6588_work(struct work_str
 
 static int saa6588_configure(struct saa6588 *s)
 {
+       struct i2c_client *client = v4l2_get_subdevdata(&s->sd);
        unsigned char buf[3];
        int rc;
 
@@ -389,7 +396,8 @@ static int saa6588_configure(struct saa6
        dprintk(PREFIX "writing: 0w=0x%02x 1w=0x%02x 2w=0x%02x\n",
                buf[0], buf[1], buf[2]);
 
-       if (3 != (rc = i2c_master_send(&s->client, buf, 3)))
+       rc = i2c_master_send(client, buf, 3);
+       if (rc != 3)
                printk(PREFIX "i2c i/o error: rc == %d (should be 3)\n", rc);
 
        return 0;
@@ -397,38 +405,101 @@ static int saa6588_configure(struct saa6
 
 /* ---------------------------------------------------------------------- */
 
-static int saa6588_attach(struct i2c_adapter *adap, int addr, int kind)
+static long saa6588_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
+{
+       struct saa6588 *s = to_saa6588(sd);
+       struct rds_command *a = arg;
+
+       switch (cmd) {
+               /* --- open() for /dev/radio --- */
+       case RDS_CMD_OPEN:
+               a->result = 0;  /* return error if chip doesn't work ??? */
+               break;
+               /* --- close() for /dev/radio --- */
+       case RDS_CMD_CLOSE:
+               s->data_available_for_read = 1;
+               wake_up_interruptible(&s->read_queue);
+               a->result = 0;
+               break;
+               /* --- read() for /dev/radio --- */
+       case RDS_CMD_READ:
+               read_from_buf(s, a);
+               break;
+               /* --- poll() for /dev/radio --- */
+       case RDS_CMD_POLL:
+               a->result = 0;
+               if (s->data_available_for_read) {
+                       a->result |= POLLIN | POLLRDNORM;
+               }
+               poll_wait(a->instance, &s->read_queue, a->event_list);
+               break;
+
+       default:
+               /* nothing */
+               return -ENOIOCTLCMD;
+       }
+       return 0;
+}
+
+static int saa6588_g_chip_ident(struct v4l2_subdev *sd, struct 
v4l2_dbg_chip_ident *chip)
+{
+       struct i2c_client *client = v4l2_get_subdevdata(sd);
+
+       return v4l2_chip_ident_i2c_client(client, chip, V4L2_IDENT_SAA6588, 0);
+}
+
+static int saa6588_command(struct i2c_client *client, unsigned cmd, void *arg)
+{
+       return v4l2_subdev_command(i2c_get_clientdata(client), cmd, arg);
+}
+
+/* ----------------------------------------------------------------------- */
+
+static const struct v4l2_subdev_core_ops saa6588_core_ops = {
+       .g_chip_ident = saa6588_g_chip_ident,
+       .ioctl = saa6588_ioctl,
+};
+
+static const struct v4l2_subdev_ops saa6588_ops = {
+       .core = &saa6588_core_ops,
+};
+
+/* ---------------------------------------------------------------------- */
+
+static int saa6588_probe(struct i2c_client *client,
+                        const struct i2c_device_id *id)
 {
        struct saa6588 *s;
-       client_template.adapter = adap;
-       client_template.addr = addr;
-
-       printk(PREFIX "chip found @ 0x%x\n", addr << 1);
-
-       if (NULL == (s = kmalloc(sizeof(*s), GFP_KERNEL)))
+       struct v4l2_subdev *sd;
+
+       v4l_info(client, "saa6588 found @ 0x%x (%s)\n",
+                       client->addr << 1, client->adapter->name);
+
+       s = kzalloc(sizeof(*s), GFP_KERNEL);
+       if (s == NULL)
                return -ENOMEM;
 
        s->buf_size = bufblocks * 3;
 
-       if (NULL == (s->buffer = kmalloc(s->buf_size, GFP_KERNEL))) {
+       s->buffer = kmalloc(s->buf_size, GFP_KERNEL);
+       if (s->buffer == NULL) {
                kfree(s);
                return -ENOMEM;
        }
+       sd = &s->sd;
+       v4l2_i2c_subdev_init(sd, client, &saa6588_ops);
        spin_lock_init(&s->lock);
-       s->client = client_template;
        s->block_count = 0;
        s->wr_index = 0;
        s->rd_index = 0;
        s->last_blocknum = 0xff;
        init_waitqueue_head(&s->read_queue);
        s->data_available_for_read = 0;
-       i2c_set_clientdata(&s->client, s);
-       i2c_attach_client(&s->client);
 
        saa6588_configure(s);
 
        /* start polling via eventd */
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 20)
        INIT_WORK(&s->work, saa6588_work, s);
 #else
        INIT_WORK(&s->work, saa6588_work);
@@ -440,97 +511,37 @@ static int saa6588_attach(struct i2c_ada
        return 0;
 }
 
-static int saa6588_probe(struct i2c_adapter *adap)
-{
-       if (adap->class & I2C_CLASS_TV_ANALOG)
-               return i2c_probe(adap, &addr_data, saa6588_attach);
-       return 0;
-}
-
-static int saa6588_detach(struct i2c_client *client)
-{
-       struct saa6588 *s = i2c_get_clientdata(client);
+static int saa6588_remove(struct i2c_client *client)
+{
+       struct v4l2_subdev *sd = i2c_get_clientdata(client);
+       struct saa6588 *s = to_saa6588(sd);
+
+       v4l2_device_unregister_subdev(sd);
 
        del_timer_sync(&s->timer);
        flush_scheduled_work();
 
-       i2c_detach_client(client);
        kfree(s->buffer);
        kfree(s);
        return 0;
 }
 
-static int saa6588_command(struct i2c_client *client, unsigned int cmd,
-                                                       void *arg)
-{
-       struct saa6588 *s = i2c_get_clientdata(client);
-       struct rds_command *a = (struct rds_command *)arg;
-
-       switch (cmd) {
-               /* --- open() for /dev/radio --- */
-       case RDS_CMD_OPEN:
-               a->result = 0;  /* return error if chip doesn't work ??? */
-               break;
-               /* --- close() for /dev/radio --- */
-       case RDS_CMD_CLOSE:
-               s->data_available_for_read = 1;
-               wake_up_interruptible(&s->read_queue);
-               a->result = 0;
-               break;
-               /* --- read() for /dev/radio --- */
-       case RDS_CMD_READ:
-               read_from_buf(s, a);
-               break;
-               /* --- poll() for /dev/radio --- */
-       case RDS_CMD_POLL:
-               a->result = 0;
-               if (s->data_available_for_read) {
-                       a->result |= POLLIN | POLLRDNORM;
-               }
-               poll_wait(a->instance, &s->read_queue, a->event_list);
-               break;
-
-       default:
-               /* nothing */
-               break;
-       }
-       return 0;
-}
-
 /* ----------------------------------------------------------------------- */
 
-static struct i2c_driver driver = {
-       .driver = {
-               .name = "saa6588",
-       },
-       .id = -1,               /* FIXME */
-       .attach_adapter = saa6588_probe,
-       .detach_client = saa6588_detach,
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 26)
+static const struct i2c_device_id saa6588_id[] = {
+       { "saa6588", 0 },
+       { }
+};
+MODULE_DEVICE_TABLE(i2c, saa6588_id);
+
+#endif
+static struct v4l2_i2c_driver_data v4l2_i2c_data = {
+       .name = "saa6588",
        .command = saa6588_command,
-};
-
-static struct i2c_client client_template = {
-       .name = "saa6588",
-       .driver = &driver,
-};
-
-static int __init saa6588_init_module(void)
-{
-       return i2c_add_driver(&driver);
-}
-
-static void __exit saa6588_cleanup_module(void)
-{
-       i2c_del_driver(&driver);
-}
-
-module_init(saa6588_init_module);
-module_exit(saa6588_cleanup_module);
-
-/*
- * Overrides for Emacs so that we follow Linus's tabbing style.
- * ---------------------------------------------------------------------------
- * Local variables:
- * c-basic-offset: 8
- * End:
- */
+       .probe = saa6588_probe,
+       .remove = saa6588_remove,
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 26)
+       .id_table = saa6588_id,
+#endif
+};
diff -r 597ef8287239 -r 9a8fa2bd8bd7 linux/include/media/v4l2-chip-ident.h
--- a/linux/include/media/v4l2-chip-ident.h     Fri Feb 13 11:31:03 2009 -0200
+++ b/linux/include/media/v4l2-chip-ident.h     Fri Feb 13 11:35:32 2009 -0200
@@ -91,6 +91,9 @@ enum {
 
        /* module tea6420: just ident 6420 */
        V4L2_IDENT_TEA6420 = 6420,
+
+       /* module saa6588: just ident 6588 */
+       V4L2_IDENT_SAA6588 = 6588,
 
        /* module saa6752hs: reserved range 6750-6759 */
        V4L2_IDENT_SAA6752HS = 6752,


---

Patch is available at: 
http://linuxtv.org/hg/v4l-dvb/rev/9a8fa2bd8bd7decc39d9bf3e094ffcb0b1804583

_______________________________________________
linuxtv-commits mailing list
linuxtv-commits@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linuxtv-commits

Reply via email to