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