mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-09 14:50:19 +00:00
V4L/DVB (9533): cx88: Add support for TurboSight TBS8910 DVB-S PCI card
The card based on stv0299 or stv0288 demodulators. Signed-off-by: Igor M. Liplianin <liplianin@me.by> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
parent
1f6340bd43
commit
4b29631db3
@ -74,3 +74,5 @@
|
|||||||
73 -> TeVii S420 DVB-S [d420:9022]
|
73 -> TeVii S420 DVB-S [d420:9022]
|
||||||
74 -> Prolink Pixelview Global Extreme [1554:4976]
|
74 -> Prolink Pixelview Global Extreme [1554:4976]
|
||||||
75 -> PROF 7300 DVB-S/S2 [B033:3033]
|
75 -> PROF 7300 DVB-S/S2 [B033:3033]
|
||||||
|
76 -> SATTRADE ST4200 DVB-S/S2 [b200:4200]
|
||||||
|
77 -> TBS 8910 DVB-S [8910:8888]
|
||||||
|
@ -25,6 +25,7 @@ obj-$(CONFIG_VIDEO_IR_I2C) += ir-kbd-i2c.o
|
|||||||
obj-$(CONFIG_VIDEO_TVAUDIO) += tvaudio.o
|
obj-$(CONFIG_VIDEO_TVAUDIO) += tvaudio.o
|
||||||
obj-$(CONFIG_VIDEO_TDA7432) += tda7432.o
|
obj-$(CONFIG_VIDEO_TDA7432) += tda7432.o
|
||||||
obj-$(CONFIG_VIDEO_TDA9875) += tda9875.o
|
obj-$(CONFIG_VIDEO_TDA9875) += tda9875.o
|
||||||
|
obj-$(CONFIG_SOUND_TVMIXER) += tvmixer.o
|
||||||
|
|
||||||
obj-$(CONFIG_VIDEO_SAA6588) += saa6588.o
|
obj-$(CONFIG_VIDEO_SAA6588) += saa6588.o
|
||||||
obj-$(CONFIG_VIDEO_SAA5246A) += saa5246a.o
|
obj-$(CONFIG_VIDEO_SAA5246A) += saa5246a.o
|
||||||
|
@ -1847,6 +1847,18 @@ static const struct cx88_board cx88_boards[] = {
|
|||||||
} },
|
} },
|
||||||
.mpeg = CX88_MPEG_DVB,
|
.mpeg = CX88_MPEG_DVB,
|
||||||
},
|
},
|
||||||
|
[CX88_BOARD_TBS_8910] = {
|
||||||
|
.name = "TBS 8910 DVB-S",
|
||||||
|
.tuner_type = UNSET,
|
||||||
|
.radio_type = UNSET,
|
||||||
|
.tuner_addr = ADDR_UNSET,
|
||||||
|
.radio_addr = ADDR_UNSET,
|
||||||
|
.input = {{
|
||||||
|
.type = CX88_VMUX_DVB,
|
||||||
|
.vmux = 0,
|
||||||
|
} },
|
||||||
|
.mpeg = CX88_MPEG_DVB,
|
||||||
|
},
|
||||||
[CX88_BOARD_TBS_8920] = {
|
[CX88_BOARD_TBS_8920] = {
|
||||||
.name = "TBS 8920 DVB-S/S2",
|
.name = "TBS 8920 DVB-S/S2",
|
||||||
.tuner_type = TUNER_ABSENT,
|
.tuner_type = TUNER_ABSENT,
|
||||||
@ -1871,6 +1883,18 @@ static const struct cx88_board cx88_boards[] = {
|
|||||||
} },
|
} },
|
||||||
.mpeg = CX88_MPEG_DVB,
|
.mpeg = CX88_MPEG_DVB,
|
||||||
},
|
},
|
||||||
|
[CX88_BOARD_SATTRADE_ST4200] = {
|
||||||
|
.name = "SATTRADE ST4200 DVB-S/S2",
|
||||||
|
.tuner_type = UNSET,
|
||||||
|
.radio_type = UNSET,
|
||||||
|
.tuner_addr = ADDR_UNSET,
|
||||||
|
.radio_addr = ADDR_UNSET,
|
||||||
|
.input = {{
|
||||||
|
.type = CX88_VMUX_DVB,
|
||||||
|
.vmux = 0,
|
||||||
|
} },
|
||||||
|
.mpeg = CX88_MPEG_DVB,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
/* ------------------------------------------------------------------ */
|
/* ------------------------------------------------------------------ */
|
||||||
@ -2260,6 +2284,10 @@ static const struct cx88_subid cx88_subids[] = {
|
|||||||
.subvendor = 0xA044,
|
.subvendor = 0xA044,
|
||||||
.subdevice = 0x2011,
|
.subdevice = 0x2011,
|
||||||
.card = CX88_BOARD_OMICOM_SS4_PCI,
|
.card = CX88_BOARD_OMICOM_SS4_PCI,
|
||||||
|
}, {
|
||||||
|
.subvendor = 0x8910,
|
||||||
|
.subdevice = 0x8888,
|
||||||
|
.card = CX88_BOARD_TBS_8910,
|
||||||
}, {
|
}, {
|
||||||
.subvendor = 0x8920,
|
.subvendor = 0x8920,
|
||||||
.subdevice = 0x8888,
|
.subdevice = 0x8888,
|
||||||
@ -2268,6 +2296,10 @@ static const struct cx88_subid cx88_subids[] = {
|
|||||||
.subvendor = 0xB033,
|
.subvendor = 0xB033,
|
||||||
.subdevice = 0x3033,
|
.subdevice = 0x3033,
|
||||||
.card = CX88_BOARD_PROF_7300,
|
.card = CX88_BOARD_PROF_7300,
|
||||||
|
}, {
|
||||||
|
.subvendor = 0xb200,
|
||||||
|
.subdevice = 0x4200,
|
||||||
|
.card = CX88_BOARD_SATTRADE_ST4200,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -2878,8 +2910,10 @@ static void cx88_card_setup(struct cx88_core *core)
|
|||||||
case CX88_BOARD_TEVII_S420:
|
case CX88_BOARD_TEVII_S420:
|
||||||
case CX88_BOARD_TEVII_S460:
|
case CX88_BOARD_TEVII_S460:
|
||||||
case CX88_BOARD_OMICOM_SS4_PCI:
|
case CX88_BOARD_OMICOM_SS4_PCI:
|
||||||
|
case CX88_BOARD_TBS_8910:
|
||||||
case CX88_BOARD_TBS_8920:
|
case CX88_BOARD_TBS_8920:
|
||||||
case CX88_BOARD_PROF_7300:
|
case CX88_BOARD_PROF_7300:
|
||||||
|
case CX88_BOARD_SATTRADE_ST4200:
|
||||||
cx_write(MO_SRST_IO, 0);
|
cx_write(MO_SRST_IO, 0);
|
||||||
msleep(100);
|
msleep(100);
|
||||||
cx_write(MO_SRST_IO, 1);
|
cx_write(MO_SRST_IO, 1);
|
||||||
|
@ -1042,6 +1042,7 @@ static int dvb_register(struct cx8802_dev *dev)
|
|||||||
0x08, ISL6421_DCL, 0x00);
|
0x08, ISL6421_DCL, 0x00);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case CX88_BOARD_TBS_8910:
|
||||||
case CX88_BOARD_TEVII_S420:
|
case CX88_BOARD_TEVII_S420:
|
||||||
fe0->dvb.frontend = dvb_attach(stv0299_attach,
|
fe0->dvb.frontend = dvb_attach(stv0299_attach,
|
||||||
&tevii_tuner_sharp_config,
|
&tevii_tuner_sharp_config,
|
||||||
@ -1078,6 +1079,7 @@ static int dvb_register(struct cx8802_dev *dev)
|
|||||||
case CX88_BOARD_OMICOM_SS4_PCI:
|
case CX88_BOARD_OMICOM_SS4_PCI:
|
||||||
case CX88_BOARD_TBS_8920:
|
case CX88_BOARD_TBS_8920:
|
||||||
case CX88_BOARD_PROF_7300:
|
case CX88_BOARD_PROF_7300:
|
||||||
|
case CX88_BOARD_SATTRADE_ST4200:
|
||||||
fe0->dvb.frontend = dvb_attach(cx24116_attach,
|
fe0->dvb.frontend = dvb_attach(cx24116_attach,
|
||||||
&hauppauge_hvr4000_config,
|
&hauppauge_hvr4000_config,
|
||||||
&core->i2c_adap);
|
&core->i2c_adap);
|
||||||
|
@ -228,6 +228,8 @@ extern struct sram_channel cx88_sram_channels[];
|
|||||||
#define CX88_BOARD_TEVII_S420 73
|
#define CX88_BOARD_TEVII_S420 73
|
||||||
#define CX88_BOARD_PROLINK_PV_GLOBAL_XTREME 74
|
#define CX88_BOARD_PROLINK_PV_GLOBAL_XTREME 74
|
||||||
#define CX88_BOARD_PROF_7300 75
|
#define CX88_BOARD_PROF_7300 75
|
||||||
|
#define CX88_BOARD_SATTRADE_ST4200 76
|
||||||
|
#define CX88_BOARD_TBS_8910 77
|
||||||
|
|
||||||
enum cx88_itype {
|
enum cx88_itype {
|
||||||
CX88_VMUX_COMPOSITE1 = 1,
|
CX88_VMUX_COMPOSITE1 = 1,
|
||||||
|
@ -150,27 +150,15 @@ $(patsubst %,$(obj)/%.gen.o, $(fw-external-y)): $(obj)/%.gen.o: $(fwdir)/%
|
|||||||
$(obj)/%: $(obj)/%.ihex | $(objtree)/$(obj)/$$(dir %)
|
$(obj)/%: $(obj)/%.ihex | $(objtree)/$(obj)/$$(dir %)
|
||||||
$(call cmd,ihex)
|
$(call cmd,ihex)
|
||||||
|
|
||||||
# Don't depend on ihex2fw if we're installing and it already exists.
|
|
||||||
# Putting it after | in the dependencies doesn't seem sufficient when
|
|
||||||
# we're installing after a cross-compile, because ihex2fw has dependencies
|
|
||||||
# on stuff like /usr/lib/gcc/ppc64-redhat-linux/4.3.0/include/stddef.h and
|
|
||||||
# thus wants to be rebuilt. Which it can't be, if the prebuilt kernel tree
|
|
||||||
# is exported read-only for someone to run 'make install'.
|
|
||||||
ifeq ($(INSTALL):$(wildcard $(obj)/ihex2fw),install:$(obj)/ihex2fw)
|
|
||||||
ihex2fw_dep :=
|
|
||||||
else
|
|
||||||
ihex2fw_dep := $(obj)/ihex2fw
|
|
||||||
endif
|
|
||||||
|
|
||||||
# .HEX is also Intel HEX, but where the offset and length in each record
|
# .HEX is also Intel HEX, but where the offset and length in each record
|
||||||
# is actually meaningful, because the firmware has to be loaded in a certain
|
# is actually meaningful, because the firmware has to be loaded in a certain
|
||||||
# order rather than as a single binary blob. Thus, we convert them into our
|
# order rather than as a single binary blob. Thus, we convert them into our
|
||||||
# more compact binary representation of ihex records (<linux/ihex.h>)
|
# more compact binary representation of ihex records (<linux/ihex.h>)
|
||||||
$(obj)/%.fw: $(obj)/%.HEX $(ihex2fw_dep) | $(objtree)/$(obj)/$$(dir %)
|
$(obj)/%.fw: $(obj)/%.HEX $(obj)/ihex2fw | $(objtree)/$(obj)/$$(dir %)
|
||||||
$(call cmd,ihex2fw)
|
$(call cmd,ihex2fw)
|
||||||
|
|
||||||
# .H16 is our own modified form of Intel HEX, with 16-bit length for records.
|
# .H16 is our own modified form of Intel HEX, with 16-bit length for records.
|
||||||
$(obj)/%.fw: $(obj)/%.H16 $(ihex2fw_dep) | $(objtree)/$(obj)/$$(dir %)
|
$(obj)/%.fw: $(obj)/%.H16 $(obj)/ihex2fw | $(objtree)/$(obj)/$$(dir %)
|
||||||
$(call cmd,h16tofw)
|
$(call cmd,h16tofw)
|
||||||
|
|
||||||
$(firmware-dirs):
|
$(firmware-dirs):
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
@ -89,7 +89,7 @@ static int snd_tea575x_ioctl(struct inode *inode, struct file *file,
|
|||||||
{
|
{
|
||||||
struct snd_tea575x *tea = video_drvdata(file);
|
struct snd_tea575x *tea = video_drvdata(file);
|
||||||
void __user *arg = (void __user *)data;
|
void __user *arg = (void __user *)data;
|
||||||
|
|
||||||
switch(cmd) {
|
switch(cmd) {
|
||||||
case VIDIOCGCAP:
|
case VIDIOCGCAP:
|
||||||
{
|
{
|
||||||
@ -110,9 +110,9 @@ static int snd_tea575x_ioctl(struct inode *inode, struct file *file,
|
|||||||
case VIDIOCGTUNER:
|
case VIDIOCGTUNER:
|
||||||
{
|
{
|
||||||
struct video_tuner v;
|
struct video_tuner v;
|
||||||
if (copy_from_user(&v, arg,sizeof(v))!=0)
|
if (copy_from_user(&v, arg,sizeof(v))!=0)
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
if (v.tuner) /* Only 1 tuner */
|
if (v.tuner) /* Only 1 tuner */
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
v.rangelow = (87*16000);
|
v.rangelow = (87*16000);
|
||||||
v.rangehigh = (108*16000);
|
v.rangehigh = (108*16000);
|
||||||
@ -144,24 +144,24 @@ static int snd_tea575x_ioctl(struct inode *inode, struct file *file,
|
|||||||
snd_tea575x_set_freq(tea);
|
snd_tea575x_set_freq(tea);
|
||||||
return 0;
|
return 0;
|
||||||
case VIDIOCGAUDIO:
|
case VIDIOCGAUDIO:
|
||||||
{
|
{
|
||||||
struct video_audio v;
|
struct video_audio v;
|
||||||
memset(&v, 0, sizeof(v));
|
memset(&v, 0, sizeof(v));
|
||||||
strcpy(v.name, "Radio");
|
strcpy(v.name, "Radio");
|
||||||
if(copy_to_user(arg,&v, sizeof(v)))
|
if(copy_to_user(arg,&v, sizeof(v)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
case VIDIOCSAUDIO:
|
case VIDIOCSAUDIO:
|
||||||
{
|
{
|
||||||
struct video_audio v;
|
struct video_audio v;
|
||||||
if(copy_from_user(&v, arg, sizeof(v)))
|
if(copy_from_user(&v, arg, sizeof(v)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
if (tea->ops->mute)
|
if (tea->ops->mute)
|
||||||
tea->ops->mute(tea,
|
tea->ops->mute(tea,
|
||||||
(v.flags &
|
(v.flags &
|
||||||
VIDEO_AUDIO_MUTE) ? 1 : 0);
|
VIDEO_AUDIO_MUTE) ? 1 : 0);
|
||||||
if(v.audio)
|
if(v.audio)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -240,11 +240,11 @@ static int __init alsa_tea575x_module_init(void)
|
|||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __exit alsa_tea575x_module_exit(void)
|
static void __exit alsa_tea575x_module_exit(void)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
module_init(alsa_tea575x_module_init)
|
module_init(alsa_tea575x_module_init)
|
||||||
module_exit(alsa_tea575x_module_exit)
|
module_exit(alsa_tea575x_module_exit)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user