xref: /linux/drivers/gpu/drm/bridge/imx/imx93-mipi-dsi.c (revision 07fdad3a93756b872da7b53647715c48d0f4a2d0)
1 // SPDX-License-Identifier: GPL-2.0+
2 
3 /*
4  * Copyright 2022,2023 NXP
5  */
6 
7 #include <linux/bitfield.h>
8 #include <linux/bits.h>
9 #include <linux/clk.h>
10 #include <linux/delay.h>
11 #include <linux/math.h>
12 #include <linux/media-bus-format.h>
13 #include <linux/mfd/syscon.h>
14 #include <linux/module.h>
15 #include <linux/of.h>
16 #include <linux/phy/phy.h>
17 #include <linux/phy/phy-mipi-dphy.h>
18 #include <linux/platform_device.h>
19 #include <linux/regmap.h>
20 
21 #include <drm/bridge/dw_mipi_dsi.h>
22 #include <drm/drm_bridge.h>
23 #include <drm/drm_mipi_dsi.h>
24 #include <drm/drm_modes.h>
25 
26 /* DPHY PLL configuration registers */
27 #define DSI_REG				0x4c
28 #define  CFGCLKFREQRANGE_MASK		GENMASK(5, 0)
29 #define  CFGCLKFREQRANGE(x)		FIELD_PREP(CFGCLKFREQRANGE_MASK, (x))
30 #define  CLKSEL_MASK			GENMASK(7, 6)
31 #define  CLKSEL_STOP			FIELD_PREP(CLKSEL_MASK, 0)
32 #define  CLKSEL_GEN			FIELD_PREP(CLKSEL_MASK, 1)
33 #define  CLKSEL_EXT			FIELD_PREP(CLKSEL_MASK, 2)
34 #define  HSFREQRANGE_MASK		GENMASK(14, 8)
35 #define  HSFREQRANGE(x)			FIELD_PREP(HSFREQRANGE_MASK, (x))
36 #define  UPDATE_PLL			BIT(17)
37 #define  SHADOW_CLR			BIT(18)
38 #define  CLK_EXT			BIT(19)
39 
40 #define DSI_WRITE_REG0			0x50
41 #define  M_MASK				GENMASK(9, 0)
42 #define  M(x)				FIELD_PREP(M_MASK, ((x) - 2))
43 #define  N_MASK				GENMASK(13, 10)
44 #define  N(x)				FIELD_PREP(N_MASK, ((x) - 1))
45 #define  VCO_CTRL_MASK			GENMASK(19, 14)
46 #define  VCO_CTRL(x)			FIELD_PREP(VCO_CTRL_MASK, (x))
47 #define  PROP_CTRL_MASK			GENMASK(25, 20)
48 #define  PROP_CTRL(x)			FIELD_PREP(PROP_CTRL_MASK, (x))
49 #define  INT_CTRL_MASK			GENMASK(31, 26)
50 #define  INT_CTRL(x)			FIELD_PREP(INT_CTRL_MASK, (x))
51 
52 #define DSI_WRITE_REG1			0x54
53 #define  GMP_CTRL_MASK			GENMASK(1, 0)
54 #define  GMP_CTRL(x)			FIELD_PREP(GMP_CTRL_MASK, (x))
55 #define  CPBIAS_CTRL_MASK		GENMASK(8, 2)
56 #define  CPBIAS_CTRL(x)			FIELD_PREP(CPBIAS_CTRL_MASK, (x))
57 #define  PLL_SHADOW_CTRL		BIT(9)
58 
59 /* display mux control register */
60 #define DISPLAY_MUX			0x60
61 #define  MIPI_DSI_RGB666_MAP_CFG	GENMASK(7, 6)
62 #define  RGB666_CONFIG1			FIELD_PREP(MIPI_DSI_RGB666_MAP_CFG, 0)
63 #define  RGB666_CONFIG2			FIELD_PREP(MIPI_DSI_RGB666_MAP_CFG, 1)
64 #define  MIPI_DSI_RGB565_MAP_CFG	GENMASK(5, 4)
65 #define  RGB565_CONFIG1			FIELD_PREP(MIPI_DSI_RGB565_MAP_CFG, 0)
66 #define  RGB565_CONFIG2			FIELD_PREP(MIPI_DSI_RGB565_MAP_CFG, 1)
67 #define  RGB565_CONFIG3			FIELD_PREP(MIPI_DSI_RGB565_MAP_CFG, 2)
68 #define  LCDIF_CROSS_LINE_PATTERN	GENMASK(3, 0)
69 #define  RGB888_TO_RGB888		FIELD_PREP(LCDIF_CROSS_LINE_PATTERN, 0)
70 #define  RGB888_TO_RGB666		FIELD_PREP(LCDIF_CROSS_LINE_PATTERN, 6)
71 #define  RGB565_TO_RGB565		FIELD_PREP(LCDIF_CROSS_LINE_PATTERN, 7)
72 
73 #define MHZ(x)				((x) * 1000000UL)
74 
75 #define REF_CLK_RATE_MAX		MHZ(64)
76 #define REF_CLK_RATE_MIN		MHZ(2)
77 #define FOUT_MAX			MHZ(1250)
78 #define FOUT_MIN			MHZ(40)
79 #define FVCO_DIV_FACTOR			MHZ(80)
80 
81 #define MBPS(x)				((x) * 1000000UL)
82 
83 #define DATA_RATE_MAX_SPEED		MBPS(2500)
84 #define DATA_RATE_MIN_SPEED		MBPS(80)
85 
86 #define M_MAX				625UL
87 #define M_MIN				64UL
88 
89 #define N_MAX				16U
90 #define N_MIN				1U
91 
92 struct imx93_dsi {
93 	struct device *dev;
94 	struct regmap *regmap;
95 	struct clk *clk_pixel;
96 	struct clk *clk_ref;
97 	struct clk *clk_cfg;
98 	struct dw_mipi_dsi *dmd;
99 	struct dw_mipi_dsi_plat_data pdata;
100 	union phy_configure_opts phy_cfg;
101 	unsigned long ref_clk_rate;
102 	u32 format;
103 };
104 
105 struct dphy_pll_cfg {
106 	u32 m;	/* PLL Feedback Multiplication Ratio */
107 	u32 n;	/* PLL Input Frequency Division Ratio */
108 };
109 
110 struct dphy_pll_vco_prop {
111 	unsigned long max_fout;
112 	u8 vco_cntl;
113 	u8 prop_cntl;
114 };
115 
116 struct dphy_pll_hsfreqrange {
117 	unsigned long max_mbps;
118 	u8 hsfreqrange;
119 };
120 
121 /* DPHY Databook Table 3-13 Charge-pump Programmability */
122 static const struct dphy_pll_vco_prop vco_prop_map[] = {
123 	{   55, 0x3f, 0x0d },
124 	{   82, 0x37, 0x0d },
125 	{  110, 0x2f, 0x0d },
126 	{  165, 0x27, 0x0d },
127 	{  220, 0x1f, 0x0d },
128 	{  330, 0x17, 0x0d },
129 	{  440, 0x0f, 0x0d },
130 	{  660, 0x07, 0x0d },
131 	{ 1149, 0x03, 0x0d },
132 	{ 1152, 0x01, 0x0d },
133 	{ 1250, 0x01, 0x0e },
134 };
135 
136 /* DPHY Databook Table 5-7 Frequency Ranges and Defaults */
137 static const struct dphy_pll_hsfreqrange hsfreqrange_map[] = {
138 	{   89, 0x00 },
139 	{   99, 0x10 },
140 	{  109, 0x20 },
141 	{  119, 0x30 },
142 	{  129, 0x01 },
143 	{  139, 0x11 },
144 	{  149, 0x21 },
145 	{  159, 0x31 },
146 	{  169, 0x02 },
147 	{  179, 0x12 },
148 	{  189, 0x22 },
149 	{  204, 0x32 },
150 	{  219, 0x03 },
151 	{  234, 0x13 },
152 	{  249, 0x23 },
153 	{  274, 0x33 },
154 	{  299, 0x04 },
155 	{  324, 0x14 },
156 	{  349, 0x25 },
157 	{  399, 0x35 },
158 	{  449, 0x05 },
159 	{  499, 0x16 },
160 	{  549, 0x26 },
161 	{  599, 0x37 },
162 	{  649, 0x07 },
163 	{  699, 0x18 },
164 	{  749, 0x28 },
165 	{  799, 0x39 },
166 	{  849, 0x09 },
167 	{  899, 0x19 },
168 	{  949, 0x29 },
169 	{  999, 0x3a },
170 	{ 1049, 0x0a },
171 	{ 1099, 0x1a },
172 	{ 1149, 0x2a },
173 	{ 1199, 0x3b },
174 	{ 1249, 0x0b },
175 	{ 1299, 0x1b },
176 	{ 1349, 0x2b },
177 	{ 1399, 0x3c },
178 	{ 1449, 0x0c },
179 	{ 1499, 0x1c },
180 	{ 1549, 0x2c },
181 	{ 1599, 0x3d },
182 	{ 1649, 0x0d },
183 	{ 1699, 0x1d },
184 	{ 1749, 0x2e },
185 	{ 1799, 0x3e },
186 	{ 1849, 0x0e },
187 	{ 1899, 0x1e },
188 	{ 1949, 0x2f },
189 	{ 1999, 0x3f },
190 	{ 2049, 0x0f },
191 	{ 2099, 0x40 },
192 	{ 2149, 0x41 },
193 	{ 2199, 0x42 },
194 	{ 2249, 0x43 },
195 	{ 2299, 0x44 },
196 	{ 2349, 0x45 },
197 	{ 2399, 0x46 },
198 	{ 2449, 0x47 },
199 	{ 2499, 0x48 },
200 	{ 2500, 0x49 },
201 };
202 
203 static void dphy_pll_write(struct imx93_dsi *dsi, unsigned int reg, u32 value)
204 {
205 	int ret;
206 
207 	ret = regmap_write(dsi->regmap, reg, value);
208 	if (ret < 0)
209 		dev_err(dsi->dev, "failed to write 0x%08x to pll reg 0x%x: %d\n",
210 			value, reg, ret);
211 }
212 
213 static inline unsigned long data_rate_to_fout(unsigned long data_rate)
214 {
215 	/* Fout is half of data rate */
216 	return data_rate / 2;
217 }
218 
219 static int
220 dphy_pll_get_configure_from_opts(struct imx93_dsi *dsi,
221 				 struct phy_configure_opts_mipi_dphy *dphy_opts,
222 				 struct dphy_pll_cfg *cfg)
223 {
224 	struct device *dev = dsi->dev;
225 	unsigned long fin = dsi->ref_clk_rate;
226 	unsigned long fout;
227 	unsigned long best_fout = 0;
228 	unsigned int fvco_div;
229 	unsigned int min_n, max_n, n, best_n = UINT_MAX;
230 	unsigned long m, best_m = 0;
231 	unsigned long min_delta = ULONG_MAX;
232 	unsigned long delta;
233 	u64 tmp;
234 
235 	if (dphy_opts->hs_clk_rate < DATA_RATE_MIN_SPEED ||
236 	    dphy_opts->hs_clk_rate > DATA_RATE_MAX_SPEED) {
237 		dev_dbg(dev, "invalid data rate per lane: %lu\n",
238 			dphy_opts->hs_clk_rate);
239 		return -EINVAL;
240 	}
241 
242 	fout = data_rate_to_fout(dphy_opts->hs_clk_rate);
243 
244 	/* DPHY Databook 3.3.6.1 Output Frequency */
245 	/* Fout = Fvco / Fvco_div = (Fin * M) / (Fvco_div * N) */
246 	/* Fvco_div could be 1/2/4/8 according to Fout range. */
247 	fvco_div = 8UL / min(DIV_ROUND_UP(fout, FVCO_DIV_FACTOR), 8UL);
248 
249 	/* limitation: 2MHz <= Fin / N <= 8MHz */
250 	min_n = DIV_ROUND_UP_ULL((u64)fin, MHZ(8));
251 	max_n = DIV_ROUND_DOWN_ULL((u64)fin, MHZ(2));
252 
253 	/* clamp possible N(s) */
254 	min_n = clamp(min_n, N_MIN, N_MAX);
255 	max_n = clamp(max_n, N_MIN, N_MAX);
256 
257 	dev_dbg(dev, "Fout = %lu, Fvco_div = %u, n_range = [%u, %u]\n",
258 		fout, fvco_div, min_n, max_n);
259 
260 	for (n = min_n; n <= max_n; n++) {
261 		/* M = (Fout * N * Fvco_div) / Fin */
262 		m = DIV_ROUND_CLOSEST(fout * n * fvco_div, fin);
263 
264 		/* check M range */
265 		if (m < M_MIN || m > M_MAX)
266 			continue;
267 
268 		/* calculate temporary Fout */
269 		tmp = m * fin;
270 		do_div(tmp, n * fvco_div);
271 		if (tmp < FOUT_MIN || tmp > FOUT_MAX)
272 			continue;
273 
274 		delta = abs(fout - tmp);
275 		if (delta < min_delta) {
276 			best_n = n;
277 			best_m = m;
278 			min_delta = delta;
279 			best_fout = tmp;
280 		}
281 	}
282 
283 	if (best_fout) {
284 		cfg->m = best_m;
285 		cfg->n = best_n;
286 		dev_dbg(dev, "best Fout = %lu, m = %u, n = %u\n",
287 			best_fout, cfg->m, cfg->n);
288 	} else {
289 		dev_dbg(dev, "failed to find best Fout\n");
290 		return -EINVAL;
291 	}
292 
293 	return 0;
294 }
295 
296 static void dphy_pll_clear_shadow(struct imx93_dsi *dsi)
297 {
298 	/* Reference DPHY Databook Figure 3-3 Initialization Timing Diagram. */
299 	/* Select clock generation first. */
300 	dphy_pll_write(dsi, DSI_REG, CLKSEL_GEN);
301 
302 	/* Clear shadow after clock selection is done a while. */
303 	fsleep(1);
304 	dphy_pll_write(dsi, DSI_REG, CLKSEL_GEN | SHADOW_CLR);
305 
306 	/* A minimum pulse of 5ns on shadow_clear signal. */
307 	fsleep(1);
308 	dphy_pll_write(dsi, DSI_REG, CLKSEL_GEN);
309 }
310 
311 static unsigned long dphy_pll_get_cfgclkrange(struct imx93_dsi *dsi)
312 {
313 	/*
314 	 * DPHY Databook Table 4-4 System Control Signals mentions an equation
315 	 * for cfgclkfreqrange[5:0].
316 	 */
317 	return (clk_get_rate(dsi->clk_cfg) / MHZ(1) - 17) * 4;
318 }
319 
320 static u8
321 dphy_pll_get_hsfreqrange(struct phy_configure_opts_mipi_dphy *dphy_opts)
322 {
323 	unsigned long mbps = dphy_opts->hs_clk_rate / MHZ(1);
324 	int i;
325 
326 	for (i = 0; i < ARRAY_SIZE(hsfreqrange_map); i++)
327 		if (mbps <= hsfreqrange_map[i].max_mbps)
328 			return hsfreqrange_map[i].hsfreqrange;
329 
330 	return 0;
331 }
332 
333 static u8 dphy_pll_get_vco(struct phy_configure_opts_mipi_dphy *dphy_opts)
334 {
335 	unsigned long fout = data_rate_to_fout(dphy_opts->hs_clk_rate) / MHZ(1);
336 	int i;
337 
338 	for (i = 0; i < ARRAY_SIZE(vco_prop_map); i++)
339 		if (fout <= vco_prop_map[i].max_fout)
340 			return vco_prop_map[i].vco_cntl;
341 
342 	return 0;
343 }
344 
345 static u8 dphy_pll_get_prop(struct phy_configure_opts_mipi_dphy *dphy_opts)
346 {
347 	unsigned long fout = data_rate_to_fout(dphy_opts->hs_clk_rate) / MHZ(1);
348 	int i;
349 
350 	for (i = 0; i < ARRAY_SIZE(vco_prop_map); i++)
351 		if (fout <= vco_prop_map[i].max_fout)
352 			return vco_prop_map[i].prop_cntl;
353 
354 	return 0;
355 }
356 
357 static int dphy_pll_update(struct imx93_dsi *dsi)
358 {
359 	int ret;
360 
361 	ret = regmap_update_bits(dsi->regmap, DSI_REG, UPDATE_PLL, UPDATE_PLL);
362 	if (ret < 0) {
363 		dev_err(dsi->dev, "failed to set UPDATE_PLL: %d\n", ret);
364 		return ret;
365 	}
366 
367 	/*
368 	 * The updatepll signal should be asserted for a minimum of four clkin
369 	 * cycles, according to DPHY Databook Figure 3-3 Initialization Timing
370 	 * Diagram.
371 	 */
372 	fsleep(10);
373 
374 	ret = regmap_update_bits(dsi->regmap, DSI_REG, UPDATE_PLL, 0);
375 	if (ret < 0) {
376 		dev_err(dsi->dev, "failed to clear UPDATE_PLL: %d\n", ret);
377 		return ret;
378 	}
379 
380 	return 0;
381 }
382 
383 static int dphy_pll_configure(struct imx93_dsi *dsi, union phy_configure_opts *opts)
384 {
385 	struct dphy_pll_cfg cfg = { 0 };
386 	u32 val;
387 	int ret;
388 
389 	ret = dphy_pll_get_configure_from_opts(dsi, &opts->mipi_dphy, &cfg);
390 	if (ret) {
391 		dev_err(dsi->dev, "failed to get phy pll cfg %d\n", ret);
392 		return ret;
393 	}
394 
395 	dphy_pll_clear_shadow(dsi);
396 
397 	/* DSI_REG */
398 	val = CLKSEL_GEN |
399 	      CFGCLKFREQRANGE(dphy_pll_get_cfgclkrange(dsi)) |
400 	      HSFREQRANGE(dphy_pll_get_hsfreqrange(&opts->mipi_dphy));
401 	dphy_pll_write(dsi, DSI_REG, val);
402 
403 	/* DSI_WRITE_REG0 */
404 	val = M(cfg.m) | N(cfg.n) | INT_CTRL(0) |
405 	      VCO_CTRL(dphy_pll_get_vco(&opts->mipi_dphy)) |
406 	      PROP_CTRL(dphy_pll_get_prop(&opts->mipi_dphy));
407 	dphy_pll_write(dsi, DSI_WRITE_REG0, val);
408 
409 	/* DSI_WRITE_REG1 */
410 	dphy_pll_write(dsi, DSI_WRITE_REG1, GMP_CTRL(1) | CPBIAS_CTRL(0x10));
411 
412 	ret = clk_prepare_enable(dsi->clk_ref);
413 	if (ret < 0) {
414 		dev_err(dsi->dev, "failed to enable ref clock: %d\n", ret);
415 		return ret;
416 	}
417 
418 	/*
419 	 * At least 10 refclk cycles are required before updatePLL assertion,
420 	 * according to DPHY Databook Figure 3-3 Initialization Timing Diagram.
421 	 */
422 	fsleep(10);
423 
424 	ret = dphy_pll_update(dsi);
425 	if (ret < 0) {
426 		clk_disable_unprepare(dsi->clk_ref);
427 		return ret;
428 	}
429 
430 	return 0;
431 }
432 
433 static void dphy_pll_clear_reg(struct imx93_dsi *dsi)
434 {
435 	dphy_pll_write(dsi, DSI_REG, 0);
436 	dphy_pll_write(dsi, DSI_WRITE_REG0, 0);
437 	dphy_pll_write(dsi, DSI_WRITE_REG1, 0);
438 }
439 
440 static int dphy_pll_init(struct imx93_dsi *dsi)
441 {
442 	int ret;
443 
444 	ret = clk_prepare_enable(dsi->clk_cfg);
445 	if (ret < 0) {
446 		dev_err(dsi->dev, "failed to enable config clock: %d\n", ret);
447 		return ret;
448 	}
449 
450 	dphy_pll_clear_reg(dsi);
451 
452 	return 0;
453 }
454 
455 static void dphy_pll_uninit(struct imx93_dsi *dsi)
456 {
457 	dphy_pll_clear_reg(dsi);
458 	clk_disable_unprepare(dsi->clk_cfg);
459 }
460 
461 static void dphy_pll_power_off(struct imx93_dsi *dsi)
462 {
463 	dphy_pll_clear_reg(dsi);
464 	clk_disable_unprepare(dsi->clk_ref);
465 }
466 
467 static int imx93_dsi_get_phy_configure_opts(struct imx93_dsi *dsi,
468 					    const struct drm_display_mode *mode,
469 					    union phy_configure_opts *phy_cfg,
470 					    u32 lanes, u32 format)
471 {
472 	struct device *dev = dsi->dev;
473 	int bpp;
474 	int ret;
475 
476 	bpp = mipi_dsi_pixel_format_to_bpp(format);
477 	if (bpp < 0) {
478 		dev_dbg(dev, "failed to get bpp for pixel format %d\n", format);
479 		return -EINVAL;
480 	}
481 
482 	ret = phy_mipi_dphy_get_default_config(mode->clock * MSEC_PER_SEC, bpp,
483 					       lanes, &phy_cfg->mipi_dphy);
484 	if (ret < 0) {
485 		dev_dbg(dev, "failed to get default phy cfg %d\n", ret);
486 		return ret;
487 	}
488 
489 	return 0;
490 }
491 
492 static enum drm_mode_status
493 imx93_dsi_validate_mode(struct imx93_dsi *dsi, const struct drm_display_mode *mode)
494 {
495 	struct drm_bridge *dmd_bridge = dw_mipi_dsi_get_bridge(dsi->dmd);
496 	struct drm_bridge *last_bridge __free(drm_bridge_put) =
497 		drm_bridge_chain_get_last_bridge(dmd_bridge->encoder);
498 
499 	if ((last_bridge->ops & DRM_BRIDGE_OP_DETECT) &&
500 	    (last_bridge->ops & DRM_BRIDGE_OP_EDID)) {
501 		unsigned long pixel_clock_rate = mode->clock * 1000;
502 		unsigned long rounded_rate;
503 
504 		/* Allow +/-0.5% pixel clock rate deviation */
505 		rounded_rate = clk_round_rate(dsi->clk_pixel, pixel_clock_rate);
506 		if (rounded_rate < pixel_clock_rate * 995 / 1000 ||
507 		    rounded_rate > pixel_clock_rate * 1005 / 1000) {
508 			dev_dbg(dsi->dev, "failed to round clock for mode " DRM_MODE_FMT "\n",
509 				DRM_MODE_ARG(mode));
510 			return MODE_NOCLOCK;
511 		}
512 	}
513 
514 	return MODE_OK;
515 }
516 
517 static enum drm_mode_status
518 imx93_dsi_validate_phy(struct imx93_dsi *dsi, const struct drm_display_mode *mode,
519 		       unsigned long mode_flags, u32 lanes, u32 format)
520 {
521 	union phy_configure_opts phy_cfg;
522 	struct dphy_pll_cfg cfg = { 0 };
523 	struct device *dev = dsi->dev;
524 	int ret;
525 
526 	ret = imx93_dsi_get_phy_configure_opts(dsi, mode, &phy_cfg, lanes,
527 					       format);
528 	if (ret < 0) {
529 		dev_dbg(dev, "failed to get phy cfg opts %d\n", ret);
530 		return MODE_ERROR;
531 	}
532 
533 	ret = dphy_pll_get_configure_from_opts(dsi, &phy_cfg.mipi_dphy, &cfg);
534 	if (ret < 0) {
535 		dev_dbg(dev, "failed to get phy pll cfg %d\n", ret);
536 		return MODE_NOCLOCK;
537 	}
538 
539 	return MODE_OK;
540 }
541 
542 static enum drm_mode_status
543 imx93_dsi_mode_valid(void *priv_data, const struct drm_display_mode *mode,
544 		     unsigned long mode_flags, u32 lanes, u32 format)
545 {
546 	struct imx93_dsi *dsi = priv_data;
547 	struct device *dev = dsi->dev;
548 	enum drm_mode_status ret;
549 
550 	ret = imx93_dsi_validate_mode(dsi, mode);
551 	if (ret != MODE_OK) {
552 		dev_dbg(dev, "failed to validate mode " DRM_MODE_FMT "\n",
553 			DRM_MODE_ARG(mode));
554 		return ret;
555 	}
556 
557 	ret = imx93_dsi_validate_phy(dsi, mode, mode_flags, lanes, format);
558 	if (ret != MODE_OK) {
559 		dev_dbg(dev, "failed to validate phy for mode " DRM_MODE_FMT "\n",
560 			DRM_MODE_ARG(mode));
561 		return ret;
562 	}
563 
564 	return MODE_OK;
565 }
566 
567 static bool imx93_dsi_mode_fixup(void *priv_data,
568 				 const struct drm_display_mode *mode,
569 				 struct drm_display_mode *adjusted_mode)
570 {
571 	struct imx93_dsi *dsi = priv_data;
572 	unsigned long pixel_clock_rate;
573 	unsigned long rounded_rate;
574 
575 	pixel_clock_rate = mode->clock * 1000;
576 	rounded_rate = clk_round_rate(dsi->clk_pixel, pixel_clock_rate);
577 
578 	memcpy(adjusted_mode, mode, sizeof(*mode));
579 	adjusted_mode->clock = rounded_rate / 1000;
580 
581 	dev_dbg(dsi->dev, "adj clock %d for mode " DRM_MODE_FMT "\n",
582 		adjusted_mode->clock, DRM_MODE_ARG(mode));
583 
584 	return true;
585 }
586 
587 static u32 *imx93_dsi_get_input_bus_fmts(void *priv_data,
588 					 struct drm_bridge *bridge,
589 					 struct drm_bridge_state *bridge_state,
590 					 struct drm_crtc_state *crtc_state,
591 					 struct drm_connector_state *conn_state,
592 					 u32 output_fmt,
593 					 unsigned int *num_input_fmts)
594 {
595 	u32 *input_fmts, input_fmt;
596 
597 	*num_input_fmts = 0;
598 
599 	switch (output_fmt) {
600 	case MEDIA_BUS_FMT_RGB888_1X24:
601 	case MEDIA_BUS_FMT_RGB666_1X18:
602 	case MEDIA_BUS_FMT_FIXED:
603 		input_fmt = MEDIA_BUS_FMT_RGB888_1X24;
604 		break;
605 	case MEDIA_BUS_FMT_RGB565_1X16:
606 		input_fmt = output_fmt;
607 		break;
608 	default:
609 		return NULL;
610 	}
611 
612 	input_fmts = kmalloc(sizeof(*input_fmts), GFP_KERNEL);
613 	if (!input_fmts)
614 		return NULL;
615 	input_fmts[0] = input_fmt;
616 	*num_input_fmts = 1;
617 
618 	return input_fmts;
619 }
620 
621 static int imx93_dsi_phy_init(void *priv_data)
622 {
623 	struct imx93_dsi *dsi = priv_data;
624 	unsigned int fmt = 0;
625 	int ret;
626 
627 	switch (dsi->format) {
628 	case MIPI_DSI_FMT_RGB888:
629 		fmt = RGB888_TO_RGB888;
630 		break;
631 	case MIPI_DSI_FMT_RGB666:
632 		fmt = RGB888_TO_RGB666;
633 		regmap_update_bits(dsi->regmap, DISPLAY_MUX,
634 				   MIPI_DSI_RGB666_MAP_CFG, RGB666_CONFIG2);
635 		break;
636 	case MIPI_DSI_FMT_RGB666_PACKED:
637 		fmt = RGB888_TO_RGB666;
638 		regmap_update_bits(dsi->regmap, DISPLAY_MUX,
639 				   MIPI_DSI_RGB666_MAP_CFG, RGB666_CONFIG1);
640 		break;
641 	case MIPI_DSI_FMT_RGB565:
642 		fmt = RGB565_TO_RGB565;
643 		regmap_update_bits(dsi->regmap, DISPLAY_MUX,
644 				   MIPI_DSI_RGB565_MAP_CFG, RGB565_CONFIG1);
645 		break;
646 	}
647 
648 	regmap_update_bits(dsi->regmap, DISPLAY_MUX, LCDIF_CROSS_LINE_PATTERN, fmt);
649 
650 	ret = dphy_pll_init(dsi);
651 	if (ret < 0) {
652 		dev_err(dsi->dev, "failed to init phy pll: %d\n", ret);
653 		return ret;
654 	}
655 
656 	ret = dphy_pll_configure(dsi, &dsi->phy_cfg);
657 	if (ret < 0) {
658 		dev_err(dsi->dev, "failed to configure phy pll: %d\n", ret);
659 		dphy_pll_uninit(dsi);
660 		return ret;
661 	}
662 
663 	return 0;
664 }
665 
666 static void imx93_dsi_phy_power_off(void *priv_data)
667 {
668 	struct imx93_dsi *dsi = priv_data;
669 
670 	dphy_pll_power_off(dsi);
671 	dphy_pll_uninit(dsi);
672 }
673 
674 static int
675 imx93_dsi_get_lane_mbps(void *priv_data, const struct drm_display_mode *mode,
676 			unsigned long mode_flags, u32 lanes, u32 format,
677 			unsigned int *lane_mbps)
678 {
679 	struct imx93_dsi *dsi = priv_data;
680 	union phy_configure_opts phy_cfg;
681 	struct device *dev = dsi->dev;
682 	int ret;
683 
684 	ret = imx93_dsi_get_phy_configure_opts(dsi, mode, &phy_cfg, lanes,
685 					       format);
686 	if (ret < 0) {
687 		dev_dbg(dev, "failed to get phy cfg opts %d\n", ret);
688 		return ret;
689 	}
690 
691 	*lane_mbps = DIV_ROUND_UP(phy_cfg.mipi_dphy.hs_clk_rate, USEC_PER_SEC);
692 
693 	memcpy(&dsi->phy_cfg, &phy_cfg, sizeof(phy_cfg));
694 
695 	dev_dbg(dev, "get lane_mbps %u for mode " DRM_MODE_FMT "\n",
696 		*lane_mbps, DRM_MODE_ARG(mode));
697 
698 	return 0;
699 }
700 
701 /* High-Speed Transition Times */
702 struct hstt {
703 	unsigned int maxfreq;
704 	struct dw_mipi_dsi_dphy_timing timing;
705 };
706 
707 #define HSTT(_maxfreq, _c_lp2hs, _c_hs2lp, _d_lp2hs, _d_hs2lp)	\
708 {								\
709 	.maxfreq = (_maxfreq),					\
710 	.timing = {						\
711 		.clk_lp2hs = (_c_lp2hs),			\
712 		.clk_hs2lp = (_c_hs2lp),			\
713 		.data_lp2hs = (_d_lp2hs),			\
714 		.data_hs2lp = (_d_hs2lp),			\
715 	}							\
716 }
717 
718 /* DPHY Databook Table A-4 High-Speed Transition Times */
719 static const struct hstt hstt_table[] = {
720 	HSTT(80,    21,  17,  15, 10),
721 	HSTT(90,    23,  17,  16, 10),
722 	HSTT(100,   22,  17,  16, 10),
723 	HSTT(110,   25,  18,  17, 11),
724 	HSTT(120,   26,  20,  18, 11),
725 	HSTT(130,   27,  19,  19, 11),
726 	HSTT(140,   27,  19,  19, 11),
727 	HSTT(150,   28,  20,  20, 12),
728 	HSTT(160,   30,  21,  22, 13),
729 	HSTT(170,   30,  21,  23, 13),
730 	HSTT(180,   31,  21,  23, 13),
731 	HSTT(190,   32,  22,  24, 13),
732 	HSTT(205,   35,  22,  25, 13),
733 	HSTT(220,   37,  26,  27, 15),
734 	HSTT(235,   38,  28,  27, 16),
735 	HSTT(250,   41,  29,  30, 17),
736 	HSTT(275,   43,  29,  32, 18),
737 	HSTT(300,   45,  32,  35, 19),
738 	HSTT(325,   48,  33,  36, 18),
739 	HSTT(350,   51,  35,  40, 20),
740 	HSTT(400,   59,  37,  44, 21),
741 	HSTT(450,   65,  40,  49, 23),
742 	HSTT(500,   71,  41,  54, 24),
743 	HSTT(550,   77,  44,  57, 26),
744 	HSTT(600,   82,  46,  64, 27),
745 	HSTT(650,   87,  48,  67, 28),
746 	HSTT(700,   94,  52,  71, 29),
747 	HSTT(750,   99,  52,  75, 31),
748 	HSTT(800,  105,  55,  82, 32),
749 	HSTT(850,  110,  58,  85, 32),
750 	HSTT(900,  115,  58,  88, 35),
751 	HSTT(950,  120,  62,  93, 36),
752 	HSTT(1000, 128,  63,  99, 38),
753 	HSTT(1050, 132,  65, 102, 38),
754 	HSTT(1100, 138,  67, 106, 39),
755 	HSTT(1150, 146,  69, 112, 42),
756 	HSTT(1200, 151,  71, 117, 43),
757 	HSTT(1250, 153,  74, 120, 45),
758 	HSTT(1300, 160,  73, 124, 46),
759 	HSTT(1350, 165,  76, 130, 47),
760 	HSTT(1400, 172,  78, 134, 49),
761 	HSTT(1450, 177,  80, 138, 49),
762 	HSTT(1500, 183,  81, 143, 52),
763 	HSTT(1550, 191,  84, 147, 52),
764 	HSTT(1600, 194,  85, 152, 52),
765 	HSTT(1650, 201,  86, 155, 53),
766 	HSTT(1700, 208,  88, 161, 53),
767 	HSTT(1750, 212,  89, 165, 53),
768 	HSTT(1800, 220,  90, 171, 54),
769 	HSTT(1850, 223,  92, 175, 54),
770 	HSTT(1900, 231,  91, 180, 55),
771 	HSTT(1950, 236,  95, 185, 56),
772 	HSTT(2000, 243,  97, 190, 56),
773 	HSTT(2050, 248,  99, 194, 58),
774 	HSTT(2100, 252, 100, 199, 59),
775 	HSTT(2150, 259, 102, 204, 61),
776 	HSTT(2200, 266, 105, 210, 62),
777 	HSTT(2250, 269, 109, 213, 63),
778 	HSTT(2300, 272, 109, 217, 65),
779 	HSTT(2350, 281, 112, 225, 66),
780 	HSTT(2400, 283, 115, 226, 66),
781 	HSTT(2450, 282, 115, 226, 67),
782 	HSTT(2500, 281, 118, 227, 67),
783 };
784 
785 static int imx93_dsi_phy_get_timing(void *priv_data, unsigned int lane_mbps,
786 				    struct dw_mipi_dsi_dphy_timing *timing)
787 {
788 	struct imx93_dsi *dsi = priv_data;
789 	struct device *dev = dsi->dev;
790 	int i;
791 
792 	for (i = 0; i < ARRAY_SIZE(hstt_table); i++)
793 		if (lane_mbps <= hstt_table[i].maxfreq)
794 			break;
795 
796 	if (i == ARRAY_SIZE(hstt_table)) {
797 		dev_err(dev, "failed to get phy timing for lane_mbps %u\n",
798 			lane_mbps);
799 		return -EINVAL;
800 	}
801 
802 	*timing = hstt_table[i].timing;
803 
804 	dev_dbg(dev, "get phy timing for %u <= %u (lane_mbps)\n",
805 		lane_mbps, hstt_table[i].maxfreq);
806 
807 	return 0;
808 }
809 
810 static const struct dw_mipi_dsi_phy_ops imx93_dsi_phy_ops = {
811 	.init = imx93_dsi_phy_init,
812 	.power_off = imx93_dsi_phy_power_off,
813 	.get_lane_mbps = imx93_dsi_get_lane_mbps,
814 	.get_timing = imx93_dsi_phy_get_timing,
815 };
816 
817 static int imx93_dsi_host_attach(void *priv_data, struct mipi_dsi_device *device)
818 {
819 	struct imx93_dsi *dsi = priv_data;
820 
821 	dsi->format = device->format;
822 
823 	return 0;
824 }
825 
826 static const struct dw_mipi_dsi_host_ops imx93_dsi_host_ops = {
827 	.attach = imx93_dsi_host_attach,
828 };
829 
830 static int imx93_dsi_probe(struct platform_device *pdev)
831 {
832 	struct device *dev = &pdev->dev;
833 	struct device_node *np = dev->of_node;
834 	struct imx93_dsi *dsi;
835 	int ret;
836 
837 	dsi = devm_kzalloc(dev, sizeof(*dsi), GFP_KERNEL);
838 	if (!dsi)
839 		return -ENOMEM;
840 
841 	dsi->regmap = syscon_regmap_lookup_by_phandle(np, "fsl,media-blk-ctrl");
842 	if (IS_ERR(dsi->regmap)) {
843 		ret = PTR_ERR(dsi->regmap);
844 		dev_err(dev, "failed to get block ctrl regmap: %d\n", ret);
845 		return ret;
846 	}
847 
848 	dsi->clk_pixel = devm_clk_get(dev, "pix");
849 	if (IS_ERR(dsi->clk_pixel))
850 		return dev_err_probe(dev, PTR_ERR(dsi->clk_pixel),
851 				     "failed to get pixel clock\n");
852 
853 	dsi->clk_cfg = devm_clk_get(dev, "phy_cfg");
854 	if (IS_ERR(dsi->clk_cfg))
855 		return dev_err_probe(dev, PTR_ERR(dsi->clk_cfg),
856 				     "failed to get phy cfg clock\n");
857 
858 	dsi->clk_ref = devm_clk_get(dev, "phy_ref");
859 	if (IS_ERR(dsi->clk_ref))
860 		return dev_err_probe(dev, PTR_ERR(dsi->clk_ref),
861 				     "failed to get phy ref clock\n");
862 
863 	dsi->ref_clk_rate = clk_get_rate(dsi->clk_ref);
864 	if (dsi->ref_clk_rate < REF_CLK_RATE_MIN ||
865 	    dsi->ref_clk_rate > REF_CLK_RATE_MAX) {
866 		dev_err(dev, "invalid phy ref clock rate %lu\n",
867 			dsi->ref_clk_rate);
868 		return -EINVAL;
869 	}
870 	dev_dbg(dev, "phy ref clock rate: %lu\n", dsi->ref_clk_rate);
871 
872 	dsi->dev = dev;
873 	dsi->pdata.max_data_lanes = 4;
874 	dsi->pdata.mode_valid = imx93_dsi_mode_valid;
875 	dsi->pdata.mode_fixup = imx93_dsi_mode_fixup;
876 	dsi->pdata.get_input_bus_fmts = imx93_dsi_get_input_bus_fmts;
877 	dsi->pdata.phy_ops = &imx93_dsi_phy_ops;
878 	dsi->pdata.host_ops = &imx93_dsi_host_ops;
879 	dsi->pdata.priv_data = dsi;
880 	platform_set_drvdata(pdev, dsi);
881 
882 	dsi->dmd = dw_mipi_dsi_probe(pdev, &dsi->pdata);
883 	if (IS_ERR(dsi->dmd))
884 		return dev_err_probe(dev, PTR_ERR(dsi->dmd),
885 				     "failed to probe dw_mipi_dsi\n");
886 
887 	return 0;
888 }
889 
890 static void imx93_dsi_remove(struct platform_device *pdev)
891 {
892 	struct imx93_dsi *dsi = platform_get_drvdata(pdev);
893 
894 	dw_mipi_dsi_remove(dsi->dmd);
895 }
896 
897 static const struct of_device_id imx93_dsi_dt_ids[] = {
898 	{ .compatible = "fsl,imx93-mipi-dsi", },
899 	{ /* sentinel */ }
900 };
901 MODULE_DEVICE_TABLE(of, imx93_dsi_dt_ids);
902 
903 static struct platform_driver imx93_dsi_driver = {
904 	.probe	= imx93_dsi_probe,
905 	.remove = imx93_dsi_remove,
906 	.driver	= {
907 		.of_match_table = imx93_dsi_dt_ids,
908 		.name = "imx93_mipi_dsi",
909 	},
910 };
911 module_platform_driver(imx93_dsi_driver);
912 
913 MODULE_DESCRIPTION("Freescale i.MX93 MIPI DSI driver");
914 MODULE_AUTHOR("Liu Ying <victor.liu@nxp.com>");
915 MODULE_LICENSE("GPL");
916