Lines Matching full:csi2
24 #include "ipu6-isys-csi2.h"
26 #include "ipu6-platform-isys-csi2-reg.h"
80 s64 ipu6_isys_csi2_get_link_freq(struct ipu6_isys_csi2 *csi2) in ipu6_isys_csi2_get_link_freq() argument
84 if (!csi2) in ipu6_isys_csi2_get_link_freq()
87 src_pad = media_entity_remote_source_pad_unique(&csi2->asd.sd.entity); in ipu6_isys_csi2_get_link_freq()
89 dev_err(&csi2->isys->adev->auxdev.dev, in ipu6_isys_csi2_get_link_freq()
91 csi2->asd.sd.name, PTR_ERR(src_pad)); in ipu6_isys_csi2_get_link_freq()
102 struct ipu6_isys_csi2 *csi2 = to_ipu6_isys_csi2(asd); in csi2_subscribe_event() local
103 struct device *dev = &csi2->isys->adev->auxdev.dev; in csi2_subscribe_event()
105 dev_dbg(dev, "csi2 subscribe event(type %u id %u)\n", in csi2_subscribe_event()
124 * The input system CSI2+ receiver has several
164 ipu6_isys_csi2_calc_timing(struct ipu6_isys_csi2 *csi2, in ipu6_isys_csi2_calc_timing() argument
167 struct device *dev = &csi2->isys->adev->auxdev.dev; in ipu6_isys_csi2_calc_timing()
170 link_freq = ipu6_isys_csi2_get_link_freq(csi2); in ipu6_isys_csi2_calc_timing()
194 void ipu6_isys_register_errors(struct ipu6_isys_csi2 *csi2) in ipu6_isys_register_errors() argument
196 u32 irq = readl(csi2->base + CSI_PORT_REG_BASE_IRQ_CSI + in ipu6_isys_register_errors()
198 struct ipu6_isys *isys = csi2->isys; in ipu6_isys_register_errors()
201 mask = isys->pdata->ipdata->csi2.irq_mask; in ipu6_isys_register_errors()
202 writel(irq & mask, csi2->base + CSI_PORT_REG_BASE_IRQ_CSI + in ipu6_isys_register_errors()
204 csi2->receiver_errors |= irq & mask; in ipu6_isys_register_errors()
207 void ipu6_isys_csi2_error(struct ipu6_isys_csi2 *csi2) in ipu6_isys_csi2_error() argument
209 struct device *dev = &csi2->isys->adev->auxdev.dev; in ipu6_isys_csi2_error()
215 ipu6_isys_register_errors(csi2); in ipu6_isys_csi2_error()
216 status = csi2->receiver_errors; in ipu6_isys_csi2_error()
217 csi2->receiver_errors = 0; in ipu6_isys_csi2_error()
222 dev_err_ratelimited(dev, "csi2-%i error: %s\n", in ipu6_isys_csi2_error()
223 csi2->port, errors[i].error_string); in ipu6_isys_csi2_error()
232 struct ipu6_isys_csi2 *csi2 = to_ipu6_isys_csi2(asd); in ipu6_isys_csi2_set_stream() local
233 struct ipu6_isys *isys = csi2->isys; in ipu6_isys_csi2_set_stream()
241 dev_dbg(dev, "stream %s CSI2-%u with %u lanes\n", enable ? "on" : "off", in ipu6_isys_csi2_set_stream()
242 csi2->port, nlanes); in ipu6_isys_csi2_set_stream()
244 cfg.port = csi2->port; in ipu6_isys_csi2_set_stream()
247 mask = isys->pdata->ipdata->csi2.irq_mask; in ipu6_isys_csi2_set_stream()
248 nports = isys->pdata->ipdata->csi2.nports; in ipu6_isys_csi2_set_stream()
251 writel(0, csi2->base + CSI_REG_CSI_FE_ENABLE); in ipu6_isys_csi2_set_stream()
252 writel(0, csi2->base + CSI_REG_PPI2CSI_ENABLE); in ipu6_isys_csi2_set_stream()
255 csi2->base + CSI_PORT_REG_BASE_IRQ_CSI + in ipu6_isys_csi2_set_stream()
258 csi2->base + CSI_PORT_REG_BASE_IRQ_CSI + in ipu6_isys_csi2_set_stream()
261 csi2->base + CSI_PORT_REG_BASE_IRQ_CSI_SYNC + in ipu6_isys_csi2_set_stream()
264 csi2->base + CSI_PORT_REG_BASE_IRQ_CSI_SYNC + in ipu6_isys_csi2_set_stream()
270 (isys->pdata->ipdata->csi2.fw_access_port_ofs, in ipu6_isys_csi2_set_stream()
271 csi2->port)); in ipu6_isys_csi2_set_stream()
273 CSI_REG_HUB_DRV_ACCESS_PORT(csi2->port)); in ipu6_isys_csi2_set_stream()
279 writel(0x1, csi2->base + CSI_REG_PORT_GPREG_SRST); in ipu6_isys_csi2_set_stream()
281 writel(0x0, csi2->base + CSI_REG_PORT_GPREG_SRST); in ipu6_isys_csi2_set_stream()
287 (isys->pdata->ipdata->csi2.fw_access_port_ofs, i)); in ipu6_isys_csi2_set_stream()
292 csi2->base + CSI_PORT_REG_BASE_IRQ_CSI + in ipu6_isys_csi2_set_stream()
295 csi2->base + CSI_PORT_REG_BASE_IRQ_CSI + in ipu6_isys_csi2_set_stream()
298 csi2->base + CSI_PORT_REG_BASE_IRQ_CSI + in ipu6_isys_csi2_set_stream()
301 csi2->base + CSI_PORT_REG_BASE_IRQ_CSI + in ipu6_isys_csi2_set_stream()
304 csi2->base + CSI_PORT_REG_BASE_IRQ_CSI + in ipu6_isys_csi2_set_stream()
308 * Using event from firmware instead of irq to handle CSI2 sync event in ipu6_isys_csi2_set_stream()
309 * which can reduce system wakeups. If CSI2 sync irq enabled, we need in ipu6_isys_csi2_set_stream()
310 * disable the firmware CSI2 sync event to avoid duplicate handling. in ipu6_isys_csi2_set_stream()
312 writel(0xffffffff, csi2->base + CSI_PORT_REG_BASE_IRQ_CSI_SYNC + in ipu6_isys_csi2_set_stream()
314 writel(0, csi2->base + CSI_PORT_REG_BASE_IRQ_CSI_SYNC + in ipu6_isys_csi2_set_stream()
316 writel(0xffffffff, csi2->base + CSI_PORT_REG_BASE_IRQ_CSI_SYNC + in ipu6_isys_csi2_set_stream()
318 writel(0, csi2->base + CSI_PORT_REG_BASE_IRQ_CSI_SYNC + in ipu6_isys_csi2_set_stream()
320 writel(0xffffffff, csi2->base + CSI_PORT_REG_BASE_IRQ_CSI_SYNC + in ipu6_isys_csi2_set_stream()
324 writel(0, csi2->base + CSI_REG_CSI_FE_MODE); in ipu6_isys_csi2_set_stream()
325 writel(CSI_SENSOR_INPUT, csi2->base + CSI_REG_CSI_FE_MUX_CTRL); in ipu6_isys_csi2_set_stream()
327 csi2->base + CSI_REG_CSI_FE_SYNC_CNTR_SEL); in ipu6_isys_csi2_set_stream()
329 csi2->base + CSI_REG_PPI2CSI_CONFIG_PPI_INTF); in ipu6_isys_csi2_set_stream()
331 writel(1, csi2->base + CSI_REG_PPI2CSI_ENABLE); in ipu6_isys_csi2_set_stream()
332 writel(1, csi2->base + CSI_REG_CSI_FE_ENABLE); in ipu6_isys_csi2_set_stream()
336 dev_err(dev, "csi-%d phy power up failed %d\n", csi2->port, in ipu6_isys_csi2_set_stream()
347 struct ipu6_isys_csi2 *csi2 = to_ipu6_isys_csi2(asd); in ipu6_isys_csi2_enable_streams() local
361 ret = ipu6_isys_csi2_calc_timing(csi2, &timing, CSI2_ACCINV); in ipu6_isys_csi2_enable_streams()
365 ret = ipu6_isys_csi2_set_stream(sd, &timing, csi2->nlanes, true); in ipu6_isys_csi2_enable_streams()
512 void ipu6_isys_csi2_cleanup(struct ipu6_isys_csi2 *csi2) in ipu6_isys_csi2_cleanup() argument
514 if (!csi2->isys) in ipu6_isys_csi2_cleanup()
517 v4l2_device_unregister_subdev(&csi2->asd.sd); in ipu6_isys_csi2_cleanup()
518 v4l2_subdev_cleanup(&csi2->asd.sd); in ipu6_isys_csi2_cleanup()
519 ipu6_isys_subdev_cleanup(&csi2->asd); in ipu6_isys_csi2_cleanup()
520 csi2->isys = NULL; in ipu6_isys_csi2_cleanup()
523 int ipu6_isys_csi2_init(struct ipu6_isys_csi2 *csi2, in ipu6_isys_csi2_init() argument
530 csi2->isys = isys; in ipu6_isys_csi2_init()
531 csi2->base = base; in ipu6_isys_csi2_init()
532 csi2->port = index; in ipu6_isys_csi2_init()
534 csi2->asd.sd.entity.ops = &csi2_entity_ops; in ipu6_isys_csi2_init()
535 csi2->asd.isys = isys; in ipu6_isys_csi2_init()
536 ret = ipu6_isys_subdev_init(&csi2->asd, &csi2_sd_ops, 0, in ipu6_isys_csi2_init()
541 csi2->asd.source = IPU6_FW_ISYS_STREAM_SRC_CSI2_PORT0 + index; in ipu6_isys_csi2_init()
542 csi2->asd.supported_codes = csi2_supported_codes; in ipu6_isys_csi2_init()
543 snprintf(csi2->asd.sd.name, sizeof(csi2->asd.sd.name), in ipu6_isys_csi2_init()
544 IPU6_ISYS_ENTITY_PREFIX " CSI2 %u", index); in ipu6_isys_csi2_init()
545 v4l2_set_subdevdata(&csi2->asd.sd, &csi2->asd); in ipu6_isys_csi2_init()
546 ret = v4l2_subdev_init_finalize(&csi2->asd.sd); in ipu6_isys_csi2_init()
552 ret = v4l2_device_register_subdev(&isys->v4l2_dev, &csi2->asd.sd); in ipu6_isys_csi2_init()
561 ipu6_isys_csi2_cleanup(csi2); in ipu6_isys_csi2_init()
570 struct ipu6_isys_csi2 *csi2 = ipu6_isys_subdev_to_csi2(stream->asd); in ipu6_isys_csi2_sof_event_by_stream() local
578 dev_dbg(dev, "sof_event::csi2-%i sequence: %i, vc: %d\n", in ipu6_isys_csi2_sof_event_by_stream()
579 csi2->port, ev.u.frame_sync.frame_sequence, stream->vc); in ipu6_isys_csi2_sof_event_by_stream()
585 struct ipu6_isys_csi2 *csi2 = ipu6_isys_subdev_to_csi2(stream->asd); in ipu6_isys_csi2_eof_event_by_stream() local
588 dev_dbg(dev, "eof_event::csi2-%i sequence: %i\n", in ipu6_isys_csi2_eof_event_by_stream()
589 csi2->port, frame_sequence); in ipu6_isys_csi2_eof_event_by_stream()
593 struct ipu6_isys_csi2 *csi2, in ipu6_isys_csi2_get_remote_desc() argument
598 struct device *dev = &csi2->isys->adev->auxdev.dev; in ipu6_isys_csi2_get_remote_desc()
609 pad = media_pad_remote_pad_first(&csi2->asd.pad[CSI2_PAD_SINK]); in ipu6_isys_csi2_get_remote_desc()
635 if (desc_entry->bus.csi2.vc >= NR_OF_CSI2_VC) { in ipu6_isys_csi2_get_remote_desc()
636 dev_err(dev, "invalid vc %d\n", desc_entry->bus.csi2.vc); in ipu6_isys_csi2_get_remote_desc()