• Home
  • Raw
  • Download

Lines Matching refs:isc

338 static int isc_clk_register(struct isc_device *isc, unsigned int id)  in isc_clk_register()  argument
340 struct regmap *regmap = isc->regmap; in isc_clk_register()
341 struct device_node *np = isc->dev->of_node; in isc_clk_register()
368 isc_clk = &isc->isc_clks[id]; in isc_clk_register()
372 isc_clk->dev = isc->dev; in isc_clk_register()
374 isc_clk->clk = clk_register(isc->dev, &isc_clk->hw); in isc_clk_register()
376 dev_err(isc->dev, "%s: clock register fail\n", clk_name); in isc_clk_register()
384 static int isc_clk_init(struct isc_device *isc) in isc_clk_init() argument
389 for (i = 0; i < ARRAY_SIZE(isc->isc_clks); i++) in isc_clk_init()
390 isc->isc_clks[i].clk = ERR_PTR(-EINVAL); in isc_clk_init()
392 for (i = 0; i < ARRAY_SIZE(isc->isc_clks); i++) { in isc_clk_init()
393 ret = isc_clk_register(isc, i); in isc_clk_init()
401 static void isc_clk_cleanup(struct isc_device *isc) in isc_clk_cleanup() argument
405 of_clk_del_provider(isc->dev->of_node); in isc_clk_cleanup()
407 for (i = 0; i < ARRAY_SIZE(isc->isc_clks); i++) { in isc_clk_cleanup()
408 struct isc_clk *isc_clk = &isc->isc_clks[i]; in isc_clk_cleanup()
419 struct isc_device *isc = vb2_get_drv_priv(vq); in isc_queue_setup() local
420 unsigned int size = isc->fmt.fmt.pix.sizeimage; in isc_queue_setup()
434 struct isc_device *isc = vb2_get_drv_priv(vb->vb2_queue); in isc_buffer_prepare() local
435 unsigned long size = isc->fmt.fmt.pix.sizeimage; in isc_buffer_prepare()
438 v4l2_err(&isc->v4l2_dev, "buffer too small (%lu < %lu)\n", in isc_buffer_prepare()
445 vbuf->field = isc->fmt.fmt.pix.field; in isc_buffer_prepare()
462 static void isc_set_pipeline(struct isc_device *isc, u32 pipeline) in isc_set_pipeline() argument
469 regmap_field_write(isc->pipeline[i], val); in isc_set_pipeline()
473 static int isc_configure(struct isc_device *isc) in isc_configure() argument
475 struct regmap *regmap = isc->regmap; in isc_configure()
476 const struct isc_format *current_fmt = isc->current_fmt; in isc_configure()
477 struct isc_subdev_entity *subdev = isc->current_subdev; in isc_configure()
496 isc_set_pipeline(isc, 0x0); in isc_configure()
515 struct isc_device *isc = vb2_get_drv_priv(vq); in isc_start_streaming() local
516 struct regmap *regmap = isc->regmap; in isc_start_streaming()
523 ret = v4l2_subdev_call(isc->current_subdev->sd, video, s_stream, 1); in isc_start_streaming()
525 v4l2_err(&isc->v4l2_dev, "stream on failed in subdev\n"); in isc_start_streaming()
529 pm_runtime_get_sync(isc->dev); in isc_start_streaming()
532 regmap_write(isc->regmap, ISC_INTDIS, (u32)~0UL); in isc_start_streaming()
537 ret = isc_configure(isc); in isc_start_streaming()
544 spin_lock_irqsave(&isc->dma_queue_lock, flags); in isc_start_streaming()
546 isc->sequence = 0; in isc_start_streaming()
547 isc->stop = false; in isc_start_streaming()
548 reinit_completion(&isc->comp); in isc_start_streaming()
550 isc->cur_frm = list_first_entry(&isc->dma_queue, in isc_start_streaming()
552 list_del(&isc->cur_frm->list); in isc_start_streaming()
554 isc_start_dma(regmap, isc->cur_frm, isc->current_fmt->reg_dctrl_dview); in isc_start_streaming()
556 spin_unlock_irqrestore(&isc->dma_queue_lock, flags); in isc_start_streaming()
561 pm_runtime_put_sync(isc->dev); in isc_start_streaming()
563 v4l2_subdev_call(isc->current_subdev->sd, video, s_stream, 0); in isc_start_streaming()
566 spin_lock_irqsave(&isc->dma_queue_lock, flags); in isc_start_streaming()
567 list_for_each_entry(buf, &isc->dma_queue, list) in isc_start_streaming()
569 INIT_LIST_HEAD(&isc->dma_queue); in isc_start_streaming()
570 spin_unlock_irqrestore(&isc->dma_queue_lock, flags); in isc_start_streaming()
577 struct isc_device *isc = vb2_get_drv_priv(vq); in isc_stop_streaming() local
582 isc->stop = true; in isc_stop_streaming()
585 if (isc->cur_frm && !wait_for_completion_timeout(&isc->comp, 5 * HZ)) in isc_stop_streaming()
586 v4l2_err(&isc->v4l2_dev, in isc_stop_streaming()
590 regmap_write(isc->regmap, ISC_INTDIS, ISC_INT_DDONE); in isc_stop_streaming()
592 pm_runtime_put_sync(isc->dev); in isc_stop_streaming()
595 ret = v4l2_subdev_call(isc->current_subdev->sd, video, s_stream, 0); in isc_stop_streaming()
597 v4l2_err(&isc->v4l2_dev, "stream off failed in subdev\n"); in isc_stop_streaming()
600 spin_lock_irqsave(&isc->dma_queue_lock, flags); in isc_stop_streaming()
601 if (unlikely(isc->cur_frm)) { in isc_stop_streaming()
602 vb2_buffer_done(&isc->cur_frm->vb.vb2_buf, in isc_stop_streaming()
604 isc->cur_frm = NULL; in isc_stop_streaming()
606 list_for_each_entry(buf, &isc->dma_queue, list) in isc_stop_streaming()
608 INIT_LIST_HEAD(&isc->dma_queue); in isc_stop_streaming()
609 spin_unlock_irqrestore(&isc->dma_queue_lock, flags); in isc_stop_streaming()
616 struct isc_device *isc = vb2_get_drv_priv(vb->vb2_queue); in isc_buffer_queue() local
619 spin_lock_irqsave(&isc->dma_queue_lock, flags); in isc_buffer_queue()
620 list_add_tail(&buf->list, &isc->dma_queue); in isc_buffer_queue()
621 spin_unlock_irqrestore(&isc->dma_queue_lock, flags); in isc_buffer_queue()
637 struct isc_device *isc = video_drvdata(file); in isc_querycap() local
642 "platform:%s", isc->v4l2_dev.name); in isc_querycap()
650 struct isc_device *isc = video_drvdata(file); in isc_enum_fmt_vid_cap() local
653 if (index >= isc->num_user_formats) in isc_enum_fmt_vid_cap()
656 f->pixelformat = isc->user_formats[index]->fourcc; in isc_enum_fmt_vid_cap()
664 struct isc_device *isc = video_drvdata(file); in isc_g_fmt_vid_cap() local
666 *fmt = isc->fmt; in isc_g_fmt_vid_cap()
671 static struct isc_format *find_format_by_fourcc(struct isc_device *isc, in find_format_by_fourcc() argument
674 unsigned int num_formats = isc->num_user_formats; in find_format_by_fourcc()
679 fmt = isc->user_formats[i]; in find_format_by_fourcc()
687 static int isc_try_fmt(struct isc_device *isc, struct v4l2_format *f, in isc_try_fmt() argument
700 isc_fmt = find_format_by_fourcc(isc, pixfmt->pixelformat); in isc_try_fmt()
702 v4l2_warn(&isc->v4l2_dev, "Format 0x%x not found\n", in isc_try_fmt()
704 isc_fmt = isc->user_formats[isc->num_user_formats - 1]; in isc_try_fmt()
715 ret = v4l2_subdev_call(isc->current_subdev->sd, pad, set_fmt, in isc_try_fmt()
716 isc->current_subdev->config, &format); in isc_try_fmt()
732 static int isc_set_fmt(struct isc_device *isc, struct v4l2_format *f) in isc_set_fmt() argument
740 ret = isc_try_fmt(isc, f, &current_fmt); in isc_set_fmt()
746 ret = v4l2_subdev_call(isc->current_subdev->sd, pad, in isc_set_fmt()
751 isc->fmt = *f; in isc_set_fmt()
752 isc->current_fmt = current_fmt; in isc_set_fmt()
760 struct isc_device *isc = video_drvdata(file); in isc_s_fmt_vid_cap() local
762 if (vb2_is_streaming(&isc->vb2_vidq)) in isc_s_fmt_vid_cap()
765 return isc_set_fmt(isc, f); in isc_s_fmt_vid_cap()
771 struct isc_device *isc = video_drvdata(file); in isc_try_fmt_vid_cap() local
773 return isc_try_fmt(isc, f, NULL); in isc_try_fmt_vid_cap()
806 struct isc_device *isc = video_drvdata(file); in isc_g_parm() local
811 return v4l2_subdev_call(isc->current_subdev->sd, video, g_parm, a); in isc_g_parm()
816 struct isc_device *isc = video_drvdata(file); in isc_s_parm() local
821 return v4l2_subdev_call(isc->current_subdev->sd, video, s_parm, a); in isc_s_parm()
827 struct isc_device *isc = video_drvdata(file); in isc_enum_framesizes() local
835 isc_fmt = find_format_by_fourcc(isc, fsize->pixel_format); in isc_enum_framesizes()
841 ret = v4l2_subdev_call(isc->current_subdev->sd, pad, enum_frame_size, in isc_enum_framesizes()
856 struct isc_device *isc = video_drvdata(file); in isc_enum_frameintervals() local
866 isc_fmt = find_format_by_fourcc(isc, fival->pixel_format); in isc_enum_frameintervals()
872 ret = v4l2_subdev_call(isc->current_subdev->sd, pad, in isc_enum_frameintervals()
912 struct isc_device *isc = video_drvdata(file); in isc_open() local
913 struct v4l2_subdev *sd = isc->current_subdev->sd; in isc_open()
916 if (mutex_lock_interruptible(&isc->lock)) in isc_open()
932 ret = isc_set_fmt(isc, &isc->fmt); in isc_open()
939 mutex_unlock(&isc->lock); in isc_open()
945 struct isc_device *isc = video_drvdata(file); in isc_release() local
946 struct v4l2_subdev *sd = isc->current_subdev->sd; in isc_release()
950 mutex_lock(&isc->lock); in isc_release()
959 mutex_unlock(&isc->lock); in isc_release()
976 struct isc_device *isc = (struct isc_device *)dev_id; in isc_interrupt() local
977 struct regmap *regmap = isc->regmap; in isc_interrupt()
981 spin_lock(&isc->dma_queue_lock); in isc_interrupt()
989 if (isc->cur_frm) { in isc_interrupt()
990 struct vb2_v4l2_buffer *vbuf = &isc->cur_frm->vb; in isc_interrupt()
994 vbuf->sequence = isc->sequence++; in isc_interrupt()
996 isc->cur_frm = NULL; in isc_interrupt()
999 if (!list_empty(&isc->dma_queue) && !isc->stop) { in isc_interrupt()
1000 isc->cur_frm = list_first_entry(&isc->dma_queue, in isc_interrupt()
1002 list_del(&isc->cur_frm->list); in isc_interrupt()
1004 isc_start_dma(regmap, isc->cur_frm, in isc_interrupt()
1005 isc->current_fmt->reg_dctrl_dview); in isc_interrupt()
1008 if (isc->stop) in isc_interrupt()
1009 complete(&isc->comp); in isc_interrupt()
1014 spin_unlock(&isc->dma_queue_lock); in isc_interrupt()
1023 struct isc_device *isc = container_of(notifier->v4l2_dev, in isc_async_bound() local
1028 if (video_is_registered(&isc->video_dev)) { in isc_async_bound()
1029 v4l2_err(&isc->v4l2_dev, "only supports one sub-device.\n"); in isc_async_bound()
1042 struct isc_device *isc = container_of(notifier->v4l2_dev, in isc_async_unbind() local
1045 video_unregister_device(&isc->video_dev); in isc_async_unbind()
1046 if (isc->current_subdev->config) in isc_async_unbind()
1047 v4l2_subdev_free_pad_config(isc->current_subdev->config); in isc_async_unbind()
1067 static int isc_formats_init(struct isc_device *isc) in isc_formats_init() argument
1070 struct v4l2_subdev *subdev = isc->current_subdev->sd; in isc_formats_init()
1096 isc->num_user_formats = num_fmts; in isc_formats_init()
1097 isc->user_formats = devm_kcalloc(isc->dev, in isc_formats_init()
1100 if (!isc->user_formats) { in isc_formats_init()
1101 v4l2_err(&isc->v4l2_dev, "could not allocate memory\n"); in isc_formats_init()
1108 isc->user_formats[j++] = fmt; in isc_formats_init()
1116 static int isc_set_default_fmt(struct isc_device *isc) in isc_set_default_fmt() argument
1124 .pixelformat = isc->user_formats[0]->fourcc, in isc_set_default_fmt()
1129 ret = isc_try_fmt(isc, &f, NULL); in isc_set_default_fmt()
1133 isc->current_fmt = isc->user_formats[0]; in isc_set_default_fmt()
1134 isc->fmt = f; in isc_set_default_fmt()
1141 struct isc_device *isc = container_of(notifier->v4l2_dev, in isc_async_complete() local
1144 struct video_device *vdev = &isc->video_dev; in isc_async_complete()
1145 struct vb2_queue *q = &isc->vb2_vidq; in isc_async_complete()
1148 isc->current_subdev = container_of(notifier, in isc_async_complete()
1150 sd_entity = isc->current_subdev; in isc_async_complete()
1152 mutex_init(&isc->lock); in isc_async_complete()
1153 init_completion(&isc->comp); in isc_async_complete()
1158 q->drv_priv = isc; in isc_async_complete()
1163 q->lock = &isc->lock; in isc_async_complete()
1165 q->dev = isc->dev; in isc_async_complete()
1169 v4l2_err(&isc->v4l2_dev, in isc_async_complete()
1175 INIT_LIST_HEAD(&isc->dma_queue); in isc_async_complete()
1176 spin_lock_init(&isc->dma_queue_lock); in isc_async_complete()
1182 ret = isc_formats_init(isc); in isc_async_complete()
1184 v4l2_err(&isc->v4l2_dev, in isc_async_complete()
1189 ret = isc_set_default_fmt(isc); in isc_async_complete()
1191 v4l2_err(&isc->v4l2_dev, "Could not set default format\n"); in isc_async_complete()
1200 vdev->v4l2_dev = &isc->v4l2_dev; in isc_async_complete()
1203 vdev->lock = &isc->lock; in isc_async_complete()
1204 vdev->ctrl_handler = isc->current_subdev->sd->ctrl_handler; in isc_async_complete()
1206 video_set_drvdata(vdev, isc); in isc_async_complete()
1210 v4l2_err(&isc->v4l2_dev, in isc_async_complete()
1218 static void isc_subdev_cleanup(struct isc_device *isc) in isc_subdev_cleanup() argument
1222 list_for_each_entry(subdev_entity, &isc->subdev_entities, list) in isc_subdev_cleanup()
1225 INIT_LIST_HEAD(&isc->subdev_entities); in isc_subdev_cleanup()
1228 static int isc_pipeline_init(struct isc_device *isc) in isc_pipeline_init() argument
1230 struct device *dev = isc->dev; in isc_pipeline_init()
1231 struct regmap *regmap = isc->regmap; in isc_pipeline_init()
1255 isc->pipeline[i] = regs; in isc_pipeline_init()
1261 static int isc_parse_dt(struct device *dev, struct isc_device *isc) in isc_parse_dt() argument
1270 INIT_LIST_HEAD(&isc->subdev_entities); in isc_parse_dt()
1321 list_add_tail(&subdev_entity->list, &isc->subdev_entities); in isc_parse_dt()
1340 struct isc_device *isc; in atmel_isc_probe() local
1347 isc = devm_kzalloc(dev, sizeof(*isc), GFP_KERNEL); in atmel_isc_probe()
1348 if (!isc) in atmel_isc_probe()
1351 platform_set_drvdata(pdev, isc); in atmel_isc_probe()
1352 isc->dev = dev; in atmel_isc_probe()
1359 isc->regmap = devm_regmap_init_mmio(dev, io_base, &isc_regmap_config); in atmel_isc_probe()
1360 if (IS_ERR(isc->regmap)) { in atmel_isc_probe()
1361 ret = PTR_ERR(isc->regmap); in atmel_isc_probe()
1374 ATMEL_ISC_NAME, isc); in atmel_isc_probe()
1381 ret = isc_pipeline_init(isc); in atmel_isc_probe()
1385 isc->hclock = devm_clk_get(dev, "hclock"); in atmel_isc_probe()
1386 if (IS_ERR(isc->hclock)) { in atmel_isc_probe()
1387 ret = PTR_ERR(isc->hclock); in atmel_isc_probe()
1392 ret = isc_clk_init(isc); in atmel_isc_probe()
1398 isc->ispck = isc->isc_clks[ISC_ISPCK].clk; in atmel_isc_probe()
1401 ret = clk_set_rate(isc->ispck, clk_get_rate(isc->hclock)); in atmel_isc_probe()
1407 ret = v4l2_device_register(dev, &isc->v4l2_dev); in atmel_isc_probe()
1413 ret = isc_parse_dt(dev, isc); in atmel_isc_probe()
1419 if (list_empty(&isc->subdev_entities)) { in atmel_isc_probe()
1424 list_for_each_entry(subdev_entity, &isc->subdev_entities, list) { in atmel_isc_probe()
1431 ret = v4l2_async_notifier_register(&isc->v4l2_dev, in atmel_isc_probe()
1438 if (video_is_registered(&isc->video_dev)) in atmel_isc_probe()
1447 isc_subdev_cleanup(isc); in atmel_isc_probe()
1450 v4l2_device_unregister(&isc->v4l2_dev); in atmel_isc_probe()
1453 isc_clk_cleanup(isc); in atmel_isc_probe()
1460 struct isc_device *isc = platform_get_drvdata(pdev); in atmel_isc_remove() local
1464 isc_subdev_cleanup(isc); in atmel_isc_remove()
1466 v4l2_device_unregister(&isc->v4l2_dev); in atmel_isc_remove()
1468 isc_clk_cleanup(isc); in atmel_isc_remove()
1475 struct isc_device *isc = dev_get_drvdata(dev); in isc_runtime_suspend() local
1477 clk_disable_unprepare(isc->ispck); in isc_runtime_suspend()
1478 clk_disable_unprepare(isc->hclock); in isc_runtime_suspend()
1485 struct isc_device *isc = dev_get_drvdata(dev); in isc_runtime_resume() local
1488 ret = clk_prepare_enable(isc->hclock); in isc_runtime_resume()
1492 return clk_prepare_enable(isc->ispck); in isc_runtime_resume()