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