treewide: remove redundant IS_ERR() before error code check
[linux/fpc-iii.git] / drivers / gpu / drm / rockchip / dw-mipi-dsi-rockchip.c
blob6e1270e45f974d444df8a7b9d2af176523d206c2
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3 * Copyright (C) Fuzhou Rockchip Electronics Co.Ltd
4 * Author:
5 * Chris Zhong <zyw@rock-chips.com>
6 * Nickey Yang <nickey.yang@rock-chips.com>
7 */
9 #include <linux/clk.h>
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)
33 #define PHY_RSTZ 0
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
43 #define LOCK BIT(0)
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)
178 enum {
179 BANDGAP_97_07,
180 BANDGAP_98_05,
181 BANDGAP_99_02,
182 BANDGAP_100_00,
183 BANDGAP_93_17,
184 BANDGAP_94_15,
185 BANDGAP_95_12,
186 BANDGAP_96_10,
189 enum {
190 BIASEXTR_87_1,
191 BIASEXTR_91_5,
192 BIASEXTR_95_9,
193 BIASEXTR_100,
194 BIASEXTR_105_94,
195 BIASEXTR_111_88,
196 BIASEXTR_118_8,
197 BIASEXTR_127_7,
200 struct rockchip_dw_dsi_chip_data {
201 u32 reg;
203 u32 lcdsel_grf_reg;
204 u32 lcdsel_big;
205 u32 lcdsel_lit;
207 u32 enable_grf_reg;
208 u32 enable;
210 u32 lanecfg1_grf_reg;
211 u32 lanecfg1;
212 u32 lanecfg2_grf_reg;
213 u32 lanecfg2;
215 unsigned int flags;
216 unsigned int max_data_lanes;
219 struct dw_mipi_dsi_rockchip {
220 struct device *dev;
221 struct drm_encoder encoder;
222 void __iomem *base;
224 struct regmap *grf_regmap;
225 struct clk *pllref_clk;
226 struct clk *grf_clk;
227 struct clk *phy_cfg_clk;
229 /* dual-channel */
230 bool is_slave;
231 struct dw_mipi_dsi_rockchip *slave;
233 /* optional external dphy */
234 struct phy *phy;
235 union phy_configure_opts phy_opts;
237 unsigned int lane_mbps; /* per lane */
238 u16 input_div;
239 u16 feedback_div;
240 u32 format;
242 struct dw_mipi_dsi *dmd;
243 const struct rockchip_dw_dsi_chip_data *cdata;
244 struct dw_mipi_dsi_plat_data pdata;
245 int devcnt;
248 struct dphy_pll_parameter_map {
249 unsigned int max_mbps;
250 u8 hsfreqrange;
251 u8 icpctrl;
252 u8 lpfctrl;
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)
300 int i;
302 for (i = 0; i < ARRAY_SIZE(dppa_map); i++)
303 if (dppa_map[i].max_mbps >= max_mbps)
304 return i;
306 return -EINVAL;
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,
325 u32 mask, u32 val)
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,
331 u8 test_code,
332 u8 test_data)
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;
371 int ret, i, vco;
373 if (dsi->phy)
374 return 0;
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);
391 if (i < 0) {
392 DRM_DEV_ERROR(dsi->dev,
393 "failed to get parameter for %dmbps clock\n",
394 dsi->lane_mbps);
395 return i;
398 ret = clk_prepare_enable(dsi->phy_cfg_clk);
399 if (ret) {
400 DRM_DEV_ERROR(dsi->dev, "Failed to enable phy_cfg_clk\n");
401 return ret;
404 dw_mipi_dsi_phy_write(dsi, PLL_BIAS_CUR_SEL_CAP_VCO_CONTROL,
405 BYPASS_VCO_RANGE |
406 VCO_RANGE_CON_SEL(vco) |
407 VCO_IN_CAP_CON_LOW |
408 REF_BIAS_CUR_SEL);
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) |
423 LOW_PROGRAM_EN);
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) |
434 HIGH_PROGRAM_EN);
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 |
453 TER_RESISTORS_ON);
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);
481 return ret;
484 static void dw_mipi_dsi_phy_power_on(void *priv_data)
486 struct dw_mipi_dsi_rockchip *dsi = priv_data;
487 int ret;
489 ret = phy_set_mode(dsi->phy, PHY_MODE_MIPI_DPHY);
490 if (ret) {
491 DRM_DEV_ERROR(dsi->dev, "failed to set phy mode: %d\n", ret);
492 return;
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);
506 static int
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;
512 int bpp;
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);
525 if (bpp < 0) {
526 DRM_DEV_ERROR(dsi->dev,
527 "failed to get bpp for pixel format %d\n",
528 dsi->format);
529 return bpp;
532 mpclk = DIV_ROUND_UP(mode->clock, MSEC_PER_SEC);
533 if (mpclk) {
534 /* take 1 / 0.8, since mbps must big than bandwidth of RGB */
535 tmp = mpclk * (bpp / lanes) * 10 / 8;
536 if (tmp < max_mbps)
537 target_mbps = tmp;
538 else
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 */
544 if (dsi->phy) {
545 phy_mipi_dphy_get_default_config(mode->clock * 1000 * 10 / 8,
546 bpp, lanes,
547 &dsi->phy_opts.mipi_dphy);
548 dsi->lane_mbps = target_mbps;
549 *lane_mbps = dsi->lane_mbps;
551 return 0;
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++) {
566 u64 tmp;
567 u32 delta;
568 /* Fvco = Fref * M / N */
569 tmp = (u64)fout * _prediv;
570 do_div(tmp, fin);
571 _fbdiv = tmp;
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)
578 continue;
580 _fbdiv += _fbdiv % 2;
582 tmp = (u64)_fbdiv * fin;
583 do_div(tmp, _prediv);
584 if (tmp < fvco_min || tmp > fvco_max)
585 continue;
587 delta = abs(fout - tmp);
588 if (delta < min_delta) {
589 best_prediv = _prediv;
590 best_fbdiv = _fbdiv;
591 min_delta = delta;
592 best_freq = tmp;
596 if (best_freq) {
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;
601 } else {
602 DRM_DEV_ERROR(dsi->dev, "Can not find best_freq for DPHY\n");
603 return -EINVAL;
606 return 0;
609 struct hstt {
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, \
617 .timing = { \
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)
668 static int
669 dw_mipi_dsi_phy_get_timing(void *priv_data, unsigned int lane_mbps,
670 struct dw_mipi_dsi_dphy_timing *timing)
672 int i;
674 for (i = 0; i < ARRAY_SIZE(hstt_table); i++)
675 if (lane_mbps < hstt_table[i].maxfreq)
676 break;
678 if (i == ARRAY_SIZE(hstt_table))
679 i--;
681 *timing = hstt_table[i].timing;
683 return 0;
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,
695 int mux)
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,
711 dsi->cdata->enable);
714 static int
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;
725 break;
726 case MIPI_DSI_FMT_RGB666:
727 s->output_mode = ROCKCHIP_OUT_MODE_P666;
728 break;
729 case MIPI_DSI_FMT_RGB565:
730 s->output_mode = ROCKCHIP_OUT_MODE_P565;
731 break;
732 default:
733 WARN_ON(1);
734 return -EINVAL;
737 s->output_type = DRM_MODE_CONNECTOR_DSI;
738 if (dsi->slave)
739 s->output_flags = ROCKCHIP_OUTPUT_DSI_DUAL;
741 return 0;
744 static void dw_mipi_dsi_encoder_enable(struct drm_encoder *encoder)
746 struct dw_mipi_dsi_rockchip *dsi = to_dsi(encoder);
747 int ret, mux;
749 mux = drm_of_encoder_active_endpoint_id(dsi->dev->of_node,
750 &dsi->encoder);
751 if (mux < 0)
752 return;
754 pm_runtime_get_sync(dsi->dev);
755 if (dsi->slave)
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);
764 if (ret) {
765 DRM_DEV_ERROR(dsi->dev, "Failed to enable grf_clk: %d\n", ret);
766 return;
769 dw_mipi_dsi_rockchip_config(dsi, mux);
770 if (dsi->slave)
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);
780 if (dsi->slave)
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;
800 int ret;
802 encoder->possible_crtcs = drm_of_find_possible_crtcs(drm_dev,
803 dsi->dev->of_node);
805 ret = drm_encoder_init(drm_dev, encoder, &dw_mipi_dsi_encoder_funcs,
806 DRM_MODE_ENCODER_DSI, NULL);
807 if (ret) {
808 DRM_ERROR("Failed to initialize encoder with drm\n");
809 return ret;
812 drm_encoder_helper_add(encoder, &dw_mipi_dsi_encoder_helper_funcs);
814 return 0;
817 static struct device
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);
826 if (!local)
827 return NULL;
829 while ((node = of_find_compatible_node(node, NULL,
830 match->compatible))) {
831 struct device_node *remote;
833 /* found ourself */
834 if (node == dsi->dev->of_node)
835 continue;
837 remote = of_graph_get_remote_node(node, 1, 0);
838 if (!remote)
839 continue;
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.
853 of_node_put(remote);
854 of_node_put(node);
855 of_node_put(local);
857 if (!pdev)
858 return ERR_PTR(-EPROBE_DEFER);
860 dsi2 = platform_get_drvdata(pdev);
861 if (!dsi2) {
862 platform_device_put(pdev);
863 return ERR_PTR(-EPROBE_DEFER);
866 return &pdev->dev;
869 of_node_put(remote);
872 of_node_put(local);
874 return NULL;
877 static int dw_mipi_dsi_rockchip_bind(struct device *dev,
878 struct device *master,
879 void *data)
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;
885 int ret;
887 second = dw_mipi_dsi_rockchip_find_second(dsi);
888 if (IS_ERR(second))
889 return PTR_ERR(second);
891 if (second) {
892 master1 = of_property_read_bool(dsi->dev->of_node,
893 "clock-master");
894 master2 = of_property_read_bool(second->of_node,
895 "clock-master");
897 if (master1 && master2) {
898 DRM_DEV_ERROR(dsi->dev, "only one clock-master allowed\n");
899 return -EINVAL;
902 if (!master1 && !master2) {
903 DRM_DEV_ERROR(dsi->dev, "no clock-master defined\n");
904 return -EINVAL;
907 /* we are the slave in dual-DSI */
908 if (!master1) {
909 dsi->is_slave = true;
910 return 0;
913 dsi->slave = dev_get_drvdata(second);
914 if (!dsi->slave) {
915 DRM_DEV_ERROR(dev, "could not get slaves data\n");
916 return -ENODEV;
919 dsi->slave->is_slave = true;
920 dw_mipi_dsi_set_slave(dsi->dmd, dsi->slave->dmd);
921 put_device(second);
924 ret = clk_prepare_enable(dsi->pllref_clk);
925 if (ret) {
926 DRM_DEV_ERROR(dev, "Failed to enable pllref_clk: %d\n", ret);
927 return ret;
930 ret = rockchip_dsi_drm_create_encoder(dsi, drm_dev);
931 if (ret) {
932 DRM_DEV_ERROR(dev, "Failed to create drm encoder\n");
933 return ret;
936 ret = dw_mipi_dsi_bind(dsi->dmd, &dsi->encoder);
937 if (ret) {
938 DRM_DEV_ERROR(dev, "Failed to bind: %d\n", ret);
939 return ret;
942 return 0;
945 static void dw_mipi_dsi_rockchip_unbind(struct device *dev,
946 struct device *master,
947 void *data)
949 struct dw_mipi_dsi_rockchip *dsi = dev_get_drvdata(dev);
951 if (dsi->is_slave)
952 return;
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;
969 int ret;
971 ret = component_add(dsi->dev, &dw_mipi_dsi_rockchip_ops);
972 if (ret) {
973 DRM_DEV_ERROR(dsi->dev, "Failed to register component: %d\n",
974 ret);
975 return ret;
978 second = dw_mipi_dsi_rockchip_find_second(dsi);
979 if (IS_ERR(second))
980 return PTR_ERR(second);
981 if (second) {
982 ret = component_add(second, &dw_mipi_dsi_rockchip_ops);
983 if (ret) {
984 DRM_DEV_ERROR(second,
985 "Failed to register component: %d\n",
986 ret);
987 return ret;
991 return 0;
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);
1006 return 0;
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);
1022 int ret, i;
1024 dsi = devm_kzalloc(dev, sizeof(*dsi), GFP_KERNEL);
1025 if (!dsi)
1026 return -ENOMEM;
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);
1035 i = 0;
1036 while (cdata[i].reg) {
1037 if (cdata[i].reg == res->start) {
1038 dsi->cdata = &cdata[i];
1039 break;
1042 i++;
1045 if (!dsi->cdata) {
1046 DRM_DEV_ERROR(dev, "no dsi-config for %s node\n", np->name);
1047 return -EINVAL;
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);
1055 return ret;
1058 dsi->pllref_clk = devm_clk_get(dev, "ref");
1059 if (IS_ERR(dsi->pllref_clk)) {
1060 if (dsi->phy) {
1062 * if external phy is present, pll will be
1063 * generated there.
1065 dsi->pllref_clk = NULL;
1066 } else {
1067 ret = PTR_ERR(dsi->pllref_clk);
1068 DRM_DEV_ERROR(dev,
1069 "Unable to get pll reference clock: %d\n",
1070 ret);
1071 return ret;
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);
1079 DRM_DEV_ERROR(dev,
1080 "Unable to get phy_cfg_clk: %d\n", ret);
1081 return 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);
1090 return 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);
1100 dsi->dev = dev;
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)
1112 DRM_DEV_ERROR(dev,
1113 "Failed to probe dw_mipi_dsi: %d\n", ret);
1114 goto err_clkdisable;
1117 return 0;
1119 err_clkdisable:
1120 clk_disable_unprepare(dsi->pllref_clk);
1121 return ret;
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);
1133 return 0;
1136 static const struct rockchip_dw_dsi_chip_data px30_chip_data[] = {
1138 .reg = 0xff450000,
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,
1142 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,
1151 { /* sentinel */ }
1154 static const struct rockchip_dw_dsi_chip_data rk3288_chip_data[] = {
1156 .reg = 0xff960000,
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,
1164 .reg = 0xff964000,
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,
1171 { /* sentinel */ }
1174 static const struct rockchip_dw_dsi_chip_data rk3399_chip_data[] = {
1176 .reg = 0xff960000,
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,
1192 .reg = 0xff968000,
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,
1217 { /* sentinel */ }
1220 static const struct of_device_id dw_mipi_dsi_rockchip_dt_ids[] = {
1222 .compatible = "rockchip,px30-mipi-dsi",
1223 .data = &px30_chip_data,
1224 }, {
1225 .compatible = "rockchip,rk3288-mipi-dsi",
1226 .data = &rk3288_chip_data,
1227 }, {
1228 .compatible = "rockchip,rk3399-mipi-dsi",
1229 .data = &rk3399_chip_data,
1231 { /* sentinel */ }
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,
1238 .driver = {
1239 .of_match_table = dw_mipi_dsi_rockchip_dt_ids,
1240 .name = "dw-mipi-dsi-rockchip",