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].
808 			sram_channels->pix_frmt, 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,
859 				128, 0);
860 
861 	cx25821_gpio_init(dev);
862 }
863 
cx25821_get_resources(struct cx25821_dev * dev)864 static int cx25821_get_resources(struct cx25821_dev *dev)
865 {
866 	if (request_mem_region
867 	    (pci_resource_start(dev->pci, 0), pci_resource_len(dev->pci, 0),
868 	     dev->name))
869 		return 0;
870 
871 	pr_err("%s: can't get MMIO memory @ 0x%llx\n",
872 	       dev->name, (unsigned long long)pci_resource_start(dev->pci, 0));
873 
874 	return -EBUSY;
875 }
876 
cx25821_dev_checkrevision(struct cx25821_dev * dev)877 static void cx25821_dev_checkrevision(struct cx25821_dev *dev)
878 {
879 	dev->hwrevision = cx_read(RDR_CFG2) & 0xff;
880 
881 	pr_info("%s(): Hardware revision = 0x%02x\n",
882 		__func__, dev->hwrevision);
883 }
884 
cx25821_iounmap(struct cx25821_dev * dev)885 static void cx25821_iounmap(struct cx25821_dev *dev)
886 {
887 	if (dev == NULL)
888 		return;
889 
890 	/* Releasing IO memory */
891 	if (dev->lmmio != NULL) {
892 		CX25821_INFO("Releasing lmmio.\n");
893 		iounmap(dev->lmmio);
894 		dev->lmmio = NULL;
895 	}
896 }
897 
cx25821_dev_setup(struct cx25821_dev * dev)898 static int cx25821_dev_setup(struct cx25821_dev *dev)
899 {
900 	int io_size = 0, i;
901 
902 	pr_info("\n***********************************\n");
903 	pr_info("cx25821 set up\n");
904 	pr_info("***********************************\n\n");
905 
906 	mutex_init(&dev->lock);
907 
908 	atomic_inc(&dev->refcount);
909 
910 	dev->nr = ++cx25821_devcount;
911 	sprintf(dev->name, "cx25821[%d]", dev->nr);
912 
913 	mutex_lock(&cx25821_devlist_mutex);
914 	list_add_tail(&dev->devlist, &cx25821_devlist);
915 	mutex_unlock(&cx25821_devlist_mutex);
916 
917 	strcpy(cx25821_boards[UNKNOWN_BOARD].name, "unknown");
918 	strcpy(cx25821_boards[CX25821_BOARD].name, "cx25821");
919 
920 	if (dev->pci->device != 0x8210) {
921 		pr_info("%s(): Exiting. Incorrect Hardware device = 0x%02x\n",
922 			__func__, dev->pci->device);
923 		return -1;
924 	} else {
925 		pr_info("Athena Hardware device = 0x%02x\n", dev->pci->device);
926 	}
927 
928 	/* Apply a sensible clock frequency for the PCIe bridge */
929 	dev->clk_freq = 28000000;
930 	for (i = 0; i < MAX_VID_CHANNEL_NUM; i++)
931 		dev->channels[i].sram_channels = &cx25821_sram_channels[i];
932 
933 	if (dev->nr > 1)
934 		CX25821_INFO("dev->nr > 1!");
935 
936 	/* board config */
937 	dev->board = 1;		/* card[dev->nr]; */
938 	dev->_max_num_decoders = MAX_DECODERS;
939 
940 	dev->pci_bus = dev->pci->bus->number;
941 	dev->pci_slot = PCI_SLOT(dev->pci->devfn);
942 	dev->pci_irqmask = 0x001f00;
943 
944 	/* External Master 1 Bus */
945 	dev->i2c_bus[0].nr = 0;
946 	dev->i2c_bus[0].dev = dev;
947 	dev->i2c_bus[0].reg_stat = I2C1_STAT;
948 	dev->i2c_bus[0].reg_ctrl = I2C1_CTRL;
949 	dev->i2c_bus[0].reg_addr = I2C1_ADDR;
950 	dev->i2c_bus[0].reg_rdata = I2C1_RDATA;
951 	dev->i2c_bus[0].reg_wdata = I2C1_WDATA;
952 	dev->i2c_bus[0].i2c_period = (0x07 << 24);	/* 1.95MHz */
953 
954 	if (cx25821_get_resources(dev) < 0) {
955 		pr_err("%s: No more PCIe resources for subsystem: %04x:%04x\n",
956 		       dev->name, dev->pci->subsystem_vendor,
957 		       dev->pci->subsystem_device);
958 
959 		cx25821_devcount--;
960 		return -EBUSY;
961 	}
962 
963 	/* PCIe stuff */
964 	dev->base_io_addr = pci_resource_start(dev->pci, 0);
965 	io_size = pci_resource_len(dev->pci, 0);
966 
967 	if (!dev->base_io_addr) {
968 		CX25821_ERR("No PCI Memory resources, exiting!\n");
969 		return -ENODEV;
970 	}
971 
972 	dev->lmmio = ioremap(dev->base_io_addr, pci_resource_len(dev->pci, 0));
973 
974 	if (!dev->lmmio) {
975 		CX25821_ERR
976 		    ("ioremap failed, maybe increasing __VMALLOC_RESERVE in page.h\n");
977 		cx25821_iounmap(dev);
978 		return -ENOMEM;
979 	}
980 
981 	dev->bmmio = (u8 __iomem *) dev->lmmio;
982 
983 	pr_info("%s: subsystem: %04x:%04x, board: %s [card=%d,%s]\n",
984 		dev->name, dev->pci->subsystem_vendor,
985 		dev->pci->subsystem_device, cx25821_boards[dev->board].name,
986 		dev->board, card[dev->nr] == dev->board ?
987 		"insmod option" : "autodetected");
988 
989 	/* init hardware */
990 	cx25821_initialize(dev);
991 
992 	cx25821_i2c_register(&dev->i2c_bus[0]);
993 /*  cx25821_i2c_register(&dev->i2c_bus[1]);
994  *  cx25821_i2c_register(&dev->i2c_bus[2]); */
995 
996 	CX25821_INFO("i2c register! bus->i2c_rc = %d\n",
997 		     dev->i2c_bus[0].i2c_rc);
998 
999 	cx25821_card_setup(dev);
1000 
1001 	if (medusa_video_init(dev) < 0)
1002 		CX25821_ERR("%s(): Failed to initialize medusa!\n", __func__);
1003 
1004 	cx25821_video_register(dev);
1005 
1006 	/* register IOCTL device */
1007 	dev->ioctl_dev =
1008 	   cx25821_vdev_init(dev, dev->pci, &cx25821_videoioctl_template,
1009 			      "video");
1010 
1011 	if (video_register_device
1012 	    (dev->ioctl_dev, VFL_TYPE_GRABBER, VIDEO_IOCTL_CH) < 0) {
1013 		cx25821_videoioctl_unregister(dev);
1014 		pr_err("%s(): Failed to register video adapter for IOCTL, so unregistering videoioctl device\n",
1015 		       __func__);
1016 	}
1017 
1018 	cx25821_dev_checkrevision(dev);
1019 	CX25821_INFO("setup done!\n");
1020 
1021 	return 0;
1022 }
1023 
cx25821_start_upstream_video_ch1(struct cx25821_dev * dev,struct upstream_user_struct * up_data)1024 void cx25821_start_upstream_video_ch1(struct cx25821_dev *dev,
1025 				      struct upstream_user_struct *up_data)
1026 {
1027 	dev->_isNTSC = !strcmp(dev->vid_stdname, "NTSC") ? 1 : 0;
1028 
1029 	dev->tvnorm = !dev->_isNTSC ? V4L2_STD_PAL_BG : V4L2_STD_NTSC_M;
1030 	medusa_set_videostandard(dev);
1031 
1032 	cx25821_vidupstream_init_ch1(dev, dev->channel_select,
1033 				     dev->pixel_format);
1034 }
1035 
cx25821_start_upstream_video_ch2(struct cx25821_dev * dev,struct upstream_user_struct * up_data)1036 void cx25821_start_upstream_video_ch2(struct cx25821_dev *dev,
1037 				      struct upstream_user_struct *up_data)
1038 {
1039 	dev->_isNTSC_ch2 = !strcmp(dev->vid_stdname_ch2, "NTSC") ? 1 : 0;
1040 
1041 	dev->tvnorm = !dev->_isNTSC_ch2 ? V4L2_STD_PAL_BG : V4L2_STD_NTSC_M;
1042 	medusa_set_videostandard(dev);
1043 
1044 	cx25821_vidupstream_init_ch2(dev, dev->channel_select_ch2,
1045 				     dev->pixel_format_ch2);
1046 }
1047 
cx25821_start_upstream_audio(struct cx25821_dev * dev,struct upstream_user_struct * up_data)1048 void cx25821_start_upstream_audio(struct cx25821_dev *dev,
1049 				  struct upstream_user_struct *up_data)
1050 {
1051 	cx25821_audio_upstream_init(dev, AUDIO_UPSTREAM_SRAM_CHANNEL_B);
1052 }
1053 
cx25821_dev_unregister(struct cx25821_dev * dev)1054 void cx25821_dev_unregister(struct cx25821_dev *dev)
1055 {
1056 	int i;
1057 
1058 	if (!dev->base_io_addr)
1059 		return;
1060 
1061 	cx25821_free_mem_upstream_ch1(dev);
1062 	cx25821_free_mem_upstream_ch2(dev);
1063 	cx25821_free_mem_upstream_audio(dev);
1064 
1065 	release_mem_region(dev->base_io_addr, pci_resource_len(dev->pci, 0));
1066 
1067 	if (!atomic_dec_and_test(&dev->refcount))
1068 		return;
1069 
1070 	for (i = 0; i < VID_CHANNEL_NUM; i++)
1071 		cx25821_video_unregister(dev, i);
1072 
1073 	for (i = VID_UPSTREAM_SRAM_CHANNEL_I;
1074 	     i <= AUDIO_UPSTREAM_SRAM_CHANNEL_B; i++) {
1075 		cx25821_video_unregister(dev, i);
1076 	}
1077 
1078 	cx25821_videoioctl_unregister(dev);
1079 
1080 	cx25821_i2c_unregister(&dev->i2c_bus[0]);
1081 	cx25821_iounmap(dev);
1082 }
1083 EXPORT_SYMBOL(cx25821_dev_unregister);
1084 
cx25821_risc_field(__le32 * rp,struct scatterlist * sglist,unsigned int offset,u32 sync_line,unsigned int bpl,unsigned int padding,unsigned int lines)1085 static __le32 *cx25821_risc_field(__le32 * rp, struct scatterlist *sglist,
1086 				  unsigned int offset, u32 sync_line,
1087 				  unsigned int bpl, unsigned int padding,
1088 				  unsigned int lines)
1089 {
1090 	struct scatterlist *sg;
1091 	unsigned int line, todo;
1092 
1093 	/* sync instruction */
1094 	if (sync_line != NO_SYNC_LINE)
1095 		*(rp++) = cpu_to_le32(RISC_RESYNC | sync_line);
1096 
1097 	/* scan lines */
1098 	sg = sglist;
1099 	for (line = 0; line < lines; line++) {
1100 		while (offset && offset >= sg_dma_len(sg)) {
1101 			offset -= sg_dma_len(sg);
1102 			sg++;
1103 		}
1104 		if (bpl <= sg_dma_len(sg) - offset) {
1105 			/* fits into current chunk */
1106 			*(rp++) =
1107 			    cpu_to_le32(RISC_WRITE | RISC_SOL | RISC_EOL | bpl);
1108 			*(rp++) = cpu_to_le32(sg_dma_address(sg) + offset);
1109 			*(rp++) = cpu_to_le32(0);	/* bits 63-32 */
1110 			offset += bpl;
1111 		} else {
1112 			/* scanline needs to be split */
1113 			todo = bpl;
1114 			*(rp++) =
1115 			    cpu_to_le32(RISC_WRITE | RISC_SOL |
1116 					(sg_dma_len(sg) - offset));
1117 			*(rp++) = cpu_to_le32(sg_dma_address(sg) + offset);
1118 			*(rp++) = cpu_to_le32(0);	/* bits 63-32 */
1119 			todo -= (sg_dma_len(sg) - offset);
1120 			offset = 0;
1121 			sg++;
1122 			while (todo > sg_dma_len(sg)) {
1123 				*(rp++) =
1124 				    cpu_to_le32(RISC_WRITE | sg_dma_len(sg));
1125 				*(rp++) = cpu_to_le32(sg_dma_address(sg));
1126 				*(rp++) = cpu_to_le32(0);	/* bits 63-32 */
1127 				todo -= sg_dma_len(sg);
1128 				sg++;
1129 			}
1130 			*(rp++) = cpu_to_le32(RISC_WRITE | RISC_EOL | todo);
1131 			*(rp++) = cpu_to_le32(sg_dma_address(sg));
1132 			*(rp++) = cpu_to_le32(0);	/* bits 63-32 */
1133 			offset += todo;
1134 		}
1135 
1136 		offset += padding;
1137 	}
1138 
1139 	return rp;
1140 }
1141 
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)1142 int cx25821_risc_buffer(struct pci_dev *pci, struct btcx_riscmem *risc,
1143 			struct scatterlist *sglist, unsigned int top_offset,
1144 			unsigned int bottom_offset, unsigned int bpl,
1145 			unsigned int padding, unsigned int lines)
1146 {
1147 	u32 instructions;
1148 	u32 fields;
1149 	__le32 *rp;
1150 	int rc;
1151 
1152 	fields = 0;
1153 	if (UNSET != top_offset)
1154 		fields++;
1155 	if (UNSET != bottom_offset)
1156 		fields++;
1157 
1158 	/* estimate risc mem: worst case is one write per page border +
1159 	   one write per scan line + syncs + jump (all 2 dwords).  Padding
1160 	   can cause next bpl to start close to a page border.  First DMA
1161 	   region may be smaller than PAGE_SIZE */
1162 	/* write and jump need and extra dword */
1163 	instructions =
1164 	    fields * (1 + ((bpl + padding) * lines) / PAGE_SIZE + lines);
1165 	instructions += 2;
1166 	rc = btcx_riscmem_alloc(pci, risc, instructions * 12);
1167 
1168 	if (rc < 0)
1169 		return rc;
1170 
1171 	/* write risc instructions */
1172 	rp = risc->cpu;
1173 
1174 	if (UNSET != top_offset) {
1175 		rp = cx25821_risc_field(rp, sglist, top_offset, 0, bpl, padding,
1176 					lines);
1177 	}
1178 
1179 	if (UNSET != bottom_offset) {
1180 		rp = cx25821_risc_field(rp, sglist, bottom_offset, 0x200, bpl,
1181 					padding, lines);
1182 	}
1183 
1184 	/* save pointer to jmp instruction address */
1185 	risc->jmp = rp;
1186 	BUG_ON((risc->jmp - risc->cpu + 2) * sizeof(*risc->cpu) > risc->size);
1187 
1188 	return 0;
1189 }
1190 
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)1191 static __le32 *cx25821_risc_field_audio(__le32 * rp, struct scatterlist *sglist,
1192 					unsigned int offset, u32 sync_line,
1193 					unsigned int bpl, unsigned int padding,
1194 					unsigned int lines, unsigned int lpi)
1195 {
1196 	struct scatterlist *sg;
1197 	unsigned int line, todo, sol;
1198 
1199 	/* sync instruction */
1200 	if (sync_line != NO_SYNC_LINE)
1201 		*(rp++) = cpu_to_le32(RISC_RESYNC | sync_line);
1202 
1203 	/* scan lines */
1204 	sg = sglist;
1205 	for (line = 0; line < lines; line++) {
1206 		while (offset && offset >= sg_dma_len(sg)) {
1207 			offset -= sg_dma_len(sg);
1208 			sg++;
1209 		}
1210 
1211 		if (lpi && line > 0 && !(line % lpi))
1212 			sol = RISC_SOL | RISC_IRQ1 | RISC_CNT_INC;
1213 		else
1214 			sol = RISC_SOL;
1215 
1216 		if (bpl <= sg_dma_len(sg) - offset) {
1217 			/* fits into current chunk */
1218 			*(rp++) =
1219 			    cpu_to_le32(RISC_WRITE | sol | RISC_EOL | bpl);
1220 			*(rp++) = cpu_to_le32(sg_dma_address(sg) + offset);
1221 			*(rp++) = cpu_to_le32(0);	/* bits 63-32 */
1222 			offset += bpl;
1223 		} else {
1224 			/* scanline needs to be split */
1225 			todo = bpl;
1226 			*(rp++) = cpu_to_le32(RISC_WRITE | sol |
1227 					      (sg_dma_len(sg) - offset));
1228 			*(rp++) = cpu_to_le32(sg_dma_address(sg) + offset);
1229 			*(rp++) = cpu_to_le32(0);	/* bits 63-32 */
1230 			todo -= (sg_dma_len(sg) - offset);
1231 			offset = 0;
1232 			sg++;
1233 			while (todo > sg_dma_len(sg)) {
1234 				*(rp++) = cpu_to_le32(RISC_WRITE |
1235 						      sg_dma_len(sg));
1236 				*(rp++) = cpu_to_le32(sg_dma_address(sg));
1237 				*(rp++) = cpu_to_le32(0);	/* bits 63-32 */
1238 				todo -= sg_dma_len(sg);
1239 				sg++;
1240 			}
1241 			*(rp++) = cpu_to_le32(RISC_WRITE | RISC_EOL | todo);
1242 			*(rp++) = cpu_to_le32(sg_dma_address(sg));
1243 			*(rp++) = cpu_to_le32(0);	/* bits 63-32 */
1244 			offset += todo;
1245 		}
1246 		offset += padding;
1247 	}
1248 
1249 	return rp;
1250 }
1251 
cx25821_risc_databuffer_audio(struct pci_dev * pci,struct btcx_riscmem * risc,struct scatterlist * sglist,unsigned int bpl,unsigned int lines,unsigned int lpi)1252 int cx25821_risc_databuffer_audio(struct pci_dev *pci,
1253 				  struct btcx_riscmem *risc,
1254 				  struct scatterlist *sglist,
1255 				  unsigned int bpl,
1256 				  unsigned int lines, unsigned int lpi)
1257 {
1258 	u32 instructions;
1259 	__le32 *rp;
1260 	int rc;
1261 
1262 	/* estimate risc mem: worst case is one write per page border +
1263 	   one write per scan line + syncs + jump (all 2 dwords).  Here
1264 	   there is no padding and no sync.  First DMA region may be smaller
1265 	   than PAGE_SIZE */
1266 	/* Jump and write need an extra dword */
1267 	instructions = 1 + (bpl * lines) / PAGE_SIZE + lines;
1268 	instructions += 1;
1269 
1270 	rc = btcx_riscmem_alloc(pci, risc, instructions * 12);
1271 	if (rc < 0)
1272 		return rc;
1273 
1274 	/* write risc instructions */
1275 	rp = risc->cpu;
1276 	rp = cx25821_risc_field_audio(rp, sglist, 0, NO_SYNC_LINE, bpl, 0,
1277 				      lines, lpi);
1278 
1279 	/* save pointer to jmp instruction address */
1280 	risc->jmp = rp;
1281 	BUG_ON((risc->jmp - risc->cpu + 2) * sizeof(*risc->cpu) > risc->size);
1282 	return 0;
1283 }
1284 EXPORT_SYMBOL(cx25821_risc_databuffer_audio);
1285 
cx25821_risc_stopper(struct pci_dev * pci,struct btcx_riscmem * risc,u32 reg,u32 mask,u32 value)1286 int cx25821_risc_stopper(struct pci_dev *pci, struct btcx_riscmem *risc,
1287 			 u32 reg, u32 mask, u32 value)
1288 {
1289 	__le32 *rp;
1290 	int rc;
1291 
1292 	rc = btcx_riscmem_alloc(pci, risc, 4 * 16);
1293 
1294 	if (rc < 0)
1295 		return rc;
1296 
1297 	/* write risc instructions */
1298 	rp = risc->cpu;
1299 
1300 	*(rp++) = cpu_to_le32(RISC_WRITECR | RISC_IRQ1);
1301 	*(rp++) = cpu_to_le32(reg);
1302 	*(rp++) = cpu_to_le32(value);
1303 	*(rp++) = cpu_to_le32(mask);
1304 	*(rp++) = cpu_to_le32(RISC_JUMP);
1305 	*(rp++) = cpu_to_le32(risc->dma);
1306 	*(rp++) = cpu_to_le32(0);	/* bits 63-32 */
1307 	return 0;
1308 }
1309 
cx25821_free_buffer(struct videobuf_queue * q,struct cx25821_buffer * buf)1310 void cx25821_free_buffer(struct videobuf_queue *q, struct cx25821_buffer *buf)
1311 {
1312 	struct videobuf_dmabuf *dma = videobuf_to_dma(&buf->vb);
1313 
1314 	BUG_ON(in_interrupt());
1315 	videobuf_waiton(q, &buf->vb, 0, 0);
1316 	videobuf_dma_unmap(q->dev, dma);
1317 	videobuf_dma_free(dma);
1318 	btcx_riscmem_free(to_pci_dev(q->dev), &buf->risc);
1319 	buf->vb.state = VIDEOBUF_NEEDS_INIT;
1320 }
1321 
cx25821_irq(int irq,void * dev_id)1322 static irqreturn_t cx25821_irq(int irq, void *dev_id)
1323 {
1324 	struct cx25821_dev *dev = dev_id;
1325 	u32 pci_status, pci_mask;
1326 	u32 vid_status;
1327 	int i, handled = 0;
1328 	u32 mask[8] = { 1, 2, 4, 8, 16, 32, 64, 128 };
1329 
1330 	pci_status = cx_read(PCI_INT_STAT);
1331 	pci_mask = cx_read(PCI_INT_MSK);
1332 
1333 	if (pci_status == 0)
1334 		goto out;
1335 
1336 	for (i = 0; i < VID_CHANNEL_NUM; i++) {
1337 		if (pci_status & mask[i]) {
1338 			vid_status = cx_read(dev->channels[i].
1339 				sram_channels->int_stat);
1340 
1341 			if (vid_status)
1342 				handled +=
1343 				cx25821_video_irq(dev, i, vid_status);
1344 
1345 			cx_write(PCI_INT_STAT, mask[i]);
1346 		}
1347 	}
1348 
1349 out:
1350 	return IRQ_RETVAL(handled);
1351 }
1352 
cx25821_print_irqbits(char * name,char * tag,char ** strings,int len,u32 bits,u32 mask)1353 void cx25821_print_irqbits(char *name, char *tag, char **strings,
1354 			   int len, u32 bits, u32 mask)
1355 {
1356 	unsigned int i;
1357 
1358 	printk(KERN_DEBUG pr_fmt("%s: %s [0x%x]"), name, tag, bits);
1359 
1360 	for (i = 0; i < len; i++) {
1361 		if (!(bits & (1 << i)))
1362 			continue;
1363 		if (strings[i])
1364 			pr_cont(" %s", strings[i]);
1365 		else
1366 			pr_cont(" %d", i);
1367 		if (!(mask & (1 << i)))
1368 			continue;
1369 		pr_cont("*");
1370 	}
1371 	pr_cont("\n");
1372 }
1373 EXPORT_SYMBOL(cx25821_print_irqbits);
1374 
cx25821_dev_get(struct pci_dev * pci)1375 struct cx25821_dev *cx25821_dev_get(struct pci_dev *pci)
1376 {
1377 	struct cx25821_dev *dev = pci_get_drvdata(pci);
1378 	return dev;
1379 }
1380 EXPORT_SYMBOL(cx25821_dev_get);
1381 
cx25821_initdev(struct pci_dev * pci_dev,const struct pci_device_id * pci_id)1382 static int __devinit cx25821_initdev(struct pci_dev *pci_dev,
1383 				     const struct pci_device_id *pci_id)
1384 {
1385 	struct cx25821_dev *dev;
1386 	int err = 0;
1387 
1388 	dev = kzalloc(sizeof(*dev), GFP_KERNEL);
1389 	if (NULL == dev)
1390 		return -ENOMEM;
1391 
1392 	err = v4l2_device_register(&pci_dev->dev, &dev->v4l2_dev);
1393 	if (err < 0)
1394 		goto fail_free;
1395 
1396 	/* pci init */
1397 	dev->pci = pci_dev;
1398 	if (pci_enable_device(pci_dev)) {
1399 		err = -EIO;
1400 
1401 		pr_info("pci enable failed!\n");
1402 
1403 		goto fail_unregister_device;
1404 	}
1405 
1406 	pr_info("Athena pci enable !\n");
1407 
1408 	err = cx25821_dev_setup(dev);
1409 	if (err) {
1410 		if (err == -EBUSY)
1411 			goto fail_unregister_device;
1412 		else
1413 			goto fail_unregister_pci;
1414 	}
1415 
1416 	/* print pci info */
1417 	pci_read_config_byte(pci_dev, PCI_CLASS_REVISION, &dev->pci_rev);
1418 	pci_read_config_byte(pci_dev, PCI_LATENCY_TIMER, &dev->pci_lat);
1419 	pr_info("%s/0: found at %s, rev: %d, irq: %d, latency: %d, mmio: 0x%llx\n",
1420 		dev->name, pci_name(pci_dev), dev->pci_rev, pci_dev->irq,
1421 		dev->pci_lat, (unsigned long long)dev->base_io_addr);
1422 
1423 	pci_set_master(pci_dev);
1424 	if (!pci_dma_supported(pci_dev, 0xffffffff)) {
1425 		pr_err("%s/0: Oops: no 32bit PCI DMA ???\n", dev->name);
1426 		err = -EIO;
1427 		goto fail_irq;
1428 	}
1429 
1430 	err =
1431 	    request_irq(pci_dev->irq, cx25821_irq, IRQF_SHARED | IRQF_DISABLED,
1432 			dev->name, dev);
1433 
1434 	if (err < 0) {
1435 		pr_err("%s: can't get IRQ %d\n", dev->name, pci_dev->irq);
1436 		goto fail_irq;
1437 	}
1438 
1439 	return 0;
1440 
1441 fail_irq:
1442 	pr_info("cx25821_initdev() can't get IRQ !\n");
1443 	cx25821_dev_unregister(dev);
1444 
1445 fail_unregister_pci:
1446 	pci_disable_device(pci_dev);
1447 fail_unregister_device:
1448 	v4l2_device_unregister(&dev->v4l2_dev);
1449 
1450 fail_free:
1451 	kfree(dev);
1452 	return err;
1453 }
1454 
cx25821_finidev(struct pci_dev * pci_dev)1455 static void __devexit cx25821_finidev(struct pci_dev *pci_dev)
1456 {
1457 	struct v4l2_device *v4l2_dev = pci_get_drvdata(pci_dev);
1458 	struct cx25821_dev *dev = get_cx25821(v4l2_dev);
1459 
1460 	cx25821_shutdown(dev);
1461 	pci_disable_device(pci_dev);
1462 
1463 	/* unregister stuff */
1464 	if (pci_dev->irq)
1465 		free_irq(pci_dev->irq, dev);
1466 
1467 	mutex_lock(&cx25821_devlist_mutex);
1468 	list_del(&dev->devlist);
1469 	mutex_unlock(&cx25821_devlist_mutex);
1470 
1471 	cx25821_dev_unregister(dev);
1472 	v4l2_device_unregister(v4l2_dev);
1473 	kfree(dev);
1474 }
1475 
1476 static struct pci_device_id cx25821_pci_tbl[] = {
1477 	{
1478 	 /* CX25821 Athena */
1479 	 .vendor = 0x14f1,
1480 	 .device = 0x8210,
1481 	 .subvendor = 0x14f1,
1482 	 .subdevice = 0x0920,
1483 	 },
1484 	{
1485 	 /* --- end of list --- */
1486 	 }
1487 };
1488 
1489 MODULE_DEVICE_TABLE(pci, cx25821_pci_tbl);
1490 
1491 static struct pci_driver cx25821_pci_driver = {
1492 	.name = "cx25821",
1493 	.id_table = cx25821_pci_tbl,
1494 	.probe = cx25821_initdev,
1495 	.remove = __devexit_p(cx25821_finidev),
1496 	/* TODO */
1497 	.suspend = NULL,
1498 	.resume = NULL,
1499 };
1500 
cx25821_init(void)1501 static int __init cx25821_init(void)
1502 {
1503 	pr_info("driver version %d.%d.%d loaded\n",
1504 		(CX25821_VERSION_CODE >> 16) & 0xff,
1505 		(CX25821_VERSION_CODE >> 8) & 0xff,
1506 		CX25821_VERSION_CODE & 0xff);
1507 	return pci_register_driver(&cx25821_pci_driver);
1508 }
1509 
cx25821_fini(void)1510 static void __exit cx25821_fini(void)
1511 {
1512 	pci_unregister_driver(&cx25821_pci_driver);
1513 }
1514 
1515 EXPORT_SYMBOL(cx25821_set_gpiopin_direction);
1516 
1517 module_init(cx25821_init);
1518 module_exit(cx25821_fini);
1519