Lines Matching refs:ctx

638 static struct fdp1_q_data *get_q_data(struct fdp1_ctx *ctx,
642 return &ctx->out_q;
644 return &ctx->cap_q;
719 static void fdp1_field_complete(struct fdp1_ctx *ctx,
730 static void fdp1_queue_field(struct fdp1_ctx *ctx,
735 spin_lock_irqsave(&ctx->fdp1->irqlock, flags);
736 list_add_tail(&fbuf->list, &ctx->fields_queue);
737 spin_unlock_irqrestore(&ctx->fdp1->irqlock, flags);
739 ctx->buffers_queued++;
742 static struct fdp1_field_buffer *fdp1_dequeue_field(struct fdp1_ctx *ctx)
747 ctx->buffers_queued--;
749 spin_lock_irqsave(&ctx->fdp1->irqlock, flags);
750 fbuf = list_first_entry_or_null(&ctx->fields_queue,
754 spin_unlock_irqrestore(&ctx->fdp1->irqlock, flags);
763 static struct fdp1_field_buffer *fdp1_peek_queued_field(struct fdp1_ctx *ctx)
768 spin_lock_irqsave(&ctx->fdp1->irqlock, flags);
769 fbuf = list_first_entry_or_null(&ctx->fields_queue,
771 spin_unlock_irqrestore(&ctx->fdp1->irqlock, flags);
795 static void fdp1_set_ipc_dli(struct fdp1_ctx *ctx)
797 struct fdp1_dev *fdp1 = ctx->fdp1;
812 static void fdp1_set_ipc_sensor(struct fdp1_ctx *ctx)
814 struct fdp1_dev *fdp1 = ctx->fdp1;
815 struct fdp1_q_data *src_q_data = &ctx->out_q;
879 static void fdp1_configure_rpf(struct fdp1_ctx *ctx,
882 struct fdp1_dev *fdp1 = ctx->fdp1;
888 struct fdp1_q_data *q_data = &ctx->out_q;
909 smsk_addr = ctx->smsk_addr[0];
911 smsk_addr = ctx->smsk_addr[1];
915 if (ctx->deint_mode)
938 static void fdp1_configure_wpf(struct fdp1_ctx *ctx,
941 struct fdp1_dev *fdp1 = ctx->fdp1;
942 struct fdp1_q_data *src_q_data = &ctx->out_q;
943 struct fdp1_q_data *q_data = &ctx->cap_q;
979 format |= ctx->alpha << FD1_WPF_FORMAT_PDV_SHIFT;
999 static void fdp1_configure_deint_mode(struct fdp1_ctx *ctx,
1002 struct fdp1_dev *fdp1 = ctx->fdp1;
1008 switch (ctx->deint_mode) {
1017 if (ctx->sequence == 0 || ctx->aborting)
1022 if (ctx->sequence > 1) {
1027 if (ctx->sequence > 2)
1035 if (!(ctx->sequence == 0 || ctx->aborting))
1066 static int fdp1_device_process(struct fdp1_ctx *ctx)
1069 struct fdp1_dev *fdp1 = ctx->fdp1;
1090 fdp1_configure_deint_mode(ctx, job);
1093 fdp1_set_ipc_dli(ctx);
1096 fdp1_set_ipc_sensor(ctx);
1099 fdp1_configure_rpf(ctx, job);
1102 fdp1_configure_wpf(ctx, job);
1138 struct fdp1_ctx *ctx = priv;
1139 struct fdp1_q_data *src_q_data = &ctx->out_q;
1143 dprintk(ctx->fdp1, "+ Src: %d : Dst: %d\n",
1144 v4l2_m2m_num_src_bufs_ready(ctx->fh.m2m_ctx),
1145 v4l2_m2m_num_dst_bufs_ready(ctx->fh.m2m_ctx));
1151 if (v4l2_m2m_num_src_bufs_ready(ctx->fh.m2m_ctx) < srcbufs
1152 || v4l2_m2m_num_dst_bufs_ready(ctx->fh.m2m_ctx) < dstbufs) {
1153 dprintk(ctx->fdp1, "Not enough buffers available\n");
1162 struct fdp1_ctx *ctx = priv;
1164 dprintk(ctx->fdp1, "+\n");
1167 ctx->aborting = 1;
1170 fdp1_write(ctx->fdp1, 0, FD1_CTL_SGCMD);
1171 fdp1_write(ctx->fdp1, FD1_CTL_SRESET_SRST, FD1_CTL_SRESET);
1180 static struct fdp1_job *fdp1_prepare_job(struct fdp1_ctx *ctx)
1184 struct fdp1_dev *fdp1 = ctx->fdp1;
1190 if (FDP1_DEINT_MODE_USES_NEXT(ctx->deint_mode))
1193 if (ctx->buffers_queued < buffers_required)
1202 job->active = fdp1_dequeue_field(ctx);
1216 vbuf = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx);
1220 job->active->vb->sequence = ctx->sequence;
1221 job->dst->vb->sequence = ctx->sequence;
1222 ctx->sequence++;
1224 if (FDP1_DEINT_MODE_USES_PREV(ctx->deint_mode)) {
1225 job->previous = ctx->previous;
1228 ctx->previous = job->active;
1231 if (FDP1_DEINT_MODE_USES_NEXT(ctx->deint_mode)) {
1233 job->next = fdp1_peek_queued_field(ctx);
1246 ctx->translen++;
1251 dprintk(fdp1, "Job Queued translen = %d\n", ctx->translen);
1264 struct fdp1_ctx *ctx = priv;
1265 struct fdp1_dev *fdp1 = ctx->fdp1;
1272 ctx->translen = 0;
1275 src_vb = v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx);
1281 fdp1_queue_field(ctx, fbuf);
1287 while (fdp1_prepare_job(ctx))
1290 if (ctx->translen == 0) {
1292 v4l2_m2m_job_finish(fdp1->m2m_dev, ctx->fh.m2m_ctx);
1297 fdp1_device_process(ctx);
1308 struct fdp1_ctx *ctx;
1314 ctx = v4l2_m2m_get_curr_priv(fdp1->m2m_dev);
1316 if (ctx == NULL) {
1322 ctx->num_processed++;
1328 if (FDP1_DEINT_MODE_USES_PREV(ctx->deint_mode))
1329 fdp1_field_complete(ctx, job->previous);
1331 fdp1_field_complete(ctx, job->active);
1342 ctx->num_processed, ctx->translen);
1344 if (ctx->num_processed == ctx->translen ||
1345 ctx->aborting) {
1346 dprintk(ctx->fdp1, "Finishing transaction\n");
1347 ctx->num_processed = 0;
1348 v4l2_m2m_job_finish(fdp1->m2m_dev, ctx->fh.m2m_ctx);
1354 fdp1_device_process(ctx);
1410 struct fdp1_ctx *ctx = fh_to_ctx(priv);
1412 if (!v4l2_m2m_get_vq(ctx->fh.m2m_ctx, f->type))
1415 q_data = get_q_data(ctx, f->type);
1456 static void fdp1_try_fmt_output(struct fdp1_ctx *ctx,
1512 static void fdp1_try_fmt_capture(struct fdp1_ctx *ctx,
1516 struct fdp1_q_data *src_data = &ctx->out_q;
1591 struct fdp1_ctx *ctx = fh_to_ctx(priv);
1594 fdp1_try_fmt_output(ctx, NULL, &f->fmt.pix_mp);
1596 fdp1_try_fmt_capture(ctx, NULL, &f->fmt.pix_mp);
1598 dprintk(ctx->fdp1, "Try %s format: %4.4s (0x%08x) %ux%u field %u\n",
1606 static void fdp1_set_format(struct fdp1_ctx *ctx,
1610 struct fdp1_q_data *q_data = get_q_data(ctx, type);
1614 fdp1_try_fmt_output(ctx, &fmtinfo, pix);
1616 fdp1_try_fmt_capture(ctx, &fmtinfo, pix);
1638 struct fdp1_q_data *dst_data = &ctx->cap_q;
1652 fdp1_try_fmt_capture(ctx, &dst_data->fmt, &dst_data->format);
1662 struct fdp1_ctx *ctx = fh_to_ctx(priv);
1663 struct v4l2_m2m_ctx *m2m_ctx = ctx->fh.m2m_ctx;
1667 v4l2_err(&ctx->fdp1->v4l2_dev, "%s queue busy\n", __func__);
1671 fdp1_set_format(ctx, &f->fmt.pix_mp, f->type);
1673 dprintk(ctx->fdp1, "Set %s format: %4.4s (0x%08x) %ux%u field %u\n",
1683 struct fdp1_ctx *ctx =
1685 struct fdp1_q_data *src_q_data = &ctx->out_q;
1701 struct fdp1_ctx *ctx =
1706 ctx->alpha = ctrl->val;
1710 ctx->deint_mode = ctrl->val;
1768 struct fdp1_ctx *ctx = vb2_get_drv_priv(vq);
1772 q_data = get_q_data(ctx, vq->type);
1853 struct fdp1_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue);
1854 struct fdp1_q_data *q_data = get_q_data(ctx, vb->vb2_queue->type);
1886 dprintk(ctx->fdp1,
1900 dprintk(ctx->fdp1,
1921 struct fdp1_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue);
1923 v4l2_m2m_buf_queue(ctx->fh.m2m_ctx, vbuf);
1928 struct fdp1_ctx *ctx = vb2_get_drv_priv(q);
1929 struct fdp1_q_data *q_data = get_q_data(ctx, q->type);
1938 ctx->deint_mode = FDP1_PROGRESSIVE;
1940 if (ctx->deint_mode == FDP1_ADAPT2D3D) {
1947 ctx->smsk_size = bpp * stride * q_data->vsize;
1949 ctx->smsk_cpu = dma_alloc_coherent(ctx->fdp1->dev,
1950 ctx->smsk_size, &smsk_base, GFP_KERNEL);
1952 if (ctx->smsk_cpu == NULL) {
1953 dprintk(ctx->fdp1, "Failed to alloc smsk\n");
1957 ctx->smsk_addr[0] = smsk_base;
1958 ctx->smsk_addr[1] = smsk_base + (ctx->smsk_size/2);
1967 struct fdp1_ctx *ctx = vb2_get_drv_priv(q);
1973 vbuf = v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx);
1975 vbuf = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx);
1978 spin_lock_irqsave(&ctx->fdp1->irqlock, flags);
1980 spin_unlock_irqrestore(&ctx->fdp1->irqlock, flags);
1989 fbuf = fdp1_dequeue_field(ctx);
1991 fdp1_field_complete(ctx, fbuf);
1992 fbuf = fdp1_dequeue_field(ctx);
1996 if (ctx->smsk_cpu) {
1997 dma_free_coherent(ctx->fdp1->dev, ctx->smsk_size,
1998 ctx->smsk_cpu, ctx->smsk_addr[0]);
1999 ctx->smsk_addr[0] = ctx->smsk_addr[1] = 0;
2000 ctx->smsk_cpu = NULL;
2003 WARN(!list_empty(&ctx->fields_queue),
2009 job = get_queued_job(ctx->fdp1);
2011 if (FDP1_DEINT_MODE_USES_PREV(ctx->deint_mode))
2012 fdp1_field_complete(ctx, job->previous);
2014 fdp1_field_complete(ctx, job->active);
2019 job = get_queued_job(ctx->fdp1);
2022 /* Free any held buffer in the ctx */
2023 fdp1_field_complete(ctx, ctx->previous);
2025 WARN(!list_empty(&ctx->fdp1->queued_job_list),
2028 WARN(!list_empty(&ctx->fdp1->hw_job_list),
2046 struct fdp1_ctx *ctx = priv;
2051 src_vq->drv_priv = ctx;
2056 src_vq->lock = &ctx->fdp1->dev_mutex;
2057 src_vq->dev = ctx->fdp1->dev;
2065 dst_vq->drv_priv = ctx;
2070 dst_vq->lock = &ctx->fdp1->dev_mutex;
2071 dst_vq->dev = ctx->fdp1->dev;
2083 struct fdp1_ctx *ctx = NULL;
2090 ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
2091 if (!ctx) {
2096 v4l2_fh_init(&ctx->fh, video_devdata(file));
2097 file->private_data = &ctx->fh;
2098 ctx->fdp1 = fdp1;
2101 INIT_LIST_HEAD(&ctx->fields_queue);
2103 ctx->translen = 1;
2104 ctx->sequence = 0;
2108 v4l2_ctrl_handler_init(&ctx->hdl, 3);
2109 v4l2_ctrl_new_std_menu_items(&ctx->hdl, &fdp1_ctrl_ops,
2114 ctrl = v4l2_ctrl_new_std(&ctx->hdl, &fdp1_ctrl_ops,
2119 v4l2_ctrl_new_std(&ctx->hdl, &fdp1_ctrl_ops,
2122 if (ctx->hdl.error) {
2123 ret = ctx->hdl.error;
2127 ctx->fh.ctrl_handler = &ctx->hdl;
2128 v4l2_ctrl_handler_setup(&ctx->hdl);
2132 fdp1_set_format(ctx, &format, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
2134 ctx->fh.m2m_ctx = v4l2_m2m_ctx_init(fdp1->m2m_dev, ctx, &queue_init);
2136 if (IS_ERR(ctx->fh.m2m_ctx)) {
2137 ret = PTR_ERR(ctx->fh.m2m_ctx);
2146 v4l2_fh_add(&ctx->fh);
2149 ctx, ctx->fh.m2m_ctx);
2155 v4l2_m2m_ctx_release(ctx->fh.m2m_ctx);
2157 v4l2_ctrl_handler_free(&ctx->hdl);
2158 kfree(ctx);
2167 struct fdp1_ctx *ctx = fh_to_ctx(file->private_data);
2169 dprintk(fdp1, "Releasing instance %p\n", ctx);
2171 v4l2_fh_del(&ctx->fh);
2172 v4l2_fh_exit(&ctx->fh);
2173 v4l2_ctrl_handler_free(&ctx->hdl);
2175 v4l2_m2m_ctx_release(ctx->fh.m2m_ctx);
2177 kfree(ctx);