static int fimc_is_isp_video_streamoff(struct file *file, void *priv, enum v4l2_buf_type type) { int ret = 0; struct fimc_is_video_ctx *vctx = file->private_data; mdbgv_isp("%s\n", vctx, __func__); ret = fimc_is_video_streamoff(file, vctx, type); if (ret) merr("fimc_is_video_streamoff is fail(%d)", vctx, ret); return ret; }
static int fimc_is_scc_video_set_format_mplane(struct file *file, void *fh, struct v4l2_format *format) { int ret = 0; struct fimc_is_video_ctx *vctx = file->private_data; mdbgv_scc("%s\n", vctx, __func__); ret = fimc_is_video_set_format_mplane(file, vctx, format); if (ret) merr("fimc_is_video_set_format_mplane is fail(%d)", vctx, ret); return ret; }
static int fimc_is_vdo_video_reqbufs(struct file *file, void *priv, struct v4l2_requestbuffers *buf) { int ret; struct fimc_is_video_ctx *vctx = file->private_data; mdbgv_vdo("%s(buffers : %d)\n", vctx, __func__, buf->count); ret = fimc_is_video_reqbufs(file, vctx, buf); if (ret) merr("fimc_is_video_reqbufs is fail(error %d)", vctx, ret); return ret; }
static int fimc_is_ixc_video_querybuf(struct file *file, void *priv, struct v4l2_buffer *buf) { int ret; struct fimc_is_video_ctx *vctx = file->private_data; mdbgv_ixc("%s\n", vctx, __func__); ret = fimc_is_video_querybuf(file, vctx, buf); if (ret) merr("fimc_is_video_querybuf is fail(%d)", vctx, ret); return ret; }
static int fimc_is_scp_video_set_format_mplane(struct file *file, void *fh, struct v4l2_format *format) { int ret = 0; struct fimc_is_video_ctx *vctx = file->private_data; struct fimc_is_queue *queue; struct fimc_is_device_ischain *ischain; BUG_ON(!vctx); BUG_ON(!format); mdbgv_scp("%s\n", vctx, __func__); queue = GET_DST_QUEUE(vctx); ischain = vctx->device; if (!ischain) { merr("ischain is NULL", vctx); ret = -EINVAL; goto p_err; } ret = fimc_is_video_set_format_mplane(file, vctx, format); if (ret) { merr("fimc_is_video_set_format_mplane is fail(%d)", vctx, ret); goto p_err; } ret = fimc_is_ischain_scp_s_format(ischain, queue->framecfg.format.pixelformat, queue->framecfg.width, queue->framecfg.height); if (ret) merr("fimc_is_ischain_scp_s_format is fail(%d)", vctx, ret); p_err: return ret; }
int fimc_is_queue_start_streaming(struct fimc_is_queue *queue, struct fimc_is_device_ischain *device, struct fimc_is_subdev *subdev, struct fimc_is_video_ctx *vctx) { int ret = 0; BUG_ON(!queue); BUG_ON(!device); BUG_ON(!subdev); BUG_ON(!vctx); if (test_bit(FIMC_IS_QUEUE_STREAM_ON, &queue->state)) { merr("already stream on(%ld)", vctx, queue->state); ret = -EINVAL; goto p_err; } if (!test_bit(FIMC_IS_QUEUE_BUFFER_READY, &queue->state)) { merr("buffer state is not ready(%ld)", vctx, queue->state); ret = -EINVAL; goto p_err; } ret = CALL_QOPS(queue, start_streaming, device, subdev, queue); if (ret) { merr("start_streaming is fail(%d)", vctx, ret); ret = -EINVAL; goto p_err; } set_bit(FIMC_IS_QUEUE_STREAM_ON, &queue->state); p_err: return ret; }
int fimc_is_video_streamon(struct file *file, struct fimc_is_video_ctx *vctx, enum v4l2_buf_type type) { int ret = 0; struct fimc_is_queue *queue; struct vb2_queue *vbq; BUG_ON(!file); BUG_ON(!vctx); queue = GET_QUEUE(vctx, type); vbq = queue->vbq; if (!vbq) { merr("vbq is NULL", vctx); ret = -EINVAL; goto p_err; } if (vbq->type != type) { merr("invalid stream type(%d != %d)", vctx, vbq->type, type); ret = -EINVAL; goto p_err; } if (vbq->streaming) { merr("streamon: already streaming", vctx); ret = -EINVAL; goto p_err; } ret = vb2_streamon(vbq, type); p_err: return ret; }
static int fimc_is_scp_video_reqbufs(struct file *file, void *priv, struct v4l2_requestbuffers *buf) { int ret = 0; struct fimc_is_video_ctx *vctx = file->private_data; struct fimc_is_device_ischain *device; struct fimc_is_subdev *subdev; struct fimc_is_subdev *leader; BUG_ON(!vctx); mdbgv_scp("%s(buffers : %d)\n", vctx, __func__, buf->count); device = vctx->device; subdev = &device->scp; leader = subdev->leader; if (!leader) { merr("leader is NULL ptr", vctx); ret = -EINVAL; goto p_err; } if (test_bit(FIMC_IS_ISDEV_DSTART, &leader->state)) { merr("leader still running, not applied", vctx); ret = -EINVAL; goto p_err; } ret = fimc_is_video_reqbufs(file, vctx, buf); if (ret) merr("fimc_is_video_reqbufs is fail(%d)", vctx, ret); p_err: return ret; }
int fimc_is_video_close(struct fimc_is_video_ctx *vctx) { int ret = 0; u32 video_type = vctx->type; struct fimc_is_queue *q_src, *q_dst; BUG_ON(!vctx); q_src = &vctx->q_src; q_dst = &vctx->q_dst; switch (video_type) { case FIMC_IS_VIDEO_TYPE_OUTPUT: BUG_ON(!q_src->vbq); fimc_is_queue_close(q_src); vb2_queue_release(q_src->vbq); kfree(q_src->vbq); break; case FIMC_IS_VIDEO_TYPE_CAPTURE: BUG_ON(!q_dst->vbq); fimc_is_queue_close(q_dst); vb2_queue_release(q_dst->vbq); kfree(q_dst->vbq); break; case FIMC_IS_VIDEO_TYPE_M2M: BUG_ON(!q_src->vbq); BUG_ON(!q_dst->vbq); fimc_is_queue_close(q_src); vb2_queue_release(q_src->vbq); fimc_is_queue_close(q_dst); vb2_queue_release(q_dst->vbq); kfree(q_src->vbq); kfree(q_dst->vbq); break; default: merr("invalid type(%d)", vctx, video_type); ret = -EINVAL; break; } /* * vb2 release can call stop callback * not if video node is not stream off */ vctx->device = NULL; return ret; }
static int fimc_is_sen_video_qbuf(struct file *file, void *priv, struct v4l2_buffer *buf) { int ret = 0; struct fimc_is_video_ctx *vctx = file->private_data; #ifdef DBG_STREAMING /*dbg_sensor("%s\n", __func__);*/ #endif ret = fimc_is_video_qbuf(file, vctx, buf); if (ret) merr("fimc_is_video_qbuf is fail(%d)", vctx, ret); return ret; }
static int fimc_is_scp_video_qbuf(struct file *file, void *priv, struct v4l2_buffer *buf) { int ret = 0; struct fimc_is_video_ctx *vctx = file->private_data; #ifdef DBG_STREAMING mdbgv_scp("%s(index : %d)\n", vctx, __func__, buf->index); #endif ret = fimc_is_video_qbuf(file, vctx, buf); if (ret) merr("fimc_is_video_qbuf is fail(%d)", vctx, ret); return ret; }
static int fimc_is_ixc_video_s_input(struct file *file, void *priv, unsigned int input) { int ret = 0; struct fimc_is_video_ctx *vctx = file->private_data; BUG_ON(!vctx); ret = fimc_is_video_s_input(file, vctx); if (ret) { merr("fimc_is_video_s_input is fail(%d)", vctx, ret); goto p_err; } p_err: return ret; }
static int fimc_is_scc_video_dqbuf(struct file *file, void *priv, struct v4l2_buffer *buf) { int ret = 0; struct fimc_is_video_ctx *vctx = file->private_data; bool blocking = file->f_flags & O_NONBLOCK; #ifdef DBG_STREAMING mdbgv_scc("%s\n", vctx, __func__); #endif ret = CALL_VOPS(vctx, dqbuf, buf, blocking); if (ret) merr("dqbuf is fail(%d)", vctx, ret); return ret; }
static int fimc_is_3a1_video_dqbuf(struct file *file, void *priv, struct v4l2_buffer *buf) { int ret = 0; struct fimc_is_video_ctx *vctx = file->private_data; BUG_ON(!vctx); #ifdef DBG_STREAMING mdbgv_3a1("%s\n", vctx, __func__); #endif ret = fimc_is_video_dqbuf(file, vctx, buf); if (ret) merr("fimc_is_video_dqbuf is fail(%d)", vctx, ret); return ret; }
static int fimc_is_vdo_video_set_format_mplane(struct file *file, void *fh, struct v4l2_format *format) { int ret = 0; struct fimc_is_video_ctx *vctx = file->private_data; mdbgv_vdo("%s\n", vctx, __func__); ret = fimc_is_video_set_format_mplane(file, vctx, format); if (ret) merr("fimc_is_video_set_format_mplane is fail(%d)", vctx, ret); dbg_vdiso("req w : %d req h : %d\n", vctx->q_src.framecfg.width, vctx->q_src.framecfg.height); return ret; }
static int fimc_is_comp_video_open(struct file *file) { int ret = 0; struct fimc_is_video *video; struct fimc_is_video_ctx *vctx; struct fimc_is_device_companion *device; struct fimc_is_resourcemgr *resourcemgr; vctx = NULL; video = video_drvdata(file); device = container_of(video, struct fimc_is_device_companion, video); resourcemgr = video->resourcemgr; if (!resourcemgr) { err("resourcemgr is NULL"); ret = -EINVAL; goto p_err; } ret = fimc_is_resource_open(resourcemgr, RESOURCE_TYPE_COMPANION, NULL); if (ret) { err("fimc_is_resource_open is fail(%d)", ret); goto p_err; } minfo("[COM:V] %s\n", device, __func__); ret = open_vctx(file, video, &vctx, device->instance, FRAMEMGR_ID_INVALID); if (ret) { err("open_vctx is fail(%d)", ret); goto p_err; } vctx->device = device; ret = fimc_is_companion_open(device, vctx); if (ret) { merr("fimc_is_comp_open is fail(%d)", device, ret); close_vctx(file, video, vctx); goto p_err; } p_err: return ret; }
void baditem(char *path) { char npath[MAXPATHLEN]; int fd; if (unlink(path) == 0) return; snprintf(npath, sizeof npath, "%s/mailXXXXXXXXXX", _PATH_MAILDIR); if ((fd = mkstemp(npath)) == -1) return; close(fd); if (rename(path, npath) == -1) unlink(npath); else merr(NOTFATAL, "nasty spool item %s renamed to %s", path, npath); /* XXX if we fail to rename, another attempt will happen later */ }
static int fimc_is_scp_video_close(struct file *file) { int ret = 0; struct fimc_is_video *video = NULL; struct fimc_is_video_ctx *vctx = NULL; struct fimc_is_device_ischain *device = NULL; BUG_ON(!file); vctx = file->private_data; if (!vctx) { err("vctx is NULL"); ret = -EINVAL; goto p_err; } video = vctx->video; if (!video) { merr("video is NULL", vctx); ret = -EINVAL; goto p_err; } pr_info("[SCP:V:%d] %s\n", vctx->instance, __func__); device = vctx->device; if (!device) { err("device is NULL"); ret = -EINVAL; goto p_err; } fimc_is_ischain_sub_close(&device->scp); fimc_is_video_close(vctx); ret = close_vctx(file, video, vctx); if (ret < 0) err("close_vctx is fail(%d)", ret); p_err: return ret; }
static int fimc_is_ixc_video_set_format_mplane(struct file *file, void *fh, struct v4l2_format *format) { int ret = 0; struct fimc_is_video_ctx *vctx = file->private_data; BUG_ON(!vctx); BUG_ON(!format); mdbgv_ixc("%s\n", vctx, __func__); ret = fimc_is_video_set_format_mplane(file, vctx, format); if (ret) { merr("fimc_is_video_set_format_mplane is fail(%d)", vctx, ret); goto p_err; } p_err: return ret; }
static int fimc_is_scc_video_qbuf(struct file *file, void *priv, struct v4l2_buffer *buf) { int ret = 0; struct fimc_is_video_ctx *video_ctx = file->private_data; struct fimc_is_device_ischain *ischain = video_ctx->device; #ifdef DBG_STREAMING /*dbg_scc("%s(index : %d)\n", __func__, buf->index);*/ #endif ret = fimc_is_video_qbuf(video_ctx, buf); if (ret) { merr("fimc_is_video_qbuf is fail", ischain); goto exit; } exit: return ret; }
static int fimc_is_sen_video_dqbuf(struct file *file, void *priv, struct v4l2_buffer *buf) { int ret = 0; bool blocking; struct fimc_is_video_ctx *vctx = file->private_data; #ifdef DBG_STREAMING mdbgv_sensor("%s\n", vctx, __func__); #endif ret = fimc_is_video_dqbuf(file, vctx, buf); if (ret) { blocking = file->f_flags & O_NONBLOCK; if (!blocking || (ret != -EAGAIN)) merr("fimc_is_video_dqbuf is fail(%d)", vctx, ret); } return ret; }
static void fimc_is_scc_stop_streaming(struct vb2_queue *vbq) { int ret = 0; struct fimc_is_video_ctx *vctx = vbq->drv_priv; struct fimc_is_queue *queue; struct fimc_is_device_ischain *device; BUG_ON(!vctx); BUG_ON(!GET_DEVICE(vctx)); mdbgv_scc("%s\n", vctx, __func__); device = GET_DEVICE(vctx); queue = GET_QUEUE(vctx); ret = fimc_is_queue_stop_streaming(queue, device); if (ret) { merr("fimc_is_queue_stop_streaming is fail(%d)", device, ret); return; } }
static int fimc_is_set_pwm(struct fimc_is_device_ischain *device, u32 pwm_qos) { int ret = 0; u32 base_addr; void __iomem *addr; /* TODO */ base_addr = 0; if (base_addr) { addr = ioremap(base_addr + FIMC_IS_PWM_TCNTB0, SZ_4); writel(pwm_qos, addr); dbg("PWM SFR Read(%08X), pwm_qos(%08X)\n", readl(addr), pwm_qos); iounmap(addr); } else { merr("fimc_is_set_pwm is not implemented", device); BUG(); } return ret; }
static int fimc_is_3a1_queue_setup(struct vb2_queue *vbq, const struct v4l2_format *fmt, unsigned int *num_buffers, unsigned int *num_planes, unsigned int sizes[], void *allocators[]) { int ret = 0; struct fimc_is_video_ctx *vctx = vbq->drv_priv; struct fimc_is_video *video; struct fimc_is_queue *queue; struct fimc_is_core *core; void *alloc_ctx; BUG_ON(!vctx); mdbgv_3a1("%s\n", vctx, __func__); queue = GET_VCTX_QUEUE(vctx, vbq); video = vctx->video; core = video->core; alloc_ctx = core->mem.alloc_ctx; if (*num_buffers < VIDEO_3A1_MIN_BUFFERS) { warn("number of req. buffers is too small(%d->%d)\n", *num_buffers, VIDEO_3A1_MIN_BUFFERS); *num_buffers = VIDEO_3A1_MIN_BUFFERS; } ret = fimc_is_queue_setup(queue, alloc_ctx, num_planes, sizes, allocators); if (ret) merr("fimc_is_queue_setup is fail(%d)", vctx, ret); return ret; }
static int fimc_is_sen_buffer_finish(struct vb2_buffer *vb) { int ret = 0; struct fimc_is_video_ctx *vctx = vb->vb2_queue->drv_priv; struct fimc_is_device_sensor *device; #ifdef DBG_STREAMING mdbgv_sensor("%s(%d)\n", vctx, __func__, vb->v4l2_buf.index); #endif device = vctx->device; ret = fimc_is_sensor_buffer_finish( device, vb->v4l2_buf.index); if (ret) { merr("fimc_is_sensor_buffer_finish is fail(%d)", device, ret); goto p_err; } p_err: return ret; }
static int fimc_is_3a1_video_set_format_mplane(struct file *file, void *fh, struct v4l2_format *format) { int ret = 0; struct fimc_is_video_ctx *vctx = file->private_data; struct fimc_is_device_ischain *device; struct fimc_is_group *group; struct fimc_is_subdev *subdev; struct fimc_is_queue *queue; BUG_ON(!vctx); mdbgv_3a1("%s\n", vctx, __func__); device = vctx->device; BUG_ON(!device); group = &device->group_3ax; BUG_ON(!group); subdev = &group->leader; ret = fimc_is_video_set_format_mplane(file, vctx, format); if (ret) merr("fimc_is_video_set_format_mplane is fail(%d)", vctx, ret); if (V4L2_TYPE_IS_OUTPUT(format->type)) { queue = &vctx->q_src; fimc_is_ischain_3a1_s_format(device, queue->framecfg.width, queue->framecfg.height); } else { queue = &vctx->q_dst; fimc_is_subdev_s_format(subdev, queue->framecfg.width, queue->framecfg.height); } return ret; }
static void fimc_is_scc_buffer_finish(struct vb2_buffer *vb) { int ret = 0; struct fimc_is_video_ctx *vctx = vb->vb2_queue->drv_priv; struct fimc_is_device_ischain *device; struct fimc_is_subdev *subdev; BUG_ON(!vctx); BUG_ON(!GET_DEVICE(vctx)); #ifdef DBG_STREAMING mdbgv_scc("%s(%d)\n", vctx, __func__, vb->v4l2_buf.index); #endif device = GET_DEVICE(vctx); subdev = &device->scc; ret = fimc_is_subdev_buffer_finish(subdev, vb->v4l2_buf.index); if (ret) { merr("fimc_is_subdev_buffer_finish is fail(%d)", device, ret); return; } }
static int fimc_is_scp_start_streaming(struct vb2_queue *q, unsigned int count) { int ret = 0; struct fimc_is_video_ctx *vctx = q->drv_priv; struct fimc_is_queue *queue; struct fimc_is_device_ischain *device; struct fimc_is_subdev *subdev; BUG_ON(!vctx); mdbgv_scp("%s\n", vctx, __func__); queue = GET_DST_QUEUE(vctx); device = vctx->device; subdev = &device->scp; ret = fimc_is_queue_start_streaming(queue, device, subdev, vctx); if (ret) merr("fimc_is_queue_start_streaming is fail(%d)", vctx, ret); return ret; }
static int fimc_is_vdo_start_streaming(struct vb2_queue *q, unsigned int count) { int ret = 0; struct fimc_is_video_ctx *vctx = q->drv_priv; struct fimc_is_queue *queue; struct fimc_is_device_ischain *device; struct fimc_is_subdev *leader; BUG_ON(!vctx); mdbgv_vdo("%s\n", vctx, __func__); queue = GET_SRC_QUEUE(vctx); device = vctx->device; leader = &device->group_dis.leader; ret = fimc_is_queue_start_streaming(queue, device, leader, vctx); if (ret) merr("fimc_is_queue_start_streaming is fail(%d)", vctx, ret); return ret; }
static int fimc_is_ssx_stop_streaming(struct vb2_queue *vbq) { int ret = 0; struct fimc_is_video_ctx *vctx = vbq->drv_priv; struct fimc_is_queue *queue; struct fimc_is_device_sensor *device; BUG_ON(!vctx); BUG_ON(!GET_DEVICE(vctx)); mdbgv_sensor("%s\n", vctx, __func__); device = GET_DEVICE(vctx); queue = GET_QUEUE(vctx); ret = fimc_is_queue_stop_streaming(queue, device); if (ret) { merr("fimc_is_queue_stop_streaming is fail(%d)", device, ret); goto p_err; } p_err: return ret; }