1 /* 2 * Copyright (C) 2010-2014 Michael Krufky (mkrufky@linuxtv.org) 3 * 4 * This program is free software; you can redistribute it and/or modify it 5 * under the terms of the GNU General Public License as published by the Free 6 * Software Foundation, version 2. 7 * 8 * see Documentation/dvb/README.dvb-usb for more information 9 */ 10 11 #include <linux/vmalloc.h> 12 #include <linux/i2c.h> 13 #include <media/tuner.h> 14 15 #include "mxl111sf.h" 16 #include "mxl111sf-reg.h" 17 #include "mxl111sf-phy.h" 18 #include "mxl111sf-i2c.h" 19 #include "mxl111sf-gpio.h" 20 21 #include "mxl111sf-demod.h" 22 #include "mxl111sf-tuner.h" 23 24 #include "lgdt3305.h" 25 #include "lg2160.h" 26 27 /* Max transfer size done by I2C transfer functions */ 28 #define MAX_XFER_SIZE 64 29 30 int dvb_usb_mxl111sf_debug; 31 module_param_named(debug, dvb_usb_mxl111sf_debug, int, 0644); 32 MODULE_PARM_DESC(debug, "set debugging level " 33 "(1=info, 2=xfer, 4=i2c, 8=reg, 16=adv (or-able))."); 34 35 static int dvb_usb_mxl111sf_isoc; 36 module_param_named(isoc, dvb_usb_mxl111sf_isoc, int, 0644); 37 MODULE_PARM_DESC(isoc, "enable usb isoc xfer (0=bulk, 1=isoc)."); 38 39 static int dvb_usb_mxl111sf_spi; 40 module_param_named(spi, dvb_usb_mxl111sf_spi, int, 0644); 41 MODULE_PARM_DESC(spi, "use spi rather than tp for data xfer (0=tp, 1=spi)."); 42 43 #define ANT_PATH_AUTO 0 44 #define ANT_PATH_EXTERNAL 1 45 #define ANT_PATH_INTERNAL 2 46 47 static int dvb_usb_mxl111sf_rfswitch = 48 #if 0 49 ANT_PATH_AUTO; 50 #else 51 ANT_PATH_EXTERNAL; 52 #endif 53 54 module_param_named(rfswitch, dvb_usb_mxl111sf_rfswitch, int, 0644); 55 MODULE_PARM_DESC(rfswitch, "force rf switch position (0=auto, 1=ext, 2=int)."); 56 57 DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); 58 59 int mxl111sf_ctrl_msg(struct dvb_usb_device *d, 60 u8 cmd, u8 *wbuf, int wlen, u8 *rbuf, int rlen) 61 { 62 int wo = (rbuf == NULL || rlen == 0); /* write-only */ 63 int ret; 64 u8 sndbuf[MAX_XFER_SIZE]; 65 66 if (1 + wlen > sizeof(sndbuf)) { 67 pr_warn("%s: len=%d is too big!\n", __func__, wlen); 68 return -EOPNOTSUPP; 69 } 70 71 pr_debug("%s(wlen = %d, rlen = %d)\n", __func__, wlen, rlen); 72 73 memset(sndbuf, 0, 1+wlen); 74 75 sndbuf[0] = cmd; 76 memcpy(&sndbuf[1], wbuf, wlen); 77 78 ret = (wo) ? dvb_usbv2_generic_write(d, sndbuf, 1+wlen) : 79 dvb_usbv2_generic_rw(d, sndbuf, 1+wlen, rbuf, rlen); 80 mxl_fail(ret); 81 82 return ret; 83 } 84 85 /* ------------------------------------------------------------------------ */ 86 87 #define MXL_CMD_REG_READ 0xaa 88 #define MXL_CMD_REG_WRITE 0x55 89 90 int mxl111sf_read_reg(struct mxl111sf_state *state, u8 addr, u8 *data) 91 { 92 u8 buf[2]; 93 int ret; 94 95 ret = mxl111sf_ctrl_msg(state->d, MXL_CMD_REG_READ, &addr, 1, buf, 2); 96 if (mxl_fail(ret)) { 97 mxl_debug("error reading reg: 0x%02x", addr); 98 goto fail; 99 } 100 101 if (buf[0] == addr) 102 *data = buf[1]; 103 else { 104 pr_err("invalid response reading reg: 0x%02x != 0x%02x, 0x%02x", 105 addr, buf[0], buf[1]); 106 ret = -EINVAL; 107 } 108 109 pr_debug("R: (0x%02x, 0x%02x)\n", addr, buf[1]); 110 fail: 111 return ret; 112 } 113 114 int mxl111sf_write_reg(struct mxl111sf_state *state, u8 addr, u8 data) 115 { 116 u8 buf[] = { addr, data }; 117 int ret; 118 119 pr_debug("W: (0x%02x, 0x%02x)\n", addr, data); 120 121 ret = mxl111sf_ctrl_msg(state->d, MXL_CMD_REG_WRITE, buf, 2, NULL, 0); 122 if (mxl_fail(ret)) 123 pr_err("error writing reg: 0x%02x, val: 0x%02x", addr, data); 124 return ret; 125 } 126 127 /* ------------------------------------------------------------------------ */ 128 129 int mxl111sf_write_reg_mask(struct mxl111sf_state *state, 130 u8 addr, u8 mask, u8 data) 131 { 132 int ret; 133 u8 val = 0; 134 135 if (mask != 0xff) { 136 ret = mxl111sf_read_reg(state, addr, &val); 137 #if 1 138 /* dont know why this usually errors out on the first try */ 139 if (mxl_fail(ret)) 140 pr_err("error writing addr: 0x%02x, mask: 0x%02x, " 141 "data: 0x%02x, retrying...", addr, mask, data); 142 143 ret = mxl111sf_read_reg(state, addr, &val); 144 #endif 145 if (mxl_fail(ret)) 146 goto fail; 147 } 148 val &= ~mask; 149 val |= data; 150 151 ret = mxl111sf_write_reg(state, addr, val); 152 mxl_fail(ret); 153 fail: 154 return ret; 155 } 156 157 /* ------------------------------------------------------------------------ */ 158 159 int mxl111sf_ctrl_program_regs(struct mxl111sf_state *state, 160 struct mxl111sf_reg_ctrl_info *ctrl_reg_info) 161 { 162 int i, ret = 0; 163 164 for (i = 0; ctrl_reg_info[i].addr | 165 ctrl_reg_info[i].mask | 166 ctrl_reg_info[i].data; i++) { 167 168 ret = mxl111sf_write_reg_mask(state, 169 ctrl_reg_info[i].addr, 170 ctrl_reg_info[i].mask, 171 ctrl_reg_info[i].data); 172 if (mxl_fail(ret)) { 173 pr_err("failed on reg #%d (0x%02x)", i, 174 ctrl_reg_info[i].addr); 175 break; 176 } 177 } 178 return ret; 179 } 180 181 /* ------------------------------------------------------------------------ */ 182 183 static int mxl1x1sf_get_chip_info(struct mxl111sf_state *state) 184 { 185 int ret; 186 u8 id, ver; 187 char *mxl_chip, *mxl_rev; 188 189 if ((state->chip_id) && (state->chip_ver)) 190 return 0; 191 192 ret = mxl111sf_read_reg(state, CHIP_ID_REG, &id); 193 if (mxl_fail(ret)) 194 goto fail; 195 state->chip_id = id; 196 197 ret = mxl111sf_read_reg(state, TOP_CHIP_REV_ID_REG, &ver); 198 if (mxl_fail(ret)) 199 goto fail; 200 state->chip_ver = ver; 201 202 switch (id) { 203 case 0x61: 204 mxl_chip = "MxL101SF"; 205 break; 206 case 0x63: 207 mxl_chip = "MxL111SF"; 208 break; 209 default: 210 mxl_chip = "UNKNOWN MxL1X1"; 211 break; 212 } 213 switch (ver) { 214 case 0x36: 215 state->chip_rev = MXL111SF_V6; 216 mxl_rev = "v6"; 217 break; 218 case 0x08: 219 state->chip_rev = MXL111SF_V8_100; 220 mxl_rev = "v8_100"; 221 break; 222 case 0x18: 223 state->chip_rev = MXL111SF_V8_200; 224 mxl_rev = "v8_200"; 225 break; 226 default: 227 state->chip_rev = 0; 228 mxl_rev = "UNKNOWN REVISION"; 229 break; 230 } 231 pr_info("%s detected, %s (0x%x)", mxl_chip, mxl_rev, ver); 232 fail: 233 return ret; 234 } 235 236 #define get_chip_info(state) \ 237 ({ \ 238 int ___ret; \ 239 ___ret = mxl1x1sf_get_chip_info(state); \ 240 if (mxl_fail(___ret)) { \ 241 mxl_debug("failed to get chip info" \ 242 " on first probe attempt"); \ 243 ___ret = mxl1x1sf_get_chip_info(state); \ 244 if (mxl_fail(___ret)) \ 245 pr_err("failed to get chip info during probe"); \ 246 else \ 247 mxl_debug("probe needed a retry " \ 248 "in order to succeed."); \ 249 } \ 250 ___ret; \ 251 }) 252 253 /* ------------------------------------------------------------------------ */ 254 #if 0 255 static int mxl111sf_power_ctrl(struct dvb_usb_device *d, int onoff) 256 { 257 /* power control depends on which adapter is being woken: 258 * save this for init, instead, via mxl111sf_adap_fe_init */ 259 return 0; 260 } 261 #endif 262 263 static int mxl111sf_adap_fe_init(struct dvb_frontend *fe) 264 { 265 struct dvb_usb_device *d = fe_to_d(fe); 266 struct mxl111sf_state *state = fe_to_priv(fe); 267 struct mxl111sf_adap_state *adap_state = &state->adap_state[fe->id]; 268 int err; 269 270 /* exit if we didn't initialize the driver yet */ 271 if (!state->chip_id) { 272 mxl_debug("driver not yet initialized, exit."); 273 goto fail; 274 } 275 276 pr_debug("%s()\n", __func__); 277 278 mutex_lock(&state->fe_lock); 279 280 state->alt_mode = adap_state->alt_mode; 281 282 if (usb_set_interface(d->udev, 0, state->alt_mode) < 0) 283 pr_err("set interface failed"); 284 285 err = mxl1x1sf_soft_reset(state); 286 mxl_fail(err); 287 err = mxl111sf_init_tuner_demod(state); 288 mxl_fail(err); 289 err = mxl1x1sf_set_device_mode(state, adap_state->device_mode); 290 291 mxl_fail(err); 292 err = mxl111sf_enable_usb_output(state); 293 mxl_fail(err); 294 err = mxl1x1sf_top_master_ctrl(state, 1); 295 mxl_fail(err); 296 297 if ((MXL111SF_GPIO_MOD_DVBT != adap_state->gpio_mode) && 298 (state->chip_rev > MXL111SF_V6)) { 299 mxl111sf_config_pin_mux_modes(state, 300 PIN_MUX_TS_SPI_IN_MODE_1); 301 mxl_fail(err); 302 } 303 err = mxl111sf_init_port_expander(state); 304 if (!mxl_fail(err)) { 305 state->gpio_mode = adap_state->gpio_mode; 306 err = mxl111sf_gpio_mode_switch(state, state->gpio_mode); 307 mxl_fail(err); 308 #if 0 309 err = fe->ops.init(fe); 310 #endif 311 msleep(100); /* add short delay after enabling 312 * the demod before touching it */ 313 } 314 315 return (adap_state->fe_init) ? adap_state->fe_init(fe) : 0; 316 fail: 317 return -ENODEV; 318 } 319 320 static int mxl111sf_adap_fe_sleep(struct dvb_frontend *fe) 321 { 322 struct mxl111sf_state *state = fe_to_priv(fe); 323 struct mxl111sf_adap_state *adap_state = &state->adap_state[fe->id]; 324 int err; 325 326 /* exit if we didn't initialize the driver yet */ 327 if (!state->chip_id) { 328 mxl_debug("driver not yet initialized, exit."); 329 goto fail; 330 } 331 332 pr_debug("%s()\n", __func__); 333 334 err = (adap_state->fe_sleep) ? adap_state->fe_sleep(fe) : 0; 335 336 mutex_unlock(&state->fe_lock); 337 338 return err; 339 fail: 340 return -ENODEV; 341 } 342 343 344 static int mxl111sf_ep6_streaming_ctrl(struct dvb_frontend *fe, int onoff) 345 { 346 struct mxl111sf_state *state = fe_to_priv(fe); 347 struct mxl111sf_adap_state *adap_state = &state->adap_state[fe->id]; 348 int ret = 0; 349 350 pr_debug("%s(%d)\n", __func__, onoff); 351 352 if (onoff) { 353 ret = mxl111sf_enable_usb_output(state); 354 mxl_fail(ret); 355 ret = mxl111sf_config_mpeg_in(state, 1, 1, 356 adap_state->ep6_clockphase, 357 0, 0); 358 mxl_fail(ret); 359 #if 0 360 } else { 361 ret = mxl111sf_disable_656_port(state); 362 mxl_fail(ret); 363 #endif 364 } 365 366 return ret; 367 } 368 369 static int mxl111sf_ep5_streaming_ctrl(struct dvb_frontend *fe, int onoff) 370 { 371 struct mxl111sf_state *state = fe_to_priv(fe); 372 int ret = 0; 373 374 pr_debug("%s(%d)\n", __func__, onoff); 375 376 if (onoff) { 377 ret = mxl111sf_enable_usb_output(state); 378 mxl_fail(ret); 379 380 ret = mxl111sf_init_i2s_port(state, 200); 381 mxl_fail(ret); 382 ret = mxl111sf_config_i2s(state, 0, 15); 383 mxl_fail(ret); 384 } else { 385 ret = mxl111sf_disable_i2s_port(state); 386 mxl_fail(ret); 387 } 388 if (state->chip_rev > MXL111SF_V6) 389 ret = mxl111sf_config_spi(state, onoff); 390 mxl_fail(ret); 391 392 return ret; 393 } 394 395 static int mxl111sf_ep4_streaming_ctrl(struct dvb_frontend *fe, int onoff) 396 { 397 struct mxl111sf_state *state = fe_to_priv(fe); 398 int ret = 0; 399 400 pr_debug("%s(%d)\n", __func__, onoff); 401 402 if (onoff) { 403 ret = mxl111sf_enable_usb_output(state); 404 mxl_fail(ret); 405 } 406 407 return ret; 408 } 409 410 /* ------------------------------------------------------------------------ */ 411 412 static struct lgdt3305_config hauppauge_lgdt3305_config = { 413 .i2c_addr = 0xb2 >> 1, 414 .mpeg_mode = LGDT3305_MPEG_SERIAL, 415 .tpclk_edge = LGDT3305_TPCLK_RISING_EDGE, 416 .tpvalid_polarity = LGDT3305_TP_VALID_HIGH, 417 .deny_i2c_rptr = 1, 418 .spectral_inversion = 0, 419 .qam_if_khz = 6000, 420 .vsb_if_khz = 6000, 421 }; 422 423 static int mxl111sf_lgdt3305_frontend_attach(struct dvb_usb_adapter *adap, u8 fe_id) 424 { 425 struct dvb_usb_device *d = adap_to_d(adap); 426 struct mxl111sf_state *state = d_to_priv(d); 427 struct mxl111sf_adap_state *adap_state = &state->adap_state[fe_id]; 428 int ret; 429 430 pr_debug("%s()\n", __func__); 431 432 /* save a pointer to the dvb_usb_device in device state */ 433 state->d = d; 434 adap_state->alt_mode = (dvb_usb_mxl111sf_isoc) ? 2 : 1; 435 state->alt_mode = adap_state->alt_mode; 436 437 if (usb_set_interface(d->udev, 0, state->alt_mode) < 0) 438 pr_err("set interface failed"); 439 440 state->gpio_mode = MXL111SF_GPIO_MOD_ATSC; 441 adap_state->gpio_mode = state->gpio_mode; 442 adap_state->device_mode = MXL_TUNER_MODE; 443 adap_state->ep6_clockphase = 1; 444 445 ret = mxl1x1sf_soft_reset(state); 446 if (mxl_fail(ret)) 447 goto fail; 448 ret = mxl111sf_init_tuner_demod(state); 449 if (mxl_fail(ret)) 450 goto fail; 451 452 ret = mxl1x1sf_set_device_mode(state, adap_state->device_mode); 453 if (mxl_fail(ret)) 454 goto fail; 455 456 ret = mxl111sf_enable_usb_output(state); 457 if (mxl_fail(ret)) 458 goto fail; 459 ret = mxl1x1sf_top_master_ctrl(state, 1); 460 if (mxl_fail(ret)) 461 goto fail; 462 463 ret = mxl111sf_init_port_expander(state); 464 if (mxl_fail(ret)) 465 goto fail; 466 ret = mxl111sf_gpio_mode_switch(state, state->gpio_mode); 467 if (mxl_fail(ret)) 468 goto fail; 469 470 adap->fe[fe_id] = dvb_attach(lgdt3305_attach, 471 &hauppauge_lgdt3305_config, 472 &d->i2c_adap); 473 if (adap->fe[fe_id]) { 474 state->num_frontends++; 475 adap_state->fe_init = adap->fe[fe_id]->ops.init; 476 adap->fe[fe_id]->ops.init = mxl111sf_adap_fe_init; 477 adap_state->fe_sleep = adap->fe[fe_id]->ops.sleep; 478 adap->fe[fe_id]->ops.sleep = mxl111sf_adap_fe_sleep; 479 return 0; 480 } 481 ret = -EIO; 482 fail: 483 return ret; 484 } 485 486 static struct lg2160_config hauppauge_lg2160_config = { 487 .lg_chip = LG2160, 488 .i2c_addr = 0x1c >> 1, 489 .deny_i2c_rptr = 1, 490 .spectral_inversion = 0, 491 .if_khz = 6000, 492 }; 493 494 static int mxl111sf_lg2160_frontend_attach(struct dvb_usb_adapter *adap, u8 fe_id) 495 { 496 struct dvb_usb_device *d = adap_to_d(adap); 497 struct mxl111sf_state *state = d_to_priv(d); 498 struct mxl111sf_adap_state *adap_state = &state->adap_state[fe_id]; 499 int ret; 500 501 pr_debug("%s()\n", __func__); 502 503 /* save a pointer to the dvb_usb_device in device state */ 504 state->d = d; 505 adap_state->alt_mode = (dvb_usb_mxl111sf_isoc) ? 2 : 1; 506 state->alt_mode = adap_state->alt_mode; 507 508 if (usb_set_interface(d->udev, 0, state->alt_mode) < 0) 509 pr_err("set interface failed"); 510 511 state->gpio_mode = MXL111SF_GPIO_MOD_MH; 512 adap_state->gpio_mode = state->gpio_mode; 513 adap_state->device_mode = MXL_TUNER_MODE; 514 adap_state->ep6_clockphase = 1; 515 516 ret = mxl1x1sf_soft_reset(state); 517 if (mxl_fail(ret)) 518 goto fail; 519 ret = mxl111sf_init_tuner_demod(state); 520 if (mxl_fail(ret)) 521 goto fail; 522 523 ret = mxl1x1sf_set_device_mode(state, adap_state->device_mode); 524 if (mxl_fail(ret)) 525 goto fail; 526 527 ret = mxl111sf_enable_usb_output(state); 528 if (mxl_fail(ret)) 529 goto fail; 530 ret = mxl1x1sf_top_master_ctrl(state, 1); 531 if (mxl_fail(ret)) 532 goto fail; 533 534 ret = mxl111sf_init_port_expander(state); 535 if (mxl_fail(ret)) 536 goto fail; 537 ret = mxl111sf_gpio_mode_switch(state, state->gpio_mode); 538 if (mxl_fail(ret)) 539 goto fail; 540 541 ret = get_chip_info(state); 542 if (mxl_fail(ret)) 543 goto fail; 544 545 adap->fe[fe_id] = dvb_attach(lg2160_attach, 546 &hauppauge_lg2160_config, 547 &d->i2c_adap); 548 if (adap->fe[fe_id]) { 549 state->num_frontends++; 550 adap_state->fe_init = adap->fe[fe_id]->ops.init; 551 adap->fe[fe_id]->ops.init = mxl111sf_adap_fe_init; 552 adap_state->fe_sleep = adap->fe[fe_id]->ops.sleep; 553 adap->fe[fe_id]->ops.sleep = mxl111sf_adap_fe_sleep; 554 return 0; 555 } 556 ret = -EIO; 557 fail: 558 return ret; 559 } 560 561 static struct lg2160_config hauppauge_lg2161_1019_config = { 562 .lg_chip = LG2161_1019, 563 .i2c_addr = 0x1c >> 1, 564 .deny_i2c_rptr = 1, 565 .spectral_inversion = 0, 566 .if_khz = 6000, 567 .output_if = 2, /* LG2161_OIF_SPI_MAS */ 568 }; 569 570 static struct lg2160_config hauppauge_lg2161_1040_config = { 571 .lg_chip = LG2161_1040, 572 .i2c_addr = 0x1c >> 1, 573 .deny_i2c_rptr = 1, 574 .spectral_inversion = 0, 575 .if_khz = 6000, 576 .output_if = 4, /* LG2161_OIF_SPI_MAS */ 577 }; 578 579 static int mxl111sf_lg2161_frontend_attach(struct dvb_usb_adapter *adap, u8 fe_id) 580 { 581 struct dvb_usb_device *d = adap_to_d(adap); 582 struct mxl111sf_state *state = d_to_priv(d); 583 struct mxl111sf_adap_state *adap_state = &state->adap_state[fe_id]; 584 int ret; 585 586 pr_debug("%s()\n", __func__); 587 588 /* save a pointer to the dvb_usb_device in device state */ 589 state->d = d; 590 adap_state->alt_mode = (dvb_usb_mxl111sf_isoc) ? 2 : 1; 591 state->alt_mode = adap_state->alt_mode; 592 593 if (usb_set_interface(d->udev, 0, state->alt_mode) < 0) 594 pr_err("set interface failed"); 595 596 state->gpio_mode = MXL111SF_GPIO_MOD_MH; 597 adap_state->gpio_mode = state->gpio_mode; 598 adap_state->device_mode = MXL_TUNER_MODE; 599 adap_state->ep6_clockphase = 1; 600 601 ret = mxl1x1sf_soft_reset(state); 602 if (mxl_fail(ret)) 603 goto fail; 604 ret = mxl111sf_init_tuner_demod(state); 605 if (mxl_fail(ret)) 606 goto fail; 607 608 ret = mxl1x1sf_set_device_mode(state, adap_state->device_mode); 609 if (mxl_fail(ret)) 610 goto fail; 611 612 ret = mxl111sf_enable_usb_output(state); 613 if (mxl_fail(ret)) 614 goto fail; 615 ret = mxl1x1sf_top_master_ctrl(state, 1); 616 if (mxl_fail(ret)) 617 goto fail; 618 619 ret = mxl111sf_init_port_expander(state); 620 if (mxl_fail(ret)) 621 goto fail; 622 ret = mxl111sf_gpio_mode_switch(state, state->gpio_mode); 623 if (mxl_fail(ret)) 624 goto fail; 625 626 ret = get_chip_info(state); 627 if (mxl_fail(ret)) 628 goto fail; 629 630 adap->fe[fe_id] = dvb_attach(lg2160_attach, 631 (MXL111SF_V8_200 == state->chip_rev) ? 632 &hauppauge_lg2161_1040_config : 633 &hauppauge_lg2161_1019_config, 634 &d->i2c_adap); 635 if (adap->fe[fe_id]) { 636 state->num_frontends++; 637 adap_state->fe_init = adap->fe[fe_id]->ops.init; 638 adap->fe[fe_id]->ops.init = mxl111sf_adap_fe_init; 639 adap_state->fe_sleep = adap->fe[fe_id]->ops.sleep; 640 adap->fe[fe_id]->ops.sleep = mxl111sf_adap_fe_sleep; 641 return 0; 642 } 643 ret = -EIO; 644 fail: 645 return ret; 646 } 647 648 static struct lg2160_config hauppauge_lg2161_1019_ep6_config = { 649 .lg_chip = LG2161_1019, 650 .i2c_addr = 0x1c >> 1, 651 .deny_i2c_rptr = 1, 652 .spectral_inversion = 0, 653 .if_khz = 6000, 654 .output_if = 1, /* LG2161_OIF_SERIAL_TS */ 655 }; 656 657 static struct lg2160_config hauppauge_lg2161_1040_ep6_config = { 658 .lg_chip = LG2161_1040, 659 .i2c_addr = 0x1c >> 1, 660 .deny_i2c_rptr = 1, 661 .spectral_inversion = 0, 662 .if_khz = 6000, 663 .output_if = 7, /* LG2161_OIF_SERIAL_TS */ 664 }; 665 666 static int mxl111sf_lg2161_ep6_frontend_attach(struct dvb_usb_adapter *adap, u8 fe_id) 667 { 668 struct dvb_usb_device *d = adap_to_d(adap); 669 struct mxl111sf_state *state = d_to_priv(d); 670 struct mxl111sf_adap_state *adap_state = &state->adap_state[fe_id]; 671 int ret; 672 673 pr_debug("%s()\n", __func__); 674 675 /* save a pointer to the dvb_usb_device in device state */ 676 state->d = d; 677 adap_state->alt_mode = (dvb_usb_mxl111sf_isoc) ? 2 : 1; 678 state->alt_mode = adap_state->alt_mode; 679 680 if (usb_set_interface(d->udev, 0, state->alt_mode) < 0) 681 pr_err("set interface failed"); 682 683 state->gpio_mode = MXL111SF_GPIO_MOD_MH; 684 adap_state->gpio_mode = state->gpio_mode; 685 adap_state->device_mode = MXL_TUNER_MODE; 686 adap_state->ep6_clockphase = 0; 687 688 ret = mxl1x1sf_soft_reset(state); 689 if (mxl_fail(ret)) 690 goto fail; 691 ret = mxl111sf_init_tuner_demod(state); 692 if (mxl_fail(ret)) 693 goto fail; 694 695 ret = mxl1x1sf_set_device_mode(state, adap_state->device_mode); 696 if (mxl_fail(ret)) 697 goto fail; 698 699 ret = mxl111sf_enable_usb_output(state); 700 if (mxl_fail(ret)) 701 goto fail; 702 ret = mxl1x1sf_top_master_ctrl(state, 1); 703 if (mxl_fail(ret)) 704 goto fail; 705 706 ret = mxl111sf_init_port_expander(state); 707 if (mxl_fail(ret)) 708 goto fail; 709 ret = mxl111sf_gpio_mode_switch(state, state->gpio_mode); 710 if (mxl_fail(ret)) 711 goto fail; 712 713 ret = get_chip_info(state); 714 if (mxl_fail(ret)) 715 goto fail; 716 717 adap->fe[fe_id] = dvb_attach(lg2160_attach, 718 (MXL111SF_V8_200 == state->chip_rev) ? 719 &hauppauge_lg2161_1040_ep6_config : 720 &hauppauge_lg2161_1019_ep6_config, 721 &d->i2c_adap); 722 if (adap->fe[fe_id]) { 723 state->num_frontends++; 724 adap_state->fe_init = adap->fe[fe_id]->ops.init; 725 adap->fe[fe_id]->ops.init = mxl111sf_adap_fe_init; 726 adap_state->fe_sleep = adap->fe[fe_id]->ops.sleep; 727 adap->fe[fe_id]->ops.sleep = mxl111sf_adap_fe_sleep; 728 return 0; 729 } 730 ret = -EIO; 731 fail: 732 return ret; 733 } 734 735 static const struct mxl111sf_demod_config mxl_demod_config = { 736 .read_reg = mxl111sf_read_reg, 737 .write_reg = mxl111sf_write_reg, 738 .program_regs = mxl111sf_ctrl_program_regs, 739 }; 740 741 static int mxl111sf_attach_demod(struct dvb_usb_adapter *adap, u8 fe_id) 742 { 743 struct dvb_usb_device *d = adap_to_d(adap); 744 struct mxl111sf_state *state = d_to_priv(d); 745 struct mxl111sf_adap_state *adap_state = &state->adap_state[fe_id]; 746 int ret; 747 748 pr_debug("%s()\n", __func__); 749 750 /* save a pointer to the dvb_usb_device in device state */ 751 state->d = d; 752 adap_state->alt_mode = (dvb_usb_mxl111sf_isoc) ? 1 : 2; 753 state->alt_mode = adap_state->alt_mode; 754 755 if (usb_set_interface(d->udev, 0, state->alt_mode) < 0) 756 pr_err("set interface failed"); 757 758 state->gpio_mode = MXL111SF_GPIO_MOD_DVBT; 759 adap_state->gpio_mode = state->gpio_mode; 760 adap_state->device_mode = MXL_SOC_MODE; 761 adap_state->ep6_clockphase = 1; 762 763 ret = mxl1x1sf_soft_reset(state); 764 if (mxl_fail(ret)) 765 goto fail; 766 ret = mxl111sf_init_tuner_demod(state); 767 if (mxl_fail(ret)) 768 goto fail; 769 770 ret = mxl1x1sf_set_device_mode(state, adap_state->device_mode); 771 if (mxl_fail(ret)) 772 goto fail; 773 774 ret = mxl111sf_enable_usb_output(state); 775 if (mxl_fail(ret)) 776 goto fail; 777 ret = mxl1x1sf_top_master_ctrl(state, 1); 778 if (mxl_fail(ret)) 779 goto fail; 780 781 /* dont care if this fails */ 782 mxl111sf_init_port_expander(state); 783 784 adap->fe[fe_id] = dvb_attach(mxl111sf_demod_attach, state, 785 &mxl_demod_config); 786 if (adap->fe[fe_id]) { 787 state->num_frontends++; 788 adap_state->fe_init = adap->fe[fe_id]->ops.init; 789 adap->fe[fe_id]->ops.init = mxl111sf_adap_fe_init; 790 adap_state->fe_sleep = adap->fe[fe_id]->ops.sleep; 791 adap->fe[fe_id]->ops.sleep = mxl111sf_adap_fe_sleep; 792 return 0; 793 } 794 ret = -EIO; 795 fail: 796 return ret; 797 } 798 799 static inline int mxl111sf_set_ant_path(struct mxl111sf_state *state, 800 int antpath) 801 { 802 return mxl111sf_idac_config(state, 1, 1, 803 (antpath == ANT_PATH_INTERNAL) ? 804 0x3f : 0x00, 0); 805 } 806 807 #define DbgAntHunt(x, pwr0, pwr1, pwr2, pwr3) \ 808 pr_err("%s(%d) FINAL input set to %s rxPwr:%d|%d|%d|%d\n", \ 809 __func__, __LINE__, \ 810 (ANT_PATH_EXTERNAL == x) ? "EXTERNAL" : "INTERNAL", \ 811 pwr0, pwr1, pwr2, pwr3) 812 813 #define ANT_HUNT_SLEEP 90 814 #define ANT_EXT_TWEAK 0 815 816 static int mxl111sf_ant_hunt(struct dvb_frontend *fe) 817 { 818 struct mxl111sf_state *state = fe_to_priv(fe); 819 int antctrl = dvb_usb_mxl111sf_rfswitch; 820 821 u16 rxPwrA, rxPwr0, rxPwr1, rxPwr2; 822 823 /* FIXME: must force EXTERNAL for QAM - done elsewhere */ 824 mxl111sf_set_ant_path(state, antctrl == ANT_PATH_AUTO ? 825 ANT_PATH_EXTERNAL : antctrl); 826 827 if (antctrl == ANT_PATH_AUTO) { 828 #if 0 829 msleep(ANT_HUNT_SLEEP); 830 #endif 831 fe->ops.tuner_ops.get_rf_strength(fe, &rxPwrA); 832 833 mxl111sf_set_ant_path(state, ANT_PATH_EXTERNAL); 834 msleep(ANT_HUNT_SLEEP); 835 fe->ops.tuner_ops.get_rf_strength(fe, &rxPwr0); 836 837 mxl111sf_set_ant_path(state, ANT_PATH_EXTERNAL); 838 msleep(ANT_HUNT_SLEEP); 839 fe->ops.tuner_ops.get_rf_strength(fe, &rxPwr1); 840 841 mxl111sf_set_ant_path(state, ANT_PATH_INTERNAL); 842 msleep(ANT_HUNT_SLEEP); 843 fe->ops.tuner_ops.get_rf_strength(fe, &rxPwr2); 844 845 if (rxPwr1+ANT_EXT_TWEAK >= rxPwr2) { 846 /* return with EXTERNAL enabled */ 847 mxl111sf_set_ant_path(state, ANT_PATH_EXTERNAL); 848 DbgAntHunt(ANT_PATH_EXTERNAL, rxPwrA, 849 rxPwr0, rxPwr1, rxPwr2); 850 } else { 851 /* return with INTERNAL enabled */ 852 DbgAntHunt(ANT_PATH_INTERNAL, rxPwrA, 853 rxPwr0, rxPwr1, rxPwr2); 854 } 855 } 856 return 0; 857 } 858 859 static const struct mxl111sf_tuner_config mxl_tuner_config = { 860 .if_freq = MXL_IF_6_0, /* applies to external IF output, only */ 861 .invert_spectrum = 0, 862 .read_reg = mxl111sf_read_reg, 863 .write_reg = mxl111sf_write_reg, 864 .program_regs = mxl111sf_ctrl_program_regs, 865 .top_master_ctrl = mxl1x1sf_top_master_ctrl, 866 .ant_hunt = mxl111sf_ant_hunt, 867 }; 868 869 static int mxl111sf_attach_tuner(struct dvb_usb_adapter *adap) 870 { 871 struct mxl111sf_state *state = adap_to_priv(adap); 872 #ifdef CONFIG_MEDIA_CONTROLLER_DVB 873 struct media_device *mdev = dvb_get_media_controller(&adap->dvb_adap); 874 int ret; 875 #endif 876 int i; 877 878 pr_debug("%s()\n", __func__); 879 880 for (i = 0; i < state->num_frontends; i++) { 881 if (dvb_attach(mxl111sf_tuner_attach, adap->fe[i], state, 882 &mxl_tuner_config) == NULL) 883 return -EIO; 884 adap->fe[i]->ops.read_signal_strength = adap->fe[i]->ops.tuner_ops.get_rf_strength; 885 } 886 887 #ifdef CONFIG_MEDIA_CONTROLLER_DVB 888 state->tuner.function = MEDIA_ENT_F_TUNER; 889 state->tuner.name = "mxl111sf tuner"; 890 state->tuner_pads[TUNER_PAD_RF_INPUT].flags = MEDIA_PAD_FL_SINK; 891 state->tuner_pads[TUNER_PAD_OUTPUT].flags = MEDIA_PAD_FL_SOURCE; 892 893 ret = media_entity_pads_init(&state->tuner, 894 TUNER_NUM_PADS, state->tuner_pads); 895 if (ret) 896 return ret; 897 898 ret = media_device_register_entity(mdev, &state->tuner); 899 if (ret) 900 return ret; 901 #endif 902 return 0; 903 } 904 905 static u32 mxl111sf_i2c_func(struct i2c_adapter *adapter) 906 { 907 return I2C_FUNC_I2C; 908 } 909 910 static struct i2c_algorithm mxl111sf_i2c_algo = { 911 .master_xfer = mxl111sf_i2c_xfer, 912 .functionality = mxl111sf_i2c_func, 913 #ifdef NEED_ALGO_CONTROL 914 .algo_control = dummy_algo_control, 915 #endif 916 }; 917 918 static int mxl111sf_init(struct dvb_usb_device *d) 919 { 920 struct mxl111sf_state *state = d_to_priv(d); 921 int ret; 922 static u8 eeprom[256]; 923 struct i2c_client c; 924 925 ret = get_chip_info(state); 926 if (mxl_fail(ret)) 927 pr_err("failed to get chip info during probe"); 928 929 mutex_init(&state->fe_lock); 930 931 if (state->chip_rev > MXL111SF_V6) 932 mxl111sf_config_pin_mux_modes(state, PIN_MUX_TS_SPI_IN_MODE_1); 933 934 c.adapter = &d->i2c_adap; 935 c.addr = 0xa0 >> 1; 936 937 ret = tveeprom_read(&c, eeprom, sizeof(eeprom)); 938 if (mxl_fail(ret)) 939 return 0; 940 tveeprom_hauppauge_analog(&c, &state->tv, (0x84 == eeprom[0xa0]) ? 941 eeprom + 0xa0 : eeprom + 0x80); 942 #if 0 943 switch (state->tv.model) { 944 case 117001: 945 case 126001: 946 case 138001: 947 break; 948 default: 949 printk(KERN_WARNING "%s: warning: " 950 "unknown hauppauge model #%d\n", 951 __func__, state->tv.model); 952 } 953 #endif 954 return 0; 955 } 956 957 static int mxl111sf_frontend_attach_dvbt(struct dvb_usb_adapter *adap) 958 { 959 return mxl111sf_attach_demod(adap, 0); 960 } 961 962 static int mxl111sf_frontend_attach_atsc(struct dvb_usb_adapter *adap) 963 { 964 return mxl111sf_lgdt3305_frontend_attach(adap, 0); 965 } 966 967 static int mxl111sf_frontend_attach_mh(struct dvb_usb_adapter *adap) 968 { 969 return mxl111sf_lg2160_frontend_attach(adap, 0); 970 } 971 972 static int mxl111sf_frontend_attach_atsc_mh(struct dvb_usb_adapter *adap) 973 { 974 int ret; 975 pr_debug("%s\n", __func__); 976 977 ret = mxl111sf_lgdt3305_frontend_attach(adap, 0); 978 if (ret < 0) 979 return ret; 980 981 ret = mxl111sf_attach_demod(adap, 1); 982 if (ret < 0) 983 return ret; 984 985 ret = mxl111sf_lg2160_frontend_attach(adap, 2); 986 if (ret < 0) 987 return ret; 988 989 return ret; 990 } 991 992 static int mxl111sf_frontend_attach_mercury(struct dvb_usb_adapter *adap) 993 { 994 int ret; 995 pr_debug("%s\n", __func__); 996 997 ret = mxl111sf_lgdt3305_frontend_attach(adap, 0); 998 if (ret < 0) 999 return ret; 1000 1001 ret = mxl111sf_attach_demod(adap, 1); 1002 if (ret < 0) 1003 return ret; 1004 1005 ret = mxl111sf_lg2161_ep6_frontend_attach(adap, 2); 1006 if (ret < 0) 1007 return ret; 1008 1009 return ret; 1010 } 1011 1012 static int mxl111sf_frontend_attach_mercury_mh(struct dvb_usb_adapter *adap) 1013 { 1014 int ret; 1015 pr_debug("%s\n", __func__); 1016 1017 ret = mxl111sf_attach_demod(adap, 0); 1018 if (ret < 0) 1019 return ret; 1020 1021 if (dvb_usb_mxl111sf_spi) 1022 ret = mxl111sf_lg2161_frontend_attach(adap, 1); 1023 else 1024 ret = mxl111sf_lg2161_ep6_frontend_attach(adap, 1); 1025 1026 return ret; 1027 } 1028 1029 static void mxl111sf_stream_config_bulk(struct usb_data_stream_properties *stream, u8 endpoint) 1030 { 1031 pr_debug("%s: endpoint=%d size=8192\n", __func__, endpoint); 1032 stream->type = USB_BULK; 1033 stream->count = 5; 1034 stream->endpoint = endpoint; 1035 stream->u.bulk.buffersize = 8192; 1036 } 1037 1038 static void mxl111sf_stream_config_isoc(struct usb_data_stream_properties *stream, 1039 u8 endpoint, int framesperurb, int framesize) 1040 { 1041 pr_debug("%s: endpoint=%d size=%d\n", __func__, endpoint, 1042 framesperurb * framesize); 1043 stream->type = USB_ISOC; 1044 stream->count = 5; 1045 stream->endpoint = endpoint; 1046 stream->u.isoc.framesperurb = framesperurb; 1047 stream->u.isoc.framesize = framesize; 1048 stream->u.isoc.interval = 1; 1049 } 1050 1051 /* DVB USB Driver stuff */ 1052 1053 /* dvbt mxl111sf 1054 * bulk EP4/BULK/5/8192 1055 * isoc EP4/ISOC/5/96/564 1056 */ 1057 static int mxl111sf_get_stream_config_dvbt(struct dvb_frontend *fe, 1058 u8 *ts_type, struct usb_data_stream_properties *stream) 1059 { 1060 pr_debug("%s: fe=%d\n", __func__, fe->id); 1061 1062 *ts_type = DVB_USB_FE_TS_TYPE_188; 1063 if (dvb_usb_mxl111sf_isoc) 1064 mxl111sf_stream_config_isoc(stream, 4, 96, 564); 1065 else 1066 mxl111sf_stream_config_bulk(stream, 4); 1067 return 0; 1068 } 1069 1070 static struct dvb_usb_device_properties mxl111sf_props_dvbt = { 1071 .driver_name = KBUILD_MODNAME, 1072 .owner = THIS_MODULE, 1073 .adapter_nr = adapter_nr, 1074 .size_of_priv = sizeof(struct mxl111sf_state), 1075 1076 .generic_bulk_ctrl_endpoint = 0x02, 1077 .generic_bulk_ctrl_endpoint_response = 0x81, 1078 1079 .i2c_algo = &mxl111sf_i2c_algo, 1080 .frontend_attach = mxl111sf_frontend_attach_dvbt, 1081 .tuner_attach = mxl111sf_attach_tuner, 1082 .init = mxl111sf_init, 1083 .streaming_ctrl = mxl111sf_ep4_streaming_ctrl, 1084 .get_stream_config = mxl111sf_get_stream_config_dvbt, 1085 1086 .num_adapters = 1, 1087 .adapter = { 1088 { 1089 .stream = DVB_USB_STREAM_ISOC(6, 5, 24, 3072, 1), 1090 } 1091 } 1092 }; 1093 1094 /* atsc lgdt3305 1095 * bulk EP6/BULK/5/8192 1096 * isoc EP6/ISOC/5/24/3072 1097 */ 1098 static int mxl111sf_get_stream_config_atsc(struct dvb_frontend *fe, 1099 u8 *ts_type, struct usb_data_stream_properties *stream) 1100 { 1101 pr_debug("%s: fe=%d\n", __func__, fe->id); 1102 1103 *ts_type = DVB_USB_FE_TS_TYPE_188; 1104 if (dvb_usb_mxl111sf_isoc) 1105 mxl111sf_stream_config_isoc(stream, 6, 24, 3072); 1106 else 1107 mxl111sf_stream_config_bulk(stream, 6); 1108 return 0; 1109 } 1110 1111 static struct dvb_usb_device_properties mxl111sf_props_atsc = { 1112 .driver_name = KBUILD_MODNAME, 1113 .owner = THIS_MODULE, 1114 .adapter_nr = adapter_nr, 1115 .size_of_priv = sizeof(struct mxl111sf_state), 1116 1117 .generic_bulk_ctrl_endpoint = 0x02, 1118 .generic_bulk_ctrl_endpoint_response = 0x81, 1119 1120 .i2c_algo = &mxl111sf_i2c_algo, 1121 .frontend_attach = mxl111sf_frontend_attach_atsc, 1122 .tuner_attach = mxl111sf_attach_tuner, 1123 .init = mxl111sf_init, 1124 .streaming_ctrl = mxl111sf_ep6_streaming_ctrl, 1125 .get_stream_config = mxl111sf_get_stream_config_atsc, 1126 1127 .num_adapters = 1, 1128 .adapter = { 1129 { 1130 .stream = DVB_USB_STREAM_ISOC(6, 5, 24, 3072, 1), 1131 } 1132 } 1133 }; 1134 1135 /* mh lg2160 1136 * bulk EP5/BULK/5/8192/RAW 1137 * isoc EP5/ISOC/5/96/200/RAW 1138 */ 1139 static int mxl111sf_get_stream_config_mh(struct dvb_frontend *fe, 1140 u8 *ts_type, struct usb_data_stream_properties *stream) 1141 { 1142 pr_debug("%s: fe=%d\n", __func__, fe->id); 1143 1144 *ts_type = DVB_USB_FE_TS_TYPE_RAW; 1145 if (dvb_usb_mxl111sf_isoc) 1146 mxl111sf_stream_config_isoc(stream, 5, 96, 200); 1147 else 1148 mxl111sf_stream_config_bulk(stream, 5); 1149 return 0; 1150 } 1151 1152 static struct dvb_usb_device_properties mxl111sf_props_mh = { 1153 .driver_name = KBUILD_MODNAME, 1154 .owner = THIS_MODULE, 1155 .adapter_nr = adapter_nr, 1156 .size_of_priv = sizeof(struct mxl111sf_state), 1157 1158 .generic_bulk_ctrl_endpoint = 0x02, 1159 .generic_bulk_ctrl_endpoint_response = 0x81, 1160 1161 .i2c_algo = &mxl111sf_i2c_algo, 1162 .frontend_attach = mxl111sf_frontend_attach_mh, 1163 .tuner_attach = mxl111sf_attach_tuner, 1164 .init = mxl111sf_init, 1165 .streaming_ctrl = mxl111sf_ep5_streaming_ctrl, 1166 .get_stream_config = mxl111sf_get_stream_config_mh, 1167 1168 .num_adapters = 1, 1169 .adapter = { 1170 { 1171 .stream = DVB_USB_STREAM_ISOC(6, 5, 24, 3072, 1), 1172 } 1173 } 1174 }; 1175 1176 /* atsc mh lgdt3305 mxl111sf lg2160 1177 * bulk EP6/BULK/5/8192 EP4/BULK/5/8192 EP5/BULK/5/8192/RAW 1178 * isoc EP6/ISOC/5/24/3072 EP4/ISOC/5/96/564 EP5/ISOC/5/96/200/RAW 1179 */ 1180 static int mxl111sf_get_stream_config_atsc_mh(struct dvb_frontend *fe, 1181 u8 *ts_type, struct usb_data_stream_properties *stream) 1182 { 1183 pr_debug("%s: fe=%d\n", __func__, fe->id); 1184 1185 if (fe->id == 0) { 1186 *ts_type = DVB_USB_FE_TS_TYPE_188; 1187 if (dvb_usb_mxl111sf_isoc) 1188 mxl111sf_stream_config_isoc(stream, 6, 24, 3072); 1189 else 1190 mxl111sf_stream_config_bulk(stream, 6); 1191 } else if (fe->id == 1) { 1192 *ts_type = DVB_USB_FE_TS_TYPE_188; 1193 if (dvb_usb_mxl111sf_isoc) 1194 mxl111sf_stream_config_isoc(stream, 4, 96, 564); 1195 else 1196 mxl111sf_stream_config_bulk(stream, 4); 1197 } else if (fe->id == 2) { 1198 *ts_type = DVB_USB_FE_TS_TYPE_RAW; 1199 if (dvb_usb_mxl111sf_isoc) 1200 mxl111sf_stream_config_isoc(stream, 5, 96, 200); 1201 else 1202 mxl111sf_stream_config_bulk(stream, 5); 1203 } 1204 return 0; 1205 } 1206 1207 static int mxl111sf_streaming_ctrl_atsc_mh(struct dvb_frontend *fe, int onoff) 1208 { 1209 pr_debug("%s: fe=%d onoff=%d\n", __func__, fe->id, onoff); 1210 1211 if (fe->id == 0) 1212 return mxl111sf_ep6_streaming_ctrl(fe, onoff); 1213 else if (fe->id == 1) 1214 return mxl111sf_ep4_streaming_ctrl(fe, onoff); 1215 else if (fe->id == 2) 1216 return mxl111sf_ep5_streaming_ctrl(fe, onoff); 1217 return 0; 1218 } 1219 1220 static struct dvb_usb_device_properties mxl111sf_props_atsc_mh = { 1221 .driver_name = KBUILD_MODNAME, 1222 .owner = THIS_MODULE, 1223 .adapter_nr = adapter_nr, 1224 .size_of_priv = sizeof(struct mxl111sf_state), 1225 1226 .generic_bulk_ctrl_endpoint = 0x02, 1227 .generic_bulk_ctrl_endpoint_response = 0x81, 1228 1229 .i2c_algo = &mxl111sf_i2c_algo, 1230 .frontend_attach = mxl111sf_frontend_attach_atsc_mh, 1231 .tuner_attach = mxl111sf_attach_tuner, 1232 .init = mxl111sf_init, 1233 .streaming_ctrl = mxl111sf_streaming_ctrl_atsc_mh, 1234 .get_stream_config = mxl111sf_get_stream_config_atsc_mh, 1235 1236 .num_adapters = 1, 1237 .adapter = { 1238 { 1239 .stream = DVB_USB_STREAM_ISOC(6, 5, 24, 3072, 1), 1240 } 1241 } 1242 }; 1243 1244 /* mercury lgdt3305 mxl111sf lg2161 1245 * tp bulk EP6/BULK/5/8192 EP4/BULK/5/8192 EP6/BULK/5/8192/RAW 1246 * tp isoc EP6/ISOC/5/24/3072 EP4/ISOC/5/96/564 EP6/ISOC/5/24/3072/RAW 1247 * spi bulk EP6/BULK/5/8192 EP4/BULK/5/8192 EP5/BULK/5/8192/RAW 1248 * spi isoc EP6/ISOC/5/24/3072 EP4/ISOC/5/96/564 EP5/ISOC/5/96/200/RAW 1249 */ 1250 static int mxl111sf_get_stream_config_mercury(struct dvb_frontend *fe, 1251 u8 *ts_type, struct usb_data_stream_properties *stream) 1252 { 1253 pr_debug("%s: fe=%d\n", __func__, fe->id); 1254 1255 if (fe->id == 0) { 1256 *ts_type = DVB_USB_FE_TS_TYPE_188; 1257 if (dvb_usb_mxl111sf_isoc) 1258 mxl111sf_stream_config_isoc(stream, 6, 24, 3072); 1259 else 1260 mxl111sf_stream_config_bulk(stream, 6); 1261 } else if (fe->id == 1) { 1262 *ts_type = DVB_USB_FE_TS_TYPE_188; 1263 if (dvb_usb_mxl111sf_isoc) 1264 mxl111sf_stream_config_isoc(stream, 4, 96, 564); 1265 else 1266 mxl111sf_stream_config_bulk(stream, 4); 1267 } else if (fe->id == 2 && dvb_usb_mxl111sf_spi) { 1268 *ts_type = DVB_USB_FE_TS_TYPE_RAW; 1269 if (dvb_usb_mxl111sf_isoc) 1270 mxl111sf_stream_config_isoc(stream, 5, 96, 200); 1271 else 1272 mxl111sf_stream_config_bulk(stream, 5); 1273 } else if (fe->id == 2 && !dvb_usb_mxl111sf_spi) { 1274 *ts_type = DVB_USB_FE_TS_TYPE_RAW; 1275 if (dvb_usb_mxl111sf_isoc) 1276 mxl111sf_stream_config_isoc(stream, 6, 24, 3072); 1277 else 1278 mxl111sf_stream_config_bulk(stream, 6); 1279 } 1280 return 0; 1281 } 1282 1283 static int mxl111sf_streaming_ctrl_mercury(struct dvb_frontend *fe, int onoff) 1284 { 1285 pr_debug("%s: fe=%d onoff=%d\n", __func__, fe->id, onoff); 1286 1287 if (fe->id == 0) 1288 return mxl111sf_ep6_streaming_ctrl(fe, onoff); 1289 else if (fe->id == 1) 1290 return mxl111sf_ep4_streaming_ctrl(fe, onoff); 1291 else if (fe->id == 2 && dvb_usb_mxl111sf_spi) 1292 return mxl111sf_ep5_streaming_ctrl(fe, onoff); 1293 else if (fe->id == 2 && !dvb_usb_mxl111sf_spi) 1294 return mxl111sf_ep6_streaming_ctrl(fe, onoff); 1295 return 0; 1296 } 1297 1298 static struct dvb_usb_device_properties mxl111sf_props_mercury = { 1299 .driver_name = KBUILD_MODNAME, 1300 .owner = THIS_MODULE, 1301 .adapter_nr = adapter_nr, 1302 .size_of_priv = sizeof(struct mxl111sf_state), 1303 1304 .generic_bulk_ctrl_endpoint = 0x02, 1305 .generic_bulk_ctrl_endpoint_response = 0x81, 1306 1307 .i2c_algo = &mxl111sf_i2c_algo, 1308 .frontend_attach = mxl111sf_frontend_attach_mercury, 1309 .tuner_attach = mxl111sf_attach_tuner, 1310 .init = mxl111sf_init, 1311 .streaming_ctrl = mxl111sf_streaming_ctrl_mercury, 1312 .get_stream_config = mxl111sf_get_stream_config_mercury, 1313 1314 .num_adapters = 1, 1315 .adapter = { 1316 { 1317 .stream = DVB_USB_STREAM_ISOC(6, 5, 24, 3072, 1), 1318 } 1319 } 1320 }; 1321 1322 /* mercury mh mxl111sf lg2161 1323 * tp bulk EP4/BULK/5/8192 EP6/BULK/5/8192/RAW 1324 * tp isoc EP4/ISOC/5/96/564 EP6/ISOC/5/24/3072/RAW 1325 * spi bulk EP4/BULK/5/8192 EP5/BULK/5/8192/RAW 1326 * spi isoc EP4/ISOC/5/96/564 EP5/ISOC/5/96/200/RAW 1327 */ 1328 static int mxl111sf_get_stream_config_mercury_mh(struct dvb_frontend *fe, 1329 u8 *ts_type, struct usb_data_stream_properties *stream) 1330 { 1331 pr_debug("%s: fe=%d\n", __func__, fe->id); 1332 1333 if (fe->id == 0) { 1334 *ts_type = DVB_USB_FE_TS_TYPE_188; 1335 if (dvb_usb_mxl111sf_isoc) 1336 mxl111sf_stream_config_isoc(stream, 4, 96, 564); 1337 else 1338 mxl111sf_stream_config_bulk(stream, 4); 1339 } else if (fe->id == 1 && dvb_usb_mxl111sf_spi) { 1340 *ts_type = DVB_USB_FE_TS_TYPE_RAW; 1341 if (dvb_usb_mxl111sf_isoc) 1342 mxl111sf_stream_config_isoc(stream, 5, 96, 200); 1343 else 1344 mxl111sf_stream_config_bulk(stream, 5); 1345 } else if (fe->id == 1 && !dvb_usb_mxl111sf_spi) { 1346 *ts_type = DVB_USB_FE_TS_TYPE_RAW; 1347 if (dvb_usb_mxl111sf_isoc) 1348 mxl111sf_stream_config_isoc(stream, 6, 24, 3072); 1349 else 1350 mxl111sf_stream_config_bulk(stream, 6); 1351 } 1352 return 0; 1353 } 1354 1355 static int mxl111sf_streaming_ctrl_mercury_mh(struct dvb_frontend *fe, int onoff) 1356 { 1357 pr_debug("%s: fe=%d onoff=%d\n", __func__, fe->id, onoff); 1358 1359 if (fe->id == 0) 1360 return mxl111sf_ep4_streaming_ctrl(fe, onoff); 1361 else if (fe->id == 1 && dvb_usb_mxl111sf_spi) 1362 return mxl111sf_ep5_streaming_ctrl(fe, onoff); 1363 else if (fe->id == 1 && !dvb_usb_mxl111sf_spi) 1364 return mxl111sf_ep6_streaming_ctrl(fe, onoff); 1365 return 0; 1366 } 1367 1368 static struct dvb_usb_device_properties mxl111sf_props_mercury_mh = { 1369 .driver_name = KBUILD_MODNAME, 1370 .owner = THIS_MODULE, 1371 .adapter_nr = adapter_nr, 1372 .size_of_priv = sizeof(struct mxl111sf_state), 1373 1374 .generic_bulk_ctrl_endpoint = 0x02, 1375 .generic_bulk_ctrl_endpoint_response = 0x81, 1376 1377 .i2c_algo = &mxl111sf_i2c_algo, 1378 .frontend_attach = mxl111sf_frontend_attach_mercury_mh, 1379 .tuner_attach = mxl111sf_attach_tuner, 1380 .init = mxl111sf_init, 1381 .streaming_ctrl = mxl111sf_streaming_ctrl_mercury_mh, 1382 .get_stream_config = mxl111sf_get_stream_config_mercury_mh, 1383 1384 .num_adapters = 1, 1385 .adapter = { 1386 { 1387 .stream = DVB_USB_STREAM_ISOC(6, 5, 24, 3072, 1), 1388 } 1389 } 1390 }; 1391 1392 static const struct usb_device_id mxl111sf_id_table[] = { 1393 { DVB_USB_DEVICE(USB_VID_HAUPPAUGE, 0xc600, &mxl111sf_props_atsc_mh, "Hauppauge 126xxx ATSC+", NULL) }, 1394 { DVB_USB_DEVICE(USB_VID_HAUPPAUGE, 0xc601, &mxl111sf_props_atsc, "Hauppauge 126xxx ATSC", NULL) }, 1395 { DVB_USB_DEVICE(USB_VID_HAUPPAUGE, 0xc602, &mxl111sf_props_mh, "HCW 126xxx", NULL) }, 1396 { DVB_USB_DEVICE(USB_VID_HAUPPAUGE, 0xc603, &mxl111sf_props_atsc_mh, "Hauppauge 126xxx ATSC+", NULL) }, 1397 { DVB_USB_DEVICE(USB_VID_HAUPPAUGE, 0xc604, &mxl111sf_props_dvbt, "Hauppauge 126xxx DVBT", NULL) }, 1398 { DVB_USB_DEVICE(USB_VID_HAUPPAUGE, 0xc609, &mxl111sf_props_atsc, "Hauppauge 126xxx ATSC", NULL) }, 1399 { DVB_USB_DEVICE(USB_VID_HAUPPAUGE, 0xc60a, &mxl111sf_props_mh, "HCW 126xxx", NULL) }, 1400 { DVB_USB_DEVICE(USB_VID_HAUPPAUGE, 0xc60b, &mxl111sf_props_atsc_mh, "Hauppauge 126xxx ATSC+", NULL) }, 1401 { DVB_USB_DEVICE(USB_VID_HAUPPAUGE, 0xc60c, &mxl111sf_props_dvbt, "Hauppauge 126xxx DVBT", NULL) }, 1402 { DVB_USB_DEVICE(USB_VID_HAUPPAUGE, 0xc653, &mxl111sf_props_atsc_mh, "Hauppauge 126xxx ATSC+", NULL) }, 1403 { DVB_USB_DEVICE(USB_VID_HAUPPAUGE, 0xc65b, &mxl111sf_props_atsc_mh, "Hauppauge 126xxx ATSC+", NULL) }, 1404 { DVB_USB_DEVICE(USB_VID_HAUPPAUGE, 0xb700, &mxl111sf_props_atsc_mh, "Hauppauge 117xxx ATSC+", NULL) }, 1405 { DVB_USB_DEVICE(USB_VID_HAUPPAUGE, 0xb701, &mxl111sf_props_atsc, "Hauppauge 126xxx ATSC", NULL) }, 1406 { DVB_USB_DEVICE(USB_VID_HAUPPAUGE, 0xb702, &mxl111sf_props_mh, "HCW 117xxx", NULL) }, 1407 { DVB_USB_DEVICE(USB_VID_HAUPPAUGE, 0xb703, &mxl111sf_props_atsc_mh, "Hauppauge 117xxx ATSC+", NULL) }, 1408 { DVB_USB_DEVICE(USB_VID_HAUPPAUGE, 0xb704, &mxl111sf_props_dvbt, "Hauppauge 117xxx DVBT", NULL) }, 1409 { DVB_USB_DEVICE(USB_VID_HAUPPAUGE, 0xb753, &mxl111sf_props_atsc_mh, "Hauppauge 117xxx ATSC+", NULL) }, 1410 { DVB_USB_DEVICE(USB_VID_HAUPPAUGE, 0xb763, &mxl111sf_props_atsc_mh, "Hauppauge 117xxx ATSC+", NULL) }, 1411 { DVB_USB_DEVICE(USB_VID_HAUPPAUGE, 0xb764, &mxl111sf_props_dvbt, "Hauppauge 117xxx DVBT", NULL) }, 1412 { DVB_USB_DEVICE(USB_VID_HAUPPAUGE, 0xd853, &mxl111sf_props_mercury, "Hauppauge Mercury", NULL) }, 1413 { DVB_USB_DEVICE(USB_VID_HAUPPAUGE, 0xd854, &mxl111sf_props_dvbt, "Hauppauge 138xxx DVBT", NULL) }, 1414 { DVB_USB_DEVICE(USB_VID_HAUPPAUGE, 0xd863, &mxl111sf_props_mercury, "Hauppauge Mercury", NULL) }, 1415 { DVB_USB_DEVICE(USB_VID_HAUPPAUGE, 0xd864, &mxl111sf_props_dvbt, "Hauppauge 138xxx DVBT", NULL) }, 1416 { DVB_USB_DEVICE(USB_VID_HAUPPAUGE, 0xd8d3, &mxl111sf_props_mercury, "Hauppauge Mercury", NULL) }, 1417 { DVB_USB_DEVICE(USB_VID_HAUPPAUGE, 0xd8d4, &mxl111sf_props_dvbt, "Hauppauge 138xxx DVBT", NULL) }, 1418 { DVB_USB_DEVICE(USB_VID_HAUPPAUGE, 0xd8e3, &mxl111sf_props_mercury, "Hauppauge Mercury", NULL) }, 1419 { DVB_USB_DEVICE(USB_VID_HAUPPAUGE, 0xd8e4, &mxl111sf_props_dvbt, "Hauppauge 138xxx DVBT", NULL) }, 1420 { DVB_USB_DEVICE(USB_VID_HAUPPAUGE, 0xd8ff, &mxl111sf_props_mercury, "Hauppauge Mercury", NULL) }, 1421 { DVB_USB_DEVICE(USB_VID_HAUPPAUGE, 0xc612, &mxl111sf_props_mercury_mh, "Hauppauge 126xxx", NULL) }, 1422 { DVB_USB_DEVICE(USB_VID_HAUPPAUGE, 0xc613, &mxl111sf_props_mercury, "Hauppauge WinTV-Aero-M", NULL) }, 1423 { DVB_USB_DEVICE(USB_VID_HAUPPAUGE, 0xc61a, &mxl111sf_props_mercury_mh, "Hauppauge 126xxx", NULL) }, 1424 { DVB_USB_DEVICE(USB_VID_HAUPPAUGE, 0xc61b, &mxl111sf_props_mercury, "Hauppauge WinTV-Aero-M", NULL) }, 1425 { DVB_USB_DEVICE(USB_VID_HAUPPAUGE, 0xb757, &mxl111sf_props_atsc_mh, "Hauppauge 117xxx ATSC+", NULL) }, 1426 { DVB_USB_DEVICE(USB_VID_HAUPPAUGE, 0xb767, &mxl111sf_props_atsc_mh, "Hauppauge 117xxx ATSC+", NULL) }, 1427 { } 1428 }; 1429 MODULE_DEVICE_TABLE(usb, mxl111sf_id_table); 1430 1431 static struct usb_driver mxl111sf_usb_driver = { 1432 .name = KBUILD_MODNAME, 1433 .id_table = mxl111sf_id_table, 1434 .probe = dvb_usbv2_probe, 1435 .disconnect = dvb_usbv2_disconnect, 1436 .suspend = dvb_usbv2_suspend, 1437 .resume = dvb_usbv2_resume, 1438 .no_dynamic_id = 1, 1439 .soft_unbind = 1, 1440 }; 1441 1442 module_usb_driver(mxl111sf_usb_driver); 1443 1444 MODULE_AUTHOR("Michael Krufky <mkrufky@linuxtv.org>"); 1445 MODULE_DESCRIPTION("Driver for MaxLinear MxL111SF"); 1446 MODULE_VERSION("1.0"); 1447 MODULE_LICENSE("GPL"); 1448