xref: /linux/drivers/gpu/drm/bridge/imx/imx93-mipi-dsi.c (revision 3df692169e8486fc3dd91fcd5ea81c27a0bac033)
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;
230 	unsigned long m, best_m;
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 *bridge = dw_mipi_dsi_get_bridge(dsi->dmd);
496 
497 	/* Get the last bridge */
498 	while (drm_bridge_get_next_bridge(bridge))
499 		bridge = drm_bridge_get_next_bridge(bridge);
500 
501 	if ((bridge->ops & DRM_BRIDGE_OP_DETECT) &&
502 	    (bridge->ops & DRM_BRIDGE_OP_EDID)) {
503 		unsigned long pixel_clock_rate = mode->clock * 1000;
504 		unsigned long rounded_rate;
505 
506 		/* Allow +/-0.5% pixel clock rate deviation */
507 		rounded_rate = clk_round_rate(dsi->clk_pixel, pixel_clock_rate);
508 		if (rounded_rate < pixel_clock_rate * 995 / 1000 ||
509 		    rounded_rate > pixel_clock_rate * 1005 / 1000) {
510 			dev_dbg(dsi->dev, "failed to round clock for mode " DRM_MODE_FMT "\n",
511 				DRM_MODE_ARG(mode));
512 			return MODE_NOCLOCK;
513 		}
514 	}
515 
516 	return MODE_OK;
517 }
518 
519 static enum drm_mode_status
520 imx93_dsi_validate_phy(struct imx93_dsi *dsi, const struct drm_display_mode *mode,
521 		       unsigned long mode_flags, u32 lanes, u32 format)
522 {
523 	union phy_configure_opts phy_cfg;
524 	struct dphy_pll_cfg cfg = { 0 };
525 	struct device *dev = dsi->dev;
526 	int ret;
527 
528 	ret = imx93_dsi_get_phy_configure_opts(dsi, mode, &phy_cfg, lanes,
529 					       format);
530 	if (ret < 0) {
531 		dev_dbg(dev, "failed to get phy cfg opts %d\n", ret);
532 		return MODE_ERROR;
533 	}
534 
535 	ret = dphy_pll_get_configure_from_opts(dsi, &phy_cfg.mipi_dphy, &cfg);
536 	if (ret < 0) {
537 		dev_dbg(dev, "failed to get phy pll cfg %d\n", ret);
538 		return MODE_NOCLOCK;
539 	}
540 
541 	return MODE_OK;
542 }
543 
544 static enum drm_mode_status
545 imx93_dsi_mode_valid(void *priv_data, const struct drm_display_mode *mode,
546 		     unsigned long mode_flags, u32 lanes, u32 format)
547 {
548 	struct imx93_dsi *dsi = priv_data;
549 	struct device *dev = dsi->dev;
550 	enum drm_mode_status ret;
551 
552 	ret = imx93_dsi_validate_mode(dsi, mode);
553 	if (ret != MODE_OK) {
554 		dev_dbg(dev, "failed to validate mode " DRM_MODE_FMT "\n",
555 			DRM_MODE_ARG(mode));
556 		return ret;
557 	}
558 
559 	ret = imx93_dsi_validate_phy(dsi, mode, mode_flags, lanes, format);
560 	if (ret != MODE_OK) {
561 		dev_dbg(dev, "failed to validate phy for mode " DRM_MODE_FMT "\n",
562 			DRM_MODE_ARG(mode));
563 		return ret;
564 	}
565 
566 	return MODE_OK;
567 }
568 
569 static bool imx93_dsi_mode_fixup(void *priv_data,
570 				 const struct drm_display_mode *mode,
571 				 struct drm_display_mode *adjusted_mode)
572 {
573 	struct imx93_dsi *dsi = priv_data;
574 	unsigned long pixel_clock_rate;
575 	unsigned long rounded_rate;
576 
577 	pixel_clock_rate = mode->clock * 1000;
578 	rounded_rate = clk_round_rate(dsi->clk_pixel, pixel_clock_rate);
579 
580 	memcpy(adjusted_mode, mode, sizeof(*mode));
581 	adjusted_mode->clock = rounded_rate / 1000;
582 
583 	dev_dbg(dsi->dev, "adj clock %d for mode " DRM_MODE_FMT "\n",
584 		adjusted_mode->clock, DRM_MODE_ARG(mode));
585 
586 	return true;
587 }
588 
589 static u32 *imx93_dsi_get_input_bus_fmts(void *priv_data,
590 					 struct drm_bridge *bridge,
591 					 struct drm_bridge_state *bridge_state,
592 					 struct drm_crtc_state *crtc_state,
593 					 struct drm_connector_state *conn_state,
594 					 u32 output_fmt,
595 					 unsigned int *num_input_fmts)
596 {
597 	u32 *input_fmts, input_fmt;
598 
599 	*num_input_fmts = 0;
600 
601 	switch (output_fmt) {
602 	case MEDIA_BUS_FMT_RGB888_1X24:
603 	case MEDIA_BUS_FMT_RGB666_1X18:
604 	case MEDIA_BUS_FMT_FIXED:
605 		input_fmt = MEDIA_BUS_FMT_RGB888_1X24;
606 		break;
607 	case MEDIA_BUS_FMT_RGB565_1X16:
608 		input_fmt = output_fmt;
609 		break;
610 	default:
611 		return NULL;
612 	}
613 
614 	input_fmts = kmalloc(sizeof(*input_fmts), GFP_KERNEL);
615 	if (!input_fmts)
616 		return NULL;
617 	input_fmts[0] = input_fmt;
618 	*num_input_fmts = 1;
619 
620 	return input_fmts;
621 }
622 
623 static int imx93_dsi_phy_init(void *priv_data)
624 {
625 	struct imx93_dsi *dsi = priv_data;
626 	unsigned int fmt = 0;
627 	int ret;
628 
629 	switch (dsi->format) {
630 	case MIPI_DSI_FMT_RGB888:
631 		fmt = RGB888_TO_RGB888;
632 		break;
633 	case MIPI_DSI_FMT_RGB666:
634 		fmt = RGB888_TO_RGB666;
635 		regmap_update_bits(dsi->regmap, DISPLAY_MUX,
636 				   MIPI_DSI_RGB666_MAP_CFG, RGB666_CONFIG2);
637 		break;
638 	case MIPI_DSI_FMT_RGB666_PACKED:
639 		fmt = RGB888_TO_RGB666;
640 		regmap_update_bits(dsi->regmap, DISPLAY_MUX,
641 				   MIPI_DSI_RGB666_MAP_CFG, RGB666_CONFIG1);
642 		break;
643 	case MIPI_DSI_FMT_RGB565:
644 		fmt = RGB565_TO_RGB565;
645 		regmap_update_bits(dsi->regmap, DISPLAY_MUX,
646 				   MIPI_DSI_RGB565_MAP_CFG, RGB565_CONFIG1);
647 		break;
648 	}
649 
650 	regmap_update_bits(dsi->regmap, DISPLAY_MUX, LCDIF_CROSS_LINE_PATTERN, fmt);
651 
652 	ret = dphy_pll_init(dsi);
653 	if (ret < 0) {
654 		dev_err(dsi->dev, "failed to init phy pll: %d\n", ret);
655 		return ret;
656 	}
657 
658 	ret = dphy_pll_configure(dsi, &dsi->phy_cfg);
659 	if (ret < 0) {
660 		dev_err(dsi->dev, "failed to configure phy pll: %d\n", ret);
661 		dphy_pll_uninit(dsi);
662 		return ret;
663 	}
664 
665 	return 0;
666 }
667 
668 static void imx93_dsi_phy_power_off(void *priv_data)
669 {
670 	struct imx93_dsi *dsi = priv_data;
671 
672 	dphy_pll_power_off(dsi);
673 	dphy_pll_uninit(dsi);
674 }
675 
676 static int
677 imx93_dsi_get_lane_mbps(void *priv_data, const struct drm_display_mode *mode,
678 			unsigned long mode_flags, u32 lanes, u32 format,
679 			unsigned int *lane_mbps)
680 {
681 	struct imx93_dsi *dsi = priv_data;
682 	union phy_configure_opts phy_cfg;
683 	struct device *dev = dsi->dev;
684 	int ret;
685 
686 	ret = imx93_dsi_get_phy_configure_opts(dsi, mode, &phy_cfg, lanes,
687 					       format);
688 	if (ret < 0) {
689 		dev_dbg(dev, "failed to get phy cfg opts %d\n", ret);
690 		return ret;
691 	}
692 
693 	*lane_mbps = DIV_ROUND_UP(phy_cfg.mipi_dphy.hs_clk_rate, USEC_PER_SEC);
694 
695 	memcpy(&dsi->phy_cfg, &phy_cfg, sizeof(phy_cfg));
696 
697 	dev_dbg(dev, "get lane_mbps %u for mode " DRM_MODE_FMT "\n",
698 		*lane_mbps, DRM_MODE_ARG(mode));
699 
700 	return 0;
701 }
702 
703 /* High-Speed Transition Times */
704 struct hstt {
705 	unsigned int maxfreq;
706 	struct dw_mipi_dsi_dphy_timing timing;
707 };
708 
709 #define HSTT(_maxfreq, _c_lp2hs, _c_hs2lp, _d_lp2hs, _d_hs2lp)	\
710 {								\
711 	.maxfreq = (_maxfreq),					\
712 	.timing = {						\
713 		.clk_lp2hs = (_c_lp2hs),			\
714 		.clk_hs2lp = (_c_hs2lp),			\
715 		.data_lp2hs = (_d_lp2hs),			\
716 		.data_hs2lp = (_d_hs2lp),			\
717 	}							\
718 }
719 
720 /* DPHY Databook Table A-4 High-Speed Transition Times */
721 static const struct hstt hstt_table[] = {
722 	HSTT(80,    21,  17,  15, 10),
723 	HSTT(90,    23,  17,  16, 10),
724 	HSTT(100,   22,  17,  16, 10),
725 	HSTT(110,   25,  18,  17, 11),
726 	HSTT(120,   26,  20,  18, 11),
727 	HSTT(130,   27,  19,  19, 11),
728 	HSTT(140,   27,  19,  19, 11),
729 	HSTT(150,   28,  20,  20, 12),
730 	HSTT(160,   30,  21,  22, 13),
731 	HSTT(170,   30,  21,  23, 13),
732 	HSTT(180,   31,  21,  23, 13),
733 	HSTT(190,   32,  22,  24, 13),
734 	HSTT(205,   35,  22,  25, 13),
735 	HSTT(220,   37,  26,  27, 15),
736 	HSTT(235,   38,  28,  27, 16),
737 	HSTT(250,   41,  29,  30, 17),
738 	HSTT(275,   43,  29,  32, 18),
739 	HSTT(300,   45,  32,  35, 19),
740 	HSTT(325,   48,  33,  36, 18),
741 	HSTT(350,   51,  35,  40, 20),
742 	HSTT(400,   59,  37,  44, 21),
743 	HSTT(450,   65,  40,  49, 23),
744 	HSTT(500,   71,  41,  54, 24),
745 	HSTT(550,   77,  44,  57, 26),
746 	HSTT(600,   82,  46,  64, 27),
747 	HSTT(650,   87,  48,  67, 28),
748 	HSTT(700,   94,  52,  71, 29),
749 	HSTT(750,   99,  52,  75, 31),
750 	HSTT(800,  105,  55,  82, 32),
751 	HSTT(850,  110,  58,  85, 32),
752 	HSTT(900,  115,  58,  88, 35),
753 	HSTT(950,  120,  62,  93, 36),
754 	HSTT(1000, 128,  63,  99, 38),
755 	HSTT(1050, 132,  65, 102, 38),
756 	HSTT(1100, 138,  67, 106, 39),
757 	HSTT(1150, 146,  69, 112, 42),
758 	HSTT(1200, 151,  71, 117, 43),
759 	HSTT(1250, 153,  74, 120, 45),
760 	HSTT(1300, 160,  73, 124, 46),
761 	HSTT(1350, 165,  76, 130, 47),
762 	HSTT(1400, 172,  78, 134, 49),
763 	HSTT(1450, 177,  80, 138, 49),
764 	HSTT(1500, 183,  81, 143, 52),
765 	HSTT(1550, 191,  84, 147, 52),
766 	HSTT(1600, 194,  85, 152, 52),
767 	HSTT(1650, 201,  86, 155, 53),
768 	HSTT(1700, 208,  88, 161, 53),
769 	HSTT(1750, 212,  89, 165, 53),
770 	HSTT(1800, 220,  90, 171, 54),
771 	HSTT(1850, 223,  92, 175, 54),
772 	HSTT(1900, 231,  91, 180, 55),
773 	HSTT(1950, 236,  95, 185, 56),
774 	HSTT(2000, 243,  97, 190, 56),
775 	HSTT(2050, 248,  99, 194, 58),
776 	HSTT(2100, 252, 100, 199, 59),
777 	HSTT(2150, 259, 102, 204, 61),
778 	HSTT(2200, 266, 105, 210, 62),
779 	HSTT(2250, 269, 109, 213, 63),
780 	HSTT(2300, 272, 109, 217, 65),
781 	HSTT(2350, 281, 112, 225, 66),
782 	HSTT(2400, 283, 115, 226, 66),
783 	HSTT(2450, 282, 115, 226, 67),
784 	HSTT(2500, 281, 118, 227, 67),
785 };
786 
787 static int imx93_dsi_phy_get_timing(void *priv_data, unsigned int lane_mbps,
788 				    struct dw_mipi_dsi_dphy_timing *timing)
789 {
790 	struct imx93_dsi *dsi = priv_data;
791 	struct device *dev = dsi->dev;
792 	int i;
793 
794 	for (i = 0; i < ARRAY_SIZE(hstt_table); i++)
795 		if (lane_mbps <= hstt_table[i].maxfreq)
796 			break;
797 
798 	if (i == ARRAY_SIZE(hstt_table)) {
799 		dev_err(dev, "failed to get phy timing for lane_mbps %u\n",
800 			lane_mbps);
801 		return -EINVAL;
802 	}
803 
804 	*timing = hstt_table[i].timing;
805 
806 	dev_dbg(dev, "get phy timing for %u <= %u (lane_mbps)\n",
807 		lane_mbps, hstt_table[i].maxfreq);
808 
809 	return 0;
810 }
811 
812 static const struct dw_mipi_dsi_phy_ops imx93_dsi_phy_ops = {
813 	.init = imx93_dsi_phy_init,
814 	.power_off = imx93_dsi_phy_power_off,
815 	.get_lane_mbps = imx93_dsi_get_lane_mbps,
816 	.get_timing = imx93_dsi_phy_get_timing,
817 };
818 
819 static int imx93_dsi_host_attach(void *priv_data, struct mipi_dsi_device *device)
820 {
821 	struct imx93_dsi *dsi = priv_data;
822 
823 	dsi->format = device->format;
824 
825 	return 0;
826 }
827 
828 static const struct dw_mipi_dsi_host_ops imx93_dsi_host_ops = {
829 	.attach = imx93_dsi_host_attach,
830 };
831 
832 static int imx93_dsi_probe(struct platform_device *pdev)
833 {
834 	struct device *dev = &pdev->dev;
835 	struct device_node *np = dev->of_node;
836 	struct imx93_dsi *dsi;
837 	int ret;
838 
839 	dsi = devm_kzalloc(dev, sizeof(*dsi), GFP_KERNEL);
840 	if (!dsi)
841 		return -ENOMEM;
842 
843 	dsi->regmap = syscon_regmap_lookup_by_phandle(np, "fsl,media-blk-ctrl");
844 	if (IS_ERR(dsi->regmap)) {
845 		ret = PTR_ERR(dsi->regmap);
846 		dev_err(dev, "failed to get block ctrl regmap: %d\n", ret);
847 		return ret;
848 	}
849 
850 	dsi->clk_pixel = devm_clk_get(dev, "pix");
851 	if (IS_ERR(dsi->clk_pixel))
852 		return dev_err_probe(dev, PTR_ERR(dsi->clk_pixel),
853 				     "failed to get pixel clock\n");
854 
855 	dsi->clk_cfg = devm_clk_get(dev, "phy_cfg");
856 	if (IS_ERR(dsi->clk_cfg))
857 		return dev_err_probe(dev, PTR_ERR(dsi->clk_cfg),
858 				     "failed to get phy cfg clock\n");
859 
860 	dsi->clk_ref = devm_clk_get(dev, "phy_ref");
861 	if (IS_ERR(dsi->clk_ref))
862 		return dev_err_probe(dev, PTR_ERR(dsi->clk_ref),
863 				     "failed to get phy ref clock\n");
864 
865 	dsi->ref_clk_rate = clk_get_rate(dsi->clk_ref);
866 	if (dsi->ref_clk_rate < REF_CLK_RATE_MIN ||
867 	    dsi->ref_clk_rate > REF_CLK_RATE_MAX) {
868 		dev_err(dev, "invalid phy ref clock rate %lu\n",
869 			dsi->ref_clk_rate);
870 		return -EINVAL;
871 	}
872 	dev_dbg(dev, "phy ref clock rate: %lu\n", dsi->ref_clk_rate);
873 
874 	dsi->dev = dev;
875 	dsi->pdata.max_data_lanes = 4;
876 	dsi->pdata.mode_valid = imx93_dsi_mode_valid;
877 	dsi->pdata.mode_fixup = imx93_dsi_mode_fixup;
878 	dsi->pdata.get_input_bus_fmts = imx93_dsi_get_input_bus_fmts;
879 	dsi->pdata.phy_ops = &imx93_dsi_phy_ops;
880 	dsi->pdata.host_ops = &imx93_dsi_host_ops;
881 	dsi->pdata.priv_data = dsi;
882 	platform_set_drvdata(pdev, dsi);
883 
884 	dsi->dmd = dw_mipi_dsi_probe(pdev, &dsi->pdata);
885 	if (IS_ERR(dsi->dmd))
886 		return dev_err_probe(dev, PTR_ERR(dsi->dmd),
887 				     "failed to probe dw_mipi_dsi\n");
888 
889 	return 0;
890 }
891 
892 static void imx93_dsi_remove(struct platform_device *pdev)
893 {
894 	struct imx93_dsi *dsi = platform_get_drvdata(pdev);
895 
896 	dw_mipi_dsi_remove(dsi->dmd);
897 }
898 
899 static const struct of_device_id imx93_dsi_dt_ids[] = {
900 	{ .compatible = "fsl,imx93-mipi-dsi", },
901 	{ /* sentinel */ }
902 };
903 MODULE_DEVICE_TABLE(of, imx93_dsi_dt_ids);
904 
905 static struct platform_driver imx93_dsi_driver = {
906 	.probe	= imx93_dsi_probe,
907 	.remove_new = imx93_dsi_remove,
908 	.driver	= {
909 		.of_match_table = imx93_dsi_dt_ids,
910 		.name = "imx93_mipi_dsi",
911 	},
912 };
913 module_platform_driver(imx93_dsi_driver);
914 
915 MODULE_DESCRIPTION("Freescale i.MX93 MIPI DSI driver");
916 MODULE_AUTHOR("Liu Ying <victor.liu@nxp.com>");
917 MODULE_LICENSE("GPL");
918