mxl111sf.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864
  1. /*
  2. * Copyright (C) 2010 Michael Krufky (mkrufky@kernellabs.com)
  3. *
  4. * This program is free software; you can redistribute it and/or modify it
  5. * under the terms of the GNU General Public License as published by the Free
  6. * Software Foundation, version 2.
  7. *
  8. * see Documentation/dvb/README.dvb-usb for more information
  9. */
  10. #include <linux/vmalloc.h>
  11. #include <linux/i2c.h>
  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. #include "mxl111sf-tuner.h"
  18. #include "lgdt3305.h"
  19. int dvb_usb_mxl111sf_debug;
  20. module_param_named(debug, dvb_usb_mxl111sf_debug, int, 0644);
  21. MODULE_PARM_DESC(debug, "set debugging level "
  22. "(1=info, 2=xfer, 4=i2c, 8=reg, 16=adv (or-able)).");
  23. int dvb_usb_mxl111sf_isoc;
  24. module_param_named(isoc, dvb_usb_mxl111sf_isoc, int, 0644);
  25. MODULE_PARM_DESC(isoc, "enable usb isoc xfer (0=bulk, 1=isoc).");
  26. #define ANT_PATH_AUTO 0
  27. #define ANT_PATH_EXTERNAL 1
  28. #define ANT_PATH_INTERNAL 2
  29. int dvb_usb_mxl111sf_rfswitch =
  30. #if 0
  31. ANT_PATH_AUTO;
  32. #else
  33. ANT_PATH_EXTERNAL;
  34. #endif
  35. module_param_named(rfswitch, dvb_usb_mxl111sf_rfswitch, int, 0644);
  36. MODULE_PARM_DESC(rfswitch, "force rf switch position (0=auto, 1=ext, 2=int).");
  37. DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
  38. #define deb_info(args...) dprintk(dvb_usb_mxl111sf_debug, 0x13, args)
  39. #define deb_reg(args...) dprintk(dvb_usb_mxl111sf_debug, 0x08, args)
  40. #define deb_adv(args...) dprintk(dvb_usb_mxl111sf_debug, MXL_ADV_DBG, args)
  41. int mxl111sf_ctrl_msg(struct dvb_usb_device *d,
  42. u8 cmd, u8 *wbuf, int wlen, u8 *rbuf, int rlen)
  43. {
  44. int wo = (rbuf == NULL || rlen == 0); /* write-only */
  45. int ret;
  46. u8 sndbuf[1+wlen];
  47. deb_adv("%s(wlen = %d, rlen = %d)\n", __func__, wlen, rlen);
  48. memset(sndbuf, 0, 1+wlen);
  49. sndbuf[0] = cmd;
  50. memcpy(&sndbuf[1], wbuf, wlen);
  51. ret = (wo) ? dvb_usb_generic_write(d, sndbuf, 1+wlen) :
  52. dvb_usb_generic_rw(d, sndbuf, 1+wlen, rbuf, rlen, 0);
  53. mxl_fail(ret);
  54. return ret;
  55. }
  56. /* ------------------------------------------------------------------------ */
  57. #define MXL_CMD_REG_READ 0xaa
  58. #define MXL_CMD_REG_WRITE 0x55
  59. int mxl111sf_read_reg(struct mxl111sf_state *state, u8 addr, u8 *data)
  60. {
  61. u8 buf[2];
  62. int ret;
  63. ret = mxl111sf_ctrl_msg(state->d, MXL_CMD_REG_READ, &addr, 1, buf, 2);
  64. if (mxl_fail(ret)) {
  65. mxl_debug("error reading reg: 0x%02x", addr);
  66. goto fail;
  67. }
  68. if (buf[0] == addr)
  69. *data = buf[1];
  70. else {
  71. err("invalid response reading reg: 0x%02x != 0x%02x, 0x%02x",
  72. addr, buf[0], buf[1]);
  73. ret = -EINVAL;
  74. }
  75. deb_reg("R: (0x%02x, 0x%02x)\n", addr, *data);
  76. fail:
  77. return ret;
  78. }
  79. int mxl111sf_write_reg(struct mxl111sf_state *state, u8 addr, u8 data)
  80. {
  81. u8 buf[] = { addr, data };
  82. int ret;
  83. deb_reg("W: (0x%02x, 0x%02x)\n", addr, data);
  84. ret = mxl111sf_ctrl_msg(state->d, MXL_CMD_REG_WRITE, buf, 2, NULL, 0);
  85. if (mxl_fail(ret))
  86. err("error writing reg: 0x%02x, val: 0x%02x", addr, data);
  87. return ret;
  88. }
  89. /* ------------------------------------------------------------------------ */
  90. int mxl111sf_write_reg_mask(struct mxl111sf_state *state,
  91. u8 addr, u8 mask, u8 data)
  92. {
  93. int ret;
  94. u8 val;
  95. if (mask != 0xff) {
  96. ret = mxl111sf_read_reg(state, addr, &val);
  97. #if 1
  98. /* dont know why this usually errors out on the first try */
  99. if (mxl_fail(ret))
  100. err("error writing addr: 0x%02x, mask: 0x%02x, "
  101. "data: 0x%02x, retrying...", addr, mask, data);
  102. ret = mxl111sf_read_reg(state, addr, &val);
  103. #endif
  104. if (mxl_fail(ret))
  105. goto fail;
  106. }
  107. val &= ~mask;
  108. val |= data;
  109. ret = mxl111sf_write_reg(state, addr, val);
  110. mxl_fail(ret);
  111. fail:
  112. return ret;
  113. }
  114. /* ------------------------------------------------------------------------ */
  115. int mxl111sf_ctrl_program_regs(struct mxl111sf_state *state,
  116. struct mxl111sf_reg_ctrl_info *ctrl_reg_info)
  117. {
  118. int i, ret = 0;
  119. for (i = 0; ctrl_reg_info[i].addr |
  120. ctrl_reg_info[i].mask |
  121. ctrl_reg_info[i].data; i++) {
  122. ret = mxl111sf_write_reg_mask(state,
  123. ctrl_reg_info[i].addr,
  124. ctrl_reg_info[i].mask,
  125. ctrl_reg_info[i].data);
  126. if (mxl_fail(ret)) {
  127. err("failed on reg #%d (0x%02x)", i,
  128. ctrl_reg_info[i].addr);
  129. break;
  130. }
  131. }
  132. return ret;
  133. }
  134. /* ------------------------------------------------------------------------ */
  135. static int mxl1x1sf_get_chip_info(struct mxl111sf_state *state)
  136. {
  137. int ret;
  138. u8 id, ver;
  139. char *mxl_chip, *mxl_rev;
  140. if ((state->chip_id) && (state->chip_ver))
  141. return 0;
  142. ret = mxl111sf_read_reg(state, CHIP_ID_REG, &id);
  143. if (mxl_fail(ret))
  144. goto fail;
  145. state->chip_id = id;
  146. ret = mxl111sf_read_reg(state, TOP_CHIP_REV_ID_REG, &ver);
  147. if (mxl_fail(ret))
  148. goto fail;
  149. state->chip_ver = ver;
  150. switch (id) {
  151. case 0x61:
  152. mxl_chip = "MxL101SF";
  153. break;
  154. case 0x63:
  155. mxl_chip = "MxL111SF";
  156. break;
  157. default:
  158. mxl_chip = "UNKNOWN MxL1X1";
  159. break;
  160. }
  161. switch (ver) {
  162. case 0x36:
  163. state->chip_rev = MXL111SF_V6;
  164. mxl_rev = "v6";
  165. break;
  166. case 0x08:
  167. state->chip_rev = MXL111SF_V8_100;
  168. mxl_rev = "v8_100";
  169. break;
  170. case 0x18:
  171. state->chip_rev = MXL111SF_V8_200;
  172. mxl_rev = "v8_200";
  173. break;
  174. default:
  175. state->chip_rev = 0;
  176. mxl_rev = "UNKNOWN REVISION";
  177. break;
  178. }
  179. info("%s detected, %s (0x%x)", mxl_chip, mxl_rev, ver);
  180. fail:
  181. return ret;
  182. }
  183. #define get_chip_info(state) \
  184. ({ \
  185. int ___ret; \
  186. ___ret = mxl1x1sf_get_chip_info(state); \
  187. if (mxl_fail(___ret)) { \
  188. mxl_debug("failed to get chip info" \
  189. " on first probe attempt"); \
  190. ___ret = mxl1x1sf_get_chip_info(state); \
  191. if (mxl_fail(___ret)) \
  192. err("failed to get chip info during probe"); \
  193. else \
  194. mxl_debug("probe needed a retry " \
  195. "in order to succeed."); \
  196. } \
  197. ___ret; \
  198. })
  199. /* ------------------------------------------------------------------------ */
  200. static int mxl111sf_power_ctrl(struct dvb_usb_device *d, int onoff)
  201. {
  202. /* power control depends on which adapter is being woken:
  203. * save this for init, instead, via mxl111sf_adap_fe_init */
  204. return 0;
  205. }
  206. static int mxl111sf_adap_fe_init(struct dvb_frontend *fe)
  207. {
  208. struct dvb_usb_adapter *adap = fe->dvb->priv;
  209. struct dvb_usb_device *d = adap->dev;
  210. struct mxl111sf_state *state = d->priv;
  211. struct mxl111sf_adap_state *adap_state = adap->fe_adap[fe->id].priv;
  212. int err;
  213. /* exit if we didnt initialize the driver yet */
  214. if (!state->chip_id) {
  215. mxl_debug("driver not yet initialized, exit.");
  216. goto fail;
  217. }
  218. deb_info("%s()\n", __func__);
  219. mutex_lock(&state->fe_lock);
  220. state->alt_mode = adap_state->alt_mode;
  221. if (usb_set_interface(adap->dev->udev, 0, state->alt_mode) < 0)
  222. err("set interface failed");
  223. err = mxl1x1sf_soft_reset(state);
  224. mxl_fail(err);
  225. err = mxl111sf_init_tuner_demod(state);
  226. mxl_fail(err);
  227. err = mxl1x1sf_set_device_mode(state, adap_state->device_mode);
  228. mxl_fail(err);
  229. mxl111sf_enable_usb_output(state);
  230. mxl_fail(err);
  231. mxl1x1sf_top_master_ctrl(state, 1);
  232. mxl_fail(err);
  233. if ((MXL111SF_GPIO_MOD_DVBT != adap_state->gpio_mode) &&
  234. (state->chip_rev > MXL111SF_V6)) {
  235. mxl111sf_config_pin_mux_modes(state,
  236. PIN_MUX_TS_SPI_IN_MODE_1);
  237. mxl_fail(err);
  238. }
  239. err = mxl111sf_init_port_expander(state);
  240. if (!mxl_fail(err)) {
  241. state->gpio_mode = adap_state->gpio_mode;
  242. err = mxl111sf_gpio_mode_switch(state, state->gpio_mode);
  243. mxl_fail(err);
  244. #if 0
  245. err = fe->ops.init(fe);
  246. #endif
  247. msleep(100); /* add short delay after enabling
  248. * the demod before touching it */
  249. }
  250. return (adap_state->fe_init) ? adap_state->fe_init(fe) : 0;
  251. fail:
  252. return -ENODEV;
  253. }
  254. static int mxl111sf_adap_fe_sleep(struct dvb_frontend *fe)
  255. {
  256. struct dvb_usb_adapter *adap = fe->dvb->priv;
  257. struct dvb_usb_device *d = adap->dev;
  258. struct mxl111sf_state *state = d->priv;
  259. struct mxl111sf_adap_state *adap_state = adap->fe_adap[fe->id].priv;
  260. int err;
  261. /* exit if we didnt initialize the driver yet */
  262. if (!state->chip_id) {
  263. mxl_debug("driver not yet initialized, exit.");
  264. goto fail;
  265. }
  266. deb_info("%s()\n", __func__);
  267. err = (adap_state->fe_sleep) ? adap_state->fe_sleep(fe) : 0;
  268. mutex_unlock(&state->fe_lock);
  269. return err;
  270. fail:
  271. return -ENODEV;
  272. }
  273. static int mxl111sf_ep6_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
  274. {
  275. struct dvb_usb_device *d = adap->dev;
  276. struct mxl111sf_state *state = d->priv;
  277. struct mxl111sf_adap_state *adap_state = adap->fe_adap[adap->active_fe].priv;
  278. int ret = 0;
  279. u8 tmp;
  280. deb_info("%s(%d)\n", __func__, onoff);
  281. if (onoff) {
  282. ret = mxl111sf_enable_usb_output(state);
  283. mxl_fail(ret);
  284. ret = mxl111sf_config_mpeg_in(state, 1, 1,
  285. adap_state->ep6_clockphase,
  286. 0, 0);
  287. mxl_fail(ret);
  288. } else {
  289. ret = mxl111sf_disable_656_port(state);
  290. mxl_fail(ret);
  291. }
  292. mxl111sf_read_reg(state, 0x12, &tmp);
  293. tmp &= ~0x04;
  294. mxl111sf_write_reg(state, 0x12, tmp);
  295. return ret;
  296. }
  297. /* ------------------------------------------------------------------------ */
  298. static struct lgdt3305_config hauppauge_lgdt3305_config = {
  299. .i2c_addr = 0xb2 >> 1,
  300. .mpeg_mode = LGDT3305_MPEG_SERIAL,
  301. .tpclk_edge = LGDT3305_TPCLK_RISING_EDGE,
  302. .tpvalid_polarity = LGDT3305_TP_VALID_HIGH,
  303. .deny_i2c_rptr = 1,
  304. .spectral_inversion = 0,
  305. .qam_if_khz = 6000,
  306. .vsb_if_khz = 6000,
  307. };
  308. static int mxl111sf_lgdt3305_frontend_attach(struct dvb_usb_adapter *adap)
  309. {
  310. struct dvb_usb_device *d = adap->dev;
  311. struct mxl111sf_state *state = d->priv;
  312. int fe_id = adap->num_frontends_initialized;
  313. struct mxl111sf_adap_state *adap_state = adap->fe_adap[fe_id].priv;
  314. int ret;
  315. deb_adv("%s()\n", __func__);
  316. /* save a pointer to the dvb_usb_device in device state */
  317. state->d = d;
  318. adap_state->alt_mode = (dvb_usb_mxl111sf_isoc) ? 2 : 1;
  319. state->alt_mode = adap_state->alt_mode;
  320. if (usb_set_interface(adap->dev->udev, 0, state->alt_mode) < 0)
  321. err("set interface failed");
  322. state->gpio_mode = MXL111SF_GPIO_MOD_ATSC;
  323. adap_state->gpio_mode = state->gpio_mode;
  324. adap_state->device_mode = MXL_TUNER_MODE;
  325. adap_state->ep6_clockphase = 1;
  326. ret = mxl1x1sf_soft_reset(state);
  327. if (mxl_fail(ret))
  328. goto fail;
  329. ret = mxl111sf_init_tuner_demod(state);
  330. if (mxl_fail(ret))
  331. goto fail;
  332. ret = mxl1x1sf_set_device_mode(state, adap_state->device_mode);
  333. if (mxl_fail(ret))
  334. goto fail;
  335. ret = mxl111sf_enable_usb_output(state);
  336. if (mxl_fail(ret))
  337. goto fail;
  338. ret = mxl1x1sf_top_master_ctrl(state, 1);
  339. if (mxl_fail(ret))
  340. goto fail;
  341. ret = mxl111sf_init_port_expander(state);
  342. if (mxl_fail(ret))
  343. goto fail;
  344. ret = mxl111sf_gpio_mode_switch(state, state->gpio_mode);
  345. if (mxl_fail(ret))
  346. goto fail;
  347. adap->fe_adap[fe_id].fe = dvb_attach(lgdt3305_attach,
  348. &hauppauge_lgdt3305_config,
  349. &adap->dev->i2c_adap);
  350. if (adap->fe_adap[fe_id].fe) {
  351. adap_state->fe_init = adap->fe_adap[fe_id].fe->ops.init;
  352. adap->fe_adap[fe_id].fe->ops.init = mxl111sf_adap_fe_init;
  353. adap_state->fe_sleep = adap->fe_adap[fe_id].fe->ops.sleep;
  354. adap->fe_adap[fe_id].fe->ops.sleep = mxl111sf_adap_fe_sleep;
  355. return 0;
  356. }
  357. ret = -EIO;
  358. fail:
  359. return ret;
  360. }
  361. static inline int mxl111sf_set_ant_path(struct mxl111sf_state *state,
  362. int antpath)
  363. {
  364. return mxl111sf_idac_config(state, 1, 1,
  365. (antpath == ANT_PATH_INTERNAL) ?
  366. 0x3f : 0x00, 0);
  367. }
  368. #define DbgAntHunt(x, pwr0, pwr1, pwr2, pwr3) \
  369. err("%s(%d) FINAL input set to %s rxPwr:%d|%d|%d|%d\n", \
  370. __func__, __LINE__, \
  371. (ANT_PATH_EXTERNAL == x) ? "EXTERNAL" : "INTERNAL", \
  372. pwr0, pwr1, pwr2, pwr3)
  373. #define ANT_HUNT_SLEEP 90
  374. #define ANT_EXT_TWEAK 0
  375. static int mxl111sf_ant_hunt(struct dvb_frontend *fe)
  376. {
  377. struct dvb_usb_adapter *adap = fe->dvb->priv;
  378. struct dvb_usb_device *d = adap->dev;
  379. struct mxl111sf_state *state = d->priv;
  380. int antctrl = dvb_usb_mxl111sf_rfswitch;
  381. u16 rxPwrA, rxPwr0, rxPwr1, rxPwr2;
  382. /* FIXME: must force EXTERNAL for QAM - done elsewhere */
  383. mxl111sf_set_ant_path(state, antctrl == ANT_PATH_AUTO ?
  384. ANT_PATH_EXTERNAL : antctrl);
  385. if (antctrl == ANT_PATH_AUTO) {
  386. #if 0
  387. msleep(ANT_HUNT_SLEEP);
  388. #endif
  389. fe->ops.tuner_ops.get_rf_strength(fe, &rxPwrA);
  390. mxl111sf_set_ant_path(state, ANT_PATH_EXTERNAL);
  391. msleep(ANT_HUNT_SLEEP);
  392. fe->ops.tuner_ops.get_rf_strength(fe, &rxPwr0);
  393. mxl111sf_set_ant_path(state, ANT_PATH_EXTERNAL);
  394. msleep(ANT_HUNT_SLEEP);
  395. fe->ops.tuner_ops.get_rf_strength(fe, &rxPwr1);
  396. mxl111sf_set_ant_path(state, ANT_PATH_INTERNAL);
  397. msleep(ANT_HUNT_SLEEP);
  398. fe->ops.tuner_ops.get_rf_strength(fe, &rxPwr2);
  399. if (rxPwr1+ANT_EXT_TWEAK >= rxPwr2) {
  400. /* return with EXTERNAL enabled */
  401. mxl111sf_set_ant_path(state, ANT_PATH_EXTERNAL);
  402. DbgAntHunt(ANT_PATH_EXTERNAL, rxPwrA,
  403. rxPwr0, rxPwr1, rxPwr2);
  404. } else {
  405. /* return with INTERNAL enabled */
  406. DbgAntHunt(ANT_PATH_INTERNAL, rxPwrA,
  407. rxPwr0, rxPwr1, rxPwr2);
  408. }
  409. }
  410. return 0;
  411. }
  412. static struct mxl111sf_tuner_config mxl_tuner_config = {
  413. .if_freq = MXL_IF_6_0, /* applies to external IF output, only */
  414. .invert_spectrum = 0,
  415. .read_reg = mxl111sf_read_reg,
  416. .write_reg = mxl111sf_write_reg,
  417. .program_regs = mxl111sf_ctrl_program_regs,
  418. .top_master_ctrl = mxl1x1sf_top_master_ctrl,
  419. .ant_hunt = mxl111sf_ant_hunt,
  420. };
  421. static int mxl111sf_attach_tuner(struct dvb_usb_adapter *adap)
  422. {
  423. struct dvb_usb_device *d = adap->dev;
  424. struct mxl111sf_state *state = d->priv;
  425. int fe_id = adap->num_frontends_initialized;
  426. deb_adv("%s()\n", __func__);
  427. if (NULL != dvb_attach(mxl111sf_tuner_attach,
  428. adap->fe_adap[fe_id].fe, state,
  429. &mxl_tuner_config))
  430. return 0;
  431. return -EIO;
  432. }
  433. static int mxl111sf_fe_ioctl_override(struct dvb_frontend *fe,
  434. unsigned int cmd, void *parg,
  435. unsigned int stage)
  436. {
  437. int err = 0;
  438. switch (stage) {
  439. case DVB_FE_IOCTL_PRE:
  440. switch (cmd) {
  441. case FE_READ_SIGNAL_STRENGTH:
  442. err = fe->ops.tuner_ops.get_rf_strength(fe, parg);
  443. /* If no error occurs, prevent dvb-core from handling
  444. * this IOCTL, otherwise return the error */
  445. if (0 == err)
  446. err = 1;
  447. break;
  448. }
  449. break;
  450. case DVB_FE_IOCTL_POST:
  451. /* no post-ioctl handling required */
  452. break;
  453. }
  454. return err;
  455. };
  456. static u32 mxl111sf_i2c_func(struct i2c_adapter *adapter)
  457. {
  458. return I2C_FUNC_I2C;
  459. }
  460. struct i2c_algorithm mxl111sf_i2c_algo = {
  461. .master_xfer = mxl111sf_i2c_xfer,
  462. .functionality = mxl111sf_i2c_func,
  463. #ifdef NEED_ALGO_CONTROL
  464. .algo_control = dummy_algo_control,
  465. #endif
  466. };
  467. /* DVB USB Driver stuff */
  468. static struct dvb_usb_device_properties mxl111sf_atsc_bulk_properties;
  469. static struct dvb_usb_device_properties mxl111sf_atsc_isoc_properties;
  470. static int mxl111sf_probe(struct usb_interface *intf,
  471. const struct usb_device_id *id)
  472. {
  473. struct dvb_usb_device *d = NULL;
  474. deb_adv("%s()\n", __func__);
  475. if (((dvb_usb_mxl111sf_isoc) &&
  476. (0 == dvb_usb_device_init(intf,
  477. &mxl111sf_atsc_isoc_properties,
  478. THIS_MODULE, &d, adapter_nr))) ||
  479. 0 == dvb_usb_device_init(intf,
  480. &mxl111sf_atsc_bulk_properties,
  481. THIS_MODULE, &d, adapter_nr) || 0) {
  482. struct mxl111sf_state *state = d->priv;
  483. static u8 eeprom[256];
  484. struct i2c_client c;
  485. int ret;
  486. ret = get_chip_info(state);
  487. if (mxl_fail(ret))
  488. err("failed to get chip info during probe");
  489. mutex_init(&state->fe_lock);
  490. if (state->chip_rev > MXL111SF_V6)
  491. mxl111sf_config_pin_mux_modes(state,
  492. PIN_MUX_TS_SPI_IN_MODE_1);
  493. c.adapter = &d->i2c_adap;
  494. c.addr = 0xa0 >> 1;
  495. ret = tveeprom_read(&c, eeprom, sizeof(eeprom));
  496. if (mxl_fail(ret))
  497. return 0;
  498. tveeprom_hauppauge_analog(&c, &state->tv,
  499. (0x84 == eeprom[0xa0]) ?
  500. eeprom + 0xa0 : eeprom + 0x80);
  501. #if 0
  502. switch (state->tv.model) {
  503. case 117001:
  504. case 126001:
  505. case 138001:
  506. break;
  507. default:
  508. printk(KERN_WARNING "%s: warning: "
  509. "unknown hauppauge model #%d\n",
  510. __func__, state->tv.model);
  511. }
  512. #endif
  513. return 0;
  514. }
  515. err("Your device is not yet supported by this driver. "
  516. "See kernellabs.com for more info");
  517. return -EINVAL;
  518. }
  519. static struct usb_device_id mxl111sf_table[] = {
  520. /* 0 */ { USB_DEVICE(USB_VID_HAUPPAUGE, 0xc600) }, /* ATSC+ IR */
  521. { USB_DEVICE(USB_VID_HAUPPAUGE, 0xc601) }, /* ATSC */
  522. { USB_DEVICE(USB_VID_HAUPPAUGE, 0xc602) }, /* + */
  523. { USB_DEVICE(USB_VID_HAUPPAUGE, 0xc603) }, /* ATSC+ */
  524. { USB_DEVICE(USB_VID_HAUPPAUGE, 0xc604) }, /* DVBT */
  525. /* 5 */ { USB_DEVICE(USB_VID_HAUPPAUGE, 0xc609) }, /* ATSC IR */
  526. { USB_DEVICE(USB_VID_HAUPPAUGE, 0xc60a) }, /* + IR */
  527. { USB_DEVICE(USB_VID_HAUPPAUGE, 0xc60b) }, /* ATSC+ IR */
  528. { USB_DEVICE(USB_VID_HAUPPAUGE, 0xc60c) }, /* DVBT IR */
  529. { USB_DEVICE(USB_VID_HAUPPAUGE, 0xc653) }, /* ATSC+ */
  530. /*10 */ { USB_DEVICE(USB_VID_HAUPPAUGE, 0xc65b) }, /* ATSC+ IR */
  531. { USB_DEVICE(USB_VID_HAUPPAUGE, 0xb700) }, /* ATSC+ sw */
  532. { USB_DEVICE(USB_VID_HAUPPAUGE, 0xb701) }, /* ATSC sw */
  533. { USB_DEVICE(USB_VID_HAUPPAUGE, 0xb702) }, /* + sw */
  534. { USB_DEVICE(USB_VID_HAUPPAUGE, 0xb703) }, /* ATSC+ sw */
  535. /*15 */ { USB_DEVICE(USB_VID_HAUPPAUGE, 0xb704) }, /* DVBT sw */
  536. { USB_DEVICE(USB_VID_HAUPPAUGE, 0xb753) }, /* ATSC+ sw */
  537. { USB_DEVICE(USB_VID_HAUPPAUGE, 0xb763) }, /* ATSC+ no */
  538. { USB_DEVICE(USB_VID_HAUPPAUGE, 0xb764) }, /* DVBT no */
  539. { USB_DEVICE(USB_VID_HAUPPAUGE, 0xd853) }, /* ATSC+ sw */
  540. /*20 */ { USB_DEVICE(USB_VID_HAUPPAUGE, 0xd854) }, /* DVBT sw */
  541. { USB_DEVICE(USB_VID_HAUPPAUGE, 0xd863) }, /* ATSC+ no */
  542. { USB_DEVICE(USB_VID_HAUPPAUGE, 0xd864) }, /* DVBT no */
  543. { USB_DEVICE(USB_VID_HAUPPAUGE, 0xd8d3) }, /* ATSC+ sw */
  544. { USB_DEVICE(USB_VID_HAUPPAUGE, 0xd8d4) }, /* DVBT sw */
  545. /*25 */ { USB_DEVICE(USB_VID_HAUPPAUGE, 0xd8e3) }, /* ATSC+ no */
  546. { USB_DEVICE(USB_VID_HAUPPAUGE, 0xd8e4) }, /* DVBT no */
  547. { USB_DEVICE(USB_VID_HAUPPAUGE, 0xd8ff) }, /* ATSC+ */
  548. { USB_DEVICE(USB_VID_HAUPPAUGE, 0xc612) }, /* + */
  549. { USB_DEVICE(USB_VID_HAUPPAUGE, 0xc613) }, /* ATSC+ */
  550. /*30 */ { USB_DEVICE(USB_VID_HAUPPAUGE, 0xc61a) }, /* + IR */
  551. { USB_DEVICE(USB_VID_HAUPPAUGE, 0xc61b) }, /* ATSC+ IR */
  552. { USB_DEVICE(USB_VID_HAUPPAUGE, 0xb757) }, /* ATSC+DVBT sw */
  553. { USB_DEVICE(USB_VID_HAUPPAUGE, 0xb767) }, /* ATSC+DVBT no */
  554. {} /* Terminating entry */
  555. };
  556. MODULE_DEVICE_TABLE(usb, mxl111sf_table);
  557. #define MXL111SF_EP6_BULK_STREAMING_CONFIG \
  558. .streaming_ctrl = mxl111sf_ep6_streaming_ctrl, \
  559. .stream = { \
  560. .type = USB_BULK, \
  561. .count = 5, \
  562. .endpoint = 0x06, \
  563. .u = { \
  564. .bulk = { \
  565. .buffersize = 8192, \
  566. } \
  567. } \
  568. }
  569. /* FIXME */
  570. #define MXL111SF_EP6_ISOC_STREAMING_CONFIG \
  571. .streaming_ctrl = mxl111sf_ep6_streaming_ctrl, \
  572. .stream = { \
  573. .type = USB_ISOC, \
  574. .count = 5, \
  575. .endpoint = 0x06, \
  576. .u = { \
  577. .isoc = { \
  578. .framesperurb = 24, \
  579. .framesize = 3072, \
  580. .interval = 1, \
  581. } \
  582. } \
  583. }
  584. #define MXL111SF_DEFAULT_DEVICE_PROPERTIES \
  585. .caps = DVB_USB_IS_AN_I2C_ADAPTER, \
  586. .usb_ctrl = DEVICE_SPECIFIC, \
  587. /* use usb alt setting 1 for EP4 ISOC transfer (dvb-t), \
  588. EP6 BULK transfer (atsc/qam), \
  589. use usb alt setting 2 for EP4 BULK transfer (dvb-t), \
  590. EP6 ISOC transfer (atsc/qam), \
  591. */ \
  592. .power_ctrl = mxl111sf_power_ctrl, \
  593. .i2c_algo = &mxl111sf_i2c_algo, \
  594. .generic_bulk_ctrl_endpoint = MXL_EP2_REG_WRITE, \
  595. .generic_bulk_ctrl_endpoint_response = MXL_EP1_REG_READ, \
  596. .size_of_priv = sizeof(struct mxl111sf_state)
  597. static struct dvb_usb_device_properties mxl111sf_atsc_bulk_properties = {
  598. MXL111SF_DEFAULT_DEVICE_PROPERTIES,
  599. .num_adapters = 1,
  600. .adapter = {
  601. {
  602. .fe_ioctl_override = mxl111sf_fe_ioctl_override,
  603. .num_frontends = 1,
  604. .fe = {{
  605. .size_of_priv = sizeof(struct mxl111sf_adap_state),
  606. .frontend_attach = mxl111sf_lgdt3305_frontend_attach,
  607. .tuner_attach = mxl111sf_attach_tuner,
  608. MXL111SF_EP6_BULK_STREAMING_CONFIG,
  609. }},
  610. },
  611. },
  612. .num_device_descs = 6,
  613. .devices = {
  614. { "Hauppauge 126xxx ATSC (bulk)",
  615. { NULL },
  616. { &mxl111sf_table[1], &mxl111sf_table[5],
  617. NULL },
  618. },
  619. { "Hauppauge 117xxx ATSC (bulk)",
  620. { NULL },
  621. { &mxl111sf_table[12],
  622. NULL },
  623. },
  624. { "Hauppauge 126xxx ATSC+ (bulk)",
  625. { NULL },
  626. { &mxl111sf_table[0], &mxl111sf_table[3],
  627. &mxl111sf_table[7], &mxl111sf_table[9],
  628. &mxl111sf_table[10], NULL },
  629. },
  630. { "Hauppauge 117xxx ATSC+ (bulk)",
  631. { NULL },
  632. { &mxl111sf_table[11], &mxl111sf_table[14],
  633. &mxl111sf_table[16], &mxl111sf_table[17],
  634. &mxl111sf_table[32], &mxl111sf_table[33],
  635. NULL },
  636. },
  637. { "Hauppauge Mercury (tp-bulk)",
  638. { NULL },
  639. { &mxl111sf_table[19], &mxl111sf_table[21],
  640. &mxl111sf_table[23], &mxl111sf_table[25],
  641. &mxl111sf_table[27], NULL },
  642. },
  643. { "Hauppauge WinTV-Aero-M",
  644. { NULL },
  645. { &mxl111sf_table[29], &mxl111sf_table[31],
  646. NULL },
  647. },
  648. }
  649. };
  650. static struct dvb_usb_device_properties mxl111sf_atsc_isoc_properties = {
  651. MXL111SF_DEFAULT_DEVICE_PROPERTIES,
  652. .num_adapters = 1,
  653. .adapter = {
  654. {
  655. .fe_ioctl_override = mxl111sf_fe_ioctl_override,
  656. .num_frontends = 1,
  657. .fe = {{
  658. .size_of_priv = sizeof(struct mxl111sf_adap_state),
  659. .frontend_attach = mxl111sf_lgdt3305_frontend_attach,
  660. .tuner_attach = mxl111sf_attach_tuner,
  661. MXL111SF_EP6_ISOC_STREAMING_CONFIG,
  662. }},
  663. },
  664. },
  665. .num_device_descs = 6,
  666. .devices = {
  667. { "Hauppauge 126xxx ATSC (isoc)",
  668. { NULL },
  669. { &mxl111sf_table[1], &mxl111sf_table[5],
  670. NULL },
  671. },
  672. { "Hauppauge 117xxx ATSC (isoc)",
  673. { NULL },
  674. { &mxl111sf_table[12],
  675. NULL },
  676. },
  677. { "Hauppauge 126xxx ATSC+ (isoc)",
  678. { NULL },
  679. { &mxl111sf_table[0], &mxl111sf_table[3],
  680. &mxl111sf_table[7], &mxl111sf_table[9],
  681. &mxl111sf_table[10], NULL },
  682. },
  683. { "Hauppauge 117xxx ATSC+ (isoc)",
  684. { NULL },
  685. { &mxl111sf_table[11], &mxl111sf_table[14],
  686. &mxl111sf_table[16], &mxl111sf_table[17],
  687. &mxl111sf_table[32], &mxl111sf_table[33],
  688. NULL },
  689. },
  690. { "Hauppauge Mercury (tp-isoc)",
  691. { NULL },
  692. { &mxl111sf_table[19], &mxl111sf_table[21],
  693. &mxl111sf_table[23], &mxl111sf_table[25],
  694. &mxl111sf_table[27], NULL },
  695. },
  696. { "Hauppauge WinTV-Aero-M (tp-isoc)",
  697. { NULL },
  698. { &mxl111sf_table[29], &mxl111sf_table[31],
  699. NULL },
  700. },
  701. }
  702. };
  703. static struct usb_driver mxl111sf_driver = {
  704. .name = "dvb_usb_mxl111sf",
  705. .probe = mxl111sf_probe,
  706. .disconnect = dvb_usb_device_exit,
  707. .id_table = mxl111sf_table,
  708. };
  709. static int __init mxl111sf_module_init(void)
  710. {
  711. int result = usb_register(&mxl111sf_driver);
  712. if (result) {
  713. err("usb_register failed. Error number %d", result);
  714. return result;
  715. }
  716. return 0;
  717. }
  718. static void __exit mxl111sf_module_exit(void)
  719. {
  720. usb_deregister(&mxl111sf_driver);
  721. }
  722. module_init(mxl111sf_module_init);
  723. module_exit(mxl111sf_module_exit);
  724. MODULE_AUTHOR("Michael Krufky <mkrufky@kernellabs.com>");
  725. MODULE_DESCRIPTION("Driver for MaxLinear MxL111SF");
  726. MODULE_VERSION("1.0");
  727. MODULE_LICENSE("GPL");
  728. /*
  729. * Local variables:
  730. * c-basic-offset: 8
  731. * End:
  732. */