0001
0002
0003
0004
0005
0006
0007
0008 #include "au0828.h"
0009
0010 #include <linux/module.h>
0011 #include <linux/slab.h>
0012 #include <linux/init.h>
0013 #include <linux/device.h>
0014 #include <media/v4l2-common.h>
0015 #include <media/tuner.h>
0016
0017 #include "au8522.h"
0018 #include "xc5000.h"
0019 #include "mxl5007t.h"
0020 #include "tda18271.h"
0021
0022 static int preallocate_big_buffers;
0023 module_param_named(preallocate_big_buffers, preallocate_big_buffers, int, 0644);
0024 MODULE_PARM_DESC(preallocate_big_buffers, "Preallocate the larger transfer buffers at module load time");
0025
0026 DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
0027
0028 #define _AU0828_BULKPIPE 0x83
0029 #define _BULKPIPESIZE 0xe522
0030
0031 static u8 hauppauge_hvr950q_led_states[] = {
0032 0x00,
0033 0x02,
0034 0x04,
0035 };
0036
0037 static struct au8522_led_config hauppauge_hvr950q_led_cfg = {
0038 .gpio_output = 0x00e0,
0039 .gpio_output_enable = 0x6006,
0040 .gpio_output_disable = 0x0660,
0041
0042 .gpio_leds = 0x00e2,
0043 .led_states = hauppauge_hvr950q_led_states,
0044 .num_led_states = sizeof(hauppauge_hvr950q_led_states),
0045
0046 .vsb8_strong = 20 * 10,
0047 .qam64_strong = 25 * 10,
0048 .qam256_strong = 32 * 10,
0049 };
0050
0051 static struct au8522_config hauppauge_hvr950q_config = {
0052 .demod_address = 0x8e >> 1,
0053 .status_mode = AU8522_DEMODLOCKING,
0054 .qam_if = AU8522_IF_6MHZ,
0055 .vsb_if = AU8522_IF_6MHZ,
0056 .led_cfg = &hauppauge_hvr950q_led_cfg,
0057 };
0058
0059 static struct au8522_config fusionhdtv7usb_config = {
0060 .demod_address = 0x8e >> 1,
0061 .status_mode = AU8522_DEMODLOCKING,
0062 .qam_if = AU8522_IF_6MHZ,
0063 .vsb_if = AU8522_IF_6MHZ,
0064 };
0065
0066 static struct au8522_config hauppauge_woodbury_config = {
0067 .demod_address = 0x8e >> 1,
0068 .status_mode = AU8522_DEMODLOCKING,
0069 .qam_if = AU8522_IF_4MHZ,
0070 .vsb_if = AU8522_IF_3_25MHZ,
0071 };
0072
0073 static struct xc5000_config hauppauge_xc5000a_config = {
0074 .i2c_address = 0x61,
0075 .if_khz = 6000,
0076 .chip_id = XC5000A,
0077 .output_amp = 0x8f,
0078 };
0079
0080 static struct xc5000_config hauppauge_xc5000c_config = {
0081 .i2c_address = 0x61,
0082 .if_khz = 6000,
0083 .chip_id = XC5000C,
0084 .output_amp = 0x8f,
0085 };
0086
0087 static struct mxl5007t_config mxl5007t_hvr950q_config = {
0088 .xtal_freq_hz = MxL_XTAL_24_MHZ,
0089 .if_freq_hz = MxL_IF_6_MHZ,
0090 };
0091
0092 static struct tda18271_config hauppauge_woodbury_tunerconfig = {
0093 .gate = TDA18271_GATE_DIGITAL,
0094 };
0095
0096 static void au0828_restart_dvb_streaming(struct work_struct *work);
0097
0098 static void au0828_bulk_timeout(struct timer_list *t)
0099 {
0100 struct au0828_dev *dev = from_timer(dev, t, bulk_timeout);
0101
0102 dprintk(1, "%s called\n", __func__);
0103 dev->bulk_timeout_running = 0;
0104 schedule_work(&dev->restart_streaming);
0105 }
0106
0107
0108 static void urb_completion(struct urb *purb)
0109 {
0110 struct au0828_dev *dev = purb->context;
0111 int ptype = usb_pipetype(purb->pipe);
0112 unsigned char *ptr;
0113
0114 dprintk(2, "%s: %d\n", __func__, purb->actual_length);
0115
0116 if (!dev) {
0117 dprintk(2, "%s: no dev!\n", __func__);
0118 return;
0119 }
0120
0121 if (!dev->urb_streaming) {
0122 dprintk(2, "%s: not streaming!\n", __func__);
0123 return;
0124 }
0125
0126 if (ptype != PIPE_BULK) {
0127 pr_err("%s: Unsupported URB type %d\n",
0128 __func__, ptype);
0129 return;
0130 }
0131
0132
0133
0134 ptr = purb->transfer_buffer;
0135 if (purb->actual_length > 0 && ptr[0] != 0x47) {
0136 dprintk(1, "Need to restart streaming %02x len=%d!\n",
0137 ptr[0], purb->actual_length);
0138 schedule_work(&dev->restart_streaming);
0139 return;
0140 } else if (dev->bulk_timeout_running == 1) {
0141
0142
0143
0144 dprintk(1, "%s cancelling bulk timeout\n", __func__);
0145 dev->bulk_timeout_running = 0;
0146 del_timer(&dev->bulk_timeout);
0147 }
0148
0149
0150 dvb_dmx_swfilter_packets(&dev->dvb.demux,
0151 purb->transfer_buffer, purb->actual_length / 188);
0152
0153
0154 memset(purb->transfer_buffer, 0, URB_BUFSIZE);
0155
0156
0157 usb_submit_urb(purb, GFP_ATOMIC);
0158 }
0159
0160 static int stop_urb_transfer(struct au0828_dev *dev)
0161 {
0162 int i;
0163
0164 dprintk(2, "%s()\n", __func__);
0165
0166 if (!dev->urb_streaming)
0167 return 0;
0168
0169 if (dev->bulk_timeout_running == 1) {
0170 dev->bulk_timeout_running = 0;
0171 del_timer(&dev->bulk_timeout);
0172 }
0173
0174 dev->urb_streaming = false;
0175 for (i = 0; i < URB_COUNT; i++) {
0176 if (dev->urbs[i]) {
0177 usb_kill_urb(dev->urbs[i]);
0178 if (!preallocate_big_buffers)
0179 kfree(dev->urbs[i]->transfer_buffer);
0180
0181 usb_free_urb(dev->urbs[i]);
0182 }
0183 }
0184
0185 return 0;
0186 }
0187
0188 static int start_urb_transfer(struct au0828_dev *dev)
0189 {
0190 struct urb *purb;
0191 int i, ret;
0192
0193 dprintk(2, "%s()\n", __func__);
0194
0195 if (dev->urb_streaming) {
0196 dprintk(2, "%s: bulk xfer already running!\n", __func__);
0197 return 0;
0198 }
0199
0200 for (i = 0; i < URB_COUNT; i++) {
0201
0202 dev->urbs[i] = usb_alloc_urb(0, GFP_KERNEL);
0203 if (!dev->urbs[i])
0204 return -ENOMEM;
0205
0206 purb = dev->urbs[i];
0207
0208 if (preallocate_big_buffers)
0209 purb->transfer_buffer = dev->dig_transfer_buffer[i];
0210 else
0211 purb->transfer_buffer = kzalloc(URB_BUFSIZE,
0212 GFP_KERNEL);
0213
0214 if (!purb->transfer_buffer) {
0215 usb_free_urb(purb);
0216 dev->urbs[i] = NULL;
0217 ret = -ENOMEM;
0218 pr_err("%s: failed big buffer allocation, err = %d\n",
0219 __func__, ret);
0220 return ret;
0221 }
0222
0223 purb->status = -EINPROGRESS;
0224 usb_fill_bulk_urb(purb,
0225 dev->usbdev,
0226 usb_rcvbulkpipe(dev->usbdev,
0227 _AU0828_BULKPIPE),
0228 purb->transfer_buffer,
0229 URB_BUFSIZE,
0230 urb_completion,
0231 dev);
0232
0233 }
0234
0235 for (i = 0; i < URB_COUNT; i++) {
0236 ret = usb_submit_urb(dev->urbs[i], GFP_ATOMIC);
0237 if (ret != 0) {
0238 stop_urb_transfer(dev);
0239 pr_err("%s: failed urb submission, err = %d\n",
0240 __func__, ret);
0241 return ret;
0242 }
0243 }
0244
0245 dev->urb_streaming = true;
0246
0247
0248 mod_timer(&dev->bulk_timeout, jiffies + (HZ));
0249 dev->bulk_timeout_running = 1;
0250
0251 return 0;
0252 }
0253
0254 static void au0828_start_transport(struct au0828_dev *dev)
0255 {
0256 au0828_write(dev, 0x608, 0x90);
0257 au0828_write(dev, 0x609, 0x72);
0258 au0828_write(dev, 0x60a, 0x71);
0259 au0828_write(dev, 0x60b, 0x01);
0260
0261 }
0262
0263 static void au0828_stop_transport(struct au0828_dev *dev, int full_stop)
0264 {
0265 if (full_stop) {
0266 au0828_write(dev, 0x608, 0x00);
0267 au0828_write(dev, 0x609, 0x00);
0268 au0828_write(dev, 0x60a, 0x00);
0269 }
0270 au0828_write(dev, 0x60b, 0x00);
0271 }
0272
0273 static int au0828_dvb_start_feed(struct dvb_demux_feed *feed)
0274 {
0275 struct dvb_demux *demux = feed->demux;
0276 struct au0828_dev *dev = (struct au0828_dev *) demux->priv;
0277 struct au0828_dvb *dvb = &dev->dvb;
0278 int ret = 0;
0279
0280 dprintk(1, "%s()\n", __func__);
0281
0282 if (!demux->dmx.frontend)
0283 return -EINVAL;
0284
0285 if (dvb->frontend) {
0286 mutex_lock(&dvb->lock);
0287 dvb->start_count++;
0288 dprintk(1, "%s(), start_count: %d, stop_count: %d\n", __func__,
0289 dvb->start_count, dvb->stop_count);
0290 if (dvb->feeding++ == 0) {
0291
0292 au0828_start_transport(dev);
0293 ret = start_urb_transfer(dev);
0294 if (ret < 0) {
0295 au0828_stop_transport(dev, 0);
0296 dvb->feeding--;
0297 }
0298 }
0299 mutex_unlock(&dvb->lock);
0300 }
0301
0302 return ret;
0303 }
0304
0305 static int au0828_dvb_stop_feed(struct dvb_demux_feed *feed)
0306 {
0307 struct dvb_demux *demux = feed->demux;
0308 struct au0828_dev *dev = (struct au0828_dev *) demux->priv;
0309 struct au0828_dvb *dvb = &dev->dvb;
0310 int ret = 0;
0311
0312 dprintk(1, "%s()\n", __func__);
0313
0314 if (dvb->frontend) {
0315 cancel_work_sync(&dev->restart_streaming);
0316
0317 mutex_lock(&dvb->lock);
0318 dvb->stop_count++;
0319 dprintk(1, "%s(), start_count: %d, stop_count: %d\n", __func__,
0320 dvb->start_count, dvb->stop_count);
0321 if (dvb->feeding > 0) {
0322 dvb->feeding--;
0323 if (dvb->feeding == 0) {
0324
0325 ret = stop_urb_transfer(dev);
0326 au0828_stop_transport(dev, 0);
0327 }
0328 }
0329 mutex_unlock(&dvb->lock);
0330 }
0331
0332 return ret;
0333 }
0334
0335 static void au0828_restart_dvb_streaming(struct work_struct *work)
0336 {
0337 struct au0828_dev *dev = container_of(work, struct au0828_dev,
0338 restart_streaming);
0339 struct au0828_dvb *dvb = &dev->dvb;
0340
0341 if (!dev->urb_streaming)
0342 return;
0343
0344 dprintk(1, "Restarting streaming...!\n");
0345
0346 mutex_lock(&dvb->lock);
0347
0348
0349 stop_urb_transfer(dev);
0350 au0828_stop_transport(dev, 1);
0351
0352
0353 au0828_start_transport(dev);
0354 start_urb_transfer(dev);
0355
0356 mutex_unlock(&dvb->lock);
0357 }
0358
0359 static int au0828_set_frontend(struct dvb_frontend *fe)
0360 {
0361 struct au0828_dev *dev = fe->dvb->priv;
0362 struct au0828_dvb *dvb = &dev->dvb;
0363 int ret, was_streaming;
0364
0365 mutex_lock(&dvb->lock);
0366 was_streaming = dev->urb_streaming;
0367 if (was_streaming) {
0368 au0828_stop_transport(dev, 1);
0369
0370
0371
0372
0373
0374 mutex_unlock(&dvb->lock);
0375 cancel_work_sync(&dev->restart_streaming);
0376 mutex_lock(&dvb->lock);
0377
0378 stop_urb_transfer(dev);
0379 }
0380 mutex_unlock(&dvb->lock);
0381
0382 ret = dvb->set_frontend(fe);
0383
0384 if (was_streaming) {
0385 mutex_lock(&dvb->lock);
0386 au0828_start_transport(dev);
0387 start_urb_transfer(dev);
0388 mutex_unlock(&dvb->lock);
0389 }
0390
0391 return ret;
0392 }
0393
0394 static int dvb_register(struct au0828_dev *dev)
0395 {
0396 struct au0828_dvb *dvb = &dev->dvb;
0397 int result;
0398
0399 dprintk(1, "%s()\n", __func__);
0400
0401 if (preallocate_big_buffers) {
0402 int i;
0403 for (i = 0; i < URB_COUNT; i++) {
0404 dev->dig_transfer_buffer[i] = kzalloc(URB_BUFSIZE,
0405 GFP_KERNEL);
0406
0407 if (!dev->dig_transfer_buffer[i]) {
0408 result = -ENOMEM;
0409
0410 pr_err("failed buffer allocation (errno = %d)\n",
0411 result);
0412 goto fail_adapter;
0413 }
0414 }
0415 }
0416
0417 INIT_WORK(&dev->restart_streaming, au0828_restart_dvb_streaming);
0418
0419
0420 result = dvb_register_adapter(&dvb->adapter,
0421 KBUILD_MODNAME, THIS_MODULE,
0422 &dev->usbdev->dev, adapter_nr);
0423 if (result < 0) {
0424 pr_err("dvb_register_adapter failed (errno = %d)\n",
0425 result);
0426 goto fail_adapter;
0427 }
0428
0429 #ifdef CONFIG_MEDIA_CONTROLLER_DVB
0430 dvb->adapter.mdev = dev->media_dev;
0431 #endif
0432
0433 dvb->adapter.priv = dev;
0434
0435
0436 result = dvb_register_frontend(&dvb->adapter, dvb->frontend);
0437 if (result < 0) {
0438 pr_err("dvb_register_frontend failed (errno = %d)\n",
0439 result);
0440 goto fail_frontend;
0441 }
0442
0443
0444 dvb->set_frontend = dvb->frontend->ops.set_frontend;
0445 dvb->frontend->ops.set_frontend = au0828_set_frontend;
0446
0447
0448 dvb->demux.dmx.capabilities =
0449 DMX_TS_FILTERING | DMX_SECTION_FILTERING |
0450 DMX_MEMORY_BASED_FILTERING;
0451 dvb->demux.priv = dev;
0452 dvb->demux.filternum = 256;
0453 dvb->demux.feednum = 256;
0454 dvb->demux.start_feed = au0828_dvb_start_feed;
0455 dvb->demux.stop_feed = au0828_dvb_stop_feed;
0456 result = dvb_dmx_init(&dvb->demux);
0457 if (result < 0) {
0458 pr_err("dvb_dmx_init failed (errno = %d)\n", result);
0459 goto fail_dmx;
0460 }
0461
0462 dvb->dmxdev.filternum = 256;
0463 dvb->dmxdev.demux = &dvb->demux.dmx;
0464 dvb->dmxdev.capabilities = 0;
0465 result = dvb_dmxdev_init(&dvb->dmxdev, &dvb->adapter);
0466 if (result < 0) {
0467 pr_err("dvb_dmxdev_init failed (errno = %d)\n", result);
0468 goto fail_dmxdev;
0469 }
0470
0471 dvb->fe_hw.source = DMX_FRONTEND_0;
0472 result = dvb->demux.dmx.add_frontend(&dvb->demux.dmx, &dvb->fe_hw);
0473 if (result < 0) {
0474 pr_err("add_frontend failed (DMX_FRONTEND_0, errno = %d)\n",
0475 result);
0476 goto fail_fe_hw;
0477 }
0478
0479 dvb->fe_mem.source = DMX_MEMORY_FE;
0480 result = dvb->demux.dmx.add_frontend(&dvb->demux.dmx, &dvb->fe_mem);
0481 if (result < 0) {
0482 pr_err("add_frontend failed (DMX_MEMORY_FE, errno = %d)\n",
0483 result);
0484 goto fail_fe_mem;
0485 }
0486
0487 result = dvb->demux.dmx.connect_frontend(&dvb->demux.dmx, &dvb->fe_hw);
0488 if (result < 0) {
0489 pr_err("connect_frontend failed (errno = %d)\n", result);
0490 goto fail_fe_conn;
0491 }
0492
0493
0494 dvb_net_init(&dvb->adapter, &dvb->net, &dvb->demux.dmx);
0495
0496 dvb->start_count = 0;
0497 dvb->stop_count = 0;
0498
0499 result = dvb_create_media_graph(&dvb->adapter, false);
0500 if (result < 0)
0501 goto fail_create_graph;
0502
0503 return 0;
0504
0505 fail_create_graph:
0506 dvb_net_release(&dvb->net);
0507 fail_fe_conn:
0508 dvb->demux.dmx.remove_frontend(&dvb->demux.dmx, &dvb->fe_mem);
0509 fail_fe_mem:
0510 dvb->demux.dmx.remove_frontend(&dvb->demux.dmx, &dvb->fe_hw);
0511 fail_fe_hw:
0512 dvb_dmxdev_release(&dvb->dmxdev);
0513 fail_dmxdev:
0514 dvb_dmx_release(&dvb->demux);
0515 fail_dmx:
0516 dvb_unregister_frontend(dvb->frontend);
0517 fail_frontend:
0518 dvb_frontend_detach(dvb->frontend);
0519 dvb_unregister_adapter(&dvb->adapter);
0520 fail_adapter:
0521
0522 if (preallocate_big_buffers) {
0523 int i;
0524 for (i = 0; i < URB_COUNT; i++)
0525 kfree(dev->dig_transfer_buffer[i]);
0526 }
0527
0528 return result;
0529 }
0530
0531 void au0828_dvb_unregister(struct au0828_dev *dev)
0532 {
0533 struct au0828_dvb *dvb = &dev->dvb;
0534
0535 dprintk(1, "%s()\n", __func__);
0536
0537 if (dvb->frontend == NULL)
0538 return;
0539
0540 cancel_work_sync(&dev->restart_streaming);
0541
0542 dvb_net_release(&dvb->net);
0543 dvb->demux.dmx.remove_frontend(&dvb->demux.dmx, &dvb->fe_mem);
0544 dvb->demux.dmx.remove_frontend(&dvb->demux.dmx, &dvb->fe_hw);
0545 dvb_dmxdev_release(&dvb->dmxdev);
0546 dvb_dmx_release(&dvb->demux);
0547 dvb_unregister_frontend(dvb->frontend);
0548 dvb_frontend_detach(dvb->frontend);
0549 dvb_unregister_adapter(&dvb->adapter);
0550
0551 if (preallocate_big_buffers) {
0552 int i;
0553 for (i = 0; i < URB_COUNT; i++)
0554 kfree(dev->dig_transfer_buffer[i]);
0555 }
0556 dvb->frontend = NULL;
0557 }
0558
0559
0560
0561
0562
0563 int au0828_dvb_register(struct au0828_dev *dev)
0564 {
0565 struct au0828_dvb *dvb = &dev->dvb;
0566 int ret;
0567
0568 dprintk(1, "%s()\n", __func__);
0569
0570
0571 switch (dev->boardnr) {
0572 case AU0828_BOARD_HAUPPAUGE_HVR850:
0573 case AU0828_BOARD_HAUPPAUGE_HVR950Q:
0574 dvb->frontend = dvb_attach(au8522_attach,
0575 &hauppauge_hvr950q_config,
0576 &dev->i2c_adap);
0577 if (dvb->frontend != NULL)
0578 switch (dev->board.tuner_type) {
0579 default:
0580 case TUNER_XC5000:
0581 dvb_attach(xc5000_attach, dvb->frontend,
0582 &dev->i2c_adap,
0583 &hauppauge_xc5000a_config);
0584 break;
0585 case TUNER_XC5000C:
0586 dvb_attach(xc5000_attach, dvb->frontend,
0587 &dev->i2c_adap,
0588 &hauppauge_xc5000c_config);
0589 break;
0590 }
0591 break;
0592 case AU0828_BOARD_HAUPPAUGE_HVR950Q_MXL:
0593 dvb->frontend = dvb_attach(au8522_attach,
0594 &hauppauge_hvr950q_config,
0595 &dev->i2c_adap);
0596 if (dvb->frontend != NULL)
0597 dvb_attach(mxl5007t_attach, dvb->frontend,
0598 &dev->i2c_adap, 0x60,
0599 &mxl5007t_hvr950q_config);
0600 break;
0601 case AU0828_BOARD_HAUPPAUGE_WOODBURY:
0602 dvb->frontend = dvb_attach(au8522_attach,
0603 &hauppauge_woodbury_config,
0604 &dev->i2c_adap);
0605 if (dvb->frontend != NULL)
0606 dvb_attach(tda18271_attach, dvb->frontend,
0607 0x60, &dev->i2c_adap,
0608 &hauppauge_woodbury_tunerconfig);
0609 break;
0610 case AU0828_BOARD_DVICO_FUSIONHDTV7:
0611 dvb->frontend = dvb_attach(au8522_attach,
0612 &fusionhdtv7usb_config,
0613 &dev->i2c_adap);
0614 if (dvb->frontend != NULL) {
0615 dvb_attach(xc5000_attach, dvb->frontend,
0616 &dev->i2c_adap,
0617 &hauppauge_xc5000a_config);
0618 }
0619 break;
0620 default:
0621 pr_warn("The frontend of your DVB/ATSC card isn't supported yet\n");
0622 break;
0623 }
0624 if (NULL == dvb->frontend) {
0625 pr_err("%s() Frontend initialization failed\n",
0626 __func__);
0627 return -1;
0628 }
0629
0630 dvb->frontend->callback = au0828_tuner_callback;
0631
0632
0633 ret = dvb_register(dev);
0634 if (ret < 0) {
0635 if (dvb->frontend->ops.release)
0636 dvb->frontend->ops.release(dvb->frontend);
0637 dvb->frontend = NULL;
0638 return ret;
0639 }
0640
0641 timer_setup(&dev->bulk_timeout, au0828_bulk_timeout, 0);
0642
0643 return 0;
0644 }
0645
0646 void au0828_dvb_suspend(struct au0828_dev *dev)
0647 {
0648 struct au0828_dvb *dvb = &dev->dvb;
0649 int rc;
0650
0651 if (dvb->frontend) {
0652 if (dev->urb_streaming) {
0653 cancel_work_sync(&dev->restart_streaming);
0654
0655 mutex_lock(&dvb->lock);
0656 stop_urb_transfer(dev);
0657 au0828_stop_transport(dev, 1);
0658 mutex_unlock(&dvb->lock);
0659 dev->need_urb_start = true;
0660 }
0661
0662 rc = dvb_frontend_suspend(dvb->frontend);
0663 pr_info("au0828_dvb_suspend(): Suspending DVB fe %d\n", rc);
0664 }
0665 }
0666
0667 void au0828_dvb_resume(struct au0828_dev *dev)
0668 {
0669 struct au0828_dvb *dvb = &dev->dvb;
0670 int rc;
0671
0672 if (dvb->frontend) {
0673
0674 rc = dvb_frontend_resume(dvb->frontend);
0675 pr_info("au0828_dvb_resume(): Resuming DVB fe %d\n", rc);
0676 if (dev->need_urb_start) {
0677
0678 mutex_lock(&dvb->lock);
0679 au0828_start_transport(dev);
0680 start_urb_transfer(dev);
0681 mutex_unlock(&dvb->lock);
0682 }
0683 }
0684 }