1*6edb685aSTomi Valkeinen /* SPDX-License-Identifier: GPL-2.0 */ 2*6edb685aSTomi Valkeinen /* 3*6edb685aSTomi Valkeinen * RP1 CSI-2 Driver 4*6edb685aSTomi Valkeinen * 5*6edb685aSTomi Valkeinen * Copyright (c) 2021-2024 Raspberry Pi Ltd. 6*6edb685aSTomi Valkeinen * Copyright (c) 2023-2024 Ideas on Board Oy 7*6edb685aSTomi Valkeinen */ 8*6edb685aSTomi Valkeinen 9*6edb685aSTomi Valkeinen #ifndef _RP1_CSI2_ 10*6edb685aSTomi Valkeinen #define _RP1_CSI2_ 11*6edb685aSTomi Valkeinen 12*6edb685aSTomi Valkeinen #include <linux/debugfs.h> 13*6edb685aSTomi Valkeinen #include <linux/io.h> 14*6edb685aSTomi Valkeinen #include <linux/types.h> 15*6edb685aSTomi Valkeinen #include <media/v4l2-device.h> 16*6edb685aSTomi Valkeinen #include <media/v4l2-subdev.h> 17*6edb685aSTomi Valkeinen 18*6edb685aSTomi Valkeinen #include "dphy.h" 19*6edb685aSTomi Valkeinen 20*6edb685aSTomi Valkeinen #define CSI2_NUM_CHANNELS 4 21*6edb685aSTomi Valkeinen 22*6edb685aSTomi Valkeinen #define CSI2_PAD_SINK 0 23*6edb685aSTomi Valkeinen #define CSI2_PAD_FIRST_SOURCE 1 24*6edb685aSTomi Valkeinen #define CSI2_PAD_NUM_SOURCES 4 25*6edb685aSTomi Valkeinen #define CSI2_NUM_PADS 5 26*6edb685aSTomi Valkeinen 27*6edb685aSTomi Valkeinen #define DISCARDS_TABLE_NUM_VCS 4 28*6edb685aSTomi Valkeinen 29*6edb685aSTomi Valkeinen enum csi2_mode { 30*6edb685aSTomi Valkeinen CSI2_MODE_NORMAL = 0, 31*6edb685aSTomi Valkeinen CSI2_MODE_REMAP = 1, 32*6edb685aSTomi Valkeinen CSI2_MODE_COMPRESSED = 2, 33*6edb685aSTomi Valkeinen CSI2_MODE_FE_STREAMING = 3, 34*6edb685aSTomi Valkeinen }; 35*6edb685aSTomi Valkeinen 36*6edb685aSTomi Valkeinen enum csi2_compression_mode { 37*6edb685aSTomi Valkeinen CSI2_COMPRESSION_DELTA = 1, 38*6edb685aSTomi Valkeinen CSI2_COMPRESSION_SIMPLE = 2, 39*6edb685aSTomi Valkeinen CSI2_COMPRESSION_COMBINED = 3, 40*6edb685aSTomi Valkeinen }; 41*6edb685aSTomi Valkeinen 42*6edb685aSTomi Valkeinen enum discards_table_index { 43*6edb685aSTomi Valkeinen DISCARDS_TABLE_OVERFLOW = 0, 44*6edb685aSTomi Valkeinen DISCARDS_TABLE_LENGTH_LIMIT, 45*6edb685aSTomi Valkeinen DISCARDS_TABLE_UNMATCHED, 46*6edb685aSTomi Valkeinen DISCARDS_TABLE_INACTIVE, 47*6edb685aSTomi Valkeinen DISCARDS_TABLE_NUM_ENTRIES, 48*6edb685aSTomi Valkeinen }; 49*6edb685aSTomi Valkeinen 50*6edb685aSTomi Valkeinen struct csi2_device { 51*6edb685aSTomi Valkeinen /* Parent V4l2 device */ 52*6edb685aSTomi Valkeinen struct v4l2_device *v4l2_dev; 53*6edb685aSTomi Valkeinen 54*6edb685aSTomi Valkeinen void __iomem *base; 55*6edb685aSTomi Valkeinen 56*6edb685aSTomi Valkeinen struct dphy_data dphy; 57*6edb685aSTomi Valkeinen 58*6edb685aSTomi Valkeinen enum v4l2_mbus_type bus_type; 59*6edb685aSTomi Valkeinen unsigned int bus_flags; 60*6edb685aSTomi Valkeinen unsigned int num_lines[CSI2_NUM_CHANNELS]; 61*6edb685aSTomi Valkeinen 62*6edb685aSTomi Valkeinen struct media_pad pad[CSI2_NUM_PADS]; 63*6edb685aSTomi Valkeinen struct v4l2_subdev sd; 64*6edb685aSTomi Valkeinen 65*6edb685aSTomi Valkeinen /* lock for csi2 errors counters */ 66*6edb685aSTomi Valkeinen spinlock_t errors_lock; 67*6edb685aSTomi Valkeinen u32 overflows; 68*6edb685aSTomi Valkeinen u32 discards_table[DISCARDS_TABLE_NUM_VCS][DISCARDS_TABLE_NUM_ENTRIES]; 69*6edb685aSTomi Valkeinen u32 discards_dt_table[DISCARDS_TABLE_NUM_ENTRIES]; 70*6edb685aSTomi Valkeinen }; 71*6edb685aSTomi Valkeinen 72*6edb685aSTomi Valkeinen void csi2_isr(struct csi2_device *csi2, bool *sof, bool *eof); 73*6edb685aSTomi Valkeinen void csi2_set_buffer(struct csi2_device *csi2, unsigned int channel, 74*6edb685aSTomi Valkeinen dma_addr_t dmaaddr, unsigned int stride, 75*6edb685aSTomi Valkeinen unsigned int size); 76*6edb685aSTomi Valkeinen void csi2_set_compression(struct csi2_device *csi2, unsigned int channel, 77*6edb685aSTomi Valkeinen enum csi2_compression_mode mode, unsigned int shift, 78*6edb685aSTomi Valkeinen unsigned int offset); 79*6edb685aSTomi Valkeinen void csi2_start_channel(struct csi2_device *csi2, unsigned int channel, 80*6edb685aSTomi Valkeinen enum csi2_mode mode, bool auto_arm, 81*6edb685aSTomi Valkeinen bool pack_bytes, unsigned int width, 82*6edb685aSTomi Valkeinen unsigned int height, u8 vc, u8 dt); 83*6edb685aSTomi Valkeinen void csi2_stop_channel(struct csi2_device *csi2, unsigned int channel); 84*6edb685aSTomi Valkeinen void csi2_open_rx(struct csi2_device *csi2); 85*6edb685aSTomi Valkeinen void csi2_close_rx(struct csi2_device *csi2); 86*6edb685aSTomi Valkeinen int csi2_init(struct csi2_device *csi2, struct dentry *debugfs); 87*6edb685aSTomi Valkeinen void csi2_uninit(struct csi2_device *csi2); 88*6edb685aSTomi Valkeinen 89*6edb685aSTomi Valkeinen #endif 90