1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (C) 2012 Texas Instruments Inc
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License as
7 * published by the Free Software Foundation version 2.
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.
15 * Manjunath Hadli <manjunath.hadli@ti.com>
16 * Prabhakar Lad <prabhakar.lad@ti.com>
19 * Driver name : VPFE Capture driver
20 * VPFE Capture driver allows applications to capture and stream video
21 * frames on DaVinci SoCs (DM6446, DM355 etc) from a YUV source such as
22 * TVP5146 or Raw Bayer RGB image data from an image sensor
23 * such as Microns' MT9T001, MT9T031 etc.
25 * These SoCs have, in common, a Video Processing Subsystem (VPSS) that
26 * consists of a Video Processing Front End (VPFE) for capturing
27 * video/raw image data and Video Processing Back End (VPBE) for displaying
28 * YUV data through an in-built analog encoder or Digital LCD port. This
29 * driver is for capture through VPFE. A typical EVM using these SoCs have
30 * following high level configuration.
32 * decoder(TVP5146/ YUV/
33 * MT9T001) --> Raw Bayer RGB ---> MUX -> VPFE (CCDC/ISIF)
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/DM365 only).
56 * - Capture using TVP5146 over BT.656
57 * - Support for interfacing decoders using sub device model
58 * - Work with DM365 or DM355 or DM6446 CCDC to do Raw Bayer
59 * RGB/YUV data capture to SDRAM.
60 * - Chaining of Image Processor
64 #include <linux/interrupt.h>
65 #include <linux/module.h>
66 #include <linux/slab.h>
69 #include "vpfe_mc_capture.h"
72 static bool interface;
74 module_param(interface, bool, 0444);
75 module_param(debug, bool, 0644);
78 * VPFE capture can be used for capturing video such as from TVP5146 or TVP7002
79 * and for capture raw bayer data from camera sensors such as mt9p031. At this
80 * point there is problem in co-existence of mt9p031 and tvp5146 due to i2c
81 * address collision. So set the variable below from bootargs to do either video
82 * capture or camera capture.
83 * interface = 0 - video capture (from TVP514x or such),
84 * interface = 1 - Camera capture (from mt9p031 or such)
85 * Re-visit this when we fix the co-existence issue
87 MODULE_PARM_DESC(interface, "interface 0-1 (default:0)");
88 MODULE_PARM_DESC(debug, "Debug level 0-1");
90 MODULE_DESCRIPTION("VPFE Video for Linux Capture Driver");
91 MODULE_LICENSE("GPL");
92 MODULE_AUTHOR("Texas Instruments");
94 /* map mbus_fmt to pixelformat */
95 void mbus_to_pix(const struct v4l2_mbus_framefmt *mbus,
96 struct v4l2_pix_format *pix)
99 case MEDIA_BUS_FMT_UYVY8_2X8:
100 pix->pixelformat = V4L2_PIX_FMT_UYVY;
101 pix->bytesperline = pix->width * 2;
104 case MEDIA_BUS_FMT_YUYV8_2X8:
105 pix->pixelformat = V4L2_PIX_FMT_YUYV;
106 pix->bytesperline = pix->width * 2;
109 case MEDIA_BUS_FMT_YUYV10_1X20:
110 pix->pixelformat = V4L2_PIX_FMT_UYVY;
111 pix->bytesperline = pix->width * 2;
114 case MEDIA_BUS_FMT_SGRBG12_1X12:
115 pix->pixelformat = V4L2_PIX_FMT_SBGGR16;
116 pix->bytesperline = pix->width * 2;
119 case MEDIA_BUS_FMT_SGRBG10_DPCM8_1X8:
120 pix->pixelformat = V4L2_PIX_FMT_SGRBG10DPCM8;
121 pix->bytesperline = pix->width;
124 case MEDIA_BUS_FMT_SGRBG10_ALAW8_1X8:
125 pix->pixelformat = V4L2_PIX_FMT_SGRBG10ALAW8;
126 pix->bytesperline = pix->width;
129 case MEDIA_BUS_FMT_YDYUYDYV8_1X16:
130 pix->pixelformat = V4L2_PIX_FMT_NV12;
131 pix->bytesperline = pix->width;
134 case MEDIA_BUS_FMT_Y8_1X8:
135 pix->pixelformat = V4L2_PIX_FMT_GREY;
136 pix->bytesperline = pix->width;
139 case MEDIA_BUS_FMT_UV8_1X8:
140 pix->pixelformat = V4L2_PIX_FMT_UV8;
141 pix->bytesperline = pix->width;
145 pr_err("Invalid mbus code set\n");
147 /* pitch should be 32 bytes aligned */
148 pix->bytesperline = ALIGN(pix->bytesperline, 32);
149 if (pix->pixelformat == V4L2_PIX_FMT_NV12)
150 pix->sizeimage = pix->bytesperline * pix->height +
151 ((pix->bytesperline * pix->height) >> 1);
153 pix->sizeimage = pix->bytesperline * pix->height;
157 static irqreturn_t vpfe_isr(int irq, void *dev_id)
159 struct vpfe_device *vpfe_dev = dev_id;
161 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "%s\n", __func__);
162 vpfe_isif_buffer_isr(&vpfe_dev->vpfe_isif);
163 vpfe_resizer_buffer_isr(&vpfe_dev->vpfe_resizer);
167 /* vpfe_vdint1_isr() - isr handler for VINT1 interrupt */
168 static irqreturn_t vpfe_vdint1_isr(int irq, void *dev_id)
170 struct vpfe_device *vpfe_dev = dev_id;
172 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "%s\n", __func__);
173 vpfe_isif_vidint1_isr(&vpfe_dev->vpfe_isif);
177 /* vpfe_imp_dma_isr() - ISR for ipipe dma completion */
178 static irqreturn_t vpfe_imp_dma_isr(int irq, void *dev_id)
180 struct vpfe_device *vpfe_dev = dev_id;
182 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "%s\n", __func__);
183 vpfe_ipipeif_ss_buffer_isr(&vpfe_dev->vpfe_ipipeif);
184 vpfe_resizer_dma_isr(&vpfe_dev->vpfe_resizer);
189 * vpfe_disable_clock() - Disable clocks for vpfe capture driver
190 * @vpfe_dev - ptr to vpfe capture device
192 * Disables clocks defined in vpfe configuration. The function
193 * assumes that at least one clock is to be defined which is
196 static void vpfe_disable_clock(struct vpfe_device *vpfe_dev)
198 struct vpfe_config *vpfe_cfg = vpfe_dev->cfg;
201 for (i = 0; i < vpfe_cfg->num_clocks; i++) {
202 clk_disable_unprepare(vpfe_dev->clks[i]);
203 clk_put(vpfe_dev->clks[i]);
205 kzfree(vpfe_dev->clks);
206 v4l2_info(vpfe_dev->pdev->driver, "vpfe capture clocks disabled\n");
210 * vpfe_enable_clock() - Enable clocks for vpfe capture driver
211 * @vpfe_dev - ptr to vpfe capture device
213 * Enables clocks defined in vpfe configuration. The function
214 * assumes that at least one clock is to be defined which is
217 static int vpfe_enable_clock(struct vpfe_device *vpfe_dev)
219 struct vpfe_config *vpfe_cfg = vpfe_dev->cfg;
223 if (!vpfe_cfg->num_clocks)
226 vpfe_dev->clks = kcalloc(vpfe_cfg->num_clocks,
227 sizeof(*vpfe_dev->clks), GFP_KERNEL);
231 for (i = 0; i < vpfe_cfg->num_clocks; i++) {
232 if (vpfe_cfg->clocks[i] == NULL) {
233 v4l2_err(vpfe_dev->pdev->driver,
234 "clock %s is not defined in vpfe config\n",
235 vpfe_cfg->clocks[i]);
240 clk_get(vpfe_dev->pdev, vpfe_cfg->clocks[i]);
241 if (IS_ERR(vpfe_dev->clks[i])) {
242 v4l2_err(vpfe_dev->pdev->driver,
243 "Failed to get clock %s\n",
244 vpfe_cfg->clocks[i]);
248 if (clk_prepare_enable(vpfe_dev->clks[i])) {
249 v4l2_err(vpfe_dev->pdev->driver,
250 "vpfe clock %s not enabled\n",
251 vpfe_cfg->clocks[i]);
255 v4l2_info(vpfe_dev->pdev->driver, "vpss clock %s enabled",
256 vpfe_cfg->clocks[i]);
261 for (i = 0; i < vpfe_cfg->num_clocks; i++)
262 if (!IS_ERR(vpfe_dev->clks[i])) {
263 clk_disable_unprepare(vpfe_dev->clks[i]);
264 clk_put(vpfe_dev->clks[i]);
267 v4l2_err(vpfe_dev->pdev->driver, "Failed to enable clocks\n");
268 kzfree(vpfe_dev->clks);
274 * vpfe_detach_irq() - Detach IRQs for vpfe capture driver
275 * @vpfe_dev - ptr to vpfe capture device
277 * Detach all IRQs defined in vpfe configuration.
279 static void vpfe_detach_irq(struct vpfe_device *vpfe_dev)
281 free_irq(vpfe_dev->ccdc_irq0, vpfe_dev);
282 free_irq(vpfe_dev->ccdc_irq1, vpfe_dev);
283 free_irq(vpfe_dev->imp_dma_irq, vpfe_dev);
287 * vpfe_attach_irq() - Attach IRQs for vpfe capture driver
288 * @vpfe_dev - ptr to vpfe capture device
290 * Attach all IRQs defined in vpfe configuration.
292 static int vpfe_attach_irq(struct vpfe_device *vpfe_dev)
296 ret = request_irq(vpfe_dev->ccdc_irq0, vpfe_isr, 0,
297 "vpfe_capture0", vpfe_dev);
299 v4l2_err(&vpfe_dev->v4l2_dev,
300 "Error: requesting VINT0 interrupt\n");
304 ret = request_irq(vpfe_dev->ccdc_irq1, vpfe_vdint1_isr, 0,
305 "vpfe_capture1", vpfe_dev);
307 v4l2_err(&vpfe_dev->v4l2_dev,
308 "Error: requesting VINT1 interrupt\n");
309 free_irq(vpfe_dev->ccdc_irq0, vpfe_dev);
313 ret = request_irq(vpfe_dev->imp_dma_irq, vpfe_imp_dma_isr,
314 0, "Imp_Sdram_Irq", vpfe_dev);
316 v4l2_err(&vpfe_dev->v4l2_dev,
317 "Error: requesting IMP IRQ interrupt\n");
318 free_irq(vpfe_dev->ccdc_irq1, vpfe_dev);
319 free_irq(vpfe_dev->ccdc_irq0, vpfe_dev);
327 * register_i2c_devices() - register all i2c v4l2 subdevs
328 * @vpfe_dev - ptr to vpfe capture device
330 * register all i2c v4l2 subdevs
332 static int register_i2c_devices(struct vpfe_device *vpfe_dev)
334 struct vpfe_ext_subdev_info *sdinfo;
335 struct vpfe_config *vpfe_cfg;
336 struct i2c_adapter *i2c_adap;
337 unsigned int num_subdevs;
342 vpfe_cfg = vpfe_dev->cfg;
343 i2c_adap = i2c_get_adapter(1);
344 num_subdevs = vpfe_cfg->num_subdevs;
346 kcalloc(num_subdevs, sizeof(struct v4l2_subdev *),
351 for (i = 0, k = 0; i < num_subdevs; i++) {
352 sdinfo = &vpfe_cfg->sub_devs[i];
354 * register subdevices based on interface setting. Currently
355 * tvp5146 and mt9p031 cannot co-exists due to i2c address
356 * conflicts. So only one of them is registered. Re-visit this
357 * once we have support for i2c switch handling in i2c driver
360 if (interface == sdinfo->is_camera) {
361 /* setup input path */
362 if (vpfe_cfg->setup_input &&
363 vpfe_cfg->setup_input(sdinfo->grp_id) < 0) {
365 v4l2_info(&vpfe_dev->v4l2_dev,
366 "could not setup input for %s\n",
367 sdinfo->module_name);
370 /* Load up the subdevice */
372 v4l2_i2c_new_subdev_board(&vpfe_dev->v4l2_dev,
373 i2c_adap, &sdinfo->board_info,
375 if (vpfe_dev->sd[k]) {
376 v4l2_info(&vpfe_dev->v4l2_dev,
377 "v4l2 sub device %s registered\n",
378 sdinfo->module_name);
380 vpfe_dev->sd[k]->grp_id = sdinfo->grp_id;
383 sdinfo->registered = 1;
386 v4l2_info(&vpfe_dev->v4l2_dev,
387 "v4l2 sub device %s is not registered\n",
388 sdinfo->module_name);
391 vpfe_dev->num_ext_subdevs = k;
396 kzfree(vpfe_dev->sd);
402 * vpfe_register_entities() - register all v4l2 subdevs and media entities
403 * @vpfe_dev - ptr to vpfe capture device
405 * register all v4l2 subdevs, media entities, and creates links
408 static int vpfe_register_entities(struct vpfe_device *vpfe_dev)
410 unsigned int flags = 0;
414 /* register i2c devices first */
415 ret = register_i2c_devices(vpfe_dev);
419 /* register rest of the sub-devs */
420 ret = vpfe_isif_register_entities(&vpfe_dev->vpfe_isif,
421 &vpfe_dev->v4l2_dev);
425 ret = vpfe_ipipeif_register_entities(&vpfe_dev->vpfe_ipipeif,
426 &vpfe_dev->v4l2_dev);
428 goto out_isif_register;
430 ret = vpfe_ipipe_register_entities(&vpfe_dev->vpfe_ipipe,
431 &vpfe_dev->v4l2_dev);
433 goto out_ipipeif_register;
435 ret = vpfe_resizer_register_entities(&vpfe_dev->vpfe_resizer,
436 &vpfe_dev->v4l2_dev);
438 goto out_ipipe_register;
440 /* create links now, starting with external(i2c) entities */
441 for (i = 0; i < vpfe_dev->num_ext_subdevs; i++)
443 * if entity has no pads (ex: amplifier),
444 * can't establish link
446 if (vpfe_dev->sd[i]->entity.num_pads) {
447 ret = media_create_pad_link(&vpfe_dev->sd[i]->entity,
448 0, &vpfe_dev->vpfe_isif.subdev.entity,
451 goto out_resizer_register;
454 ret = media_create_pad_link(&vpfe_dev->vpfe_isif.subdev.entity, 1,
455 &vpfe_dev->vpfe_ipipeif.subdev.entity,
458 goto out_resizer_register;
460 ret = media_create_pad_link(&vpfe_dev->vpfe_ipipeif.subdev.entity, 1,
461 &vpfe_dev->vpfe_ipipe.subdev.entity,
464 goto out_resizer_register;
466 ret = media_create_pad_link(&vpfe_dev->vpfe_ipipe.subdev.entity,
467 1, &vpfe_dev->vpfe_resizer.crop_resizer.subdev.entity,
470 goto out_resizer_register;
472 ret = media_create_pad_link(&vpfe_dev->vpfe_ipipeif.subdev.entity, 1,
473 &vpfe_dev->vpfe_resizer.crop_resizer.subdev.entity,
476 goto out_resizer_register;
478 ret = v4l2_device_register_subdev_nodes(&vpfe_dev->v4l2_dev);
480 goto out_resizer_register;
484 out_resizer_register:
485 vpfe_resizer_unregister_entities(&vpfe_dev->vpfe_resizer);
487 vpfe_ipipe_unregister_entities(&vpfe_dev->vpfe_ipipe);
488 out_ipipeif_register:
489 vpfe_ipipeif_unregister_entities(&vpfe_dev->vpfe_ipipeif);
491 vpfe_isif_unregister_entities(&vpfe_dev->vpfe_isif);
497 * vpfe_unregister_entities() - unregister all v4l2 subdevs and media entities
498 * @vpfe_dev - ptr to vpfe capture device
500 * unregister all v4l2 subdevs and media entities
502 static void vpfe_unregister_entities(struct vpfe_device *vpfe_dev)
504 vpfe_isif_unregister_entities(&vpfe_dev->vpfe_isif);
505 vpfe_ipipeif_unregister_entities(&vpfe_dev->vpfe_ipipeif);
506 vpfe_ipipe_unregister_entities(&vpfe_dev->vpfe_ipipe);
507 vpfe_resizer_unregister_entities(&vpfe_dev->vpfe_resizer);
511 * vpfe_cleanup_modules() - cleanup all non-i2c v4l2 subdevs
512 * @vpfe_dev - ptr to vpfe capture device
513 * @pdev - pointer to platform device
515 * cleanup all v4l2 subdevs
517 static void vpfe_cleanup_modules(struct vpfe_device *vpfe_dev,
518 struct platform_device *pdev)
520 vpfe_isif_cleanup(&vpfe_dev->vpfe_isif, pdev);
521 vpfe_ipipeif_cleanup(&vpfe_dev->vpfe_ipipeif, pdev);
522 vpfe_ipipe_cleanup(&vpfe_dev->vpfe_ipipe, pdev);
523 vpfe_resizer_cleanup(&vpfe_dev->vpfe_resizer, pdev);
527 * vpfe_initialize_modules() - initialize all non-i2c v4l2 subdevs
528 * @vpfe_dev - ptr to vpfe capture device
529 * @pdev - pointer to platform device
531 * initialize all v4l2 subdevs and media entities
533 static int vpfe_initialize_modules(struct vpfe_device *vpfe_dev,
534 struct platform_device *pdev)
538 ret = vpfe_isif_init(&vpfe_dev->vpfe_isif, pdev);
542 ret = vpfe_ipipeif_init(&vpfe_dev->vpfe_ipipeif, pdev);
546 ret = vpfe_ipipe_init(&vpfe_dev->vpfe_ipipe, pdev);
548 goto out_ipipeif_init;
550 ret = vpfe_resizer_init(&vpfe_dev->vpfe_resizer, pdev);
557 vpfe_ipipe_cleanup(&vpfe_dev->vpfe_ipipe, pdev);
559 vpfe_ipipeif_cleanup(&vpfe_dev->vpfe_ipipeif, pdev);
561 vpfe_isif_cleanup(&vpfe_dev->vpfe_isif, pdev);
567 * vpfe_probe() : vpfe probe function
568 * @pdev: platform device pointer
570 * This function creates device entries by register itself to the V4L2 driver
571 * and initializes fields of each device objects
573 static int vpfe_probe(struct platform_device *pdev)
575 struct vpfe_device *vpfe_dev;
576 struct resource *res1;
579 vpfe_dev = kzalloc(sizeof(*vpfe_dev), GFP_KERNEL);
583 if (pdev->dev.platform_data == NULL) {
584 v4l2_err(pdev->dev.driver, "Unable to get vpfe config\n");
586 goto probe_free_dev_mem;
589 vpfe_dev->cfg = pdev->dev.platform_data;
590 if (vpfe_dev->cfg->card_name == NULL ||
591 vpfe_dev->cfg->sub_devs == NULL) {
592 v4l2_err(pdev->dev.driver, "null ptr in vpfe_cfg\n");
594 goto probe_free_dev_mem;
597 /* Get VINT0 irq resource */
598 res1 = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
600 v4l2_err(pdev->dev.driver,
601 "Unable to get interrupt for VINT0\n");
603 goto probe_free_dev_mem;
605 vpfe_dev->ccdc_irq0 = res1->start;
607 /* Get VINT1 irq resource */
608 res1 = platform_get_resource(pdev, IORESOURCE_IRQ, 1);
610 v4l2_err(pdev->dev.driver,
611 "Unable to get interrupt for VINT1\n");
613 goto probe_free_dev_mem;
615 vpfe_dev->ccdc_irq1 = res1->start;
617 /* Get DMA irq resource */
618 res1 = platform_get_resource(pdev, IORESOURCE_IRQ, 2);
620 v4l2_err(pdev->dev.driver,
621 "Unable to get interrupt for DMA\n");
623 goto probe_free_dev_mem;
625 vpfe_dev->imp_dma_irq = res1->start;
627 vpfe_dev->pdev = &pdev->dev;
629 /* enable vpss clocks */
630 ret = vpfe_enable_clock(vpfe_dev);
632 goto probe_free_dev_mem;
634 ret = vpfe_initialize_modules(vpfe_dev, pdev);
636 goto probe_disable_clock;
638 vpfe_dev->media_dev.dev = vpfe_dev->pdev;
639 strscpy((char *)&vpfe_dev->media_dev.model, "davinci-media",
640 sizeof(vpfe_dev->media_dev.model));
642 ret = media_device_register(&vpfe_dev->media_dev);
644 v4l2_err(pdev->dev.driver,
645 "Unable to register media device.\n");
646 goto probe_out_entities_cleanup;
649 vpfe_dev->v4l2_dev.mdev = &vpfe_dev->media_dev;
650 ret = v4l2_device_register(&pdev->dev, &vpfe_dev->v4l2_dev);
652 v4l2_err(pdev->dev.driver, "Unable to register v4l2 device.\n");
653 goto probe_out_media_unregister;
656 v4l2_info(&vpfe_dev->v4l2_dev, "v4l2 device registered\n");
657 /* set the driver data in platform device */
658 platform_set_drvdata(pdev, vpfe_dev);
659 /* register subdevs/entities */
660 ret = vpfe_register_entities(vpfe_dev);
662 goto probe_out_v4l2_unregister;
664 ret = vpfe_attach_irq(vpfe_dev);
666 goto probe_out_entities_unregister;
670 probe_out_entities_unregister:
671 vpfe_unregister_entities(vpfe_dev);
672 kzfree(vpfe_dev->sd);
673 probe_out_v4l2_unregister:
674 v4l2_device_unregister(&vpfe_dev->v4l2_dev);
675 probe_out_media_unregister:
676 media_device_unregister(&vpfe_dev->media_dev);
677 probe_out_entities_cleanup:
678 vpfe_cleanup_modules(vpfe_dev, pdev);
680 vpfe_disable_clock(vpfe_dev);
688 * vpfe_remove : This function un-registers device from V4L2 driver
690 static int vpfe_remove(struct platform_device *pdev)
692 struct vpfe_device *vpfe_dev = platform_get_drvdata(pdev);
694 v4l2_info(pdev->dev.driver, "%s\n", __func__);
696 kzfree(vpfe_dev->sd);
697 vpfe_detach_irq(vpfe_dev);
698 vpfe_unregister_entities(vpfe_dev);
699 vpfe_cleanup_modules(vpfe_dev, pdev);
700 v4l2_device_unregister(&vpfe_dev->v4l2_dev);
701 media_device_unregister(&vpfe_dev->media_dev);
702 vpfe_disable_clock(vpfe_dev);
708 static struct platform_driver vpfe_driver = {
710 .name = CAPTURE_DRV_NAME,
713 .remove = vpfe_remove,
716 module_platform_driver(vpfe_driver);