7 #include <linux/kernel.h>
8 #include <linux/module.h>
11 #include <linux/i2c.h>
14 #include <linux/slab.h>
15 #include <linux/device.h>
16 #include <linux/wait.h>
17 #include <linux/list.h>
22 #include <linux/videodev2.h>
40 #ifdef MCAM_MODE_VMALLOC
54 static bool alloc_bufs_at_read;
57 "Non-zero value causes DMA buffers to be allocated when the "
58 "video capture device is read, rather than at module load "
59 "time. This saves memory, but decreases the chances of "
60 "successfully getting those buffers. This parameter is "
61 "only used in the vmalloc buffer mode");
63 static int n_dma_bufs = 3;
66 "The number of DMA buffers to allocate. Can be either two "
67 "(saves memory, makes timing tighter) or three.");
72 "The size of the allocated DMA buffers. If actual operating "
73 "parameters require larger buffers, an attempt to reallocate "
76 static const bool alloc_bufs_at_read = 0;
77 static const int n_dma_bufs = 3;
83 "If set, the sensor will be instructed to flip the image "
86 static int buffer_mode = -1;
89 "Set the buffer mode to be used; default is to go with what "
90 "the platform driver asks for. Set to 0 for vmalloc, 1 for "
96 #define CF_BUF0_VALID 0
97 #define CF_BUF1_VALID 1
98 #define CF_BUF2_VALID 2
99 #define CF_DMA_ACTIVE 3
100 #define CF_CONFIG_NEEDED 4
101 #define CF_SINGLE_BUFFER 5
102 #define CF_SG_RESTART 6
104 #define sensor_call(cam, o, f, args...) \
105 v4l2_subdev_call(cam->sensor, o, f, ##args)
107 static struct mcam_format_struct {
114 .desc =
"YUYV 4:2:2",
132 .desc =
"Raw RGB Bayer",
138 #define N_MCAM_FMTS ARRAY_SIZE(mcam_formats)
140 static struct mcam_format_struct *mcam_find_format(
u32 pixelformat)
145 if (mcam_formats[i].pixelformat == pixelformat)
146 return mcam_formats +
i;
204 vb2_set_plane_payload(vbuf, 0, cam->
pix_format.sizeimage);
213 #define cam_err(cam, fmt, arg...) \
214 dev_err((cam)->dev, fmt, ##arg);
215 #define cam_warn(cam, fmt, arg...) \
216 dev_warn((cam)->dev, fmt, ##arg);
217 #define cam_dbg(cam, fmt, arg...) \
218 dev_dbg((cam)->dev, fmt, ##arg);
229 for (i = 0; i < cam->
nbufs; i++)
238 static void mcam_set_config_needed(
struct mcam_camera *
cam,
int needed)
251 static void mcam_ctlr_start(
struct mcam_camera *cam)
258 static void mcam_ctlr_stop(
struct mcam_camera *cam)
265 #ifdef MCAM_MODE_VMALLOC
273 static int mcam_alloc_dma_bufs(
struct mcam_camera *cam,
int loadtime)
277 mcam_set_config_needed(cam, 1);
279 cam->dma_buf_size = dma_buf_size;
281 cam->dma_buf_size = cam->
pix_format.sizeimage;
286 for (i = 0; i < n_dma_bufs; i++) {
288 cam->dma_buf_size, cam->dma_handles + i,
290 if (cam->dma_bufs[i] ==
NULL) {
291 cam_warn(cam,
"Failed to allocate DMA buffer\n");
297 switch (cam->
nbufs) {
300 cam->dma_bufs[0], cam->dma_handles[0]);
303 cam_err(cam,
"Insufficient DMA buffers, cannot operate\n");
308 cam_warn(cam,
"Will limp along with only 2 buffers\n");
314 static void mcam_free_dma_bufs(
struct mcam_camera *cam)
318 for (i = 0; i < cam->
nbufs; i++) {
320 cam->dma_bufs[i], cam->dma_handles[i]);
321 cam->dma_bufs[
i] =
NULL;
330 static void mcam_ctlr_dma_vmalloc(
struct mcam_camera *cam)
338 mcam_reg_write(cam,
REG_Y0BAR, cam->dma_handles[0]);
339 mcam_reg_write(cam,
REG_Y1BAR, cam->dma_handles[1]);
340 if (cam->
nbufs > 2) {
341 mcam_reg_write(cam,
REG_Y2BAR, cam->dma_handles[2]);
352 static void mcam_frame_tasklet(
unsigned long data)
360 for (i = 0; i < cam->
nbufs; i++) {
369 if (list_empty(&cam->
buffers)) {
377 list_del_init(&buf->
queue);
381 spin_unlock_irqrestore(&cam->
dev_lock, flags);
384 mcam_buffer_done(cam, bufno, &buf->
vb_buf);
387 spin_unlock_irqrestore(&cam->
dev_lock, flags);
394 static int mcam_check_dma_buffers(
struct mcam_camera *cam)
397 mcam_free_dma_bufs(cam);
399 return mcam_alloc_dma_bufs(cam, 0);
405 tasklet_schedule(&cam->s_tasklet);
410 static inline int mcam_alloc_dma_bufs(
struct mcam_camera *cam,
int loadtime)
415 static inline void mcam_free_dma_bufs(
struct mcam_camera *cam)
420 static inline int mcam_check_dma_buffers(
struct mcam_camera *cam)
430 #ifdef MCAM_MODE_DMA_CONTIG
449 if (list_empty(&cam->
buffers)) {
450 buf = cam->
vb_bufs[frame ^ 0x1];
453 vb2_dma_contig_plane_dma_addr(&buf->
vb_buf, 0));
462 list_del_init(&buf->
queue);
464 vb2_dma_contig_plane_dma_addr(&buf->
vb_buf, 0));
472 static void mcam_ctlr_dma_contig(
struct mcam_camera *cam)
476 mcam_set_contig_buffer(cam, 0);
477 mcam_set_contig_buffer(cam, 1);
483 static void mcam_dma_contig_done(
struct mcam_camera *cam,
int frame)
489 mcam_buffer_done(cam, frame, &buf->
vb_buf);
491 mcam_set_contig_buffer(cam, frame);
496 #ifdef MCAM_MODE_DMA_SG
506 static void mcam_sg_next_buffer(
struct mcam_camera *cam)
511 list_del_init(&buf->
queue);
529 static void mcam_ctlr_dma_sg(
struct mcam_camera *cam)
535 if (list_empty(&cam->
buffers)) {
541 mcam_sg_next_buffer(cam);
559 static void mcam_dma_sg_done(
struct mcam_camera *cam,
int frame)
572 if (!list_empty(&cam->
buffers)) {
573 mcam_sg_next_buffer(cam);
574 mcam_ctlr_start(cam);
588 mcam_buffer_done(cam, frame, &buf->
vb_buf);
598 static void mcam_sg_restart(
struct mcam_camera *cam)
600 mcam_ctlr_dma_sg(cam);
601 mcam_ctlr_start(cam);
607 static inline void mcam_sg_restart(
struct mcam_camera *cam)
622 static void mcam_ctlr_image(
struct mcam_camera *cam)
673 static int mcam_ctlr_configure(
struct mcam_camera *cam)
680 mcam_ctlr_image(cam);
681 mcam_set_config_needed(cam, 0);
682 spin_unlock_irqrestore(&cam->
dev_lock, flags);
686 static void mcam_ctlr_irq_enable(
struct mcam_camera *cam)
696 static void mcam_ctlr_irq_disable(
struct mcam_camera *cam)
703 static void mcam_ctlr_init(
struct mcam_camera *cam)
722 spin_unlock_irqrestore(&cam->
dev_lock, flags);
730 static void mcam_ctlr_stop_dma(
struct mcam_camera *cam)
743 spin_unlock_irqrestore(&cam->
dev_lock, flags);
753 cam_err(cam,
"Timeout waiting for DMA to end\n");
756 mcam_ctlr_irq_disable(cam);
757 spin_unlock_irqrestore(&cam->
dev_lock, flags);
763 static void mcam_ctlr_power_up(
struct mcam_camera *cam)
770 spin_unlock_irqrestore(&cam->
dev_lock, flags);
774 static void mcam_ctlr_power_down(
struct mcam_camera *cam)
786 spin_unlock_irqrestore(&cam->
dev_lock, flags);
794 static int __mcam_cam_reset(
struct mcam_camera *cam)
810 cam_warn(cam,
"Cam init with device in funky state %d",
812 ret = __mcam_cam_reset(cam);
831 mcam_ctlr_power_down(cam);
840 static int mcam_cam_set_flip(
struct mcam_camera *cam)
851 static int mcam_cam_configure(
struct mcam_camera *cam)
853 struct v4l2_mbus_framefmt mbus_fmt;
859 ret =
sensor_call(cam, video, s_mbus_fmt, &mbus_fmt);
863 ret += mcam_cam_set_flip(cam);
870 static int mcam_read_setup(
struct mcam_camera *cam)
880 mcam_alloc_dma_bufs(cam, 0))
883 if (mcam_needs_config(cam)) {
884 mcam_cam_configure(cam);
885 ret = mcam_ctlr_configure(cam);
895 mcam_reset_buffers(cam);
896 mcam_ctlr_irq_enable(cam);
899 mcam_ctlr_start(cam);
900 spin_unlock_irqrestore(&cam->
dev_lock, flags);
909 static int mcam_vb_queue_setup(
struct vb2_queue *vq,
910 const struct v4l2_format *fmt,
unsigned int *nbufs,
911 unsigned int *
num_planes,
unsigned int sizes[],
919 if (*nbufs < minbufs)
927 static void mcam_vb_buf_queue(
struct vb2_buffer *vb)
938 mcam_sg_restart(cam);
939 spin_unlock_irqrestore(&cam->
dev_lock, flags);
941 mcam_read_setup(cam);
950 static void mcam_vb_wait_prepare(
struct vb2_queue *vq)
957 static void mcam_vb_wait_finish(
struct vb2_queue *vq)
967 static int mcam_vb_start_streaming(
struct vb2_queue *vq,
unsigned int count)
987 return mcam_read_setup(cam);
990 static int mcam_vb_stop_streaming(
struct vb2_queue *vq)
1002 mcam_ctlr_stop_dma(cam);
1008 INIT_LIST_HEAD(&cam->
buffers);
1009 spin_unlock_irqrestore(&cam->
dev_lock, flags);
1014 static const struct vb2_ops mcam_vb2_ops = {
1015 .queue_setup = mcam_vb_queue_setup,
1016 .buf_queue = mcam_vb_buf_queue,
1017 .start_streaming = mcam_vb_start_streaming,
1018 .stop_streaming = mcam_vb_stop_streaming,
1019 .wait_prepare = mcam_vb_wait_prepare,
1020 .wait_finish = mcam_vb_wait_finish,
1024 #ifdef MCAM_MODE_DMA_SG
1029 static int mcam_vb_sg_buf_init(
struct vb2_buffer *vb)
1039 cam_err(cam,
"Unable to get DMA descriptor array\n");
1045 static int mcam_vb_sg_buf_prepare(
struct vb2_buffer *vb)
1066 static int mcam_vb_sg_buf_finish(
struct vb2_buffer *vb)
1075 static void mcam_vb_sg_buf_cleanup(
struct vb2_buffer *vb)
1086 static const struct vb2_ops mcam_vb2_sg_ops = {
1088 .buf_init = mcam_vb_sg_buf_init,
1089 .buf_prepare = mcam_vb_sg_buf_prepare,
1090 .buf_queue = mcam_vb_buf_queue,
1091 .buf_finish = mcam_vb_sg_buf_finish,
1092 .buf_cleanup = mcam_vb_sg_buf_cleanup,
1093 .start_streaming = mcam_vb_start_streaming,
1094 .stop_streaming = mcam_vb_stop_streaming,
1095 .wait_prepare = mcam_vb_wait_prepare,
1096 .wait_finish = mcam_vb_wait_finish,
1101 static int mcam_setup_vb2(
struct mcam_camera *cam)
1105 memset(vq, 0,
sizeof(*vq));
1108 INIT_LIST_HEAD(&cam->
buffers);
1111 #ifdef MCAM_MODE_DMA_CONTIG
1112 vq->
ops = &mcam_vb2_ops;
1121 #ifdef MCAM_MODE_DMA_SG
1122 vq->
ops = &mcam_vb2_sg_ops;
1130 #ifdef MCAM_MODE_VMALLOC
1132 (
unsigned long) cam);
1133 vq->
ops = &mcam_vb2_ops;
1145 static void mcam_cleanup_vb2(
struct mcam_camera *cam)
1148 #ifdef MCAM_MODE_DMA_CONTIG
1160 static int mcam_vidioc_streamon(
struct file *filp,
void *
priv,
1173 static int mcam_vidioc_streamoff(
struct file *filp,
void *
priv,
1186 static int mcam_vidioc_reqbufs(
struct file *filp,
void *
priv,
1199 static int mcam_vidioc_querybuf(
struct file *filp,
void *
priv,
1211 static int mcam_vidioc_qbuf(
struct file *filp,
void *
priv,
1223 static int mcam_vidioc_dqbuf(
struct file *filp,
void *
priv,
1237 static int mcam_vidioc_queryctrl(
struct file *filp,
void *
priv,
1250 static int mcam_vidioc_g_ctrl(
struct file *filp,
void *
priv,
1263 static int mcam_vidioc_s_ctrl(
struct file *filp,
void *
priv,
1276 static int mcam_vidioc_querycap(
struct file *
file,
void *
priv,
1288 static int mcam_vidioc_enum_fmt_vid_cap(
struct file *filp,
1299 static int mcam_vidioc_try_fmt_vid_cap(
struct file *filp,
void *priv,
1303 struct mcam_format_struct *
f;
1305 struct v4l2_mbus_framefmt mbus_fmt;
1310 v4l2_fill_mbus_format(&mbus_fmt, pix, f->mbus_code);
1312 ret =
sensor_call(cam, video, try_mbus_fmt, &mbus_fmt);
1314 v4l2_fill_pix_format(pix, &mbus_fmt);
1320 static int mcam_vidioc_s_fmt_vid_cap(
struct file *filp,
void *priv,
1324 struct mcam_format_struct *
f;
1334 f = mcam_find_format(fmt->
fmt.
pix.pixelformat);
1339 ret = mcam_vidioc_try_fmt_vid_cap(filp, priv, fmt);
1354 ret = mcam_check_dma_buffers(cam);
1358 mcam_set_config_needed(cam, 1);
1369 static int mcam_vidioc_g_fmt_vid_cap(
struct file *filp,
void *priv,
1381 static int mcam_vidioc_enum_input(
struct file *filp,
void *priv,
1384 if (input->
index != 0)
1393 static int mcam_vidioc_g_input(
struct file *filp,
void *priv,
unsigned int *i)
1399 static int mcam_vidioc_s_input(
struct file *filp,
void *priv,
unsigned int i)
1407 static int mcam_vidioc_s_std(
struct file *filp,
void *priv,
v4l2_std_id *
a)
1416 static int mcam_vidioc_g_parm(
struct file *filp,
void *priv,
1429 static int mcam_vidioc_s_parm(
struct file *filp,
void *priv,
1442 static int mcam_vidioc_g_chip_ident(
struct file *
file,
void *priv,
1456 static int mcam_vidioc_enum_framesizes(
struct file *filp,
void *priv,
1463 ret =
sensor_call(cam, video, enum_framesizes, sizes);
1468 static int mcam_vidioc_enum_frameintervals(
struct file *filp,
void *priv,
1475 ret =
sensor_call(cam, video, enum_frameintervals, interval);
1480 #ifdef CONFIG_VIDEO_ADV_DEBUG
1481 static int mcam_vidioc_g_register(
struct file *file,
void *priv,
1487 reg->
val = mcam_reg_read(cam, reg->
reg);
1494 static int mcam_vidioc_s_register(
struct file *file,
void *priv,
1500 mcam_reg_write(cam, reg->
reg, reg->
val);
1508 .vidioc_querycap = mcam_vidioc_querycap,
1509 .vidioc_enum_fmt_vid_cap = mcam_vidioc_enum_fmt_vid_cap,
1510 .vidioc_try_fmt_vid_cap = mcam_vidioc_try_fmt_vid_cap,
1511 .vidioc_s_fmt_vid_cap = mcam_vidioc_s_fmt_vid_cap,
1512 .vidioc_g_fmt_vid_cap = mcam_vidioc_g_fmt_vid_cap,
1513 .vidioc_enum_input = mcam_vidioc_enum_input,
1514 .vidioc_g_input = mcam_vidioc_g_input,
1515 .vidioc_s_input = mcam_vidioc_s_input,
1516 .vidioc_s_std = mcam_vidioc_s_std,
1517 .vidioc_reqbufs = mcam_vidioc_reqbufs,
1518 .vidioc_querybuf = mcam_vidioc_querybuf,
1519 .vidioc_qbuf = mcam_vidioc_qbuf,
1520 .vidioc_dqbuf = mcam_vidioc_dqbuf,
1521 .vidioc_streamon = mcam_vidioc_streamon,
1522 .vidioc_streamoff = mcam_vidioc_streamoff,
1523 .vidioc_queryctrl = mcam_vidioc_queryctrl,
1524 .vidioc_g_ctrl = mcam_vidioc_g_ctrl,
1525 .vidioc_s_ctrl = mcam_vidioc_s_ctrl,
1526 .vidioc_g_parm = mcam_vidioc_g_parm,
1527 .vidioc_s_parm = mcam_vidioc_s_parm,
1528 .vidioc_enum_framesizes = mcam_vidioc_enum_framesizes,
1529 .vidioc_enum_frameintervals = mcam_vidioc_enum_frameintervals,
1530 .vidioc_g_chip_ident = mcam_vidioc_g_chip_ident,
1531 #ifdef CONFIG_VIDEO_ADV_DEBUG
1532 .vidioc_g_register = mcam_vidioc_g_register,
1533 .vidioc_s_register = mcam_vidioc_s_register,
1541 static int mcam_v4l_open(
struct file *filp)
1548 frames = singles = delivered = 0;
1550 if (cam->
users == 0) {
1551 ret = mcam_setup_vb2(cam);
1554 mcam_ctlr_power_up(cam);
1555 __mcam_cam_reset(cam);
1556 mcam_set_config_needed(cam, 1);
1565 static int mcam_v4l_release(
struct file *filp)
1569 cam_dbg(cam,
"Release, %d frames, %d singles, %d delivered\n", frames,
1570 singles, delivered);
1573 if (cam->
users == 0) {
1574 mcam_ctlr_stop_dma(cam);
1575 mcam_cleanup_vb2(cam);
1576 mcam_ctlr_power_down(cam);
1578 mcam_free_dma_bufs(cam);
1584 static ssize_t mcam_v4l_read(
struct file *filp,
1585 char __user *
buffer,
size_t len, loff_t *
pos)
1599 static unsigned int mcam_v4l_poll(
struct file *filp,
1612 static int mcam_v4l_mmap(
struct file *filp,
struct vm_area_struct *vma)
1627 .open = mcam_v4l_open,
1628 .release = mcam_v4l_release,
1629 .read = mcam_v4l_read,
1630 .poll = mcam_v4l_poll,
1631 .mmap = mcam_v4l_mmap,
1645 .fops = &mcam_v4l_fops,
1646 .ioctl_ops = &mcam_v4l_ioctl_ops,
1654 static void mcam_frame_complete(
struct mcam_camera *cam,
int frame)
1682 unsigned int frame, handled = 0;
1695 for (frame = 0; frame < cam->
nbufs; frame++)
1697 mcam_frame_complete(cam, frame);
1711 mcam_ctlr_stop(cam);
1735 .platform_data = &sensor_cfg,
1742 if (buffer_mode >= 0)
1747 "attempting vmalloc mode instead\n");
1750 if (!mcam_buffer_mode_supported(cam->
buffer_mode)) {
1764 mcam_set_config_needed(cam, 1);
1767 INIT_LIST_HEAD(&cam->
buffers);
1768 mcam_ctlr_init(cam);
1780 goto out_unregister;
1783 ret = mcam_cam_init(cam);
1785 goto out_unregister;
1790 cam->
vdev = mcam_v4l_template;
1791 cam->
vdev.debug = 0;
1796 video_set_drvdata(&cam->
vdev, cam);
1802 if (mcam_alloc_dma_bufs(cam, 1))
1803 cam_warn(cam,
"Unable to alloc DMA buffers at load"
1804 " will try again later.");
1824 if (cam->
users > 0) {
1825 cam_warn(cam,
"Removing a device with users!\n");
1826 mcam_ctlr_power_down(cam);
1830 mcam_free_dma_bufs(cam);
1843 if (cam->
users > 0) {
1846 mcam_ctlr_stop_dma(cam);
1847 mcam_ctlr_power_down(cam);
1848 cam->
state = cstate;
1858 if (cam->
users > 0) {
1859 mcam_ctlr_power_up(cam);
1860 __mcam_cam_reset(cam);
1862 mcam_ctlr_power_down(cam);
1874 ret = mcam_read_setup(cam);