xref: /rk3399_rockchip-uboot/drivers/video/drm/dw_mipi_dsi.c (revision f36ea2f6e17621c4d9dd97c4dbfab62d03d061df)
1 /*
2  * (C) Copyright 2008-2017 Fuzhou Rockchip Electronics Co., Ltd
3  *
4  * SPDX-License-Identifier:	GPL-2.0+
5  */
6 
7 #include <drm/drm_mipi_dsi.h>
8 
9 #include <config.h>
10 #include <common.h>
11 #include <errno.h>
12 #include <asm/unaligned.h>
13 #include <asm/io.h>
14 #include <asm/hardware.h>
15 #include <dm/device.h>
16 #include <dm/read.h>
17 #include <dm/of_access.h>
18 #include <syscon.h>
19 #include <asm/arch-rockchip/clock.h>
20 #include <linux/iopoll.h>
21 
22 #include "rockchip_display.h"
23 #include "rockchip_crtc.h"
24 #include "rockchip_connector.h"
25 #include "rockchip_panel.h"
26 #include "rockchip_phy.h"
27 
28 #define UPDATE(v, h, l)		(((v) << (l)) & GENMASK((h), (l)))
29 
30 #define DSI_VERSION			0x00
31 #define DSI_PWR_UP			0x04
32 #define RESET				0
33 #define POWERUP				BIT(0)
34 
35 #define DSI_CLKMGR_CFG			0x08
36 #define TO_CLK_DIVIDSION(div)		(((div) & 0xff) << 8)
37 #define TX_ESC_CLK_DIVIDSION(div)	(((div) & 0xff) << 0)
38 
39 #define DSI_DPI_VCID			0x0c
40 #define DPI_VID(vid)			(((vid) & 0x3) << 0)
41 
42 #define DSI_DPI_COLOR_CODING		0x10
43 #define EN18_LOOSELY			BIT(8)
44 #define DPI_COLOR_CODING_16BIT_1	0x0
45 #define DPI_COLOR_CODING_16BIT_2	0x1
46 #define DPI_COLOR_CODING_16BIT_3	0x2
47 #define DPI_COLOR_CODING_18BIT_1	0x3
48 #define DPI_COLOR_CODING_18BIT_2	0x4
49 #define DPI_COLOR_CODING_24BIT		0x5
50 
51 #define DSI_DPI_CFG_POL			0x14
52 #define COLORM_ACTIVE_LOW		BIT(4)
53 #define SHUTD_ACTIVE_LOW		BIT(3)
54 #define HSYNC_ACTIVE_LOW		BIT(2)
55 #define VSYNC_ACTIVE_LOW		BIT(1)
56 #define DATAEN_ACTIVE_LOW		BIT(0)
57 
58 #define DSI_DPI_LP_CMD_TIM		0x18
59 #define OUTVACT_LPCMD_TIME(p)		(((p) & 0xff) << 16)
60 #define INVACT_LPCMD_TIME(p)		((p) & 0xff)
61 
62 #define DSI_DBI_VCID			0x1c
63 #define DBI_VCID(x)			UPDATE(x, 1, 0)
64 #define DSI_DBI_CFG			0x20
65 #define DSI_DBI_CMDSIZE			0x28
66 
67 #define DSI_PCKHDL_CFG			0x2c
68 #define CRC_RX_EN			BIT(4)
69 #define ECC_RX_EN			BIT(3)
70 #define BTA_EN				BIT(2)
71 #define EOTP_RX_EN			BIT(1)
72 #define EOTP_TX_EN			BIT(0)
73 #define DSI_MODE_CFG			0x34
74 #define CMD_VIDEO_MODE			BIT(0)
75 #define COMMAND_MODE			BIT(0)
76 #define VIDEO_MODE			0
77 #define DSI_VID_MODE_CFG		0x38
78 #define VPG_EN				BIT(16)
79 #define LP_CMD_EN			BIT(15)
80 #define FRAME_BTA_ACK			BIT(14)
81 #define LP_HFP_EN			BIT(13)
82 #define LP_HBP_EN			BIT(12)
83 #define LP_VACT_EN			BIT(11)
84 #define LP_VFP_EN			BIT(10)
85 #define LP_VBP_EN			BIT(9)
86 #define LP_VSA_EN			BIT(8)
87 #define VID_MODE_TYPE_BURST_SYNC_PULSES	0x0
88 #define VID_MODE_TYPE_BURST_SYNC_EVENTS	0x1
89 #define VID_MODE_TYPE_BURST		0x2
90 
91 #define DSI_VID_PKT_SIZE		0x3c
92 #define VID_PKT_SIZE(p)			(((p) & 0x3fff) << 0)
93 #define VID_PKT_MAX_SIZE		0x3fff
94 
95 #define DSI_VID_NUM_CHUMKS		0x40
96 #define DSI_VID_NULL_PKT_SIZE		0x44
97 #define DSI_VID_HSA_TIME		0x48
98 #define DSI_VID_HBP_TIME		0x4c
99 #define DSI_VID_HLINE_TIME		0x50
100 #define DSI_VID_VSA_LINES		0x54
101 #define DSI_VID_VBP_LINES		0x58
102 #define DSI_VID_VFP_LINES		0x5c
103 #define DSI_VID_VACTIVE_LINES		0x60
104 #define DSI_EDPI_CMD_SIZE		0x64
105 #define DSI_CMD_MODE_CFG		0x68
106 #define MAX_RD_PKT_SIZE			BIT(24)
107 #define DCS_LW_TX			BIT(19)
108 #define DCS_SR_0P_TX			BIT(18)
109 #define DCS_SW_1P_TX			BIT(17)
110 #define DCS_SW_0P_TX			BIT(16)
111 #define GEN_LW_TX			BIT(14)
112 #define GEN_SR_2P_TX			BIT(13)
113 #define GEN_SR_1P_TX			BIT(12)
114 #define GEN_SR_0P_TX			BIT(11)
115 #define GEN_SW_2P_TX			BIT(10)
116 #define GEN_SW_1P_TX			BIT(9)
117 #define GEN_SW_0P_TX			BIT(8)
118 #define ACK_RQST_EN			BIT(1)
119 #define TEAR_FX_EN			BIT(0)
120 
121 #define DSI_GEN_HDR			0x6c
122 #define GEN_HDATA(data)			(((data) & 0xffff) << 8)
123 #define GEN_HDATA_MASK			(0xffff << 8)
124 #define GEN_HTYPE(type)			(((type) & 0xff) << 0)
125 #define GEN_HTYPE_MASK			0xff
126 
127 #define DSI_GEN_PLD_DATA		0x70
128 
129 #define DSI_CMD_PKT_STATUS		0x74
130 #define GEN_CMD_EMPTY			BIT(0)
131 #define GEN_CMD_FULL			BIT(1)
132 #define GEN_PLD_W_EMPTY			BIT(2)
133 #define GEN_PLD_W_FULL			BIT(3)
134 #define GEN_PLD_R_EMPTY			BIT(4)
135 #define GEN_PLD_R_FULL			BIT(5)
136 #define GEN_RD_CMD_BUSY			BIT(6)
137 
138 #define DSI_TO_CNT_CFG			0x78
139 #define HSTX_TO_CNT(p)			(((p) & 0xffff) << 16)
140 #define LPRX_TO_CNT(p)			((p) & 0xffff)
141 
142 #define DSI_BTA_TO_CNT			0x8c
143 #define DSI_LPCLK_CTRL			0x94
144 #define AUTO_CLKLANE_CTRL		BIT(1)
145 #define PHY_TXREQUESTCLKHS		BIT(0)
146 
147 #define DSI_PHY_TMR_LPCLK_CFG		0x98
148 #define PHY_CLKHS2LP_TIME(lbcc)		(((lbcc) & 0x3ff) << 16)
149 #define PHY_CLKLP2HS_TIME(lbcc)		((lbcc) & 0x3ff)
150 
151 #define DSI_PHY_TMR_CFG			0x9c
152 #define PHY_HS2LP_TIME(lbcc)		(((lbcc) & 0xff) << 24)
153 #define PHY_LP2HS_TIME(lbcc)		(((lbcc) & 0xff) << 16)
154 #define MAX_RD_TIME(lbcc)		((lbcc) & 0x7fff)
155 
156 #define DSI_PHY_RSTZ			0xa0
157 #define PHY_ENFORCEPLL			BIT(3)
158 #define PHY_ENABLECLK			BIT(2)
159 #define PHY_RSTZ			BIT(1)
160 #define PHY_SHUTDOWNZ			BIT(0)
161 
162 #define DSI_PHY_IF_CFG			0xa4
163 #define N_LANES(n)			((((n) - 1) & 0x3) << 0)
164 #define PHY_STOP_WAIT_TIME(cycle)	(((cycle) & 0xff) << 8)
165 
166 #define DSI_PHY_STATUS			0xb0
167 #define PHY_STOPSTATE0LANE		BIT(4)
168 #define PHY_STOPSTATECLKLANE		BIT(2)
169 #define PHY_LOCK			BIT(0)
170 #define PHY_STOPSTATELANE		(PHY_STOPSTATE0LANE | \
171 					 PHY_STOPSTATECLKLANE)
172 
173 #define DSI_PHY_TST_CTRL0		0xb4
174 #define PHY_TESTCLK			BIT(1)
175 #define PHY_TESTCLR			BIT(0)
176 
177 #define DSI_PHY_TST_CTRL1		0xb8
178 #define PHY_TESTEN			BIT(16)
179 #define PHY_TESTDOUT_SHIFT		8
180 #define PHY_TESTDIN_MASK		GENMASK(7, 0)
181 #define PHY_TESTDIN(x)			UPDATE(x, 7, 0)
182 
183 #define DSI_INT_ST0			0xbc
184 #define DSI_INT_ST1			0xc0
185 #define DSI_INT_MSK0			0xc4
186 #define DSI_INT_MSK1			0xc8
187 
188 #define PHY_STATUS_TIMEOUT_US		10000
189 #define CMD_PKT_STATUS_TIMEOUT_US	20000
190 
191 /* Test Code: 0x44 (HS RX Control of Lane 0) */
192 #define HSFREQRANGE(x)			UPDATE(x, 6, 1)
193 /* Test Code: 0x17 (PLL Input Divider Ratio) */
194 #define INPUT_DIV(x)			UPDATE(x, 6, 0)
195 /* Test Code: 0x18 (PLL Loop Divider Ratio) */
196 #define FEEDBACK_DIV_LO(x)		UPDATE(x, 4, 0)
197 #define FEEDBACK_DIV_HI(x)		(BIT(7) | UPDATE(x, 3, 0))
198 
199 #define GRF_REG_FIELD(reg, lsb, msb)	(((reg) << 10) | ((lsb) << 5) | (msb))
200 
201 enum grf_reg_fields {
202 	DPIUPDATECFG,
203 	DPISHUTDN,
204 	DPICOLORM,
205 	VOPSEL,
206 	TURNREQUEST,
207 	TURNDISABLE,
208 	SKEWCALHS,
209 	FORCETXSTOPMODE,
210 	FORCERXMODE,
211 	ENABLE_N,
212 	MASTERSLAVEZ,
213 	ENABLECLK,
214 	BASEDIR,
215 	MAX_FIELDS,
216 };
217 
218 struct dw_mipi_dsi_plat_data {
219 	const u32 *dsi0_grf_reg_fields;
220 	const u32 *dsi1_grf_reg_fields;
221 	unsigned long max_bit_rate_per_lane;
222 };
223 
224 struct mipi_dphy {
225 	/* Non-SNPS PHY */
226 	struct rockchip_phy *phy;
227 
228 	u16 input_div;
229 	u16 feedback_div;
230 };
231 
232 struct dw_mipi_dsi {
233 	struct udevice *dev;
234 	void *base;
235 	void *grf;
236 	int id;
237 	struct dw_mipi_dsi *master;
238 	struct dw_mipi_dsi *slave;
239 	bool prepared;
240 
241 	unsigned int lane_mbps; /* per lane */
242 	u32 channel;
243 	u32 lanes;
244 	u32 format;
245 	u32 mode_flags;
246 	struct mipi_dphy dphy;
247 	struct drm_display_mode mode;
248 	bool data_swap;
249 
250 	const struct dw_mipi_dsi_plat_data *pdata;
251 };
252 
253 static inline void dsi_write(struct dw_mipi_dsi *dsi, u32 reg, u32 val)
254 {
255 	writel(val, dsi->base + reg);
256 }
257 
258 static inline u32 dsi_read(struct dw_mipi_dsi *dsi, u32 reg)
259 {
260 	return readl(dsi->base + reg);
261 }
262 
263 static inline void dsi_update_bits(struct dw_mipi_dsi *dsi,
264 				   u32 reg, u32 mask, u32 val)
265 {
266 	u32 orig, tmp;
267 
268 	orig = dsi_read(dsi, reg);
269 	tmp = orig & ~mask;
270 	tmp |= val & mask;
271 	dsi_write(dsi, reg, tmp);
272 }
273 
274 static void grf_field_write(struct dw_mipi_dsi *dsi, enum grf_reg_fields index,
275 			    unsigned int val)
276 {
277 	const u32 field = dsi->id ? dsi->pdata->dsi1_grf_reg_fields[index] :
278 			  dsi->pdata->dsi0_grf_reg_fields[index];
279 	u16 reg;
280 	u8 msb, lsb;
281 
282 	if (!field)
283 		return;
284 
285 	reg = (field >> 10) & 0x3ffff;
286 	lsb = (field >>  5) & 0x1f;
287 	msb = (field >>  0) & 0x1f;
288 
289 	rk_clrsetreg(dsi->grf + reg, GENMASK(msb, lsb), val << lsb);
290 }
291 
292 static inline void dpishutdn_assert(struct dw_mipi_dsi *dsi)
293 {
294 	grf_field_write(dsi, DPISHUTDN, 1);
295 }
296 
297 static inline void dpishutdn_deassert(struct dw_mipi_dsi *dsi)
298 {
299 	grf_field_write(dsi, DPISHUTDN, 0);
300 }
301 
302 static int genif_wait_w_pld_fifo_not_full(struct dw_mipi_dsi *dsi)
303 {
304 	u32 sts;
305 	int ret;
306 
307 	ret = readl_poll_timeout(dsi->base + DSI_CMD_PKT_STATUS,
308 				 sts, !(sts & GEN_PLD_W_FULL),
309 				 CMD_PKT_STATUS_TIMEOUT_US);
310 	if (ret < 0) {
311 		printf("generic write payload fifo is full\n");
312 		return ret;
313 	}
314 
315 	return 0;
316 }
317 
318 static int genif_wait_cmd_fifo_not_full(struct dw_mipi_dsi *dsi)
319 {
320 	u32 sts;
321 	int ret;
322 
323 	ret = readl_poll_timeout(dsi->base + DSI_CMD_PKT_STATUS,
324 				 sts, !(sts & GEN_CMD_FULL),
325 				 CMD_PKT_STATUS_TIMEOUT_US);
326 	if (ret < 0) {
327 		printf("generic write cmd fifo is full\n");
328 		return ret;
329 	}
330 
331 	return 0;
332 }
333 
334 static int genif_wait_write_fifo_empty(struct dw_mipi_dsi *dsi)
335 {
336 	u32 sts;
337 	u32 mask;
338 	int ret;
339 
340 	mask = GEN_CMD_EMPTY | GEN_PLD_W_EMPTY;
341 	ret = readl_poll_timeout(dsi->base + DSI_CMD_PKT_STATUS,
342 				 sts, (sts & mask) == mask,
343 				 CMD_PKT_STATUS_TIMEOUT_US);
344 	if (ret < 0) {
345 		printf("generic write fifo is full\n");
346 		return ret;
347 	}
348 
349 	return 0;
350 }
351 
352 static inline void mipi_dphy_enableclk_assert(struct dw_mipi_dsi *dsi)
353 {
354 	dsi_update_bits(dsi, DSI_PHY_RSTZ, PHY_ENABLECLK, PHY_ENABLECLK);
355 	udelay(1);
356 }
357 
358 static inline void mipi_dphy_enableclk_deassert(struct dw_mipi_dsi *dsi)
359 {
360 	dsi_update_bits(dsi, DSI_PHY_RSTZ, PHY_ENABLECLK, 0);
361 	udelay(1);
362 }
363 
364 static inline void mipi_dphy_shutdownz_assert(struct dw_mipi_dsi *dsi)
365 {
366 	dsi_update_bits(dsi, DSI_PHY_RSTZ, PHY_SHUTDOWNZ, 0);
367 	udelay(1);
368 }
369 
370 static inline void mipi_dphy_shutdownz_deassert(struct dw_mipi_dsi *dsi)
371 {
372 	dsi_update_bits(dsi, DSI_PHY_RSTZ, PHY_SHUTDOWNZ, PHY_SHUTDOWNZ);
373 	udelay(1);
374 }
375 
376 static inline void mipi_dphy_rstz_assert(struct dw_mipi_dsi *dsi)
377 {
378 	dsi_update_bits(dsi, DSI_PHY_RSTZ, PHY_RSTZ, 0);
379 	udelay(1);
380 }
381 
382 static inline void mipi_dphy_rstz_deassert(struct dw_mipi_dsi *dsi)
383 {
384 	dsi_update_bits(dsi, DSI_PHY_RSTZ, PHY_RSTZ, PHY_RSTZ);
385 	udelay(1);
386 }
387 
388 static inline void testif_testclk_assert(struct dw_mipi_dsi *dsi)
389 {
390 	dsi_update_bits(dsi, DSI_PHY_TST_CTRL0, PHY_TESTCLK, PHY_TESTCLK);
391 	udelay(1);
392 }
393 
394 static inline void testif_testclk_deassert(struct dw_mipi_dsi *dsi)
395 {
396 	dsi_update_bits(dsi, DSI_PHY_TST_CTRL0, PHY_TESTCLK, 0);
397 	udelay(1);
398 }
399 
400 static inline void testif_testclr_assert(struct dw_mipi_dsi *dsi)
401 {
402 	dsi_update_bits(dsi, DSI_PHY_TST_CTRL0, PHY_TESTCLR, PHY_TESTCLR);
403 	udelay(1);
404 }
405 
406 static inline void testif_testclr_deassert(struct dw_mipi_dsi *dsi)
407 {
408 	dsi_update_bits(dsi, DSI_PHY_TST_CTRL0, PHY_TESTCLR, 0);
409 	udelay(1);
410 }
411 
412 static inline void testif_testen_assert(struct dw_mipi_dsi *dsi)
413 {
414 	dsi_update_bits(dsi, DSI_PHY_TST_CTRL1, PHY_TESTEN, PHY_TESTEN);
415 	udelay(1);
416 }
417 
418 static inline void testif_testen_deassert(struct dw_mipi_dsi *dsi)
419 {
420 	dsi_update_bits(dsi, DSI_PHY_TST_CTRL1, PHY_TESTEN, 0);
421 	udelay(1);
422 }
423 
424 static inline void testif_set_data(struct dw_mipi_dsi *dsi, u8 data)
425 {
426 	dsi_update_bits(dsi, DSI_PHY_TST_CTRL1,
427 			PHY_TESTDIN_MASK, PHY_TESTDIN(data));
428 	udelay(1);
429 }
430 
431 static inline u8 testif_get_data(struct dw_mipi_dsi *dsi)
432 {
433 	return dsi_read(dsi, DSI_PHY_TST_CTRL1) >> PHY_TESTDOUT_SHIFT;
434 }
435 
436 static void testif_test_code_write(struct dw_mipi_dsi *dsi, u8 test_code)
437 {
438 	testif_testclk_assert(dsi);
439 	testif_set_data(dsi, test_code);
440 	testif_testen_assert(dsi);
441 	testif_testclk_deassert(dsi);
442 	testif_testen_deassert(dsi);
443 }
444 
445 static void testif_test_data_write(struct dw_mipi_dsi *dsi, u8 test_data)
446 {
447 	testif_testclk_deassert(dsi);
448 	testif_set_data(dsi, test_data);
449 	testif_testclk_assert(dsi);
450 }
451 
452 static void testif_write(struct dw_mipi_dsi *dsi, u8 test_code, u8 test_data)
453 {
454 	testif_test_code_write(dsi, test_code);
455 	testif_test_data_write(dsi, test_data);
456 
457 	dev_dbg(dsi->dev,
458 		"test_code=0x%02x, test_data=0x%02x, monitor_data=0x%02x\n",
459 		test_code, test_data, testif_get_data(dsi));
460 }
461 
462 static int mipi_dphy_power_on(struct dw_mipi_dsi *dsi)
463 {
464 	u32 mask, val;
465 	int ret;
466 
467 	mipi_dphy_shutdownz_deassert(dsi);
468 	mipi_dphy_rstz_deassert(dsi);
469 	mdelay(2);
470 
471 	if (dsi->dphy.phy) {
472 		rockchip_phy_set_mode(dsi->dphy.phy, PHY_MODE_VIDEO_MIPI);
473 		rockchip_phy_power_on(dsi->dphy.phy);
474 	}
475 
476 	ret = readl_poll_timeout(dsi->base + DSI_PHY_STATUS,
477 				 val, val & PHY_LOCK, PHY_STATUS_TIMEOUT_US);
478 	if (ret < 0) {
479 		dev_err(dsi->dev, "PHY is not locked\n");
480 		return ret;
481 	}
482 
483 	udelay(200);
484 
485 	mask = PHY_STOPSTATELANE;
486 	ret = readl_poll_timeout(dsi->base + DSI_PHY_STATUS,
487 				 val, (val & mask) == mask,
488 				 PHY_STATUS_TIMEOUT_US);
489 	if (ret < 0) {
490 		dev_err(dsi->dev, "lane module is not in stop state\n");
491 		return ret;
492 	}
493 
494 	udelay(10);
495 
496 	return 0;
497 }
498 
499 static void dw_mipi_dsi_phy_init(struct dw_mipi_dsi *dsi)
500 {
501 	/* Table 5-1 Frequency Ranges */
502 	const struct {
503 		unsigned long max_lane_mbps;
504 		u8 hsfreqrange;
505 	} hsfreqrange_table[] = {
506 		{  90, 0x00}, { 100, 0x10}, { 110, 0x20}, { 130, 0x01},
507 		{ 140, 0x11}, { 150, 0x21}, { 170, 0x02}, { 180, 0x12},
508 		{ 200, 0x22}, { 220, 0x03}, { 240, 0x13}, { 250, 0x23},
509 		{ 270, 0x04}, { 300, 0x14}, { 330, 0x05}, { 360, 0x15},
510 		{ 400, 0x25}, { 450, 0x06}, { 500, 0x16}, { 550, 0x07},
511 		{ 600, 0x17}, { 650, 0x08}, { 700, 0x18}, { 750, 0x09},
512 		{ 800, 0x19}, { 850, 0x29}, { 900, 0x39}, { 950, 0x0a},
513 		{1000, 0x1a}, {1050, 0x2a}, {1100, 0x3a}, {1150, 0x0b},
514 		{1200, 0x1b}, {1250, 0x2b}, {1300, 0x3b}, {1350, 0x0c},
515 		{1400, 0x1c}, {1450, 0x2c}, {1500, 0x3c}
516 	};
517 	u8 hsfreqrange, counter;
518 	unsigned int index, txbyteclkhs;
519 	u16 n, m;
520 
521 	for (index = 0; index < ARRAY_SIZE(hsfreqrange_table); index++)
522 		if (dsi->lane_mbps <= hsfreqrange_table[index].max_lane_mbps)
523 			break;
524 
525 	if (index == ARRAY_SIZE(hsfreqrange_table))
526 		--index;
527 
528 	hsfreqrange = hsfreqrange_table[index].hsfreqrange;
529 	testif_write(dsi, 0x44, HSFREQRANGE(hsfreqrange));
530 
531 	txbyteclkhs = dsi->lane_mbps >> 3;
532 	counter = txbyteclkhs * 60 / 1000;
533 	testif_write(dsi, 0x60, 0x80 | counter);
534 	testif_write(dsi, 0x70, 0x80 | counter);
535 
536 	n = dsi->dphy.input_div - 1;
537 	m = dsi->dphy.feedback_div - 1;
538 	testif_write(dsi, 0x19, 0x30);
539 	testif_write(dsi, 0x17, INPUT_DIV(n));
540 	testif_write(dsi, 0x18, FEEDBACK_DIV_LO(m));
541 	testif_write(dsi, 0x18, FEEDBACK_DIV_HI(m >> 5));
542 }
543 
544 static unsigned long dw_mipi_dsi_get_lane_rate(struct dw_mipi_dsi *dsi)
545 {
546 	const struct drm_display_mode *mode = &dsi->mode;
547 	unsigned long max_lane_rate = dsi->pdata->max_bit_rate_per_lane;
548 	unsigned long lane_rate;
549 	unsigned int value;
550 	int bpp, lanes;
551 	u64 tmp;
552 
553 	/* optional override of the desired bandwidth */
554 	value = dev_read_u32_default(dsi->dev, "rockchip,lane-rate", 0);
555 	if (value > 0)
556 		return value * 1000 * 1000;
557 
558 	bpp = mipi_dsi_pixel_format_to_bpp(dsi->format);
559 	if (bpp < 0)
560 		bpp = 24;
561 
562 	lanes = dsi->slave ? dsi->lanes * 2 : dsi->lanes;
563 	tmp = (u64)mode->clock * 1000 * bpp;
564 	do_div(tmp, lanes);
565 
566 	/* take 1 / 0.9, since mbps must big than bandwidth of RGB */
567 	tmp *= 10;
568 	do_div(tmp, 9);
569 
570 	if (tmp > max_lane_rate)
571 		lane_rate = max_lane_rate;
572 	else
573 		lane_rate = tmp;
574 
575 	return lane_rate;
576 }
577 
578 static void dw_mipi_dsi_set_pll(struct dw_mipi_dsi *dsi, unsigned long rate)
579 {
580 	unsigned long fin, fout;
581 	unsigned long fvco_min, fvco_max, best_freq = 984000000;
582 	u8 min_prediv, max_prediv;
583 	u8 _prediv, best_prediv = 2;
584 	u16 _fbdiv, best_fbdiv = 82;
585 	u32 min_delta = ~0U;
586 
587 	fin = 24000000;
588 	fout = rate;
589 
590 	/* 5Mhz < Fref / N < 40MHz, 80MHz < Fvco < 1500Mhz */
591 	min_prediv = DIV_ROUND_UP(fin, 40000000);
592 	max_prediv = fin / 5000000;
593 	fvco_min = 80000000;
594 	fvco_max = 1500000000;
595 
596 	for (_prediv = min_prediv; _prediv <= max_prediv; _prediv++) {
597 		u64 tmp, _fout;
598 		u32 delta;
599 
600 		/* Fvco = Fref * M / N */
601 		tmp = (u64)fout * _prediv;
602 		do_div(tmp, fin);
603 		_fbdiv = tmp;
604 
605 		/*
606 		 * Due to the use of a "by 2 pre-scaler," the range of the
607 		 * feedback multiplication value M is limited to even division
608 		 * numbers, and m must be greater than 12, less than 1000.
609 		 */
610 		if (_fbdiv <= 12 || _fbdiv >= 1000)
611 			continue;
612 
613 		if (_fbdiv % 2)
614 			++_fbdiv;
615 
616 		_fout = (u64)_fbdiv * fin;
617 		do_div(_fout, _prediv);
618 
619 		if (_fout < fvco_min || _fout > fvco_max)
620 			continue;
621 
622 		delta = abs(fout - _fout);
623 		if (!delta) {
624 			best_prediv = _prediv;
625 			best_fbdiv = _fbdiv;
626 			best_freq = _fout;
627 			break;
628 		} else if (delta < min_delta) {
629 			best_prediv = _prediv;
630 			best_fbdiv = _fbdiv;
631 			best_freq = _fout;
632 			min_delta = delta;
633 		}
634 	}
635 
636 	dsi->lane_mbps = best_freq / 1000 / 1000;
637 	dsi->dphy.input_div = best_prediv;
638 	dsi->dphy.feedback_div = best_fbdiv;
639 	if (dsi->slave) {
640 		dsi->slave->lane_mbps = dsi->lane_mbps;
641 		dsi->slave->dphy.input_div = dsi->dphy.input_div;
642 		dsi->slave->dphy.feedback_div = dsi->dphy.feedback_div;
643 	}
644 	if (dsi->master) {
645 		dsi->master->lane_mbps = dsi->lane_mbps;
646 		dsi->master->dphy.input_div = dsi->dphy.input_div;
647 		dsi->master->dphy.feedback_div = dsi->dphy.feedback_div;
648 	}
649 }
650 
651 static int dw_mipi_dsi_read_from_fifo(struct dw_mipi_dsi *dsi,
652 				      const struct mipi_dsi_msg *msg)
653 {
654 	u8 *payload = msg->rx_buf;
655 	u16 length;
656 	u32 val;
657 	int ret;
658 
659 	ret = readl_poll_timeout(dsi->base + DSI_CMD_PKT_STATUS,
660 				 val, !(val & GEN_RD_CMD_BUSY), 5000);
661 	if (ret) {
662 		printf("entire response isn't stored in the FIFO\n");
663 		return ret;
664 	}
665 
666 	/* Receive payload */
667 	for (length = msg->rx_len; length; length -= 4) {
668 		ret = readl_poll_timeout(dsi->base + DSI_CMD_PKT_STATUS,
669 					 val, !(val & GEN_PLD_R_EMPTY), 5000);
670 		if (ret) {
671 			printf("Read payload FIFO is empty\n");
672 			return ret;
673 		}
674 
675 		val = dsi_read(dsi, DSI_GEN_PLD_DATA);
676 
677 		switch (length) {
678 		case 3:
679 			payload[2] = (val >> 16) & 0xff;
680 			/* Fall through */
681 		case 2:
682 			payload[1] = (val >> 8) & 0xff;
683 			/* Fall through */
684 		case 1:
685 			payload[0] = val & 0xff;
686 			return 0;
687 		}
688 
689 		payload[0] = (val >>  0) & 0xff;
690 		payload[1] = (val >>  8) & 0xff;
691 		payload[2] = (val >> 16) & 0xff;
692 		payload[3] = (val >> 24) & 0xff;
693 		payload += 4;
694 	}
695 
696 	return 0;
697 }
698 
699 static int dw_mipi_dsi_turn_on_peripheral(struct dw_mipi_dsi *dsi)
700 {
701 	dpishutdn_assert(dsi);
702 	udelay(20);
703 	dpishutdn_deassert(dsi);
704 
705 	return 0;
706 }
707 
708 static int dw_mipi_dsi_shutdown_peripheral(struct dw_mipi_dsi *dsi)
709 {
710 	dpishutdn_deassert(dsi);
711 	udelay(20);
712 	dpishutdn_assert(dsi);
713 
714 	return 0;
715 }
716 
717 static ssize_t dw_mipi_dsi_transfer(struct dw_mipi_dsi *dsi,
718 				    const struct mipi_dsi_msg *msg)
719 {
720 	struct mipi_dsi_packet packet;
721 	int ret;
722 	int val;
723 
724 	if (msg->flags & MIPI_DSI_MSG_USE_LPM) {
725 		dsi_update_bits(dsi, DSI_VID_MODE_CFG, LP_CMD_EN, LP_CMD_EN);
726 		dsi_update_bits(dsi, DSI_LPCLK_CTRL, PHY_TXREQUESTCLKHS, 0);
727 	} else {
728 		dsi_update_bits(dsi, DSI_VID_MODE_CFG, LP_CMD_EN, 0);
729 		dsi_update_bits(dsi, DSI_LPCLK_CTRL,
730 				PHY_TXREQUESTCLKHS, PHY_TXREQUESTCLKHS);
731 	}
732 
733 	switch (msg->type) {
734 	case MIPI_DSI_SHUTDOWN_PERIPHERAL:
735 		return dw_mipi_dsi_shutdown_peripheral(dsi);
736 	case MIPI_DSI_TURN_ON_PERIPHERAL:
737 		return dw_mipi_dsi_turn_on_peripheral(dsi);
738 	case MIPI_DSI_DCS_SHORT_WRITE:
739 		dsi_update_bits(dsi, DSI_CMD_MODE_CFG, DCS_SW_0P_TX,
740 				dsi->mode_flags & MIPI_DSI_MODE_LPM ?
741 				DCS_SW_0P_TX : 0);
742 		break;
743 	case MIPI_DSI_DCS_SHORT_WRITE_PARAM:
744 		dsi_update_bits(dsi, DSI_CMD_MODE_CFG, DCS_SW_1P_TX,
745 				dsi->mode_flags & MIPI_DSI_MODE_LPM ?
746 				DCS_SW_1P_TX : 0);
747 		break;
748 	case MIPI_DSI_DCS_LONG_WRITE:
749 		dsi_update_bits(dsi, DSI_CMD_MODE_CFG, DCS_LW_TX,
750 				dsi->mode_flags & MIPI_DSI_MODE_LPM ?
751 				DCS_LW_TX : 0);
752 		break;
753 	case MIPI_DSI_DCS_READ:
754 		dsi_update_bits(dsi, DSI_CMD_MODE_CFG, DCS_SR_0P_TX,
755 				dsi->mode_flags & MIPI_DSI_MODE_LPM ?
756 				DCS_SR_0P_TX : 0);
757 		break;
758 	case MIPI_DSI_SET_MAXIMUM_RETURN_PACKET_SIZE:
759 		dsi_update_bits(dsi, DSI_CMD_MODE_CFG, MAX_RD_PKT_SIZE,
760 				dsi->mode_flags & MIPI_DSI_MODE_LPM ?
761 				MAX_RD_PKT_SIZE : 0);
762 		break;
763 	case MIPI_DSI_GENERIC_SHORT_WRITE_0_PARAM:
764 		dsi_update_bits(dsi, DSI_CMD_MODE_CFG, GEN_SW_0P_TX,
765 				dsi->mode_flags & MIPI_DSI_MODE_LPM ?
766 				GEN_SW_0P_TX : 0);
767 		break;
768 	case MIPI_DSI_GENERIC_SHORT_WRITE_1_PARAM:
769 		dsi_update_bits(dsi, DSI_CMD_MODE_CFG, GEN_SW_1P_TX,
770 				dsi->mode_flags & MIPI_DSI_MODE_LPM ?
771 				GEN_SW_1P_TX : 0);
772 		break;
773 	case MIPI_DSI_GENERIC_SHORT_WRITE_2_PARAM:
774 		dsi_update_bits(dsi, DSI_CMD_MODE_CFG, GEN_SW_2P_TX,
775 				dsi->mode_flags & MIPI_DSI_MODE_LPM ?
776 				GEN_SW_2P_TX : 0);
777 		break;
778 	case MIPI_DSI_GENERIC_LONG_WRITE:
779 		dsi_update_bits(dsi, DSI_CMD_MODE_CFG, GEN_LW_TX,
780 				dsi->mode_flags & MIPI_DSI_MODE_LPM ?
781 				GEN_LW_TX : 0);
782 		break;
783 	case MIPI_DSI_GENERIC_READ_REQUEST_0_PARAM:
784 		dsi_update_bits(dsi, DSI_CMD_MODE_CFG, GEN_SR_0P_TX,
785 				dsi->mode_flags & MIPI_DSI_MODE_LPM ?
786 				GEN_SR_0P_TX : 0);
787 		break;
788 	case MIPI_DSI_GENERIC_READ_REQUEST_1_PARAM:
789 		dsi_update_bits(dsi, DSI_CMD_MODE_CFG, GEN_SR_1P_TX,
790 				dsi->mode_flags & MIPI_DSI_MODE_LPM ?
791 				GEN_SR_1P_TX : 0);
792 		break;
793 	case MIPI_DSI_GENERIC_READ_REQUEST_2_PARAM:
794 		dsi_update_bits(dsi, DSI_CMD_MODE_CFG, GEN_SR_2P_TX,
795 				dsi->mode_flags & MIPI_DSI_MODE_LPM ?
796 				GEN_SR_2P_TX : 0);
797 		break;
798 	default:
799 		return -EINVAL;
800 	}
801 
802 	if (msg->flags & MIPI_DSI_MSG_REQ_ACK)
803 		dsi_update_bits(dsi, DSI_CMD_MODE_CFG,
804 				ACK_RQST_EN, ACK_RQST_EN);
805 
806 	/* create a packet to the DSI protocol */
807 	ret = mipi_dsi_create_packet(&packet, msg);
808 	if (ret) {
809 		printf("failed to create packet: %d\n", ret);
810 		return ret;
811 	}
812 
813 	/* Send payload */
814 	while (DIV_ROUND_UP(packet.payload_length, 4)) {
815 		/*
816 		 * Alternatively, you can always keep the FIFO
817 		 * nearly full by monitoring the FIFO state until
818 		 * it is not full, and then writea single word of data.
819 		 * This solution is more resource consuming
820 		 * but it simultaneously avoids FIFO starvation,
821 		 * making it possible to use FIFO sizes smaller than
822 		 * the amount of data of the longest packet to be written.
823 		 */
824 		ret = genif_wait_w_pld_fifo_not_full(dsi);
825 		if (ret)
826 			return ret;
827 
828 		if (packet.payload_length < 4) {
829 			/* send residu payload */
830 			val = 0;
831 			memcpy(&val, packet.payload, packet.payload_length);
832 			dsi_write(dsi, DSI_GEN_PLD_DATA, val);
833 			packet.payload_length = 0;
834 		} else {
835 			val = get_unaligned_le32(packet.payload);
836 			dsi_write(dsi, DSI_GEN_PLD_DATA, val);
837 			packet.payload += 4;
838 			packet.payload_length -= 4;
839 		}
840 	}
841 
842 	ret = genif_wait_cmd_fifo_not_full(dsi);
843 	if (ret)
844 		return ret;
845 
846 	/* Send packet header */
847 	val = get_unaligned_le32(packet.header);
848 	dsi_write(dsi, DSI_GEN_HDR, val);
849 
850 	ret = genif_wait_write_fifo_empty(dsi);
851 	if (ret)
852 		return ret;
853 
854 	if (msg->rx_len) {
855 		ret = dw_mipi_dsi_read_from_fifo(dsi, msg);
856 		if (ret < 0)
857 			return ret;
858 	}
859 
860 	if (dsi->slave) {
861 		ret = dw_mipi_dsi_transfer(dsi->slave, msg);
862 		if (ret < 0)
863 			return ret;
864 	}
865 
866 	return msg->rx_len ? msg->rx_len : msg->tx_len;
867 }
868 
869 static void dw_mipi_dsi_video_mode_config(struct dw_mipi_dsi *dsi)
870 {
871 	u32 val = LP_VACT_EN | LP_VFP_EN | LP_VBP_EN | LP_VSA_EN |
872 		  LP_HFP_EN | LP_HBP_EN;
873 
874 	if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_HFP)
875 		val &= ~LP_HFP_EN;
876 
877 	if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_HBP)
878 		val &= ~LP_HBP_EN;
879 
880 	if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_BURST)
881 		val |= VID_MODE_TYPE_BURST;
882 	else if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_SYNC_PULSE)
883 		val |= VID_MODE_TYPE_BURST_SYNC_PULSES;
884 	else
885 		val |= VID_MODE_TYPE_BURST_SYNC_EVENTS;
886 
887 	dsi_write(dsi, DSI_VID_MODE_CFG, val);
888 
889 	if (dsi->mode_flags & MIPI_DSI_CLOCK_NON_CONTINUOUS)
890 		dsi_update_bits(dsi, DSI_LPCLK_CTRL,
891 				AUTO_CLKLANE_CTRL, AUTO_CLKLANE_CTRL);
892 }
893 
894 static void dw_mipi_dsi_enable(struct dw_mipi_dsi *dsi)
895 {
896 	const struct drm_display_mode *mode = &dsi->mode;
897 
898 	dsi_update_bits(dsi, DSI_LPCLK_CTRL,
899 			PHY_TXREQUESTCLKHS, PHY_TXREQUESTCLKHS);
900 
901 	dsi_write(dsi, DSI_PWR_UP, RESET);
902 
903 	if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO) {
904 		dsi_update_bits(dsi, DSI_MODE_CFG, CMD_VIDEO_MODE, VIDEO_MODE);
905 	} else {
906 		dsi_write(dsi, DSI_DBI_VCID, DBI_VCID(dsi->channel));
907 		dsi_update_bits(dsi, DSI_CMD_MODE_CFG, DCS_LW_TX, 0);
908 		dsi_write(dsi, DSI_EDPI_CMD_SIZE, mode->hdisplay);
909 		dsi_update_bits(dsi, DSI_MODE_CFG,
910 				CMD_VIDEO_MODE, COMMAND_MODE);
911 	}
912 
913 	dsi_write(dsi, DSI_PWR_UP, POWERUP);
914 
915 	if (dsi->slave)
916 		dw_mipi_dsi_enable(dsi->slave);
917 }
918 
919 static void dw_mipi_dsi_disable(struct dw_mipi_dsi *dsi)
920 {
921 	dsi_write(dsi, DSI_PWR_UP, RESET);
922 	dsi_write(dsi, DSI_LPCLK_CTRL, 0);
923 	dsi_write(dsi, DSI_EDPI_CMD_SIZE, 0);
924 	dsi_update_bits(dsi, DSI_MODE_CFG, CMD_VIDEO_MODE, COMMAND_MODE);
925 	dsi_write(dsi, DSI_PWR_UP, POWERUP);
926 
927 	if (dsi->slave)
928 		dw_mipi_dsi_disable(dsi->slave);
929 }
930 
931 static void dw_mipi_dsi_post_disable(struct dw_mipi_dsi *dsi)
932 {
933 	if (!dsi->prepared)
934 		return;
935 
936 	if (dsi->master)
937 		dw_mipi_dsi_post_disable(dsi->master);
938 
939 	dsi_write(dsi, DSI_PWR_UP, RESET);
940 	dsi_write(dsi, DSI_PHY_RSTZ, 0);
941 
942 	if (dsi->dphy.phy)
943 		rockchip_phy_power_off(dsi->dphy.phy);
944 
945 	dsi->prepared = false;
946 
947 	if (dsi->slave)
948 		dw_mipi_dsi_post_disable(dsi->slave);
949 }
950 
951 static void dw_mipi_dsi_init(struct dw_mipi_dsi *dsi)
952 {
953 	u32 esc_clk_div;
954 
955 	dsi_write(dsi, DSI_PWR_UP, RESET);
956 
957 	/* The maximum value of the escape clock frequency is 20MHz */
958 	esc_clk_div = DIV_ROUND_UP(dsi->lane_mbps >> 3, 20);
959 	dsi_write(dsi, DSI_CLKMGR_CFG, TO_CLK_DIVIDSION(10) |
960 		  TX_ESC_CLK_DIVIDSION(esc_clk_div));
961 }
962 
963 static void dw_mipi_dsi_dpi_config(struct dw_mipi_dsi *dsi,
964 				   struct drm_display_mode *mode)
965 {
966 	u32 val = 0, color = 0;
967 
968 	switch (dsi->format) {
969 	case MIPI_DSI_FMT_RGB888:
970 		color = DPI_COLOR_CODING_24BIT;
971 		break;
972 	case MIPI_DSI_FMT_RGB666:
973 		color = DPI_COLOR_CODING_18BIT_2 | EN18_LOOSELY;
974 		break;
975 	case MIPI_DSI_FMT_RGB666_PACKED:
976 		color = DPI_COLOR_CODING_18BIT_1;
977 		break;
978 	case MIPI_DSI_FMT_RGB565:
979 		color = DPI_COLOR_CODING_16BIT_1;
980 		break;
981 	}
982 
983 	if (mode->flags & DRM_MODE_FLAG_NVSYNC)
984 		val |= VSYNC_ACTIVE_LOW;
985 	if (mode->flags & DRM_MODE_FLAG_NHSYNC)
986 		val |= HSYNC_ACTIVE_LOW;
987 
988 	dsi_write(dsi, DSI_DPI_VCID, DPI_VID(dsi->channel));
989 	dsi_write(dsi, DSI_DPI_COLOR_CODING, color);
990 	dsi_write(dsi, DSI_DPI_CFG_POL, val);
991 	dsi_write(dsi, DSI_DPI_LP_CMD_TIM, OUTVACT_LPCMD_TIME(4)
992 		  | INVACT_LPCMD_TIME(4));
993 }
994 
995 static void dw_mipi_dsi_packet_handler_config(struct dw_mipi_dsi *dsi)
996 {
997 	u32 val = CRC_RX_EN | ECC_RX_EN | BTA_EN | EOTP_TX_EN;
998 
999 	if (dsi->mode_flags & MIPI_DSI_MODE_EOT_PACKET)
1000 		val &= ~EOTP_TX_EN;
1001 
1002 	dsi_write(dsi, DSI_PCKHDL_CFG, val);
1003 }
1004 
1005 static void dw_mipi_dsi_video_packet_config(struct dw_mipi_dsi *dsi,
1006 					    struct drm_display_mode *mode)
1007 {
1008 	dsi_write(dsi, DSI_VID_PKT_SIZE, VID_PKT_SIZE(mode->hdisplay));
1009 }
1010 
1011 static void dw_mipi_dsi_command_mode_config(struct dw_mipi_dsi *dsi)
1012 {
1013 	dsi_write(dsi, DSI_TO_CNT_CFG, HSTX_TO_CNT(1000) | LPRX_TO_CNT(1000));
1014 	dsi_write(dsi, DSI_BTA_TO_CNT, 0xd00);
1015 }
1016 
1017 /* Get lane byte clock cycles. */
1018 static int dw_mipi_dsi_get_hcomponent_lbcc(struct dw_mipi_dsi *dsi,
1019 					   u32 hcomponent)
1020 {
1021 	u32 lbcc;
1022 
1023 	lbcc = hcomponent * dsi->lane_mbps * 1000 / 8;
1024 
1025 	if (!dsi->mode.clock)
1026 		return 0;
1027 
1028 	return DIV_ROUND_CLOSEST(lbcc, dsi->mode.clock);
1029 }
1030 
1031 static void dw_mipi_dsi_line_timer_config(struct dw_mipi_dsi *dsi)
1032 {
1033 	int htotal, hsa, hbp, lbcc;
1034 	struct drm_display_mode *mode = &dsi->mode;
1035 
1036 	htotal = mode->htotal;
1037 	hsa = mode->hsync_end - mode->hsync_start;
1038 	hbp = mode->htotal - mode->hsync_end;
1039 
1040 	lbcc = dw_mipi_dsi_get_hcomponent_lbcc(dsi, htotal);
1041 	dsi_write(dsi, DSI_VID_HLINE_TIME, lbcc);
1042 
1043 	lbcc = dw_mipi_dsi_get_hcomponent_lbcc(dsi, hsa);
1044 	dsi_write(dsi, DSI_VID_HSA_TIME, lbcc);
1045 
1046 	lbcc = dw_mipi_dsi_get_hcomponent_lbcc(dsi, hbp);
1047 	dsi_write(dsi, DSI_VID_HBP_TIME, lbcc);
1048 }
1049 
1050 static void dw_mipi_dsi_vertical_timing_config(struct dw_mipi_dsi *dsi)
1051 {
1052 	u32 vactive, vsa, vfp, vbp;
1053 	struct drm_display_mode *mode = &dsi->mode;
1054 
1055 	vactive = mode->vdisplay;
1056 	vsa = mode->vsync_end - mode->vsync_start;
1057 	vfp = mode->vsync_start - mode->vdisplay;
1058 	vbp = mode->vtotal - mode->vsync_end;
1059 
1060 	dsi_write(dsi, DSI_VID_VACTIVE_LINES, vactive);
1061 	dsi_write(dsi, DSI_VID_VSA_LINES, vsa);
1062 	dsi_write(dsi, DSI_VID_VFP_LINES, vfp);
1063 	dsi_write(dsi, DSI_VID_VBP_LINES, vbp);
1064 }
1065 
1066 static void dw_mipi_dsi_dphy_timing_config(struct dw_mipi_dsi *dsi)
1067 {
1068 	dsi_write(dsi, DSI_PHY_TMR_CFG, PHY_HS2LP_TIME(0x14)
1069 		  | PHY_LP2HS_TIME(0x10) | MAX_RD_TIME(10000));
1070 
1071 	dsi_write(dsi, DSI_PHY_TMR_LPCLK_CFG, PHY_CLKHS2LP_TIME(0x40)
1072 		  | PHY_CLKLP2HS_TIME(0x40));
1073 }
1074 
1075 static void dw_mipi_dsi_dphy_interface_config(struct dw_mipi_dsi *dsi)
1076 {
1077 	dsi_write(dsi, DSI_PHY_IF_CFG, PHY_STOP_WAIT_TIME(0x20) |
1078 		  N_LANES(dsi->lanes));
1079 }
1080 
1081 static void dw_mipi_dsi_clear_err(struct dw_mipi_dsi *dsi)
1082 {
1083 	dsi_read(dsi, DSI_INT_ST0);
1084 	dsi_read(dsi, DSI_INT_ST1);
1085 	dsi_write(dsi, DSI_INT_MSK0, 0);
1086 	dsi_write(dsi, DSI_INT_MSK1, 0);
1087 }
1088 
1089 static int dw_mipi_dsi_connector_pre_init(struct display_state *state)
1090 {
1091 	struct connector_state *conn_state = &state->conn_state;
1092 
1093 	conn_state->type = DRM_MODE_CONNECTOR_DSI;
1094 
1095 	return 0;
1096 }
1097 
1098 static int dw_mipi_dsi_connector_init(struct display_state *state)
1099 {
1100 	struct connector_state *conn_state = &state->conn_state;
1101 	struct dw_mipi_dsi *dsi = dev_get_priv(conn_state->dev);
1102 
1103 	conn_state->disp_info  = rockchip_get_disp_info(conn_state->type, dsi->id);
1104 	dsi->dphy.phy = conn_state->phy;
1105 
1106 	conn_state->output_mode = ROCKCHIP_OUT_MODE_P888;
1107 	conn_state->color_space = V4L2_COLORSPACE_DEFAULT;
1108 	conn_state->output_if |=
1109 		dsi->id ? VOP_OUTPUT_IF_MIPI1 : VOP_OUTPUT_IF_MIPI0;
1110 
1111 #ifndef CONFIG_ROCKCHIP_RK3568
1112 	if (dsi->id) {
1113 		struct udevice *dev;
1114 		int ret;
1115 
1116 		ret = uclass_get_device_by_name(UCLASS_DISPLAY, "dsi@ff960000",
1117 						&dev);
1118 		if (ret)
1119 			return ret;
1120 
1121 		dsi->master = dev_get_priv(dev);
1122 		if (!dsi->master)
1123 			return -ENODEV;
1124 
1125 		conn_state->output_flags = ROCKCHIP_OUTPUT_DATA_SWAP;
1126 	}
1127 #endif
1128 
1129 	if (dsi->lanes > 4) {
1130 		struct udevice *dev;
1131 		int ret;
1132 
1133 		ret = uclass_get_device_by_name(UCLASS_DISPLAY,
1134 #if defined(CONFIG_ROCKCHIP_RK3288)
1135 						"dsi@ff964000",
1136 #elif defined(CONFIG_ROCKCHIP_RK3399)
1137 						"dsi@ff968000",
1138 #else
1139 						"dsi@fe070000",
1140 #endif
1141 						&dev);
1142 		if (ret)
1143 			return ret;
1144 
1145 		dsi->slave = dev_get_priv(dev);
1146 		if (!dsi->slave)
1147 			return -ENODEV;
1148 
1149 		dsi->lanes /= 2;
1150 		dsi->slave->lanes = dsi->lanes;
1151 		dsi->slave->format = dsi->format;
1152 		dsi->slave->mode_flags = dsi->mode_flags;
1153 		dsi->slave->channel = dsi->channel;
1154 		conn_state->output_flags =
1155 				ROCKCHIP_OUTPUT_DUAL_CHANNEL_LEFT_RIGHT_MODE;
1156 		if (dsi->data_swap)
1157 			conn_state->output_flags |= ROCKCHIP_OUTPUT_DATA_SWAP;
1158 
1159 		conn_state->output_if |= VOP_OUTPUT_IF_MIPI1;
1160 
1161 #if defined(CONFIG_ROCKCHIP_RK3568)
1162 		struct rockchip_phy *phy = NULL;
1163 		struct udevice *phy_dev;
1164 
1165 		ret = uclass_get_device_by_phandle(UCLASS_PHY, dev,
1166 						   "phys", &phy_dev);
1167 		if (ret)
1168 			return -ENODEV;
1169 
1170 		phy = (struct rockchip_phy *)dev_get_driver_data(phy_dev);
1171 		if (!phy)
1172 			return -ENODEV;
1173 
1174 		dsi->slave->dphy.phy = phy;
1175 		if (phy->funcs && phy->funcs->init)
1176 			return phy->funcs->init(phy);
1177 #endif
1178 
1179 	}
1180 
1181 	return 0;
1182 }
1183 
1184 static void dw_mipi_dsi_set_hs_clk(struct dw_mipi_dsi *dsi, unsigned long rate)
1185 {
1186 	rate = rockchip_phy_set_pll(dsi->dphy.phy, rate);
1187 	dsi->lane_mbps = rate / 1000 / 1000;
1188 }
1189 
1190 static void dw_mipi_dsi_host_init(struct dw_mipi_dsi *dsi)
1191 {
1192 	dw_mipi_dsi_init(dsi);
1193 	dw_mipi_dsi_dpi_config(dsi, &dsi->mode);
1194 	dw_mipi_dsi_packet_handler_config(dsi);
1195 	dw_mipi_dsi_video_mode_config(dsi);
1196 	dw_mipi_dsi_video_packet_config(dsi, &dsi->mode);
1197 	dw_mipi_dsi_command_mode_config(dsi);
1198 	dsi_update_bits(dsi, DSI_MODE_CFG, CMD_VIDEO_MODE, COMMAND_MODE);
1199 	dw_mipi_dsi_line_timer_config(dsi);
1200 	dw_mipi_dsi_vertical_timing_config(dsi);
1201 	dw_mipi_dsi_dphy_timing_config(dsi);
1202 	dw_mipi_dsi_dphy_interface_config(dsi);
1203 	dw_mipi_dsi_clear_err(dsi);
1204 }
1205 
1206 static void dw_mipi_dsi_vop_routing(struct dw_mipi_dsi *dsi, int vop_id)
1207 {
1208 	grf_field_write(dsi, VOPSEL, vop_id);
1209 
1210 	if (dsi->slave)
1211 		grf_field_write(dsi->slave, VOPSEL, vop_id);
1212 }
1213 
1214 static void mipi_dphy_init(struct dw_mipi_dsi *dsi)
1215 {
1216 	u32 map[] = {0x0, 0x1, 0x3, 0x7, 0xf};
1217 
1218 	mipi_dphy_enableclk_deassert(dsi);
1219 	mipi_dphy_shutdownz_assert(dsi);
1220 	mipi_dphy_rstz_assert(dsi);
1221 	testif_testclr_assert(dsi);
1222 
1223 	/* Configures DPHY to work as a Master */
1224 	grf_field_write(dsi, MASTERSLAVEZ, 1);
1225 
1226 	/* Configures lane as TX */
1227 	grf_field_write(dsi, BASEDIR, 0);
1228 
1229 	/* Set all REQUEST inputs to zero */
1230 	grf_field_write(dsi, TURNREQUEST, 0);
1231 	grf_field_write(dsi, TURNDISABLE, 0);
1232 	grf_field_write(dsi, FORCETXSTOPMODE, 0);
1233 	grf_field_write(dsi, FORCERXMODE, 0);
1234 	udelay(1);
1235 
1236 	testif_testclr_deassert(dsi);
1237 
1238 	if (!dsi->dphy.phy)
1239 		dw_mipi_dsi_phy_init(dsi);
1240 
1241 	/* Enable Data Lane Module */
1242 	grf_field_write(dsi, ENABLE_N, map[dsi->lanes]);
1243 
1244 	/* Enable Clock Lane Module */
1245 	grf_field_write(dsi, ENABLECLK, 1);
1246 
1247 	mipi_dphy_enableclk_assert(dsi);
1248 }
1249 
1250 static void dw_mipi_dsi_pre_enable(struct dw_mipi_dsi *dsi)
1251 {
1252 	if (dsi->prepared)
1253 		return;
1254 
1255 	if (dsi->master)
1256 		dw_mipi_dsi_pre_enable(dsi->master);
1257 
1258 	dw_mipi_dsi_host_init(dsi);
1259 	mipi_dphy_init(dsi);
1260 	mipi_dphy_power_on(dsi);
1261 	dsi_write(dsi, DSI_PWR_UP, POWERUP);
1262 
1263 	dsi->prepared = true;
1264 
1265 	if (dsi->slave)
1266 		dw_mipi_dsi_pre_enable(dsi->slave);
1267 }
1268 
1269 static int dw_mipi_dsi_connector_prepare(struct display_state *state)
1270 {
1271 	struct connector_state *conn_state = &state->conn_state;
1272 	struct crtc_state *crtc_state = &state->crtc_state;
1273 	struct dw_mipi_dsi *dsi = dev_get_priv(conn_state->dev);
1274 	unsigned long lane_rate;
1275 
1276 	memcpy(&dsi->mode, &conn_state->mode, sizeof(struct drm_display_mode));
1277 	if (dsi->slave) {
1278 		dsi->mode.hdisplay /= 2;
1279 		memcpy(&dsi->slave->mode, &dsi->mode,
1280 		       sizeof(struct drm_display_mode));
1281 	}
1282 
1283 	lane_rate = dw_mipi_dsi_get_lane_rate(dsi);
1284 	if (dsi->dphy.phy)
1285 		dw_mipi_dsi_set_hs_clk(dsi, lane_rate);
1286 	else
1287 		dw_mipi_dsi_set_pll(dsi, lane_rate);
1288 
1289 	if (dsi->slave && dsi->slave->dphy.phy)
1290 		dw_mipi_dsi_set_hs_clk(dsi->slave, lane_rate);
1291 
1292 	printf("final DSI-Link bandwidth: %u Mbps x %d\n",
1293 	       dsi->lane_mbps, dsi->slave ? dsi->lanes * 2 : dsi->lanes);
1294 
1295 	dw_mipi_dsi_vop_routing(dsi, crtc_state->crtc_id);
1296 	dw_mipi_dsi_pre_enable(dsi);
1297 
1298 	return 0;
1299 }
1300 
1301 static void dw_mipi_dsi_connector_unprepare(struct display_state *state)
1302 {
1303 	struct connector_state *conn_state = &state->conn_state;
1304 	struct dw_mipi_dsi *dsi = dev_get_priv(conn_state->dev);
1305 
1306 	dw_mipi_dsi_post_disable(dsi);
1307 }
1308 
1309 static int dw_mipi_dsi_connector_enable(struct display_state *state)
1310 {
1311 	struct connector_state *conn_state = &state->conn_state;
1312 	struct dw_mipi_dsi *dsi = dev_get_priv(conn_state->dev);
1313 
1314 	dw_mipi_dsi_enable(dsi);
1315 
1316 	return 0;
1317 }
1318 
1319 static int dw_mipi_dsi_connector_disable(struct display_state *state)
1320 {
1321 	struct connector_state *conn_state = &state->conn_state;
1322 	struct dw_mipi_dsi *dsi = dev_get_priv(conn_state->dev);
1323 
1324 	dw_mipi_dsi_disable(dsi);
1325 
1326 	return 0;
1327 }
1328 
1329 static const struct rockchip_connector_funcs dw_mipi_dsi_connector_funcs = {
1330 	.pre_init = dw_mipi_dsi_connector_pre_init,
1331 	.init = dw_mipi_dsi_connector_init,
1332 	.prepare = dw_mipi_dsi_connector_prepare,
1333 	.unprepare = dw_mipi_dsi_connector_unprepare,
1334 	.enable = dw_mipi_dsi_connector_enable,
1335 	.disable = dw_mipi_dsi_connector_disable,
1336 };
1337 
1338 static int dw_mipi_dsi_probe(struct udevice *dev)
1339 {
1340 	struct dw_mipi_dsi *dsi = dev_get_priv(dev);
1341 	const struct rockchip_connector *connector =
1342 		(const struct rockchip_connector *)dev_get_driver_data(dev);
1343 	const struct dw_mipi_dsi_plat_data *pdata = connector->data;
1344 	int id;
1345 
1346 	dsi->base = dev_read_addr_ptr(dev);
1347 	dsi->grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1348 	if (IS_ERR(dsi->grf))
1349 		return PTR_ERR(dsi->grf);
1350 
1351 	id = of_alias_get_id(ofnode_to_np(dev->node), "dsi");
1352 	if (id < 0)
1353 		id = 0;
1354 
1355 	dsi->dev = dev;
1356 	dsi->pdata = pdata;
1357 	dsi->id = id;
1358 	dsi->data_swap = dev_read_bool(dsi->dev, "rockchip,data-swap");
1359 
1360 	return 0;
1361 }
1362 
1363 static const u32 px30_dsi_grf_reg_fields[MAX_FIELDS] = {
1364 	[DPIUPDATECFG]		= GRF_REG_FIELD(0x0434,  7,  7),
1365 	[DPICOLORM]		= GRF_REG_FIELD(0x0434,  3,  3),
1366 	[DPISHUTDN]		= GRF_REG_FIELD(0x0434,  2,  2),
1367 	[FORCETXSTOPMODE]	= GRF_REG_FIELD(0x0438,  7, 10),
1368 	[TURNDISABLE]		= GRF_REG_FIELD(0x0438,  5,  5),
1369 	[VOPSEL]		= GRF_REG_FIELD(0x0438,  0,  0),
1370 };
1371 
1372 static const struct dw_mipi_dsi_plat_data px30_mipi_dsi_plat_data = {
1373 	.dsi0_grf_reg_fields = px30_dsi_grf_reg_fields,
1374 	.max_bit_rate_per_lane = 1000000000UL,
1375 };
1376 
1377 static const struct rockchip_connector px30_mipi_dsi_driver_data = {
1378 	 .funcs = &dw_mipi_dsi_connector_funcs,
1379 	 .data = &px30_mipi_dsi_plat_data,
1380 };
1381 
1382 static const u32 rk1808_dsi_grf_reg_fields[MAX_FIELDS] = {
1383 	[MASTERSLAVEZ]          = GRF_REG_FIELD(0x0440,  8,  8),
1384 	[DPIUPDATECFG]          = GRF_REG_FIELD(0x0440,  7,  7),
1385 	[DPICOLORM]             = GRF_REG_FIELD(0x0440,  3,  3),
1386 	[DPISHUTDN]             = GRF_REG_FIELD(0x0440,  2,  2),
1387 	[FORCETXSTOPMODE]       = GRF_REG_FIELD(0x0444,  7, 10),
1388 	[FORCERXMODE]           = GRF_REG_FIELD(0x0444,  6,  6),
1389 	[TURNDISABLE]           = GRF_REG_FIELD(0x0444,  5,  5),
1390 };
1391 
1392 static const struct dw_mipi_dsi_plat_data rk1808_mipi_dsi_plat_data = {
1393 	.dsi0_grf_reg_fields = rk1808_dsi_grf_reg_fields,
1394 	.max_bit_rate_per_lane = 2000000000UL,
1395 };
1396 
1397 static const struct rockchip_connector rk1808_mipi_dsi_driver_data = {
1398 	 .funcs = &dw_mipi_dsi_connector_funcs,
1399 	 .data = &rk1808_mipi_dsi_plat_data,
1400 };
1401 
1402 static const u32 rk3128_dsi_grf_reg_fields[MAX_FIELDS] = {
1403 	[FORCETXSTOPMODE]	= GRF_REG_FIELD(0x0150, 10, 13),
1404 	[FORCERXMODE]		= GRF_REG_FIELD(0x0150,  9,  9),
1405 	[TURNDISABLE]		= GRF_REG_FIELD(0x0150,  8,  8),
1406 	[DPICOLORM]		= GRF_REG_FIELD(0x0150,  5,  5),
1407 	[DPISHUTDN]		= GRF_REG_FIELD(0x0150,  4,  4),
1408 };
1409 
1410 static const struct dw_mipi_dsi_plat_data rk3128_mipi_dsi_plat_data = {
1411 	.dsi0_grf_reg_fields = rk3128_dsi_grf_reg_fields,
1412 	.max_bit_rate_per_lane = 1000000000UL,
1413 };
1414 
1415 static const struct rockchip_connector rk3128_mipi_dsi_driver_data = {
1416 	 .funcs = &dw_mipi_dsi_connector_funcs,
1417 	 .data = &rk3128_mipi_dsi_plat_data,
1418 };
1419 
1420 static const u32 rk3288_dsi0_grf_reg_fields[MAX_FIELDS] = {
1421 	[DPICOLORM]		= GRF_REG_FIELD(0x025c,  8,  8),
1422 	[DPISHUTDN]		= GRF_REG_FIELD(0x025c,  7,  7),
1423 	[VOPSEL]		= GRF_REG_FIELD(0x025c,  6,  6),
1424 	[FORCETXSTOPMODE]	= GRF_REG_FIELD(0x0264,  8, 11),
1425 	[FORCERXMODE]		= GRF_REG_FIELD(0x0264,  4,  7),
1426 	[TURNDISABLE]		= GRF_REG_FIELD(0x0264,  0,  3),
1427 	[TURNREQUEST]		= GRF_REG_FIELD(0x03a4,  8, 10),
1428 	[DPIUPDATECFG]		= GRF_REG_FIELD(0x03a8,  0,  0),
1429 };
1430 
1431 static const u32 rk3288_dsi1_grf_reg_fields[MAX_FIELDS] = {
1432 	[DPICOLORM]		= GRF_REG_FIELD(0x025c, 11, 11),
1433 	[DPISHUTDN]		= GRF_REG_FIELD(0x025c, 10, 10),
1434 	[VOPSEL]		= GRF_REG_FIELD(0x025c,  9,  9),
1435 	[ENABLE_N]		= GRF_REG_FIELD(0x0268, 12, 15),
1436 	[FORCETXSTOPMODE]	= GRF_REG_FIELD(0x0268,  8, 11),
1437 	[FORCERXMODE]		= GRF_REG_FIELD(0x0268,  4,  7),
1438 	[TURNDISABLE]		= GRF_REG_FIELD(0x0268,  0,  3),
1439 	[BASEDIR]		= GRF_REG_FIELD(0x027c, 15, 15),
1440 	[MASTERSLAVEZ]		= GRF_REG_FIELD(0x027c, 14, 14),
1441 	[ENABLECLK]		= GRF_REG_FIELD(0x027c, 12, 12),
1442 	[TURNREQUEST]		= GRF_REG_FIELD(0x03a4,  4,  7),
1443 	[DPIUPDATECFG]		= GRF_REG_FIELD(0x03a8,  1,  1),
1444 };
1445 
1446 static const struct dw_mipi_dsi_plat_data rk3288_mipi_dsi_plat_data = {
1447 	.dsi0_grf_reg_fields = rk3288_dsi0_grf_reg_fields,
1448 	.dsi1_grf_reg_fields = rk3288_dsi1_grf_reg_fields,
1449 	.max_bit_rate_per_lane = 1500000000UL,
1450 };
1451 
1452 static const struct rockchip_connector rk3288_mipi_dsi_driver_data = {
1453 	 .funcs = &dw_mipi_dsi_connector_funcs,
1454 	 .data = &rk3288_mipi_dsi_plat_data,
1455 };
1456 
1457 static const u32 rk3366_dsi_grf_reg_fields[MAX_FIELDS] = {
1458 	[VOPSEL]		= GRF_REG_FIELD(0x0400,  2,  2),
1459 	[DPIUPDATECFG]		= GRF_REG_FIELD(0x0410,  9,  9),
1460 	[DPICOLORM]		= GRF_REG_FIELD(0x0410,  3,  3),
1461 	[DPISHUTDN]		= GRF_REG_FIELD(0x0410,  2,  2),
1462 	[FORCETXSTOPMODE]	= GRF_REG_FIELD(0x0414,  7, 10),
1463 	[FORCERXMODE]		= GRF_REG_FIELD(0x0414,  6,  6),
1464 	[TURNDISABLE]		= GRF_REG_FIELD(0x0414,  5,  5),
1465 };
1466 
1467 static const struct dw_mipi_dsi_plat_data rk3366_mipi_dsi_plat_data = {
1468 	.dsi0_grf_reg_fields = rk3366_dsi_grf_reg_fields,
1469 	.max_bit_rate_per_lane = 1000000000UL,
1470 };
1471 
1472 static const struct rockchip_connector rk3366_mipi_dsi_driver_data = {
1473 	 .funcs = &dw_mipi_dsi_connector_funcs,
1474 	 .data = &rk3366_mipi_dsi_plat_data,
1475 };
1476 
1477 static const u32 rk3368_dsi_grf_reg_fields[MAX_FIELDS] = {
1478 	[DPIUPDATECFG]		= GRF_REG_FIELD(0x0418,  7,  7),
1479 	[DPICOLORM]		= GRF_REG_FIELD(0x0418,  3,  3),
1480 	[DPISHUTDN]		= GRF_REG_FIELD(0x0418,  2,  2),
1481 	[FORCETXSTOPMODE]	= GRF_REG_FIELD(0x041c,  7, 10),
1482 	[FORCERXMODE]		= GRF_REG_FIELD(0x041c,  6,  6),
1483 	[TURNDISABLE]		= GRF_REG_FIELD(0x041c,  5,  5),
1484 };
1485 
1486 static const struct dw_mipi_dsi_plat_data rk3368_mipi_dsi_plat_data = {
1487 	.dsi0_grf_reg_fields = rk3368_dsi_grf_reg_fields,
1488 	.max_bit_rate_per_lane = 1000000000UL,
1489 };
1490 
1491 static const struct rockchip_connector rk3368_mipi_dsi_driver_data = {
1492 	 .funcs = &dw_mipi_dsi_connector_funcs,
1493 	 .data = &rk3368_mipi_dsi_plat_data,
1494 };
1495 
1496 static const u32 rk3399_dsi0_grf_reg_fields[MAX_FIELDS] = {
1497 	[DPIUPDATECFG]		= GRF_REG_FIELD(0x6224, 15, 15),
1498 	[DPISHUTDN]		= GRF_REG_FIELD(0x6224, 14, 14),
1499 	[DPICOLORM]		= GRF_REG_FIELD(0x6224, 13, 13),
1500 	[VOPSEL]		= GRF_REG_FIELD(0x6250,  0,  0),
1501 	[TURNREQUEST]		= GRF_REG_FIELD(0x6258, 12, 15),
1502 	[TURNDISABLE]		= GRF_REG_FIELD(0x6258,  8, 11),
1503 	[FORCETXSTOPMODE]	= GRF_REG_FIELD(0x6258,  4,  7),
1504 	[FORCERXMODE]		= GRF_REG_FIELD(0x6258,  0,  3),
1505 };
1506 
1507 static const u32 rk3399_dsi1_grf_reg_fields[MAX_FIELDS] = {
1508 	[VOPSEL]		= GRF_REG_FIELD(0x6250,  4,  4),
1509 	[DPIUPDATECFG]		= GRF_REG_FIELD(0x6250,  3,  3),
1510 	[DPISHUTDN]		= GRF_REG_FIELD(0x6250,  2,  2),
1511 	[DPICOLORM]		= GRF_REG_FIELD(0x6250,  1,  1),
1512 	[TURNDISABLE]		= GRF_REG_FIELD(0x625c, 12, 15),
1513 	[FORCETXSTOPMODE]	= GRF_REG_FIELD(0x625c,  8, 11),
1514 	[FORCERXMODE]           = GRF_REG_FIELD(0x625c,  4,  7),
1515 	[ENABLE_N]		= GRF_REG_FIELD(0x625c,  0,  3),
1516 	[MASTERSLAVEZ]		= GRF_REG_FIELD(0x6260,  7,  7),
1517 	[ENABLECLK]		= GRF_REG_FIELD(0x6260,  6,  6),
1518 	[BASEDIR]		= GRF_REG_FIELD(0x6260,  5,  5),
1519 	[TURNREQUEST]		= GRF_REG_FIELD(0x6260,  0,  3),
1520 };
1521 
1522 static const struct dw_mipi_dsi_plat_data rk3399_mipi_dsi_plat_data = {
1523 	.dsi0_grf_reg_fields = rk3399_dsi0_grf_reg_fields,
1524 	.dsi1_grf_reg_fields = rk3399_dsi1_grf_reg_fields,
1525 	.max_bit_rate_per_lane = 1500000000UL,
1526 };
1527 
1528 static const struct rockchip_connector rk3399_mipi_dsi_driver_data = {
1529 	 .funcs = &dw_mipi_dsi_connector_funcs,
1530 	 .data = &rk3399_mipi_dsi_plat_data,
1531 };
1532 
1533 static const u32 rk3568_dsi0_grf_reg_fields[MAX_FIELDS] = {
1534 	[DPIUPDATECFG]		= GRF_REG_FIELD(0x0360,  2,  2),
1535 	[DPICOLORM]		= GRF_REG_FIELD(0x0360,  1,  1),
1536 	[DPISHUTDN]		= GRF_REG_FIELD(0x0360,  0,  0),
1537 	[SKEWCALHS]		= GRF_REG_FIELD(0x0368, 11, 15),
1538 	[FORCETXSTOPMODE]	= GRF_REG_FIELD(0x0368,  4,  7),
1539 	[TURNDISABLE]		= GRF_REG_FIELD(0x0368,  2,  2),
1540 	[FORCERXMODE]		= GRF_REG_FIELD(0x0368,  0,  0),
1541 };
1542 
1543 static const u32 rk3568_dsi1_grf_reg_fields[MAX_FIELDS] = {
1544 	[DPIUPDATECFG]		= GRF_REG_FIELD(0x0360, 10, 10),
1545 	[DPICOLORM]		= GRF_REG_FIELD(0x0360,  9,  9),
1546 	[DPISHUTDN]		= GRF_REG_FIELD(0x0360,  8,  8),
1547 	[SKEWCALHS]             = GRF_REG_FIELD(0x036c, 11, 15),
1548 	[FORCETXSTOPMODE]	= GRF_REG_FIELD(0x036c,  4,  7),
1549 	[TURNDISABLE]		= GRF_REG_FIELD(0x036c,  2,  2),
1550 	[FORCERXMODE]		= GRF_REG_FIELD(0x036c,  0,  0),
1551 };
1552 
1553 static const struct dw_mipi_dsi_plat_data rk3568_mipi_dsi_plat_data = {
1554 	.dsi0_grf_reg_fields = rk3568_dsi0_grf_reg_fields,
1555 	.dsi1_grf_reg_fields = rk3568_dsi1_grf_reg_fields,
1556 	.max_bit_rate_per_lane = 1200000000UL,
1557 };
1558 static const struct rockchip_connector rk3568_mipi_dsi_driver_data = {
1559 	 .funcs = &dw_mipi_dsi_connector_funcs,
1560 	 .data = &rk3568_mipi_dsi_plat_data,
1561 };
1562 
1563 static const u32 rv1108_dsi_grf_reg_fields[MAX_FIELDS] = {
1564 	[DPICOLORM]		= GRF_REG_FIELD(0x0410,  7,  7),
1565 	[DPISHUTDN]		= GRF_REG_FIELD(0x0410,  6,  6),
1566 	[DPIUPDATECFG]		= GRF_REG_FIELD(0x0410,  8,  8),
1567 	[FORCERXMODE]		= GRF_REG_FIELD(0x0414,  5,  5),
1568 	[FORCETXSTOPMODE]	= GRF_REG_FIELD(0x0414,  6,  9),
1569 	[TURNDISABLE]		= GRF_REG_FIELD(0x0414,  4,  4),
1570 };
1571 
1572 static const struct dw_mipi_dsi_plat_data rv1108_mipi_dsi_plat_data = {
1573 	.dsi0_grf_reg_fields = rv1108_dsi_grf_reg_fields,
1574 	.max_bit_rate_per_lane = 1000000000UL,
1575 };
1576 
1577 static const struct rockchip_connector rv1108_mipi_dsi_driver_data = {
1578 	 .funcs = &dw_mipi_dsi_connector_funcs,
1579 	 .data = &rv1108_mipi_dsi_plat_data,
1580 };
1581 
1582 static const u32 rv1126_dsi_grf_reg_fields[MAX_FIELDS] = {
1583 	[DPIUPDATECFG]		= GRF_REG_FIELD(0x0008,  5,  5),
1584 	[DPISHUTDN]		= GRF_REG_FIELD(0x0008,  4,  4),
1585 	[DPICOLORM]		= GRF_REG_FIELD(0x0008,  3,  3),
1586 	[FORCETXSTOPMODE]	= GRF_REG_FIELD(0x10220,  4,  7),
1587 	[TURNDISABLE]		= GRF_REG_FIELD(0x10220,  2,  2),
1588 	[FORCERXMODE]		= GRF_REG_FIELD(0x10220,  0,  0),
1589 };
1590 
1591 static const struct dw_mipi_dsi_plat_data rv1126_mipi_dsi_plat_data = {
1592 	.dsi0_grf_reg_fields = rv1126_dsi_grf_reg_fields,
1593 	.max_bit_rate_per_lane = 1000000000UL,
1594 };
1595 
1596 static const struct rockchip_connector rv1126_mipi_dsi_driver_data = {
1597 	 .funcs = &dw_mipi_dsi_connector_funcs,
1598 	 .data = &rv1126_mipi_dsi_plat_data,
1599 };
1600 
1601 static const struct udevice_id dw_mipi_dsi_ids[] = {
1602 	{
1603 		.compatible = "rockchip,px30-mipi-dsi",
1604 		.data = (ulong)&px30_mipi_dsi_driver_data,
1605 	},
1606 	{
1607 		.compatible = "rockchip,rk1808-mipi-dsi",
1608 		.data = (ulong)&rk1808_mipi_dsi_driver_data,
1609 	},
1610 	{
1611 		.compatible = "rockchip,rk3128-mipi-dsi",
1612 		.data = (ulong)&rk3128_mipi_dsi_driver_data,
1613 	},
1614 	{
1615 		.compatible = "rockchip,rk3288-mipi-dsi",
1616 		.data = (ulong)&rk3288_mipi_dsi_driver_data,
1617 	},
1618 	{
1619 		.compatible = "rockchip,rk3366-mipi-dsi",
1620 		.data = (ulong)&rk3366_mipi_dsi_driver_data,
1621 	},
1622 	{
1623 		.compatible = "rockchip,rk3368-mipi-dsi",
1624 		.data = (ulong)&rk3368_mipi_dsi_driver_data,
1625 	},
1626 	{
1627 		.compatible = "rockchip,rk3399-mipi-dsi",
1628 		.data = (ulong)&rk3399_mipi_dsi_driver_data,
1629 	},
1630 	{
1631 		.compatible = "rockchip,rk3568-mipi-dsi",
1632 		.data = (ulong)&rk3568_mipi_dsi_driver_data,
1633 	},
1634 	{
1635 		.compatible = "rockchip,rv1108-mipi-dsi",
1636 		.data = (ulong)&rv1108_mipi_dsi_driver_data,
1637 	},
1638 	{
1639 		.compatible = "rockchip,rv1126-mipi-dsi",
1640 		.data = (ulong)&rv1126_mipi_dsi_driver_data,
1641 	},
1642 	{}
1643 };
1644 
1645 static ssize_t dw_mipi_dsi_host_transfer(struct mipi_dsi_host *host,
1646 					 const struct mipi_dsi_msg *msg)
1647 {
1648 	struct dw_mipi_dsi *dsi = dev_get_priv(host->dev);
1649 
1650 	return dw_mipi_dsi_transfer(dsi, msg);
1651 }
1652 
1653 static int dw_mipi_dsi_host_attach(struct mipi_dsi_host *host,
1654 				   struct mipi_dsi_device *device)
1655 {
1656 	struct dw_mipi_dsi *dsi = dev_get_priv(host->dev);
1657 
1658 	if (device->lanes < 1 || device->lanes > 8)
1659 		return -EINVAL;
1660 
1661 	dsi->lanes = device->lanes;
1662 	dsi->channel = device->channel;
1663 	dsi->format = device->format;
1664 	dsi->mode_flags = device->mode_flags;
1665 
1666 	return 0;
1667 }
1668 
1669 static const struct mipi_dsi_host_ops dw_mipi_dsi_host_ops = {
1670 	.attach = dw_mipi_dsi_host_attach,
1671 	.transfer = dw_mipi_dsi_host_transfer,
1672 };
1673 
1674 static int dw_mipi_dsi_bind(struct udevice *dev)
1675 {
1676 	struct mipi_dsi_host *host = dev_get_platdata(dev);
1677 
1678 	host->dev = dev;
1679 	host->ops = &dw_mipi_dsi_host_ops;
1680 
1681 	return dm_scan_fdt_dev(dev);
1682 }
1683 
1684 static int dw_mipi_dsi_child_post_bind(struct udevice *dev)
1685 {
1686 	struct mipi_dsi_host *host = dev_get_platdata(dev->parent);
1687 	struct mipi_dsi_device *device = dev_get_parent_platdata(dev);
1688 	char name[20];
1689 
1690 	sprintf(name, "%s.%d", host->dev->name, device->channel);
1691 	device_set_name(dev, name);
1692 
1693 	device->dev = dev;
1694 	device->host = host;
1695 	device->lanes = dev_read_u32_default(dev, "dsi,lanes", 4);
1696 	device->format = dev_read_u32_default(dev, "dsi,format",
1697 					      MIPI_DSI_FMT_RGB888);
1698 	device->mode_flags = dev_read_u32_default(dev, "dsi,flags",
1699 						  MIPI_DSI_MODE_VIDEO |
1700 						  MIPI_DSI_MODE_VIDEO_BURST |
1701 						  MIPI_DSI_MODE_VIDEO_HBP |
1702 						  MIPI_DSI_MODE_LPM |
1703 						  MIPI_DSI_MODE_EOT_PACKET);
1704 	device->channel = dev_read_u32_default(dev, "reg", 0);
1705 
1706 	return 0;
1707 }
1708 
1709 static int dw_mipi_dsi_child_pre_probe(struct udevice *dev)
1710 {
1711 	struct mipi_dsi_device *device = dev_get_parent_platdata(dev);
1712 	int ret;
1713 
1714 	ret = mipi_dsi_attach(device);
1715 	if (ret) {
1716 		dev_err(dev, "mipi_dsi_attach() failed: %d\n", ret);
1717 		return ret;
1718 	}
1719 
1720 	return 0;
1721 }
1722 
1723 U_BOOT_DRIVER(dw_mipi_dsi) = {
1724 	.name = "dw_mipi_dsi",
1725 	.id = UCLASS_DISPLAY,
1726 	.of_match = dw_mipi_dsi_ids,
1727 	.probe = dw_mipi_dsi_probe,
1728 	.bind = dw_mipi_dsi_bind,
1729 	.priv_auto_alloc_size = sizeof(struct dw_mipi_dsi),
1730 	.per_child_platdata_auto_alloc_size = sizeof(struct mipi_dsi_device),
1731 	.platdata_auto_alloc_size = sizeof(struct mipi_dsi_host),
1732 	.child_post_bind = dw_mipi_dsi_child_post_bind,
1733 	.child_pre_probe = dw_mipi_dsi_child_pre_probe,
1734 };
1735