1 // SPDX-License-Identifier: GPL-2.0+
3 * Copyright (C) Fuzhou Rockchip Electronics Co.Ltd
5 * Chris Zhong <zyw@rock-chips.com>
6 * Nickey Yang <nickey.yang@rock-chips.com>
10 #include <linux/iopoll.h>
11 #include <linux/math64.h>
12 #include <linux/mfd/syscon.h>
13 #include <linux/module.h>
14 #include <linux/of_device.h>
15 #include <linux/phy/phy.h>
16 #include <linux/pm_runtime.h>
17 #include <linux/regmap.h>
19 #include <video/mipi_display.h>
21 #include <drm/bridge/dw_mipi_dsi.h>
22 #include <drm/drm_mipi_dsi.h>
23 #include <drm/drm_of.h>
25 #include "rockchip_drm_drv.h"
26 #include "rockchip_drm_vop.h"
28 #define DSI_PHY_RSTZ 0xa0
29 #define PHY_DISFORCEPLL 0
30 #define PHY_ENFORCEPLL BIT(3)
31 #define PHY_DISABLECLK 0
32 #define PHY_ENABLECLK BIT(2)
34 #define PHY_UNRSTZ BIT(1)
35 #define PHY_SHUTDOWNZ 0
36 #define PHY_UNSHUTDOWNZ BIT(0)
38 #define DSI_PHY_IF_CFG 0xa4
39 #define N_LANES(n) ((((n) - 1) & 0x3) << 0)
40 #define PHY_STOP_WAIT_TIME(cycle) (((cycle) & 0xff) << 8)
42 #define DSI_PHY_STATUS 0xb0
44 #define STOP_STATE_CLK_LANE BIT(2)
46 #define DSI_PHY_TST_CTRL0 0xb4
47 #define PHY_TESTCLK BIT(1)
48 #define PHY_UNTESTCLK 0
49 #define PHY_TESTCLR BIT(0)
50 #define PHY_UNTESTCLR 0
52 #define DSI_PHY_TST_CTRL1 0xb8
53 #define PHY_TESTEN BIT(16)
54 #define PHY_UNTESTEN 0
55 #define PHY_TESTDOUT(n) (((n) & 0xff) << 8)
56 #define PHY_TESTDIN(n) (((n) & 0xff) << 0)
58 #define DSI_INT_ST0 0xbc
59 #define DSI_INT_ST1 0xc0
60 #define DSI_INT_MSK0 0xc4
61 #define DSI_INT_MSK1 0xc8
63 #define PHY_STATUS_TIMEOUT_US 10000
64 #define CMD_PKT_STATUS_TIMEOUT_US 20000
66 #define BYPASS_VCO_RANGE BIT(7)
67 #define VCO_RANGE_CON_SEL(val) (((val) & 0x7) << 3)
68 #define VCO_IN_CAP_CON_DEFAULT (0x0 << 1)
69 #define VCO_IN_CAP_CON_LOW (0x1 << 1)
70 #define VCO_IN_CAP_CON_HIGH (0x2 << 1)
71 #define REF_BIAS_CUR_SEL BIT(0)
73 #define CP_CURRENT_3UA 0x1
74 #define CP_CURRENT_4_5UA 0x2
75 #define CP_CURRENT_7_5UA 0x6
76 #define CP_CURRENT_6UA 0x9
77 #define CP_CURRENT_12UA 0xb
78 #define CP_CURRENT_SEL(val) ((val) & 0xf)
79 #define CP_PROGRAM_EN BIT(7)
81 #define LPF_RESISTORS_15_5KOHM 0x1
82 #define LPF_RESISTORS_13KOHM 0x2
83 #define LPF_RESISTORS_11_5KOHM 0x4
84 #define LPF_RESISTORS_10_5KOHM 0x8
85 #define LPF_RESISTORS_8KOHM 0x10
86 #define LPF_PROGRAM_EN BIT(6)
87 #define LPF_RESISTORS_SEL(val) ((val) & 0x3f)
89 #define HSFREQRANGE_SEL(val) (((val) & 0x3f) << 1)
91 #define INPUT_DIVIDER(val) (((val) - 1) & 0x7f)
92 #define LOW_PROGRAM_EN 0
93 #define HIGH_PROGRAM_EN BIT(7)
94 #define LOOP_DIV_LOW_SEL(val) (((val) - 1) & 0x1f)
95 #define LOOP_DIV_HIGH_SEL(val) ((((val) - 1) >> 5) & 0xf)
96 #define PLL_LOOP_DIV_EN BIT(5)
97 #define PLL_INPUT_DIV_EN BIT(4)
99 #define POWER_CONTROL BIT(6)
100 #define INTERNAL_REG_CURRENT BIT(3)
101 #define BIAS_BLOCK_ON BIT(2)
102 #define BANDGAP_ON BIT(0)
104 #define TER_RESISTOR_HIGH BIT(7)
105 #define TER_RESISTOR_LOW 0
106 #define LEVEL_SHIFTERS_ON BIT(6)
107 #define TER_CAL_DONE BIT(5)
108 #define SETRD_MAX (0x7 << 2)
109 #define POWER_MANAGE BIT(1)
110 #define TER_RESISTORS_ON BIT(0)
112 #define BIASEXTR_SEL(val) ((val) & 0x7)
113 #define BANDGAP_SEL(val) ((val) & 0x7)
114 #define TLP_PROGRAM_EN BIT(7)
115 #define THS_PRE_PROGRAM_EN BIT(7)
116 #define THS_ZERO_PROGRAM_EN BIT(6)
118 #define PLL_BIAS_CUR_SEL_CAP_VCO_CONTROL 0x10
119 #define PLL_CP_CONTROL_PLL_LOCK_BYPASS 0x11
120 #define PLL_LPF_AND_CP_CONTROL 0x12
121 #define PLL_INPUT_DIVIDER_RATIO 0x17
122 #define PLL_LOOP_DIVIDER_RATIO 0x18
123 #define PLL_INPUT_AND_LOOP_DIVIDER_RATIOS_CONTROL 0x19
124 #define BANDGAP_AND_BIAS_CONTROL 0x20
125 #define TERMINATION_RESISTER_CONTROL 0x21
126 #define AFE_BIAS_BANDGAP_ANALOG_PROGRAMMABILITY 0x22
127 #define HS_RX_CONTROL_OF_LANE_0 0x44
128 #define HS_TX_CLOCK_LANE_REQUEST_STATE_TIME_CONTROL 0x60
129 #define HS_TX_CLOCK_LANE_PREPARE_STATE_TIME_CONTROL 0x61
130 #define HS_TX_CLOCK_LANE_HS_ZERO_STATE_TIME_CONTROL 0x62
131 #define HS_TX_CLOCK_LANE_TRAIL_STATE_TIME_CONTROL 0x63
132 #define HS_TX_CLOCK_LANE_EXIT_STATE_TIME_CONTROL 0x64
133 #define HS_TX_CLOCK_LANE_POST_TIME_CONTROL 0x65
134 #define HS_TX_DATA_LANE_REQUEST_STATE_TIME_CONTROL 0x70
135 #define HS_TX_DATA_LANE_PREPARE_STATE_TIME_CONTROL 0x71
136 #define HS_TX_DATA_LANE_HS_ZERO_STATE_TIME_CONTROL 0x72
137 #define HS_TX_DATA_LANE_TRAIL_STATE_TIME_CONTROL 0x73
138 #define HS_TX_DATA_LANE_EXIT_STATE_TIME_CONTROL 0x74
140 #define DW_MIPI_NEEDS_PHY_CFG_CLK BIT(0)
141 #define DW_MIPI_NEEDS_GRF_CLK BIT(1)
143 #define PX30_GRF_PD_VO_CON1 0x0438
144 #define PX30_DSI_FORCETXSTOPMODE (0xf << 7)
145 #define PX30_DSI_FORCERXMODE BIT(6)
146 #define PX30_DSI_TURNDISABLE BIT(5)
147 #define PX30_DSI_LCDC_SEL BIT(0)
149 #define RK3288_GRF_SOC_CON6 0x025c
150 #define RK3288_DSI0_LCDC_SEL BIT(6)
151 #define RK3288_DSI1_LCDC_SEL BIT(9)
153 #define RK3399_GRF_SOC_CON20 0x6250
154 #define RK3399_DSI0_LCDC_SEL BIT(0)
155 #define RK3399_DSI1_LCDC_SEL BIT(4)
157 #define RK3399_GRF_SOC_CON22 0x6258
158 #define RK3399_DSI0_TURNREQUEST (0xf << 12)
159 #define RK3399_DSI0_TURNDISABLE (0xf << 8)
160 #define RK3399_DSI0_FORCETXSTOPMODE (0xf << 4)
161 #define RK3399_DSI0_FORCERXMODE (0xf << 0)
163 #define RK3399_GRF_SOC_CON23 0x625c
164 #define RK3399_DSI1_TURNDISABLE (0xf << 12)
165 #define RK3399_DSI1_FORCETXSTOPMODE (0xf << 8)
166 #define RK3399_DSI1_FORCERXMODE (0xf << 4)
167 #define RK3399_DSI1_ENABLE (0xf << 0)
169 #define RK3399_GRF_SOC_CON24 0x6260
170 #define RK3399_TXRX_MASTERSLAVEZ BIT(7)
171 #define RK3399_TXRX_ENABLECLK BIT(6)
172 #define RK3399_TXRX_BASEDIR BIT(5)
174 #define HIWORD_UPDATE(val, mask) (val | (mask) << 16)
176 #define to_dsi(nm) container_of(nm, struct dw_mipi_dsi_rockchip, nm)
200 struct rockchip_dw_dsi_chip_data
{
210 u32 lanecfg1_grf_reg
;
212 u32 lanecfg2_grf_reg
;
216 unsigned int max_data_lanes
;
219 struct dw_mipi_dsi_rockchip
{
221 struct drm_encoder encoder
;
224 struct regmap
*grf_regmap
;
225 struct clk
*pllref_clk
;
227 struct clk
*phy_cfg_clk
;
231 struct dw_mipi_dsi_rockchip
*slave
;
233 /* optional external dphy */
235 union phy_configure_opts phy_opts
;
237 unsigned int lane_mbps
; /* per lane */
242 struct dw_mipi_dsi
*dmd
;
243 const struct rockchip_dw_dsi_chip_data
*cdata
;
244 struct dw_mipi_dsi_plat_data pdata
;
248 struct dphy_pll_parameter_map
{
249 unsigned int max_mbps
;
255 /* The table is based on 27MHz DPHY pll reference clock. */
256 static const struct dphy_pll_parameter_map dppa_map
[] = {
257 { 89, 0x00, CP_CURRENT_3UA
, LPF_RESISTORS_13KOHM
},
258 { 99, 0x10, CP_CURRENT_3UA
, LPF_RESISTORS_13KOHM
},
259 { 109, 0x20, CP_CURRENT_3UA
, LPF_RESISTORS_13KOHM
},
260 { 129, 0x01, CP_CURRENT_3UA
, LPF_RESISTORS_15_5KOHM
},
261 { 139, 0x11, CP_CURRENT_3UA
, LPF_RESISTORS_15_5KOHM
},
262 { 149, 0x21, CP_CURRENT_3UA
, LPF_RESISTORS_15_5KOHM
},
263 { 169, 0x02, CP_CURRENT_6UA
, LPF_RESISTORS_13KOHM
},
264 { 179, 0x12, CP_CURRENT_6UA
, LPF_RESISTORS_13KOHM
},
265 { 199, 0x22, CP_CURRENT_6UA
, LPF_RESISTORS_13KOHM
},
266 { 219, 0x03, CP_CURRENT_4_5UA
, LPF_RESISTORS_13KOHM
},
267 { 239, 0x13, CP_CURRENT_4_5UA
, LPF_RESISTORS_13KOHM
},
268 { 249, 0x23, CP_CURRENT_4_5UA
, LPF_RESISTORS_13KOHM
},
269 { 269, 0x04, CP_CURRENT_6UA
, LPF_RESISTORS_11_5KOHM
},
270 { 299, 0x14, CP_CURRENT_6UA
, LPF_RESISTORS_11_5KOHM
},
271 { 329, 0x05, CP_CURRENT_3UA
, LPF_RESISTORS_15_5KOHM
},
272 { 359, 0x15, CP_CURRENT_3UA
, LPF_RESISTORS_15_5KOHM
},
273 { 399, 0x25, CP_CURRENT_3UA
, LPF_RESISTORS_15_5KOHM
},
274 { 449, 0x06, CP_CURRENT_7_5UA
, LPF_RESISTORS_11_5KOHM
},
275 { 499, 0x16, CP_CURRENT_7_5UA
, LPF_RESISTORS_11_5KOHM
},
276 { 549, 0x07, CP_CURRENT_7_5UA
, LPF_RESISTORS_10_5KOHM
},
277 { 599, 0x17, CP_CURRENT_7_5UA
, LPF_RESISTORS_10_5KOHM
},
278 { 649, 0x08, CP_CURRENT_7_5UA
, LPF_RESISTORS_11_5KOHM
},
279 { 699, 0x18, CP_CURRENT_7_5UA
, LPF_RESISTORS_11_5KOHM
},
280 { 749, 0x09, CP_CURRENT_7_5UA
, LPF_RESISTORS_11_5KOHM
},
281 { 799, 0x19, CP_CURRENT_7_5UA
, LPF_RESISTORS_11_5KOHM
},
282 { 849, 0x29, CP_CURRENT_7_5UA
, LPF_RESISTORS_11_5KOHM
},
283 { 899, 0x39, CP_CURRENT_7_5UA
, LPF_RESISTORS_11_5KOHM
},
284 { 949, 0x0a, CP_CURRENT_12UA
, LPF_RESISTORS_8KOHM
},
285 { 999, 0x1a, CP_CURRENT_12UA
, LPF_RESISTORS_8KOHM
},
286 {1049, 0x2a, CP_CURRENT_12UA
, LPF_RESISTORS_8KOHM
},
287 {1099, 0x3a, CP_CURRENT_12UA
, LPF_RESISTORS_8KOHM
},
288 {1149, 0x0b, CP_CURRENT_12UA
, LPF_RESISTORS_10_5KOHM
},
289 {1199, 0x1b, CP_CURRENT_12UA
, LPF_RESISTORS_10_5KOHM
},
290 {1249, 0x2b, CP_CURRENT_12UA
, LPF_RESISTORS_10_5KOHM
},
291 {1299, 0x3b, CP_CURRENT_12UA
, LPF_RESISTORS_10_5KOHM
},
292 {1349, 0x0c, CP_CURRENT_12UA
, LPF_RESISTORS_10_5KOHM
},
293 {1399, 0x1c, CP_CURRENT_12UA
, LPF_RESISTORS_10_5KOHM
},
294 {1449, 0x2c, CP_CURRENT_12UA
, LPF_RESISTORS_10_5KOHM
},
295 {1500, 0x3c, CP_CURRENT_12UA
, LPF_RESISTORS_10_5KOHM
}
298 static int max_mbps_to_parameter(unsigned int max_mbps
)
302 for (i
= 0; i
< ARRAY_SIZE(dppa_map
); i
++)
303 if (dppa_map
[i
].max_mbps
>= max_mbps
)
309 static inline void dsi_write(struct dw_mipi_dsi_rockchip
*dsi
, u32 reg
, u32 val
)
311 writel(val
, dsi
->base
+ reg
);
314 static inline u32
dsi_read(struct dw_mipi_dsi_rockchip
*dsi
, u32 reg
)
316 return readl(dsi
->base
+ reg
);
319 static inline void dsi_set(struct dw_mipi_dsi_rockchip
*dsi
, u32 reg
, u32 mask
)
321 dsi_write(dsi
, reg
, dsi_read(dsi
, reg
) | mask
);
324 static inline void dsi_update_bits(struct dw_mipi_dsi_rockchip
*dsi
, u32 reg
,
327 dsi_write(dsi
, reg
, (dsi_read(dsi
, reg
) & ~mask
) | val
);
330 static void dw_mipi_dsi_phy_write(struct dw_mipi_dsi_rockchip
*dsi
,
335 * With the falling edge on TESTCLK, the TESTDIN[7:0] signal content
336 * is latched internally as the current test code. Test data is
337 * programmed internally by rising edge on TESTCLK.
339 dsi_write(dsi
, DSI_PHY_TST_CTRL0
, PHY_TESTCLK
| PHY_UNTESTCLR
);
341 dsi_write(dsi
, DSI_PHY_TST_CTRL1
, PHY_TESTEN
| PHY_TESTDOUT(0) |
342 PHY_TESTDIN(test_code
));
344 dsi_write(dsi
, DSI_PHY_TST_CTRL0
, PHY_UNTESTCLK
| PHY_UNTESTCLR
);
346 dsi_write(dsi
, DSI_PHY_TST_CTRL1
, PHY_UNTESTEN
| PHY_TESTDOUT(0) |
347 PHY_TESTDIN(test_data
));
349 dsi_write(dsi
, DSI_PHY_TST_CTRL0
, PHY_TESTCLK
| PHY_UNTESTCLR
);
353 * ns2bc - Nanoseconds to byte clock cycles
355 static inline unsigned int ns2bc(struct dw_mipi_dsi_rockchip
*dsi
, int ns
)
357 return DIV_ROUND_UP(ns
* dsi
->lane_mbps
/ 8, 1000);
361 * ns2ui - Nanoseconds to UI time periods
363 static inline unsigned int ns2ui(struct dw_mipi_dsi_rockchip
*dsi
, int ns
)
365 return DIV_ROUND_UP(ns
* dsi
->lane_mbps
, 1000);
368 static int dw_mipi_dsi_phy_init(void *priv_data
)
370 struct dw_mipi_dsi_rockchip
*dsi
= priv_data
;
377 * Get vco from frequency(lane_mbps)
378 * vco frequency table
379 * 000 - between 80 and 200 MHz
380 * 001 - between 200 and 300 MHz
381 * 010 - between 300 and 500 MHz
382 * 011 - between 500 and 700 MHz
383 * 100 - between 700 and 900 MHz
384 * 101 - between 900 and 1100 MHz
385 * 110 - between 1100 and 1300 MHz
386 * 111 - between 1300 and 1500 MHz
388 vco
= (dsi
->lane_mbps
< 200) ? 0 : (dsi
->lane_mbps
+ 100) / 200;
390 i
= max_mbps_to_parameter(dsi
->lane_mbps
);
392 DRM_DEV_ERROR(dsi
->dev
,
393 "failed to get parameter for %dmbps clock\n",
398 ret
= clk_prepare_enable(dsi
->phy_cfg_clk
);
400 DRM_DEV_ERROR(dsi
->dev
, "Failed to enable phy_cfg_clk\n");
404 dw_mipi_dsi_phy_write(dsi
, PLL_BIAS_CUR_SEL_CAP_VCO_CONTROL
,
406 VCO_RANGE_CON_SEL(vco
) |
410 dw_mipi_dsi_phy_write(dsi
, PLL_CP_CONTROL_PLL_LOCK_BYPASS
,
411 CP_CURRENT_SEL(dppa_map
[i
].icpctrl
));
412 dw_mipi_dsi_phy_write(dsi
, PLL_LPF_AND_CP_CONTROL
,
413 CP_PROGRAM_EN
| LPF_PROGRAM_EN
|
414 LPF_RESISTORS_SEL(dppa_map
[i
].lpfctrl
));
416 dw_mipi_dsi_phy_write(dsi
, HS_RX_CONTROL_OF_LANE_0
,
417 HSFREQRANGE_SEL(dppa_map
[i
].hsfreqrange
));
419 dw_mipi_dsi_phy_write(dsi
, PLL_INPUT_DIVIDER_RATIO
,
420 INPUT_DIVIDER(dsi
->input_div
));
421 dw_mipi_dsi_phy_write(dsi
, PLL_LOOP_DIVIDER_RATIO
,
422 LOOP_DIV_LOW_SEL(dsi
->feedback_div
) |
425 * We need set PLL_INPUT_AND_LOOP_DIVIDER_RATIOS_CONTROL immediately
426 * to make the configured LSB effective according to IP simulation
427 * and lab test results.
428 * Only in this way can we get correct mipi phy pll frequency.
430 dw_mipi_dsi_phy_write(dsi
, PLL_INPUT_AND_LOOP_DIVIDER_RATIOS_CONTROL
,
431 PLL_LOOP_DIV_EN
| PLL_INPUT_DIV_EN
);
432 dw_mipi_dsi_phy_write(dsi
, PLL_LOOP_DIVIDER_RATIO
,
433 LOOP_DIV_HIGH_SEL(dsi
->feedback_div
) |
435 dw_mipi_dsi_phy_write(dsi
, PLL_INPUT_AND_LOOP_DIVIDER_RATIOS_CONTROL
,
436 PLL_LOOP_DIV_EN
| PLL_INPUT_DIV_EN
);
438 dw_mipi_dsi_phy_write(dsi
, AFE_BIAS_BANDGAP_ANALOG_PROGRAMMABILITY
,
439 LOW_PROGRAM_EN
| BIASEXTR_SEL(BIASEXTR_127_7
));
440 dw_mipi_dsi_phy_write(dsi
, AFE_BIAS_BANDGAP_ANALOG_PROGRAMMABILITY
,
441 HIGH_PROGRAM_EN
| BANDGAP_SEL(BANDGAP_96_10
));
443 dw_mipi_dsi_phy_write(dsi
, BANDGAP_AND_BIAS_CONTROL
,
444 POWER_CONTROL
| INTERNAL_REG_CURRENT
|
445 BIAS_BLOCK_ON
| BANDGAP_ON
);
447 dw_mipi_dsi_phy_write(dsi
, TERMINATION_RESISTER_CONTROL
,
448 TER_RESISTOR_LOW
| TER_CAL_DONE
|
449 SETRD_MAX
| TER_RESISTORS_ON
);
450 dw_mipi_dsi_phy_write(dsi
, TERMINATION_RESISTER_CONTROL
,
451 TER_RESISTOR_HIGH
| LEVEL_SHIFTERS_ON
|
452 SETRD_MAX
| POWER_MANAGE
|
455 dw_mipi_dsi_phy_write(dsi
, HS_TX_CLOCK_LANE_REQUEST_STATE_TIME_CONTROL
,
456 TLP_PROGRAM_EN
| ns2bc(dsi
, 500));
457 dw_mipi_dsi_phy_write(dsi
, HS_TX_CLOCK_LANE_PREPARE_STATE_TIME_CONTROL
,
458 THS_PRE_PROGRAM_EN
| ns2ui(dsi
, 40));
459 dw_mipi_dsi_phy_write(dsi
, HS_TX_CLOCK_LANE_HS_ZERO_STATE_TIME_CONTROL
,
460 THS_ZERO_PROGRAM_EN
| ns2bc(dsi
, 300));
461 dw_mipi_dsi_phy_write(dsi
, HS_TX_CLOCK_LANE_TRAIL_STATE_TIME_CONTROL
,
462 THS_PRE_PROGRAM_EN
| ns2ui(dsi
, 100));
463 dw_mipi_dsi_phy_write(dsi
, HS_TX_CLOCK_LANE_EXIT_STATE_TIME_CONTROL
,
464 BIT(5) | ns2bc(dsi
, 100));
465 dw_mipi_dsi_phy_write(dsi
, HS_TX_CLOCK_LANE_POST_TIME_CONTROL
,
466 BIT(5) | (ns2bc(dsi
, 60) + 7));
468 dw_mipi_dsi_phy_write(dsi
, HS_TX_DATA_LANE_REQUEST_STATE_TIME_CONTROL
,
469 TLP_PROGRAM_EN
| ns2bc(dsi
, 500));
470 dw_mipi_dsi_phy_write(dsi
, HS_TX_DATA_LANE_PREPARE_STATE_TIME_CONTROL
,
471 THS_PRE_PROGRAM_EN
| (ns2ui(dsi
, 50) + 20));
472 dw_mipi_dsi_phy_write(dsi
, HS_TX_DATA_LANE_HS_ZERO_STATE_TIME_CONTROL
,
473 THS_ZERO_PROGRAM_EN
| (ns2bc(dsi
, 140) + 2));
474 dw_mipi_dsi_phy_write(dsi
, HS_TX_DATA_LANE_TRAIL_STATE_TIME_CONTROL
,
475 THS_PRE_PROGRAM_EN
| (ns2ui(dsi
, 60) + 8));
476 dw_mipi_dsi_phy_write(dsi
, HS_TX_DATA_LANE_EXIT_STATE_TIME_CONTROL
,
477 BIT(5) | ns2bc(dsi
, 100));
479 clk_disable_unprepare(dsi
->phy_cfg_clk
);
484 static void dw_mipi_dsi_phy_power_on(void *priv_data
)
486 struct dw_mipi_dsi_rockchip
*dsi
= priv_data
;
489 ret
= phy_set_mode(dsi
->phy
, PHY_MODE_MIPI_DPHY
);
491 DRM_DEV_ERROR(dsi
->dev
, "failed to set phy mode: %d\n", ret
);
495 phy_configure(dsi
->phy
, &dsi
->phy_opts
);
496 phy_power_on(dsi
->phy
);
499 static void dw_mipi_dsi_phy_power_off(void *priv_data
)
501 struct dw_mipi_dsi_rockchip
*dsi
= priv_data
;
503 phy_power_off(dsi
->phy
);
507 dw_mipi_dsi_get_lane_mbps(void *priv_data
, const struct drm_display_mode
*mode
,
508 unsigned long mode_flags
, u32 lanes
, u32 format
,
509 unsigned int *lane_mbps
)
511 struct dw_mipi_dsi_rockchip
*dsi
= priv_data
;
513 unsigned long mpclk
, tmp
;
514 unsigned int target_mbps
= 1000;
515 unsigned int max_mbps
= dppa_map
[ARRAY_SIZE(dppa_map
) - 1].max_mbps
;
516 unsigned long best_freq
= 0;
517 unsigned long fvco_min
, fvco_max
, fin
, fout
;
518 unsigned int min_prediv
, max_prediv
;
519 unsigned int _prediv
, uninitialized_var(best_prediv
);
520 unsigned long _fbdiv
, uninitialized_var(best_fbdiv
);
521 unsigned long min_delta
= ULONG_MAX
;
523 dsi
->format
= format
;
524 bpp
= mipi_dsi_pixel_format_to_bpp(dsi
->format
);
526 DRM_DEV_ERROR(dsi
->dev
,
527 "failed to get bpp for pixel format %d\n",
532 mpclk
= DIV_ROUND_UP(mode
->clock
, MSEC_PER_SEC
);
534 /* take 1 / 0.8, since mbps must big than bandwidth of RGB */
535 tmp
= mpclk
* (bpp
/ lanes
) * 10 / 8;
539 DRM_DEV_ERROR(dsi
->dev
,
540 "DPHY clock frequency is out of range\n");
543 /* for external phy only a the mipi_dphy_config is necessary */
545 phy_mipi_dphy_get_default_config(mode
->clock
* 1000 * 10 / 8,
547 &dsi
->phy_opts
.mipi_dphy
);
548 dsi
->lane_mbps
= target_mbps
;
549 *lane_mbps
= dsi
->lane_mbps
;
554 fin
= clk_get_rate(dsi
->pllref_clk
);
555 fout
= target_mbps
* USEC_PER_SEC
;
557 /* constraint: 5Mhz <= Fref / N <= 40MHz */
558 min_prediv
= DIV_ROUND_UP(fin
, 40 * USEC_PER_SEC
);
559 max_prediv
= fin
/ (5 * USEC_PER_SEC
);
561 /* constraint: 80MHz <= Fvco <= 1500Mhz */
562 fvco_min
= 80 * USEC_PER_SEC
;
563 fvco_max
= 1500 * USEC_PER_SEC
;
565 for (_prediv
= min_prediv
; _prediv
<= max_prediv
; _prediv
++) {
568 /* Fvco = Fref * M / N */
569 tmp
= (u64
)fout
* _prediv
;
573 * Due to the use of a "by 2 pre-scaler," the range of the
574 * feedback multiplication value M is limited to even division
575 * numbers, and m must be greater than 6, not bigger than 512.
577 if (_fbdiv
< 6 || _fbdiv
> 512)
580 _fbdiv
+= _fbdiv
% 2;
582 tmp
= (u64
)_fbdiv
* fin
;
583 do_div(tmp
, _prediv
);
584 if (tmp
< fvco_min
|| tmp
> fvco_max
)
587 delta
= abs(fout
- tmp
);
588 if (delta
< min_delta
) {
589 best_prediv
= _prediv
;
597 dsi
->lane_mbps
= DIV_ROUND_UP(best_freq
, USEC_PER_SEC
);
598 *lane_mbps
= dsi
->lane_mbps
;
599 dsi
->input_div
= best_prediv
;
600 dsi
->feedback_div
= best_fbdiv
;
602 DRM_DEV_ERROR(dsi
->dev
, "Can not find best_freq for DPHY\n");
610 unsigned int maxfreq
;
611 struct dw_mipi_dsi_dphy_timing timing
;
614 #define HSTT(_maxfreq, _c_lp2hs, _c_hs2lp, _d_lp2hs, _d_hs2lp) \
616 .maxfreq = _maxfreq, \
618 .clk_lp2hs = _c_lp2hs, \
619 .clk_hs2lp = _c_hs2lp, \
620 .data_lp2hs = _d_lp2hs, \
621 .data_hs2lp = _d_hs2lp, \
625 /* Table A-3 High-Speed Transition Times */
626 struct hstt hstt_table
[] = {
627 HSTT( 90, 32, 20, 26, 13),
628 HSTT( 100, 35, 23, 28, 14),
629 HSTT( 110, 32, 22, 26, 13),
630 HSTT( 130, 31, 20, 27, 13),
631 HSTT( 140, 33, 22, 26, 14),
632 HSTT( 150, 33, 21, 26, 14),
633 HSTT( 170, 32, 20, 27, 13),
634 HSTT( 180, 36, 23, 30, 15),
635 HSTT( 200, 40, 22, 33, 15),
636 HSTT( 220, 40, 22, 33, 15),
637 HSTT( 240, 44, 24, 36, 16),
638 HSTT( 250, 48, 24, 38, 17),
639 HSTT( 270, 48, 24, 38, 17),
640 HSTT( 300, 50, 27, 41, 18),
641 HSTT( 330, 56, 28, 45, 18),
642 HSTT( 360, 59, 28, 48, 19),
643 HSTT( 400, 61, 30, 50, 20),
644 HSTT( 450, 67, 31, 55, 21),
645 HSTT( 500, 73, 31, 59, 22),
646 HSTT( 550, 79, 36, 63, 24),
647 HSTT( 600, 83, 37, 68, 25),
648 HSTT( 650, 90, 38, 73, 27),
649 HSTT( 700, 95, 40, 77, 28),
650 HSTT( 750, 102, 40, 84, 28),
651 HSTT( 800, 106, 42, 87, 30),
652 HSTT( 850, 113, 44, 93, 31),
653 HSTT( 900, 118, 47, 98, 32),
654 HSTT( 950, 124, 47, 102, 34),
655 HSTT(1000, 130, 49, 107, 35),
656 HSTT(1050, 135, 51, 111, 37),
657 HSTT(1100, 139, 51, 114, 38),
658 HSTT(1150, 146, 54, 120, 40),
659 HSTT(1200, 153, 57, 125, 41),
660 HSTT(1250, 158, 58, 130, 42),
661 HSTT(1300, 163, 58, 135, 44),
662 HSTT(1350, 168, 60, 140, 45),
663 HSTT(1400, 172, 64, 144, 47),
664 HSTT(1450, 176, 65, 148, 48),
665 HSTT(1500, 181, 66, 153, 50)
669 dw_mipi_dsi_phy_get_timing(void *priv_data
, unsigned int lane_mbps
,
670 struct dw_mipi_dsi_dphy_timing
*timing
)
674 for (i
= 0; i
< ARRAY_SIZE(hstt_table
); i
++)
675 if (lane_mbps
< hstt_table
[i
].maxfreq
)
678 if (i
== ARRAY_SIZE(hstt_table
))
681 *timing
= hstt_table
[i
].timing
;
686 static const struct dw_mipi_dsi_phy_ops dw_mipi_dsi_rockchip_phy_ops
= {
687 .init
= dw_mipi_dsi_phy_init
,
688 .power_on
= dw_mipi_dsi_phy_power_on
,
689 .power_off
= dw_mipi_dsi_phy_power_off
,
690 .get_lane_mbps
= dw_mipi_dsi_get_lane_mbps
,
691 .get_timing
= dw_mipi_dsi_phy_get_timing
,
694 static void dw_mipi_dsi_rockchip_config(struct dw_mipi_dsi_rockchip
*dsi
,
697 if (dsi
->cdata
->lcdsel_grf_reg
)
698 regmap_write(dsi
->grf_regmap
, dsi
->cdata
->lcdsel_grf_reg
,
699 mux
? dsi
->cdata
->lcdsel_lit
: dsi
->cdata
->lcdsel_big
);
701 if (dsi
->cdata
->lanecfg1_grf_reg
)
702 regmap_write(dsi
->grf_regmap
, dsi
->cdata
->lanecfg1_grf_reg
,
703 dsi
->cdata
->lanecfg1
);
705 if (dsi
->cdata
->lanecfg2_grf_reg
)
706 regmap_write(dsi
->grf_regmap
, dsi
->cdata
->lanecfg2_grf_reg
,
707 dsi
->cdata
->lanecfg2
);
709 if (dsi
->cdata
->enable_grf_reg
)
710 regmap_write(dsi
->grf_regmap
, dsi
->cdata
->enable_grf_reg
,
715 dw_mipi_dsi_encoder_atomic_check(struct drm_encoder
*encoder
,
716 struct drm_crtc_state
*crtc_state
,
717 struct drm_connector_state
*conn_state
)
719 struct rockchip_crtc_state
*s
= to_rockchip_crtc_state(crtc_state
);
720 struct dw_mipi_dsi_rockchip
*dsi
= to_dsi(encoder
);
722 switch (dsi
->format
) {
723 case MIPI_DSI_FMT_RGB888
:
724 s
->output_mode
= ROCKCHIP_OUT_MODE_P888
;
726 case MIPI_DSI_FMT_RGB666
:
727 s
->output_mode
= ROCKCHIP_OUT_MODE_P666
;
729 case MIPI_DSI_FMT_RGB565
:
730 s
->output_mode
= ROCKCHIP_OUT_MODE_P565
;
737 s
->output_type
= DRM_MODE_CONNECTOR_DSI
;
739 s
->output_flags
= ROCKCHIP_OUTPUT_DSI_DUAL
;
744 static void dw_mipi_dsi_encoder_enable(struct drm_encoder
*encoder
)
746 struct dw_mipi_dsi_rockchip
*dsi
= to_dsi(encoder
);
749 mux
= drm_of_encoder_active_endpoint_id(dsi
->dev
->of_node
,
754 pm_runtime_get_sync(dsi
->dev
);
756 pm_runtime_get_sync(dsi
->slave
->dev
);
759 * For the RK3399, the clk of grf must be enabled before writing grf
760 * register. And for RK3288 or other soc, this grf_clk must be NULL,
761 * the clk_prepare_enable return true directly.
763 ret
= clk_prepare_enable(dsi
->grf_clk
);
765 DRM_DEV_ERROR(dsi
->dev
, "Failed to enable grf_clk: %d\n", ret
);
769 dw_mipi_dsi_rockchip_config(dsi
, mux
);
771 dw_mipi_dsi_rockchip_config(dsi
->slave
, mux
);
773 clk_disable_unprepare(dsi
->grf_clk
);
776 static void dw_mipi_dsi_encoder_disable(struct drm_encoder
*encoder
)
778 struct dw_mipi_dsi_rockchip
*dsi
= to_dsi(encoder
);
781 pm_runtime_put(dsi
->slave
->dev
);
782 pm_runtime_put(dsi
->dev
);
785 static const struct drm_encoder_helper_funcs
786 dw_mipi_dsi_encoder_helper_funcs
= {
787 .atomic_check
= dw_mipi_dsi_encoder_atomic_check
,
788 .enable
= dw_mipi_dsi_encoder_enable
,
789 .disable
= dw_mipi_dsi_encoder_disable
,
792 static const struct drm_encoder_funcs dw_mipi_dsi_encoder_funcs
= {
793 .destroy
= drm_encoder_cleanup
,
796 static int rockchip_dsi_drm_create_encoder(struct dw_mipi_dsi_rockchip
*dsi
,
797 struct drm_device
*drm_dev
)
799 struct drm_encoder
*encoder
= &dsi
->encoder
;
802 encoder
->possible_crtcs
= drm_of_find_possible_crtcs(drm_dev
,
805 ret
= drm_encoder_init(drm_dev
, encoder
, &dw_mipi_dsi_encoder_funcs
,
806 DRM_MODE_ENCODER_DSI
, NULL
);
808 DRM_ERROR("Failed to initialize encoder with drm\n");
812 drm_encoder_helper_add(encoder
, &dw_mipi_dsi_encoder_helper_funcs
);
818 *dw_mipi_dsi_rockchip_find_second(struct dw_mipi_dsi_rockchip
*dsi
)
820 const struct of_device_id
*match
;
821 struct device_node
*node
= NULL
, *local
;
823 match
= of_match_device(dsi
->dev
->driver
->of_match_table
, dsi
->dev
);
825 local
= of_graph_get_remote_node(dsi
->dev
->of_node
, 1, 0);
829 while ((node
= of_find_compatible_node(node
, NULL
,
830 match
->compatible
))) {
831 struct device_node
*remote
;
834 if (node
== dsi
->dev
->of_node
)
837 remote
= of_graph_get_remote_node(node
, 1, 0);
841 /* same display device in port1-ep0 for both */
842 if (remote
== local
) {
843 struct dw_mipi_dsi_rockchip
*dsi2
;
844 struct platform_device
*pdev
;
846 pdev
= of_find_device_by_node(node
);
849 * we have found the second, so will either return it
850 * or return with an error. In any case won't need the
851 * nodes anymore nor continue the loop.
858 return ERR_PTR(-EPROBE_DEFER
);
860 dsi2
= platform_get_drvdata(pdev
);
862 platform_device_put(pdev
);
863 return ERR_PTR(-EPROBE_DEFER
);
877 static int dw_mipi_dsi_rockchip_bind(struct device
*dev
,
878 struct device
*master
,
881 struct dw_mipi_dsi_rockchip
*dsi
= dev_get_drvdata(dev
);
882 struct drm_device
*drm_dev
= data
;
883 struct device
*second
;
884 bool master1
, master2
;
887 second
= dw_mipi_dsi_rockchip_find_second(dsi
);
889 return PTR_ERR(second
);
892 master1
= of_property_read_bool(dsi
->dev
->of_node
,
894 master2
= of_property_read_bool(second
->of_node
,
897 if (master1
&& master2
) {
898 DRM_DEV_ERROR(dsi
->dev
, "only one clock-master allowed\n");
902 if (!master1
&& !master2
) {
903 DRM_DEV_ERROR(dsi
->dev
, "no clock-master defined\n");
907 /* we are the slave in dual-DSI */
909 dsi
->is_slave
= true;
913 dsi
->slave
= dev_get_drvdata(second
);
915 DRM_DEV_ERROR(dev
, "could not get slaves data\n");
919 dsi
->slave
->is_slave
= true;
920 dw_mipi_dsi_set_slave(dsi
->dmd
, dsi
->slave
->dmd
);
924 ret
= clk_prepare_enable(dsi
->pllref_clk
);
926 DRM_DEV_ERROR(dev
, "Failed to enable pllref_clk: %d\n", ret
);
930 ret
= rockchip_dsi_drm_create_encoder(dsi
, drm_dev
);
932 DRM_DEV_ERROR(dev
, "Failed to create drm encoder\n");
936 ret
= dw_mipi_dsi_bind(dsi
->dmd
, &dsi
->encoder
);
938 DRM_DEV_ERROR(dev
, "Failed to bind: %d\n", ret
);
945 static void dw_mipi_dsi_rockchip_unbind(struct device
*dev
,
946 struct device
*master
,
949 struct dw_mipi_dsi_rockchip
*dsi
= dev_get_drvdata(dev
);
954 dw_mipi_dsi_unbind(dsi
->dmd
);
956 clk_disable_unprepare(dsi
->pllref_clk
);
959 static const struct component_ops dw_mipi_dsi_rockchip_ops
= {
960 .bind
= dw_mipi_dsi_rockchip_bind
,
961 .unbind
= dw_mipi_dsi_rockchip_unbind
,
964 static int dw_mipi_dsi_rockchip_host_attach(void *priv_data
,
965 struct mipi_dsi_device
*device
)
967 struct dw_mipi_dsi_rockchip
*dsi
= priv_data
;
968 struct device
*second
;
971 ret
= component_add(dsi
->dev
, &dw_mipi_dsi_rockchip_ops
);
973 DRM_DEV_ERROR(dsi
->dev
, "Failed to register component: %d\n",
978 second
= dw_mipi_dsi_rockchip_find_second(dsi
);
980 return PTR_ERR(second
);
982 ret
= component_add(second
, &dw_mipi_dsi_rockchip_ops
);
984 DRM_DEV_ERROR(second
,
985 "Failed to register component: %d\n",
994 static int dw_mipi_dsi_rockchip_host_detach(void *priv_data
,
995 struct mipi_dsi_device
*device
)
997 struct dw_mipi_dsi_rockchip
*dsi
= priv_data
;
998 struct device
*second
;
1000 second
= dw_mipi_dsi_rockchip_find_second(dsi
);
1001 if (second
&& !IS_ERR(second
))
1002 component_del(second
, &dw_mipi_dsi_rockchip_ops
);
1004 component_del(dsi
->dev
, &dw_mipi_dsi_rockchip_ops
);
1009 static const struct dw_mipi_dsi_host_ops dw_mipi_dsi_rockchip_host_ops
= {
1010 .attach
= dw_mipi_dsi_rockchip_host_attach
,
1011 .detach
= dw_mipi_dsi_rockchip_host_detach
,
1014 static int dw_mipi_dsi_rockchip_probe(struct platform_device
*pdev
)
1016 struct device
*dev
= &pdev
->dev
;
1017 struct device_node
*np
= dev
->of_node
;
1018 struct dw_mipi_dsi_rockchip
*dsi
;
1019 struct resource
*res
;
1020 const struct rockchip_dw_dsi_chip_data
*cdata
=
1021 of_device_get_match_data(dev
);
1024 dsi
= devm_kzalloc(dev
, sizeof(*dsi
), GFP_KERNEL
);
1028 res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
1029 dsi
->base
= devm_ioremap_resource(dev
, res
);
1030 if (IS_ERR(dsi
->base
)) {
1031 DRM_DEV_ERROR(dev
, "Unable to get dsi registers\n");
1032 return PTR_ERR(dsi
->base
);
1036 while (cdata
[i
].reg
) {
1037 if (cdata
[i
].reg
== res
->start
) {
1038 dsi
->cdata
= &cdata
[i
];
1046 DRM_DEV_ERROR(dev
, "no dsi-config for %s node\n", np
->name
);
1050 /* try to get a possible external dphy */
1051 dsi
->phy
= devm_phy_optional_get(dev
, "dphy");
1052 if (IS_ERR(dsi
->phy
)) {
1053 ret
= PTR_ERR(dsi
->phy
);
1054 DRM_DEV_ERROR(dev
, "failed to get mipi dphy: %d\n", ret
);
1058 dsi
->pllref_clk
= devm_clk_get(dev
, "ref");
1059 if (IS_ERR(dsi
->pllref_clk
)) {
1062 * if external phy is present, pll will be
1065 dsi
->pllref_clk
= NULL
;
1067 ret
= PTR_ERR(dsi
->pllref_clk
);
1069 "Unable to get pll reference clock: %d\n",
1075 if (dsi
->cdata
->flags
& DW_MIPI_NEEDS_PHY_CFG_CLK
) {
1076 dsi
->phy_cfg_clk
= devm_clk_get(dev
, "phy_cfg");
1077 if (IS_ERR(dsi
->phy_cfg_clk
)) {
1078 ret
= PTR_ERR(dsi
->phy_cfg_clk
);
1080 "Unable to get phy_cfg_clk: %d\n", ret
);
1085 if (dsi
->cdata
->flags
& DW_MIPI_NEEDS_GRF_CLK
) {
1086 dsi
->grf_clk
= devm_clk_get(dev
, "grf");
1087 if (IS_ERR(dsi
->grf_clk
)) {
1088 ret
= PTR_ERR(dsi
->grf_clk
);
1089 DRM_DEV_ERROR(dev
, "Unable to get grf_clk: %d\n", ret
);
1094 dsi
->grf_regmap
= syscon_regmap_lookup_by_phandle(np
, "rockchip,grf");
1095 if (IS_ERR(dsi
->grf_regmap
)) {
1096 DRM_DEV_ERROR(dsi
->dev
, "Unable to get rockchip,grf\n");
1097 return PTR_ERR(dsi
->grf_regmap
);
1101 dsi
->pdata
.base
= dsi
->base
;
1102 dsi
->pdata
.max_data_lanes
= dsi
->cdata
->max_data_lanes
;
1103 dsi
->pdata
.phy_ops
= &dw_mipi_dsi_rockchip_phy_ops
;
1104 dsi
->pdata
.host_ops
= &dw_mipi_dsi_rockchip_host_ops
;
1105 dsi
->pdata
.priv_data
= dsi
;
1106 platform_set_drvdata(pdev
, dsi
);
1108 dsi
->dmd
= dw_mipi_dsi_probe(pdev
, &dsi
->pdata
);
1109 if (IS_ERR(dsi
->dmd
)) {
1110 ret
= PTR_ERR(dsi
->dmd
);
1111 if (ret
!= -EPROBE_DEFER
)
1113 "Failed to probe dw_mipi_dsi: %d\n", ret
);
1114 goto err_clkdisable
;
1120 clk_disable_unprepare(dsi
->pllref_clk
);
1124 static int dw_mipi_dsi_rockchip_remove(struct platform_device
*pdev
)
1126 struct dw_mipi_dsi_rockchip
*dsi
= platform_get_drvdata(pdev
);
1128 if (dsi
->devcnt
== 0)
1129 component_del(dsi
->dev
, &dw_mipi_dsi_rockchip_ops
);
1131 dw_mipi_dsi_remove(dsi
->dmd
);
1136 static const struct rockchip_dw_dsi_chip_data px30_chip_data
[] = {
1139 .lcdsel_grf_reg
= PX30_GRF_PD_VO_CON1
,
1140 .lcdsel_big
= HIWORD_UPDATE(0, PX30_DSI_LCDC_SEL
),
1141 .lcdsel_lit
= HIWORD_UPDATE(PX30_DSI_LCDC_SEL
,
1144 .lanecfg1_grf_reg
= PX30_GRF_PD_VO_CON1
,
1145 .lanecfg1
= HIWORD_UPDATE(0, PX30_DSI_TURNDISABLE
|
1146 PX30_DSI_FORCERXMODE
|
1147 PX30_DSI_FORCETXSTOPMODE
),
1149 .max_data_lanes
= 4,
1154 static const struct rockchip_dw_dsi_chip_data rk3288_chip_data
[] = {
1157 .lcdsel_grf_reg
= RK3288_GRF_SOC_CON6
,
1158 .lcdsel_big
= HIWORD_UPDATE(0, RK3288_DSI0_LCDC_SEL
),
1159 .lcdsel_lit
= HIWORD_UPDATE(RK3288_DSI0_LCDC_SEL
, RK3288_DSI0_LCDC_SEL
),
1161 .max_data_lanes
= 4,
1165 .lcdsel_grf_reg
= RK3288_GRF_SOC_CON6
,
1166 .lcdsel_big
= HIWORD_UPDATE(0, RK3288_DSI1_LCDC_SEL
),
1167 .lcdsel_lit
= HIWORD_UPDATE(RK3288_DSI1_LCDC_SEL
, RK3288_DSI1_LCDC_SEL
),
1169 .max_data_lanes
= 4,
1174 static const struct rockchip_dw_dsi_chip_data rk3399_chip_data
[] = {
1177 .lcdsel_grf_reg
= RK3399_GRF_SOC_CON20
,
1178 .lcdsel_big
= HIWORD_UPDATE(0, RK3399_DSI0_LCDC_SEL
),
1179 .lcdsel_lit
= HIWORD_UPDATE(RK3399_DSI0_LCDC_SEL
,
1180 RK3399_DSI0_LCDC_SEL
),
1182 .lanecfg1_grf_reg
= RK3399_GRF_SOC_CON22
,
1183 .lanecfg1
= HIWORD_UPDATE(0, RK3399_DSI0_TURNREQUEST
|
1184 RK3399_DSI0_TURNDISABLE
|
1185 RK3399_DSI0_FORCETXSTOPMODE
|
1186 RK3399_DSI0_FORCERXMODE
),
1188 .flags
= DW_MIPI_NEEDS_PHY_CFG_CLK
| DW_MIPI_NEEDS_GRF_CLK
,
1189 .max_data_lanes
= 4,
1193 .lcdsel_grf_reg
= RK3399_GRF_SOC_CON20
,
1194 .lcdsel_big
= HIWORD_UPDATE(0, RK3399_DSI1_LCDC_SEL
),
1195 .lcdsel_lit
= HIWORD_UPDATE(RK3399_DSI1_LCDC_SEL
,
1196 RK3399_DSI1_LCDC_SEL
),
1198 .lanecfg1_grf_reg
= RK3399_GRF_SOC_CON23
,
1199 .lanecfg1
= HIWORD_UPDATE(0, RK3399_DSI1_TURNDISABLE
|
1200 RK3399_DSI1_FORCETXSTOPMODE
|
1201 RK3399_DSI1_FORCERXMODE
|
1202 RK3399_DSI1_ENABLE
),
1204 .lanecfg2_grf_reg
= RK3399_GRF_SOC_CON24
,
1205 .lanecfg2
= HIWORD_UPDATE(RK3399_TXRX_MASTERSLAVEZ
|
1206 RK3399_TXRX_ENABLECLK
,
1207 RK3399_TXRX_MASTERSLAVEZ
|
1208 RK3399_TXRX_ENABLECLK
|
1209 RK3399_TXRX_BASEDIR
),
1211 .enable_grf_reg
= RK3399_GRF_SOC_CON23
,
1212 .enable
= HIWORD_UPDATE(RK3399_DSI1_ENABLE
, RK3399_DSI1_ENABLE
),
1214 .flags
= DW_MIPI_NEEDS_PHY_CFG_CLK
| DW_MIPI_NEEDS_GRF_CLK
,
1215 .max_data_lanes
= 4,
1220 static const struct of_device_id dw_mipi_dsi_rockchip_dt_ids
[] = {
1222 .compatible
= "rockchip,px30-mipi-dsi",
1223 .data
= &px30_chip_data
,
1225 .compatible
= "rockchip,rk3288-mipi-dsi",
1226 .data
= &rk3288_chip_data
,
1228 .compatible
= "rockchip,rk3399-mipi-dsi",
1229 .data
= &rk3399_chip_data
,
1233 MODULE_DEVICE_TABLE(of
, dw_mipi_dsi_rockchip_dt_ids
);
1235 struct platform_driver dw_mipi_dsi_rockchip_driver
= {
1236 .probe
= dw_mipi_dsi_rockchip_probe
,
1237 .remove
= dw_mipi_dsi_rockchip_remove
,
1239 .of_match_table
= dw_mipi_dsi_rockchip_dt_ids
,
1240 .name
= "dw-mipi-dsi-rockchip",