xref: /linux/drivers/media/platform/raspberrypi/rp1-cfe/csi2.h (revision c771600c6af14749609b49565ffb4cac2959710d)
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