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()
873 struct sh_veu_dev *veu = vb2_get_drv_priv(vq); in sh_veu_queue_setup() local
891 vfmt = sh_veu_get_vfmt(veu, vq->type); in sh_veu_queue_setup()
905 alloc_ctxs[0] = veu->alloc_ctx; in sh_veu_queue_setup()
907 dev_dbg(veu->dev, "get %d buffer(s) of size %d each.\n", count, size); in sh_veu_queue_setup()
914 struct sh_veu_dev *veu = vb2_get_drv_priv(vb->vb2_queue); in sh_veu_buf_prepare() local
918 vfmt = sh_veu_get_vfmt(veu, vb->vb2_queue->type); in sh_veu_buf_prepare()
923 dev_dbg(veu->dev, "%s data will not fit into plane (%lu < %u)\n", in sh_veu_buf_prepare()
936 struct sh_veu_dev *veu = vb2_get_drv_priv(vb->vb2_queue); in sh_veu_buf_queue() local
937 dev_dbg(veu->dev, "%s(%d)\n", __func__, vb->type); in sh_veu_buf_queue()
938 v4l2_m2m_buf_queue(veu->m2m_ctx, vbuf); in sh_veu_buf_queue()
952 struct sh_veu_dev *veu = priv; in sh_veu_queue_init() local
958 src_vq->drv_priv = veu; in sh_veu_queue_init()
962 src_vq->lock = &veu->fop_lock; in sh_veu_queue_init()
972 dst_vq->drv_priv = veu; in sh_veu_queue_init()
976 dst_vq->lock = &veu->fop_lock; in sh_veu_queue_init()
986 struct sh_veu_dev *veu = video_drvdata(file); in sh_veu_open() local
993 veu_file->veu_dev = veu; in sh_veu_open()
998 pm_runtime_get_sync(veu->dev); in sh_veu_open()
1000 dev_dbg(veu->dev, "Created instance %p\n", veu_file); in sh_veu_open()
1007 struct sh_veu_dev *veu = video_drvdata(file); in sh_veu_release() local
1010 dev_dbg(veu->dev, "Releasing instance %p\n", veu_file); in sh_veu_release()
1012 if (veu_file == veu->capture) { in sh_veu_release()
1013 veu->capture = NULL; in sh_veu_release()
1014 vb2_queue_release(v4l2_m2m_get_vq(veu->m2m_ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE)); in sh_veu_release()
1017 if (veu_file == veu->output) { in sh_veu_release()
1018 veu->output = NULL; in sh_veu_release()
1019 vb2_queue_release(v4l2_m2m_get_vq(veu->m2m_ctx, V4L2_BUF_TYPE_VIDEO_OUTPUT)); in sh_veu_release()
1022 if (!veu->output && !veu->capture && veu->m2m_ctx) { in sh_veu_release()
1023 v4l2_m2m_ctx_release(veu->m2m_ctx); in sh_veu_release()
1024 veu->m2m_ctx = NULL; in sh_veu_release()
1027 pm_runtime_put(veu->dev); in sh_veu_release()
1074 struct sh_veu_dev *veu = dev_id; in sh_veu_bh() local
1076 if (veu->xaction == MEM2MEM_DEF_TRANSLEN || veu->aborting) { in sh_veu_bh()
1077 v4l2_m2m_job_finish(veu->m2m_dev, veu->m2m_ctx); in sh_veu_bh()
1078 veu->xaction = 0; in sh_veu_bh()
1080 sh_veu_device_run(veu); in sh_veu_bh()
1088 struct sh_veu_dev *veu = dev_id; in sh_veu_isr() local
1091 u32 status = sh_veu_reg_read(veu, VEU_EVTR); in sh_veu_isr()
1098 sh_veu_reg_write(veu, VEU_EIER, 0); in sh_veu_isr()
1100 sh_veu_reg_write(veu, VEU_STR, 0); in sh_veu_isr()
1102 sh_veu_reg_write(veu, VEU_EVTR, status & ~1); in sh_veu_isr()
1105 dst = v4l2_m2m_dst_buf_remove(veu->m2m_ctx); in sh_veu_isr()
1106 src = v4l2_m2m_src_buf_remove(veu->m2m_ctx); in sh_veu_isr()
1116 spin_lock(&veu->lock); in sh_veu_isr()
1119 spin_unlock(&veu->lock); in sh_veu_isr()
1121 veu->xaction++; in sh_veu_isr()
1128 struct sh_veu_dev *veu; in sh_veu_probe() local
1141 veu = devm_kzalloc(&pdev->dev, sizeof(*veu), GFP_KERNEL); in sh_veu_probe()
1142 if (!veu) in sh_veu_probe()
1145 veu->is_2h = resource_size(reg_res) == 0x22c; in sh_veu_probe()
1147 veu->base = devm_ioremap_resource(&pdev->dev, reg_res); in sh_veu_probe()
1148 if (IS_ERR(veu->base)) in sh_veu_probe()
1149 return PTR_ERR(veu->base); in sh_veu_probe()
1152 0, "veu", veu); in sh_veu_probe()
1156 ret = v4l2_device_register(&pdev->dev, &veu->v4l2_dev); in sh_veu_probe()
1162 vdev = &veu->vdev; in sh_veu_probe()
1164 veu->alloc_ctx = vb2_dma_contig_init_ctx(&pdev->dev); in sh_veu_probe()
1165 if (IS_ERR(veu->alloc_ctx)) { in sh_veu_probe()
1166 ret = PTR_ERR(veu->alloc_ctx); in sh_veu_probe()
1171 vdev->v4l2_dev = &veu->v4l2_dev; in sh_veu_probe()
1172 spin_lock_init(&veu->lock); in sh_veu_probe()
1173 mutex_init(&veu->fop_lock); in sh_veu_probe()
1174 vdev->lock = &veu->fop_lock; in sh_veu_probe()
1176 video_set_drvdata(vdev, veu); in sh_veu_probe()
1178 veu->dev = &pdev->dev; in sh_veu_probe()
1179 veu->vfmt_out = DEFAULT_OUT_VFMT; in sh_veu_probe()
1180 veu->vfmt_in = DEFAULT_IN_VFMT; in sh_veu_probe()
1182 veu->m2m_dev = v4l2_m2m_init(&sh_veu_m2m_ops); in sh_veu_probe()
1183 if (IS_ERR(veu->m2m_dev)) { in sh_veu_probe()
1184 ret = PTR_ERR(veu->m2m_dev); in sh_veu_probe()
1185 v4l2_err(&veu->v4l2_dev, "Failed to init mem2mem device: %d\n", ret); in sh_veu_probe()
1201 v4l2_m2m_release(veu->m2m_dev); in sh_veu_probe()
1203 vb2_dma_contig_cleanup_ctx(veu->alloc_ctx); in sh_veu_probe()
1205 v4l2_device_unregister(&veu->v4l2_dev); in sh_veu_probe()
1212 struct sh_veu_dev *veu = container_of(v4l2_dev, in sh_veu_remove() local
1215 video_unregister_device(&veu->vdev); in sh_veu_remove()
1217 v4l2_m2m_release(veu->m2m_dev); in sh_veu_remove()
1218 vb2_dma_contig_cleanup_ctx(veu->alloc_ctx); in sh_veu_remove()
1219 v4l2_device_unregister(&veu->v4l2_dev); in sh_veu_remove()