Lines Matching refs:ceudev
317 static int ceu_soft_reset(struct ceu_device *ceudev) in ceu_soft_reset() argument
321 ceu_write(ceudev, CEU_CAPSR, CEU_CAPSR_CPKIL); in ceu_soft_reset()
324 if (!(ceu_read(ceudev, CEU_CSTSR) & CEU_CSTRST_CPTON)) in ceu_soft_reset()
330 dev_err(ceudev->dev, "soft reset time out\n"); in ceu_soft_reset()
335 if (!(ceu_read(ceudev, CEU_CAPSR) & CEU_CAPSR_CPKIL)) in ceu_soft_reset()
349 static int ceu_hw_config(struct ceu_device *ceudev) in ceu_hw_config() argument
352 struct v4l2_pix_format_mplane *pix = &ceudev->v4l2_pix; in ceu_hw_config()
353 struct ceu_subdev *ceu_sd = ceudev->sd; in ceu_hw_config()
358 ceu_write(ceudev, CEU_CAIFR, 0); in ceu_hw_config()
359 ceu_write(ceudev, CEU_CFWCR, 0); in ceu_hw_config()
360 ceu_write(ceudev, CEU_CRCNTR, 0); in ceu_hw_config()
361 ceu_write(ceudev, CEU_CRCMPR, 0); in ceu_hw_config()
441 ceu_write(ceudev, CEU_CAMCR, camcr); in ceu_hw_config()
442 ceu_write(ceudev, CEU_CDOCR, cdocr); in ceu_hw_config()
443 ceu_write(ceudev, CEU_CAPCR, CEU_CAPCR_BUS_WIDTH256); in ceu_hw_config()
450 ceu_write(ceudev, CEU_CAMOR, 0); in ceu_hw_config()
453 ceu_write(ceudev, CEU_CAPWR, capwr); in ceu_hw_config()
454 ceu_write(ceudev, CEU_CFSZR, cfzsr); in ceu_hw_config()
455 ceu_write(ceudev, CEU_CDWDR, cdwdr); in ceu_hw_config()
465 static int ceu_capture(struct ceu_device *ceudev) in ceu_capture() argument
467 struct v4l2_pix_format_mplane *pix = &ceudev->v4l2_pix; in ceu_capture()
471 vb2_dma_contig_plane_dma_addr(&ceudev->active->vb2_buf, 0); in ceu_capture()
472 ceu_write(ceudev, CEU_CDAYR, phys_addr_top); in ceu_capture()
477 vb2_dma_contig_plane_dma_addr(&ceudev->active->vb2_buf, in ceu_capture()
479 ceu_write(ceudev, CEU_CDACR, phys_addr_top); in ceu_capture()
486 ceu_write(ceudev, CEU_CAPSR, CEU_CAPSR_CE); in ceu_capture()
493 struct ceu_device *ceudev = data; in ceu_irq() local
499 status = ceu_read(ceudev, CEU_CETCR); in ceu_irq()
500 ceu_write(ceudev, CEU_CETCR, ~ceudev->irq_mask); in ceu_irq()
506 spin_lock(&ceudev->lock); in ceu_irq()
509 vbuf = ceudev->active; in ceu_irq()
511 spin_unlock(&ceudev->lock); in ceu_irq()
520 dev_err(ceudev->dev, "VBP interrupt: abort capture\n"); in ceu_irq()
526 vbuf->sequence = ceudev->sequence++; in ceu_irq()
527 vbuf->field = ceudev->field; in ceu_irq()
530 if (!list_empty(&ceudev->capture)) { in ceu_irq()
531 buf = list_first_entry(&ceudev->capture, struct ceu_buffer, in ceu_irq()
534 ceudev->active = &buf->vb; in ceu_irq()
536 ceu_capture(ceudev); in ceu_irq()
542 spin_unlock(&ceudev->lock); in ceu_irq()
550 list_for_each_entry(buf, &ceudev->capture, queue) in ceu_irq()
553 spin_unlock(&ceudev->lock); in ceu_irq()
578 static void ceu_calc_plane_sizes(struct ceu_device *ceudev, in ceu_calc_plane_sizes() argument
625 struct ceu_device *ceudev = vb2_get_drv_priv(vq); in ceu_vb2_setup() local
626 struct v4l2_pix_format_mplane *pix = &ceudev->v4l2_pix; in ceu_vb2_setup()
648 struct ceu_device *ceudev = vb2_get_drv_priv(vb->vb2_queue); in ceu_vb2_queue() local
653 spin_lock_irqsave(&ceudev->lock, irqflags); in ceu_vb2_queue()
654 list_add_tail(&buf->queue, &ceudev->capture); in ceu_vb2_queue()
655 spin_unlock_irqrestore(&ceudev->lock, irqflags); in ceu_vb2_queue()
660 struct ceu_device *ceudev = vb2_get_drv_priv(vb->vb2_queue); in ceu_vb2_prepare() local
661 struct v4l2_pix_format_mplane *pix = &ceudev->v4l2_pix; in ceu_vb2_prepare()
666 dev_err(ceudev->dev, in ceu_vb2_prepare()
681 struct ceu_device *ceudev = vb2_get_drv_priv(vq); in ceu_start_streaming() local
682 struct v4l2_subdev *v4l2_sd = ceudev->sd->v4l2_sd; in ceu_start_streaming()
688 ret = ceu_hw_config(ceudev); in ceu_start_streaming()
694 dev_dbg(ceudev->dev, in ceu_start_streaming()
699 spin_lock_irqsave(&ceudev->lock, irqflags); in ceu_start_streaming()
700 ceudev->sequence = 0; in ceu_start_streaming()
703 buf = list_first_entry(&ceudev->capture, struct ceu_buffer, in ceu_start_streaming()
706 spin_unlock_irqrestore(&ceudev->lock, irqflags); in ceu_start_streaming()
707 dev_dbg(ceudev->dev, in ceu_start_streaming()
713 ceudev->active = &buf->vb; in ceu_start_streaming()
716 ceu_write(ceudev, CEU_CETCR, ~ceudev->irq_mask); in ceu_start_streaming()
717 ceu_write(ceudev, CEU_CEIER, CEU_CEIER_MASK); in ceu_start_streaming()
719 ceu_capture(ceudev); in ceu_start_streaming()
721 spin_unlock_irqrestore(&ceudev->lock, irqflags); in ceu_start_streaming()
729 spin_lock_irqsave(&ceudev->lock, irqflags); in ceu_start_streaming()
730 list_for_each_entry(buf, &ceudev->capture, queue) in ceu_start_streaming()
731 vb2_buffer_done(&ceudev->active->vb2_buf, in ceu_start_streaming()
733 ceudev->active = NULL; in ceu_start_streaming()
734 spin_unlock_irqrestore(&ceudev->lock, irqflags); in ceu_start_streaming()
741 struct ceu_device *ceudev = vb2_get_drv_priv(vq); in ceu_stop_streaming() local
742 struct v4l2_subdev *v4l2_sd = ceudev->sd->v4l2_sd; in ceu_stop_streaming()
747 ceu_write(ceudev, CEU_CETCR, in ceu_stop_streaming()
748 ceu_read(ceudev, CEU_CETCR) & ceudev->irq_mask); in ceu_stop_streaming()
749 ceu_write(ceudev, CEU_CEIER, CEU_CEIER_MASK); in ceu_stop_streaming()
753 spin_lock_irqsave(&ceudev->lock, irqflags); in ceu_stop_streaming()
754 if (ceudev->active) { in ceu_stop_streaming()
755 vb2_buffer_done(&ceudev->active->vb2_buf, in ceu_stop_streaming()
757 ceudev->active = NULL; in ceu_stop_streaming()
761 list_for_each_entry(buf, &ceudev->capture, queue) in ceu_stop_streaming()
763 INIT_LIST_HEAD(&ceudev->capture); in ceu_stop_streaming()
765 spin_unlock_irqrestore(&ceudev->lock, irqflags); in ceu_stop_streaming()
767 ceu_soft_reset(ceudev); in ceu_stop_streaming()
790 static int __ceu_try_fmt(struct ceu_device *ceudev, struct v4l2_format *v4l2_fmt, in __ceu_try_fmt() argument
793 struct ceu_subdev *ceu_sd = ceudev->sd; in __ceu_try_fmt()
870 ceu_calc_plane_sizes(ceudev, ceu_fmt, pix); in __ceu_try_fmt()
881 static int ceu_try_fmt(struct ceu_device *ceudev, struct v4l2_format *v4l2_fmt) in ceu_try_fmt() argument
885 return __ceu_try_fmt(ceudev, v4l2_fmt, &mbus_code); in ceu_try_fmt()
891 static int ceu_set_fmt(struct ceu_device *ceudev, struct v4l2_format *v4l2_fmt) in ceu_set_fmt() argument
893 struct ceu_subdev *ceu_sd = ceudev->sd; in ceu_set_fmt()
906 ret = __ceu_try_fmt(ceudev, v4l2_fmt, &mbus_code); in ceu_set_fmt()
916 ceudev->v4l2_pix = v4l2_fmt->fmt.pix_mp; in ceu_set_fmt()
917 ceudev->field = V4L2_FIELD_NONE; in ceu_set_fmt()
926 static int ceu_set_default_fmt(struct ceu_device *ceudev) in ceu_set_default_fmt() argument
951 ret = ceu_try_fmt(ceudev, &v4l2_fmt); in ceu_set_default_fmt()
955 ceudev->v4l2_pix = v4l2_fmt.fmt.pix_mp; in ceu_set_default_fmt()
956 ceudev->field = V4L2_FIELD_NONE; in ceu_set_default_fmt()
974 static int ceu_init_mbus_fmt(struct ceu_device *ceudev) in ceu_init_mbus_fmt() argument
976 struct ceu_subdev *ceu_sd = ceudev->sd; in ceu_init_mbus_fmt()
1062 struct ceu_device *ceudev = dev_get_drvdata(dev); in ceu_runtime_resume() local
1063 struct v4l2_subdev *v4l2_sd = ceudev->sd->v4l2_sd; in ceu_runtime_resume()
1067 ceu_soft_reset(ceudev); in ceu_runtime_resume()
1078 struct ceu_device *ceudev = dev_get_drvdata(dev); in ceu_runtime_suspend() local
1079 struct v4l2_subdev *v4l2_sd = ceudev->sd->v4l2_sd; in ceu_runtime_suspend()
1083 ceu_write(ceudev, CEU_CEIER, 0); in ceu_runtime_suspend()
1084 ceu_soft_reset(ceudev); in ceu_runtime_suspend()
1093 struct ceu_device *ceudev = video_drvdata(file); in ceu_open() local
1100 mutex_lock(&ceudev->mlock); in ceu_open()
1102 pm_runtime_get_sync(ceudev->dev); in ceu_open()
1103 mutex_unlock(&ceudev->mlock); in ceu_open()
1110 struct ceu_device *ceudev = video_drvdata(file); in ceu_release() local
1114 mutex_lock(&ceudev->mlock); in ceu_release()
1116 pm_runtime_put(ceudev->dev); in ceu_release()
1117 mutex_unlock(&ceudev->mlock); in ceu_release()
1136 struct ceu_device *ceudev = video_drvdata(file); in ceu_querycap() local
1141 "platform:renesas-ceu-%s", dev_name(ceudev->dev)); in ceu_querycap()
1163 struct ceu_device *ceudev = video_drvdata(file); in ceu_try_fmt_vid_cap() local
1165 return ceu_try_fmt(ceudev, f); in ceu_try_fmt_vid_cap()
1171 struct ceu_device *ceudev = video_drvdata(file); in ceu_s_fmt_vid_cap() local
1173 if (vb2_is_streaming(&ceudev->vb2_vq)) in ceu_s_fmt_vid_cap()
1176 return ceu_set_fmt(ceudev, f); in ceu_s_fmt_vid_cap()
1182 struct ceu_device *ceudev = video_drvdata(file); in ceu_g_fmt_vid_cap() local
1184 f->fmt.pix_mp = ceudev->v4l2_pix; in ceu_g_fmt_vid_cap()
1192 struct ceu_device *ceudev = video_drvdata(file); in ceu_enum_input() local
1195 if (inp->index >= ceudev->num_sd) in ceu_enum_input()
1198 ceusd = &ceudev->subdevs[inp->index]; in ceu_enum_input()
1210 struct ceu_device *ceudev = video_drvdata(file); in ceu_g_input() local
1212 *i = ceudev->sd_index; in ceu_g_input()
1219 struct ceu_device *ceudev = video_drvdata(file); in ceu_s_input() local
1223 if (i >= ceudev->num_sd) in ceu_s_input()
1226 if (vb2_is_streaming(&ceudev->vb2_vq)) in ceu_s_input()
1229 if (i == ceudev->sd_index) in ceu_s_input()
1232 ceu_sd_old = ceudev->sd; in ceu_s_input()
1233 ceudev->sd = &ceudev->subdevs[i]; in ceu_s_input()
1239 ret = ceu_init_mbus_fmt(ceudev); in ceu_s_input()
1241 ceudev->sd = ceu_sd_old; in ceu_s_input()
1245 ret = ceu_set_default_fmt(ceudev); in ceu_s_input()
1247 ceudev->sd = ceu_sd_old; in ceu_s_input()
1253 v4l2_subdev_call(ceudev->sd->v4l2_sd, core, s_power, 1); in ceu_s_input()
1255 ceudev->sd_index = i; in ceu_s_input()
1262 struct ceu_device *ceudev = video_drvdata(file); in ceu_g_parm() local
1264 return v4l2_g_parm_cap(video_devdata(file), ceudev->sd->v4l2_sd, a); in ceu_g_parm()
1269 struct ceu_device *ceudev = video_drvdata(file); in ceu_s_parm() local
1271 return v4l2_s_parm_cap(video_devdata(file), ceudev->sd->v4l2_sd, a); in ceu_s_parm()
1277 struct ceu_device *ceudev = video_drvdata(file); in ceu_enum_framesizes() local
1278 struct ceu_subdev *ceu_sd = ceudev->sd; in ceu_enum_framesizes()
1309 struct ceu_device *ceudev = video_drvdata(file); in ceu_enum_frameintervals() local
1310 struct ceu_subdev *ceu_sd = ceudev->sd; in ceu_enum_frameintervals()
1377 struct ceu_device *ceudev = video_get_drvdata(vdev); in ceu_vdev_release() local
1379 kfree(ceudev); in ceu_vdev_release()
1387 struct ceu_device *ceudev = v4l2_to_ceu(v4l2_dev); in ceu_notify_bound() local
1391 ceudev->num_sd++; in ceu_notify_bound()
1399 struct ceu_device *ceudev = v4l2_to_ceu(v4l2_dev); in ceu_notify_complete() local
1400 struct video_device *vdev = &ceudev->vdev; in ceu_notify_complete()
1401 struct vb2_queue *q = &ceudev->vb2_vq; in ceu_notify_complete()
1408 q->drv_priv = ceudev; in ceu_notify_complete()
1414 q->lock = &ceudev->mlock; in ceu_notify_complete()
1415 q->dev = ceudev->v4l2_dev.dev; in ceu_notify_complete()
1425 if (!ceudev->sd) { in ceu_notify_complete()
1426 ceudev->sd = &ceudev->subdevs[0]; in ceu_notify_complete()
1427 ceudev->sd_index = 0; in ceu_notify_complete()
1430 v4l2_sd = ceudev->sd->v4l2_sd; in ceu_notify_complete()
1432 ret = ceu_init_mbus_fmt(ceudev); in ceu_notify_complete()
1436 ret = ceu_set_default_fmt(ceudev); in ceu_notify_complete()
1443 vdev->lock = &ceudev->mlock; in ceu_notify_complete()
1444 vdev->queue = &ceudev->vb2_vq; in ceu_notify_complete()
1451 video_set_drvdata(vdev, ceudev); in ceu_notify_complete()
1475 static int ceu_init_async_subdevs(struct ceu_device *ceudev, unsigned int n_sd) in ceu_init_async_subdevs() argument
1478 ceudev->subdevs = devm_kcalloc(ceudev->dev, n_sd, in ceu_init_async_subdevs()
1479 sizeof(*ceudev->subdevs), GFP_KERNEL); in ceu_init_async_subdevs()
1480 if (!ceudev->subdevs) in ceu_init_async_subdevs()
1483 ceudev->sd = NULL; in ceu_init_async_subdevs()
1484 ceudev->sd_index = 0; in ceu_init_async_subdevs()
1485 ceudev->num_sd = 0; in ceu_init_async_subdevs()
1494 static int ceu_parse_platform_data(struct ceu_device *ceudev, in ceu_parse_platform_data() argument
1505 ret = ceu_init_async_subdevs(ceudev, pdata->num_subdevs); in ceu_parse_platform_data()
1513 ceu_sd = &ceudev->subdevs[i]; in ceu_parse_platform_data()
1522 ret = v4l2_async_notifier_add_subdev(&ceudev->notifier, in ceu_parse_platform_data()
1525 v4l2_async_notifier_cleanup(&ceudev->notifier); in ceu_parse_platform_data()
1536 static int ceu_parse_dt(struct ceu_device *ceudev) in ceu_parse_dt() argument
1538 struct device_node *of = ceudev->dev->of_node; in ceu_parse_dt()
1549 ret = ceu_init_async_subdevs(ceudev, num_ep); in ceu_parse_dt()
1567 dev_err(ceudev->dev, in ceu_parse_dt()
1575 dev_err(ceudev->dev, in ceu_parse_dt()
1581 ceu_sd = &ceudev->subdevs[i]; in ceu_parse_dt()
1589 ret = v4l2_async_notifier_add_subdev(&ceudev->notifier, in ceu_parse_dt()
1602 v4l2_async_notifier_cleanup(&ceudev->notifier); in ceu_parse_dt()
1637 struct ceu_device *ceudev; in ceu_probe() local
1643 ceudev = kzalloc(sizeof(*ceudev), GFP_KERNEL); in ceu_probe()
1644 if (!ceudev) in ceu_probe()
1647 platform_set_drvdata(pdev, ceudev); in ceu_probe()
1648 ceudev->dev = dev; in ceu_probe()
1650 INIT_LIST_HEAD(&ceudev->capture); in ceu_probe()
1651 spin_lock_init(&ceudev->lock); in ceu_probe()
1652 mutex_init(&ceudev->mlock); in ceu_probe()
1655 ceudev->base = devm_ioremap_resource(dev, res); in ceu_probe()
1656 if (IS_ERR(ceudev->base)) { in ceu_probe()
1657 ret = PTR_ERR(ceudev->base); in ceu_probe()
1667 0, dev_name(dev), ceudev); in ceu_probe()
1675 ret = v4l2_device_register(dev, &ceudev->v4l2_dev); in ceu_probe()
1679 v4l2_async_notifier_init(&ceudev->notifier); in ceu_probe()
1683 num_subdevs = ceu_parse_dt(ceudev); in ceu_probe()
1687 num_subdevs = ceu_parse_platform_data(ceudev, in ceu_probe()
1697 ceudev->irq_mask = ceu_data->irq_mask; in ceu_probe()
1699 ceudev->notifier.v4l2_dev = &ceudev->v4l2_dev; in ceu_probe()
1700 ceudev->notifier.ops = &ceu_notify_ops; in ceu_probe()
1701 ret = v4l2_async_notifier_register(&ceudev->v4l2_dev, in ceu_probe()
1702 &ceudev->notifier); in ceu_probe()
1711 v4l2_async_notifier_cleanup(&ceudev->notifier); in ceu_probe()
1713 v4l2_device_unregister(&ceudev->v4l2_dev); in ceu_probe()
1717 kfree(ceudev); in ceu_probe()
1724 struct ceu_device *ceudev = platform_get_drvdata(pdev); in ceu_remove() local
1726 pm_runtime_disable(ceudev->dev); in ceu_remove()
1728 v4l2_async_notifier_unregister(&ceudev->notifier); in ceu_remove()
1730 v4l2_async_notifier_cleanup(&ceudev->notifier); in ceu_remove()
1732 v4l2_device_unregister(&ceudev->v4l2_dev); in ceu_remove()
1734 video_unregister_device(&ceudev->vdev); in ceu_remove()