1 /* 2 * DVB USB Linux driver for Anysee E30 DVB-C & DVB-T USB2.0 receiver 3 * 4 * Copyright (C) 2007 Antti Palosaari <crope@iki.fi> 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation; either version 2 of the License, or 9 * (at your option) any later version. 10 * 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with this program; if not, write to the Free Software 18 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 19 * 20 * TODO: 21 * - add smart card reader support for Conditional Access (CA) 22 * 23 * Card reader in Anysee is nothing more than ISO 7816 card reader. 24 * There is no hardware CAM in any Anysee device sold. 25 * In my understanding it should be implemented by making own module 26 * for ISO 7816 card reader, like dvb_ca_en50221 is implemented. This 27 * module registers serial interface that can be used to communicate 28 * with any ISO 7816 smart card. 29 * 30 * Any help according to implement serial smart card reader support 31 * is highly welcome! 32 */ 33 34 #include "anysee.h" 35 #include "dvb-pll.h" 36 #include "tda1002x.h" 37 #include "mt352.h" 38 #include "mt352_priv.h" 39 #include "zl10353.h" 40 #include "tda18212.h" 41 #include "cx24116.h" 42 #include "stv0900.h" 43 #include "stv6110.h" 44 #include "isl6423.h" 45 #include "cxd2820r.h" 46 47 DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); 48 49 static int anysee_ctrl_msg(struct dvb_usb_device *d, 50 u8 *sbuf, u8 slen, u8 *rbuf, u8 rlen) 51 { 52 struct anysee_state *state = d_to_priv(d); 53 int act_len, ret, i; 54 55 mutex_lock(&d->usb_mutex); 56 57 memcpy(&state->buf[0], sbuf, slen); 58 state->buf[60] = state->seq++; 59 60 dev_dbg(&d->udev->dev, "%s: >>> %*ph\n", __func__, slen, state->buf); 61 62 /* We need receive one message more after dvb_usb_generic_rw due 63 to weird transaction flow, which is 1 x send + 2 x receive. */ 64 ret = dvb_usbv2_generic_rw_locked(d, state->buf, sizeof(state->buf), 65 state->buf, sizeof(state->buf)); 66 if (ret) 67 goto error_unlock; 68 69 /* TODO FIXME: dvb_usb_generic_rw() fails rarely with error code -32 70 * (EPIPE, Broken pipe). Function supports currently msleep() as a 71 * parameter but I would not like to use it, since according to 72 * Documentation/timers/timers-howto.txt it should not be used such 73 * short, under < 20ms, sleeps. Repeating failed message would be 74 * better choice as not to add unwanted delays... 75 * Fixing that correctly is one of those or both; 76 * 1) use repeat if possible 77 * 2) add suitable delay 78 */ 79 80 /* get answer, retry few times if error returned */ 81 for (i = 0; i < 3; i++) { 82 /* receive 2nd answer */ 83 ret = usb_bulk_msg(d->udev, usb_rcvbulkpipe(d->udev, 84 d->props->generic_bulk_ctrl_endpoint), 85 state->buf, sizeof(state->buf), &act_len, 2000); 86 if (ret) { 87 dev_dbg(&d->udev->dev, 88 "%s: recv bulk message failed=%d\n", 89 __func__, ret); 90 } else { 91 dev_dbg(&d->udev->dev, "%s: <<< %*ph\n", __func__, 92 rlen, state->buf); 93 94 if (state->buf[63] != 0x4f) 95 dev_dbg(&d->udev->dev, 96 "%s: cmd failed\n", __func__); 97 break; 98 } 99 } 100 101 if (ret) { 102 /* all retries failed, it is fatal */ 103 dev_err(&d->udev->dev, "%s: recv bulk message failed=%d\n", 104 KBUILD_MODNAME, ret); 105 goto error_unlock; 106 } 107 108 /* read request, copy returned data to return buf */ 109 if (rbuf && rlen) 110 memcpy(rbuf, state->buf, rlen); 111 112 error_unlock: 113 mutex_unlock(&d->usb_mutex); 114 return ret; 115 } 116 117 static int anysee_read_reg(struct dvb_usb_device *d, u16 reg, u8 *val) 118 { 119 u8 buf[] = {CMD_REG_READ, reg >> 8, reg & 0xff, 0x01}; 120 int ret; 121 ret = anysee_ctrl_msg(d, buf, sizeof(buf), val, 1); 122 dev_dbg(&d->udev->dev, "%s: reg=%04x val=%02x\n", __func__, reg, *val); 123 return ret; 124 } 125 126 static int anysee_write_reg(struct dvb_usb_device *d, u16 reg, u8 val) 127 { 128 u8 buf[] = {CMD_REG_WRITE, reg >> 8, reg & 0xff, 0x01, val}; 129 dev_dbg(&d->udev->dev, "%s: reg=%04x val=%02x\n", __func__, reg, val); 130 return anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0); 131 } 132 133 /* write single register with mask */ 134 static int anysee_wr_reg_mask(struct dvb_usb_device *d, u16 reg, u8 val, 135 u8 mask) 136 { 137 int ret; 138 u8 tmp; 139 140 /* no need for read if whole reg is written */ 141 if (mask != 0xff) { 142 ret = anysee_read_reg(d, reg, &tmp); 143 if (ret) 144 return ret; 145 146 val &= mask; 147 tmp &= ~mask; 148 val |= tmp; 149 } 150 151 return anysee_write_reg(d, reg, val); 152 } 153 154 /* read single register with mask */ 155 static int anysee_rd_reg_mask(struct dvb_usb_device *d, u16 reg, u8 *val, 156 u8 mask) 157 { 158 int ret, i; 159 u8 tmp; 160 161 ret = anysee_read_reg(d, reg, &tmp); 162 if (ret) 163 return ret; 164 165 tmp &= mask; 166 167 /* find position of the first bit */ 168 for (i = 0; i < 8; i++) { 169 if ((mask >> i) & 0x01) 170 break; 171 } 172 *val = tmp >> i; 173 174 return 0; 175 } 176 177 static int anysee_get_hw_info(struct dvb_usb_device *d, u8 *id) 178 { 179 u8 buf[] = {CMD_GET_HW_INFO}; 180 return anysee_ctrl_msg(d, buf, sizeof(buf), id, 3); 181 } 182 183 static int anysee_streaming_ctrl(struct dvb_frontend *fe, int onoff) 184 { 185 u8 buf[] = {CMD_STREAMING_CTRL, (u8)onoff, 0x00}; 186 dev_dbg(&fe_to_d(fe)->udev->dev, "%s: onoff=%d\n", __func__, onoff); 187 return anysee_ctrl_msg(fe_to_d(fe), buf, sizeof(buf), NULL, 0); 188 } 189 190 static int anysee_led_ctrl(struct dvb_usb_device *d, u8 mode, u8 interval) 191 { 192 u8 buf[] = {CMD_LED_AND_IR_CTRL, 0x01, mode, interval}; 193 dev_dbg(&d->udev->dev, "%s: state=%d interval=%d\n", __func__, 194 mode, interval); 195 return anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0); 196 } 197 198 static int anysee_ir_ctrl(struct dvb_usb_device *d, u8 onoff) 199 { 200 u8 buf[] = {CMD_LED_AND_IR_CTRL, 0x02, onoff}; 201 dev_dbg(&d->udev->dev, "%s: onoff=%d\n", __func__, onoff); 202 return anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0); 203 } 204 205 /* I2C */ 206 static int anysee_master_xfer(struct i2c_adapter *adap, struct i2c_msg *msg, 207 int num) 208 { 209 struct dvb_usb_device *d = i2c_get_adapdata(adap); 210 int ret = 0, inc, i = 0; 211 u8 buf[52]; /* 4 + 48 (I2C WR USB command header + I2C WR max) */ 212 213 if (mutex_lock_interruptible(&d->i2c_mutex) < 0) 214 return -EAGAIN; 215 216 while (i < num) { 217 if (num > i + 1 && (msg[i+1].flags & I2C_M_RD)) { 218 if (msg[i].len > 2 || msg[i+1].len > 60) { 219 ret = -EOPNOTSUPP; 220 break; 221 } 222 buf[0] = CMD_I2C_READ; 223 buf[1] = (msg[i].addr << 1) | 0x01; 224 buf[2] = msg[i].buf[0]; 225 buf[3] = msg[i].buf[1]; 226 buf[4] = msg[i].len-1; 227 buf[5] = msg[i+1].len; 228 ret = anysee_ctrl_msg(d, buf, 6, msg[i+1].buf, 229 msg[i+1].len); 230 inc = 2; 231 } else { 232 if (msg[i].len > 48) { 233 ret = -EOPNOTSUPP; 234 break; 235 } 236 buf[0] = CMD_I2C_WRITE; 237 buf[1] = (msg[i].addr << 1); 238 buf[2] = msg[i].len; 239 buf[3] = 0x01; 240 memcpy(&buf[4], msg[i].buf, msg[i].len); 241 ret = anysee_ctrl_msg(d, buf, 4 + msg[i].len, NULL, 0); 242 inc = 1; 243 } 244 if (ret) 245 break; 246 247 i += inc; 248 } 249 250 mutex_unlock(&d->i2c_mutex); 251 252 return ret ? ret : i; 253 } 254 255 static u32 anysee_i2c_func(struct i2c_adapter *adapter) 256 { 257 return I2C_FUNC_I2C; 258 } 259 260 static struct i2c_algorithm anysee_i2c_algo = { 261 .master_xfer = anysee_master_xfer, 262 .functionality = anysee_i2c_func, 263 }; 264 265 static int anysee_mt352_demod_init(struct dvb_frontend *fe) 266 { 267 static u8 clock_config[] = { CLOCK_CTL, 0x38, 0x28 }; 268 static u8 reset[] = { RESET, 0x80 }; 269 static u8 adc_ctl_1_cfg[] = { ADC_CTL_1, 0x40 }; 270 static u8 agc_cfg[] = { AGC_TARGET, 0x28, 0x20 }; 271 static u8 gpp_ctl_cfg[] = { GPP_CTL, 0x33 }; 272 static u8 capt_range_cfg[] = { CAPT_RANGE, 0x32 }; 273 274 mt352_write(fe, clock_config, sizeof(clock_config)); 275 udelay(200); 276 mt352_write(fe, reset, sizeof(reset)); 277 mt352_write(fe, adc_ctl_1_cfg, sizeof(adc_ctl_1_cfg)); 278 279 mt352_write(fe, agc_cfg, sizeof(agc_cfg)); 280 mt352_write(fe, gpp_ctl_cfg, sizeof(gpp_ctl_cfg)); 281 mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg)); 282 283 return 0; 284 } 285 286 /* Callbacks for DVB USB */ 287 static struct tda10023_config anysee_tda10023_config = { 288 .demod_address = (0x1a >> 1), 289 .invert = 0, 290 .xtal = 16000000, 291 .pll_m = 11, 292 .pll_p = 3, 293 .pll_n = 1, 294 .output_mode = TDA10023_OUTPUT_MODE_PARALLEL_C, 295 .deltaf = 0xfeeb, 296 }; 297 298 static struct mt352_config anysee_mt352_config = { 299 .demod_address = (0x1e >> 1), 300 .demod_init = anysee_mt352_demod_init, 301 }; 302 303 static struct zl10353_config anysee_zl10353_config = { 304 .demod_address = (0x1e >> 1), 305 .parallel_ts = 1, 306 }; 307 308 static struct zl10353_config anysee_zl10353_tda18212_config2 = { 309 .demod_address = (0x1e >> 1), 310 .parallel_ts = 1, 311 .disable_i2c_gate_ctrl = 1, 312 .no_tuner = 1, 313 .if2 = 41500, 314 }; 315 316 static struct zl10353_config anysee_zl10353_tda18212_config = { 317 .demod_address = (0x18 >> 1), 318 .parallel_ts = 1, 319 .disable_i2c_gate_ctrl = 1, 320 .no_tuner = 1, 321 .if2 = 41500, 322 }; 323 324 static struct tda10023_config anysee_tda10023_tda18212_config = { 325 .demod_address = (0x1a >> 1), 326 .xtal = 16000000, 327 .pll_m = 12, 328 .pll_p = 3, 329 .pll_n = 1, 330 .output_mode = TDA10023_OUTPUT_MODE_PARALLEL_B, 331 .deltaf = 0xba02, 332 }; 333 334 static struct tda18212_config anysee_tda18212_config = { 335 .i2c_address = (0xc0 >> 1), 336 .if_dvbt_6 = 4150, 337 .if_dvbt_7 = 4150, 338 .if_dvbt_8 = 4150, 339 .if_dvbc = 5000, 340 }; 341 342 static struct tda18212_config anysee_tda18212_config2 = { 343 .i2c_address = 0x60 /* (0xc0 >> 1) */, 344 .if_dvbt_6 = 3550, 345 .if_dvbt_7 = 3700, 346 .if_dvbt_8 = 4150, 347 .if_dvbt2_6 = 3250, 348 .if_dvbt2_7 = 4000, 349 .if_dvbt2_8 = 4000, 350 .if_dvbc = 5000, 351 }; 352 353 static struct cx24116_config anysee_cx24116_config = { 354 .demod_address = (0xaa >> 1), 355 .mpg_clk_pos_pol = 0x00, 356 .i2c_wr_max = 48, 357 }; 358 359 static struct stv0900_config anysee_stv0900_config = { 360 .demod_address = (0xd0 >> 1), 361 .demod_mode = 0, 362 .xtal = 8000000, 363 .clkmode = 3, 364 .diseqc_mode = 2, 365 .tun1_maddress = 0, 366 .tun1_adc = 1, /* 1 Vpp */ 367 .path1_mode = 3, 368 }; 369 370 static struct stv6110_config anysee_stv6110_config = { 371 .i2c_address = (0xc0 >> 1), 372 .mclk = 16000000, 373 .clk_div = 1, 374 }; 375 376 static struct isl6423_config anysee_isl6423_config = { 377 .current_max = SEC_CURRENT_800m, 378 .curlim = SEC_CURRENT_LIM_OFF, 379 .mod_extern = 1, 380 .addr = (0x10 >> 1), 381 }; 382 383 static struct cxd2820r_config anysee_cxd2820r_config = { 384 .i2c_address = 0x6d, /* (0xda >> 1) */ 385 .ts_mode = 0x38, 386 }; 387 388 /* 389 * New USB device strings: Mfr=1, Product=2, SerialNumber=0 390 * Manufacturer: AMT.CO.KR 391 * 392 * E30 VID=04b4 PID=861f HW=2 FW=2.1 Product=???????? 393 * PCB: ? 394 * parts: DNOS404ZH102A(MT352, DTT7579(?)) 395 * 396 * E30 VID=04b4 PID=861f HW=2 FW=2.1 "anysee-T(LP)" 397 * PCB: PCB 507T (rev1.61) 398 * parts: DNOS404ZH103A(ZL10353, DTT7579(?)) 399 * OEA=0a OEB=00 OEC=00 OED=ff OEE=00 400 * IOA=45 IOB=ff IOC=00 IOD=ff IOE=00 401 * 402 * E30 Plus VID=04b4 PID=861f HW=6 FW=1.0 "anysee" 403 * PCB: 507CD (rev1.1) 404 * parts: DNOS404ZH103A(ZL10353, DTT7579(?)), CST56I01 405 * OEA=80 OEB=00 OEC=00 OED=ff OEE=fe 406 * IOA=4f IOB=ff IOC=00 IOD=06 IOE=01 407 * IOD[0] ZL10353 1=enabled 408 * IOA[7] TS 0=enabled 409 * tuner is not behind ZL10353 I2C-gate (no care if gate disabled or not) 410 * 411 * E30 C Plus VID=04b4 PID=861f HW=10 FW=1.0 "anysee-DC(LP)" 412 * PCB: 507DC (rev0.2) 413 * parts: TDA10023, DTOS403IH102B TM, CST56I01 414 * OEA=80 OEB=00 OEC=00 OED=ff OEE=fe 415 * IOA=4f IOB=ff IOC=00 IOD=26 IOE=01 416 * IOD[0] TDA10023 1=enabled 417 * 418 * E30 S2 Plus VID=04b4 PID=861f HW=11 FW=0.1 "anysee-S2(LP)" 419 * PCB: 507SI (rev2.1) 420 * parts: BS2N10WCC01(CX24116, CX24118), ISL6423, TDA8024 421 * OEA=80 OEB=00 OEC=ff OED=ff OEE=fe 422 * IOA=4d IOB=ff IOC=00 IOD=26 IOE=01 423 * IOD[0] CX24116 1=enabled 424 * 425 * E30 C Plus VID=1c73 PID=861f HW=15 FW=1.2 "anysee-FA(LP)" 426 * PCB: 507FA (rev0.4) 427 * parts: TDA10023, DTOS403IH102B TM, TDA8024 428 * OEA=80 OEB=00 OEC=ff OED=ff OEE=ff 429 * IOA=4d IOB=ff IOC=00 IOD=00 IOE=c0 430 * IOD[5] TDA10023 1=enabled 431 * IOE[0] tuner 1=enabled 432 * 433 * E30 Combo Plus VID=1c73 PID=861f HW=15 FW=1.2 "anysee-FA(LP)" 434 * PCB: 507FA (rev1.1) 435 * parts: ZL10353, TDA10023, DTOS403IH102B TM, TDA8024 436 * OEA=80 OEB=00 OEC=ff OED=ff OEE=ff 437 * IOA=4d IOB=ff IOC=00 IOD=00 IOE=c0 438 * DVB-C: 439 * IOD[5] TDA10023 1=enabled 440 * IOE[0] tuner 1=enabled 441 * DVB-T: 442 * IOD[0] ZL10353 1=enabled 443 * IOE[0] tuner 0=enabled 444 * tuner is behind ZL10353 I2C-gate 445 * tuner is behind TDA10023 I2C-gate 446 * 447 * E7 TC VID=1c73 PID=861f HW=18 FW=0.7 AMTCI=0.5 "anysee-E7TC(LP)" 448 * PCB: 508TC (rev0.6) 449 * parts: ZL10353, TDA10023, DNOD44CDH086A(TDA18212) 450 * OEA=80 OEB=00 OEC=03 OED=f7 OEE=ff 451 * IOA=4d IOB=00 IOC=cc IOD=48 IOE=e4 452 * IOA[7] TS 1=enabled 453 * IOE[4] TDA18212 1=enabled 454 * DVB-C: 455 * IOD[6] ZL10353 0=disabled 456 * IOD[5] TDA10023 1=enabled 457 * IOE[0] IF 1=enabled 458 * DVB-T: 459 * IOD[5] TDA10023 0=disabled 460 * IOD[6] ZL10353 1=enabled 461 * IOE[0] IF 0=enabled 462 * 463 * E7 S2 VID=1c73 PID=861f HW=19 FW=0.4 AMTCI=0.5 "anysee-E7S2(LP)" 464 * PCB: 508S2 (rev0.7) 465 * parts: DNBU10512IST(STV0903, STV6110), ISL6423 466 * OEA=80 OEB=00 OEC=03 OED=f7 OEE=ff 467 * IOA=4d IOB=00 IOC=c4 IOD=08 IOE=e4 468 * IOA[7] TS 1=enabled 469 * IOE[5] STV0903 1=enabled 470 * 471 * E7 T2C VID=1c73 PID=861f HW=20 FW=0.1 AMTCI=0.5 "anysee-E7T2C(LP)" 472 * PCB: 508T2C (rev0.3) 473 * parts: DNOQ44QCH106A(CXD2820R, TDA18212), TDA8024 474 * OEA=80 OEB=00 OEC=03 OED=f7 OEE=ff 475 * IOA=4d IOB=00 IOC=cc IOD=48 IOE=e4 476 * IOA[7] TS 1=enabled 477 * IOE[5] CXD2820R 1=enabled 478 * 479 * E7 PTC VID=1c73 PID=861f HW=21 FW=0.1 AMTCI=?? "anysee-E7PTC(LP)" 480 * PCB: 508PTC (rev0.5) 481 * parts: ZL10353, TDA10023, DNOD44CDH086A(TDA18212) 482 * OEA=80 OEB=00 OEC=03 OED=f7 OEE=ff 483 * IOA=4d IOB=00 IOC=cc IOD=48 IOE=e4 484 * IOA[7] TS 1=enabled 485 * IOE[4] TDA18212 1=enabled 486 * DVB-C: 487 * IOD[6] ZL10353 0=disabled 488 * IOD[5] TDA10023 1=enabled 489 * IOE[0] IF 1=enabled 490 * DVB-T: 491 * IOD[5] TDA10023 0=disabled 492 * IOD[6] ZL10353 1=enabled 493 * IOE[0] IF 0=enabled 494 * 495 * E7 PS2 VID=1c73 PID=861f HW=22 FW=0.1 AMTCI=?? "anysee-E7PS2(LP)" 496 * PCB: 508PS2 (rev0.4) 497 * parts: DNBU10512IST(STV0903, STV6110), ISL6423 498 * OEA=80 OEB=00 OEC=03 OED=f7 OEE=ff 499 * IOA=4d IOB=00 IOC=c4 IOD=08 IOE=e4 500 * IOA[7] TS 1=enabled 501 * IOE[5] STV0903 1=enabled 502 */ 503 504 static int anysee_read_config(struct dvb_usb_device *d) 505 { 506 struct anysee_state *state = d_to_priv(d); 507 int ret; 508 u8 hw_info[3]; 509 510 /* 511 * Check which hardware we have. 512 * We must do this call two times to get reliable values (hw/fw bug). 513 */ 514 ret = anysee_get_hw_info(d, hw_info); 515 if (ret) 516 goto error; 517 518 ret = anysee_get_hw_info(d, hw_info); 519 if (ret) 520 goto error; 521 522 /* 523 * Meaning of these info bytes are guessed. 524 */ 525 dev_info(&d->udev->dev, "%s: firmware version %d.%d hardware id %d\n", 526 KBUILD_MODNAME, hw_info[1], hw_info[2], hw_info[0]); 527 528 state->hw = hw_info[0]; 529 error: 530 return ret; 531 } 532 533 /* external I2C gate used for DNOD44CDH086A(TDA18212) tuner module */ 534 static int anysee_i2c_gate_ctrl(struct dvb_frontend *fe, int enable) 535 { 536 /* enable / disable tuner access on IOE[4] */ 537 return anysee_wr_reg_mask(fe_to_d(fe), REG_IOE, (enable << 4), 0x10); 538 } 539 540 static int anysee_frontend_ctrl(struct dvb_frontend *fe, int onoff) 541 { 542 struct anysee_state *state = fe_to_priv(fe); 543 struct dvb_usb_device *d = fe_to_d(fe); 544 int ret; 545 dev_dbg(&d->udev->dev, "%s: fe=%d onoff=%d\n", __func__, fe->id, onoff); 546 547 /* no frontend sleep control */ 548 if (onoff == 0) 549 return 0; 550 551 switch (state->hw) { 552 case ANYSEE_HW_507FA: /* 15 */ 553 /* E30 Combo Plus */ 554 /* E30 C Plus */ 555 556 if (fe->id == 0) { 557 /* disable DVB-T demod on IOD[0] */ 558 ret = anysee_wr_reg_mask(d, REG_IOD, (0 << 0), 0x01); 559 if (ret) 560 goto error; 561 562 /* enable DVB-C demod on IOD[5] */ 563 ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 5), 0x20); 564 if (ret) 565 goto error; 566 567 /* enable DVB-C tuner on IOE[0] */ 568 ret = anysee_wr_reg_mask(d, REG_IOE, (1 << 0), 0x01); 569 if (ret) 570 goto error; 571 } else { 572 /* disable DVB-C demod on IOD[5] */ 573 ret = anysee_wr_reg_mask(d, REG_IOD, (0 << 5), 0x20); 574 if (ret) 575 goto error; 576 577 /* enable DVB-T demod on IOD[0] */ 578 ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 0), 0x01); 579 if (ret) 580 goto error; 581 582 /* enable DVB-T tuner on IOE[0] */ 583 ret = anysee_wr_reg_mask(d, REG_IOE, (0 << 0), 0x01); 584 if (ret) 585 goto error; 586 } 587 588 break; 589 case ANYSEE_HW_508TC: /* 18 */ 590 case ANYSEE_HW_508PTC: /* 21 */ 591 /* E7 TC */ 592 /* E7 PTC */ 593 594 if (fe->id == 0) { 595 /* disable DVB-T demod on IOD[6] */ 596 ret = anysee_wr_reg_mask(d, REG_IOD, (0 << 6), 0x40); 597 if (ret) 598 goto error; 599 600 /* enable DVB-C demod on IOD[5] */ 601 ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 5), 0x20); 602 if (ret) 603 goto error; 604 605 /* enable IF route on IOE[0] */ 606 ret = anysee_wr_reg_mask(d, REG_IOE, (1 << 0), 0x01); 607 if (ret) 608 goto error; 609 } else { 610 /* disable DVB-C demod on IOD[5] */ 611 ret = anysee_wr_reg_mask(d, REG_IOD, (0 << 5), 0x20); 612 if (ret) 613 goto error; 614 615 /* enable DVB-T demod on IOD[6] */ 616 ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 6), 0x40); 617 if (ret) 618 goto error; 619 620 /* enable IF route on IOE[0] */ 621 ret = anysee_wr_reg_mask(d, REG_IOE, (0 << 0), 0x01); 622 if (ret) 623 goto error; 624 } 625 626 break; 627 default: 628 ret = 0; 629 } 630 631 error: 632 return ret; 633 } 634 635 static int anysee_frontend_attach(struct dvb_usb_adapter *adap) 636 { 637 struct anysee_state *state = adap_to_priv(adap); 638 struct dvb_usb_device *d = adap_to_d(adap); 639 int ret = 0; 640 u8 tmp; 641 struct i2c_msg msg[2] = { 642 { 643 .addr = anysee_tda18212_config.i2c_address, 644 .flags = 0, 645 .len = 1, 646 .buf = "\x00", 647 }, { 648 .addr = anysee_tda18212_config.i2c_address, 649 .flags = I2C_M_RD, 650 .len = 1, 651 .buf = &tmp, 652 } 653 }; 654 655 switch (state->hw) { 656 case ANYSEE_HW_507T: /* 2 */ 657 /* E30 */ 658 659 /* attach demod */ 660 adap->fe[0] = dvb_attach(mt352_attach, &anysee_mt352_config, 661 &d->i2c_adap); 662 if (adap->fe[0]) 663 break; 664 665 /* attach demod */ 666 adap->fe[0] = dvb_attach(zl10353_attach, &anysee_zl10353_config, 667 &d->i2c_adap); 668 669 break; 670 case ANYSEE_HW_507CD: /* 6 */ 671 /* E30 Plus */ 672 673 /* enable DVB-T demod on IOD[0] */ 674 ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 0), 0x01); 675 if (ret) 676 goto error; 677 678 /* enable transport stream on IOA[7] */ 679 ret = anysee_wr_reg_mask(d, REG_IOA, (0 << 7), 0x80); 680 if (ret) 681 goto error; 682 683 /* attach demod */ 684 adap->fe[0] = dvb_attach(zl10353_attach, &anysee_zl10353_config, 685 &d->i2c_adap); 686 687 break; 688 case ANYSEE_HW_507DC: /* 10 */ 689 /* E30 C Plus */ 690 691 /* enable DVB-C demod on IOD[0] */ 692 ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 0), 0x01); 693 if (ret) 694 goto error; 695 696 /* attach demod */ 697 adap->fe[0] = dvb_attach(tda10023_attach, 698 &anysee_tda10023_config, &d->i2c_adap, 0x48); 699 700 break; 701 case ANYSEE_HW_507SI: /* 11 */ 702 /* E30 S2 Plus */ 703 704 /* enable DVB-S/S2 demod on IOD[0] */ 705 ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 0), 0x01); 706 if (ret) 707 goto error; 708 709 /* attach demod */ 710 adap->fe[0] = dvb_attach(cx24116_attach, &anysee_cx24116_config, 711 &d->i2c_adap); 712 713 break; 714 case ANYSEE_HW_507FA: /* 15 */ 715 /* E30 Combo Plus */ 716 /* E30 C Plus */ 717 718 /* enable tuner on IOE[4] */ 719 ret = anysee_wr_reg_mask(d, REG_IOE, (1 << 4), 0x10); 720 if (ret) 721 goto error; 722 723 /* probe TDA18212 */ 724 tmp = 0; 725 ret = i2c_transfer(&d->i2c_adap, msg, 2); 726 if (ret == 2 && tmp == 0xc7) 727 dev_dbg(&d->udev->dev, "%s: TDA18212 found\n", 728 __func__); 729 else 730 tmp = 0; 731 732 /* disable tuner on IOE[4] */ 733 ret = anysee_wr_reg_mask(d, REG_IOE, (0 << 4), 0x10); 734 if (ret) 735 goto error; 736 737 /* disable DVB-T demod on IOD[0] */ 738 ret = anysee_wr_reg_mask(d, REG_IOD, (0 << 0), 0x01); 739 if (ret) 740 goto error; 741 742 /* enable DVB-C demod on IOD[5] */ 743 ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 5), 0x20); 744 if (ret) 745 goto error; 746 747 /* attach demod */ 748 if (tmp == 0xc7) { 749 /* TDA18212 config */ 750 adap->fe[0] = dvb_attach(tda10023_attach, 751 &anysee_tda10023_tda18212_config, 752 &d->i2c_adap, 0x48); 753 754 /* I2C gate for DNOD44CDH086A(TDA18212) tuner module */ 755 if (adap->fe[0]) 756 adap->fe[0]->ops.i2c_gate_ctrl = 757 anysee_i2c_gate_ctrl; 758 } else { 759 /* PLL config */ 760 adap->fe[0] = dvb_attach(tda10023_attach, 761 &anysee_tda10023_config, 762 &d->i2c_adap, 0x48); 763 } 764 765 /* break out if first frontend attaching fails */ 766 if (!adap->fe[0]) 767 break; 768 769 /* disable DVB-C demod on IOD[5] */ 770 ret = anysee_wr_reg_mask(d, REG_IOD, (0 << 5), 0x20); 771 if (ret) 772 goto error; 773 774 /* enable DVB-T demod on IOD[0] */ 775 ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 0), 0x01); 776 if (ret) 777 goto error; 778 779 /* attach demod */ 780 if (tmp == 0xc7) { 781 /* TDA18212 config */ 782 adap->fe[1] = dvb_attach(zl10353_attach, 783 &anysee_zl10353_tda18212_config2, 784 &d->i2c_adap); 785 786 /* I2C gate for DNOD44CDH086A(TDA18212) tuner module */ 787 if (adap->fe[1]) 788 adap->fe[1]->ops.i2c_gate_ctrl = 789 anysee_i2c_gate_ctrl; 790 } else { 791 /* PLL config */ 792 adap->fe[1] = dvb_attach(zl10353_attach, 793 &anysee_zl10353_config, 794 &d->i2c_adap); 795 } 796 797 break; 798 case ANYSEE_HW_508TC: /* 18 */ 799 case ANYSEE_HW_508PTC: /* 21 */ 800 /* E7 TC */ 801 /* E7 PTC */ 802 803 /* disable DVB-T demod on IOD[6] */ 804 ret = anysee_wr_reg_mask(d, REG_IOD, (0 << 6), 0x40); 805 if (ret) 806 goto error; 807 808 /* enable DVB-C demod on IOD[5] */ 809 ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 5), 0x20); 810 if (ret) 811 goto error; 812 813 /* attach demod */ 814 adap->fe[0] = dvb_attach(tda10023_attach, 815 &anysee_tda10023_tda18212_config, 816 &d->i2c_adap, 0x48); 817 818 /* I2C gate for DNOD44CDH086A(TDA18212) tuner module */ 819 if (adap->fe[0]) 820 adap->fe[0]->ops.i2c_gate_ctrl = anysee_i2c_gate_ctrl; 821 822 /* break out if first frontend attaching fails */ 823 if (!adap->fe[0]) 824 break; 825 826 /* disable DVB-C demod on IOD[5] */ 827 ret = anysee_wr_reg_mask(d, REG_IOD, (0 << 5), 0x20); 828 if (ret) 829 goto error; 830 831 /* enable DVB-T demod on IOD[6] */ 832 ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 6), 0x40); 833 if (ret) 834 goto error; 835 836 /* attach demod */ 837 adap->fe[1] = dvb_attach(zl10353_attach, 838 &anysee_zl10353_tda18212_config, 839 &d->i2c_adap); 840 841 /* I2C gate for DNOD44CDH086A(TDA18212) tuner module */ 842 if (adap->fe[1]) 843 adap->fe[1]->ops.i2c_gate_ctrl = anysee_i2c_gate_ctrl; 844 845 state->has_ci = true; 846 847 break; 848 case ANYSEE_HW_508S2: /* 19 */ 849 case ANYSEE_HW_508PS2: /* 22 */ 850 /* E7 S2 */ 851 /* E7 PS2 */ 852 853 /* enable DVB-S/S2 demod on IOE[5] */ 854 ret = anysee_wr_reg_mask(d, REG_IOE, (1 << 5), 0x20); 855 if (ret) 856 goto error; 857 858 /* attach demod */ 859 adap->fe[0] = dvb_attach(stv0900_attach, 860 &anysee_stv0900_config, &d->i2c_adap, 0); 861 862 state->has_ci = true; 863 864 break; 865 case ANYSEE_HW_508T2C: /* 20 */ 866 /* E7 T2C */ 867 868 /* enable DVB-T/T2/C demod on IOE[5] */ 869 ret = anysee_wr_reg_mask(d, REG_IOE, (1 << 5), 0x20); 870 if (ret) 871 goto error; 872 873 /* attach demod */ 874 adap->fe[0] = dvb_attach(cxd2820r_attach, 875 &anysee_cxd2820r_config, &d->i2c_adap, NULL); 876 877 state->has_ci = true; 878 879 break; 880 } 881 882 if (!adap->fe[0]) { 883 /* we have no frontend :-( */ 884 ret = -ENODEV; 885 dev_err(&d->udev->dev, 886 "%s: Unsupported Anysee version. Please report to <linux-media@vger.kernel.org>.\n", 887 KBUILD_MODNAME); 888 } 889 error: 890 return ret; 891 } 892 893 static int anysee_tuner_attach(struct dvb_usb_adapter *adap) 894 { 895 struct anysee_state *state = adap_to_priv(adap); 896 struct dvb_usb_device *d = adap_to_d(adap); 897 struct dvb_frontend *fe; 898 int ret; 899 dev_dbg(&d->udev->dev, "%s:\n", __func__); 900 901 switch (state->hw) { 902 case ANYSEE_HW_507T: /* 2 */ 903 /* E30 */ 904 905 /* attach tuner */ 906 fe = dvb_attach(dvb_pll_attach, adap->fe[0], (0xc2 >> 1), NULL, 907 DVB_PLL_THOMSON_DTT7579); 908 909 break; 910 case ANYSEE_HW_507CD: /* 6 */ 911 /* E30 Plus */ 912 913 /* attach tuner */ 914 fe = dvb_attach(dvb_pll_attach, adap->fe[0], (0xc2 >> 1), 915 &d->i2c_adap, DVB_PLL_THOMSON_DTT7579); 916 917 break; 918 case ANYSEE_HW_507DC: /* 10 */ 919 /* E30 C Plus */ 920 921 /* attach tuner */ 922 fe = dvb_attach(dvb_pll_attach, adap->fe[0], (0xc0 >> 1), 923 &d->i2c_adap, DVB_PLL_SAMSUNG_DTOS403IH102A); 924 925 break; 926 case ANYSEE_HW_507SI: /* 11 */ 927 /* E30 S2 Plus */ 928 929 /* attach LNB controller */ 930 fe = dvb_attach(isl6423_attach, adap->fe[0], &d->i2c_adap, 931 &anysee_isl6423_config); 932 933 break; 934 case ANYSEE_HW_507FA: /* 15 */ 935 /* E30 Combo Plus */ 936 /* E30 C Plus */ 937 938 /* Try first attach TDA18212 silicon tuner on IOE[4], if that 939 * fails attach old simple PLL. */ 940 941 /* attach tuner */ 942 fe = dvb_attach(tda18212_attach, adap->fe[0], &d->i2c_adap, 943 &anysee_tda18212_config); 944 945 if (fe && adap->fe[1]) { 946 /* attach tuner for 2nd FE */ 947 fe = dvb_attach(tda18212_attach, adap->fe[1], 948 &d->i2c_adap, &anysee_tda18212_config); 949 break; 950 } else if (fe) { 951 break; 952 } 953 954 /* attach tuner */ 955 fe = dvb_attach(dvb_pll_attach, adap->fe[0], (0xc0 >> 1), 956 &d->i2c_adap, DVB_PLL_SAMSUNG_DTOS403IH102A); 957 958 if (fe && adap->fe[1]) { 959 /* attach tuner for 2nd FE */ 960 fe = dvb_attach(dvb_pll_attach, adap->fe[1], 961 (0xc0 >> 1), &d->i2c_adap, 962 DVB_PLL_SAMSUNG_DTOS403IH102A); 963 } 964 965 break; 966 case ANYSEE_HW_508TC: /* 18 */ 967 case ANYSEE_HW_508PTC: /* 21 */ 968 /* E7 TC */ 969 /* E7 PTC */ 970 971 /* attach tuner */ 972 fe = dvb_attach(tda18212_attach, adap->fe[0], &d->i2c_adap, 973 &anysee_tda18212_config); 974 975 if (fe) { 976 /* attach tuner for 2nd FE */ 977 fe = dvb_attach(tda18212_attach, adap->fe[1], 978 &d->i2c_adap, &anysee_tda18212_config); 979 } 980 981 break; 982 case ANYSEE_HW_508S2: /* 19 */ 983 case ANYSEE_HW_508PS2: /* 22 */ 984 /* E7 S2 */ 985 /* E7 PS2 */ 986 987 /* attach tuner */ 988 fe = dvb_attach(stv6110_attach, adap->fe[0], 989 &anysee_stv6110_config, &d->i2c_adap); 990 991 if (fe) { 992 /* attach LNB controller */ 993 fe = dvb_attach(isl6423_attach, adap->fe[0], 994 &d->i2c_adap, &anysee_isl6423_config); 995 } 996 997 break; 998 999 case ANYSEE_HW_508T2C: /* 20 */ 1000 /* E7 T2C */ 1001 1002 /* attach tuner */ 1003 fe = dvb_attach(tda18212_attach, adap->fe[0], &d->i2c_adap, 1004 &anysee_tda18212_config2); 1005 1006 break; 1007 default: 1008 fe = NULL; 1009 } 1010 1011 if (fe) 1012 ret = 0; 1013 else 1014 ret = -ENODEV; 1015 1016 return ret; 1017 } 1018 1019 #if IS_ENABLED(CONFIG_RC_CORE) 1020 static int anysee_rc_query(struct dvb_usb_device *d) 1021 { 1022 u8 buf[] = {CMD_GET_IR_CODE}; 1023 u8 ircode[2]; 1024 int ret; 1025 1026 /* Remote controller is basic NEC using address byte 0x08. 1027 Anysee device RC query returns only two bytes, status and code, 1028 address byte is dropped. Also it does not return any value for 1029 NEC RCs having address byte other than 0x08. Due to that, we 1030 cannot use that device as standard NEC receiver. 1031 It could be possible make hack which reads whole code directly 1032 from device memory... */ 1033 1034 ret = anysee_ctrl_msg(d, buf, sizeof(buf), ircode, sizeof(ircode)); 1035 if (ret) 1036 return ret; 1037 1038 if (ircode[0]) { 1039 dev_dbg(&d->udev->dev, "%s: key pressed %02x\n", __func__, 1040 ircode[1]); 1041 rc_keydown(d->rc_dev, 0x08 << 8 | ircode[1], 0); 1042 } 1043 1044 return 0; 1045 } 1046 1047 static int anysee_get_rc_config(struct dvb_usb_device *d, struct dvb_usb_rc *rc) 1048 { 1049 rc->allowed_protos = RC_BIT_NEC; 1050 rc->query = anysee_rc_query; 1051 rc->interval = 250; /* windows driver uses 500ms */ 1052 1053 return 0; 1054 } 1055 #else 1056 #define anysee_get_rc_config NULL 1057 #endif 1058 1059 static int anysee_ci_read_attribute_mem(struct dvb_ca_en50221 *ci, int slot, 1060 int addr) 1061 { 1062 struct dvb_usb_device *d = ci->data; 1063 int ret; 1064 u8 buf[] = {CMD_CI, 0x02, 0x40 | addr >> 8, addr & 0xff, 0x00, 1}; 1065 u8 val; 1066 1067 ret = anysee_ctrl_msg(d, buf, sizeof(buf), &val, 1); 1068 if (ret) 1069 return ret; 1070 1071 return val; 1072 } 1073 1074 static int anysee_ci_write_attribute_mem(struct dvb_ca_en50221 *ci, int slot, 1075 int addr, u8 val) 1076 { 1077 struct dvb_usb_device *d = ci->data; 1078 int ret; 1079 u8 buf[] = {CMD_CI, 0x03, 0x40 | addr >> 8, addr & 0xff, 0x00, 1, val}; 1080 1081 ret = anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0); 1082 if (ret) 1083 return ret; 1084 1085 return 0; 1086 } 1087 1088 static int anysee_ci_read_cam_control(struct dvb_ca_en50221 *ci, int slot, 1089 u8 addr) 1090 { 1091 struct dvb_usb_device *d = ci->data; 1092 int ret; 1093 u8 buf[] = {CMD_CI, 0x04, 0x40, addr, 0x00, 1}; 1094 u8 val; 1095 1096 ret = anysee_ctrl_msg(d, buf, sizeof(buf), &val, 1); 1097 if (ret) 1098 return ret; 1099 1100 return val; 1101 } 1102 1103 static int anysee_ci_write_cam_control(struct dvb_ca_en50221 *ci, int slot, 1104 u8 addr, u8 val) 1105 { 1106 struct dvb_usb_device *d = ci->data; 1107 int ret; 1108 u8 buf[] = {CMD_CI, 0x05, 0x40, addr, 0x00, 1, val}; 1109 1110 ret = anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0); 1111 if (ret) 1112 return ret; 1113 1114 return 0; 1115 } 1116 1117 static int anysee_ci_slot_reset(struct dvb_ca_en50221 *ci, int slot) 1118 { 1119 struct dvb_usb_device *d = ci->data; 1120 int ret; 1121 struct anysee_state *state = d_to_priv(d); 1122 1123 state->ci_cam_ready = jiffies + msecs_to_jiffies(1000); 1124 1125 ret = anysee_wr_reg_mask(d, REG_IOA, (0 << 7), 0x80); 1126 if (ret) 1127 return ret; 1128 1129 msleep(300); 1130 1131 ret = anysee_wr_reg_mask(d, REG_IOA, (1 << 7), 0x80); 1132 if (ret) 1133 return ret; 1134 1135 return 0; 1136 } 1137 1138 static int anysee_ci_slot_shutdown(struct dvb_ca_en50221 *ci, int slot) 1139 { 1140 struct dvb_usb_device *d = ci->data; 1141 int ret; 1142 1143 ret = anysee_wr_reg_mask(d, REG_IOA, (0 << 7), 0x80); 1144 if (ret) 1145 return ret; 1146 1147 msleep(30); 1148 1149 ret = anysee_wr_reg_mask(d, REG_IOA, (1 << 7), 0x80); 1150 if (ret) 1151 return ret; 1152 1153 return 0; 1154 } 1155 1156 static int anysee_ci_slot_ts_enable(struct dvb_ca_en50221 *ci, int slot) 1157 { 1158 struct dvb_usb_device *d = ci->data; 1159 int ret; 1160 1161 ret = anysee_wr_reg_mask(d, REG_IOD, (0 << 1), 0x02); 1162 if (ret) 1163 return ret; 1164 1165 return 0; 1166 } 1167 1168 static int anysee_ci_poll_slot_status(struct dvb_ca_en50221 *ci, int slot, 1169 int open) 1170 { 1171 struct dvb_usb_device *d = ci->data; 1172 struct anysee_state *state = d_to_priv(d); 1173 int ret; 1174 u8 tmp = 0; 1175 1176 ret = anysee_rd_reg_mask(d, REG_IOC, &tmp, 0x40); 1177 if (ret) 1178 return ret; 1179 1180 if (tmp == 0) { 1181 ret = DVB_CA_EN50221_POLL_CAM_PRESENT; 1182 if (time_after(jiffies, state->ci_cam_ready)) 1183 ret |= DVB_CA_EN50221_POLL_CAM_READY; 1184 } 1185 1186 return ret; 1187 } 1188 1189 static int anysee_ci_init(struct dvb_usb_device *d) 1190 { 1191 struct anysee_state *state = d_to_priv(d); 1192 int ret; 1193 1194 state->ci.owner = THIS_MODULE; 1195 state->ci.read_attribute_mem = anysee_ci_read_attribute_mem; 1196 state->ci.write_attribute_mem = anysee_ci_write_attribute_mem; 1197 state->ci.read_cam_control = anysee_ci_read_cam_control; 1198 state->ci.write_cam_control = anysee_ci_write_cam_control; 1199 state->ci.slot_reset = anysee_ci_slot_reset; 1200 state->ci.slot_shutdown = anysee_ci_slot_shutdown; 1201 state->ci.slot_ts_enable = anysee_ci_slot_ts_enable; 1202 state->ci.poll_slot_status = anysee_ci_poll_slot_status; 1203 state->ci.data = d; 1204 1205 ret = anysee_wr_reg_mask(d, REG_IOA, (1 << 7), 0x80); 1206 if (ret) 1207 return ret; 1208 1209 ret = anysee_wr_reg_mask(d, REG_IOD, (0 << 2)|(0 << 1)|(0 << 0), 0x07); 1210 if (ret) 1211 return ret; 1212 1213 ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 2)|(1 << 1)|(1 << 0), 0x07); 1214 if (ret) 1215 return ret; 1216 1217 ret = dvb_ca_en50221_init(&d->adapter[0].dvb_adap, &state->ci, 0, 1); 1218 if (ret) 1219 return ret; 1220 1221 state->ci_attached = true; 1222 1223 return 0; 1224 } 1225 1226 static void anysee_ci_release(struct dvb_usb_device *d) 1227 { 1228 struct anysee_state *state = d_to_priv(d); 1229 1230 /* detach CI */ 1231 if (state->ci_attached) 1232 dvb_ca_en50221_release(&state->ci); 1233 1234 return; 1235 } 1236 1237 static int anysee_init(struct dvb_usb_device *d) 1238 { 1239 struct anysee_state *state = d_to_priv(d); 1240 int ret; 1241 1242 /* There is one interface with two alternate settings. 1243 Alternate setting 0 is for bulk transfer. 1244 Alternate setting 1 is for isochronous transfer. 1245 We use bulk transfer (alternate setting 0). */ 1246 ret = usb_set_interface(d->udev, 0, 0); 1247 if (ret) 1248 return ret; 1249 1250 /* LED light */ 1251 ret = anysee_led_ctrl(d, 0x01, 0x03); 1252 if (ret) 1253 return ret; 1254 1255 /* enable IR */ 1256 ret = anysee_ir_ctrl(d, 1); 1257 if (ret) 1258 return ret; 1259 1260 /* attach CI */ 1261 if (state->has_ci) { 1262 ret = anysee_ci_init(d); 1263 if (ret) 1264 return ret; 1265 } 1266 1267 return 0; 1268 } 1269 1270 static void anysee_exit(struct dvb_usb_device *d) 1271 { 1272 return anysee_ci_release(d); 1273 } 1274 1275 /* DVB USB Driver stuff */ 1276 static struct dvb_usb_device_properties anysee_props = { 1277 .driver_name = KBUILD_MODNAME, 1278 .owner = THIS_MODULE, 1279 .adapter_nr = adapter_nr, 1280 .size_of_priv = sizeof(struct anysee_state), 1281 1282 .generic_bulk_ctrl_endpoint = 0x01, 1283 .generic_bulk_ctrl_endpoint_response = 0x81, 1284 1285 .i2c_algo = &anysee_i2c_algo, 1286 .read_config = anysee_read_config, 1287 .frontend_attach = anysee_frontend_attach, 1288 .tuner_attach = anysee_tuner_attach, 1289 .init = anysee_init, 1290 .get_rc_config = anysee_get_rc_config, 1291 .frontend_ctrl = anysee_frontend_ctrl, 1292 .streaming_ctrl = anysee_streaming_ctrl, 1293 .exit = anysee_exit, 1294 1295 .num_adapters = 1, 1296 .adapter = { 1297 { 1298 .stream = DVB_USB_STREAM_BULK(0x82, 8, 16 * 512), 1299 } 1300 } 1301 }; 1302 1303 static const struct usb_device_id anysee_id_table[] = { 1304 { DVB_USB_DEVICE(USB_VID_CYPRESS, USB_PID_ANYSEE, 1305 &anysee_props, "Anysee", RC_MAP_ANYSEE) }, 1306 { DVB_USB_DEVICE(USB_VID_AMT, USB_PID_ANYSEE, 1307 &anysee_props, "Anysee", RC_MAP_ANYSEE) }, 1308 { } 1309 }; 1310 MODULE_DEVICE_TABLE(usb, anysee_id_table); 1311 1312 static struct usb_driver anysee_usb_driver = { 1313 .name = KBUILD_MODNAME, 1314 .id_table = anysee_id_table, 1315 .probe = dvb_usbv2_probe, 1316 .disconnect = dvb_usbv2_disconnect, 1317 .suspend = dvb_usbv2_suspend, 1318 .resume = dvb_usbv2_resume, 1319 .reset_resume = dvb_usbv2_reset_resume, 1320 .no_dynamic_id = 1, 1321 .soft_unbind = 1, 1322 }; 1323 1324 module_usb_driver(anysee_usb_driver); 1325 1326 MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>"); 1327 MODULE_DESCRIPTION("Driver Anysee E30 DVB-C & DVB-T USB2.0"); 1328 MODULE_LICENSE("GPL"); 1329