lantiq: fix broadcasts and vlans in two iface mode
[oweals/openwrt.git] / target / linux / brcm2708 / patches-4.9 / 0173-drm-vc4-Add-DSI-driver.patch
1 From 38ea3f3665eaa9deedc3588196fe9ba9bb4032ec Mon Sep 17 00:00:00 2001
2 From: Eric Anholt <eric@anholt.net>
3 Date: Wed, 10 Feb 2016 11:42:32 -0800
4 Subject: [PATCH] drm/vc4: Add DSI driver
5
6 The DSI0 and DSI1 blocks on the 2835 are related hardware blocks.
7 Some registers move around, and the featureset is slightly different,
8 as DSI1 (the 4-lane DSI) is a later version of the hardware block.
9 This driver doesn't yet enable DSI0, since we don't have any hardware
10 to test against, but it does put a lot of the register definitions and
11 code in place.
12
13 Signed-off-by: Eric Anholt <eric@anholt.net>
14 ---
15  drivers/gpu/drm/vc4/Kconfig       |    2 +
16  drivers/gpu/drm/vc4/Makefile      |    1 +
17  drivers/gpu/drm/vc4/vc4_debugfs.c |    1 +
18  drivers/gpu/drm/vc4/vc4_drv.c     |    1 +
19  drivers/gpu/drm/vc4/vc4_drv.h     |    5 +
20  drivers/gpu/drm/vc4/vc4_dsi.c     | 1725 +++++++++++++++++++++++++++++++++++++
21  6 files changed, 1735 insertions(+)
22  create mode 100644 drivers/gpu/drm/vc4/vc4_dsi.c
23
24 --- a/drivers/gpu/drm/vc4/Kconfig
25 +++ b/drivers/gpu/drm/vc4/Kconfig
26 @@ -2,10 +2,12 @@ config DRM_VC4
27         tristate "Broadcom VC4 Graphics"
28         depends on ARCH_BCM2835 || COMPILE_TEST
29         depends on DRM
30 +       depends on COMMON_CLK
31         select DRM_KMS_HELPER
32         select DRM_KMS_CMA_HELPER
33         select DRM_GEM_CMA_HELPER
34         select DRM_PANEL
35 +       select DRM_MIPI_DSI
36         help
37           Choose this option if you have a system that has a Broadcom
38           VC4 GPU, such as the Raspberry Pi or other BCM2708/BCM2835.
39 --- a/drivers/gpu/drm/vc4/Makefile
40 +++ b/drivers/gpu/drm/vc4/Makefile
41 @@ -8,6 +8,7 @@ vc4-y := \
42         vc4_crtc.o \
43         vc4_drv.o \
44         vc4_dpi.o \
45 +       vc4_dsi.o \
46         vc4_firmware_kms.o \
47         vc4_kms.o \
48         vc4_gem.o \
49 --- a/drivers/gpu/drm/vc4/vc4_debugfs.c
50 +++ b/drivers/gpu/drm/vc4/vc4_debugfs.c
51 @@ -18,6 +18,7 @@
52  static const struct drm_info_list vc4_debugfs_list[] = {
53         {"bo_stats", vc4_bo_stats_debugfs, 0},
54         {"dpi_regs", vc4_dpi_debugfs_regs, 0},
55 +       {"dsi1_regs", vc4_dsi_debugfs_regs, 0, (void *)(uintptr_t)1},
56         {"hdmi_regs", vc4_hdmi_debugfs_regs, 0},
57         {"vec_regs", vc4_vec_debugfs_regs, 0},
58         {"hvs_regs", vc4_hvs_debugfs_regs, 0},
59 --- a/drivers/gpu/drm/vc4/vc4_drv.c
60 +++ b/drivers/gpu/drm/vc4/vc4_drv.c
61 @@ -296,6 +296,7 @@ static struct platform_driver *const com
62         &vc4_hdmi_driver,
63         &vc4_vec_driver,
64         &vc4_dpi_driver,
65 +       &vc4_dsi_driver,
66         &vc4_hvs_driver,
67         &vc4_crtc_driver,
68         &vc4_firmware_kms_driver,
69 --- a/drivers/gpu/drm/vc4/vc4_drv.h
70 +++ b/drivers/gpu/drm/vc4/vc4_drv.h
71 @@ -20,6 +20,7 @@ struct vc4_dev {
72         struct vc4_crtc *crtc[3];
73         struct vc4_v3d *v3d;
74         struct vc4_dpi *dpi;
75 +       struct vc4_dsi *dsi1;
76         struct vc4_vec *vec;
77  
78         struct drm_fbdev_cma *fbdev;
79 @@ -468,6 +469,10 @@ void __iomem *vc4_ioremap_regs(struct pl
80  extern struct platform_driver vc4_dpi_driver;
81  int vc4_dpi_debugfs_regs(struct seq_file *m, void *unused);
82  
83 +/* vc4_dsi.c */
84 +extern struct platform_driver vc4_dsi_driver;
85 +int vc4_dsi_debugfs_regs(struct seq_file *m, void *unused);
86 +
87  /* vc4_firmware_kms.c */
88  extern struct platform_driver vc4_firmware_kms_driver;
89  void vc4_fkms_cancel_page_flip(struct drm_crtc *crtc, struct drm_file *file);
90 --- /dev/null
91 +++ b/drivers/gpu/drm/vc4/vc4_dsi.c
92 @@ -0,0 +1,1725 @@
93 +/*
94 + * Copyright (C) 2016 Broadcom
95 + *
96 + * This program is free software; you can redistribute it and/or modify it
97 + * under the terms of the GNU General Public License version 2 as published by
98 + * the Free Software Foundation.
99 + *
100 + * This program is distributed in the hope that it will be useful, but WITHOUT
101 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
102 + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
103 + * more details.
104 + *
105 + * You should have received a copy of the GNU General Public License along with
106 + * this program.  If not, see <http://www.gnu.org/licenses/>.
107 + */
108 +
109 +/**
110 + * DOC: VC4 DSI0/DSI1 module
111 + *
112 + * BCM2835 contains two DSI modules, DSI0 and DSI1.  DSI0 is a
113 + * single-lane DSI controller, while DSI1 is a more modern 4-lane DSI
114 + * controller.
115 + *
116 + * Most Raspberry Pi boards expose DSI1 as their "DISPLAY" connector,
117 + * while the compute module brings both DSI0 and DSI1 out.
118 + *
119 + * This driver has been tested for DSI1 video-mode display only
120 + * currently, with most of the information necessary for DSI0
121 + * hopefully present.
122 + */
123 +
124 +#include "drm_atomic_helper.h"
125 +#include "drm_crtc_helper.h"
126 +#include "drm_edid.h"
127 +#include "drm_mipi_dsi.h"
128 +#include "drm_panel.h"
129 +#include "linux/clk.h"
130 +#include "linux/clk-provider.h"
131 +#include "linux/completion.h"
132 +#include "linux/component.h"
133 +#include "linux/dmaengine.h"
134 +#include "linux/i2c.h"
135 +#include "linux/of_address.h"
136 +#include "linux/of_platform.h"
137 +#include "linux/pm_runtime.h"
138 +#include "vc4_drv.h"
139 +#include "vc4_regs.h"
140 +
141 +#define DSI_CMD_FIFO_DEPTH  16
142 +#define DSI_PIX_FIFO_DEPTH 256
143 +#define DSI_PIX_FIFO_WIDTH   4
144 +
145 +#define DSI0_CTRL              0x00
146 +
147 +/* Command packet control. */
148 +#define DSI0_TXPKT1C           0x04 /* AKA PKTC */
149 +#define DSI1_TXPKT1C           0x04
150 +# define DSI_TXPKT1C_TRIG_CMD_MASK     VC4_MASK(31, 24)
151 +# define DSI_TXPKT1C_TRIG_CMD_SHIFT    24
152 +# define DSI_TXPKT1C_CMD_REPEAT_MASK   VC4_MASK(23, 10)
153 +# define DSI_TXPKT1C_CMD_REPEAT_SHIFT  10
154 +
155 +# define DSI_TXPKT1C_DISPLAY_NO_MASK   VC4_MASK(9, 8)
156 +# define DSI_TXPKT1C_DISPLAY_NO_SHIFT  8
157 +/* Short, trigger, BTA, or a long packet that fits all in CMDFIFO. */
158 +# define DSI_TXPKT1C_DISPLAY_NO_SHORT          0
159 +/* Primary display where cmdfifo provides part of the payload and
160 + * pixelvalve the rest.
161 + */
162 +# define DSI_TXPKT1C_DISPLAY_NO_PRIMARY                1
163 +/* Secondary display where cmdfifo provides part of the payload and
164 + * pixfifo the rest.
165 + */
166 +# define DSI_TXPKT1C_DISPLAY_NO_SECONDARY      2
167 +
168 +# define DSI_TXPKT1C_CMD_TX_TIME_MASK  VC4_MASK(7, 6)
169 +# define DSI_TXPKT1C_CMD_TX_TIME_SHIFT 6
170 +
171 +# define DSI_TXPKT1C_CMD_CTRL_MASK     VC4_MASK(5, 4)
172 +# define DSI_TXPKT1C_CMD_CTRL_SHIFT    4
173 +/* Command only.  Uses TXPKT1H and DISPLAY_NO */
174 +# define DSI_TXPKT1C_CMD_CTRL_TX       0
175 +/* Command with BTA for either ack or read data. */
176 +# define DSI_TXPKT1C_CMD_CTRL_RX       1
177 +/* Trigger according to TRIG_CMD */
178 +# define DSI_TXPKT1C_CMD_CTRL_TRIG     2
179 +/* BTA alone for getting error status after a command, or a TE trigger
180 + * without a previous command.
181 + */
182 +# define DSI_TXPKT1C_CMD_CTRL_BTA      3
183 +
184 +# define DSI_TXPKT1C_CMD_MODE_LP       BIT(3)
185 +# define DSI_TXPKT1C_CMD_TYPE_LONG     BIT(2)
186 +# define DSI_TXPKT1C_CMD_TE_EN         BIT(1)
187 +# define DSI_TXPKT1C_CMD_EN            BIT(0)
188 +
189 +/* Command packet header. */
190 +#define DSI0_TXPKT1H           0x08 /* AKA PKTH */
191 +#define DSI1_TXPKT1H           0x08
192 +# define DSI_TXPKT1H_BC_CMDFIFO_MASK   VC4_MASK(31, 24)
193 +# define DSI_TXPKT1H_BC_CMDFIFO_SHIFT  24
194 +# define DSI_TXPKT1H_BC_PARAM_MASK     VC4_MASK(23, 8)
195 +# define DSI_TXPKT1H_BC_PARAM_SHIFT    8
196 +# define DSI_TXPKT1H_BC_DT_MASK                VC4_MASK(7, 0)
197 +# define DSI_TXPKT1H_BC_DT_SHIFT       0
198 +
199 +#define DSI0_RXPKT1H           0x0c /* AKA RX1_PKTH */
200 +#define DSI1_RXPKT1H           0x14
201 +# define DSI_RXPKT1H_CRC_ERR           BIT(31)
202 +# define DSI_RXPKT1H_DET_ERR           BIT(30)
203 +# define DSI_RXPKT1H_ECC_ERR           BIT(29)
204 +# define DSI_RXPKT1H_COR_ERR           BIT(28)
205 +# define DSI_RXPKT1H_INCOMP_PKT                BIT(25)
206 +# define DSI_RXPKT1H_PKT_TYPE_LONG     BIT(24)
207 +/* Byte count if DSI_RXPKT1H_PKT_TYPE_LONG */
208 +# define DSI_RXPKT1H_BC_PARAM_MASK     VC4_MASK(23, 8)
209 +# define DSI_RXPKT1H_BC_PARAM_SHIFT    8
210 +/* Short return bytes if !DSI_RXPKT1H_PKT_TYPE_LONG */
211 +# define DSI_RXPKT1H_SHORT_1_MASK      VC4_MASK(23, 16)
212 +# define DSI_RXPKT1H_SHORT_1_SHIFT     16
213 +# define DSI_RXPKT1H_SHORT_0_MASK      VC4_MASK(15, 8)
214 +# define DSI_RXPKT1H_SHORT_0_SHIFT     8
215 +# define DSI_RXPKT1H_DT_LP_CMD_MASK    VC4_MASK(7, 0)
216 +# define DSI_RXPKT1H_DT_LP_CMD_SHIFT   0
217 +
218 +#define DSI0_RXPKT2H           0x10 /* AKA RX2_PKTH */
219 +#define DSI1_RXPKT2H           0x18
220 +# define DSI_RXPKT1H_DET_ERR           BIT(30)
221 +# define DSI_RXPKT1H_ECC_ERR           BIT(29)
222 +# define DSI_RXPKT1H_COR_ERR           BIT(28)
223 +# define DSI_RXPKT1H_INCOMP_PKT                BIT(25)
224 +# define DSI_RXPKT1H_BC_PARAM_MASK     VC4_MASK(23, 8)
225 +# define DSI_RXPKT1H_BC_PARAM_SHIFT    8
226 +# define DSI_RXPKT1H_DT_MASK           VC4_MASK(7, 0)
227 +# define DSI_RXPKT1H_DT_SHIFT          0
228 +
229 +#define DSI0_TXPKT_CMD_FIFO    0x14 /* AKA CMD_DATAF */
230 +#define DSI1_TXPKT_CMD_FIFO    0x1c
231 +
232 +#define DSI0_DISP0_CTRL                0x18
233 +# define DSI_DISP0_PIX_CLK_DIV_MASK    VC4_MASK(21, 13)
234 +# define DSI_DISP0_PIX_CLK_DIV_SHIFT   13
235 +# define DSI_DISP0_LP_STOP_CTRL_MASK   VC4_MASK(12, 11)
236 +# define DSI_DISP0_LP_STOP_CTRL_SHIFT  11
237 +# define DSI_DISP0_LP_STOP_DISABLE     0
238 +# define DSI_DISP0_LP_STOP_PERLINE     1
239 +# define DSI_DISP0_LP_STOP_PERFRAME    2
240 +
241 +/* Transmit RGB pixels and null packets only during HACTIVE, instead
242 + * of going to LP-STOP.
243 + */
244 +# define DSI_DISP_HACTIVE_NULL         BIT(10)
245 +/* Transmit blanking packet only during vblank, instead of allowing LP-STOP. */
246 +# define DSI_DISP_VBLP_CTRL            BIT(9)
247 +/* Transmit blanking packet only during HFP, instead of allowing LP-STOP. */
248 +# define DSI_DISP_HFP_CTRL             BIT(8)
249 +/* Transmit blanking packet only during HBP, instead of allowing LP-STOP. */
250 +# define DSI_DISP_HBP_CTRL             BIT(7)
251 +# define DSI_DISP0_CHANNEL_MASK                VC4_MASK(6, 5)
252 +# define DSI_DISP0_CHANNEL_SHIFT       5
253 +/* Enables end events for HSYNC/VSYNC, not just start events. */
254 +# define DSI_DISP0_ST_END              BIT(4)
255 +# define DSI_DISP0_PFORMAT_MASK                VC4_MASK(3, 2)
256 +# define DSI_DISP0_PFORMAT_SHIFT       2
257 +# define DSI_PFORMAT_RGB565            0
258 +# define DSI_PFORMAT_RGB666_PACKED     1
259 +# define DSI_PFORMAT_RGB666            2
260 +# define DSI_PFORMAT_RGB888            3
261 +/* Default is VIDEO mode. */
262 +# define DSI_DISP0_COMMAND_MODE                BIT(1)
263 +# define DSI_DISP0_ENABLE              BIT(0)
264 +
265 +#define DSI0_DISP1_CTRL                0x1c
266 +#define DSI1_DISP1_CTRL                0x2c
267 +/* Format of the data written to TXPKT_PIX_FIFO. */
268 +# define DSI_DISP1_PFORMAT_MASK                VC4_MASK(2, 1)
269 +# define DSI_DISP1_PFORMAT_SHIFT       1
270 +# define DSI_DISP1_PFORMAT_16BIT       0
271 +# define DSI_DISP1_PFORMAT_24BIT       1
272 +# define DSI_DISP1_PFORMAT_32BIT_LE    2
273 +# define DSI_DISP1_PFORMAT_32BIT_BE    3
274 +
275 +/* DISP1 is always command mode. */
276 +# define DSI_DISP1_ENABLE              BIT(0)
277 +
278 +#define DSI0_TXPKT_PIX_FIFO            0x20 /* AKA PIX_FIFO */
279 +
280 +#define DSI0_INT_STAT          0x24
281 +#define DSI0_INT_EN            0x28
282 +# define DSI1_INT_PHY_D3_ULPS          BIT(30)
283 +# define DSI1_INT_PHY_D3_STOP          BIT(29)
284 +# define DSI1_INT_PHY_D2_ULPS          BIT(28)
285 +# define DSI1_INT_PHY_D2_STOP          BIT(27)
286 +# define DSI1_INT_PHY_D1_ULPS          BIT(26)
287 +# define DSI1_INT_PHY_D1_STOP          BIT(25)
288 +# define DSI1_INT_PHY_D0_ULPS          BIT(24)
289 +# define DSI1_INT_PHY_D0_STOP          BIT(23)
290 +# define DSI1_INT_FIFO_ERR             BIT(22)
291 +# define DSI1_INT_PHY_DIR_RTF          BIT(21)
292 +# define DSI1_INT_PHY_RXLPDT           BIT(20)
293 +# define DSI1_INT_PHY_RXTRIG           BIT(19)
294 +# define DSI1_INT_PHY_D0_LPDT          BIT(18)
295 +# define DSI1_INT_PHY_DIR_FTR          BIT(17)
296 +
297 +/* Signaled when the clock lane enters the given state. */
298 +# define DSI1_INT_PHY_CLOCK_ULPS       BIT(16)
299 +# define DSI1_INT_PHY_CLOCK_HS         BIT(15)
300 +# define DSI1_INT_PHY_CLOCK_STOP       BIT(14)
301 +
302 +/* Signaled on timeouts */
303 +# define DSI1_INT_PR_TO                        BIT(13)
304 +# define DSI1_INT_TA_TO                        BIT(12)
305 +# define DSI1_INT_LPRX_TO              BIT(11)
306 +# define DSI1_INT_HSTX_TO              BIT(10)
307 +
308 +/* Contention on a line when trying to drive the line low */
309 +# define DSI1_INT_ERR_CONT_LP1         BIT(9)
310 +# define DSI1_INT_ERR_CONT_LP0         BIT(8)
311 +
312 +/* Control error: incorrect line state sequence on data lane 0. */
313 +# define DSI1_INT_ERR_CONTROL          BIT(7)
314 +/* LPDT synchronization error (bits received not a multiple of 8. */
315 +
316 +# define DSI1_INT_ERR_SYNC_ESC         BIT(6)
317 +/* Signaled after receiving an error packet from the display in
318 + * response to a read.
319 + */
320 +# define DSI1_INT_RXPKT2               BIT(5)
321 +/* Signaled after receiving a packet.  The header and optional short
322 + * response will be in RXPKT1H, and a long response will be in the
323 + * RXPKT_FIFO.
324 + */
325 +# define DSI1_INT_RXPKT1               BIT(4)
326 +# define DSI1_INT_TXPKT2_DONE          BIT(3)
327 +# define DSI1_INT_TXPKT2_END           BIT(2)
328 +/* Signaled after all repeats of TXPKT1 are transferred. */
329 +# define DSI1_INT_TXPKT1_DONE          BIT(1)
330 +/* Signaled after each TXPKT1 repeat is scheduled. */
331 +# define DSI1_INT_TXPKT1_END           BIT(0)
332 +
333 +#define DSI1_INTERRUPTS_ALWAYS_ENABLED (DSI1_INT_ERR_SYNC_ESC | \
334 +                                        DSI1_INT_ERR_CONTROL |  \
335 +                                        DSI1_INT_ERR_CONT_LP0 | \
336 +                                        DSI1_INT_ERR_CONT_LP1 | \
337 +                                        DSI1_INT_HSTX_TO |      \
338 +                                        DSI1_INT_LPRX_TO |      \
339 +                                        DSI1_INT_TA_TO |        \
340 +                                        DSI1_INT_PR_TO)
341 +
342 +#define DSI0_STAT              0x2c
343 +#define DSI0_HSTX_TO_CNT       0x30
344 +#define DSI0_LPRX_TO_CNT       0x34
345 +#define DSI0_TA_TO_CNT         0x38
346 +#define DSI0_PR_TO_CNT         0x3c
347 +#define DSI0_PHYC              0x40
348 +# define DSI1_PHYC_ESC_CLK_LPDT_MASK   VC4_MASK(25, 20)
349 +# define DSI1_PHYC_ESC_CLK_LPDT_SHIFT  20
350 +# define DSI1_PHYC_HS_CLK_CONTINUOUS   BIT(18)
351 +# define DSI0_PHYC_ESC_CLK_LPDT_MASK   VC4_MASK(17, 12)
352 +# define DSI0_PHYC_ESC_CLK_LPDT_SHIFT  12
353 +# define DSI1_PHYC_CLANE_ULPS          BIT(17)
354 +# define DSI1_PHYC_CLANE_ENABLE                BIT(16)
355 +# define DSI_PHYC_DLANE3_ULPS          BIT(13)
356 +# define DSI_PHYC_DLANE3_ENABLE                BIT(12)
357 +# define DSI0_PHYC_HS_CLK_CONTINUOUS   BIT(10)
358 +# define DSI0_PHYC_CLANE_ULPS          BIT(9)
359 +# define DSI_PHYC_DLANE2_ULPS          BIT(9)
360 +# define DSI0_PHYC_CLANE_ENABLE                BIT(8)
361 +# define DSI_PHYC_DLANE2_ENABLE                BIT(8)
362 +# define DSI_PHYC_DLANE1_ULPS          BIT(5)
363 +# define DSI_PHYC_DLANE1_ENABLE                BIT(4)
364 +# define DSI_PHYC_DLANE0_FORCE_STOP    BIT(2)
365 +# define DSI_PHYC_DLANE0_ULPS          BIT(1)
366 +# define DSI_PHYC_DLANE0_ENABLE                BIT(0)
367 +
368 +#define DSI0_HS_CLT0           0x44
369 +#define DSI0_HS_CLT1           0x48
370 +#define DSI0_HS_CLT2           0x4c
371 +#define DSI0_HS_DLT3           0x50
372 +#define DSI0_HS_DLT4           0x54
373 +#define DSI0_HS_DLT5           0x58
374 +#define DSI0_HS_DLT6           0x5c
375 +#define DSI0_HS_DLT7           0x60
376 +
377 +#define DSI0_PHY_AFEC0         0x64
378 +# define DSI0_PHY_AFEC0_DDR2CLK_EN             BIT(26)
379 +# define DSI0_PHY_AFEC0_DDRCLK_EN              BIT(25)
380 +# define DSI0_PHY_AFEC0_LATCH_ULPS             BIT(24)
381 +# define DSI1_PHY_AFEC0_IDR_DLANE3_MASK                VC4_MASK(31, 29)
382 +# define DSI1_PHY_AFEC0_IDR_DLANE3_SHIFT       29
383 +# define DSI1_PHY_AFEC0_IDR_DLANE2_MASK                VC4_MASK(28, 26)
384 +# define DSI1_PHY_AFEC0_IDR_DLANE2_SHIFT       26
385 +# define DSI1_PHY_AFEC0_IDR_DLANE1_MASK                VC4_MASK(27, 23)
386 +# define DSI1_PHY_AFEC0_IDR_DLANE1_SHIFT       23
387 +# define DSI1_PHY_AFEC0_IDR_DLANE0_MASK                VC4_MASK(22, 20)
388 +# define DSI1_PHY_AFEC0_IDR_DLANE0_SHIFT       20
389 +# define DSI1_PHY_AFEC0_IDR_CLANE_MASK         VC4_MASK(19, 17)
390 +# define DSI1_PHY_AFEC0_IDR_CLANE_SHIFT                17
391 +# define DSI0_PHY_AFEC0_ACTRL_DLANE1_MASK      VC4_MASK(23, 20)
392 +# define DSI0_PHY_AFEC0_ACTRL_DLANE1_SHIFT     20
393 +# define DSI0_PHY_AFEC0_ACTRL_DLANE0_MASK      VC4_MASK(19, 16)
394 +# define DSI0_PHY_AFEC0_ACTRL_DLANE0_SHIFT     16
395 +# define DSI0_PHY_AFEC0_ACTRL_CLANE_MASK       VC4_MASK(15, 12)
396 +# define DSI0_PHY_AFEC0_ACTRL_CLANE_SHIFT      12
397 +# define DSI1_PHY_AFEC0_DDR2CLK_EN             BIT(16)
398 +# define DSI1_PHY_AFEC0_DDRCLK_EN              BIT(15)
399 +# define DSI1_PHY_AFEC0_LATCH_ULPS             BIT(14)
400 +# define DSI1_PHY_AFEC0_RESET                  BIT(13)
401 +# define DSI1_PHY_AFEC0_PD                     BIT(12)
402 +# define DSI0_PHY_AFEC0_RESET                  BIT(11)
403 +# define DSI1_PHY_AFEC0_PD_BG                  BIT(11)
404 +# define DSI0_PHY_AFEC0_PD                     BIT(10)
405 +# define DSI1_PHY_AFEC0_PD_DLANE3              BIT(10)
406 +# define DSI0_PHY_AFEC0_PD_BG                  BIT(9)
407 +# define DSI1_PHY_AFEC0_PD_DLANE2              BIT(9)
408 +# define DSI0_PHY_AFEC0_PD_DLANE1              BIT(8)
409 +# define DSI1_PHY_AFEC0_PD_DLANE1              BIT(8)
410 +# define DSI_PHY_AFEC0_PTATADJ_MASK            VC4_MASK(7, 4)
411 +# define DSI_PHY_AFEC0_PTATADJ_SHIFT           4
412 +# define DSI_PHY_AFEC0_CTATADJ_MASK            VC4_MASK(3, 0)
413 +# define DSI_PHY_AFEC0_CTATADJ_SHIFT           0
414 +
415 +#define DSI0_PHY_AFEC1         0x68
416 +# define DSI0_PHY_AFEC1_IDR_DLANE1_MASK                VC4_MASK(10, 8)
417 +# define DSI0_PHY_AFEC1_IDR_DLANE1_SHIFT       8
418 +# define DSI0_PHY_AFEC1_IDR_DLANE0_MASK                VC4_MASK(6, 4)
419 +# define DSI0_PHY_AFEC1_IDR_DLANE0_SHIFT       4
420 +# define DSI0_PHY_AFEC1_IDR_CLANE_MASK         VC4_MASK(2, 0)
421 +# define DSI0_PHY_AFEC1_IDR_CLANE_SHIFT                0
422 +
423 +#define DSI0_TST_SEL           0x6c
424 +#define DSI0_TST_MON           0x70
425 +#define DSI0_ID                        0x74
426 +# define DSI_ID_VALUE          0x00647369
427 +
428 +#define DSI1_CTRL              0x00
429 +# define DSI_CTRL_HS_CLKC_MASK         VC4_MASK(15, 14)
430 +# define DSI_CTRL_HS_CLKC_SHIFT                14
431 +# define DSI_CTRL_HS_CLKC_BYTE         0
432 +# define DSI_CTRL_HS_CLKC_DDR2         1
433 +# define DSI_CTRL_HS_CLKC_DDR          2
434 +
435 +# define DSI_CTRL_RX_LPDT_EOT_DISABLE  BIT(13)
436 +# define DSI_CTRL_LPDT_EOT_DISABLE     BIT(12)
437 +# define DSI_CTRL_HSDT_EOT_DISABLE     BIT(11)
438 +# define DSI_CTRL_SOFT_RESET_CFG       BIT(10)
439 +# define DSI_CTRL_CAL_BYTE             BIT(9)
440 +# define DSI_CTRL_INV_BYTE             BIT(8)
441 +# define DSI_CTRL_CLR_LDF              BIT(7)
442 +# define DSI0_CTRL_CLR_PBCF            BIT(6)
443 +# define DSI1_CTRL_CLR_RXF             BIT(6)
444 +# define DSI0_CTRL_CLR_CPBCF           BIT(5)
445 +# define DSI1_CTRL_CLR_PDF             BIT(5)
446 +# define DSI0_CTRL_CLR_PDF             BIT(4)
447 +# define DSI1_CTRL_CLR_CDF             BIT(4)
448 +# define DSI0_CTRL_CLR_CDF             BIT(3)
449 +# define DSI0_CTRL_CTRL2               BIT(2)
450 +# define DSI1_CTRL_DISABLE_DISP_CRCC   BIT(2)
451 +# define DSI0_CTRL_CTRL1               BIT(1)
452 +# define DSI1_CTRL_DISABLE_DISP_ECCC   BIT(1)
453 +# define DSI0_CTRL_CTRL0               BIT(0)
454 +# define DSI1_CTRL_EN                  BIT(0)
455 +# define DSI0_CTRL_RESET_FIFOS         (DSI_CTRL_CLR_LDF | \
456 +                                        DSI0_CTRL_CLR_PBCF | \
457 +                                        DSI0_CTRL_CLR_CPBCF |  \
458 +                                        DSI0_CTRL_CLR_PDF | \
459 +                                        DSI0_CTRL_CLR_CDF)
460 +# define DSI1_CTRL_RESET_FIFOS         (DSI_CTRL_CLR_LDF | \
461 +                                        DSI1_CTRL_CLR_RXF | \
462 +                                        DSI1_CTRL_CLR_PDF | \
463 +                                        DSI1_CTRL_CLR_CDF)
464 +
465 +#define DSI1_TXPKT2C           0x0c
466 +#define DSI1_TXPKT2H           0x10
467 +#define DSI1_TXPKT_PIX_FIFO    0x20
468 +#define DSI1_RXPKT_FIFO                0x24
469 +#define DSI1_DISP0_CTRL                0x28
470 +#define DSI1_INT_STAT          0x30
471 +#define DSI1_INT_EN            0x34
472 +/* State reporting bits.  These mostly behave like INT_STAT, where
473 + * writing a 1 clears the bit.
474 + */
475 +#define DSI1_STAT              0x38
476 +# define DSI1_STAT_PHY_D3_ULPS         BIT(31)
477 +# define DSI1_STAT_PHY_D3_STOP         BIT(30)
478 +# define DSI1_STAT_PHY_D2_ULPS         BIT(29)
479 +# define DSI1_STAT_PHY_D2_STOP         BIT(28)
480 +# define DSI1_STAT_PHY_D1_ULPS         BIT(27)
481 +# define DSI1_STAT_PHY_D1_STOP         BIT(26)
482 +# define DSI1_STAT_PHY_D0_ULPS         BIT(25)
483 +# define DSI1_STAT_PHY_D0_STOP         BIT(24)
484 +# define DSI1_STAT_FIFO_ERR            BIT(23)
485 +# define DSI1_STAT_PHY_RXLPDT          BIT(22)
486 +# define DSI1_STAT_PHY_RXTRIG          BIT(21)
487 +# define DSI1_STAT_PHY_D0_LPDT         BIT(20)
488 +/* Set when in forward direction */
489 +# define DSI1_STAT_PHY_DIR             BIT(19)
490 +# define DSI1_STAT_PHY_CLOCK_ULPS      BIT(18)
491 +# define DSI1_STAT_PHY_CLOCK_HS                BIT(17)
492 +# define DSI1_STAT_PHY_CLOCK_STOP      BIT(16)
493 +# define DSI1_STAT_PR_TO               BIT(15)
494 +# define DSI1_STAT_TA_TO               BIT(14)
495 +# define DSI1_STAT_LPRX_TO             BIT(13)
496 +# define DSI1_STAT_HSTX_TO             BIT(12)
497 +# define DSI1_STAT_ERR_CONT_LP1                BIT(11)
498 +# define DSI1_STAT_ERR_CONT_LP0                BIT(10)
499 +# define DSI1_STAT_ERR_CONTROL         BIT(9)
500 +# define DSI1_STAT_ERR_SYNC_ESC                BIT(8)
501 +# define DSI1_STAT_RXPKT2              BIT(7)
502 +# define DSI1_STAT_RXPKT1              BIT(6)
503 +# define DSI1_STAT_TXPKT2_BUSY         BIT(5)
504 +# define DSI1_STAT_TXPKT2_DONE         BIT(4)
505 +# define DSI1_STAT_TXPKT2_END          BIT(3)
506 +# define DSI1_STAT_TXPKT1_BUSY         BIT(2)
507 +# define DSI1_STAT_TXPKT1_DONE         BIT(1)
508 +# define DSI1_STAT_TXPKT1_END          BIT(0)
509 +
510 +#define DSI1_HSTX_TO_CNT       0x3c
511 +#define DSI1_LPRX_TO_CNT       0x40
512 +#define DSI1_TA_TO_CNT         0x44
513 +#define DSI1_PR_TO_CNT         0x48
514 +#define DSI1_PHYC              0x4c
515 +
516 +#define DSI1_HS_CLT0           0x50
517 +# define DSI_HS_CLT0_CZERO_MASK                VC4_MASK(26, 18)
518 +# define DSI_HS_CLT0_CZERO_SHIFT       18
519 +# define DSI_HS_CLT0_CPRE_MASK         VC4_MASK(17, 9)
520 +# define DSI_HS_CLT0_CPRE_SHIFT                9
521 +# define DSI_HS_CLT0_CPREP_MASK                VC4_MASK(8, 0)
522 +# define DSI_HS_CLT0_CPREP_SHIFT       0
523 +
524 +#define DSI1_HS_CLT1           0x54
525 +# define DSI_HS_CLT1_CTRAIL_MASK       VC4_MASK(17, 9)
526 +# define DSI_HS_CLT1_CTRAIL_SHIFT      9
527 +# define DSI_HS_CLT1_CPOST_MASK                VC4_MASK(8, 0)
528 +# define DSI_HS_CLT1_CPOST_SHIFT       0
529 +
530 +#define DSI1_HS_CLT2           0x58
531 +# define DSI_HS_CLT2_WUP_MASK          VC4_MASK(23, 0)
532 +# define DSI_HS_CLT2_WUP_SHIFT         0
533 +
534 +#define DSI1_HS_DLT3           0x5c
535 +# define DSI_HS_DLT3_EXIT_MASK         VC4_MASK(26, 18)
536 +# define DSI_HS_DLT3_EXIT_SHIFT                18
537 +# define DSI_HS_DLT3_ZERO_MASK         VC4_MASK(17, 9)
538 +# define DSI_HS_DLT3_ZERO_SHIFT                9
539 +# define DSI_HS_DLT3_PRE_MASK          VC4_MASK(8, 0)
540 +# define DSI_HS_DLT3_PRE_SHIFT         0
541 +
542 +#define DSI1_HS_DLT4           0x60
543 +# define DSI_HS_DLT4_ANLAT_MASK                VC4_MASK(22, 18)
544 +# define DSI_HS_DLT4_ANLAT_SHIFT       18
545 +# define DSI_HS_DLT4_TRAIL_MASK                VC4_MASK(17, 9)
546 +# define DSI_HS_DLT4_TRAIL_SHIFT       9
547 +# define DSI_HS_DLT4_LPX_MASK          VC4_MASK(8, 0)
548 +# define DSI_HS_DLT4_LPX_SHIFT         0
549 +
550 +#define DSI1_HS_DLT5           0x64
551 +# define DSI_HS_DLT5_INIT_MASK         VC4_MASK(23, 0)
552 +# define DSI_HS_DLT5_INIT_SHIFT                0
553 +
554 +#define DSI1_HS_DLT6           0x68
555 +# define DSI_HS_DLT6_TA_GET_MASK       VC4_MASK(31, 24)
556 +# define DSI_HS_DLT6_TA_GET_SHIFT      24
557 +# define DSI_HS_DLT6_TA_SURE_MASK      VC4_MASK(23, 16)
558 +# define DSI_HS_DLT6_TA_SURE_SHIFT     16
559 +# define DSI_HS_DLT6_TA_GO_MASK                VC4_MASK(15, 8)
560 +# define DSI_HS_DLT6_TA_GO_SHIFT       8
561 +# define DSI_HS_DLT6_LP_LPX_MASK       VC4_MASK(7, 0)
562 +# define DSI_HS_DLT6_LP_LPX_SHIFT      0
563 +
564 +#define DSI1_HS_DLT7           0x6c
565 +# define DSI_HS_DLT7_LP_WUP_MASK       VC4_MASK(23, 0)
566 +# define DSI_HS_DLT7_LP_WUP_SHIFT      0
567 +
568 +#define DSI1_PHY_AFEC0         0x70
569 +
570 +#define DSI1_PHY_AFEC1         0x74
571 +# define DSI1_PHY_AFEC1_ACTRL_DLANE3_MASK      VC4_MASK(19, 16)
572 +# define DSI1_PHY_AFEC1_ACTRL_DLANE3_SHIFT     16
573 +# define DSI1_PHY_AFEC1_ACTRL_DLANE2_MASK      VC4_MASK(15, 12)
574 +# define DSI1_PHY_AFEC1_ACTRL_DLANE2_SHIFT     12
575 +# define DSI1_PHY_AFEC1_ACTRL_DLANE1_MASK      VC4_MASK(11, 8)
576 +# define DSI1_PHY_AFEC1_ACTRL_DLANE1_SHIFT     8
577 +# define DSI1_PHY_AFEC1_ACTRL_DLANE0_MASK      VC4_MASK(7, 4)
578 +# define DSI1_PHY_AFEC1_ACTRL_DLANE0_SHIFT     4
579 +# define DSI1_PHY_AFEC1_ACTRL_CLANE_MASK       VC4_MASK(3, 0)
580 +# define DSI1_PHY_AFEC1_ACTRL_CLANE_SHIFT      0
581 +
582 +#define DSI1_TST_SEL           0x78
583 +#define DSI1_TST_MON           0x7c
584 +#define DSI1_PHY_TST1          0x80
585 +#define DSI1_PHY_TST2          0x84
586 +#define DSI1_PHY_FIFO_STAT     0x88
587 +/* Actually, all registers in the range that aren't otherwise claimed
588 + * will return the ID.
589 + */
590 +#define DSI1_ID                        0x8c
591 +
592 +/* General DSI hardware state. */
593 +struct vc4_dsi {
594 +       struct platform_device *pdev;
595 +
596 +       struct mipi_dsi_host dsi_host;
597 +       struct drm_encoder *encoder;
598 +       struct drm_connector *connector;
599 +       struct drm_panel *panel;
600 +
601 +       void __iomem *regs;
602 +
603 +       struct dma_chan *reg_dma_chan;
604 +       dma_addr_t reg_dma_paddr;
605 +       u32 *reg_dma_mem;
606 +       dma_addr_t reg_paddr;
607 +
608 +       /* Whether we're on bcm2835's DSI0 or DSI1. */
609 +       int port;
610 +
611 +       /* DSI channel for the panel we're connected to. */
612 +       u32 channel;
613 +       u32 lanes;
614 +       enum mipi_dsi_pixel_format format;
615 +       u32 mode_flags;
616 +
617 +       /* Input clock from CPRMAN to the digital PHY, for the DSI
618 +        * escape clock.
619 +        */
620 +       struct clk *escape_clock;
621 +
622 +       /* Input clock to the analog PHY, used to generate the DSI bit
623 +        * clock.
624 +        */
625 +       struct clk *pll_phy_clock;
626 +
627 +       /* HS Clocks generated within the DSI analog PHY. */
628 +       struct clk_fixed_factor phy_clocks[3];
629 +
630 +       struct clk_onecell_data clk_onecell;
631 +
632 +       /* Pixel clock output to the pixelvalve, generated from the HS
633 +        * clock.
634 +        */
635 +       struct clk *pixel_clock;
636 +
637 +       struct completion xfer_completion;
638 +       int xfer_result;
639 +};
640 +
641 +#define host_to_dsi(host) container_of(host, struct vc4_dsi, dsi_host)
642 +
643 +static inline void
644 +dsi_dma_workaround_write(struct vc4_dsi *dsi, u32 offset, u32 val)
645 +{
646 +       struct dma_chan *chan = dsi->reg_dma_chan;
647 +       struct dma_async_tx_descriptor *tx;
648 +       dma_cookie_t cookie;
649 +       int ret;
650 +
651 +       /* DSI0 should be able to write normally. */
652 +       if (!chan) {
653 +               writel(val, dsi->regs + offset);
654 +               return;
655 +       }
656 +
657 +       *dsi->reg_dma_mem = val;
658 +
659 +       tx = chan->device->device_prep_dma_memcpy(chan,
660 +                                                 dsi->reg_paddr + offset,
661 +                                                 dsi->reg_dma_paddr,
662 +                                                 4, 0);
663 +       if (!tx) {
664 +               DRM_ERROR("Failed to set up DMA register write\n");
665 +               return;
666 +       }
667 +
668 +       cookie = tx->tx_submit(tx);
669 +       ret = dma_submit_error(cookie);
670 +       if (ret) {
671 +               DRM_ERROR("Failed to submit DMA: %d\n", ret);
672 +               return;
673 +       }
674 +       ret = dma_sync_wait(chan, cookie);
675 +       if (ret)
676 +               DRM_ERROR("Failed to wait for DMA: %d\n", ret);
677 +}
678 +
679 +#define DSI_READ(offset) readl(dsi->regs + (offset))
680 +#define DSI_WRITE(offset, val) dsi_dma_workaround_write(dsi, offset, val)
681 +#define DSI_PORT_READ(offset) \
682 +       DSI_READ(dsi->port ? DSI1_##offset : DSI0_##offset)
683 +#define DSI_PORT_WRITE(offset, val) \
684 +       DSI_WRITE(dsi->port ? DSI1_##offset : DSI0_##offset, val)
685 +#define DSI_PORT_BIT(bit) (dsi->port ? DSI1_##bit : DSI0_##bit)
686 +
687 +/* VC4 DSI encoder KMS struct */
688 +struct vc4_dsi_encoder {
689 +       struct vc4_encoder base;
690 +       struct vc4_dsi *dsi;
691 +};
692 +
693 +static inline struct vc4_dsi_encoder *
694 +to_vc4_dsi_encoder(struct drm_encoder *encoder)
695 +{
696 +       return container_of(encoder, struct vc4_dsi_encoder, base.base);
697 +}
698 +
699 +/* VC4 DSI connector KMS struct */
700 +struct vc4_dsi_connector {
701 +       struct drm_connector base;
702 +       struct vc4_dsi *dsi;
703 +};
704 +
705 +static inline struct vc4_dsi_connector *
706 +to_vc4_dsi_connector(struct drm_connector *connector)
707 +{
708 +       return container_of(connector, struct vc4_dsi_connector, base);
709 +}
710 +
711 +#define DSI_REG(reg) { reg, #reg }
712 +static const struct {
713 +       u32 reg;
714 +       const char *name;
715 +} dsi0_regs[] = {
716 +       DSI_REG(DSI0_CTRL),
717 +       DSI_REG(DSI0_STAT),
718 +       DSI_REG(DSI0_HSTX_TO_CNT),
719 +       DSI_REG(DSI0_LPRX_TO_CNT),
720 +       DSI_REG(DSI0_TA_TO_CNT),
721 +       DSI_REG(DSI0_PR_TO_CNT),
722 +       DSI_REG(DSI0_DISP0_CTRL),
723 +       DSI_REG(DSI0_DISP1_CTRL),
724 +       DSI_REG(DSI0_INT_STAT),
725 +       DSI_REG(DSI0_INT_EN),
726 +       DSI_REG(DSI0_PHYC),
727 +       DSI_REG(DSI0_HS_CLT0),
728 +       DSI_REG(DSI0_HS_CLT1),
729 +       DSI_REG(DSI0_HS_CLT2),
730 +       DSI_REG(DSI0_HS_DLT3),
731 +       DSI_REG(DSI0_HS_DLT4),
732 +       DSI_REG(DSI0_HS_DLT5),
733 +       DSI_REG(DSI0_HS_DLT6),
734 +       DSI_REG(DSI0_HS_DLT7),
735 +       DSI_REG(DSI0_PHY_AFEC0),
736 +       DSI_REG(DSI0_PHY_AFEC1),
737 +       DSI_REG(DSI0_ID),
738 +};
739 +
740 +static const struct {
741 +       u32 reg;
742 +       const char *name;
743 +} dsi1_regs[] = {
744 +       DSI_REG(DSI1_CTRL),
745 +       DSI_REG(DSI1_STAT),
746 +       DSI_REG(DSI1_HSTX_TO_CNT),
747 +       DSI_REG(DSI1_LPRX_TO_CNT),
748 +       DSI_REG(DSI1_TA_TO_CNT),
749 +       DSI_REG(DSI1_PR_TO_CNT),
750 +       DSI_REG(DSI1_DISP0_CTRL),
751 +       DSI_REG(DSI1_DISP1_CTRL),
752 +       DSI_REG(DSI1_INT_STAT),
753 +       DSI_REG(DSI1_INT_EN),
754 +       DSI_REG(DSI1_PHYC),
755 +       DSI_REG(DSI1_HS_CLT0),
756 +       DSI_REG(DSI1_HS_CLT1),
757 +       DSI_REG(DSI1_HS_CLT2),
758 +       DSI_REG(DSI1_HS_DLT3),
759 +       DSI_REG(DSI1_HS_DLT4),
760 +       DSI_REG(DSI1_HS_DLT5),
761 +       DSI_REG(DSI1_HS_DLT6),
762 +       DSI_REG(DSI1_HS_DLT7),
763 +       DSI_REG(DSI1_PHY_AFEC0),
764 +       DSI_REG(DSI1_PHY_AFEC1),
765 +       DSI_REG(DSI1_ID),
766 +};
767 +
768 +static void vc4_dsi_dump_regs(struct vc4_dsi *dsi)
769 +{
770 +       int i;
771 +
772 +       if (dsi->port == 0) {
773 +               for (i = 0; i < ARRAY_SIZE(dsi0_regs); i++) {
774 +                       DRM_INFO("0x%04x (%s): 0x%08x\n",
775 +                                dsi0_regs[i].reg, dsi0_regs[i].name,
776 +                                DSI_READ(dsi0_regs[i].reg));
777 +               }
778 +       } else {
779 +               for (i = 0; i < ARRAY_SIZE(dsi1_regs); i++) {
780 +                       DRM_INFO("0x%04x (%s): 0x%08x\n",
781 +                                dsi1_regs[i].reg, dsi1_regs[i].name,
782 +                                DSI_READ(dsi1_regs[i].reg));
783 +               }
784 +       }
785 +}
786 +
787 +#ifdef CONFIG_DEBUG_FS
788 +int vc4_dsi_debugfs_regs(struct seq_file *m, void *unused)
789 +{
790 +       struct drm_info_node *node = (struct drm_info_node *)m->private;
791 +       struct drm_device *drm = node->minor->dev;
792 +       struct vc4_dev *vc4 = to_vc4_dev(drm);
793 +       int dsi_index = (uintptr_t)node->info_ent->data;
794 +       struct vc4_dsi *dsi = (dsi_index == 1 ? vc4->dsi1 : NULL);
795 +       int i;
796 +
797 +       if (!dsi)
798 +               return 0;
799 +
800 +       if (dsi->port == 0) {
801 +               for (i = 0; i < ARRAY_SIZE(dsi0_regs); i++) {
802 +                       seq_printf(m, "0x%04x (%s): 0x%08x\n",
803 +                                  dsi0_regs[i].reg, dsi0_regs[i].name,
804 +                                  DSI_READ(dsi0_regs[i].reg));
805 +               }
806 +       } else {
807 +               for (i = 0; i < ARRAY_SIZE(dsi1_regs); i++) {
808 +                       seq_printf(m, "0x%04x (%s): 0x%08x\n",
809 +                                  dsi1_regs[i].reg, dsi1_regs[i].name,
810 +                                  DSI_READ(dsi1_regs[i].reg));
811 +               }
812 +       }
813 +
814 +       return 0;
815 +}
816 +#endif
817 +
818 +static enum drm_connector_status
819 +vc4_dsi_connector_detect(struct drm_connector *connector, bool force)
820 +{
821 +       struct vc4_dsi_connector *vc4_connector =
822 +               to_vc4_dsi_connector(connector);
823 +       struct vc4_dsi *dsi = vc4_connector->dsi;
824 +
825 +       if (dsi->panel)
826 +               return connector_status_connected;
827 +       else
828 +               return connector_status_disconnected;
829 +}
830 +
831 +static void vc4_dsi_connector_destroy(struct drm_connector *connector)
832 +{
833 +       drm_connector_unregister(connector);
834 +       drm_connector_cleanup(connector);
835 +}
836 +
837 +static int vc4_dsi_connector_get_modes(struct drm_connector *connector)
838 +{
839 +       struct vc4_dsi_connector *vc4_connector =
840 +               to_vc4_dsi_connector(connector);
841 +       struct vc4_dsi *dsi = vc4_connector->dsi;
842 +
843 +       if (dsi->panel)
844 +               return drm_panel_get_modes(dsi->panel);
845 +
846 +       return 0;
847 +}
848 +
849 +static const struct drm_connector_funcs vc4_dsi_connector_funcs = {
850 +       .dpms = drm_atomic_helper_connector_dpms,
851 +       .detect = vc4_dsi_connector_detect,
852 +       .fill_modes = drm_helper_probe_single_connector_modes,
853 +       .destroy = vc4_dsi_connector_destroy,
854 +       .reset = drm_atomic_helper_connector_reset,
855 +       .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
856 +       .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
857 +};
858 +
859 +static const struct drm_connector_helper_funcs vc4_dsi_connector_helper_funcs = {
860 +       .get_modes = vc4_dsi_connector_get_modes,
861 +};
862 +
863 +static struct drm_connector *vc4_dsi_connector_init(struct drm_device *dev,
864 +                                                   struct vc4_dsi *dsi)
865 +{
866 +       struct drm_connector *connector = NULL;
867 +       struct vc4_dsi_connector *dsi_connector;
868 +       int ret = 0;
869 +
870 +       dsi_connector = devm_kzalloc(dev->dev, sizeof(*dsi_connector),
871 +                                    GFP_KERNEL);
872 +       if (!dsi_connector) {
873 +               ret = -ENOMEM;
874 +               goto fail;
875 +       }
876 +       connector = &dsi_connector->base;
877 +
878 +       dsi_connector->dsi = dsi;
879 +
880 +       drm_connector_init(dev, connector, &vc4_dsi_connector_funcs,
881 +                          DRM_MODE_CONNECTOR_DSI);
882 +       drm_connector_helper_add(connector, &vc4_dsi_connector_helper_funcs);
883 +
884 +       connector->polled = 0;
885 +       connector->interlace_allowed = 0;
886 +       connector->doublescan_allowed = 0;
887 +
888 +       drm_mode_connector_attach_encoder(connector, dsi->encoder);
889 +
890 +       return connector;
891 +
892 +fail:
893 +       if (connector)
894 +               vc4_dsi_connector_destroy(connector);
895 +
896 +       return ERR_PTR(ret);
897 +}
898 +
899 +static void vc4_dsi_encoder_destroy(struct drm_encoder *encoder)
900 +{
901 +       drm_encoder_cleanup(encoder);
902 +}
903 +
904 +static const struct drm_encoder_funcs vc4_dsi_encoder_funcs = {
905 +       .destroy = vc4_dsi_encoder_destroy,
906 +};
907 +
908 +static void vc4_dsi_latch_ulps(struct vc4_dsi *dsi, bool latch)
909 +{
910 +       u32 afec0 = DSI_PORT_READ(PHY_AFEC0);
911 +
912 +       if (latch)
913 +               afec0 |= DSI_PORT_BIT(PHY_AFEC0_LATCH_ULPS);
914 +       else
915 +               afec0 &= ~DSI_PORT_BIT(PHY_AFEC0_LATCH_ULPS);
916 +
917 +       DSI_PORT_WRITE(PHY_AFEC0, afec0);
918 +}
919 +
920 +/* Enters or exits Ultra Low Power State. */
921 +static void vc4_dsi_ulps(struct vc4_dsi *dsi, bool ulps)
922 +{
923 +       bool continuous = dsi->mode_flags & MIPI_DSI_CLOCK_NON_CONTINUOUS;
924 +       u32 phyc_ulps = ((continuous ? DSI_PORT_BIT(PHYC_CLANE_ULPS) : 0) |
925 +                        DSI_PHYC_DLANE0_ULPS |
926 +                        (dsi->lanes > 1 ? DSI_PHYC_DLANE1_ULPS : 0) |
927 +                        (dsi->lanes > 2 ? DSI_PHYC_DLANE2_ULPS : 0) |
928 +                        (dsi->lanes > 3 ? DSI_PHYC_DLANE3_ULPS : 0));
929 +       u32 stat_ulps = ((continuous ? DSI1_STAT_PHY_CLOCK_ULPS : 0) |
930 +                        DSI1_STAT_PHY_D0_ULPS |
931 +                        (dsi->lanes > 1 ? DSI1_STAT_PHY_D1_ULPS : 0) |
932 +                        (dsi->lanes > 2 ? DSI1_STAT_PHY_D2_ULPS : 0) |
933 +                        (dsi->lanes > 3 ? DSI1_STAT_PHY_D3_ULPS : 0));
934 +       u32 stat_stop = ((continuous ? DSI1_STAT_PHY_CLOCK_STOP : 0) |
935 +                        DSI1_STAT_PHY_D0_STOP |
936 +                        (dsi->lanes > 1 ? DSI1_STAT_PHY_D1_STOP : 0) |
937 +                        (dsi->lanes > 2 ? DSI1_STAT_PHY_D2_STOP : 0) |
938 +                        (dsi->lanes > 3 ? DSI1_STAT_PHY_D3_STOP : 0));
939 +       int ret;
940 +
941 +       DSI_PORT_WRITE(STAT, stat_ulps);
942 +       DSI_PORT_WRITE(PHYC, DSI_PORT_READ(PHYC) | phyc_ulps);
943 +       ret = wait_for((DSI_PORT_READ(STAT) & stat_ulps) == stat_ulps, 200);
944 +       if (ret) {
945 +               dev_warn(&dsi->pdev->dev,
946 +                        "Timeout waiting for DSI ULPS entry: STAT 0x%08x",
947 +                        DSI_PORT_READ(STAT));
948 +               DSI_PORT_WRITE(PHYC, DSI_PORT_READ(PHYC) & ~phyc_ulps);
949 +               vc4_dsi_latch_ulps(dsi, false);
950 +               return;
951 +       }
952 +
953 +       /* The DSI module can't be disabled while the module is
954 +        * generating ULPS state.  So, to be able to disable the
955 +        * module, we have the AFE latch the ULPS state and continue
956 +        * on to having the module enter STOP.
957 +        */
958 +       vc4_dsi_latch_ulps(dsi, ulps);
959 +
960 +       DSI_PORT_WRITE(STAT, stat_stop);
961 +       DSI_PORT_WRITE(PHYC, DSI_PORT_READ(PHYC) & ~phyc_ulps);
962 +       ret = wait_for((DSI_PORT_READ(STAT) & stat_stop) == stat_stop, 200);
963 +       if (ret) {
964 +               dev_warn(&dsi->pdev->dev,
965 +                        "Timeout waiting for DSI STOP entry: STAT 0x%08x",
966 +                        DSI_PORT_READ(STAT));
967 +               DSI_PORT_WRITE(PHYC, DSI_PORT_READ(PHYC) & ~phyc_ulps);
968 +               return;
969 +       }
970 +}
971 +
972 +static u32
973 +dsi_hs_timing(u32 ui_ns, u32 ns, u32 ui)
974 +{
975 +       /* The HS timings have to be rounded up to a multiple of 8
976 +        * because we're using the byte clock.
977 +        */
978 +       return roundup(ui + DIV_ROUND_UP(ns, ui_ns), 8);
979 +}
980 +
981 +/* ESC always runs at 100Mhz. */
982 +#define ESC_TIME_NS 10
983 +
984 +static u32
985 +dsi_esc_timing(u32 ns)
986 +{
987 +       return DIV_ROUND_UP(ns, ESC_TIME_NS);
988 +}
989 +
990 +static void vc4_dsi_encoder_disable(struct drm_encoder *encoder)
991 +{
992 +       struct vc4_dsi_encoder *vc4_encoder = to_vc4_dsi_encoder(encoder);
993 +       struct vc4_dsi *dsi = vc4_encoder->dsi;
994 +       struct device *dev = &dsi->pdev->dev;
995 +
996 +       drm_panel_disable(dsi->panel);
997 +
998 +       vc4_dsi_ulps(dsi, true);
999 +
1000 +       drm_panel_unprepare(dsi->panel);
1001 +
1002 +       clk_disable_unprepare(dsi->pll_phy_clock);
1003 +       clk_disable_unprepare(dsi->escape_clock);
1004 +       clk_disable_unprepare(dsi->pixel_clock);
1005 +
1006 +       pm_runtime_put(dev);
1007 +}
1008 +
1009 +static void vc4_dsi_encoder_enable(struct drm_encoder *encoder)
1010 +{
1011 +       struct drm_display_mode *mode = &encoder->crtc->mode;
1012 +       struct vc4_dsi_encoder *vc4_encoder = to_vc4_dsi_encoder(encoder);
1013 +       struct vc4_dsi *dsi = vc4_encoder->dsi;
1014 +       struct device *dev = &dsi->pdev->dev;
1015 +       u32 format = 0, divider = 0;
1016 +       bool debug_dump_regs = false;
1017 +       unsigned long hs_clock;
1018 +       u32 ui_ns;
1019 +       /* Minimum LP state duration in escape clock cycles. */
1020 +       u32 lpx = dsi_esc_timing(60);
1021 +       unsigned long pixel_clock_hz = mode->clock * 1000;
1022 +       unsigned long dsip_clock;
1023 +       unsigned long phy_clock;
1024 +       int ret;
1025 +
1026 +       ret = pm_runtime_get_sync(dev);
1027 +       if (ret) {
1028 +               DRM_ERROR("Failed to runtime PM enable on DSI%d\n", dsi->port);
1029 +               return;
1030 +       }
1031 +
1032 +       ret = drm_panel_prepare(dsi->panel);
1033 +       if (ret) {
1034 +               DRM_ERROR("Panel failed to prepare\n");
1035 +               return;
1036 +       }
1037 +
1038 +       if (debug_dump_regs) {
1039 +               DRM_INFO("DSI regs before:\n");
1040 +               vc4_dsi_dump_regs(dsi);
1041 +       }
1042 +
1043 +       switch (dsi->format) {
1044 +       case MIPI_DSI_FMT_RGB888:
1045 +               format = DSI_PFORMAT_RGB888;
1046 +               divider = 24 / dsi->lanes;
1047 +               break;
1048 +       case MIPI_DSI_FMT_RGB666:
1049 +               format = DSI_PFORMAT_RGB666;
1050 +               divider = 24 / dsi->lanes;
1051 +               break;
1052 +       case MIPI_DSI_FMT_RGB666_PACKED:
1053 +               format = DSI_PFORMAT_RGB666_PACKED;
1054 +               divider = 18 / dsi->lanes;
1055 +               break;
1056 +       case MIPI_DSI_FMT_RGB565:
1057 +               format = DSI_PFORMAT_RGB565;
1058 +               divider = 16 / dsi->lanes;
1059 +               break;
1060 +       }
1061 +
1062 +       phy_clock = pixel_clock_hz * divider;
1063 +       ret = clk_set_rate(dsi->pll_phy_clock, phy_clock);
1064 +       if (ret) {
1065 +               dev_err(&dsi->pdev->dev,
1066 +                       "Failed to set phy clock to %ld: %d\n", phy_clock, ret);
1067 +       }
1068 +
1069 +       /* Reset the DSI and all its fifos. */
1070 +       DSI_PORT_WRITE(CTRL,
1071 +                      DSI_CTRL_SOFT_RESET_CFG |
1072 +                      DSI_PORT_BIT(CTRL_RESET_FIFOS));
1073 +
1074 +       DSI_PORT_WRITE(CTRL,
1075 +                      DSI_CTRL_HSDT_EOT_DISABLE |
1076 +                      DSI_CTRL_RX_LPDT_EOT_DISABLE);
1077 +
1078 +       /* Clear all stat bits so we see what has happened during enable. */
1079 +       DSI_PORT_WRITE(STAT, DSI_PORT_READ(STAT));
1080 +
1081 +       /* Set AFE CTR00/CTR1 to release powerdown of analog. */
1082 +       if (dsi->port == 0) {
1083 +               u32 afec0 = (VC4_SET_FIELD(7, DSI_PHY_AFEC0_PTATADJ) |
1084 +                            VC4_SET_FIELD(7, DSI_PHY_AFEC0_CTATADJ));
1085 +
1086 +               if (dsi->lanes < 2)
1087 +                       afec0 |= DSI0_PHY_AFEC0_PD_DLANE1;
1088 +
1089 +               if (!(dsi->mode_flags & MIPI_DSI_MODE_VIDEO))
1090 +                       afec0 |= DSI0_PHY_AFEC0_RESET;
1091 +
1092 +               DSI_PORT_WRITE(PHY_AFEC0, afec0);
1093 +
1094 +               DSI_PORT_WRITE(PHY_AFEC1,
1095 +                              VC4_SET_FIELD(6,  DSI0_PHY_AFEC1_IDR_DLANE1) |
1096 +                              VC4_SET_FIELD(6,  DSI0_PHY_AFEC1_IDR_DLANE0) |
1097 +                              VC4_SET_FIELD(6,  DSI0_PHY_AFEC1_IDR_CLANE));
1098 +       } else {
1099 +               u32 afec0 = (VC4_SET_FIELD(7, DSI_PHY_AFEC0_PTATADJ) |
1100 +                            VC4_SET_FIELD(7, DSI_PHY_AFEC0_CTATADJ) |
1101 +                            VC4_SET_FIELD(6, DSI1_PHY_AFEC0_IDR_CLANE) |
1102 +                            VC4_SET_FIELD(6, DSI1_PHY_AFEC0_IDR_DLANE0) |
1103 +                            VC4_SET_FIELD(6, DSI1_PHY_AFEC0_IDR_DLANE1) |
1104 +                            VC4_SET_FIELD(6, DSI1_PHY_AFEC0_IDR_DLANE2) |
1105 +                            VC4_SET_FIELD(6, DSI1_PHY_AFEC0_IDR_DLANE3));
1106 +
1107 +               if (dsi->lanes < 4)
1108 +                       afec0 |= DSI1_PHY_AFEC0_PD_DLANE3;
1109 +               if (dsi->lanes < 3)
1110 +                       afec0 |= DSI1_PHY_AFEC0_PD_DLANE2;
1111 +               if (dsi->lanes < 2)
1112 +                       afec0 |= DSI1_PHY_AFEC0_PD_DLANE1;
1113 +
1114 +               afec0 |= DSI1_PHY_AFEC0_RESET;
1115 +
1116 +               DSI_PORT_WRITE(PHY_AFEC0, afec0);
1117 +
1118 +               DSI_PORT_WRITE(PHY_AFEC1, 0);
1119 +
1120 +               /* AFEC reset hold time */
1121 +               mdelay(1);
1122 +       }
1123 +
1124 +       ret = clk_prepare_enable(dsi->escape_clock);
1125 +       if (ret) {
1126 +               DRM_ERROR("Failed to turn on DSI escape clock: %d\n", ret);
1127 +               return;
1128 +       }
1129 +
1130 +       ret = clk_prepare_enable(dsi->pll_phy_clock);
1131 +       if (ret) {
1132 +               DRM_ERROR("Failed to turn on DSI PLL: %d\n", ret);
1133 +               return;
1134 +       }
1135 +
1136 +       hs_clock = clk_get_rate(dsi->pll_phy_clock);
1137 +
1138 +       /* Yes, we set the DSI0P/DSI1P pixel clock to the byte rate,
1139 +        * not the pixel clock rate.  DSIxP take from the APHY's byte,
1140 +        * DDR2, or DDR4 clock (we use byte) and feed into the PV at
1141 +        * that rate.  Separately, a value derived from PIX_CLK_DIV
1142 +        * and HS_CLKC is fed into the PV to divide down to the actual
1143 +        * pixel clock for pushing pixels into DSI.
1144 +        */
1145 +       dsip_clock = phy_clock / 8;
1146 +       ret = clk_set_rate(dsi->pixel_clock, dsip_clock);
1147 +       if (ret) {
1148 +               dev_err(dev, "Failed to set pixel clock to %ldHz: %d\n",
1149 +                       dsip_clock, ret);
1150 +       }
1151 +
1152 +       ret = clk_prepare_enable(dsi->pixel_clock);
1153 +       if (ret) {
1154 +               DRM_ERROR("Failed to turn on DSI pixel clock: %d\n", ret);
1155 +               return;
1156 +       }
1157 +
1158 +       /* How many ns one DSI unit interval is.  Note that the clock
1159 +        * is DDR, so there's an extra divide by 2.
1160 +        */
1161 +       ui_ns = DIV_ROUND_UP(500000000, hs_clock);
1162 +
1163 +       DSI_PORT_WRITE(HS_CLT0,
1164 +                      VC4_SET_FIELD(dsi_hs_timing(ui_ns, 262, 0),
1165 +                                    DSI_HS_CLT0_CZERO) |
1166 +                      VC4_SET_FIELD(dsi_hs_timing(ui_ns, 0, 8),
1167 +                                    DSI_HS_CLT0_CPRE) |
1168 +                      VC4_SET_FIELD(dsi_hs_timing(ui_ns, 38, 0),
1169 +                                    DSI_HS_CLT0_CPREP));
1170 +
1171 +       DSI_PORT_WRITE(HS_CLT1,
1172 +                      VC4_SET_FIELD(dsi_hs_timing(ui_ns, 60, 0),
1173 +                                    DSI_HS_CLT1_CTRAIL) |
1174 +                      VC4_SET_FIELD(dsi_hs_timing(ui_ns, 60, 52),
1175 +                                    DSI_HS_CLT1_CPOST));
1176 +
1177 +       DSI_PORT_WRITE(HS_CLT2,
1178 +                      VC4_SET_FIELD(dsi_hs_timing(ui_ns, 1000000, 0),
1179 +                                    DSI_HS_CLT2_WUP));
1180 +
1181 +       DSI_PORT_WRITE(HS_DLT3,
1182 +                      VC4_SET_FIELD(dsi_hs_timing(ui_ns, 100, 0),
1183 +                                    DSI_HS_DLT3_EXIT) |
1184 +                      VC4_SET_FIELD(dsi_hs_timing(ui_ns, 105, 6),
1185 +                                    DSI_HS_DLT3_ZERO) |
1186 +                      VC4_SET_FIELD(dsi_hs_timing(ui_ns, 40, 4),
1187 +                                    DSI_HS_DLT3_PRE));
1188 +
1189 +       DSI_PORT_WRITE(HS_DLT4,
1190 +                      VC4_SET_FIELD(dsi_hs_timing(ui_ns, lpx * ESC_TIME_NS, 0),
1191 +                                    DSI_HS_DLT4_LPX) |
1192 +                      VC4_SET_FIELD(max(dsi_hs_timing(ui_ns, 0, 8),
1193 +                                        dsi_hs_timing(ui_ns, 60, 4)),
1194 +                                    DSI_HS_DLT4_TRAIL) |
1195 +                      VC4_SET_FIELD(0, DSI_HS_DLT4_ANLAT));
1196 +
1197 +       DSI_PORT_WRITE(HS_DLT5, VC4_SET_FIELD(dsi_hs_timing(ui_ns, 1000, 5000),
1198 +                                             DSI_HS_DLT5_INIT));
1199 +
1200 +       DSI_PORT_WRITE(HS_DLT6,
1201 +                      VC4_SET_FIELD(lpx * 5, DSI_HS_DLT6_TA_GET) |
1202 +                      VC4_SET_FIELD(lpx, DSI_HS_DLT6_TA_SURE) |
1203 +                      VC4_SET_FIELD(lpx * 4, DSI_HS_DLT6_TA_GO) |
1204 +                      VC4_SET_FIELD(lpx, DSI_HS_DLT6_LP_LPX));
1205 +
1206 +       DSI_PORT_WRITE(HS_DLT7,
1207 +                      VC4_SET_FIELD(dsi_esc_timing(1000000),
1208 +                                    DSI_HS_DLT7_LP_WUP));
1209 +
1210 +       DSI_PORT_WRITE(PHYC,
1211 +                      DSI_PHYC_DLANE0_ENABLE |
1212 +                      (dsi->lanes >= 2 ? DSI_PHYC_DLANE1_ENABLE : 0) |
1213 +                      (dsi->lanes >= 3 ? DSI_PHYC_DLANE2_ENABLE : 0) |
1214 +                      (dsi->lanes >= 4 ? DSI_PHYC_DLANE3_ENABLE : 0) |
1215 +                      DSI_PORT_BIT(PHYC_CLANE_ENABLE) |
1216 +                      ((dsi->mode_flags & MIPI_DSI_CLOCK_NON_CONTINUOUS) ?
1217 +                       0 : DSI_PORT_BIT(PHYC_HS_CLK_CONTINUOUS)) |
1218 +                      (dsi->port == 0 ?
1219 +                       VC4_SET_FIELD(lpx - 1, DSI0_PHYC_ESC_CLK_LPDT) :
1220 +                       VC4_SET_FIELD(lpx - 1, DSI1_PHYC_ESC_CLK_LPDT)));
1221 +
1222 +       DSI_PORT_WRITE(CTRL,
1223 +                      DSI_PORT_READ(CTRL) |
1224 +                      DSI_CTRL_CAL_BYTE);
1225 +
1226 +       /* HS timeout in HS clock cycles: disabled. */
1227 +       DSI_PORT_WRITE(HSTX_TO_CNT, 0);
1228 +       /* LP receive timeout in HS clocks. */
1229 +       DSI_PORT_WRITE(LPRX_TO_CNT, 0xffffff);
1230 +       /* Bus turnaround timeout */
1231 +       DSI_PORT_WRITE(TA_TO_CNT, 100000);
1232 +       /* Display reset sequence timeout */
1233 +       DSI_PORT_WRITE(PR_TO_CNT, 100000);
1234 +
1235 +       if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO) {
1236 +               DSI_PORT_WRITE(DISP0_CTRL,
1237 +                              VC4_SET_FIELD(divider, DSI_DISP0_PIX_CLK_DIV) |
1238 +                              VC4_SET_FIELD(format, DSI_DISP0_PFORMAT) |
1239 +                              VC4_SET_FIELD(DSI_DISP0_LP_STOP_PERFRAME,
1240 +                                            DSI_DISP0_LP_STOP_CTRL) |
1241 +                              DSI_DISP0_ST_END |
1242 +                              DSI_DISP0_ENABLE);
1243 +       } else {
1244 +               DSI_PORT_WRITE(DISP0_CTRL,
1245 +                              DSI_DISP0_COMMAND_MODE |
1246 +                              DSI_DISP0_ENABLE);
1247 +       }
1248 +
1249 +       /* Set up DISP1 for transferring long command payloads through
1250 +        * the pixfifo.
1251 +        */
1252 +       DSI_PORT_WRITE(DISP1_CTRL,
1253 +                      VC4_SET_FIELD(DSI_DISP1_PFORMAT_32BIT_LE,
1254 +                                    DSI_DISP1_PFORMAT) |
1255 +                      DSI_DISP1_ENABLE);
1256 +
1257 +       /* Ungate the block. */
1258 +       if (dsi->port == 0)
1259 +               DSI_PORT_WRITE(CTRL, DSI_PORT_READ(CTRL) | DSI0_CTRL_CTRL0);
1260 +       else
1261 +               DSI_PORT_WRITE(CTRL, DSI_PORT_READ(CTRL) | DSI1_CTRL_EN);
1262 +
1263 +       /* Bring AFE out of reset. */
1264 +       if (dsi->port == 0) {
1265 +       } else {
1266 +               DSI_PORT_WRITE(PHY_AFEC0,
1267 +                              DSI_PORT_READ(PHY_AFEC0) &
1268 +                              ~DSI1_PHY_AFEC0_RESET);
1269 +       }
1270 +
1271 +       vc4_dsi_ulps(dsi, false);
1272 +
1273 +       if (debug_dump_regs) {
1274 +               DRM_INFO("DSI regs after:\n");
1275 +               vc4_dsi_dump_regs(dsi);
1276 +       }
1277 +
1278 +       ret = drm_panel_enable(dsi->panel);
1279 +       if (ret) {
1280 +               DRM_ERROR("Panel failed to enable\n");
1281 +               drm_panel_unprepare(dsi->panel);
1282 +               return;
1283 +       }
1284 +}
1285 +
1286 +static ssize_t vc4_dsi_host_transfer(struct mipi_dsi_host *host,
1287 +                                    const struct mipi_dsi_msg *msg)
1288 +{
1289 +       struct vc4_dsi *dsi = host_to_dsi(host);
1290 +       struct mipi_dsi_packet packet;
1291 +       u32 pkth = 0, pktc = 0;
1292 +       int i, ret;
1293 +       bool is_long = mipi_dsi_packet_format_is_long(msg->type);
1294 +       u32 cmd_fifo_len = 0, pix_fifo_len = 0;
1295 +
1296 +       mipi_dsi_create_packet(&packet, msg);
1297 +
1298 +       pkth |= VC4_SET_FIELD(packet.header[0], DSI_TXPKT1H_BC_DT);
1299 +       pkth |= VC4_SET_FIELD(packet.header[1] |
1300 +                             (packet.header[2] << 8),
1301 +                             DSI_TXPKT1H_BC_PARAM);
1302 +       if (is_long) {
1303 +               /* Divide data across the various FIFOs we have available.
1304 +                * The command FIFO takes byte-oriented data, but is of
1305 +                * limited size. The pixel FIFO (never actually used for
1306 +                * pixel data in reality) is word oriented, and substantially
1307 +                * larger. So, we use the pixel FIFO for most of the data,
1308 +                * sending the residual bytes in the command FIFO at the start.
1309 +                *
1310 +                * With this arrangement, the command FIFO will never get full.
1311 +                */
1312 +               if (packet.payload_length <= 16) {
1313 +                       cmd_fifo_len = packet.payload_length;
1314 +                       pix_fifo_len = 0;
1315 +               } else {
1316 +                       cmd_fifo_len = (packet.payload_length %
1317 +                                       DSI_PIX_FIFO_WIDTH);
1318 +                       pix_fifo_len = ((packet.payload_length - cmd_fifo_len) /
1319 +                                       DSI_PIX_FIFO_WIDTH);
1320 +               }
1321 +
1322 +               WARN_ON_ONCE(pix_fifo_len >= DSI_PIX_FIFO_DEPTH);
1323 +
1324 +               pkth |= VC4_SET_FIELD(cmd_fifo_len, DSI_TXPKT1H_BC_CMDFIFO);
1325 +       }
1326 +
1327 +       if (msg->rx_len) {
1328 +               pktc |= VC4_SET_FIELD(DSI_TXPKT1C_CMD_CTRL_RX,
1329 +                                     DSI_TXPKT1C_CMD_CTRL);
1330 +       } else {
1331 +               pktc |= VC4_SET_FIELD(DSI_TXPKT1C_CMD_CTRL_TX,
1332 +                                     DSI_TXPKT1C_CMD_CTRL);
1333 +       }
1334 +
1335 +       for (i = 0; i < cmd_fifo_len; i++)
1336 +               DSI_PORT_WRITE(TXPKT_CMD_FIFO, packet.payload[i]);
1337 +       for (i = 0; i < pix_fifo_len; i++) {
1338 +               const u8 *pix = packet.payload + cmd_fifo_len + i * 4;
1339 +
1340 +               DSI_PORT_WRITE(TXPKT_PIX_FIFO,
1341 +                              pix[0] |
1342 +                              pix[1] << 8 |
1343 +                              pix[2] << 16 |
1344 +                              pix[3] << 24);
1345 +       }
1346 +
1347 +       if (msg->flags & MIPI_DSI_MSG_USE_LPM)
1348 +               pktc |= DSI_TXPKT1C_CMD_MODE_LP;
1349 +       if (is_long)
1350 +               pktc |= DSI_TXPKT1C_CMD_TYPE_LONG;
1351 +
1352 +       /* Send one copy of the packet.  Larger repeats are used for pixel
1353 +        * data in command mode.
1354 +        */
1355 +       pktc |= VC4_SET_FIELD(1, DSI_TXPKT1C_CMD_REPEAT);
1356 +
1357 +       pktc |= DSI_TXPKT1C_CMD_EN;
1358 +       if (pix_fifo_len) {
1359 +               pktc |= VC4_SET_FIELD(DSI_TXPKT1C_DISPLAY_NO_SECONDARY,
1360 +                                     DSI_TXPKT1C_DISPLAY_NO);
1361 +       } else {
1362 +               pktc |= VC4_SET_FIELD(DSI_TXPKT1C_DISPLAY_NO_SHORT,
1363 +                                     DSI_TXPKT1C_DISPLAY_NO);
1364 +       }
1365 +
1366 +       /* Enable the appropriate interrupt for the transfer completion. */
1367 +       dsi->xfer_result = 0;
1368 +       reinit_completion(&dsi->xfer_completion);
1369 +       DSI_PORT_WRITE(INT_STAT, DSI1_INT_TXPKT1_DONE | DSI1_INT_PHY_DIR_RTF);
1370 +       if (msg->rx_len) {
1371 +               DSI_PORT_WRITE(INT_EN, (DSI1_INTERRUPTS_ALWAYS_ENABLED |
1372 +                                       DSI1_INT_PHY_DIR_RTF));
1373 +       } else {
1374 +               DSI_PORT_WRITE(INT_EN, (DSI1_INTERRUPTS_ALWAYS_ENABLED |
1375 +                                       DSI1_INT_TXPKT1_DONE));
1376 +       }
1377 +
1378 +       /* Send the packet. */
1379 +       DSI_PORT_WRITE(TXPKT1H, pkth);
1380 +       DSI_PORT_WRITE(TXPKT1C, pktc);
1381 +
1382 +       if (!wait_for_completion_timeout(&dsi->xfer_completion,
1383 +                                        msecs_to_jiffies(1000))) {
1384 +               dev_err(&dsi->pdev->dev, "transfer interrupt wait timeout");
1385 +               dev_err(&dsi->pdev->dev, "instat: 0x%08x\n",
1386 +                       DSI_PORT_READ(INT_STAT));
1387 +               ret = -ETIMEDOUT;
1388 +       } else {
1389 +               ret = dsi->xfer_result;
1390 +       }
1391 +
1392 +       DSI_PORT_WRITE(INT_EN, DSI1_INTERRUPTS_ALWAYS_ENABLED);
1393 +
1394 +       if (ret)
1395 +               goto reset_fifo_and_return;
1396 +
1397 +       if (ret == 0 && msg->rx_len) {
1398 +               u32 rxpkt1h = DSI_PORT_READ(RXPKT1H);
1399 +               u8 *msg_rx = msg->rx_buf;
1400 +
1401 +               if (rxpkt1h & DSI_RXPKT1H_PKT_TYPE_LONG) {
1402 +                       u32 rxlen = VC4_GET_FIELD(rxpkt1h,
1403 +                                                 DSI_RXPKT1H_BC_PARAM);
1404 +
1405 +                       if (rxlen != msg->rx_len) {
1406 +                               DRM_ERROR("DSI returned %db, expecting %db\n",
1407 +                                         rxlen, (int)msg->rx_len);
1408 +                               ret = -ENXIO;
1409 +                               goto reset_fifo_and_return;
1410 +                       }
1411 +
1412 +                       for (i = 0; i < msg->rx_len; i++)
1413 +                               msg_rx[i] = DSI_READ(DSI1_RXPKT_FIFO);
1414 +               } else {
1415 +                       /* FINISHME: Handle AWER */
1416 +
1417 +                       msg_rx[0] = VC4_GET_FIELD(rxpkt1h,
1418 +                                                 DSI_RXPKT1H_SHORT_0);
1419 +                       if (msg->rx_len > 1) {
1420 +                               msg_rx[1] = VC4_GET_FIELD(rxpkt1h,
1421 +                                                         DSI_RXPKT1H_SHORT_1);
1422 +                       }
1423 +               }
1424 +       }
1425 +
1426 +       return ret;
1427 +
1428 +reset_fifo_and_return:
1429 +       DRM_ERROR("DSI transfer failed, resetting: %d\n", ret);
1430 +
1431 +       DSI_PORT_WRITE(TXPKT1C, DSI_PORT_READ(TXPKT1C) & ~DSI_TXPKT1C_CMD_EN);
1432 +       udelay(1);
1433 +       DSI_PORT_WRITE(CTRL,
1434 +                      DSI_PORT_READ(CTRL) |
1435 +                      DSI_PORT_BIT(CTRL_RESET_FIFOS));
1436 +
1437 +       DSI_PORT_WRITE(TXPKT1C, 0);
1438 +       DSI_PORT_WRITE(INT_EN, DSI1_INTERRUPTS_ALWAYS_ENABLED);
1439 +       return ret;
1440 +}
1441 +
1442 +static int vc4_dsi_host_attach(struct mipi_dsi_host *host,
1443 +                              struct mipi_dsi_device *device)
1444 +{
1445 +       struct vc4_dsi *dsi = host_to_dsi(host);
1446 +       int ret = 0;
1447 +
1448 +       dsi->lanes = device->lanes;
1449 +       dsi->channel = device->channel;
1450 +       dsi->format = device->format;
1451 +       dsi->mode_flags = device->mode_flags;
1452 +
1453 +       if (!(dsi->mode_flags & MIPI_DSI_MODE_VIDEO)) {
1454 +               dev_err(&dsi->pdev->dev,
1455 +                       "Only VIDEO mode panels supported currently.\n");
1456 +               return 0;
1457 +       }
1458 +
1459 +       dsi->panel = of_drm_find_panel(device->dev.of_node);
1460 +       if (!dsi->panel)
1461 +               return 0;
1462 +
1463 +       ret = drm_panel_attach(dsi->panel, dsi->connector);
1464 +       if (ret != 0)
1465 +               return ret;
1466 +
1467 +       drm_helper_hpd_irq_event(dsi->connector->dev);
1468 +
1469 +       return 0;
1470 +}
1471 +
1472 +static int vc4_dsi_host_detach(struct mipi_dsi_host *host,
1473 +                              struct mipi_dsi_device *device)
1474 +{
1475 +       struct vc4_dsi *dsi = host_to_dsi(host);
1476 +
1477 +       if (dsi->panel) {
1478 +               int ret = drm_panel_detach(dsi->panel);
1479 +
1480 +               if (ret)
1481 +                       return ret;
1482 +
1483 +               dsi->panel = NULL;
1484 +
1485 +               drm_helper_hpd_irq_event(dsi->connector->dev);
1486 +       }
1487 +
1488 +       return 0;
1489 +}
1490 +
1491 +static const struct mipi_dsi_host_ops vc4_dsi_host_ops = {
1492 +       .attach = vc4_dsi_host_attach,
1493 +       .detach = vc4_dsi_host_detach,
1494 +       .transfer = vc4_dsi_host_transfer,
1495 +};
1496 +
1497 +static const struct drm_encoder_helper_funcs vc4_dsi_encoder_helper_funcs = {
1498 +       .disable = vc4_dsi_encoder_disable,
1499 +       .enable = vc4_dsi_encoder_enable,
1500 +};
1501 +
1502 +static const struct of_device_id vc4_dsi_dt_match[] = {
1503 +       { .compatible = "brcm,bcm2835-dsi1", (void *)(uintptr_t)1 },
1504 +       {}
1505 +};
1506 +
1507 +static void dsi_handle_error(struct vc4_dsi *dsi,
1508 +                            irqreturn_t *ret, u32 stat, u32 bit,
1509 +                            const char *type)
1510 +{
1511 +       if (!(stat & bit))
1512 +               return;
1513 +
1514 +       DRM_ERROR("DSI%d: %s error\n", dsi->port, type);
1515 +       *ret = IRQ_HANDLED;
1516 +}
1517 +
1518 +static irqreturn_t vc4_dsi_irq_handler(int irq, void *data)
1519 +{
1520 +       struct vc4_dsi *dsi = data;
1521 +       u32 stat = DSI_PORT_READ(INT_STAT);
1522 +       irqreturn_t ret = IRQ_NONE;
1523 +
1524 +       DSI_PORT_WRITE(INT_STAT, stat);
1525 +
1526 +       dsi_handle_error(dsi, &ret, stat,
1527 +                        DSI1_INT_ERR_SYNC_ESC, "LPDT sync");
1528 +       dsi_handle_error(dsi, &ret, stat,
1529 +                        DSI1_INT_ERR_CONTROL, "data lane 0 sequence");
1530 +       dsi_handle_error(dsi, &ret, stat,
1531 +                        DSI1_INT_ERR_CONT_LP0, "LP0 contention");
1532 +       dsi_handle_error(dsi, &ret, stat,
1533 +                        DSI1_INT_ERR_CONT_LP1, "LP1 contention");
1534 +       dsi_handle_error(dsi, &ret, stat,
1535 +                        DSI1_INT_HSTX_TO, "HSTX timeout");
1536 +       dsi_handle_error(dsi, &ret, stat,
1537 +                        DSI1_INT_LPRX_TO, "LPRX timeout");
1538 +       dsi_handle_error(dsi, &ret, stat,
1539 +                        DSI1_INT_TA_TO, "turnaround timeout");
1540 +       dsi_handle_error(dsi, &ret, stat,
1541 +                        DSI1_INT_PR_TO, "peripheral reset timeout");
1542 +
1543 +       if (stat & (DSI1_INT_TXPKT1_DONE | DSI1_INT_PHY_DIR_RTF)) {
1544 +               complete(&dsi->xfer_completion);
1545 +               ret = IRQ_HANDLED;
1546 +       } else if (stat & DSI1_INT_HSTX_TO) {
1547 +               complete(&dsi->xfer_completion);
1548 +               dsi->xfer_result = -ETIMEDOUT;
1549 +               ret = IRQ_HANDLED;
1550 +       }
1551 +
1552 +       return ret;
1553 +}
1554 +
1555 +/**
1556 + * Exposes clocks generated by the analog PHY that are consumed by
1557 + * CPRMAN (clk-bcm2835.c).
1558 + */
1559 +static int
1560 +vc4_dsi_init_phy_clocks(struct vc4_dsi *dsi)
1561 +{
1562 +       struct device *dev = &dsi->pdev->dev;
1563 +       const char *parent_name = __clk_get_name(dsi->pll_phy_clock);
1564 +       static const struct {
1565 +               const char *dsi0_name, *dsi1_name;
1566 +               int div;
1567 +       } phy_clocks[] = {
1568 +               { "dsi0_byte", "dsi1_byte", 8 },
1569 +               { "dsi0_ddr2", "dsi1_ddr2", 4 },
1570 +               { "dsi0_ddr", "dsi1_ddr", 2 },
1571 +       };
1572 +       int i;
1573 +
1574 +       dsi->clk_onecell.clk_num = ARRAY_SIZE(phy_clocks);
1575 +       dsi->clk_onecell.clks = devm_kcalloc(dev,
1576 +                                            dsi->clk_onecell.clk_num,
1577 +                                            sizeof(*dsi->clk_onecell.clks),
1578 +                                            GFP_KERNEL);
1579 +       if (!dsi->clk_onecell.clks)
1580 +               return -ENOMEM;
1581 +
1582 +       for (i = 0; i < ARRAY_SIZE(phy_clocks); i++) {
1583 +               struct clk_fixed_factor *fix = &dsi->phy_clocks[i];
1584 +               struct clk_init_data init;
1585 +               struct clk *clk;
1586 +
1587 +               /* We just use core fixed factor clock ops for the PHY
1588 +                * clocks.  The clocks are actually gated by the
1589 +                * PHY_AFEC0_DDRCLK_EN bits, which we should be
1590 +                * setting if we use the DDR/DDR2 clocks.  However,
1591 +                * vc4_dsi_encoder_enable() is setting up both AFEC0,
1592 +                * setting both our parent DSI PLL's rate and this
1593 +                * clock's rate, so it knows if DDR/DDR2 are going to
1594 +                * be used and could enable the gates itself.
1595 +                */
1596 +               fix->mult = 1;
1597 +               fix->div = phy_clocks[i].div;
1598 +               fix->hw.init = &init;
1599 +
1600 +               memset(&init, 0, sizeof(init));
1601 +               init.parent_names = &parent_name;
1602 +               init.num_parents = 1;
1603 +               if (dsi->port == 1)
1604 +                       init.name = phy_clocks[i].dsi1_name;
1605 +               else
1606 +                       init.name = phy_clocks[i].dsi0_name;
1607 +               init.ops = &clk_fixed_factor_ops;
1608 +               init.flags = CLK_IS_BASIC;
1609 +
1610 +               clk = devm_clk_register(dev, &fix->hw);
1611 +               if (IS_ERR(clk))
1612 +                       return PTR_ERR(clk);
1613 +
1614 +               dsi->clk_onecell.clks[i] = clk;
1615 +       }
1616 +
1617 +       return of_clk_add_provider(dev->of_node,
1618 +                                  of_clk_src_onecell_get,
1619 +                                  &dsi->clk_onecell);
1620 +}
1621 +
1622 +static int vc4_dsi_bind(struct device *dev, struct device *master, void *data)
1623 +{
1624 +       struct platform_device *pdev = to_platform_device(dev);
1625 +       struct drm_device *drm = dev_get_drvdata(master);
1626 +       struct vc4_dev *vc4 = to_vc4_dev(drm);
1627 +       struct vc4_dsi *dsi;
1628 +       struct vc4_dsi_encoder *vc4_dsi_encoder;
1629 +       const struct of_device_id *match;
1630 +       dma_cap_mask_t dma_mask;
1631 +       int ret;
1632 +
1633 +       dsi = devm_kzalloc(dev, sizeof(*dsi), GFP_KERNEL);
1634 +       if (!dsi)
1635 +               return -ENOMEM;
1636 +
1637 +       match = of_match_device(vc4_dsi_dt_match, dev);
1638 +       if (!match)
1639 +               return -ENODEV;
1640 +
1641 +       dsi->port = (uintptr_t)match->data;
1642 +
1643 +       vc4_dsi_encoder = devm_kzalloc(dev, sizeof(*vc4_dsi_encoder),
1644 +                                      GFP_KERNEL);
1645 +       if (!vc4_dsi_encoder)
1646 +               return -ENOMEM;
1647 +       vc4_dsi_encoder->base.type = VC4_ENCODER_TYPE_DSI1;
1648 +       vc4_dsi_encoder->dsi = dsi;
1649 +       dsi->encoder = &vc4_dsi_encoder->base.base;
1650 +
1651 +       dsi->pdev = pdev;
1652 +       dsi->regs = vc4_ioremap_regs(pdev, 0);
1653 +       if (IS_ERR(dsi->regs))
1654 +               return PTR_ERR(dsi->regs);
1655 +
1656 +       if (DSI_PORT_READ(ID) != DSI_ID_VALUE) {
1657 +               dev_err(dev, "Port returned 0x%08x for ID instead of 0x%08x\n",
1658 +                       DSI_PORT_READ(ID), DSI_ID_VALUE);
1659 +               return -ENODEV;
1660 +       }
1661 +
1662 +       /* DSI1 has a broken AXI slave that doesn't respond to writes
1663 +        * from the ARM.  It does handle writes from the DMA engine,
1664 +        * so set up a channel for talking to it.
1665 +        */
1666 +       if (dsi->port == 1) {
1667 +               dsi->reg_dma_mem = dma_alloc_coherent(dev, 4,
1668 +                                                     &dsi->reg_dma_paddr,
1669 +                                                     GFP_KERNEL);
1670 +               if (!dsi->reg_dma_mem) {
1671 +                       DRM_ERROR("Failed to get DMA memory\n");
1672 +                       return -ENOMEM;
1673 +               }
1674 +
1675 +               dma_cap_zero(dma_mask);
1676 +               dma_cap_set(DMA_MEMCPY, dma_mask);
1677 +               dsi->reg_dma_chan = dma_request_chan_by_mask(&dma_mask);
1678 +               if (IS_ERR(dsi->reg_dma_chan)) {
1679 +                       ret = PTR_ERR(dsi->reg_dma_chan);
1680 +                       if (ret != -EPROBE_DEFER)
1681 +                               DRM_ERROR("Failed to get DMA channel: %d\n",
1682 +                                         ret);
1683 +                       return ret;
1684 +               }
1685 +
1686 +               /* Get the physical address of the device's registers.  The
1687 +                * struct resource for the regs gives us the bus address
1688 +                * instead.
1689 +                */
1690 +               dsi->reg_paddr = be32_to_cpup(of_get_address(dev->of_node,
1691 +                                                            0, NULL, NULL));
1692 +       }
1693 +
1694 +       init_completion(&dsi->xfer_completion);
1695 +       /* At startup enable error-reporting interrupts and nothing else. */
1696 +       DSI_PORT_WRITE(INT_EN, DSI1_INTERRUPTS_ALWAYS_ENABLED);
1697 +       /* Clear any existing interrupt state. */
1698 +       DSI_PORT_WRITE(INT_STAT, DSI_PORT_READ(INT_STAT));
1699 +
1700 +       ret = devm_request_irq(dev, platform_get_irq(pdev, 0),
1701 +                              vc4_dsi_irq_handler, 0, "vc4 dsi", dsi);
1702 +       if (ret) {
1703 +               if (ret != -EPROBE_DEFER)
1704 +                       dev_err(dev, "Failed to get interrupt: %d\n", ret);
1705 +               return ret;
1706 +       }
1707 +
1708 +       dsi->escape_clock = devm_clk_get(dev, "escape");
1709 +       if (IS_ERR(dsi->escape_clock)) {
1710 +               ret = PTR_ERR(dsi->escape_clock);
1711 +               if (ret != -EPROBE_DEFER)
1712 +                       dev_err(dev, "Failed to get escape clock: %d\n", ret);
1713 +               return ret;
1714 +       }
1715 +
1716 +       dsi->pll_phy_clock = devm_clk_get(dev, "phy");
1717 +       if (IS_ERR(dsi->pll_phy_clock)) {
1718 +               ret = PTR_ERR(dsi->pll_phy_clock);
1719 +               if (ret != -EPROBE_DEFER)
1720 +                       dev_err(dev, "Failed to get phy clock: %d\n", ret);
1721 +               return ret;
1722 +       }
1723 +
1724 +       dsi->pixel_clock = devm_clk_get(dev, "pixel");
1725 +       if (IS_ERR(dsi->pixel_clock)) {
1726 +               ret = PTR_ERR(dsi->pixel_clock);
1727 +               if (ret != -EPROBE_DEFER)
1728 +                       dev_err(dev, "Failed to get pixel clock: %d\n", ret);
1729 +               return ret;
1730 +       }
1731 +
1732 +       /* The esc clock rate is supposed to always be 100Mhz. */
1733 +       ret = clk_set_rate(dsi->escape_clock, 100 * 1000000);
1734 +       if (ret) {
1735 +               dev_err(dev, "Failed to set esc clock: %d\n", ret);
1736 +               return ret;
1737 +       }
1738 +
1739 +       ret = vc4_dsi_init_phy_clocks(dsi);
1740 +       if (ret)
1741 +               return ret;
1742 +
1743 +       if (dsi->port == 1)
1744 +               vc4->dsi1 = dsi;
1745 +
1746 +       drm_encoder_init(drm, dsi->encoder, &vc4_dsi_encoder_funcs,
1747 +                        DRM_MODE_ENCODER_DSI, NULL);
1748 +       drm_encoder_helper_add(dsi->encoder, &vc4_dsi_encoder_helper_funcs);
1749 +
1750 +       dsi->connector = vc4_dsi_connector_init(drm, dsi);
1751 +       if (IS_ERR(dsi->connector)) {
1752 +               ret = PTR_ERR(dsi->connector);
1753 +               goto err_destroy_encoder;
1754 +       }
1755 +
1756 +       dsi->dsi_host.ops = &vc4_dsi_host_ops;
1757 +       dsi->dsi_host.dev = dev;
1758 +
1759 +       mipi_dsi_host_register(&dsi->dsi_host);
1760 +
1761 +       dev_set_drvdata(dev, dsi);
1762 +
1763 +       pm_runtime_enable(dev);
1764 +
1765 +       return 0;
1766 +
1767 +err_destroy_encoder:
1768 +       vc4_dsi_encoder_destroy(dsi->encoder);
1769 +
1770 +       return ret;
1771 +}
1772 +
1773 +static void vc4_dsi_unbind(struct device *dev, struct device *master,
1774 +                          void *data)
1775 +{
1776 +       struct drm_device *drm = dev_get_drvdata(master);
1777 +       struct vc4_dev *vc4 = to_vc4_dev(drm);
1778 +       struct vc4_dsi *dsi = dev_get_drvdata(dev);
1779 +
1780 +       pm_runtime_disable(dev);
1781 +
1782 +       vc4_dsi_connector_destroy(dsi->connector);
1783 +       vc4_dsi_encoder_destroy(dsi->encoder);
1784 +
1785 +       mipi_dsi_host_unregister(&dsi->dsi_host);
1786 +
1787 +       clk_disable_unprepare(dsi->pll_phy_clock);
1788 +       clk_disable_unprepare(dsi->escape_clock);
1789 +
1790 +       if (dsi->port == 1)
1791 +               vc4->dsi1 = NULL;
1792 +}
1793 +
1794 +static const struct component_ops vc4_dsi_ops = {
1795 +       .bind   = vc4_dsi_bind,
1796 +       .unbind = vc4_dsi_unbind,
1797 +};
1798 +
1799 +static int vc4_dsi_dev_probe(struct platform_device *pdev)
1800 +{
1801 +       return component_add(&pdev->dev, &vc4_dsi_ops);
1802 +}
1803 +
1804 +static int vc4_dsi_dev_remove(struct platform_device *pdev)
1805 +{
1806 +       component_del(&pdev->dev, &vc4_dsi_ops);
1807 +       return 0;
1808 +}
1809 +
1810 +struct platform_driver vc4_dsi_driver = {
1811 +       .probe = vc4_dsi_dev_probe,
1812 +       .remove = vc4_dsi_dev_remove,
1813 +       .driver = {
1814 +               .name = "vc4_dsi",
1815 +               .of_match_table = vc4_dsi_dt_match,
1816 +       },
1817 +};