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