Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
cx25821-core.c
Go to the documentation of this file.
1 /*
2  * Driver for the Conexant CX25821 PCIe bridge
3  *
4  * Copyright (C) 2009 Conexant Systems Inc.
6  * Based on Steven Toth <[email protected]> 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 
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),
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),
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,
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,
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,
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,
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,
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,
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,
259 
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,
285 
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,
310  .gpcnt = AUD_B_GPCNT,
312  .aud_cfg = AUD_B_CFG,
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 
333 
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 
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 
382 static void cx25821_registers_init(struct cx25821_dev *dev)
383 {
384  u32 tmp;
385 
386  /* enable RUN_RISC in Pecos */
387  cx_write(DEV_CNTRL2, 0x20);
388 
389  /* Set the master PCI interrupt masks to enable video, audio, MBIF,
390  * and GPIO interrupts
391  * I2C interrupt masking is handled by the I2C objects themselves. */
392  cx_write(PCI_INT_MSK, 0x2001FFFF);
393 
394  tmp = cx_read(RDR_TLCTL0);
395  tmp &= ~FLD_CFG_RCB_CK_EN; /* Clear the RCB_CK_EN bit */
396  cx_write(RDR_TLCTL0, tmp);
397 
398  /* PLL-A setting for the Audio Master Clock */
399  cx_write(PLL_A_INT_FRAC, 0x9807A58B);
400 
401  /* PLL_A_POST = 0x1C, PLL_A_OUT_TO_PIN = 0x1 */
402  cx_write(PLL_A_POST_STAT_BIST, 0x8000019C);
403 
404  /* clear reset bit [31] */
405  tmp = cx_read(PLL_A_INT_FRAC);
406  cx_write(PLL_A_INT_FRAC, tmp & 0x7FFFFFFF);
407 
408  /* PLL-B setting for Mobilygen Host Bus Interface */
409  cx_write(PLL_B_INT_FRAC, 0x9883A86F);
410 
411  /* PLL_B_POST = 0xD, PLL_B_OUT_TO_PIN = 0x0 */
412  cx_write(PLL_B_POST_STAT_BIST, 0x8000018D);
413 
414  /* clear reset bit [31] */
415  tmp = cx_read(PLL_B_INT_FRAC);
416  cx_write(PLL_B_INT_FRAC, tmp & 0x7FFFFFFF);
417 
418  /* PLL-C setting for video upstream channel */
419  cx_write(PLL_C_INT_FRAC, 0x96A0EA3F);
420 
421  /* PLL_C_POST = 0x3, PLL_C_OUT_TO_PIN = 0x0 */
422  cx_write(PLL_C_POST_STAT_BIST, 0x80000103);
423 
424  /* clear reset bit [31] */
425  tmp = cx_read(PLL_C_INT_FRAC);
426  cx_write(PLL_C_INT_FRAC, tmp & 0x7FFFFFFF);
427 
428  /* PLL-D setting for audio upstream channel */
429  cx_write(PLL_D_INT_FRAC, 0x98757F5B);
430 
431  /* PLL_D_POST = 0x13, PLL_D_OUT_TO_PIN = 0x0 */
432  cx_write(PLL_D_POST_STAT_BIST, 0x80000113);
433 
434  /* clear reset bit [31] */
435  tmp = cx_read(PLL_D_INT_FRAC);
436  cx_write(PLL_D_INT_FRAC, tmp & 0x7FFFFFFF);
437 
438  /* This selects the PLL C clock source for the video upstream channel
439  * I and J */
440  tmp = cx_read(VID_CH_CLK_SEL);
441  cx_write(VID_CH_CLK_SEL, (tmp & 0x00FFFFFF) | 0x24000000);
442 
443  /* 656/VIP SRC Upstream Channel I & J and 7 - Host Bus Interface for
444  * channel A-C
445  * select 656/VIP DST for downstream Channel A - C */
446  tmp = cx_read(VID_CH_MODE_SEL);
447  /* cx_write( VID_CH_MODE_SEL, tmp | 0x1B0001FF); */
448  cx_write(VID_CH_MODE_SEL, tmp & 0xFFFFFE00);
449 
450  /* enables 656 port I and J as output */
451  tmp = cx_read(CLK_RST);
452  /* use external ALT_PLL_REF pin as its reference clock instead */
453  tmp |= FLD_USE_ALT_PLL_REF;
455 
456  mdelay(100);
457 }
458 
460  struct sram_channel *ch,
461  unsigned int bpl, u32 risc)
462 {
463  unsigned int i, lines;
464  u32 cdt;
465 
466  if (ch->cmds_start == 0) {
467  cx_write(ch->ptr1_reg, 0);
468  cx_write(ch->ptr2_reg, 0);
469  cx_write(ch->cnt2_reg, 0);
470  cx_write(ch->cnt1_reg, 0);
471  return 0;
472  }
473 
474  bpl = (bpl + 7) & ~7; /* alignment */
475  cdt = ch->cdt;
476  lines = ch->fifo_size / bpl;
477 
478  if (lines > 4)
479  lines = 4;
480 
481  BUG_ON(lines < 2);
482 
484  cx_write(8 + 4, 8);
485  cx_write(8 + 8, 0);
486 
487  /* write CDT */
488  for (i = 0; i < lines; i++) {
489  cx_write(cdt + 16 * i, ch->fifo_start + bpl * i);
490  cx_write(cdt + 16 * i + 4, 0);
491  cx_write(cdt + 16 * i + 8, 0);
492  cx_write(cdt + 16 * i + 12, 0);
493  }
494 
495  /* init the first cdt buffer */
496  for (i = 0; i < 128; i++)
497  cx_write(ch->fifo_start + 4 * i, i);
498 
499  /* write CMDS */
500  if (ch->jumponly)
501  cx_write(ch->cmds_start + 0, 8);
502  else
503  cx_write(ch->cmds_start + 0, risc);
504 
505  cx_write(ch->cmds_start + 4, 0); /* 64 bits 63-32 */
506  cx_write(ch->cmds_start + 8, cdt);
507  cx_write(ch->cmds_start + 12, (lines * 16) >> 3);
508  cx_write(ch->cmds_start + 16, ch->ctrl_start);
509 
510  if (ch->jumponly)
511  cx_write(ch->cmds_start + 20, 0x80000000 | (64 >> 2));
512  else
513  cx_write(ch->cmds_start + 20, 64 >> 2);
514 
515  for (i = 24; i < 80; i += 4)
516  cx_write(ch->cmds_start + i, 0);
517 
518  /* fill registers */
519  cx_write(ch->ptr1_reg, ch->fifo_start);
520  cx_write(ch->ptr2_reg, cdt);
521  cx_write(ch->cnt2_reg, (lines * 16) >> 3);
522  cx_write(ch->cnt1_reg, (bpl >> 3) - 1);
523 
524  return 0;
525 }
527 
529  struct sram_channel *ch,
530  unsigned int bpl, u32 risc)
531 {
532  unsigned int i, lines;
533  u32 cdt;
534 
535  if (ch->cmds_start == 0) {
536  cx_write(ch->ptr1_reg, 0);
537  cx_write(ch->ptr2_reg, 0);
538  cx_write(ch->cnt2_reg, 0);
539  cx_write(ch->cnt1_reg, 0);
540  return 0;
541  }
542 
543  bpl = (bpl + 7) & ~7; /* alignment */
544  cdt = ch->cdt;
545  lines = ch->fifo_size / bpl;
546 
547  if (lines > 3)
548  lines = 3; /* for AUDIO */
549 
550  BUG_ON(lines < 2);
551 
553  cx_write(8 + 4, 8);
554  cx_write(8 + 8, 0);
555 
556  /* write CDT */
557  for (i = 0; i < lines; i++) {
558  cx_write(cdt + 16 * i, ch->fifo_start + bpl * i);
559  cx_write(cdt + 16 * i + 4, 0);
560  cx_write(cdt + 16 * i + 8, 0);
561  cx_write(cdt + 16 * i + 12, 0);
562  }
563 
564  /* write CMDS */
565  if (ch->jumponly)
566  cx_write(ch->cmds_start + 0, 8);
567  else
568  cx_write(ch->cmds_start + 0, risc);
569 
570  cx_write(ch->cmds_start + 4, 0); /* 64 bits 63-32 */
571  cx_write(ch->cmds_start + 8, cdt);
572  cx_write(ch->cmds_start + 12, (lines * 16) >> 3);
573  cx_write(ch->cmds_start + 16, ch->ctrl_start);
574 
575  /* IQ size */
576  if (ch->jumponly)
577  cx_write(ch->cmds_start + 20, 0x80000000 | (64 >> 2));
578  else
579  cx_write(ch->cmds_start + 20, 64 >> 2);
580 
581  /* zero out */
582  for (i = 24; i < 80; i += 4)
583  cx_write(ch->cmds_start + i, 0);
584 
585  /* fill registers */
586  cx_write(ch->ptr1_reg, ch->fifo_start);
587  cx_write(ch->ptr2_reg, cdt);
588  cx_write(ch->cnt2_reg, (lines * 16) >> 3);
589  cx_write(ch->cnt1_reg, (bpl >> 3) - 1);
590 
591  return 0;
592 }
594 
596 {
597  static char *name[] = {
598  "init risc lo",
599  "init risc hi",
600  "cdt base",
601  "cdt size",
602  "iq base",
603  "iq size",
604  "risc pc lo",
605  "risc pc hi",
606  "iq wr ptr",
607  "iq rd ptr",
608  "cdt current",
609  "pci target lo",
610  "pci target hi",
611  "line / byte",
612  };
613  u32 risc;
614  unsigned int i, j, n;
615 
616  pr_warn("%s: %s - dma channel status dump\n", dev->name, ch->name);
617  for (i = 0; i < ARRAY_SIZE(name); i++)
618  pr_warn("cmds + 0x%2x: %-15s: 0x%08x\n",
619  i * 4, name[i], cx_read(ch->cmds_start + 4 * i));
620 
621  j = i * 4;
622  for (i = 0; i < 4;) {
623  risc = cx_read(ch->cmds_start + 4 * (i + 14));
624  pr_warn("cmds + 0x%2x: risc%d: ", j + i * 4, i);
625  i += cx25821_risc_decode(risc);
626  }
627 
628  for (i = 0; i < (64 >> 2); i += n) {
629  risc = cx_read(ch->ctrl_start + 4 * i);
630  /* No consideration for bits 63-32 */
631 
632  pr_warn("ctrl + 0x%2x (0x%08x): iq %x: ",
633  i * 4, ch->ctrl_start + 4 * i, i);
634  n = cx25821_risc_decode(risc);
635  for (j = 1; j < n; j++) {
636  risc = cx_read(ch->ctrl_start + 4 * (i + j));
637  pr_warn("ctrl + 0x%2x : iq %x: 0x%08x [ arg #%d ]\n",
638  4 * (i + j), i + j, risc, j);
639  }
640  }
641 
642  pr_warn(" : fifo: 0x%08x -> 0x%x\n",
643  ch->fifo_start, ch->fifo_start + ch->fifo_size);
644  pr_warn(" : ctrl: 0x%08x -> 0x%x\n",
645  ch->ctrl_start, ch->ctrl_start + 6 * 16);
646  pr_warn(" : ptr1_reg: 0x%08x\n",
647  cx_read(ch->ptr1_reg));
648  pr_warn(" : ptr2_reg: 0x%08x\n",
649  cx_read(ch->ptr2_reg));
650  pr_warn(" : cnt1_reg: 0x%08x\n",
651  cx_read(ch->cnt1_reg));
652  pr_warn(" : cnt2_reg: 0x%08x\n",
653  cx_read(ch->cnt2_reg));
654 }
656 
658  struct sram_channel *ch)
659 {
660  static const char * const name[] = {
661  "init risc lo",
662  "init risc hi",
663  "cdt base",
664  "cdt size",
665  "iq base",
666  "iq size",
667  "risc pc lo",
668  "risc pc hi",
669  "iq wr ptr",
670  "iq rd ptr",
671  "cdt current",
672  "pci target lo",
673  "pci target hi",
674  "line / byte",
675  };
676 
677  u32 risc, value, tmp;
678  unsigned int i, j, n;
679 
680  pr_info("\n%s: %s - dma Audio channel status dump\n",
681  dev->name, ch->name);
682 
683  for (i = 0; i < ARRAY_SIZE(name); i++)
684  pr_info("%s: cmds + 0x%2x: %-15s: 0x%08x\n",
685  dev->name, i * 4, name[i],
686  cx_read(ch->cmds_start + 4 * i));
687 
688  j = i * 4;
689  for (i = 0; i < 4;) {
690  risc = cx_read(ch->cmds_start + 4 * (i + 14));
691  pr_warn("cmds + 0x%2x: risc%d: ", j + i * 4, i);
692  i += cx25821_risc_decode(risc);
693  }
694 
695  for (i = 0; i < (64 >> 2); i += n) {
696  risc = cx_read(ch->ctrl_start + 4 * i);
697  /* No consideration for bits 63-32 */
698 
699  pr_warn("ctrl + 0x%2x (0x%08x): iq %x: ",
700  i * 4, ch->ctrl_start + 4 * i, i);
701  n = cx25821_risc_decode(risc);
702 
703  for (j = 1; j < n; j++) {
704  risc = cx_read(ch->ctrl_start + 4 * (i + j));
705  pr_warn("ctrl + 0x%2x : iq %x: 0x%08x [ arg #%d ]\n",
706  4 * (i + j), i + j, risc, j);
707  }
708  }
709 
710  pr_warn(" : fifo: 0x%08x -> 0x%x\n",
711  ch->fifo_start, ch->fifo_start + ch->fifo_size);
712  pr_warn(" : ctrl: 0x%08x -> 0x%x\n",
713  ch->ctrl_start, ch->ctrl_start + 6 * 16);
714  pr_warn(" : ptr1_reg: 0x%08x\n",
715  cx_read(ch->ptr1_reg));
716  pr_warn(" : ptr2_reg: 0x%08x\n",
717  cx_read(ch->ptr2_reg));
718  pr_warn(" : cnt1_reg: 0x%08x\n",
719  cx_read(ch->cnt1_reg));
720  pr_warn(" : cnt2_reg: 0x%08x\n",
721  cx_read(ch->cnt2_reg));
722 
723  for (i = 0; i < 4; i++) {
724  risc = cx_read(ch->cmds_start + 56 + (i * 4));
725  pr_warn("instruction %d = 0x%x\n", i, risc);
726  }
727 
728  /* read data from the first cdt buffer */
729  risc = cx_read(AUD_A_CDT);
730  pr_warn("\nread cdt loc=0x%x\n", risc);
731  for (i = 0; i < 8; i++) {
732  n = cx_read(risc + i * 4);
733  pr_cont("0x%x ", n);
734  }
735  pr_cont("\n\n");
736 
737  value = cx_read(CLK_RST);
738  CX25821_INFO(" CLK_RST = 0x%x\n\n", value);
739 
740  value = cx_read(PLL_A_POST_STAT_BIST);
741  CX25821_INFO(" PLL_A_POST_STAT_BIST = 0x%x\n\n", value);
742  value = cx_read(PLL_A_INT_FRAC);
743  CX25821_INFO(" PLL_A_INT_FRAC = 0x%x\n\n", value);
744 
745  value = cx_read(PLL_B_POST_STAT_BIST);
746  CX25821_INFO(" PLL_B_POST_STAT_BIST = 0x%x\n\n", value);
747  value = cx_read(PLL_B_INT_FRAC);
748  CX25821_INFO(" PLL_B_INT_FRAC = 0x%x\n\n", value);
749 
750  value = cx_read(PLL_C_POST_STAT_BIST);
751  CX25821_INFO(" PLL_C_POST_STAT_BIST = 0x%x\n\n", value);
752  value = cx_read(PLL_C_INT_FRAC);
753  CX25821_INFO(" PLL_C_INT_FRAC = 0x%x\n\n", value);
754 
755  value = cx_read(PLL_D_POST_STAT_BIST);
756  CX25821_INFO(" PLL_D_POST_STAT_BIST = 0x%x\n\n", value);
757  value = cx_read(PLL_D_INT_FRAC);
758  CX25821_INFO(" PLL_D_INT_FRAC = 0x%x\n\n", value);
759 
760  value = cx25821_i2c_read(&dev->i2c_bus[0], AFE_AB_DIAG_CTRL, &tmp);
761  CX25821_INFO(" AFE_AB_DIAG_CTRL (0x10900090) = 0x%x\n\n", value);
762 }
764 
765 static void cx25821_shutdown(struct cx25821_dev *dev)
766 {
767  int i;
768 
769  /* disable RISC controller */
770  cx_write(DEV_CNTRL2, 0);
771 
772  /* Disable Video A/B activity */
773  for (i = 0; i < VID_CHANNEL_NUM; i++) {
774  cx_write(dev->channels[i].sram_channels->dma_ctl, 0);
775  cx_write(dev->channels[i].sram_channels->int_msk, 0);
776  }
777 
779  i <= VID_UPSTREAM_SRAM_CHANNEL_J; i++) {
780  cx_write(dev->channels[i].sram_channels->dma_ctl, 0);
781  cx_write(dev->channels[i].sram_channels->int_msk, 0);
782  }
783 
784  /* Disable Audio activity */
786 
787  /* Disable Serial port */
788  cx_write(UART_CTL, 0);
789 
790  /* Disable Interrupts */
791  cx_write(PCI_INT_MSK, 0);
793 }
794 
796  u32 format)
797 {
798  if (channel_select <= 7 && channel_select >= 0) {
799  cx_write(dev->channels[channel_select].sram_channels->pix_frmt,
800  format);
801  dev->channels[channel_select].pixel_formats = format;
802  }
803 }
804 
805 static void cx25821_set_vip_mode(struct cx25821_dev *dev,
806  struct sram_channel *ch)
807 {
810 }
811 
812 static void cx25821_initialize(struct cx25821_dev *dev)
813 {
814  int i;
815 
816  dprintk(1, "%s()\n", __func__);
817 
818  cx25821_shutdown(dev);
819  cx_write(PCI_INT_STAT, 0xffffffff);
820 
821  for (i = 0; i < VID_CHANNEL_NUM; i++)
822  cx_write(dev->channels[i].sram_channels->int_stat, 0xffffffff);
823 
824  cx_write(AUD_A_INT_STAT, 0xffffffff);
825  cx_write(AUD_B_INT_STAT, 0xffffffff);
826  cx_write(AUD_C_INT_STAT, 0xffffffff);
827  cx_write(AUD_D_INT_STAT, 0xffffffff);
828  cx_write(AUD_E_INT_STAT, 0xffffffff);
829 
830  cx_write(CLK_DELAY, cx_read(CLK_DELAY) & 0x80000000);
831  cx_write(PAD_CTRL, 0x12); /* for I2C */
832  cx25821_registers_init(dev); /* init Pecos registers */
833  mdelay(100);
834 
835  for (i = 0; i < VID_CHANNEL_NUM; i++) {
836  cx25821_set_vip_mode(dev, dev->channels[i].sram_channels);
837  cx25821_sram_channel_setup(dev, dev->channels[i].sram_channels,
838  1440, 0);
839  dev->channels[i].pixel_formats = PIXEL_FRMT_422;
840  dev->channels[i].use_cif_resolution = FALSE;
841  }
842 
843  /* Probably only affect Downstream */
845  i <= VID_UPSTREAM_SRAM_CHANNEL_J; i++) {
846  cx25821_set_vip_mode(dev, dev->channels[i].sram_channels);
847  }
848 
850  dev->channels[SRAM_CH08].sram_channels, 128, 0);
851 
852  cx25821_gpio_init(dev);
853 }
854 
855 static int cx25821_get_resources(struct cx25821_dev *dev)
856 {
858  pci_resource_len(dev->pci, 0), dev->name))
859  return 0;
860 
861  pr_err("%s: can't get MMIO memory @ 0x%llx\n",
862  dev->name, (unsigned long long)pci_resource_start(dev->pci, 0));
863 
864  return -EBUSY;
865 }
866 
867 static void cx25821_dev_checkrevision(struct cx25821_dev *dev)
868 {
869  dev->hwrevision = cx_read(RDR_CFG2) & 0xff;
870 
871  pr_info("%s(): Hardware revision = 0x%02x\n",
872  __func__, dev->hwrevision);
873 }
874 
875 static void cx25821_iounmap(struct cx25821_dev *dev)
876 {
877  if (dev == NULL)
878  return;
879 
880  /* Releasing IO memory */
881  if (dev->lmmio != NULL) {
882  CX25821_INFO("Releasing lmmio.\n");
883  iounmap(dev->lmmio);
884  dev->lmmio = NULL;
885  }
886 }
887 
888 static int cx25821_dev_setup(struct cx25821_dev *dev)
889 {
890  int i;
891 
892  pr_info("\n***********************************\n");
893  pr_info("cx25821 set up\n");
894  pr_info("***********************************\n\n");
895 
896  mutex_init(&dev->lock);
897 
898  atomic_inc(&dev->refcount);
899 
900  dev->nr = ++cx25821_devcount;
901  sprintf(dev->name, "cx25821[%d]", dev->nr);
902 
903  mutex_lock(&cx25821_devlist_mutex);
904  list_add_tail(&dev->devlist, &cx25821_devlist);
905  mutex_unlock(&cx25821_devlist_mutex);
906 
907  if (dev->pci->device != 0x8210) {
908  pr_info("%s(): Exiting. Incorrect Hardware device = 0x%02x\n",
909  __func__, dev->pci->device);
910  return -1;
911  } else {
912  pr_info("Athena Hardware device = 0x%02x\n", dev->pci->device);
913  }
914 
915  /* Apply a sensible clock frequency for the PCIe bridge */
916  dev->clk_freq = 28000000;
917  for (i = 0; i < MAX_VID_CHANNEL_NUM; i++)
918  dev->channels[i].sram_channels = &cx25821_sram_channels[i];
919 
920  if (dev->nr > 1)
921  CX25821_INFO("dev->nr > 1!");
922 
923  /* board config */
924  dev->board = 1; /* card[dev->nr]; */
926 
927  dev->pci_bus = dev->pci->bus->number;
928  dev->pci_slot = PCI_SLOT(dev->pci->devfn);
929  dev->pci_irqmask = 0x001f00;
930 
931  /* External Master 1 Bus */
932  dev->i2c_bus[0].nr = 0;
933  dev->i2c_bus[0].dev = dev;
934  dev->i2c_bus[0].reg_stat = I2C1_STAT;
935  dev->i2c_bus[0].reg_ctrl = I2C1_CTRL;
936  dev->i2c_bus[0].reg_addr = I2C1_ADDR;
937  dev->i2c_bus[0].reg_rdata = I2C1_RDATA;
938  dev->i2c_bus[0].reg_wdata = I2C1_WDATA;
939  dev->i2c_bus[0].i2c_period = (0x07 << 24); /* 1.95MHz */
940 
941  if (cx25821_get_resources(dev) < 0) {
942  pr_err("%s: No more PCIe resources for subsystem: %04x:%04x\n",
943  dev->name, dev->pci->subsystem_vendor,
944  dev->pci->subsystem_device);
945 
946  cx25821_devcount--;
947  return -EBUSY;
948  }
949 
950  /* PCIe stuff */
951  dev->base_io_addr = pci_resource_start(dev->pci, 0);
952 
953  if (!dev->base_io_addr) {
954  CX25821_ERR("No PCI Memory resources, exiting!\n");
955  return -ENODEV;
956  }
957 
958  dev->lmmio = ioremap(dev->base_io_addr, pci_resource_len(dev->pci, 0));
959 
960  if (!dev->lmmio) {
961  CX25821_ERR("ioremap failed, maybe increasing __VMALLOC_RESERVE in page.h\n");
962  cx25821_iounmap(dev);
963  return -ENOMEM;
964  }
965 
966  dev->bmmio = (u8 __iomem *) dev->lmmio;
967 
968  pr_info("%s: subsystem: %04x:%04x, board: %s [card=%d,%s]\n",
969  dev->name, dev->pci->subsystem_vendor,
970  dev->pci->subsystem_device, cx25821_boards[dev->board].name,
971  dev->board, card[dev->nr] == dev->board ?
972  "insmod option" : "autodetected");
973 
974  /* init hardware */
975  cx25821_initialize(dev);
976 
977  cx25821_i2c_register(&dev->i2c_bus[0]);
978 /* cx25821_i2c_register(&dev->i2c_bus[1]);
979  * cx25821_i2c_register(&dev->i2c_bus[2]); */
980 
981  CX25821_INFO("i2c register! bus->i2c_rc = %d\n",
982  dev->i2c_bus[0].i2c_rc);
983 
984  cx25821_card_setup(dev);
985 
986  if (medusa_video_init(dev) < 0)
987  CX25821_ERR("%s(): Failed to initialize medusa!\n", __func__);
988 
990 
991  /* register IOCTL device */
992  dev->ioctl_dev = cx25821_vdev_init(dev, dev->pci,
993  &cx25821_videoioctl_template, "video");
994 
995  if (video_register_device
998  pr_err("%s(): Failed to register video adapter for IOCTL, so unregistering videoioctl device\n",
999  __func__);
1000  }
1001 
1002  cx25821_dev_checkrevision(dev);
1003  CX25821_INFO("setup done!\n");
1004 
1005  return 0;
1006 }
1007 
1009  struct upstream_user_struct *up_data)
1010 {
1011  dev->_isNTSC = !strcmp(dev->vid_stdname, "NTSC") ? 1 : 0;
1012 
1013  dev->tvnorm = !dev->_isNTSC ? V4L2_STD_PAL_BG : V4L2_STD_NTSC_M;
1015 
1017  dev->pixel_format);
1018 }
1019 
1021  struct upstream_user_struct *up_data)
1022 {
1023  dev->_isNTSC_ch2 = !strcmp(dev->vid_stdname_ch2, "NTSC") ? 1 : 0;
1024 
1027 
1029  dev->pixel_format_ch2);
1030 }
1031 
1033  struct upstream_user_struct *up_data)
1034 {
1036 }
1037 
1039 {
1040  int i;
1041 
1042  if (!dev->base_io_addr)
1043  return;
1044 
1048 
1050 
1051  if (!atomic_dec_and_test(&dev->refcount))
1052  return;
1053 
1054  for (i = 0; i < VID_CHANNEL_NUM; i++)
1055  cx25821_video_unregister(dev, i);
1056 
1057  for (i = VID_UPSTREAM_SRAM_CHANNEL_I;
1058  i <= AUDIO_UPSTREAM_SRAM_CHANNEL_B; i++) {
1059  cx25821_video_unregister(dev, i);
1060  }
1061 
1063 
1064  cx25821_i2c_unregister(&dev->i2c_bus[0]);
1065  cx25821_iounmap(dev);
1066 }
1068 
1069 static __le32 *cx25821_risc_field(__le32 * rp, struct scatterlist *sglist,
1070  unsigned int offset, u32 sync_line,
1071  unsigned int bpl, unsigned int padding,
1072  unsigned int lines)
1073 {
1074  struct scatterlist *sg;
1075  unsigned int line, todo;
1076 
1077  /* sync instruction */
1078  if (sync_line != NO_SYNC_LINE)
1079  *(rp++) = cpu_to_le32(RISC_RESYNC | sync_line);
1080 
1081  /* scan lines */
1082  sg = sglist;
1083  for (line = 0; line < lines; line++) {
1084  while (offset && offset >= sg_dma_len(sg)) {
1085  offset -= sg_dma_len(sg);
1086  sg++;
1087  }
1088  if (bpl <= sg_dma_len(sg) - offset) {
1089  /* fits into current chunk */
1090  *(rp++) = cpu_to_le32(RISC_WRITE | RISC_SOL | RISC_EOL |
1091  bpl);
1092  *(rp++) = cpu_to_le32(sg_dma_address(sg) + offset);
1093  *(rp++) = cpu_to_le32(0); /* bits 63-32 */
1094  offset += bpl;
1095  } else {
1096  /* scanline needs to be split */
1097  todo = bpl;
1098  *(rp++) = cpu_to_le32(RISC_WRITE | RISC_SOL |
1099  (sg_dma_len(sg) - offset));
1100  *(rp++) = cpu_to_le32(sg_dma_address(sg) + offset);
1101  *(rp++) = cpu_to_le32(0); /* bits 63-32 */
1102  todo -= (sg_dma_len(sg) - offset);
1103  offset = 0;
1104  sg++;
1105  while (todo > sg_dma_len(sg)) {
1106  *(rp++) = cpu_to_le32(RISC_WRITE |
1107  sg_dma_len(sg));
1108  *(rp++) = cpu_to_le32(sg_dma_address(sg));
1109  *(rp++) = cpu_to_le32(0); /* bits 63-32 */
1110  todo -= sg_dma_len(sg);
1111  sg++;
1112  }
1113  *(rp++) = cpu_to_le32(RISC_WRITE | RISC_EOL | todo);
1114  *(rp++) = cpu_to_le32(sg_dma_address(sg));
1115  *(rp++) = cpu_to_le32(0); /* bits 63-32 */
1116  offset += todo;
1117  }
1118 
1119  offset += padding;
1120  }
1121 
1122  return rp;
1123 }
1124 
1125 int cx25821_risc_buffer(struct pci_dev *pci, struct btcx_riscmem *risc,
1126  struct scatterlist *sglist, unsigned int top_offset,
1127  unsigned int bottom_offset, unsigned int bpl,
1128  unsigned int padding, unsigned int lines)
1129 {
1130  u32 instructions;
1131  u32 fields;
1132  __le32 *rp;
1133  int rc;
1134 
1135  fields = 0;
1136  if (UNSET != top_offset)
1137  fields++;
1138  if (UNSET != bottom_offset)
1139  fields++;
1140 
1141  /* estimate risc mem: worst case is one write per page border +
1142  one write per scan line + syncs + jump (all 2 dwords). Padding
1143  can cause next bpl to start close to a page border. First DMA
1144  region may be smaller than PAGE_SIZE */
1145  /* write and jump need and extra dword */
1146  instructions = fields * (1 + ((bpl + padding) * lines) / PAGE_SIZE +
1147  lines);
1148  instructions += 2;
1149  rc = btcx_riscmem_alloc(pci, risc, instructions * 12);
1150 
1151  if (rc < 0)
1152  return rc;
1153 
1154  /* write risc instructions */
1155  rp = risc->cpu;
1156 
1157  if (UNSET != top_offset) {
1158  rp = cx25821_risc_field(rp, sglist, top_offset, 0, bpl, padding,
1159  lines);
1160  }
1161 
1162  if (UNSET != bottom_offset) {
1163  rp = cx25821_risc_field(rp, sglist, bottom_offset, 0x200, bpl,
1164  padding, lines);
1165  }
1166 
1167  /* save pointer to jmp instruction address */
1168  risc->jmp = rp;
1169  BUG_ON((risc->jmp - risc->cpu + 2) * sizeof(*risc->cpu) > risc->size);
1170 
1171  return 0;
1172 }
1173 
1174 static __le32 *cx25821_risc_field_audio(__le32 * rp, struct scatterlist *sglist,
1175  unsigned int offset, u32 sync_line,
1176  unsigned int bpl, unsigned int padding,
1177  unsigned int lines, unsigned int lpi)
1178 {
1179  struct scatterlist *sg;
1180  unsigned int line, todo, sol;
1181 
1182  /* sync instruction */
1183  if (sync_line != NO_SYNC_LINE)
1184  *(rp++) = cpu_to_le32(RISC_RESYNC | sync_line);
1185 
1186  /* scan lines */
1187  sg = sglist;
1188  for (line = 0; line < lines; line++) {
1189  while (offset && offset >= sg_dma_len(sg)) {
1190  offset -= sg_dma_len(sg);
1191  sg++;
1192  }
1193 
1194  if (lpi && line > 0 && !(line % lpi))
1195  sol = RISC_SOL | RISC_IRQ1 | RISC_CNT_INC;
1196  else
1197  sol = RISC_SOL;
1198 
1199  if (bpl <= sg_dma_len(sg) - offset) {
1200  /* fits into current chunk */
1201  *(rp++) = cpu_to_le32(RISC_WRITE | sol | RISC_EOL |
1202  bpl);
1203  *(rp++) = cpu_to_le32(sg_dma_address(sg) + offset);
1204  *(rp++) = cpu_to_le32(0); /* bits 63-32 */
1205  offset += bpl;
1206  } else {
1207  /* scanline needs to be split */
1208  todo = bpl;
1209  *(rp++) = cpu_to_le32(RISC_WRITE | sol |
1210  (sg_dma_len(sg) - offset));
1211  *(rp++) = cpu_to_le32(sg_dma_address(sg) + offset);
1212  *(rp++) = cpu_to_le32(0); /* bits 63-32 */
1213  todo -= (sg_dma_len(sg) - offset);
1214  offset = 0;
1215  sg++;
1216  while (todo > sg_dma_len(sg)) {
1217  *(rp++) = cpu_to_le32(RISC_WRITE |
1218  sg_dma_len(sg));
1219  *(rp++) = cpu_to_le32(sg_dma_address(sg));
1220  *(rp++) = cpu_to_le32(0); /* bits 63-32 */
1221  todo -= sg_dma_len(sg);
1222  sg++;
1223  }
1224  *(rp++) = cpu_to_le32(RISC_WRITE | RISC_EOL | todo);
1225  *(rp++) = cpu_to_le32(sg_dma_address(sg));
1226  *(rp++) = cpu_to_le32(0); /* bits 63-32 */
1227  offset += todo;
1228  }
1229  offset += padding;
1230  }
1231 
1232  return rp;
1233 }
1234 
1236  struct btcx_riscmem *risc,
1237  struct scatterlist *sglist,
1238  unsigned int bpl,
1239  unsigned int lines, unsigned int lpi)
1240 {
1241  u32 instructions;
1242  __le32 *rp;
1243  int rc;
1244 
1245  /* estimate risc mem: worst case is one write per page border +
1246  one write per scan line + syncs + jump (all 2 dwords). Here
1247  there is no padding and no sync. First DMA region may be smaller
1248  than PAGE_SIZE */
1249  /* Jump and write need an extra dword */
1250  instructions = 1 + (bpl * lines) / PAGE_SIZE + lines;
1251  instructions += 1;
1252 
1253  rc = btcx_riscmem_alloc(pci, risc, instructions * 12);
1254  if (rc < 0)
1255  return rc;
1256 
1257  /* write risc instructions */
1258  rp = risc->cpu;
1259  rp = cx25821_risc_field_audio(rp, sglist, 0, NO_SYNC_LINE, bpl, 0,
1260  lines, lpi);
1261 
1262  /* save pointer to jmp instruction address */
1263  risc->jmp = rp;
1264  BUG_ON((risc->jmp - risc->cpu + 2) * sizeof(*risc->cpu) > risc->size);
1265  return 0;
1266 }
1268 
1269 int cx25821_risc_stopper(struct pci_dev *pci, struct btcx_riscmem *risc,
1270  u32 reg, u32 mask, u32 value)
1271 {
1272  __le32 *rp;
1273  int rc;
1274 
1275  rc = btcx_riscmem_alloc(pci, risc, 4 * 16);
1276 
1277  if (rc < 0)
1278  return rc;
1279 
1280  /* write risc instructions */
1281  rp = risc->cpu;
1282 
1283  *(rp++) = cpu_to_le32(RISC_WRITECR | RISC_IRQ1);
1284  *(rp++) = cpu_to_le32(reg);
1285  *(rp++) = cpu_to_le32(value);
1286  *(rp++) = cpu_to_le32(mask);
1287  *(rp++) = cpu_to_le32(RISC_JUMP);
1288  *(rp++) = cpu_to_le32(risc->dma);
1289  *(rp++) = cpu_to_le32(0); /* bits 63-32 */
1290  return 0;
1291 }
1292 
1294 {
1295  struct videobuf_dmabuf *dma = videobuf_to_dma(&buf->vb);
1296 
1297  BUG_ON(in_interrupt());
1298  videobuf_waiton(q, &buf->vb, 0, 0);
1299  videobuf_dma_unmap(q->dev, dma);
1300  videobuf_dma_free(dma);
1301  btcx_riscmem_free(to_pci_dev(q->dev), &buf->risc);
1302  buf->vb.state = VIDEOBUF_NEEDS_INIT;
1303 }
1304 
1305 static irqreturn_t cx25821_irq(int irq, void *dev_id)
1306 {
1307  struct cx25821_dev *dev = dev_id;
1308  u32 pci_status;
1309  u32 vid_status;
1310  int i, handled = 0;
1311  u32 mask[8] = { 1, 2, 4, 8, 16, 32, 64, 128 };
1312 
1313  pci_status = cx_read(PCI_INT_STAT);
1314 
1315  if (pci_status == 0)
1316  goto out;
1317 
1318  for (i = 0; i < VID_CHANNEL_NUM; i++) {
1319  if (pci_status & mask[i]) {
1320  vid_status = cx_read(dev->channels[i].
1321  sram_channels->int_stat);
1322 
1323  if (vid_status)
1324  handled += cx25821_video_irq(dev, i,
1325  vid_status);
1326 
1327  cx_write(PCI_INT_STAT, mask[i]);
1328  }
1329  }
1330 
1331 out:
1332  return IRQ_RETVAL(handled);
1333 }
1334 
1335 void cx25821_print_irqbits(char *name, char *tag, char **strings,
1336  int len, u32 bits, u32 mask)
1337 {
1338  unsigned int i;
1339 
1340  printk(KERN_DEBUG pr_fmt("%s: %s [0x%x]"), name, tag, bits);
1341 
1342  for (i = 0; i < len; i++) {
1343  if (!(bits & (1 << i)))
1344  continue;
1345  if (strings[i])
1346  pr_cont(" %s", strings[i]);
1347  else
1348  pr_cont(" %d", i);
1349  if (!(mask & (1 << i)))
1350  continue;
1351  pr_cont("*");
1352  }
1353  pr_cont("\n");
1354 }
1356 
1358 {
1359  struct cx25821_dev *dev = pci_get_drvdata(pci);
1360  return dev;
1361 }
1363 
1364 static int __devinit cx25821_initdev(struct pci_dev *pci_dev,
1365  const struct pci_device_id *pci_id)
1366 {
1367  struct cx25821_dev *dev;
1368  int err = 0;
1369 
1370  dev = kzalloc(sizeof(*dev), GFP_KERNEL);
1371  if (NULL == dev)
1372  return -ENOMEM;
1373 
1374  err = v4l2_device_register(&pci_dev->dev, &dev->v4l2_dev);
1375  if (err < 0)
1376  goto fail_free;
1377 
1378  /* pci init */
1379  dev->pci = pci_dev;
1380  if (pci_enable_device(pci_dev)) {
1381  err = -EIO;
1382 
1383  pr_info("pci enable failed!\n");
1384 
1385  goto fail_unregister_device;
1386  }
1387 
1388  pr_info("Athena pci enable !\n");
1389 
1390  err = cx25821_dev_setup(dev);
1391  if (err) {
1392  if (err == -EBUSY)
1393  goto fail_unregister_device;
1394  else
1395  goto fail_unregister_pci;
1396  }
1397 
1398  /* print pci info */
1399  pci_read_config_byte(pci_dev, PCI_CLASS_REVISION, &dev->pci_rev);
1400  pci_read_config_byte(pci_dev, PCI_LATENCY_TIMER, &dev->pci_lat);
1401  pr_info("%s/0: found at %s, rev: %d, irq: %d, latency: %d, mmio: 0x%llx\n",
1402  dev->name, pci_name(pci_dev), dev->pci_rev, pci_dev->irq,
1403  dev->pci_lat, (unsigned long long)dev->base_io_addr);
1404 
1405  pci_set_master(pci_dev);
1406  if (!pci_dma_supported(pci_dev, 0xffffffff)) {
1407  pr_err("%s/0: Oops: no 32bit PCI DMA ???\n", dev->name);
1408  err = -EIO;
1409  goto fail_irq;
1410  }
1411 
1412  err = request_irq(pci_dev->irq, cx25821_irq,
1413  IRQF_SHARED, dev->name, dev);
1414 
1415  if (err < 0) {
1416  pr_err("%s: can't get IRQ %d\n", dev->name, pci_dev->irq);
1417  goto fail_irq;
1418  }
1419 
1420  return 0;
1421 
1422 fail_irq:
1423  pr_info("cx25821_initdev() can't get IRQ !\n");
1425 
1426 fail_unregister_pci:
1427  pci_disable_device(pci_dev);
1428 fail_unregister_device:
1430 
1431 fail_free:
1432  kfree(dev);
1433  return err;
1434 }
1435 
1436 static void __devexit cx25821_finidev(struct pci_dev *pci_dev)
1437 {
1438  struct v4l2_device *v4l2_dev = pci_get_drvdata(pci_dev);
1439  struct cx25821_dev *dev = get_cx25821(v4l2_dev);
1440 
1441  cx25821_shutdown(dev);
1442  pci_disable_device(pci_dev);
1443 
1444  /* unregister stuff */
1445  if (pci_dev->irq)
1446  free_irq(pci_dev->irq, dev);
1447 
1448  mutex_lock(&cx25821_devlist_mutex);
1449  list_del(&dev->devlist);
1450  mutex_unlock(&cx25821_devlist_mutex);
1451 
1453  v4l2_device_unregister(v4l2_dev);
1454  kfree(dev);
1455 }
1456 
1457 static DEFINE_PCI_DEVICE_TABLE(cx25821_pci_tbl) = {
1458  {
1459  /* CX25821 Athena */
1460  .vendor = 0x14f1,
1461  .device = 0x8210,
1462  .subvendor = 0x14f1,
1463  .subdevice = 0x0920,
1464  }, {
1465  /* CX25821 No Brand */
1466  .vendor = 0x14f1,
1467  .device = 0x8210,
1468  .subvendor = 0x0000,
1469  .subdevice = 0x0000,
1470  }, {
1471  /* --- end of list --- */
1472  }
1473 };
1474 
1475 MODULE_DEVICE_TABLE(pci, cx25821_pci_tbl);
1476 
1477 static struct pci_driver cx25821_pci_driver = {
1478  .name = "cx25821",
1479  .id_table = cx25821_pci_tbl,
1480  .probe = cx25821_initdev,
1481  .remove = __devexit_p(cx25821_finidev),
1482  /* TODO */
1483  .suspend = NULL,
1484  .resume = NULL,
1485 };
1486 
1487 static int __init cx25821_init(void)
1488 {
1489  pr_info("driver version %d.%d.%d loaded\n",
1490  (CX25821_VERSION_CODE >> 16) & 0xff,
1491  (CX25821_VERSION_CODE >> 8) & 0xff,
1492  CX25821_VERSION_CODE & 0xff);
1493  return pci_register_driver(&cx25821_pci_driver);
1494 }
1495 
1496 static void __exit cx25821_fini(void)
1497 {
1498  pci_unregister_driver(&cx25821_pci_driver);
1499 }
1500 
1501 module_init(cx25821_init);
1502 module_exit(cx25821_fini);