drm/rockchip: remove unused function
[platform/kernel/linux-rpi.git] / drivers / gpu / drm / rockchip / dw-mipi-dsi-rockchip.c
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  */
8
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>
18
19 #include <video/mipi_display.h>
20
21 #include <drm/bridge/dw_mipi_dsi.h>
22 #include <drm/drm_mipi_dsi.h>
23 #include <drm/drm_of.h>
24 #include <drm/drm_simple_kms_helper.h>
25
26 #include "rockchip_drm_drv.h"
27 #include "rockchip_drm_vop.h"
28
29 #define DSI_PHY_RSTZ                    0xa0
30 #define PHY_DISFORCEPLL                 0
31 #define PHY_ENFORCEPLL                  BIT(3)
32 #define PHY_DISABLECLK                  0
33 #define PHY_ENABLECLK                   BIT(2)
34 #define PHY_RSTZ                        0
35 #define PHY_UNRSTZ                      BIT(1)
36 #define PHY_SHUTDOWNZ                   0
37 #define PHY_UNSHUTDOWNZ                 BIT(0)
38
39 #define DSI_PHY_IF_CFG                  0xa4
40 #define N_LANES(n)                      ((((n) - 1) & 0x3) << 0)
41 #define PHY_STOP_WAIT_TIME(cycle)       (((cycle) & 0xff) << 8)
42
43 #define DSI_PHY_STATUS                  0xb0
44 #define LOCK                            BIT(0)
45 #define STOP_STATE_CLK_LANE             BIT(2)
46
47 #define DSI_PHY_TST_CTRL0               0xb4
48 #define PHY_TESTCLK                     BIT(1)
49 #define PHY_UNTESTCLK                   0
50 #define PHY_TESTCLR                     BIT(0)
51 #define PHY_UNTESTCLR                   0
52
53 #define DSI_PHY_TST_CTRL1               0xb8
54 #define PHY_TESTEN                      BIT(16)
55 #define PHY_UNTESTEN                    0
56 #define PHY_TESTDOUT(n)                 (((n) & 0xff) << 8)
57 #define PHY_TESTDIN(n)                  (((n) & 0xff) << 0)
58
59 #define DSI_INT_ST0                     0xbc
60 #define DSI_INT_ST1                     0xc0
61 #define DSI_INT_MSK0                    0xc4
62 #define DSI_INT_MSK1                    0xc8
63
64 #define PHY_STATUS_TIMEOUT_US           10000
65 #define CMD_PKT_STATUS_TIMEOUT_US       20000
66
67 #define BYPASS_VCO_RANGE        BIT(7)
68 #define VCO_RANGE_CON_SEL(val)  (((val) & 0x7) << 3)
69 #define VCO_IN_CAP_CON_DEFAULT  (0x0 << 1)
70 #define VCO_IN_CAP_CON_LOW      (0x1 << 1)
71 #define VCO_IN_CAP_CON_HIGH     (0x2 << 1)
72 #define REF_BIAS_CUR_SEL        BIT(0)
73
74 #define CP_CURRENT_3UA  0x1
75 #define CP_CURRENT_4_5UA        0x2
76 #define CP_CURRENT_7_5UA        0x6
77 #define CP_CURRENT_6UA  0x9
78 #define CP_CURRENT_12UA 0xb
79 #define CP_CURRENT_SEL(val)     ((val) & 0xf)
80 #define CP_PROGRAM_EN           BIT(7)
81
82 #define LPF_RESISTORS_15_5KOHM  0x1
83 #define LPF_RESISTORS_13KOHM    0x2
84 #define LPF_RESISTORS_11_5KOHM  0x4
85 #define LPF_RESISTORS_10_5KOHM  0x8
86 #define LPF_RESISTORS_8KOHM     0x10
87 #define LPF_PROGRAM_EN          BIT(6)
88 #define LPF_RESISTORS_SEL(val)  ((val) & 0x3f)
89
90 #define HSFREQRANGE_SEL(val)    (((val) & 0x3f) << 1)
91
92 #define INPUT_DIVIDER(val)      (((val) - 1) & 0x7f)
93 #define LOW_PROGRAM_EN          0
94 #define HIGH_PROGRAM_EN         BIT(7)
95 #define LOOP_DIV_LOW_SEL(val)   (((val) - 1) & 0x1f)
96 #define LOOP_DIV_HIGH_SEL(val)  ((((val) - 1) >> 5) & 0xf)
97 #define PLL_LOOP_DIV_EN         BIT(5)
98 #define PLL_INPUT_DIV_EN        BIT(4)
99
100 #define POWER_CONTROL           BIT(6)
101 #define INTERNAL_REG_CURRENT    BIT(3)
102 #define BIAS_BLOCK_ON           BIT(2)
103 #define BANDGAP_ON              BIT(0)
104
105 #define TER_RESISTOR_HIGH       BIT(7)
106 #define TER_RESISTOR_LOW        0
107 #define LEVEL_SHIFTERS_ON       BIT(6)
108 #define TER_CAL_DONE            BIT(5)
109 #define SETRD_MAX               (0x7 << 2)
110 #define POWER_MANAGE            BIT(1)
111 #define TER_RESISTORS_ON        BIT(0)
112
113 #define BIASEXTR_SEL(val)       ((val) & 0x7)
114 #define BANDGAP_SEL(val)        ((val) & 0x7)
115 #define TLP_PROGRAM_EN          BIT(7)
116 #define THS_PRE_PROGRAM_EN      BIT(7)
117 #define THS_ZERO_PROGRAM_EN     BIT(6)
118
119 #define PLL_BIAS_CUR_SEL_CAP_VCO_CONTROL                0x10
120 #define PLL_CP_CONTROL_PLL_LOCK_BYPASS                  0x11
121 #define PLL_LPF_AND_CP_CONTROL                          0x12
122 #define PLL_INPUT_DIVIDER_RATIO                         0x17
123 #define PLL_LOOP_DIVIDER_RATIO                          0x18
124 #define PLL_INPUT_AND_LOOP_DIVIDER_RATIOS_CONTROL       0x19
125 #define BANDGAP_AND_BIAS_CONTROL                        0x20
126 #define TERMINATION_RESISTER_CONTROL                    0x21
127 #define AFE_BIAS_BANDGAP_ANALOG_PROGRAMMABILITY         0x22
128 #define HS_RX_CONTROL_OF_LANE_0                         0x44
129 #define HS_TX_CLOCK_LANE_REQUEST_STATE_TIME_CONTROL     0x60
130 #define HS_TX_CLOCK_LANE_PREPARE_STATE_TIME_CONTROL     0x61
131 #define HS_TX_CLOCK_LANE_HS_ZERO_STATE_TIME_CONTROL     0x62
132 #define HS_TX_CLOCK_LANE_TRAIL_STATE_TIME_CONTROL       0x63
133 #define HS_TX_CLOCK_LANE_EXIT_STATE_TIME_CONTROL        0x64
134 #define HS_TX_CLOCK_LANE_POST_TIME_CONTROL              0x65
135 #define HS_TX_DATA_LANE_REQUEST_STATE_TIME_CONTROL      0x70
136 #define HS_TX_DATA_LANE_PREPARE_STATE_TIME_CONTROL      0x71
137 #define HS_TX_DATA_LANE_HS_ZERO_STATE_TIME_CONTROL      0x72
138 #define HS_TX_DATA_LANE_TRAIL_STATE_TIME_CONTROL        0x73
139 #define HS_TX_DATA_LANE_EXIT_STATE_TIME_CONTROL         0x74
140
141 #define DW_MIPI_NEEDS_PHY_CFG_CLK       BIT(0)
142 #define DW_MIPI_NEEDS_GRF_CLK           BIT(1)
143
144 #define PX30_GRF_PD_VO_CON1             0x0438
145 #define PX30_DSI_FORCETXSTOPMODE        (0xf << 7)
146 #define PX30_DSI_FORCERXMODE            BIT(6)
147 #define PX30_DSI_TURNDISABLE            BIT(5)
148 #define PX30_DSI_LCDC_SEL               BIT(0)
149
150 #define RK3288_GRF_SOC_CON6             0x025c
151 #define RK3288_DSI0_LCDC_SEL            BIT(6)
152 #define RK3288_DSI1_LCDC_SEL            BIT(9)
153
154 #define RK3399_GRF_SOC_CON20            0x6250
155 #define RK3399_DSI0_LCDC_SEL            BIT(0)
156 #define RK3399_DSI1_LCDC_SEL            BIT(4)
157
158 #define RK3399_GRF_SOC_CON22            0x6258
159 #define RK3399_DSI0_TURNREQUEST         (0xf << 12)
160 #define RK3399_DSI0_TURNDISABLE         (0xf << 8)
161 #define RK3399_DSI0_FORCETXSTOPMODE     (0xf << 4)
162 #define RK3399_DSI0_FORCERXMODE         (0xf << 0)
163
164 #define RK3399_GRF_SOC_CON23            0x625c
165 #define RK3399_DSI1_TURNDISABLE         (0xf << 12)
166 #define RK3399_DSI1_FORCETXSTOPMODE     (0xf << 8)
167 #define RK3399_DSI1_FORCERXMODE         (0xf << 4)
168 #define RK3399_DSI1_ENABLE              (0xf << 0)
169
170 #define RK3399_GRF_SOC_CON24            0x6260
171 #define RK3399_TXRX_MASTERSLAVEZ        BIT(7)
172 #define RK3399_TXRX_ENABLECLK           BIT(6)
173 #define RK3399_TXRX_BASEDIR             BIT(5)
174
175 #define HIWORD_UPDATE(val, mask)        (val | (mask) << 16)
176
177 #define to_dsi(nm)      container_of(nm, struct dw_mipi_dsi_rockchip, nm)
178
179 enum {
180         BANDGAP_97_07,
181         BANDGAP_98_05,
182         BANDGAP_99_02,
183         BANDGAP_100_00,
184         BANDGAP_93_17,
185         BANDGAP_94_15,
186         BANDGAP_95_12,
187         BANDGAP_96_10,
188 };
189
190 enum {
191         BIASEXTR_87_1,
192         BIASEXTR_91_5,
193         BIASEXTR_95_9,
194         BIASEXTR_100,
195         BIASEXTR_105_94,
196         BIASEXTR_111_88,
197         BIASEXTR_118_8,
198         BIASEXTR_127_7,
199 };
200
201 struct rockchip_dw_dsi_chip_data {
202         u32 reg;
203
204         u32 lcdsel_grf_reg;
205         u32 lcdsel_big;
206         u32 lcdsel_lit;
207
208         u32 enable_grf_reg;
209         u32 enable;
210
211         u32 lanecfg1_grf_reg;
212         u32 lanecfg1;
213         u32 lanecfg2_grf_reg;
214         u32 lanecfg2;
215
216         unsigned int flags;
217         unsigned int max_data_lanes;
218 };
219
220 struct dw_mipi_dsi_rockchip {
221         struct device *dev;
222         struct drm_encoder encoder;
223         void __iomem *base;
224
225         struct regmap *grf_regmap;
226         struct clk *pllref_clk;
227         struct clk *grf_clk;
228         struct clk *phy_cfg_clk;
229
230         /* dual-channel */
231         bool is_slave;
232         struct dw_mipi_dsi_rockchip *slave;
233
234         /* optional external dphy */
235         struct phy *phy;
236         union phy_configure_opts phy_opts;
237
238         unsigned int lane_mbps; /* per lane */
239         u16 input_div;
240         u16 feedback_div;
241         u32 format;
242
243         struct dw_mipi_dsi *dmd;
244         const struct rockchip_dw_dsi_chip_data *cdata;
245         struct dw_mipi_dsi_plat_data pdata;
246 };
247
248 struct dphy_pll_parameter_map {
249         unsigned int max_mbps;
250         u8 hsfreqrange;
251         u8 icpctrl;
252         u8 lpfctrl;
253 };
254
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 }
296 };
297
298 static int max_mbps_to_parameter(unsigned int max_mbps)
299 {
300         int i;
301
302         for (i = 0; i < ARRAY_SIZE(dppa_map); i++)
303                 if (dppa_map[i].max_mbps >= max_mbps)
304                         return i;
305
306         return -EINVAL;
307 }
308
309 static inline void dsi_write(struct dw_mipi_dsi_rockchip *dsi, u32 reg, u32 val)
310 {
311         writel(val, dsi->base + reg);
312 }
313
314 static inline u32 dsi_read(struct dw_mipi_dsi_rockchip *dsi, u32 reg)
315 {
316         return readl(dsi->base + reg);
317 }
318
319 static inline void dsi_update_bits(struct dw_mipi_dsi_rockchip *dsi, u32 reg,
320                                    u32 mask, u32 val)
321 {
322         dsi_write(dsi, reg, (dsi_read(dsi, reg) & ~mask) | val);
323 }
324
325 static void dw_mipi_dsi_phy_write(struct dw_mipi_dsi_rockchip *dsi,
326                                   u8 test_code,
327                                   u8 test_data)
328 {
329         /*
330          * With the falling edge on TESTCLK, the TESTDIN[7:0] signal content
331          * is latched internally as the current test code. Test data is
332          * programmed internally by rising edge on TESTCLK.
333          */
334         dsi_write(dsi, DSI_PHY_TST_CTRL0, PHY_TESTCLK | PHY_UNTESTCLR);
335
336         dsi_write(dsi, DSI_PHY_TST_CTRL1, PHY_TESTEN | PHY_TESTDOUT(0) |
337                                           PHY_TESTDIN(test_code));
338
339         dsi_write(dsi, DSI_PHY_TST_CTRL0, PHY_UNTESTCLK | PHY_UNTESTCLR);
340
341         dsi_write(dsi, DSI_PHY_TST_CTRL1, PHY_UNTESTEN | PHY_TESTDOUT(0) |
342                                           PHY_TESTDIN(test_data));
343
344         dsi_write(dsi, DSI_PHY_TST_CTRL0, PHY_TESTCLK | PHY_UNTESTCLR);
345 }
346
347 /*
348  * ns2bc - Nanoseconds to byte clock cycles
349  */
350 static inline unsigned int ns2bc(struct dw_mipi_dsi_rockchip *dsi, int ns)
351 {
352         return DIV_ROUND_UP(ns * dsi->lane_mbps / 8, 1000);
353 }
354
355 /*
356  * ns2ui - Nanoseconds to UI time periods
357  */
358 static inline unsigned int ns2ui(struct dw_mipi_dsi_rockchip *dsi, int ns)
359 {
360         return DIV_ROUND_UP(ns * dsi->lane_mbps, 1000);
361 }
362
363 static int dw_mipi_dsi_phy_init(void *priv_data)
364 {
365         struct dw_mipi_dsi_rockchip *dsi = priv_data;
366         int ret, i, vco;
367
368         if (dsi->phy)
369                 return 0;
370
371         /*
372          * Get vco from frequency(lane_mbps)
373          * vco  frequency table
374          * 000 - between   80 and  200 MHz
375          * 001 - between  200 and  300 MHz
376          * 010 - between  300 and  500 MHz
377          * 011 - between  500 and  700 MHz
378          * 100 - between  700 and  900 MHz
379          * 101 - between  900 and 1100 MHz
380          * 110 - between 1100 and 1300 MHz
381          * 111 - between 1300 and 1500 MHz
382          */
383         vco = (dsi->lane_mbps < 200) ? 0 : (dsi->lane_mbps + 100) / 200;
384
385         i = max_mbps_to_parameter(dsi->lane_mbps);
386         if (i < 0) {
387                 DRM_DEV_ERROR(dsi->dev,
388                               "failed to get parameter for %dmbps clock\n",
389                               dsi->lane_mbps);
390                 return i;
391         }
392
393         ret = clk_prepare_enable(dsi->phy_cfg_clk);
394         if (ret) {
395                 DRM_DEV_ERROR(dsi->dev, "Failed to enable phy_cfg_clk\n");
396                 return ret;
397         }
398
399         dw_mipi_dsi_phy_write(dsi, PLL_BIAS_CUR_SEL_CAP_VCO_CONTROL,
400                               BYPASS_VCO_RANGE |
401                               VCO_RANGE_CON_SEL(vco) |
402                               VCO_IN_CAP_CON_LOW |
403                               REF_BIAS_CUR_SEL);
404
405         dw_mipi_dsi_phy_write(dsi, PLL_CP_CONTROL_PLL_LOCK_BYPASS,
406                               CP_CURRENT_SEL(dppa_map[i].icpctrl));
407         dw_mipi_dsi_phy_write(dsi, PLL_LPF_AND_CP_CONTROL,
408                               CP_PROGRAM_EN | LPF_PROGRAM_EN |
409                               LPF_RESISTORS_SEL(dppa_map[i].lpfctrl));
410
411         dw_mipi_dsi_phy_write(dsi, HS_RX_CONTROL_OF_LANE_0,
412                               HSFREQRANGE_SEL(dppa_map[i].hsfreqrange));
413
414         dw_mipi_dsi_phy_write(dsi, PLL_INPUT_DIVIDER_RATIO,
415                               INPUT_DIVIDER(dsi->input_div));
416         dw_mipi_dsi_phy_write(dsi, PLL_LOOP_DIVIDER_RATIO,
417                               LOOP_DIV_LOW_SEL(dsi->feedback_div) |
418                               LOW_PROGRAM_EN);
419         /*
420          * We need set PLL_INPUT_AND_LOOP_DIVIDER_RATIOS_CONTROL immediately
421          * to make the configured LSB effective according to IP simulation
422          * and lab test results.
423          * Only in this way can we get correct mipi phy pll frequency.
424          */
425         dw_mipi_dsi_phy_write(dsi, PLL_INPUT_AND_LOOP_DIVIDER_RATIOS_CONTROL,
426                               PLL_LOOP_DIV_EN | PLL_INPUT_DIV_EN);
427         dw_mipi_dsi_phy_write(dsi, PLL_LOOP_DIVIDER_RATIO,
428                               LOOP_DIV_HIGH_SEL(dsi->feedback_div) |
429                               HIGH_PROGRAM_EN);
430         dw_mipi_dsi_phy_write(dsi, PLL_INPUT_AND_LOOP_DIVIDER_RATIOS_CONTROL,
431                               PLL_LOOP_DIV_EN | PLL_INPUT_DIV_EN);
432
433         dw_mipi_dsi_phy_write(dsi, AFE_BIAS_BANDGAP_ANALOG_PROGRAMMABILITY,
434                               LOW_PROGRAM_EN | BIASEXTR_SEL(BIASEXTR_127_7));
435         dw_mipi_dsi_phy_write(dsi, AFE_BIAS_BANDGAP_ANALOG_PROGRAMMABILITY,
436                               HIGH_PROGRAM_EN | BANDGAP_SEL(BANDGAP_96_10));
437
438         dw_mipi_dsi_phy_write(dsi, BANDGAP_AND_BIAS_CONTROL,
439                               POWER_CONTROL | INTERNAL_REG_CURRENT |
440                               BIAS_BLOCK_ON | BANDGAP_ON);
441
442         dw_mipi_dsi_phy_write(dsi, TERMINATION_RESISTER_CONTROL,
443                               TER_RESISTOR_LOW | TER_CAL_DONE |
444                               SETRD_MAX | TER_RESISTORS_ON);
445         dw_mipi_dsi_phy_write(dsi, TERMINATION_RESISTER_CONTROL,
446                               TER_RESISTOR_HIGH | LEVEL_SHIFTERS_ON |
447                               SETRD_MAX | POWER_MANAGE |
448                               TER_RESISTORS_ON);
449
450         dw_mipi_dsi_phy_write(dsi, HS_TX_CLOCK_LANE_REQUEST_STATE_TIME_CONTROL,
451                               TLP_PROGRAM_EN | ns2bc(dsi, 500));
452         dw_mipi_dsi_phy_write(dsi, HS_TX_CLOCK_LANE_PREPARE_STATE_TIME_CONTROL,
453                               THS_PRE_PROGRAM_EN | ns2ui(dsi, 40));
454         dw_mipi_dsi_phy_write(dsi, HS_TX_CLOCK_LANE_HS_ZERO_STATE_TIME_CONTROL,
455                               THS_ZERO_PROGRAM_EN | ns2bc(dsi, 300));
456         dw_mipi_dsi_phy_write(dsi, HS_TX_CLOCK_LANE_TRAIL_STATE_TIME_CONTROL,
457                               THS_PRE_PROGRAM_EN | ns2ui(dsi, 100));
458         dw_mipi_dsi_phy_write(dsi, HS_TX_CLOCK_LANE_EXIT_STATE_TIME_CONTROL,
459                               BIT(5) | ns2bc(dsi, 100));
460         dw_mipi_dsi_phy_write(dsi, HS_TX_CLOCK_LANE_POST_TIME_CONTROL,
461                               BIT(5) | (ns2bc(dsi, 60) + 7));
462
463         dw_mipi_dsi_phy_write(dsi, HS_TX_DATA_LANE_REQUEST_STATE_TIME_CONTROL,
464                               TLP_PROGRAM_EN | ns2bc(dsi, 500));
465         dw_mipi_dsi_phy_write(dsi, HS_TX_DATA_LANE_PREPARE_STATE_TIME_CONTROL,
466                               THS_PRE_PROGRAM_EN | (ns2ui(dsi, 50) + 20));
467         dw_mipi_dsi_phy_write(dsi, HS_TX_DATA_LANE_HS_ZERO_STATE_TIME_CONTROL,
468                               THS_ZERO_PROGRAM_EN | (ns2bc(dsi, 140) + 2));
469         dw_mipi_dsi_phy_write(dsi, HS_TX_DATA_LANE_TRAIL_STATE_TIME_CONTROL,
470                               THS_PRE_PROGRAM_EN | (ns2ui(dsi, 60) + 8));
471         dw_mipi_dsi_phy_write(dsi, HS_TX_DATA_LANE_EXIT_STATE_TIME_CONTROL,
472                               BIT(5) | ns2bc(dsi, 100));
473
474         clk_disable_unprepare(dsi->phy_cfg_clk);
475
476         return ret;
477 }
478
479 static void dw_mipi_dsi_phy_power_on(void *priv_data)
480 {
481         struct dw_mipi_dsi_rockchip *dsi = priv_data;
482         int ret;
483
484         ret = phy_set_mode(dsi->phy, PHY_MODE_MIPI_DPHY);
485         if (ret) {
486                 DRM_DEV_ERROR(dsi->dev, "failed to set phy mode: %d\n", ret);
487                 return;
488         }
489
490         phy_configure(dsi->phy, &dsi->phy_opts);
491         phy_power_on(dsi->phy);
492 }
493
494 static void dw_mipi_dsi_phy_power_off(void *priv_data)
495 {
496         struct dw_mipi_dsi_rockchip *dsi = priv_data;
497
498         phy_power_off(dsi->phy);
499 }
500
501 static int
502 dw_mipi_dsi_get_lane_mbps(void *priv_data, const struct drm_display_mode *mode,
503                           unsigned long mode_flags, u32 lanes, u32 format,
504                           unsigned int *lane_mbps)
505 {
506         struct dw_mipi_dsi_rockchip *dsi = priv_data;
507         int bpp;
508         unsigned long mpclk, tmp;
509         unsigned int target_mbps = 1000;
510         unsigned int max_mbps = dppa_map[ARRAY_SIZE(dppa_map) - 1].max_mbps;
511         unsigned long best_freq = 0;
512         unsigned long fvco_min, fvco_max, fin, fout;
513         unsigned int min_prediv, max_prediv;
514         unsigned int _prediv, best_prediv;
515         unsigned long _fbdiv, best_fbdiv;
516         unsigned long min_delta = ULONG_MAX;
517
518         dsi->format = format;
519         bpp = mipi_dsi_pixel_format_to_bpp(dsi->format);
520         if (bpp < 0) {
521                 DRM_DEV_ERROR(dsi->dev,
522                               "failed to get bpp for pixel format %d\n",
523                               dsi->format);
524                 return bpp;
525         }
526
527         mpclk = DIV_ROUND_UP(mode->clock, MSEC_PER_SEC);
528         if (mpclk) {
529                 /* take 1 / 0.8, since mbps must big than bandwidth of RGB */
530                 tmp = mpclk * (bpp / lanes) * 10 / 8;
531                 if (tmp < max_mbps)
532                         target_mbps = tmp;
533                 else
534                         DRM_DEV_ERROR(dsi->dev,
535                                       "DPHY clock frequency is out of range\n");
536         }
537
538         /* for external phy only a the mipi_dphy_config is necessary */
539         if (dsi->phy) {
540                 phy_mipi_dphy_get_default_config(mode->clock * 1000 * 10 / 8,
541                                                  bpp, lanes,
542                                                  &dsi->phy_opts.mipi_dphy);
543                 dsi->lane_mbps = target_mbps;
544                 *lane_mbps = dsi->lane_mbps;
545
546                 return 0;
547         }
548
549         fin = clk_get_rate(dsi->pllref_clk);
550         fout = target_mbps * USEC_PER_SEC;
551
552         /* constraint: 5Mhz <= Fref / N <= 40MHz */
553         min_prediv = DIV_ROUND_UP(fin, 40 * USEC_PER_SEC);
554         max_prediv = fin / (5 * USEC_PER_SEC);
555
556         /* constraint: 80MHz <= Fvco <= 1500Mhz */
557         fvco_min = 80 * USEC_PER_SEC;
558         fvco_max = 1500 * USEC_PER_SEC;
559
560         for (_prediv = min_prediv; _prediv <= max_prediv; _prediv++) {
561                 u64 tmp;
562                 u32 delta;
563                 /* Fvco = Fref * M / N */
564                 tmp = (u64)fout * _prediv;
565                 do_div(tmp, fin);
566                 _fbdiv = tmp;
567                 /*
568                  * Due to the use of a "by 2 pre-scaler," the range of the
569                  * feedback multiplication value M is limited to even division
570                  * numbers, and m must be greater than 6, not bigger than 512.
571                  */
572                 if (_fbdiv < 6 || _fbdiv > 512)
573                         continue;
574
575                 _fbdiv += _fbdiv % 2;
576
577                 tmp = (u64)_fbdiv * fin;
578                 do_div(tmp, _prediv);
579                 if (tmp < fvco_min || tmp > fvco_max)
580                         continue;
581
582                 delta = abs(fout - tmp);
583                 if (delta < min_delta) {
584                         best_prediv = _prediv;
585                         best_fbdiv = _fbdiv;
586                         min_delta = delta;
587                         best_freq = tmp;
588                 }
589         }
590
591         if (best_freq) {
592                 dsi->lane_mbps = DIV_ROUND_UP(best_freq, USEC_PER_SEC);
593                 *lane_mbps = dsi->lane_mbps;
594                 dsi->input_div = best_prediv;
595                 dsi->feedback_div = best_fbdiv;
596         } else {
597                 DRM_DEV_ERROR(dsi->dev, "Can not find best_freq for DPHY\n");
598                 return -EINVAL;
599         }
600
601         return 0;
602 }
603
604 struct hstt {
605         unsigned int maxfreq;
606         struct dw_mipi_dsi_dphy_timing timing;
607 };
608
609 #define HSTT(_maxfreq, _c_lp2hs, _c_hs2lp, _d_lp2hs, _d_hs2lp)  \
610 {                                       \
611         .maxfreq = _maxfreq,            \
612         .timing = {                     \
613                 .clk_lp2hs = _c_lp2hs,  \
614                 .clk_hs2lp = _c_hs2lp,  \
615                 .data_lp2hs = _d_lp2hs, \
616                 .data_hs2lp = _d_hs2lp, \
617         }                               \
618 }
619
620 /* Table A-3 High-Speed Transition Times */
621 struct hstt hstt_table[] = {
622         HSTT(  90,  32, 20,  26, 13),
623         HSTT( 100,  35, 23,  28, 14),
624         HSTT( 110,  32, 22,  26, 13),
625         HSTT( 130,  31, 20,  27, 13),
626         HSTT( 140,  33, 22,  26, 14),
627         HSTT( 150,  33, 21,  26, 14),
628         HSTT( 170,  32, 20,  27, 13),
629         HSTT( 180,  36, 23,  30, 15),
630         HSTT( 200,  40, 22,  33, 15),
631         HSTT( 220,  40, 22,  33, 15),
632         HSTT( 240,  44, 24,  36, 16),
633         HSTT( 250,  48, 24,  38, 17),
634         HSTT( 270,  48, 24,  38, 17),
635         HSTT( 300,  50, 27,  41, 18),
636         HSTT( 330,  56, 28,  45, 18),
637         HSTT( 360,  59, 28,  48, 19),
638         HSTT( 400,  61, 30,  50, 20),
639         HSTT( 450,  67, 31,  55, 21),
640         HSTT( 500,  73, 31,  59, 22),
641         HSTT( 550,  79, 36,  63, 24),
642         HSTT( 600,  83, 37,  68, 25),
643         HSTT( 650,  90, 38,  73, 27),
644         HSTT( 700,  95, 40,  77, 28),
645         HSTT( 750, 102, 40,  84, 28),
646         HSTT( 800, 106, 42,  87, 30),
647         HSTT( 850, 113, 44,  93, 31),
648         HSTT( 900, 118, 47,  98, 32),
649         HSTT( 950, 124, 47, 102, 34),
650         HSTT(1000, 130, 49, 107, 35),
651         HSTT(1050, 135, 51, 111, 37),
652         HSTT(1100, 139, 51, 114, 38),
653         HSTT(1150, 146, 54, 120, 40),
654         HSTT(1200, 153, 57, 125, 41),
655         HSTT(1250, 158, 58, 130, 42),
656         HSTT(1300, 163, 58, 135, 44),
657         HSTT(1350, 168, 60, 140, 45),
658         HSTT(1400, 172, 64, 144, 47),
659         HSTT(1450, 176, 65, 148, 48),
660         HSTT(1500, 181, 66, 153, 50)
661 };
662
663 static int
664 dw_mipi_dsi_phy_get_timing(void *priv_data, unsigned int lane_mbps,
665                            struct dw_mipi_dsi_dphy_timing *timing)
666 {
667         int i;
668
669         for (i = 0; i < ARRAY_SIZE(hstt_table); i++)
670                 if (lane_mbps < hstt_table[i].maxfreq)
671                         break;
672
673         if (i == ARRAY_SIZE(hstt_table))
674                 i--;
675
676         *timing = hstt_table[i].timing;
677
678         return 0;
679 }
680
681 static const struct dw_mipi_dsi_phy_ops dw_mipi_dsi_rockchip_phy_ops = {
682         .init = dw_mipi_dsi_phy_init,
683         .power_on = dw_mipi_dsi_phy_power_on,
684         .power_off = dw_mipi_dsi_phy_power_off,
685         .get_lane_mbps = dw_mipi_dsi_get_lane_mbps,
686         .get_timing = dw_mipi_dsi_phy_get_timing,
687 };
688
689 static void dw_mipi_dsi_rockchip_config(struct dw_mipi_dsi_rockchip *dsi)
690 {
691         if (dsi->cdata->lanecfg1_grf_reg)
692                 regmap_write(dsi->grf_regmap, dsi->cdata->lanecfg1_grf_reg,
693                                               dsi->cdata->lanecfg1);
694
695         if (dsi->cdata->lanecfg2_grf_reg)
696                 regmap_write(dsi->grf_regmap, dsi->cdata->lanecfg2_grf_reg,
697                                               dsi->cdata->lanecfg2);
698
699         if (dsi->cdata->enable_grf_reg)
700                 regmap_write(dsi->grf_regmap, dsi->cdata->enable_grf_reg,
701                                               dsi->cdata->enable);
702 }
703
704 static void dw_mipi_dsi_rockchip_set_lcdsel(struct dw_mipi_dsi_rockchip *dsi,
705                                             int mux)
706 {
707         regmap_write(dsi->grf_regmap, dsi->cdata->lcdsel_grf_reg,
708                 mux ? dsi->cdata->lcdsel_lit : dsi->cdata->lcdsel_big);
709 }
710
711 static int
712 dw_mipi_dsi_encoder_atomic_check(struct drm_encoder *encoder,
713                                  struct drm_crtc_state *crtc_state,
714                                  struct drm_connector_state *conn_state)
715 {
716         struct rockchip_crtc_state *s = to_rockchip_crtc_state(crtc_state);
717         struct dw_mipi_dsi_rockchip *dsi = to_dsi(encoder);
718
719         switch (dsi->format) {
720         case MIPI_DSI_FMT_RGB888:
721                 s->output_mode = ROCKCHIP_OUT_MODE_P888;
722                 break;
723         case MIPI_DSI_FMT_RGB666:
724                 s->output_mode = ROCKCHIP_OUT_MODE_P666;
725                 break;
726         case MIPI_DSI_FMT_RGB565:
727                 s->output_mode = ROCKCHIP_OUT_MODE_P565;
728                 break;
729         default:
730                 WARN_ON(1);
731                 return -EINVAL;
732         }
733
734         s->output_type = DRM_MODE_CONNECTOR_DSI;
735         if (dsi->slave)
736                 s->output_flags = ROCKCHIP_OUTPUT_DSI_DUAL;
737
738         return 0;
739 }
740
741 static void dw_mipi_dsi_encoder_enable(struct drm_encoder *encoder)
742 {
743         struct dw_mipi_dsi_rockchip *dsi = to_dsi(encoder);
744         int ret, mux;
745
746         mux = drm_of_encoder_active_endpoint_id(dsi->dev->of_node,
747                                                 &dsi->encoder);
748         if (mux < 0)
749                 return;
750
751         pm_runtime_get_sync(dsi->dev);
752         if (dsi->slave)
753                 pm_runtime_get_sync(dsi->slave->dev);
754
755         /*
756          * For the RK3399, the clk of grf must be enabled before writing grf
757          * register. And for RK3288 or other soc, this grf_clk must be NULL,
758          * the clk_prepare_enable return true directly.
759          */
760         ret = clk_prepare_enable(dsi->grf_clk);
761         if (ret) {
762                 DRM_DEV_ERROR(dsi->dev, "Failed to enable grf_clk: %d\n", ret);
763                 return;
764         }
765
766         dw_mipi_dsi_rockchip_set_lcdsel(dsi, mux);
767         if (dsi->slave)
768                 dw_mipi_dsi_rockchip_set_lcdsel(dsi->slave, mux);
769
770         clk_disable_unprepare(dsi->grf_clk);
771 }
772
773 static void dw_mipi_dsi_encoder_disable(struct drm_encoder *encoder)
774 {
775         struct dw_mipi_dsi_rockchip *dsi = to_dsi(encoder);
776
777         if (dsi->slave)
778                 pm_runtime_put(dsi->slave->dev);
779         pm_runtime_put(dsi->dev);
780 }
781
782 static const struct drm_encoder_helper_funcs
783 dw_mipi_dsi_encoder_helper_funcs = {
784         .atomic_check = dw_mipi_dsi_encoder_atomic_check,
785         .enable = dw_mipi_dsi_encoder_enable,
786         .disable = dw_mipi_dsi_encoder_disable,
787 };
788
789 static int rockchip_dsi_drm_create_encoder(struct dw_mipi_dsi_rockchip *dsi,
790                                            struct drm_device *drm_dev)
791 {
792         struct drm_encoder *encoder = &dsi->encoder;
793         int ret;
794
795         encoder->possible_crtcs = drm_of_find_possible_crtcs(drm_dev,
796                                                              dsi->dev->of_node);
797
798         ret = drm_simple_encoder_init(drm_dev, encoder, DRM_MODE_ENCODER_DSI);
799         if (ret) {
800                 DRM_ERROR("Failed to initialize encoder with drm\n");
801                 return ret;
802         }
803
804         drm_encoder_helper_add(encoder, &dw_mipi_dsi_encoder_helper_funcs);
805
806         return 0;
807 }
808
809 static struct device
810 *dw_mipi_dsi_rockchip_find_second(struct dw_mipi_dsi_rockchip *dsi)
811 {
812         const struct of_device_id *match;
813         struct device_node *node = NULL, *local;
814
815         match = of_match_device(dsi->dev->driver->of_match_table, dsi->dev);
816
817         local = of_graph_get_remote_node(dsi->dev->of_node, 1, 0);
818         if (!local)
819                 return NULL;
820
821         while ((node = of_find_compatible_node(node, NULL,
822                                                match->compatible))) {
823                 struct device_node *remote;
824
825                 /* found ourself */
826                 if (node == dsi->dev->of_node)
827                         continue;
828
829                 remote = of_graph_get_remote_node(node, 1, 0);
830                 if (!remote)
831                         continue;
832
833                 /* same display device in port1-ep0 for both */
834                 if (remote == local) {
835                         struct dw_mipi_dsi_rockchip *dsi2;
836                         struct platform_device *pdev;
837
838                         pdev = of_find_device_by_node(node);
839
840                         /*
841                          * we have found the second, so will either return it
842                          * or return with an error. In any case won't need the
843                          * nodes anymore nor continue the loop.
844                          */
845                         of_node_put(remote);
846                         of_node_put(node);
847                         of_node_put(local);
848
849                         if (!pdev)
850                                 return ERR_PTR(-EPROBE_DEFER);
851
852                         dsi2 = platform_get_drvdata(pdev);
853                         if (!dsi2) {
854                                 platform_device_put(pdev);
855                                 return ERR_PTR(-EPROBE_DEFER);
856                         }
857
858                         return &pdev->dev;
859                 }
860
861                 of_node_put(remote);
862         }
863
864         of_node_put(local);
865
866         return NULL;
867 }
868
869 static int dw_mipi_dsi_rockchip_bind(struct device *dev,
870                                      struct device *master,
871                                      void *data)
872 {
873         struct dw_mipi_dsi_rockchip *dsi = dev_get_drvdata(dev);
874         struct drm_device *drm_dev = data;
875         struct device *second;
876         bool master1, master2;
877         int ret;
878
879         second = dw_mipi_dsi_rockchip_find_second(dsi);
880         if (IS_ERR(second))
881                 return PTR_ERR(second);
882
883         if (second) {
884                 master1 = of_property_read_bool(dsi->dev->of_node,
885                                                 "clock-master");
886                 master2 = of_property_read_bool(second->of_node,
887                                                 "clock-master");
888
889                 if (master1 && master2) {
890                         DRM_DEV_ERROR(dsi->dev, "only one clock-master allowed\n");
891                         return -EINVAL;
892                 }
893
894                 if (!master1 && !master2) {
895                         DRM_DEV_ERROR(dsi->dev, "no clock-master defined\n");
896                         return -EINVAL;
897                 }
898
899                 /* we are the slave in dual-DSI */
900                 if (!master1) {
901                         dsi->is_slave = true;
902                         return 0;
903                 }
904
905                 dsi->slave = dev_get_drvdata(second);
906                 if (!dsi->slave) {
907                         DRM_DEV_ERROR(dev, "could not get slaves data\n");
908                         return -ENODEV;
909                 }
910
911                 dsi->slave->is_slave = true;
912                 dw_mipi_dsi_set_slave(dsi->dmd, dsi->slave->dmd);
913                 put_device(second);
914         }
915
916         ret = clk_prepare_enable(dsi->pllref_clk);
917         if (ret) {
918                 DRM_DEV_ERROR(dev, "Failed to enable pllref_clk: %d\n", ret);
919                 return ret;
920         }
921
922         /*
923          * With the GRF clock running, write lane and dual-mode configurations
924          * that won't change immediately. If we waited until enable() to do
925          * this, things like panel preparation would not be able to send
926          * commands over DSI.
927          */
928         ret = clk_prepare_enable(dsi->grf_clk);
929         if (ret) {
930                 DRM_DEV_ERROR(dsi->dev, "Failed to enable grf_clk: %d\n", ret);
931                 return ret;
932         }
933
934         dw_mipi_dsi_rockchip_config(dsi);
935         if (dsi->slave)
936                 dw_mipi_dsi_rockchip_config(dsi->slave);
937
938         clk_disable_unprepare(dsi->grf_clk);
939
940         ret = rockchip_dsi_drm_create_encoder(dsi, drm_dev);
941         if (ret) {
942                 DRM_DEV_ERROR(dev, "Failed to create drm encoder\n");
943                 return ret;
944         }
945
946         ret = dw_mipi_dsi_bind(dsi->dmd, &dsi->encoder);
947         if (ret) {
948                 DRM_DEV_ERROR(dev, "Failed to bind: %d\n", ret);
949                 return ret;
950         }
951
952         return 0;
953 }
954
955 static void dw_mipi_dsi_rockchip_unbind(struct device *dev,
956                                         struct device *master,
957                                         void *data)
958 {
959         struct dw_mipi_dsi_rockchip *dsi = dev_get_drvdata(dev);
960
961         if (dsi->is_slave)
962                 return;
963
964         dw_mipi_dsi_unbind(dsi->dmd);
965
966         clk_disable_unprepare(dsi->pllref_clk);
967 }
968
969 static const struct component_ops dw_mipi_dsi_rockchip_ops = {
970         .bind   = dw_mipi_dsi_rockchip_bind,
971         .unbind = dw_mipi_dsi_rockchip_unbind,
972 };
973
974 static int dw_mipi_dsi_rockchip_host_attach(void *priv_data,
975                                             struct mipi_dsi_device *device)
976 {
977         struct dw_mipi_dsi_rockchip *dsi = priv_data;
978         struct device *second;
979         int ret;
980
981         ret = component_add(dsi->dev, &dw_mipi_dsi_rockchip_ops);
982         if (ret) {
983                 DRM_DEV_ERROR(dsi->dev, "Failed to register component: %d\n",
984                                         ret);
985                 return ret;
986         }
987
988         second = dw_mipi_dsi_rockchip_find_second(dsi);
989         if (IS_ERR(second))
990                 return PTR_ERR(second);
991         if (second) {
992                 ret = component_add(second, &dw_mipi_dsi_rockchip_ops);
993                 if (ret) {
994                         DRM_DEV_ERROR(second,
995                                       "Failed to register component: %d\n",
996                                       ret);
997                         return ret;
998                 }
999         }
1000
1001         return 0;
1002 }
1003
1004 static int dw_mipi_dsi_rockchip_host_detach(void *priv_data,
1005                                             struct mipi_dsi_device *device)
1006 {
1007         struct dw_mipi_dsi_rockchip *dsi = priv_data;
1008         struct device *second;
1009
1010         second = dw_mipi_dsi_rockchip_find_second(dsi);
1011         if (second && !IS_ERR(second))
1012                 component_del(second, &dw_mipi_dsi_rockchip_ops);
1013
1014         component_del(dsi->dev, &dw_mipi_dsi_rockchip_ops);
1015
1016         return 0;
1017 }
1018
1019 static const struct dw_mipi_dsi_host_ops dw_mipi_dsi_rockchip_host_ops = {
1020         .attach = dw_mipi_dsi_rockchip_host_attach,
1021         .detach = dw_mipi_dsi_rockchip_host_detach,
1022 };
1023
1024 static int dw_mipi_dsi_rockchip_probe(struct platform_device *pdev)
1025 {
1026         struct device *dev = &pdev->dev;
1027         struct device_node *np = dev->of_node;
1028         struct dw_mipi_dsi_rockchip *dsi;
1029         struct resource *res;
1030         const struct rockchip_dw_dsi_chip_data *cdata =
1031                                 of_device_get_match_data(dev);
1032         int ret, i;
1033
1034         dsi = devm_kzalloc(dev, sizeof(*dsi), GFP_KERNEL);
1035         if (!dsi)
1036                 return -ENOMEM;
1037
1038         res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1039         dsi->base = devm_ioremap_resource(dev, res);
1040         if (IS_ERR(dsi->base)) {
1041                 DRM_DEV_ERROR(dev, "Unable to get dsi registers\n");
1042                 return PTR_ERR(dsi->base);
1043         }
1044
1045         i = 0;
1046         while (cdata[i].reg) {
1047                 if (cdata[i].reg == res->start) {
1048                         dsi->cdata = &cdata[i];
1049                         break;
1050                 }
1051
1052                 i++;
1053         }
1054
1055         if (!dsi->cdata) {
1056                 DRM_DEV_ERROR(dev, "no dsi-config for %s node\n", np->name);
1057                 return -EINVAL;
1058         }
1059
1060         /* try to get a possible external dphy */
1061         dsi->phy = devm_phy_optional_get(dev, "dphy");
1062         if (IS_ERR(dsi->phy)) {
1063                 ret = PTR_ERR(dsi->phy);
1064                 DRM_DEV_ERROR(dev, "failed to get mipi dphy: %d\n", ret);
1065                 return ret;
1066         }
1067
1068         dsi->pllref_clk = devm_clk_get(dev, "ref");
1069         if (IS_ERR(dsi->pllref_clk)) {
1070                 if (dsi->phy) {
1071                         /*
1072                          * if external phy is present, pll will be
1073                          * generated there.
1074                          */
1075                         dsi->pllref_clk = NULL;
1076                 } else {
1077                         ret = PTR_ERR(dsi->pllref_clk);
1078                         DRM_DEV_ERROR(dev,
1079                                       "Unable to get pll reference clock: %d\n",
1080                                       ret);
1081                         return ret;
1082                 }
1083         }
1084
1085         if (dsi->cdata->flags & DW_MIPI_NEEDS_PHY_CFG_CLK) {
1086                 dsi->phy_cfg_clk = devm_clk_get(dev, "phy_cfg");
1087                 if (IS_ERR(dsi->phy_cfg_clk)) {
1088                         ret = PTR_ERR(dsi->phy_cfg_clk);
1089                         DRM_DEV_ERROR(dev,
1090                                       "Unable to get phy_cfg_clk: %d\n", ret);
1091                         return ret;
1092                 }
1093         }
1094
1095         if (dsi->cdata->flags & DW_MIPI_NEEDS_GRF_CLK) {
1096                 dsi->grf_clk = devm_clk_get(dev, "grf");
1097                 if (IS_ERR(dsi->grf_clk)) {
1098                         ret = PTR_ERR(dsi->grf_clk);
1099                         DRM_DEV_ERROR(dev, "Unable to get grf_clk: %d\n", ret);
1100                         return ret;
1101                 }
1102         }
1103
1104         dsi->grf_regmap = syscon_regmap_lookup_by_phandle(np, "rockchip,grf");
1105         if (IS_ERR(dsi->grf_regmap)) {
1106                 DRM_DEV_ERROR(dev, "Unable to get rockchip,grf\n");
1107                 return PTR_ERR(dsi->grf_regmap);
1108         }
1109
1110         dsi->dev = dev;
1111         dsi->pdata.base = dsi->base;
1112         dsi->pdata.max_data_lanes = dsi->cdata->max_data_lanes;
1113         dsi->pdata.phy_ops = &dw_mipi_dsi_rockchip_phy_ops;
1114         dsi->pdata.host_ops = &dw_mipi_dsi_rockchip_host_ops;
1115         dsi->pdata.priv_data = dsi;
1116         platform_set_drvdata(pdev, dsi);
1117
1118         dsi->dmd = dw_mipi_dsi_probe(pdev, &dsi->pdata);
1119         if (IS_ERR(dsi->dmd)) {
1120                 ret = PTR_ERR(dsi->dmd);
1121                 if (ret != -EPROBE_DEFER)
1122                         DRM_DEV_ERROR(dev,
1123                                       "Failed to probe dw_mipi_dsi: %d\n", ret);
1124                 goto err_clkdisable;
1125         }
1126
1127         return 0;
1128
1129 err_clkdisable:
1130         clk_disable_unprepare(dsi->pllref_clk);
1131         return ret;
1132 }
1133
1134 static int dw_mipi_dsi_rockchip_remove(struct platform_device *pdev)
1135 {
1136         struct dw_mipi_dsi_rockchip *dsi = platform_get_drvdata(pdev);
1137
1138         dw_mipi_dsi_remove(dsi->dmd);
1139
1140         return 0;
1141 }
1142
1143 static const struct rockchip_dw_dsi_chip_data px30_chip_data[] = {
1144         {
1145                 .reg = 0xff450000,
1146                 .lcdsel_grf_reg = PX30_GRF_PD_VO_CON1,
1147                 .lcdsel_big = HIWORD_UPDATE(0, PX30_DSI_LCDC_SEL),
1148                 .lcdsel_lit = HIWORD_UPDATE(PX30_DSI_LCDC_SEL,
1149                                             PX30_DSI_LCDC_SEL),
1150
1151                 .lanecfg1_grf_reg = PX30_GRF_PD_VO_CON1,
1152                 .lanecfg1 = HIWORD_UPDATE(0, PX30_DSI_TURNDISABLE |
1153                                              PX30_DSI_FORCERXMODE |
1154                                              PX30_DSI_FORCETXSTOPMODE),
1155
1156                 .max_data_lanes = 4,
1157         },
1158         { /* sentinel */ }
1159 };
1160
1161 static const struct rockchip_dw_dsi_chip_data rk3288_chip_data[] = {
1162         {
1163                 .reg = 0xff960000,
1164                 .lcdsel_grf_reg = RK3288_GRF_SOC_CON6,
1165                 .lcdsel_big = HIWORD_UPDATE(0, RK3288_DSI0_LCDC_SEL),
1166                 .lcdsel_lit = HIWORD_UPDATE(RK3288_DSI0_LCDC_SEL, RK3288_DSI0_LCDC_SEL),
1167
1168                 .max_data_lanes = 4,
1169         },
1170         {
1171                 .reg = 0xff964000,
1172                 .lcdsel_grf_reg = RK3288_GRF_SOC_CON6,
1173                 .lcdsel_big = HIWORD_UPDATE(0, RK3288_DSI1_LCDC_SEL),
1174                 .lcdsel_lit = HIWORD_UPDATE(RK3288_DSI1_LCDC_SEL, RK3288_DSI1_LCDC_SEL),
1175
1176                 .max_data_lanes = 4,
1177         },
1178         { /* sentinel */ }
1179 };
1180
1181 static const struct rockchip_dw_dsi_chip_data rk3399_chip_data[] = {
1182         {
1183                 .reg = 0xff960000,
1184                 .lcdsel_grf_reg = RK3399_GRF_SOC_CON20,
1185                 .lcdsel_big = HIWORD_UPDATE(0, RK3399_DSI0_LCDC_SEL),
1186                 .lcdsel_lit = HIWORD_UPDATE(RK3399_DSI0_LCDC_SEL,
1187                                             RK3399_DSI0_LCDC_SEL),
1188
1189                 .lanecfg1_grf_reg = RK3399_GRF_SOC_CON22,
1190                 .lanecfg1 = HIWORD_UPDATE(0, RK3399_DSI0_TURNREQUEST |
1191                                              RK3399_DSI0_TURNDISABLE |
1192                                              RK3399_DSI0_FORCETXSTOPMODE |
1193                                              RK3399_DSI0_FORCERXMODE),
1194
1195                 .flags = DW_MIPI_NEEDS_PHY_CFG_CLK | DW_MIPI_NEEDS_GRF_CLK,
1196                 .max_data_lanes = 4,
1197         },
1198         {
1199                 .reg = 0xff968000,
1200                 .lcdsel_grf_reg = RK3399_GRF_SOC_CON20,
1201                 .lcdsel_big = HIWORD_UPDATE(0, RK3399_DSI1_LCDC_SEL),
1202                 .lcdsel_lit = HIWORD_UPDATE(RK3399_DSI1_LCDC_SEL,
1203                                             RK3399_DSI1_LCDC_SEL),
1204
1205                 .lanecfg1_grf_reg = RK3399_GRF_SOC_CON23,
1206                 .lanecfg1 = HIWORD_UPDATE(0, RK3399_DSI1_TURNDISABLE |
1207                                              RK3399_DSI1_FORCETXSTOPMODE |
1208                                              RK3399_DSI1_FORCERXMODE |
1209                                              RK3399_DSI1_ENABLE),
1210
1211                 .lanecfg2_grf_reg = RK3399_GRF_SOC_CON24,
1212                 .lanecfg2 = HIWORD_UPDATE(RK3399_TXRX_MASTERSLAVEZ |
1213                                           RK3399_TXRX_ENABLECLK,
1214                                           RK3399_TXRX_MASTERSLAVEZ |
1215                                           RK3399_TXRX_ENABLECLK |
1216                                           RK3399_TXRX_BASEDIR),
1217
1218                 .enable_grf_reg = RK3399_GRF_SOC_CON23,
1219                 .enable = HIWORD_UPDATE(RK3399_DSI1_ENABLE, RK3399_DSI1_ENABLE),
1220
1221                 .flags = DW_MIPI_NEEDS_PHY_CFG_CLK | DW_MIPI_NEEDS_GRF_CLK,
1222                 .max_data_lanes = 4,
1223         },
1224         { /* sentinel */ }
1225 };
1226
1227 static const struct of_device_id dw_mipi_dsi_rockchip_dt_ids[] = {
1228         {
1229          .compatible = "rockchip,px30-mipi-dsi",
1230          .data = &px30_chip_data,
1231         }, {
1232          .compatible = "rockchip,rk3288-mipi-dsi",
1233          .data = &rk3288_chip_data,
1234         }, {
1235          .compatible = "rockchip,rk3399-mipi-dsi",
1236          .data = &rk3399_chip_data,
1237         },
1238         { /* sentinel */ }
1239 };
1240 MODULE_DEVICE_TABLE(of, dw_mipi_dsi_rockchip_dt_ids);
1241
1242 struct platform_driver dw_mipi_dsi_rockchip_driver = {
1243         .probe          = dw_mipi_dsi_rockchip_probe,
1244         .remove         = dw_mipi_dsi_rockchip_remove,
1245         .driver         = {
1246                 .of_match_table = dw_mipi_dsi_rockchip_dt_ids,
1247                 .name   = "dw-mipi-dsi-rockchip",
1248         },
1249 };