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/phy/phy.h>
18 #include <linux/regmap.h>
20 #include <video/mipi_display.h>
22 #include <drm/bridge/dw_mipi_dsi.h>
23 #include <drm/drm_mipi_dsi.h>
24 #include <drm/drm_of.h>
25 #include <drm/drm_simple_kms_helper.h>
27 #include "rockchip_drm_drv.h"
28 #include "rockchip_drm_vop.h"
30 #define DSI_PHY_RSTZ 0xa0
31 #define PHY_DISFORCEPLL 0
32 #define PHY_ENFORCEPLL BIT(3)
33 #define PHY_DISABLECLK 0
34 #define PHY_ENABLECLK BIT(2)
36 #define PHY_UNRSTZ BIT(1)
37 #define PHY_SHUTDOWNZ 0
38 #define PHY_UNSHUTDOWNZ BIT(0)
40 #define DSI_PHY_IF_CFG 0xa4
41 #define N_LANES(n) ((((n) - 1) & 0x3) << 0)
42 #define PHY_STOP_WAIT_TIME(cycle) (((cycle) & 0xff) << 8)
44 #define DSI_PHY_STATUS 0xb0
46 #define STOP_STATE_CLK_LANE BIT(2)
48 #define DSI_PHY_TST_CTRL0 0xb4
49 #define PHY_TESTCLK BIT(1)
50 #define PHY_UNTESTCLK 0
51 #define PHY_TESTCLR BIT(0)
52 #define PHY_UNTESTCLR 0
54 #define DSI_PHY_TST_CTRL1 0xb8
55 #define PHY_TESTEN BIT(16)
56 #define PHY_UNTESTEN 0
57 #define PHY_TESTDOUT(n) (((n) & 0xff) << 8)
58 #define PHY_TESTDIN(n) (((n) & 0xff) << 0)
60 #define DSI_INT_ST0 0xbc
61 #define DSI_INT_ST1 0xc0
62 #define DSI_INT_MSK0 0xc4
63 #define DSI_INT_MSK1 0xc8
65 #define PHY_STATUS_TIMEOUT_US 10000
66 #define CMD_PKT_STATUS_TIMEOUT_US 20000
68 #define BYPASS_VCO_RANGE BIT(7)
69 #define VCO_RANGE_CON_SEL(val) (((val) & 0x7) << 3)
70 #define VCO_IN_CAP_CON_DEFAULT (0x0 << 1)
71 #define VCO_IN_CAP_CON_LOW (0x1 << 1)
72 #define VCO_IN_CAP_CON_HIGH (0x2 << 1)
73 #define REF_BIAS_CUR_SEL BIT(0)
75 #define CP_CURRENT_3UA 0x1
76 #define CP_CURRENT_4_5UA 0x2
77 #define CP_CURRENT_7_5UA 0x6
78 #define CP_CURRENT_6UA 0x9
79 #define CP_CURRENT_12UA 0xb
80 #define CP_CURRENT_SEL(val) ((val) & 0xf)
81 #define CP_PROGRAM_EN BIT(7)
83 #define LPF_RESISTORS_15_5KOHM 0x1
84 #define LPF_RESISTORS_13KOHM 0x2
85 #define LPF_RESISTORS_11_5KOHM 0x4
86 #define LPF_RESISTORS_10_5KOHM 0x8
87 #define LPF_RESISTORS_8KOHM 0x10
88 #define LPF_PROGRAM_EN BIT(6)
89 #define LPF_RESISTORS_SEL(val) ((val) & 0x3f)
91 #define HSFREQRANGE_SEL(val) (((val) & 0x3f) << 1)
93 #define INPUT_DIVIDER(val) (((val) - 1) & 0x7f)
94 #define LOW_PROGRAM_EN 0
95 #define HIGH_PROGRAM_EN BIT(7)
96 #define LOOP_DIV_LOW_SEL(val) (((val) - 1) & 0x1f)
97 #define LOOP_DIV_HIGH_SEL(val) ((((val) - 1) >> 5) & 0xf)
98 #define PLL_LOOP_DIV_EN BIT(5)
99 #define PLL_INPUT_DIV_EN BIT(4)
101 #define POWER_CONTROL BIT(6)
102 #define INTERNAL_REG_CURRENT BIT(3)
103 #define BIAS_BLOCK_ON BIT(2)
104 #define BANDGAP_ON BIT(0)
106 #define TER_RESISTOR_HIGH BIT(7)
107 #define TER_RESISTOR_LOW 0
108 #define LEVEL_SHIFTERS_ON BIT(6)
109 #define TER_CAL_DONE BIT(5)
110 #define SETRD_MAX (0x7 << 2)
111 #define POWER_MANAGE BIT(1)
112 #define TER_RESISTORS_ON BIT(0)
114 #define BIASEXTR_SEL(val) ((val) & 0x7)
115 #define BANDGAP_SEL(val) ((val) & 0x7)
116 #define TLP_PROGRAM_EN BIT(7)
117 #define THS_PRE_PROGRAM_EN BIT(7)
118 #define THS_ZERO_PROGRAM_EN BIT(6)
120 #define PLL_BIAS_CUR_SEL_CAP_VCO_CONTROL 0x10
121 #define PLL_CP_CONTROL_PLL_LOCK_BYPASS 0x11
122 #define PLL_LPF_AND_CP_CONTROL 0x12
123 #define PLL_INPUT_DIVIDER_RATIO 0x17
124 #define PLL_LOOP_DIVIDER_RATIO 0x18
125 #define PLL_INPUT_AND_LOOP_DIVIDER_RATIOS_CONTROL 0x19
126 #define BANDGAP_AND_BIAS_CONTROL 0x20
127 #define TERMINATION_RESISTER_CONTROL 0x21
128 #define AFE_BIAS_BANDGAP_ANALOG_PROGRAMMABILITY 0x22
129 #define HS_RX_CONTROL_OF_LANE_CLK 0x34
130 #define HS_RX_CONTROL_OF_LANE_0 0x44
131 #define HS_RX_CONTROL_OF_LANE_1 0x54
132 #define HS_TX_CLOCK_LANE_REQUEST_STATE_TIME_CONTROL 0x60
133 #define HS_TX_CLOCK_LANE_PREPARE_STATE_TIME_CONTROL 0x61
134 #define HS_TX_CLOCK_LANE_HS_ZERO_STATE_TIME_CONTROL 0x62
135 #define HS_TX_CLOCK_LANE_TRAIL_STATE_TIME_CONTROL 0x63
136 #define HS_TX_CLOCK_LANE_EXIT_STATE_TIME_CONTROL 0x64
137 #define HS_TX_CLOCK_LANE_POST_TIME_CONTROL 0x65
138 #define HS_TX_DATA_LANE_REQUEST_STATE_TIME_CONTROL 0x70
139 #define HS_TX_DATA_LANE_PREPARE_STATE_TIME_CONTROL 0x71
140 #define HS_TX_DATA_LANE_HS_ZERO_STATE_TIME_CONTROL 0x72
141 #define HS_TX_DATA_LANE_TRAIL_STATE_TIME_CONTROL 0x73
142 #define HS_TX_DATA_LANE_EXIT_STATE_TIME_CONTROL 0x74
143 #define HS_RX_DATA_LANE_THS_SETTLE_CONTROL 0x75
144 #define HS_RX_CONTROL_OF_LANE_2 0x84
145 #define HS_RX_CONTROL_OF_LANE_3 0x94
147 #define DW_MIPI_NEEDS_PHY_CFG_CLK BIT(0)
148 #define DW_MIPI_NEEDS_GRF_CLK BIT(1)
150 #define PX30_GRF_PD_VO_CON1 0x0438
151 #define PX30_DSI_FORCETXSTOPMODE (0xf << 7)
152 #define PX30_DSI_FORCERXMODE BIT(6)
153 #define PX30_DSI_TURNDISABLE BIT(5)
154 #define PX30_DSI_LCDC_SEL BIT(0)
156 #define RK3288_GRF_SOC_CON6 0x025c
157 #define RK3288_DSI0_LCDC_SEL BIT(6)
158 #define RK3288_DSI1_LCDC_SEL BIT(9)
160 #define RK3399_GRF_SOC_CON20 0x6250
161 #define RK3399_DSI0_LCDC_SEL BIT(0)
162 #define RK3399_DSI1_LCDC_SEL BIT(4)
164 #define RK3399_GRF_SOC_CON22 0x6258
165 #define RK3399_DSI0_TURNREQUEST (0xf << 12)
166 #define RK3399_DSI0_TURNDISABLE (0xf << 8)
167 #define RK3399_DSI0_FORCETXSTOPMODE (0xf << 4)
168 #define RK3399_DSI0_FORCERXMODE (0xf << 0)
170 #define RK3399_GRF_SOC_CON23 0x625c
171 #define RK3399_DSI1_TURNDISABLE (0xf << 12)
172 #define RK3399_DSI1_FORCETXSTOPMODE (0xf << 8)
173 #define RK3399_DSI1_FORCERXMODE (0xf << 4)
174 #define RK3399_DSI1_ENABLE (0xf << 0)
176 #define RK3399_GRF_SOC_CON24 0x6260
177 #define RK3399_TXRX_MASTERSLAVEZ BIT(7)
178 #define RK3399_TXRX_ENABLECLK BIT(6)
179 #define RK3399_TXRX_BASEDIR BIT(5)
180 #define RK3399_TXRX_SRC_SEL_ISP0 BIT(4)
181 #define RK3399_TXRX_TURNREQUEST GENMASK(3, 0)
183 #define HIWORD_UPDATE(val, mask) (val | (mask) << 16)
185 #define to_dsi(nm) container_of(nm, struct dw_mipi_dsi_rockchip, nm)
215 struct rockchip_dw_dsi_chip_data {
225 u32 lanecfg1_grf_reg;
227 u32 lanecfg2_grf_reg;
230 int (*dphy_rx_init)(struct phy *phy);
231 int (*dphy_rx_power_on)(struct phy *phy);
232 int (*dphy_rx_power_off)(struct phy *phy);
235 unsigned int max_data_lanes;
238 struct dw_mipi_dsi_rockchip {
240 struct drm_encoder encoder;
243 struct regmap *grf_regmap;
245 struct clk *pllref_clk;
247 struct clk *phy_cfg_clk;
251 struct dw_mipi_dsi_rockchip *slave;
253 /* optional external dphy */
255 union phy_configure_opts phy_opts;
257 /* being a phy for other mipi hosts */
258 unsigned int usage_mode;
259 struct mutex usage_mutex;
261 struct phy_configure_opts_mipi_dphy dphy_config;
263 unsigned int lane_mbps; /* per lane */
268 struct dw_mipi_dsi *dmd;
269 const struct rockchip_dw_dsi_chip_data *cdata;
270 struct dw_mipi_dsi_plat_data pdata;
273 struct dphy_pll_parameter_map {
274 unsigned int max_mbps;
280 /* The table is based on 27MHz DPHY pll reference clock. */
281 static const struct dphy_pll_parameter_map dppa_map[] = {
282 { 89, 0x00, CP_CURRENT_3UA, LPF_RESISTORS_13KOHM },
283 { 99, 0x10, CP_CURRENT_3UA, LPF_RESISTORS_13KOHM },
284 { 109, 0x20, CP_CURRENT_3UA, LPF_RESISTORS_13KOHM },
285 { 129, 0x01, CP_CURRENT_3UA, LPF_RESISTORS_15_5KOHM },
286 { 139, 0x11, CP_CURRENT_3UA, LPF_RESISTORS_15_5KOHM },
287 { 149, 0x21, CP_CURRENT_3UA, LPF_RESISTORS_15_5KOHM },
288 { 169, 0x02, CP_CURRENT_6UA, LPF_RESISTORS_13KOHM },
289 { 179, 0x12, CP_CURRENT_6UA, LPF_RESISTORS_13KOHM },
290 { 199, 0x22, CP_CURRENT_6UA, LPF_RESISTORS_13KOHM },
291 { 219, 0x03, CP_CURRENT_4_5UA, LPF_RESISTORS_13KOHM },
292 { 239, 0x13, CP_CURRENT_4_5UA, LPF_RESISTORS_13KOHM },
293 { 249, 0x23, CP_CURRENT_4_5UA, LPF_RESISTORS_13KOHM },
294 { 269, 0x04, CP_CURRENT_6UA, LPF_RESISTORS_11_5KOHM },
295 { 299, 0x14, CP_CURRENT_6UA, LPF_RESISTORS_11_5KOHM },
296 { 329, 0x05, CP_CURRENT_3UA, LPF_RESISTORS_15_5KOHM },
297 { 359, 0x15, CP_CURRENT_3UA, LPF_RESISTORS_15_5KOHM },
298 { 399, 0x25, CP_CURRENT_3UA, LPF_RESISTORS_15_5KOHM },
299 { 449, 0x06, CP_CURRENT_7_5UA, LPF_RESISTORS_11_5KOHM },
300 { 499, 0x16, CP_CURRENT_7_5UA, LPF_RESISTORS_11_5KOHM },
301 { 549, 0x07, CP_CURRENT_7_5UA, LPF_RESISTORS_10_5KOHM },
302 { 599, 0x17, CP_CURRENT_7_5UA, LPF_RESISTORS_10_5KOHM },
303 { 649, 0x08, CP_CURRENT_7_5UA, LPF_RESISTORS_11_5KOHM },
304 { 699, 0x18, CP_CURRENT_7_5UA, LPF_RESISTORS_11_5KOHM },
305 { 749, 0x09, CP_CURRENT_7_5UA, LPF_RESISTORS_11_5KOHM },
306 { 799, 0x19, CP_CURRENT_7_5UA, LPF_RESISTORS_11_5KOHM },
307 { 849, 0x29, CP_CURRENT_7_5UA, LPF_RESISTORS_11_5KOHM },
308 { 899, 0x39, CP_CURRENT_7_5UA, LPF_RESISTORS_11_5KOHM },
309 { 949, 0x0a, CP_CURRENT_12UA, LPF_RESISTORS_8KOHM },
310 { 999, 0x1a, CP_CURRENT_12UA, LPF_RESISTORS_8KOHM },
311 {1049, 0x2a, CP_CURRENT_12UA, LPF_RESISTORS_8KOHM },
312 {1099, 0x3a, CP_CURRENT_12UA, LPF_RESISTORS_8KOHM },
313 {1149, 0x0b, CP_CURRENT_12UA, LPF_RESISTORS_10_5KOHM },
314 {1199, 0x1b, CP_CURRENT_12UA, LPF_RESISTORS_10_5KOHM },
315 {1249, 0x2b, CP_CURRENT_12UA, LPF_RESISTORS_10_5KOHM },
316 {1299, 0x3b, CP_CURRENT_12UA, LPF_RESISTORS_10_5KOHM },
317 {1349, 0x0c, CP_CURRENT_12UA, LPF_RESISTORS_10_5KOHM },
318 {1399, 0x1c, CP_CURRENT_12UA, LPF_RESISTORS_10_5KOHM },
319 {1449, 0x2c, CP_CURRENT_12UA, LPF_RESISTORS_10_5KOHM },
320 {1500, 0x3c, CP_CURRENT_12UA, LPF_RESISTORS_10_5KOHM }
323 static int max_mbps_to_parameter(unsigned int max_mbps)
327 for (i = 0; i < ARRAY_SIZE(dppa_map); i++)
328 if (dppa_map[i].max_mbps >= max_mbps)
334 static inline void dsi_write(struct dw_mipi_dsi_rockchip *dsi, u32 reg, u32 val)
336 writel(val, dsi->base + reg);
339 static inline u32 dsi_read(struct dw_mipi_dsi_rockchip *dsi, u32 reg)
341 return readl(dsi->base + reg);
344 static inline void dsi_update_bits(struct dw_mipi_dsi_rockchip *dsi, u32 reg,
347 dsi_write(dsi, reg, (dsi_read(dsi, reg) & ~mask) | val);
350 static void dw_mipi_dsi_phy_write(struct dw_mipi_dsi_rockchip *dsi,
355 * With the falling edge on TESTCLK, the TESTDIN[7:0] signal content
356 * is latched internally as the current test code. Test data is
357 * programmed internally by rising edge on TESTCLK.
359 dsi_write(dsi, DSI_PHY_TST_CTRL0, PHY_TESTCLK | PHY_UNTESTCLR);
361 dsi_write(dsi, DSI_PHY_TST_CTRL1, PHY_TESTEN | PHY_TESTDOUT(0) |
362 PHY_TESTDIN(test_code));
364 dsi_write(dsi, DSI_PHY_TST_CTRL0, PHY_UNTESTCLK | PHY_UNTESTCLR);
366 dsi_write(dsi, DSI_PHY_TST_CTRL1, PHY_UNTESTEN | PHY_TESTDOUT(0) |
367 PHY_TESTDIN(test_data));
369 dsi_write(dsi, DSI_PHY_TST_CTRL0, PHY_TESTCLK | PHY_UNTESTCLR);
373 * ns2bc - Nanoseconds to byte clock cycles
375 static inline unsigned int ns2bc(struct dw_mipi_dsi_rockchip *dsi, int ns)
377 return DIV_ROUND_UP(ns * dsi->lane_mbps / 8, 1000);
381 * ns2ui - Nanoseconds to UI time periods
383 static inline unsigned int ns2ui(struct dw_mipi_dsi_rockchip *dsi, int ns)
385 return DIV_ROUND_UP(ns * dsi->lane_mbps, 1000);
388 static int dw_mipi_dsi_phy_init(void *priv_data)
390 struct dw_mipi_dsi_rockchip *dsi = priv_data;
397 * Get vco from frequency(lane_mbps)
398 * vco frequency table
399 * 000 - between 80 and 200 MHz
400 * 001 - between 200 and 300 MHz
401 * 010 - between 300 and 500 MHz
402 * 011 - between 500 and 700 MHz
403 * 100 - between 700 and 900 MHz
404 * 101 - between 900 and 1100 MHz
405 * 110 - between 1100 and 1300 MHz
406 * 111 - between 1300 and 1500 MHz
408 vco = (dsi->lane_mbps < 200) ? 0 : (dsi->lane_mbps + 100) / 200;
410 i = max_mbps_to_parameter(dsi->lane_mbps);
412 DRM_DEV_ERROR(dsi->dev,
413 "failed to get parameter for %dmbps clock\n",
418 ret = clk_prepare_enable(dsi->phy_cfg_clk);
420 DRM_DEV_ERROR(dsi->dev, "Failed to enable phy_cfg_clk\n");
424 dw_mipi_dsi_phy_write(dsi, PLL_BIAS_CUR_SEL_CAP_VCO_CONTROL,
426 VCO_RANGE_CON_SEL(vco) |
430 dw_mipi_dsi_phy_write(dsi, PLL_CP_CONTROL_PLL_LOCK_BYPASS,
431 CP_CURRENT_SEL(dppa_map[i].icpctrl));
432 dw_mipi_dsi_phy_write(dsi, PLL_LPF_AND_CP_CONTROL,
433 CP_PROGRAM_EN | LPF_PROGRAM_EN |
434 LPF_RESISTORS_SEL(dppa_map[i].lpfctrl));
436 dw_mipi_dsi_phy_write(dsi, HS_RX_CONTROL_OF_LANE_0,
437 HSFREQRANGE_SEL(dppa_map[i].hsfreqrange));
439 dw_mipi_dsi_phy_write(dsi, PLL_INPUT_DIVIDER_RATIO,
440 INPUT_DIVIDER(dsi->input_div));
441 dw_mipi_dsi_phy_write(dsi, PLL_LOOP_DIVIDER_RATIO,
442 LOOP_DIV_LOW_SEL(dsi->feedback_div) |
445 * We need set PLL_INPUT_AND_LOOP_DIVIDER_RATIOS_CONTROL immediately
446 * to make the configured LSB effective according to IP simulation
447 * and lab test results.
448 * Only in this way can we get correct mipi phy pll frequency.
450 dw_mipi_dsi_phy_write(dsi, PLL_INPUT_AND_LOOP_DIVIDER_RATIOS_CONTROL,
451 PLL_LOOP_DIV_EN | PLL_INPUT_DIV_EN);
452 dw_mipi_dsi_phy_write(dsi, PLL_LOOP_DIVIDER_RATIO,
453 LOOP_DIV_HIGH_SEL(dsi->feedback_div) |
455 dw_mipi_dsi_phy_write(dsi, PLL_INPUT_AND_LOOP_DIVIDER_RATIOS_CONTROL,
456 PLL_LOOP_DIV_EN | PLL_INPUT_DIV_EN);
458 dw_mipi_dsi_phy_write(dsi, AFE_BIAS_BANDGAP_ANALOG_PROGRAMMABILITY,
459 LOW_PROGRAM_EN | BIASEXTR_SEL(BIASEXTR_127_7));
460 dw_mipi_dsi_phy_write(dsi, AFE_BIAS_BANDGAP_ANALOG_PROGRAMMABILITY,
461 HIGH_PROGRAM_EN | BANDGAP_SEL(BANDGAP_96_10));
463 dw_mipi_dsi_phy_write(dsi, BANDGAP_AND_BIAS_CONTROL,
464 POWER_CONTROL | INTERNAL_REG_CURRENT |
465 BIAS_BLOCK_ON | BANDGAP_ON);
467 dw_mipi_dsi_phy_write(dsi, TERMINATION_RESISTER_CONTROL,
468 TER_RESISTOR_LOW | TER_CAL_DONE |
469 SETRD_MAX | TER_RESISTORS_ON);
470 dw_mipi_dsi_phy_write(dsi, TERMINATION_RESISTER_CONTROL,
471 TER_RESISTOR_HIGH | LEVEL_SHIFTERS_ON |
472 SETRD_MAX | POWER_MANAGE |
475 dw_mipi_dsi_phy_write(dsi, HS_TX_CLOCK_LANE_REQUEST_STATE_TIME_CONTROL,
476 TLP_PROGRAM_EN | ns2bc(dsi, 500));
477 dw_mipi_dsi_phy_write(dsi, HS_TX_CLOCK_LANE_PREPARE_STATE_TIME_CONTROL,
478 THS_PRE_PROGRAM_EN | ns2ui(dsi, 40));
479 dw_mipi_dsi_phy_write(dsi, HS_TX_CLOCK_LANE_HS_ZERO_STATE_TIME_CONTROL,
480 THS_ZERO_PROGRAM_EN | ns2bc(dsi, 300));
481 dw_mipi_dsi_phy_write(dsi, HS_TX_CLOCK_LANE_TRAIL_STATE_TIME_CONTROL,
482 THS_PRE_PROGRAM_EN | ns2ui(dsi, 100));
483 dw_mipi_dsi_phy_write(dsi, HS_TX_CLOCK_LANE_EXIT_STATE_TIME_CONTROL,
484 BIT(5) | ns2bc(dsi, 100));
485 dw_mipi_dsi_phy_write(dsi, HS_TX_CLOCK_LANE_POST_TIME_CONTROL,
486 BIT(5) | (ns2bc(dsi, 60) + 7));
488 dw_mipi_dsi_phy_write(dsi, HS_TX_DATA_LANE_REQUEST_STATE_TIME_CONTROL,
489 TLP_PROGRAM_EN | ns2bc(dsi, 500));
490 dw_mipi_dsi_phy_write(dsi, HS_TX_DATA_LANE_PREPARE_STATE_TIME_CONTROL,
491 THS_PRE_PROGRAM_EN | (ns2ui(dsi, 50) + 20));
492 dw_mipi_dsi_phy_write(dsi, HS_TX_DATA_LANE_HS_ZERO_STATE_TIME_CONTROL,
493 THS_ZERO_PROGRAM_EN | (ns2bc(dsi, 140) + 2));
494 dw_mipi_dsi_phy_write(dsi, HS_TX_DATA_LANE_TRAIL_STATE_TIME_CONTROL,
495 THS_PRE_PROGRAM_EN | (ns2ui(dsi, 60) + 8));
496 dw_mipi_dsi_phy_write(dsi, HS_TX_DATA_LANE_EXIT_STATE_TIME_CONTROL,
497 BIT(5) | ns2bc(dsi, 100));
499 clk_disable_unprepare(dsi->phy_cfg_clk);
504 static void dw_mipi_dsi_phy_power_on(void *priv_data)
506 struct dw_mipi_dsi_rockchip *dsi = priv_data;
509 ret = phy_set_mode(dsi->phy, PHY_MODE_MIPI_DPHY);
511 DRM_DEV_ERROR(dsi->dev, "failed to set phy mode: %d\n", ret);
515 phy_configure(dsi->phy, &dsi->phy_opts);
516 phy_power_on(dsi->phy);
519 static void dw_mipi_dsi_phy_power_off(void *priv_data)
521 struct dw_mipi_dsi_rockchip *dsi = priv_data;
523 phy_power_off(dsi->phy);
527 dw_mipi_dsi_get_lane_mbps(void *priv_data, const struct drm_display_mode *mode,
528 unsigned long mode_flags, u32 lanes, u32 format,
529 unsigned int *lane_mbps)
531 struct dw_mipi_dsi_rockchip *dsi = priv_data;
533 unsigned long mpclk, tmp;
534 unsigned int target_mbps = 1000;
535 unsigned int max_mbps = dppa_map[ARRAY_SIZE(dppa_map) - 1].max_mbps;
536 unsigned long best_freq = 0;
537 unsigned long fvco_min, fvco_max, fin, fout;
538 unsigned int min_prediv, max_prediv;
539 unsigned int _prediv, best_prediv;
540 unsigned long _fbdiv, best_fbdiv;
541 unsigned long min_delta = ULONG_MAX;
543 dsi->format = format;
544 bpp = mipi_dsi_pixel_format_to_bpp(dsi->format);
546 DRM_DEV_ERROR(dsi->dev,
547 "failed to get bpp for pixel format %d\n",
552 mpclk = DIV_ROUND_UP(mode->clock, MSEC_PER_SEC);
554 /* take 1 / 0.8, since mbps must big than bandwidth of RGB */
555 tmp = mpclk * (bpp / lanes) * 10 / 8;
559 DRM_DEV_ERROR(dsi->dev,
560 "DPHY clock frequency is out of range\n");
563 /* for external phy only a the mipi_dphy_config is necessary */
565 phy_mipi_dphy_get_default_config(mode->clock * 1000 * 10 / 8,
567 &dsi->phy_opts.mipi_dphy);
568 dsi->lane_mbps = target_mbps;
569 *lane_mbps = dsi->lane_mbps;
574 fin = clk_get_rate(dsi->pllref_clk);
575 fout = target_mbps * USEC_PER_SEC;
577 /* constraint: 5Mhz <= Fref / N <= 40MHz */
578 min_prediv = DIV_ROUND_UP(fin, 40 * USEC_PER_SEC);
579 max_prediv = fin / (5 * USEC_PER_SEC);
581 /* constraint: 80MHz <= Fvco <= 1500Mhz */
582 fvco_min = 80 * USEC_PER_SEC;
583 fvco_max = 1500 * USEC_PER_SEC;
585 for (_prediv = min_prediv; _prediv <= max_prediv; _prediv++) {
588 /* Fvco = Fref * M / N */
589 tmp = (u64)fout * _prediv;
593 * Due to the use of a "by 2 pre-scaler," the range of the
594 * feedback multiplication value M is limited to even division
595 * numbers, and m must be greater than 6, not bigger than 512.
597 if (_fbdiv < 6 || _fbdiv > 512)
600 _fbdiv += _fbdiv % 2;
602 tmp = (u64)_fbdiv * fin;
603 do_div(tmp, _prediv);
604 if (tmp < fvco_min || tmp > fvco_max)
607 delta = abs(fout - tmp);
608 if (delta < min_delta) {
609 best_prediv = _prediv;
617 dsi->lane_mbps = DIV_ROUND_UP(best_freq, USEC_PER_SEC);
618 *lane_mbps = dsi->lane_mbps;
619 dsi->input_div = best_prediv;
620 dsi->feedback_div = best_fbdiv;
622 DRM_DEV_ERROR(dsi->dev, "Can not find best_freq for DPHY\n");
630 unsigned int maxfreq;
631 struct dw_mipi_dsi_dphy_timing timing;
634 #define HSTT(_maxfreq, _c_lp2hs, _c_hs2lp, _d_lp2hs, _d_hs2lp) \
636 .maxfreq = _maxfreq, \
638 .clk_lp2hs = _c_lp2hs, \
639 .clk_hs2lp = _c_hs2lp, \
640 .data_lp2hs = _d_lp2hs, \
641 .data_hs2lp = _d_hs2lp, \
645 /* Table A-3 High-Speed Transition Times */
646 struct hstt hstt_table[] = {
647 HSTT( 90, 32, 20, 26, 13),
648 HSTT( 100, 35, 23, 28, 14),
649 HSTT( 110, 32, 22, 26, 13),
650 HSTT( 130, 31, 20, 27, 13),
651 HSTT( 140, 33, 22, 26, 14),
652 HSTT( 150, 33, 21, 26, 14),
653 HSTT( 170, 32, 20, 27, 13),
654 HSTT( 180, 36, 23, 30, 15),
655 HSTT( 200, 40, 22, 33, 15),
656 HSTT( 220, 40, 22, 33, 15),
657 HSTT( 240, 44, 24, 36, 16),
658 HSTT( 250, 48, 24, 38, 17),
659 HSTT( 270, 48, 24, 38, 17),
660 HSTT( 300, 50, 27, 41, 18),
661 HSTT( 330, 56, 28, 45, 18),
662 HSTT( 360, 59, 28, 48, 19),
663 HSTT( 400, 61, 30, 50, 20),
664 HSTT( 450, 67, 31, 55, 21),
665 HSTT( 500, 73, 31, 59, 22),
666 HSTT( 550, 79, 36, 63, 24),
667 HSTT( 600, 83, 37, 68, 25),
668 HSTT( 650, 90, 38, 73, 27),
669 HSTT( 700, 95, 40, 77, 28),
670 HSTT( 750, 102, 40, 84, 28),
671 HSTT( 800, 106, 42, 87, 30),
672 HSTT( 850, 113, 44, 93, 31),
673 HSTT( 900, 118, 47, 98, 32),
674 HSTT( 950, 124, 47, 102, 34),
675 HSTT(1000, 130, 49, 107, 35),
676 HSTT(1050, 135, 51, 111, 37),
677 HSTT(1100, 139, 51, 114, 38),
678 HSTT(1150, 146, 54, 120, 40),
679 HSTT(1200, 153, 57, 125, 41),
680 HSTT(1250, 158, 58, 130, 42),
681 HSTT(1300, 163, 58, 135, 44),
682 HSTT(1350, 168, 60, 140, 45),
683 HSTT(1400, 172, 64, 144, 47),
684 HSTT(1450, 176, 65, 148, 48),
685 HSTT(1500, 181, 66, 153, 50)
689 dw_mipi_dsi_phy_get_timing(void *priv_data, unsigned int lane_mbps,
690 struct dw_mipi_dsi_dphy_timing *timing)
694 for (i = 0; i < ARRAY_SIZE(hstt_table); i++)
695 if (lane_mbps < hstt_table[i].maxfreq)
698 if (i == ARRAY_SIZE(hstt_table))
701 *timing = hstt_table[i].timing;
706 static const struct dw_mipi_dsi_phy_ops dw_mipi_dsi_rockchip_phy_ops = {
707 .init = dw_mipi_dsi_phy_init,
708 .power_on = dw_mipi_dsi_phy_power_on,
709 .power_off = dw_mipi_dsi_phy_power_off,
710 .get_lane_mbps = dw_mipi_dsi_get_lane_mbps,
711 .get_timing = dw_mipi_dsi_phy_get_timing,
714 static void dw_mipi_dsi_rockchip_config(struct dw_mipi_dsi_rockchip *dsi)
716 if (dsi->cdata->lanecfg1_grf_reg)
717 regmap_write(dsi->grf_regmap, dsi->cdata->lanecfg1_grf_reg,
718 dsi->cdata->lanecfg1);
720 if (dsi->cdata->lanecfg2_grf_reg)
721 regmap_write(dsi->grf_regmap, dsi->cdata->lanecfg2_grf_reg,
722 dsi->cdata->lanecfg2);
724 if (dsi->cdata->enable_grf_reg)
725 regmap_write(dsi->grf_regmap, dsi->cdata->enable_grf_reg,
729 static void dw_mipi_dsi_rockchip_set_lcdsel(struct dw_mipi_dsi_rockchip *dsi,
732 regmap_write(dsi->grf_regmap, dsi->cdata->lcdsel_grf_reg,
733 mux ? dsi->cdata->lcdsel_lit : dsi->cdata->lcdsel_big);
737 dw_mipi_dsi_encoder_atomic_check(struct drm_encoder *encoder,
738 struct drm_crtc_state *crtc_state,
739 struct drm_connector_state *conn_state)
741 struct rockchip_crtc_state *s = to_rockchip_crtc_state(crtc_state);
742 struct dw_mipi_dsi_rockchip *dsi = to_dsi(encoder);
744 switch (dsi->format) {
745 case MIPI_DSI_FMT_RGB888:
746 s->output_mode = ROCKCHIP_OUT_MODE_P888;
748 case MIPI_DSI_FMT_RGB666:
749 s->output_mode = ROCKCHIP_OUT_MODE_P666;
751 case MIPI_DSI_FMT_RGB565:
752 s->output_mode = ROCKCHIP_OUT_MODE_P565;
759 s->output_type = DRM_MODE_CONNECTOR_DSI;
761 s->output_flags = ROCKCHIP_OUTPUT_DSI_DUAL;
766 static void dw_mipi_dsi_encoder_enable(struct drm_encoder *encoder)
768 struct dw_mipi_dsi_rockchip *dsi = to_dsi(encoder);
771 mux = drm_of_encoder_active_endpoint_id(dsi->dev->of_node,
776 pm_runtime_get_sync(dsi->dev);
778 pm_runtime_get_sync(dsi->slave->dev);
781 * For the RK3399, the clk of grf must be enabled before writing grf
782 * register. And for RK3288 or other soc, this grf_clk must be NULL,
783 * the clk_prepare_enable return true directly.
785 ret = clk_prepare_enable(dsi->grf_clk);
787 DRM_DEV_ERROR(dsi->dev, "Failed to enable grf_clk: %d\n", ret);
791 dw_mipi_dsi_rockchip_set_lcdsel(dsi, mux);
793 dw_mipi_dsi_rockchip_set_lcdsel(dsi->slave, mux);
795 clk_disable_unprepare(dsi->grf_clk);
798 static void dw_mipi_dsi_encoder_disable(struct drm_encoder *encoder)
800 struct dw_mipi_dsi_rockchip *dsi = to_dsi(encoder);
803 pm_runtime_put(dsi->slave->dev);
804 pm_runtime_put(dsi->dev);
807 static const struct drm_encoder_helper_funcs
808 dw_mipi_dsi_encoder_helper_funcs = {
809 .atomic_check = dw_mipi_dsi_encoder_atomic_check,
810 .enable = dw_mipi_dsi_encoder_enable,
811 .disable = dw_mipi_dsi_encoder_disable,
814 static int rockchip_dsi_drm_create_encoder(struct dw_mipi_dsi_rockchip *dsi,
815 struct drm_device *drm_dev)
817 struct drm_encoder *encoder = &dsi->encoder;
820 encoder->possible_crtcs = drm_of_find_possible_crtcs(drm_dev,
823 ret = drm_simple_encoder_init(drm_dev, encoder, DRM_MODE_ENCODER_DSI);
825 DRM_ERROR("Failed to initialize encoder with drm\n");
829 drm_encoder_helper_add(encoder, &dw_mipi_dsi_encoder_helper_funcs);
835 *dw_mipi_dsi_rockchip_find_second(struct dw_mipi_dsi_rockchip *dsi)
837 const struct of_device_id *match;
838 struct device_node *node = NULL, *local;
840 match = of_match_device(dsi->dev->driver->of_match_table, dsi->dev);
842 local = of_graph_get_remote_node(dsi->dev->of_node, 1, 0);
846 while ((node = of_find_compatible_node(node, NULL,
847 match->compatible))) {
848 struct device_node *remote;
851 if (node == dsi->dev->of_node)
854 remote = of_graph_get_remote_node(node, 1, 0);
858 /* same display device in port1-ep0 for both */
859 if (remote == local) {
860 struct dw_mipi_dsi_rockchip *dsi2;
861 struct platform_device *pdev;
863 pdev = of_find_device_by_node(node);
866 * we have found the second, so will either return it
867 * or return with an error. In any case won't need the
868 * nodes anymore nor continue the loop.
875 return ERR_PTR(-EPROBE_DEFER);
877 dsi2 = platform_get_drvdata(pdev);
879 platform_device_put(pdev);
880 return ERR_PTR(-EPROBE_DEFER);
894 static int dw_mipi_dsi_rockchip_bind(struct device *dev,
895 struct device *master,
898 struct dw_mipi_dsi_rockchip *dsi = dev_get_drvdata(dev);
899 struct drm_device *drm_dev = data;
900 struct device *second;
901 bool master1, master2;
904 second = dw_mipi_dsi_rockchip_find_second(dsi);
906 return PTR_ERR(second);
909 master1 = of_property_read_bool(dsi->dev->of_node,
911 master2 = of_property_read_bool(second->of_node,
914 if (master1 && master2) {
915 DRM_DEV_ERROR(dsi->dev, "only one clock-master allowed\n");
919 if (!master1 && !master2) {
920 DRM_DEV_ERROR(dsi->dev, "no clock-master defined\n");
924 /* we are the slave in dual-DSI */
926 dsi->is_slave = true;
930 dsi->slave = dev_get_drvdata(second);
932 DRM_DEV_ERROR(dev, "could not get slaves data\n");
936 dsi->slave->is_slave = true;
937 dw_mipi_dsi_set_slave(dsi->dmd, dsi->slave->dmd);
941 ret = clk_prepare_enable(dsi->pllref_clk);
943 DRM_DEV_ERROR(dev, "Failed to enable pllref_clk: %d\n", ret);
948 * With the GRF clock running, write lane and dual-mode configurations
949 * that won't change immediately. If we waited until enable() to do
950 * this, things like panel preparation would not be able to send
953 ret = clk_prepare_enable(dsi->grf_clk);
955 DRM_DEV_ERROR(dsi->dev, "Failed to enable grf_clk: %d\n", ret);
959 dw_mipi_dsi_rockchip_config(dsi);
961 dw_mipi_dsi_rockchip_config(dsi->slave);
963 clk_disable_unprepare(dsi->grf_clk);
965 ret = rockchip_dsi_drm_create_encoder(dsi, drm_dev);
967 DRM_DEV_ERROR(dev, "Failed to create drm encoder\n");
971 ret = dw_mipi_dsi_bind(dsi->dmd, &dsi->encoder);
973 DRM_DEV_ERROR(dev, "Failed to bind: %d\n", ret);
980 static void dw_mipi_dsi_rockchip_unbind(struct device *dev,
981 struct device *master,
984 struct dw_mipi_dsi_rockchip *dsi = dev_get_drvdata(dev);
989 dw_mipi_dsi_unbind(dsi->dmd);
991 clk_disable_unprepare(dsi->pllref_clk);
994 static const struct component_ops dw_mipi_dsi_rockchip_ops = {
995 .bind = dw_mipi_dsi_rockchip_bind,
996 .unbind = dw_mipi_dsi_rockchip_unbind,
999 static int dw_mipi_dsi_rockchip_host_attach(void *priv_data,
1000 struct mipi_dsi_device *device)
1002 struct dw_mipi_dsi_rockchip *dsi = priv_data;
1003 struct device *second;
1006 mutex_lock(&dsi->usage_mutex);
1008 if (dsi->usage_mode != DW_DSI_USAGE_IDLE) {
1009 DRM_DEV_ERROR(dsi->dev, "dsi controller already in use\n");
1010 mutex_unlock(&dsi->usage_mutex);
1014 dsi->usage_mode = DW_DSI_USAGE_DSI;
1015 mutex_unlock(&dsi->usage_mutex);
1017 ret = component_add(dsi->dev, &dw_mipi_dsi_rockchip_ops);
1019 DRM_DEV_ERROR(dsi->dev, "Failed to register component: %d\n",
1024 second = dw_mipi_dsi_rockchip_find_second(dsi);
1026 return PTR_ERR(second);
1028 ret = component_add(second, &dw_mipi_dsi_rockchip_ops);
1030 DRM_DEV_ERROR(second,
1031 "Failed to register component: %d\n",
1040 static int dw_mipi_dsi_rockchip_host_detach(void *priv_data,
1041 struct mipi_dsi_device *device)
1043 struct dw_mipi_dsi_rockchip *dsi = priv_data;
1044 struct device *second;
1046 second = dw_mipi_dsi_rockchip_find_second(dsi);
1047 if (second && !IS_ERR(second))
1048 component_del(second, &dw_mipi_dsi_rockchip_ops);
1050 component_del(dsi->dev, &dw_mipi_dsi_rockchip_ops);
1052 mutex_lock(&dsi->usage_mutex);
1053 dsi->usage_mode = DW_DSI_USAGE_IDLE;
1054 mutex_unlock(&dsi->usage_mutex);
1059 static const struct dw_mipi_dsi_host_ops dw_mipi_dsi_rockchip_host_ops = {
1060 .attach = dw_mipi_dsi_rockchip_host_attach,
1061 .detach = dw_mipi_dsi_rockchip_host_detach,
1064 static int dw_mipi_dsi_rockchip_dphy_bind(struct device *dev,
1065 struct device *master,
1069 * Nothing to do when used as a dphy.
1070 * Just make the rest of Rockchip-DRM happy
1077 static void dw_mipi_dsi_rockchip_dphy_unbind(struct device *dev,
1078 struct device *master,
1081 /* Nothing to do when used as a dphy. */
1084 static const struct component_ops dw_mipi_dsi_rockchip_dphy_ops = {
1085 .bind = dw_mipi_dsi_rockchip_dphy_bind,
1086 .unbind = dw_mipi_dsi_rockchip_dphy_unbind,
1089 static int dw_mipi_dsi_dphy_init(struct phy *phy)
1091 struct dw_mipi_dsi_rockchip *dsi = phy_get_drvdata(phy);
1094 mutex_lock(&dsi->usage_mutex);
1096 if (dsi->usage_mode != DW_DSI_USAGE_IDLE) {
1097 DRM_DEV_ERROR(dsi->dev, "dsi controller already in use\n");
1098 mutex_unlock(&dsi->usage_mutex);
1102 dsi->usage_mode = DW_DSI_USAGE_PHY;
1103 mutex_unlock(&dsi->usage_mutex);
1105 ret = component_add(dsi->dev, &dw_mipi_dsi_rockchip_dphy_ops);
1109 if (dsi->cdata->dphy_rx_init) {
1110 ret = clk_prepare_enable(dsi->pclk);
1114 ret = clk_prepare_enable(dsi->grf_clk);
1116 clk_disable_unprepare(dsi->pclk);
1120 ret = dsi->cdata->dphy_rx_init(phy);
1121 clk_disable_unprepare(dsi->grf_clk);
1122 clk_disable_unprepare(dsi->pclk);
1130 component_del(dsi->dev, &dw_mipi_dsi_rockchip_dphy_ops);
1132 mutex_lock(&dsi->usage_mutex);
1133 dsi->usage_mode = DW_DSI_USAGE_IDLE;
1134 mutex_unlock(&dsi->usage_mutex);
1139 static int dw_mipi_dsi_dphy_exit(struct phy *phy)
1141 struct dw_mipi_dsi_rockchip *dsi = phy_get_drvdata(phy);
1143 component_del(dsi->dev, &dw_mipi_dsi_rockchip_dphy_ops);
1145 mutex_lock(&dsi->usage_mutex);
1146 dsi->usage_mode = DW_DSI_USAGE_IDLE;
1147 mutex_unlock(&dsi->usage_mutex);
1152 static int dw_mipi_dsi_dphy_configure(struct phy *phy, union phy_configure_opts *opts)
1154 struct phy_configure_opts_mipi_dphy *config = &opts->mipi_dphy;
1155 struct dw_mipi_dsi_rockchip *dsi = phy_get_drvdata(phy);
1158 ret = phy_mipi_dphy_config_validate(&opts->mipi_dphy);
1162 dsi->dphy_config = *config;
1163 dsi->lane_mbps = div_u64(config->hs_clk_rate, 1000 * 1000 * 1);
1168 static int dw_mipi_dsi_dphy_power_on(struct phy *phy)
1170 struct dw_mipi_dsi_rockchip *dsi = phy_get_drvdata(phy);
1173 DRM_DEV_DEBUG(dsi->dev, "lanes %d - data_rate_mbps %u\n",
1174 dsi->dphy_config.lanes, dsi->lane_mbps);
1176 i = max_mbps_to_parameter(dsi->lane_mbps);
1178 DRM_DEV_ERROR(dsi->dev, "failed to get parameter for %dmbps clock\n",
1183 ret = pm_runtime_get_sync(dsi->dev);
1185 DRM_DEV_ERROR(dsi->dev, "failed to enable device: %d\n", ret);
1189 ret = clk_prepare_enable(dsi->pclk);
1191 DRM_DEV_ERROR(dsi->dev, "Failed to enable pclk: %d\n", ret);
1195 ret = clk_prepare_enable(dsi->grf_clk);
1197 DRM_DEV_ERROR(dsi->dev, "Failed to enable grf_clk: %d\n", ret);
1201 ret = clk_prepare_enable(dsi->phy_cfg_clk);
1203 DRM_DEV_ERROR(dsi->dev, "Failed to enable phy_cfg_clk: %d\n", ret);
1204 goto err_phy_cfg_clk;
1207 /* do soc-variant specific init */
1208 if (dsi->cdata->dphy_rx_power_on) {
1209 ret = dsi->cdata->dphy_rx_power_on(phy);
1211 DRM_DEV_ERROR(dsi->dev, "hardware-specific phy bringup failed: %d\n", ret);
1217 * Configure hsfreqrange according to frequency values
1218 * Set clock lane and hsfreqrange by lane0(test code 0x44)
1220 dw_mipi_dsi_phy_write(dsi, HS_RX_CONTROL_OF_LANE_CLK, 0);
1221 dw_mipi_dsi_phy_write(dsi, HS_RX_CONTROL_OF_LANE_0,
1222 HSFREQRANGE_SEL(dppa_map[i].hsfreqrange));
1223 dw_mipi_dsi_phy_write(dsi, HS_RX_CONTROL_OF_LANE_1, 0);
1224 dw_mipi_dsi_phy_write(dsi, HS_RX_CONTROL_OF_LANE_2, 0);
1225 dw_mipi_dsi_phy_write(dsi, HS_RX_CONTROL_OF_LANE_3, 0);
1227 /* Normal operation */
1228 dw_mipi_dsi_phy_write(dsi, 0x0, 0);
1230 clk_disable_unprepare(dsi->phy_cfg_clk);
1231 clk_disable_unprepare(dsi->grf_clk);
1236 clk_disable_unprepare(dsi->phy_cfg_clk);
1238 clk_disable_unprepare(dsi->grf_clk);
1240 clk_disable_unprepare(dsi->pclk);
1242 pm_runtime_put(dsi->dev);
1246 static int dw_mipi_dsi_dphy_power_off(struct phy *phy)
1248 struct dw_mipi_dsi_rockchip *dsi = phy_get_drvdata(phy);
1251 ret = clk_prepare_enable(dsi->grf_clk);
1253 DRM_DEV_ERROR(dsi->dev, "Failed to enable grf_clk: %d\n", ret);
1257 if (dsi->cdata->dphy_rx_power_off) {
1258 ret = dsi->cdata->dphy_rx_power_off(phy);
1260 DRM_DEV_ERROR(dsi->dev, "hardware-specific phy shutdown failed: %d\n", ret);
1263 clk_disable_unprepare(dsi->grf_clk);
1264 clk_disable_unprepare(dsi->pclk);
1266 pm_runtime_put(dsi->dev);
1271 static const struct phy_ops dw_mipi_dsi_dphy_ops = {
1272 .configure = dw_mipi_dsi_dphy_configure,
1273 .power_on = dw_mipi_dsi_dphy_power_on,
1274 .power_off = dw_mipi_dsi_dphy_power_off,
1275 .init = dw_mipi_dsi_dphy_init,
1276 .exit = dw_mipi_dsi_dphy_exit,
1279 static int dw_mipi_dsi_rockchip_probe(struct platform_device *pdev)
1281 struct device *dev = &pdev->dev;
1282 struct device_node *np = dev->of_node;
1283 struct dw_mipi_dsi_rockchip *dsi;
1284 struct phy_provider *phy_provider;
1285 struct resource *res;
1286 const struct rockchip_dw_dsi_chip_data *cdata =
1287 of_device_get_match_data(dev);
1290 dsi = devm_kzalloc(dev, sizeof(*dsi), GFP_KERNEL);
1294 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1295 dsi->base = devm_ioremap_resource(dev, res);
1296 if (IS_ERR(dsi->base)) {
1297 DRM_DEV_ERROR(dev, "Unable to get dsi registers\n");
1298 return PTR_ERR(dsi->base);
1302 while (cdata[i].reg) {
1303 if (cdata[i].reg == res->start) {
1304 dsi->cdata = &cdata[i];
1312 DRM_DEV_ERROR(dev, "no dsi-config for %s node\n", np->name);
1316 /* try to get a possible external dphy */
1317 dsi->phy = devm_phy_optional_get(dev, "dphy");
1318 if (IS_ERR(dsi->phy)) {
1319 ret = PTR_ERR(dsi->phy);
1320 DRM_DEV_ERROR(dev, "failed to get mipi dphy: %d\n", ret);
1324 dsi->pclk = devm_clk_get(dev, "pclk");
1325 if (IS_ERR(dsi->pclk)) {
1326 ret = PTR_ERR(dsi->pclk);
1327 DRM_DEV_ERROR(dev, "Unable to get pclk: %d\n", ret);
1331 dsi->pllref_clk = devm_clk_get(dev, "ref");
1332 if (IS_ERR(dsi->pllref_clk)) {
1335 * if external phy is present, pll will be
1338 dsi->pllref_clk = NULL;
1340 ret = PTR_ERR(dsi->pllref_clk);
1342 "Unable to get pll reference clock: %d\n",
1348 if (dsi->cdata->flags & DW_MIPI_NEEDS_PHY_CFG_CLK) {
1349 dsi->phy_cfg_clk = devm_clk_get(dev, "phy_cfg");
1350 if (IS_ERR(dsi->phy_cfg_clk)) {
1351 ret = PTR_ERR(dsi->phy_cfg_clk);
1353 "Unable to get phy_cfg_clk: %d\n", ret);
1358 if (dsi->cdata->flags & DW_MIPI_NEEDS_GRF_CLK) {
1359 dsi->grf_clk = devm_clk_get(dev, "grf");
1360 if (IS_ERR(dsi->grf_clk)) {
1361 ret = PTR_ERR(dsi->grf_clk);
1362 DRM_DEV_ERROR(dev, "Unable to get grf_clk: %d\n", ret);
1367 dsi->grf_regmap = syscon_regmap_lookup_by_phandle(np, "rockchip,grf");
1368 if (IS_ERR(dsi->grf_regmap)) {
1369 DRM_DEV_ERROR(dev, "Unable to get rockchip,grf\n");
1370 return PTR_ERR(dsi->grf_regmap);
1374 dsi->pdata.base = dsi->base;
1375 dsi->pdata.max_data_lanes = dsi->cdata->max_data_lanes;
1376 dsi->pdata.phy_ops = &dw_mipi_dsi_rockchip_phy_ops;
1377 dsi->pdata.host_ops = &dw_mipi_dsi_rockchip_host_ops;
1378 dsi->pdata.priv_data = dsi;
1379 platform_set_drvdata(pdev, dsi);
1381 mutex_init(&dsi->usage_mutex);
1383 dsi->dphy = devm_phy_create(dev, NULL, &dw_mipi_dsi_dphy_ops);
1384 if (IS_ERR(dsi->dphy)) {
1385 DRM_DEV_ERROR(&pdev->dev, "failed to create PHY\n");
1386 return PTR_ERR(dsi->dphy);
1389 phy_set_drvdata(dsi->dphy, dsi);
1390 phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate);
1391 if (IS_ERR(phy_provider))
1392 return PTR_ERR(phy_provider);
1394 dsi->dmd = dw_mipi_dsi_probe(pdev, &dsi->pdata);
1395 if (IS_ERR(dsi->dmd)) {
1396 ret = PTR_ERR(dsi->dmd);
1397 if (ret != -EPROBE_DEFER)
1399 "Failed to probe dw_mipi_dsi: %d\n", ret);
1400 goto err_clkdisable;
1406 clk_disable_unprepare(dsi->pllref_clk);
1410 static int dw_mipi_dsi_rockchip_remove(struct platform_device *pdev)
1412 struct dw_mipi_dsi_rockchip *dsi = platform_get_drvdata(pdev);
1414 dw_mipi_dsi_remove(dsi->dmd);
1419 static const struct rockchip_dw_dsi_chip_data px30_chip_data[] = {
1422 .lcdsel_grf_reg = PX30_GRF_PD_VO_CON1,
1423 .lcdsel_big = HIWORD_UPDATE(0, PX30_DSI_LCDC_SEL),
1424 .lcdsel_lit = HIWORD_UPDATE(PX30_DSI_LCDC_SEL,
1427 .lanecfg1_grf_reg = PX30_GRF_PD_VO_CON1,
1428 .lanecfg1 = HIWORD_UPDATE(0, PX30_DSI_TURNDISABLE |
1429 PX30_DSI_FORCERXMODE |
1430 PX30_DSI_FORCETXSTOPMODE),
1432 .max_data_lanes = 4,
1437 static const struct rockchip_dw_dsi_chip_data rk3288_chip_data[] = {
1440 .lcdsel_grf_reg = RK3288_GRF_SOC_CON6,
1441 .lcdsel_big = HIWORD_UPDATE(0, RK3288_DSI0_LCDC_SEL),
1442 .lcdsel_lit = HIWORD_UPDATE(RK3288_DSI0_LCDC_SEL, RK3288_DSI0_LCDC_SEL),
1444 .max_data_lanes = 4,
1448 .lcdsel_grf_reg = RK3288_GRF_SOC_CON6,
1449 .lcdsel_big = HIWORD_UPDATE(0, RK3288_DSI1_LCDC_SEL),
1450 .lcdsel_lit = HIWORD_UPDATE(RK3288_DSI1_LCDC_SEL, RK3288_DSI1_LCDC_SEL),
1452 .max_data_lanes = 4,
1457 static int rk3399_dphy_tx1rx1_init(struct phy *phy)
1459 struct dw_mipi_dsi_rockchip *dsi = phy_get_drvdata(phy);
1462 * Set TX1RX1 source to isp1.
1463 * Assume ISP0 is supplied by the RX0 dphy.
1465 regmap_write(dsi->grf_regmap, RK3399_GRF_SOC_CON24,
1466 HIWORD_UPDATE(0, RK3399_TXRX_SRC_SEL_ISP0));
1467 regmap_write(dsi->grf_regmap, RK3399_GRF_SOC_CON24,
1468 HIWORD_UPDATE(0, RK3399_TXRX_MASTERSLAVEZ));
1469 regmap_write(dsi->grf_regmap, RK3399_GRF_SOC_CON24,
1470 HIWORD_UPDATE(0, RK3399_TXRX_BASEDIR));
1471 regmap_write(dsi->grf_regmap, RK3399_GRF_SOC_CON23,
1472 HIWORD_UPDATE(0, RK3399_DSI1_ENABLE));
1477 static int rk3399_dphy_tx1rx1_power_on(struct phy *phy)
1479 struct dw_mipi_dsi_rockchip *dsi = phy_get_drvdata(phy);
1481 /* tester reset pulse */
1482 dsi_write(dsi, DSI_PHY_TST_CTRL0, PHY_TESTCLK | PHY_TESTCLR);
1483 usleep_range(100, 150);
1485 regmap_write(dsi->grf_regmap, RK3399_GRF_SOC_CON24,
1486 HIWORD_UPDATE(0, RK3399_TXRX_MASTERSLAVEZ));
1487 regmap_write(dsi->grf_regmap, RK3399_GRF_SOC_CON24,
1488 HIWORD_UPDATE(RK3399_TXRX_BASEDIR, RK3399_TXRX_BASEDIR));
1490 regmap_write(dsi->grf_regmap, RK3399_GRF_SOC_CON23,
1491 HIWORD_UPDATE(0, RK3399_DSI1_FORCERXMODE));
1492 regmap_write(dsi->grf_regmap, RK3399_GRF_SOC_CON23,
1493 HIWORD_UPDATE(0, RK3399_DSI1_FORCETXSTOPMODE));
1495 /* Disable lane turn around, which is ignored in receive mode */
1496 regmap_write(dsi->grf_regmap, RK3399_GRF_SOC_CON24,
1497 HIWORD_UPDATE(0, RK3399_TXRX_TURNREQUEST));
1498 regmap_write(dsi->grf_regmap, RK3399_GRF_SOC_CON23,
1499 HIWORD_UPDATE(RK3399_DSI1_TURNDISABLE,
1500 RK3399_DSI1_TURNDISABLE));
1501 usleep_range(100, 150);
1503 dsi_write(dsi, DSI_PHY_TST_CTRL0, PHY_TESTCLK | PHY_UNTESTCLR);
1504 usleep_range(100, 150);
1506 /* Enable dphy lanes */
1507 regmap_write(dsi->grf_regmap, RK3399_GRF_SOC_CON23,
1508 HIWORD_UPDATE(GENMASK(dsi->dphy_config.lanes - 1, 0),
1509 RK3399_DSI1_ENABLE));
1511 usleep_range(100, 150);
1516 static int rk3399_dphy_tx1rx1_power_off(struct phy *phy)
1518 struct dw_mipi_dsi_rockchip *dsi = phy_get_drvdata(phy);
1520 regmap_write(dsi->grf_regmap, RK3399_GRF_SOC_CON23,
1521 HIWORD_UPDATE(0, RK3399_DSI1_ENABLE));
1526 static const struct rockchip_dw_dsi_chip_data rk3399_chip_data[] = {
1529 .lcdsel_grf_reg = RK3399_GRF_SOC_CON20,
1530 .lcdsel_big = HIWORD_UPDATE(0, RK3399_DSI0_LCDC_SEL),
1531 .lcdsel_lit = HIWORD_UPDATE(RK3399_DSI0_LCDC_SEL,
1532 RK3399_DSI0_LCDC_SEL),
1534 .lanecfg1_grf_reg = RK3399_GRF_SOC_CON22,
1535 .lanecfg1 = HIWORD_UPDATE(0, RK3399_DSI0_TURNREQUEST |
1536 RK3399_DSI0_TURNDISABLE |
1537 RK3399_DSI0_FORCETXSTOPMODE |
1538 RK3399_DSI0_FORCERXMODE),
1540 .flags = DW_MIPI_NEEDS_PHY_CFG_CLK | DW_MIPI_NEEDS_GRF_CLK,
1541 .max_data_lanes = 4,
1545 .lcdsel_grf_reg = RK3399_GRF_SOC_CON20,
1546 .lcdsel_big = HIWORD_UPDATE(0, RK3399_DSI1_LCDC_SEL),
1547 .lcdsel_lit = HIWORD_UPDATE(RK3399_DSI1_LCDC_SEL,
1548 RK3399_DSI1_LCDC_SEL),
1550 .lanecfg1_grf_reg = RK3399_GRF_SOC_CON23,
1551 .lanecfg1 = HIWORD_UPDATE(0, RK3399_DSI1_TURNDISABLE |
1552 RK3399_DSI1_FORCETXSTOPMODE |
1553 RK3399_DSI1_FORCERXMODE |
1554 RK3399_DSI1_ENABLE),
1556 .lanecfg2_grf_reg = RK3399_GRF_SOC_CON24,
1557 .lanecfg2 = HIWORD_UPDATE(RK3399_TXRX_MASTERSLAVEZ |
1558 RK3399_TXRX_ENABLECLK,
1559 RK3399_TXRX_MASTERSLAVEZ |
1560 RK3399_TXRX_ENABLECLK |
1561 RK3399_TXRX_BASEDIR),
1563 .enable_grf_reg = RK3399_GRF_SOC_CON23,
1564 .enable = HIWORD_UPDATE(RK3399_DSI1_ENABLE, RK3399_DSI1_ENABLE),
1566 .flags = DW_MIPI_NEEDS_PHY_CFG_CLK | DW_MIPI_NEEDS_GRF_CLK,
1567 .max_data_lanes = 4,
1569 .dphy_rx_init = rk3399_dphy_tx1rx1_init,
1570 .dphy_rx_power_on = rk3399_dphy_tx1rx1_power_on,
1571 .dphy_rx_power_off = rk3399_dphy_tx1rx1_power_off,
1576 static const struct of_device_id dw_mipi_dsi_rockchip_dt_ids[] = {
1578 .compatible = "rockchip,px30-mipi-dsi",
1579 .data = &px30_chip_data,
1581 .compatible = "rockchip,rk3288-mipi-dsi",
1582 .data = &rk3288_chip_data,
1584 .compatible = "rockchip,rk3399-mipi-dsi",
1585 .data = &rk3399_chip_data,
1589 MODULE_DEVICE_TABLE(of, dw_mipi_dsi_rockchip_dt_ids);
1591 struct platform_driver dw_mipi_dsi_rockchip_driver = {
1592 .probe = dw_mipi_dsi_rockchip_probe,
1593 .remove = dw_mipi_dsi_rockchip_remove,
1595 .of_match_table = dw_mipi_dsi_rockchip_dt_ids,
1596 .name = "dw-mipi-dsi-rockchip",