The patch number 11282 was added via Hans Verkuil <[email protected]>
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 <[email protected]>

------

From: Hans Verkuil  <[email protected]>
saa7134: add RDS support.


The Terratec Cinergy 600 TV MK3 supports the RDS decoder saa6588.
Add support to saa7134 for such devices.

Priority: normal

Signed-off-by: Hans Verkuil <[email protected]>


---

 linux/drivers/media/video/saa7134/Kconfig         |    1 
 linux/drivers/media/video/saa7134/saa7134-cards.c |    1 
 linux/drivers/media/video/saa7134/saa7134-core.c  |   11 ++++
 linux/drivers/media/video/saa7134/saa7134-video.c |   37 ++++++++++++++
 linux/drivers/media/video/saa7134/saa7134.h       |    1 
 5 files changed, 51 insertions(+)

diff -r 836328d1449e -r c6efdea42ecc linux/drivers/media/video/saa7134/Kconfig
--- a/linux/drivers/media/video/saa7134/Kconfig Sun Mar 29 11:17:31 2009 +0200
+++ b/linux/drivers/media/video/saa7134/Kconfig Sun Mar 29 11:26:27 2009 +0200
@@ -6,6 +6,7 @@ config VIDEO_SAA7134
        select VIDEO_TUNER
        select VIDEO_TVEEPROM
        select CRC32
+       select VIDEO_SAA6588 if VIDEO_HELPER_CHIPS_AUTO
        ---help---
          This is a video4linux driver for Philips SAA713x based
          TV cards.
diff -r 836328d1449e -r c6efdea42ecc 
linux/drivers/media/video/saa7134/saa7134-cards.c
--- a/linux/drivers/media/video/saa7134/saa7134-cards.c Sun Mar 29 11:17:31 
2009 +0200
+++ b/linux/drivers/media/video/saa7134/saa7134-cards.c Sun Mar 29 11:26:27 
2009 +0200
@@ -1704,6 +1704,7 @@ struct saa7134_board saa7134_boards[] = 
                .radio_type     = UNSET,
                .tuner_addr     = ADDR_UNSET,
                .radio_addr     = ADDR_UNSET,
+               .rds_addr       = 0x10,
                .tda9887_conf   = TDA9887_PRESENT,
                .inputs         = {{
                        .name = name_tv,
diff -r 836328d1449e -r c6efdea42ecc 
linux/drivers/media/video/saa7134/saa7134-core.c
--- a/linux/drivers/media/video/saa7134/saa7134-core.c  Sun Mar 29 11:17:31 
2009 +0200
+++ b/linux/drivers/media/video/saa7134/saa7134-core.c  Sun Mar 29 11:26:27 
2009 +0200
@@ -1051,6 +1051,17 @@ static int __devinit saa7134_initdev(str
                        sd->grp_id = GRP_EMPRESS;
        }
 
+       if (saa7134_boards[dev->board].rds_addr) {
+               unsigned short addrs[2] = { 0, I2C_CLIENT_END };
+               struct v4l2_subdev *sd;
+
+               addrs[0] = saa7134_boards[dev->board].rds_addr;
+               sd = v4l2_i2c_new_probed_subdev(&dev->i2c_adap, "saa6588",
+                           "saa6588", addrs);
+               if (sd)
+                       printk(KERN_INFO "%s: found RDS decoder\n", dev->name);
+       }
+
        request_submodules(dev);
 
        v4l2_prio_init(&dev->prio);
diff -r 836328d1449e -r c6efdea42ecc 
linux/drivers/media/video/saa7134/saa7134-video.c
--- a/linux/drivers/media/video/saa7134/saa7134-video.c Sun Mar 29 11:17:31 
2009 +0200
+++ b/linux/drivers/media/video/saa7134/saa7134-video.c Sun Mar 29 11:26:27 
2009 +0200
@@ -30,6 +30,7 @@
 #include "saa7134-reg.h"
 #include "saa7134.h"
 #include <media/v4l2-common.h>
+#include <media/rds.h>
 
 /* ------------------------------------------------------------------ */
 
@@ -1462,6 +1463,7 @@ static int video_release(struct file *fi
 {
        struct saa7134_fh  *fh  = file->private_data;
        struct saa7134_dev *dev = fh->dev;
+       struct rds_command cmd;
        unsigned long flags;
 
        /* turn off overlay */
@@ -1495,6 +1497,8 @@ static int video_release(struct file *fi
        saa_andorb(SAA7134_OFMT_DATA_B, 0x1f, 0);
 
        saa_call_all(dev, core, s_standby, 0);
+       if (fh->radio)
+               saa_call_all(dev, core, ioctl, RDS_CMD_CLOSE, &cmd);
 
        /* free stuff */
        videobuf_mmap_free(&fh->cap);
@@ -1513,6 +1517,37 @@ static int video_mmap(struct file *file,
        struct saa7134_fh *fh = file->private_data;
 
        return videobuf_mmap_mapper(saa7134_queue(fh), vma);
+}
+
+static ssize_t radio_read(struct file *file, char __user *data,
+                        size_t count, loff_t *ppos)
+{
+       struct saa7134_fh *fh = file->private_data;
+       struct saa7134_dev *dev = fh->dev;
+       struct rds_command cmd;
+
+       cmd.block_count = count/3;
+       cmd.buffer = data;
+       cmd.instance = file;
+       cmd.result = -ENODEV;
+
+       saa_call_all(dev, core, ioctl, RDS_CMD_READ, &cmd);
+
+       return cmd.result;
+}
+
+static unsigned int radio_poll(struct file *file, poll_table *wait)
+{
+       struct saa7134_fh *fh = file->private_data;
+       struct saa7134_dev *dev = fh->dev;
+       struct rds_command cmd;
+
+       cmd.instance = file;
+       cmd.event_list = wait;
+       cmd.result = -ENODEV;
+       saa_call_all(dev, core, ioctl, RDS_CMD_POLL, &cmd);
+
+       return cmd.result;
 }
 
 /* ------------------------------------------------------------------ */
@@ -2446,8 +2481,10 @@ static const struct v4l2_file_operations
 static const struct v4l2_file_operations radio_fops = {
        .owner    = THIS_MODULE,
        .open     = video_open,
+       .read     = radio_read,
        .release  = video_release,
        .ioctl    = video_ioctl2,
+       .poll     = radio_poll,
 };
 
 static const struct v4l2_ioctl_ops radio_ioctl_ops = {
diff -r 836328d1449e -r c6efdea42ecc linux/drivers/media/video/saa7134/saa7134.h
--- a/linux/drivers/media/video/saa7134/saa7134.h       Sun Mar 29 11:17:31 
2009 +0200
+++ b/linux/drivers/media/video/saa7134/saa7134.h       Sun Mar 29 11:26:27 
2009 +0200
@@ -334,6 +334,7 @@ struct saa7134_board {
        unsigned char           tuner_addr;
        unsigned char           radio_addr;
        unsigned char           empress_addr;
+       unsigned char           rds_addr;
 
        unsigned int            tda9887_conf;
        unsigned int            tuner_config;


---

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

_______________________________________________
linuxtv-commits mailing list
[email protected]
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linuxtv-commits

Reply via email to