File Index
Files and directories
Sign in
FILE

mxl111sf.c

File preview with syntax highlighting.

linux-6.19.14/drivers/media/usb/dvb-usb-v2/mxl111sf.c C
   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 const 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 = &reg },
 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");
~/ Read-only file preview.