Lines Matching refs:isp
120 static void risp_write(struct rcar_isp *isp, u32 offset, u32 value) in risp_write() argument
122 iowrite32(value, isp->base + offset); in risp_write()
125 static u32 risp_read(struct rcar_isp *isp, u32 offset) in risp_read() argument
127 return ioread32(isp->base + offset); in risp_read()
130 static int risp_power_on(struct rcar_isp *isp) in risp_power_on() argument
134 ret = pm_runtime_resume_and_get(isp->dev); in risp_power_on()
138 ret = reset_control_deassert(isp->rstc); in risp_power_on()
140 pm_runtime_put(isp->dev); in risp_power_on()
147 static void risp_power_off(struct rcar_isp *isp) in risp_power_off() argument
149 reset_control_assert(isp->rstc); in risp_power_off()
150 pm_runtime_put(isp->dev); in risp_power_off()
153 static int risp_start(struct rcar_isp *isp) in risp_start() argument
160 format = risp_code_to_fmt(isp->mf.code); in risp_start()
162 dev_err(isp->dev, "Unsupported bus format\n"); in risp_start()
166 ret = risp_power_on(isp); in risp_start()
168 dev_err(isp->dev, "Failed to power on ISP\n"); in risp_start()
173 if (isp->csi_input == RISP_CSI_INPUT1) in risp_start()
176 risp_write(isp, ISPINPUTSEL0_REG, in risp_start()
177 risp_read(isp, ISPINPUTSEL0_REG) | sel_csi); in risp_start()
184 risp_write(isp, ISPCS_FILTER_ID_CH_REG(ch), BIT(vc)); in risp_start()
185 risp_write(isp, ISPCS_DT_CODE03_CH_REG(ch), in risp_start()
193 risp_write(isp, ISPPROCMODE_DT_REG(format->datatype), in risp_start()
200 risp_write(isp, ISPSTART_REG, ISPSTART_START); in risp_start()
202 ret = v4l2_subdev_call(isp->remote, video, s_stream, 1); in risp_start()
204 risp_power_off(isp); in risp_start()
209 static void risp_stop(struct rcar_isp *isp) in risp_stop() argument
211 v4l2_subdev_call(isp->remote, video, s_stream, 0); in risp_stop()
214 risp_write(isp, ISPSTART_REG, ISPSTART_STOP); in risp_stop()
216 risp_power_off(isp); in risp_stop()
221 struct rcar_isp *isp = sd_to_isp(sd); in risp_s_stream() local
224 mutex_lock(&isp->lock); in risp_s_stream()
226 if (!isp->remote) { in risp_s_stream()
231 if (enable && isp->stream_count == 0) { in risp_s_stream()
232 ret = risp_start(isp); in risp_s_stream()
235 } else if (!enable && isp->stream_count == 1) { in risp_s_stream()
236 risp_stop(isp); in risp_s_stream()
239 isp->stream_count += enable ? 1 : -1; in risp_s_stream()
241 mutex_unlock(&isp->lock); in risp_s_stream()
254 struct rcar_isp *isp = sd_to_isp(sd); in risp_set_pad_format() local
257 mutex_lock(&isp->lock); in risp_set_pad_format()
263 isp->mf = format->format; in risp_set_pad_format()
269 mutex_unlock(&isp->lock); in risp_set_pad_format()
278 struct rcar_isp *isp = sd_to_isp(sd); in risp_get_pad_format() local
280 mutex_lock(&isp->lock); in risp_get_pad_format()
283 format->format = isp->mf; in risp_get_pad_format()
287 mutex_unlock(&isp->lock); in risp_get_pad_format()
311 struct rcar_isp *isp = notifier_to_isp(notifier); in risp_notify_bound() local
317 dev_err(isp->dev, "Failed to find pad for %s\n", subdev->name); in risp_notify_bound()
321 isp->remote = subdev; in risp_notify_bound()
323 dev_dbg(isp->dev, "Bound %s pad: %d\n", subdev->name, pad); in risp_notify_bound()
326 &isp->subdev.entity, 0, in risp_notify_bound()
335 struct rcar_isp *isp = notifier_to_isp(notifier); in risp_notify_unbind() local
337 isp->remote = NULL; in risp_notify_unbind()
339 dev_dbg(isp->dev, "Unbind %s\n", subdev->name); in risp_notify_unbind()
347 static int risp_parse_dt(struct rcar_isp *isp) in risp_parse_dt() argument
356 ep = fwnode_graph_get_endpoint_by_id(dev_fwnode(isp->dev), in risp_parse_dt()
363 dev_err(isp->dev, "Not connected to subdevice\n"); in risp_parse_dt()
368 isp->csi_input = RISP_CSI_INPUT1; in risp_parse_dt()
373 dev_dbg(isp->dev, "Found '%pOF'\n", to_of_node(fwnode)); in risp_parse_dt()
375 v4l2_async_nf_init(&isp->notifier); in risp_parse_dt()
376 isp->notifier.ops = &risp_notify_ops; in risp_parse_dt()
378 asd = v4l2_async_nf_add_fwnode(&isp->notifier, fwnode, in risp_parse_dt()
384 ret = v4l2_async_subdev_nf_register(&isp->subdev, &isp->notifier); in risp_parse_dt()
386 v4l2_async_nf_cleanup(&isp->notifier); in risp_parse_dt()
399 static int risp_probe_resources(struct rcar_isp *isp, in risp_probe_resources() argument
405 isp->base = devm_ioremap_resource(&pdev->dev, res); in risp_probe_resources()
406 if (IS_ERR(isp->base)) in risp_probe_resources()
407 return PTR_ERR(isp->base); in risp_probe_resources()
409 isp->rstc = devm_reset_control_get(&pdev->dev, NULL); in risp_probe_resources()
411 return PTR_ERR_OR_ZERO(isp->rstc); in risp_probe_resources()
422 struct rcar_isp *isp; in risp_probe() local
426 isp = devm_kzalloc(&pdev->dev, sizeof(*isp), GFP_KERNEL); in risp_probe()
427 if (!isp) in risp_probe()
430 isp->dev = &pdev->dev; in risp_probe()
432 mutex_init(&isp->lock); in risp_probe()
434 ret = risp_probe_resources(isp, pdev); in risp_probe()
436 dev_err(isp->dev, "Failed to get resources\n"); in risp_probe()
440 platform_set_drvdata(pdev, isp); in risp_probe()
444 ret = risp_parse_dt(isp); in risp_probe()
448 isp->subdev.owner = THIS_MODULE; in risp_probe()
449 isp->subdev.dev = &pdev->dev; in risp_probe()
450 v4l2_subdev_init(&isp->subdev, &rcar_isp_subdev_ops); in risp_probe()
451 v4l2_set_subdevdata(&isp->subdev, &pdev->dev); in risp_probe()
452 snprintf(isp->subdev.name, V4L2_SUBDEV_NAME_SIZE, "%s %s", in risp_probe()
454 isp->subdev.flags = V4L2_SUBDEV_FL_HAS_DEVNODE; in risp_probe()
456 isp->subdev.entity.function = MEDIA_ENT_F_VID_MUX; in risp_probe()
457 isp->subdev.entity.ops = &risp_entity_ops; in risp_probe()
459 isp->pads[RCAR_ISP_SINK].flags = MEDIA_PAD_FL_SINK; in risp_probe()
461 isp->pads[i].flags = MEDIA_PAD_FL_SOURCE; in risp_probe()
463 ret = media_entity_pads_init(&isp->subdev.entity, RCAR_ISP_NUM_PADS, in risp_probe()
464 isp->pads); in risp_probe()
468 ret = v4l2_async_register_subdev(&isp->subdev); in risp_probe()
472 dev_info(isp->dev, "Using CSI-2 input: %u\n", isp->csi_input); in risp_probe()
476 v4l2_async_nf_unregister(&isp->notifier); in risp_probe()
477 v4l2_async_nf_cleanup(&isp->notifier); in risp_probe()
481 mutex_destroy(&isp->lock); in risp_probe()
488 struct rcar_isp *isp = platform_get_drvdata(pdev); in risp_remove() local
490 v4l2_async_nf_unregister(&isp->notifier); in risp_remove()
491 v4l2_async_nf_cleanup(&isp->notifier); in risp_remove()
493 v4l2_async_unregister_subdev(&isp->subdev); in risp_remove()
497 mutex_destroy(&isp->lock); in risp_remove()