blob: 19b6ca29d3eea8357b739f45d4154357f6390e50 [file] [log] [blame]
Svyatoslav Ryhelef1e26b2024-01-31 08:57:17 +02001// SPDX-License-Identifier: GPL-2.0
2/*
3 * Copyright (C) 2020 Texas Instruments Incorporated
4 * Copyright (C) 2022 Svyatoslav Ryhel <clamor95@gmail.com>
5 */
6
7#include <clk.h>
8#include <dm.h>
9#include <i2c.h>
10#include <log.h>
11#include <mipi_display.h>
12#include <mipi_dsi.h>
13#include <backlight.h>
14#include <panel.h>
15#include <linux/delay.h>
16#include <linux/err.h>
17#include <linux/kernel.h>
18#include <linux/math64.h>
19#include <power/regulator.h>
20
21#include <asm/gpio.h>
22
23/* Global (16-bit addressable) */
24#define TC358768_CHIPID 0x0000
25#define TC358768_SYSCTL 0x0002
26#define TC358768_CONFCTL 0x0004
27#define TC358768_VSDLY 0x0006
28#define TC358768_DATAFMT 0x0008
29#define TC358768_GPIOEN 0x000E
30#define TC358768_GPIODIR 0x0010
31#define TC358768_GPIOIN 0x0012
32#define TC358768_GPIOOUT 0x0014
33#define TC358768_PLLCTL0 0x0016
34#define TC358768_PLLCTL1 0x0018
35#define TC358768_CMDBYTE 0x0022
36#define TC358768_PP_MISC 0x0032
37#define TC358768_DSITX_DT 0x0050
38#define TC358768_FIFOSTATUS 0x00F8
39
40/* Debug (16-bit addressable) */
41#define TC358768_VBUFCTRL 0x00E0
42#define TC358768_DBG_WIDTH 0x00E2
43#define TC358768_DBG_VBLANK 0x00E4
44#define TC358768_DBG_DATA 0x00E8
45
46/* TX PHY (32-bit addressable) */
47#define TC358768_CLW_DPHYCONTTX 0x0100
48#define TC358768_D0W_DPHYCONTTX 0x0104
49#define TC358768_D1W_DPHYCONTTX 0x0108
50#define TC358768_D2W_DPHYCONTTX 0x010C
51#define TC358768_D3W_DPHYCONTTX 0x0110
52#define TC358768_CLW_CNTRL 0x0140
53#define TC358768_D0W_CNTRL 0x0144
54#define TC358768_D1W_CNTRL 0x0148
55#define TC358768_D2W_CNTRL 0x014C
56#define TC358768_D3W_CNTRL 0x0150
57
58/* TX PPI (32-bit addressable) */
59#define TC358768_STARTCNTRL 0x0204
60#define TC358768_DSITXSTATUS 0x0208
61#define TC358768_LINEINITCNT 0x0210
62#define TC358768_LPTXTIMECNT 0x0214
63#define TC358768_TCLK_HEADERCNT 0x0218
64#define TC358768_TCLK_TRAILCNT 0x021C
65#define TC358768_THS_HEADERCNT 0x0220
66#define TC358768_TWAKEUP 0x0224
67#define TC358768_TCLK_POSTCNT 0x0228
68#define TC358768_THS_TRAILCNT 0x022C
69#define TC358768_HSTXVREGCNT 0x0230
70#define TC358768_HSTXVREGEN 0x0234
71#define TC358768_TXOPTIONCNTRL 0x0238
72#define TC358768_BTACNTRL1 0x023C
73
74/* TX CTRL (32-bit addressable) */
75#define TC358768_DSI_CONTROL 0x040C
76#define TC358768_DSI_STATUS 0x0410
77#define TC358768_DSI_INT 0x0414
78#define TC358768_DSI_INT_ENA 0x0418
79#define TC358768_DSICMD_RDFIFO 0x0430
80#define TC358768_DSI_ACKERR 0x0434
81#define TC358768_DSI_ACKERR_INTENA 0x0438
82#define TC358768_DSI_ACKERR_HALT 0x043c
83#define TC358768_DSI_RXERR 0x0440
84#define TC358768_DSI_RXERR_INTENA 0x0444
85#define TC358768_DSI_RXERR_HALT 0x0448
86#define TC358768_DSI_ERR 0x044C
87#define TC358768_DSI_ERR_INTENA 0x0450
88#define TC358768_DSI_ERR_HALT 0x0454
89#define TC358768_DSI_CONFW 0x0500
90#define TC358768_DSI_LPCMD 0x0500
91#define TC358768_DSI_RESET 0x0504
92#define TC358768_DSI_INT_CLR 0x050C
93#define TC358768_DSI_START 0x0518
94
95/* DSITX CTRL (16-bit addressable) */
96#define TC358768_DSICMD_TX 0x0600
97#define TC358768_DSICMD_TYPE 0x0602
98#define TC358768_DSICMD_WC 0x0604
99#define TC358768_DSICMD_WD0 0x0610
100#define TC358768_DSICMD_WD1 0x0612
101#define TC358768_DSICMD_WD2 0x0614
102#define TC358768_DSICMD_WD3 0x0616
103#define TC358768_DSI_EVENT 0x0620
104#define TC358768_DSI_VSW 0x0622
105#define TC358768_DSI_VBPR 0x0624
106#define TC358768_DSI_VACT 0x0626
107#define TC358768_DSI_HSW 0x0628
108#define TC358768_DSI_HBPR 0x062A
109#define TC358768_DSI_HACT 0x062C
110
111/* TC358768_DSI_CONTROL (0x040C) register */
112#define TC358768_DSI_CONTROL_DIS_MODE BIT(15)
113#define TC358768_DSI_CONTROL_TXMD BIT(7)
114#define TC358768_DSI_CONTROL_HSCKMD BIT(5)
115#define TC358768_DSI_CONTROL_EOTDIS BIT(0)
116
117/* TC358768_DSI_CONFW (0x0500) register */
118#define TC358768_DSI_CONFW_MODE_SET (5 << 29)
119#define TC358768_DSI_CONFW_MODE_CLR (6 << 29)
120#define TC358768_DSI_CONFW_ADDR_DSI_CONTROL (3 << 24)
121
122#define NANO 1000000000UL
123#define PICO 1000000000000ULL
124
125struct tc358768_priv {
126 struct mipi_dsi_host host;
127 struct mipi_dsi_device device;
128
129 struct udevice *panel;
130 struct display_timing timing;
131
132 struct udevice *vddc;
133 struct udevice *vddmipi;
134 struct udevice *vddio;
135
136 struct clk *refclk;
137
138 struct gpio_desc reset_gpio;
139
140 u32 pd_lines; /* number of Parallel Port Input Data Lines */
141 u32 dsi_lanes; /* number of DSI Lanes */
142
143 /* Parameters for PLL programming */
144 u32 fbd; /* PLL feedback divider */
145 u32 prd; /* PLL input divider */
146 u32 frs; /* PLL Freqency range for HSCK (post divider) */
147
148 u32 dsiclk; /* pll_clk / 2 */
149};
150
151static void tc358768_read(struct udevice *dev, u32 reg, u32 *val)
152{
153 int count;
154 u8 buf[4] = { 0, 0, 0, 0 };
155
156 /* 16-bit register? */
157 if (reg < 0x100 || reg >= 0x600)
158 count = 2;
159 else
160 count = 4;
161
162 dm_i2c_read(dev, reg, buf, count);
163 *val = (buf[0] << 8) | (buf[1] & 0xff) |
164 (buf[2] << 24) | (buf[3] << 16);
165
166 log_debug("%s 0x%04x >> 0x%08x\n",
167 __func__, reg, *val);
168}
169
170static void tc358768_write(struct udevice *dev, u32 reg, u32 val)
171{
172 int count;
173 u8 buf[4];
174
175 /* 16-bit register? */
176 if (reg < 0x100 || reg >= 0x600)
177 count = 2;
178 else
179 count = 4;
180
181 buf[0] = val >> 8;
182 buf[1] = val & 0xff;
183 buf[2] = val >> 24;
184 buf[3] = val >> 16;
185
186 log_debug("%s 0x%04x << 0x%08x\n",
187 __func__, reg, val);
188
189 dm_i2c_write(dev, reg, buf, count);
190}
191
192static void tc358768_update_bits(struct udevice *dev, u32 reg, u32 mask,
193 u32 val)
194{
195 u32 tmp, orig;
196
197 tc358768_read(dev, reg, &orig);
198
199 tmp = orig & ~mask;
200 tmp |= val & mask;
201 if (tmp != orig)
202 tc358768_write(dev, reg, tmp);
203}
204
205static ssize_t tc358768_dsi_host_transfer(struct mipi_dsi_host *host,
206 const struct mipi_dsi_msg *msg)
207{
208 struct udevice *dev = (struct udevice *)host->dev;
209 struct mipi_dsi_packet packet;
210 int ret;
211
212 if (msg->rx_len) {
213 log_debug("%s: MIPI rx is not supported\n", __func__);
214 return -EOPNOTSUPP;
215 }
216
217 if (msg->tx_len > 8) {
218 log_debug("%s: Maximum 8 byte MIPI tx is supported\n", __func__);
219 return -EOPNOTSUPP;
220 }
221
222 ret = mipi_dsi_create_packet(&packet, msg);
223 if (ret)
224 return ret;
225
226 if (mipi_dsi_packet_format_is_short(msg->type)) {
227 tc358768_write(dev, TC358768_DSICMD_TYPE,
228 (0x10 << 8) | (packet.header[0] & 0x3f));
229 tc358768_write(dev, TC358768_DSICMD_WC, 0);
230 tc358768_write(dev, TC358768_DSICMD_WD0,
231 (packet.header[2] << 8) | packet.header[1]);
232 } else {
233 int i;
234
235 tc358768_write(dev, TC358768_DSICMD_TYPE,
236 (0x40 << 8) | (packet.header[0] & 0x3f));
237 tc358768_write(dev, TC358768_DSICMD_WC, packet.payload_length);
238 for (i = 0; i < packet.payload_length; i += 2) {
239 u16 val = packet.payload[i];
240
241 if (i + 1 < packet.payload_length)
242 val |= packet.payload[i + 1] << 8;
243
244 tc358768_write(dev, TC358768_DSICMD_WD0 + i, val);
245 }
246 }
247
248 /* start transfer */
249 tc358768_write(dev, TC358768_DSICMD_TX, 1);
250
251 return packet.size;
252}
253
254static const struct mipi_dsi_host_ops tc358768_dsi_host_ops = {
255 .transfer = tc358768_dsi_host_transfer,
256};
257
258static void tc358768_sw_reset(struct udevice *dev)
259{
260 /* Assert Reset */
261 tc358768_write(dev, TC358768_SYSCTL, 1);
262 mdelay(5);
263
264 /* Release Reset, Exit Sleep */
265 tc358768_write(dev, TC358768_SYSCTL, 0);
266}
267
268static void tc358768_hw_enable(struct tc358768_priv *priv)
269{
270 int ret;
271
272 ret = clk_prepare_enable(priv->refclk);
273 if (ret)
274 log_debug("%s: error enabling refclk (%d)\n", __func__, ret);
275
276 ret = regulator_set_enable_if_allowed(priv->vddc, true);
277 if (ret)
278 log_debug("%s: error enabling vddc (%d)\n", __func__, ret);
279
280 ret = regulator_set_enable_if_allowed(priv->vddmipi, true);
281 if (ret)
282 log_debug("%s: error enabling vddmipi (%d)\n", __func__, ret);
283
284 mdelay(10);
285
286 ret = regulator_set_enable_if_allowed(priv->vddio, true);
287 if (ret)
288 log_debug("%s: error enabling vddio (%d)\n", __func__, ret);
289
290 mdelay(2);
291
292 /*
293 * The RESX is active low (GPIO_ACTIVE_LOW).
294 * DEASSERT (value = 0) the reset_gpio to enable the chip
295 */
296 ret = dm_gpio_set_value(&priv->reset_gpio, 0);
297 if (ret)
298 log_debug("%s: error changing reset-gpio (%d)\n", __func__, ret);
299
300 /* wait for encoder clocks to stabilize */
301 mdelay(2);
302}
303
304static u32 tc358768_pclk_to_pll(struct tc358768_priv *priv, u32 pclk)
305{
306 return (u32)div_u64((u64)pclk * priv->pd_lines, priv->dsi_lanes);
307}
308
309static int tc358768_calc_pll(struct tc358768_priv *priv,
310 struct display_timing *dt)
311{
312 static const u32 frs_limits[] = {
313 1000000000,
314 500000000,
315 250000000,
316 125000000,
317 62500000
318 };
319 unsigned long refclk;
320 u32 prd, target_pll, i, max_pll, min_pll;
321 u32 frs, best_diff, best_pll, best_prd, best_fbd;
322
323 target_pll = tc358768_pclk_to_pll(priv, dt->pixelclock.typ);
324
325 /* pll_clk = RefClk * FBD / PRD * (1 / (2^FRS)) */
326
327 for (i = 0; i < ARRAY_SIZE(frs_limits); i++)
328 if (target_pll >= frs_limits[i])
329 break;
330
331 if (i == ARRAY_SIZE(frs_limits) || i == 0)
332 return -EINVAL;
333
334 frs = i - 1;
335 max_pll = frs_limits[i - 1];
336 min_pll = frs_limits[i];
337
338 refclk = clk_get_rate(priv->refclk);
339
340 best_diff = UINT_MAX;
341 best_pll = 0;
342 best_prd = 0;
343 best_fbd = 0;
344
345 for (prd = 1; prd <= 16; ++prd) {
346 u32 divisor = prd * (1 << frs);
347 u32 fbd;
348
349 for (fbd = 1; fbd <= 512; ++fbd) {
350 u32 pll, diff, pll_in;
351
352 pll = (u32)div_u64((u64)refclk * fbd, divisor);
353
354 if (pll >= max_pll || pll < min_pll)
355 continue;
356
357 pll_in = (u32)div_u64((u64)refclk, prd);
358 if (pll_in < 4000000)
359 continue;
360
361 diff = max(pll, target_pll) - min(pll, target_pll);
362
363 if (diff < best_diff) {
364 best_diff = diff;
365 best_pll = pll;
366 best_prd = prd;
367 best_fbd = fbd;
368
369 if (best_diff == 0)
370 goto found;
371 }
372 }
373 }
374
375 if (best_diff == UINT_MAX) {
376 log_debug("%s: could not find suitable PLL setup\n", __func__);
377 return -EINVAL;
378 }
379
380found:
381 priv->fbd = best_fbd;
382 priv->prd = best_prd;
383 priv->frs = frs;
384 priv->dsiclk = best_pll / 2;
385
386 return 0;
387}
388
389static void tc358768_setup_pll(struct udevice *dev)
390{
391 struct tc358768_priv *priv = dev_get_priv(dev);
392 u32 fbd, prd, frs;
393 int ret;
394
395 ret = tc358768_calc_pll(priv, &priv->timing);
396 if (ret)
397 log_debug("%s: PLL calculation failed: %d\n", __func__, ret);
398
399 fbd = priv->fbd;
400 prd = priv->prd;
401 frs = priv->frs;
402
403 log_debug("%s: PLL: refclk %lu, fbd %u, prd %u, frs %u\n", __func__,
404 clk_get_rate(priv->refclk), fbd, prd, frs);
405 log_debug("%s: PLL: pll_clk: %u, DSIClk %u, HSByteClk %u\n", __func__,
406 priv->dsiclk * 2, priv->dsiclk, priv->dsiclk / 4);
407
408 /* PRD[15:12] FBD[8:0] */
409 tc358768_write(dev, TC358768_PLLCTL0, ((prd - 1) << 12) | (fbd - 1));
410
411 /* FRS[11:10] LBWS[9:8] CKEN[4] RESETB[1] EN[0] */
412 tc358768_write(dev, TC358768_PLLCTL1,
413 (frs << 10) | (0x2 << 8) | BIT(1) | BIT(0));
414
415 /* wait for lock */
416 mdelay(5);
417
418 /* FRS[11:10] LBWS[9:8] CKEN[4] PLL_CKEN[4] RESETB[1] EN[0] */
419 tc358768_write(dev, TC358768_PLLCTL1,
420 (frs << 10) | (0x2 << 8) | BIT(4) | BIT(1) | BIT(0));
421}
422
423static u32 tc358768_ns_to_cnt(u32 ns, u32 period_ps)
424{
425 return DIV_ROUND_UP(ns * 1000, period_ps);
426}
427
428static u32 tc358768_ps_to_ns(u32 ps)
429{
430 return ps / 1000;
431}
432
433static u32 tc358768_dpi_to_ns(u32 val, u32 pclk)
434{
435 return (u32)div_u64((u64)val * NANO, pclk);
436}
437
438/* Convert value in DPI pixel clock units to DSI byte count */
439static u32 tc358768_dpi_to_dsi_bytes(struct tc358768_priv *priv, u32 val)
440{
441 u64 m = (u64)val * priv->dsiclk / 4 * priv->dsi_lanes;
442 u64 n = priv->timing.pixelclock.typ;
443
444 return (u32)div_u64(m + n - 1, n);
445}
446
447static u32 tc358768_dsi_bytes_to_ns(struct tc358768_priv *priv, u32 val)
448{
449 u64 m = (u64)val * NANO;
450 u64 n = priv->dsiclk / 4 * priv->dsi_lanes;
451
452 return (u32)div_u64(m, n);
453}
454
455static int tc358768_attach(struct udevice *dev)
456{
457 struct tc358768_priv *priv = dev_get_priv(dev);
458 struct mipi_dsi_device *device = &priv->device;
459 struct display_timing *dt = &priv->timing;
460 u32 val, val2, lptxcnt, hact, data_type;
461 s32 raw_val;
462 u32 hsbyteclk_ps, dsiclk_ps, ui_ps;
463 u32 dsiclk, hsbyteclk;
464 int i;
465 /* In pixelclock units */
466 u32 dpi_htot, dpi_data_start;
467 /* In byte units */
468 u32 dsi_dpi_htot, dsi_dpi_data_start;
469 u32 dsi_hsw, dsi_hbp, dsi_hact, dsi_hfp;
470 const u32 dsi_hss = 4; /* HSS is a short packet (4 bytes) */
471 /* In hsbyteclk units */
472 u32 dsi_vsdly;
473 const u32 internal_dly = 40;
474
475 if (device->mode_flags & MIPI_DSI_CLOCK_NON_CONTINUOUS) {
476 debug("%s: Non-continuous mode unimplemented, falling back to continuous\n", __func__);
477 device->mode_flags &= ~MIPI_DSI_CLOCK_NON_CONTINUOUS;
478 }
479
480 tc358768_hw_enable(priv);
481 tc358768_sw_reset(dev);
482
483 tc358768_setup_pll(dev);
484
485 dsiclk = priv->dsiclk;
486 hsbyteclk = dsiclk / 4;
487
488 /* Data Format Control Register */
489 val = BIT(2) | BIT(1) | BIT(0); /* rdswap_en | dsitx_en | txdt_en */
490 switch (device->format) {
491 case MIPI_DSI_FMT_RGB888:
492 val |= (0x3 << 4);
493 hact = dt->hactive.typ * 3;
494 data_type = MIPI_DSI_PACKED_PIXEL_STREAM_24;
495 break;
496 case MIPI_DSI_FMT_RGB666:
497 val |= (0x4 << 4);
498 hact = dt->hactive.typ * 3;
499 data_type = MIPI_DSI_PACKED_PIXEL_STREAM_18;
500 break;
501 case MIPI_DSI_FMT_RGB666_PACKED:
502 val |= (0x4 << 4) | BIT(3);
503 hact = dt->hactive.typ * 18 / 8;
504 data_type = MIPI_DSI_PIXEL_STREAM_3BYTE_18;
505 break;
506 case MIPI_DSI_FMT_RGB565:
507 val |= (0x5 << 4);
508 hact = dt->hactive.typ * 2;
509 data_type = MIPI_DSI_PACKED_PIXEL_STREAM_16;
510 break;
511 default:
512 log_debug("%s: Invalid data format (%u)\n",
513 __func__, device->format);
514 return -EINVAL;
515 }
516
517 /*
518 * There are three important things to make TC358768 work correctly,
519 * which are not trivial to manage:
520 *
521 * 1. Keep the DPI line-time and the DSI line-time as close to each
522 * other as possible.
523 * 2. TC358768 goes to LP mode after each line's active area. The DSI
524 * HFP period has to be long enough for entering and exiting LP mode.
525 * But it is not clear how to calculate this.
526 * 3. VSDly (video start delay) has to be long enough to ensure that the
527 * DSI TX does not start transmitting until we have started receiving
528 * pixel data from the DPI input. It is not clear how to calculate
529 * this either.
530 */
531
532 dpi_htot = dt->hactive.typ + dt->hfront_porch.typ +
533 dt->hsync_len.typ + dt->hback_porch.typ;
534 dpi_data_start = dt->hsync_len.typ + dt->hback_porch.typ;
535
536 log_debug("%s: dpi horiz timing (pclk): %u + %u + %u + %u = %u\n", __func__,
537 dt->hsync_len.typ, dt->hback_porch.typ, dt->hactive.typ,
538 dt->hfront_porch.typ, dpi_htot);
539
540 log_debug("%s: dpi horiz timing (ns): %u + %u + %u + %u = %u\n", __func__,
541 tc358768_dpi_to_ns(dt->hsync_len.typ, dt->pixelclock.typ),
542 tc358768_dpi_to_ns(dt->hback_porch.typ, dt->pixelclock.typ),
543 tc358768_dpi_to_ns(dt->hactive.typ, dt->pixelclock.typ),
544 tc358768_dpi_to_ns(dt->hfront_porch.typ, dt->pixelclock.typ),
545 tc358768_dpi_to_ns(dpi_htot, dt->pixelclock.typ));
546
547 log_debug("%s: dpi data start (ns): %u + %u = %u\n", __func__,
548 tc358768_dpi_to_ns(dt->hsync_len.typ, dt->pixelclock.typ),
549 tc358768_dpi_to_ns(dt->hback_porch.typ, dt->pixelclock.typ),
550 tc358768_dpi_to_ns(dpi_data_start, dt->pixelclock.typ));
551
552 dsi_dpi_htot = tc358768_dpi_to_dsi_bytes(priv, dpi_htot);
553 dsi_dpi_data_start = tc358768_dpi_to_dsi_bytes(priv, dpi_data_start);
554
555 if (device->mode_flags & MIPI_DSI_MODE_VIDEO_SYNC_PULSE) {
556 dsi_hsw = tc358768_dpi_to_dsi_bytes(priv, dt->hsync_len.typ);
557 dsi_hbp = tc358768_dpi_to_dsi_bytes(priv, dt->hback_porch.typ);
558 } else {
559 /* HBP is included in HSW in event mode */
560 dsi_hbp = 0;
561 dsi_hsw = tc358768_dpi_to_dsi_bytes(priv,
562 dt->hsync_len.typ +
563 dt->hback_porch.typ);
564
565 /*
566 * The pixel packet includes the actual pixel data, and:
567 * DSI packet header = 4 bytes
568 * DCS code = 1 byte
569 * DSI packet footer = 2 bytes
570 */
571 dsi_hact = hact + 4 + 1 + 2;
572
573 dsi_hfp = dsi_dpi_htot - dsi_hact - dsi_hsw - dsi_hss;
574
575 /*
576 * Here we should check if HFP is long enough for entering LP
577 * and exiting LP, but it's not clear how to calculate that.
578 * Instead, this is a naive algorithm that just adjusts the HFP
579 * and HSW so that HFP is (at least) roughly 2/3 of the total
580 * blanking time.
581 */
582 if (dsi_hfp < (dsi_hfp + dsi_hsw + dsi_hss) * 2 / 3) {
583 u32 old_hfp = dsi_hfp;
584 u32 old_hsw = dsi_hsw;
585 u32 tot = dsi_hfp + dsi_hsw + dsi_hss;
586
587 dsi_hsw = tot / 3;
588
589 /*
590 * Seems like sometimes HSW has to be divisible by num-lanes, but
591 * not always...
592 */
593 dsi_hsw = roundup(dsi_hsw, priv->dsi_lanes);
594
595 dsi_hfp = dsi_dpi_htot - dsi_hact - dsi_hsw - dsi_hss;
596
597 log_debug("%s: hfp too short, adjusting dsi hfp and dsi hsw from %u, %u to %u, %u\n",
598 __func__, old_hfp, old_hsw, dsi_hfp, dsi_hsw);
599 }
600
601 log_debug("%s: dsi horiz timing (bytes): %u, %u + %u + %u + %u = %u\n", __func__,
602 dsi_hss, dsi_hsw, dsi_hbp, dsi_hact, dsi_hfp,
603 dsi_hss + dsi_hsw + dsi_hbp + dsi_hact + dsi_hfp);
604
605 log_debug("%s: dsi horiz timing (ns): %u + %u + %u + %u + %u = %u\n", __func__,
606 tc358768_dsi_bytes_to_ns(priv, dsi_hss),
607 tc358768_dsi_bytes_to_ns(priv, dsi_hsw),
608 tc358768_dsi_bytes_to_ns(priv, dsi_hbp),
609 tc358768_dsi_bytes_to_ns(priv, dsi_hact),
610 tc358768_dsi_bytes_to_ns(priv, dsi_hfp),
611 tc358768_dsi_bytes_to_ns(priv, dsi_hss + dsi_hsw +
612 dsi_hbp + dsi_hact + dsi_hfp));
613 }
614
615 /* VSDly calculation */
616
617 /* Start with the HW internal delay */
618 dsi_vsdly = internal_dly;
619
620 /* Convert to byte units as the other variables are in byte units */
621 dsi_vsdly *= priv->dsi_lanes;
622
623 /* Do we need more delay, in addition to the internal? */
624 if (dsi_dpi_data_start > dsi_vsdly + dsi_hss + dsi_hsw + dsi_hbp) {
625 dsi_vsdly = dsi_dpi_data_start - dsi_hss - dsi_hsw - dsi_hbp;
626 dsi_vsdly = roundup(dsi_vsdly, priv->dsi_lanes);
627 }
628
629 log_debug("%s: dsi data start (bytes) %u + %u + %u + %u = %u\n", __func__,
630 dsi_vsdly, dsi_hss, dsi_hsw, dsi_hbp,
631 dsi_vsdly + dsi_hss + dsi_hsw + dsi_hbp);
632
633 log_debug("%s: dsi data start (ns) %u + %u + %u + %u = %u\n", __func__,
634 tc358768_dsi_bytes_to_ns(priv, dsi_vsdly),
635 tc358768_dsi_bytes_to_ns(priv, dsi_hss),
636 tc358768_dsi_bytes_to_ns(priv, dsi_hsw),
637 tc358768_dsi_bytes_to_ns(priv, dsi_hbp),
638 tc358768_dsi_bytes_to_ns(priv, dsi_vsdly + dsi_hss + dsi_hsw + dsi_hbp));
639
640 /* Convert back to hsbyteclk */
641 dsi_vsdly /= priv->dsi_lanes;
642
643 /*
644 * The docs say that there is an internal delay of 40 cycles.
645 * However, we get underflows if we follow that rule. If we
646 * instead ignore the internal delay, things work. So either
647 * the docs are wrong or the calculations are wrong.
648 *
649 * As a temporary fix, add the internal delay here, to counter
650 * the subtraction when writing the register.
651 */
652 dsi_vsdly += internal_dly;
653
654 /* Clamp to the register max */
655 if (dsi_vsdly - internal_dly > 0x3ff) {
656 log_warning("%s: VSDly too high, underflows likely\n", __func__);
657 dsi_vsdly = 0x3ff + internal_dly;
658 }
659
660 /* VSDly[9:0] */
661 tc358768_write(dev, TC358768_VSDLY, dsi_vsdly - internal_dly);
662
663 tc358768_write(dev, TC358768_DATAFMT, val);
664 tc358768_write(dev, TC358768_DSITX_DT, data_type);
665
666 /* Enable D-PHY (HiZ->LP11) */
667 tc358768_write(dev, TC358768_CLW_CNTRL, 0x0000);
668 /* Enable lanes */
669 for (i = 0; i < device->lanes; i++)
670 tc358768_write(dev, TC358768_D0W_CNTRL + i * 4, 0x0000);
671
672 /* Set up D-PHY CONTTX */
673 tc358768_write(dev, TC358768_CLW_DPHYCONTTX, 0x0203);
674 /* Adjust lanes */
675 for (i = 0; i < device->lanes; i++)
676 tc358768_write(dev, TC358768_D0W_DPHYCONTTX + i * 4, 0x0203);
677
678 /* DSI Timings */
679 hsbyteclk_ps = (u32)div_u64(PICO, hsbyteclk);
680 dsiclk_ps = (u32)div_u64(PICO, dsiclk);
681 ui_ps = dsiclk_ps / 2;
682 log_debug("%s: dsiclk: %u ps, ui %u ps, hsbyteclk %u ps\n",
683 __func__, dsiclk_ps, ui_ps, hsbyteclk_ps);
684
685 /* LP11 > 100us for D-PHY Rx Init */
686 val = tc358768_ns_to_cnt(100 * 1000, hsbyteclk_ps) - 1;
687 log_debug("%s: LINEINITCNT: 0x%x\n", __func__, val);
688 tc358768_write(dev, TC358768_LINEINITCNT, val);
689
690 /* LPTimeCnt > 50ns */
691 val = tc358768_ns_to_cnt(50, hsbyteclk_ps) - 1;
692 lptxcnt = val;
693 log_debug("%s: LPTXTIMECNT: 0x%x\n", __func__, val);
694 tc358768_write(dev, TC358768_LPTXTIMECNT, val);
695
696 /* 38ns < TCLK_PREPARE < 95ns */
697 val = tc358768_ns_to_cnt(65, hsbyteclk_ps) - 1;
698 log_debug("%s: TCLK_PREPARECNT: 0x%x\n", __func__, val);
699 /* TCLK_PREPARE + TCLK_ZERO > 300ns */
700 val2 = tc358768_ns_to_cnt(300 - tc358768_ps_to_ns(2 * ui_ps),
701 hsbyteclk_ps) - 2;
702 log_debug("%s: TCLK_ZEROCNT: 0x%x\n", __func__, val2);
703 val |= val2 << 8;
704 tc358768_write(dev, TC358768_TCLK_HEADERCNT, val);
705
706 /* TCLK_TRAIL > 60ns AND TEOT <= 105 ns + 12*UI */
707 raw_val = tc358768_ns_to_cnt(60 + tc358768_ps_to_ns(2 * ui_ps),
708 hsbyteclk_ps) - 5;
709 val = clamp(raw_val, 0, 127);
710 log_debug("%s: TCLK_TRAILCNT: 0x%x\n", __func__, val);
711 tc358768_write(dev, TC358768_TCLK_TRAILCNT, val);
712
713 /* 40ns + 4*UI < THS_PREPARE < 85ns + 6*UI */
714 val = 50 + tc358768_ps_to_ns(4 * ui_ps);
715 val = tc358768_ns_to_cnt(val, hsbyteclk_ps) - 1;
716 log_debug("%s: THS_PREPARECNT: 0x%x\n", __func__, val);
717 /* THS_PREPARE + THS_ZERO > 145ns + 10*UI */
718 raw_val = tc358768_ns_to_cnt(145 - tc358768_ps_to_ns(3 * ui_ps),
719 hsbyteclk_ps) - 10;
720 val2 = clamp(raw_val, 0, 127);
721 log_debug("%s: THS_ZEROCNT: 0x%x\n", __func__, val2);
722 val |= val2 << 8;
723 tc358768_write(dev, TC358768_THS_HEADERCNT, val);
724
725 /* TWAKEUP > 1ms in lptxcnt steps */
726 val = tc358768_ns_to_cnt(1020000, hsbyteclk_ps);
727 val = val / (lptxcnt + 1) - 1;
728 log_debug("%s: TWAKEUP: 0x%x\n", __func__, val);
729 tc358768_write(dev, TC358768_TWAKEUP, val);
730
731 /* TCLK_POSTCNT > 60ns + 52*UI */
732 val = tc358768_ns_to_cnt(60 + tc358768_ps_to_ns(52 * ui_ps),
733 hsbyteclk_ps) - 3;
734 log_debug("%s: TCLK_POSTCNT: 0x%x\n", __func__, val);
735 tc358768_write(dev, TC358768_TCLK_POSTCNT, val);
736
737 /* max(60ns + 4*UI, 8*UI) < THS_TRAILCNT < 105ns + 12*UI */
738 raw_val = tc358768_ns_to_cnt(60 + tc358768_ps_to_ns(18 * ui_ps),
739 hsbyteclk_ps) - 4;
740 val = clamp(raw_val, 0, 15);
741 log_debug("%s: THS_TRAILCNT: 0x%x\n", __func__, val);
742 tc358768_write(dev, TC358768_THS_TRAILCNT, val);
743
744 val = BIT(0);
745 for (i = 0; i < device->lanes; i++)
746 val |= BIT(i + 1);
747 tc358768_write(dev, TC358768_HSTXVREGEN, val);
748
749 tc358768_write(dev, TC358768_TXOPTIONCNTRL,
750 (device->mode_flags & MIPI_DSI_CLOCK_NON_CONTINUOUS) ? 0 : BIT(0));
751
752 /* TXTAGOCNT[26:16] RXTASURECNT[10:0] */
753 val = tc358768_ps_to_ns((lptxcnt + 1) * hsbyteclk_ps * 4);
754 val = tc358768_ns_to_cnt(val, hsbyteclk_ps) / 4 - 1;
755 log_debug("%s: TXTAGOCNT: 0x%x\n", __func__, val);
756 val2 = tc358768_ns_to_cnt(tc358768_ps_to_ns((lptxcnt + 1) * hsbyteclk_ps),
757 hsbyteclk_ps) - 2;
758 log_debug("%s: RXTASURECNT: 0x%x\n", __func__, val2);
759 val = val << 16 | val2;
760 tc358768_write(dev, TC358768_BTACNTRL1, val);
761
762 /* START[0] */
763 tc358768_write(dev, TC358768_STARTCNTRL, 1);
764
765 if (device->mode_flags & MIPI_DSI_MODE_VIDEO_SYNC_PULSE) {
766 /* Set pulse mode */
767 tc358768_write(dev, TC358768_DSI_EVENT, 0);
768
769 /* vact */
770 tc358768_write(dev, TC358768_DSI_VACT, dt->vactive.typ);
771 /* vsw */
772 tc358768_write(dev, TC358768_DSI_VSW, dt->vsync_len.typ);
773 /* vbp */
774 tc358768_write(dev, TC358768_DSI_VBPR, dt->vback_porch.typ);
775 } else {
776 /* Set event mode */
777 tc358768_write(dev, TC358768_DSI_EVENT, 1);
778
779 /* vact */
780 tc358768_write(dev, TC358768_DSI_VACT, dt->vactive.typ);
781
782 /* vsw (+ vbp) */
783 tc358768_write(dev, TC358768_DSI_VSW,
784 dt->vsync_len.typ + dt->vback_porch.typ);
785 /* vbp (not used in event mode) */
786 tc358768_write(dev, TC358768_DSI_VBPR, 0);
787 }
788
789 /* hsw (bytes) */
790 tc358768_write(dev, TC358768_DSI_HSW, dsi_hsw);
791
792 /* hbp (bytes) */
793 tc358768_write(dev, TC358768_DSI_HBPR, dsi_hbp);
794
795 /* hact (bytes) */
796 tc358768_write(dev, TC358768_DSI_HACT, hact);
797
798 /* VSYNC polarity */
799 tc358768_update_bits(dev, TC358768_CONFCTL, BIT(5),
800 (dt->flags & DISPLAY_FLAGS_VSYNC_HIGH) ? BIT(5) : 0);
801
802 /* HSYNC polarity */
803 tc358768_update_bits(dev, TC358768_PP_MISC, BIT(0),
804 (dt->flags & DISPLAY_FLAGS_HSYNC_LOW) ? BIT(0) : 0);
805
806 /* Start DSI Tx */
807 tc358768_write(dev, TC358768_DSI_START, 0x1);
808
809 /* Configure DSI_Control register */
810 val = TC358768_DSI_CONFW_MODE_CLR | TC358768_DSI_CONFW_ADDR_DSI_CONTROL;
811 val |= TC358768_DSI_CONTROL_TXMD | TC358768_DSI_CONTROL_HSCKMD |
812 0x3 << 1 | TC358768_DSI_CONTROL_EOTDIS;
813 tc358768_write(dev, TC358768_DSI_CONFW, val);
814
815 val = TC358768_DSI_CONFW_MODE_SET | TC358768_DSI_CONFW_ADDR_DSI_CONTROL;
816 val |= (device->lanes - 1) << 1;
817
818 val |= TC358768_DSI_CONTROL_TXMD;
819
820 if (!(device->mode_flags & MIPI_DSI_CLOCK_NON_CONTINUOUS))
821 val |= TC358768_DSI_CONTROL_HSCKMD;
822
823 /*
824 * TODO: Actually MIPI_DSI_MODE_NO_EOT_PACKET
825 *
826 * Many of the DSI flags have names opposite to their
827 * actual effects, e.g. MIPI_DSI_MODE_EOT_PACKET means
828 * that EoT packets will actually be disabled.
829 */
830 if (device->mode_flags & MIPI_DSI_MODE_EOT_PACKET)
831 val |= TC358768_DSI_CONTROL_EOTDIS;
832
833 tc358768_write(dev, TC358768_DSI_CONFW, val);
834
835 val = TC358768_DSI_CONFW_MODE_CLR |
836 TC358768_DSI_CONFW_ADDR_DSI_CONTROL |
837 TC358768_DSI_CONTROL_DIS_MODE; /* DSI mode */
838 tc358768_write(dev, TC358768_DSI_CONFW, val);
839
840 /* clear FrmStop and RstPtr */
841 tc358768_update_bits(dev, TC358768_PP_MISC, 0x3 << 14, 0);
842
843 /* set PP_en */
844 tc358768_update_bits(dev, TC358768_CONFCTL, BIT(6), BIT(6));
845
846 /* Set up panel configuration */
847 return panel_enable_backlight(priv->panel);
848}
849
850static int tc358768_set_backlight(struct udevice *dev, int percent)
851{
852 struct tc358768_priv *priv = dev_get_priv(dev);
853
854 return panel_set_backlight(priv->panel, percent);
855}
856
857static int tc358768_panel_timings(struct udevice *dev,
858 struct display_timing *timing)
859{
860 struct tc358768_priv *priv = dev_get_priv(dev);
861
862 /* Default to positive sync */
863
864 if (!(priv->timing.flags &
865 (DISPLAY_FLAGS_HSYNC_LOW | DISPLAY_FLAGS_HSYNC_HIGH)))
866 priv->timing.flags |= DISPLAY_FLAGS_HSYNC_HIGH;
867
868 if (!(priv->timing.flags &
869 (DISPLAY_FLAGS_VSYNC_LOW | DISPLAY_FLAGS_VSYNC_HIGH)))
870 priv->timing.flags |= DISPLAY_FLAGS_VSYNC_HIGH;
871
872 memcpy(timing, &priv->timing, sizeof(*timing));
873
874 return 0;
875}
876
877static int tc358768_setup(struct udevice *dev)
878{
879 struct tc358768_priv *priv = dev_get_priv(dev);
880 struct mipi_dsi_device *device = &priv->device;
881 struct mipi_dsi_panel_plat *mipi_plat;
882 int ret;
883
884 /* The bridge uses 16 bit registers */
885 ret = i2c_set_chip_offset_len(dev, 2);
886 if (ret) {
887 log_debug("%s: set_chip_offset_len failed: %d\n",
888 __func__, ret);
889 return ret;
890 }
891
892 ret = uclass_get_device_by_phandle(UCLASS_PANEL, dev,
893 "panel", &priv->panel);
894 if (ret) {
895 log_debug("%s: Cannot get panel: ret=%d\n", __func__, ret);
896 return log_ret(ret);
897 }
898
899 panel_get_display_timing(priv->panel, &priv->timing);
900
901 mipi_plat = dev_get_plat(priv->panel);
902 mipi_plat->device = device;
903
904 priv->host.dev = (struct device *)dev;
905 priv->host.ops = &tc358768_dsi_host_ops;
906
907 device->host = &priv->host;
908 device->lanes = mipi_plat->lanes;
909 device->format = mipi_plat->format;
910 device->mode_flags = mipi_plat->mode_flags;
911
912 priv->pd_lines = mipi_dsi_pixel_format_to_bpp(device->format);
913 priv->dsi_lanes = device->lanes;
914
915 /* get regulators */
916 ret = device_get_supply_regulator(dev, "vddc-supply", &priv->vddc);
917 if (ret) {
918 log_debug("%s: vddc regulator error: %d\n", __func__, ret);
919 if (ret != -ENOENT)
920 return log_ret(ret);
921 }
922
923 ret = device_get_supply_regulator(dev, "vddmipi-supply", &priv->vddmipi);
924 if (ret) {
925 log_debug("%s: vddmipi regulator error: %d\n", __func__, ret);
926 if (ret != -ENOENT)
927 return log_ret(ret);
928 }
929
930 ret = device_get_supply_regulator(dev, "vddio-supply", &priv->vddio);
931 if (ret) {
932 log_debug("%s: vddio regulator error: %d\n", __func__, ret);
933 if (ret != -ENOENT)
934 return log_ret(ret);
935 }
936
937 /* get clk */
938 priv->refclk = devm_clk_get(dev, "refclk");
939 if (IS_ERR(priv->refclk)) {
940 log_debug("%s: Could not get refclk: %ld\n",
941 __func__, PTR_ERR(priv->refclk));
942 return PTR_ERR(priv->refclk);
943 }
944
945 /* get gpios */
946 ret = gpio_request_by_name(dev, "reset-gpios", 0,
947 &priv->reset_gpio, GPIOD_IS_OUT);
948 if (ret) {
949 log_debug("%s: Could not decode reset-gpios (%d)\n", __func__, ret);
950 return ret;
951 }
952
953 dm_gpio_set_value(&priv->reset_gpio, 1);
954
955 return 0;
956}
957
958static int tc358768_probe(struct udevice *dev)
959{
960 if (device_get_uclass_id(dev->parent) != UCLASS_I2C)
961 return -EPROTONOSUPPORT;
962
963 return tc358768_setup(dev);
964}
965
966struct panel_ops tc358768_ops = {
967 .enable_backlight = tc358768_attach,
968 .set_backlight = tc358768_set_backlight,
969 .get_display_timing = tc358768_panel_timings,
970};
971
972static const struct udevice_id tc358768_ids[] = {
973 { .compatible = "toshiba,tc358768" },
974 { .compatible = "toshiba,tc358778" },
975 { }
976};
977
978U_BOOT_DRIVER(tc358768) = {
979 .name = "tc358768",
980 .id = UCLASS_PANEL,
981 .of_match = tc358768_ids,
982 .ops = &tc358768_ops,
983 .probe = tc358768_probe,
984 .priv_auto = sizeof(struct tc358768_priv),
985};