vpfe_capture.c revision 204e6ea981ac46974508ddf403dbb72dc804dcb3
1/* 2 * Copyright (C) 2008-2009 Texas Instruments Inc 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License as published by 6 * the Free Software Foundation; either version 2 of the License, or 7 * (at your option) any later version. 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program; if not, write to the Free Software 16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 17 * 18 * Driver name : VPFE Capture driver 19 * VPFE Capture driver allows applications to capture and stream video 20 * frames on DaVinci SoCs (DM6446, DM355 etc) from a YUV source such as 21 * TVP5146 or Raw Bayer RGB image data from an image sensor 22 * such as Microns' MT9T001, MT9T031 etc. 23 * 24 * These SoCs have, in common, a Video Processing Subsystem (VPSS) that 25 * consists of a Video Processing Front End (VPFE) for capturing 26 * video/raw image data and Video Processing Back End (VPBE) for displaying 27 * YUV data through an in-built analog encoder or Digital LCD port. This 28 * driver is for capture through VPFE. A typical EVM using these SoCs have 29 * following high level configuration. 30 * 31 * 32 * decoder(TVP5146/ YUV/ 33 * MT9T001) --> Raw Bayer RGB ---> MUX -> VPFE (CCDC/ISIF) 34 * data input | | 35 * V | 36 * SDRAM | 37 * V 38 * Image Processor 39 * | 40 * V 41 * SDRAM 42 * The data flow happens from a decoder connected to the VPFE over a 43 * YUV embedded (BT.656/BT.1120) or separate sync or raw bayer rgb interface 44 * and to the input of VPFE through an optional MUX (if more inputs are 45 * to be interfaced on the EVM). The input data is first passed through 46 * CCDC (CCD Controller, a.k.a Image Sensor Interface, ISIF). The CCDC 47 * does very little or no processing on YUV data and does pre-process Raw 48 * Bayer RGB data through modules such as Defect Pixel Correction (DFC) 49 * Color Space Conversion (CSC), data gain/offset etc. After this, data 50 * can be written to SDRAM or can be connected to the image processing 51 * block such as IPIPE (on DM355 only). 52 * 53 * Features supported 54 * - MMAP IO 55 * - Capture using TVP5146 over BT.656 56 * - support for interfacing decoders using sub device model 57 * - Work with DM355 or DM6446 CCDC to do Raw Bayer RGB/YUV 58 * data capture to SDRAM. 59 * TODO list 60 * - Support multiple REQBUF after open 61 * - Support for de-allocating buffers through REQBUF 62 * - Support for Raw Bayer RGB capture 63 * - Support for chaining Image Processor 64 * - Support for static allocation of buffers 65 * - Support for USERPTR IO 66 * - Support for STREAMON before QBUF 67 * - Support for control ioctls 68 */ 69#include <linux/module.h> 70#include <linux/init.h> 71#include <linux/platform_device.h> 72#include <linux/interrupt.h> 73#include <linux/version.h> 74#include <media/v4l2-common.h> 75#include <linux/io.h> 76#include <media/davinci/vpfe_capture.h> 77#include "ccdc_hw_device.h" 78 79static int debug; 80static u32 numbuffers = 3; 81static u32 bufsize = (720 * 576 * 2); 82 83module_param(numbuffers, uint, S_IRUGO); 84module_param(bufsize, uint, S_IRUGO); 85module_param(debug, int, 0644); 86 87MODULE_PARM_DESC(numbuffers, "buffer count (default:3)"); 88MODULE_PARM_DESC(bufsize, "buffer size in bytes (default:720 x 576 x 2)"); 89MODULE_PARM_DESC(debug, "Debug level 0-1"); 90 91MODULE_DESCRIPTION("VPFE Video for Linux Capture Driver"); 92MODULE_LICENSE("GPL"); 93MODULE_AUTHOR("Texas Instruments"); 94 95/* standard information */ 96struct vpfe_standard { 97 v4l2_std_id std_id; 98 unsigned int width; 99 unsigned int height; 100 struct v4l2_fract pixelaspect; 101 /* 0 - progressive, 1 - interlaced */ 102 int frame_format; 103}; 104 105/* ccdc configuration */ 106struct ccdc_config { 107 /* This make sure vpfe is probed and ready to go */ 108 int vpfe_probed; 109 /* name of ccdc device */ 110 char name[32]; 111 /* for storing mem maps for CCDC */ 112 int ccdc_addr_size; 113 void *__iomem ccdc_addr; 114}; 115 116/* data structures */ 117static struct vpfe_config_params config_params = { 118 .min_numbuffers = 3, 119 .numbuffers = 3, 120 .min_bufsize = 720 * 480 * 2, 121 .device_bufsize = 720 * 576 * 2, 122}; 123 124/* ccdc device registered */ 125static struct ccdc_hw_device *ccdc_dev; 126/* lock for accessing ccdc information */ 127static DEFINE_MUTEX(ccdc_lock); 128/* ccdc configuration */ 129static struct ccdc_config *ccdc_cfg; 130 131const struct vpfe_standard vpfe_standards[] = { 132 {V4L2_STD_525_60, 720, 480, {11, 10}, 1}, 133 {V4L2_STD_625_50, 720, 576, {54, 59}, 1}, 134}; 135 136/* Used when raw Bayer image from ccdc is directly captured to SDRAM */ 137static const struct vpfe_pixel_format vpfe_pix_fmts[] = { 138 { 139 .fmtdesc = { 140 .index = 0, 141 .type = V4L2_BUF_TYPE_VIDEO_CAPTURE, 142 .description = "Bayer GrRBGb 8bit A-Law compr.", 143 .pixelformat = V4L2_PIX_FMT_SBGGR8, 144 }, 145 .bpp = 1, 146 }, 147 { 148 .fmtdesc = { 149 .index = 1, 150 .type = V4L2_BUF_TYPE_VIDEO_CAPTURE, 151 .description = "Bayer GrRBGb - 16bit", 152 .pixelformat = V4L2_PIX_FMT_SBGGR16, 153 }, 154 .bpp = 2, 155 }, 156 { 157 .fmtdesc = { 158 .index = 2, 159 .type = V4L2_BUF_TYPE_VIDEO_CAPTURE, 160 .description = "Bayer GrRBGb 8bit DPCM compr.", 161 .pixelformat = V4L2_PIX_FMT_SGRBG10DPCM8, 162 }, 163 .bpp = 1, 164 }, 165 { 166 .fmtdesc = { 167 .index = 3, 168 .type = V4L2_BUF_TYPE_VIDEO_CAPTURE, 169 .description = "YCbCr 4:2:2 Interleaved UYVY", 170 .pixelformat = V4L2_PIX_FMT_UYVY, 171 }, 172 .bpp = 2, 173 }, 174 { 175 .fmtdesc = { 176 .index = 4, 177 .type = V4L2_BUF_TYPE_VIDEO_CAPTURE, 178 .description = "YCbCr 4:2:2 Interleaved YUYV", 179 .pixelformat = V4L2_PIX_FMT_YUYV, 180 }, 181 .bpp = 2, 182 }, 183 { 184 .fmtdesc = { 185 .index = 5, 186 .type = V4L2_BUF_TYPE_VIDEO_CAPTURE, 187 .description = "Y/CbCr 4:2:0 - Semi planar", 188 .pixelformat = V4L2_PIX_FMT_NV12, 189 }, 190 .bpp = 1, 191 }, 192}; 193 194/* 195 * vpfe_lookup_pix_format() 196 * lookup an entry in the vpfe pix format table based on pix_format 197 */ 198static const struct vpfe_pixel_format *vpfe_lookup_pix_format(u32 pix_format) 199{ 200 int i; 201 202 for (i = 0; i < ARRAY_SIZE(vpfe_pix_fmts); i++) { 203 if (pix_format == vpfe_pix_fmts[i].fmtdesc.pixelformat) 204 return &vpfe_pix_fmts[i]; 205 } 206 return NULL; 207} 208 209/* 210 * vpfe_register_ccdc_device. CCDC module calls this to 211 * register with vpfe capture 212 */ 213int vpfe_register_ccdc_device(struct ccdc_hw_device *dev) 214{ 215 int ret = 0; 216 printk(KERN_NOTICE "vpfe_register_ccdc_device: %s\n", dev->name); 217 218 BUG_ON(!dev->hw_ops.open); 219 BUG_ON(!dev->hw_ops.enable); 220 BUG_ON(!dev->hw_ops.set_hw_if_params); 221 BUG_ON(!dev->hw_ops.configure); 222 BUG_ON(!dev->hw_ops.set_buftype); 223 BUG_ON(!dev->hw_ops.get_buftype); 224 BUG_ON(!dev->hw_ops.enum_pix); 225 BUG_ON(!dev->hw_ops.set_frame_format); 226 BUG_ON(!dev->hw_ops.get_frame_format); 227 BUG_ON(!dev->hw_ops.get_pixel_format); 228 BUG_ON(!dev->hw_ops.set_pixel_format); 229 BUG_ON(!dev->hw_ops.set_params); 230 BUG_ON(!dev->hw_ops.set_image_window); 231 BUG_ON(!dev->hw_ops.get_image_window); 232 BUG_ON(!dev->hw_ops.get_line_length); 233 BUG_ON(!dev->hw_ops.setfbaddr); 234 BUG_ON(!dev->hw_ops.getfid); 235 236 mutex_lock(&ccdc_lock); 237 if (NULL == ccdc_cfg) { 238 /* 239 * TODO. Will this ever happen? if so, we need to fix it. 240 * Proabably we need to add the request to a linked list and 241 * walk through it during vpfe probe 242 */ 243 printk(KERN_ERR "vpfe capture not initialized\n"); 244 ret = -1; 245 goto unlock; 246 } 247 248 if (strcmp(dev->name, ccdc_cfg->name)) { 249 /* ignore this ccdc */ 250 ret = -1; 251 goto unlock; 252 } 253 254 if (ccdc_dev) { 255 printk(KERN_ERR "ccdc already registered\n"); 256 ret = -1; 257 goto unlock; 258 } 259 260 ccdc_dev = dev; 261 dev->hw_ops.set_ccdc_base(ccdc_cfg->ccdc_addr, 262 ccdc_cfg->ccdc_addr_size); 263unlock: 264 mutex_unlock(&ccdc_lock); 265 return ret; 266} 267EXPORT_SYMBOL(vpfe_register_ccdc_device); 268 269/* 270 * vpfe_unregister_ccdc_device. CCDC module calls this to 271 * unregister with vpfe capture 272 */ 273void vpfe_unregister_ccdc_device(struct ccdc_hw_device *dev) 274{ 275 if (NULL == dev) { 276 printk(KERN_ERR "invalid ccdc device ptr\n"); 277 return; 278 } 279 280 printk(KERN_NOTICE "vpfe_unregister_ccdc_device, dev->name = %s\n", 281 dev->name); 282 283 if (strcmp(dev->name, ccdc_cfg->name)) { 284 /* ignore this ccdc */ 285 return; 286 } 287 288 mutex_lock(&ccdc_lock); 289 ccdc_dev = NULL; 290 mutex_unlock(&ccdc_lock); 291 return; 292} 293EXPORT_SYMBOL(vpfe_unregister_ccdc_device); 294 295/* 296 * vpfe_get_ccdc_image_format - Get image parameters based on CCDC settings 297 */ 298static int vpfe_get_ccdc_image_format(struct vpfe_device *vpfe_dev, 299 struct v4l2_format *f) 300{ 301 struct v4l2_rect image_win; 302 enum ccdc_buftype buf_type; 303 enum ccdc_frmfmt frm_fmt; 304 305 memset(f, 0, sizeof(*f)); 306 f->type = V4L2_BUF_TYPE_VIDEO_OUTPUT; 307 ccdc_dev->hw_ops.get_image_window(&image_win); 308 f->fmt.pix.width = image_win.width; 309 f->fmt.pix.height = image_win.height; 310 f->fmt.pix.bytesperline = ccdc_dev->hw_ops.get_line_length(); 311 f->fmt.pix.sizeimage = f->fmt.pix.bytesperline * 312 f->fmt.pix.height; 313 buf_type = ccdc_dev->hw_ops.get_buftype(); 314 f->fmt.pix.pixelformat = ccdc_dev->hw_ops.get_pixel_format(); 315 frm_fmt = ccdc_dev->hw_ops.get_frame_format(); 316 if (frm_fmt == CCDC_FRMFMT_PROGRESSIVE) 317 f->fmt.pix.field = V4L2_FIELD_NONE; 318 else if (frm_fmt == CCDC_FRMFMT_INTERLACED) { 319 if (buf_type == CCDC_BUFTYPE_FLD_INTERLEAVED) 320 f->fmt.pix.field = V4L2_FIELD_INTERLACED; 321 else if (buf_type == CCDC_BUFTYPE_FLD_SEPARATED) 322 f->fmt.pix.field = V4L2_FIELD_SEQ_TB; 323 else { 324 v4l2_err(&vpfe_dev->v4l2_dev, "Invalid buf_type\n"); 325 return -EINVAL; 326 } 327 } else { 328 v4l2_err(&vpfe_dev->v4l2_dev, "Invalid frm_fmt\n"); 329 return -EINVAL; 330 } 331 return 0; 332} 333 334/* 335 * vpfe_config_ccdc_image_format() 336 * For a pix format, configure ccdc to setup the capture 337 */ 338static int vpfe_config_ccdc_image_format(struct vpfe_device *vpfe_dev) 339{ 340 enum ccdc_frmfmt frm_fmt = CCDC_FRMFMT_INTERLACED; 341 int ret = 0; 342 343 if (ccdc_dev->hw_ops.set_pixel_format( 344 vpfe_dev->fmt.fmt.pix.pixelformat) < 0) { 345 v4l2_err(&vpfe_dev->v4l2_dev, 346 "couldn't set pix format in ccdc\n"); 347 return -EINVAL; 348 } 349 /* configure the image window */ 350 ccdc_dev->hw_ops.set_image_window(&vpfe_dev->crop); 351 352 switch (vpfe_dev->fmt.fmt.pix.field) { 353 case V4L2_FIELD_INTERLACED: 354 /* do nothing, since it is default */ 355 ret = ccdc_dev->hw_ops.set_buftype( 356 CCDC_BUFTYPE_FLD_INTERLEAVED); 357 break; 358 case V4L2_FIELD_NONE: 359 frm_fmt = CCDC_FRMFMT_PROGRESSIVE; 360 /* buffer type only applicable for interlaced scan */ 361 break; 362 case V4L2_FIELD_SEQ_TB: 363 ret = ccdc_dev->hw_ops.set_buftype( 364 CCDC_BUFTYPE_FLD_SEPARATED); 365 break; 366 default: 367 return -EINVAL; 368 } 369 370 /* set the frame format */ 371 if (!ret) 372 ret = ccdc_dev->hw_ops.set_frame_format(frm_fmt); 373 return ret; 374} 375/* 376 * vpfe_config_image_format() 377 * For a given standard, this functions sets up the default 378 * pix format & crop values in the vpfe device and ccdc. It first 379 * starts with defaults based values from the standard table. 380 * It then checks if sub device support g_fmt and then override the 381 * values based on that.Sets crop values to match with scan resolution 382 * starting at 0,0. It calls vpfe_config_ccdc_image_format() set the 383 * values in ccdc 384 */ 385static int vpfe_config_image_format(struct vpfe_device *vpfe_dev, 386 const v4l2_std_id *std_id) 387{ 388 struct vpfe_subdev_info *sdinfo = vpfe_dev->current_subdev; 389 int i, ret = 0; 390 391 for (i = 0; i < ARRAY_SIZE(vpfe_standards); i++) { 392 if (vpfe_standards[i].std_id & *std_id) { 393 vpfe_dev->std_info.active_pixels = 394 vpfe_standards[i].width; 395 vpfe_dev->std_info.active_lines = 396 vpfe_standards[i].height; 397 vpfe_dev->std_info.frame_format = 398 vpfe_standards[i].frame_format; 399 vpfe_dev->std_index = i; 400 break; 401 } 402 } 403 404 if (i == ARRAY_SIZE(vpfe_standards)) { 405 v4l2_err(&vpfe_dev->v4l2_dev, "standard not supported\n"); 406 return -EINVAL; 407 } 408 409 vpfe_dev->crop.top = 0; 410 vpfe_dev->crop.left = 0; 411 vpfe_dev->crop.width = vpfe_dev->std_info.active_pixels; 412 vpfe_dev->crop.height = vpfe_dev->std_info.active_lines; 413 vpfe_dev->fmt.fmt.pix.width = vpfe_dev->crop.width; 414 vpfe_dev->fmt.fmt.pix.height = vpfe_dev->crop.height; 415 416 /* first field and frame format based on standard frame format */ 417 if (vpfe_dev->std_info.frame_format) { 418 vpfe_dev->fmt.fmt.pix.field = V4L2_FIELD_INTERLACED; 419 /* assume V4L2_PIX_FMT_UYVY as default */ 420 vpfe_dev->fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_UYVY; 421 } else { 422 vpfe_dev->fmt.fmt.pix.field = V4L2_FIELD_NONE; 423 /* assume V4L2_PIX_FMT_SBGGR8 */ 424 vpfe_dev->fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_SBGGR8; 425 } 426 427 /* if sub device supports g_fmt, override the defaults */ 428 ret = v4l2_device_call_until_err(&vpfe_dev->v4l2_dev, 429 sdinfo->grp_id, video, g_fmt, &vpfe_dev->fmt); 430 431 if (ret && ret != -ENOIOCTLCMD) { 432 v4l2_err(&vpfe_dev->v4l2_dev, 433 "error in getting g_fmt from sub device\n"); 434 return ret; 435 } 436 437 /* Sets the values in CCDC */ 438 ret = vpfe_config_ccdc_image_format(vpfe_dev); 439 if (ret) 440 return ret; 441 442 /* Update the values of sizeimage and bytesperline */ 443 if (!ret) { 444 vpfe_dev->fmt.fmt.pix.bytesperline = 445 ccdc_dev->hw_ops.get_line_length(); 446 vpfe_dev->fmt.fmt.pix.sizeimage = 447 vpfe_dev->fmt.fmt.pix.bytesperline * 448 vpfe_dev->fmt.fmt.pix.height; 449 } 450 return ret; 451} 452 453static int vpfe_initialize_device(struct vpfe_device *vpfe_dev) 454{ 455 int ret = 0; 456 457 /* set first input of current subdevice as the current input */ 458 vpfe_dev->current_input = 0; 459 460 /* set default standard */ 461 vpfe_dev->std_index = 0; 462 463 /* Configure the default format information */ 464 ret = vpfe_config_image_format(vpfe_dev, 465 &vpfe_standards[vpfe_dev->std_index].std_id); 466 if (ret) 467 return ret; 468 469 /* now open the ccdc device to initialize it */ 470 mutex_lock(&ccdc_lock); 471 if (NULL == ccdc_dev) { 472 v4l2_err(&vpfe_dev->v4l2_dev, "ccdc device not registered\n"); 473 ret = -ENODEV; 474 goto unlock; 475 } 476 477 if (!try_module_get(ccdc_dev->owner)) { 478 v4l2_err(&vpfe_dev->v4l2_dev, "Couldn't lock ccdc module\n"); 479 ret = -ENODEV; 480 goto unlock; 481 } 482 ret = ccdc_dev->hw_ops.open(vpfe_dev->pdev); 483 if (!ret) 484 vpfe_dev->initialized = 1; 485unlock: 486 mutex_unlock(&ccdc_lock); 487 return ret; 488} 489 490/* 491 * vpfe_open : It creates object of file handle structure and 492 * stores it in private_data member of filepointer 493 */ 494static int vpfe_open(struct file *file) 495{ 496 struct vpfe_device *vpfe_dev = video_drvdata(file); 497 struct vpfe_fh *fh; 498 499 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_open\n"); 500 501 if (!vpfe_dev->cfg->num_subdevs) { 502 v4l2_err(&vpfe_dev->v4l2_dev, "No decoder registered\n"); 503 return -ENODEV; 504 } 505 506 /* Allocate memory for the file handle object */ 507 fh = kmalloc(sizeof(struct vpfe_fh), GFP_KERNEL); 508 if (NULL == fh) { 509 v4l2_err(&vpfe_dev->v4l2_dev, 510 "unable to allocate memory for file handle object\n"); 511 return -ENOMEM; 512 } 513 /* store pointer to fh in private_data member of file */ 514 file->private_data = fh; 515 fh->vpfe_dev = vpfe_dev; 516 mutex_lock(&vpfe_dev->lock); 517 /* If decoder is not initialized. initialize it */ 518 if (!vpfe_dev->initialized) { 519 if (vpfe_initialize_device(vpfe_dev)) { 520 mutex_unlock(&vpfe_dev->lock); 521 return -ENODEV; 522 } 523 } 524 /* Increment device usrs counter */ 525 vpfe_dev->usrs++; 526 /* Set io_allowed member to false */ 527 fh->io_allowed = 0; 528 /* Initialize priority of this instance to default priority */ 529 fh->prio = V4L2_PRIORITY_UNSET; 530 v4l2_prio_open(&vpfe_dev->prio, &fh->prio); 531 mutex_unlock(&vpfe_dev->lock); 532 return 0; 533} 534 535static void vpfe_schedule_next_buffer(struct vpfe_device *vpfe_dev) 536{ 537 unsigned long addr; 538 539 vpfe_dev->next_frm = list_entry(vpfe_dev->dma_queue.next, 540 struct videobuf_buffer, queue); 541 list_del(&vpfe_dev->next_frm->queue); 542 vpfe_dev->next_frm->state = VIDEOBUF_ACTIVE; 543 addr = videobuf_to_dma_contig(vpfe_dev->next_frm); 544 ccdc_dev->hw_ops.setfbaddr(addr); 545} 546 547static void vpfe_process_buffer_complete(struct vpfe_device *vpfe_dev) 548{ 549 struct timeval timevalue; 550 551 do_gettimeofday(&timevalue); 552 vpfe_dev->cur_frm->ts = timevalue; 553 vpfe_dev->cur_frm->state = VIDEOBUF_DONE; 554 vpfe_dev->cur_frm->size = vpfe_dev->fmt.fmt.pix.sizeimage; 555 wake_up_interruptible(&vpfe_dev->cur_frm->done); 556 vpfe_dev->cur_frm = vpfe_dev->next_frm; 557} 558 559/* ISR for VINT0*/ 560static irqreturn_t vpfe_isr(int irq, void *dev_id) 561{ 562 struct vpfe_device *vpfe_dev = dev_id; 563 enum v4l2_field field; 564 unsigned long addr; 565 int fid; 566 567 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "\nStarting vpfe_isr...\n"); 568 field = vpfe_dev->fmt.fmt.pix.field; 569 570 /* if streaming not started, don't do anything */ 571 if (!vpfe_dev->started) 572 return IRQ_HANDLED; 573 574 /* only for 6446 this will be applicable */ 575 if (NULL != ccdc_dev->hw_ops.reset) 576 ccdc_dev->hw_ops.reset(); 577 578 if (field == V4L2_FIELD_NONE) { 579 /* handle progressive frame capture */ 580 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, 581 "frame format is progressive...\n"); 582 if (vpfe_dev->cur_frm != vpfe_dev->next_frm) 583 vpfe_process_buffer_complete(vpfe_dev); 584 return IRQ_HANDLED; 585 } 586 587 /* interlaced or TB capture check which field we are in hardware */ 588 fid = ccdc_dev->hw_ops.getfid(); 589 590 /* switch the software maintained field id */ 591 vpfe_dev->field_id ^= 1; 592 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "field id = %x:%x.\n", 593 fid, vpfe_dev->field_id); 594 if (fid == vpfe_dev->field_id) { 595 /* we are in-sync here,continue */ 596 if (fid == 0) { 597 /* 598 * One frame is just being captured. If the next frame 599 * is available, release the current frame and move on 600 */ 601 if (vpfe_dev->cur_frm != vpfe_dev->next_frm) 602 vpfe_process_buffer_complete(vpfe_dev); 603 /* 604 * based on whether the two fields are stored 605 * interleavely or separately in memory, reconfigure 606 * the CCDC memory address 607 */ 608 if (field == V4L2_FIELD_SEQ_TB) { 609 addr = 610 videobuf_to_dma_contig(vpfe_dev->cur_frm); 611 addr += vpfe_dev->field_off; 612 ccdc_dev->hw_ops.setfbaddr(addr); 613 } 614 return IRQ_HANDLED; 615 } 616 /* 617 * if one field is just being captured configure 618 * the next frame get the next frame from the empty 619 * queue if no frame is available hold on to the 620 * current buffer 621 */ 622 spin_lock(&vpfe_dev->dma_queue_lock); 623 if (!list_empty(&vpfe_dev->dma_queue) && 624 vpfe_dev->cur_frm == vpfe_dev->next_frm) 625 vpfe_schedule_next_buffer(vpfe_dev); 626 spin_unlock(&vpfe_dev->dma_queue_lock); 627 } else if (fid == 0) { 628 /* 629 * out of sync. Recover from any hardware out-of-sync. 630 * May loose one frame 631 */ 632 vpfe_dev->field_id = fid; 633 } 634 return IRQ_HANDLED; 635} 636 637/* vdint1_isr - isr handler for VINT1 interrupt */ 638static irqreturn_t vdint1_isr(int irq, void *dev_id) 639{ 640 struct vpfe_device *vpfe_dev = dev_id; 641 642 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "\nInside vdint1_isr...\n"); 643 644 /* if streaming not started, don't do anything */ 645 if (!vpfe_dev->started) 646 return IRQ_HANDLED; 647 648 spin_lock(&vpfe_dev->dma_queue_lock); 649 if ((vpfe_dev->fmt.fmt.pix.field == V4L2_FIELD_NONE) && 650 !list_empty(&vpfe_dev->dma_queue) && 651 vpfe_dev->cur_frm == vpfe_dev->next_frm) 652 vpfe_schedule_next_buffer(vpfe_dev); 653 spin_unlock(&vpfe_dev->dma_queue_lock); 654 return IRQ_HANDLED; 655} 656 657static void vpfe_detach_irq(struct vpfe_device *vpfe_dev) 658{ 659 enum ccdc_frmfmt frame_format; 660 661 frame_format = ccdc_dev->hw_ops.get_frame_format(); 662 if (frame_format == CCDC_FRMFMT_PROGRESSIVE) 663 free_irq(IRQ_VDINT1, vpfe_dev); 664} 665 666static int vpfe_attach_irq(struct vpfe_device *vpfe_dev) 667{ 668 enum ccdc_frmfmt frame_format; 669 670 frame_format = ccdc_dev->hw_ops.get_frame_format(); 671 if (frame_format == CCDC_FRMFMT_PROGRESSIVE) { 672 return request_irq(vpfe_dev->ccdc_irq1, vdint1_isr, 673 IRQF_DISABLED, "vpfe_capture1", 674 vpfe_dev); 675 } 676 return 0; 677} 678 679/* vpfe_stop_ccdc_capture: stop streaming in ccdc/isif */ 680static void vpfe_stop_ccdc_capture(struct vpfe_device *vpfe_dev) 681{ 682 vpfe_dev->started = 0; 683 ccdc_dev->hw_ops.enable(0); 684 if (ccdc_dev->hw_ops.enable_out_to_sdram) 685 ccdc_dev->hw_ops.enable_out_to_sdram(0); 686} 687 688/* 689 * vpfe_release : This function deletes buffer queue, frees the 690 * buffers and the vpfe file handle 691 */ 692static int vpfe_release(struct file *file) 693{ 694 struct vpfe_device *vpfe_dev = video_drvdata(file); 695 struct vpfe_fh *fh = file->private_data; 696 struct vpfe_subdev_info *sdinfo; 697 int ret; 698 699 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_release\n"); 700 701 /* Get the device lock */ 702 mutex_lock(&vpfe_dev->lock); 703 /* if this instance is doing IO */ 704 if (fh->io_allowed) { 705 if (vpfe_dev->started) { 706 sdinfo = vpfe_dev->current_subdev; 707 ret = v4l2_device_call_until_err(&vpfe_dev->v4l2_dev, 708 sdinfo->grp_id, 709 video, s_stream, 0); 710 if (ret && (ret != -ENOIOCTLCMD)) 711 v4l2_err(&vpfe_dev->v4l2_dev, 712 "stream off failed in subdev\n"); 713 vpfe_stop_ccdc_capture(vpfe_dev); 714 vpfe_detach_irq(vpfe_dev); 715 videobuf_streamoff(&vpfe_dev->buffer_queue); 716 } 717 vpfe_dev->io_usrs = 0; 718 vpfe_dev->numbuffers = config_params.numbuffers; 719 } 720 721 /* Decrement device usrs counter */ 722 vpfe_dev->usrs--; 723 /* Close the priority */ 724 v4l2_prio_close(&vpfe_dev->prio, &fh->prio); 725 /* If this is the last file handle */ 726 if (!vpfe_dev->usrs) { 727 vpfe_dev->initialized = 0; 728 if (ccdc_dev->hw_ops.close) 729 ccdc_dev->hw_ops.close(vpfe_dev->pdev); 730 module_put(ccdc_dev->owner); 731 } 732 mutex_unlock(&vpfe_dev->lock); 733 file->private_data = NULL; 734 /* Free memory allocated to file handle object */ 735 kfree(fh); 736 return 0; 737} 738 739/* 740 * vpfe_mmap : It is used to map kernel space buffers 741 * into user spaces 742 */ 743static int vpfe_mmap(struct file *file, struct vm_area_struct *vma) 744{ 745 /* Get the device object and file handle object */ 746 struct vpfe_device *vpfe_dev = video_drvdata(file); 747 748 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_mmap\n"); 749 750 return videobuf_mmap_mapper(&vpfe_dev->buffer_queue, vma); 751} 752 753/* 754 * vpfe_poll: It is used for select/poll system call 755 */ 756static unsigned int vpfe_poll(struct file *file, poll_table *wait) 757{ 758 struct vpfe_device *vpfe_dev = video_drvdata(file); 759 760 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_poll\n"); 761 762 if (vpfe_dev->started) 763 return videobuf_poll_stream(file, 764 &vpfe_dev->buffer_queue, wait); 765 return 0; 766} 767 768/* vpfe capture driver file operations */ 769static const struct v4l2_file_operations vpfe_fops = { 770 .owner = THIS_MODULE, 771 .open = vpfe_open, 772 .release = vpfe_release, 773 .unlocked_ioctl = video_ioctl2, 774 .mmap = vpfe_mmap, 775 .poll = vpfe_poll 776}; 777 778/* 779 * vpfe_check_format() 780 * This function adjust the input pixel format as per hardware 781 * capabilities and update the same in pixfmt. 782 * Following algorithm used :- 783 * 784 * If given pixformat is not in the vpfe list of pix formats or not 785 * supported by the hardware, current value of pixformat in the device 786 * is used 787 * If given field is not supported, then current field is used. If field 788 * is different from current, then it is matched with that from sub device. 789 * Minimum height is 2 lines for interlaced or tb field and 1 line for 790 * progressive. Maximum height is clamped to active active lines of scan 791 * Minimum width is 32 bytes in memory and width is clamped to active 792 * pixels of scan. 793 * bytesperline is a multiple of 32. 794 */ 795static const struct vpfe_pixel_format * 796 vpfe_check_format(struct vpfe_device *vpfe_dev, 797 struct v4l2_pix_format *pixfmt) 798{ 799 u32 min_height = 1, min_width = 32, max_width, max_height; 800 const struct vpfe_pixel_format *vpfe_pix_fmt; 801 u32 pix; 802 int temp, found; 803 804 vpfe_pix_fmt = vpfe_lookup_pix_format(pixfmt->pixelformat); 805 if (NULL == vpfe_pix_fmt) { 806 /* 807 * use current pixel format in the vpfe device. We 808 * will find this pix format in the table 809 */ 810 pixfmt->pixelformat = vpfe_dev->fmt.fmt.pix.pixelformat; 811 vpfe_pix_fmt = vpfe_lookup_pix_format(pixfmt->pixelformat); 812 } 813 814 /* check if hw supports it */ 815 temp = 0; 816 found = 0; 817 while (ccdc_dev->hw_ops.enum_pix(&pix, temp) >= 0) { 818 if (vpfe_pix_fmt->fmtdesc.pixelformat == pix) { 819 found = 1; 820 break; 821 } 822 temp++; 823 } 824 825 if (!found) { 826 /* use current pixel format */ 827 pixfmt->pixelformat = vpfe_dev->fmt.fmt.pix.pixelformat; 828 /* 829 * Since this is currently used in the vpfe device, we 830 * will find this pix format in the table 831 */ 832 vpfe_pix_fmt = vpfe_lookup_pix_format(pixfmt->pixelformat); 833 } 834 835 /* check what field format is supported */ 836 if (pixfmt->field == V4L2_FIELD_ANY) { 837 /* if field is any, use current value as default */ 838 pixfmt->field = vpfe_dev->fmt.fmt.pix.field; 839 } 840 841 /* 842 * if field is not same as current field in the vpfe device 843 * try matching the field with the sub device field 844 */ 845 if (vpfe_dev->fmt.fmt.pix.field != pixfmt->field) { 846 /* 847 * If field value is not in the supported fields, use current 848 * field used in the device as default 849 */ 850 switch (pixfmt->field) { 851 case V4L2_FIELD_INTERLACED: 852 case V4L2_FIELD_SEQ_TB: 853 /* if sub device is supporting progressive, use that */ 854 if (!vpfe_dev->std_info.frame_format) 855 pixfmt->field = V4L2_FIELD_NONE; 856 break; 857 case V4L2_FIELD_NONE: 858 if (vpfe_dev->std_info.frame_format) 859 pixfmt->field = V4L2_FIELD_INTERLACED; 860 break; 861 862 default: 863 /* use current field as default */ 864 pixfmt->field = vpfe_dev->fmt.fmt.pix.field; 865 break; 866 } 867 } 868 869 /* Now adjust image resolutions supported */ 870 if (pixfmt->field == V4L2_FIELD_INTERLACED || 871 pixfmt->field == V4L2_FIELD_SEQ_TB) 872 min_height = 2; 873 874 max_width = vpfe_dev->std_info.active_pixels; 875 max_height = vpfe_dev->std_info.active_lines; 876 min_width /= vpfe_pix_fmt->bpp; 877 878 v4l2_info(&vpfe_dev->v4l2_dev, "width = %d, height = %d, bpp = %d\n", 879 pixfmt->width, pixfmt->height, vpfe_pix_fmt->bpp); 880 881 pixfmt->width = clamp((pixfmt->width), min_width, max_width); 882 pixfmt->height = clamp((pixfmt->height), min_height, max_height); 883 884 /* If interlaced, adjust height to be a multiple of 2 */ 885 if (pixfmt->field == V4L2_FIELD_INTERLACED) 886 pixfmt->height &= (~1); 887 /* 888 * recalculate bytesperline and sizeimage since width 889 * and height might have changed 890 */ 891 pixfmt->bytesperline = (((pixfmt->width * vpfe_pix_fmt->bpp) + 31) 892 & ~31); 893 if (pixfmt->pixelformat == V4L2_PIX_FMT_NV12) 894 pixfmt->sizeimage = 895 pixfmt->bytesperline * pixfmt->height + 896 ((pixfmt->bytesperline * pixfmt->height) >> 1); 897 else 898 pixfmt->sizeimage = pixfmt->bytesperline * pixfmt->height; 899 900 v4l2_info(&vpfe_dev->v4l2_dev, "adjusted width = %d, height =" 901 " %d, bpp = %d, bytesperline = %d, sizeimage = %d\n", 902 pixfmt->width, pixfmt->height, vpfe_pix_fmt->bpp, 903 pixfmt->bytesperline, pixfmt->sizeimage); 904 return vpfe_pix_fmt; 905} 906 907static int vpfe_querycap(struct file *file, void *priv, 908 struct v4l2_capability *cap) 909{ 910 struct vpfe_device *vpfe_dev = video_drvdata(file); 911 912 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_querycap\n"); 913 914 cap->version = VPFE_CAPTURE_VERSION_CODE; 915 cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; 916 strlcpy(cap->driver, CAPTURE_DRV_NAME, sizeof(cap->driver)); 917 strlcpy(cap->bus_info, "VPFE", sizeof(cap->bus_info)); 918 strlcpy(cap->card, vpfe_dev->cfg->card_name, sizeof(cap->card)); 919 return 0; 920} 921 922static int vpfe_g_fmt_vid_cap(struct file *file, void *priv, 923 struct v4l2_format *fmt) 924{ 925 struct vpfe_device *vpfe_dev = video_drvdata(file); 926 int ret = 0; 927 928 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_g_fmt_vid_cap\n"); 929 /* Fill in the information about format */ 930 *fmt = vpfe_dev->fmt; 931 return ret; 932} 933 934static int vpfe_enum_fmt_vid_cap(struct file *file, void *priv, 935 struct v4l2_fmtdesc *fmt) 936{ 937 struct vpfe_device *vpfe_dev = video_drvdata(file); 938 const struct vpfe_pixel_format *pix_fmt; 939 int temp_index; 940 u32 pix; 941 942 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_enum_fmt_vid_cap\n"); 943 944 if (ccdc_dev->hw_ops.enum_pix(&pix, fmt->index) < 0) 945 return -EINVAL; 946 947 /* Fill in the information about format */ 948 pix_fmt = vpfe_lookup_pix_format(pix); 949 if (NULL != pix_fmt) { 950 temp_index = fmt->index; 951 *fmt = pix_fmt->fmtdesc; 952 fmt->index = temp_index; 953 return 0; 954 } 955 return -EINVAL; 956} 957 958static int vpfe_s_fmt_vid_cap(struct file *file, void *priv, 959 struct v4l2_format *fmt) 960{ 961 struct vpfe_device *vpfe_dev = video_drvdata(file); 962 const struct vpfe_pixel_format *pix_fmts; 963 int ret = 0; 964 965 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_s_fmt_vid_cap\n"); 966 967 /* If streaming is started, return error */ 968 if (vpfe_dev->started) { 969 v4l2_err(&vpfe_dev->v4l2_dev, "Streaming is started\n"); 970 return -EBUSY; 971 } 972 973 /* Check for valid frame format */ 974 pix_fmts = vpfe_check_format(vpfe_dev, &fmt->fmt.pix); 975 976 if (NULL == pix_fmts) 977 return -EINVAL; 978 979 /* store the pixel format in the device object */ 980 ret = mutex_lock_interruptible(&vpfe_dev->lock); 981 if (ret) 982 return ret; 983 984 /* First detach any IRQ if currently attached */ 985 vpfe_detach_irq(vpfe_dev); 986 vpfe_dev->fmt = *fmt; 987 /* set image capture parameters in the ccdc */ 988 ret = vpfe_config_ccdc_image_format(vpfe_dev); 989 mutex_unlock(&vpfe_dev->lock); 990 return ret; 991} 992 993static int vpfe_try_fmt_vid_cap(struct file *file, void *priv, 994 struct v4l2_format *f) 995{ 996 struct vpfe_device *vpfe_dev = video_drvdata(file); 997 const struct vpfe_pixel_format *pix_fmts; 998 999 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_try_fmt_vid_cap\n"); 1000 1001 pix_fmts = vpfe_check_format(vpfe_dev, &f->fmt.pix); 1002 if (NULL == pix_fmts) 1003 return -EINVAL; 1004 return 0; 1005} 1006 1007/* 1008 * vpfe_get_subdev_input_index - Get subdev index and subdev input index for a 1009 * given app input index 1010 */ 1011static int vpfe_get_subdev_input_index(struct vpfe_device *vpfe_dev, 1012 int *subdev_index, 1013 int *subdev_input_index, 1014 int app_input_index) 1015{ 1016 struct vpfe_config *cfg = vpfe_dev->cfg; 1017 struct vpfe_subdev_info *sdinfo; 1018 int i, j = 0; 1019 1020 for (i = 0; i < cfg->num_subdevs; i++) { 1021 sdinfo = &cfg->sub_devs[i]; 1022 if (app_input_index < (j + sdinfo->num_inputs)) { 1023 *subdev_index = i; 1024 *subdev_input_index = app_input_index - j; 1025 return 0; 1026 } 1027 j += sdinfo->num_inputs; 1028 } 1029 return -EINVAL; 1030} 1031 1032/* 1033 * vpfe_get_app_input - Get app input index for a given subdev input index 1034 * driver stores the input index of the current sub device and translate it 1035 * when application request the current input 1036 */ 1037static int vpfe_get_app_input_index(struct vpfe_device *vpfe_dev, 1038 int *app_input_index) 1039{ 1040 struct vpfe_config *cfg = vpfe_dev->cfg; 1041 struct vpfe_subdev_info *sdinfo; 1042 int i, j = 0; 1043 1044 for (i = 0; i < cfg->num_subdevs; i++) { 1045 sdinfo = &cfg->sub_devs[i]; 1046 if (!strcmp(sdinfo->name, vpfe_dev->current_subdev->name)) { 1047 if (vpfe_dev->current_input >= sdinfo->num_inputs) 1048 return -1; 1049 *app_input_index = j + vpfe_dev->current_input; 1050 return 0; 1051 } 1052 j += sdinfo->num_inputs; 1053 } 1054 return -EINVAL; 1055} 1056 1057static int vpfe_enum_input(struct file *file, void *priv, 1058 struct v4l2_input *inp) 1059{ 1060 struct vpfe_device *vpfe_dev = video_drvdata(file); 1061 struct vpfe_subdev_info *sdinfo; 1062 int subdev, index ; 1063 1064 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_enum_input\n"); 1065 1066 if (vpfe_get_subdev_input_index(vpfe_dev, 1067 &subdev, 1068 &index, 1069 inp->index) < 0) { 1070 v4l2_err(&vpfe_dev->v4l2_dev, "input information not found" 1071 " for the subdev\n"); 1072 return -EINVAL; 1073 } 1074 sdinfo = &vpfe_dev->cfg->sub_devs[subdev]; 1075 memcpy(inp, &sdinfo->inputs[index], sizeof(struct v4l2_input)); 1076 return 0; 1077} 1078 1079static int vpfe_g_input(struct file *file, void *priv, unsigned int *index) 1080{ 1081 struct vpfe_device *vpfe_dev = video_drvdata(file); 1082 1083 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_g_input\n"); 1084 1085 return vpfe_get_app_input_index(vpfe_dev, index); 1086} 1087 1088 1089static int vpfe_s_input(struct file *file, void *priv, unsigned int index) 1090{ 1091 struct vpfe_device *vpfe_dev = video_drvdata(file); 1092 struct vpfe_subdev_info *sdinfo; 1093 int subdev_index, inp_index; 1094 struct vpfe_route *route; 1095 u32 input = 0, output = 0; 1096 int ret = -EINVAL; 1097 1098 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_s_input\n"); 1099 1100 ret = mutex_lock_interruptible(&vpfe_dev->lock); 1101 if (ret) 1102 return ret; 1103 1104 /* 1105 * If streaming is started return device busy 1106 * error 1107 */ 1108 if (vpfe_dev->started) { 1109 v4l2_err(&vpfe_dev->v4l2_dev, "Streaming is on\n"); 1110 ret = -EBUSY; 1111 goto unlock_out; 1112 } 1113 1114 if (vpfe_get_subdev_input_index(vpfe_dev, 1115 &subdev_index, 1116 &inp_index, 1117 index) < 0) { 1118 v4l2_err(&vpfe_dev->v4l2_dev, "invalid input index\n"); 1119 goto unlock_out; 1120 } 1121 1122 sdinfo = &vpfe_dev->cfg->sub_devs[subdev_index]; 1123 route = &sdinfo->routes[inp_index]; 1124 if (route && sdinfo->can_route) { 1125 input = route->input; 1126 output = route->output; 1127 } 1128 1129 ret = v4l2_device_call_until_err(&vpfe_dev->v4l2_dev, sdinfo->grp_id, 1130 video, s_routing, input, output, 0); 1131 1132 if (ret) { 1133 v4l2_err(&vpfe_dev->v4l2_dev, 1134 "vpfe_doioctl:error in setting input in decoder\n"); 1135 ret = -EINVAL; 1136 goto unlock_out; 1137 } 1138 vpfe_dev->current_subdev = sdinfo; 1139 vpfe_dev->current_input = index; 1140 vpfe_dev->std_index = 0; 1141 1142 /* set the bus/interface parameter for the sub device in ccdc */ 1143 ret = ccdc_dev->hw_ops.set_hw_if_params(&sdinfo->ccdc_if_params); 1144 if (ret) 1145 goto unlock_out; 1146 1147 /* set the default image parameters in the device */ 1148 ret = vpfe_config_image_format(vpfe_dev, 1149 &vpfe_standards[vpfe_dev->std_index].std_id); 1150unlock_out: 1151 mutex_unlock(&vpfe_dev->lock); 1152 return ret; 1153} 1154 1155static int vpfe_querystd(struct file *file, void *priv, v4l2_std_id *std_id) 1156{ 1157 struct vpfe_device *vpfe_dev = video_drvdata(file); 1158 struct vpfe_subdev_info *sdinfo; 1159 int ret = 0; 1160 1161 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_querystd\n"); 1162 1163 ret = mutex_lock_interruptible(&vpfe_dev->lock); 1164 sdinfo = vpfe_dev->current_subdev; 1165 if (ret) 1166 return ret; 1167 /* Call querystd function of decoder device */ 1168 ret = v4l2_device_call_until_err(&vpfe_dev->v4l2_dev, sdinfo->grp_id, 1169 video, querystd, std_id); 1170 mutex_unlock(&vpfe_dev->lock); 1171 return ret; 1172} 1173 1174static int vpfe_s_std(struct file *file, void *priv, v4l2_std_id *std_id) 1175{ 1176 struct vpfe_device *vpfe_dev = video_drvdata(file); 1177 struct vpfe_subdev_info *sdinfo; 1178 int ret = 0; 1179 1180 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_s_std\n"); 1181 1182 /* Call decoder driver function to set the standard */ 1183 ret = mutex_lock_interruptible(&vpfe_dev->lock); 1184 if (ret) 1185 return ret; 1186 1187 sdinfo = vpfe_dev->current_subdev; 1188 /* If streaming is started, return device busy error */ 1189 if (vpfe_dev->started) { 1190 v4l2_err(&vpfe_dev->v4l2_dev, "streaming is started\n"); 1191 ret = -EBUSY; 1192 goto unlock_out; 1193 } 1194 1195 ret = v4l2_device_call_until_err(&vpfe_dev->v4l2_dev, sdinfo->grp_id, 1196 core, s_std, *std_id); 1197 if (ret < 0) { 1198 v4l2_err(&vpfe_dev->v4l2_dev, "Failed to set standard\n"); 1199 goto unlock_out; 1200 } 1201 ret = vpfe_config_image_format(vpfe_dev, std_id); 1202 1203unlock_out: 1204 mutex_unlock(&vpfe_dev->lock); 1205 return ret; 1206} 1207 1208static int vpfe_g_std(struct file *file, void *priv, v4l2_std_id *std_id) 1209{ 1210 struct vpfe_device *vpfe_dev = video_drvdata(file); 1211 1212 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_g_std\n"); 1213 1214 *std_id = vpfe_standards[vpfe_dev->std_index].std_id; 1215 return 0; 1216} 1217/* 1218 * Videobuf operations 1219 */ 1220static int vpfe_videobuf_setup(struct videobuf_queue *vq, 1221 unsigned int *count, 1222 unsigned int *size) 1223{ 1224 struct vpfe_fh *fh = vq->priv_data; 1225 struct vpfe_device *vpfe_dev = fh->vpfe_dev; 1226 1227 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_buffer_setup\n"); 1228 *size = config_params.device_bufsize; 1229 1230 if (*count < config_params.min_numbuffers) 1231 *count = config_params.min_numbuffers; 1232 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, 1233 "count=%d, size=%d\n", *count, *size); 1234 return 0; 1235} 1236 1237static int vpfe_videobuf_prepare(struct videobuf_queue *vq, 1238 struct videobuf_buffer *vb, 1239 enum v4l2_field field) 1240{ 1241 struct vpfe_fh *fh = vq->priv_data; 1242 struct vpfe_device *vpfe_dev = fh->vpfe_dev; 1243 1244 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_buffer_prepare\n"); 1245 1246 /* If buffer is not initialized, initialize it */ 1247 if (VIDEOBUF_NEEDS_INIT == vb->state) { 1248 vb->width = vpfe_dev->fmt.fmt.pix.width; 1249 vb->height = vpfe_dev->fmt.fmt.pix.height; 1250 vb->size = vpfe_dev->fmt.fmt.pix.sizeimage; 1251 vb->field = field; 1252 } 1253 vb->state = VIDEOBUF_PREPARED; 1254 return 0; 1255} 1256 1257static void vpfe_videobuf_queue(struct videobuf_queue *vq, 1258 struct videobuf_buffer *vb) 1259{ 1260 /* Get the file handle object and device object */ 1261 struct vpfe_fh *fh = vq->priv_data; 1262 struct vpfe_device *vpfe_dev = fh->vpfe_dev; 1263 unsigned long flags; 1264 1265 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_buffer_queue\n"); 1266 1267 /* add the buffer to the DMA queue */ 1268 spin_lock_irqsave(&vpfe_dev->dma_queue_lock, flags); 1269 list_add_tail(&vb->queue, &vpfe_dev->dma_queue); 1270 spin_unlock_irqrestore(&vpfe_dev->dma_queue_lock, flags); 1271 1272 /* Change state of the buffer */ 1273 vb->state = VIDEOBUF_QUEUED; 1274} 1275 1276static void vpfe_videobuf_release(struct videobuf_queue *vq, 1277 struct videobuf_buffer *vb) 1278{ 1279 struct vpfe_fh *fh = vq->priv_data; 1280 struct vpfe_device *vpfe_dev = fh->vpfe_dev; 1281 unsigned long flags; 1282 1283 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_videobuf_release\n"); 1284 1285 /* 1286 * We need to flush the buffer from the dma queue since 1287 * they are de-allocated 1288 */ 1289 spin_lock_irqsave(&vpfe_dev->dma_queue_lock, flags); 1290 INIT_LIST_HEAD(&vpfe_dev->dma_queue); 1291 spin_unlock_irqrestore(&vpfe_dev->dma_queue_lock, flags); 1292 videobuf_dma_contig_free(vq, vb); 1293 vb->state = VIDEOBUF_NEEDS_INIT; 1294} 1295 1296static struct videobuf_queue_ops vpfe_videobuf_qops = { 1297 .buf_setup = vpfe_videobuf_setup, 1298 .buf_prepare = vpfe_videobuf_prepare, 1299 .buf_queue = vpfe_videobuf_queue, 1300 .buf_release = vpfe_videobuf_release, 1301}; 1302 1303/* 1304 * vpfe_reqbufs. currently support REQBUF only once opening 1305 * the device. 1306 */ 1307static int vpfe_reqbufs(struct file *file, void *priv, 1308 struct v4l2_requestbuffers *req_buf) 1309{ 1310 struct vpfe_device *vpfe_dev = video_drvdata(file); 1311 struct vpfe_fh *fh = file->private_data; 1312 int ret = 0; 1313 1314 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_reqbufs\n"); 1315 1316 if (V4L2_BUF_TYPE_VIDEO_CAPTURE != req_buf->type) { 1317 v4l2_err(&vpfe_dev->v4l2_dev, "Invalid buffer type\n"); 1318 return -EINVAL; 1319 } 1320 1321 if (V4L2_MEMORY_USERPTR == req_buf->memory) { 1322 /* we don't support user ptr IO */ 1323 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_reqbufs:" 1324 " USERPTR IO not supported\n"); 1325 return -EINVAL; 1326 } 1327 1328 ret = mutex_lock_interruptible(&vpfe_dev->lock); 1329 if (ret) 1330 return ret; 1331 1332 if (vpfe_dev->io_usrs != 0) { 1333 v4l2_err(&vpfe_dev->v4l2_dev, "Only one IO user allowed\n"); 1334 ret = -EBUSY; 1335 goto unlock_out; 1336 } 1337 1338 vpfe_dev->memory = req_buf->memory; 1339 videobuf_queue_dma_contig_init(&vpfe_dev->buffer_queue, 1340 &vpfe_videobuf_qops, 1341 vpfe_dev->pdev, 1342 &vpfe_dev->irqlock, 1343 req_buf->type, 1344 vpfe_dev->fmt.fmt.pix.field, 1345 sizeof(struct videobuf_buffer), 1346 fh); 1347 1348 fh->io_allowed = 1; 1349 vpfe_dev->io_usrs = 1; 1350 INIT_LIST_HEAD(&vpfe_dev->dma_queue); 1351 ret = videobuf_reqbufs(&vpfe_dev->buffer_queue, req_buf); 1352unlock_out: 1353 mutex_unlock(&vpfe_dev->lock); 1354 return ret; 1355} 1356 1357static int vpfe_querybuf(struct file *file, void *priv, 1358 struct v4l2_buffer *buf) 1359{ 1360 struct vpfe_device *vpfe_dev = video_drvdata(file); 1361 1362 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_querybuf\n"); 1363 1364 if (V4L2_BUF_TYPE_VIDEO_CAPTURE != buf->type) { 1365 v4l2_err(&vpfe_dev->v4l2_dev, "Invalid buf type\n"); 1366 return -EINVAL; 1367 } 1368 1369 if (vpfe_dev->memory != V4L2_MEMORY_MMAP) { 1370 v4l2_err(&vpfe_dev->v4l2_dev, "Invalid memory\n"); 1371 return -EINVAL; 1372 } 1373 /* Call videobuf_querybuf to get information */ 1374 return videobuf_querybuf(&vpfe_dev->buffer_queue, buf); 1375} 1376 1377static int vpfe_qbuf(struct file *file, void *priv, 1378 struct v4l2_buffer *p) 1379{ 1380 struct vpfe_device *vpfe_dev = video_drvdata(file); 1381 struct vpfe_fh *fh = file->private_data; 1382 1383 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_qbuf\n"); 1384 1385 if (V4L2_BUF_TYPE_VIDEO_CAPTURE != p->type) { 1386 v4l2_err(&vpfe_dev->v4l2_dev, "Invalid buf type\n"); 1387 return -EINVAL; 1388 } 1389 1390 /* 1391 * If this file handle is not allowed to do IO, 1392 * return error 1393 */ 1394 if (!fh->io_allowed) { 1395 v4l2_err(&vpfe_dev->v4l2_dev, "fh->io_allowed\n"); 1396 return -EACCES; 1397 } 1398 return videobuf_qbuf(&vpfe_dev->buffer_queue, p); 1399} 1400 1401static int vpfe_dqbuf(struct file *file, void *priv, 1402 struct v4l2_buffer *buf) 1403{ 1404 struct vpfe_device *vpfe_dev = video_drvdata(file); 1405 1406 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_dqbuf\n"); 1407 1408 if (V4L2_BUF_TYPE_VIDEO_CAPTURE != buf->type) { 1409 v4l2_err(&vpfe_dev->v4l2_dev, "Invalid buf type\n"); 1410 return -EINVAL; 1411 } 1412 return videobuf_dqbuf(&vpfe_dev->buffer_queue, 1413 buf, file->f_flags & O_NONBLOCK); 1414} 1415 1416/* 1417 * vpfe_calculate_offsets : This function calculates buffers offset 1418 * for top and bottom field 1419 */ 1420static void vpfe_calculate_offsets(struct vpfe_device *vpfe_dev) 1421{ 1422 struct v4l2_rect image_win; 1423 1424 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_calculate_offsets\n"); 1425 1426 ccdc_dev->hw_ops.get_image_window(&image_win); 1427 vpfe_dev->field_off = image_win.height * image_win.width; 1428} 1429 1430/* vpfe_start_ccdc_capture: start streaming in ccdc/isif */ 1431static void vpfe_start_ccdc_capture(struct vpfe_device *vpfe_dev) 1432{ 1433 ccdc_dev->hw_ops.enable(1); 1434 if (ccdc_dev->hw_ops.enable_out_to_sdram) 1435 ccdc_dev->hw_ops.enable_out_to_sdram(1); 1436 vpfe_dev->started = 1; 1437} 1438 1439/* 1440 * vpfe_streamon. Assume the DMA queue is not empty. 1441 * application is expected to call QBUF before calling 1442 * this ioctl. If not, driver returns error 1443 */ 1444static int vpfe_streamon(struct file *file, void *priv, 1445 enum v4l2_buf_type buf_type) 1446{ 1447 struct vpfe_device *vpfe_dev = video_drvdata(file); 1448 struct vpfe_fh *fh = file->private_data; 1449 struct vpfe_subdev_info *sdinfo; 1450 unsigned long addr; 1451 int ret = 0; 1452 1453 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_streamon\n"); 1454 1455 if (V4L2_BUF_TYPE_VIDEO_CAPTURE != buf_type) { 1456 v4l2_err(&vpfe_dev->v4l2_dev, "Invalid buf type\n"); 1457 return -EINVAL; 1458 } 1459 1460 /* If file handle is not allowed IO, return error */ 1461 if (!fh->io_allowed) { 1462 v4l2_err(&vpfe_dev->v4l2_dev, "fh->io_allowed\n"); 1463 return -EACCES; 1464 } 1465 1466 sdinfo = vpfe_dev->current_subdev; 1467 ret = v4l2_device_call_until_err(&vpfe_dev->v4l2_dev, sdinfo->grp_id, 1468 video, s_stream, 1); 1469 1470 if (ret && (ret != -ENOIOCTLCMD)) { 1471 v4l2_err(&vpfe_dev->v4l2_dev, "stream on failed in subdev\n"); 1472 return -EINVAL; 1473 } 1474 1475 /* If buffer queue is empty, return error */ 1476 if (list_empty(&vpfe_dev->buffer_queue.stream)) { 1477 v4l2_err(&vpfe_dev->v4l2_dev, "buffer queue is empty\n"); 1478 return -EIO; 1479 } 1480 1481 /* Call videobuf_streamon to start streaming * in videobuf */ 1482 ret = videobuf_streamon(&vpfe_dev->buffer_queue); 1483 if (ret) 1484 return ret; 1485 1486 1487 ret = mutex_lock_interruptible(&vpfe_dev->lock); 1488 if (ret) 1489 goto streamoff; 1490 /* Get the next frame from the buffer queue */ 1491 vpfe_dev->next_frm = list_entry(vpfe_dev->dma_queue.next, 1492 struct videobuf_buffer, queue); 1493 vpfe_dev->cur_frm = vpfe_dev->next_frm; 1494 /* Remove buffer from the buffer queue */ 1495 list_del(&vpfe_dev->cur_frm->queue); 1496 /* Mark state of the current frame to active */ 1497 vpfe_dev->cur_frm->state = VIDEOBUF_ACTIVE; 1498 /* Initialize field_id and started member */ 1499 vpfe_dev->field_id = 0; 1500 addr = videobuf_to_dma_contig(vpfe_dev->cur_frm); 1501 1502 /* Calculate field offset */ 1503 vpfe_calculate_offsets(vpfe_dev); 1504 1505 if (vpfe_attach_irq(vpfe_dev) < 0) { 1506 v4l2_err(&vpfe_dev->v4l2_dev, 1507 "Error in attaching interrupt handle\n"); 1508 ret = -EFAULT; 1509 goto unlock_out; 1510 } 1511 if (ccdc_dev->hw_ops.configure() < 0) { 1512 v4l2_err(&vpfe_dev->v4l2_dev, 1513 "Error in configuring ccdc\n"); 1514 ret = -EINVAL; 1515 goto unlock_out; 1516 } 1517 ccdc_dev->hw_ops.setfbaddr((unsigned long)(addr)); 1518 vpfe_start_ccdc_capture(vpfe_dev); 1519 mutex_unlock(&vpfe_dev->lock); 1520 return ret; 1521unlock_out: 1522 mutex_unlock(&vpfe_dev->lock); 1523streamoff: 1524 ret = videobuf_streamoff(&vpfe_dev->buffer_queue); 1525 return ret; 1526} 1527 1528static int vpfe_streamoff(struct file *file, void *priv, 1529 enum v4l2_buf_type buf_type) 1530{ 1531 struct vpfe_device *vpfe_dev = video_drvdata(file); 1532 struct vpfe_fh *fh = file->private_data; 1533 struct vpfe_subdev_info *sdinfo; 1534 int ret = 0; 1535 1536 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_streamoff\n"); 1537 1538 if (V4L2_BUF_TYPE_VIDEO_CAPTURE != buf_type) { 1539 v4l2_err(&vpfe_dev->v4l2_dev, "Invalid buf type\n"); 1540 return -EINVAL; 1541 } 1542 1543 /* If io is allowed for this file handle, return error */ 1544 if (!fh->io_allowed) { 1545 v4l2_err(&vpfe_dev->v4l2_dev, "fh->io_allowed\n"); 1546 return -EACCES; 1547 } 1548 1549 /* If streaming is not started, return error */ 1550 if (!vpfe_dev->started) { 1551 v4l2_err(&vpfe_dev->v4l2_dev, "device started\n"); 1552 return -EINVAL; 1553 } 1554 1555 ret = mutex_lock_interruptible(&vpfe_dev->lock); 1556 if (ret) 1557 return ret; 1558 1559 vpfe_stop_ccdc_capture(vpfe_dev); 1560 vpfe_detach_irq(vpfe_dev); 1561 1562 sdinfo = vpfe_dev->current_subdev; 1563 ret = v4l2_device_call_until_err(&vpfe_dev->v4l2_dev, sdinfo->grp_id, 1564 video, s_stream, 0); 1565 1566 if (ret && (ret != -ENOIOCTLCMD)) 1567 v4l2_err(&vpfe_dev->v4l2_dev, "stream off failed in subdev\n"); 1568 ret = videobuf_streamoff(&vpfe_dev->buffer_queue); 1569 mutex_unlock(&vpfe_dev->lock); 1570 return ret; 1571} 1572 1573static int vpfe_cropcap(struct file *file, void *priv, 1574 struct v4l2_cropcap *crop) 1575{ 1576 struct vpfe_device *vpfe_dev = video_drvdata(file); 1577 1578 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_cropcap\n"); 1579 1580 if (vpfe_dev->std_index >= ARRAY_SIZE(vpfe_standards)) 1581 return -EINVAL; 1582 1583 memset(crop, 0, sizeof(struct v4l2_cropcap)); 1584 crop->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; 1585 crop->bounds.width = crop->defrect.width = 1586 vpfe_standards[vpfe_dev->std_index].width; 1587 crop->bounds.height = crop->defrect.height = 1588 vpfe_standards[vpfe_dev->std_index].height; 1589 crop->pixelaspect = vpfe_standards[vpfe_dev->std_index].pixelaspect; 1590 return 0; 1591} 1592 1593static int vpfe_g_crop(struct file *file, void *priv, 1594 struct v4l2_crop *crop) 1595{ 1596 struct vpfe_device *vpfe_dev = video_drvdata(file); 1597 1598 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_g_crop\n"); 1599 1600 crop->c = vpfe_dev->crop; 1601 return 0; 1602} 1603 1604static int vpfe_s_crop(struct file *file, void *priv, 1605 struct v4l2_crop *crop) 1606{ 1607 struct vpfe_device *vpfe_dev = video_drvdata(file); 1608 int ret = 0; 1609 1610 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_s_crop\n"); 1611 1612 if (vpfe_dev->started) { 1613 /* make sure streaming is not started */ 1614 v4l2_err(&vpfe_dev->v4l2_dev, 1615 "Cannot change crop when streaming is ON\n"); 1616 return -EBUSY; 1617 } 1618 1619 ret = mutex_lock_interruptible(&vpfe_dev->lock); 1620 if (ret) 1621 return ret; 1622 1623 if (crop->c.top < 0 || crop->c.left < 0) { 1624 v4l2_err(&vpfe_dev->v4l2_dev, 1625 "doesn't support negative values for top & left\n"); 1626 ret = -EINVAL; 1627 goto unlock_out; 1628 } 1629 1630 /* adjust the width to 16 pixel boundry */ 1631 crop->c.width = ((crop->c.width + 15) & ~0xf); 1632 1633 /* make sure parameters are valid */ 1634 if ((crop->c.left + crop->c.width > 1635 vpfe_dev->std_info.active_pixels) || 1636 (crop->c.top + crop->c.height > 1637 vpfe_dev->std_info.active_lines)) { 1638 v4l2_err(&vpfe_dev->v4l2_dev, "Error in S_CROP params\n"); 1639 ret = -EINVAL; 1640 goto unlock_out; 1641 } 1642 ccdc_dev->hw_ops.set_image_window(&crop->c); 1643 vpfe_dev->fmt.fmt.pix.width = crop->c.width; 1644 vpfe_dev->fmt.fmt.pix.height = crop->c.height; 1645 vpfe_dev->fmt.fmt.pix.bytesperline = 1646 ccdc_dev->hw_ops.get_line_length(); 1647 vpfe_dev->fmt.fmt.pix.sizeimage = 1648 vpfe_dev->fmt.fmt.pix.bytesperline * 1649 vpfe_dev->fmt.fmt.pix.height; 1650 vpfe_dev->crop = crop->c; 1651unlock_out: 1652 mutex_unlock(&vpfe_dev->lock); 1653 return ret; 1654} 1655 1656 1657static long vpfe_param_handler(struct file *file, void *priv, 1658 int cmd, void *param) 1659{ 1660 struct vpfe_device *vpfe_dev = video_drvdata(file); 1661 int ret = 0; 1662 1663 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_param_handler\n"); 1664 1665 if (vpfe_dev->started) { 1666 /* only allowed if streaming is not started */ 1667 v4l2_err(&vpfe_dev->v4l2_dev, "device already started\n"); 1668 return -EBUSY; 1669 } 1670 1671 ret = mutex_lock_interruptible(&vpfe_dev->lock); 1672 if (ret) 1673 return ret; 1674 1675 switch (cmd) { 1676 case VPFE_CMD_S_CCDC_RAW_PARAMS: 1677 v4l2_warn(&vpfe_dev->v4l2_dev, 1678 "VPFE_CMD_S_CCDC_RAW_PARAMS: experimental ioctl\n"); 1679 ret = ccdc_dev->hw_ops.set_params(param); 1680 if (ret) { 1681 v4l2_err(&vpfe_dev->v4l2_dev, 1682 "Error in setting parameters in CCDC\n"); 1683 goto unlock_out; 1684 } 1685 if (vpfe_get_ccdc_image_format(vpfe_dev, &vpfe_dev->fmt) < 0) { 1686 v4l2_err(&vpfe_dev->v4l2_dev, 1687 "Invalid image format at CCDC\n"); 1688 goto unlock_out; 1689 } 1690 break; 1691 default: 1692 ret = -EINVAL; 1693 } 1694unlock_out: 1695 mutex_unlock(&vpfe_dev->lock); 1696 return ret; 1697} 1698 1699 1700/* vpfe capture ioctl operations */ 1701static const struct v4l2_ioctl_ops vpfe_ioctl_ops = { 1702 .vidioc_querycap = vpfe_querycap, 1703 .vidioc_g_fmt_vid_cap = vpfe_g_fmt_vid_cap, 1704 .vidioc_enum_fmt_vid_cap = vpfe_enum_fmt_vid_cap, 1705 .vidioc_s_fmt_vid_cap = vpfe_s_fmt_vid_cap, 1706 .vidioc_try_fmt_vid_cap = vpfe_try_fmt_vid_cap, 1707 .vidioc_enum_input = vpfe_enum_input, 1708 .vidioc_g_input = vpfe_g_input, 1709 .vidioc_s_input = vpfe_s_input, 1710 .vidioc_querystd = vpfe_querystd, 1711 .vidioc_s_std = vpfe_s_std, 1712 .vidioc_g_std = vpfe_g_std, 1713 .vidioc_reqbufs = vpfe_reqbufs, 1714 .vidioc_querybuf = vpfe_querybuf, 1715 .vidioc_qbuf = vpfe_qbuf, 1716 .vidioc_dqbuf = vpfe_dqbuf, 1717 .vidioc_streamon = vpfe_streamon, 1718 .vidioc_streamoff = vpfe_streamoff, 1719 .vidioc_cropcap = vpfe_cropcap, 1720 .vidioc_g_crop = vpfe_g_crop, 1721 .vidioc_s_crop = vpfe_s_crop, 1722 .vidioc_default = vpfe_param_handler, 1723}; 1724 1725static struct vpfe_device *vpfe_initialize(void) 1726{ 1727 struct vpfe_device *vpfe_dev; 1728 1729 /* Default number of buffers should be 3 */ 1730 if ((numbuffers > 0) && 1731 (numbuffers < config_params.min_numbuffers)) 1732 numbuffers = config_params.min_numbuffers; 1733 1734 /* 1735 * Set buffer size to min buffers size if invalid buffer size is 1736 * given 1737 */ 1738 if (bufsize < config_params.min_bufsize) 1739 bufsize = config_params.min_bufsize; 1740 1741 config_params.numbuffers = numbuffers; 1742 1743 if (numbuffers) 1744 config_params.device_bufsize = bufsize; 1745 1746 /* Allocate memory for device objects */ 1747 vpfe_dev = kzalloc(sizeof(*vpfe_dev), GFP_KERNEL); 1748 1749 return vpfe_dev; 1750} 1751 1752static void vpfe_disable_clock(struct vpfe_device *vpfe_dev) 1753{ 1754 struct vpfe_config *vpfe_cfg = vpfe_dev->cfg; 1755 1756 clk_disable(vpfe_cfg->vpssclk); 1757 clk_put(vpfe_cfg->vpssclk); 1758 clk_disable(vpfe_cfg->slaveclk); 1759 clk_put(vpfe_cfg->slaveclk); 1760 v4l2_info(vpfe_dev->pdev->driver, 1761 "vpfe vpss master & slave clocks disabled\n"); 1762} 1763 1764static int vpfe_enable_clock(struct vpfe_device *vpfe_dev) 1765{ 1766 struct vpfe_config *vpfe_cfg = vpfe_dev->cfg; 1767 int ret = -ENOENT; 1768 1769 vpfe_cfg->vpssclk = clk_get(vpfe_dev->pdev, "vpss_master"); 1770 if (NULL == vpfe_cfg->vpssclk) { 1771 v4l2_err(vpfe_dev->pdev->driver, "No clock defined for" 1772 "vpss_master\n"); 1773 return ret; 1774 } 1775 1776 if (clk_enable(vpfe_cfg->vpssclk)) { 1777 v4l2_err(vpfe_dev->pdev->driver, 1778 "vpfe vpss master clock not enabled\n"); 1779 goto out; 1780 } 1781 v4l2_info(vpfe_dev->pdev->driver, 1782 "vpfe vpss master clock enabled\n"); 1783 1784 vpfe_cfg->slaveclk = clk_get(vpfe_dev->pdev, "vpss_slave"); 1785 if (NULL == vpfe_cfg->slaveclk) { 1786 v4l2_err(vpfe_dev->pdev->driver, 1787 "No clock defined for vpss slave\n"); 1788 goto out; 1789 } 1790 1791 if (clk_enable(vpfe_cfg->slaveclk)) { 1792 v4l2_err(vpfe_dev->pdev->driver, 1793 "vpfe vpss slave clock not enabled\n"); 1794 goto out; 1795 } 1796 v4l2_info(vpfe_dev->pdev->driver, "vpfe vpss slave clock enabled\n"); 1797 return 0; 1798out: 1799 if (vpfe_cfg->vpssclk) 1800 clk_put(vpfe_cfg->vpssclk); 1801 if (vpfe_cfg->slaveclk) 1802 clk_put(vpfe_cfg->slaveclk); 1803 1804 return -1; 1805} 1806 1807/* 1808 * vpfe_probe : This function creates device entries by register 1809 * itself to the V4L2 driver and initializes fields of each 1810 * device objects 1811 */ 1812static __init int vpfe_probe(struct platform_device *pdev) 1813{ 1814 struct vpfe_subdev_info *sdinfo; 1815 struct vpfe_config *vpfe_cfg; 1816 struct resource *res1; 1817 struct vpfe_device *vpfe_dev; 1818 struct i2c_adapter *i2c_adap; 1819 struct video_device *vfd; 1820 int ret = -ENOMEM, i, j; 1821 int num_subdevs = 0; 1822 1823 /* Get the pointer to the device object */ 1824 vpfe_dev = vpfe_initialize(); 1825 1826 if (!vpfe_dev) { 1827 v4l2_err(pdev->dev.driver, 1828 "Failed to allocate memory for vpfe_dev\n"); 1829 return ret; 1830 } 1831 1832 vpfe_dev->pdev = &pdev->dev; 1833 1834 if (NULL == pdev->dev.platform_data) { 1835 v4l2_err(pdev->dev.driver, "Unable to get vpfe config\n"); 1836 ret = -ENOENT; 1837 goto probe_free_dev_mem; 1838 } 1839 1840 vpfe_cfg = pdev->dev.platform_data; 1841 vpfe_dev->cfg = vpfe_cfg; 1842 if (NULL == vpfe_cfg->ccdc || 1843 NULL == vpfe_cfg->card_name || 1844 NULL == vpfe_cfg->sub_devs) { 1845 v4l2_err(pdev->dev.driver, "null ptr in vpfe_cfg\n"); 1846 ret = -ENOENT; 1847 goto probe_free_dev_mem; 1848 } 1849 1850 /* enable vpss clocks */ 1851 ret = vpfe_enable_clock(vpfe_dev); 1852 if (ret) 1853 goto probe_free_dev_mem; 1854 1855 mutex_lock(&ccdc_lock); 1856 /* Allocate memory for ccdc configuration */ 1857 ccdc_cfg = kmalloc(sizeof(struct ccdc_config), GFP_KERNEL); 1858 if (NULL == ccdc_cfg) { 1859 v4l2_err(pdev->dev.driver, 1860 "Memory allocation failed for ccdc_cfg\n"); 1861 goto probe_disable_clock; 1862 } 1863 1864 strncpy(ccdc_cfg->name, vpfe_cfg->ccdc, 32); 1865 /* Get VINT0 irq resource */ 1866 res1 = platform_get_resource(pdev, IORESOURCE_IRQ, 0); 1867 if (!res1) { 1868 v4l2_err(pdev->dev.driver, 1869 "Unable to get interrupt for VINT0\n"); 1870 ret = -ENOENT; 1871 goto probe_disable_clock; 1872 } 1873 vpfe_dev->ccdc_irq0 = res1->start; 1874 1875 /* Get VINT1 irq resource */ 1876 res1 = platform_get_resource(pdev, 1877 IORESOURCE_IRQ, 1); 1878 if (!res1) { 1879 v4l2_err(pdev->dev.driver, 1880 "Unable to get interrupt for VINT1\n"); 1881 ret = -ENOENT; 1882 goto probe_disable_clock; 1883 } 1884 vpfe_dev->ccdc_irq1 = res1->start; 1885 1886 /* Get address base of CCDC */ 1887 res1 = platform_get_resource(pdev, IORESOURCE_MEM, 0); 1888 if (!res1) { 1889 v4l2_err(pdev->dev.driver, 1890 "Unable to get register address map\n"); 1891 ret = -ENOENT; 1892 goto probe_disable_clock; 1893 } 1894 1895 ccdc_cfg->ccdc_addr_size = res1->end - res1->start + 1; 1896 if (!request_mem_region(res1->start, ccdc_cfg->ccdc_addr_size, 1897 pdev->dev.driver->name)) { 1898 v4l2_err(pdev->dev.driver, 1899 "Failed request_mem_region for ccdc base\n"); 1900 ret = -ENXIO; 1901 goto probe_disable_clock; 1902 } 1903 ccdc_cfg->ccdc_addr = ioremap_nocache(res1->start, 1904 ccdc_cfg->ccdc_addr_size); 1905 if (!ccdc_cfg->ccdc_addr) { 1906 v4l2_err(pdev->dev.driver, "Unable to ioremap ccdc addr\n"); 1907 ret = -ENXIO; 1908 goto probe_out_release_mem1; 1909 } 1910 1911 ret = request_irq(vpfe_dev->ccdc_irq0, vpfe_isr, IRQF_DISABLED, 1912 "vpfe_capture0", vpfe_dev); 1913 1914 if (0 != ret) { 1915 v4l2_err(pdev->dev.driver, "Unable to request interrupt\n"); 1916 goto probe_out_unmap1; 1917 } 1918 1919 /* Allocate memory for video device */ 1920 vfd = video_device_alloc(); 1921 if (NULL == vfd) { 1922 ret = -ENOMEM; 1923 v4l2_err(pdev->dev.driver, 1924 "Unable to alloc video device\n"); 1925 goto probe_out_release_irq; 1926 } 1927 1928 /* Initialize field of video device */ 1929 vfd->release = video_device_release; 1930 vfd->fops = &vpfe_fops; 1931 vfd->ioctl_ops = &vpfe_ioctl_ops; 1932 vfd->minor = -1; 1933 vfd->tvnorms = 0; 1934 vfd->current_norm = V4L2_STD_PAL; 1935 vfd->v4l2_dev = &vpfe_dev->v4l2_dev; 1936 snprintf(vfd->name, sizeof(vfd->name), 1937 "%s_V%d.%d.%d", 1938 CAPTURE_DRV_NAME, 1939 (VPFE_CAPTURE_VERSION_CODE >> 16) & 0xff, 1940 (VPFE_CAPTURE_VERSION_CODE >> 8) & 0xff, 1941 (VPFE_CAPTURE_VERSION_CODE) & 0xff); 1942 /* Set video_dev to the video device */ 1943 vpfe_dev->video_dev = vfd; 1944 1945 ret = v4l2_device_register(&pdev->dev, &vpfe_dev->v4l2_dev); 1946 if (ret) { 1947 v4l2_err(pdev->dev.driver, 1948 "Unable to register v4l2 device.\n"); 1949 goto probe_out_video_release; 1950 } 1951 v4l2_info(&vpfe_dev->v4l2_dev, "v4l2 device registered\n"); 1952 spin_lock_init(&vpfe_dev->irqlock); 1953 spin_lock_init(&vpfe_dev->dma_queue_lock); 1954 mutex_init(&vpfe_dev->lock); 1955 1956 /* Initialize field of the device objects */ 1957 vpfe_dev->numbuffers = config_params.numbuffers; 1958 1959 /* Initialize prio member of device object */ 1960 v4l2_prio_init(&vpfe_dev->prio); 1961 /* register video device */ 1962 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, 1963 "trying to register vpfe device.\n"); 1964 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, 1965 "video_dev=%x\n", (int)&vpfe_dev->video_dev); 1966 vpfe_dev->fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; 1967 ret = video_register_device(vpfe_dev->video_dev, 1968 VFL_TYPE_GRABBER, -1); 1969 1970 if (ret) { 1971 v4l2_err(pdev->dev.driver, 1972 "Unable to register video device.\n"); 1973 goto probe_out_v4l2_unregister; 1974 } 1975 1976 v4l2_info(&vpfe_dev->v4l2_dev, "video device registered\n"); 1977 /* set the driver data in platform device */ 1978 platform_set_drvdata(pdev, vpfe_dev); 1979 /* set driver private data */ 1980 video_set_drvdata(vpfe_dev->video_dev, vpfe_dev); 1981 i2c_adap = i2c_get_adapter(1); 1982 vpfe_cfg = pdev->dev.platform_data; 1983 num_subdevs = vpfe_cfg->num_subdevs; 1984 vpfe_dev->sd = kmalloc(sizeof(struct v4l2_subdev *) * num_subdevs, 1985 GFP_KERNEL); 1986 if (NULL == vpfe_dev->sd) { 1987 v4l2_err(&vpfe_dev->v4l2_dev, 1988 "unable to allocate memory for subdevice pointers\n"); 1989 ret = -ENOMEM; 1990 goto probe_out_video_unregister; 1991 } 1992 1993 for (i = 0; i < num_subdevs; i++) { 1994 struct v4l2_input *inps; 1995 1996 sdinfo = &vpfe_cfg->sub_devs[i]; 1997 1998 /* Load up the subdevice */ 1999 vpfe_dev->sd[i] = 2000 v4l2_i2c_new_subdev_board(&vpfe_dev->v4l2_dev, 2001 i2c_adap, 2002 sdinfo->name, 2003 &sdinfo->board_info, 2004 NULL); 2005 if (vpfe_dev->sd[i]) { 2006 v4l2_info(&vpfe_dev->v4l2_dev, 2007 "v4l2 sub device %s registered\n", 2008 sdinfo->name); 2009 vpfe_dev->sd[i]->grp_id = sdinfo->grp_id; 2010 /* update tvnorms from the sub devices */ 2011 for (j = 0; j < sdinfo->num_inputs; j++) { 2012 inps = &sdinfo->inputs[j]; 2013 vfd->tvnorms |= inps->std; 2014 } 2015 } else { 2016 v4l2_info(&vpfe_dev->v4l2_dev, 2017 "v4l2 sub device %s register fails\n", 2018 sdinfo->name); 2019 goto probe_sd_out; 2020 } 2021 } 2022 2023 /* set first sub device as current one */ 2024 vpfe_dev->current_subdev = &vpfe_cfg->sub_devs[0]; 2025 2026 /* We have at least one sub device to work with */ 2027 mutex_unlock(&ccdc_lock); 2028 return 0; 2029 2030probe_sd_out: 2031 kfree(vpfe_dev->sd); 2032probe_out_video_unregister: 2033 video_unregister_device(vpfe_dev->video_dev); 2034probe_out_v4l2_unregister: 2035 v4l2_device_unregister(&vpfe_dev->v4l2_dev); 2036probe_out_video_release: 2037 if (vpfe_dev->video_dev->minor == -1) 2038 video_device_release(vpfe_dev->video_dev); 2039probe_out_release_irq: 2040 free_irq(vpfe_dev->ccdc_irq0, vpfe_dev); 2041probe_out_unmap1: 2042 iounmap(ccdc_cfg->ccdc_addr); 2043probe_out_release_mem1: 2044 release_mem_region(res1->start, res1->end - res1->start + 1); 2045probe_disable_clock: 2046 vpfe_disable_clock(vpfe_dev); 2047 mutex_unlock(&ccdc_lock); 2048 kfree(ccdc_cfg); 2049probe_free_dev_mem: 2050 kfree(vpfe_dev); 2051 return ret; 2052} 2053 2054/* 2055 * vpfe_remove : It un-register device from V4L2 driver 2056 */ 2057static int vpfe_remove(struct platform_device *pdev) 2058{ 2059 struct vpfe_device *vpfe_dev = platform_get_drvdata(pdev); 2060 struct resource *res; 2061 2062 v4l2_info(pdev->dev.driver, "vpfe_remove\n"); 2063 2064 free_irq(vpfe_dev->ccdc_irq0, vpfe_dev); 2065 kfree(vpfe_dev->sd); 2066 v4l2_device_unregister(&vpfe_dev->v4l2_dev); 2067 video_unregister_device(vpfe_dev->video_dev); 2068 mutex_lock(&ccdc_lock); 2069 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 2070 release_mem_region(res->start, res->end - res->start + 1); 2071 iounmap(ccdc_cfg->ccdc_addr); 2072 mutex_unlock(&ccdc_lock); 2073 vpfe_disable_clock(vpfe_dev); 2074 kfree(vpfe_dev); 2075 kfree(ccdc_cfg); 2076 return 0; 2077} 2078 2079static int 2080vpfe_suspend(struct device *dev) 2081{ 2082 /* add suspend code here later */ 2083 return -1; 2084} 2085 2086static int 2087vpfe_resume(struct device *dev) 2088{ 2089 /* add resume code here later */ 2090 return -1; 2091} 2092 2093static struct dev_pm_ops vpfe_dev_pm_ops = { 2094 .suspend = vpfe_suspend, 2095 .resume = vpfe_resume, 2096}; 2097 2098static struct platform_driver vpfe_driver = { 2099 .driver = { 2100 .name = CAPTURE_DRV_NAME, 2101 .owner = THIS_MODULE, 2102 .pm = &vpfe_dev_pm_ops, 2103 }, 2104 .probe = vpfe_probe, 2105 .remove = __devexit_p(vpfe_remove), 2106}; 2107 2108static __init int vpfe_init(void) 2109{ 2110 printk(KERN_NOTICE "vpfe_init\n"); 2111 /* Register driver to the kernel */ 2112 return platform_driver_register(&vpfe_driver); 2113} 2114 2115/* 2116 * vpfe_cleanup : This function un-registers device driver 2117 */ 2118static void vpfe_cleanup(void) 2119{ 2120 platform_driver_unregister(&vpfe_driver); 2121} 2122 2123module_init(vpfe_init); 2124module_exit(vpfe_cleanup); 2125