1/* 2 * 3 * Support for a cx23417 mpeg encoder via cx23885 host port. 4 * 5 * (c) 2004 Jelle Foks <jelle@foks.us> 6 * (c) 2004 Gerd Knorr <kraxel@bytesex.org> 7 * (c) 2008 Steven Toth <stoth@linuxtv.org> 8 * - CX23885/7/8 support 9 * 10 * Includes parts from the ivtv driver <http://sourceforge.net/projects/ivtv/> 11 * 12 * This program is free software; you can redistribute it and/or modify 13 * it under the terms of the GNU General Public License as published by 14 * the Free Software Foundation; either version 2 of the License, or 15 * (at your option) any later version. 16 * 17 * This program is distributed in the hope that it will be useful, 18 * but WITHOUT ANY WARRANTY; without even the implied warranty of 19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 20 * GNU General Public License for more details. 21 */ 22 23#include <linux/module.h> 24#include <linux/moduleparam.h> 25#include <linux/init.h> 26#include <linux/fs.h> 27#include <linux/delay.h> 28#include <linux/device.h> 29#include <linux/firmware.h> 30#include <linux/slab.h> 31#include <media/v4l2-common.h> 32#include <media/v4l2-ioctl.h> 33#include <media/cx2341x.h> 34 35#include "cx23885.h" 36#include "cx23885-ioctl.h" 37 38#define CX23885_FIRM_IMAGE_SIZE 376836 39#define CX23885_FIRM_IMAGE_NAME "v4l-cx23885-enc.fw" 40 41static unsigned int mpegbufs = 32; 42module_param(mpegbufs, int, 0644); 43MODULE_PARM_DESC(mpegbufs, "number of mpeg buffers, range 2-32"); 44static unsigned int mpeglines = 32; 45module_param(mpeglines, int, 0644); 46MODULE_PARM_DESC(mpeglines, "number of lines in an MPEG buffer, range 2-32"); 47static unsigned int mpeglinesize = 512; 48module_param(mpeglinesize, int, 0644); 49MODULE_PARM_DESC(mpeglinesize, 50 "number of bytes in each line of an MPEG buffer, range 512-1024"); 51 52static unsigned int v4l_debug; 53module_param(v4l_debug, int, 0644); 54MODULE_PARM_DESC(v4l_debug, "enable V4L debug messages"); 55 56#define dprintk(level, fmt, arg...)\ 57 do { if (v4l_debug >= level) \ 58 printk(KERN_DEBUG "%s: " fmt, \ 59 (dev) ? dev->name : "cx23885[?]", ## arg); \ 60 } while (0) 61 62static struct cx23885_tvnorm cx23885_tvnorms[] = { 63 { 64 .name = "NTSC-M", 65 .id = V4L2_STD_NTSC_M, 66 }, { 67 .name = "NTSC-JP", 68 .id = V4L2_STD_NTSC_M_JP, 69 }, { 70 .name = "PAL-BG", 71 .id = V4L2_STD_PAL_BG, 72 }, { 73 .name = "PAL-DK", 74 .id = V4L2_STD_PAL_DK, 75 }, { 76 .name = "PAL-I", 77 .id = V4L2_STD_PAL_I, 78 }, { 79 .name = "PAL-M", 80 .id = V4L2_STD_PAL_M, 81 }, { 82 .name = "PAL-N", 83 .id = V4L2_STD_PAL_N, 84 }, { 85 .name = "PAL-Nc", 86 .id = V4L2_STD_PAL_Nc, 87 }, { 88 .name = "PAL-60", 89 .id = V4L2_STD_PAL_60, 90 }, { 91 .name = "SECAM-L", 92 .id = V4L2_STD_SECAM_L, 93 }, { 94 .name = "SECAM-DK", 95 .id = V4L2_STD_SECAM_DK, 96 } 97}; 98 99/* ------------------------------------------------------------------ */ 100enum cx23885_capture_type { 101 CX23885_MPEG_CAPTURE, 102 CX23885_RAW_CAPTURE, 103 CX23885_RAW_PASSTHRU_CAPTURE 104}; 105enum cx23885_capture_bits { 106 CX23885_RAW_BITS_NONE = 0x00, 107 CX23885_RAW_BITS_YUV_CAPTURE = 0x01, 108 CX23885_RAW_BITS_PCM_CAPTURE = 0x02, 109 CX23885_RAW_BITS_VBI_CAPTURE = 0x04, 110 CX23885_RAW_BITS_PASSTHRU_CAPTURE = 0x08, 111 CX23885_RAW_BITS_TO_HOST_CAPTURE = 0x10 112}; 113enum cx23885_capture_end { 114 CX23885_END_AT_GOP, /* stop at the end of gop, generate irq */ 115 CX23885_END_NOW, /* stop immediately, no irq */ 116}; 117enum cx23885_framerate { 118 CX23885_FRAMERATE_NTSC_30, /* NTSC: 30fps */ 119 CX23885_FRAMERATE_PAL_25 /* PAL: 25fps */ 120}; 121enum cx23885_stream_port { 122 CX23885_OUTPUT_PORT_MEMORY, 123 CX23885_OUTPUT_PORT_STREAMING, 124 CX23885_OUTPUT_PORT_SERIAL 125}; 126enum cx23885_data_xfer_status { 127 CX23885_MORE_BUFFERS_FOLLOW, 128 CX23885_LAST_BUFFER, 129}; 130enum cx23885_picture_mask { 131 CX23885_PICTURE_MASK_NONE, 132 CX23885_PICTURE_MASK_I_FRAMES, 133 CX23885_PICTURE_MASK_I_P_FRAMES = 0x3, 134 CX23885_PICTURE_MASK_ALL_FRAMES = 0x7, 135}; 136enum cx23885_vbi_mode_bits { 137 CX23885_VBI_BITS_SLICED, 138 CX23885_VBI_BITS_RAW, 139}; 140enum cx23885_vbi_insertion_bits { 141 CX23885_VBI_BITS_INSERT_IN_XTENSION_USR_DATA, 142 CX23885_VBI_BITS_INSERT_IN_PRIVATE_PACKETS = 0x1 << 1, 143 CX23885_VBI_BITS_SEPARATE_STREAM = 0x2 << 1, 144 CX23885_VBI_BITS_SEPARATE_STREAM_USR_DATA = 0x4 << 1, 145 CX23885_VBI_BITS_SEPARATE_STREAM_PRV_DATA = 0x5 << 1, 146}; 147enum cx23885_dma_unit { 148 CX23885_DMA_BYTES, 149 CX23885_DMA_FRAMES, 150}; 151enum cx23885_dma_transfer_status_bits { 152 CX23885_DMA_TRANSFER_BITS_DONE = 0x01, 153 CX23885_DMA_TRANSFER_BITS_ERROR = 0x04, 154 CX23885_DMA_TRANSFER_BITS_LL_ERROR = 0x10, 155}; 156enum cx23885_pause { 157 CX23885_PAUSE_ENCODING, 158 CX23885_RESUME_ENCODING, 159}; 160enum cx23885_copyright { 161 CX23885_COPYRIGHT_OFF, 162 CX23885_COPYRIGHT_ON, 163}; 164enum cx23885_notification_type { 165 CX23885_NOTIFICATION_REFRESH, 166}; 167enum cx23885_notification_status { 168 CX23885_NOTIFICATION_OFF, 169 CX23885_NOTIFICATION_ON, 170}; 171enum cx23885_notification_mailbox { 172 CX23885_NOTIFICATION_NO_MAILBOX = -1, 173}; 174enum cx23885_field1_lines { 175 CX23885_FIELD1_SAA7114 = 0x00EF, /* 239 */ 176 CX23885_FIELD1_SAA7115 = 0x00F0, /* 240 */ 177 CX23885_FIELD1_MICRONAS = 0x0105, /* 261 */ 178}; 179enum cx23885_field2_lines { 180 CX23885_FIELD2_SAA7114 = 0x00EF, /* 239 */ 181 CX23885_FIELD2_SAA7115 = 0x00F0, /* 240 */ 182 CX23885_FIELD2_MICRONAS = 0x0106, /* 262 */ 183}; 184enum cx23885_custom_data_type { 185 CX23885_CUSTOM_EXTENSION_USR_DATA, 186 CX23885_CUSTOM_PRIVATE_PACKET, 187}; 188enum cx23885_mute { 189 CX23885_UNMUTE, 190 CX23885_MUTE, 191}; 192enum cx23885_mute_video_mask { 193 CX23885_MUTE_VIDEO_V_MASK = 0x0000FF00, 194 CX23885_MUTE_VIDEO_U_MASK = 0x00FF0000, 195 CX23885_MUTE_VIDEO_Y_MASK = 0xFF000000, 196}; 197enum cx23885_mute_video_shift { 198 CX23885_MUTE_VIDEO_V_SHIFT = 8, 199 CX23885_MUTE_VIDEO_U_SHIFT = 16, 200 CX23885_MUTE_VIDEO_Y_SHIFT = 24, 201}; 202 203/* defines below are from ivtv-driver.h */ 204#define IVTV_CMD_HW_BLOCKS_RST 0xFFFFFFFF 205 206/* Firmware API commands */ 207#define IVTV_API_STD_TIMEOUT 500 208 209/* Registers */ 210/* IVTV_REG_OFFSET */ 211#define IVTV_REG_ENC_SDRAM_REFRESH (0x07F8) 212#define IVTV_REG_ENC_SDRAM_PRECHARGE (0x07FC) 213#define IVTV_REG_SPU (0x9050) 214#define IVTV_REG_HW_BLOCKS (0x9054) 215#define IVTV_REG_VPU (0x9058) 216#define IVTV_REG_APU (0xA064) 217 218/**** Bit definitions for MC417_RWD and MC417_OEN registers *** 219 bits 31-16 220+-----------+ 221| Reserved | 222+-----------+ 223 bit 15 bit 14 bit 13 bit 12 bit 11 bit 10 bit 9 bit 8 224+-------+-------+-------+-------+-------+-------+-------+-------+ 225| MIWR# | MIRD# | MICS# |MIRDY# |MIADDR3|MIADDR2|MIADDR1|MIADDR0| 226+-------+-------+-------+-------+-------+-------+-------+-------+ 227 bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0 228+-------+-------+-------+-------+-------+-------+-------+-------+ 229|MIDATA7|MIDATA6|MIDATA5|MIDATA4|MIDATA3|MIDATA2|MIDATA1|MIDATA0| 230+-------+-------+-------+-------+-------+-------+-------+-------+ 231***/ 232#define MC417_MIWR 0x8000 233#define MC417_MIRD 0x4000 234#define MC417_MICS 0x2000 235#define MC417_MIRDY 0x1000 236#define MC417_MIADDR 0x0F00 237#define MC417_MIDATA 0x00FF 238 239/* MIADDR* nibble definitions */ 240#define MCI_MEMORY_DATA_BYTE0 0x000 241#define MCI_MEMORY_DATA_BYTE1 0x100 242#define MCI_MEMORY_DATA_BYTE2 0x200 243#define MCI_MEMORY_DATA_BYTE3 0x300 244#define MCI_MEMORY_ADDRESS_BYTE2 0x400 245#define MCI_MEMORY_ADDRESS_BYTE1 0x500 246#define MCI_MEMORY_ADDRESS_BYTE0 0x600 247#define MCI_REGISTER_DATA_BYTE0 0x800 248#define MCI_REGISTER_DATA_BYTE1 0x900 249#define MCI_REGISTER_DATA_BYTE2 0xA00 250#define MCI_REGISTER_DATA_BYTE3 0xB00 251#define MCI_REGISTER_ADDRESS_BYTE0 0xC00 252#define MCI_REGISTER_ADDRESS_BYTE1 0xD00 253#define MCI_REGISTER_MODE 0xE00 254 255/* Read and write modes */ 256#define MCI_MODE_REGISTER_READ 0 257#define MCI_MODE_REGISTER_WRITE 1 258#define MCI_MODE_MEMORY_READ 0 259#define MCI_MODE_MEMORY_WRITE 0x40 260 261/*** Bit definitions for MC417_CTL register **** 262 bits 31-6 bits 5-4 bit 3 bits 2-1 Bit 0 263+--------+-------------+--------+--------------+------------+ 264|Reserved|MC417_SPD_CTL|Reserved|MC417_GPIO_SEL|UART_GPIO_EN| 265+--------+-------------+--------+--------------+------------+ 266***/ 267#define MC417_SPD_CTL(x) (((x) << 4) & 0x00000030) 268#define MC417_GPIO_SEL(x) (((x) << 1) & 0x00000006) 269#define MC417_UART_GPIO_EN 0x00000001 270 271/* Values for speed control */ 272#define MC417_SPD_CTL_SLOW 0x1 273#define MC417_SPD_CTL_MEDIUM 0x0 274#define MC417_SPD_CTL_FAST 0x3 /* b'1x, but we use b'11 */ 275 276/* Values for GPIO select */ 277#define MC417_GPIO_SEL_GPIO3 0x3 278#define MC417_GPIO_SEL_GPIO2 0x2 279#define MC417_GPIO_SEL_GPIO1 0x1 280#define MC417_GPIO_SEL_GPIO0 0x0 281 282void cx23885_mc417_init(struct cx23885_dev *dev) 283{ 284 u32 regval; 285 286 dprintk(2, "%s()\n", __func__); 287 288 /* Configure MC417_CTL register to defaults. */ 289 regval = MC417_SPD_CTL(MC417_SPD_CTL_FAST) | 290 MC417_GPIO_SEL(MC417_GPIO_SEL_GPIO3) | 291 MC417_UART_GPIO_EN; 292 cx_write(MC417_CTL, regval); 293 294 /* Configure MC417_OEN to defaults. */ 295 regval = MC417_MIRDY; 296 cx_write(MC417_OEN, regval); 297 298 /* Configure MC417_RWD to defaults. */ 299 regval = MC417_MIWR | MC417_MIRD | MC417_MICS; 300 cx_write(MC417_RWD, regval); 301} 302 303static int mc417_wait_ready(struct cx23885_dev *dev) 304{ 305 u32 mi_ready; 306 unsigned long timeout = jiffies + msecs_to_jiffies(1); 307 308 for (;;) { 309 mi_ready = cx_read(MC417_RWD) & MC417_MIRDY; 310 if (mi_ready != 0) 311 return 0; 312 if (time_after(jiffies, timeout)) 313 return -1; 314 udelay(1); 315 } 316} 317 318int mc417_register_write(struct cx23885_dev *dev, u16 address, u32 value) 319{ 320 u32 regval; 321 322 /* Enable MC417 GPIO outputs except for MC417_MIRDY, 323 * which is an input. 324 */ 325 cx_write(MC417_OEN, MC417_MIRDY); 326 327 /* Write data byte 0 */ 328 regval = MC417_MIRD | MC417_MIRDY | MCI_REGISTER_DATA_BYTE0 | 329 (value & 0x000000FF); 330 cx_write(MC417_RWD, regval); 331 332 /* Transition CS/WR to effect write transaction across bus. */ 333 regval |= MC417_MICS | MC417_MIWR; 334 cx_write(MC417_RWD, regval); 335 336 /* Write data byte 1 */ 337 regval = MC417_MIRD | MC417_MIRDY | MCI_REGISTER_DATA_BYTE1 | 338 ((value >> 8) & 0x000000FF); 339 cx_write(MC417_RWD, regval); 340 regval |= MC417_MICS | MC417_MIWR; 341 cx_write(MC417_RWD, regval); 342 343 /* Write data byte 2 */ 344 regval = MC417_MIRD | MC417_MIRDY | MCI_REGISTER_DATA_BYTE2 | 345 ((value >> 16) & 0x000000FF); 346 cx_write(MC417_RWD, regval); 347 regval |= MC417_MICS | MC417_MIWR; 348 cx_write(MC417_RWD, regval); 349 350 /* Write data byte 3 */ 351 regval = MC417_MIRD | MC417_MIRDY | MCI_REGISTER_DATA_BYTE3 | 352 ((value >> 24) & 0x000000FF); 353 cx_write(MC417_RWD, regval); 354 regval |= MC417_MICS | MC417_MIWR; 355 cx_write(MC417_RWD, regval); 356 357 /* Write address byte 0 */ 358 regval = MC417_MIRD | MC417_MIRDY | MCI_REGISTER_ADDRESS_BYTE0 | 359 (address & 0xFF); 360 cx_write(MC417_RWD, regval); 361 regval |= MC417_MICS | MC417_MIWR; 362 cx_write(MC417_RWD, regval); 363 364 /* Write address byte 1 */ 365 regval = MC417_MIRD | MC417_MIRDY | MCI_REGISTER_ADDRESS_BYTE1 | 366 ((address >> 8) & 0xFF); 367 cx_write(MC417_RWD, regval); 368 regval |= MC417_MICS | MC417_MIWR; 369 cx_write(MC417_RWD, regval); 370 371 /* Indicate that this is a write. */ 372 regval = MC417_MIRD | MC417_MIRDY | MCI_REGISTER_MODE | 373 MCI_MODE_REGISTER_WRITE; 374 cx_write(MC417_RWD, regval); 375 regval |= MC417_MICS | MC417_MIWR; 376 cx_write(MC417_RWD, regval); 377 378 /* Wait for the trans to complete (MC417_MIRDY asserted). */ 379 return mc417_wait_ready(dev); 380} 381 382int mc417_register_read(struct cx23885_dev *dev, u16 address, u32 *value) 383{ 384 int retval; 385 u32 regval; 386 u32 tempval; 387 u32 dataval; 388 389 /* Enable MC417 GPIO outputs except for MC417_MIRDY, 390 * which is an input. 391 */ 392 cx_write(MC417_OEN, MC417_MIRDY); 393 394 /* Write address byte 0 */ 395 regval = MC417_MIRD | MC417_MIRDY | MCI_REGISTER_ADDRESS_BYTE0 | 396 ((address & 0x00FF)); 397 cx_write(MC417_RWD, regval); 398 regval |= MC417_MICS | MC417_MIWR; 399 cx_write(MC417_RWD, regval); 400 401 /* Write address byte 1 */ 402 regval = MC417_MIRD | MC417_MIRDY | MCI_REGISTER_ADDRESS_BYTE1 | 403 ((address >> 8) & 0xFF); 404 cx_write(MC417_RWD, regval); 405 regval |= MC417_MICS | MC417_MIWR; 406 cx_write(MC417_RWD, regval); 407 408 /* Indicate that this is a register read. */ 409 regval = MC417_MIRD | MC417_MIRDY | MCI_REGISTER_MODE | 410 MCI_MODE_REGISTER_READ; 411 cx_write(MC417_RWD, regval); 412 regval |= MC417_MICS | MC417_MIWR; 413 cx_write(MC417_RWD, regval); 414 415 /* Wait for the trans to complete (MC417_MIRDY asserted). */ 416 retval = mc417_wait_ready(dev); 417 418 /* switch the DAT0-7 GPIO[10:3] to input mode */ 419 cx_write(MC417_OEN, MC417_MIRDY | MC417_MIDATA); 420 421 /* Read data byte 0 */ 422 regval = MC417_MIRD | MC417_MIRDY | MCI_REGISTER_DATA_BYTE0; 423 cx_write(MC417_RWD, regval); 424 425 /* Transition RD to effect read transaction across bus. 426 * Transition 0x5000 -> 0x9000 correct (RD/RDY -> WR/RDY)? 427 * Should it be 0x9000 -> 0xF000 (also why is RDY being set, its 428 * input only...) 429 */ 430 regval = MC417_MIWR | MC417_MIRDY | MCI_REGISTER_DATA_BYTE0; 431 cx_write(MC417_RWD, regval); 432 433 /* Collect byte */ 434 tempval = cx_read(MC417_RWD); 435 dataval = tempval & 0x000000FF; 436 437 /* Bring CS and RD high. */ 438 regval = MC417_MIWR | MC417_MIRD | MC417_MICS | MC417_MIRDY; 439 cx_write(MC417_RWD, regval); 440 441 /* Read data byte 1 */ 442 regval = MC417_MIRD | MC417_MIRDY | MCI_REGISTER_DATA_BYTE1; 443 cx_write(MC417_RWD, regval); 444 regval = MC417_MIWR | MC417_MIRDY | MCI_REGISTER_DATA_BYTE1; 445 cx_write(MC417_RWD, regval); 446 tempval = cx_read(MC417_RWD); 447 dataval |= ((tempval & 0x000000FF) << 8); 448 regval = MC417_MIWR | MC417_MIRD | MC417_MICS | MC417_MIRDY; 449 cx_write(MC417_RWD, regval); 450 451 /* Read data byte 2 */ 452 regval = MC417_MIRD | MC417_MIRDY | MCI_REGISTER_DATA_BYTE2; 453 cx_write(MC417_RWD, regval); 454 regval = MC417_MIWR | MC417_MIRDY | MCI_REGISTER_DATA_BYTE2; 455 cx_write(MC417_RWD, regval); 456 tempval = cx_read(MC417_RWD); 457 dataval |= ((tempval & 0x000000FF) << 16); 458 regval = MC417_MIWR | MC417_MIRD | MC417_MICS | MC417_MIRDY; 459 cx_write(MC417_RWD, regval); 460 461 /* Read data byte 3 */ 462 regval = MC417_MIRD | MC417_MIRDY | MCI_REGISTER_DATA_BYTE3; 463 cx_write(MC417_RWD, regval); 464 regval = MC417_MIWR | MC417_MIRDY | MCI_REGISTER_DATA_BYTE3; 465 cx_write(MC417_RWD, regval); 466 tempval = cx_read(MC417_RWD); 467 dataval |= ((tempval & 0x000000FF) << 24); 468 regval = MC417_MIWR | MC417_MIRD | MC417_MICS | MC417_MIRDY; 469 cx_write(MC417_RWD, regval); 470 471 *value = dataval; 472 473 return retval; 474} 475 476int mc417_memory_write(struct cx23885_dev *dev, u32 address, u32 value) 477{ 478 u32 regval; 479 480 /* Enable MC417 GPIO outputs except for MC417_MIRDY, 481 * which is an input. 482 */ 483 cx_write(MC417_OEN, MC417_MIRDY); 484 485 /* Write data byte 0 */ 486 regval = MC417_MIRD | MC417_MIRDY | MCI_MEMORY_DATA_BYTE0 | 487 (value & 0x000000FF); 488 cx_write(MC417_RWD, regval); 489 490 /* Transition CS/WR to effect write transaction across bus. */ 491 regval |= MC417_MICS | MC417_MIWR; 492 cx_write(MC417_RWD, regval); 493 494 /* Write data byte 1 */ 495 regval = MC417_MIRD | MC417_MIRDY | MCI_MEMORY_DATA_BYTE1 | 496 ((value >> 8) & 0x000000FF); 497 cx_write(MC417_RWD, regval); 498 regval |= MC417_MICS | MC417_MIWR; 499 cx_write(MC417_RWD, regval); 500 501 /* Write data byte 2 */ 502 regval = MC417_MIRD | MC417_MIRDY | MCI_MEMORY_DATA_BYTE2 | 503 ((value >> 16) & 0x000000FF); 504 cx_write(MC417_RWD, regval); 505 regval |= MC417_MICS | MC417_MIWR; 506 cx_write(MC417_RWD, regval); 507 508 /* Write data byte 3 */ 509 regval = MC417_MIRD | MC417_MIRDY | MCI_MEMORY_DATA_BYTE3 | 510 ((value >> 24) & 0x000000FF); 511 cx_write(MC417_RWD, regval); 512 regval |= MC417_MICS | MC417_MIWR; 513 cx_write(MC417_RWD, regval); 514 515 /* Write address byte 2 */ 516 regval = MC417_MIRD | MC417_MIRDY | MCI_MEMORY_ADDRESS_BYTE2 | 517 MCI_MODE_MEMORY_WRITE | ((address >> 16) & 0x3F); 518 cx_write(MC417_RWD, regval); 519 regval |= MC417_MICS | MC417_MIWR; 520 cx_write(MC417_RWD, regval); 521 522 /* Write address byte 1 */ 523 regval = MC417_MIRD | MC417_MIRDY | MCI_MEMORY_ADDRESS_BYTE1 | 524 ((address >> 8) & 0xFF); 525 cx_write(MC417_RWD, regval); 526 regval |= MC417_MICS | MC417_MIWR; 527 cx_write(MC417_RWD, regval); 528 529 /* Write address byte 0 */ 530 regval = MC417_MIRD | MC417_MIRDY | MCI_MEMORY_ADDRESS_BYTE0 | 531 (address & 0xFF); 532 cx_write(MC417_RWD, regval); 533 regval |= MC417_MICS | MC417_MIWR; 534 cx_write(MC417_RWD, regval); 535 536 /* Wait for the trans to complete (MC417_MIRDY asserted). */ 537 return mc417_wait_ready(dev); 538} 539 540int mc417_memory_read(struct cx23885_dev *dev, u32 address, u32 *value) 541{ 542 int retval; 543 u32 regval; 544 u32 tempval; 545 u32 dataval; 546 547 /* Enable MC417 GPIO outputs except for MC417_MIRDY, 548 * which is an input. 549 */ 550 cx_write(MC417_OEN, MC417_MIRDY); 551 552 /* Write address byte 2 */ 553 regval = MC417_MIRD | MC417_MIRDY | MCI_MEMORY_ADDRESS_BYTE2 | 554 MCI_MODE_MEMORY_READ | ((address >> 16) & 0x3F); 555 cx_write(MC417_RWD, regval); 556 regval |= MC417_MICS | MC417_MIWR; 557 cx_write(MC417_RWD, regval); 558 559 /* Write address byte 1 */ 560 regval = MC417_MIRD | MC417_MIRDY | MCI_MEMORY_ADDRESS_BYTE1 | 561 ((address >> 8) & 0xFF); 562 cx_write(MC417_RWD, regval); 563 regval |= MC417_MICS | MC417_MIWR; 564 cx_write(MC417_RWD, regval); 565 566 /* Write address byte 0 */ 567 regval = MC417_MIRD | MC417_MIRDY | MCI_MEMORY_ADDRESS_BYTE0 | 568 (address & 0xFF); 569 cx_write(MC417_RWD, regval); 570 regval |= MC417_MICS | MC417_MIWR; 571 cx_write(MC417_RWD, regval); 572 573 /* Wait for the trans to complete (MC417_MIRDY asserted). */ 574 retval = mc417_wait_ready(dev); 575 576 /* switch the DAT0-7 GPIO[10:3] to input mode */ 577 cx_write(MC417_OEN, MC417_MIRDY | MC417_MIDATA); 578 579 /* Read data byte 3 */ 580 regval = MC417_MIRD | MC417_MIRDY | MCI_MEMORY_DATA_BYTE3; 581 cx_write(MC417_RWD, regval); 582 583 /* Transition RD to effect read transaction across bus. */ 584 regval = MC417_MIWR | MC417_MIRDY | MCI_MEMORY_DATA_BYTE3; 585 cx_write(MC417_RWD, regval); 586 587 /* Collect byte */ 588 tempval = cx_read(MC417_RWD); 589 dataval = ((tempval & 0x000000FF) << 24); 590 591 /* Bring CS and RD high. */ 592 regval = MC417_MIWR | MC417_MIRD | MC417_MICS | MC417_MIRDY; 593 cx_write(MC417_RWD, regval); 594 595 /* Read data byte 2 */ 596 regval = MC417_MIRD | MC417_MIRDY | MCI_MEMORY_DATA_BYTE2; 597 cx_write(MC417_RWD, regval); 598 regval = MC417_MIWR | MC417_MIRDY | MCI_MEMORY_DATA_BYTE2; 599 cx_write(MC417_RWD, regval); 600 tempval = cx_read(MC417_RWD); 601 dataval |= ((tempval & 0x000000FF) << 16); 602 regval = MC417_MIWR | MC417_MIRD | MC417_MICS | MC417_MIRDY; 603 cx_write(MC417_RWD, regval); 604 605 /* Read data byte 1 */ 606 regval = MC417_MIRD | MC417_MIRDY | MCI_MEMORY_DATA_BYTE1; 607 cx_write(MC417_RWD, regval); 608 regval = MC417_MIWR | MC417_MIRDY | MCI_MEMORY_DATA_BYTE1; 609 cx_write(MC417_RWD, regval); 610 tempval = cx_read(MC417_RWD); 611 dataval |= ((tempval & 0x000000FF) << 8); 612 regval = MC417_MIWR | MC417_MIRD | MC417_MICS | MC417_MIRDY; 613 cx_write(MC417_RWD, regval); 614 615 /* Read data byte 0 */ 616 regval = MC417_MIRD | MC417_MIRDY | MCI_MEMORY_DATA_BYTE0; 617 cx_write(MC417_RWD, regval); 618 regval = MC417_MIWR | MC417_MIRDY | MCI_MEMORY_DATA_BYTE0; 619 cx_write(MC417_RWD, regval); 620 tempval = cx_read(MC417_RWD); 621 dataval |= (tempval & 0x000000FF); 622 regval = MC417_MIWR | MC417_MIRD | MC417_MICS | MC417_MIRDY; 623 cx_write(MC417_RWD, regval); 624 625 *value = dataval; 626 627 return retval; 628} 629 630void mc417_gpio_set(struct cx23885_dev *dev, u32 mask) 631{ 632 u32 val; 633 634 /* Set the gpio value */ 635 mc417_register_read(dev, 0x900C, &val); 636 val |= (mask & 0x000ffff); 637 mc417_register_write(dev, 0x900C, val); 638} 639 640void mc417_gpio_clear(struct cx23885_dev *dev, u32 mask) 641{ 642 u32 val; 643 644 /* Clear the gpio value */ 645 mc417_register_read(dev, 0x900C, &val); 646 val &= ~(mask & 0x0000ffff); 647 mc417_register_write(dev, 0x900C, val); 648} 649 650void mc417_gpio_enable(struct cx23885_dev *dev, u32 mask, int asoutput) 651{ 652 u32 val; 653 654 /* Enable GPIO direction bits */ 655 mc417_register_read(dev, 0x9020, &val); 656 if (asoutput) 657 val |= (mask & 0x0000ffff); 658 else 659 val &= ~(mask & 0x0000ffff); 660 661 mc417_register_write(dev, 0x9020, val); 662} 663/* ------------------------------------------------------------------ */ 664 665/* MPEG encoder API */ 666static char *cmd_to_str(int cmd) 667{ 668 switch (cmd) { 669 case CX2341X_ENC_PING_FW: 670 return "PING_FW"; 671 case CX2341X_ENC_START_CAPTURE: 672 return "START_CAPTURE"; 673 case CX2341X_ENC_STOP_CAPTURE: 674 return "STOP_CAPTURE"; 675 case CX2341X_ENC_SET_AUDIO_ID: 676 return "SET_AUDIO_ID"; 677 case CX2341X_ENC_SET_VIDEO_ID: 678 return "SET_VIDEO_ID"; 679 case CX2341X_ENC_SET_PCR_ID: 680 return "SET_PCR_ID"; 681 case CX2341X_ENC_SET_FRAME_RATE: 682 return "SET_FRAME_RATE"; 683 case CX2341X_ENC_SET_FRAME_SIZE: 684 return "SET_FRAME_SIZE"; 685 case CX2341X_ENC_SET_BIT_RATE: 686 return "SET_BIT_RATE"; 687 case CX2341X_ENC_SET_GOP_PROPERTIES: 688 return "SET_GOP_PROPERTIES"; 689 case CX2341X_ENC_SET_ASPECT_RATIO: 690 return "SET_ASPECT_RATIO"; 691 case CX2341X_ENC_SET_DNR_FILTER_MODE: 692 return "SET_DNR_FILTER_MODE"; 693 case CX2341X_ENC_SET_DNR_FILTER_PROPS: 694 return "SET_DNR_FILTER_PROPS"; 695 case CX2341X_ENC_SET_CORING_LEVELS: 696 return "SET_CORING_LEVELS"; 697 case CX2341X_ENC_SET_SPATIAL_FILTER_TYPE: 698 return "SET_SPATIAL_FILTER_TYPE"; 699 case CX2341X_ENC_SET_VBI_LINE: 700 return "SET_VBI_LINE"; 701 case CX2341X_ENC_SET_STREAM_TYPE: 702 return "SET_STREAM_TYPE"; 703 case CX2341X_ENC_SET_OUTPUT_PORT: 704 return "SET_OUTPUT_PORT"; 705 case CX2341X_ENC_SET_AUDIO_PROPERTIES: 706 return "SET_AUDIO_PROPERTIES"; 707 case CX2341X_ENC_HALT_FW: 708 return "HALT_FW"; 709 case CX2341X_ENC_GET_VERSION: 710 return "GET_VERSION"; 711 case CX2341X_ENC_SET_GOP_CLOSURE: 712 return "SET_GOP_CLOSURE"; 713 case CX2341X_ENC_GET_SEQ_END: 714 return "GET_SEQ_END"; 715 case CX2341X_ENC_SET_PGM_INDEX_INFO: 716 return "SET_PGM_INDEX_INFO"; 717 case CX2341X_ENC_SET_VBI_CONFIG: 718 return "SET_VBI_CONFIG"; 719 case CX2341X_ENC_SET_DMA_BLOCK_SIZE: 720 return "SET_DMA_BLOCK_SIZE"; 721 case CX2341X_ENC_GET_PREV_DMA_INFO_MB_10: 722 return "GET_PREV_DMA_INFO_MB_10"; 723 case CX2341X_ENC_GET_PREV_DMA_INFO_MB_9: 724 return "GET_PREV_DMA_INFO_MB_9"; 725 case CX2341X_ENC_SCHED_DMA_TO_HOST: 726 return "SCHED_DMA_TO_HOST"; 727 case CX2341X_ENC_INITIALIZE_INPUT: 728 return "INITIALIZE_INPUT"; 729 case CX2341X_ENC_SET_FRAME_DROP_RATE: 730 return "SET_FRAME_DROP_RATE"; 731 case CX2341X_ENC_PAUSE_ENCODER: 732 return "PAUSE_ENCODER"; 733 case CX2341X_ENC_REFRESH_INPUT: 734 return "REFRESH_INPUT"; 735 case CX2341X_ENC_SET_COPYRIGHT: 736 return "SET_COPYRIGHT"; 737 case CX2341X_ENC_SET_EVENT_NOTIFICATION: 738 return "SET_EVENT_NOTIFICATION"; 739 case CX2341X_ENC_SET_NUM_VSYNC_LINES: 740 return "SET_NUM_VSYNC_LINES"; 741 case CX2341X_ENC_SET_PLACEHOLDER: 742 return "SET_PLACEHOLDER"; 743 case CX2341X_ENC_MUTE_VIDEO: 744 return "MUTE_VIDEO"; 745 case CX2341X_ENC_MUTE_AUDIO: 746 return "MUTE_AUDIO"; 747 case CX2341X_ENC_MISC: 748 return "MISC"; 749 default: 750 return "UNKNOWN"; 751 } 752} 753 754static int cx23885_mbox_func(void *priv, 755 u32 command, 756 int in, 757 int out, 758 u32 data[CX2341X_MBOX_MAX_DATA]) 759{ 760 struct cx23885_dev *dev = priv; 761 unsigned long timeout; 762 u32 value, flag, retval = 0; 763 int i; 764 765 dprintk(3, "%s: command(0x%X) = %s\n", __func__, command, 766 cmd_to_str(command)); 767 768 /* this may not be 100% safe if we can't read any memory location 769 without side effects */ 770 mc417_memory_read(dev, dev->cx23417_mailbox - 4, &value); 771 if (value != 0x12345678) { 772 printk(KERN_ERR 773 "Firmware and/or mailbox pointer not initialized " 774 "or corrupted, signature = 0x%x, cmd = %s\n", value, 775 cmd_to_str(command)); 776 return -1; 777 } 778 779 /* This read looks at 32 bits, but flag is only 8 bits. 780 * Seems we also bail if CMD or TIMEOUT bytes are set??? 781 */ 782 mc417_memory_read(dev, dev->cx23417_mailbox, &flag); 783 if (flag) { 784 printk(KERN_ERR "ERROR: Mailbox appears to be in use " 785 "(%x), cmd = %s\n", flag, cmd_to_str(command)); 786 return -1; 787 } 788 789 flag |= 1; /* tell 'em we're working on it */ 790 mc417_memory_write(dev, dev->cx23417_mailbox, flag); 791 792 /* write command + args + fill remaining with zeros */ 793 /* command code */ 794 mc417_memory_write(dev, dev->cx23417_mailbox + 1, command); 795 mc417_memory_write(dev, dev->cx23417_mailbox + 3, 796 IVTV_API_STD_TIMEOUT); /* timeout */ 797 for (i = 0; i < in; i++) { 798 mc417_memory_write(dev, dev->cx23417_mailbox + 4 + i, data[i]); 799 dprintk(3, "API Input %d = %d\n", i, data[i]); 800 } 801 for (; i < CX2341X_MBOX_MAX_DATA; i++) 802 mc417_memory_write(dev, dev->cx23417_mailbox + 4 + i, 0); 803 804 flag |= 3; /* tell 'em we're done writing */ 805 mc417_memory_write(dev, dev->cx23417_mailbox, flag); 806 807 /* wait for firmware to handle the API command */ 808 timeout = jiffies + msecs_to_jiffies(10); 809 for (;;) { 810 mc417_memory_read(dev, dev->cx23417_mailbox, &flag); 811 if (0 != (flag & 4)) 812 break; 813 if (time_after(jiffies, timeout)) { 814 printk(KERN_ERR "ERROR: API Mailbox timeout\n"); 815 return -1; 816 } 817 udelay(10); 818 } 819 820 /* read output values */ 821 for (i = 0; i < out; i++) { 822 mc417_memory_read(dev, dev->cx23417_mailbox + 4 + i, data + i); 823 dprintk(3, "API Output %d = %d\n", i, data[i]); 824 } 825 826 mc417_memory_read(dev, dev->cx23417_mailbox + 2, &retval); 827 dprintk(3, "API result = %d\n", retval); 828 829 flag = 0; 830 mc417_memory_write(dev, dev->cx23417_mailbox, flag); 831 832 return retval; 833} 834 835/* We don't need to call the API often, so using just one 836 * mailbox will probably suffice 837 */ 838static int cx23885_api_cmd(struct cx23885_dev *dev, 839 u32 command, 840 u32 inputcnt, 841 u32 outputcnt, 842 ...) 843{ 844 u32 data[CX2341X_MBOX_MAX_DATA]; 845 va_list vargs; 846 int i, err; 847 848 dprintk(3, "%s() cmds = 0x%08x\n", __func__, command); 849 850 va_start(vargs, outputcnt); 851 for (i = 0; i < inputcnt; i++) 852 data[i] = va_arg(vargs, int); 853 854 err = cx23885_mbox_func(dev, command, inputcnt, outputcnt, data); 855 for (i = 0; i < outputcnt; i++) { 856 int *vptr = va_arg(vargs, int *); 857 *vptr = data[i]; 858 } 859 va_end(vargs); 860 861 return err; 862} 863 864static int cx23885_api_func(void *priv, u32 cmd, int in, int out, u32 data[CX2341X_MBOX_MAX_DATA]) 865{ 866 return cx23885_mbox_func(priv, cmd, in, out, data); 867} 868 869static int cx23885_find_mailbox(struct cx23885_dev *dev) 870{ 871 u32 signature[4] = { 872 0x12345678, 0x34567812, 0x56781234, 0x78123456 873 }; 874 int signaturecnt = 0; 875 u32 value; 876 int i; 877 878 dprintk(2, "%s()\n", __func__); 879 880 for (i = 0; i < CX23885_FIRM_IMAGE_SIZE; i++) { 881 mc417_memory_read(dev, i, &value); 882 if (value == signature[signaturecnt]) 883 signaturecnt++; 884 else 885 signaturecnt = 0; 886 if (4 == signaturecnt) { 887 dprintk(1, "Mailbox signature found at 0x%x\n", i+1); 888 return i+1; 889 } 890 } 891 printk(KERN_ERR "Mailbox signature values not found!\n"); 892 return -1; 893} 894 895static int cx23885_load_firmware(struct cx23885_dev *dev) 896{ 897 static const unsigned char magic[8] = { 898 0xa7, 0x0d, 0x00, 0x00, 0x66, 0xbb, 0x55, 0xaa 899 }; 900 const struct firmware *firmware; 901 int i, retval = 0; 902 u32 value = 0; 903 u32 gpio_output = 0; 904 u32 gpio_value; 905 u32 checksum = 0; 906 u32 *dataptr; 907 908 dprintk(2, "%s()\n", __func__); 909 910 /* Save GPIO settings before reset of APU */ 911 retval |= mc417_memory_read(dev, 0x9020, &gpio_output); 912 retval |= mc417_memory_read(dev, 0x900C, &gpio_value); 913 914 retval = mc417_register_write(dev, 915 IVTV_REG_VPU, 0xFFFFFFED); 916 retval |= mc417_register_write(dev, 917 IVTV_REG_HW_BLOCKS, IVTV_CMD_HW_BLOCKS_RST); 918 retval |= mc417_register_write(dev, 919 IVTV_REG_ENC_SDRAM_REFRESH, 0x80000800); 920 retval |= mc417_register_write(dev, 921 IVTV_REG_ENC_SDRAM_PRECHARGE, 0x1A); 922 retval |= mc417_register_write(dev, 923 IVTV_REG_APU, 0); 924 925 if (retval != 0) { 926 printk(KERN_ERR "%s: Error with mc417_register_write\n", 927 __func__); 928 return -1; 929 } 930 931 retval = request_firmware(&firmware, CX23885_FIRM_IMAGE_NAME, 932 &dev->pci->dev); 933 934 if (retval != 0) { 935 printk(KERN_ERR 936 "ERROR: Hotplug firmware request failed (%s).\n", 937 CX23885_FIRM_IMAGE_NAME); 938 printk(KERN_ERR "Please fix your hotplug setup, the board will " 939 "not work without firmware loaded!\n"); 940 return -1; 941 } 942 943 if (firmware->size != CX23885_FIRM_IMAGE_SIZE) { 944 printk(KERN_ERR "ERROR: Firmware size mismatch " 945 "(have %zu, expected %d)\n", 946 firmware->size, CX23885_FIRM_IMAGE_SIZE); 947 release_firmware(firmware); 948 return -1; 949 } 950 951 if (0 != memcmp(firmware->data, magic, 8)) { 952 printk(KERN_ERR 953 "ERROR: Firmware magic mismatch, wrong file?\n"); 954 release_firmware(firmware); 955 return -1; 956 } 957 958 /* transfer to the chip */ 959 dprintk(2, "Loading firmware ...\n"); 960 dataptr = (u32 *)firmware->data; 961 for (i = 0; i < (firmware->size >> 2); i++) { 962 value = *dataptr; 963 checksum += ~value; 964 if (mc417_memory_write(dev, i, value) != 0) { 965 printk(KERN_ERR "ERROR: Loading firmware failed!\n"); 966 release_firmware(firmware); 967 return -1; 968 } 969 dataptr++; 970 } 971 972 /* read back to verify with the checksum */ 973 dprintk(1, "Verifying firmware ...\n"); 974 for (i--; i >= 0; i--) { 975 if (mc417_memory_read(dev, i, &value) != 0) { 976 printk(KERN_ERR "ERROR: Reading firmware failed!\n"); 977 release_firmware(firmware); 978 return -1; 979 } 980 checksum -= ~value; 981 } 982 if (checksum) { 983 printk(KERN_ERR 984 "ERROR: Firmware load failed (checksum mismatch).\n"); 985 release_firmware(firmware); 986 return -1; 987 } 988 release_firmware(firmware); 989 dprintk(1, "Firmware upload successful.\n"); 990 991 retval |= mc417_register_write(dev, IVTV_REG_HW_BLOCKS, 992 IVTV_CMD_HW_BLOCKS_RST); 993 994 /* F/W power up disturbs the GPIOs, restore state */ 995 retval |= mc417_register_write(dev, 0x9020, gpio_output); 996 retval |= mc417_register_write(dev, 0x900C, gpio_value); 997 998 retval |= mc417_register_read(dev, IVTV_REG_VPU, &value); 999 retval |= mc417_register_write(dev, IVTV_REG_VPU, value & 0xFFFFFFE8); 1000 1001 /* Hardcoded GPIO's here */ 1002 retval |= mc417_register_write(dev, 0x9020, 0x4000); 1003 retval |= mc417_register_write(dev, 0x900C, 0x4000); 1004 1005 mc417_register_read(dev, 0x9020, &gpio_output); 1006 mc417_register_read(dev, 0x900C, &gpio_value); 1007 1008 if (retval < 0) 1009 printk(KERN_ERR "%s: Error with mc417_register_write\n", 1010 __func__); 1011 return 0; 1012} 1013 1014void cx23885_417_check_encoder(struct cx23885_dev *dev) 1015{ 1016 u32 status, seq; 1017 1018 status = seq = 0; 1019 cx23885_api_cmd(dev, CX2341X_ENC_GET_SEQ_END, 0, 2, &status, &seq); 1020 dprintk(1, "%s() status = %d, seq = %d\n", __func__, status, seq); 1021} 1022 1023static void cx23885_codec_settings(struct cx23885_dev *dev) 1024{ 1025 dprintk(1, "%s()\n", __func__); 1026 1027 /* Dynamically change the height based on video standard */ 1028 if (dev->encodernorm.id & V4L2_STD_525_60) 1029 dev->ts1.height = 480; 1030 else 1031 dev->ts1.height = 576; 1032 1033 /* assign frame size */ 1034 cx23885_api_cmd(dev, CX2341X_ENC_SET_FRAME_SIZE, 2, 0, 1035 dev->ts1.height, dev->ts1.width); 1036 1037 dev->cxhdl.width = dev->ts1.width; 1038 dev->cxhdl.height = dev->ts1.height; 1039 dev->cxhdl.is_50hz = 1040 (dev->encodernorm.id & V4L2_STD_625_50) != 0; 1041 1042 cx2341x_handler_setup(&dev->cxhdl); 1043 1044 cx23885_api_cmd(dev, CX2341X_ENC_MISC, 2, 0, 3, 1); 1045 cx23885_api_cmd(dev, CX2341X_ENC_MISC, 2, 0, 4, 1); 1046} 1047 1048static int cx23885_initialize_codec(struct cx23885_dev *dev, int startencoder) 1049{ 1050 int version; 1051 int retval; 1052 u32 i, data[7]; 1053 1054 dprintk(1, "%s()\n", __func__); 1055 1056 retval = cx23885_api_cmd(dev, CX2341X_ENC_PING_FW, 0, 0); /* ping */ 1057 if (retval < 0) { 1058 dprintk(2, "%s() PING OK\n", __func__); 1059 retval = cx23885_load_firmware(dev); 1060 if (retval < 0) { 1061 printk(KERN_ERR "%s() f/w load failed\n", __func__); 1062 return retval; 1063 } 1064 retval = cx23885_find_mailbox(dev); 1065 if (retval < 0) { 1066 printk(KERN_ERR "%s() mailbox < 0, error\n", 1067 __func__); 1068 return -1; 1069 } 1070 dev->cx23417_mailbox = retval; 1071 retval = cx23885_api_cmd(dev, CX2341X_ENC_PING_FW, 0, 0); 1072 if (retval < 0) { 1073 printk(KERN_ERR 1074 "ERROR: cx23417 firmware ping failed!\n"); 1075 return -1; 1076 } 1077 retval = cx23885_api_cmd(dev, CX2341X_ENC_GET_VERSION, 0, 1, 1078 &version); 1079 if (retval < 0) { 1080 printk(KERN_ERR "ERROR: cx23417 firmware get encoder :" 1081 "version failed!\n"); 1082 return -1; 1083 } 1084 dprintk(1, "cx23417 firmware version is 0x%08x\n", version); 1085 msleep(200); 1086 } 1087 1088 cx23885_codec_settings(dev); 1089 msleep(60); 1090 1091 cx23885_api_cmd(dev, CX2341X_ENC_SET_NUM_VSYNC_LINES, 2, 0, 1092 CX23885_FIELD1_SAA7115, CX23885_FIELD2_SAA7115); 1093 cx23885_api_cmd(dev, CX2341X_ENC_SET_PLACEHOLDER, 12, 0, 1094 CX23885_CUSTOM_EXTENSION_USR_DATA, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1095 0, 0); 1096 1097 /* Setup to capture VBI */ 1098 data[0] = 0x0001BD00; 1099 data[1] = 1; /* frames per interrupt */ 1100 data[2] = 4; /* total bufs */ 1101 data[3] = 0x91559155; /* start codes */ 1102 data[4] = 0x206080C0; /* stop codes */ 1103 data[5] = 6; /* lines */ 1104 data[6] = 64; /* BPL */ 1105 1106 cx23885_api_cmd(dev, CX2341X_ENC_SET_VBI_CONFIG, 7, 0, data[0], data[1], 1107 data[2], data[3], data[4], data[5], data[6]); 1108 1109 for (i = 2; i <= 24; i++) { 1110 int valid; 1111 1112 valid = ((i >= 19) && (i <= 21)); 1113 cx23885_api_cmd(dev, CX2341X_ENC_SET_VBI_LINE, 5, 0, i, 1114 valid, 0 , 0, 0); 1115 cx23885_api_cmd(dev, CX2341X_ENC_SET_VBI_LINE, 5, 0, 1116 i | 0x80000000, valid, 0, 0, 0); 1117 } 1118 1119 cx23885_api_cmd(dev, CX2341X_ENC_MUTE_AUDIO, 1, 0, CX23885_UNMUTE); 1120 msleep(60); 1121 1122 /* initialize the video input */ 1123 cx23885_api_cmd(dev, CX2341X_ENC_INITIALIZE_INPUT, 0, 0); 1124 msleep(60); 1125 1126 /* Enable VIP style pixel invalidation so we work with scaled mode */ 1127 mc417_memory_write(dev, 2120, 0x00000080); 1128 1129 /* start capturing to the host interface */ 1130 if (startencoder) { 1131 cx23885_api_cmd(dev, CX2341X_ENC_START_CAPTURE, 2, 0, 1132 CX23885_MPEG_CAPTURE, CX23885_RAW_BITS_NONE); 1133 msleep(10); 1134 } 1135 1136 return 0; 1137} 1138 1139/* ------------------------------------------------------------------ */ 1140 1141static int queue_setup(struct vb2_queue *q, const struct v4l2_format *fmt, 1142 unsigned int *num_buffers, unsigned int *num_planes, 1143 unsigned int sizes[], void *alloc_ctxs[]) 1144{ 1145 struct cx23885_dev *dev = q->drv_priv; 1146 1147 dev->ts1.ts_packet_size = mpeglinesize; 1148 dev->ts1.ts_packet_count = mpeglines; 1149 *num_planes = 1; 1150 sizes[0] = mpeglinesize * mpeglines; 1151 alloc_ctxs[0] = dev->alloc_ctx; 1152 *num_buffers = mpegbufs; 1153 return 0; 1154} 1155 1156static int buffer_prepare(struct vb2_buffer *vb) 1157{ 1158 struct cx23885_dev *dev = vb->vb2_queue->drv_priv; 1159 struct cx23885_buffer *buf = 1160 container_of(vb, struct cx23885_buffer, vb); 1161 1162 return cx23885_buf_prepare(buf, &dev->ts1); 1163} 1164 1165static void buffer_finish(struct vb2_buffer *vb) 1166{ 1167 struct cx23885_dev *dev = vb->vb2_queue->drv_priv; 1168 struct cx23885_buffer *buf = container_of(vb, 1169 struct cx23885_buffer, vb); 1170 1171 cx23885_free_buffer(dev, buf); 1172} 1173 1174static void buffer_queue(struct vb2_buffer *vb) 1175{ 1176 struct cx23885_dev *dev = vb->vb2_queue->drv_priv; 1177 struct cx23885_buffer *buf = container_of(vb, 1178 struct cx23885_buffer, vb); 1179 1180 cx23885_buf_queue(&dev->ts1, buf); 1181} 1182 1183static int cx23885_start_streaming(struct vb2_queue *q, unsigned int count) 1184{ 1185 struct cx23885_dev *dev = q->drv_priv; 1186 struct cx23885_dmaqueue *dmaq = &dev->ts1.mpegq; 1187 unsigned long flags; 1188 int ret; 1189 1190 ret = cx23885_initialize_codec(dev, 1); 1191 if (ret == 0) { 1192 struct cx23885_buffer *buf = list_entry(dmaq->active.next, 1193 struct cx23885_buffer, queue); 1194 1195 cx23885_start_dma(&dev->ts1, dmaq, buf); 1196 return 0; 1197 } 1198 spin_lock_irqsave(&dev->slock, flags); 1199 while (!list_empty(&dmaq->active)) { 1200 struct cx23885_buffer *buf = list_entry(dmaq->active.next, 1201 struct cx23885_buffer, queue); 1202 1203 list_del(&buf->queue); 1204 vb2_buffer_done(&buf->vb, VB2_BUF_STATE_QUEUED); 1205 } 1206 spin_unlock_irqrestore(&dev->slock, flags); 1207 return ret; 1208} 1209 1210static void cx23885_stop_streaming(struct vb2_queue *q) 1211{ 1212 struct cx23885_dev *dev = q->drv_priv; 1213 1214 /* stop mpeg capture */ 1215 cx23885_api_cmd(dev, CX2341X_ENC_STOP_CAPTURE, 3, 0, 1216 CX23885_END_NOW, CX23885_MPEG_CAPTURE, 1217 CX23885_RAW_BITS_NONE); 1218 1219 msleep(500); 1220 cx23885_417_check_encoder(dev); 1221 cx23885_cancel_buffers(&dev->ts1); 1222} 1223 1224static struct vb2_ops cx23885_qops = { 1225 .queue_setup = queue_setup, 1226 .buf_prepare = buffer_prepare, 1227 .buf_finish = buffer_finish, 1228 .buf_queue = buffer_queue, 1229 .wait_prepare = vb2_ops_wait_prepare, 1230 .wait_finish = vb2_ops_wait_finish, 1231 .start_streaming = cx23885_start_streaming, 1232 .stop_streaming = cx23885_stop_streaming, 1233}; 1234 1235/* ------------------------------------------------------------------ */ 1236 1237static int vidioc_g_std(struct file *file, void *priv, v4l2_std_id *id) 1238{ 1239 struct cx23885_dev *dev = video_drvdata(file); 1240 1241 *id = dev->tvnorm; 1242 return 0; 1243} 1244 1245static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id id) 1246{ 1247 struct cx23885_dev *dev = video_drvdata(file); 1248 unsigned int i; 1249 int ret; 1250 1251 for (i = 0; i < ARRAY_SIZE(cx23885_tvnorms); i++) 1252 if (id & cx23885_tvnorms[i].id) 1253 break; 1254 if (i == ARRAY_SIZE(cx23885_tvnorms)) 1255 return -EINVAL; 1256 1257 ret = cx23885_set_tvnorm(dev, id); 1258 if (!ret) 1259 dev->encodernorm = cx23885_tvnorms[i]; 1260 return ret; 1261} 1262 1263static int vidioc_enum_input(struct file *file, void *priv, 1264 struct v4l2_input *i) 1265{ 1266 struct cx23885_dev *dev = video_drvdata(file); 1267 dprintk(1, "%s()\n", __func__); 1268 return cx23885_enum_input(dev, i); 1269} 1270 1271static int vidioc_g_input(struct file *file, void *priv, unsigned int *i) 1272{ 1273 return cx23885_get_input(file, priv, i); 1274} 1275 1276static int vidioc_s_input(struct file *file, void *priv, unsigned int i) 1277{ 1278 return cx23885_set_input(file, priv, i); 1279} 1280 1281static int vidioc_g_tuner(struct file *file, void *priv, 1282 struct v4l2_tuner *t) 1283{ 1284 struct cx23885_dev *dev = video_drvdata(file); 1285 1286 if (dev->tuner_type == TUNER_ABSENT) 1287 return -EINVAL; 1288 if (0 != t->index) 1289 return -EINVAL; 1290 strcpy(t->name, "Television"); 1291 call_all(dev, tuner, g_tuner, t); 1292 1293 dprintk(1, "VIDIOC_G_TUNER: tuner type %d\n", t->type); 1294 1295 return 0; 1296} 1297 1298static int vidioc_s_tuner(struct file *file, void *priv, 1299 const struct v4l2_tuner *t) 1300{ 1301 struct cx23885_dev *dev = video_drvdata(file); 1302 1303 if (dev->tuner_type == TUNER_ABSENT) 1304 return -EINVAL; 1305 1306 /* Update the A/V core */ 1307 call_all(dev, tuner, s_tuner, t); 1308 1309 return 0; 1310} 1311 1312static int vidioc_g_frequency(struct file *file, void *priv, 1313 struct v4l2_frequency *f) 1314{ 1315 struct cx23885_dev *dev = video_drvdata(file); 1316 1317 if (dev->tuner_type == TUNER_ABSENT) 1318 return -EINVAL; 1319 f->type = V4L2_TUNER_ANALOG_TV; 1320 f->frequency = dev->freq; 1321 1322 call_all(dev, tuner, g_frequency, f); 1323 1324 return 0; 1325} 1326 1327static int vidioc_s_frequency(struct file *file, void *priv, 1328 const struct v4l2_frequency *f) 1329{ 1330 return cx23885_set_frequency(file, priv, f); 1331} 1332 1333static int vidioc_querycap(struct file *file, void *priv, 1334 struct v4l2_capability *cap) 1335{ 1336 struct cx23885_dev *dev = video_drvdata(file); 1337 struct cx23885_tsport *tsport = &dev->ts1; 1338 1339 strlcpy(cap->driver, dev->name, sizeof(cap->driver)); 1340 strlcpy(cap->card, cx23885_boards[tsport->dev->board].name, 1341 sizeof(cap->card)); 1342 sprintf(cap->bus_info, "PCIe:%s", pci_name(dev->pci)); 1343 cap->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_READWRITE | 1344 V4L2_CAP_STREAMING; 1345 if (dev->tuner_type != TUNER_ABSENT) 1346 cap->device_caps |= V4L2_CAP_TUNER; 1347 cap->capabilities = cap->device_caps | V4L2_CAP_VBI_CAPTURE | 1348 V4L2_CAP_AUDIO | V4L2_CAP_DEVICE_CAPS; 1349 1350 return 0; 1351} 1352 1353static int vidioc_enum_fmt_vid_cap(struct file *file, void *priv, 1354 struct v4l2_fmtdesc *f) 1355{ 1356 if (f->index != 0) 1357 return -EINVAL; 1358 1359 strlcpy(f->description, "MPEG", sizeof(f->description)); 1360 f->pixelformat = V4L2_PIX_FMT_MPEG; 1361 1362 return 0; 1363} 1364 1365static int vidioc_g_fmt_vid_cap(struct file *file, void *priv, 1366 struct v4l2_format *f) 1367{ 1368 struct cx23885_dev *dev = video_drvdata(file); 1369 1370 f->fmt.pix.pixelformat = V4L2_PIX_FMT_MPEG; 1371 f->fmt.pix.bytesperline = 0; 1372 f->fmt.pix.sizeimage = 1373 dev->ts1.ts_packet_size * dev->ts1.ts_packet_count; 1374 f->fmt.pix.colorspace = 0; 1375 f->fmt.pix.width = dev->ts1.width; 1376 f->fmt.pix.height = dev->ts1.height; 1377 f->fmt.pix.field = V4L2_FIELD_INTERLACED; 1378 dprintk(1, "VIDIOC_G_FMT: w: %d, h: %d\n", 1379 dev->ts1.width, dev->ts1.height); 1380 return 0; 1381} 1382 1383static int vidioc_try_fmt_vid_cap(struct file *file, void *priv, 1384 struct v4l2_format *f) 1385{ 1386 struct cx23885_dev *dev = video_drvdata(file); 1387 1388 f->fmt.pix.pixelformat = V4L2_PIX_FMT_MPEG; 1389 f->fmt.pix.bytesperline = 0; 1390 f->fmt.pix.sizeimage = 1391 dev->ts1.ts_packet_size * dev->ts1.ts_packet_count; 1392 f->fmt.pix.colorspace = 0; 1393 f->fmt.pix.field = V4L2_FIELD_INTERLACED; 1394 dprintk(1, "VIDIOC_TRY_FMT: w: %d, h: %d\n", 1395 dev->ts1.width, dev->ts1.height); 1396 return 0; 1397} 1398 1399static int vidioc_s_fmt_vid_cap(struct file *file, void *priv, 1400 struct v4l2_format *f) 1401{ 1402 struct cx23885_dev *dev = video_drvdata(file); 1403 1404 f->fmt.pix.pixelformat = V4L2_PIX_FMT_MPEG; 1405 f->fmt.pix.bytesperline = 0; 1406 f->fmt.pix.sizeimage = 1407 dev->ts1.ts_packet_size * dev->ts1.ts_packet_count; 1408 f->fmt.pix.colorspace = 0; 1409 f->fmt.pix.field = V4L2_FIELD_INTERLACED; 1410 dprintk(1, "VIDIOC_S_FMT: w: %d, h: %d, f: %d\n", 1411 f->fmt.pix.width, f->fmt.pix.height, f->fmt.pix.field); 1412 return 0; 1413} 1414 1415static int vidioc_log_status(struct file *file, void *priv) 1416{ 1417 struct cx23885_dev *dev = video_drvdata(file); 1418 char name[32 + 2]; 1419 1420 snprintf(name, sizeof(name), "%s/2", dev->name); 1421 call_all(dev, core, log_status); 1422 v4l2_ctrl_handler_log_status(&dev->cxhdl.hdl, name); 1423 return 0; 1424} 1425 1426static struct v4l2_file_operations mpeg_fops = { 1427 .owner = THIS_MODULE, 1428 .open = v4l2_fh_open, 1429 .release = vb2_fop_release, 1430 .read = vb2_fop_read, 1431 .poll = vb2_fop_poll, 1432 .unlocked_ioctl = video_ioctl2, 1433 .mmap = vb2_fop_mmap, 1434}; 1435 1436static const struct v4l2_ioctl_ops mpeg_ioctl_ops = { 1437 .vidioc_g_std = vidioc_g_std, 1438 .vidioc_s_std = vidioc_s_std, 1439 .vidioc_enum_input = vidioc_enum_input, 1440 .vidioc_g_input = vidioc_g_input, 1441 .vidioc_s_input = vidioc_s_input, 1442 .vidioc_g_tuner = vidioc_g_tuner, 1443 .vidioc_s_tuner = vidioc_s_tuner, 1444 .vidioc_g_frequency = vidioc_g_frequency, 1445 .vidioc_s_frequency = vidioc_s_frequency, 1446 .vidioc_querycap = vidioc_querycap, 1447 .vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid_cap, 1448 .vidioc_g_fmt_vid_cap = vidioc_g_fmt_vid_cap, 1449 .vidioc_try_fmt_vid_cap = vidioc_try_fmt_vid_cap, 1450 .vidioc_s_fmt_vid_cap = vidioc_s_fmt_vid_cap, 1451 .vidioc_reqbufs = vb2_ioctl_reqbufs, 1452 .vidioc_prepare_buf = vb2_ioctl_prepare_buf, 1453 .vidioc_querybuf = vb2_ioctl_querybuf, 1454 .vidioc_qbuf = vb2_ioctl_qbuf, 1455 .vidioc_dqbuf = vb2_ioctl_dqbuf, 1456 .vidioc_streamon = vb2_ioctl_streamon, 1457 .vidioc_streamoff = vb2_ioctl_streamoff, 1458 .vidioc_log_status = vidioc_log_status, 1459#ifdef CONFIG_VIDEO_ADV_DEBUG 1460 .vidioc_g_chip_info = cx23885_g_chip_info, 1461 .vidioc_g_register = cx23885_g_register, 1462 .vidioc_s_register = cx23885_s_register, 1463#endif 1464}; 1465 1466static struct video_device cx23885_mpeg_template = { 1467 .name = "cx23885", 1468 .fops = &mpeg_fops, 1469 .ioctl_ops = &mpeg_ioctl_ops, 1470 .tvnorms = CX23885_NORMS, 1471}; 1472 1473void cx23885_417_unregister(struct cx23885_dev *dev) 1474{ 1475 dprintk(1, "%s()\n", __func__); 1476 1477 if (dev->v4l_device) { 1478 if (video_is_registered(dev->v4l_device)) 1479 video_unregister_device(dev->v4l_device); 1480 else 1481 video_device_release(dev->v4l_device); 1482 v4l2_ctrl_handler_free(&dev->cxhdl.hdl); 1483 dev->v4l_device = NULL; 1484 } 1485} 1486 1487static struct video_device *cx23885_video_dev_alloc( 1488 struct cx23885_tsport *tsport, 1489 struct pci_dev *pci, 1490 struct video_device *template, 1491 char *type) 1492{ 1493 struct video_device *vfd; 1494 struct cx23885_dev *dev = tsport->dev; 1495 1496 dprintk(1, "%s()\n", __func__); 1497 1498 vfd = video_device_alloc(); 1499 if (NULL == vfd) 1500 return NULL; 1501 *vfd = *template; 1502 snprintf(vfd->name, sizeof(vfd->name), "%s (%s)", 1503 cx23885_boards[tsport->dev->board].name, type); 1504 vfd->v4l2_dev = &dev->v4l2_dev; 1505 vfd->release = video_device_release; 1506 return vfd; 1507} 1508 1509int cx23885_417_register(struct cx23885_dev *dev) 1510{ 1511 /* FIXME: Port1 hardcoded here */ 1512 int err = -ENODEV; 1513 struct cx23885_tsport *tsport = &dev->ts1; 1514 struct vb2_queue *q; 1515 1516 dprintk(1, "%s()\n", __func__); 1517 1518 if (cx23885_boards[dev->board].portb != CX23885_MPEG_ENCODER) 1519 return err; 1520 1521 /* Set default TV standard */ 1522 dev->encodernorm = cx23885_tvnorms[0]; 1523 1524 if (dev->encodernorm.id & V4L2_STD_525_60) 1525 tsport->height = 480; 1526 else 1527 tsport->height = 576; 1528 1529 tsport->width = 720; 1530 dev->cxhdl.port = CX2341X_PORT_SERIAL; 1531 err = cx2341x_handler_init(&dev->cxhdl, 50); 1532 if (err) 1533 return err; 1534 dev->cxhdl.priv = dev; 1535 dev->cxhdl.func = cx23885_api_func; 1536 cx2341x_handler_set_50hz(&dev->cxhdl, tsport->height == 576); 1537 v4l2_ctrl_add_handler(&dev->ctrl_handler, &dev->cxhdl.hdl, NULL); 1538 1539 /* Allocate and initialize V4L video device */ 1540 dev->v4l_device = cx23885_video_dev_alloc(tsport, 1541 dev->pci, &cx23885_mpeg_template, "mpeg"); 1542 q = &dev->vb2_mpegq; 1543 q->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; 1544 q->io_modes = VB2_MMAP | VB2_USERPTR | VB2_DMABUF | VB2_READ; 1545 q->gfp_flags = GFP_DMA32; 1546 q->min_buffers_needed = 2; 1547 q->drv_priv = dev; 1548 q->buf_struct_size = sizeof(struct cx23885_buffer); 1549 q->ops = &cx23885_qops; 1550 q->mem_ops = &vb2_dma_sg_memops; 1551 q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC; 1552 q->lock = &dev->lock; 1553 1554 err = vb2_queue_init(q); 1555 if (err < 0) 1556 return err; 1557 video_set_drvdata(dev->v4l_device, dev); 1558 dev->v4l_device->lock = &dev->lock; 1559 dev->v4l_device->queue = q; 1560 err = video_register_device(dev->v4l_device, 1561 VFL_TYPE_GRABBER, -1); 1562 if (err < 0) { 1563 printk(KERN_INFO "%s: can't register mpeg device\n", dev->name); 1564 return err; 1565 } 1566 1567 printk(KERN_INFO "%s: registered device %s [mpeg]\n", 1568 dev->name, video_device_node_name(dev->v4l_device)); 1569 1570 /* ST: Configure the encoder paramaters, but don't begin 1571 * encoding, this resolves an issue where the first time the 1572 * encoder is started video can be choppy. 1573 */ 1574 cx23885_initialize_codec(dev, 0); 1575 1576 return 0; 1577} 1578 1579MODULE_FIRMWARE(CX23885_FIRM_IMAGE_NAME); 1580