Lines Matching full:csi2

17 #include "csi2.h"
25 #define csi2_dbg(csi2, fmt, arg...) dev_dbg((csi2)->v4l2_dev->dev, fmt, ##arg) argument
26 #define csi2_err(csi2, fmt, arg...) dev_err((csi2)->v4l2_dev->dev, fmt, ##arg) argument
28 /* CSI2-DMA registers */
109 static inline u32 csi2_reg_read(struct csi2_device *csi2, u32 offset) in csi2_reg_read() argument
111 return readl(csi2->base + offset); in csi2_reg_read()
114 static inline void csi2_reg_write(struct csi2_device *csi2, u32 offset, u32 val) in csi2_reg_write() argument
116 writel(val, csi2->base + offset); in csi2_reg_write()
130 struct csi2_device *csi2 = s->private; in csi2_regs_show() local
133 ret = pm_runtime_resume_and_get(csi2->v4l2_dev->dev); in csi2_regs_show()
137 #define DUMP(reg) seq_printf(s, #reg " \t0x%08x\n", csi2_reg_read(csi2, reg)) in csi2_regs_show()
139 csi2_reg_read(csi2, reg(idx))) in csi2_regs_show()
166 pm_runtime_put(csi2->v4l2_dev->dev); in csi2_regs_show()
175 struct csi2_device *csi2 = s->private; in csi2_errors_show() local
181 spin_lock_irqsave(&csi2->errors_lock, flags); in csi2_errors_show()
183 memcpy(discards_table, csi2->discards_table, sizeof(discards_table)); in csi2_errors_show()
184 memcpy(discards_dt_table, csi2->discards_dt_table, in csi2_errors_show()
186 overflows = csi2->overflows; in csi2_errors_show()
188 csi2->overflows = 0; in csi2_errors_show()
189 memset(csi2->discards_table, 0, sizeof(discards_table)); in csi2_errors_show()
190 memset(csi2->discards_dt_table, 0, sizeof(discards_dt_table)); in csi2_errors_show()
192 spin_unlock_irqrestore(&csi2->errors_lock, flags); in csi2_errors_show()
217 static void csi2_isr_handle_errors(struct csi2_device *csi2, u32 status) in csi2_isr_handle_errors() argument
219 spin_lock(&csi2->errors_lock); in csi2_isr_handle_errors()
222 csi2->overflows++; in csi2_isr_handle_errors()
244 v = csi2_reg_read(csi2, discard_regs[i]); in csi2_isr_handle_errors()
245 csi2_reg_write(csi2, discard_regs[i], 0); in csi2_isr_handle_errors()
252 csi2->discards_table[vc][i] += amount; in csi2_isr_handle_errors()
253 csi2->discards_dt_table[i] = dt; in csi2_isr_handle_errors()
256 spin_unlock(&csi2->errors_lock); in csi2_isr_handle_errors()
259 void csi2_isr(struct csi2_device *csi2, bool *sof, bool *eof) in csi2_isr() argument
263 status = csi2_reg_read(csi2, CSI2_STATUS); in csi2_isr()
266 csi2_reg_write(csi2, CSI2_STATUS, status); in csi2_isr()
274 dbg = csi2_reg_read(csi2, CSI2_CH_DEBUG(i)); in csi2_isr()
283 csi2_isr_handle_errors(csi2, status); in csi2_isr()
286 void csi2_set_buffer(struct csi2_device *csi2, unsigned int channel, in csi2_set_buffer() argument
295 csi2_reg_write(csi2, CSI2_CH_LENGTH(channel), size >> 4); in csi2_set_buffer()
296 csi2_reg_write(csi2, CSI2_CH_STRIDE(channel), stride >> 4); in csi2_set_buffer()
297 csi2_reg_write(csi2, CSI2_CH_ADDR1(channel), addr >> 32); in csi2_set_buffer()
298 csi2_reg_write(csi2, CSI2_CH_ADDR0(channel), addr & 0xffffffff); in csi2_set_buffer()
301 void csi2_set_compression(struct csi2_device *csi2, unsigned int channel, in csi2_set_compression() argument
310 csi2_reg_write(csi2, CSI2_CH_COMP_CTRL(channel), compression); in csi2_set_compression()
313 void csi2_start_channel(struct csi2_device *csi2, unsigned int channel, in csi2_start_channel() argument
320 csi2_dbg(csi2, "%s [%u]\n", __func__, channel); in csi2_start_channel()
322 csi2_reg_write(csi2, CSI2_CH_CTRL(channel), 0); in csi2_start_channel()
323 csi2_reg_write(csi2, CSI2_CH_DEBUG(channel), 0); in csi2_start_channel()
324 csi2_reg_write(csi2, CSI2_STATUS, CSI2_STATUS_IRQ_CH_MASK(channel)); in csi2_start_channel()
338 csi2_reg_write(csi2, CSI2_CH_FRAME_SIZE(channel), in csi2_start_channel()
342 csi2_reg_write(csi2, CSI2_CH_FRAME_SIZE(channel), 0); in csi2_start_channel()
347 csi2_reg_write(csi2, CSI2_CH_CTRL(channel), ctrl); in csi2_start_channel()
348 csi2->num_lines[channel] = height; in csi2_start_channel()
351 void csi2_stop_channel(struct csi2_device *csi2, unsigned int channel) in csi2_stop_channel() argument
353 csi2_dbg(csi2, "%s [%u]\n", __func__, channel); in csi2_stop_channel()
356 csi2_reg_write(csi2, CSI2_CH_CTRL(channel), CSI2_CH_CTRL_FORCE); in csi2_stop_channel()
358 csi2_reg_write(csi2, CSI2_CH_ADDR0(channel), 0); in csi2_stop_channel()
360 csi2_reg_write(csi2, CSI2_CH_ADDR0(channel), 0); in csi2_stop_channel()
363 void csi2_open_rx(struct csi2_device *csi2) in csi2_open_rx() argument
365 csi2_reg_write(csi2, CSI2_IRQ_MASK, in csi2_open_rx()
368 dphy_start(&csi2->dphy); in csi2_open_rx()
370 csi2_reg_write(csi2, CSI2_CTRL, CSI2_CTRL_EOP_IS_EOL); in csi2_open_rx()
373 void csi2_close_rx(struct csi2_device *csi2) in csi2_close_rx() argument
375 dphy_stop(&csi2->dphy); in csi2_close_rx()
377 csi2_reg_write(csi2, CSI2_IRQ_MASK, 0); in csi2_close_rx()
526 int csi2_init(struct csi2_device *csi2, struct dentry *debugfs) in csi2_init() argument
530 spin_lock_init(&csi2->errors_lock); in csi2_init()
532 csi2->dphy.dev = csi2->v4l2_dev->dev; in csi2_init()
533 dphy_probe(&csi2->dphy); in csi2_init()
535 debugfs_create_file("csi2_regs", 0440, debugfs, csi2, &csi2_regs_fops); in csi2_init()
538 debugfs_create_file("csi2_errors", 0440, debugfs, csi2, in csi2_init()
541 csi2->pad[CSI2_PAD_SINK].flags = MEDIA_PAD_FL_SINK; in csi2_init()
545 csi2->pad[i].flags = MEDIA_PAD_FL_SOURCE; in csi2_init()
547 ret = media_entity_pads_init(&csi2->sd.entity, ARRAY_SIZE(csi2->pad), in csi2_init()
548 csi2->pad); in csi2_init()
553 v4l2_subdev_init(&csi2->sd, &csi2_subdev_ops); in csi2_init()
554 csi2->sd.internal_ops = &csi2_internal_ops; in csi2_init()
555 csi2->sd.entity.function = MEDIA_ENT_F_VID_IF_BRIDGE; in csi2_init()
556 csi2->sd.entity.ops = &csi2_entity_ops; in csi2_init()
557 csi2->sd.flags = V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_STREAMS; in csi2_init()
558 csi2->sd.owner = THIS_MODULE; in csi2_init()
559 snprintf(csi2->sd.name, sizeof(csi2->sd.name), "csi2"); in csi2_init()
561 ret = v4l2_subdev_init_finalize(&csi2->sd); in csi2_init()
565 ret = v4l2_device_register_subdev(csi2->v4l2_dev, &csi2->sd); in csi2_init()
567 csi2_err(csi2, "Failed register csi2 subdev (%d)\n", ret); in csi2_init()
574 v4l2_subdev_cleanup(&csi2->sd); in csi2_init()
576 media_entity_cleanup(&csi2->sd.entity); in csi2_init()
581 void csi2_uninit(struct csi2_device *csi2) in csi2_uninit() argument
583 v4l2_device_unregister_subdev(&csi2->sd); in csi2_uninit()
584 v4l2_subdev_cleanup(&csi2->sd); in csi2_uninit()
585 media_entity_cleanup(&csi2->sd.entity); in csi2_uninit()