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 RK3288_GRF_SOC_CON6 0x025c
144 #define RK3288_DSI0_LCDC_SEL BIT(6)
145 #define RK3288_DSI1_LCDC_SEL BIT(9)
147 #define RK3399_GRF_SOC_CON20 0x6250
148 #define RK3399_DSI0_LCDC_SEL BIT(0)
149 #define RK3399_DSI1_LCDC_SEL BIT(4)
151 #define RK3399_GRF_SOC_CON22 0x6258
152 #define RK3399_DSI0_TURNREQUEST (0xf << 12)
153 #define RK3399_DSI0_TURNDISABLE (0xf << 8)
154 #define RK3399_DSI0_FORCETXSTOPMODE (0xf << 4)
155 #define RK3399_DSI0_FORCERXMODE (0xf << 0)
157 #define RK3399_GRF_SOC_CON23 0x625c
158 #define RK3399_DSI1_TURNDISABLE (0xf << 12)
159 #define RK3399_DSI1_FORCETXSTOPMODE (0xf << 8)
160 #define RK3399_DSI1_FORCERXMODE (0xf << 4)
161 #define RK3399_DSI1_ENABLE (0xf << 0)
163 #define RK3399_GRF_SOC_CON24 0x6260
164 #define RK3399_TXRX_MASTERSLAVEZ BIT(7)
165 #define RK3399_TXRX_ENABLECLK BIT(6)
166 #define RK3399_TXRX_BASEDIR BIT(5)
168 #define HIWORD_UPDATE(val, mask) (val | (mask) << 16)
170 #define to_dsi(nm) container_of(nm, struct dw_mipi_dsi_rockchip, nm)
194 struct rockchip_dw_dsi_chip_data {
204 u32 lanecfg1_grf_reg;
206 u32 lanecfg2_grf_reg;
210 unsigned int max_data_lanes;
213 struct dw_mipi_dsi_rockchip {
215 struct drm_encoder encoder;
218 struct regmap *grf_regmap;
219 struct clk *pllref_clk;
221 struct clk *phy_cfg_clk;
225 struct dw_mipi_dsi_rockchip *slave;
227 /* optional external dphy */
229 union phy_configure_opts phy_opts;
231 unsigned int lane_mbps; /* per lane */
236 struct dw_mipi_dsi *dmd;
237 const struct rockchip_dw_dsi_chip_data *cdata;
238 struct dw_mipi_dsi_plat_data pdata;
242 struct dphy_pll_parameter_map {
243 unsigned int max_mbps;
249 /* The table is based on 27MHz DPHY pll reference clock. */
250 static const struct dphy_pll_parameter_map dppa_map[] = {
251 { 89, 0x00, CP_CURRENT_3UA, LPF_RESISTORS_13KOHM },
252 { 99, 0x10, CP_CURRENT_3UA, LPF_RESISTORS_13KOHM },
253 { 109, 0x20, CP_CURRENT_3UA, LPF_RESISTORS_13KOHM },
254 { 129, 0x01, CP_CURRENT_3UA, LPF_RESISTORS_15_5KOHM },
255 { 139, 0x11, CP_CURRENT_3UA, LPF_RESISTORS_15_5KOHM },
256 { 149, 0x21, CP_CURRENT_3UA, LPF_RESISTORS_15_5KOHM },
257 { 169, 0x02, CP_CURRENT_6UA, LPF_RESISTORS_13KOHM },
258 { 179, 0x12, CP_CURRENT_6UA, LPF_RESISTORS_13KOHM },
259 { 199, 0x22, CP_CURRENT_6UA, LPF_RESISTORS_13KOHM },
260 { 219, 0x03, CP_CURRENT_4_5UA, LPF_RESISTORS_13KOHM },
261 { 239, 0x13, CP_CURRENT_4_5UA, LPF_RESISTORS_13KOHM },
262 { 249, 0x23, CP_CURRENT_4_5UA, LPF_RESISTORS_13KOHM },
263 { 269, 0x04, CP_CURRENT_6UA, LPF_RESISTORS_11_5KOHM },
264 { 299, 0x14, CP_CURRENT_6UA, LPF_RESISTORS_11_5KOHM },
265 { 329, 0x05, CP_CURRENT_3UA, LPF_RESISTORS_15_5KOHM },
266 { 359, 0x15, CP_CURRENT_3UA, LPF_RESISTORS_15_5KOHM },
267 { 399, 0x25, CP_CURRENT_3UA, LPF_RESISTORS_15_5KOHM },
268 { 449, 0x06, CP_CURRENT_7_5UA, LPF_RESISTORS_11_5KOHM },
269 { 499, 0x16, CP_CURRENT_7_5UA, LPF_RESISTORS_11_5KOHM },
270 { 549, 0x07, CP_CURRENT_7_5UA, LPF_RESISTORS_10_5KOHM },
271 { 599, 0x17, CP_CURRENT_7_5UA, LPF_RESISTORS_10_5KOHM },
272 { 649, 0x08, CP_CURRENT_7_5UA, LPF_RESISTORS_11_5KOHM },
273 { 699, 0x18, CP_CURRENT_7_5UA, LPF_RESISTORS_11_5KOHM },
274 { 749, 0x09, CP_CURRENT_7_5UA, LPF_RESISTORS_11_5KOHM },
275 { 799, 0x19, CP_CURRENT_7_5UA, LPF_RESISTORS_11_5KOHM },
276 { 849, 0x29, CP_CURRENT_7_5UA, LPF_RESISTORS_11_5KOHM },
277 { 899, 0x39, CP_CURRENT_7_5UA, LPF_RESISTORS_11_5KOHM },
278 { 949, 0x0a, CP_CURRENT_12UA, LPF_RESISTORS_8KOHM },
279 { 999, 0x1a, CP_CURRENT_12UA, LPF_RESISTORS_8KOHM },
280 {1049, 0x2a, CP_CURRENT_12UA, LPF_RESISTORS_8KOHM },
281 {1099, 0x3a, CP_CURRENT_12UA, LPF_RESISTORS_8KOHM },
282 {1149, 0x0b, CP_CURRENT_12UA, LPF_RESISTORS_10_5KOHM },
283 {1199, 0x1b, CP_CURRENT_12UA, LPF_RESISTORS_10_5KOHM },
284 {1249, 0x2b, CP_CURRENT_12UA, LPF_RESISTORS_10_5KOHM },
285 {1299, 0x3b, CP_CURRENT_12UA, LPF_RESISTORS_10_5KOHM },
286 {1349, 0x0c, CP_CURRENT_12UA, LPF_RESISTORS_10_5KOHM },
287 {1399, 0x1c, CP_CURRENT_12UA, LPF_RESISTORS_10_5KOHM },
288 {1449, 0x2c, CP_CURRENT_12UA, LPF_RESISTORS_10_5KOHM },
289 {1500, 0x3c, CP_CURRENT_12UA, LPF_RESISTORS_10_5KOHM }
292 static int max_mbps_to_parameter(unsigned int max_mbps)
296 for (i = 0; i < ARRAY_SIZE(dppa_map); i++)
297 if (dppa_map[i].max_mbps >= max_mbps)
303 static inline void dsi_write(struct dw_mipi_dsi_rockchip *dsi, u32 reg, u32 val)
305 writel(val, dsi->base + reg);
308 static inline u32 dsi_read(struct dw_mipi_dsi_rockchip *dsi, u32 reg)
310 return readl(dsi->base + reg);
313 static inline void dsi_set(struct dw_mipi_dsi_rockchip *dsi, u32 reg, u32 mask)
315 dsi_write(dsi, reg, dsi_read(dsi, reg) | mask);
318 static inline void dsi_update_bits(struct dw_mipi_dsi_rockchip *dsi, u32 reg,
321 dsi_write(dsi, reg, (dsi_read(dsi, reg) & ~mask) | val);
324 static void dw_mipi_dsi_phy_write(struct dw_mipi_dsi_rockchip *dsi,
329 * With the falling edge on TESTCLK, the TESTDIN[7:0] signal content
330 * is latched internally as the current test code. Test data is
331 * programmed internally by rising edge on TESTCLK.
333 dsi_write(dsi, DSI_PHY_TST_CTRL0, PHY_TESTCLK | PHY_UNTESTCLR);
335 dsi_write(dsi, DSI_PHY_TST_CTRL1, PHY_TESTEN | PHY_TESTDOUT(0) |
336 PHY_TESTDIN(test_code));
338 dsi_write(dsi, DSI_PHY_TST_CTRL0, PHY_UNTESTCLK | PHY_UNTESTCLR);
340 dsi_write(dsi, DSI_PHY_TST_CTRL1, PHY_UNTESTEN | PHY_TESTDOUT(0) |
341 PHY_TESTDIN(test_data));
343 dsi_write(dsi, DSI_PHY_TST_CTRL0, PHY_TESTCLK | PHY_UNTESTCLR);
347 * ns2bc - Nanoseconds to byte clock cycles
349 static inline unsigned int ns2bc(struct dw_mipi_dsi_rockchip *dsi, int ns)
351 return DIV_ROUND_UP(ns * dsi->lane_mbps / 8, 1000);
355 * ns2ui - Nanoseconds to UI time periods
357 static inline unsigned int ns2ui(struct dw_mipi_dsi_rockchip *dsi, int ns)
359 return DIV_ROUND_UP(ns * dsi->lane_mbps, 1000);
362 static int dw_mipi_dsi_phy_init(void *priv_data)
364 struct dw_mipi_dsi_rockchip *dsi = priv_data;
371 * Get vco from frequency(lane_mbps)
372 * vco frequency table
373 * 000 - between 80 and 200 MHz
374 * 001 - between 200 and 300 MHz
375 * 010 - between 300 and 500 MHz
376 * 011 - between 500 and 700 MHz
377 * 100 - between 700 and 900 MHz
378 * 101 - between 900 and 1100 MHz
379 * 110 - between 1100 and 1300 MHz
380 * 111 - between 1300 and 1500 MHz
382 vco = (dsi->lane_mbps < 200) ? 0 : (dsi->lane_mbps + 100) / 200;
384 i = max_mbps_to_parameter(dsi->lane_mbps);
386 DRM_DEV_ERROR(dsi->dev,
387 "failed to get parameter for %dmbps clock\n",
392 ret = clk_prepare_enable(dsi->phy_cfg_clk);
394 DRM_DEV_ERROR(dsi->dev, "Failed to enable phy_cfg_clk\n");
398 dw_mipi_dsi_phy_write(dsi, PLL_BIAS_CUR_SEL_CAP_VCO_CONTROL,
400 VCO_RANGE_CON_SEL(vco) |
404 dw_mipi_dsi_phy_write(dsi, PLL_CP_CONTROL_PLL_LOCK_BYPASS,
405 CP_CURRENT_SEL(dppa_map[i].icpctrl));
406 dw_mipi_dsi_phy_write(dsi, PLL_LPF_AND_CP_CONTROL,
407 CP_PROGRAM_EN | LPF_PROGRAM_EN |
408 LPF_RESISTORS_SEL(dppa_map[i].lpfctrl));
410 dw_mipi_dsi_phy_write(dsi, HS_RX_CONTROL_OF_LANE_0,
411 HSFREQRANGE_SEL(dppa_map[i].hsfreqrange));
413 dw_mipi_dsi_phy_write(dsi, PLL_INPUT_DIVIDER_RATIO,
414 INPUT_DIVIDER(dsi->input_div));
415 dw_mipi_dsi_phy_write(dsi, PLL_LOOP_DIVIDER_RATIO,
416 LOOP_DIV_LOW_SEL(dsi->feedback_div) |
419 * We need set PLL_INPUT_AND_LOOP_DIVIDER_RATIOS_CONTROL immediately
420 * to make the configured LSB effective according to IP simulation
421 * and lab test results.
422 * Only in this way can we get correct mipi phy pll frequency.
424 dw_mipi_dsi_phy_write(dsi, PLL_INPUT_AND_LOOP_DIVIDER_RATIOS_CONTROL,
425 PLL_LOOP_DIV_EN | PLL_INPUT_DIV_EN);
426 dw_mipi_dsi_phy_write(dsi, PLL_LOOP_DIVIDER_RATIO,
427 LOOP_DIV_HIGH_SEL(dsi->feedback_div) |
429 dw_mipi_dsi_phy_write(dsi, PLL_INPUT_AND_LOOP_DIVIDER_RATIOS_CONTROL,
430 PLL_LOOP_DIV_EN | PLL_INPUT_DIV_EN);
432 dw_mipi_dsi_phy_write(dsi, AFE_BIAS_BANDGAP_ANALOG_PROGRAMMABILITY,
433 LOW_PROGRAM_EN | BIASEXTR_SEL(BIASEXTR_127_7));
434 dw_mipi_dsi_phy_write(dsi, AFE_BIAS_BANDGAP_ANALOG_PROGRAMMABILITY,
435 HIGH_PROGRAM_EN | BANDGAP_SEL(BANDGAP_96_10));
437 dw_mipi_dsi_phy_write(dsi, BANDGAP_AND_BIAS_CONTROL,
438 POWER_CONTROL | INTERNAL_REG_CURRENT |
439 BIAS_BLOCK_ON | BANDGAP_ON);
441 dw_mipi_dsi_phy_write(dsi, TERMINATION_RESISTER_CONTROL,
442 TER_RESISTOR_LOW | TER_CAL_DONE |
443 SETRD_MAX | TER_RESISTORS_ON);
444 dw_mipi_dsi_phy_write(dsi, TERMINATION_RESISTER_CONTROL,
445 TER_RESISTOR_HIGH | LEVEL_SHIFTERS_ON |
446 SETRD_MAX | POWER_MANAGE |
449 dw_mipi_dsi_phy_write(dsi, HS_TX_CLOCK_LANE_REQUEST_STATE_TIME_CONTROL,
450 TLP_PROGRAM_EN | ns2bc(dsi, 500));
451 dw_mipi_dsi_phy_write(dsi, HS_TX_CLOCK_LANE_PREPARE_STATE_TIME_CONTROL,
452 THS_PRE_PROGRAM_EN | ns2ui(dsi, 40));
453 dw_mipi_dsi_phy_write(dsi, HS_TX_CLOCK_LANE_HS_ZERO_STATE_TIME_CONTROL,
454 THS_ZERO_PROGRAM_EN | ns2bc(dsi, 300));
455 dw_mipi_dsi_phy_write(dsi, HS_TX_CLOCK_LANE_TRAIL_STATE_TIME_CONTROL,
456 THS_PRE_PROGRAM_EN | ns2ui(dsi, 100));
457 dw_mipi_dsi_phy_write(dsi, HS_TX_CLOCK_LANE_EXIT_STATE_TIME_CONTROL,
458 BIT(5) | ns2bc(dsi, 100));
459 dw_mipi_dsi_phy_write(dsi, HS_TX_CLOCK_LANE_POST_TIME_CONTROL,
460 BIT(5) | (ns2bc(dsi, 60) + 7));
462 dw_mipi_dsi_phy_write(dsi, HS_TX_DATA_LANE_REQUEST_STATE_TIME_CONTROL,
463 TLP_PROGRAM_EN | ns2bc(dsi, 500));
464 dw_mipi_dsi_phy_write(dsi, HS_TX_DATA_LANE_PREPARE_STATE_TIME_CONTROL,
465 THS_PRE_PROGRAM_EN | (ns2ui(dsi, 50) + 20));
466 dw_mipi_dsi_phy_write(dsi, HS_TX_DATA_LANE_HS_ZERO_STATE_TIME_CONTROL,
467 THS_ZERO_PROGRAM_EN | (ns2bc(dsi, 140) + 2));
468 dw_mipi_dsi_phy_write(dsi, HS_TX_DATA_LANE_TRAIL_STATE_TIME_CONTROL,
469 THS_PRE_PROGRAM_EN | (ns2ui(dsi, 60) + 8));
470 dw_mipi_dsi_phy_write(dsi, HS_TX_DATA_LANE_EXIT_STATE_TIME_CONTROL,
471 BIT(5) | ns2bc(dsi, 100));
473 clk_disable_unprepare(dsi->phy_cfg_clk);
478 static void dw_mipi_dsi_phy_power_on(void *priv_data)
480 struct dw_mipi_dsi_rockchip *dsi = priv_data;
483 ret = phy_set_mode(dsi->phy, PHY_MODE_MIPI_DPHY);
485 DRM_DEV_ERROR(dsi->dev, "failed to set phy mode: %d\n", ret);
489 phy_configure(dsi->phy, &dsi->phy_opts);
490 phy_power_on(dsi->phy);
493 static void dw_mipi_dsi_phy_power_off(void *priv_data)
495 struct dw_mipi_dsi_rockchip *dsi = priv_data;
497 phy_power_off(dsi->phy);
501 dw_mipi_dsi_get_lane_mbps(void *priv_data, const struct drm_display_mode *mode,
502 unsigned long mode_flags, u32 lanes, u32 format,
503 unsigned int *lane_mbps)
505 struct dw_mipi_dsi_rockchip *dsi = priv_data;
507 unsigned long mpclk, tmp;
508 unsigned int target_mbps = 1000;
509 unsigned int max_mbps = dppa_map[ARRAY_SIZE(dppa_map) - 1].max_mbps;
510 unsigned long best_freq = 0;
511 unsigned long fvco_min, fvco_max, fin, fout;
512 unsigned int min_prediv, max_prediv;
513 unsigned int _prediv, uninitialized_var(best_prediv);
514 unsigned long _fbdiv, uninitialized_var(best_fbdiv);
515 unsigned long min_delta = ULONG_MAX;
517 dsi->format = format;
518 bpp = mipi_dsi_pixel_format_to_bpp(dsi->format);
520 DRM_DEV_ERROR(dsi->dev,
521 "failed to get bpp for pixel format %d\n",
526 mpclk = DIV_ROUND_UP(mode->clock, MSEC_PER_SEC);
528 /* take 1 / 0.8, since mbps must big than bandwidth of RGB */
529 tmp = mpclk * (bpp / lanes) * 10 / 8;
533 DRM_DEV_ERROR(dsi->dev,
534 "DPHY clock frequency is out of range\n");
537 /* for external phy only a the mipi_dphy_config is necessary */
539 phy_mipi_dphy_get_default_config(mode->clock * 1000 * 10 / 8,
541 &dsi->phy_opts.mipi_dphy);
542 dsi->lane_mbps = target_mbps;
543 *lane_mbps = dsi->lane_mbps;
548 fin = clk_get_rate(dsi->pllref_clk);
549 fout = target_mbps * USEC_PER_SEC;
551 /* constraint: 5Mhz <= Fref / N <= 40MHz */
552 min_prediv = DIV_ROUND_UP(fin, 40 * USEC_PER_SEC);
553 max_prediv = fin / (5 * USEC_PER_SEC);
555 /* constraint: 80MHz <= Fvco <= 1500Mhz */
556 fvco_min = 80 * USEC_PER_SEC;
557 fvco_max = 1500 * USEC_PER_SEC;
559 for (_prediv = min_prediv; _prediv <= max_prediv; _prediv++) {
562 /* Fvco = Fref * M / N */
563 tmp = (u64)fout * _prediv;
567 * Due to the use of a "by 2 pre-scaler," the range of the
568 * feedback multiplication value M is limited to even division
569 * numbers, and m must be greater than 6, not bigger than 512.
571 if (_fbdiv < 6 || _fbdiv > 512)
574 _fbdiv += _fbdiv % 2;
576 tmp = (u64)_fbdiv * fin;
577 do_div(tmp, _prediv);
578 if (tmp < fvco_min || tmp > fvco_max)
581 delta = abs(fout - tmp);
582 if (delta < min_delta) {
583 best_prediv = _prediv;
591 dsi->lane_mbps = DIV_ROUND_UP(best_freq, USEC_PER_SEC);
592 *lane_mbps = dsi->lane_mbps;
593 dsi->input_div = best_prediv;
594 dsi->feedback_div = best_fbdiv;
596 DRM_DEV_ERROR(dsi->dev, "Can not find best_freq for DPHY\n");
604 unsigned int maxfreq;
605 struct dw_mipi_dsi_dphy_timing timing;
608 #define HSTT(_maxfreq, _c_lp2hs, _c_hs2lp, _d_lp2hs, _d_hs2lp) \
610 .maxfreq = _maxfreq, \
612 .clk_lp2hs = _c_lp2hs, \
613 .clk_hs2lp = _c_hs2lp, \
614 .data_lp2hs = _d_lp2hs, \
615 .data_hs2lp = _d_hs2lp, \
619 /* Table A-3 High-Speed Transition Times */
620 struct hstt hstt_table[] = {
621 HSTT( 90, 32, 20, 26, 13),
622 HSTT( 100, 35, 23, 28, 14),
623 HSTT( 110, 32, 22, 26, 13),
624 HSTT( 130, 31, 20, 27, 13),
625 HSTT( 140, 33, 22, 26, 14),
626 HSTT( 150, 33, 21, 26, 14),
627 HSTT( 170, 32, 20, 27, 13),
628 HSTT( 180, 36, 23, 30, 15),
629 HSTT( 200, 40, 22, 33, 15),
630 HSTT( 220, 40, 22, 33, 15),
631 HSTT( 240, 44, 24, 36, 16),
632 HSTT( 250, 48, 24, 38, 17),
633 HSTT( 270, 48, 24, 38, 17),
634 HSTT( 300, 50, 27, 41, 18),
635 HSTT( 330, 56, 28, 45, 18),
636 HSTT( 360, 59, 28, 48, 19),
637 HSTT( 400, 61, 30, 50, 20),
638 HSTT( 450, 67, 31, 55, 21),
639 HSTT( 500, 73, 31, 59, 22),
640 HSTT( 550, 79, 36, 63, 24),
641 HSTT( 600, 83, 37, 68, 25),
642 HSTT( 650, 90, 38, 73, 27),
643 HSTT( 700, 95, 40, 77, 28),
644 HSTT( 750, 102, 40, 84, 28),
645 HSTT( 800, 106, 42, 87, 30),
646 HSTT( 850, 113, 44, 93, 31),
647 HSTT( 900, 118, 47, 98, 32),
648 HSTT( 950, 124, 47, 102, 34),
649 HSTT(1000, 130, 49, 107, 35),
650 HSTT(1050, 135, 51, 111, 37),
651 HSTT(1100, 139, 51, 114, 38),
652 HSTT(1150, 146, 54, 120, 40),
653 HSTT(1200, 153, 57, 125, 41),
654 HSTT(1250, 158, 58, 130, 42),
655 HSTT(1300, 163, 58, 135, 44),
656 HSTT(1350, 168, 60, 140, 45),
657 HSTT(1400, 172, 64, 144, 47),
658 HSTT(1450, 176, 65, 148, 48),
659 HSTT(1500, 181, 66, 153, 50)
663 dw_mipi_dsi_phy_get_timing(void *priv_data, unsigned int lane_mbps,
664 struct dw_mipi_dsi_dphy_timing *timing)
668 for (i = 0; i < ARRAY_SIZE(hstt_table); i++)
669 if (lane_mbps < hstt_table[i].maxfreq)
672 if (i == ARRAY_SIZE(hstt_table))
675 *timing = hstt_table[i].timing;
680 static const struct dw_mipi_dsi_phy_ops dw_mipi_dsi_rockchip_phy_ops = {
681 .init = dw_mipi_dsi_phy_init,
682 .power_on = dw_mipi_dsi_phy_power_on,
683 .power_off = dw_mipi_dsi_phy_power_off,
684 .get_lane_mbps = dw_mipi_dsi_get_lane_mbps,
685 .get_timing = dw_mipi_dsi_phy_get_timing,
688 static void dw_mipi_dsi_rockchip_config(struct dw_mipi_dsi_rockchip *dsi,
691 if (dsi->cdata->lcdsel_grf_reg)
692 regmap_write(dsi->grf_regmap, dsi->cdata->lcdsel_grf_reg,
693 mux ? dsi->cdata->lcdsel_lit : dsi->cdata->lcdsel_big);
695 if (dsi->cdata->lanecfg1_grf_reg)
696 regmap_write(dsi->grf_regmap, dsi->cdata->lanecfg1_grf_reg,
697 dsi->cdata->lanecfg1);
699 if (dsi->cdata->lanecfg2_grf_reg)
700 regmap_write(dsi->grf_regmap, dsi->cdata->lanecfg2_grf_reg,
701 dsi->cdata->lanecfg2);
703 if (dsi->cdata->enable_grf_reg)
704 regmap_write(dsi->grf_regmap, dsi->cdata->enable_grf_reg,
709 dw_mipi_dsi_encoder_atomic_check(struct drm_encoder *encoder,
710 struct drm_crtc_state *crtc_state,
711 struct drm_connector_state *conn_state)
713 struct rockchip_crtc_state *s = to_rockchip_crtc_state(crtc_state);
714 struct dw_mipi_dsi_rockchip *dsi = to_dsi(encoder);
716 switch (dsi->format) {
717 case MIPI_DSI_FMT_RGB888:
718 s->output_mode = ROCKCHIP_OUT_MODE_P888;
720 case MIPI_DSI_FMT_RGB666:
721 s->output_mode = ROCKCHIP_OUT_MODE_P666;
723 case MIPI_DSI_FMT_RGB565:
724 s->output_mode = ROCKCHIP_OUT_MODE_P565;
731 s->output_type = DRM_MODE_CONNECTOR_DSI;
733 s->output_flags = ROCKCHIP_OUTPUT_DSI_DUAL;
738 static void dw_mipi_dsi_encoder_enable(struct drm_encoder *encoder)
740 struct dw_mipi_dsi_rockchip *dsi = to_dsi(encoder);
743 mux = drm_of_encoder_active_endpoint_id(dsi->dev->of_node,
748 pm_runtime_get_sync(dsi->dev);
750 pm_runtime_get_sync(dsi->slave->dev);
753 * For the RK3399, the clk of grf must be enabled before writing grf
754 * register. And for RK3288 or other soc, this grf_clk must be NULL,
755 * the clk_prepare_enable return true directly.
757 ret = clk_prepare_enable(dsi->grf_clk);
759 DRM_DEV_ERROR(dsi->dev, "Failed to enable grf_clk: %d\n", ret);
763 dw_mipi_dsi_rockchip_config(dsi, mux);
765 dw_mipi_dsi_rockchip_config(dsi->slave, mux);
767 clk_disable_unprepare(dsi->grf_clk);
770 static void dw_mipi_dsi_encoder_disable(struct drm_encoder *encoder)
772 struct dw_mipi_dsi_rockchip *dsi = to_dsi(encoder);
775 pm_runtime_put(dsi->slave->dev);
776 pm_runtime_put(dsi->dev);
779 static const struct drm_encoder_helper_funcs
780 dw_mipi_dsi_encoder_helper_funcs = {
781 .atomic_check = dw_mipi_dsi_encoder_atomic_check,
782 .enable = dw_mipi_dsi_encoder_enable,
783 .disable = dw_mipi_dsi_encoder_disable,
786 static const struct drm_encoder_funcs dw_mipi_dsi_encoder_funcs = {
787 .destroy = drm_encoder_cleanup,
790 static int rockchip_dsi_drm_create_encoder(struct dw_mipi_dsi_rockchip *dsi,
791 struct drm_device *drm_dev)
793 struct drm_encoder *encoder = &dsi->encoder;
796 encoder->possible_crtcs = drm_of_find_possible_crtcs(drm_dev,
799 ret = drm_encoder_init(drm_dev, encoder, &dw_mipi_dsi_encoder_funcs,
800 DRM_MODE_ENCODER_DSI, NULL);
802 DRM_ERROR("Failed to initialize encoder with drm\n");
806 drm_encoder_helper_add(encoder, &dw_mipi_dsi_encoder_helper_funcs);
812 *dw_mipi_dsi_rockchip_find_second(struct dw_mipi_dsi_rockchip *dsi)
814 const struct of_device_id *match;
815 struct device_node *node = NULL, *local;
817 match = of_match_device(dsi->dev->driver->of_match_table, dsi->dev);
819 local = of_graph_get_remote_node(dsi->dev->of_node, 1, 0);
823 while ((node = of_find_compatible_node(node, NULL,
824 match->compatible))) {
825 struct device_node *remote;
828 if (node == dsi->dev->of_node)
831 remote = of_graph_get_remote_node(node, 1, 0);
835 /* same display device in port1-ep0 for both */
836 if (remote == local) {
837 struct dw_mipi_dsi_rockchip *dsi2;
838 struct platform_device *pdev;
840 pdev = of_find_device_by_node(node);
843 * we have found the second, so will either return it
844 * or return with an error. In any case won't need the
845 * nodes anymore nor continue the loop.
852 return ERR_PTR(-EPROBE_DEFER);
854 dsi2 = platform_get_drvdata(pdev);
856 platform_device_put(pdev);
857 return ERR_PTR(-EPROBE_DEFER);
871 static int dw_mipi_dsi_rockchip_bind(struct device *dev,
872 struct device *master,
875 struct dw_mipi_dsi_rockchip *dsi = dev_get_drvdata(dev);
876 struct drm_device *drm_dev = data;
877 struct device *second;
878 bool master1, master2;
881 second = dw_mipi_dsi_rockchip_find_second(dsi);
883 return PTR_ERR(second);
886 master1 = of_property_read_bool(dsi->dev->of_node,
888 master2 = of_property_read_bool(second->of_node,
891 if (master1 && master2) {
892 DRM_DEV_ERROR(dsi->dev, "only one clock-master allowed\n");
896 if (!master1 && !master2) {
897 DRM_DEV_ERROR(dsi->dev, "no clock-master defined\n");
901 /* we are the slave in dual-DSI */
903 dsi->is_slave = true;
907 dsi->slave = dev_get_drvdata(second);
909 DRM_DEV_ERROR(dev, "could not get slaves data\n");
913 dsi->slave->is_slave = true;
914 dw_mipi_dsi_set_slave(dsi->dmd, dsi->slave->dmd);
918 ret = clk_prepare_enable(dsi->pllref_clk);
920 DRM_DEV_ERROR(dev, "Failed to enable pllref_clk: %d\n", ret);
924 ret = rockchip_dsi_drm_create_encoder(dsi, drm_dev);
926 DRM_DEV_ERROR(dev, "Failed to create drm encoder\n");
930 ret = dw_mipi_dsi_bind(dsi->dmd, &dsi->encoder);
932 DRM_DEV_ERROR(dev, "Failed to bind: %d\n", ret);
939 static void dw_mipi_dsi_rockchip_unbind(struct device *dev,
940 struct device *master,
943 struct dw_mipi_dsi_rockchip *dsi = dev_get_drvdata(dev);
948 dw_mipi_dsi_unbind(dsi->dmd);
950 clk_disable_unprepare(dsi->pllref_clk);
953 static const struct component_ops dw_mipi_dsi_rockchip_ops = {
954 .bind = dw_mipi_dsi_rockchip_bind,
955 .unbind = dw_mipi_dsi_rockchip_unbind,
958 static int dw_mipi_dsi_rockchip_host_attach(void *priv_data,
959 struct mipi_dsi_device *device)
961 struct dw_mipi_dsi_rockchip *dsi = priv_data;
962 struct device *second;
965 ret = component_add(dsi->dev, &dw_mipi_dsi_rockchip_ops);
967 DRM_DEV_ERROR(dsi->dev, "Failed to register component: %d\n",
972 second = dw_mipi_dsi_rockchip_find_second(dsi);
974 return PTR_ERR(second);
976 ret = component_add(second, &dw_mipi_dsi_rockchip_ops);
978 DRM_DEV_ERROR(second,
979 "Failed to register component: %d\n",
988 static int dw_mipi_dsi_rockchip_host_detach(void *priv_data,
989 struct mipi_dsi_device *device)
991 struct dw_mipi_dsi_rockchip *dsi = priv_data;
992 struct device *second;
994 second = dw_mipi_dsi_rockchip_find_second(dsi);
995 if (second && !IS_ERR(second))
996 component_del(second, &dw_mipi_dsi_rockchip_ops);
998 component_del(dsi->dev, &dw_mipi_dsi_rockchip_ops);
1003 static const struct dw_mipi_dsi_host_ops dw_mipi_dsi_rockchip_host_ops = {
1004 .attach = dw_mipi_dsi_rockchip_host_attach,
1005 .detach = dw_mipi_dsi_rockchip_host_detach,
1008 static int dw_mipi_dsi_rockchip_probe(struct platform_device *pdev)
1010 struct device *dev = &pdev->dev;
1011 struct device_node *np = dev->of_node;
1012 struct dw_mipi_dsi_rockchip *dsi;
1013 struct resource *res;
1014 const struct rockchip_dw_dsi_chip_data *cdata =
1015 of_device_get_match_data(dev);
1018 dsi = devm_kzalloc(dev, sizeof(*dsi), GFP_KERNEL);
1022 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1023 dsi->base = devm_ioremap_resource(dev, res);
1024 if (IS_ERR(dsi->base)) {
1025 DRM_DEV_ERROR(dev, "Unable to get dsi registers\n");
1026 return PTR_ERR(dsi->base);
1030 while (cdata[i].reg) {
1031 if (cdata[i].reg == res->start) {
1032 dsi->cdata = &cdata[i];
1040 DRM_DEV_ERROR(dev, "no dsi-config for %s node\n", np->name);
1044 /* try to get a possible external dphy */
1045 dsi->phy = devm_phy_optional_get(dev, "dphy");
1046 if (IS_ERR(dsi->phy)) {
1047 ret = PTR_ERR(dsi->phy);
1048 DRM_DEV_ERROR(dev, "failed to get mipi dphy: %d\n", ret);
1052 dsi->pllref_clk = devm_clk_get(dev, "ref");
1053 if (IS_ERR(dsi->pllref_clk)) {
1056 * if external phy is present, pll will be
1059 dsi->pllref_clk = NULL;
1061 ret = PTR_ERR(dsi->pllref_clk);
1063 "Unable to get pll reference clock: %d\n",
1069 if (dsi->cdata->flags & DW_MIPI_NEEDS_PHY_CFG_CLK) {
1070 dsi->phy_cfg_clk = devm_clk_get(dev, "phy_cfg");
1071 if (IS_ERR(dsi->phy_cfg_clk)) {
1072 ret = PTR_ERR(dsi->phy_cfg_clk);
1074 "Unable to get phy_cfg_clk: %d\n", ret);
1079 if (dsi->cdata->flags & DW_MIPI_NEEDS_GRF_CLK) {
1080 dsi->grf_clk = devm_clk_get(dev, "grf");
1081 if (IS_ERR(dsi->grf_clk)) {
1082 ret = PTR_ERR(dsi->grf_clk);
1083 DRM_DEV_ERROR(dev, "Unable to get grf_clk: %d\n", ret);
1088 dsi->grf_regmap = syscon_regmap_lookup_by_phandle(np, "rockchip,grf");
1089 if (IS_ERR(dsi->grf_regmap)) {
1090 DRM_DEV_ERROR(dsi->dev, "Unable to get rockchip,grf\n");
1091 return PTR_ERR(dsi->grf_regmap);
1095 dsi->pdata.base = dsi->base;
1096 dsi->pdata.max_data_lanes = dsi->cdata->max_data_lanes;
1097 dsi->pdata.phy_ops = &dw_mipi_dsi_rockchip_phy_ops;
1098 dsi->pdata.host_ops = &dw_mipi_dsi_rockchip_host_ops;
1099 dsi->pdata.priv_data = dsi;
1100 platform_set_drvdata(pdev, dsi);
1102 dsi->dmd = dw_mipi_dsi_probe(pdev, &dsi->pdata);
1103 if (IS_ERR(dsi->dmd)) {
1104 ret = PTR_ERR(dsi->dmd);
1105 if (ret != -EPROBE_DEFER)
1107 "Failed to probe dw_mipi_dsi: %d\n", ret);
1108 goto err_clkdisable;
1114 clk_disable_unprepare(dsi->pllref_clk);
1118 static int dw_mipi_dsi_rockchip_remove(struct platform_device *pdev)
1120 struct dw_mipi_dsi_rockchip *dsi = platform_get_drvdata(pdev);
1122 if (dsi->devcnt == 0)
1123 component_del(dsi->dev, &dw_mipi_dsi_rockchip_ops);
1125 dw_mipi_dsi_remove(dsi->dmd);
1130 static const struct rockchip_dw_dsi_chip_data rk3288_chip_data[] = {
1133 .lcdsel_grf_reg = RK3288_GRF_SOC_CON6,
1134 .lcdsel_big = HIWORD_UPDATE(0, RK3288_DSI0_LCDC_SEL),
1135 .lcdsel_lit = HIWORD_UPDATE(RK3288_DSI0_LCDC_SEL, RK3288_DSI0_LCDC_SEL),
1137 .max_data_lanes = 4,
1141 .lcdsel_grf_reg = RK3288_GRF_SOC_CON6,
1142 .lcdsel_big = HIWORD_UPDATE(0, RK3288_DSI1_LCDC_SEL),
1143 .lcdsel_lit = HIWORD_UPDATE(RK3288_DSI1_LCDC_SEL, RK3288_DSI1_LCDC_SEL),
1145 .max_data_lanes = 4,
1150 static const struct rockchip_dw_dsi_chip_data rk3399_chip_data[] = {
1153 .lcdsel_grf_reg = RK3399_GRF_SOC_CON20,
1154 .lcdsel_big = HIWORD_UPDATE(0, RK3399_DSI0_LCDC_SEL),
1155 .lcdsel_lit = HIWORD_UPDATE(RK3399_DSI0_LCDC_SEL,
1156 RK3399_DSI0_LCDC_SEL),
1158 .lanecfg1_grf_reg = RK3399_GRF_SOC_CON22,
1159 .lanecfg1 = HIWORD_UPDATE(0, RK3399_DSI0_TURNREQUEST |
1160 RK3399_DSI0_TURNDISABLE |
1161 RK3399_DSI0_FORCETXSTOPMODE |
1162 RK3399_DSI0_FORCERXMODE),
1164 .flags = DW_MIPI_NEEDS_PHY_CFG_CLK | DW_MIPI_NEEDS_GRF_CLK,
1165 .max_data_lanes = 4,
1169 .lcdsel_grf_reg = RK3399_GRF_SOC_CON20,
1170 .lcdsel_big = HIWORD_UPDATE(0, RK3399_DSI1_LCDC_SEL),
1171 .lcdsel_lit = HIWORD_UPDATE(RK3399_DSI1_LCDC_SEL,
1172 RK3399_DSI1_LCDC_SEL),
1174 .lanecfg1_grf_reg = RK3399_GRF_SOC_CON23,
1175 .lanecfg1 = HIWORD_UPDATE(0, RK3399_DSI1_TURNDISABLE |
1176 RK3399_DSI1_FORCETXSTOPMODE |
1177 RK3399_DSI1_FORCERXMODE |
1178 RK3399_DSI1_ENABLE),
1180 .lanecfg2_grf_reg = RK3399_GRF_SOC_CON24,
1181 .lanecfg2 = HIWORD_UPDATE(RK3399_TXRX_MASTERSLAVEZ |
1182 RK3399_TXRX_ENABLECLK,
1183 RK3399_TXRX_MASTERSLAVEZ |
1184 RK3399_TXRX_ENABLECLK |
1185 RK3399_TXRX_BASEDIR),
1187 .enable_grf_reg = RK3399_GRF_SOC_CON23,
1188 .enable = HIWORD_UPDATE(RK3399_DSI1_ENABLE, RK3399_DSI1_ENABLE),
1190 .flags = DW_MIPI_NEEDS_PHY_CFG_CLK | DW_MIPI_NEEDS_GRF_CLK,
1191 .max_data_lanes = 4,
1196 static const struct of_device_id dw_mipi_dsi_rockchip_dt_ids[] = {
1198 .compatible = "rockchip,rk3288-mipi-dsi",
1199 .data = &rk3288_chip_data,
1201 .compatible = "rockchip,rk3399-mipi-dsi",
1202 .data = &rk3399_chip_data,
1206 MODULE_DEVICE_TABLE(of, dw_mipi_dsi_rockchip_dt_ids);
1208 struct platform_driver dw_mipi_dsi_rockchip_driver = {
1209 .probe = dw_mipi_dsi_rockchip_probe,
1210 .remove = dw_mipi_dsi_rockchip_remove,
1212 .of_match_table = dw_mipi_dsi_rockchip_dt_ids,
1213 .name = "dw-mipi-dsi-rockchip",