Lines Matching defs:ceudev

316 static int ceu_soft_reset(struct ceu_device *ceudev)
320 ceu_write(ceudev, CEU_CAPSR, CEU_CAPSR_CPKIL);
323 if (!(ceu_read(ceudev, CEU_CSTSR) & CEU_CSTRST_CPTON))
329 dev_err(ceudev->dev, "soft reset time out\n");
334 if (!(ceu_read(ceudev, CEU_CAPSR) & CEU_CAPSR_CPKIL))
348 static int ceu_hw_config(struct ceu_device *ceudev)
351 struct v4l2_pix_format_mplane *pix = &ceudev->v4l2_pix;
352 struct ceu_subdev *ceu_sd = ceudev->sd;
357 ceu_write(ceudev, CEU_CAIFR, 0);
358 ceu_write(ceudev, CEU_CFWCR, 0);
359 ceu_write(ceudev, CEU_CRCNTR, 0);
360 ceu_write(ceudev, CEU_CRCMPR, 0);
440 ceu_write(ceudev, CEU_CAMCR, camcr);
441 ceu_write(ceudev, CEU_CDOCR, cdocr);
442 ceu_write(ceudev, CEU_CAPCR, CEU_CAPCR_BUS_WIDTH256);
449 ceu_write(ceudev, CEU_CAMOR, 0);
452 ceu_write(ceudev, CEU_CAPWR, capwr);
453 ceu_write(ceudev, CEU_CFSZR, cfzsr);
454 ceu_write(ceudev, CEU_CDWDR, cdwdr);
464 static int ceu_capture(struct ceu_device *ceudev)
466 struct v4l2_pix_format_mplane *pix = &ceudev->v4l2_pix;
470 vb2_dma_contig_plane_dma_addr(&ceudev->active->vb2_buf, 0);
471 ceu_write(ceudev, CEU_CDAYR, phys_addr_top);
476 vb2_dma_contig_plane_dma_addr(&ceudev->active->vb2_buf,
478 ceu_write(ceudev, CEU_CDACR, phys_addr_top);
485 ceu_write(ceudev, CEU_CAPSR, CEU_CAPSR_CE);
492 struct ceu_device *ceudev = data;
498 status = ceu_read(ceudev, CEU_CETCR);
499 ceu_write(ceudev, CEU_CETCR, ~ceudev->irq_mask);
505 spin_lock(&ceudev->lock);
508 vbuf = ceudev->active;
510 spin_unlock(&ceudev->lock);
519 dev_err(ceudev->dev, "VBP interrupt: abort capture\n");
525 vbuf->sequence = ceudev->sequence++;
526 vbuf->field = ceudev->field;
529 if (!list_empty(&ceudev->capture)) {
530 buf = list_first_entry(&ceudev->capture, struct ceu_buffer,
533 ceudev->active = &buf->vb;
535 ceu_capture(ceudev);
541 spin_unlock(&ceudev->lock);
549 list_for_each_entry(buf, &ceudev->capture, queue)
552 spin_unlock(&ceudev->lock);
577 static void ceu_calc_plane_sizes(struct ceu_device *ceudev,
624 struct ceu_device *ceudev = vb2_get_drv_priv(vq);
625 struct v4l2_pix_format_mplane *pix = &ceudev->v4l2_pix;
647 struct ceu_device *ceudev = vb2_get_drv_priv(vb->vb2_queue);
652 spin_lock_irqsave(&ceudev->lock, irqflags);
653 list_add_tail(&buf->queue, &ceudev->capture);
654 spin_unlock_irqrestore(&ceudev->lock, irqflags);
659 struct ceu_device *ceudev = vb2_get_drv_priv(vb->vb2_queue);
660 struct v4l2_pix_format_mplane *pix = &ceudev->v4l2_pix;
665 dev_err(ceudev->dev,
680 struct ceu_device *ceudev = vb2_get_drv_priv(vq);
681 struct v4l2_subdev *v4l2_sd = ceudev->sd->v4l2_sd;
687 ret = ceu_hw_config(ceudev);
693 dev_dbg(ceudev->dev,
698 spin_lock_irqsave(&ceudev->lock, irqflags);
699 ceudev->sequence = 0;
702 buf = list_first_entry(&ceudev->capture, struct ceu_buffer,
706 ceudev->active = &buf->vb;
709 ceu_write(ceudev, CEU_CETCR, ~ceudev->irq_mask);
710 ceu_write(ceudev, CEU_CEIER, CEU_CEIER_MASK);
712 ceu_capture(ceudev);
714 spin_unlock_irqrestore(&ceudev->lock, irqflags);
719 spin_lock_irqsave(&ceudev->lock, irqflags);
720 list_for_each_entry(buf, &ceudev->capture, queue)
721 vb2_buffer_done(&ceudev->active->vb2_buf,
723 ceudev->active = NULL;
724 spin_unlock_irqrestore(&ceudev->lock, irqflags);
731 struct ceu_device *ceudev = vb2_get_drv_priv(vq);
732 struct v4l2_subdev *v4l2_sd = ceudev->sd->v4l2_sd;
737 ceu_write(ceudev, CEU_CETCR,
738 ceu_read(ceudev, CEU_CETCR) & ceudev->irq_mask);
739 ceu_write(ceudev, CEU_CEIER, CEU_CEIER_MASK);
743 spin_lock_irqsave(&ceudev->lock, irqflags);
744 if (ceudev->active) {
745 vb2_buffer_done(&ceudev->active->vb2_buf,
747 ceudev->active = NULL;
751 list_for_each_entry(buf, &ceudev->capture, queue)
753 INIT_LIST_HEAD(&ceudev->capture);
755 spin_unlock_irqrestore(&ceudev->lock, irqflags);
757 ceu_soft_reset(ceudev);
772 * @ceudev: The CEU device.
778 static int __ceu_try_fmt(struct ceu_device *ceudev, struct v4l2_format *v4l2_fmt,
781 struct ceu_subdev *ceu_sd = ceudev->sd;
861 ceu_calc_plane_sizes(ceudev, ceu_fmt, pix);
872 static int ceu_try_fmt(struct ceu_device *ceudev, struct v4l2_format *v4l2_fmt)
876 return __ceu_try_fmt(ceudev, v4l2_fmt, &mbus_code);
882 static int ceu_set_fmt(struct ceu_device *ceudev, struct v4l2_format *v4l2_fmt)
884 struct ceu_subdev *ceu_sd = ceudev->sd;
897 ret = __ceu_try_fmt(ceudev, v4l2_fmt, &mbus_code);
907 ceudev->v4l2_pix = v4l2_fmt->fmt.pix_mp;
908 ceudev->field = V4L2_FIELD_NONE;
917 static int ceu_set_default_fmt(struct ceu_device *ceudev)
942 ret = ceu_try_fmt(ceudev, &v4l2_fmt);
946 ceudev->v4l2_pix = v4l2_fmt.fmt.pix_mp;
947 ceudev->field = V4L2_FIELD_NONE;
965 static int ceu_init_mbus_fmt(struct ceu_device *ceudev)
967 struct ceu_subdev *ceu_sd = ceudev->sd;
1053 struct ceu_device *ceudev = dev_get_drvdata(dev);
1054 struct v4l2_subdev *v4l2_sd = ceudev->sd->v4l2_sd;
1058 ceu_soft_reset(ceudev);
1069 struct ceu_device *ceudev = dev_get_drvdata(dev);
1070 struct v4l2_subdev *v4l2_sd = ceudev->sd->v4l2_sd;
1074 ceu_write(ceudev, CEU_CEIER, 0);
1075 ceu_soft_reset(ceudev);
1084 struct ceu_device *ceudev = video_drvdata(file);
1091 mutex_lock(&ceudev->mlock);
1093 ret = pm_runtime_resume_and_get(ceudev->dev);
1094 mutex_unlock(&ceudev->mlock);
1101 struct ceu_device *ceudev = video_drvdata(file);
1105 mutex_lock(&ceudev->mlock);
1107 pm_runtime_put(ceudev->dev);
1108 mutex_unlock(&ceudev->mlock);
1127 struct ceu_device *ceudev = video_drvdata(file);
1132 "platform:renesas-ceu-%s", dev_name(ceudev->dev));
1154 struct ceu_device *ceudev = video_drvdata(file);
1156 return ceu_try_fmt(ceudev, f);
1162 struct ceu_device *ceudev = video_drvdata(file);
1164 if (vb2_is_streaming(&ceudev->vb2_vq))
1167 return ceu_set_fmt(ceudev, f);
1173 struct ceu_device *ceudev = video_drvdata(file);
1175 f->fmt.pix_mp = ceudev->v4l2_pix;
1183 struct ceu_device *ceudev = video_drvdata(file);
1185 if (inp->index >= ceudev->num_sd)
1197 struct ceu_device *ceudev = video_drvdata(file);
1199 *i = ceudev->sd_index;
1206 struct ceu_device *ceudev = video_drvdata(file);
1210 if (i >= ceudev->num_sd)
1213 if (vb2_is_streaming(&ceudev->vb2_vq))
1216 if (i == ceudev->sd_index)
1219 ceu_sd_old = ceudev->sd;
1220 ceudev->sd = ceudev->subdevs[i];
1226 ret = ceu_init_mbus_fmt(ceudev);
1228 ceudev->sd = ceu_sd_old;
1232 ret = ceu_set_default_fmt(ceudev);
1234 ceudev->sd = ceu_sd_old;
1240 v4l2_subdev_call(ceudev->sd->v4l2_sd, core, s_power, 1);
1242 ceudev->sd_index = i;
1249 struct ceu_device *ceudev = video_drvdata(file);
1251 return v4l2_g_parm_cap(video_devdata(file), ceudev->sd->v4l2_sd, a);
1256 struct ceu_device *ceudev = video_drvdata(file);
1258 return v4l2_s_parm_cap(video_devdata(file), ceudev->sd->v4l2_sd, a);
1264 struct ceu_device *ceudev = video_drvdata(file);
1265 struct ceu_subdev *ceu_sd = ceudev->sd;
1296 struct ceu_device *ceudev = video_drvdata(file);
1297 struct ceu_subdev *ceu_sd = ceudev->sd;
1364 struct ceu_device *ceudev = video_get_drvdata(vdev);
1366 kfree(ceudev);
1374 struct ceu_device *ceudev = v4l2_to_ceu(v4l2_dev);
1378 ceudev->num_sd++;
1386 struct ceu_device *ceudev = v4l2_to_ceu(v4l2_dev);
1387 struct video_device *vdev = &ceudev->vdev;
1388 struct vb2_queue *q = &ceudev->vb2_vq;
1395 q->drv_priv = ceudev;
1401 q->lock = &ceudev->mlock;
1402 q->dev = ceudev->v4l2_dev.dev;
1412 if (!ceudev->sd) {
1413 ceudev->sd = ceudev->subdevs[0];
1414 ceudev->sd_index = 0;
1417 v4l2_sd = ceudev->sd->v4l2_sd;
1419 ret = ceu_init_mbus_fmt(ceudev);
1423 ret = ceu_set_default_fmt(ceudev);
1430 vdev->lock = &ceudev->mlock;
1431 vdev->queue = &ceudev->vb2_vq;
1438 video_set_drvdata(vdev, ceudev);
1462 static int ceu_init_async_subdevs(struct ceu_device *ceudev, unsigned int n_sd)
1465 ceudev->subdevs = devm_kcalloc(ceudev->dev, n_sd,
1466 sizeof(*ceudev->subdevs), GFP_KERNEL);
1467 if (!ceudev->subdevs)
1470 ceudev->sd = NULL;
1471 ceudev->sd_index = 0;
1472 ceudev->num_sd = 0;
1481 static int ceu_parse_platform_data(struct ceu_device *ceudev,
1492 ret = ceu_init_async_subdevs(ceudev, pdata->num_subdevs);
1500 ceu_sd = v4l2_async_nf_add_i2c(&ceudev->notifier,
1505 v4l2_async_nf_cleanup(&ceudev->notifier);
1509 ceudev->subdevs[i] = ceu_sd;
1518 static int ceu_parse_dt(struct ceu_device *ceudev)
1520 struct device_node *of = ceudev->dev->of_node;
1531 ret = ceu_init_async_subdevs(ceudev, num_ep);
1549 dev_err(ceudev->dev,
1557 dev_err(ceudev->dev,
1563 ceu_sd = v4l2_async_nf_add_fwnode_remote(&ceudev->notifier,
1571 ceudev->subdevs[i] = ceu_sd;
1579 v4l2_async_nf_cleanup(&ceudev->notifier);
1614 struct ceu_device *ceudev;
1619 ceudev = kzalloc(sizeof(*ceudev), GFP_KERNEL);
1620 if (!ceudev)
1623 platform_set_drvdata(pdev, ceudev);
1624 ceudev->dev = dev;
1626 INIT_LIST_HEAD(&ceudev->capture);
1627 spin_lock_init(&ceudev->lock);
1628 mutex_init(&ceudev->mlock);
1630 ceudev->base = devm_platform_ioremap_resource(pdev, 0);
1631 if (IS_ERR(ceudev->base)) {
1632 ret = PTR_ERR(ceudev->base);
1642 0, dev_name(dev), ceudev);
1650 ret = v4l2_device_register(dev, &ceudev->v4l2_dev);
1654 v4l2_async_nf_init(&ceudev->notifier, &ceudev->v4l2_dev);
1658 num_subdevs = ceu_parse_dt(ceudev);
1662 num_subdevs = ceu_parse_platform_data(ceudev,
1672 ceudev->irq_mask = ceu_data->irq_mask;
1674 ceudev->notifier.v4l2_dev = &ceudev->v4l2_dev;
1675 ceudev->notifier.ops = &ceu_notify_ops;
1676 ret = v4l2_async_nf_register(&ceudev->notifier);
1685 v4l2_async_nf_cleanup(&ceudev->notifier);
1687 v4l2_device_unregister(&ceudev->v4l2_dev);
1691 kfree(ceudev);
1698 struct ceu_device *ceudev = platform_get_drvdata(pdev);
1700 pm_runtime_disable(ceudev->dev);
1702 v4l2_async_nf_unregister(&ceudev->notifier);
1704 v4l2_async_nf_cleanup(&ceudev->notifier);
1706 v4l2_device_unregister(&ceudev->v4l2_dev);
1708 video_unregister_device(&ceudev->vdev);