cx231xx-dvb.c 25 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019
  1. /*
  2. DVB device driver for cx231xx
  3. Copyright (C) 2008 <srinivasa.deevi at conexant dot com>
  4. Based on em28xx driver
  5. This program is free software; you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published by
  7. the Free Software Foundation; either version 2 of the License, or
  8. (at your option) any later version.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. GNU General Public License for more details.
  13. You should have received a copy of the GNU General Public License
  14. along with this program; if not, write to the Free Software
  15. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  16. */
  17. #include "cx231xx.h"
  18. #include <linux/kernel.h>
  19. #include <linux/slab.h>
  20. #include <media/v4l2-common.h>
  21. #include <media/videobuf-vmalloc.h>
  22. #include <media/tuner.h>
  23. #include "xc5000.h"
  24. #include "s5h1432.h"
  25. #include "tda18271.h"
  26. #include "s5h1411.h"
  27. #include "lgdt3305.h"
  28. #include "si2165.h"
  29. #include "mb86a20s.h"
  30. #include "si2157.h"
  31. #include "lgdt3306a.h"
  32. MODULE_DESCRIPTION("driver for cx231xx based DVB cards");
  33. MODULE_AUTHOR("Srinivasa Deevi <srinivasa.deevi@conexant.com>");
  34. MODULE_LICENSE("GPL");
  35. static unsigned int debug;
  36. module_param(debug, int, 0644);
  37. MODULE_PARM_DESC(debug, "enable debug messages [dvb]");
  38. DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
  39. #define CX231XX_DVB_NUM_BUFS 5
  40. #define CX231XX_DVB_MAX_PACKETSIZE 564
  41. #define CX231XX_DVB_MAX_PACKETS 64
  42. struct cx231xx_dvb {
  43. struct dvb_frontend *frontend;
  44. /* feed count management */
  45. struct mutex lock;
  46. int nfeeds;
  47. /* general boilerplate stuff */
  48. struct dvb_adapter adapter;
  49. struct dvb_demux demux;
  50. struct dmxdev dmxdev;
  51. struct dmx_frontend fe_hw;
  52. struct dmx_frontend fe_mem;
  53. struct dvb_net net;
  54. struct i2c_client *i2c_client_demod;
  55. struct i2c_client *i2c_client_tuner;
  56. };
  57. static struct s5h1432_config dvico_s5h1432_config = {
  58. .output_mode = S5H1432_SERIAL_OUTPUT,
  59. .gpio = S5H1432_GPIO_ON,
  60. .qam_if = S5H1432_IF_4000,
  61. .vsb_if = S5H1432_IF_4000,
  62. .inversion = S5H1432_INVERSION_OFF,
  63. .status_mode = S5H1432_DEMODLOCKING,
  64. .mpeg_timing = S5H1432_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
  65. };
  66. static struct tda18271_std_map cnxt_rde253s_tda18271_std_map = {
  67. .dvbt_6 = { .if_freq = 4000, .agc_mode = 3, .std = 4,
  68. .if_lvl = 1, .rfagc_top = 0x37, },
  69. .dvbt_7 = { .if_freq = 4000, .agc_mode = 3, .std = 5,
  70. .if_lvl = 1, .rfagc_top = 0x37, },
  71. .dvbt_8 = { .if_freq = 4000, .agc_mode = 3, .std = 6,
  72. .if_lvl = 1, .rfagc_top = 0x37, },
  73. };
  74. static struct tda18271_std_map mb86a20s_tda18271_config = {
  75. .dvbt_6 = { .if_freq = 4000, .agc_mode = 3, .std = 4,
  76. .if_lvl = 0, .rfagc_top = 0x37, },
  77. };
  78. static struct tda18271_config cnxt_rde253s_tunerconfig = {
  79. .std_map = &cnxt_rde253s_tda18271_std_map,
  80. .gate = TDA18271_GATE_ANALOG,
  81. };
  82. static struct s5h1411_config tda18271_s5h1411_config = {
  83. .output_mode = S5H1411_SERIAL_OUTPUT,
  84. .gpio = S5H1411_GPIO_OFF,
  85. .vsb_if = S5H1411_IF_3250,
  86. .qam_if = S5H1411_IF_4000,
  87. .inversion = S5H1411_INVERSION_ON,
  88. .status_mode = S5H1411_DEMODLOCKING,
  89. .mpeg_timing = S5H1411_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
  90. };
  91. static struct s5h1411_config xc5000_s5h1411_config = {
  92. .output_mode = S5H1411_SERIAL_OUTPUT,
  93. .gpio = S5H1411_GPIO_OFF,
  94. .vsb_if = S5H1411_IF_3250,
  95. .qam_if = S5H1411_IF_3250,
  96. .inversion = S5H1411_INVERSION_OFF,
  97. .status_mode = S5H1411_DEMODLOCKING,
  98. .mpeg_timing = S5H1411_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
  99. };
  100. static struct lgdt3305_config hcw_lgdt3305_config = {
  101. .i2c_addr = 0x0e,
  102. .mpeg_mode = LGDT3305_MPEG_SERIAL,
  103. .tpclk_edge = LGDT3305_TPCLK_FALLING_EDGE,
  104. .tpvalid_polarity = LGDT3305_TP_VALID_HIGH,
  105. .deny_i2c_rptr = 1,
  106. .spectral_inversion = 1,
  107. .qam_if_khz = 4000,
  108. .vsb_if_khz = 3250,
  109. };
  110. static struct tda18271_std_map hauppauge_tda18271_std_map = {
  111. .atsc_6 = { .if_freq = 3250, .agc_mode = 3, .std = 4,
  112. .if_lvl = 1, .rfagc_top = 0x58, },
  113. .qam_6 = { .if_freq = 4000, .agc_mode = 3, .std = 5,
  114. .if_lvl = 1, .rfagc_top = 0x58, },
  115. };
  116. static struct tda18271_config hcw_tda18271_config = {
  117. .std_map = &hauppauge_tda18271_std_map,
  118. .gate = TDA18271_GATE_DIGITAL,
  119. };
  120. static const struct mb86a20s_config pv_mb86a20s_config = {
  121. .demod_address = 0x10,
  122. .is_serial = true,
  123. };
  124. static struct tda18271_config pv_tda18271_config = {
  125. .std_map = &mb86a20s_tda18271_config,
  126. .gate = TDA18271_GATE_DIGITAL,
  127. .small_i2c = TDA18271_03_BYTE_CHUNK_INIT,
  128. };
  129. static struct lgdt3306a_config hauppauge_955q_lgdt3306a_config = {
  130. .i2c_addr = 0x59,
  131. .qam_if_khz = 4000,
  132. .vsb_if_khz = 3250,
  133. .deny_i2c_rptr = 1,
  134. .spectral_inversion = 1,
  135. .mpeg_mode = LGDT3306A_MPEG_SERIAL,
  136. .tpclk_edge = LGDT3306A_TPCLK_RISING_EDGE,
  137. .tpvalid_polarity = LGDT3306A_TP_VALID_HIGH,
  138. .xtalMHz = 25,
  139. };
  140. static inline void print_err_status(struct cx231xx *dev, int packet, int status)
  141. {
  142. char *errmsg = "Unknown";
  143. switch (status) {
  144. case -ENOENT:
  145. errmsg = "unlinked synchronuously";
  146. break;
  147. case -ECONNRESET:
  148. errmsg = "unlinked asynchronuously";
  149. break;
  150. case -ENOSR:
  151. errmsg = "Buffer error (overrun)";
  152. break;
  153. case -EPIPE:
  154. errmsg = "Stalled (device not responding)";
  155. break;
  156. case -EOVERFLOW:
  157. errmsg = "Babble (bad cable?)";
  158. break;
  159. case -EPROTO:
  160. errmsg = "Bit-stuff error (bad cable?)";
  161. break;
  162. case -EILSEQ:
  163. errmsg = "CRC/Timeout (could be anything)";
  164. break;
  165. case -ETIME:
  166. errmsg = "Device does not respond";
  167. break;
  168. }
  169. if (packet < 0) {
  170. dev_dbg(dev->dev,
  171. "URB status %d [%s].\n", status, errmsg);
  172. } else {
  173. dev_dbg(dev->dev,
  174. "URB packet %d, status %d [%s].\n",
  175. packet, status, errmsg);
  176. }
  177. }
  178. static inline int dvb_isoc_copy(struct cx231xx *dev, struct urb *urb)
  179. {
  180. int i;
  181. if (!dev)
  182. return 0;
  183. if (dev->state & DEV_DISCONNECTED)
  184. return 0;
  185. if (urb->status < 0) {
  186. print_err_status(dev, -1, urb->status);
  187. if (urb->status == -ENOENT)
  188. return 0;
  189. }
  190. for (i = 0; i < urb->number_of_packets; i++) {
  191. int status = urb->iso_frame_desc[i].status;
  192. if (status < 0) {
  193. print_err_status(dev, i, status);
  194. if (urb->iso_frame_desc[i].status != -EPROTO)
  195. continue;
  196. }
  197. dvb_dmx_swfilter(&dev->dvb->demux,
  198. urb->transfer_buffer +
  199. urb->iso_frame_desc[i].offset,
  200. urb->iso_frame_desc[i].actual_length);
  201. }
  202. return 0;
  203. }
  204. static inline int dvb_bulk_copy(struct cx231xx *dev, struct urb *urb)
  205. {
  206. if (!dev)
  207. return 0;
  208. if (dev->state & DEV_DISCONNECTED)
  209. return 0;
  210. if (urb->status < 0) {
  211. print_err_status(dev, -1, urb->status);
  212. if (urb->status == -ENOENT)
  213. return 0;
  214. }
  215. /* Feed the transport payload into the kernel demux */
  216. dvb_dmx_swfilter(&dev->dvb->demux,
  217. urb->transfer_buffer, urb->actual_length);
  218. return 0;
  219. }
  220. static int start_streaming(struct cx231xx_dvb *dvb)
  221. {
  222. int rc;
  223. struct cx231xx *dev = dvb->adapter.priv;
  224. if (dev->USE_ISO) {
  225. dev_dbg(dev->dev, "DVB transfer mode is ISO.\n");
  226. cx231xx_set_alt_setting(dev, INDEX_TS1, 4);
  227. rc = cx231xx_set_mode(dev, CX231XX_DIGITAL_MODE);
  228. if (rc < 0)
  229. return rc;
  230. dev->mode_tv = 1;
  231. return cx231xx_init_isoc(dev, CX231XX_DVB_MAX_PACKETS,
  232. CX231XX_DVB_NUM_BUFS,
  233. dev->ts1_mode.max_pkt_size,
  234. dvb_isoc_copy);
  235. } else {
  236. dev_dbg(dev->dev, "DVB transfer mode is BULK.\n");
  237. cx231xx_set_alt_setting(dev, INDEX_TS1, 0);
  238. rc = cx231xx_set_mode(dev, CX231XX_DIGITAL_MODE);
  239. if (rc < 0)
  240. return rc;
  241. dev->mode_tv = 1;
  242. return cx231xx_init_bulk(dev, CX231XX_DVB_MAX_PACKETS,
  243. CX231XX_DVB_NUM_BUFS,
  244. dev->ts1_mode.max_pkt_size,
  245. dvb_bulk_copy);
  246. }
  247. }
  248. static int stop_streaming(struct cx231xx_dvb *dvb)
  249. {
  250. struct cx231xx *dev = dvb->adapter.priv;
  251. if (dev->USE_ISO)
  252. cx231xx_uninit_isoc(dev);
  253. else
  254. cx231xx_uninit_bulk(dev);
  255. cx231xx_set_mode(dev, CX231XX_SUSPEND);
  256. return 0;
  257. }
  258. static int start_feed(struct dvb_demux_feed *feed)
  259. {
  260. struct dvb_demux *demux = feed->demux;
  261. struct cx231xx_dvb *dvb = demux->priv;
  262. int rc, ret;
  263. if (!demux->dmx.frontend)
  264. return -EINVAL;
  265. mutex_lock(&dvb->lock);
  266. dvb->nfeeds++;
  267. rc = dvb->nfeeds;
  268. if (dvb->nfeeds == 1) {
  269. ret = start_streaming(dvb);
  270. if (ret < 0)
  271. rc = ret;
  272. }
  273. mutex_unlock(&dvb->lock);
  274. return rc;
  275. }
  276. static int stop_feed(struct dvb_demux_feed *feed)
  277. {
  278. struct dvb_demux *demux = feed->demux;
  279. struct cx231xx_dvb *dvb = demux->priv;
  280. int err = 0;
  281. mutex_lock(&dvb->lock);
  282. dvb->nfeeds--;
  283. if (0 == dvb->nfeeds)
  284. err = stop_streaming(dvb);
  285. mutex_unlock(&dvb->lock);
  286. return err;
  287. }
  288. /* ------------------------------------------------------------------ */
  289. static int cx231xx_dvb_bus_ctrl(struct dvb_frontend *fe, int acquire)
  290. {
  291. struct cx231xx *dev = fe->dvb->priv;
  292. if (acquire)
  293. return cx231xx_set_mode(dev, CX231XX_DIGITAL_MODE);
  294. else
  295. return cx231xx_set_mode(dev, CX231XX_SUSPEND);
  296. }
  297. /* ------------------------------------------------------------------ */
  298. static struct xc5000_config cnxt_rde250_tunerconfig = {
  299. .i2c_address = 0x61,
  300. .if_khz = 4000,
  301. };
  302. static struct xc5000_config cnxt_rdu250_tunerconfig = {
  303. .i2c_address = 0x61,
  304. .if_khz = 3250,
  305. };
  306. /* ------------------------------------------------------------------ */
  307. #if 0
  308. static int attach_xc5000(u8 addr, struct cx231xx *dev)
  309. {
  310. struct dvb_frontend *fe;
  311. struct xc5000_config cfg;
  312. memset(&cfg, 0, sizeof(cfg));
  313. cfg.i2c_adap = cx231xx_get_i2c_adap(dev, dev->board.tuner_i2c_master);
  314. cfg.i2c_addr = addr;
  315. if (!dev->dvb->frontend) {
  316. dev_err(dev->dev, "%s/2: dvb frontend not attached. "
  317. "Can't attach xc5000\n", dev->name);
  318. return -EINVAL;
  319. }
  320. fe = dvb_attach(xc5000_attach, dev->dvb->frontend, &cfg);
  321. if (!fe) {
  322. dev_err(dev->dev, "%s/2: xc5000 attach failed\n", dev->name);
  323. dvb_frontend_detach(dev->dvb->frontend);
  324. dev->dvb->frontend = NULL;
  325. return -EINVAL;
  326. }
  327. dev_info(dev->dev, "%s/2: xc5000 attached\n", dev->name);
  328. return 0;
  329. }
  330. #endif
  331. int cx231xx_set_analog_freq(struct cx231xx *dev, u32 freq)
  332. {
  333. if ((dev->dvb != NULL) && (dev->dvb->frontend != NULL)) {
  334. struct dvb_tuner_ops *dops = &dev->dvb->frontend->ops.tuner_ops;
  335. if (dops->set_analog_params != NULL) {
  336. struct analog_parameters params;
  337. params.frequency = freq;
  338. params.std = dev->norm;
  339. params.mode = 0; /* 0- Air; 1 - cable */
  340. /*params.audmode = ; */
  341. /* Set the analog parameters to set the frequency */
  342. dops->set_analog_params(dev->dvb->frontend, &params);
  343. }
  344. }
  345. return 0;
  346. }
  347. int cx231xx_reset_analog_tuner(struct cx231xx *dev)
  348. {
  349. int status = 0;
  350. if ((dev->dvb != NULL) && (dev->dvb->frontend != NULL)) {
  351. struct dvb_tuner_ops *dops = &dev->dvb->frontend->ops.tuner_ops;
  352. if (dops->init != NULL && !dev->xc_fw_load_done) {
  353. dev_dbg(dev->dev,
  354. "Reloading firmware for XC5000\n");
  355. status = dops->init(dev->dvb->frontend);
  356. if (status == 0) {
  357. dev->xc_fw_load_done = 1;
  358. dev_dbg(dev->dev,
  359. "XC5000 firmware download completed\n");
  360. } else {
  361. dev->xc_fw_load_done = 0;
  362. dev_dbg(dev->dev,
  363. "XC5000 firmware download failed !!!\n");
  364. }
  365. }
  366. }
  367. return status;
  368. }
  369. /* ------------------------------------------------------------------ */
  370. static int register_dvb(struct cx231xx_dvb *dvb,
  371. struct module *module,
  372. struct cx231xx *dev, struct device *device)
  373. {
  374. int result;
  375. mutex_init(&dvb->lock);
  376. /* register adapter */
  377. result = dvb_register_adapter(&dvb->adapter, dev->name, module, device,
  378. adapter_nr);
  379. if (result < 0) {
  380. dev_warn(dev->dev,
  381. "%s: dvb_register_adapter failed (errno = %d)\n",
  382. dev->name, result);
  383. goto fail_adapter;
  384. }
  385. dvb_register_media_controller(&dvb->adapter, dev->media_dev);
  386. /* Ensure all frontends negotiate bus access */
  387. dvb->frontend->ops.ts_bus_ctrl = cx231xx_dvb_bus_ctrl;
  388. dvb->adapter.priv = dev;
  389. /* register frontend */
  390. result = dvb_register_frontend(&dvb->adapter, dvb->frontend);
  391. if (result < 0) {
  392. dev_warn(dev->dev,
  393. "%s: dvb_register_frontend failed (errno = %d)\n",
  394. dev->name, result);
  395. goto fail_frontend;
  396. }
  397. /* register demux stuff */
  398. dvb->demux.dmx.capabilities =
  399. DMX_TS_FILTERING | DMX_SECTION_FILTERING |
  400. DMX_MEMORY_BASED_FILTERING;
  401. dvb->demux.priv = dvb;
  402. dvb->demux.filternum = 256;
  403. dvb->demux.feednum = 256;
  404. dvb->demux.start_feed = start_feed;
  405. dvb->demux.stop_feed = stop_feed;
  406. result = dvb_dmx_init(&dvb->demux);
  407. if (result < 0) {
  408. dev_warn(dev->dev,
  409. "%s: dvb_dmx_init failed (errno = %d)\n",
  410. dev->name, result);
  411. goto fail_dmx;
  412. }
  413. dvb->dmxdev.filternum = 256;
  414. dvb->dmxdev.demux = &dvb->demux.dmx;
  415. dvb->dmxdev.capabilities = 0;
  416. result = dvb_dmxdev_init(&dvb->dmxdev, &dvb->adapter);
  417. if (result < 0) {
  418. dev_warn(dev->dev,
  419. "%s: dvb_dmxdev_init failed (errno = %d)\n",
  420. dev->name, result);
  421. goto fail_dmxdev;
  422. }
  423. dvb->fe_hw.source = DMX_FRONTEND_0;
  424. result = dvb->demux.dmx.add_frontend(&dvb->demux.dmx, &dvb->fe_hw);
  425. if (result < 0) {
  426. dev_warn(dev->dev,
  427. "%s: add_frontend failed (DMX_FRONTEND_0, errno = %d)\n",
  428. dev->name, result);
  429. goto fail_fe_hw;
  430. }
  431. dvb->fe_mem.source = DMX_MEMORY_FE;
  432. result = dvb->demux.dmx.add_frontend(&dvb->demux.dmx, &dvb->fe_mem);
  433. if (result < 0) {
  434. dev_warn(dev->dev,
  435. "%s: add_frontend failed (DMX_MEMORY_FE, errno = %d)\n",
  436. dev->name, result);
  437. goto fail_fe_mem;
  438. }
  439. result = dvb->demux.dmx.connect_frontend(&dvb->demux.dmx, &dvb->fe_hw);
  440. if (result < 0) {
  441. dev_warn(dev->dev,
  442. "%s: connect_frontend failed (errno = %d)\n",
  443. dev->name, result);
  444. goto fail_fe_conn;
  445. }
  446. /* register network adapter */
  447. dvb_net_init(&dvb->adapter, &dvb->net, &dvb->demux.dmx);
  448. result = dvb_create_media_graph(&dvb->adapter,
  449. dev->tuner_type == TUNER_ABSENT);
  450. if (result < 0)
  451. goto fail_create_graph;
  452. return 0;
  453. fail_create_graph:
  454. dvb_net_release(&dvb->net);
  455. fail_fe_conn:
  456. dvb->demux.dmx.remove_frontend(&dvb->demux.dmx, &dvb->fe_mem);
  457. fail_fe_mem:
  458. dvb->demux.dmx.remove_frontend(&dvb->demux.dmx, &dvb->fe_hw);
  459. fail_fe_hw:
  460. dvb_dmxdev_release(&dvb->dmxdev);
  461. fail_dmxdev:
  462. dvb_dmx_release(&dvb->demux);
  463. fail_dmx:
  464. dvb_unregister_frontend(dvb->frontend);
  465. fail_frontend:
  466. dvb_frontend_detach(dvb->frontend);
  467. dvb_unregister_adapter(&dvb->adapter);
  468. fail_adapter:
  469. return result;
  470. }
  471. static void unregister_dvb(struct cx231xx_dvb *dvb)
  472. {
  473. struct i2c_client *client;
  474. dvb_net_release(&dvb->net);
  475. dvb->demux.dmx.remove_frontend(&dvb->demux.dmx, &dvb->fe_mem);
  476. dvb->demux.dmx.remove_frontend(&dvb->demux.dmx, &dvb->fe_hw);
  477. dvb_dmxdev_release(&dvb->dmxdev);
  478. dvb_dmx_release(&dvb->demux);
  479. /* remove I2C tuner */
  480. client = dvb->i2c_client_tuner;
  481. if (client) {
  482. module_put(client->dev.driver->owner);
  483. i2c_unregister_device(client);
  484. }
  485. /* remove I2C demod */
  486. client = dvb->i2c_client_demod;
  487. if (client) {
  488. module_put(client->dev.driver->owner);
  489. i2c_unregister_device(client);
  490. }
  491. dvb_unregister_frontend(dvb->frontend);
  492. dvb_frontend_detach(dvb->frontend);
  493. dvb_unregister_adapter(&dvb->adapter);
  494. }
  495. static int dvb_init(struct cx231xx *dev)
  496. {
  497. int result = 0;
  498. struct cx231xx_dvb *dvb;
  499. struct i2c_adapter *tuner_i2c;
  500. struct i2c_adapter *demod_i2c;
  501. if (!dev->board.has_dvb) {
  502. /* This device does not support the extension */
  503. return 0;
  504. }
  505. dvb = kzalloc(sizeof(struct cx231xx_dvb), GFP_KERNEL);
  506. if (dvb == NULL) {
  507. dev_info(dev->dev,
  508. "cx231xx_dvb: memory allocation failed\n");
  509. return -ENOMEM;
  510. }
  511. dev->dvb = dvb;
  512. dev->cx231xx_set_analog_freq = cx231xx_set_analog_freq;
  513. dev->cx231xx_reset_analog_tuner = cx231xx_reset_analog_tuner;
  514. tuner_i2c = cx231xx_get_i2c_adap(dev, dev->board.tuner_i2c_master);
  515. demod_i2c = cx231xx_get_i2c_adap(dev, dev->board.demod_i2c_master);
  516. mutex_lock(&dev->lock);
  517. cx231xx_set_mode(dev, CX231XX_DIGITAL_MODE);
  518. cx231xx_demod_reset(dev);
  519. /* init frontend */
  520. switch (dev->model) {
  521. case CX231XX_BOARD_CNXT_CARRAERA:
  522. case CX231XX_BOARD_CNXT_RDE_250:
  523. dev->dvb->frontend = dvb_attach(s5h1432_attach,
  524. &dvico_s5h1432_config,
  525. demod_i2c);
  526. if (dev->dvb->frontend == NULL) {
  527. dev_err(dev->dev,
  528. "Failed to attach s5h1432 front end\n");
  529. result = -EINVAL;
  530. goto out_free;
  531. }
  532. /* define general-purpose callback pointer */
  533. dvb->frontend->callback = cx231xx_tuner_callback;
  534. if (!dvb_attach(xc5000_attach, dev->dvb->frontend,
  535. tuner_i2c,
  536. &cnxt_rde250_tunerconfig)) {
  537. result = -EINVAL;
  538. goto out_free;
  539. }
  540. break;
  541. case CX231XX_BOARD_CNXT_SHELBY:
  542. case CX231XX_BOARD_CNXT_RDU_250:
  543. dev->dvb->frontend = dvb_attach(s5h1411_attach,
  544. &xc5000_s5h1411_config,
  545. demod_i2c);
  546. if (dev->dvb->frontend == NULL) {
  547. dev_err(dev->dev,
  548. "Failed to attach s5h1411 front end\n");
  549. result = -EINVAL;
  550. goto out_free;
  551. }
  552. /* define general-purpose callback pointer */
  553. dvb->frontend->callback = cx231xx_tuner_callback;
  554. if (!dvb_attach(xc5000_attach, dev->dvb->frontend,
  555. tuner_i2c,
  556. &cnxt_rdu250_tunerconfig)) {
  557. result = -EINVAL;
  558. goto out_free;
  559. }
  560. break;
  561. case CX231XX_BOARD_CNXT_RDE_253S:
  562. dev->dvb->frontend = dvb_attach(s5h1432_attach,
  563. &dvico_s5h1432_config,
  564. demod_i2c);
  565. if (dev->dvb->frontend == NULL) {
  566. dev_err(dev->dev,
  567. "Failed to attach s5h1432 front end\n");
  568. result = -EINVAL;
  569. goto out_free;
  570. }
  571. /* define general-purpose callback pointer */
  572. dvb->frontend->callback = cx231xx_tuner_callback;
  573. if (!dvb_attach(tda18271_attach, dev->dvb->frontend,
  574. 0x60, tuner_i2c,
  575. &cnxt_rde253s_tunerconfig)) {
  576. result = -EINVAL;
  577. goto out_free;
  578. }
  579. break;
  580. case CX231XX_BOARD_CNXT_RDU_253S:
  581. case CX231XX_BOARD_KWORLD_UB445_USB_HYBRID:
  582. dev->dvb->frontend = dvb_attach(s5h1411_attach,
  583. &tda18271_s5h1411_config,
  584. demod_i2c);
  585. if (dev->dvb->frontend == NULL) {
  586. dev_err(dev->dev,
  587. "Failed to attach s5h1411 front end\n");
  588. result = -EINVAL;
  589. goto out_free;
  590. }
  591. /* define general-purpose callback pointer */
  592. dvb->frontend->callback = cx231xx_tuner_callback;
  593. if (!dvb_attach(tda18271_attach, dev->dvb->frontend,
  594. 0x60, tuner_i2c,
  595. &cnxt_rde253s_tunerconfig)) {
  596. result = -EINVAL;
  597. goto out_free;
  598. }
  599. break;
  600. case CX231XX_BOARD_HAUPPAUGE_EXETER:
  601. dev_info(dev->dev,
  602. "%s: looking for tuner / demod on i2c bus: %d\n",
  603. __func__, i2c_adapter_id(tuner_i2c));
  604. dev->dvb->frontend = dvb_attach(lgdt3305_attach,
  605. &hcw_lgdt3305_config,
  606. demod_i2c);
  607. if (dev->dvb->frontend == NULL) {
  608. dev_err(dev->dev,
  609. "Failed to attach LG3305 front end\n");
  610. result = -EINVAL;
  611. goto out_free;
  612. }
  613. /* define general-purpose callback pointer */
  614. dvb->frontend->callback = cx231xx_tuner_callback;
  615. dvb_attach(tda18271_attach, dev->dvb->frontend,
  616. 0x60, tuner_i2c,
  617. &hcw_tda18271_config);
  618. break;
  619. case CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx:
  620. {
  621. struct i2c_client *client;
  622. struct i2c_board_info info;
  623. struct si2165_platform_data si2165_pdata;
  624. /* attach demod */
  625. memset(&si2165_pdata, 0, sizeof(si2165_pdata));
  626. si2165_pdata.fe = &dev->dvb->frontend;
  627. si2165_pdata.chip_mode = SI2165_MODE_PLL_XTAL,
  628. si2165_pdata.ref_freq_Hz = 16000000,
  629. memset(&info, 0, sizeof(struct i2c_board_info));
  630. strlcpy(info.type, "si2165", I2C_NAME_SIZE);
  631. info.addr = 0x64;
  632. info.platform_data = &si2165_pdata;
  633. request_module(info.type);
  634. client = i2c_new_device(demod_i2c, &info);
  635. if (client == NULL || client->dev.driver == NULL || dev->dvb->frontend == NULL) {
  636. dev_err(dev->dev,
  637. "Failed to attach SI2165 front end\n");
  638. result = -EINVAL;
  639. goto out_free;
  640. }
  641. if (!try_module_get(client->dev.driver->owner)) {
  642. i2c_unregister_device(client);
  643. result = -ENODEV;
  644. goto out_free;
  645. }
  646. dvb->i2c_client_demod = client;
  647. dev->dvb->frontend->ops.i2c_gate_ctrl = NULL;
  648. /* define general-purpose callback pointer */
  649. dvb->frontend->callback = cx231xx_tuner_callback;
  650. dvb_attach(tda18271_attach, dev->dvb->frontend,
  651. 0x60,
  652. tuner_i2c,
  653. &hcw_tda18271_config);
  654. dev->cx231xx_reset_analog_tuner = NULL;
  655. break;
  656. }
  657. case CX231XX_BOARD_HAUPPAUGE_930C_HD_1114xx:
  658. {
  659. struct i2c_client *client;
  660. struct i2c_board_info info;
  661. struct si2165_platform_data si2165_pdata;
  662. struct si2157_config si2157_config;
  663. /* attach demod */
  664. memset(&si2165_pdata, 0, sizeof(si2165_pdata));
  665. si2165_pdata.fe = &dev->dvb->frontend;
  666. si2165_pdata.chip_mode = SI2165_MODE_PLL_EXT,
  667. si2165_pdata.ref_freq_Hz = 24000000,
  668. memset(&info, 0, sizeof(struct i2c_board_info));
  669. strlcpy(info.type, "si2165", I2C_NAME_SIZE);
  670. info.addr = 0x64;
  671. info.platform_data = &si2165_pdata;
  672. request_module(info.type);
  673. client = i2c_new_device(demod_i2c, &info);
  674. if (client == NULL || client->dev.driver == NULL || dev->dvb->frontend == NULL) {
  675. dev_err(dev->dev,
  676. "Failed to attach SI2165 front end\n");
  677. result = -EINVAL;
  678. goto out_free;
  679. }
  680. if (!try_module_get(client->dev.driver->owner)) {
  681. i2c_unregister_device(client);
  682. result = -ENODEV;
  683. goto out_free;
  684. }
  685. dvb->i2c_client_demod = client;
  686. memset(&info, 0, sizeof(struct i2c_board_info));
  687. dev->dvb->frontend->ops.i2c_gate_ctrl = NULL;
  688. /* define general-purpose callback pointer */
  689. dvb->frontend->callback = cx231xx_tuner_callback;
  690. /* attach tuner */
  691. memset(&si2157_config, 0, sizeof(si2157_config));
  692. si2157_config.fe = dev->dvb->frontend;
  693. #ifdef CONFIG_MEDIA_CONTROLLER_DVB
  694. si2157_config.mdev = dev->media_dev;
  695. #endif
  696. si2157_config.if_port = 1;
  697. si2157_config.inversion = true;
  698. strlcpy(info.type, "si2157", I2C_NAME_SIZE);
  699. info.addr = 0x60;
  700. info.platform_data = &si2157_config;
  701. request_module("si2157");
  702. client = i2c_new_device(
  703. tuner_i2c,
  704. &info);
  705. if (client == NULL || client->dev.driver == NULL) {
  706. dvb_frontend_detach(dev->dvb->frontend);
  707. result = -ENODEV;
  708. goto out_free;
  709. }
  710. if (!try_module_get(client->dev.driver->owner)) {
  711. i2c_unregister_device(client);
  712. dvb_frontend_detach(dev->dvb->frontend);
  713. result = -ENODEV;
  714. goto out_free;
  715. }
  716. dev->cx231xx_reset_analog_tuner = NULL;
  717. dev->dvb->i2c_client_tuner = client;
  718. break;
  719. }
  720. case CX231XX_BOARD_HAUPPAUGE_955Q:
  721. {
  722. struct i2c_client *client;
  723. struct i2c_board_info info;
  724. struct si2157_config si2157_config;
  725. memset(&info, 0, sizeof(struct i2c_board_info));
  726. dev->dvb->frontend = dvb_attach(lgdt3306a_attach,
  727. &hauppauge_955q_lgdt3306a_config,
  728. demod_i2c
  729. );
  730. if (dev->dvb->frontend == NULL) {
  731. dev_err(dev->dev,
  732. "Failed to attach LGDT3306A frontend.\n");
  733. result = -EINVAL;
  734. goto out_free;
  735. }
  736. dev->dvb->frontend->ops.i2c_gate_ctrl = NULL;
  737. /* define general-purpose callback pointer */
  738. dvb->frontend->callback = cx231xx_tuner_callback;
  739. /* attach tuner */
  740. memset(&si2157_config, 0, sizeof(si2157_config));
  741. si2157_config.fe = dev->dvb->frontend;
  742. #ifdef CONFIG_MEDIA_CONTROLLER_DVB
  743. si2157_config.mdev = dev->media_dev;
  744. #endif
  745. si2157_config.if_port = 1;
  746. si2157_config.inversion = true;
  747. strlcpy(info.type, "si2157", I2C_NAME_SIZE);
  748. info.addr = 0x60;
  749. info.platform_data = &si2157_config;
  750. request_module("si2157");
  751. client = i2c_new_device(
  752. tuner_i2c,
  753. &info);
  754. if (client == NULL || client->dev.driver == NULL) {
  755. dvb_frontend_detach(dev->dvb->frontend);
  756. result = -ENODEV;
  757. goto out_free;
  758. }
  759. if (!try_module_get(client->dev.driver->owner)) {
  760. i2c_unregister_device(client);
  761. dvb_frontend_detach(dev->dvb->frontend);
  762. result = -ENODEV;
  763. goto out_free;
  764. }
  765. dev->cx231xx_reset_analog_tuner = NULL;
  766. dev->dvb->i2c_client_tuner = client;
  767. break;
  768. }
  769. case CX231XX_BOARD_PV_PLAYTV_USB_HYBRID:
  770. case CX231XX_BOARD_KWORLD_UB430_USB_HYBRID:
  771. dev_info(dev->dev,
  772. "%s: looking for demod on i2c bus: %d\n",
  773. __func__, i2c_adapter_id(tuner_i2c));
  774. dev->dvb->frontend = dvb_attach(mb86a20s_attach,
  775. &pv_mb86a20s_config,
  776. demod_i2c);
  777. if (dev->dvb->frontend == NULL) {
  778. dev_err(dev->dev,
  779. "Failed to attach mb86a20s demod\n");
  780. result = -EINVAL;
  781. goto out_free;
  782. }
  783. /* define general-purpose callback pointer */
  784. dvb->frontend->callback = cx231xx_tuner_callback;
  785. dvb_attach(tda18271_attach, dev->dvb->frontend,
  786. 0x60, tuner_i2c,
  787. &pv_tda18271_config);
  788. break;
  789. default:
  790. dev_err(dev->dev,
  791. "%s/2: The frontend of your DVB/ATSC card isn't supported yet\n",
  792. dev->name);
  793. break;
  794. }
  795. if (NULL == dvb->frontend) {
  796. dev_err(dev->dev,
  797. "%s/2: frontend initialization failed\n", dev->name);
  798. result = -EINVAL;
  799. goto out_free;
  800. }
  801. /* register everything */
  802. result = register_dvb(dvb, THIS_MODULE, dev, dev->dev);
  803. if (result < 0)
  804. goto out_free;
  805. dev_info(dev->dev, "Successfully loaded cx231xx-dvb\n");
  806. ret:
  807. cx231xx_set_mode(dev, CX231XX_SUSPEND);
  808. mutex_unlock(&dev->lock);
  809. return result;
  810. out_free:
  811. kfree(dvb);
  812. dev->dvb = NULL;
  813. goto ret;
  814. }
  815. static int dvb_fini(struct cx231xx *dev)
  816. {
  817. if (!dev->board.has_dvb) {
  818. /* This device does not support the extension */
  819. return 0;
  820. }
  821. if (dev->dvb) {
  822. unregister_dvb(dev->dvb);
  823. dev->dvb = NULL;
  824. }
  825. return 0;
  826. }
  827. static struct cx231xx_ops dvb_ops = {
  828. .id = CX231XX_DVB,
  829. .name = "Cx231xx dvb Extension",
  830. .init = dvb_init,
  831. .fini = dvb_fini,
  832. };
  833. static int __init cx231xx_dvb_register(void)
  834. {
  835. return cx231xx_register_extension(&dvb_ops);
  836. }
  837. static void __exit cx231xx_dvb_unregister(void)
  838. {
  839. cx231xx_unregister_extension(&dvb_ops);
  840. }
  841. module_init(cx231xx_dvb_register);
  842. module_exit(cx231xx_dvb_unregister);