au0828-dvb.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * Driver for the Auvitek USB bridge
  4. *
  5. * Copyright (c) 2008 Steven Toth <[email protected]>
  6. */
  7. #include "au0828.h"
  8. #include <linux/module.h>
  9. #include <linux/slab.h>
  10. #include <linux/init.h>
  11. #include <linux/device.h>
  12. #include <media/v4l2-common.h>
  13. #include <media/tuner.h>
  14. #include "au8522.h"
  15. #include "xc5000.h"
  16. #include "mxl5007t.h"
  17. #include "tda18271.h"
  18. static int preallocate_big_buffers;
  19. module_param_named(preallocate_big_buffers, preallocate_big_buffers, int, 0644);
  20. MODULE_PARM_DESC(preallocate_big_buffers, "Preallocate the larger transfer buffers at module load time");
  21. DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
  22. #define _AU0828_BULKPIPE 0x83
  23. #define _BULKPIPESIZE 0xe522
  24. static u8 hauppauge_hvr950q_led_states[] = {
  25. 0x00, /* off */
  26. 0x02, /* yellow */
  27. 0x04, /* green */
  28. };
  29. static struct au8522_led_config hauppauge_hvr950q_led_cfg = {
  30. .gpio_output = 0x00e0,
  31. .gpio_output_enable = 0x6006,
  32. .gpio_output_disable = 0x0660,
  33. .gpio_leds = 0x00e2,
  34. .led_states = hauppauge_hvr950q_led_states,
  35. .num_led_states = sizeof(hauppauge_hvr950q_led_states),
  36. .vsb8_strong = 20 /* dB */ * 10,
  37. .qam64_strong = 25 /* dB */ * 10,
  38. .qam256_strong = 32 /* dB */ * 10,
  39. };
  40. static struct au8522_config hauppauge_hvr950q_config = {
  41. .demod_address = 0x8e >> 1,
  42. .status_mode = AU8522_DEMODLOCKING,
  43. .qam_if = AU8522_IF_6MHZ,
  44. .vsb_if = AU8522_IF_6MHZ,
  45. .led_cfg = &hauppauge_hvr950q_led_cfg,
  46. };
  47. static struct au8522_config fusionhdtv7usb_config = {
  48. .demod_address = 0x8e >> 1,
  49. .status_mode = AU8522_DEMODLOCKING,
  50. .qam_if = AU8522_IF_6MHZ,
  51. .vsb_if = AU8522_IF_6MHZ,
  52. };
  53. static struct au8522_config hauppauge_woodbury_config = {
  54. .demod_address = 0x8e >> 1,
  55. .status_mode = AU8522_DEMODLOCKING,
  56. .qam_if = AU8522_IF_4MHZ,
  57. .vsb_if = AU8522_IF_3_25MHZ,
  58. };
  59. static struct xc5000_config hauppauge_xc5000a_config = {
  60. .i2c_address = 0x61,
  61. .if_khz = 6000,
  62. .chip_id = XC5000A,
  63. .output_amp = 0x8f,
  64. };
  65. static struct xc5000_config hauppauge_xc5000c_config = {
  66. .i2c_address = 0x61,
  67. .if_khz = 6000,
  68. .chip_id = XC5000C,
  69. .output_amp = 0x8f,
  70. };
  71. static struct mxl5007t_config mxl5007t_hvr950q_config = {
  72. .xtal_freq_hz = MxL_XTAL_24_MHZ,
  73. .if_freq_hz = MxL_IF_6_MHZ,
  74. };
  75. static struct tda18271_config hauppauge_woodbury_tunerconfig = {
  76. .gate = TDA18271_GATE_DIGITAL,
  77. };
  78. static void au0828_restart_dvb_streaming(struct work_struct *work);
  79. static void au0828_bulk_timeout(struct timer_list *t)
  80. {
  81. struct au0828_dev *dev = from_timer(dev, t, bulk_timeout);
  82. dprintk(1, "%s called\n", __func__);
  83. dev->bulk_timeout_running = 0;
  84. schedule_work(&dev->restart_streaming);
  85. }
  86. /*-------------------------------------------------------------------*/
  87. static void urb_completion(struct urb *purb)
  88. {
  89. struct au0828_dev *dev = purb->context;
  90. int ptype = usb_pipetype(purb->pipe);
  91. unsigned char *ptr;
  92. dprintk(2, "%s: %d\n", __func__, purb->actual_length);
  93. if (!dev) {
  94. dprintk(2, "%s: no dev!\n", __func__);
  95. return;
  96. }
  97. if (!dev->urb_streaming) {
  98. dprintk(2, "%s: not streaming!\n", __func__);
  99. return;
  100. }
  101. if (ptype != PIPE_BULK) {
  102. pr_err("%s: Unsupported URB type %d\n",
  103. __func__, ptype);
  104. return;
  105. }
  106. /* See if the stream is corrupted (to work around a hardware
  107. bug where the stream gets misaligned */
  108. ptr = purb->transfer_buffer;
  109. if (purb->actual_length > 0 && ptr[0] != 0x47) {
  110. dprintk(1, "Need to restart streaming %02x len=%d!\n",
  111. ptr[0], purb->actual_length);
  112. schedule_work(&dev->restart_streaming);
  113. return;
  114. } else if (dev->bulk_timeout_running == 1) {
  115. /* The URB handler has fired, so cancel timer which would
  116. * restart endpoint if we hadn't
  117. */
  118. dprintk(1, "%s cancelling bulk timeout\n", __func__);
  119. dev->bulk_timeout_running = 0;
  120. del_timer(&dev->bulk_timeout);
  121. }
  122. /* Feed the transport payload into the kernel demux */
  123. dvb_dmx_swfilter_packets(&dev->dvb.demux,
  124. purb->transfer_buffer, purb->actual_length / 188);
  125. /* Clean the buffer before we requeue */
  126. memset(purb->transfer_buffer, 0, URB_BUFSIZE);
  127. /* Requeue URB */
  128. usb_submit_urb(purb, GFP_ATOMIC);
  129. }
  130. static int stop_urb_transfer(struct au0828_dev *dev)
  131. {
  132. int i;
  133. dprintk(2, "%s()\n", __func__);
  134. if (!dev->urb_streaming)
  135. return 0;
  136. if (dev->bulk_timeout_running == 1) {
  137. dev->bulk_timeout_running = 0;
  138. del_timer(&dev->bulk_timeout);
  139. }
  140. dev->urb_streaming = false;
  141. for (i = 0; i < URB_COUNT; i++) {
  142. if (dev->urbs[i]) {
  143. usb_kill_urb(dev->urbs[i]);
  144. if (!preallocate_big_buffers)
  145. kfree(dev->urbs[i]->transfer_buffer);
  146. usb_free_urb(dev->urbs[i]);
  147. }
  148. }
  149. return 0;
  150. }
  151. static int start_urb_transfer(struct au0828_dev *dev)
  152. {
  153. struct urb *purb;
  154. int i, ret;
  155. dprintk(2, "%s()\n", __func__);
  156. if (dev->urb_streaming) {
  157. dprintk(2, "%s: bulk xfer already running!\n", __func__);
  158. return 0;
  159. }
  160. for (i = 0; i < URB_COUNT; i++) {
  161. dev->urbs[i] = usb_alloc_urb(0, GFP_KERNEL);
  162. if (!dev->urbs[i])
  163. return -ENOMEM;
  164. purb = dev->urbs[i];
  165. if (preallocate_big_buffers)
  166. purb->transfer_buffer = dev->dig_transfer_buffer[i];
  167. else
  168. purb->transfer_buffer = kzalloc(URB_BUFSIZE,
  169. GFP_KERNEL);
  170. if (!purb->transfer_buffer) {
  171. usb_free_urb(purb);
  172. dev->urbs[i] = NULL;
  173. ret = -ENOMEM;
  174. pr_err("%s: failed big buffer allocation, err = %d\n",
  175. __func__, ret);
  176. return ret;
  177. }
  178. purb->status = -EINPROGRESS;
  179. usb_fill_bulk_urb(purb,
  180. dev->usbdev,
  181. usb_rcvbulkpipe(dev->usbdev,
  182. _AU0828_BULKPIPE),
  183. purb->transfer_buffer,
  184. URB_BUFSIZE,
  185. urb_completion,
  186. dev);
  187. }
  188. for (i = 0; i < URB_COUNT; i++) {
  189. ret = usb_submit_urb(dev->urbs[i], GFP_ATOMIC);
  190. if (ret != 0) {
  191. stop_urb_transfer(dev);
  192. pr_err("%s: failed urb submission, err = %d\n",
  193. __func__, ret);
  194. return ret;
  195. }
  196. }
  197. dev->urb_streaming = true;
  198. /* If we don't valid data within 1 second, restart stream */
  199. mod_timer(&dev->bulk_timeout, jiffies + (HZ));
  200. dev->bulk_timeout_running = 1;
  201. return 0;
  202. }
  203. static void au0828_start_transport(struct au0828_dev *dev)
  204. {
  205. au0828_write(dev, 0x608, 0x90);
  206. au0828_write(dev, 0x609, 0x72);
  207. au0828_write(dev, 0x60a, 0x71);
  208. au0828_write(dev, 0x60b, 0x01);
  209. }
  210. static void au0828_stop_transport(struct au0828_dev *dev, int full_stop)
  211. {
  212. if (full_stop) {
  213. au0828_write(dev, 0x608, 0x00);
  214. au0828_write(dev, 0x609, 0x00);
  215. au0828_write(dev, 0x60a, 0x00);
  216. }
  217. au0828_write(dev, 0x60b, 0x00);
  218. }
  219. static int au0828_dvb_start_feed(struct dvb_demux_feed *feed)
  220. {
  221. struct dvb_demux *demux = feed->demux;
  222. struct au0828_dev *dev = (struct au0828_dev *) demux->priv;
  223. struct au0828_dvb *dvb = &dev->dvb;
  224. int ret = 0;
  225. dprintk(1, "%s()\n", __func__);
  226. if (!demux->dmx.frontend)
  227. return -EINVAL;
  228. if (dvb->frontend) {
  229. mutex_lock(&dvb->lock);
  230. dvb->start_count++;
  231. dprintk(1, "%s(), start_count: %d, stop_count: %d\n", __func__,
  232. dvb->start_count, dvb->stop_count);
  233. if (dvb->feeding++ == 0) {
  234. /* Start transport */
  235. au0828_start_transport(dev);
  236. ret = start_urb_transfer(dev);
  237. if (ret < 0) {
  238. au0828_stop_transport(dev, 0);
  239. dvb->feeding--; /* We ran out of memory... */
  240. }
  241. }
  242. mutex_unlock(&dvb->lock);
  243. }
  244. return ret;
  245. }
  246. static int au0828_dvb_stop_feed(struct dvb_demux_feed *feed)
  247. {
  248. struct dvb_demux *demux = feed->demux;
  249. struct au0828_dev *dev = (struct au0828_dev *) demux->priv;
  250. struct au0828_dvb *dvb = &dev->dvb;
  251. int ret = 0;
  252. dprintk(1, "%s()\n", __func__);
  253. if (dvb->frontend) {
  254. cancel_work_sync(&dev->restart_streaming);
  255. mutex_lock(&dvb->lock);
  256. dvb->stop_count++;
  257. dprintk(1, "%s(), start_count: %d, stop_count: %d\n", __func__,
  258. dvb->start_count, dvb->stop_count);
  259. if (dvb->feeding > 0) {
  260. dvb->feeding--;
  261. if (dvb->feeding == 0) {
  262. /* Stop transport */
  263. ret = stop_urb_transfer(dev);
  264. au0828_stop_transport(dev, 0);
  265. }
  266. }
  267. mutex_unlock(&dvb->lock);
  268. }
  269. return ret;
  270. }
  271. static void au0828_restart_dvb_streaming(struct work_struct *work)
  272. {
  273. struct au0828_dev *dev = container_of(work, struct au0828_dev,
  274. restart_streaming);
  275. struct au0828_dvb *dvb = &dev->dvb;
  276. if (!dev->urb_streaming)
  277. return;
  278. dprintk(1, "Restarting streaming...!\n");
  279. mutex_lock(&dvb->lock);
  280. /* Stop transport */
  281. stop_urb_transfer(dev);
  282. au0828_stop_transport(dev, 1);
  283. /* Start transport */
  284. au0828_start_transport(dev);
  285. start_urb_transfer(dev);
  286. mutex_unlock(&dvb->lock);
  287. }
  288. static int au0828_set_frontend(struct dvb_frontend *fe)
  289. {
  290. struct au0828_dev *dev = fe->dvb->priv;
  291. struct au0828_dvb *dvb = &dev->dvb;
  292. int ret, was_streaming;
  293. mutex_lock(&dvb->lock);
  294. was_streaming = dev->urb_streaming;
  295. if (was_streaming) {
  296. au0828_stop_transport(dev, 1);
  297. /*
  298. * We can't hold a mutex here, as the restart_streaming
  299. * kthread may also hold it.
  300. */
  301. mutex_unlock(&dvb->lock);
  302. cancel_work_sync(&dev->restart_streaming);
  303. mutex_lock(&dvb->lock);
  304. stop_urb_transfer(dev);
  305. }
  306. mutex_unlock(&dvb->lock);
  307. ret = dvb->set_frontend(fe);
  308. if (was_streaming) {
  309. mutex_lock(&dvb->lock);
  310. au0828_start_transport(dev);
  311. start_urb_transfer(dev);
  312. mutex_unlock(&dvb->lock);
  313. }
  314. return ret;
  315. }
  316. static int dvb_register(struct au0828_dev *dev)
  317. {
  318. struct au0828_dvb *dvb = &dev->dvb;
  319. int result;
  320. dprintk(1, "%s()\n", __func__);
  321. if (preallocate_big_buffers) {
  322. int i;
  323. for (i = 0; i < URB_COUNT; i++) {
  324. dev->dig_transfer_buffer[i] = kzalloc(URB_BUFSIZE,
  325. GFP_KERNEL);
  326. if (!dev->dig_transfer_buffer[i]) {
  327. result = -ENOMEM;
  328. pr_err("failed buffer allocation (errno = %d)\n",
  329. result);
  330. goto fail_adapter;
  331. }
  332. }
  333. }
  334. INIT_WORK(&dev->restart_streaming, au0828_restart_dvb_streaming);
  335. /* register adapter */
  336. result = dvb_register_adapter(&dvb->adapter,
  337. KBUILD_MODNAME, THIS_MODULE,
  338. &dev->usbdev->dev, adapter_nr);
  339. if (result < 0) {
  340. pr_err("dvb_register_adapter failed (errno = %d)\n",
  341. result);
  342. goto fail_adapter;
  343. }
  344. #ifdef CONFIG_MEDIA_CONTROLLER_DVB
  345. dvb->adapter.mdev = dev->media_dev;
  346. #endif
  347. dvb->adapter.priv = dev;
  348. /* register frontend */
  349. result = dvb_register_frontend(&dvb->adapter, dvb->frontend);
  350. if (result < 0) {
  351. pr_err("dvb_register_frontend failed (errno = %d)\n",
  352. result);
  353. goto fail_frontend;
  354. }
  355. /* Hook dvb frontend */
  356. dvb->set_frontend = dvb->frontend->ops.set_frontend;
  357. dvb->frontend->ops.set_frontend = au0828_set_frontend;
  358. /* register demux stuff */
  359. dvb->demux.dmx.capabilities =
  360. DMX_TS_FILTERING | DMX_SECTION_FILTERING |
  361. DMX_MEMORY_BASED_FILTERING;
  362. dvb->demux.priv = dev;
  363. dvb->demux.filternum = 256;
  364. dvb->demux.feednum = 256;
  365. dvb->demux.start_feed = au0828_dvb_start_feed;
  366. dvb->demux.stop_feed = au0828_dvb_stop_feed;
  367. result = dvb_dmx_init(&dvb->demux);
  368. if (result < 0) {
  369. pr_err("dvb_dmx_init failed (errno = %d)\n", result);
  370. goto fail_dmx;
  371. }
  372. dvb->dmxdev.filternum = 256;
  373. dvb->dmxdev.demux = &dvb->demux.dmx;
  374. dvb->dmxdev.capabilities = 0;
  375. result = dvb_dmxdev_init(&dvb->dmxdev, &dvb->adapter);
  376. if (result < 0) {
  377. pr_err("dvb_dmxdev_init failed (errno = %d)\n", result);
  378. goto fail_dmxdev;
  379. }
  380. dvb->fe_hw.source = DMX_FRONTEND_0;
  381. result = dvb->demux.dmx.add_frontend(&dvb->demux.dmx, &dvb->fe_hw);
  382. if (result < 0) {
  383. pr_err("add_frontend failed (DMX_FRONTEND_0, errno = %d)\n",
  384. result);
  385. goto fail_fe_hw;
  386. }
  387. dvb->fe_mem.source = DMX_MEMORY_FE;
  388. result = dvb->demux.dmx.add_frontend(&dvb->demux.dmx, &dvb->fe_mem);
  389. if (result < 0) {
  390. pr_err("add_frontend failed (DMX_MEMORY_FE, errno = %d)\n",
  391. result);
  392. goto fail_fe_mem;
  393. }
  394. result = dvb->demux.dmx.connect_frontend(&dvb->demux.dmx, &dvb->fe_hw);
  395. if (result < 0) {
  396. pr_err("connect_frontend failed (errno = %d)\n", result);
  397. goto fail_fe_conn;
  398. }
  399. /* register network adapter */
  400. dvb_net_init(&dvb->adapter, &dvb->net, &dvb->demux.dmx);
  401. dvb->start_count = 0;
  402. dvb->stop_count = 0;
  403. result = dvb_create_media_graph(&dvb->adapter, false);
  404. if (result < 0)
  405. goto fail_create_graph;
  406. return 0;
  407. fail_create_graph:
  408. dvb_net_release(&dvb->net);
  409. fail_fe_conn:
  410. dvb->demux.dmx.remove_frontend(&dvb->demux.dmx, &dvb->fe_mem);
  411. fail_fe_mem:
  412. dvb->demux.dmx.remove_frontend(&dvb->demux.dmx, &dvb->fe_hw);
  413. fail_fe_hw:
  414. dvb_dmxdev_release(&dvb->dmxdev);
  415. fail_dmxdev:
  416. dvb_dmx_release(&dvb->demux);
  417. fail_dmx:
  418. dvb_unregister_frontend(dvb->frontend);
  419. fail_frontend:
  420. dvb_frontend_detach(dvb->frontend);
  421. dvb_unregister_adapter(&dvb->adapter);
  422. fail_adapter:
  423. if (preallocate_big_buffers) {
  424. int i;
  425. for (i = 0; i < URB_COUNT; i++)
  426. kfree(dev->dig_transfer_buffer[i]);
  427. }
  428. return result;
  429. }
  430. void au0828_dvb_unregister(struct au0828_dev *dev)
  431. {
  432. struct au0828_dvb *dvb = &dev->dvb;
  433. dprintk(1, "%s()\n", __func__);
  434. if (dvb->frontend == NULL)
  435. return;
  436. cancel_work_sync(&dev->restart_streaming);
  437. dvb_net_release(&dvb->net);
  438. dvb->demux.dmx.remove_frontend(&dvb->demux.dmx, &dvb->fe_mem);
  439. dvb->demux.dmx.remove_frontend(&dvb->demux.dmx, &dvb->fe_hw);
  440. dvb_dmxdev_release(&dvb->dmxdev);
  441. dvb_dmx_release(&dvb->demux);
  442. dvb_unregister_frontend(dvb->frontend);
  443. dvb_frontend_detach(dvb->frontend);
  444. dvb_unregister_adapter(&dvb->adapter);
  445. if (preallocate_big_buffers) {
  446. int i;
  447. for (i = 0; i < URB_COUNT; i++)
  448. kfree(dev->dig_transfer_buffer[i]);
  449. }
  450. dvb->frontend = NULL;
  451. }
  452. /* All the DVB attach calls go here, this function gets modified
  453. * for each new card. No other function in this file needs
  454. * to change.
  455. */
  456. int au0828_dvb_register(struct au0828_dev *dev)
  457. {
  458. struct au0828_dvb *dvb = &dev->dvb;
  459. int ret;
  460. dprintk(1, "%s()\n", __func__);
  461. /* init frontend */
  462. switch (dev->boardnr) {
  463. case AU0828_BOARD_HAUPPAUGE_HVR850:
  464. case AU0828_BOARD_HAUPPAUGE_HVR950Q:
  465. dvb->frontend = dvb_attach(au8522_attach,
  466. &hauppauge_hvr950q_config,
  467. &dev->i2c_adap);
  468. if (dvb->frontend != NULL)
  469. switch (dev->board.tuner_type) {
  470. default:
  471. case TUNER_XC5000:
  472. dvb_attach(xc5000_attach, dvb->frontend,
  473. &dev->i2c_adap,
  474. &hauppauge_xc5000a_config);
  475. break;
  476. case TUNER_XC5000C:
  477. dvb_attach(xc5000_attach, dvb->frontend,
  478. &dev->i2c_adap,
  479. &hauppauge_xc5000c_config);
  480. break;
  481. }
  482. break;
  483. case AU0828_BOARD_HAUPPAUGE_HVR950Q_MXL:
  484. dvb->frontend = dvb_attach(au8522_attach,
  485. &hauppauge_hvr950q_config,
  486. &dev->i2c_adap);
  487. if (dvb->frontend != NULL)
  488. dvb_attach(mxl5007t_attach, dvb->frontend,
  489. &dev->i2c_adap, 0x60,
  490. &mxl5007t_hvr950q_config);
  491. break;
  492. case AU0828_BOARD_HAUPPAUGE_WOODBURY:
  493. dvb->frontend = dvb_attach(au8522_attach,
  494. &hauppauge_woodbury_config,
  495. &dev->i2c_adap);
  496. if (dvb->frontend != NULL)
  497. dvb_attach(tda18271_attach, dvb->frontend,
  498. 0x60, &dev->i2c_adap,
  499. &hauppauge_woodbury_tunerconfig);
  500. break;
  501. case AU0828_BOARD_DVICO_FUSIONHDTV7:
  502. dvb->frontend = dvb_attach(au8522_attach,
  503. &fusionhdtv7usb_config,
  504. &dev->i2c_adap);
  505. if (dvb->frontend != NULL) {
  506. dvb_attach(xc5000_attach, dvb->frontend,
  507. &dev->i2c_adap,
  508. &hauppauge_xc5000a_config);
  509. }
  510. break;
  511. default:
  512. pr_warn("The frontend of your DVB/ATSC card isn't supported yet\n");
  513. break;
  514. }
  515. if (NULL == dvb->frontend) {
  516. pr_err("%s() Frontend initialization failed\n",
  517. __func__);
  518. return -1;
  519. }
  520. /* define general-purpose callback pointer */
  521. dvb->frontend->callback = au0828_tuner_callback;
  522. /* register everything */
  523. ret = dvb_register(dev);
  524. if (ret < 0) {
  525. if (dvb->frontend->ops.release)
  526. dvb->frontend->ops.release(dvb->frontend);
  527. dvb->frontend = NULL;
  528. return ret;
  529. }
  530. timer_setup(&dev->bulk_timeout, au0828_bulk_timeout, 0);
  531. return 0;
  532. }
  533. void au0828_dvb_suspend(struct au0828_dev *dev)
  534. {
  535. struct au0828_dvb *dvb = &dev->dvb;
  536. int rc;
  537. if (dvb->frontend) {
  538. if (dev->urb_streaming) {
  539. cancel_work_sync(&dev->restart_streaming);
  540. /* Stop transport */
  541. mutex_lock(&dvb->lock);
  542. stop_urb_transfer(dev);
  543. au0828_stop_transport(dev, 1);
  544. mutex_unlock(&dvb->lock);
  545. dev->need_urb_start = true;
  546. }
  547. /* suspend frontend - does tuner and fe to sleep */
  548. rc = dvb_frontend_suspend(dvb->frontend);
  549. pr_info("au0828_dvb_suspend(): Suspending DVB fe %d\n", rc);
  550. }
  551. }
  552. void au0828_dvb_resume(struct au0828_dev *dev)
  553. {
  554. struct au0828_dvb *dvb = &dev->dvb;
  555. int rc;
  556. if (dvb->frontend) {
  557. /* resume frontend - does fe and tuner init */
  558. rc = dvb_frontend_resume(dvb->frontend);
  559. pr_info("au0828_dvb_resume(): Resuming DVB fe %d\n", rc);
  560. if (dev->need_urb_start) {
  561. /* Start transport */
  562. mutex_lock(&dvb->lock);
  563. au0828_start_transport(dev);
  564. start_urb_transfer(dev);
  565. mutex_unlock(&dvb->lock);
  566. }
  567. }
  568. }