1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 *  Driver for the Conexant CX25821 PCIe bridge
4 *
5 *  Copyright (C) 2009 Conexant Systems Inc.
6 *  Authors  <shu.lin@conexant.com>, <hiep.huynh@conexant.com>
7 *  Based on Steven Toth <stoth@linuxtv.org> cx23885 driver
8 */
9
10#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
11
12#include <linux/i2c.h>
13#include <linux/slab.h>
14#include "cx25821.h"
15#include "cx25821-sram.h"
16#include "cx25821-video.h"
17
18MODULE_DESCRIPTION("Driver for Athena cards");
19MODULE_AUTHOR("Shu Lin - Hiep Huynh");
20MODULE_LICENSE("GPL");
21
22static unsigned int debug;
23module_param(debug, int, 0644);
24MODULE_PARM_DESC(debug, "enable debug messages");
25
26static unsigned int card[] = {[0 ... (CX25821_MAXBOARDS - 1)] = UNSET };
27module_param_array(card, int, NULL, 0444);
28MODULE_PARM_DESC(card, "card type");
29
30const struct sram_channel cx25821_sram_channels[] = {
31	[SRAM_CH00] = {
32		.i = SRAM_CH00,
33		.name = "VID A",
34		.cmds_start = VID_A_DOWN_CMDS,
35		.ctrl_start = VID_A_IQ,
36		.cdt = VID_A_CDT,
37		.fifo_start = VID_A_DOWN_CLUSTER_1,
38		.fifo_size = (VID_CLUSTER_SIZE << 2),
39		.ptr1_reg = DMA1_PTR1,
40		.ptr2_reg = DMA1_PTR2,
41		.cnt1_reg = DMA1_CNT1,
42		.cnt2_reg = DMA1_CNT2,
43		.int_msk = VID_A_INT_MSK,
44		.int_stat = VID_A_INT_STAT,
45		.int_mstat = VID_A_INT_MSTAT,
46		.dma_ctl = VID_DST_A_DMA_CTL,
47		.gpcnt_ctl = VID_DST_A_GPCNT_CTL,
48		.gpcnt = VID_DST_A_GPCNT,
49		.vip_ctl = VID_DST_A_VIP_CTL,
50		.pix_frmt = VID_DST_A_PIX_FRMT,
51	},
52
53	[SRAM_CH01] = {
54		.i = SRAM_CH01,
55		.name = "VID B",
56		.cmds_start = VID_B_DOWN_CMDS,
57		.ctrl_start = VID_B_IQ,
58		.cdt = VID_B_CDT,
59		.fifo_start = VID_B_DOWN_CLUSTER_1,
60		.fifo_size = (VID_CLUSTER_SIZE << 2),
61		.ptr1_reg = DMA2_PTR1,
62		.ptr2_reg = DMA2_PTR2,
63		.cnt1_reg = DMA2_CNT1,
64		.cnt2_reg = DMA2_CNT2,
65		.int_msk = VID_B_INT_MSK,
66		.int_stat = VID_B_INT_STAT,
67		.int_mstat = VID_B_INT_MSTAT,
68		.dma_ctl = VID_DST_B_DMA_CTL,
69		.gpcnt_ctl = VID_DST_B_GPCNT_CTL,
70		.gpcnt = VID_DST_B_GPCNT,
71		.vip_ctl = VID_DST_B_VIP_CTL,
72		.pix_frmt = VID_DST_B_PIX_FRMT,
73	},
74
75	[SRAM_CH02] = {
76		.i = SRAM_CH02,
77		.name = "VID C",
78		.cmds_start = VID_C_DOWN_CMDS,
79		.ctrl_start = VID_C_IQ,
80		.cdt = VID_C_CDT,
81		.fifo_start = VID_C_DOWN_CLUSTER_1,
82		.fifo_size = (VID_CLUSTER_SIZE << 2),
83		.ptr1_reg = DMA3_PTR1,
84		.ptr2_reg = DMA3_PTR2,
85		.cnt1_reg = DMA3_CNT1,
86		.cnt2_reg = DMA3_CNT2,
87		.int_msk = VID_C_INT_MSK,
88		.int_stat = VID_C_INT_STAT,
89		.int_mstat = VID_C_INT_MSTAT,
90		.dma_ctl = VID_DST_C_DMA_CTL,
91		.gpcnt_ctl = VID_DST_C_GPCNT_CTL,
92		.gpcnt = VID_DST_C_GPCNT,
93		.vip_ctl = VID_DST_C_VIP_CTL,
94		.pix_frmt = VID_DST_C_PIX_FRMT,
95	},
96
97	[SRAM_CH03] = {
98		.i = SRAM_CH03,
99		.name = "VID D",
100		.cmds_start = VID_D_DOWN_CMDS,
101		.ctrl_start = VID_D_IQ,
102		.cdt = VID_D_CDT,
103		.fifo_start = VID_D_DOWN_CLUSTER_1,
104		.fifo_size = (VID_CLUSTER_SIZE << 2),
105		.ptr1_reg = DMA4_PTR1,
106		.ptr2_reg = DMA4_PTR2,
107		.cnt1_reg = DMA4_CNT1,
108		.cnt2_reg = DMA4_CNT2,
109		.int_msk = VID_D_INT_MSK,
110		.int_stat = VID_D_INT_STAT,
111		.int_mstat = VID_D_INT_MSTAT,
112		.dma_ctl = VID_DST_D_DMA_CTL,
113		.gpcnt_ctl = VID_DST_D_GPCNT_CTL,
114		.gpcnt = VID_DST_D_GPCNT,
115		.vip_ctl = VID_DST_D_VIP_CTL,
116		.pix_frmt = VID_DST_D_PIX_FRMT,
117	},
118
119	[SRAM_CH04] = {
120		.i = SRAM_CH04,
121		.name = "VID E",
122		.cmds_start = VID_E_DOWN_CMDS,
123		.ctrl_start = VID_E_IQ,
124		.cdt = VID_E_CDT,
125		.fifo_start = VID_E_DOWN_CLUSTER_1,
126		.fifo_size = (VID_CLUSTER_SIZE << 2),
127		.ptr1_reg = DMA5_PTR1,
128		.ptr2_reg = DMA5_PTR2,
129		.cnt1_reg = DMA5_CNT1,
130		.cnt2_reg = DMA5_CNT2,
131		.int_msk = VID_E_INT_MSK,
132		.int_stat = VID_E_INT_STAT,
133		.int_mstat = VID_E_INT_MSTAT,
134		.dma_ctl = VID_DST_E_DMA_CTL,
135		.gpcnt_ctl = VID_DST_E_GPCNT_CTL,
136		.gpcnt = VID_DST_E_GPCNT,
137		.vip_ctl = VID_DST_E_VIP_CTL,
138		.pix_frmt = VID_DST_E_PIX_FRMT,
139	},
140
141	[SRAM_CH05] = {
142		.i = SRAM_CH05,
143		.name = "VID F",
144		.cmds_start = VID_F_DOWN_CMDS,
145		.ctrl_start = VID_F_IQ,
146		.cdt = VID_F_CDT,
147		.fifo_start = VID_F_DOWN_CLUSTER_1,
148		.fifo_size = (VID_CLUSTER_SIZE << 2),
149		.ptr1_reg = DMA6_PTR1,
150		.ptr2_reg = DMA6_PTR2,
151		.cnt1_reg = DMA6_CNT1,
152		.cnt2_reg = DMA6_CNT2,
153		.int_msk = VID_F_INT_MSK,
154		.int_stat = VID_F_INT_STAT,
155		.int_mstat = VID_F_INT_MSTAT,
156		.dma_ctl = VID_DST_F_DMA_CTL,
157		.gpcnt_ctl = VID_DST_F_GPCNT_CTL,
158		.gpcnt = VID_DST_F_GPCNT,
159		.vip_ctl = VID_DST_F_VIP_CTL,
160		.pix_frmt = VID_DST_F_PIX_FRMT,
161	},
162
163	[SRAM_CH06] = {
164		.i = SRAM_CH06,
165		.name = "VID G",
166		.cmds_start = VID_G_DOWN_CMDS,
167		.ctrl_start = VID_G_IQ,
168		.cdt = VID_G_CDT,
169		.fifo_start = VID_G_DOWN_CLUSTER_1,
170		.fifo_size = (VID_CLUSTER_SIZE << 2),
171		.ptr1_reg = DMA7_PTR1,
172		.ptr2_reg = DMA7_PTR2,
173		.cnt1_reg = DMA7_CNT1,
174		.cnt2_reg = DMA7_CNT2,
175		.int_msk = VID_G_INT_MSK,
176		.int_stat = VID_G_INT_STAT,
177		.int_mstat = VID_G_INT_MSTAT,
178		.dma_ctl = VID_DST_G_DMA_CTL,
179		.gpcnt_ctl = VID_DST_G_GPCNT_CTL,
180		.gpcnt = VID_DST_G_GPCNT,
181		.vip_ctl = VID_DST_G_VIP_CTL,
182		.pix_frmt = VID_DST_G_PIX_FRMT,
183	},
184
185	[SRAM_CH07] = {
186		.i = SRAM_CH07,
187		.name = "VID H",
188		.cmds_start = VID_H_DOWN_CMDS,
189		.ctrl_start = VID_H_IQ,
190		.cdt = VID_H_CDT,
191		.fifo_start = VID_H_DOWN_CLUSTER_1,
192		.fifo_size = (VID_CLUSTER_SIZE << 2),
193		.ptr1_reg = DMA8_PTR1,
194		.ptr2_reg = DMA8_PTR2,
195		.cnt1_reg = DMA8_CNT1,
196		.cnt2_reg = DMA8_CNT2,
197		.int_msk = VID_H_INT_MSK,
198		.int_stat = VID_H_INT_STAT,
199		.int_mstat = VID_H_INT_MSTAT,
200		.dma_ctl = VID_DST_H_DMA_CTL,
201		.gpcnt_ctl = VID_DST_H_GPCNT_CTL,
202		.gpcnt = VID_DST_H_GPCNT,
203		.vip_ctl = VID_DST_H_VIP_CTL,
204		.pix_frmt = VID_DST_H_PIX_FRMT,
205	},
206
207	[SRAM_CH08] = {
208		.name = "audio from",
209		.cmds_start = AUD_A_DOWN_CMDS,
210		.ctrl_start = AUD_A_IQ,
211		.cdt = AUD_A_CDT,
212		.fifo_start = AUD_A_DOWN_CLUSTER_1,
213		.fifo_size = AUDIO_CLUSTER_SIZE * 3,
214		.ptr1_reg = DMA17_PTR1,
215		.ptr2_reg = DMA17_PTR2,
216		.cnt1_reg = DMA17_CNT1,
217		.cnt2_reg = DMA17_CNT2,
218	},
219
220	[SRAM_CH09] = {
221		.i = SRAM_CH09,
222		.name = "VID Upstream I",
223		.cmds_start = VID_I_UP_CMDS,
224		.ctrl_start = VID_I_IQ,
225		.cdt = VID_I_CDT,
226		.fifo_start = VID_I_UP_CLUSTER_1,
227		.fifo_size = (VID_CLUSTER_SIZE << 2),
228		.ptr1_reg = DMA15_PTR1,
229		.ptr2_reg = DMA15_PTR2,
230		.cnt1_reg = DMA15_CNT1,
231		.cnt2_reg = DMA15_CNT2,
232		.int_msk = VID_I_INT_MSK,
233		.int_stat = VID_I_INT_STAT,
234		.int_mstat = VID_I_INT_MSTAT,
235		.dma_ctl = VID_SRC_I_DMA_CTL,
236		.gpcnt_ctl = VID_SRC_I_GPCNT_CTL,
237		.gpcnt = VID_SRC_I_GPCNT,
238
239		.vid_fmt_ctl = VID_SRC_I_FMT_CTL,
240		.vid_active_ctl1 = VID_SRC_I_ACTIVE_CTL1,
241		.vid_active_ctl2 = VID_SRC_I_ACTIVE_CTL2,
242		.vid_cdt_size = VID_SRC_I_CDT_SZ,
243		.irq_bit = 8,
244	},
245
246	[SRAM_CH10] = {
247		.i = SRAM_CH10,
248		.name = "VID Upstream J",
249		.cmds_start = VID_J_UP_CMDS,
250		.ctrl_start = VID_J_IQ,
251		.cdt = VID_J_CDT,
252		.fifo_start = VID_J_UP_CLUSTER_1,
253		.fifo_size = (VID_CLUSTER_SIZE << 2),
254		.ptr1_reg = DMA16_PTR1,
255		.ptr2_reg = DMA16_PTR2,
256		.cnt1_reg = DMA16_CNT1,
257		.cnt2_reg = DMA16_CNT2,
258		.int_msk = VID_J_INT_MSK,
259		.int_stat = VID_J_INT_STAT,
260		.int_mstat = VID_J_INT_MSTAT,
261		.dma_ctl = VID_SRC_J_DMA_CTL,
262		.gpcnt_ctl = VID_SRC_J_GPCNT_CTL,
263		.gpcnt = VID_SRC_J_GPCNT,
264
265		.vid_fmt_ctl = VID_SRC_J_FMT_CTL,
266		.vid_active_ctl1 = VID_SRC_J_ACTIVE_CTL1,
267		.vid_active_ctl2 = VID_SRC_J_ACTIVE_CTL2,
268		.vid_cdt_size = VID_SRC_J_CDT_SZ,
269		.irq_bit = 9,
270	},
271
272	[SRAM_CH11] = {
273		.i = SRAM_CH11,
274		.name = "Audio Upstream Channel B",
275		.cmds_start = AUD_B_UP_CMDS,
276		.ctrl_start = AUD_B_IQ,
277		.cdt = AUD_B_CDT,
278		.fifo_start = AUD_B_UP_CLUSTER_1,
279		.fifo_size = (AUDIO_CLUSTER_SIZE * 3),
280		.ptr1_reg = DMA22_PTR1,
281		.ptr2_reg = DMA22_PTR2,
282		.cnt1_reg = DMA22_CNT1,
283		.cnt2_reg = DMA22_CNT2,
284		.int_msk = AUD_B_INT_MSK,
285		.int_stat = AUD_B_INT_STAT,
286		.int_mstat = AUD_B_INT_MSTAT,
287		.dma_ctl = AUD_INT_DMA_CTL,
288		.gpcnt_ctl = AUD_B_GPCNT_CTL,
289		.gpcnt = AUD_B_GPCNT,
290		.aud_length = AUD_B_LNGTH,
291		.aud_cfg = AUD_B_CFG,
292		.fld_aud_fifo_en = FLD_AUD_SRC_B_FIFO_EN,
293		.fld_aud_risc_en = FLD_AUD_SRC_B_RISC_EN,
294		.irq_bit = 11,
295	},
296};
297EXPORT_SYMBOL(cx25821_sram_channels);
298
299static int cx25821_risc_decode(u32 risc)
300{
301	static const char * const instr[16] = {
302		[RISC_SYNC >> 28] = "sync",
303		[RISC_WRITE >> 28] = "write",
304		[RISC_WRITEC >> 28] = "writec",
305		[RISC_READ >> 28] = "read",
306		[RISC_READC >> 28] = "readc",
307		[RISC_JUMP >> 28] = "jump",
308		[RISC_SKIP >> 28] = "skip",
309		[RISC_WRITERM >> 28] = "writerm",
310		[RISC_WRITECM >> 28] = "writecm",
311		[RISC_WRITECR >> 28] = "writecr",
312	};
313	static const int incr[16] = {
314		[RISC_WRITE >> 28] = 3,
315		[RISC_JUMP >> 28] = 3,
316		[RISC_SKIP >> 28] = 1,
317		[RISC_SYNC >> 28] = 1,
318		[RISC_WRITERM >> 28] = 3,
319		[RISC_WRITECM >> 28] = 3,
320		[RISC_WRITECR >> 28] = 4,
321	};
322	static const char * const bits[] = {
323		"12", "13", "14", "resync",
324		"cnt0", "cnt1", "18", "19",
325		"20", "21", "22", "23",
326		"irq1", "irq2", "eol", "sol",
327	};
328	int i;
329
330	pr_cont("0x%08x [ %s",
331		risc, instr[risc >> 28] ? instr[risc >> 28] : "INVALID");
332	for (i = ARRAY_SIZE(bits) - 1; i >= 0; i--) {
333		if (risc & (1 << (i + 12)))
334			pr_cont(" %s", bits[i]);
335	}
336	pr_cont(" count=%d ]\n", risc & 0xfff);
337	return incr[risc >> 28] ? incr[risc >> 28] : 1;
338}
339
340static void cx25821_registers_init(struct cx25821_dev *dev)
341{
342	u32 tmp;
343
344	/* enable RUN_RISC in Pecos */
345	cx_write(DEV_CNTRL2, 0x20);
346
347	/* Set the master PCI interrupt masks to enable video, audio, MBIF,
348	 * and GPIO interrupts
349	 * I2C interrupt masking is handled by the I2C objects themselves. */
350	cx_write(PCI_INT_MSK, 0x2001FFFF);
351
352	tmp = cx_read(RDR_TLCTL0);
353	tmp &= ~FLD_CFG_RCB_CK_EN;	/* Clear the RCB_CK_EN bit */
354	cx_write(RDR_TLCTL0, tmp);
355
356	/* PLL-A setting for the Audio Master Clock */
357	cx_write(PLL_A_INT_FRAC, 0x9807A58B);
358
359	/* PLL_A_POST = 0x1C, PLL_A_OUT_TO_PIN = 0x1 */
360	cx_write(PLL_A_POST_STAT_BIST, 0x8000019C);
361
362	/* clear reset bit [31] */
363	tmp = cx_read(PLL_A_INT_FRAC);
364	cx_write(PLL_A_INT_FRAC, tmp & 0x7FFFFFFF);
365
366	/* PLL-B setting for Mobilygen Host Bus Interface */
367	cx_write(PLL_B_INT_FRAC, 0x9883A86F);
368
369	/* PLL_B_POST = 0xD, PLL_B_OUT_TO_PIN = 0x0 */
370	cx_write(PLL_B_POST_STAT_BIST, 0x8000018D);
371
372	/* clear reset bit [31] */
373	tmp = cx_read(PLL_B_INT_FRAC);
374	cx_write(PLL_B_INT_FRAC, tmp & 0x7FFFFFFF);
375
376	/* PLL-C setting for video upstream channel */
377	cx_write(PLL_C_INT_FRAC, 0x96A0EA3F);
378
379	/* PLL_C_POST = 0x3, PLL_C_OUT_TO_PIN = 0x0 */
380	cx_write(PLL_C_POST_STAT_BIST, 0x80000103);
381
382	/* clear reset bit [31] */
383	tmp = cx_read(PLL_C_INT_FRAC);
384	cx_write(PLL_C_INT_FRAC, tmp & 0x7FFFFFFF);
385
386	/* PLL-D setting for audio upstream channel */
387	cx_write(PLL_D_INT_FRAC, 0x98757F5B);
388
389	/* PLL_D_POST = 0x13, PLL_D_OUT_TO_PIN = 0x0 */
390	cx_write(PLL_D_POST_STAT_BIST, 0x80000113);
391
392	/* clear reset bit [31] */
393	tmp = cx_read(PLL_D_INT_FRAC);
394	cx_write(PLL_D_INT_FRAC, tmp & 0x7FFFFFFF);
395
396	/* This selects the PLL C clock source for the video upstream channel
397	 * I and J */
398	tmp = cx_read(VID_CH_CLK_SEL);
399	cx_write(VID_CH_CLK_SEL, (tmp & 0x00FFFFFF) | 0x24000000);
400
401	/* 656/VIP SRC Upstream Channel I & J and 7 - Host Bus Interface for
402	 * channel A-C
403	 * select 656/VIP DST for downstream Channel A - C */
404	tmp = cx_read(VID_CH_MODE_SEL);
405	/* cx_write( VID_CH_MODE_SEL, tmp | 0x1B0001FF); */
406	cx_write(VID_CH_MODE_SEL, tmp & 0xFFFFFE00);
407
408	/* enables 656 port I and J as output */
409	tmp = cx_read(CLK_RST);
410	/* use external ALT_PLL_REF pin as its reference clock instead */
411	tmp |= FLD_USE_ALT_PLL_REF;
412	cx_write(CLK_RST, tmp & ~(FLD_VID_I_CLK_NOE | FLD_VID_J_CLK_NOE));
413
414	msleep(100);
415}
416
417int cx25821_sram_channel_setup(struct cx25821_dev *dev,
418			       const struct sram_channel *ch,
419			       unsigned int bpl, u32 risc)
420{
421	unsigned int i, lines;
422	u32 cdt;
423
424	if (ch->cmds_start == 0) {
425		cx_write(ch->ptr1_reg, 0);
426		cx_write(ch->ptr2_reg, 0);
427		cx_write(ch->cnt2_reg, 0);
428		cx_write(ch->cnt1_reg, 0);
429		return 0;
430	}
431
432	bpl = (bpl + 7) & ~7;	/* alignment */
433	cdt = ch->cdt;
434	lines = ch->fifo_size / bpl;
435
436	if (lines > 4)
437		lines = 4;
438
439	BUG_ON(lines < 2);
440
441	cx_write(8 + 0, RISC_JUMP | RISC_IRQ1 | RISC_CNT_INC);
442	cx_write(8 + 4, 8);
443	cx_write(8 + 8, 0);
444
445	/* write CDT */
446	for (i = 0; i < lines; i++) {
447		cx_write(cdt + 16 * i, ch->fifo_start + bpl * i);
448		cx_write(cdt + 16 * i + 4, 0);
449		cx_write(cdt + 16 * i + 8, 0);
450		cx_write(cdt + 16 * i + 12, 0);
451	}
452
453	/* init the first cdt buffer */
454	for (i = 0; i < 128; i++)
455		cx_write(ch->fifo_start + 4 * i, i);
456
457	/* write CMDS */
458	if (ch->jumponly)
459		cx_write(ch->cmds_start + 0, 8);
460	else
461		cx_write(ch->cmds_start + 0, risc);
462
463	cx_write(ch->cmds_start + 4, 0);	/* 64 bits 63-32 */
464	cx_write(ch->cmds_start + 8, cdt);
465	cx_write(ch->cmds_start + 12, (lines * 16) >> 3);
466	cx_write(ch->cmds_start + 16, ch->ctrl_start);
467
468	if (ch->jumponly)
469		cx_write(ch->cmds_start + 20, 0x80000000 | (64 >> 2));
470	else
471		cx_write(ch->cmds_start + 20, 64 >> 2);
472
473	for (i = 24; i < 80; i += 4)
474		cx_write(ch->cmds_start + i, 0);
475
476	/* fill registers */
477	cx_write(ch->ptr1_reg, ch->fifo_start);
478	cx_write(ch->ptr2_reg, cdt);
479	cx_write(ch->cnt2_reg, (lines * 16) >> 3);
480	cx_write(ch->cnt1_reg, (bpl >> 3) - 1);
481
482	return 0;
483}
484
485int cx25821_sram_channel_setup_audio(struct cx25821_dev *dev,
486				     const struct sram_channel *ch,
487				     unsigned int bpl, u32 risc)
488{
489	unsigned int i, lines;
490	u32 cdt;
491
492	if (ch->cmds_start == 0) {
493		cx_write(ch->ptr1_reg, 0);
494		cx_write(ch->ptr2_reg, 0);
495		cx_write(ch->cnt2_reg, 0);
496		cx_write(ch->cnt1_reg, 0);
497		return 0;
498	}
499
500	bpl = (bpl + 7) & ~7;	/* alignment */
501	cdt = ch->cdt;
502	lines = ch->fifo_size / bpl;
503
504	if (lines > 3)
505		lines = 3;	/* for AUDIO */
506
507	BUG_ON(lines < 2);
508
509	cx_write(8 + 0, RISC_JUMP | RISC_IRQ1 | RISC_CNT_INC);
510	cx_write(8 + 4, 8);
511	cx_write(8 + 8, 0);
512
513	/* write CDT */
514	for (i = 0; i < lines; i++) {
515		cx_write(cdt + 16 * i, ch->fifo_start + bpl * i);
516		cx_write(cdt + 16 * i + 4, 0);
517		cx_write(cdt + 16 * i + 8, 0);
518		cx_write(cdt + 16 * i + 12, 0);
519	}
520
521	/* write CMDS */
522	if (ch->jumponly)
523		cx_write(ch->cmds_start + 0, 8);
524	else
525		cx_write(ch->cmds_start + 0, risc);
526
527	cx_write(ch->cmds_start + 4, 0);	/* 64 bits 63-32 */
528	cx_write(ch->cmds_start + 8, cdt);
529	cx_write(ch->cmds_start + 12, (lines * 16) >> 3);
530	cx_write(ch->cmds_start + 16, ch->ctrl_start);
531
532	/* IQ size */
533	if (ch->jumponly)
534		cx_write(ch->cmds_start + 20, 0x80000000 | (64 >> 2));
535	else
536		cx_write(ch->cmds_start + 20, 64 >> 2);
537
538	/* zero out */
539	for (i = 24; i < 80; i += 4)
540		cx_write(ch->cmds_start + i, 0);
541
542	/* fill registers */
543	cx_write(ch->ptr1_reg, ch->fifo_start);
544	cx_write(ch->ptr2_reg, cdt);
545	cx_write(ch->cnt2_reg, (lines * 16) >> 3);
546	cx_write(ch->cnt1_reg, (bpl >> 3) - 1);
547
548	return 0;
549}
550EXPORT_SYMBOL(cx25821_sram_channel_setup_audio);
551
552void cx25821_sram_channel_dump(struct cx25821_dev *dev, const struct sram_channel *ch)
553{
554	static char *name[] = {
555		"init risc lo",
556		"init risc hi",
557		"cdt base",
558		"cdt size",
559		"iq base",
560		"iq size",
561		"risc pc lo",
562		"risc pc hi",
563		"iq wr ptr",
564		"iq rd ptr",
565		"cdt current",
566		"pci target lo",
567		"pci target hi",
568		"line / byte",
569	};
570	u32 risc;
571	unsigned int i, j, n;
572
573	pr_warn("%s: %s - dma channel status dump\n", dev->name, ch->name);
574	for (i = 0; i < ARRAY_SIZE(name); i++)
575		pr_warn("cmds + 0x%2x:   %-15s: 0x%08x\n",
576			i * 4, name[i], cx_read(ch->cmds_start + 4 * i));
577
578	j = i * 4;
579	for (i = 0; i < 4;) {
580		risc = cx_read(ch->cmds_start + 4 * (i + 14));
581		pr_warn("cmds + 0x%2x:   risc%d: ", j + i * 4, i);
582		i += cx25821_risc_decode(risc);
583	}
584
585	for (i = 0; i < (64 >> 2); i += n) {
586		risc = cx_read(ch->ctrl_start + 4 * i);
587		/* No consideration for bits 63-32 */
588
589		pr_warn("ctrl + 0x%2x (0x%08x): iq %x: ",
590			i * 4, ch->ctrl_start + 4 * i, i);
591		n = cx25821_risc_decode(risc);
592		for (j = 1; j < n; j++) {
593			risc = cx_read(ch->ctrl_start + 4 * (i + j));
594			pr_warn("ctrl + 0x%2x :   iq %x: 0x%08x [ arg #%d ]\n",
595				4 * (i + j), i + j, risc, j);
596		}
597	}
598
599	pr_warn("        :   fifo: 0x%08x -> 0x%x\n",
600		ch->fifo_start, ch->fifo_start + ch->fifo_size);
601	pr_warn("        :   ctrl: 0x%08x -> 0x%x\n",
602		ch->ctrl_start, ch->ctrl_start + 6 * 16);
603	pr_warn("        :   ptr1_reg: 0x%08x\n",
604		cx_read(ch->ptr1_reg));
605	pr_warn("        :   ptr2_reg: 0x%08x\n",
606		cx_read(ch->ptr2_reg));
607	pr_warn("        :   cnt1_reg: 0x%08x\n",
608		cx_read(ch->cnt1_reg));
609	pr_warn("        :   cnt2_reg: 0x%08x\n",
610		cx_read(ch->cnt2_reg));
611}
612
613void cx25821_sram_channel_dump_audio(struct cx25821_dev *dev,
614				     const struct sram_channel *ch)
615{
616	static const char * const name[] = {
617		"init risc lo",
618		"init risc hi",
619		"cdt base",
620		"cdt size",
621		"iq base",
622		"iq size",
623		"risc pc lo",
624		"risc pc hi",
625		"iq wr ptr",
626		"iq rd ptr",
627		"cdt current",
628		"pci target lo",
629		"pci target hi",
630		"line / byte",
631	};
632
633	u32 risc, value, tmp;
634	unsigned int i, j, n;
635
636	pr_info("\n%s: %s - dma Audio channel status dump\n",
637		dev->name, ch->name);
638
639	for (i = 0; i < ARRAY_SIZE(name); i++)
640		pr_info("%s: cmds + 0x%2x:   %-15s: 0x%08x\n",
641			dev->name, i * 4, name[i],
642			cx_read(ch->cmds_start + 4 * i));
643
644	j = i * 4;
645	for (i = 0; i < 4;) {
646		risc = cx_read(ch->cmds_start + 4 * (i + 14));
647		pr_warn("cmds + 0x%2x:   risc%d: ", j + i * 4, i);
648		i += cx25821_risc_decode(risc);
649	}
650
651	for (i = 0; i < (64 >> 2); i += n) {
652		risc = cx_read(ch->ctrl_start + 4 * i);
653		/* No consideration for bits 63-32 */
654
655		pr_warn("ctrl + 0x%2x (0x%08x): iq %x: ",
656			i * 4, ch->ctrl_start + 4 * i, i);
657		n = cx25821_risc_decode(risc);
658
659		for (j = 1; j < n; j++) {
660			risc = cx_read(ch->ctrl_start + 4 * (i + j));
661			pr_warn("ctrl + 0x%2x :   iq %x: 0x%08x [ arg #%d ]\n",
662				4 * (i + j), i + j, risc, j);
663		}
664	}
665
666	pr_warn("        :   fifo: 0x%08x -> 0x%x\n",
667		ch->fifo_start, ch->fifo_start + ch->fifo_size);
668	pr_warn("        :   ctrl: 0x%08x -> 0x%x\n",
669		ch->ctrl_start, ch->ctrl_start + 6 * 16);
670	pr_warn("        :   ptr1_reg: 0x%08x\n",
671		cx_read(ch->ptr1_reg));
672	pr_warn("        :   ptr2_reg: 0x%08x\n",
673		cx_read(ch->ptr2_reg));
674	pr_warn("        :   cnt1_reg: 0x%08x\n",
675		cx_read(ch->cnt1_reg));
676	pr_warn("        :   cnt2_reg: 0x%08x\n",
677		cx_read(ch->cnt2_reg));
678
679	for (i = 0; i < 4; i++) {
680		risc = cx_read(ch->cmds_start + 56 + (i * 4));
681		pr_warn("instruction %d = 0x%x\n", i, risc);
682	}
683
684	/* read data from the first cdt buffer */
685	risc = cx_read(AUD_A_CDT);
686	pr_warn("\nread cdt loc=0x%x\n", risc);
687	for (i = 0; i < 8; i++) {
688		n = cx_read(risc + i * 4);
689		pr_cont("0x%x ", n);
690	}
691	pr_cont("\n\n");
692
693	value = cx_read(CLK_RST);
694	CX25821_INFO(" CLK_RST = 0x%x\n\n", value);
695
696	value = cx_read(PLL_A_POST_STAT_BIST);
697	CX25821_INFO(" PLL_A_POST_STAT_BIST = 0x%x\n\n", value);
698	value = cx_read(PLL_A_INT_FRAC);
699	CX25821_INFO(" PLL_A_INT_FRAC = 0x%x\n\n", value);
700
701	value = cx_read(PLL_B_POST_STAT_BIST);
702	CX25821_INFO(" PLL_B_POST_STAT_BIST = 0x%x\n\n", value);
703	value = cx_read(PLL_B_INT_FRAC);
704	CX25821_INFO(" PLL_B_INT_FRAC = 0x%x\n\n", value);
705
706	value = cx_read(PLL_C_POST_STAT_BIST);
707	CX25821_INFO(" PLL_C_POST_STAT_BIST = 0x%x\n\n", value);
708	value = cx_read(PLL_C_INT_FRAC);
709	CX25821_INFO(" PLL_C_INT_FRAC = 0x%x\n\n", value);
710
711	value = cx_read(PLL_D_POST_STAT_BIST);
712	CX25821_INFO(" PLL_D_POST_STAT_BIST = 0x%x\n\n", value);
713	value = cx_read(PLL_D_INT_FRAC);
714	CX25821_INFO(" PLL_D_INT_FRAC = 0x%x\n\n", value);
715
716	value = cx25821_i2c_read(&dev->i2c_bus[0], AFE_AB_DIAG_CTRL, &tmp);
717	CX25821_INFO(" AFE_AB_DIAG_CTRL (0x10900090) = 0x%x\n\n", value);
718}
719EXPORT_SYMBOL(cx25821_sram_channel_dump_audio);
720
721static void cx25821_shutdown(struct cx25821_dev *dev)
722{
723	int i;
724
725	/* disable RISC controller */
726	cx_write(DEV_CNTRL2, 0);
727
728	/* Disable Video A/B activity */
729	for (i = 0; i < VID_CHANNEL_NUM; i++) {
730		cx_write(dev->channels[i].sram_channels->dma_ctl, 0);
731		cx_write(dev->channels[i].sram_channels->int_msk, 0);
732	}
733
734	for (i = VID_UPSTREAM_SRAM_CHANNEL_I;
735		i <= VID_UPSTREAM_SRAM_CHANNEL_J; i++) {
736		cx_write(dev->channels[i].sram_channels->dma_ctl, 0);
737		cx_write(dev->channels[i].sram_channels->int_msk, 0);
738	}
739
740	/* Disable Audio activity */
741	cx_write(AUD_INT_DMA_CTL, 0);
742
743	/* Disable Serial port */
744	cx_write(UART_CTL, 0);
745
746	/* Disable Interrupts */
747	cx_write(PCI_INT_MSK, 0);
748	cx_write(AUD_A_INT_MSK, 0);
749}
750
751void cx25821_set_pixel_format(struct cx25821_dev *dev, int channel_select,
752			      u32 format)
753{
754	if (channel_select <= 7 && channel_select >= 0) {
755		cx_write(dev->channels[channel_select].sram_channels->pix_frmt,
756				format);
757	}
758	dev->channels[channel_select].pixel_formats = format;
759}
760
761static void cx25821_set_vip_mode(struct cx25821_dev *dev,
762				 const struct sram_channel *ch)
763{
764	cx_write(ch->pix_frmt, PIXEL_FRMT_422);
765	cx_write(ch->vip_ctl, PIXEL_ENGINE_VIP1);
766}
767
768static void cx25821_initialize(struct cx25821_dev *dev)
769{
770	int i;
771
772	dprintk(1, "%s()\n", __func__);
773
774	cx25821_shutdown(dev);
775	cx_write(PCI_INT_STAT, 0xffffffff);
776
777	for (i = 0; i < VID_CHANNEL_NUM; i++)
778		cx_write(dev->channels[i].sram_channels->int_stat, 0xffffffff);
779
780	cx_write(AUD_A_INT_STAT, 0xffffffff);
781	cx_write(AUD_B_INT_STAT, 0xffffffff);
782	cx_write(AUD_C_INT_STAT, 0xffffffff);
783	cx_write(AUD_D_INT_STAT, 0xffffffff);
784	cx_write(AUD_E_INT_STAT, 0xffffffff);
785
786	cx_write(CLK_DELAY, cx_read(CLK_DELAY) & 0x80000000);
787	cx_write(PAD_CTRL, 0x12);	/* for I2C */
788	cx25821_registers_init(dev);	/* init Pecos registers */
789	msleep(100);
790
791	for (i = 0; i < VID_CHANNEL_NUM; i++) {
792		cx25821_set_vip_mode(dev, dev->channels[i].sram_channels);
793		cx25821_sram_channel_setup(dev, dev->channels[i].sram_channels,
794						1440, 0);
795		dev->channels[i].pixel_formats = PIXEL_FRMT_422;
796		dev->channels[i].use_cif_resolution = 0;
797	}
798
799	/* Probably only affect Downstream */
800	for (i = VID_UPSTREAM_SRAM_CHANNEL_I;
801		i <= VID_UPSTREAM_SRAM_CHANNEL_J; i++) {
802		dev->channels[i].pixel_formats = PIXEL_FRMT_422;
803		cx25821_set_vip_mode(dev, dev->channels[i].sram_channels);
804	}
805
806	cx25821_sram_channel_setup_audio(dev,
807			dev->channels[SRAM_CH08].sram_channels, 128, 0);
808
809	cx25821_gpio_init(dev);
810}
811
812static int cx25821_get_resources(struct cx25821_dev *dev)
813{
814	if (request_mem_region(pci_resource_start(dev->pci, 0),
815				pci_resource_len(dev->pci, 0), dev->name))
816		return 0;
817
818	pr_err("%s: can't get MMIO memory @ 0x%llx\n",
819		dev->name, (unsigned long long)pci_resource_start(dev->pci, 0));
820
821	return -EBUSY;
822}
823
824static void cx25821_dev_checkrevision(struct cx25821_dev *dev)
825{
826	dev->hwrevision = cx_read(RDR_CFG2) & 0xff;
827
828	pr_info("Hardware revision = 0x%02x\n", dev->hwrevision);
829}
830
831static void cx25821_iounmap(struct cx25821_dev *dev)
832{
833	if (dev == NULL)
834		return;
835
836	/* Releasing IO memory */
837	if (dev->lmmio != NULL) {
838		iounmap(dev->lmmio);
839		dev->lmmio = NULL;
840	}
841}
842
843static int cx25821_dev_setup(struct cx25821_dev *dev)
844{
845	static unsigned int cx25821_devcount;
846	int i;
847
848	mutex_init(&dev->lock);
849
850	dev->nr = ++cx25821_devcount;
851	sprintf(dev->name, "cx25821[%d]", dev->nr);
852
853	if (dev->nr >= ARRAY_SIZE(card)) {
854		CX25821_INFO("dev->nr >= %zd", ARRAY_SIZE(card));
855		return -ENODEV;
856	}
857	if (dev->pci->device != 0x8210) {
858		pr_info("%s(): Exiting. Incorrect Hardware device = 0x%02x\n",
859			__func__, dev->pci->device);
860		return -ENODEV;
861	}
862	pr_info("Athena Hardware device = 0x%02x\n", dev->pci->device);
863
864	/* Apply a sensible clock frequency for the PCIe bridge */
865	dev->clk_freq = 28000000;
866	for (i = 0; i < MAX_VID_CHANNEL_NUM; i++) {
867		dev->channels[i].dev = dev;
868		dev->channels[i].id = i;
869		dev->channels[i].sram_channels = &cx25821_sram_channels[i];
870	}
871
872	/* board config */
873	dev->board = 1;		/* card[dev->nr]; */
874	dev->_max_num_decoders = MAX_DECODERS;
875
876	dev->pci_bus = dev->pci->bus->number;
877	dev->pci_slot = PCI_SLOT(dev->pci->devfn);
878	dev->pci_irqmask = 0x001f00;
879
880	/* External Master 1 Bus */
881	dev->i2c_bus[0].nr = 0;
882	dev->i2c_bus[0].dev = dev;
883	dev->i2c_bus[0].reg_stat = I2C1_STAT;
884	dev->i2c_bus[0].reg_ctrl = I2C1_CTRL;
885	dev->i2c_bus[0].reg_addr = I2C1_ADDR;
886	dev->i2c_bus[0].reg_rdata = I2C1_RDATA;
887	dev->i2c_bus[0].reg_wdata = I2C1_WDATA;
888	dev->i2c_bus[0].i2c_period = (0x07 << 24);	/* 1.95MHz */
889
890	if (cx25821_get_resources(dev) < 0) {
891		pr_err("%s: No more PCIe resources for subsystem: %04x:%04x\n",
892		       dev->name, dev->pci->subsystem_vendor,
893		       dev->pci->subsystem_device);
894
895		cx25821_devcount--;
896		return -EBUSY;
897	}
898
899	/* PCIe stuff */
900	dev->base_io_addr = pci_resource_start(dev->pci, 0);
901
902	if (!dev->base_io_addr) {
903		CX25821_ERR("No PCI Memory resources, exiting!\n");
904		return -ENODEV;
905	}
906
907	dev->lmmio = ioremap(dev->base_io_addr, pci_resource_len(dev->pci, 0));
908
909	if (!dev->lmmio) {
910		CX25821_ERR("ioremap failed, maybe increasing __VMALLOC_RESERVE in page.h\n");
911		cx25821_iounmap(dev);
912		return -ENOMEM;
913	}
914
915	dev->bmmio = (u8 __iomem *) dev->lmmio;
916
917	pr_info("%s: subsystem: %04x:%04x, board: %s [card=%d,%s]\n",
918		dev->name, dev->pci->subsystem_vendor,
919		dev->pci->subsystem_device, cx25821_boards[dev->board].name,
920		dev->board, card[dev->nr] == dev->board ?
921		"insmod option" : "autodetected");
922
923	/* init hardware */
924	cx25821_initialize(dev);
925
926	cx25821_i2c_register(&dev->i2c_bus[0]);
927/*  cx25821_i2c_register(&dev->i2c_bus[1]);
928 *  cx25821_i2c_register(&dev->i2c_bus[2]); */
929
930	if (medusa_video_init(dev) < 0)
931		CX25821_ERR("%s(): Failed to initialize medusa!\n", __func__);
932
933	cx25821_video_register(dev);
934
935	cx25821_dev_checkrevision(dev);
936	return 0;
937}
938
939void cx25821_dev_unregister(struct cx25821_dev *dev)
940{
941	int i;
942
943	if (!dev->base_io_addr)
944		return;
945
946	release_mem_region(dev->base_io_addr, pci_resource_len(dev->pci, 0));
947
948	for (i = 0; i < MAX_VID_CAP_CHANNEL_NUM - 1; i++) {
949		if (i == SRAM_CH08) /* audio channel */
950			continue;
951		/*
952		 * TODO: enable when video output is properly
953		 * supported.
954		if (i == SRAM_CH09 || i == SRAM_CH10)
955			cx25821_free_mem_upstream(&dev->channels[i]);
956		 */
957		cx25821_video_unregister(dev, i);
958	}
959
960	cx25821_i2c_unregister(&dev->i2c_bus[0]);
961	cx25821_iounmap(dev);
962}
963EXPORT_SYMBOL(cx25821_dev_unregister);
964
965int cx25821_riscmem_alloc(struct pci_dev *pci,
966		       struct cx25821_riscmem *risc,
967		       unsigned int size)
968{
969	__le32 *cpu;
970	dma_addr_t dma = 0;
971
972	if (risc->cpu && risc->size < size) {
973		dma_free_coherent(&pci->dev, risc->size, risc->cpu, risc->dma);
974		risc->cpu = NULL;
975	}
976	if (NULL == risc->cpu) {
977		cpu = dma_alloc_coherent(&pci->dev, size, &dma, GFP_KERNEL);
978		if (NULL == cpu)
979			return -ENOMEM;
980		risc->cpu  = cpu;
981		risc->dma  = dma;
982		risc->size = size;
983	}
984	return 0;
985}
986EXPORT_SYMBOL(cx25821_riscmem_alloc);
987
988static __le32 *cx25821_risc_field(__le32 * rp, struct scatterlist *sglist,
989				  unsigned int offset, u32 sync_line,
990				  unsigned int bpl, unsigned int padding,
991				  unsigned int lines, bool jump)
992{
993	struct scatterlist *sg;
994	unsigned int line, todo;
995
996	if (jump) {
997		*(rp++) = cpu_to_le32(RISC_JUMP);
998		*(rp++) = cpu_to_le32(0);
999		*(rp++) = cpu_to_le32(0); /* bits 63-32 */
1000	}
1001
1002	/* sync instruction */
1003	if (sync_line != NO_SYNC_LINE)
1004		*(rp++) = cpu_to_le32(RISC_RESYNC | sync_line);
1005
1006	/* scan lines */
1007	sg = sglist;
1008	for (line = 0; line < lines; line++) {
1009		while (offset && offset >= sg_dma_len(sg)) {
1010			offset -= sg_dma_len(sg);
1011			sg = sg_next(sg);
1012		}
1013		if (bpl <= sg_dma_len(sg) - offset) {
1014			/* fits into current chunk */
1015			*(rp++) = cpu_to_le32(RISC_WRITE | RISC_SOL | RISC_EOL |
1016					bpl);
1017			*(rp++) = cpu_to_le32(sg_dma_address(sg) + offset);
1018			*(rp++) = cpu_to_le32(0);	/* bits 63-32 */
1019			offset += bpl;
1020		} else {
1021			/* scanline needs to be split */
1022			todo = bpl;
1023			*(rp++) = cpu_to_le32(RISC_WRITE | RISC_SOL |
1024					(sg_dma_len(sg) - offset));
1025			*(rp++) = cpu_to_le32(sg_dma_address(sg) + offset);
1026			*(rp++) = cpu_to_le32(0);	/* bits 63-32 */
1027			todo -= (sg_dma_len(sg) - offset);
1028			offset = 0;
1029			sg = sg_next(sg);
1030			while (todo > sg_dma_len(sg)) {
1031				*(rp++) = cpu_to_le32(RISC_WRITE |
1032						sg_dma_len(sg));
1033				*(rp++) = cpu_to_le32(sg_dma_address(sg));
1034				*(rp++) = cpu_to_le32(0);	/* bits 63-32 */
1035				todo -= sg_dma_len(sg);
1036				sg = sg_next(sg);
1037			}
1038			*(rp++) = cpu_to_le32(RISC_WRITE | RISC_EOL | todo);
1039			*(rp++) = cpu_to_le32(sg_dma_address(sg));
1040			*(rp++) = cpu_to_le32(0);	/* bits 63-32 */
1041			offset += todo;
1042		}
1043
1044		offset += padding;
1045	}
1046
1047	return rp;
1048}
1049
1050int cx25821_risc_buffer(struct pci_dev *pci, struct cx25821_riscmem *risc,
1051			struct scatterlist *sglist, unsigned int top_offset,
1052			unsigned int bottom_offset, unsigned int bpl,
1053			unsigned int padding, unsigned int lines)
1054{
1055	u32 instructions;
1056	u32 fields;
1057	__le32 *rp;
1058	int rc;
1059
1060	fields = 0;
1061	if (UNSET != top_offset)
1062		fields++;
1063	if (UNSET != bottom_offset)
1064		fields++;
1065
1066	/* estimate risc mem: worst case is one write per page border +
1067	   one write per scan line + syncs + jump (all 3 dwords).  Padding
1068	   can cause next bpl to start close to a page border.  First DMA
1069	   region may be smaller than PAGE_SIZE */
1070	/* write and jump need and extra dword */
1071	instructions = fields * (1 + ((bpl + padding) * lines) / PAGE_SIZE +
1072			lines);
1073	instructions += 5;
1074	rc = cx25821_riscmem_alloc(pci, risc, instructions * 12);
1075
1076	if (rc < 0)
1077		return rc;
1078
1079	/* write risc instructions */
1080	rp = risc->cpu;
1081
1082	if (UNSET != top_offset) {
1083		rp = cx25821_risc_field(rp, sglist, top_offset, 0, bpl, padding,
1084					lines, true);
1085	}
1086
1087	if (UNSET != bottom_offset) {
1088		rp = cx25821_risc_field(rp, sglist, bottom_offset, 0x200, bpl,
1089					padding, lines, UNSET == top_offset);
1090	}
1091
1092	/* save pointer to jmp instruction address */
1093	risc->jmp = rp;
1094	BUG_ON((risc->jmp - risc->cpu + 3) * sizeof(*risc->cpu) > risc->size);
1095
1096	return 0;
1097}
1098
1099static __le32 *cx25821_risc_field_audio(__le32 * rp, struct scatterlist *sglist,
1100					unsigned int offset, u32 sync_line,
1101					unsigned int bpl, unsigned int padding,
1102					unsigned int lines, unsigned int lpi)
1103{
1104	struct scatterlist *sg;
1105	unsigned int line, todo, sol;
1106
1107	/* sync instruction */
1108	if (sync_line != NO_SYNC_LINE)
1109		*(rp++) = cpu_to_le32(RISC_RESYNC | sync_line);
1110
1111	/* scan lines */
1112	sg = sglist;
1113	for (line = 0; line < lines; line++) {
1114		while (offset && offset >= sg_dma_len(sg)) {
1115			offset -= sg_dma_len(sg);
1116			sg = sg_next(sg);
1117		}
1118
1119		if (lpi && line > 0 && !(line % lpi))
1120			sol = RISC_SOL | RISC_IRQ1 | RISC_CNT_INC;
1121		else
1122			sol = RISC_SOL;
1123
1124		if (bpl <= sg_dma_len(sg) - offset) {
1125			/* fits into current chunk */
1126			*(rp++) = cpu_to_le32(RISC_WRITE | sol | RISC_EOL |
1127					bpl);
1128			*(rp++) = cpu_to_le32(sg_dma_address(sg) + offset);
1129			*(rp++) = cpu_to_le32(0);	/* bits 63-32 */
1130			offset += bpl;
1131		} else {
1132			/* scanline needs to be split */
1133			todo = bpl;
1134			*(rp++) = cpu_to_le32(RISC_WRITE | sol |
1135					(sg_dma_len(sg) - offset));
1136			*(rp++) = cpu_to_le32(sg_dma_address(sg) + offset);
1137			*(rp++) = cpu_to_le32(0);	/* bits 63-32 */
1138			todo -= (sg_dma_len(sg) - offset);
1139			offset = 0;
1140			sg = sg_next(sg);
1141			while (todo > sg_dma_len(sg)) {
1142				*(rp++) = cpu_to_le32(RISC_WRITE |
1143						sg_dma_len(sg));
1144				*(rp++) = cpu_to_le32(sg_dma_address(sg));
1145				*(rp++) = cpu_to_le32(0);	/* bits 63-32 */
1146				todo -= sg_dma_len(sg);
1147				sg = sg_next(sg);
1148			}
1149			*(rp++) = cpu_to_le32(RISC_WRITE | RISC_EOL | todo);
1150			*(rp++) = cpu_to_le32(sg_dma_address(sg));
1151			*(rp++) = cpu_to_le32(0);	/* bits 63-32 */
1152			offset += todo;
1153		}
1154		offset += padding;
1155	}
1156
1157	return rp;
1158}
1159
1160int cx25821_risc_databuffer_audio(struct pci_dev *pci,
1161				  struct cx25821_riscmem *risc,
1162				  struct scatterlist *sglist,
1163				  unsigned int bpl,
1164				  unsigned int lines, unsigned int lpi)
1165{
1166	u32 instructions;
1167	__le32 *rp;
1168	int rc;
1169
1170	/* estimate risc mem: worst case is one write per page border +
1171	   one write per scan line + syncs + jump (all 2 dwords).  Here
1172	   there is no padding and no sync.  First DMA region may be smaller
1173	   than PAGE_SIZE */
1174	/* Jump and write need an extra dword */
1175	instructions = 1 + (bpl * lines) / PAGE_SIZE + lines;
1176	instructions += 1;
1177
1178	rc = cx25821_riscmem_alloc(pci, risc, instructions * 12);
1179	if (rc < 0)
1180		return rc;
1181
1182	/* write risc instructions */
1183	rp = risc->cpu;
1184	rp = cx25821_risc_field_audio(rp, sglist, 0, NO_SYNC_LINE, bpl, 0,
1185				      lines, lpi);
1186
1187	/* save pointer to jmp instruction address */
1188	risc->jmp = rp;
1189	BUG_ON((risc->jmp - risc->cpu + 2) * sizeof(*risc->cpu) > risc->size);
1190	return 0;
1191}
1192EXPORT_SYMBOL(cx25821_risc_databuffer_audio);
1193
1194void cx25821_free_buffer(struct cx25821_dev *dev, struct cx25821_buffer *buf)
1195{
1196	if (WARN_ON(buf->risc.size == 0))
1197		return;
1198	dma_free_coherent(&dev->pci->dev, buf->risc.size, buf->risc.cpu,
1199			  buf->risc.dma);
1200	memset(&buf->risc, 0, sizeof(buf->risc));
1201}
1202
1203static irqreturn_t cx25821_irq(int irq, void *dev_id)
1204{
1205	struct cx25821_dev *dev = dev_id;
1206	u32 pci_status;
1207	u32 vid_status;
1208	int i, handled = 0;
1209	u32 mask[8] = { 1, 2, 4, 8, 16, 32, 64, 128 };
1210
1211	pci_status = cx_read(PCI_INT_STAT);
1212
1213	if (pci_status == 0)
1214		goto out;
1215
1216	for (i = 0; i < VID_CHANNEL_NUM; i++) {
1217		if (pci_status & mask[i]) {
1218			vid_status = cx_read(dev->channels[i].
1219				sram_channels->int_stat);
1220
1221			if (vid_status)
1222				handled += cx25821_video_irq(dev, i,
1223						vid_status);
1224
1225			cx_write(PCI_INT_STAT, mask[i]);
1226		}
1227	}
1228
1229out:
1230	return IRQ_RETVAL(handled);
1231}
1232
1233void cx25821_print_irqbits(char *name, char *tag, char **strings,
1234			   int len, u32 bits, u32 mask)
1235{
1236	unsigned int i;
1237
1238	printk(KERN_DEBUG pr_fmt("%s: %s [0x%x]"), name, tag, bits);
1239
1240	for (i = 0; i < len; i++) {
1241		if (!(bits & (1 << i)))
1242			continue;
1243		if (strings[i])
1244			pr_cont(" %s", strings[i]);
1245		else
1246			pr_cont(" %d", i);
1247		if (!(mask & (1 << i)))
1248			continue;
1249		pr_cont("*");
1250	}
1251	pr_cont("\n");
1252}
1253EXPORT_SYMBOL(cx25821_print_irqbits);
1254
1255struct cx25821_dev *cx25821_dev_get(struct pci_dev *pci)
1256{
1257	struct cx25821_dev *dev = pci_get_drvdata(pci);
1258	return dev;
1259}
1260EXPORT_SYMBOL(cx25821_dev_get);
1261
1262static int cx25821_initdev(struct pci_dev *pci_dev,
1263			   const struct pci_device_id *pci_id)
1264{
1265	struct cx25821_dev *dev;
1266	int err = 0;
1267
1268	dev = kzalloc(sizeof(*dev), GFP_KERNEL);
1269	if (NULL == dev)
1270		return -ENOMEM;
1271
1272	err = v4l2_device_register(&pci_dev->dev, &dev->v4l2_dev);
1273	if (err < 0)
1274		goto fail_free;
1275
1276	/* pci init */
1277	dev->pci = pci_dev;
1278	if (pci_enable_device(pci_dev)) {
1279		err = -EIO;
1280
1281		pr_info("pci enable failed!\n");
1282
1283		goto fail_unregister_device;
1284	}
1285
1286	err = cx25821_dev_setup(dev);
1287	if (err)
1288		goto fail_unregister_pci;
1289
1290	/* print pci info */
1291	pci_read_config_byte(pci_dev, PCI_CLASS_REVISION, &dev->pci_rev);
1292	pci_read_config_byte(pci_dev, PCI_LATENCY_TIMER, &dev->pci_lat);
1293	pr_info("%s/0: found at %s, rev: %d, irq: %d, latency: %d, mmio: 0x%llx\n",
1294		dev->name, pci_name(pci_dev), dev->pci_rev, pci_dev->irq,
1295		dev->pci_lat, (unsigned long long)dev->base_io_addr);
1296
1297	pci_set_master(pci_dev);
1298	err = dma_set_mask(&pci_dev->dev, 0xffffffff);
1299	if (err) {
1300		pr_err("%s/0: Oops: no 32bit PCI DMA ???\n", dev->name);
1301		err = -EIO;
1302		goto fail_irq;
1303	}
1304
1305	err = request_irq(pci_dev->irq, cx25821_irq,
1306			IRQF_SHARED, dev->name, dev);
1307
1308	if (err < 0) {
1309		pr_err("%s: can't get IRQ %d\n", dev->name, pci_dev->irq);
1310		goto fail_irq;
1311	}
1312
1313	return 0;
1314
1315fail_irq:
1316	pr_info("cx25821_initdev() can't get IRQ !\n");
1317	cx25821_dev_unregister(dev);
1318
1319fail_unregister_pci:
1320	pci_disable_device(pci_dev);
1321fail_unregister_device:
1322	v4l2_device_unregister(&dev->v4l2_dev);
1323
1324fail_free:
1325	kfree(dev);
1326	return err;
1327}
1328
1329static void cx25821_finidev(struct pci_dev *pci_dev)
1330{
1331	struct v4l2_device *v4l2_dev = pci_get_drvdata(pci_dev);
1332	struct cx25821_dev *dev = get_cx25821(v4l2_dev);
1333
1334	cx25821_shutdown(dev);
1335
1336	/* unregister stuff */
1337	if (pci_dev->irq)
1338		free_irq(pci_dev->irq, dev);
1339	pci_disable_device(pci_dev);
1340
1341	cx25821_dev_unregister(dev);
1342	v4l2_device_unregister(v4l2_dev);
1343	kfree(dev);
1344}
1345
1346static const struct pci_device_id cx25821_pci_tbl[] = {
1347	{
1348		/* CX25821 Athena */
1349		.vendor = 0x14f1,
1350		.device = 0x8210,
1351		.subvendor = 0x14f1,
1352		.subdevice = 0x0920,
1353	}, {
1354		/* CX25821 No Brand */
1355		.vendor = 0x14f1,
1356		.device = 0x8210,
1357		.subvendor = 0x0000,
1358		.subdevice = 0x0000,
1359	}, {
1360		/* --- end of list --- */
1361	}
1362};
1363
1364MODULE_DEVICE_TABLE(pci, cx25821_pci_tbl);
1365
1366static struct pci_driver cx25821_pci_driver = {
1367	.name = "cx25821",
1368	.id_table = cx25821_pci_tbl,
1369	.probe = cx25821_initdev,
1370	.remove = cx25821_finidev,
1371};
1372
1373static int __init cx25821_init(void)
1374{
1375	pr_info("driver loaded\n");
1376	return pci_register_driver(&cx25821_pci_driver);
1377}
1378
1379static void __exit cx25821_fini(void)
1380{
1381	pci_unregister_driver(&cx25821_pci_driver);
1382}
1383
1384module_init(cx25821_init);
1385module_exit(cx25821_fini);
1386