xref: /OK3568_Linux_fs/kernel/drivers/gpu/drm/rockchip/rockchip-mipi-csi-tx.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Copyright (c) 2018 Fuzhou Rockchip Electronics Co., Ltd
4  */
5 
6 #include <linux/clk.h>
7 #include <linux/component.h>
8 #include <linux/iopoll.h>
9 #include <linux/math64.h>
10 #include <linux/module.h>
11 #include <linux/of_device.h>
12 #include <linux/phy/phy.h>
13 #include <linux/pm_runtime.h>
14 #include <linux/regmap.h>
15 #include <linux/reset.h>
16 #include <linux/mfd/syscon.h>
17 #include <drm/drm_atomic_helper.h>
18 #include <drm/drm_crtc.h>
19 #include <drm/drm_crtc_helper.h>
20 #include <drm/drm_mipi_dsi.h>
21 #include <drm/drm_of.h>
22 #include <drm/drm_panel.h>
23 #include <drm/drmP.h>
24 #include <uapi/linux/videodev2.h>
25 #include <video/mipi_display.h>
26 #include <asm/unaligned.h>
27 
28 #include "rockchip_drm_drv.h"
29 #include "rockchip_drm_vop.h"
30 #include "rockchip-mipi-csi-tx.h"
31 
32 #define DSI_PHY_TMR_LPCLK_CFG		0x98
33 #define PHY_CLKHS2LP_TIME(lbcc)		(((lbcc) & 0x3ff) << 16)
34 #define PHY_CLKLP2HS_TIME(lbcc)		((lbcc) & 0x3ff)
35 
36 #define DSI_PHY_TMR_CFG			0x9c
37 #define PHY_HS2LP_TIME(lbcc)		(((lbcc) & 0xff) << 24)
38 #define PHY_LP2HS_TIME(lbcc)		(((lbcc) & 0xff) << 16)
39 #define MAX_RD_TIME(lbcc)		((lbcc) & 0x7fff)
40 
41 #define DSI_PHY_RSTZ			0xa0
42 #define PHY_DISFORCEPLL			0
43 #define PHY_ENFORCEPLL			BIT(3)
44 #define PHY_DISABLECLK			0
45 #define PHY_ENABLECLK			BIT(2)
46 #define PHY_RSTZ			0
47 #define PHY_UNRSTZ			BIT(1)
48 #define PHY_SHUTDOWNZ			0
49 #define PHY_UNSHUTDOWNZ			BIT(0)
50 #define DSI_PHY_TST_CTRL0		0xb4
51 #define PHY_TESTCLK			BIT(1)
52 #define PHY_UNTESTCLK			0
53 #define PHY_TESTCLR			BIT(0)
54 #define PHY_UNTESTCLR			0
55 
56 #define DSI_PHY_TST_CTRL1		0xb8
57 #define PHY_TESTEN			BIT(16)
58 #define PHY_UNTESTEN			0
59 #define PHY_TESTDOUT(n)			(((n) & 0xff) << 8)
60 #define PHY_TESTDIN(n)			(((n) & 0xff) << 0)
61 #define BYPASS_VCO_RANGE	BIT(7)
62 #define VCO_RANGE_CON_SEL(val)	(((val) & 0x7) << 3)
63 #define VCO_IN_CAP_CON_DEFAULT	(0x0 << 1)
64 #define VCO_IN_CAP_CON_LOW	(0x1 << 1)
65 #define VCO_IN_CAP_CON_HIGH	(0x2 << 1)
66 #define REF_BIAS_CUR_SEL	BIT(0)
67 
68 #define CP_CURRENT_3MA		BIT(3)
69 #define CP_PROGRAM_EN		BIT(7)
70 #define LPF_PROGRAM_EN		BIT(6)
71 #define LPF_RESISTORS_20_KOHM	0
72 #define HSFREQRANGE_SEL(val)	(((val) & 0x3f) << 1)
73 
74 #define INPUT_DIVIDER(val)	(((val) - 1) & 0x7f)
75 #define LOW_PROGRAM_EN		0
76 #define HIGH_PROGRAM_EN		BIT(7)
77 #define LOOP_DIV_LOW_SEL(val)	(((val) - 1) & 0x1f)
78 #define LOOP_DIV_HIGH_SEL(val)	((((val) - 1) >> 5) & 0x1f)
79 #define PLL_LOOP_DIV_EN		BIT(5)
80 #define PLL_INPUT_DIV_EN	BIT(4)
81 
82 #define POWER_CONTROL		BIT(6)
83 #define INTERNAL_REG_CURRENT	BIT(3)
84 #define BIAS_BLOCK_ON		BIT(2)
85 #define BANDGAP_ON		BIT(0)
86 
87 #define TER_RESISTOR_HIGH	BIT(7)
88 #define	TER_RESISTOR_LOW	0
89 #define LEVEL_SHIFTERS_ON	BIT(6)
90 #define TER_CAL_DONE		BIT(5)
91 #define SETRD_MAX		(0x7 << 2)
92 #define POWER_MANAGE		BIT(1)
93 #define TER_RESISTORS_ON	BIT(0)
94 
95 #define BIASEXTR_SEL(val)	((val) & 0x7)
96 #define BANDGAP_SEL(val)	((val) & 0x7)
97 #define TLP_PROGRAM_EN		BIT(7)
98 #define THS_PRE_PROGRAM_EN	BIT(7)
99 #define THS_ZERO_PROGRAM_EN	BIT(6)
100 
101 #define FPGA_DSI_PHY_TST_READ		0x18
102 #define FPGA_DSI_PHY_TST_CTRL0		0x20
103 
104 /* #define FPGA_PLATFORM_TEST		1 */
105 
106 struct dphy_pll_testdin_map {
107 	unsigned int max_mbps;
108 	u8 testdin;
109 };
110 
111 /* The table is based on 27MHz DPHY pll reference clock. */
112 static const struct dphy_pll_testdin_map dp_tdin_map[] = {
113 	{  90, 0x00}, { 100, 0x10}, { 110, 0x20}, { 130, 0x01},
114 	{ 140, 0x11}, { 150, 0x21}, { 170, 0x02}, { 180, 0x12},
115 	{ 200, 0x22}, { 220, 0x03}, { 240, 0x13}, { 250, 0x23},
116 	{ 270, 0x04}, { 300, 0x14}, { 330, 0x05}, { 360, 0x15},
117 	{ 400, 0x25}, { 450, 0x06}, { 500, 0x16}, { 550, 0x07},
118 	{ 600, 0x17}, { 650, 0x08}, { 700, 0x18}, { 750, 0x09},
119 	{ 800, 0x19}, { 850, 0x29}, { 900, 0x39}, { 950, 0x0a},
120 	{1000, 0x1a}, {1050, 0x2a}, {1100, 0x3a}, {1150, 0x0b},
121 	{1200, 0x1b}, {1250, 0x2b}, {1300, 0x3b}, {1350, 0x0c},
122 	{1400, 0x1c}, {1450, 0x2c}, {1500, 0x3c}
123 };
124 
125 enum {
126 	BANDGAP_97_07,
127 	BANDGAP_98_05,
128 	BANDGAP_99_02,
129 	BANDGAP_100_00,
130 	BANDGAP_93_17,
131 	BANDGAP_94_15,
132 	BANDGAP_95_12,
133 	BANDGAP_96_10,
134 };
135 
136 enum {
137 	BIASEXTR_87_1,
138 	BIASEXTR_91_5,
139 	BIASEXTR_95_9,
140 	BIASEXTR_100,
141 	BIASEXTR_105_94,
142 	BIASEXTR_111_88,
143 	BIASEXTR_118_8,
144 	BIASEXTR_127_7,
145 };
146 
147 static const char * const csi_tx_intr[] = {
148 	"RX frame start interrupt status!",
149 	"RX frame end interrupt status!",
150 	"RX line end interrupt status!",
151 	"TX frame start interrupt status!",
152 	"TX frame end interrupt status!",
153 	"TX line end interrupt status!",
154 	"Line flag0 interrupt status!",
155 	"Line flag1 interrupt status!",
156 	"PHY stopstate interrupt status!",
157 	"PHY PLL lock interrupt status!",
158 	"CSITX idle interrupt status!"
159 };
160 
161 static const char * const csi_tx_err_intr[] = {
162 	"IDI header fifo overflow raw interrupt!",
163 	"IDI header fifo underflow raw interrupt!",
164 	"IDI payload fifo overflow raw interrupt!",
165 	"IDI payload fifo underflow raw interrupt!",
166 	"Header fifo overflow raw interrupt!",
167 	"Header fifo underflow raw interrupt!",
168 	"Payload fifo overflow raw interrupt!",
169 	"Payload fifo underflow raw interrupt!",
170 	"Output fifo overflow raw interrupt!",
171 	"Output fifo underflow raw interrupt!",
172 	"Txreadyhs error0 raw interrupt!",
173 	"Txreadyhs error1 raw interrupt!"
174 };
175 
176 static void
grf_field_write(struct rockchip_mipi_csi * csi,enum grf_reg_fields index,unsigned int val)177 grf_field_write(struct rockchip_mipi_csi *csi, enum grf_reg_fields index,
178 		unsigned int val)
179 {
180 	const u32 field = csi->pdata->csi0_grf_reg_fields[index];
181 	u16 reg;
182 	u8 msb, lsb;
183 
184 	if (!field || !csi->grf)
185 		return;
186 
187 	reg = (field >> 16) & 0xffff;
188 	lsb = (field >>  8) & 0xff;
189 	msb = (field >>  0) & 0xff;
190 
191 	regmap_write(csi->grf, reg, (val << lsb) | (GENMASK(msb, lsb) << 16));
192 }
193 
csi_writel(struct rockchip_mipi_csi * csi,u32 offset,u32 v)194 static inline void csi_writel(struct rockchip_mipi_csi *csi, u32 offset, u32 v)
195 {
196 	writel(v, csi->regs + offset);
197 	csi->regsbak[offset >> 2] = v;
198 }
199 
csi_readl(struct rockchip_mipi_csi * csi,u32 offset)200 static inline u32 csi_readl(struct rockchip_mipi_csi *csi, u32 offset)
201 {
202 	return readl(csi->regs + offset);
203 }
204 
csi_mask_write(struct rockchip_mipi_csi * csi,u32 offset,u32 mask,u32 val,bool regbak)205 static inline void csi_mask_write(struct rockchip_mipi_csi *csi, u32 offset,
206 				  u32 mask, u32 val, bool regbak)
207 {
208 	u32 v;
209 	u32 cached_val = csi->regsbak[offset >> 2];
210 
211 	v = (cached_val & ~(mask)) | val;
212 
213 	if (regbak)
214 		csi_writel(csi, offset, v);
215 	else
216 		writel(v, csi->regs + offset);
217 }
218 
phy_max_mbps_to_testdin(unsigned int max_mbps)219 static int phy_max_mbps_to_testdin(unsigned int max_mbps)
220 {
221 	unsigned int i;
222 
223 	for (i = 0; i < ARRAY_SIZE(dp_tdin_map); i++)
224 		if (dp_tdin_map[i].max_mbps > max_mbps)
225 			return dp_tdin_map[i].testdin;
226 
227 	return -EINVAL;
228 }
229 
host_to_csi(struct mipi_dsi_host * host)230 static inline struct rockchip_mipi_csi *host_to_csi(struct mipi_dsi_host *host)
231 {
232 	return container_of(host, struct rockchip_mipi_csi, dsi_host);
233 }
234 
con_to_csi(struct drm_connector * con)235 static inline struct rockchip_mipi_csi *con_to_csi(struct drm_connector *con)
236 {
237 	return container_of(con, struct rockchip_mipi_csi, connector);
238 }
239 
240 static inline
encoder_to_csi(struct drm_encoder * encoder)241 struct rockchip_mipi_csi *encoder_to_csi(struct drm_encoder *encoder)
242 {
243 	return container_of(encoder, struct rockchip_mipi_csi, encoder);
244 }
245 
rockchip_mipi_csi_phy_write(struct rockchip_mipi_csi * csi,u8 test_code,u8 test_data)246 static void rockchip_mipi_csi_phy_write(struct rockchip_mipi_csi *csi,
247 					u8 test_code, u8 test_data)
248 {
249 	/*
250 	 * With the falling edge on TESTCLK, the TESTDIN[7:0] signal content
251 	 * is latched internally as the current test code. Test data is
252 	 * programmed internally by rising edge on TESTCLK.
253 	 */
254 	writel(0x01000100, csi->test_code_regs + FPGA_DSI_PHY_TST_CTRL0);
255 	writel(0x00ff0000 | test_code,
256 	       csi->test_code_regs + FPGA_DSI_PHY_TST_CTRL0);
257 	writel(0x02000200, csi->test_code_regs + FPGA_DSI_PHY_TST_CTRL0);
258 	writel(0x01000000, csi->test_code_regs + FPGA_DSI_PHY_TST_CTRL0);
259 	writel(0x02000000, csi->test_code_regs + FPGA_DSI_PHY_TST_CTRL0);
260 	writel(0x01000000, csi->test_code_regs + FPGA_DSI_PHY_TST_CTRL0);
261 	writel(0x00ff0000 | test_data,
262 	       csi->test_code_regs + FPGA_DSI_PHY_TST_CTRL0);
263 	writel(0x01000100, csi->test_code_regs + FPGA_DSI_PHY_TST_CTRL0);
264 }
265 
266 static u8 __maybe_unused
rockchip_mipi_csi_phy_read(struct rockchip_mipi_csi * csi,u8 test_code)267 rockchip_mipi_csi_phy_read(struct rockchip_mipi_csi *csi, u8 test_code)
268 {
269 	u8 val;
270 
271 	writel(0x02ff0200 | test_code,
272 	       csi->test_code_regs + FPGA_DSI_PHY_TST_CTRL0);
273 	writel(0x01000000, csi->test_code_regs + FPGA_DSI_PHY_TST_CTRL0);
274 
275 	val = readl(csi->test_code_regs + FPGA_DSI_PHY_TST_READ) & 0xff;
276 	writel(0x03000100, csi->test_code_regs + FPGA_DSI_PHY_TST_CTRL0);
277 
278 	return val;
279 }
280 
rockchip_bidir4l_board_phy_reset(struct rockchip_mipi_csi * csi)281 static void rockchip_bidir4l_board_phy_reset(struct rockchip_mipi_csi *csi)
282 {
283 	writel(0x04000000, csi->test_code_regs + FPGA_DSI_PHY_TST_CTRL0);
284 	writel(0x08000000, csi->test_code_regs + FPGA_DSI_PHY_TST_CTRL0);
285 	writel(0x01000100, csi->test_code_regs + FPGA_DSI_PHY_TST_CTRL0);
286 	writel(0x80008000, csi->test_code_regs + FPGA_DSI_PHY_TST_CTRL0);
287 	writel(0x80000000, csi->test_code_regs + FPGA_DSI_PHY_TST_CTRL0);
288 	writel(0x40004000, csi->test_code_regs + FPGA_DSI_PHY_TST_CTRL0);
289 }
290 
rockchip_bidir4l_board_phy_enable(struct rockchip_mipi_csi * csi)291 static void rockchip_bidir4l_board_phy_enable(struct rockchip_mipi_csi *csi)
292 {
293 	writel(0x01000100, csi->test_code_regs + FPGA_DSI_PHY_TST_CTRL0);
294 	writel(0x02000000, csi->test_code_regs + FPGA_DSI_PHY_TST_CTRL0);
295 	writel(0x08000800, csi->test_code_regs + FPGA_DSI_PHY_TST_CTRL0);
296 	writel(0x04000400, csi->test_code_regs + FPGA_DSI_PHY_TST_CTRL0);
297 }
298 
rockchip_mipi_csi_irq_init(struct rockchip_mipi_csi * csi)299 static void rockchip_mipi_csi_irq_init(struct rockchip_mipi_csi *csi)
300 {
301 	/* enable csi err irq */
302 	writel(m_ERR_INTR_EN | m_ERR_INTR_MASK, csi->regs + CSITX_ERR_INTR_EN);
303 
304 	/* disable csi frame end tx irq */
305 	writel(m_FRM_END_TX | v_FRM_END_TX(0), csi->regs + CSITX_INTR_EN);
306 }
307 
rockchip_mipi_csi_irq_disable(struct rockchip_mipi_csi * csi)308 static void rockchip_mipi_csi_irq_disable(struct rockchip_mipi_csi *csi)
309 {
310 	/* disable csi err irq */
311 	writel(m_ERR_INTR_MASK, csi->regs + CSITX_ERR_INTR_EN);
312 
313 	/* disable csi tx irq */
314 	writel(m_INTR_MASK, csi->regs + CSITX_INTR_EN);
315 }
316 
rockchip_mipi_dphy_power_on(struct rockchip_mipi_csi * csi)317 static int rockchip_mipi_dphy_power_on(struct rockchip_mipi_csi *csi)
318 {
319 	if (csi->dphy.phy)
320 		phy_power_on(csi->dphy.phy);
321 
322 	udelay(10);
323 
324 	return 0;
325 }
326 
rockchip_mipi_dphy_power_off(struct rockchip_mipi_csi * csi)327 static void rockchip_mipi_dphy_power_off(struct rockchip_mipi_csi *csi)
328 {
329 	if (csi->dphy.phy)
330 		phy_power_off(csi->dphy.phy);
331 }
332 
rockchip_mipi_csi_tx_en(struct rockchip_mipi_csi * csi)333 static void rockchip_mipi_csi_tx_en(struct rockchip_mipi_csi *csi)
334 {
335 	u32 mask, val;
336 
337 	/* enable csi tx, dphy and config lane num */
338 	mask = m_CSITX_EN | m_DPHY_EN | m_LANE_NUM;
339 	val = v_CSITX_EN(1) | v_DPHY_EN(1) | v_LANE_NUM(csi->lanes - 1);
340 	csi_mask_write(csi, CSITX_ENABLE, mask, val, true);
341 }
342 
rockchip_mipi_csi_host_power_on(struct rockchip_mipi_csi * csi)343 static void rockchip_mipi_csi_host_power_on(struct rockchip_mipi_csi *csi)
344 {
345 	u32 mask, val;
346 
347 	rockchip_mipi_csi_tx_en(csi);
348 	rockchip_mipi_csi_irq_init(csi);
349 
350 	mask = m_CONFIG_DONE | m_CONFIG_DONE_IMD | m_CONFIG_DONE_MODE;
351 	val = v_CONFIG_DONE(0) | v_CONFIG_DONE_IMD(1) | v_CONFIG_DONE_MODE(0);
352 	csi_mask_write(csi, CSITX_CONFIG_DONE, mask, val, false);
353 }
354 
rockchip_mipi_csi_host_power_off(struct rockchip_mipi_csi * csi)355 static void rockchip_mipi_csi_host_power_off(struct rockchip_mipi_csi *csi)
356 {
357 	u32 mask, val;
358 
359 	rockchip_mipi_csi_irq_disable(csi);
360 
361 	/* disable csi tx, dphy and config lane num */
362 	mask = m_CSITX_EN | m_DPHY_EN;
363 	val = v_CSITX_EN(0) | v_DPHY_EN(0);
364 	csi_mask_write(csi, CSITX_ENABLE, mask, val, true);
365 	csi_mask_write(csi, CSITX_CONFIG_DONE, m_CONFIG_DONE,
366 		       v_CONFIG_DONE(1), false);
367 }
368 
rockchip_mipi_csi_phy_pll_init(struct rockchip_mipi_csi * csi)369 static void rockchip_mipi_csi_phy_pll_init(struct rockchip_mipi_csi *csi)
370 {
371 	rockchip_mipi_csi_phy_write(csi, 0x17,
372 				    INPUT_DIVIDER(csi->dphy.input_div));
373 	rockchip_mipi_csi_phy_write(csi, 0x18,
374 				    LOOP_DIV_LOW_SEL(csi->dphy.feedback_div) |
375 				    LOW_PROGRAM_EN);
376 	rockchip_mipi_csi_phy_write(csi, 0x19,
377 				    PLL_LOOP_DIV_EN | PLL_INPUT_DIV_EN);
378 	rockchip_mipi_csi_phy_write(csi, 0x18,
379 				    LOOP_DIV_HIGH_SEL(csi->dphy.feedback_div) |
380 				    HIGH_PROGRAM_EN);
381 	rockchip_mipi_csi_phy_write(csi, 0x19,
382 				    PLL_LOOP_DIV_EN | PLL_INPUT_DIV_EN);
383 }
384 
385 static int __maybe_unused
rockchip_mipi_csi_phy_init(struct rockchip_mipi_csi * csi)386 rockchip_mipi_csi_phy_init(struct rockchip_mipi_csi *csi)
387 {
388 	int testdin, vco;
389 
390 	vco = (csi->lane_mbps < 200) ? 0 : (csi->lane_mbps + 100) / 200;
391 
392 	testdin = phy_max_mbps_to_testdin(csi->lane_mbps);
393 	if (testdin < 0) {
394 		dev_err(csi->dev,
395 			"failed to get testdin for %dmbps lane clock\n",
396 			csi->lane_mbps);
397 		return testdin;
398 	}
399 
400 	rockchip_mipi_csi_phy_write(csi, 0xb0, 0x01);
401 	rockchip_mipi_csi_phy_write(csi, 0xac, csi->lanes - 1);
402 	rockchip_mipi_csi_phy_write(csi, 0xb1, 0x00);
403 	rockchip_mipi_csi_phy_write(csi, 0xb2, 0x00);
404 	rockchip_mipi_csi_phy_write(csi, 0xb3, 0x00);
405 	rockchip_mipi_csi_phy_write(csi, 0x10, BYPASS_VCO_RANGE |
406 					 VCO_RANGE_CON_SEL(vco) |
407 					 VCO_IN_CAP_CON_LOW |
408 					 REF_BIAS_CUR_SEL);
409 
410 	rockchip_mipi_csi_phy_write(csi, 0x11, CP_CURRENT_3MA);
411 	rockchip_mipi_csi_phy_write(csi, 0x12, CP_PROGRAM_EN | LPF_PROGRAM_EN |
412 					 LPF_RESISTORS_20_KOHM);
413 
414 	rockchip_mipi_csi_phy_write(csi, 0x44, HSFREQRANGE_SEL(testdin));
415 
416 	rockchip_mipi_csi_phy_pll_init(csi);
417 
418 	rockchip_mipi_csi_phy_write(csi, 0x20, POWER_CONTROL |
419 					INTERNAL_REG_CURRENT | BIAS_BLOCK_ON |
420 					BANDGAP_ON);
421 
422 	rockchip_mipi_csi_phy_write(csi, 0x21, TER_RESISTOR_LOW | TER_CAL_DONE |
423 					 SETRD_MAX | TER_RESISTORS_ON);
424 	rockchip_mipi_csi_phy_write(csi, 0x21, TER_RESISTOR_HIGH |
425 					LEVEL_SHIFTERS_ON | SETRD_MAX |
426 					POWER_MANAGE | TER_RESISTORS_ON);
427 
428 	rockchip_mipi_csi_phy_write(csi, 0x22, LOW_PROGRAM_EN |
429 					 BIASEXTR_SEL(BIASEXTR_127_7));
430 	rockchip_mipi_csi_phy_write(csi, 0x22, HIGH_PROGRAM_EN |
431 					 BANDGAP_SEL(BANDGAP_96_10));
432 
433 	rockchip_mipi_csi_phy_write(csi, 0x70, TLP_PROGRAM_EN | 0xf);
434 	rockchip_mipi_csi_phy_write(csi, 0x71, THS_PRE_PROGRAM_EN | 0x2d);
435 	rockchip_mipi_csi_phy_write(csi, 0x72, THS_ZERO_PROGRAM_EN | 0xa);
436 
437 	return 0;
438 }
439 
440 /**
441  * mipi_csi_pixel_format_to_bpp - obtain the number of bits per pixel for any
442  *                                given pixel format defined by the MIPI CSI
443  *                                specification
444  * @fmt: MIPI CSI pixel format
445  *
446  * Returns: The number of bits per pixel of the given pixel format.
447  */
mipi_csi_pixel_format_to_bpp(int fmt)448 static inline int mipi_csi_pixel_format_to_bpp(int fmt)
449 {
450 	switch (fmt) {
451 	case MIPI_CSI_FMT_RAW8:
452 		return 8;
453 	case MIPI_CSI_FMT_RAW10:
454 		return 10;
455 	default:
456 		pr_info("mipi csi unsupported format: %d\n", fmt);
457 		return 24;
458 	}
459 
460 	return -EINVAL;
461 }
462 
463 static unsigned long
rockchip_mipi_csi_calc_bandwidth(struct rockchip_mipi_csi * csi)464 rockchip_mipi_csi_calc_bandwidth(struct rockchip_mipi_csi *csi)
465 {
466 	int bpp;
467 	unsigned long mpclk, tmp;
468 	unsigned long target_mbps = 1000;
469 	unsigned int value;
470 	struct device_node *np = csi->dev->of_node;
471 	unsigned int max_mbps;
472 	int lanes;
473 
474 	/* optional override of the desired bandwidth */
475 	if (!of_property_read_u32(np, "rockchip,lane-rate", &value))
476 		return value;
477 
478 	max_mbps = csi->pdata->max_bit_rate_per_lane / USEC_PER_SEC;
479 
480 	bpp = mipi_csi_pixel_format_to_bpp(csi->format);
481 	if (bpp < 0) {
482 		dev_err(csi->dev, "failed to get bpp for pixel format %d\n",
483 			csi->format);
484 		bpp = 24;
485 	}
486 
487 	lanes = csi->lanes;
488 
489 	mpclk = DIV_ROUND_UP(csi->mode.clock, MSEC_PER_SEC);
490 	if (mpclk) {
491 		/*
492 		 * vop raw 1 cycle pclk can process 4 pixel, so multiply 4.
493 		 */
494 		tmp = mpclk * (bpp / lanes) * 4;
495 		if (tmp <= max_mbps)
496 			target_mbps = tmp;
497 		else
498 			dev_err(csi->dev, "DPHY clock freq is out of range\n");
499 	}
500 
501 	return target_mbps;
502 }
503 
rockchip_mipi_csi_get_lane_bps(struct rockchip_mipi_csi * csi)504 static int rockchip_mipi_csi_get_lane_bps(struct rockchip_mipi_csi *csi)
505 {
506 	unsigned int i, pre;
507 	unsigned long pllref, tmp;
508 	unsigned int m = 1, n = 1;
509 	unsigned long target_mbps;
510 
511 	target_mbps = rockchip_mipi_csi_calc_bandwidth(csi);
512 #ifdef FPGA_PLATFORM_TEST
513 	pllref = DIV_ROUND_UP(27000000, USEC_PER_SEC);
514 #else
515 	pllref = DIV_ROUND_UP(clk_get_rate(csi->dphy.ref_clk), USEC_PER_SEC);
516 #endif
517 	tmp = pllref;
518 
519 	for (i = 1; i < 6; i++) {
520 		pre = pllref / i;
521 		if ((tmp > (target_mbps % pre)) && (target_mbps / pre < 512)) {
522 			tmp = target_mbps % pre;
523 			n = i;
524 			m = target_mbps / pre;
525 		}
526 		if (tmp == 0)
527 			break;
528 	}
529 
530 	csi->lane_mbps = pllref / n * m;
531 	csi->dphy.input_div = n;
532 	csi->dphy.feedback_div = m;
533 
534 	return 0;
535 }
536 
rockchip_mipi_csi_set_hs_clk(struct rockchip_mipi_csi * csi)537 static void rockchip_mipi_csi_set_hs_clk(struct rockchip_mipi_csi *csi)
538 {
539 	int ret;
540 	unsigned long target_mbps;
541 	unsigned long bw, rate;
542 
543 	target_mbps = rockchip_mipi_csi_calc_bandwidth(csi);
544 	bw = target_mbps * USEC_PER_SEC;
545 
546 	rate = clk_round_rate(csi->dphy.hs_clk, bw);
547 	ret = clk_set_rate(csi->dphy.hs_clk, rate);
548 	if (ret)
549 		dev_err(csi->dev, "failed to set hs clock rate: %lu\n",
550 			rate);
551 
552 	csi->lane_mbps = rate / USEC_PER_SEC;
553 }
554 
rockchip_mipi_csi_host_attach(struct mipi_dsi_host * host,struct mipi_dsi_device * device)555 static int rockchip_mipi_csi_host_attach(struct mipi_dsi_host *host,
556 					 struct mipi_dsi_device *device)
557 {
558 	struct rockchip_mipi_csi *csi = host_to_csi(host);
559 
560 	if (device->lanes == 0 || device->lanes > 8) {
561 		dev_err(csi->dev, "the number of data lanes(%u) is too many\n",
562 			device->lanes);
563 		return -EINVAL;
564 	}
565 	csi->client = device->dev.of_node;
566 	csi->lanes = device->lanes;
567 	csi->channel = device->channel;
568 	csi->format = device->format;
569 	csi->mode_flags = device->mode_flags;
570 
571 	return 0;
572 }
573 
rockchip_mipi_csi_host_detach(struct mipi_dsi_host * host,struct mipi_dsi_device * device)574 static int rockchip_mipi_csi_host_detach(struct mipi_dsi_host *host,
575 					 struct mipi_dsi_device *device)
576 {
577 	struct rockchip_mipi_csi *csi = host_to_csi(host);
578 
579 	if (csi->panel)
580 		drm_panel_detach(csi->panel);
581 
582 	csi->panel = NULL;
583 	return 0;
584 }
585 
586 static const struct mipi_dsi_host_ops rockchip_mipi_csi_host_ops = {
587 	.attach = rockchip_mipi_csi_host_attach,
588 	.detach = rockchip_mipi_csi_host_detach,
589 };
590 
rockchip_mipi_csi_path_config(struct rockchip_mipi_csi * csi)591 static void rockchip_mipi_csi_path_config(struct rockchip_mipi_csi *csi)
592 {
593 	u32 mask, val;
594 	u32 vop_wc = 0;
595 	u32 data_type = 0x2a;
596 
597 	switch (csi->format) {
598 	case MIPI_CSI_FMT_RAW8:
599 		vop_wc = csi->mode.hdisplay;
600 		data_type = 0x2a;
601 		break;
602 	case MIPI_CSI_FMT_RAW10:
603 		vop_wc = csi->mode.hdisplay * 5 / 4;
604 		data_type = 0x2b;
605 		break;
606 	default:
607 		vop_wc = csi->mode.hdisplay;
608 		data_type = 0x2a;
609 		WARN_ON(1);
610 	}
611 
612 	if (csi->path_mode == VOP_PATH) {
613 		/* bypass select */
614 		mask = m_BYPASS_SELECT;
615 		val = v_BYPASS_SELECT(0);
616 		csi_mask_write(csi, CSITX_SYS_CTRL1, mask, val, true);
617 
618 		/* enable vop path
619 		 * todo: vc
620 		 */
621 		mask = m_VOP_PATH_EN | m_VOP_WC_USERDEFINE_EN |
622 			m_VOP_WC_USERDEFINE | m_VOP_DT_USERDEFINE_EN |
623 			m_VOP_DT_USERDEFINE;
624 		val = v_VOP_PATH_EN(1) | v_VOP_WC_USERDEFINE_EN(1) |
625 			v_VOP_WC_USERDEFINE(vop_wc) |
626 			v_VOP_DT_USERDEFINE_EN(1) |
627 			v_VOP_DT_USERDEFINE(data_type);
628 		csi_mask_write(csi, CSITX_VOP_PATH_CTRL, mask, val, true);
629 
630 		/* disable bypass path */
631 		mask = m_BYPASS_PATH_EN;
632 		val = v_BYPASS_PATH_EN(0);
633 		csi_mask_write(csi, CSITX_BYPASS_PATH_CTRL, mask, val, true);
634 	} else {
635 		mask = m_BYPASS_SELECT;
636 		val = v_BYPASS_SELECT(1);
637 		/* bypass select */
638 		csi_mask_write(csi, CSITX_SYS_CTRL1, mask, val, true);
639 
640 		/* disable vop path
641 		 * todo: dt, vc, wc
642 		 */
643 		mask = m_VOP_PATH_EN | m_VOP_WC_USERDEFINE_EN |
644 			 m_VOP_DT_USERDEFINE_EN;
645 		val = v_VOP_PATH_EN(0) | v_VOP_WC_USERDEFINE_EN(0) |
646 			v_VOP_DT_USERDEFINE_EN(0);
647 		csi_mask_write(csi, CSITX_VOP_PATH_CTRL, mask, val, true);
648 
649 		/* enable bypass path */
650 		mask = m_BYPASS_PATH_EN;
651 		val = v_BYPASS_PATH_EN(1);
652 		csi_mask_write(csi, CSITX_BYPASS_PATH_CTRL, mask, val, true);
653 
654 		/* enable idi_48bit path */
655 		mask = m_IDI_48BIT_EN;
656 		val = v_IDI_48BIT_EN(0);
657 		csi_mask_write(csi, CSITX_ENABLE, mask, val, true);
658 	}
659 }
660 
rockchip_mipi_csi_video_mode_config(struct rockchip_mipi_csi * csi)661 static void rockchip_mipi_csi_video_mode_config(struct rockchip_mipi_csi *csi)
662 {
663 	u32 mask, val;
664 
665 	if (csi->mode_flags & MIPI_DSI_CLOCK_NON_CONTINUOUS) {
666 		/* enable non continue mode */
667 		val = v_NON_CONTINUES_MODE_EN(1) | v_CONT_MODE_CLK_SET(0);
668 	} else {
669 		/* disable non continue mode */
670 		val = v_NON_CONTINUES_MODE_EN(0) | v_CONT_MODE_CLK_SET(1);
671 	}
672 	mask = m_NON_CONTINUES_MODE_EN | m_CONT_MODE_CLK_SET;
673 	csi_mask_write(csi, CSITX_SYS_CTRL3, mask, val, true);
674 }
675 
rockchip_mipi_dphy_init(struct rockchip_mipi_csi * csi)676 static void rockchip_mipi_dphy_init(struct rockchip_mipi_csi *csi)
677 {
678 	u32 map[] = {0x1, 0x3, 0x7, 0xf};
679 
680 	/* Configures DPHY Selete */
681 	grf_field_write(csi, DPHY_SEL, 0);
682 
683 	/* Configures DPHY to work as a Master */
684 	grf_field_write(csi, MASTERSLAVEZ, 1);
685 
686 	/* Configures lane as TX */
687 	grf_field_write(csi, BASEDIR, 0);
688 
689 	/* Set all REQUEST inputs to zero */
690 	grf_field_write(csi, TURNREQUEST, 0);
691 	grf_field_write(csi, TURNDISABLE, 0);
692 	grf_field_write(csi, FORCETXSTOPMODE, 0);
693 	grf_field_write(csi, FORCERXMODE, 0);
694 
695 	/* Enable Data Lane Module */
696 	grf_field_write(csi, ENABLE_N, map[csi->lanes - 1]);
697 
698 	/* Enable Clock Lane Module */
699 	grf_field_write(csi, ENABLECLK, 1);
700 	if (!csi->dphy.phy) {
701 		/* reset dphy */
702 		rockchip_bidir4l_board_phy_reset(csi);
703 		udelay(1);
704 #ifdef FPGA_PLATFORM_TEST
705 		/* init dphy */
706 		rockchip_mipi_csi_phy_write(csi, 0xb0, 0x01);
707 		rockchip_mipi_csi_phy_write(csi, 0xac, csi->lanes - 1);
708 
709 		rockchip_mipi_csi_phy_write(csi, 0x44, 0x0a);/* fpga:324Mbps */
710 		rockchip_mipi_csi_phy_write(csi, 0x19, 0x30);
711 		rockchip_mipi_csi_phy_write(csi, 0x17, 0x00);
712 		rockchip_mipi_csi_phy_write(csi, 0x18, 0xb);
713 		rockchip_mipi_csi_phy_write(csi, 0x18, 0x80);
714 
715 		rockchip_mipi_csi_phy_write(csi, 0x10, 0x80);
716 		rockchip_mipi_csi_phy_write(csi, 0x11, 0x09);
717 		rockchip_mipi_csi_phy_write(csi, 0x12, 0xc2);
718 #else
719 		rockchip_mipi_csi_phy_init(csi);
720 #endif
721 		/* enable dphy */
722 		rockchip_bidir4l_board_phy_enable(csi);
723 	}
724 	udelay(1);
725 }
726 
rockchip_mipi_csi_fmt_config(struct rockchip_mipi_csi * csi,struct drm_display_mode * mode)727 static void rockchip_mipi_csi_fmt_config(struct rockchip_mipi_csi *csi,
728 					 struct drm_display_mode *mode)
729 {
730 	u32 mask, val;
731 
732 	mask = m_PIXEL_FORMAT;
733 	val = v_PIXEL_FORMAT(csi->format);
734 	csi_mask_write(csi, CSITX_VOP_PATH_CTRL, mask, val, true);
735 
736 	mask = m_CAM_FORMAT;
737 	val = v_CAM_FORMAT(csi->format);
738 	csi_mask_write(csi, CSITX_BYPASS_PATH_CTRL, mask, val, true);
739 }
740 
741 static void
rockchip_mipi_csi_encoder_mode_set(struct drm_encoder * encoder,struct drm_display_mode * mode,struct drm_display_mode * adjusted_mode)742 rockchip_mipi_csi_encoder_mode_set(struct drm_encoder *encoder,
743 				   struct drm_display_mode *mode,
744 				   struct drm_display_mode *adjusted_mode)
745 {
746 	struct rockchip_mipi_csi *csi = encoder_to_csi(encoder);
747 
748 	drm_mode_copy(&csi->mode, adjusted_mode);
749 }
750 
rockchip_mipi_csi_post_disable(struct rockchip_mipi_csi * csi)751 static void rockchip_mipi_csi_post_disable(struct rockchip_mipi_csi *csi)
752 {
753 	rockchip_mipi_csi_host_power_off(csi);
754 	rockchip_mipi_dphy_power_off(csi);
755 
756 	pm_runtime_put(csi->dev);
757 	clk_disable_unprepare(csi->pclk);
758 	clk_disable_unprepare(csi->dphy.hs_clk);
759 	clk_disable_unprepare(csi->dphy.ref_clk);
760 }
761 
rockchip_mipi_csi_encoder_disable(struct drm_encoder * encoder)762 static void rockchip_mipi_csi_encoder_disable(struct drm_encoder *encoder)
763 {
764 	struct rockchip_mipi_csi *csi = encoder_to_csi(encoder);
765 
766 	if (csi->panel)
767 		drm_panel_disable(csi->panel);
768 
769 	if (csi->panel)
770 		drm_panel_unprepare(csi->panel);
771 
772 	rockchip_mipi_csi_post_disable(csi);
773 }
774 
775 static bool
rockchip_mipi_csi_encoder_mode_fixup(struct drm_encoder * encoder,const struct drm_display_mode * mode,struct drm_display_mode * adjusted_mode)776 rockchip_mipi_csi_encoder_mode_fixup(struct drm_encoder *encoder,
777 				     const struct drm_display_mode *mode,
778 				     struct drm_display_mode *adjusted_mode)
779 {
780 	return true;
781 }
782 
rockchip_mipi_csi_pre_init(struct rockchip_mipi_csi * csi)783 static void rockchip_mipi_csi_pre_init(struct rockchip_mipi_csi *csi)
784 {
785 	if (csi->dphy.phy)
786 		rockchip_mipi_csi_set_hs_clk(csi);
787 	else
788 		rockchip_mipi_csi_get_lane_bps(csi);
789 
790 	dev_info(csi->dev, "final CSI-Link bandwidth: %u x %d Mbps\n",
791 		 csi->lane_mbps, csi->lanes);
792 }
793 
rockchip_mipi_csihost_enable_phy(struct rockchip_mipi_csi * csi)794 static void rockchip_mipi_csihost_enable_phy(struct rockchip_mipi_csi *csi)
795 {
796 	u32 mask, val;
797 	u32 map[] = {0x3, 0x7, 0xf, 0x1f};
798 
799 	mask = m_CSITX_ENABLE_PHY;
800 	val = v_CSITX_ENABLE_PHY(map[csi->lanes - 1]);
801 	csi_mask_write(csi, CSITX_DPHY_CTRL, mask, val, true);
802 }
803 
rockchip_mipi_csi_host_init(struct rockchip_mipi_csi * csi)804 static void rockchip_mipi_csi_host_init(struct rockchip_mipi_csi *csi)
805 {
806 	rockchip_mipi_csi_fmt_config(csi, &csi->mode);
807 	rockchip_mipi_csi_video_mode_config(csi);
808 	rockchip_mipi_csi_path_config(csi);
809 	rockchip_mipi_csihost_enable_phy(csi);
810 
811 	/* timging config */
812 }
813 
rockchip_mipi_csi_calibration(struct rockchip_mipi_csi * csi)814 static int rockchip_mipi_csi_calibration(struct rockchip_mipi_csi *csi)
815 {
816 	int ret = 0;
817 	unsigned int val, mask;
818 
819 	/* calibration */
820 	grf_field_write(csi, TXSKEWCALHS, 0x1f);
821 	udelay(17);
822 	grf_field_write(csi, TXSKEWCALHS, 0x0);
823 
824 	ret = readl_poll_timeout(csi->regs + CSITX_STATUS1,
825 				 val, (val & m_DPHY_PLL_LOCK),
826 				 1000, PHY_STATUS_TIMEOUT_US);
827 	if (ret < 0) {
828 		dev_err(csi->dev, "PHY is not locked\n");
829 		return ret;
830 	}
831 
832 	mask = PHY_STOPSTATELANE;
833 	ret = readl_poll_timeout(csi->regs + CSITX_STATUS1,
834 				 val, (val & mask) == mask,
835 				 1000, PHY_STATUS_TIMEOUT_US);
836 	if (ret < 0) {
837 		dev_err(csi->dev, "lane module is not in stop state\n");
838 		return ret;
839 	}
840 	udelay(10);
841 
842 	return 0;
843 }
844 
rockchip_mipi_csi_pre_enable(struct rockchip_mipi_csi * csi)845 static int rockchip_mipi_csi_pre_enable(struct rockchip_mipi_csi *csi)
846 {
847 	int i = 0;
848 
849 	rockchip_mipi_csi_pre_init(csi);
850 	clk_prepare_enable(csi->dphy.ref_clk);
851 	clk_prepare_enable(csi->dphy.hs_clk);
852 	clk_prepare_enable(csi->pclk);
853 	pm_runtime_get_sync(csi->dev);
854 
855 	/* MIPI CSI TX software reset request. */
856 	for (i = 0; i < csi->pdata->rsts_num; i++) {
857 		if (csi->tx_rsts[i])
858 			reset_control_assert(csi->tx_rsts[i]);
859 	}
860 	usleep_range(20, 100);
861 	for (i = 0; i < csi->pdata->rsts_num; i++) {
862 		if (csi->tx_rsts[i])
863 			reset_control_deassert(csi->tx_rsts[i]);
864 	}
865 
866 	if (!csi->regsbak) {
867 		csi->regsbak =
868 			devm_kzalloc(csi->dev, csi->regs_len, GFP_KERNEL);
869 
870 		if (!csi->regsbak)
871 			return -ENOMEM;
872 
873 		memcpy(csi->regsbak, csi->regs, csi->regs_len);
874 	}
875 
876 	rockchip_mipi_csi_host_init(csi);
877 	rockchip_mipi_dphy_init(csi);
878 	rockchip_mipi_dphy_power_on(csi);
879 	rockchip_mipi_csi_calibration(csi);
880 	rockchip_mipi_csi_host_power_on(csi);
881 
882 	return 0;
883 }
884 
rockchip_mipi_csi_encoder_enable(struct drm_encoder * encoder)885 static void rockchip_mipi_csi_encoder_enable(struct drm_encoder *encoder)
886 {
887 	struct rockchip_mipi_csi *csi = encoder_to_csi(encoder);
888 
889 	rockchip_mipi_csi_pre_enable(csi);
890 
891 	if (csi->panel)
892 		drm_panel_prepare(csi->panel);
893 
894 	if (csi->panel)
895 		drm_panel_enable(csi->panel);
896 }
897 
898 static int
rockchip_mipi_csi_encoder_atomic_check(struct drm_encoder * encoder,struct drm_crtc_state * crtc_state,struct drm_connector_state * conn_state)899 rockchip_mipi_csi_encoder_atomic_check(struct drm_encoder *encoder,
900 				       struct drm_crtc_state *crtc_state,
901 				       struct drm_connector_state *conn_state)
902 {
903 	struct rockchip_crtc_state *s = to_rockchip_crtc_state(crtc_state);
904 	struct rockchip_mipi_csi *csi = encoder_to_csi(encoder);
905 	struct drm_connector *connector = conn_state->connector;
906 	struct drm_display_info *info = &connector->display_info;
907 
908 	switch (csi->format) {
909 	case MIPI_CSI_FMT_RAW8:
910 		s->output_mode = ROCKCHIP_OUT_MODE_P888;
911 		break;
912 	case MIPI_CSI_FMT_RAW10:
913 		s->output_mode = ROCKCHIP_OUT_MODE_P666;
914 		break;
915 	default:
916 		WARN_ON(1);
917 		s->output_mode = ROCKCHIP_OUT_MODE_P888;
918 		break;
919 	}
920 
921 	s->output_type = DRM_MODE_CONNECTOR_DSI;
922 	if (info->num_bus_formats)
923 		s->bus_format = info->bus_formats[0];
924 	else
925 		s->bus_format = MEDIA_BUS_FMT_RGB888_1X24;
926 	s->tv_state = &conn_state->tv;
927 	s->eotf = TRADITIONAL_GAMMA_SDR;
928 	s->color_space = V4L2_COLORSPACE_DEFAULT;
929 
930 	return 0;
931 }
932 
933 static const struct drm_encoder_helper_funcs
934 rockchip_mipi_csi_encoder_helper_funcs = {
935 	.mode_fixup = rockchip_mipi_csi_encoder_mode_fixup,
936 	.mode_set = rockchip_mipi_csi_encoder_mode_set,
937 	.enable = rockchip_mipi_csi_encoder_enable,
938 	.disable = rockchip_mipi_csi_encoder_disable,
939 	.atomic_check = rockchip_mipi_csi_encoder_atomic_check,
940 };
941 
942 static const struct drm_encoder_funcs rockchip_mipi_csi_encoder_funcs = {
943 	.destroy = drm_encoder_cleanup,
944 };
945 
946 static int
rockchip_mipi_csi_connector_get_modes(struct drm_connector * connector)947 rockchip_mipi_csi_connector_get_modes(struct drm_connector *connector)
948 {
949 	struct rockchip_mipi_csi *csi = con_to_csi(connector);
950 
951 	return drm_panel_get_modes(csi->panel);
952 }
953 
954 static struct drm_encoder *
rockchip_mipi_csi_connector_best_encoder(struct drm_connector * connector)955 rockchip_mipi_csi_connector_best_encoder(struct drm_connector *connector)
956 {
957 	struct rockchip_mipi_csi *csi = con_to_csi(connector);
958 
959 	return &csi->encoder;
960 }
961 
962 static int
rockchip_mipi_loader_protect(struct drm_connector * connector,bool on)963 rockchip_mipi_loader_protect(struct drm_connector *connector, bool on)
964 {
965 	struct rockchip_mipi_csi *csi = con_to_csi(connector);
966 
967 	if (csi->panel)
968 		drm_panel_loader_protect(csi->panel, on);
969 	if (on) {
970 		pm_runtime_get_sync(csi->dev);
971 		if (!csi->regsbak) {
972 			csi->regsbak = devm_kzalloc(csi->dev, csi->regs_len,
973 						    GFP_KERNEL);
974 			if (!csi->regsbak)
975 				return -ENOMEM;
976 			memcpy(csi->regsbak, csi->regs, csi->regs_len);
977 		}
978 	} else {
979 		pm_runtime_put(csi->dev);
980 	}
981 	return 0;
982 }
983 
984 static void
rockchip_mipi_csi_connector_atomic_flush(struct drm_connector * connector,struct drm_connector_state * conn_state)985 rockchip_mipi_csi_connector_atomic_flush(struct drm_connector *connector,
986 					 struct drm_connector_state *conn_state)
987 {
988 	struct rockchip_mipi_csi *csi = con_to_csi(connector);
989 	u32 mask, val;
990 
991 	rockchip_mipi_csi_path_config(csi);
992 	mask = m_CONFIG_DONE | m_CONFIG_DONE_IMD | m_CONFIG_DONE_MODE;
993 	val = v_CONFIG_DONE(0) | v_CONFIG_DONE_IMD(1) | v_CONFIG_DONE_MODE(0);
994 	csi_mask_write(csi, CSITX_CONFIG_DONE, mask, val, false);
995 }
996 
997 static const struct drm_connector_helper_funcs
998 rockchip_mipi_csi_connector_helper_funcs = {
999 	.loader_protect = rockchip_mipi_loader_protect,
1000 	.get_modes = rockchip_mipi_csi_connector_get_modes,
1001 	.best_encoder = rockchip_mipi_csi_connector_best_encoder,
1002 	.atomic_flush = rockchip_mipi_csi_connector_atomic_flush,
1003 };
1004 
1005 static enum drm_connector_status
rockchip_mipi_csi_detect(struct drm_connector * connector,bool force)1006 rockchip_mipi_csi_detect(struct drm_connector *connector, bool force)
1007 {
1008 	return connector_status_connected;
1009 }
1010 
1011 static void
rockchip_mipi_csi_drm_connector_destroy(struct drm_connector * connector)1012 rockchip_mipi_csi_drm_connector_destroy(struct drm_connector *connector)
1013 {
1014 	drm_connector_unregister(connector);
1015 	drm_connector_cleanup(connector);
1016 }
1017 
1018 static int
rockchip_mipi_csi_connector_set_property(struct drm_connector * connector,struct drm_connector_state * state,struct drm_property * property,uint64_t val)1019 rockchip_mipi_csi_connector_set_property(struct drm_connector *connector,
1020 					 struct drm_connector_state *state,
1021 					 struct drm_property *property,
1022 					 uint64_t val)
1023 {
1024 	struct rockchip_mipi_csi *csi = con_to_csi(connector);
1025 
1026 	if (property == csi->csi_tx_path_property) {
1027 		/*
1028 		 * csi->path_mode = val;
1029 		 * we get path mode from dts now
1030 		 */
1031 		return 0;
1032 	}
1033 
1034 	DRM_ERROR("failed to set mipi csi tx cproperty\n");
1035 	return -EINVAL;
1036 }
1037 
1038 static int
rockchip_mipi_csi_connector_get_property(struct drm_connector * connector,const struct drm_connector_state * state,struct drm_property * property,uint64_t * val)1039 rockchip_mipi_csi_connector_get_property(struct drm_connector *connector,
1040 					 const struct drm_connector_state *state,
1041 					 struct drm_property *property,
1042 					 uint64_t *val)
1043 {
1044 	struct rockchip_mipi_csi *csi = con_to_csi(connector);
1045 
1046 	if (property == csi->csi_tx_path_property) {
1047 		*val = csi->path_mode;
1048 		return 0;
1049 	}
1050 
1051 	DRM_ERROR("failed to get mipi csi tx cproperty\n");
1052 	return -EINVAL;
1053 }
1054 
1055 static const
1056 struct drm_connector_funcs rockchip_mipi_csi_atomic_connector_funcs = {
1057 	.dpms = drm_atomic_helper_connector_dpms,
1058 	.fill_modes = drm_helper_probe_single_connector_modes,
1059 	.detect = rockchip_mipi_csi_detect,
1060 	.destroy = rockchip_mipi_csi_drm_connector_destroy,
1061 	.reset = drm_atomic_helper_connector_reset,
1062 	.atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
1063 	.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
1064 	.atomic_set_property = rockchip_mipi_csi_connector_set_property,
1065 	.atomic_get_property = rockchip_mipi_csi_connector_get_property,
1066 };
1067 
rockchip_mipi_csi_property_create(struct rockchip_mipi_csi * csi)1068 static int rockchip_mipi_csi_property_create(struct rockchip_mipi_csi *csi)
1069 {
1070 	struct drm_property *prop;
1071 
1072 	prop = drm_property_create_range(csi->connector.dev, 0,
1073 					 "CSI-TX-PATH",
1074 					 0, 0x1);
1075 	if (prop) {
1076 		csi->csi_tx_path_property = prop;
1077 		drm_object_attach_property(&csi->connector.base, prop, 0);
1078 	}
1079 
1080 	return 0;
1081 }
1082 
rockchip_mipi_csi_register(struct drm_device * drm,struct rockchip_mipi_csi * csi)1083 static int rockchip_mipi_csi_register(struct drm_device *drm,
1084 				      struct rockchip_mipi_csi *csi)
1085 {
1086 	struct drm_encoder *encoder = &csi->encoder;
1087 	struct drm_connector *connector = &csi->connector;
1088 	struct device *dev = csi->dev;
1089 	int ret;
1090 
1091 	encoder->possible_crtcs = rockchip_drm_of_find_possible_crtcs(drm,
1092 								      dev->of_node);
1093 	/*
1094 	 * If we failed to find the CRTC(s) which this encoder is
1095 	 * supposed to be connected to, it's because the CRTC has
1096 	 * not been registered yet.  Defer probing, and hope that
1097 	 * the required CRTC is added later.
1098 	 */
1099 	if (encoder->possible_crtcs == 0)
1100 		return -EPROBE_DEFER;
1101 
1102 	drm_encoder_helper_add(&csi->encoder,
1103 			       &rockchip_mipi_csi_encoder_helper_funcs);
1104 	ret = drm_encoder_init(drm, &csi->encoder,
1105 			       &rockchip_mipi_csi_encoder_funcs,
1106 			       DRM_MODE_ENCODER_DSI, NULL);
1107 	if (ret) {
1108 		dev_err(dev, "Failed to initialize encoder with drm\n");
1109 		return ret;
1110 	}
1111 
1112 	csi->connector.port = dev->of_node;
1113 	ret = drm_connector_init(drm, &csi->connector,
1114 				 &rockchip_mipi_csi_atomic_connector_funcs,
1115 				 DRM_MODE_CONNECTOR_DSI);
1116 	if (ret) {
1117 		dev_err(dev, "Failed to initialize connector\n");
1118 		goto encoder_cleanup;
1119 	}
1120 
1121 	drm_connector_helper_add(connector,
1122 				 &rockchip_mipi_csi_connector_helper_funcs);
1123 
1124 	drm_mode_connector_attach_encoder(connector, encoder);
1125 
1126 	ret = drm_panel_attach(csi->panel, &csi->connector);
1127 	if (ret) {
1128 		dev_err(dev, "Failed to attach panel: %d\n", ret);
1129 		goto connector_cleanup;
1130 	}
1131 	return 0;
1132 
1133 connector_cleanup:
1134 	drm_connector_cleanup(connector);
1135 encoder_cleanup:
1136 	drm_encoder_cleanup(encoder);
1137 	return ret;
1138 }
1139 
rockchip_mipi_csi_bind(struct device * dev,struct device * master,void * data)1140 static int rockchip_mipi_csi_bind(struct device *dev, struct device *master,
1141 				  void *data)
1142 {
1143 	struct drm_device *drm = data;
1144 	struct rockchip_mipi_csi *csi = dev_get_drvdata(dev);
1145 	int ret;
1146 
1147 	csi->panel = of_drm_find_panel(csi->client);
1148 	if (!csi->panel) {
1149 		DRM_ERROR("failed to find panel\n");
1150 		return -EPROBE_DEFER;
1151 	}
1152 
1153 	ret = rockchip_mipi_csi_register(drm, csi);
1154 	if (ret) {
1155 		dev_err(dev, "Failed to register mipi_csi: %d\n", ret);
1156 		return ret;
1157 	}
1158 
1159 	rockchip_mipi_csi_property_create(csi);
1160 	pm_runtime_enable(dev);
1161 
1162 	return ret;
1163 }
1164 
rockchip_mipi_csi_unbind(struct device * dev,struct device * master,void * data)1165 static void rockchip_mipi_csi_unbind(struct device *dev, struct device *master,
1166 				     void *data)
1167 {
1168 	pm_runtime_disable(dev);
1169 }
1170 
1171 static const struct component_ops rockchip_mipi_csi_ops = {
1172 	.bind	= rockchip_mipi_csi_bind,
1173 	.unbind	= rockchip_mipi_csi_unbind,
1174 };
1175 
rockchip_mipi_csi_irq_handler(int irq,void * data)1176 static irqreturn_t rockchip_mipi_csi_irq_handler(int irq, void *data)
1177 {
1178 	struct rockchip_mipi_csi *csi = data;
1179 	u32 int_status, err_int_status;
1180 	unsigned int i;
1181 
1182 	int_status = csi_readl(csi, CSITX_INTR_STATUS);
1183 	err_int_status = csi_readl(csi, CSITX_ERR_INTR_STATUS);
1184 
1185 	for (i = 0; i < ARRAY_SIZE(csi_tx_intr); i++)
1186 		if (int_status & BIT(i))
1187 			DRM_DEV_ERROR_RATELIMITED(csi->dev, "%s\n",
1188 						  csi_tx_intr[i]);
1189 
1190 	for (i = 0; i < ARRAY_SIZE(csi_tx_err_intr); i++)
1191 		if (err_int_status & BIT(i))
1192 			DRM_DEV_ERROR_RATELIMITED(csi->dev, "%s\n",
1193 						  csi_tx_err_intr[i]);
1194 	writel(int_status | m_INTR_MASK, csi->regs + CSITX_INTR_CLR);
1195 	writel(err_int_status | m_ERR_INTR_MASK,
1196 	       csi->regs + CSITX_ERR_INTR_CLR);
1197 
1198 	return IRQ_HANDLED;
1199 }
1200 
rockchip_mipi_dphy_attach(struct rockchip_mipi_csi * csi)1201 static int rockchip_mipi_dphy_attach(struct rockchip_mipi_csi *csi)
1202 {
1203 	struct device *dev = csi->dev;
1204 	int ret;
1205 
1206 	csi->dphy.phy = devm_phy_optional_get(dev, "mipi_dphy");
1207 	if (IS_ERR(csi->dphy.phy)) {
1208 		ret = PTR_ERR(csi->dphy.phy);
1209 		dev_err(dev, "failed to get mipi dphy: %d\n", ret);
1210 		return ret;
1211 	}
1212 
1213 	if (csi->dphy.phy) {
1214 		dev_dbg(dev, "Use Non-SNPS PHY\n");
1215 
1216 		csi->dphy.hs_clk = devm_clk_get(dev, "hs_clk");
1217 		if (IS_ERR(csi->dphy.hs_clk)) {
1218 			dev_err(dev, "failed to get PHY high-speed clock\n");
1219 			return PTR_ERR(csi->dphy.hs_clk);
1220 		}
1221 	} else {
1222 		dev_dbg(dev, "Use SNPS PHY\n");
1223 		csi->dphy.ref_clk = devm_clk_get(dev, "ref");
1224 		if (IS_ERR(csi->dphy.ref_clk)) {
1225 			dev_err(dev, "failed to get PHY reference clock\n");
1226 			return PTR_ERR(csi->dphy.ref_clk);
1227 		}
1228 	}
1229 
1230 	return 0;
1231 }
1232 
dw_mipi_csi_parse_dt(struct rockchip_mipi_csi * csi)1233 static int dw_mipi_csi_parse_dt(struct rockchip_mipi_csi *csi)
1234 {
1235 	struct device *dev = csi->dev;
1236 	struct device_node *np = dev->of_node;
1237 	struct device_node *endpoint, *remote = NULL;
1238 
1239 	endpoint = of_graph_get_endpoint_by_regs(np, 1, -1);
1240 	if (endpoint) {
1241 		remote = of_graph_get_remote_port_parent(endpoint);
1242 
1243 		of_node_put(endpoint);
1244 		if (!remote) {
1245 			dev_err(dev, "no panel/bridge connected\n");
1246 			return -ENODEV;
1247 		}
1248 		of_node_put(remote);
1249 	}
1250 
1251 	csi->client = remote;
1252 
1253 	return 0;
1254 }
1255 
rockchip_mipi_csi_probe(struct platform_device * pdev)1256 static int rockchip_mipi_csi_probe(struct platform_device *pdev)
1257 {
1258 	struct device *dev = &pdev->dev;
1259 	struct rockchip_mipi_csi *csi;
1260 	struct device_node *np = dev->of_node;
1261 	struct resource *res;
1262 	int ret, val, i;
1263 
1264 	csi = devm_kzalloc(dev, sizeof(*csi), GFP_KERNEL);
1265 	if (!csi)
1266 		return -ENOMEM;
1267 
1268 	csi->dev = dev;
1269 	csi->pdata = of_device_get_match_data(dev);
1270 	platform_set_drvdata(pdev, csi);
1271 
1272 	ret = dw_mipi_csi_parse_dt(csi);
1273 	if (ret) {
1274 		dev_err(dev, "failed to parse DT\n");
1275 		return ret;
1276 	}
1277 
1278 	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "csi_regs");
1279 	csi->regs = devm_ioremap_resource(dev, res);
1280 	if (IS_ERR(csi->regs))
1281 		return PTR_ERR(csi->regs);
1282 	csi->regs_len = resource_size(res);
1283 	csi->regsbak = NULL;
1284 
1285 	res = platform_get_resource_byname(pdev,
1286 					   IORESOURCE_MEM, "test_code_regs");
1287 	if (res) {
1288 		csi->test_code_regs = devm_ioremap_resource(dev, res);
1289 		if (IS_ERR(csi->test_code_regs))
1290 			dev_err(dev, "Unable to get test_code_regs\n");
1291 	}
1292 
1293 	csi->irq = platform_get_irq(pdev, 0);
1294 	if (csi->irq < 0) {
1295 		dev_err(dev, "Failed to ger csi tx irq\n");
1296 		return -EINVAL;
1297 	}
1298 
1299 	csi->pclk = devm_clk_get(dev, "pclk");
1300 	if (IS_ERR(csi->pclk)) {
1301 		ret = PTR_ERR(csi->pclk);
1302 		dev_err(dev, "Unable to get pclk: %d\n", ret);
1303 		return ret;
1304 	}
1305 
1306 	csi->grf = syscon_regmap_lookup_by_phandle(np, "rockchip,grf");
1307 	if (IS_ERR(csi->grf)) {
1308 		dev_err(dev, "Unable to get rockchip,grf\n");
1309 		csi->grf = NULL;
1310 	}
1311 
1312 	for (i = 0; i < csi->pdata->rsts_num; i++) {
1313 		struct reset_control *rst =
1314 			devm_reset_control_get(dev, csi->pdata->rsts[i]);
1315 		if (IS_ERR(rst)) {
1316 			dev_err(dev, "failed to get %s\n", csi->pdata->rsts[i]);
1317 			return PTR_ERR(rst);
1318 		}
1319 		csi->tx_rsts[i] = rst;
1320 	}
1321 
1322 	ret = rockchip_mipi_dphy_attach(csi);
1323 	if (ret)
1324 		return ret;
1325 
1326 	ret = devm_request_irq(dev, csi->irq, rockchip_mipi_csi_irq_handler,
1327 			       IRQF_SHARED, dev_name(dev), csi);
1328 	if (ret) {
1329 		dev_err(dev, "failed to request irq: %d\n", ret);
1330 		return ret;
1331 	}
1332 
1333 	csi->dsi_host.ops = &rockchip_mipi_csi_host_ops;
1334 	csi->dsi_host.dev = dev;
1335 
1336 	ret = mipi_dsi_host_register(&csi->dsi_host);
1337 	if (ret)
1338 		return ret;
1339 
1340 	ret = component_add(dev, &rockchip_mipi_csi_ops);
1341 	if (ret)
1342 		mipi_dsi_host_unregister(&csi->dsi_host);
1343 
1344 	if (!of_property_read_u32(np, "csi-tx-bypass-mode", &val))
1345 		csi->path_mode = val;
1346 
1347 	return ret;
1348 }
1349 
rockchip_mipi_csi_remove(struct platform_device * pdev)1350 static int rockchip_mipi_csi_remove(struct platform_device *pdev)
1351 {
1352 	struct rockchip_mipi_csi *csi = dev_get_drvdata(&pdev->dev);
1353 
1354 	if (csi)
1355 		mipi_dsi_host_unregister(&csi->dsi_host);
1356 	component_del(&pdev->dev, &rockchip_mipi_csi_ops);
1357 	return 0;
1358 }
1359 
1360 static const u32 rk1808_csi_grf_reg_fields[MAX_FIELDS] = {
1361 	[DPHY_SEL]		= GRF_REG_FIELD(0x0440,  8,  8),
1362 	[TXSKEWCALHS]		= GRF_REG_FIELD(0x0444, 11, 15),
1363 	[FORCETXSTOPMODE]	= GRF_REG_FIELD(0x0444,  7, 10),
1364 	[FORCERXMODE]		= GRF_REG_FIELD(0x0444,  6,  6),
1365 	[TURNDISABLE]		= GRF_REG_FIELD(0x0444,  5,  5),
1366 };
1367 
1368 static const char * const rk1808_csi_tx_rsts[] = {
1369 	"tx_apb",
1370 	"tx_bytehs",
1371 	"tx_esc",
1372 	"tx_cam",
1373 	"tx_i",
1374 };
1375 
1376 static const struct rockchip_mipi_csi_plat_data rk1808_socdata = {
1377 	.csi0_grf_reg_fields = rk1808_csi_grf_reg_fields,
1378 	.max_bit_rate_per_lane = 2000000000UL,
1379 	.soc_type = RK1808,
1380 	.rsts = rk1808_csi_tx_rsts,
1381 	.rsts_num = ARRAY_SIZE(rk1808_csi_tx_rsts),
1382 };
1383 
1384 static const struct of_device_id rockchip_mipi_csi_dt_ids[] = {
1385 	{ .compatible = "rockchip,rk1808-mipi-csi", .data = &rk1808_socdata, },
1386 	{ /* sentinel */ }
1387 };
1388 MODULE_DEVICE_TABLE(of, rockchip_mipi_csi_dt_ids);
1389 
1390 static struct platform_driver rockchip_mipi_csi_driver = {
1391 	.probe		= rockchip_mipi_csi_probe,
1392 	.remove		= rockchip_mipi_csi_remove,
1393 	.driver		= {
1394 		.of_match_table = rockchip_mipi_csi_dt_ids,
1395 		.name	= DRIVER_NAME,
1396 	},
1397 };
1398 module_platform_driver(rockchip_mipi_csi_driver);
1399 
1400 MODULE_DESCRIPTION("ROCKCHIP MIPI CSI TX controller driver");
1401 MODULE_AUTHOR("Sandy huang <hjc@rock-chips.com>");
1402 MODULE_LICENSE("GPL");
1403 MODULE_ALIAS("platform:" DRIVER_NAME);
1404