Lines Matching refs:veu
224 static u32 sh_veu_reg_read(struct sh_veu_dev *veu, unsigned int reg) in sh_veu_reg_read() argument
226 return ioread32(veu->base + reg); in sh_veu_reg_read()
229 static void sh_veu_reg_write(struct sh_veu_dev *veu, unsigned int reg, in sh_veu_reg_write() argument
232 iowrite32(value, veu->base + reg); in sh_veu_reg_write()
239 struct sh_veu_dev *veu = priv; in sh_veu_job_abort() local
242 veu->aborting = true; in sh_veu_job_abort()
245 static void sh_veu_process(struct sh_veu_dev *veu, in sh_veu_process() argument
251 sh_veu_reg_write(veu, VEU_DAYR, addr + veu->vfmt_out.offset_y); in sh_veu_process()
252 sh_veu_reg_write(veu, VEU_DACR, veu->vfmt_out.offset_c ? in sh_veu_process()
253 addr + veu->vfmt_out.offset_c : 0); in sh_veu_process()
254 dev_dbg(veu->dev, "%s(): dst base %lx, y: %x, c: %x\n", __func__, in sh_veu_process()
256 veu->vfmt_out.offset_y, veu->vfmt_out.offset_c); in sh_veu_process()
259 sh_veu_reg_write(veu, VEU_SAYR, addr + veu->vfmt_in.offset_y); in sh_veu_process()
260 sh_veu_reg_write(veu, VEU_SACR, veu->vfmt_in.offset_c ? in sh_veu_process()
261 addr + veu->vfmt_in.offset_c : 0); in sh_veu_process()
262 dev_dbg(veu->dev, "%s(): src base %lx, y: %x, c: %x\n", __func__, in sh_veu_process()
264 veu->vfmt_in.offset_y, veu->vfmt_in.offset_c); in sh_veu_process()
266 sh_veu_reg_write(veu, VEU_STR, 1); in sh_veu_process()
268 sh_veu_reg_write(veu, VEU_EIER, 1); /* enable interrupt in VEU */ in sh_veu_process()
279 struct sh_veu_dev *veu = priv; in sh_veu_device_run() local
282 src_buf = v4l2_m2m_next_src_buf(veu->m2m_ctx); in sh_veu_device_run()
283 dst_buf = v4l2_m2m_next_dst_buf(veu->m2m_ctx); in sh_veu_device_run()
286 sh_veu_process(veu, src_buf, dst_buf); in sh_veu_device_run()
291 static bool sh_veu_is_streamer(struct sh_veu_dev *veu, struct sh_veu_file *veu_file, in sh_veu_is_streamer() argument
295 veu_file == veu->capture) || in sh_veu_is_streamer()
297 veu_file == veu->output); in sh_veu_is_streamer()
311 static int sh_veu_stream_init(struct sh_veu_dev *veu, struct sh_veu_file *veu_file, in sh_veu_stream_init() argument
318 stream = &veu->capture; in sh_veu_stream_init()
321 stream = &veu->output; in sh_veu_stream_init()
338 static int sh_veu_context_init(struct sh_veu_dev *veu) in sh_veu_context_init() argument
340 if (veu->m2m_ctx) in sh_veu_context_init()
343 veu->m2m_ctx = v4l2_m2m_ctx_init(veu->m2m_dev, veu, in sh_veu_context_init()
346 return PTR_ERR_OR_ZERO(veu->m2m_ctx); in sh_veu_context_init()
383 static struct sh_veu_vfmt *sh_veu_get_vfmt(struct sh_veu_dev *veu, in sh_veu_get_vfmt() argument
388 return &veu->vfmt_out; in sh_veu_get_vfmt()
390 return &veu->vfmt_in; in sh_veu_get_vfmt()
399 struct sh_veu_dev *veu = veu_file->veu_dev; in sh_veu_g_fmt() local
402 vfmt = sh_veu_get_vfmt(veu, f->type); in sh_veu_g_fmt()
412 dev_dbg(veu->dev, "%s(): type: %d, size %u @ %ux%u, fmt %x\n", __func__, in sh_veu_g_fmt()
519 static void sh_veu_colour_offset(struct sh_veu_dev *veu, struct sh_veu_vfmt *vfmt) in sh_veu_colour_offset() argument
524 dma_addr_t offset = ((left * veu->vfmt_out.fmt->depth) >> 3) + in sh_veu_colour_offset()
525 top * veu->vfmt_out.bytesperline; in sh_veu_colour_offset()
552 struct sh_veu_dev *veu = veu_file->veu_dev; in sh_veu_s_fmt() local
555 int ret = sh_veu_context_init(veu); in sh_veu_s_fmt()
559 vq = v4l2_m2m_get_vq(veu->m2m_ctx, f->type); in sh_veu_s_fmt()
568 vfmt = sh_veu_get_vfmt(veu, f->type); in sh_veu_s_fmt()
577 sh_veu_colour_offset(veu, vfmt); in sh_veu_s_fmt()
586 dev_dbg(veu->dev, in sh_veu_s_fmt()
617 struct sh_veu_dev *veu = veu_file->veu_dev; in sh_veu_reqbufs() local
618 int ret = sh_veu_context_init(veu); in sh_veu_reqbufs()
622 ret = sh_veu_stream_init(veu, veu_file, reqbufs->type); in sh_veu_reqbufs()
626 return v4l2_m2m_reqbufs(file, veu->m2m_ctx, reqbufs); in sh_veu_reqbufs()
662 static void sh_veu_calc_scale(struct sh_veu_dev *veu, in sh_veu_calc_scale() argument
678 if (veu->is_2h && size_out > size_in) { in sh_veu_calc_scale()
715 static unsigned long sh_veu_scale_v(struct sh_veu_dev *veu, in sh_veu_scale_v() argument
720 sh_veu_calc_scale(veu, size_in, size_out, crop_out, &mant, &frac, &rep); in sh_veu_scale_v()
723 value = (sh_veu_reg_read(veu, VEU_RFCR) & ~0xffff0000) | in sh_veu_scale_v()
726 sh_veu_reg_write(veu, VEU_RFCR, value); in sh_veu_scale_v()
729 value = (sh_veu_reg_read(veu, VEU_RFSR) & ~0xffff0000) | in sh_veu_scale_v()
732 sh_veu_reg_write(veu, VEU_RFSR, value); in sh_veu_scale_v()
737 static unsigned long sh_veu_scale_h(struct sh_veu_dev *veu, in sh_veu_scale_h() argument
742 sh_veu_calc_scale(veu, size_in, size_out, crop_out, &mant, &frac, &rep); in sh_veu_scale_h()
745 value = (sh_veu_reg_read(veu, VEU_RFCR) & ~0xffff) | in sh_veu_scale_h()
748 sh_veu_reg_write(veu, VEU_RFCR, value); in sh_veu_scale_h()
751 value = (sh_veu_reg_read(veu, VEU_RFSR) & ~0xffff) | in sh_veu_scale_h()
754 sh_veu_reg_write(veu, VEU_RFSR, value); in sh_veu_scale_h()
759 static void sh_veu_configure(struct sh_veu_dev *veu) in sh_veu_configure() argument
766 sh_veu_reg_write(veu, VEU_BSRR, 0x100); in sh_veu_configure()
768 src_width = veu->vfmt_in.frame.width; in sh_veu_configure()
769 src_height = veu->vfmt_in.frame.height; in sh_veu_configure()
770 src_stride = ALIGN(veu->vfmt_in.frame.width, 16); in sh_veu_configure()
772 dst_width = real_w = veu->vfmt_out.frame.width; in sh_veu_configure()
773 dst_height = real_h = veu->vfmt_out.frame.height; in sh_veu_configure()
775 dst_stride = veu->vfmt_out.bytesperline; in sh_veu_configure()
782 src_width = sh_veu_scale_h(veu, src_width, real_w, dst_width); in sh_veu_configure()
783 src_height = sh_veu_scale_v(veu, src_height, real_h, dst_height); in sh_veu_configure()
785 sh_veu_reg_write(veu, VEU_SWR, src_stride); in sh_veu_configure()
786 sh_veu_reg_write(veu, VEU_SSR, src_width | (src_height << 16)); in sh_veu_configure()
787 sh_veu_reg_write(veu, VEU_BSSR, 0); /* not using bundle mode */ in sh_veu_configure()
789 sh_veu_reg_write(veu, VEU_EDWR, dst_stride); in sh_veu_configure()
790 sh_veu_reg_write(veu, VEU_DACR, 0); /* unused for RGB */ in sh_veu_configure()
792 sh_veu_reg_write(veu, VEU_SWPR, 0x67); in sh_veu_configure()
793 sh_veu_reg_write(veu, VEU_TRCR, (6 << 16) | (0 << 14) | 2 | 4); in sh_veu_configure()
795 if (veu->is_2h) { in sh_veu_configure()
796 sh_veu_reg_write(veu, VEU_MCR00, 0x0cc5); in sh_veu_configure()
797 sh_veu_reg_write(veu, VEU_MCR01, 0x0950); in sh_veu_configure()
798 sh_veu_reg_write(veu, VEU_MCR02, 0x0000); in sh_veu_configure()
800 sh_veu_reg_write(veu, VEU_MCR10, 0x397f); in sh_veu_configure()
801 sh_veu_reg_write(veu, VEU_MCR11, 0x0950); in sh_veu_configure()
802 sh_veu_reg_write(veu, VEU_MCR12, 0x3ccd); in sh_veu_configure()
804 sh_veu_reg_write(veu, VEU_MCR20, 0x0000); in sh_veu_configure()
805 sh_veu_reg_write(veu, VEU_MCR21, 0x0950); in sh_veu_configure()
806 sh_veu_reg_write(veu, VEU_MCR22, 0x1023); in sh_veu_configure()
808 sh_veu_reg_write(veu, VEU_COFFR, 0x00800010); in sh_veu_configure()
821 struct sh_veu_dev *veu = veu_file->veu_dev; in sh_veu_streamon() local
824 veu->xaction = 0; in sh_veu_streamon()
825 veu->aborting = false; in sh_veu_streamon()
872 struct sh_veu_dev *veu = vb2_get_drv_priv(vq); in sh_veu_queue_setup() local
890 vfmt = sh_veu_get_vfmt(veu, vq->type); in sh_veu_queue_setup()
904 alloc_ctxs[0] = veu->alloc_ctx; in sh_veu_queue_setup()
906 dev_dbg(veu->dev, "get %d buffer(s) of size %d each.\n", count, size); in sh_veu_queue_setup()
913 struct sh_veu_dev *veu = vb2_get_drv_priv(vb->vb2_queue); in sh_veu_buf_prepare() local
917 vfmt = sh_veu_get_vfmt(veu, vb->vb2_queue->type); in sh_veu_buf_prepare()
922 dev_dbg(veu->dev, "%s data will not fit into plane (%lu < %u)\n", in sh_veu_buf_prepare()
934 struct sh_veu_dev *veu = vb2_get_drv_priv(vb->vb2_queue); in sh_veu_buf_queue() local
935 dev_dbg(veu->dev, "%s(%d)\n", __func__, vb->v4l2_buf.type); in sh_veu_buf_queue()
936 v4l2_m2m_buf_queue(veu->m2m_ctx, vb); in sh_veu_buf_queue()
950 struct sh_veu_dev *veu = priv; in sh_veu_queue_init() local
956 src_vq->drv_priv = veu; in sh_veu_queue_init()
960 src_vq->lock = &veu->fop_lock; in sh_veu_queue_init()
969 dst_vq->drv_priv = veu; in sh_veu_queue_init()
973 dst_vq->lock = &veu->fop_lock; in sh_veu_queue_init()
982 struct sh_veu_dev *veu = video_drvdata(file); in sh_veu_open() local
989 veu_file->veu_dev = veu; in sh_veu_open()
994 pm_runtime_get_sync(veu->dev); in sh_veu_open()
996 dev_dbg(veu->dev, "Created instance %p\n", veu_file); in sh_veu_open()
1003 struct sh_veu_dev *veu = video_drvdata(file); in sh_veu_release() local
1006 dev_dbg(veu->dev, "Releasing instance %p\n", veu_file); in sh_veu_release()
1008 if (veu_file == veu->capture) { in sh_veu_release()
1009 veu->capture = NULL; in sh_veu_release()
1010 vb2_queue_release(v4l2_m2m_get_vq(veu->m2m_ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE)); in sh_veu_release()
1013 if (veu_file == veu->output) { in sh_veu_release()
1014 veu->output = NULL; in sh_veu_release()
1015 vb2_queue_release(v4l2_m2m_get_vq(veu->m2m_ctx, V4L2_BUF_TYPE_VIDEO_OUTPUT)); in sh_veu_release()
1018 if (!veu->output && !veu->capture && veu->m2m_ctx) { in sh_veu_release()
1019 v4l2_m2m_ctx_release(veu->m2m_ctx); in sh_veu_release()
1020 veu->m2m_ctx = NULL; in sh_veu_release()
1023 pm_runtime_put(veu->dev); in sh_veu_release()
1070 struct sh_veu_dev *veu = dev_id; in sh_veu_bh() local
1072 if (veu->xaction == MEM2MEM_DEF_TRANSLEN || veu->aborting) { in sh_veu_bh()
1073 v4l2_m2m_job_finish(veu->m2m_dev, veu->m2m_ctx); in sh_veu_bh()
1074 veu->xaction = 0; in sh_veu_bh()
1076 sh_veu_device_run(veu); in sh_veu_bh()
1084 struct sh_veu_dev *veu = dev_id; in sh_veu_isr() local
1087 u32 status = sh_veu_reg_read(veu, VEU_EVTR); in sh_veu_isr()
1094 sh_veu_reg_write(veu, VEU_EIER, 0); in sh_veu_isr()
1096 sh_veu_reg_write(veu, VEU_STR, 0); in sh_veu_isr()
1098 sh_veu_reg_write(veu, VEU_EVTR, status & ~1); in sh_veu_isr()
1101 dst = v4l2_m2m_dst_buf_remove(veu->m2m_ctx); in sh_veu_isr()
1102 src = v4l2_m2m_src_buf_remove(veu->m2m_ctx); in sh_veu_isr()
1106 spin_lock(&veu->lock); in sh_veu_isr()
1109 spin_unlock(&veu->lock); in sh_veu_isr()
1111 veu->xaction++; in sh_veu_isr()
1118 struct sh_veu_dev *veu; in sh_veu_probe() local
1131 veu = devm_kzalloc(&pdev->dev, sizeof(*veu), GFP_KERNEL); in sh_veu_probe()
1132 if (!veu) in sh_veu_probe()
1135 veu->is_2h = resource_size(reg_res) == 0x22c; in sh_veu_probe()
1137 veu->base = devm_ioremap_resource(&pdev->dev, reg_res); in sh_veu_probe()
1138 if (IS_ERR(veu->base)) in sh_veu_probe()
1139 return PTR_ERR(veu->base); in sh_veu_probe()
1142 0, "veu", veu); in sh_veu_probe()
1146 ret = v4l2_device_register(&pdev->dev, &veu->v4l2_dev); in sh_veu_probe()
1152 vdev = &veu->vdev; in sh_veu_probe()
1154 veu->alloc_ctx = vb2_dma_contig_init_ctx(&pdev->dev); in sh_veu_probe()
1155 if (IS_ERR(veu->alloc_ctx)) { in sh_veu_probe()
1156 ret = PTR_ERR(veu->alloc_ctx); in sh_veu_probe()
1161 vdev->v4l2_dev = &veu->v4l2_dev; in sh_veu_probe()
1162 spin_lock_init(&veu->lock); in sh_veu_probe()
1163 mutex_init(&veu->fop_lock); in sh_veu_probe()
1164 vdev->lock = &veu->fop_lock; in sh_veu_probe()
1166 video_set_drvdata(vdev, veu); in sh_veu_probe()
1168 veu->dev = &pdev->dev; in sh_veu_probe()
1169 veu->vfmt_out = DEFAULT_OUT_VFMT; in sh_veu_probe()
1170 veu->vfmt_in = DEFAULT_IN_VFMT; in sh_veu_probe()
1172 veu->m2m_dev = v4l2_m2m_init(&sh_veu_m2m_ops); in sh_veu_probe()
1173 if (IS_ERR(veu->m2m_dev)) { in sh_veu_probe()
1174 ret = PTR_ERR(veu->m2m_dev); in sh_veu_probe()
1175 v4l2_err(&veu->v4l2_dev, "Failed to init mem2mem device: %d\n", ret); in sh_veu_probe()
1191 v4l2_m2m_release(veu->m2m_dev); in sh_veu_probe()
1193 vb2_dma_contig_cleanup_ctx(veu->alloc_ctx); in sh_veu_probe()
1195 v4l2_device_unregister(&veu->v4l2_dev); in sh_veu_probe()
1202 struct sh_veu_dev *veu = container_of(v4l2_dev, in sh_veu_remove() local
1205 video_unregister_device(&veu->vdev); in sh_veu_remove()
1207 v4l2_m2m_release(veu->m2m_dev); in sh_veu_remove()
1208 vb2_dma_contig_cleanup_ctx(veu->alloc_ctx); in sh_veu_remove()
1209 v4l2_device_unregister(&veu->v4l2_dev); in sh_veu_remove()