root/drivers/media/usb/au0828/au0828-dvb.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. au0828_bulk_timeout
  2. urb_completion
  3. stop_urb_transfer
  4. start_urb_transfer
  5. au0828_start_transport
  6. au0828_stop_transport
  7. au0828_dvb_start_feed
  8. au0828_dvb_stop_feed
  9. au0828_restart_dvb_streaming
  10. au0828_set_frontend
  11. dvb_register
  12. au0828_dvb_unregister
  13. au0828_dvb_register
  14. au0828_dvb_suspend
  15. au0828_dvb_resume

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

/* [<][>][^][v][top][bottom][index][help] */