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