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