提交 4b29631d 编写于 作者: I Igor M. Liplianin 提交者: Mauro Carvalho Chehab

V4L/DVB (9533): cx88: Add support for TurboSight TBS8910 DVB-S PCI card

The card based on stv0299 or stv0288 demodulators.
Signed-off-by: NIgor M. Liplianin <liplianin@me.by>
Signed-off-by: NMauro Carvalho Chehab <mchehab@redhat.com>
上级 1f6340bd
...@@ -74,3 +74,5 @@ ...@@ -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 ...@@ -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[] = { ...@@ -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[] = { ...@@ -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[] = { ...@@ -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[] = { ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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[]; ...@@ -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)/% ...@@ -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 @@ ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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) ...@@ -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)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册