1 // SPDX-License-Identifier: GPL-2.0
3 * V4L2 Driver for Renesas Capture Engine Unit (CEU) interface
4 * Copyright (C) 2017-2018 Jacopo Mondi <jacopo+renesas@jmondi.org>
6 * Based on soc-camera driver "soc_camera/sh_mobile_ceu_camera.c"
7 * Copyright (C) 2008 Magnus Damm
9 * Based on V4L2 Driver for PXA camera host - "pxa_camera.c",
10 * Copyright (C) 2006, Sascha Hauer, Pengutronix
11 * Copyright (C) 2008, Guennadi Liakhovetski <kernel@pengutronix.de>
14 #include <linux/delay.h>
15 #include <linux/device.h>
16 #include <linux/dma-mapping.h>
17 #include <linux/err.h>
18 #include <linux/errno.h>
19 #include <linux/interrupt.h>
21 #include <linux/kernel.h>
23 #include <linux/module.h>
25 #include <linux/of_device.h>
26 #include <linux/of_graph.h>
27 #include <linux/platform_device.h>
28 #include <linux/pm_runtime.h>
29 #include <linux/slab.h>
30 #include <linux/time.h>
31 #include <linux/videodev2.h>
33 #include <media/v4l2-async.h>
34 #include <media/v4l2-common.h>
35 #include <media/v4l2-ctrls.h>
36 #include <media/v4l2-dev.h>
37 #include <media/v4l2-device.h>
38 #include <media/v4l2-event.h>
39 #include <media/v4l2-fwnode.h>
40 #include <media/v4l2-image-sizes.h>
41 #include <media/v4l2-ioctl.h>
42 #include <media/v4l2-mediabus.h>
43 #include <media/videobuf2-dma-contig.h>
45 #include <media/drv-intf/renesas-ceu.h>
47 #define DRIVER_NAME "renesas-ceu"
49 /* CEU registers offsets and masks. */
50 #define CEU_CAPSR 0x00 /* Capture start register */
51 #define CEU_CAPCR 0x04 /* Capture control register */
52 #define CEU_CAMCR 0x08 /* Capture interface control register */
53 #define CEU_CAMOR 0x10 /* Capture interface offset register */
54 #define CEU_CAPWR 0x14 /* Capture interface width register */
55 #define CEU_CAIFR 0x18 /* Capture interface input format register */
56 #define CEU_CRCNTR 0x28 /* CEU register control register */
57 #define CEU_CRCMPR 0x2c /* CEU register forcible control register */
58 #define CEU_CFLCR 0x30 /* Capture filter control register */
59 #define CEU_CFSZR 0x34 /* Capture filter size clip register */
60 #define CEU_CDWDR 0x38 /* Capture destination width register */
61 #define CEU_CDAYR 0x3c /* Capture data address Y register */
62 #define CEU_CDACR 0x40 /* Capture data address C register */
63 #define CEU_CFWCR 0x5c /* Firewall operation control register */
64 #define CEU_CDOCR 0x64 /* Capture data output control register */
65 #define CEU_CEIER 0x70 /* Capture event interrupt enable register */
66 #define CEU_CETCR 0x74 /* Capture event flag clear register */
67 #define CEU_CSTSR 0x7c /* Capture status register */
68 #define CEU_CSRTR 0x80 /* Capture software reset register */
70 /* Data synchronous fetch mode. */
71 #define CEU_CAMCR_JPEG BIT(4)
73 /* Input components ordering: CEU_CAMCR.DTARY field. */
74 #define CEU_CAMCR_DTARY_8_UYVY (0x00 << 8)
75 #define CEU_CAMCR_DTARY_8_VYUY (0x01 << 8)
76 #define CEU_CAMCR_DTARY_8_YUYV (0x02 << 8)
77 #define CEU_CAMCR_DTARY_8_YVYU (0x03 << 8)
78 /* TODO: input components ordering for 16 bits input. */
80 /* Bus transfer MTU. */
81 #define CEU_CAPCR_BUS_WIDTH256 (0x3 << 20)
83 /* Bus width configuration. */
84 #define CEU_CAMCR_DTIF_16BITS BIT(12)
86 /* No downsampling to planar YUV420 in image fetch mode. */
87 #define CEU_CDOCR_NO_DOWSAMPLE BIT(4)
89 /* Swap all input data in 8-bit, 16-bits and 32-bits units (Figure 46.45). */
90 #define CEU_CDOCR_SWAP_ENDIANNESS (7)
92 /* Capture reset and enable bits. */
93 #define CEU_CAPSR_CPKIL BIT(16)
94 #define CEU_CAPSR_CE BIT(0)
96 /* CEU operating flag bit. */
97 #define CEU_CAPCR_CTNCP BIT(16)
98 #define CEU_CSTRST_CPTON BIT(0)
100 /* Platform specific IRQ source flags. */
101 #define CEU_CETCR_ALL_IRQS_RZ 0x397f313
102 #define CEU_CETCR_ALL_IRQS_SH4 0x3d7f313
104 /* Prohibited register access interrupt bit. */
105 #define CEU_CETCR_IGRW BIT(4)
106 /* One-frame capture end interrupt. */
107 #define CEU_CEIER_CPE BIT(0)
109 #define CEU_CEIER_VBP BIT(20)
110 #define CEU_CEIER_MASK (CEU_CEIER_CPE | CEU_CEIER_VBP)
112 #define CEU_MAX_WIDTH 2560
113 #define CEU_MAX_HEIGHT 1920
114 #define CEU_MAX_BPL 8188
115 #define CEU_W_MAX(w) ((w) < CEU_MAX_WIDTH ? (w) : CEU_MAX_WIDTH)
116 #define CEU_H_MAX(h) ((h) < CEU_MAX_HEIGHT ? (h) : CEU_MAX_HEIGHT)
119 * ceu_bus_fmt - describe a 8-bits yuyv format the sensor can produce
121 * @mbus_code: bus format code
122 * @fmt_order: CEU_CAMCR.DTARY ordering of input components (Y, Cb, Cr)
123 * @fmt_order_swap: swapped CEU_CAMCR.DTARY ordering of input components
125 * @swapped: does Cr appear before Cb?
126 * @bps: number of bits sent over bus for each sample
127 * @bpp: number of bits per pixels unit
129 struct ceu_mbus_fmt
{
139 * ceu_buffer - Link vb2 buffer to the list of available buffers.
142 struct vb2_v4l2_buffer vb
;
143 struct list_head queue
;
146 static inline struct ceu_buffer
*vb2_to_ceu(struct vb2_v4l2_buffer
*vbuf
)
148 return container_of(vbuf
, struct ceu_buffer
, vb
);
152 * ceu_subdev - Wraps v4l2 sub-device and provides async subdevice.
155 struct v4l2_subdev
*v4l2_sd
;
156 struct v4l2_async_subdev asd
;
158 /* per-subdevice mbus configuration options */
159 unsigned int mbus_flags
;
160 struct ceu_mbus_fmt mbus_fmt
;
163 static struct ceu_subdev
*to_ceu_subdev(struct v4l2_async_subdev
*asd
)
165 return container_of(asd
, struct ceu_subdev
, asd
);
169 * ceu_device - CEU device instance
173 struct video_device vdev
;
174 struct v4l2_device v4l2_dev
;
176 /* subdevices descriptors */
177 struct ceu_subdev
*subdevs
;
178 /* the subdevice currently in use */
179 struct ceu_subdev
*sd
;
180 unsigned int sd_index
;
183 /* platform specific mask with all IRQ sources flagged */
186 /* currently configured field and pixel format */
187 enum v4l2_field field
;
188 struct v4l2_pix_format_mplane v4l2_pix
;
190 /* async subdev notification helpers */
191 struct v4l2_async_notifier notifier
;
192 /* pointers to "struct ceu_subdevice -> asd" */
193 struct v4l2_async_subdev
**asds
;
195 /* vb2 queue, capture buffer list and active buffer pointer */
196 struct vb2_queue vb2_vq
;
197 struct list_head capture
;
198 struct vb2_v4l2_buffer
*active
;
199 unsigned int sequence
;
201 /* mlock - lock access to interface reset and vb2 queue */
204 /* lock - lock access to capture buffer queue and active buffer */
207 /* base - CEU memory base address */
211 static inline struct ceu_device
*v4l2_to_ceu(struct v4l2_device
*v4l2_dev
)
213 return container_of(v4l2_dev
, struct ceu_device
, v4l2_dev
);
216 /* --- CEU memory output formats --- */
219 * ceu_fmt - describe a memory output format supported by CEU interface.
221 * @fourcc: memory layout fourcc format code
222 * @bpp: number of bits for each pixel stored in memory
230 * ceu_format_list - List of supported memory output formats
232 * If sensor provides any YUYV bus format, all the following planar memory
233 * formats are available thanks to CEU re-ordering and sub-sampling
236 static const struct ceu_fmt ceu_fmt_list
[] = {
238 .fourcc
= V4L2_PIX_FMT_NV16
,
242 .fourcc
= V4L2_PIX_FMT_NV61
,
246 .fourcc
= V4L2_PIX_FMT_NV12
,
250 .fourcc
= V4L2_PIX_FMT_NV21
,
254 .fourcc
= V4L2_PIX_FMT_YUYV
,
258 .fourcc
= V4L2_PIX_FMT_UYVY
,
262 .fourcc
= V4L2_PIX_FMT_YVYU
,
266 .fourcc
= V4L2_PIX_FMT_VYUY
,
271 static const struct ceu_fmt
*get_ceu_fmt_from_fourcc(unsigned int fourcc
)
273 const struct ceu_fmt
*fmt
= &ceu_fmt_list
[0];
276 for (i
= 0; i
< ARRAY_SIZE(ceu_fmt_list
); i
++, fmt
++)
277 if (fmt
->fourcc
== fourcc
)
283 static bool ceu_fmt_mplane(struct v4l2_pix_format_mplane
*pix
)
285 switch (pix
->pixelformat
) {
286 case V4L2_PIX_FMT_YUYV
:
287 case V4L2_PIX_FMT_UYVY
:
288 case V4L2_PIX_FMT_YVYU
:
289 case V4L2_PIX_FMT_VYUY
:
291 case V4L2_PIX_FMT_NV16
:
292 case V4L2_PIX_FMT_NV61
:
293 case V4L2_PIX_FMT_NV12
:
294 case V4L2_PIX_FMT_NV21
:
301 /* --- CEU HW operations --- */
303 static void ceu_write(struct ceu_device
*priv
, unsigned int reg_offs
, u32 data
)
305 iowrite32(data
, priv
->base
+ reg_offs
);
308 static u32
ceu_read(struct ceu_device
*priv
, unsigned int reg_offs
)
310 return ioread32(priv
->base
+ reg_offs
);
314 * ceu_soft_reset() - Software reset the CEU interface.
315 * @ceu_device: CEU device.
317 * Returns 0 for success, -EIO for error.
319 static int ceu_soft_reset(struct ceu_device
*ceudev
)
323 ceu_write(ceudev
, CEU_CAPSR
, CEU_CAPSR_CPKIL
);
325 for (i
= 0; i
< 100; i
++) {
326 if (!(ceu_read(ceudev
, CEU_CSTSR
) & CEU_CSTRST_CPTON
))
332 dev_err(ceudev
->dev
, "soft reset time out\n");
336 for (i
= 0; i
< 100; i
++) {
337 if (!(ceu_read(ceudev
, CEU_CAPSR
) & CEU_CAPSR_CPKIL
))
342 /* If we get here, CEU has not reset properly. */
346 /* --- CEU Capture Operations --- */
349 * ceu_hw_config() - Configure CEU interface registers.
351 static int ceu_hw_config(struct ceu_device
*ceudev
)
353 u32 camcr
, cdocr
, cfzsr
, cdwdr
, capwr
;
354 struct v4l2_pix_format_mplane
*pix
= &ceudev
->v4l2_pix
;
355 struct ceu_subdev
*ceu_sd
= ceudev
->sd
;
356 struct ceu_mbus_fmt
*mbus_fmt
= &ceu_sd
->mbus_fmt
;
357 unsigned int mbus_flags
= ceu_sd
->mbus_flags
;
359 /* Start configuring CEU registers */
360 ceu_write(ceudev
, CEU_CAIFR
, 0);
361 ceu_write(ceudev
, CEU_CFWCR
, 0);
362 ceu_write(ceudev
, CEU_CRCNTR
, 0);
363 ceu_write(ceudev
, CEU_CRCMPR
, 0);
365 /* Set the frame capture period for both image capture and data sync. */
366 capwr
= (pix
->height
<< 16) | pix
->width
* mbus_fmt
->bpp
/ 8;
369 * Swap input data endianness by default.
370 * In data fetch mode bytes are received in chunks of 8 bytes.
371 * D0, D1, D2, D3, D4, D5, D6, D7 (D0 received first)
372 * The data is however by default written to memory in reverse order:
373 * D7, D6, D5, D4, D3, D2, D1, D0 (D7 written to lowest byte)
375 * Use CEU_CDOCR[2:0] to swap data ordering.
377 cdocr
= CEU_CDOCR_SWAP_ENDIANNESS
;
380 * Configure CAMCR and CDOCR:
381 * match input components ordering with memory output format and
382 * handle downsampling to YUV420.
384 * If the memory output planar format is 'swapped' (Cr before Cb) and
385 * input format is not, use the swapped version of CAMCR.DTARY.
387 * If the memory output planar format is not 'swapped' (Cb before Cr)
388 * and input format is, use the swapped version of CAMCR.DTARY.
390 * CEU by default downsample to planar YUV420 (CDCOR[4] = 0).
391 * If output is planar YUV422 set CDOCR[4] = 1
393 * No downsample for data fetch sync mode.
395 switch (pix
->pixelformat
) {
396 /* Data fetch sync mode */
397 case V4L2_PIX_FMT_YUYV
:
398 case V4L2_PIX_FMT_YVYU
:
399 case V4L2_PIX_FMT_UYVY
:
400 case V4L2_PIX_FMT_VYUY
:
401 camcr
= CEU_CAMCR_JPEG
;
402 cdocr
|= CEU_CDOCR_NO_DOWSAMPLE
;
403 cfzsr
= (pix
->height
<< 16) | pix
->width
;
404 cdwdr
= pix
->plane_fmt
[0].bytesperline
;
407 /* Non-swapped planar image capture mode. */
408 case V4L2_PIX_FMT_NV16
:
409 cdocr
|= CEU_CDOCR_NO_DOWSAMPLE
;
411 case V4L2_PIX_FMT_NV12
:
412 if (mbus_fmt
->swapped
)
413 camcr
= mbus_fmt
->fmt_order_swap
;
415 camcr
= mbus_fmt
->fmt_order
;
417 cfzsr
= (pix
->height
<< 16) | pix
->width
;
421 /* Swapped planar image capture mode. */
422 case V4L2_PIX_FMT_NV61
:
423 cdocr
|= CEU_CDOCR_NO_DOWSAMPLE
;
425 case V4L2_PIX_FMT_NV21
:
426 if (mbus_fmt
->swapped
)
427 camcr
= mbus_fmt
->fmt_order
;
429 camcr
= mbus_fmt
->fmt_order_swap
;
431 cfzsr
= (pix
->height
<< 16) | pix
->width
;
439 camcr
|= mbus_flags
& V4L2_MBUS_VSYNC_ACTIVE_LOW
? 1 << 1 : 0;
440 camcr
|= mbus_flags
& V4L2_MBUS_HSYNC_ACTIVE_LOW
? 1 << 0 : 0;
442 /* TODO: handle 16 bit bus width with DTIF bit in CAMCR */
443 ceu_write(ceudev
, CEU_CAMCR
, camcr
);
444 ceu_write(ceudev
, CEU_CDOCR
, cdocr
);
445 ceu_write(ceudev
, CEU_CAPCR
, CEU_CAPCR_BUS_WIDTH256
);
448 * TODO: make CAMOR offsets configurable.
449 * CAMOR wants to know the number of blanks between a VS/HS signal
450 * and valid data. This value should actually come from the sensor...
452 ceu_write(ceudev
, CEU_CAMOR
, 0);
454 /* TODO: 16 bit bus width require re-calculation of cdwdr and cfzsr */
455 ceu_write(ceudev
, CEU_CAPWR
, capwr
);
456 ceu_write(ceudev
, CEU_CFSZR
, cfzsr
);
457 ceu_write(ceudev
, CEU_CDWDR
, cdwdr
);
463 * ceu_capture() - Trigger start of a capture sequence.
465 * Program the CEU DMA registers with addresses where to transfer image data.
467 static int ceu_capture(struct ceu_device
*ceudev
)
469 struct v4l2_pix_format_mplane
*pix
= &ceudev
->v4l2_pix
;
470 dma_addr_t phys_addr_top
;
473 vb2_dma_contig_plane_dma_addr(&ceudev
->active
->vb2_buf
, 0);
474 ceu_write(ceudev
, CEU_CDAYR
, phys_addr_top
);
476 /* Ignore CbCr plane for non multi-planar image formats. */
477 if (ceu_fmt_mplane(pix
)) {
479 vb2_dma_contig_plane_dma_addr(&ceudev
->active
->vb2_buf
,
481 ceu_write(ceudev
, CEU_CDACR
, phys_addr_top
);
485 * Trigger new capture start: once for each frame, as we work in
486 * one-frame capture mode.
488 ceu_write(ceudev
, CEU_CAPSR
, CEU_CAPSR_CE
);
493 static irqreturn_t
ceu_irq(int irq
, void *data
)
495 struct ceu_device
*ceudev
= data
;
496 struct vb2_v4l2_buffer
*vbuf
;
497 struct ceu_buffer
*buf
;
500 /* Clean interrupt status. */
501 status
= ceu_read(ceudev
, CEU_CETCR
);
502 ceu_write(ceudev
, CEU_CETCR
, ~ceudev
->irq_mask
);
504 /* Unexpected interrupt. */
505 if (!(status
& CEU_CEIER_MASK
))
508 spin_lock(&ceudev
->lock
);
510 /* Stale interrupt from a released buffer, ignore it. */
511 vbuf
= ceudev
->active
;
513 spin_unlock(&ceudev
->lock
);
518 * When a VBP interrupt occurs, no capture end interrupt will occur
519 * and the image of that frame is not captured correctly.
521 if (status
& CEU_CEIER_VBP
) {
522 dev_err(ceudev
->dev
, "VBP interrupt: abort capture\n");
526 /* Prepare to return the 'previous' buffer. */
527 vbuf
->vb2_buf
.timestamp
= ktime_get_ns();
528 vbuf
->sequence
= ceudev
->sequence
++;
529 vbuf
->field
= ceudev
->field
;
531 /* Prepare a new 'active' buffer and trigger a new capture. */
532 if (!list_empty(&ceudev
->capture
)) {
533 buf
= list_first_entry(&ceudev
->capture
, struct ceu_buffer
,
535 list_del(&buf
->queue
);
536 ceudev
->active
= &buf
->vb
;
541 /* Return the 'previous' buffer. */
542 vb2_buffer_done(&vbuf
->vb2_buf
, VB2_BUF_STATE_DONE
);
544 spin_unlock(&ceudev
->lock
);
549 /* Return the 'previous' buffer and all queued ones. */
550 vb2_buffer_done(&vbuf
->vb2_buf
, VB2_BUF_STATE_ERROR
);
552 list_for_each_entry(buf
, &ceudev
->capture
, queue
)
553 vb2_buffer_done(&buf
->vb
.vb2_buf
, VB2_BUF_STATE_ERROR
);
555 spin_unlock(&ceudev
->lock
);
560 /* --- CEU Videobuf2 operations --- */
562 static void ceu_update_plane_sizes(struct v4l2_plane_pix_format
*plane
,
563 unsigned int bpl
, unsigned int szimage
)
565 memset(plane
, 0, sizeof(*plane
));
567 plane
->sizeimage
= szimage
;
568 if (plane
->bytesperline
< bpl
|| plane
->bytesperline
> CEU_MAX_BPL
)
569 plane
->bytesperline
= bpl
;
573 * ceu_calc_plane_sizes() - Fill per-plane 'struct v4l2_plane_pix_format'
574 * information according to the currently configured
576 * @ceu_device: CEU device.
577 * @ceu_fmt: Active image format.
578 * @pix: Pixel format information (store line width and image sizes)
580 static void ceu_calc_plane_sizes(struct ceu_device
*ceudev
,
581 const struct ceu_fmt
*ceu_fmt
,
582 struct v4l2_pix_format_mplane
*pix
)
584 unsigned int bpl
, szimage
;
586 switch (pix
->pixelformat
) {
587 case V4L2_PIX_FMT_YUYV
:
588 case V4L2_PIX_FMT_UYVY
:
589 case V4L2_PIX_FMT_YVYU
:
590 case V4L2_PIX_FMT_VYUY
:
592 bpl
= pix
->width
* ceu_fmt
->bpp
/ 8;
593 szimage
= pix
->height
* bpl
;
594 ceu_update_plane_sizes(&pix
->plane_fmt
[0], bpl
, szimage
);
597 case V4L2_PIX_FMT_NV12
:
598 case V4L2_PIX_FMT_NV21
:
601 szimage
= pix
->height
* pix
->width
;
602 ceu_update_plane_sizes(&pix
->plane_fmt
[0], bpl
, szimage
);
603 ceu_update_plane_sizes(&pix
->plane_fmt
[1], bpl
, szimage
/ 2);
606 case V4L2_PIX_FMT_NV16
:
607 case V4L2_PIX_FMT_NV61
:
611 szimage
= pix
->height
* pix
->width
;
612 ceu_update_plane_sizes(&pix
->plane_fmt
[0], bpl
, szimage
);
613 ceu_update_plane_sizes(&pix
->plane_fmt
[1], bpl
, szimage
);
619 * ceu_vb2_setup() - is called to check whether the driver can accept the
620 * requested number of buffers and to fill in plane sizes
621 * for the current frame format, if required.
623 static int ceu_vb2_setup(struct vb2_queue
*vq
, unsigned int *count
,
624 unsigned int *num_planes
, unsigned int sizes
[],
625 struct device
*alloc_devs
[])
627 struct ceu_device
*ceudev
= vb2_get_drv_priv(vq
);
628 struct v4l2_pix_format_mplane
*pix
= &ceudev
->v4l2_pix
;
631 /* num_planes is set: just check plane sizes. */
633 for (i
= 0; i
< pix
->num_planes
; i
++)
634 if (sizes
[i
] < pix
->plane_fmt
[i
].sizeimage
)
640 /* num_planes not set: called from REQBUFS, just set plane sizes. */
641 *num_planes
= pix
->num_planes
;
642 for (i
= 0; i
< pix
->num_planes
; i
++)
643 sizes
[i
] = pix
->plane_fmt
[i
].sizeimage
;
648 static void ceu_vb2_queue(struct vb2_buffer
*vb
)
650 struct ceu_device
*ceudev
= vb2_get_drv_priv(vb
->vb2_queue
);
651 struct vb2_v4l2_buffer
*vbuf
= to_vb2_v4l2_buffer(vb
);
652 struct ceu_buffer
*buf
= vb2_to_ceu(vbuf
);
653 unsigned long irqflags
;
655 spin_lock_irqsave(&ceudev
->lock
, irqflags
);
656 list_add_tail(&buf
->queue
, &ceudev
->capture
);
657 spin_unlock_irqrestore(&ceudev
->lock
, irqflags
);
660 static int ceu_vb2_prepare(struct vb2_buffer
*vb
)
662 struct ceu_device
*ceudev
= vb2_get_drv_priv(vb
->vb2_queue
);
663 struct v4l2_pix_format_mplane
*pix
= &ceudev
->v4l2_pix
;
666 for (i
= 0; i
< pix
->num_planes
; i
++) {
667 if (vb2_plane_size(vb
, i
) < pix
->plane_fmt
[i
].sizeimage
) {
669 "Plane size too small (%lu < %u)\n",
670 vb2_plane_size(vb
, i
),
671 pix
->plane_fmt
[i
].sizeimage
);
675 vb2_set_plane_payload(vb
, i
, pix
->plane_fmt
[i
].sizeimage
);
681 static int ceu_start_streaming(struct vb2_queue
*vq
, unsigned int count
)
683 struct ceu_device
*ceudev
= vb2_get_drv_priv(vq
);
684 struct v4l2_subdev
*v4l2_sd
= ceudev
->sd
->v4l2_sd
;
685 struct ceu_buffer
*buf
;
686 unsigned long irqflags
;
689 /* Program the CEU interface according to the CEU image format. */
690 ret
= ceu_hw_config(ceudev
);
692 goto error_return_bufs
;
694 ret
= v4l2_subdev_call(v4l2_sd
, video
, s_stream
, 1);
695 if (ret
&& ret
!= -ENOIOCTLCMD
) {
697 "Subdevice failed to start streaming: %d\n", ret
);
698 goto error_return_bufs
;
701 spin_lock_irqsave(&ceudev
->lock
, irqflags
);
702 ceudev
->sequence
= 0;
704 /* Grab the first available buffer and trigger the first capture. */
705 buf
= list_first_entry(&ceudev
->capture
, struct ceu_buffer
,
708 spin_unlock_irqrestore(&ceudev
->lock
, irqflags
);
710 "No buffer available for capture.\n");
711 goto error_stop_sensor
;
714 list_del(&buf
->queue
);
715 ceudev
->active
= &buf
->vb
;
717 /* Clean and program interrupts for first capture. */
718 ceu_write(ceudev
, CEU_CETCR
, ~ceudev
->irq_mask
);
719 ceu_write(ceudev
, CEU_CEIER
, CEU_CEIER_MASK
);
723 spin_unlock_irqrestore(&ceudev
->lock
, irqflags
);
728 v4l2_subdev_call(v4l2_sd
, video
, s_stream
, 0);
731 spin_lock_irqsave(&ceudev
->lock
, irqflags
);
732 list_for_each_entry(buf
, &ceudev
->capture
, queue
)
733 vb2_buffer_done(&ceudev
->active
->vb2_buf
,
734 VB2_BUF_STATE_QUEUED
);
735 ceudev
->active
= NULL
;
736 spin_unlock_irqrestore(&ceudev
->lock
, irqflags
);
741 static void ceu_stop_streaming(struct vb2_queue
*vq
)
743 struct ceu_device
*ceudev
= vb2_get_drv_priv(vq
);
744 struct v4l2_subdev
*v4l2_sd
= ceudev
->sd
->v4l2_sd
;
745 struct ceu_buffer
*buf
;
746 unsigned long irqflags
;
748 /* Clean and disable interrupt sources. */
749 ceu_write(ceudev
, CEU_CETCR
,
750 ceu_read(ceudev
, CEU_CETCR
) & ceudev
->irq_mask
);
751 ceu_write(ceudev
, CEU_CEIER
, CEU_CEIER_MASK
);
753 v4l2_subdev_call(v4l2_sd
, video
, s_stream
, 0);
755 spin_lock_irqsave(&ceudev
->lock
, irqflags
);
756 if (ceudev
->active
) {
757 vb2_buffer_done(&ceudev
->active
->vb2_buf
,
758 VB2_BUF_STATE_ERROR
);
759 ceudev
->active
= NULL
;
762 /* Release all queued buffers. */
763 list_for_each_entry(buf
, &ceudev
->capture
, queue
)
764 vb2_buffer_done(&buf
->vb
.vb2_buf
, VB2_BUF_STATE_ERROR
);
765 INIT_LIST_HEAD(&ceudev
->capture
);
767 spin_unlock_irqrestore(&ceudev
->lock
, irqflags
);
769 ceu_soft_reset(ceudev
);
772 static const struct vb2_ops ceu_vb2_ops
= {
773 .queue_setup
= ceu_vb2_setup
,
774 .buf_queue
= ceu_vb2_queue
,
775 .buf_prepare
= ceu_vb2_prepare
,
776 .wait_prepare
= vb2_ops_wait_prepare
,
777 .wait_finish
= vb2_ops_wait_finish
,
778 .start_streaming
= ceu_start_streaming
,
779 .stop_streaming
= ceu_stop_streaming
,
782 /* --- CEU image formats handling --- */
785 * __ceu_try_fmt() - test format on CEU and sensor
786 * @ceudev: The CEU device.
787 * @v4l2_fmt: format to test.
788 * @sd_mbus_code: the media bus code accepted by the subdevice; output param.
790 * Returns 0 for success, < 0 for errors.
792 static int __ceu_try_fmt(struct ceu_device
*ceudev
, struct v4l2_format
*v4l2_fmt
,
795 struct ceu_subdev
*ceu_sd
= ceudev
->sd
;
796 struct v4l2_pix_format_mplane
*pix
= &v4l2_fmt
->fmt
.pix_mp
;
797 struct v4l2_subdev
*v4l2_sd
= ceu_sd
->v4l2_sd
;
798 struct v4l2_subdev_pad_config pad_cfg
;
799 const struct ceu_fmt
*ceu_fmt
;
805 * Set format on sensor sub device: bus format used to produce memory
806 * format is selected depending on YUV component ordering or
807 * at initialization time.
809 struct v4l2_subdev_format sd_format
= {
810 .which
= V4L2_SUBDEV_FORMAT_TRY
,
813 mbus_code_old
= ceu_sd
->mbus_fmt
.mbus_code
;
815 switch (pix
->pixelformat
) {
816 case V4L2_PIX_FMT_YUYV
:
817 mbus_code
= MEDIA_BUS_FMT_YUYV8_2X8
;
819 case V4L2_PIX_FMT_UYVY
:
820 mbus_code
= MEDIA_BUS_FMT_UYVY8_2X8
;
822 case V4L2_PIX_FMT_YVYU
:
823 mbus_code
= MEDIA_BUS_FMT_YVYU8_2X8
;
825 case V4L2_PIX_FMT_VYUY
:
826 mbus_code
= MEDIA_BUS_FMT_VYUY8_2X8
;
828 case V4L2_PIX_FMT_NV16
:
829 case V4L2_PIX_FMT_NV61
:
830 case V4L2_PIX_FMT_NV12
:
831 case V4L2_PIX_FMT_NV21
:
832 mbus_code
= ceu_sd
->mbus_fmt
.mbus_code
;
836 pix
->pixelformat
= V4L2_PIX_FMT_NV16
;
837 mbus_code
= ceu_sd
->mbus_fmt
.mbus_code
;
841 ceu_fmt
= get_ceu_fmt_from_fourcc(pix
->pixelformat
);
843 /* CFSZR requires height and width to be 4-pixel aligned. */
844 v4l_bound_align_image(&pix
->width
, 2, CEU_MAX_WIDTH
, 4,
845 &pix
->height
, 4, CEU_MAX_HEIGHT
, 4, 0);
847 v4l2_fill_mbus_format_mplane(&sd_format
.format
, pix
);
850 * Try with the mbus_code matching YUYV components ordering first,
851 * if that one fails, fallback to default selected at initialization
854 sd_format
.format
.code
= mbus_code
;
855 ret
= v4l2_subdev_call(v4l2_sd
, pad
, set_fmt
, &pad_cfg
, &sd_format
);
857 if (ret
== -EINVAL
) {
859 sd_format
.format
.code
= mbus_code_old
;
860 ret
= v4l2_subdev_call(v4l2_sd
, pad
, set_fmt
,
861 &pad_cfg
, &sd_format
);
868 /* Apply size returned by sensor as the CEU can't scale. */
869 v4l2_fill_pix_format_mplane(pix
, &sd_format
.format
);
871 /* Calculate per-plane sizes based on image format. */
872 ceu_calc_plane_sizes(ceudev
, ceu_fmt
, pix
);
874 /* Report to caller the configured mbus format. */
875 *sd_mbus_code
= sd_format
.format
.code
;
881 * ceu_try_fmt() - Wrapper for __ceu_try_fmt; discard configured mbus_fmt
883 static int ceu_try_fmt(struct ceu_device
*ceudev
, struct v4l2_format
*v4l2_fmt
)
887 return __ceu_try_fmt(ceudev
, v4l2_fmt
, &mbus_code
);
891 * ceu_set_fmt() - Apply the supplied format to both sensor and CEU
893 static int ceu_set_fmt(struct ceu_device
*ceudev
, struct v4l2_format
*v4l2_fmt
)
895 struct ceu_subdev
*ceu_sd
= ceudev
->sd
;
896 struct v4l2_subdev
*v4l2_sd
= ceu_sd
->v4l2_sd
;
901 * Set format on sensor sub device: bus format used to produce memory
902 * format is selected at initialization time.
904 struct v4l2_subdev_format format
= {
905 .which
= V4L2_SUBDEV_FORMAT_ACTIVE
,
908 ret
= __ceu_try_fmt(ceudev
, v4l2_fmt
, &mbus_code
);
912 format
.format
.code
= mbus_code
;
913 v4l2_fill_mbus_format_mplane(&format
.format
, &v4l2_fmt
->fmt
.pix_mp
);
914 ret
= v4l2_subdev_call(v4l2_sd
, pad
, set_fmt
, NULL
, &format
);
918 ceudev
->v4l2_pix
= v4l2_fmt
->fmt
.pix_mp
;
919 ceudev
->field
= V4L2_FIELD_NONE
;
925 * ceu_set_default_fmt() - Apply default NV16 memory output format with VGA
928 static int ceu_set_default_fmt(struct ceu_device
*ceudev
)
932 struct v4l2_format v4l2_fmt
= {
933 .type
= V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE
,
936 .height
= VGA_HEIGHT
,
937 .field
= V4L2_FIELD_NONE
,
938 .pixelformat
= V4L2_PIX_FMT_NV16
,
942 .sizeimage
= VGA_WIDTH
* VGA_HEIGHT
* 2,
943 .bytesperline
= VGA_WIDTH
* 2,
946 .sizeimage
= VGA_WIDTH
* VGA_HEIGHT
* 2,
947 .bytesperline
= VGA_WIDTH
* 2,
953 ret
= ceu_try_fmt(ceudev
, &v4l2_fmt
);
957 ceudev
->v4l2_pix
= v4l2_fmt
.fmt
.pix_mp
;
958 ceudev
->field
= V4L2_FIELD_NONE
;
964 * ceu_init_mbus_fmt() - Query sensor for supported formats and initialize
965 * CEU media bus format used to produce memory formats.
967 * Find out if sensor can produce a permutation of 8-bits YUYV bus format.
968 * From a single 8-bits YUYV bus format the CEU can produce several memory
970 * - NV[12|21|16|61] through image fetch mode;
971 * - YUYV422 if sensor provides YUYV422
973 * TODO: Other YUYV422 permutations through data fetch sync mode and DTARY
974 * TODO: Binary data (eg. JPEG) and raw formats through data fetch sync mode
976 static int ceu_init_mbus_fmt(struct ceu_device
*ceudev
)
978 struct ceu_subdev
*ceu_sd
= ceudev
->sd
;
979 struct ceu_mbus_fmt
*mbus_fmt
= &ceu_sd
->mbus_fmt
;
980 struct v4l2_subdev
*v4l2_sd
= ceu_sd
->v4l2_sd
;
981 bool yuyv_bus_fmt
= false;
983 struct v4l2_subdev_mbus_code_enum sd_mbus_fmt
= {
984 .which
= V4L2_SUBDEV_FORMAT_ACTIVE
,
988 /* Find out if sensor can produce any permutation of 8-bits YUYV422. */
989 while (!yuyv_bus_fmt
&&
990 !v4l2_subdev_call(v4l2_sd
, pad
, enum_mbus_code
,
991 NULL
, &sd_mbus_fmt
)) {
992 switch (sd_mbus_fmt
.code
) {
993 case MEDIA_BUS_FMT_YUYV8_2X8
:
994 case MEDIA_BUS_FMT_YVYU8_2X8
:
995 case MEDIA_BUS_FMT_UYVY8_2X8
:
996 case MEDIA_BUS_FMT_VYUY8_2X8
:
1001 * Only support 8-bits YUYV bus formats at the moment;
1003 * TODO: add support for binary formats (data sync
1009 sd_mbus_fmt
.index
++;
1016 * Save the first encountered YUYV format as "mbus_fmt" and use it
1017 * to output all planar YUV422 and YUV420 (NV*) formats to memory as
1018 * well as for data synch fetch mode (YUYV - YVYU etc. ).
1020 mbus_fmt
->mbus_code
= sd_mbus_fmt
.code
;
1023 /* Annotate the selected bus format components ordering. */
1024 switch (sd_mbus_fmt
.code
) {
1025 case MEDIA_BUS_FMT_YUYV8_2X8
:
1026 mbus_fmt
->fmt_order
= CEU_CAMCR_DTARY_8_YUYV
;
1027 mbus_fmt
->fmt_order_swap
= CEU_CAMCR_DTARY_8_YVYU
;
1028 mbus_fmt
->swapped
= false;
1032 case MEDIA_BUS_FMT_YVYU8_2X8
:
1033 mbus_fmt
->fmt_order
= CEU_CAMCR_DTARY_8_YVYU
;
1034 mbus_fmt
->fmt_order_swap
= CEU_CAMCR_DTARY_8_YUYV
;
1035 mbus_fmt
->swapped
= true;
1039 case MEDIA_BUS_FMT_UYVY8_2X8
:
1040 mbus_fmt
->fmt_order
= CEU_CAMCR_DTARY_8_UYVY
;
1041 mbus_fmt
->fmt_order_swap
= CEU_CAMCR_DTARY_8_VYUY
;
1042 mbus_fmt
->swapped
= false;
1046 case MEDIA_BUS_FMT_VYUY8_2X8
:
1047 mbus_fmt
->fmt_order
= CEU_CAMCR_DTARY_8_VYUY
;
1048 mbus_fmt
->fmt_order_swap
= CEU_CAMCR_DTARY_8_UYVY
;
1049 mbus_fmt
->swapped
= true;
1057 /* --- Runtime PM Handlers --- */
1060 * ceu_runtime_resume() - soft-reset the interface and turn sensor power on.
1062 static int __maybe_unused
ceu_runtime_resume(struct device
*dev
)
1064 struct ceu_device
*ceudev
= dev_get_drvdata(dev
);
1065 struct v4l2_subdev
*v4l2_sd
= ceudev
->sd
->v4l2_sd
;
1067 v4l2_subdev_call(v4l2_sd
, core
, s_power
, 1);
1069 ceu_soft_reset(ceudev
);
1075 * ceu_runtime_suspend() - disable capture and interrupts and soft-reset.
1076 * Turn sensor power off.
1078 static int __maybe_unused
ceu_runtime_suspend(struct device
*dev
)
1080 struct ceu_device
*ceudev
= dev_get_drvdata(dev
);
1081 struct v4l2_subdev
*v4l2_sd
= ceudev
->sd
->v4l2_sd
;
1083 v4l2_subdev_call(v4l2_sd
, core
, s_power
, 0);
1085 ceu_write(ceudev
, CEU_CEIER
, 0);
1086 ceu_soft_reset(ceudev
);
1091 /* --- File Operations --- */
1093 static int ceu_open(struct file
*file
)
1095 struct ceu_device
*ceudev
= video_drvdata(file
);
1098 ret
= v4l2_fh_open(file
);
1102 mutex_lock(&ceudev
->mlock
);
1103 /* Causes soft-reset and sensor power on on first open */
1104 pm_runtime_get_sync(ceudev
->dev
);
1105 mutex_unlock(&ceudev
->mlock
);
1110 static int ceu_release(struct file
*file
)
1112 struct ceu_device
*ceudev
= video_drvdata(file
);
1114 vb2_fop_release(file
);
1116 mutex_lock(&ceudev
->mlock
);
1117 /* Causes soft-reset and sensor power down on last close */
1118 pm_runtime_put(ceudev
->dev
);
1119 mutex_unlock(&ceudev
->mlock
);
1124 static const struct v4l2_file_operations ceu_fops
= {
1125 .owner
= THIS_MODULE
,
1127 .release
= ceu_release
,
1128 .unlocked_ioctl
= video_ioctl2
,
1129 .mmap
= vb2_fop_mmap
,
1130 .poll
= vb2_fop_poll
,
1133 /* --- Video Device IOCTLs --- */
1135 static int ceu_querycap(struct file
*file
, void *priv
,
1136 struct v4l2_capability
*cap
)
1138 struct ceu_device
*ceudev
= video_drvdata(file
);
1140 strlcpy(cap
->card
, "Renesas CEU", sizeof(cap
->card
));
1141 strlcpy(cap
->driver
, DRIVER_NAME
, sizeof(cap
->driver
));
1142 snprintf(cap
->bus_info
, sizeof(cap
->bus_info
),
1143 "platform:renesas-ceu-%s", dev_name(ceudev
->dev
));
1148 static int ceu_enum_fmt_vid_cap(struct file
*file
, void *priv
,
1149 struct v4l2_fmtdesc
*f
)
1151 const struct ceu_fmt
*fmt
;
1153 if (f
->index
>= ARRAY_SIZE(ceu_fmt_list
))
1156 fmt
= &ceu_fmt_list
[f
->index
];
1157 f
->pixelformat
= fmt
->fourcc
;
1162 static int ceu_try_fmt_vid_cap(struct file
*file
, void *priv
,
1163 struct v4l2_format
*f
)
1165 struct ceu_device
*ceudev
= video_drvdata(file
);
1167 return ceu_try_fmt(ceudev
, f
);
1170 static int ceu_s_fmt_vid_cap(struct file
*file
, void *priv
,
1171 struct v4l2_format
*f
)
1173 struct ceu_device
*ceudev
= video_drvdata(file
);
1175 if (vb2_is_streaming(&ceudev
->vb2_vq
))
1178 return ceu_set_fmt(ceudev
, f
);
1181 static int ceu_g_fmt_vid_cap(struct file
*file
, void *priv
,
1182 struct v4l2_format
*f
)
1184 struct ceu_device
*ceudev
= video_drvdata(file
);
1186 f
->fmt
.pix_mp
= ceudev
->v4l2_pix
;
1191 static int ceu_enum_input(struct file
*file
, void *priv
,
1192 struct v4l2_input
*inp
)
1194 struct ceu_device
*ceudev
= video_drvdata(file
);
1195 struct ceu_subdev
*ceusd
;
1197 if (inp
->index
>= ceudev
->num_sd
)
1200 ceusd
= &ceudev
->subdevs
[inp
->index
];
1202 inp
->type
= V4L2_INPUT_TYPE_CAMERA
;
1204 snprintf(inp
->name
, sizeof(inp
->name
), "Camera%u: %s",
1205 inp
->index
, ceusd
->v4l2_sd
->name
);
1210 static int ceu_g_input(struct file
*file
, void *priv
, unsigned int *i
)
1212 struct ceu_device
*ceudev
= video_drvdata(file
);
1214 *i
= ceudev
->sd_index
;
1219 static int ceu_s_input(struct file
*file
, void *priv
, unsigned int i
)
1221 struct ceu_device
*ceudev
= video_drvdata(file
);
1222 struct ceu_subdev
*ceu_sd_old
;
1225 if (i
>= ceudev
->num_sd
)
1228 if (vb2_is_streaming(&ceudev
->vb2_vq
))
1231 if (i
== ceudev
->sd_index
)
1234 ceu_sd_old
= ceudev
->sd
;
1235 ceudev
->sd
= &ceudev
->subdevs
[i
];
1238 * Make sure we can generate output image formats and apply
1241 ret
= ceu_init_mbus_fmt(ceudev
);
1243 ceudev
->sd
= ceu_sd_old
;
1247 ret
= ceu_set_default_fmt(ceudev
);
1249 ceudev
->sd
= ceu_sd_old
;
1253 /* Now that we're sure we can use the sensor, power off the old one. */
1254 v4l2_subdev_call(ceu_sd_old
->v4l2_sd
, core
, s_power
, 0);
1255 v4l2_subdev_call(ceudev
->sd
->v4l2_sd
, core
, s_power
, 1);
1257 ceudev
->sd_index
= i
;
1262 static int ceu_g_parm(struct file
*file
, void *fh
, struct v4l2_streamparm
*a
)
1264 struct ceu_device
*ceudev
= video_drvdata(file
);
1266 return v4l2_g_parm_cap(video_devdata(file
), ceudev
->sd
->v4l2_sd
, a
);
1269 static int ceu_s_parm(struct file
*file
, void *fh
, struct v4l2_streamparm
*a
)
1271 struct ceu_device
*ceudev
= video_drvdata(file
);
1273 return v4l2_s_parm_cap(video_devdata(file
), ceudev
->sd
->v4l2_sd
, a
);
1276 static int ceu_enum_framesizes(struct file
*file
, void *fh
,
1277 struct v4l2_frmsizeenum
*fsize
)
1279 struct ceu_device
*ceudev
= video_drvdata(file
);
1280 struct ceu_subdev
*ceu_sd
= ceudev
->sd
;
1281 const struct ceu_fmt
*ceu_fmt
;
1282 struct v4l2_subdev
*v4l2_sd
= ceu_sd
->v4l2_sd
;
1285 struct v4l2_subdev_frame_size_enum fse
= {
1286 .code
= ceu_sd
->mbus_fmt
.mbus_code
,
1287 .index
= fsize
->index
,
1288 .which
= V4L2_SUBDEV_FORMAT_ACTIVE
,
1291 /* Just check if user supplied pixel format is supported. */
1292 ceu_fmt
= get_ceu_fmt_from_fourcc(fsize
->pixel_format
);
1296 ret
= v4l2_subdev_call(v4l2_sd
, pad
, enum_frame_size
,
1301 fsize
->type
= V4L2_FRMSIZE_TYPE_DISCRETE
;
1302 fsize
->discrete
.width
= CEU_W_MAX(fse
.max_width
);
1303 fsize
->discrete
.height
= CEU_H_MAX(fse
.max_height
);
1308 static int ceu_enum_frameintervals(struct file
*file
, void *fh
,
1309 struct v4l2_frmivalenum
*fival
)
1311 struct ceu_device
*ceudev
= video_drvdata(file
);
1312 struct ceu_subdev
*ceu_sd
= ceudev
->sd
;
1313 const struct ceu_fmt
*ceu_fmt
;
1314 struct v4l2_subdev
*v4l2_sd
= ceu_sd
->v4l2_sd
;
1317 struct v4l2_subdev_frame_interval_enum fie
= {
1318 .code
= ceu_sd
->mbus_fmt
.mbus_code
,
1319 .index
= fival
->index
,
1320 .width
= fival
->width
,
1321 .height
= fival
->height
,
1322 .which
= V4L2_SUBDEV_FORMAT_ACTIVE
,
1325 /* Just check if user supplied pixel format is supported. */
1326 ceu_fmt
= get_ceu_fmt_from_fourcc(fival
->pixel_format
);
1330 ret
= v4l2_subdev_call(v4l2_sd
, pad
, enum_frame_interval
, NULL
,
1335 fival
->type
= V4L2_FRMIVAL_TYPE_DISCRETE
;
1336 fival
->discrete
= fie
.interval
;
1341 static const struct v4l2_ioctl_ops ceu_ioctl_ops
= {
1342 .vidioc_querycap
= ceu_querycap
,
1344 .vidioc_enum_fmt_vid_cap_mplane
= ceu_enum_fmt_vid_cap
,
1345 .vidioc_try_fmt_vid_cap_mplane
= ceu_try_fmt_vid_cap
,
1346 .vidioc_s_fmt_vid_cap_mplane
= ceu_s_fmt_vid_cap
,
1347 .vidioc_g_fmt_vid_cap_mplane
= ceu_g_fmt_vid_cap
,
1349 .vidioc_enum_input
= ceu_enum_input
,
1350 .vidioc_g_input
= ceu_g_input
,
1351 .vidioc_s_input
= ceu_s_input
,
1353 .vidioc_reqbufs
= vb2_ioctl_reqbufs
,
1354 .vidioc_querybuf
= vb2_ioctl_querybuf
,
1355 .vidioc_qbuf
= vb2_ioctl_qbuf
,
1356 .vidioc_expbuf
= vb2_ioctl_expbuf
,
1357 .vidioc_dqbuf
= vb2_ioctl_dqbuf
,
1358 .vidioc_create_bufs
= vb2_ioctl_create_bufs
,
1359 .vidioc_prepare_buf
= vb2_ioctl_prepare_buf
,
1360 .vidioc_streamon
= vb2_ioctl_streamon
,
1361 .vidioc_streamoff
= vb2_ioctl_streamoff
,
1363 .vidioc_g_parm
= ceu_g_parm
,
1364 .vidioc_s_parm
= ceu_s_parm
,
1365 .vidioc_enum_framesizes
= ceu_enum_framesizes
,
1366 .vidioc_enum_frameintervals
= ceu_enum_frameintervals
,
1368 .vidioc_log_status
= v4l2_ctrl_log_status
,
1369 .vidioc_subscribe_event
= v4l2_ctrl_subscribe_event
,
1370 .vidioc_unsubscribe_event
= v4l2_event_unsubscribe
,
1374 * ceu_vdev_release() - release CEU video device memory when last reference
1375 * to this driver is closed
1377 static void ceu_vdev_release(struct video_device
*vdev
)
1379 struct ceu_device
*ceudev
= video_get_drvdata(vdev
);
1384 static int ceu_notify_bound(struct v4l2_async_notifier
*notifier
,
1385 struct v4l2_subdev
*v4l2_sd
,
1386 struct v4l2_async_subdev
*asd
)
1388 struct v4l2_device
*v4l2_dev
= notifier
->v4l2_dev
;
1389 struct ceu_device
*ceudev
= v4l2_to_ceu(v4l2_dev
);
1390 struct ceu_subdev
*ceu_sd
= to_ceu_subdev(asd
);
1392 ceu_sd
->v4l2_sd
= v4l2_sd
;
1398 static int ceu_notify_complete(struct v4l2_async_notifier
*notifier
)
1400 struct v4l2_device
*v4l2_dev
= notifier
->v4l2_dev
;
1401 struct ceu_device
*ceudev
= v4l2_to_ceu(v4l2_dev
);
1402 struct video_device
*vdev
= &ceudev
->vdev
;
1403 struct vb2_queue
*q
= &ceudev
->vb2_vq
;
1404 struct v4l2_subdev
*v4l2_sd
;
1407 /* Initialize vb2 queue. */
1408 q
->type
= V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE
;
1409 q
->io_modes
= VB2_MMAP
| VB2_DMABUF
;
1410 q
->drv_priv
= ceudev
;
1411 q
->ops
= &ceu_vb2_ops
;
1412 q
->mem_ops
= &vb2_dma_contig_memops
;
1413 q
->buf_struct_size
= sizeof(struct ceu_buffer
);
1414 q
->timestamp_flags
= V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC
;
1415 q
->min_buffers_needed
= 2;
1416 q
->lock
= &ceudev
->mlock
;
1417 q
->dev
= ceudev
->v4l2_dev
.dev
;
1419 ret
= vb2_queue_init(q
);
1424 * Make sure at least one sensor is primary and use it to initialize
1428 ceudev
->sd
= &ceudev
->subdevs
[0];
1429 ceudev
->sd_index
= 0;
1432 v4l2_sd
= ceudev
->sd
->v4l2_sd
;
1434 ret
= ceu_init_mbus_fmt(ceudev
);
1438 ret
= ceu_set_default_fmt(ceudev
);
1442 /* Register the video device. */
1443 strlcpy(vdev
->name
, DRIVER_NAME
, sizeof(vdev
->name
));
1444 vdev
->v4l2_dev
= v4l2_dev
;
1445 vdev
->lock
= &ceudev
->mlock
;
1446 vdev
->queue
= &ceudev
->vb2_vq
;
1447 vdev
->ctrl_handler
= v4l2_sd
->ctrl_handler
;
1448 vdev
->fops
= &ceu_fops
;
1449 vdev
->ioctl_ops
= &ceu_ioctl_ops
;
1450 vdev
->release
= ceu_vdev_release
;
1451 vdev
->device_caps
= V4L2_CAP_VIDEO_CAPTURE_MPLANE
|
1453 video_set_drvdata(vdev
, ceudev
);
1455 ret
= video_register_device(vdev
, VFL_TYPE_GRABBER
, -1);
1457 v4l2_err(vdev
->v4l2_dev
,
1458 "video_register_device failed: %d\n", ret
);
1465 static const struct v4l2_async_notifier_operations ceu_notify_ops
= {
1466 .bound
= ceu_notify_bound
,
1467 .complete
= ceu_notify_complete
,
1471 * ceu_init_async_subdevs() - Initialize CEU subdevices and async_subdevs in
1472 * ceu device. Both DT and platform data parsing use
1475 * Returns 0 for success, -ENOMEM for failure.
1477 static int ceu_init_async_subdevs(struct ceu_device
*ceudev
, unsigned int n_sd
)
1479 /* Reserve memory for 'n_sd' ceu_subdev descriptors. */
1480 ceudev
->subdevs
= devm_kcalloc(ceudev
->dev
, n_sd
,
1481 sizeof(*ceudev
->subdevs
), GFP_KERNEL
);
1482 if (!ceudev
->subdevs
)
1486 * Reserve memory for 'n_sd' pointers to async_subdevices.
1487 * ceudev->asds members will point to &ceu_subdev.asd
1489 ceudev
->asds
= devm_kcalloc(ceudev
->dev
, n_sd
,
1490 sizeof(*ceudev
->asds
), GFP_KERNEL
);
1495 ceudev
->sd_index
= 0;
1502 * ceu_parse_platform_data() - Initialize async_subdevices using platform
1503 * device provided data.
1505 static int ceu_parse_platform_data(struct ceu_device
*ceudev
,
1506 const struct ceu_platform_data
*pdata
)
1508 const struct ceu_async_subdev
*async_sd
;
1509 struct ceu_subdev
*ceu_sd
;
1513 if (pdata
->num_subdevs
== 0)
1516 ret
= ceu_init_async_subdevs(ceudev
, pdata
->num_subdevs
);
1520 for (i
= 0; i
< pdata
->num_subdevs
; i
++) {
1521 /* Setup the ceu subdevice and the async subdevice. */
1522 async_sd
= &pdata
->subdevs
[i
];
1523 ceu_sd
= &ceudev
->subdevs
[i
];
1525 INIT_LIST_HEAD(&ceu_sd
->asd
.list
);
1527 ceu_sd
->mbus_flags
= async_sd
->flags
;
1528 ceu_sd
->asd
.match_type
= V4L2_ASYNC_MATCH_I2C
;
1529 ceu_sd
->asd
.match
.i2c
.adapter_id
= async_sd
->i2c_adapter_id
;
1530 ceu_sd
->asd
.match
.i2c
.address
= async_sd
->i2c_address
;
1532 ceudev
->asds
[i
] = &ceu_sd
->asd
;
1535 return pdata
->num_subdevs
;
1539 * ceu_parse_dt() - Initialize async_subdevs parsing device tree graph.
1541 static int ceu_parse_dt(struct ceu_device
*ceudev
)
1543 struct device_node
*of
= ceudev
->dev
->of_node
;
1544 struct v4l2_fwnode_endpoint fw_ep
;
1545 struct ceu_subdev
*ceu_sd
;
1546 struct device_node
*ep
;
1551 num_ep
= of_graph_get_endpoint_count(of
);
1555 ret
= ceu_init_async_subdevs(ceudev
, num_ep
);
1559 for (i
= 0; i
< num_ep
; i
++) {
1560 ep
= of_graph_get_endpoint_by_regs(of
, 0, i
);
1562 dev_err(ceudev
->dev
,
1563 "No subdevice connected on endpoint %u.\n", i
);
1565 goto error_put_node
;
1568 ret
= v4l2_fwnode_endpoint_parse(of_fwnode_handle(ep
), &fw_ep
);
1570 dev_err(ceudev
->dev
,
1571 "Unable to parse endpoint #%u.\n", i
);
1572 goto error_put_node
;
1575 if (fw_ep
.bus_type
!= V4L2_MBUS_PARALLEL
) {
1576 dev_err(ceudev
->dev
,
1577 "Only parallel input supported.\n");
1579 goto error_put_node
;
1582 /* Setup the ceu subdevice and the async subdevice. */
1583 ceu_sd
= &ceudev
->subdevs
[i
];
1584 INIT_LIST_HEAD(&ceu_sd
->asd
.list
);
1586 ceu_sd
->mbus_flags
= fw_ep
.bus
.parallel
.flags
;
1587 ceu_sd
->asd
.match_type
= V4L2_ASYNC_MATCH_FWNODE
;
1588 ceu_sd
->asd
.match
.fwnode
=
1589 fwnode_graph_get_remote_port_parent(
1590 of_fwnode_handle(ep
));
1592 ceudev
->asds
[i
] = &ceu_sd
->asd
;
1604 * struct ceu_data - Platform specific CEU data
1605 * @irq_mask: CETCR mask with all interrupt sources enabled. The mask differs
1606 * between SH4 and RZ platforms.
1612 static const struct ceu_data ceu_data_rz
= {
1613 .irq_mask
= CEU_CETCR_ALL_IRQS_RZ
,
1616 static const struct ceu_data ceu_data_sh4
= {
1617 .irq_mask
= CEU_CETCR_ALL_IRQS_SH4
,
1620 #if IS_ENABLED(CONFIG_OF)
1621 static const struct of_device_id ceu_of_match
[] = {
1622 { .compatible
= "renesas,r7s72100-ceu", .data
= &ceu_data_rz
},
1623 { .compatible
= "renesas,r8a7740-ceu", .data
= &ceu_data_rz
},
1626 MODULE_DEVICE_TABLE(of
, ceu_of_match
);
1629 static int ceu_probe(struct platform_device
*pdev
)
1631 struct device
*dev
= &pdev
->dev
;
1632 const struct ceu_data
*ceu_data
;
1633 struct ceu_device
*ceudev
;
1634 struct resource
*res
;
1639 ceudev
= kzalloc(sizeof(*ceudev
), GFP_KERNEL
);
1643 platform_set_drvdata(pdev
, ceudev
);
1646 INIT_LIST_HEAD(&ceudev
->capture
);
1647 spin_lock_init(&ceudev
->lock
);
1648 mutex_init(&ceudev
->mlock
);
1650 res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
1651 ceudev
->base
= devm_ioremap_resource(dev
, res
);
1652 if (IS_ERR(ceudev
->base
)) {
1653 ret
= PTR_ERR(ceudev
->base
);
1654 goto error_free_ceudev
;
1657 ret
= platform_get_irq(pdev
, 0);
1659 dev_err(dev
, "Failed to get irq: %d\n", ret
);
1660 goto error_free_ceudev
;
1664 ret
= devm_request_irq(dev
, irq
, ceu_irq
,
1665 0, dev_name(dev
), ceudev
);
1667 dev_err(&pdev
->dev
, "Unable to request CEU interrupt.\n");
1668 goto error_free_ceudev
;
1671 pm_runtime_enable(dev
);
1673 ret
= v4l2_device_register(dev
, &ceudev
->v4l2_dev
);
1675 goto error_pm_disable
;
1677 if (IS_ENABLED(CONFIG_OF
) && dev
->of_node
) {
1678 ceu_data
= of_match_device(ceu_of_match
, dev
)->data
;
1679 num_subdevs
= ceu_parse_dt(ceudev
);
1680 } else if (dev
->platform_data
) {
1681 /* Assume SH4 if booting with platform data. */
1682 ceu_data
= &ceu_data_sh4
;
1683 num_subdevs
= ceu_parse_platform_data(ceudev
,
1684 dev
->platform_data
);
1686 num_subdevs
= -EINVAL
;
1689 if (num_subdevs
< 0) {
1691 goto error_v4l2_unregister
;
1693 ceudev
->irq_mask
= ceu_data
->irq_mask
;
1695 ceudev
->notifier
.v4l2_dev
= &ceudev
->v4l2_dev
;
1696 ceudev
->notifier
.subdevs
= ceudev
->asds
;
1697 ceudev
->notifier
.num_subdevs
= num_subdevs
;
1698 ceudev
->notifier
.ops
= &ceu_notify_ops
;
1699 ret
= v4l2_async_notifier_register(&ceudev
->v4l2_dev
,
1702 goto error_v4l2_unregister
;
1704 dev_info(dev
, "Renesas Capture Engine Unit %s\n", dev_name(dev
));
1708 error_v4l2_unregister
:
1709 v4l2_device_unregister(&ceudev
->v4l2_dev
);
1711 pm_runtime_disable(dev
);
1718 static int ceu_remove(struct platform_device
*pdev
)
1720 struct ceu_device
*ceudev
= platform_get_drvdata(pdev
);
1722 pm_runtime_disable(ceudev
->dev
);
1724 v4l2_async_notifier_unregister(&ceudev
->notifier
);
1726 v4l2_device_unregister(&ceudev
->v4l2_dev
);
1728 video_unregister_device(&ceudev
->vdev
);
1733 static const struct dev_pm_ops ceu_pm_ops
= {
1734 SET_RUNTIME_PM_OPS(ceu_runtime_suspend
,
1739 static struct platform_driver ceu_driver
= {
1741 .name
= DRIVER_NAME
,
1743 .of_match_table
= of_match_ptr(ceu_of_match
),
1746 .remove
= ceu_remove
,
1749 module_platform_driver(ceu_driver
);
1751 MODULE_DESCRIPTION("Renesas CEU camera driver");
1752 MODULE_AUTHOR("Jacopo Mondi <jacopo+renesas@jmondi.org>");
1753 MODULE_LICENSE("GPL v2");