Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

V4L/DVB (13407): Add Prof 7301 PCI DVB-S2 card

Add Prof 7301 PCI DVB-S2 card

The card based on stv0903 demod, stb6100 tuner.

Signed-off-by: Igor M. Liplianin <liplianin@me.by>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>

authored by

Igor M. Liplianin and committed by
Mauro Carvalho Chehab
b699c271 fa26ae3e

+220
+1
Documentation/video4linux/CARDLIST.cx88
··· 81 81 80 -> Hauppauge WinTV-IR Only [0070:9290] 82 82 81 -> Leadtek WinFast DTV1800 Hybrid [107d:6654] 83 83 82 -> WinFast DTV2000 H rev. J [107d:6f2b] 84 + 83 -> Prof 7301 DVB-S/S2 [b034:3034]
+138
drivers/media/dvb/frontends/stb6100_proc.h
··· 1 + /* 2 + STB6100 Silicon Tuner wrapper 3 + Copyright (C)2009 Igor M. Liplianin (liplianin@me.by) 4 + 5 + This program is free software; you can redistribute it and/or modify 6 + it under the terms of the GNU General Public License as published by 7 + the Free Software Foundation; either version 2 of the License, or 8 + (at your option) any later version. 9 + 10 + This program is distributed in the hope that it will be useful, 11 + but WITHOUT ANY WARRANTY; without even the implied warranty of 12 + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 + GNU General Public License for more details. 14 + 15 + You should have received a copy of the GNU General Public License 16 + along with this program; if not, write to the Free Software 17 + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 18 + */ 19 + 20 + static int stb6100_get_freq(struct dvb_frontend *fe, u32 *frequency) 21 + { 22 + struct dvb_frontend_ops *frontend_ops = NULL; 23 + struct dvb_tuner_ops *tuner_ops = NULL; 24 + struct tuner_state state; 25 + int err = 0; 26 + 27 + if (&fe->ops) 28 + frontend_ops = &fe->ops; 29 + if (&frontend_ops->tuner_ops) 30 + tuner_ops = &frontend_ops->tuner_ops; 31 + if (tuner_ops->get_state) { 32 + if (frontend_ops->i2c_gate_ctrl) 33 + frontend_ops->i2c_gate_ctrl(fe, 1); 34 + 35 + err = tuner_ops->get_state(fe, DVBFE_TUNER_FREQUENCY, &state); 36 + if (err < 0) { 37 + printk(KERN_ERR "%s: Invalid parameter\n", __func__); 38 + return err; 39 + } 40 + 41 + if (frontend_ops->i2c_gate_ctrl) 42 + frontend_ops->i2c_gate_ctrl(fe, 0); 43 + 44 + *frequency = state.frequency; 45 + } 46 + 47 + return 0; 48 + } 49 + 50 + static int stb6100_set_freq(struct dvb_frontend *fe, u32 frequency) 51 + { 52 + struct dvb_frontend_ops *frontend_ops = NULL; 53 + struct dvb_tuner_ops *tuner_ops = NULL; 54 + struct tuner_state state; 55 + int err = 0; 56 + 57 + state.frequency = frequency; 58 + if (&fe->ops) 59 + frontend_ops = &fe->ops; 60 + if (&frontend_ops->tuner_ops) 61 + tuner_ops = &frontend_ops->tuner_ops; 62 + if (tuner_ops->set_state) { 63 + if (frontend_ops->i2c_gate_ctrl) 64 + frontend_ops->i2c_gate_ctrl(fe, 1); 65 + 66 + err = tuner_ops->set_state(fe, DVBFE_TUNER_FREQUENCY, &state); 67 + if (err < 0) { 68 + printk(KERN_ERR "%s: Invalid parameter\n", __func__); 69 + return err; 70 + } 71 + 72 + if (frontend_ops->i2c_gate_ctrl) 73 + frontend_ops->i2c_gate_ctrl(fe, 0); 74 + 75 + } 76 + 77 + return 0; 78 + } 79 + 80 + static int stb6100_get_bandw(struct dvb_frontend *fe, u32 *bandwidth) 81 + { 82 + struct dvb_frontend_ops *frontend_ops = NULL; 83 + struct dvb_tuner_ops *tuner_ops = NULL; 84 + struct tuner_state state; 85 + int err = 0; 86 + 87 + if (&fe->ops) 88 + frontend_ops = &fe->ops; 89 + if (&frontend_ops->tuner_ops) 90 + tuner_ops = &frontend_ops->tuner_ops; 91 + if (tuner_ops->get_state) { 92 + if (frontend_ops->i2c_gate_ctrl) 93 + frontend_ops->i2c_gate_ctrl(fe, 1); 94 + 95 + err = tuner_ops->get_state(fe, DVBFE_TUNER_BANDWIDTH, &state); 96 + if (err < 0) { 97 + printk(KERN_ERR "%s: Invalid parameter\n", __func__); 98 + return err; 99 + } 100 + 101 + if (frontend_ops->i2c_gate_ctrl) 102 + frontend_ops->i2c_gate_ctrl(fe, 0); 103 + 104 + *bandwidth = state.bandwidth; 105 + } 106 + 107 + return 0; 108 + } 109 + 110 + static int stb6100_set_bandw(struct dvb_frontend *fe, u32 bandwidth) 111 + { 112 + struct dvb_frontend_ops *frontend_ops = NULL; 113 + struct dvb_tuner_ops *tuner_ops = NULL; 114 + struct tuner_state state; 115 + int err = 0; 116 + 117 + state.bandwidth = bandwidth; 118 + if (&fe->ops) 119 + frontend_ops = &fe->ops; 120 + if (&frontend_ops->tuner_ops) 121 + tuner_ops = &frontend_ops->tuner_ops; 122 + if (tuner_ops->set_state) { 123 + if (frontend_ops->i2c_gate_ctrl) 124 + frontend_ops->i2c_gate_ctrl(fe, 1); 125 + 126 + err = tuner_ops->set_state(fe, DVBFE_TUNER_BANDWIDTH, &state); 127 + if (err < 0) { 128 + printk(KERN_ERR "%s: Invalid parameter\n", __func__); 129 + return err; 130 + } 131 + 132 + if (frontend_ops->i2c_gate_ctrl) 133 + frontend_ops->i2c_gate_ctrl(fe, 0); 134 + 135 + } 136 + 137 + return 0; 138 + }
+2
drivers/media/dvb/frontends/stv0900.h
··· 49 49 u8 tun2_maddress; 50 50 u8 tun1_adc;/* 1 for stv6110, 2 for stb6100 */ 51 51 u8 tun2_adc; 52 + /* Set device param to start dma */ 53 + int (*set_ts_params)(struct dvb_frontend *fe, int is_punctured); 52 54 }; 53 55 54 56 #if defined(CONFIG_DVB_STV0900) || (defined(CONFIG_DVB_STV0900_MODULE) \
+3
drivers/media/dvb/frontends/stv0900_core.c
··· 1494 1494 if (!(INRANGE(100000, c->symbol_rate, 70000000))) 1495 1495 return DVBFE_ALGO_SEARCH_FAILED; 1496 1496 1497 + if (state->config->set_ts_params) 1498 + state->config->set_ts_params(fe, 0); 1499 + 1497 1500 p_result.locked = FALSE; 1498 1501 p_search.path = demod; 1499 1502 p_search.frequency = c->frequency;
+2
drivers/media/video/cx88/Kconfig
··· 61 61 select DVB_STV0299 if !DVB_FE_CUSTOMISE 62 62 select DVB_STV0288 if !DVB_FE_CUSTOMISE 63 63 select DVB_STB6000 if !DVB_FE_CUSTOMISE 64 + select DVB_STV0900 if !DVB_FE_CUSTOMISE 65 + select DVB_STB6100 if !DVB_FE_CUSTOMISE 64 66 select MEDIA_TUNER_SIMPLE if !MEDIA_TUNER_CUSTOMISE 65 67 ---help--- 66 68 This adds support for DVB/ATSC cards based on the
+17
drivers/media/video/cx88/cx88-cards.c
··· 2075 2075 }, 2076 2076 .mpeg = CX88_MPEG_DVB, 2077 2077 }, 2078 + [CX88_BOARD_PROF_7301] = { 2079 + .name = "Prof 7301 DVB-S/S2", 2080 + .tuner_type = UNSET, 2081 + .radio_type = UNSET, 2082 + .tuner_addr = ADDR_UNSET, 2083 + .radio_addr = ADDR_UNSET, 2084 + .input = { { 2085 + .type = CX88_VMUX_DVB, 2086 + .vmux = 0, 2087 + } }, 2088 + .mpeg = CX88_MPEG_DVB, 2089 + }, 2078 2090 }; 2079 2091 2080 2092 /* ------------------------------------------------------------------ */ ··· 2547 2535 .subvendor = 0x107d, 2548 2536 .subdevice = 0x6618, 2549 2537 .card = CX88_BOARD_WINFAST_TV2000_XP_GLOBAL, 2538 + }, { 2539 + .subvendor = 0xb034, 2540 + .subdevice = 0x3034, 2541 + .card = CX88_BOARD_PROF_7301, 2550 2542 }, 2551 2543 }; 2552 2544 ··· 3227 3211 case CX88_BOARD_TBS_8920: 3228 3212 case CX88_BOARD_PROF_6200: 3229 3213 case CX88_BOARD_PROF_7300: 3214 + case CX88_BOARD_PROF_7301: 3230 3215 case CX88_BOARD_SATTRADE_ST4200: 3231 3216 cx_write(MO_GP0_IO, 0x8000); 3232 3217 msleep(100);
+54
drivers/media/video/cx88/cx88-dvb.c
··· 53 53 #include "stv0288.h" 54 54 #include "stb6000.h" 55 55 #include "cx24116.h" 56 + #include "stv0900.h" 57 + #include "stb6100.h" 58 + #include "stb6100_proc.h" 56 59 57 60 MODULE_DESCRIPTION("driver for cx2388x based DVB cards"); 58 61 MODULE_AUTHOR("Chris Pascoe <c.pascoe@itee.uq.edu.au>"); ··· 576 573 return 0; 577 574 } 578 575 576 + static int stv0900_set_ts_param(struct dvb_frontend *fe, 577 + int is_punctured) 578 + { 579 + struct cx8802_dev *dev = fe->dvb->priv; 580 + dev->ts_gen_cntrl = 0; 581 + 582 + return 0; 583 + } 584 + 579 585 static int cx24116_reset_device(struct dvb_frontend *fe) 580 586 { 581 587 struct cx8802_dev *dev = fe->dvb->priv; ··· 611 599 .demod_address = 0x55, 612 600 .set_ts_params = cx24116_set_ts_param, 613 601 .reset_device = cx24116_reset_device, 602 + }; 603 + 604 + static struct stv0900_config prof_7301_stv0900_config = { 605 + .demod_address = 0x6a, 606 + /* demod_mode = 0,*/ 607 + .xtal = 27000000, 608 + .clkmode = 3,/* 0-CLKI, 2-XTALI, else AUTO */ 609 + .diseqc_mode = 2,/* 2/3 PWM */ 610 + .tun1_maddress = 0,/* 0x60 */ 611 + .tun1_adc = 0,/* 2 Vpp */ 612 + .path1_mode = 3, 613 + .set_ts_params = stv0900_set_ts_param, 614 + }; 615 + 616 + static struct stb6100_config prof_7301_stb6100_config = { 617 + .tuner_address = 0x60, 618 + .refclock = 27000000, 614 619 }; 615 620 616 621 static struct stv0299_config tevii_tuner_sharp_config = { ··· 1178 1149 goto frontend_detach; 1179 1150 } 1180 1151 break; 1152 + case CX88_BOARD_PROF_7301:{ 1153 + struct dvb_tuner_ops *tuner_ops = NULL; 1154 + 1155 + fe0->dvb.frontend = dvb_attach(stv0900_attach, 1156 + &prof_7301_stv0900_config, 1157 + &core->i2c_adap, 0); 1158 + if (fe0->dvb.frontend != NULL) { 1159 + if (!dvb_attach(stb6100_attach, fe0->dvb.frontend, 1160 + &prof_7301_stb6100_config, 1161 + &core->i2c_adap)) 1162 + goto frontend_detach; 1163 + 1164 + tuner_ops = &fe0->dvb.frontend->ops.tuner_ops; 1165 + tuner_ops->set_frequency = stb6100_set_freq; 1166 + tuner_ops->get_frequency = stb6100_get_freq; 1167 + tuner_ops->set_bandwidth = stb6100_set_bandw; 1168 + tuner_ops->get_bandwidth = stb6100_get_bandw; 1169 + 1170 + core->prev_set_voltage = 1171 + fe0->dvb.frontend->ops.set_voltage; 1172 + fe0->dvb.frontend->ops.set_voltage = 1173 + tevii_dvbs_set_voltage; 1174 + } 1175 + break; 1176 + } 1181 1177 default: 1182 1178 printk(KERN_ERR "%s/2: The frontend of your DVB/ATSC card isn't supported yet\n", 1183 1179 core->name);
+2
drivers/media/video/cx88/cx88-input.c
··· 308 308 case CX88_BOARD_TBS_8920: 309 309 case CX88_BOARD_TBS_8910: 310 310 case CX88_BOARD_PROF_7300: 311 + case CX88_BOARD_PROF_7301: 311 312 case CX88_BOARD_PROF_6200: 312 313 ir_codes = &ir_codes_tbs_nec_table; 313 314 ir_type = IR_TYPE_PD; ··· 458 457 case CX88_BOARD_TBS_8920: 459 458 case CX88_BOARD_TBS_8910: 460 459 case CX88_BOARD_PROF_7300: 460 + case CX88_BOARD_PROF_7301: 461 461 case CX88_BOARD_PROF_6200: 462 462 ircode = ir_decode_pulsedistance(ir->samples, ir->scount, 1, 4); 463 463
+1
drivers/media/video/cx88/cx88.h
··· 238 238 #define CX88_BOARD_HAUPPAUGE_IRONLY 80 239 239 #define CX88_BOARD_WINFAST_DTV1800H 81 240 240 #define CX88_BOARD_WINFAST_DTV2000H_J 82 241 + #define CX88_BOARD_PROF_7301 83 241 242 242 243 enum cx88_itype { 243 244 CX88_VMUX_COMPOSITE1 = 1,