Lines Matching refs:vou_dev

93 static void sh_vou_reg_a_write(struct sh_vou_device *vou_dev, unsigned int reg,
96 __raw_writel(value, vou_dev->base + reg);
99 static void sh_vou_reg_ab_write(struct sh_vou_device *vou_dev, unsigned int reg,
102 __raw_writel(value, vou_dev->base + reg);
103 __raw_writel(value, vou_dev->base + reg + 0x1000);
106 static void sh_vou_reg_m_write(struct sh_vou_device *vou_dev, unsigned int reg,
109 __raw_writel(value, vou_dev->base + reg + 0x2000);
112 static u32 sh_vou_reg_a_read(struct sh_vou_device *vou_dev, unsigned int reg)
114 return __raw_readl(vou_dev->base + reg);
117 static void sh_vou_reg_a_set(struct sh_vou_device *vou_dev, unsigned int reg,
120 u32 old = __raw_readl(vou_dev->base + reg);
123 __raw_writel(value, vou_dev->base + reg);
126 static void sh_vou_reg_b_set(struct sh_vou_device *vou_dev, unsigned int reg,
129 sh_vou_reg_a_set(vou_dev, reg + 0x1000, value, mask);
132 static void sh_vou_reg_ab_set(struct sh_vou_device *vou_dev, unsigned int reg,
135 sh_vou_reg_a_set(vou_dev, reg, value, mask);
136 sh_vou_reg_b_set(vou_dev, reg, value, mask);
187 static void sh_vou_schedule_next(struct sh_vou_device *vou_dev,
193 switch (vou_dev->pix.pixelformat) {
196 addr2 = addr1 + vou_dev->pix.width * vou_dev->pix.height;
202 sh_vou_reg_m_write(vou_dev, VOUAD1R, addr1);
203 sh_vou_reg_m_write(vou_dev, VOUAD2R, addr2);
206 static void sh_vou_stream_config(struct sh_vou_device *vou_dev)
215 switch (vou_dev->pix.pixelformat) {
232 sh_vou_reg_a_write(vou_dev, VOUSWR, dataswap);
233 sh_vou_reg_ab_write(vou_dev, VOUAIR, vou_dev->pix.width * row_coeff);
241 struct sh_vou_device *vou_dev = vb2_get_drv_priv(vq);
242 struct v4l2_pix_format *pix = &vou_dev->pix;
243 int bytes_per_line = vou_fmt[vou_dev->pix_idx].bpp * pix->width / 8;
245 dev_dbg(vou_dev->v4l2_dev.dev, "%s()\n", __func__);
256 struct sh_vou_device *vou_dev = vb2_get_drv_priv(vb->vb2_queue);
257 struct v4l2_pix_format *pix = &vou_dev->pix;
258 unsigned bytes_per_line = vou_fmt[vou_dev->pix_idx].bpp * pix->width / 8;
261 dev_dbg(vou_dev->v4l2_dev.dev, "%s()\n", __func__);
265 dev_warn(vou_dev->v4l2_dev.dev, "buffer too small (%lu < %u)\n",
278 struct sh_vou_device *vou_dev = vb2_get_drv_priv(vb->vb2_queue);
282 spin_lock_irqsave(&vou_dev->lock, flags);
283 list_add_tail(&shbuf->list, &vou_dev->buf_list);
284 spin_unlock_irqrestore(&vou_dev->lock, flags);
289 struct sh_vou_device *vou_dev = vb2_get_drv_priv(vq);
293 vou_dev->sequence = 0;
294 ret = v4l2_device_call_until_err(&vou_dev->v4l2_dev, 0,
297 list_for_each_entry_safe(buf, node, &vou_dev->buf_list, list) {
302 vou_dev->active = NULL;
306 buf = list_entry(vou_dev->buf_list.next, struct sh_vou_buffer, list);
308 vou_dev->active = buf;
311 sh_vou_reg_a_write(vou_dev, VOURPR, 1);
312 dev_dbg(vou_dev->v4l2_dev.dev, "%s: first buffer status 0x%x\n",
313 __func__, sh_vou_reg_a_read(vou_dev, VOUSTR));
314 sh_vou_schedule_next(vou_dev, &buf->vb);
319 sh_vou_reg_a_write(vou_dev, VOURPR, 0);
320 sh_vou_schedule_next(vou_dev, &buf->vb);
323 sh_vou_reg_a_write(vou_dev, VOURCR, 5);
325 sh_vou_stream_config(vou_dev);
327 sh_vou_reg_a_write(vou_dev, VOUIR, 0x10004);
330 vou_dev->status = SH_VOU_RUNNING;
331 sh_vou_reg_a_write(vou_dev, VOUER, 0x107);
337 struct sh_vou_device *vou_dev = vb2_get_drv_priv(vq);
341 v4l2_device_call_until_err(&vou_dev->v4l2_dev, 0,
344 sh_vou_reg_a_set(vou_dev, VOUER, 0, 1);
346 sh_vou_reg_a_set(vou_dev, VOUIR, 0, 0x30000);
348 spin_lock_irqsave(&vou_dev->lock, flags);
349 list_for_each_entry_safe(buf, node, &vou_dev->buf_list, list) {
353 vou_dev->active = NULL;
354 spin_unlock_irqrestore(&vou_dev->lock, flags);
371 struct sh_vou_device *vou_dev = video_drvdata(file);
373 dev_dbg(vou_dev->v4l2_dev.dev, "%s()\n", __func__);
385 struct sh_vou_device *vou_dev = video_drvdata(file);
390 dev_dbg(vou_dev->v4l2_dev.dev, "%s()\n", __func__);
400 struct sh_vou_device *vou_dev = video_drvdata(file);
402 dev_dbg(vou_dev->v4l2_dev.dev, "%s()\n", __func__);
405 fmt->fmt.pix = vou_dev->pix;
417 static void sh_vou_configure_geometry(struct sh_vou_device *vou_dev,
423 struct v4l2_rect *rect = &vou_dev->rect;
424 struct v4l2_pix_format *pix = &vou_dev->pix;
427 if (vou_dev->std & V4L2_STD_525_60) {
464 dev_dbg(vou_dev->v4l2_dev.dev,
470 sh_vou_reg_ab_write(vou_dev, VOUISR, (pix->width << 16) | frame_in_height);
471 sh_vou_reg_ab_write(vou_dev, VOUVPR, (black_left << 16) | black_top);
472 sh_vou_reg_ab_write(vou_dev, VOUDPR, (rect->left << 16) | frame_out_top);
473 sh_vou_reg_ab_write(vou_dev, VOUDSR, (dsr_h << 16) | dsr_v);
485 dev_dbg(vou_dev->v4l2_dev.dev, "0x%08x: scaling 0x%x\n",
489 sh_vou_reg_ab_write(vou_dev, VOUVCR, vouvcr);
490 sh_vou_reg_ab_write(vou_dev, VOUDFR,
654 struct sh_vou_device *vou_dev = video_drvdata(file);
659 dev_dbg(vou_dev->v4l2_dev.dev, "%s()\n", __func__);
672 if (vou_dev->std & V4L2_STD_525_60)
687 static int sh_vou_set_fmt_vid_out(struct sh_vou_device *vou_dev,
703 if (vb2_is_busy(&vou_dev->queue))
712 geo.output = vou_dev->rect;
714 vou_adjust_output(&geo, vou_dev->std);
718 ret = v4l2_device_call_until_err(&vou_dev->v4l2_dev, 0, pad,
724 dev_dbg(vou_dev->v4l2_dev.dev, "%s(): %ux%u -> %ux%u\n", __func__,
727 if (vou_dev->std & V4L2_STD_525_60)
743 vou_adjust_input(&geo, vou_dev->std);
747 vou_dev->rect = geo.output;
751 dev_dbg(vou_dev->v4l2_dev.dev, "%s(): %ux%u\n", __func__,
754 vou_dev->pix_idx = pix_idx;
756 vou_dev->pix = *pix;
758 sh_vou_configure_geometry(vou_dev, pix_idx,
767 struct sh_vou_device *vou_dev = video_drvdata(file);
772 return sh_vou_set_fmt_vid_out(vou_dev, &fmt->fmt.pix);
778 struct sh_vou_device *vou_dev = video_drvdata(file);
784 a->std = vou_dev->vdev.tvnorms;
817 struct sh_vou_device *vou_dev = video_drvdata(file);
820 dev_dbg(vou_dev->v4l2_dev.dev, "%s(): 0x%llx\n", __func__, std_id);
822 if (std_id == vou_dev->std)
825 if (vb2_is_busy(&vou_dev->queue))
828 ret = v4l2_device_call_until_err(&vou_dev->v4l2_dev, 0, video,
834 vou_dev->rect.top = vou_dev->rect.left = 0;
835 vou_dev->rect.width = VOU_MAX_IMAGE_WIDTH;
837 sh_vou_reg_ab_set(vou_dev, VOUCR,
838 sh_vou_ntsc_mode(vou_dev->pdata->bus_fmt) << 29, 7 << 29);
839 vou_dev->rect.height = 480;
841 sh_vou_reg_ab_set(vou_dev, VOUCR, 5 << 29, 7 << 29);
842 vou_dev->rect.height = 576;
845 vou_dev->pix.width = vou_dev->rect.width;
846 vou_dev->pix.height = vou_dev->rect.height;
847 vou_dev->pix.bytesperline =
848 vou_dev->pix.width * vou_fmt[vou_dev->pix_idx].bpl;
849 vou_dev->pix.sizeimage = vou_dev->pix.height *
850 ((vou_dev->pix.width * vou_fmt[vou_dev->pix_idx].bpp) >> 3);
851 vou_dev->std = std_id;
852 sh_vou_set_fmt_vid_out(vou_dev, &vou_dev->pix);
859 struct sh_vou_device *vou_dev = video_drvdata(file);
861 dev_dbg(vou_dev->v4l2_dev.dev, "%s()\n", __func__);
863 *std = vou_dev->std;
870 struct sh_vou_device *vou_dev = video_drvdata(file);
872 pr_info("VOUER: 0x%08x\n", sh_vou_reg_a_read(vou_dev, VOUER));
873 pr_info("VOUCR: 0x%08x\n", sh_vou_reg_a_read(vou_dev, VOUCR));
874 pr_info("VOUSTR: 0x%08x\n", sh_vou_reg_a_read(vou_dev, VOUSTR));
875 pr_info("VOUVCR: 0x%08x\n", sh_vou_reg_a_read(vou_dev, VOUVCR));
876 pr_info("VOUISR: 0x%08x\n", sh_vou_reg_a_read(vou_dev, VOUISR));
877 pr_info("VOUBCR: 0x%08x\n", sh_vou_reg_a_read(vou_dev, VOUBCR));
878 pr_info("VOUDPR: 0x%08x\n", sh_vou_reg_a_read(vou_dev, VOUDPR));
879 pr_info("VOUDSR: 0x%08x\n", sh_vou_reg_a_read(vou_dev, VOUDSR));
880 pr_info("VOUVPR: 0x%08x\n", sh_vou_reg_a_read(vou_dev, VOUVPR));
881 pr_info("VOUIR: 0x%08x\n", sh_vou_reg_a_read(vou_dev, VOUIR));
882 pr_info("VOUSRR: 0x%08x\n", sh_vou_reg_a_read(vou_dev, VOUSRR));
883 pr_info("VOUMSR: 0x%08x\n", sh_vou_reg_a_read(vou_dev, VOUMSR));
884 pr_info("VOUHIR: 0x%08x\n", sh_vou_reg_a_read(vou_dev, VOUHIR));
885 pr_info("VOUDFR: 0x%08x\n", sh_vou_reg_a_read(vou_dev, VOUDFR));
886 pr_info("VOUAD1R: 0x%08x\n", sh_vou_reg_a_read(vou_dev, VOUAD1R));
887 pr_info("VOUAD2R: 0x%08x\n", sh_vou_reg_a_read(vou_dev, VOUAD2R));
888 pr_info("VOUAIR: 0x%08x\n", sh_vou_reg_a_read(vou_dev, VOUAIR));
889 pr_info("VOUSWR: 0x%08x\n", sh_vou_reg_a_read(vou_dev, VOUSWR));
890 pr_info("VOURCR: 0x%08x\n", sh_vou_reg_a_read(vou_dev, VOURCR));
891 pr_info("VOURPR: 0x%08x\n", sh_vou_reg_a_read(vou_dev, VOURPR));
898 struct sh_vou_device *vou_dev = video_drvdata(file);
904 sel->r = vou_dev->rect;
911 if (vou_dev->std & V4L2_STD_525_60)
927 struct sh_vou_device *vou_dev = video_drvdata(file);
932 struct v4l2_pix_format *pix = &vou_dev->pix;
948 if (vb2_is_busy(&vou_dev->queue))
951 if (vou_dev->std & V4L2_STD_525_60)
978 v4l2_device_call_until_err(&vou_dev->v4l2_dev, 0, pad,
982 ret = v4l2_device_call_until_err(&vou_dev->v4l2_dev, 0, pad,
1001 vou_adjust_input(&geo, vou_dev->std);
1004 vou_dev->rect = geo.output;
1008 sh_vou_configure_geometry(vou_dev, vou_dev->pix_idx,
1016 struct sh_vou_device *vou_dev = dev_id;
1020 u32 irq_status = sh_vou_reg_a_read(vou_dev, VOUIR), masked;
1021 u32 vou_status = sh_vou_reg_a_read(vou_dev, VOUSTR);
1025 dev_warn(vou_dev->v4l2_dev.dev, "IRQ status 0x%x!\n",
1030 spin_lock(&vou_dev->lock);
1031 if (!vou_dev->active || list_empty(&vou_dev->buf_list)) {
1033 dev_warn(vou_dev->v4l2_dev.dev,
1036 sh_vou_reg_a_set(vou_dev, VOUIR, 0, 0x300);
1037 spin_unlock(&vou_dev->lock);
1042 dev_dbg(vou_dev->v4l2_dev.dev,
1050 sh_vou_reg_a_write(vou_dev, VOUIR, masked);
1052 vb = vou_dev->active;
1055 sh_vou_schedule_next(vou_dev, &vb->vb);
1056 spin_unlock(&vou_dev->lock);
1063 vb->vb.sequence = vou_dev->sequence++;
1067 vou_dev->active = list_entry(vou_dev->buf_list.next,
1070 if (list_is_singular(&vou_dev->buf_list)) {
1072 sh_vou_schedule_next(vou_dev, &vou_dev->active->vb);
1074 struct sh_vou_buffer *new = list_entry(vou_dev->active->list.next,
1076 sh_vou_schedule_next(vou_dev, &new->vb);
1079 spin_unlock(&vou_dev->lock);
1084 static int sh_vou_hw_init(struct sh_vou_device *vou_dev)
1086 struct sh_vou_pdata *pdata = vou_dev->pdata;
1091 sh_vou_reg_a_write(vou_dev, VOUIR, 0);
1094 sh_vou_reg_a_write(vou_dev, VOUSRR, 0x101);
1095 while (--i && (sh_vou_reg_a_read(vou_dev, VOUSRR) & 0x101))
1101 dev_dbg(vou_dev->v4l2_dev.dev, "Reset took %dus\n", 100 - i);
1109 sh_vou_reg_ab_set(vou_dev, VOUCR, voucr, 0xfc000000);
1112 sh_vou_reg_a_write(vou_dev, VOURCR, 4);
1114 sh_vou_reg_ab_write(vou_dev, VOUMSR, 0x800000);
1116 sh_vou_set_fmt_vid_out(vou_dev, &vou_dev->pix);
1124 struct sh_vou_device *vou_dev = video_drvdata(file);
1127 if (mutex_lock_interruptible(&vou_dev->fop_lock))
1134 vou_dev->status == SH_VOU_INITIALISING) {
1136 err = pm_runtime_resume_and_get(vou_dev->v4l2_dev.dev);
1141 err = sh_vou_hw_init(vou_dev);
1143 pm_runtime_put(vou_dev->v4l2_dev.dev);
1146 vou_dev->status = SH_VOU_IDLE;
1150 mutex_unlock(&vou_dev->fop_lock);
1156 struct sh_vou_device *vou_dev = video_drvdata(file);
1159 mutex_lock(&vou_dev->fop_lock);
1164 vou_dev->status = SH_VOU_INITIALISING;
1165 sh_vou_reg_a_set(vou_dev, VOUER, 0, 0x101);
1166 pm_runtime_put(vou_dev->v4l2_dev.dev);
1168 mutex_unlock(&vou_dev->fop_lock);
1225 struct sh_vou_device *vou_dev;
1239 vou_dev = devm_kzalloc(&pdev->dev, sizeof(*vou_dev), GFP_KERNEL);
1240 if (!vou_dev)
1243 INIT_LIST_HEAD(&vou_dev->buf_list);
1244 spin_lock_init(&vou_dev->lock);
1245 mutex_init(&vou_dev->fop_lock);
1246 vou_dev->pdata = vou_pdata;
1247 vou_dev->status = SH_VOU_INITIALISING;
1248 vou_dev->pix_idx = 1;
1250 rect = &vou_dev->rect;
1251 pix = &vou_dev->pix;
1254 vou_dev->std = V4L2_STD_NTSC_M;
1267 vou_dev->base = devm_platform_ioremap_resource(pdev, 0);
1268 if (IS_ERR(vou_dev->base))
1269 return PTR_ERR(vou_dev->base);
1271 ret = devm_request_irq(&pdev->dev, irq, sh_vou_isr, 0, "vou", vou_dev);
1275 ret = v4l2_device_register(&pdev->dev, &vou_dev->v4l2_dev);
1281 vdev = &vou_dev->vdev;
1285 vdev->v4l2_dev = &vou_dev->v4l2_dev;
1287 vdev->lock = &vou_dev->fop_lock;
1289 video_set_drvdata(vdev, vou_dev);
1292 q = &vou_dev->queue;
1295 q->drv_priv = vou_dev;
1301 q->lock = &vou_dev->fop_lock;
1308 INIT_LIST_HEAD(&vou_dev->buf_list);
1319 ret = sh_vou_hw_init(vou_dev);
1323 subdev = v4l2_i2c_new_subdev_board(&vou_dev->v4l2_dev, i2c_adap,
1342 v4l2_device_unregister(&vou_dev->v4l2_dev);
1349 struct sh_vou_device *vou_dev = container_of(v4l2_dev,
1356 video_unregister_device(&vou_dev->vdev);
1358 v4l2_device_unregister(&vou_dev->v4l2_dev);