[go: nahoru, domu]

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