Lines Matching defs:isp

140 static void risp_write(struct rcar_isp *isp, u32 offset, u32 value)
142 iowrite32(value, isp->base + offset);
145 static u32 risp_read(struct rcar_isp *isp, u32 offset)
147 return ioread32(isp->base + offset);
150 static int risp_power_on(struct rcar_isp *isp)
154 ret = pm_runtime_resume_and_get(isp->dev);
158 ret = reset_control_deassert(isp->rstc);
160 pm_runtime_put(isp->dev);
167 static void risp_power_off(struct rcar_isp *isp)
169 reset_control_assert(isp->rstc);
170 pm_runtime_put(isp->dev);
173 static int risp_start(struct rcar_isp *isp)
180 format = risp_code_to_fmt(isp->mf.code);
182 dev_err(isp->dev, "Unsupported bus format\n");
186 ret = risp_power_on(isp);
188 dev_err(isp->dev, "Failed to power on ISP\n");
193 if (isp->csi_input == RISP_CSI_INPUT1)
196 risp_write(isp, ISPINPUTSEL0_REG,
197 risp_read(isp, ISPINPUTSEL0_REG) | sel_csi);
204 risp_write(isp, ISPCS_FILTER_ID_CH_REG(ch), BIT(vc));
205 risp_write(isp, ISPCS_DT_CODE03_CH_REG(ch),
213 risp_write(isp, ISPPROCMODE_DT_REG(format->datatype),
220 risp_write(isp, ISPSTART_REG, ISPSTART_START);
222 ret = v4l2_subdev_call(isp->remote, video, s_stream, 1);
224 risp_power_off(isp);
229 static void risp_stop(struct rcar_isp *isp)
231 v4l2_subdev_call(isp->remote, video, s_stream, 0);
234 risp_write(isp, ISPSTART_REG, ISPSTART_STOP);
236 risp_power_off(isp);
241 struct rcar_isp *isp = sd_to_isp(sd);
244 mutex_lock(&isp->lock);
246 if (!isp->remote) {
251 if (enable && isp->stream_count == 0) {
252 ret = risp_start(isp);
255 } else if (!enable && isp->stream_count == 1) {
256 risp_stop(isp);
259 isp->stream_count += enable ? 1 : -1;
261 mutex_unlock(&isp->lock);
274 struct rcar_isp *isp = sd_to_isp(sd);
277 mutex_lock(&isp->lock);
283 isp->mf = format->format;
289 mutex_unlock(&isp->lock);
298 struct rcar_isp *isp = sd_to_isp(sd);
300 mutex_lock(&isp->lock);
303 format->format = isp->mf;
307 mutex_unlock(&isp->lock);
331 struct rcar_isp *isp = notifier_to_isp(notifier);
337 dev_err(isp->dev, "Failed to find pad for %s\n", subdev->name);
341 isp->remote = subdev;
343 dev_dbg(isp->dev, "Bound %s pad: %d\n", subdev->name, pad);
346 &isp->subdev.entity, 0,
355 struct rcar_isp *isp = notifier_to_isp(notifier);
357 isp->remote = NULL;
359 dev_dbg(isp->dev, "Unbind %s\n", subdev->name);
367 static int risp_parse_dt(struct rcar_isp *isp)
376 ep = fwnode_graph_get_endpoint_by_id(dev_fwnode(isp->dev),
383 dev_err(isp->dev, "Not connected to subdevice\n");
388 isp->csi_input = RISP_CSI_INPUT1;
393 dev_dbg(isp->dev, "Found '%pOF'\n", to_of_node(fwnode));
395 v4l2_async_subdev_nf_init(&isp->notifier, &isp->subdev);
396 isp->notifier.ops = &risp_notify_ops;
398 asd = v4l2_async_nf_add_fwnode(&isp->notifier, fwnode,
404 ret = v4l2_async_nf_register(&isp->notifier);
406 v4l2_async_nf_cleanup(&isp->notifier);
419 static int risp_probe_resources(struct rcar_isp *isp,
422 isp->base = devm_platform_get_and_ioremap_resource(pdev, 0, NULL);
423 if (IS_ERR(isp->base))
424 return PTR_ERR(isp->base);
426 isp->rstc = devm_reset_control_get(&pdev->dev, NULL);
428 return PTR_ERR_OR_ZERO(isp->rstc);
432 { .compatible = "renesas,r8a779a0-isp" },
433 { .compatible = "renesas,r8a779g0-isp" },
440 struct rcar_isp *isp;
444 isp = devm_kzalloc(&pdev->dev, sizeof(*isp), GFP_KERNEL);
445 if (!isp)
448 isp->dev = &pdev->dev;
450 mutex_init(&isp->lock);
452 ret = risp_probe_resources(isp, pdev);
454 dev_err(isp->dev, "Failed to get resources\n");
458 platform_set_drvdata(pdev, isp);
462 ret = risp_parse_dt(isp);
466 isp->subdev.owner = THIS_MODULE;
467 isp->subdev.dev = &pdev->dev;
468 v4l2_subdev_init(&isp->subdev, &rcar_isp_subdev_ops);
469 v4l2_set_subdevdata(&isp->subdev, &pdev->dev);
470 snprintf(isp->subdev.name, sizeof(isp->subdev.name), "%s %s",
472 isp->subdev.flags = V4L2_SUBDEV_FL_HAS_DEVNODE;
474 isp->subdev.entity.function = MEDIA_ENT_F_VID_MUX;
475 isp->subdev.entity.ops = &risp_entity_ops;
477 isp->pads[RCAR_ISP_SINK].flags = MEDIA_PAD_FL_SINK;
479 isp->pads[i].flags = MEDIA_PAD_FL_SOURCE;
481 ret = media_entity_pads_init(&isp->subdev.entity, RCAR_ISP_NUM_PADS,
482 isp->pads);
486 ret = v4l2_async_register_subdev(&isp->subdev);
490 dev_info(isp->dev, "Using CSI-2 input: %u\n", isp->csi_input);
494 v4l2_async_nf_unregister(&isp->notifier);
495 v4l2_async_nf_cleanup(&isp->notifier);
499 mutex_destroy(&isp->lock);
506 struct rcar_isp *isp = platform_get_drvdata(pdev);
508 v4l2_async_nf_unregister(&isp->notifier);
509 v4l2_async_nf_cleanup(&isp->notifier);
511 v4l2_async_unregister_subdev(&isp->subdev);
515 mutex_destroy(&isp->lock);
520 .name = "rcar-isp",