1/*
2 *
3 *  Support for the mpeg transport stream transfers
4 *  PCI function #2 of the cx2388x.
5 *
6 *    (c) 2004 Jelle Foks <jelle@foks.us>
7 *    (c) 2004 Chris Pascoe <c.pascoe@itee.uq.edu.au>
8 *    (c) 2004 Gerd Knorr <kraxel@bytesex.org>
9 *
10 *  This program is free software; you can redistribute it and/or modify
11 *  it under the terms of the GNU General Public License as published by
12 *  the Free Software Foundation; either version 2 of the License, or
13 *  (at your option) any later version.
14 *
15 *  This program is distributed in the hope that it will be useful,
16 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
17 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 *  GNU General Public License for more details.
19 *
20 *  You should have received a copy of the GNU General Public License
21 *  along with this program; if not, write to the Free Software
22 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 */
24
25#include <linux/module.h>
26#include <linux/slab.h>
27#include <linux/init.h>
28#include <linux/device.h>
29#include <linux/dma-mapping.h>
30#include <linux/interrupt.h>
31#include <asm/delay.h>
32
33#include "cx88.h"
34
35/* ------------------------------------------------------------------ */
36
37MODULE_DESCRIPTION("mpeg driver for cx2388x based TV cards");
38MODULE_AUTHOR("Jelle Foks <jelle@foks.us>");
39MODULE_AUTHOR("Chris Pascoe <c.pascoe@itee.uq.edu.au>");
40MODULE_AUTHOR("Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]");
41MODULE_LICENSE("GPL");
42MODULE_VERSION(CX88_VERSION);
43
44static unsigned int debug;
45module_param(debug,int,0644);
46MODULE_PARM_DESC(debug,"enable debug messages [mpeg]");
47
48#define dprintk(level, fmt, arg...) do {				       \
49	if (debug + 1 > level)						       \
50		printk(KERN_DEBUG "%s/2-mpeg: " fmt, dev->core->name, ## arg); \
51} while(0)
52
53#define mpeg_dbg(level, fmt, arg...) do {				  \
54	if (debug + 1 > level)						  \
55		printk(KERN_DEBUG "%s/2-mpeg: " fmt, core->name, ## arg); \
56} while(0)
57
58#if defined(CONFIG_MODULES) && defined(MODULE)
59static void request_module_async(struct work_struct *work)
60{
61	struct cx8802_dev *dev=container_of(work, struct cx8802_dev, request_module_wk);
62
63	if (dev->core->board.mpeg & CX88_MPEG_DVB)
64		request_module("cx88-dvb");
65	if (dev->core->board.mpeg & CX88_MPEG_BLACKBIRD)
66		request_module("cx88-blackbird");
67}
68
69static void request_modules(struct cx8802_dev *dev)
70{
71	INIT_WORK(&dev->request_module_wk, request_module_async);
72	schedule_work(&dev->request_module_wk);
73}
74
75static void flush_request_modules(struct cx8802_dev *dev)
76{
77	flush_work(&dev->request_module_wk);
78}
79#else
80#define request_modules(dev)
81#define flush_request_modules(dev)
82#endif /* CONFIG_MODULES */
83
84
85static LIST_HEAD(cx8802_devlist);
86static DEFINE_MUTEX(cx8802_mutex);
87/* ------------------------------------------------------------------ */
88
89int cx8802_start_dma(struct cx8802_dev    *dev,
90			    struct cx88_dmaqueue *q,
91			    struct cx88_buffer   *buf)
92{
93	struct cx88_core *core = dev->core;
94
95	dprintk(1, "cx8802_start_dma w: %d, h: %d, f: %d\n",
96		core->width, core->height, core->field);
97
98	/* setup fifo + format */
99	cx88_sram_channel_setup(core, &cx88_sram_channels[SRAM_CH28],
100				dev->ts_packet_size, buf->risc.dma);
101
102	/* write TS length to chip */
103	cx_write(MO_TS_LNGTH, dev->ts_packet_size);
104
105	/* FIXME: this needs a review.
106	 * also: move to cx88-blackbird + cx88-dvb source files? */
107
108	dprintk( 1, "core->active_type_id = 0x%08x\n", core->active_type_id);
109
110	if ( (core->active_type_id == CX88_MPEG_DVB) &&
111		(core->board.mpeg & CX88_MPEG_DVB) ) {
112
113		dprintk( 1, "cx8802_start_dma doing .dvb\n");
114		/* negedge driven & software reset */
115		cx_write(TS_GEN_CNTRL, 0x0040 | dev->ts_gen_cntrl);
116		udelay(100);
117		cx_write(MO_PINMUX_IO, 0x00);
118		cx_write(TS_HW_SOP_CNTRL, 0x47<<16|188<<4|0x01);
119		switch (core->boardnr) {
120		case CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_Q:
121		case CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_T:
122		case CX88_BOARD_DVICO_FUSIONHDTV_5_GOLD:
123		case CX88_BOARD_PCHDTV_HD5500:
124			cx_write(TS_SOP_STAT, 1<<13);
125			break;
126		case CX88_BOARD_SAMSUNG_SMT_7020:
127			cx_write(TS_SOP_STAT, 0x00);
128			break;
129		case CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1:
130		case CX88_BOARD_HAUPPAUGE_NOVASE2_S1:
131			cx_write(MO_PINMUX_IO, 0x88); /* Enable MPEG parallel IO and video signal pins */
132			udelay(100);
133			break;
134		case CX88_BOARD_HAUPPAUGE_HVR1300:
135			/* Enable MPEG parallel IO and video signal pins */
136			cx_write(MO_PINMUX_IO, 0x88);
137			cx_write(TS_SOP_STAT, 0);
138			cx_write(TS_VALERR_CNTRL, 0);
139			break;
140		case CX88_BOARD_PINNACLE_PCTV_HD_800i:
141			/* Enable MPEG parallel IO and video signal pins */
142			cx_write(MO_PINMUX_IO, 0x88);
143			cx_write(TS_HW_SOP_CNTRL, (0x47 << 16) | (188 << 4));
144			dev->ts_gen_cntrl = 5;
145			cx_write(TS_SOP_STAT, 0);
146			cx_write(TS_VALERR_CNTRL, 0);
147			udelay(100);
148			break;
149		default:
150			cx_write(TS_SOP_STAT, 0x00);
151			break;
152		}
153		cx_write(TS_GEN_CNTRL, dev->ts_gen_cntrl);
154		udelay(100);
155	} else if ( (core->active_type_id == CX88_MPEG_BLACKBIRD) &&
156		(core->board.mpeg & CX88_MPEG_BLACKBIRD) ) {
157		dprintk( 1, "cx8802_start_dma doing .blackbird\n");
158		cx_write(MO_PINMUX_IO, 0x88); /* enable MPEG parallel IO */
159
160		cx_write(TS_GEN_CNTRL, 0x46); /* punctured clock TS & posedge driven & software reset */
161		udelay(100);
162
163		cx_write(TS_HW_SOP_CNTRL, 0x408); /* mpeg start byte */
164		cx_write(TS_VALERR_CNTRL, 0x2000);
165
166		cx_write(TS_GEN_CNTRL, 0x06); /* punctured clock TS & posedge driven */
167		udelay(100);
168	} else {
169		printk( "%s() Failed. Unsupported value in .mpeg (0x%08x)\n", __func__,
170			core->board.mpeg );
171		return -EINVAL;
172	}
173
174	/* reset counter */
175	cx_write(MO_TS_GPCNTRL, GP_COUNT_CONTROL_RESET);
176	q->count = 1;
177
178	/* enable irqs */
179	dprintk( 1, "setting the interrupt mask\n" );
180	cx_set(MO_PCI_INTMSK, core->pci_irqmask | PCI_INT_TSINT);
181	cx_set(MO_TS_INTMSK,  0x1f0011);
182
183	/* start dma */
184	cx_set(MO_DEV_CNTRL2, (1<<5));
185	cx_set(MO_TS_DMACNTRL, 0x11);
186	return 0;
187}
188
189static int cx8802_stop_dma(struct cx8802_dev *dev)
190{
191	struct cx88_core *core = dev->core;
192	dprintk( 1, "cx8802_stop_dma\n" );
193
194	/* stop dma */
195	cx_clear(MO_TS_DMACNTRL, 0x11);
196
197	/* disable irqs */
198	cx_clear(MO_PCI_INTMSK, PCI_INT_TSINT);
199	cx_clear(MO_TS_INTMSK, 0x1f0011);
200
201	/* Reset the controller */
202	cx_write(TS_GEN_CNTRL, 0xcd);
203	return 0;
204}
205
206static int cx8802_restart_queue(struct cx8802_dev    *dev,
207				struct cx88_dmaqueue *q)
208{
209	struct cx88_buffer *buf;
210
211	dprintk( 1, "cx8802_restart_queue\n" );
212	if (list_empty(&q->active))
213		return 0;
214
215	buf = list_entry(q->active.next, struct cx88_buffer, list);
216	dprintk(2,"restart_queue [%p/%d]: restart dma\n",
217		buf, buf->vb.v4l2_buf.index);
218	cx8802_start_dma(dev, q, buf);
219	list_for_each_entry(buf, &q->active, list)
220		buf->count = q->count++;
221	return 0;
222}
223
224/* ------------------------------------------------------------------ */
225
226int cx8802_buf_prepare(struct vb2_queue *q, struct cx8802_dev *dev,
227			struct cx88_buffer *buf)
228{
229	int size = dev->ts_packet_size * dev->ts_packet_count;
230	struct sg_table *sgt = vb2_dma_sg_plane_desc(&buf->vb, 0);
231	struct cx88_riscmem *risc = &buf->risc;
232	int rc;
233
234	if (vb2_plane_size(&buf->vb, 0) < size)
235		return -EINVAL;
236	vb2_set_plane_payload(&buf->vb, 0, size);
237
238	rc = cx88_risc_databuffer(dev->pci, risc, sgt->sgl,
239			     dev->ts_packet_size, dev->ts_packet_count, 0);
240	if (rc) {
241		if (risc->cpu)
242			pci_free_consistent(dev->pci, risc->size, risc->cpu, risc->dma);
243		memset(risc, 0, sizeof(*risc));
244		return rc;
245	}
246	return 0;
247}
248
249void cx8802_buf_queue(struct cx8802_dev *dev, struct cx88_buffer *buf)
250{
251	struct cx88_buffer    *prev;
252	struct cx88_dmaqueue  *cx88q = &dev->mpegq;
253
254	dprintk( 1, "cx8802_buf_queue\n" );
255	/* add jump to start */
256	buf->risc.cpu[1] = cpu_to_le32(buf->risc.dma + 8);
257	buf->risc.jmp[0] = cpu_to_le32(RISC_JUMP | RISC_CNT_INC);
258	buf->risc.jmp[1] = cpu_to_le32(buf->risc.dma + 8);
259
260	if (list_empty(&cx88q->active)) {
261		dprintk( 1, "queue is empty - first active\n" );
262		list_add_tail(&buf->list, &cx88q->active);
263		buf->count    = cx88q->count++;
264		dprintk(1,"[%p/%d] %s - first active\n",
265			buf, buf->vb.v4l2_buf.index, __func__);
266
267	} else {
268		buf->risc.cpu[0] |= cpu_to_le32(RISC_IRQ1);
269		dprintk( 1, "queue is not empty - append to active\n" );
270		prev = list_entry(cx88q->active.prev, struct cx88_buffer, list);
271		list_add_tail(&buf->list, &cx88q->active);
272		buf->count    = cx88q->count++;
273		prev->risc.jmp[1] = cpu_to_le32(buf->risc.dma);
274		dprintk( 1, "[%p/%d] %s - append to active\n",
275			buf, buf->vb.v4l2_buf.index, __func__);
276	}
277}
278
279/* ----------------------------------------------------------- */
280
281static void do_cancel_buffers(struct cx8802_dev *dev)
282{
283	struct cx88_dmaqueue *q = &dev->mpegq;
284	struct cx88_buffer *buf;
285	unsigned long flags;
286
287	spin_lock_irqsave(&dev->slock,flags);
288	while (!list_empty(&q->active)) {
289		buf = list_entry(q->active.next, struct cx88_buffer, list);
290		list_del(&buf->list);
291		vb2_buffer_done(&buf->vb, VB2_BUF_STATE_ERROR);
292	}
293	spin_unlock_irqrestore(&dev->slock,flags);
294}
295
296void cx8802_cancel_buffers(struct cx8802_dev *dev)
297{
298	dprintk( 1, "cx8802_cancel_buffers" );
299	cx8802_stop_dma(dev);
300	do_cancel_buffers(dev);
301}
302
303static const char * cx88_mpeg_irqs[32] = {
304	"ts_risci1", NULL, NULL, NULL,
305	"ts_risci2", NULL, NULL, NULL,
306	"ts_oflow",  NULL, NULL, NULL,
307	"ts_sync",   NULL, NULL, NULL,
308	"opc_err", "par_err", "rip_err", "pci_abort",
309	"ts_err?",
310};
311
312static void cx8802_mpeg_irq(struct cx8802_dev *dev)
313{
314	struct cx88_core *core = dev->core;
315	u32 status, mask, count;
316
317	dprintk( 1, "cx8802_mpeg_irq\n" );
318	status = cx_read(MO_TS_INTSTAT);
319	mask   = cx_read(MO_TS_INTMSK);
320	if (0 == (status & mask))
321		return;
322
323	cx_write(MO_TS_INTSTAT, status);
324
325	if (debug || (status & mask & ~0xff))
326		cx88_print_irqbits(core->name, "irq mpeg ",
327				   cx88_mpeg_irqs, ARRAY_SIZE(cx88_mpeg_irqs),
328				   status, mask);
329
330	/* risc op code error */
331	if (status & (1 << 16)) {
332		printk(KERN_WARNING "%s: mpeg risc op code error\n",core->name);
333		cx_clear(MO_TS_DMACNTRL, 0x11);
334		cx88_sram_channel_dump(dev->core, &cx88_sram_channels[SRAM_CH28]);
335	}
336
337	/* risc1 y */
338	if (status & 0x01) {
339		dprintk( 1, "wake up\n" );
340		spin_lock(&dev->slock);
341		count = cx_read(MO_TS_GPCNT);
342		cx88_wakeup(dev->core, &dev->mpegq, count);
343		spin_unlock(&dev->slock);
344	}
345
346	/* other general errors */
347	if (status & 0x1f0100) {
348		dprintk( 0, "general errors: 0x%08x\n", status & 0x1f0100 );
349		spin_lock(&dev->slock);
350		cx8802_stop_dma(dev);
351		spin_unlock(&dev->slock);
352	}
353}
354
355#define MAX_IRQ_LOOP 10
356
357static irqreturn_t cx8802_irq(int irq, void *dev_id)
358{
359	struct cx8802_dev *dev = dev_id;
360	struct cx88_core *core = dev->core;
361	u32 status;
362	int loop, handled = 0;
363
364	for (loop = 0; loop < MAX_IRQ_LOOP; loop++) {
365		status = cx_read(MO_PCI_INTSTAT) &
366			(core->pci_irqmask | PCI_INT_TSINT);
367		if (0 == status)
368			goto out;
369		dprintk( 1, "cx8802_irq\n" );
370		dprintk( 1, "    loop: %d/%d\n", loop, MAX_IRQ_LOOP );
371		dprintk( 1, "    status: %d\n", status );
372		handled = 1;
373		cx_write(MO_PCI_INTSTAT, status);
374
375		if (status & core->pci_irqmask)
376			cx88_core_irq(core,status);
377		if (status & PCI_INT_TSINT)
378			cx8802_mpeg_irq(dev);
379	}
380	if (MAX_IRQ_LOOP == loop) {
381		dprintk( 0, "clearing mask\n" );
382		printk(KERN_WARNING "%s/0: irq loop -- clearing mask\n",
383		       core->name);
384		cx_write(MO_PCI_INTMSK,0);
385	}
386
387 out:
388	return IRQ_RETVAL(handled);
389}
390
391static int cx8802_init_common(struct cx8802_dev *dev)
392{
393	struct cx88_core *core = dev->core;
394	int err;
395
396	/* pci init */
397	if (pci_enable_device(dev->pci))
398		return -EIO;
399	pci_set_master(dev->pci);
400	if (!pci_dma_supported(dev->pci,DMA_BIT_MASK(32))) {
401		printk("%s/2: Oops: no 32bit PCI DMA ???\n",dev->core->name);
402		return -EIO;
403	}
404
405	dev->pci_rev = dev->pci->revision;
406	pci_read_config_byte(dev->pci, PCI_LATENCY_TIMER,  &dev->pci_lat);
407	printk(KERN_INFO "%s/2: found at %s, rev: %d, irq: %d, "
408	       "latency: %d, mmio: 0x%llx\n", dev->core->name,
409	       pci_name(dev->pci), dev->pci_rev, dev->pci->irq,
410	       dev->pci_lat,(unsigned long long)pci_resource_start(dev->pci,0));
411
412	/* initialize driver struct */
413	spin_lock_init(&dev->slock);
414
415	/* init dma queue */
416	INIT_LIST_HEAD(&dev->mpegq.active);
417
418	/* get irq */
419	err = request_irq(dev->pci->irq, cx8802_irq,
420			  IRQF_SHARED, dev->core->name, dev);
421	if (err < 0) {
422		printk(KERN_ERR "%s: can't get IRQ %d\n",
423		       dev->core->name, dev->pci->irq);
424		return err;
425	}
426	cx_set(MO_PCI_INTMSK, core->pci_irqmask);
427
428	/* everything worked */
429	pci_set_drvdata(dev->pci,dev);
430	return 0;
431}
432
433static void cx8802_fini_common(struct cx8802_dev *dev)
434{
435	dprintk( 2, "cx8802_fini_common\n" );
436	cx8802_stop_dma(dev);
437	pci_disable_device(dev->pci);
438
439	/* unregister stuff */
440	free_irq(dev->pci->irq, dev);
441}
442
443/* ----------------------------------------------------------- */
444
445static int cx8802_suspend_common(struct pci_dev *pci_dev, pm_message_t state)
446{
447	struct cx8802_dev *dev = pci_get_drvdata(pci_dev);
448	struct cx88_core *core = dev->core;
449	unsigned long flags;
450
451	/* stop mpeg dma */
452	spin_lock_irqsave(&dev->slock, flags);
453	if (!list_empty(&dev->mpegq.active)) {
454		dprintk( 2, "suspend\n" );
455		printk("%s: suspend mpeg\n", core->name);
456		cx8802_stop_dma(dev);
457	}
458	spin_unlock_irqrestore(&dev->slock, flags);
459
460	/* FIXME -- shutdown device */
461	cx88_shutdown(dev->core);
462
463	pci_save_state(pci_dev);
464	if (0 != pci_set_power_state(pci_dev, pci_choose_state(pci_dev, state))) {
465		pci_disable_device(pci_dev);
466		dev->state.disabled = 1;
467	}
468	return 0;
469}
470
471static int cx8802_resume_common(struct pci_dev *pci_dev)
472{
473	struct cx8802_dev *dev = pci_get_drvdata(pci_dev);
474	struct cx88_core *core = dev->core;
475	unsigned long flags;
476	int err;
477
478	if (dev->state.disabled) {
479		err=pci_enable_device(pci_dev);
480		if (err) {
481			printk(KERN_ERR "%s: can't enable device\n",
482					       dev->core->name);
483			return err;
484		}
485		dev->state.disabled = 0;
486	}
487	err=pci_set_power_state(pci_dev, PCI_D0);
488	if (err) {
489		printk(KERN_ERR "%s: can't enable device\n",
490					       dev->core->name);
491		pci_disable_device(pci_dev);
492		dev->state.disabled = 1;
493
494		return err;
495	}
496	pci_restore_state(pci_dev);
497
498	/* FIXME: re-initialize hardware */
499	cx88_reset(dev->core);
500
501	/* restart video+vbi capture */
502	spin_lock_irqsave(&dev->slock, flags);
503	if (!list_empty(&dev->mpegq.active)) {
504		printk("%s: resume mpeg\n", core->name);
505		cx8802_restart_queue(dev,&dev->mpegq);
506	}
507	spin_unlock_irqrestore(&dev->slock, flags);
508
509	return 0;
510}
511
512struct cx8802_driver * cx8802_get_driver(struct cx8802_dev *dev, enum cx88_board_type btype)
513{
514	struct cx8802_driver *d;
515
516	list_for_each_entry(d, &dev->drvlist, drvlist)
517		if (d->type_id == btype)
518			return d;
519
520	return NULL;
521}
522
523/* Driver asked for hardware access. */
524static int cx8802_request_acquire(struct cx8802_driver *drv)
525{
526	struct cx88_core *core = drv->core;
527	unsigned int	i;
528
529	/* Fail a request for hardware if the device is busy. */
530	if (core->active_type_id != CX88_BOARD_NONE &&
531	    core->active_type_id != drv->type_id)
532		return -EBUSY;
533
534	if (drv->type_id == CX88_MPEG_DVB) {
535		/* When switching to DVB, always set the input to the tuner */
536		core->last_analog_input = core->input;
537		core->input = 0;
538		for (i = 0;
539		     i < (sizeof(core->board.input) / sizeof(struct cx88_input));
540		     i++) {
541			if (core->board.input[i].type == CX88_VMUX_DVB) {
542				core->input = i;
543				break;
544			}
545		}
546	}
547
548	if (drv->advise_acquire)
549	{
550		core->active_ref++;
551		if (core->active_type_id == CX88_BOARD_NONE) {
552			core->active_type_id = drv->type_id;
553			drv->advise_acquire(drv);
554		}
555
556		mpeg_dbg(1,"%s() Post acquire GPIO=%x\n", __func__, cx_read(MO_GP0_IO));
557	}
558
559	return 0;
560}
561
562/* Driver asked to release hardware. */
563static int cx8802_request_release(struct cx8802_driver *drv)
564{
565	struct cx88_core *core = drv->core;
566
567	if (drv->advise_release && --core->active_ref == 0)
568	{
569		if (drv->type_id == CX88_MPEG_DVB) {
570			/* If the DVB driver is releasing, reset the input
571			   state to the last configured analog input */
572			core->input = core->last_analog_input;
573		}
574
575		drv->advise_release(drv);
576		core->active_type_id = CX88_BOARD_NONE;
577		mpeg_dbg(1,"%s() Post release GPIO=%x\n", __func__, cx_read(MO_GP0_IO));
578	}
579
580	return 0;
581}
582
583static int cx8802_check_driver(struct cx8802_driver *drv)
584{
585	if (drv == NULL)
586		return -ENODEV;
587
588	if ((drv->type_id != CX88_MPEG_DVB) &&
589		(drv->type_id != CX88_MPEG_BLACKBIRD))
590		return -EINVAL;
591
592	if ((drv->hw_access != CX8802_DRVCTL_SHARED) &&
593		(drv->hw_access != CX8802_DRVCTL_EXCLUSIVE))
594		return -EINVAL;
595
596	if ((drv->probe == NULL) ||
597		(drv->remove == NULL) ||
598		(drv->advise_acquire == NULL) ||
599		(drv->advise_release == NULL))
600		return -EINVAL;
601
602	return 0;
603}
604
605int cx8802_register_driver(struct cx8802_driver *drv)
606{
607	struct cx8802_dev *dev;
608	struct cx8802_driver *driver;
609	int err, i = 0;
610
611	printk(KERN_INFO
612	       "cx88/2: registering cx8802 driver, type: %s access: %s\n",
613	       drv->type_id == CX88_MPEG_DVB ? "dvb" : "blackbird",
614	       drv->hw_access == CX8802_DRVCTL_SHARED ? "shared" : "exclusive");
615
616	if ((err = cx8802_check_driver(drv)) != 0) {
617		printk(KERN_ERR "cx88/2: cx8802_driver is invalid\n");
618		return err;
619	}
620
621	mutex_lock(&cx8802_mutex);
622
623	list_for_each_entry(dev, &cx8802_devlist, devlist) {
624		printk(KERN_INFO
625		       "%s/2: subsystem: %04x:%04x, board: %s [card=%d]\n",
626		       dev->core->name, dev->pci->subsystem_vendor,
627		       dev->pci->subsystem_device, dev->core->board.name,
628		       dev->core->boardnr);
629
630		/* Bring up a new struct for each driver instance */
631		driver = kzalloc(sizeof(*drv),GFP_KERNEL);
632		if (driver == NULL) {
633			err = -ENOMEM;
634			goto out;
635		}
636
637		/* Snapshot of the driver registration data */
638		drv->core = dev->core;
639		drv->suspend = cx8802_suspend_common;
640		drv->resume = cx8802_resume_common;
641		drv->request_acquire = cx8802_request_acquire;
642		drv->request_release = cx8802_request_release;
643		memcpy(driver, drv, sizeof(*driver));
644
645		mutex_lock(&drv->core->lock);
646		err = drv->probe(driver);
647		if (err == 0) {
648			i++;
649			list_add_tail(&driver->drvlist, &dev->drvlist);
650		} else {
651			printk(KERN_ERR
652			       "%s/2: cx8802 probe failed, err = %d\n",
653			       dev->core->name, err);
654		}
655		mutex_unlock(&drv->core->lock);
656	}
657
658	err = i ? 0 : -ENODEV;
659out:
660	mutex_unlock(&cx8802_mutex);
661	return err;
662}
663
664int cx8802_unregister_driver(struct cx8802_driver *drv)
665{
666	struct cx8802_dev *dev;
667	struct cx8802_driver *d, *dtmp;
668	int err = 0;
669
670	printk(KERN_INFO
671	       "cx88/2: unregistering cx8802 driver, type: %s access: %s\n",
672	       drv->type_id == CX88_MPEG_DVB ? "dvb" : "blackbird",
673	       drv->hw_access == CX8802_DRVCTL_SHARED ? "shared" : "exclusive");
674
675	mutex_lock(&cx8802_mutex);
676
677	list_for_each_entry(dev, &cx8802_devlist, devlist) {
678		printk(KERN_INFO
679		       "%s/2: subsystem: %04x:%04x, board: %s [card=%d]\n",
680		       dev->core->name, dev->pci->subsystem_vendor,
681		       dev->pci->subsystem_device, dev->core->board.name,
682		       dev->core->boardnr);
683
684		mutex_lock(&dev->core->lock);
685
686		list_for_each_entry_safe(d, dtmp, &dev->drvlist, drvlist) {
687			/* only unregister the correct driver type */
688			if (d->type_id != drv->type_id)
689				continue;
690
691			err = d->remove(d);
692			if (err == 0) {
693				list_del(&d->drvlist);
694				kfree(d);
695			} else
696				printk(KERN_ERR "%s/2: cx8802 driver remove "
697				       "failed (%d)\n", dev->core->name, err);
698		}
699
700		mutex_unlock(&dev->core->lock);
701	}
702
703	mutex_unlock(&cx8802_mutex);
704
705	return err;
706}
707
708/* ----------------------------------------------------------- */
709static int cx8802_probe(struct pci_dev *pci_dev,
710			const struct pci_device_id *pci_id)
711{
712	struct cx8802_dev *dev;
713	struct cx88_core  *core;
714	int err;
715
716	/* general setup */
717	core = cx88_core_get(pci_dev);
718	if (NULL == core)
719		return -EINVAL;
720
721	printk("%s/2: cx2388x 8802 Driver Manager\n", core->name);
722
723	err = -ENODEV;
724	if (!core->board.mpeg)
725		goto fail_core;
726
727	err = -ENOMEM;
728	dev = kzalloc(sizeof(*dev),GFP_KERNEL);
729	if (NULL == dev)
730		goto fail_core;
731	dev->pci = pci_dev;
732	dev->alloc_ctx = vb2_dma_sg_init_ctx(&pci_dev->dev);
733	if (IS_ERR(dev->alloc_ctx)) {
734		err = PTR_ERR(dev->alloc_ctx);
735		goto fail_dev;
736	}
737	dev->core = core;
738
739	/* Maintain a reference so cx88-video can query the 8802 device. */
740	core->dvbdev = dev;
741
742	err = cx8802_init_common(dev);
743	if (err != 0)
744		goto fail_free;
745
746	INIT_LIST_HEAD(&dev->drvlist);
747	mutex_lock(&cx8802_mutex);
748	list_add_tail(&dev->devlist,&cx8802_devlist);
749	mutex_unlock(&cx8802_mutex);
750
751	/* now autoload cx88-dvb or cx88-blackbird */
752	request_modules(dev);
753	return 0;
754
755 fail_free:
756	vb2_dma_sg_cleanup_ctx(dev->alloc_ctx);
757 fail_dev:
758	kfree(dev);
759 fail_core:
760	core->dvbdev = NULL;
761	cx88_core_put(core,pci_dev);
762	return err;
763}
764
765static void cx8802_remove(struct pci_dev *pci_dev)
766{
767	struct cx8802_dev *dev;
768
769	dev = pci_get_drvdata(pci_dev);
770
771	dprintk( 1, "%s\n", __func__);
772
773	flush_request_modules(dev);
774
775	mutex_lock(&dev->core->lock);
776
777	if (!list_empty(&dev->drvlist)) {
778		struct cx8802_driver *drv, *tmp;
779		int err;
780
781		printk(KERN_WARNING "%s/2: Trying to remove cx8802 driver "
782		       "while cx8802 sub-drivers still loaded?!\n",
783		       dev->core->name);
784
785		list_for_each_entry_safe(drv, tmp, &dev->drvlist, drvlist) {
786			err = drv->remove(drv);
787			if (err == 0) {
788				list_del(&drv->drvlist);
789			} else
790				printk(KERN_ERR "%s/2: cx8802 driver remove "
791				       "failed (%d)\n", dev->core->name, err);
792			kfree(drv);
793		}
794	}
795
796	mutex_unlock(&dev->core->lock);
797
798	/* Destroy any 8802 reference. */
799	dev->core->dvbdev = NULL;
800
801	/* common */
802	cx8802_fini_common(dev);
803	cx88_core_put(dev->core,dev->pci);
804	vb2_dma_sg_cleanup_ctx(dev->alloc_ctx);
805	kfree(dev);
806}
807
808static const struct pci_device_id cx8802_pci_tbl[] = {
809	{
810		.vendor       = 0x14f1,
811		.device       = 0x8802,
812		.subvendor    = PCI_ANY_ID,
813		.subdevice    = PCI_ANY_ID,
814	},{
815		/* --- end of list --- */
816	}
817};
818MODULE_DEVICE_TABLE(pci, cx8802_pci_tbl);
819
820static struct pci_driver cx8802_pci_driver = {
821	.name     = "cx88-mpeg driver manager",
822	.id_table = cx8802_pci_tbl,
823	.probe    = cx8802_probe,
824	.remove   = cx8802_remove,
825};
826
827module_pci_driver(cx8802_pci_driver);
828
829EXPORT_SYMBOL(cx8802_buf_prepare);
830EXPORT_SYMBOL(cx8802_buf_queue);
831EXPORT_SYMBOL(cx8802_cancel_buffers);
832EXPORT_SYMBOL(cx8802_start_dma);
833
834EXPORT_SYMBOL(cx8802_register_driver);
835EXPORT_SYMBOL(cx8802_unregister_driver);
836EXPORT_SYMBOL(cx8802_get_driver);
837