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>
24 #include <drm/drm_simple_kms_helper.h>
26 #include "rockchip_drm_drv.h"
27 #include "rockchip_drm_vop.h"
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)
35 #define PHY_UNRSTZ BIT(1)
36 #define PHY_SHUTDOWNZ 0
37 #define PHY_UNSHUTDOWNZ BIT(0)
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)
43 #define DSI_PHY_STATUS 0xb0
45 #define STOP_STATE_CLK_LANE BIT(2)
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
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)
59 #define DSI_INT_ST0 0xbc
60 #define DSI_INT_ST1 0xc0
61 #define DSI_INT_MSK0 0xc4
62 #define DSI_INT_MSK1 0xc8
64 #define PHY_STATUS_TIMEOUT_US 10000
65 #define CMD_PKT_STATUS_TIMEOUT_US 20000
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)
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)
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)
90 #define HSFREQRANGE_SEL(val) (((val) & 0x3f) << 1)
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)
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)
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)
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)
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
141 #define DW_MIPI_NEEDS_PHY_CFG_CLK BIT(0)
142 #define DW_MIPI_NEEDS_GRF_CLK BIT(1)
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)
150 #define RK3288_GRF_SOC_CON6 0x025c
151 #define RK3288_DSI0_LCDC_SEL BIT(6)
152 #define RK3288_DSI1_LCDC_SEL BIT(9)
154 #define RK3399_GRF_SOC_CON20 0x6250
155 #define RK3399_DSI0_LCDC_SEL BIT(0)
156 #define RK3399_DSI1_LCDC_SEL BIT(4)
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)
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)
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)
175 #define HIWORD_UPDATE(val, mask) (val | (mask) << 16)
177 #define to_dsi(nm) container_of(nm, struct dw_mipi_dsi_rockchip, nm)
201 struct rockchip_dw_dsi_chip_data {
211 u32 lanecfg1_grf_reg;
213 u32 lanecfg2_grf_reg;
217 unsigned int max_data_lanes;
220 struct dw_mipi_dsi_rockchip {
222 struct drm_encoder encoder;
225 struct regmap *grf_regmap;
226 struct clk *pllref_clk;
228 struct clk *phy_cfg_clk;
232 struct dw_mipi_dsi_rockchip *slave;
234 /* optional external dphy */
236 union phy_configure_opts phy_opts;
238 unsigned int lane_mbps; /* per lane */
243 struct dw_mipi_dsi *dmd;
244 const struct rockchip_dw_dsi_chip_data *cdata;
245 struct dw_mipi_dsi_plat_data pdata;
248 struct dphy_pll_parameter_map {
249 unsigned int max_mbps;
255 /* The table is based on 27MHz DPHY pll reference clock. */
256 static const struct dphy_pll_parameter_map dppa_map[] = {
257 { 89, 0x00, CP_CURRENT_3UA, LPF_RESISTORS_13KOHM },
258 { 99, 0x10, CP_CURRENT_3UA, LPF_RESISTORS_13KOHM },
259 { 109, 0x20, CP_CURRENT_3UA, LPF_RESISTORS_13KOHM },
260 { 129, 0x01, CP_CURRENT_3UA, LPF_RESISTORS_15_5KOHM },
261 { 139, 0x11, CP_CURRENT_3UA, LPF_RESISTORS_15_5KOHM },
262 { 149, 0x21, CP_CURRENT_3UA, LPF_RESISTORS_15_5KOHM },
263 { 169, 0x02, CP_CURRENT_6UA, LPF_RESISTORS_13KOHM },
264 { 179, 0x12, CP_CURRENT_6UA, LPF_RESISTORS_13KOHM },
265 { 199, 0x22, CP_CURRENT_6UA, LPF_RESISTORS_13KOHM },
266 { 219, 0x03, CP_CURRENT_4_5UA, LPF_RESISTORS_13KOHM },
267 { 239, 0x13, CP_CURRENT_4_5UA, LPF_RESISTORS_13KOHM },
268 { 249, 0x23, CP_CURRENT_4_5UA, LPF_RESISTORS_13KOHM },
269 { 269, 0x04, CP_CURRENT_6UA, LPF_RESISTORS_11_5KOHM },
270 { 299, 0x14, CP_CURRENT_6UA, LPF_RESISTORS_11_5KOHM },
271 { 329, 0x05, CP_CURRENT_3UA, LPF_RESISTORS_15_5KOHM },
272 { 359, 0x15, CP_CURRENT_3UA, LPF_RESISTORS_15_5KOHM },
273 { 399, 0x25, CP_CURRENT_3UA, LPF_RESISTORS_15_5KOHM },
274 { 449, 0x06, CP_CURRENT_7_5UA, LPF_RESISTORS_11_5KOHM },
275 { 499, 0x16, CP_CURRENT_7_5UA, LPF_RESISTORS_11_5KOHM },
276 { 549, 0x07, CP_CURRENT_7_5UA, LPF_RESISTORS_10_5KOHM },
277 { 599, 0x17, CP_CURRENT_7_5UA, LPF_RESISTORS_10_5KOHM },
278 { 649, 0x08, CP_CURRENT_7_5UA, LPF_RESISTORS_11_5KOHM },
279 { 699, 0x18, CP_CURRENT_7_5UA, LPF_RESISTORS_11_5KOHM },
280 { 749, 0x09, CP_CURRENT_7_5UA, LPF_RESISTORS_11_5KOHM },
281 { 799, 0x19, CP_CURRENT_7_5UA, LPF_RESISTORS_11_5KOHM },
282 { 849, 0x29, CP_CURRENT_7_5UA, LPF_RESISTORS_11_5KOHM },
283 { 899, 0x39, CP_CURRENT_7_5UA, LPF_RESISTORS_11_5KOHM },
284 { 949, 0x0a, CP_CURRENT_12UA, LPF_RESISTORS_8KOHM },
285 { 999, 0x1a, CP_CURRENT_12UA, LPF_RESISTORS_8KOHM },
286 {1049, 0x2a, CP_CURRENT_12UA, LPF_RESISTORS_8KOHM },
287 {1099, 0x3a, CP_CURRENT_12UA, LPF_RESISTORS_8KOHM },
288 {1149, 0x0b, CP_CURRENT_12UA, LPF_RESISTORS_10_5KOHM },
289 {1199, 0x1b, CP_CURRENT_12UA, LPF_RESISTORS_10_5KOHM },
290 {1249, 0x2b, CP_CURRENT_12UA, LPF_RESISTORS_10_5KOHM },
291 {1299, 0x3b, CP_CURRENT_12UA, LPF_RESISTORS_10_5KOHM },
292 {1349, 0x0c, CP_CURRENT_12UA, LPF_RESISTORS_10_5KOHM },
293 {1399, 0x1c, CP_CURRENT_12UA, LPF_RESISTORS_10_5KOHM },
294 {1449, 0x2c, CP_CURRENT_12UA, LPF_RESISTORS_10_5KOHM },
295 {1500, 0x3c, CP_CURRENT_12UA, LPF_RESISTORS_10_5KOHM }
298 static int max_mbps_to_parameter(unsigned int max_mbps)
302 for (i = 0; i < ARRAY_SIZE(dppa_map); i++)
303 if (dppa_map[i].max_mbps >= max_mbps)
309 static inline void dsi_write(struct dw_mipi_dsi_rockchip *dsi, u32 reg, u32 val)
311 writel(val, dsi->base + reg);
314 static inline u32 dsi_read(struct dw_mipi_dsi_rockchip *dsi, u32 reg)
316 return readl(dsi->base + reg);
319 static inline void dsi_update_bits(struct dw_mipi_dsi_rockchip *dsi, u32 reg,
322 dsi_write(dsi, reg, (dsi_read(dsi, reg) & ~mask) | val);
325 static void dw_mipi_dsi_phy_write(struct dw_mipi_dsi_rockchip *dsi,
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.
334 dsi_write(dsi, DSI_PHY_TST_CTRL0, PHY_TESTCLK | PHY_UNTESTCLR);
336 dsi_write(dsi, DSI_PHY_TST_CTRL1, PHY_TESTEN | PHY_TESTDOUT(0) |
337 PHY_TESTDIN(test_code));
339 dsi_write(dsi, DSI_PHY_TST_CTRL0, PHY_UNTESTCLK | PHY_UNTESTCLR);
341 dsi_write(dsi, DSI_PHY_TST_CTRL1, PHY_UNTESTEN | PHY_TESTDOUT(0) |
342 PHY_TESTDIN(test_data));
344 dsi_write(dsi, DSI_PHY_TST_CTRL0, PHY_TESTCLK | PHY_UNTESTCLR);
348 * ns2bc - Nanoseconds to byte clock cycles
350 static inline unsigned int ns2bc(struct dw_mipi_dsi_rockchip *dsi, int ns)
352 return DIV_ROUND_UP(ns * dsi->lane_mbps / 8, 1000);
356 * ns2ui - Nanoseconds to UI time periods
358 static inline unsigned int ns2ui(struct dw_mipi_dsi_rockchip *dsi, int ns)
360 return DIV_ROUND_UP(ns * dsi->lane_mbps, 1000);
363 static int dw_mipi_dsi_phy_init(void *priv_data)
365 struct dw_mipi_dsi_rockchip *dsi = priv_data;
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
383 vco = (dsi->lane_mbps < 200) ? 0 : (dsi->lane_mbps + 100) / 200;
385 i = max_mbps_to_parameter(dsi->lane_mbps);
387 DRM_DEV_ERROR(dsi->dev,
388 "failed to get parameter for %dmbps clock\n",
393 ret = clk_prepare_enable(dsi->phy_cfg_clk);
395 DRM_DEV_ERROR(dsi->dev, "Failed to enable phy_cfg_clk\n");
399 dw_mipi_dsi_phy_write(dsi, PLL_BIAS_CUR_SEL_CAP_VCO_CONTROL,
401 VCO_RANGE_CON_SEL(vco) |
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));
411 dw_mipi_dsi_phy_write(dsi, HS_RX_CONTROL_OF_LANE_0,
412 HSFREQRANGE_SEL(dppa_map[i].hsfreqrange));
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) |
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.
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) |
430 dw_mipi_dsi_phy_write(dsi, PLL_INPUT_AND_LOOP_DIVIDER_RATIOS_CONTROL,
431 PLL_LOOP_DIV_EN | PLL_INPUT_DIV_EN);
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));
438 dw_mipi_dsi_phy_write(dsi, BANDGAP_AND_BIAS_CONTROL,
439 POWER_CONTROL | INTERNAL_REG_CURRENT |
440 BIAS_BLOCK_ON | BANDGAP_ON);
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 |
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));
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));
474 clk_disable_unprepare(dsi->phy_cfg_clk);
479 static void dw_mipi_dsi_phy_power_on(void *priv_data)
481 struct dw_mipi_dsi_rockchip *dsi = priv_data;
484 ret = phy_set_mode(dsi->phy, PHY_MODE_MIPI_DPHY);
486 DRM_DEV_ERROR(dsi->dev, "failed to set phy mode: %d\n", ret);
490 phy_configure(dsi->phy, &dsi->phy_opts);
491 phy_power_on(dsi->phy);
494 static void dw_mipi_dsi_phy_power_off(void *priv_data)
496 struct dw_mipi_dsi_rockchip *dsi = priv_data;
498 phy_power_off(dsi->phy);
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)
506 struct dw_mipi_dsi_rockchip *dsi = priv_data;
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;
518 dsi->format = format;
519 bpp = mipi_dsi_pixel_format_to_bpp(dsi->format);
521 DRM_DEV_ERROR(dsi->dev,
522 "failed to get bpp for pixel format %d\n",
527 mpclk = DIV_ROUND_UP(mode->clock, MSEC_PER_SEC);
529 /* take 1 / 0.8, since mbps must big than bandwidth of RGB */
530 tmp = mpclk * (bpp / lanes) * 10 / 8;
534 DRM_DEV_ERROR(dsi->dev,
535 "DPHY clock frequency is out of range\n");
538 /* for external phy only a the mipi_dphy_config is necessary */
540 phy_mipi_dphy_get_default_config(mode->clock * 1000 * 10 / 8,
542 &dsi->phy_opts.mipi_dphy);
543 dsi->lane_mbps = target_mbps;
544 *lane_mbps = dsi->lane_mbps;
549 fin = clk_get_rate(dsi->pllref_clk);
550 fout = target_mbps * USEC_PER_SEC;
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);
556 /* constraint: 80MHz <= Fvco <= 1500Mhz */
557 fvco_min = 80 * USEC_PER_SEC;
558 fvco_max = 1500 * USEC_PER_SEC;
560 for (_prediv = min_prediv; _prediv <= max_prediv; _prediv++) {
563 /* Fvco = Fref * M / N */
564 tmp = (u64)fout * _prediv;
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.
572 if (_fbdiv < 6 || _fbdiv > 512)
575 _fbdiv += _fbdiv % 2;
577 tmp = (u64)_fbdiv * fin;
578 do_div(tmp, _prediv);
579 if (tmp < fvco_min || tmp > fvco_max)
582 delta = abs(fout - tmp);
583 if (delta < min_delta) {
584 best_prediv = _prediv;
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;
597 DRM_DEV_ERROR(dsi->dev, "Can not find best_freq for DPHY\n");
605 unsigned int maxfreq;
606 struct dw_mipi_dsi_dphy_timing timing;
609 #define HSTT(_maxfreq, _c_lp2hs, _c_hs2lp, _d_lp2hs, _d_hs2lp) \
611 .maxfreq = _maxfreq, \
613 .clk_lp2hs = _c_lp2hs, \
614 .clk_hs2lp = _c_hs2lp, \
615 .data_lp2hs = _d_lp2hs, \
616 .data_hs2lp = _d_hs2lp, \
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)
664 dw_mipi_dsi_phy_get_timing(void *priv_data, unsigned int lane_mbps,
665 struct dw_mipi_dsi_dphy_timing *timing)
669 for (i = 0; i < ARRAY_SIZE(hstt_table); i++)
670 if (lane_mbps < hstt_table[i].maxfreq)
673 if (i == ARRAY_SIZE(hstt_table))
676 *timing = hstt_table[i].timing;
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,
689 static void dw_mipi_dsi_rockchip_config(struct dw_mipi_dsi_rockchip *dsi)
691 if (dsi->cdata->lanecfg1_grf_reg)
692 regmap_write(dsi->grf_regmap, dsi->cdata->lanecfg1_grf_reg,
693 dsi->cdata->lanecfg1);
695 if (dsi->cdata->lanecfg2_grf_reg)
696 regmap_write(dsi->grf_regmap, dsi->cdata->lanecfg2_grf_reg,
697 dsi->cdata->lanecfg2);
699 if (dsi->cdata->enable_grf_reg)
700 regmap_write(dsi->grf_regmap, dsi->cdata->enable_grf_reg,
704 static void dw_mipi_dsi_rockchip_set_lcdsel(struct dw_mipi_dsi_rockchip *dsi,
707 regmap_write(dsi->grf_regmap, dsi->cdata->lcdsel_grf_reg,
708 mux ? dsi->cdata->lcdsel_lit : dsi->cdata->lcdsel_big);
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)
716 struct rockchip_crtc_state *s = to_rockchip_crtc_state(crtc_state);
717 struct dw_mipi_dsi_rockchip *dsi = to_dsi(encoder);
719 switch (dsi->format) {
720 case MIPI_DSI_FMT_RGB888:
721 s->output_mode = ROCKCHIP_OUT_MODE_P888;
723 case MIPI_DSI_FMT_RGB666:
724 s->output_mode = ROCKCHIP_OUT_MODE_P666;
726 case MIPI_DSI_FMT_RGB565:
727 s->output_mode = ROCKCHIP_OUT_MODE_P565;
734 s->output_type = DRM_MODE_CONNECTOR_DSI;
736 s->output_flags = ROCKCHIP_OUTPUT_DSI_DUAL;
741 static void dw_mipi_dsi_encoder_enable(struct drm_encoder *encoder)
743 struct dw_mipi_dsi_rockchip *dsi = to_dsi(encoder);
746 mux = drm_of_encoder_active_endpoint_id(dsi->dev->of_node,
751 pm_runtime_get_sync(dsi->dev);
753 pm_runtime_get_sync(dsi->slave->dev);
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.
760 ret = clk_prepare_enable(dsi->grf_clk);
762 DRM_DEV_ERROR(dsi->dev, "Failed to enable grf_clk: %d\n", ret);
766 dw_mipi_dsi_rockchip_set_lcdsel(dsi, mux);
768 dw_mipi_dsi_rockchip_set_lcdsel(dsi->slave, mux);
770 clk_disable_unprepare(dsi->grf_clk);
773 static void dw_mipi_dsi_encoder_disable(struct drm_encoder *encoder)
775 struct dw_mipi_dsi_rockchip *dsi = to_dsi(encoder);
778 pm_runtime_put(dsi->slave->dev);
779 pm_runtime_put(dsi->dev);
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,
789 static int rockchip_dsi_drm_create_encoder(struct dw_mipi_dsi_rockchip *dsi,
790 struct drm_device *drm_dev)
792 struct drm_encoder *encoder = &dsi->encoder;
795 encoder->possible_crtcs = drm_of_find_possible_crtcs(drm_dev,
798 ret = drm_simple_encoder_init(drm_dev, encoder, DRM_MODE_ENCODER_DSI);
800 DRM_ERROR("Failed to initialize encoder with drm\n");
804 drm_encoder_helper_add(encoder, &dw_mipi_dsi_encoder_helper_funcs);
810 *dw_mipi_dsi_rockchip_find_second(struct dw_mipi_dsi_rockchip *dsi)
812 const struct of_device_id *match;
813 struct device_node *node = NULL, *local;
815 match = of_match_device(dsi->dev->driver->of_match_table, dsi->dev);
817 local = of_graph_get_remote_node(dsi->dev->of_node, 1, 0);
821 while ((node = of_find_compatible_node(node, NULL,
822 match->compatible))) {
823 struct device_node *remote;
826 if (node == dsi->dev->of_node)
829 remote = of_graph_get_remote_node(node, 1, 0);
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;
838 pdev = of_find_device_by_node(node);
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.
850 return ERR_PTR(-EPROBE_DEFER);
852 dsi2 = platform_get_drvdata(pdev);
854 platform_device_put(pdev);
855 return ERR_PTR(-EPROBE_DEFER);
869 static int dw_mipi_dsi_rockchip_bind(struct device *dev,
870 struct device *master,
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;
879 second = dw_mipi_dsi_rockchip_find_second(dsi);
881 return PTR_ERR(second);
884 master1 = of_property_read_bool(dsi->dev->of_node,
886 master2 = of_property_read_bool(second->of_node,
889 if (master1 && master2) {
890 DRM_DEV_ERROR(dsi->dev, "only one clock-master allowed\n");
894 if (!master1 && !master2) {
895 DRM_DEV_ERROR(dsi->dev, "no clock-master defined\n");
899 /* we are the slave in dual-DSI */
901 dsi->is_slave = true;
905 dsi->slave = dev_get_drvdata(second);
907 DRM_DEV_ERROR(dev, "could not get slaves data\n");
911 dsi->slave->is_slave = true;
912 dw_mipi_dsi_set_slave(dsi->dmd, dsi->slave->dmd);
916 ret = clk_prepare_enable(dsi->pllref_clk);
918 DRM_DEV_ERROR(dev, "Failed to enable pllref_clk: %d\n", ret);
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
928 ret = clk_prepare_enable(dsi->grf_clk);
930 DRM_DEV_ERROR(dsi->dev, "Failed to enable grf_clk: %d\n", ret);
934 dw_mipi_dsi_rockchip_config(dsi);
936 dw_mipi_dsi_rockchip_config(dsi->slave);
938 clk_disable_unprepare(dsi->grf_clk);
940 ret = rockchip_dsi_drm_create_encoder(dsi, drm_dev);
942 DRM_DEV_ERROR(dev, "Failed to create drm encoder\n");
946 ret = dw_mipi_dsi_bind(dsi->dmd, &dsi->encoder);
948 DRM_DEV_ERROR(dev, "Failed to bind: %d\n", ret);
955 static void dw_mipi_dsi_rockchip_unbind(struct device *dev,
956 struct device *master,
959 struct dw_mipi_dsi_rockchip *dsi = dev_get_drvdata(dev);
964 dw_mipi_dsi_unbind(dsi->dmd);
966 clk_disable_unprepare(dsi->pllref_clk);
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,
974 static int dw_mipi_dsi_rockchip_host_attach(void *priv_data,
975 struct mipi_dsi_device *device)
977 struct dw_mipi_dsi_rockchip *dsi = priv_data;
978 struct device *second;
981 ret = component_add(dsi->dev, &dw_mipi_dsi_rockchip_ops);
983 DRM_DEV_ERROR(dsi->dev, "Failed to register component: %d\n",
988 second = dw_mipi_dsi_rockchip_find_second(dsi);
990 return PTR_ERR(second);
992 ret = component_add(second, &dw_mipi_dsi_rockchip_ops);
994 DRM_DEV_ERROR(second,
995 "Failed to register component: %d\n",
1004 static int dw_mipi_dsi_rockchip_host_detach(void *priv_data,
1005 struct mipi_dsi_device *device)
1007 struct dw_mipi_dsi_rockchip *dsi = priv_data;
1008 struct device *second;
1010 second = dw_mipi_dsi_rockchip_find_second(dsi);
1011 if (second && !IS_ERR(second))
1012 component_del(second, &dw_mipi_dsi_rockchip_ops);
1014 component_del(dsi->dev, &dw_mipi_dsi_rockchip_ops);
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,
1024 static int dw_mipi_dsi_rockchip_probe(struct platform_device *pdev)
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);
1034 dsi = devm_kzalloc(dev, sizeof(*dsi), GFP_KERNEL);
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);
1046 while (cdata[i].reg) {
1047 if (cdata[i].reg == res->start) {
1048 dsi->cdata = &cdata[i];
1056 DRM_DEV_ERROR(dev, "no dsi-config for %s node\n", np->name);
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);
1068 dsi->pllref_clk = devm_clk_get(dev, "ref");
1069 if (IS_ERR(dsi->pllref_clk)) {
1072 * if external phy is present, pll will be
1075 dsi->pllref_clk = NULL;
1077 ret = PTR_ERR(dsi->pllref_clk);
1079 "Unable to get pll reference clock: %d\n",
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);
1090 "Unable to get phy_cfg_clk: %d\n", ret);
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);
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);
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);
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)
1123 "Failed to probe dw_mipi_dsi: %d\n", ret);
1124 goto err_clkdisable;
1130 clk_disable_unprepare(dsi->pllref_clk);
1134 static int dw_mipi_dsi_rockchip_remove(struct platform_device *pdev)
1136 struct dw_mipi_dsi_rockchip *dsi = platform_get_drvdata(pdev);
1138 dw_mipi_dsi_remove(dsi->dmd);
1143 static const struct rockchip_dw_dsi_chip_data px30_chip_data[] = {
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,
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),
1156 .max_data_lanes = 4,
1161 static const struct rockchip_dw_dsi_chip_data rk3288_chip_data[] = {
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),
1168 .max_data_lanes = 4,
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),
1176 .max_data_lanes = 4,
1181 static const struct rockchip_dw_dsi_chip_data rk3399_chip_data[] = {
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),
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),
1195 .flags = DW_MIPI_NEEDS_PHY_CFG_CLK | DW_MIPI_NEEDS_GRF_CLK,
1196 .max_data_lanes = 4,
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),
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),
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),
1218 .enable_grf_reg = RK3399_GRF_SOC_CON23,
1219 .enable = HIWORD_UPDATE(RK3399_DSI1_ENABLE, RK3399_DSI1_ENABLE),
1221 .flags = DW_MIPI_NEEDS_PHY_CFG_CLK | DW_MIPI_NEEDS_GRF_CLK,
1222 .max_data_lanes = 4,
1227 static const struct of_device_id dw_mipi_dsi_rockchip_dt_ids[] = {
1229 .compatible = "rockchip,px30-mipi-dsi",
1230 .data = &px30_chip_data,
1232 .compatible = "rockchip,rk3288-mipi-dsi",
1233 .data = &rk3288_chip_data,
1235 .compatible = "rockchip,rk3399-mipi-dsi",
1236 .data = &rk3399_chip_data,
1240 MODULE_DEVICE_TABLE(of, dw_mipi_dsi_rockchip_dt_ids);
1242 struct platform_driver dw_mipi_dsi_rockchip_driver = {
1243 .probe = dw_mipi_dsi_rockchip_probe,
1244 .remove = dw_mipi_dsi_rockchip_remove,
1246 .of_match_table = dw_mipi_dsi_rockchip_dt_ids,
1247 .name = "dw-mipi-dsi-rockchip",