bttv: Convert to generic TEA575x interface
Subsystems (2)
PATCH 1/3 bttv: Convert to generic TEA575x interface
Remove tea575x-specific code from bttv and use the common driver instead.
Only set_frequency is implemented (signal/stereo detection or seek would require more changes to bttv).
It works fine on Video Highway Xtreme (it actually makes the radio usable as it currently cannot be tuned properly).
Miro/Pinnacle is untested but seems to be simple and should work.
However, I don't understand the Terratec Active Radio Upgrade code. The HW seems to need IOR, IOW and CSEL signals that were taken from ISA bus on older cards (IOR and IOW directly and CSEL from some address decoder) and are emulated here using GPIOs. But the code manipulating these signals in bttv seems to be broken - it never asserts the IOR signal. If anyone has this HW, please test if I got that right.
--- drivers/media/pci/bt8xx/Kconfig | 3 + drivers/media/pci/bt8xx/bttv-cards.c | 317 ++++++++++++--------------------- drivers/media/pci/bt8xx/bttv-driver.c | 6 +- drivers/media/pci/bt8xx/bttvp.h | 14 +- 4 files changed, 125 insertions(+), 215 deletions(-)
drivers/media/pci/bt8xx/Kconfig +3 -0
@@ -4,12 +4,15 @@ config VIDEO_BT848 select I2C_ALGOBIT select VIDEOBUF_DMA_SG depends on RC_CORE + depends on MEDIA_RADIO_SUPPORT select VIDEO_TUNER select VIDEO_TVEEPROM select VIDEO_MSP3400 if MEDIA_SUBDRV_AUTOSELECT select VIDEO_TVAUDIO if MEDIA_SUBDRV_AUTOSELECT select VIDEO_TDA7432 if MEDIA_SUBDRV_AUTOSELECT select VIDEO_SAA6588 if MEDIA_SUBDRV_AUTOSELECT + select RADIO_ADAPTERS + select RADIO_TEA575X ---help--- Support for BT848 based frame grabber/overlay boards. This includes the Miro, Hauppauge and STB boards. Please read the material in
drivers/media/pci/bt8xx/bttv-cards.c +110 -207
363 lines not on this page · raw message
drivers/media/pci/bt8xx/bttv-driver.c +4 -2
@@ -1874,8 +1874,10 @@ static void bttv_set_frequency(struct bttv *btv, const struct v4l2_frequency *f)if (new_freq.type ==V4L2_TUNER_RADIO ) {radio_enable (btv); btv->radio_freq = new_freq.frequency; -if (btv->has_matchbox) -tea5757_set_freq (btv, btv->radio_freq); +if (btv->has_tea575x) { + btv->tea.freq = btv->radio_freq; +snd_tea575x_set_freq (&btv->tea); + } }else { btv->tv_freq = new_freq.frequency; }
drivers/media/pci/bt8xx/bttvp.h +8 -6
@@ -42,6 +42,7 @@#include <media/tveeprom.h> #include <media/rc-core.h> #include <media/ir-kbd-i2c.h> +#include <media/tea575x.h> #include "bt848.h" #include "bttv.h"
@@ -359,6 +360,10 @@ struct bttv_suspend_state {struct bttv_buffer *vbi; }; +struct bttv_tea575x_gpio { +u8 data, clk, wren, most; +}; +struct bttv {struct bttv_core c;
@@ -445,12 +450,9 @@ struct bttv {/* miro/pinnacle + Aimslab VHX philips matchbox (tea5757 radio tuner) support */ -int has_matchbox; -int mbox_we; -int mbox_data; -int mbox_clk; -int mbox_most; -int mbox_mask; +int has_tea575x; +struct bttv_tea575x_gpio tea_gpio; +struct snd_tea575x tea;/* ISA stuff (Terratec Active Radio Upgrade) */ int mbox_ior;
Signature · 1 line
Ondrej Zary
PATCH 2/3 tea575x: split and export functions
Split ioctl interface from enum_freq_bands, g_tuner and s_hw_freq_seek functions and export them to be used in other drivers like bttv.
--- drivers/media/radio/tea575x.c | 41 ++++++++++++++++++++++++++++++++--------- include/media/tea575x.h | 5 +++++ 2 files changed, 37 insertions(+), 9 deletions(-)
drivers/media/radio/tea575x.c +32 -9
@@ -247,10 +247,9 @@ static int vidioc_querycap(struct file *file, void *priv,return 0 ; } -static int vidioc_enum_freq_bands (struct file *file,void *priv, -struct v4l2_frequency_band *band) +int snd_tea575x_enum_freq_bands (struct snd_tea575x *tea, +struct v4l2_frequency_band *band) { -struct snd_tea575x *tea =video_drvdata (file);int index;if (band->tuner !=0 )
@@ -279,18 +278,25 @@ static int vidioc_enum_freq_bands(struct file *file, void *priv,return 0 ; } +EXPORT_SYMBOL (snd_tea575x_enum_freq_bands); -static int vidioc_g_tuner (struct file *file,void *priv, -struct v4l2_tuner *v) +static int vidioc_enum_freq_bands (struct file *file,void *priv, +struct v4l2_frequency_band *band) {struct snd_tea575x *tea =video_drvdata (file); + +return snd_tea575x_enum_freq_bands (tea, band); +} + +int snd_tea575x_g_tuner (struct snd_tea575x *tea,struct v4l2_tuner *v) +{struct v4l2_frequency_band band_fm = {0 , };if (v->index >0 )return -EINVAL ;snd_tea575x_read (tea); -vidioc_enum_freq_bands (file, priv, &band_fm); +snd_tea575x_enum_freq_bands (tea, &band_fm);memset (v,0 ,sizeof (*v));strlcpy (v->name, tea->has_am ?"FM/AM" :"FM" ,sizeof (v->name));
@@ -304,6 +310,15 @@ static int vidioc_g_tuner(struct file *file, void *priv, v->signal = tea->tuned ?0xffff :0 ;return 0 ; } +EXPORT_SYMBOL (snd_tea575x_g_tuner); + +static int vidioc_g_tuner (struct file *file,void *priv, +struct v4l2_tuner *v) +{ +struct snd_tea575x *tea =video_drvdata (file); + +return snd_tea575x_g_tuner (tea, v); +}static int vidioc_s_tuner (struct file *file,void *priv,const struct v4l2_tuner *v)
@@ -356,10 +371,9 @@ static int vidioc_s_frequency(struct file *file, void *priv,return 0 ; } -static int vidioc_s_hw_freq_seek (struct file *file,void *fh, -const struct v4l2_hw_freq_seek *a) +int snd_tea575x_s_hw_freq_seek (struct file *file,struct snd_tea575x *tea, +const struct v4l2_hw_freq_seek *a) { -struct snd_tea575x *tea =video_drvdata (file);unsigned long timeout;int i, spacing;
@@ -442,6 +456,15 @@ static int vidioc_s_hw_freq_seek(struct file *file, void *fh,snd_tea575x_set_freq (tea);return -ENODATA ; } +EXPORT_SYMBOL (snd_tea575x_s_hw_freq_seek); + +static int vidioc_s_hw_freq_seek (struct file *file,void *fh, +const struct v4l2_hw_freq_seek *a) +{ +struct snd_tea575x *tea =video_drvdata (file); + +return snd_tea575x_s_hw_freq_seek (file, tea, a); +}static int tea575x_s_ctrl (struct v4l2_ctrl *ctrl) {
include/media/tea575x.h +5 -0
@@ -71,6 +71,11 @@ struct snd_tea575x {int (*ext_init)(struct snd_tea575x *tea); }; +int snd_tea575x_enum_freq_bands (struct snd_tea575x *tea, +struct v4l2_frequency_band *band); +int snd_tea575x_g_tuner (struct snd_tea575x *tea,struct v4l2_tuner *v); +int snd_tea575x_s_hw_freq_seek (struct file *file,struct snd_tea575x *tea, +const struct v4l2_hw_freq_seek *a);int snd_tea575x_hw_init (struct snd_tea575x *tea);int snd_tea575x_init (struct snd_tea575x *tea,struct module *owner);void snd_tea575x_exit (struct snd_tea575x *tea);
Signature · 1 line
Ondrej Zary
PATCH 3/3 bttv: Improve TEA575x support
In reply to Ondrej ZaryImprove g_tuner and add s_hw_freq_seek and enum_freq_bands support for cards with TEA575x radio.
This allows signal/stereo detection and HW seek to work on these cards.
--- drivers/media/pci/bt8xx/bttv-driver.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+)
drivers/media/pci/bt8xx/bttv-driver.c +31 -0
@@ -2515,6 +2515,8 @@ static int bttv_querycap(struct file *file, void *priv,if (btv->has_saa6588) cap->device_caps |=V4L2_CAP_READWRITE |V4L2_CAP_RDS_CAPTURE ; +if (btv->has_tea575x) + cap->device_caps |=V4L2_CAP_HW_FREQ_SEEK ; }return 0 ; }
@@ -3244,6 +3246,9 @@ static int radio_g_tuner(struct file *file, void *priv, struct v4l2_tuner *t)if (btv->audio_mode_gpio) btv->audio_mode_gpio (btv, t,0 ); +if (btv->has_tea575x) +return snd_tea575x_g_tuner (&btv->tea, t); +return 0 ; }
@@ -3261,6 +3266,30 @@ static int radio_s_tuner(struct file *file, void *priv,return 0 ; } +static int radio_s_hw_freq_seek (struct file *file,void *priv, +const struct v4l2_hw_freq_seek *a) +{ +struct bttv_fh *fh = priv; +struct bttv *btv = fh->btv; + +if (btv->has_tea575x) +return snd_tea575x_s_hw_freq_seek (file, &btv->tea, a); +else +return -ENOTTY ; +} + +static int radio_enum_freq_bands (struct file *file,void *priv, +struct v4l2_frequency_band *band) +{ +struct bttv_fh *fh = priv; +struct bttv *btv = fh->btv; + +if (btv->has_tea575x) +return snd_tea575x_enum_freq_bands (&btv->tea, band); +else +return -ENOTTY ; +} +static ssize_t radio_read (struct file *file,char __user *data,size_t count,loff_t *ppos) {
@@ -3318,6 +3347,8 @@ static const struct v4l2_ioctl_ops radio_ioctl_ops = { .vidioc_s_tuner = radio_s_tuner, .vidioc_g_frequency = bttv_g_frequency, .vidioc_s_frequency = bttv_s_frequency, + .vidioc_s_hw_freq_seek = radio_s_hw_freq_seek, + .vidioc_enum_freq_bands = radio_enum_freq_bands, .vidioc_subscribe_event = v4l2_ctrl_subscribe_event, .vidioc_unsubscribe_event = v4l2_event_unsubscribe, };
Signature · 1 line
Ondrej Zary
Re: [PATCH 3/3] bttv: Improve TEA575x support
Hi Ondrej,
Just two small comments:
Quoted 37 lines · Ondrej Zary
Improve
g_tunerand adds_hw_freq_seekandenum_freq_bandssupport for cards with TEA575x radio.This allows signal/stereo detection and HW seek to work on these cards.
Signed-off-by Ondrej Zary <[email protected]>--- drivers/media/pci/bt8xx/bttv-driver.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+)drivers/media/pci/bt8xx/bttv-driver.c +5
-0@@ -2515,6 +2515,8 @@ static int bttv_querycap(struct file *file, void *priv,if (btv->has_saa6588) cap->device_caps |=V4L2_CAP_READWRITE |V4L2_CAP_RDS_CAPTURE ; +if (btv->has_tea575x) + cap->device_caps |=V4L2_CAP_HW_FREQ_SEEK ; }return 0 ; }@@ -3244,6 +3246,9 @@ static int radio_g_tuner(struct file *file, void *priv, struct v4l2_tuner *t)if (btv->audio_mode_gpio) btv->audio_mode_gpio (btv, t,0 ); +if (btv->has_tea575x) +return snd_tea575x_g_tuner (&btv->tea, t); +return 0 ; }@@ -3261,6 +3266,30 @@ static int radio_s_tuner(struct file *file, void *priv,return 0 ; }
drivers/media/pci/bt8xx/bttv-driver.c static int radio_s_tuner(struct file *file, void *priv, · line 3278
Quoted 10 lines
drivers/media/pci/bt8xx/bttv-driver.c +10
-0+static int radio_s_hw_freq_seek (struct file *file,void *priv, +const struct v4l2_hw_freq_seek *a) +{ +struct bttv_fh *fh = priv; +struct bttv *btv = fh->btv; + +if (btv->has_tea575x) +return snd_tea575x_s_hw_freq_seek (file, &btv->tea, a); +else +return -ENOTTY ;
Please drop the superfluous 'else'. I thought checkpatch warned about this these days.
drivers/media/pci/bt8xx/bttv-driver.c static int radio_s_tuner(struct file *file, void *priv, · line 3290
Quoted 12 lines
drivers/media/pci/bt8xx/bttv-driver.c +12
-0+} + +static int radio_enum_freq_bands (struct file *file,void *priv, +struct v4l2_frequency_band *band) +{ +struct bttv_fh *fh = priv; +struct bttv *btv = fh->btv; + +if (btv->has_tea575x) +return snd_tea575x_enum_freq_bands (&btv->tea, band); +else +return -ENOTTY ;
Ditto.
Quoted 7 lines
drivers/media/pci/bt8xx/bttv-driver.c +2
-0+} +static ssize_t radio_read (struct file *file,char __user *data,size_t count,loff_t *ppos) {
drivers/media/pci/bt8xx/bttv-driver.c static const struct v4l2_ioctl_ops radio_ioctl_ops = { · line 3354
Quoted 8 lines
drivers/media/pci/bt8xx/bttv-driver.c +2
-0@@ -3318,6 +3347,8 @@ static const struct v4l2_ioctl_ops radio_ioctl_ops = { .vidioc_s_tuner = radio_s_tuner, .vidioc_g_frequency = bttv_g_frequency, .vidioc_s_frequency = bttv_s_frequency, + .vidioc_s_hw_freq_seek = radio_s_hw_freq_seek, + .vidioc_enum_freq_bands = radio_enum_freq_bands, .vidioc_subscribe_event = v4l2_ctrl_subscribe_event, .vidioc_unsubscribe_event = v4l2_event_unsubscribe, };
Regards,
Hans
PATCH v2 3/3 bttv: Improve TEA575x support
Improve g_tuner and add s_hw_freq_seek and enum_freq_bands support for cards with TEA575x radio.
This allows signal/stereo detection and HW seek to work on these cards.
--- drivers/media/pci/bt8xx/bttv-driver.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+)
drivers/media/pci/bt8xx/bttv-driver.c +31 -0
@@ -2515,6 +2515,8 @@ static int bttv_querycap(struct file *file, void *priv,if (btv->has_saa6588) cap->device_caps |=V4L2_CAP_READWRITE |V4L2_CAP_RDS_CAPTURE ; +if (btv->has_tea575x) + cap->device_caps |=V4L2_CAP_HW_FREQ_SEEK ; }return 0 ; }
@@ -3244,6 +3246,9 @@ static int radio_g_tuner(struct file *file, void *priv, struct v4l2_tuner *t)if (btv->audio_mode_gpio) btv->audio_mode_gpio (btv, t,0 ); +if (btv->has_tea575x) +return snd_tea575x_g_tuner (&btv->tea, t); +return 0 ; }
@@ -3261,6 +3266,30 @@ static int radio_s_tuner(struct file *file, void *priv,return 0 ; } +static int radio_s_hw_freq_seek (struct file *file,void *priv, +const struct v4l2_hw_freq_seek *a) +{ +struct bttv_fh *fh = priv; +struct bttv *btv = fh->btv; + +if (btv->has_tea575x) +return snd_tea575x_s_hw_freq_seek (file, &btv->tea, a); + +return -ENOTTY ; +} + +static int radio_enum_freq_bands (struct file *file,void *priv, +struct v4l2_frequency_band *band) +{ +struct bttv_fh *fh = priv; +struct bttv *btv = fh->btv; + +if (btv->has_tea575x) +return snd_tea575x_enum_freq_bands (&btv->tea, band); + +return -ENOTTY ; +} +static ssize_t radio_read (struct file *file,char __user *data,size_t count,loff_t *ppos) {
@@ -3318,6 +3347,8 @@ static const struct v4l2_ioctl_ops radio_ioctl_ops = { .vidioc_s_tuner = radio_s_tuner, .vidioc_g_frequency = bttv_g_frequency, .vidioc_s_frequency = bttv_s_frequency, + .vidioc_s_hw_freq_seek = radio_s_hw_freq_seek, + .vidioc_enum_freq_bands = radio_enum_freq_bands, .vidioc_subscribe_event = v4l2_ctrl_subscribe_event, .vidioc_unsubscribe_event = v4l2_event_unsubscribe, };
Signature · 1 line
Ondrej Zary