162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) 2016 Texas Instruments Incorporated - http://www.ti.com/
462306a36Sopenharmony_ci * Author: Tomi Valkeinen <tomi.valkeinen@ti.com>
562306a36Sopenharmony_ci */
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#ifndef __OMAP_DRM_DSS_DSI_H
862306a36Sopenharmony_ci#define __OMAP_DRM_DSS_DSI_H
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#include <drm/drm_mipi_dsi.h>
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_cistruct dsi_reg {
1362306a36Sopenharmony_ci	u16 module;
1462306a36Sopenharmony_ci	u16 idx;
1562306a36Sopenharmony_ci};
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci#define DSI_REG(mod, idx)		((const struct dsi_reg) { mod, idx })
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci/* DSI Protocol Engine */
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci#define DSI_PROTO			0
2262306a36Sopenharmony_ci#define DSI_PROTO_SZ			0x200
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci#define DSI_REVISION			DSI_REG(DSI_PROTO, 0x0000)
2562306a36Sopenharmony_ci#define DSI_SYSCONFIG			DSI_REG(DSI_PROTO, 0x0010)
2662306a36Sopenharmony_ci#define DSI_SYSSTATUS			DSI_REG(DSI_PROTO, 0x0014)
2762306a36Sopenharmony_ci#define DSI_IRQSTATUS			DSI_REG(DSI_PROTO, 0x0018)
2862306a36Sopenharmony_ci#define DSI_IRQENABLE			DSI_REG(DSI_PROTO, 0x001C)
2962306a36Sopenharmony_ci#define DSI_CTRL			DSI_REG(DSI_PROTO, 0x0040)
3062306a36Sopenharmony_ci#define DSI_GNQ				DSI_REG(DSI_PROTO, 0x0044)
3162306a36Sopenharmony_ci#define DSI_COMPLEXIO_CFG1		DSI_REG(DSI_PROTO, 0x0048)
3262306a36Sopenharmony_ci#define DSI_COMPLEXIO_IRQ_STATUS	DSI_REG(DSI_PROTO, 0x004C)
3362306a36Sopenharmony_ci#define DSI_COMPLEXIO_IRQ_ENABLE	DSI_REG(DSI_PROTO, 0x0050)
3462306a36Sopenharmony_ci#define DSI_CLK_CTRL			DSI_REG(DSI_PROTO, 0x0054)
3562306a36Sopenharmony_ci#define DSI_TIMING1			DSI_REG(DSI_PROTO, 0x0058)
3662306a36Sopenharmony_ci#define DSI_TIMING2			DSI_REG(DSI_PROTO, 0x005C)
3762306a36Sopenharmony_ci#define DSI_VM_TIMING1			DSI_REG(DSI_PROTO, 0x0060)
3862306a36Sopenharmony_ci#define DSI_VM_TIMING2			DSI_REG(DSI_PROTO, 0x0064)
3962306a36Sopenharmony_ci#define DSI_VM_TIMING3			DSI_REG(DSI_PROTO, 0x0068)
4062306a36Sopenharmony_ci#define DSI_CLK_TIMING			DSI_REG(DSI_PROTO, 0x006C)
4162306a36Sopenharmony_ci#define DSI_TX_FIFO_VC_SIZE		DSI_REG(DSI_PROTO, 0x0070)
4262306a36Sopenharmony_ci#define DSI_RX_FIFO_VC_SIZE		DSI_REG(DSI_PROTO, 0x0074)
4362306a36Sopenharmony_ci#define DSI_COMPLEXIO_CFG2		DSI_REG(DSI_PROTO, 0x0078)
4462306a36Sopenharmony_ci#define DSI_RX_FIFO_VC_FULLNESS		DSI_REG(DSI_PROTO, 0x007C)
4562306a36Sopenharmony_ci#define DSI_VM_TIMING4			DSI_REG(DSI_PROTO, 0x0080)
4662306a36Sopenharmony_ci#define DSI_TX_FIFO_VC_EMPTINESS	DSI_REG(DSI_PROTO, 0x0084)
4762306a36Sopenharmony_ci#define DSI_VM_TIMING5			DSI_REG(DSI_PROTO, 0x0088)
4862306a36Sopenharmony_ci#define DSI_VM_TIMING6			DSI_REG(DSI_PROTO, 0x008C)
4962306a36Sopenharmony_ci#define DSI_VM_TIMING7			DSI_REG(DSI_PROTO, 0x0090)
5062306a36Sopenharmony_ci#define DSI_STOPCLK_TIMING		DSI_REG(DSI_PROTO, 0x0094)
5162306a36Sopenharmony_ci#define DSI_VC_CTRL(n)			DSI_REG(DSI_PROTO, 0x0100 + (n * 0x20))
5262306a36Sopenharmony_ci#define DSI_VC_TE(n)			DSI_REG(DSI_PROTO, 0x0104 + (n * 0x20))
5362306a36Sopenharmony_ci#define DSI_VC_LONG_PACKET_HEADER(n)	DSI_REG(DSI_PROTO, 0x0108 + (n * 0x20))
5462306a36Sopenharmony_ci#define DSI_VC_LONG_PACKET_PAYLOAD(n)	DSI_REG(DSI_PROTO, 0x010C + (n * 0x20))
5562306a36Sopenharmony_ci#define DSI_VC_SHORT_PACKET_HEADER(n)	DSI_REG(DSI_PROTO, 0x0110 + (n * 0x20))
5662306a36Sopenharmony_ci#define DSI_VC_IRQSTATUS(n)		DSI_REG(DSI_PROTO, 0x0118 + (n * 0x20))
5762306a36Sopenharmony_ci#define DSI_VC_IRQENABLE(n)		DSI_REG(DSI_PROTO, 0x011C + (n * 0x20))
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci/* DSIPHY_SCP */
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci#define DSI_PHY				1
6262306a36Sopenharmony_ci#define DSI_PHY_OFFSET			0x200
6362306a36Sopenharmony_ci#define DSI_PHY_SZ			0x40
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ci#define DSI_DSIPHY_CFG0			DSI_REG(DSI_PHY, 0x0000)
6662306a36Sopenharmony_ci#define DSI_DSIPHY_CFG1			DSI_REG(DSI_PHY, 0x0004)
6762306a36Sopenharmony_ci#define DSI_DSIPHY_CFG2			DSI_REG(DSI_PHY, 0x0008)
6862306a36Sopenharmony_ci#define DSI_DSIPHY_CFG5			DSI_REG(DSI_PHY, 0x0014)
6962306a36Sopenharmony_ci#define DSI_DSIPHY_CFG10		DSI_REG(DSI_PHY, 0x0028)
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_ci/* DSI_PLL_CTRL_SCP */
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_ci#define DSI_PLL				2
7462306a36Sopenharmony_ci#define DSI_PLL_OFFSET			0x300
7562306a36Sopenharmony_ci#define DSI_PLL_SZ			0x20
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci#define DSI_PLL_CONTROL			DSI_REG(DSI_PLL, 0x0000)
7862306a36Sopenharmony_ci#define DSI_PLL_STATUS			DSI_REG(DSI_PLL, 0x0004)
7962306a36Sopenharmony_ci#define DSI_PLL_GO			DSI_REG(DSI_PLL, 0x0008)
8062306a36Sopenharmony_ci#define DSI_PLL_CONFIGURATION1		DSI_REG(DSI_PLL, 0x000C)
8162306a36Sopenharmony_ci#define DSI_PLL_CONFIGURATION2		DSI_REG(DSI_PLL, 0x0010)
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ci/* Global interrupts */
8462306a36Sopenharmony_ci#define DSI_IRQ_VC0		(1 << 0)
8562306a36Sopenharmony_ci#define DSI_IRQ_VC1		(1 << 1)
8662306a36Sopenharmony_ci#define DSI_IRQ_VC2		(1 << 2)
8762306a36Sopenharmony_ci#define DSI_IRQ_VC3		(1 << 3)
8862306a36Sopenharmony_ci#define DSI_IRQ_WAKEUP		(1 << 4)
8962306a36Sopenharmony_ci#define DSI_IRQ_RESYNC		(1 << 5)
9062306a36Sopenharmony_ci#define DSI_IRQ_PLL_LOCK	(1 << 7)
9162306a36Sopenharmony_ci#define DSI_IRQ_PLL_UNLOCK	(1 << 8)
9262306a36Sopenharmony_ci#define DSI_IRQ_PLL_RECALL	(1 << 9)
9362306a36Sopenharmony_ci#define DSI_IRQ_COMPLEXIO_ERR	(1 << 10)
9462306a36Sopenharmony_ci#define DSI_IRQ_HS_TX_TIMEOUT	(1 << 14)
9562306a36Sopenharmony_ci#define DSI_IRQ_LP_RX_TIMEOUT	(1 << 15)
9662306a36Sopenharmony_ci#define DSI_IRQ_TE_TRIGGER	(1 << 16)
9762306a36Sopenharmony_ci#define DSI_IRQ_ACK_TRIGGER	(1 << 17)
9862306a36Sopenharmony_ci#define DSI_IRQ_SYNC_LOST	(1 << 18)
9962306a36Sopenharmony_ci#define DSI_IRQ_LDO_POWER_GOOD	(1 << 19)
10062306a36Sopenharmony_ci#define DSI_IRQ_TA_TIMEOUT	(1 << 20)
10162306a36Sopenharmony_ci#define DSI_IRQ_ERROR_MASK \
10262306a36Sopenharmony_ci	(DSI_IRQ_HS_TX_TIMEOUT | DSI_IRQ_LP_RX_TIMEOUT | DSI_IRQ_SYNC_LOST | \
10362306a36Sopenharmony_ci	DSI_IRQ_TA_TIMEOUT)
10462306a36Sopenharmony_ci#define DSI_IRQ_CHANNEL_MASK	0xf
10562306a36Sopenharmony_ci
10662306a36Sopenharmony_ci/* Virtual channel interrupts */
10762306a36Sopenharmony_ci#define DSI_VC_IRQ_CS		(1 << 0)
10862306a36Sopenharmony_ci#define DSI_VC_IRQ_ECC_CORR	(1 << 1)
10962306a36Sopenharmony_ci#define DSI_VC_IRQ_PACKET_SENT	(1 << 2)
11062306a36Sopenharmony_ci#define DSI_VC_IRQ_FIFO_TX_OVF	(1 << 3)
11162306a36Sopenharmony_ci#define DSI_VC_IRQ_FIFO_RX_OVF	(1 << 4)
11262306a36Sopenharmony_ci#define DSI_VC_IRQ_BTA		(1 << 5)
11362306a36Sopenharmony_ci#define DSI_VC_IRQ_ECC_NO_CORR	(1 << 6)
11462306a36Sopenharmony_ci#define DSI_VC_IRQ_FIFO_TX_UDF	(1 << 7)
11562306a36Sopenharmony_ci#define DSI_VC_IRQ_PP_BUSY_CHANGE (1 << 8)
11662306a36Sopenharmony_ci#define DSI_VC_IRQ_ERROR_MASK \
11762306a36Sopenharmony_ci	(DSI_VC_IRQ_CS | DSI_VC_IRQ_ECC_CORR | DSI_VC_IRQ_FIFO_TX_OVF | \
11862306a36Sopenharmony_ci	DSI_VC_IRQ_FIFO_RX_OVF | DSI_VC_IRQ_ECC_NO_CORR | \
11962306a36Sopenharmony_ci	DSI_VC_IRQ_FIFO_TX_UDF)
12062306a36Sopenharmony_ci
12162306a36Sopenharmony_ci/* ComplexIO interrupts */
12262306a36Sopenharmony_ci#define DSI_CIO_IRQ_ERRSYNCESC1		(1 << 0)
12362306a36Sopenharmony_ci#define DSI_CIO_IRQ_ERRSYNCESC2		(1 << 1)
12462306a36Sopenharmony_ci#define DSI_CIO_IRQ_ERRSYNCESC3		(1 << 2)
12562306a36Sopenharmony_ci#define DSI_CIO_IRQ_ERRSYNCESC4		(1 << 3)
12662306a36Sopenharmony_ci#define DSI_CIO_IRQ_ERRSYNCESC5		(1 << 4)
12762306a36Sopenharmony_ci#define DSI_CIO_IRQ_ERRESC1		(1 << 5)
12862306a36Sopenharmony_ci#define DSI_CIO_IRQ_ERRESC2		(1 << 6)
12962306a36Sopenharmony_ci#define DSI_CIO_IRQ_ERRESC3		(1 << 7)
13062306a36Sopenharmony_ci#define DSI_CIO_IRQ_ERRESC4		(1 << 8)
13162306a36Sopenharmony_ci#define DSI_CIO_IRQ_ERRESC5		(1 << 9)
13262306a36Sopenharmony_ci#define DSI_CIO_IRQ_ERRCONTROL1		(1 << 10)
13362306a36Sopenharmony_ci#define DSI_CIO_IRQ_ERRCONTROL2		(1 << 11)
13462306a36Sopenharmony_ci#define DSI_CIO_IRQ_ERRCONTROL3		(1 << 12)
13562306a36Sopenharmony_ci#define DSI_CIO_IRQ_ERRCONTROL4		(1 << 13)
13662306a36Sopenharmony_ci#define DSI_CIO_IRQ_ERRCONTROL5		(1 << 14)
13762306a36Sopenharmony_ci#define DSI_CIO_IRQ_STATEULPS1		(1 << 15)
13862306a36Sopenharmony_ci#define DSI_CIO_IRQ_STATEULPS2		(1 << 16)
13962306a36Sopenharmony_ci#define DSI_CIO_IRQ_STATEULPS3		(1 << 17)
14062306a36Sopenharmony_ci#define DSI_CIO_IRQ_STATEULPS4		(1 << 18)
14162306a36Sopenharmony_ci#define DSI_CIO_IRQ_STATEULPS5		(1 << 19)
14262306a36Sopenharmony_ci#define DSI_CIO_IRQ_ERRCONTENTIONLP0_1	(1 << 20)
14362306a36Sopenharmony_ci#define DSI_CIO_IRQ_ERRCONTENTIONLP1_1	(1 << 21)
14462306a36Sopenharmony_ci#define DSI_CIO_IRQ_ERRCONTENTIONLP0_2	(1 << 22)
14562306a36Sopenharmony_ci#define DSI_CIO_IRQ_ERRCONTENTIONLP1_2	(1 << 23)
14662306a36Sopenharmony_ci#define DSI_CIO_IRQ_ERRCONTENTIONLP0_3	(1 << 24)
14762306a36Sopenharmony_ci#define DSI_CIO_IRQ_ERRCONTENTIONLP1_3	(1 << 25)
14862306a36Sopenharmony_ci#define DSI_CIO_IRQ_ERRCONTENTIONLP0_4	(1 << 26)
14962306a36Sopenharmony_ci#define DSI_CIO_IRQ_ERRCONTENTIONLP1_4	(1 << 27)
15062306a36Sopenharmony_ci#define DSI_CIO_IRQ_ERRCONTENTIONLP0_5	(1 << 28)
15162306a36Sopenharmony_ci#define DSI_CIO_IRQ_ERRCONTENTIONLP1_5	(1 << 29)
15262306a36Sopenharmony_ci#define DSI_CIO_IRQ_ULPSACTIVENOT_ALL0	(1 << 30)
15362306a36Sopenharmony_ci#define DSI_CIO_IRQ_ULPSACTIVENOT_ALL1	(1 << 31)
15462306a36Sopenharmony_ci#define DSI_CIO_IRQ_ERROR_MASK \
15562306a36Sopenharmony_ci	(DSI_CIO_IRQ_ERRSYNCESC1 | DSI_CIO_IRQ_ERRSYNCESC2 | \
15662306a36Sopenharmony_ci	 DSI_CIO_IRQ_ERRSYNCESC3 | DSI_CIO_IRQ_ERRSYNCESC4 | \
15762306a36Sopenharmony_ci	 DSI_CIO_IRQ_ERRSYNCESC5 | \
15862306a36Sopenharmony_ci	 DSI_CIO_IRQ_ERRESC1 | DSI_CIO_IRQ_ERRESC2 | \
15962306a36Sopenharmony_ci	 DSI_CIO_IRQ_ERRESC3 | DSI_CIO_IRQ_ERRESC4 | \
16062306a36Sopenharmony_ci	 DSI_CIO_IRQ_ERRESC5 | \
16162306a36Sopenharmony_ci	 DSI_CIO_IRQ_ERRCONTROL1 | DSI_CIO_IRQ_ERRCONTROL2 | \
16262306a36Sopenharmony_ci	 DSI_CIO_IRQ_ERRCONTROL3 | DSI_CIO_IRQ_ERRCONTROL4 | \
16362306a36Sopenharmony_ci	 DSI_CIO_IRQ_ERRCONTROL5 | \
16462306a36Sopenharmony_ci	 DSI_CIO_IRQ_ERRCONTENTIONLP0_1 | DSI_CIO_IRQ_ERRCONTENTIONLP1_1 | \
16562306a36Sopenharmony_ci	 DSI_CIO_IRQ_ERRCONTENTIONLP0_2 | DSI_CIO_IRQ_ERRCONTENTIONLP1_2 | \
16662306a36Sopenharmony_ci	 DSI_CIO_IRQ_ERRCONTENTIONLP0_3 | DSI_CIO_IRQ_ERRCONTENTIONLP1_3 | \
16762306a36Sopenharmony_ci	 DSI_CIO_IRQ_ERRCONTENTIONLP0_4 | DSI_CIO_IRQ_ERRCONTENTIONLP1_4 | \
16862306a36Sopenharmony_ci	 DSI_CIO_IRQ_ERRCONTENTIONLP0_5 | DSI_CIO_IRQ_ERRCONTENTIONLP1_5)
16962306a36Sopenharmony_ci
17062306a36Sopenharmony_cienum omap_dss_dsi_mode {
17162306a36Sopenharmony_ci	OMAP_DSS_DSI_CMD_MODE = 0,
17262306a36Sopenharmony_ci	OMAP_DSS_DSI_VIDEO_MODE,
17362306a36Sopenharmony_ci};
17462306a36Sopenharmony_ci
17562306a36Sopenharmony_cienum omap_dss_dsi_trans_mode {
17662306a36Sopenharmony_ci	/* Sync Pulses: both sync start and end packets sent */
17762306a36Sopenharmony_ci	OMAP_DSS_DSI_PULSE_MODE,
17862306a36Sopenharmony_ci	/* Sync Events: only sync start packets sent */
17962306a36Sopenharmony_ci	OMAP_DSS_DSI_EVENT_MODE,
18062306a36Sopenharmony_ci	/* Burst: only sync start packets sent, pixels are time compressed */
18162306a36Sopenharmony_ci	OMAP_DSS_DSI_BURST_MODE,
18262306a36Sopenharmony_ci};
18362306a36Sopenharmony_ci
18462306a36Sopenharmony_cistruct omap_dss_dsi_videomode_timings {
18562306a36Sopenharmony_ci	unsigned long hsclk;
18662306a36Sopenharmony_ci
18762306a36Sopenharmony_ci	unsigned int ndl;
18862306a36Sopenharmony_ci	unsigned int bitspp;
18962306a36Sopenharmony_ci
19062306a36Sopenharmony_ci	/* pixels */
19162306a36Sopenharmony_ci	u16 hact;
19262306a36Sopenharmony_ci	/* lines */
19362306a36Sopenharmony_ci	u16 vact;
19462306a36Sopenharmony_ci
19562306a36Sopenharmony_ci	/* DSI video mode blanking data */
19662306a36Sopenharmony_ci	/* Unit: byte clock cycles */
19762306a36Sopenharmony_ci	u16 hss;
19862306a36Sopenharmony_ci	u16 hsa;
19962306a36Sopenharmony_ci	u16 hse;
20062306a36Sopenharmony_ci	u16 hfp;
20162306a36Sopenharmony_ci	u16 hbp;
20262306a36Sopenharmony_ci	/* Unit: line clocks */
20362306a36Sopenharmony_ci	u16 vsa;
20462306a36Sopenharmony_ci	u16 vfp;
20562306a36Sopenharmony_ci	u16 vbp;
20662306a36Sopenharmony_ci
20762306a36Sopenharmony_ci	/* DSI blanking modes */
20862306a36Sopenharmony_ci	int blanking_mode;
20962306a36Sopenharmony_ci	int hsa_blanking_mode;
21062306a36Sopenharmony_ci	int hbp_blanking_mode;
21162306a36Sopenharmony_ci	int hfp_blanking_mode;
21262306a36Sopenharmony_ci
21362306a36Sopenharmony_ci	enum omap_dss_dsi_trans_mode trans_mode;
21462306a36Sopenharmony_ci
21562306a36Sopenharmony_ci	int window_sync;
21662306a36Sopenharmony_ci};
21762306a36Sopenharmony_ci
21862306a36Sopenharmony_cistruct omap_dss_dsi_config {
21962306a36Sopenharmony_ci	enum omap_dss_dsi_mode mode;
22062306a36Sopenharmony_ci	enum mipi_dsi_pixel_format pixel_format;
22162306a36Sopenharmony_ci	const struct videomode *vm;
22262306a36Sopenharmony_ci
22362306a36Sopenharmony_ci	unsigned long hs_clk_min, hs_clk_max;
22462306a36Sopenharmony_ci	unsigned long lp_clk_min, lp_clk_max;
22562306a36Sopenharmony_ci
22662306a36Sopenharmony_ci	enum omap_dss_dsi_trans_mode trans_mode;
22762306a36Sopenharmony_ci};
22862306a36Sopenharmony_ci
22962306a36Sopenharmony_ci/* DSI PLL HSDIV indices */
23062306a36Sopenharmony_ci#define HSDIV_DISPC	0
23162306a36Sopenharmony_ci#define HSDIV_DSI	1
23262306a36Sopenharmony_ci
23362306a36Sopenharmony_ci#define DSI_MAX_NR_ISRS                2
23462306a36Sopenharmony_ci#define DSI_MAX_NR_LANES	5
23562306a36Sopenharmony_ci
23662306a36Sopenharmony_cienum dsi_model {
23762306a36Sopenharmony_ci	DSI_MODEL_OMAP3,
23862306a36Sopenharmony_ci	DSI_MODEL_OMAP4,
23962306a36Sopenharmony_ci	DSI_MODEL_OMAP5,
24062306a36Sopenharmony_ci};
24162306a36Sopenharmony_ci
24262306a36Sopenharmony_cienum dsi_lane_function {
24362306a36Sopenharmony_ci	DSI_LANE_UNUSED	= 0,
24462306a36Sopenharmony_ci	DSI_LANE_CLK,
24562306a36Sopenharmony_ci	DSI_LANE_DATA1,
24662306a36Sopenharmony_ci	DSI_LANE_DATA2,
24762306a36Sopenharmony_ci	DSI_LANE_DATA3,
24862306a36Sopenharmony_ci	DSI_LANE_DATA4,
24962306a36Sopenharmony_ci};
25062306a36Sopenharmony_ci
25162306a36Sopenharmony_cistruct dsi_lane_config {
25262306a36Sopenharmony_ci	enum dsi_lane_function function;
25362306a36Sopenharmony_ci	u8 polarity;
25462306a36Sopenharmony_ci};
25562306a36Sopenharmony_ci
25662306a36Sopenharmony_citypedef void (*omap_dsi_isr_t) (void *arg, u32 mask);
25762306a36Sopenharmony_ci
25862306a36Sopenharmony_cistruct dsi_isr_data {
25962306a36Sopenharmony_ci	omap_dsi_isr_t	isr;
26062306a36Sopenharmony_ci	void		*arg;
26162306a36Sopenharmony_ci	u32		mask;
26262306a36Sopenharmony_ci};
26362306a36Sopenharmony_ci
26462306a36Sopenharmony_cienum fifo_size {
26562306a36Sopenharmony_ci	DSI_FIFO_SIZE_0		= 0,
26662306a36Sopenharmony_ci	DSI_FIFO_SIZE_32	= 1,
26762306a36Sopenharmony_ci	DSI_FIFO_SIZE_64	= 2,
26862306a36Sopenharmony_ci	DSI_FIFO_SIZE_96	= 3,
26962306a36Sopenharmony_ci	DSI_FIFO_SIZE_128	= 4,
27062306a36Sopenharmony_ci};
27162306a36Sopenharmony_ci
27262306a36Sopenharmony_cienum dsi_vc_source {
27362306a36Sopenharmony_ci	DSI_VC_SOURCE_L4 = 0,
27462306a36Sopenharmony_ci	DSI_VC_SOURCE_VP,
27562306a36Sopenharmony_ci};
27662306a36Sopenharmony_ci
27762306a36Sopenharmony_cistruct dsi_irq_stats {
27862306a36Sopenharmony_ci	unsigned long last_reset;
27962306a36Sopenharmony_ci	unsigned int irq_count;
28062306a36Sopenharmony_ci	unsigned int dsi_irqs[32];
28162306a36Sopenharmony_ci	unsigned int vc_irqs[4][32];
28262306a36Sopenharmony_ci	unsigned int cio_irqs[32];
28362306a36Sopenharmony_ci};
28462306a36Sopenharmony_ci
28562306a36Sopenharmony_cistruct dsi_isr_tables {
28662306a36Sopenharmony_ci	struct dsi_isr_data isr_table[DSI_MAX_NR_ISRS];
28762306a36Sopenharmony_ci	struct dsi_isr_data isr_table_vc[4][DSI_MAX_NR_ISRS];
28862306a36Sopenharmony_ci	struct dsi_isr_data isr_table_cio[DSI_MAX_NR_ISRS];
28962306a36Sopenharmony_ci};
29062306a36Sopenharmony_ci
29162306a36Sopenharmony_cistruct dsi_lp_clock_info {
29262306a36Sopenharmony_ci	unsigned long lp_clk;
29362306a36Sopenharmony_ci	u16 lp_clk_div;
29462306a36Sopenharmony_ci};
29562306a36Sopenharmony_ci
29662306a36Sopenharmony_cistruct dsi_clk_calc_ctx {
29762306a36Sopenharmony_ci	struct dsi_data *dsi;
29862306a36Sopenharmony_ci	struct dss_pll *pll;
29962306a36Sopenharmony_ci
30062306a36Sopenharmony_ci	/* inputs */
30162306a36Sopenharmony_ci
30262306a36Sopenharmony_ci	const struct omap_dss_dsi_config *config;
30362306a36Sopenharmony_ci
30462306a36Sopenharmony_ci	unsigned long req_pck_min, req_pck_nom, req_pck_max;
30562306a36Sopenharmony_ci
30662306a36Sopenharmony_ci	/* outputs */
30762306a36Sopenharmony_ci
30862306a36Sopenharmony_ci	struct dss_pll_clock_info dsi_cinfo;
30962306a36Sopenharmony_ci	struct dispc_clock_info dispc_cinfo;
31062306a36Sopenharmony_ci	struct dsi_lp_clock_info lp_cinfo;
31162306a36Sopenharmony_ci
31262306a36Sopenharmony_ci	struct videomode vm;
31362306a36Sopenharmony_ci	struct omap_dss_dsi_videomode_timings dsi_vm;
31462306a36Sopenharmony_ci};
31562306a36Sopenharmony_ci
31662306a36Sopenharmony_cistruct dsi_module_id_data {
31762306a36Sopenharmony_ci	u32 address;
31862306a36Sopenharmony_ci	int id;
31962306a36Sopenharmony_ci};
32062306a36Sopenharmony_ci
32162306a36Sopenharmony_cienum dsi_quirks {
32262306a36Sopenharmony_ci	DSI_QUIRK_PLL_PWR_BUG = (1 << 0),	/* DSI-PLL power command 0x3 is not working */
32362306a36Sopenharmony_ci	DSI_QUIRK_DCS_CMD_CONFIG_VC = (1 << 1),
32462306a36Sopenharmony_ci	DSI_QUIRK_VC_OCP_WIDTH = (1 << 2),
32562306a36Sopenharmony_ci	DSI_QUIRK_REVERSE_TXCLKESC = (1 << 3),
32662306a36Sopenharmony_ci	DSI_QUIRK_GNQ = (1 << 4),
32762306a36Sopenharmony_ci	DSI_QUIRK_PHY_DCC = (1 << 5),
32862306a36Sopenharmony_ci};
32962306a36Sopenharmony_ci
33062306a36Sopenharmony_cistruct dsi_of_data {
33162306a36Sopenharmony_ci	enum dsi_model model;
33262306a36Sopenharmony_ci	const struct dss_pll_hw *pll_hw;
33362306a36Sopenharmony_ci	const struct dsi_module_id_data *modules;
33462306a36Sopenharmony_ci	unsigned int max_fck_freq;
33562306a36Sopenharmony_ci	unsigned int max_pll_lpdiv;
33662306a36Sopenharmony_ci	enum dsi_quirks quirks;
33762306a36Sopenharmony_ci};
33862306a36Sopenharmony_ci
33962306a36Sopenharmony_cistruct dsi_data {
34062306a36Sopenharmony_ci	struct device *dev;
34162306a36Sopenharmony_ci	void __iomem *proto_base;
34262306a36Sopenharmony_ci	void __iomem *phy_base;
34362306a36Sopenharmony_ci	void __iomem *pll_base;
34462306a36Sopenharmony_ci
34562306a36Sopenharmony_ci	const struct dsi_of_data *data;
34662306a36Sopenharmony_ci	int module_id;
34762306a36Sopenharmony_ci
34862306a36Sopenharmony_ci	int irq;
34962306a36Sopenharmony_ci
35062306a36Sopenharmony_ci	bool is_enabled;
35162306a36Sopenharmony_ci
35262306a36Sopenharmony_ci	struct clk *dss_clk;
35362306a36Sopenharmony_ci	struct regmap *syscon;
35462306a36Sopenharmony_ci	struct dss_device *dss;
35562306a36Sopenharmony_ci
35662306a36Sopenharmony_ci	struct mipi_dsi_host host;
35762306a36Sopenharmony_ci
35862306a36Sopenharmony_ci	struct dispc_clock_info user_dispc_cinfo;
35962306a36Sopenharmony_ci	struct dss_pll_clock_info user_dsi_cinfo;
36062306a36Sopenharmony_ci
36162306a36Sopenharmony_ci	struct dsi_lp_clock_info user_lp_cinfo;
36262306a36Sopenharmony_ci	struct dsi_lp_clock_info current_lp_cinfo;
36362306a36Sopenharmony_ci
36462306a36Sopenharmony_ci	struct dss_pll pll;
36562306a36Sopenharmony_ci
36662306a36Sopenharmony_ci	bool vdds_dsi_enabled;
36762306a36Sopenharmony_ci	struct regulator *vdds_dsi_reg;
36862306a36Sopenharmony_ci
36962306a36Sopenharmony_ci	struct mipi_dsi_device *dsidev;
37062306a36Sopenharmony_ci
37162306a36Sopenharmony_ci	struct {
37262306a36Sopenharmony_ci		enum dsi_vc_source source;
37362306a36Sopenharmony_ci		enum fifo_size tx_fifo_size;
37462306a36Sopenharmony_ci		enum fifo_size rx_fifo_size;
37562306a36Sopenharmony_ci	} vc[4];
37662306a36Sopenharmony_ci
37762306a36Sopenharmony_ci	struct mutex lock;
37862306a36Sopenharmony_ci	struct semaphore bus_lock;
37962306a36Sopenharmony_ci
38062306a36Sopenharmony_ci	spinlock_t irq_lock;
38162306a36Sopenharmony_ci	struct dsi_isr_tables isr_tables;
38262306a36Sopenharmony_ci	/* space for a copy used by the interrupt handler */
38362306a36Sopenharmony_ci	struct dsi_isr_tables isr_tables_copy;
38462306a36Sopenharmony_ci
38562306a36Sopenharmony_ci	int update_vc;
38662306a36Sopenharmony_ci#ifdef DSI_PERF_MEASURE
38762306a36Sopenharmony_ci	unsigned int update_bytes;
38862306a36Sopenharmony_ci#endif
38962306a36Sopenharmony_ci
39062306a36Sopenharmony_ci	/* external TE GPIO */
39162306a36Sopenharmony_ci	struct gpio_desc *te_gpio;
39262306a36Sopenharmony_ci	int te_irq;
39362306a36Sopenharmony_ci	struct delayed_work te_timeout_work;
39462306a36Sopenharmony_ci	atomic_t do_ext_te_update;
39562306a36Sopenharmony_ci
39662306a36Sopenharmony_ci	bool te_enabled;
39762306a36Sopenharmony_ci	bool iface_enabled;
39862306a36Sopenharmony_ci	bool video_enabled;
39962306a36Sopenharmony_ci
40062306a36Sopenharmony_ci	struct delayed_work framedone_timeout_work;
40162306a36Sopenharmony_ci
40262306a36Sopenharmony_ci#ifdef DSI_CATCH_MISSING_TE
40362306a36Sopenharmony_ci	struct timer_list te_timer;
40462306a36Sopenharmony_ci#endif
40562306a36Sopenharmony_ci
40662306a36Sopenharmony_ci	unsigned long cache_req_pck;
40762306a36Sopenharmony_ci	unsigned long cache_clk_freq;
40862306a36Sopenharmony_ci	struct dss_pll_clock_info cache_cinfo;
40962306a36Sopenharmony_ci
41062306a36Sopenharmony_ci	u32		errors;
41162306a36Sopenharmony_ci	spinlock_t	errors_lock;
41262306a36Sopenharmony_ci#ifdef DSI_PERF_MEASURE
41362306a36Sopenharmony_ci	ktime_t perf_setup_time;
41462306a36Sopenharmony_ci	ktime_t perf_start_time;
41562306a36Sopenharmony_ci#endif
41662306a36Sopenharmony_ci	int debug_read;
41762306a36Sopenharmony_ci	int debug_write;
41862306a36Sopenharmony_ci	struct {
41962306a36Sopenharmony_ci		struct dss_debugfs_entry *irqs;
42062306a36Sopenharmony_ci		struct dss_debugfs_entry *regs;
42162306a36Sopenharmony_ci		struct dss_debugfs_entry *clks;
42262306a36Sopenharmony_ci	} debugfs;
42362306a36Sopenharmony_ci
42462306a36Sopenharmony_ci#ifdef CONFIG_OMAP2_DSS_COLLECT_IRQ_STATS
42562306a36Sopenharmony_ci	spinlock_t irq_stats_lock;
42662306a36Sopenharmony_ci	struct dsi_irq_stats irq_stats;
42762306a36Sopenharmony_ci#endif
42862306a36Sopenharmony_ci
42962306a36Sopenharmony_ci	unsigned int num_lanes_supported;
43062306a36Sopenharmony_ci	unsigned int line_buffer_size;
43162306a36Sopenharmony_ci
43262306a36Sopenharmony_ci	struct dsi_lane_config lanes[DSI_MAX_NR_LANES];
43362306a36Sopenharmony_ci	unsigned int num_lanes_used;
43462306a36Sopenharmony_ci
43562306a36Sopenharmony_ci	unsigned int scp_clk_refcount;
43662306a36Sopenharmony_ci
43762306a36Sopenharmony_ci	struct omap_dss_dsi_config config;
43862306a36Sopenharmony_ci
43962306a36Sopenharmony_ci	struct dss_lcd_mgr_config mgr_config;
44062306a36Sopenharmony_ci	struct videomode vm;
44162306a36Sopenharmony_ci	enum mipi_dsi_pixel_format pix_fmt;
44262306a36Sopenharmony_ci	enum omap_dss_dsi_mode mode;
44362306a36Sopenharmony_ci	struct omap_dss_dsi_videomode_timings vm_timings;
44462306a36Sopenharmony_ci
44562306a36Sopenharmony_ci	struct omap_dss_device output;
44662306a36Sopenharmony_ci	struct drm_bridge bridge;
44762306a36Sopenharmony_ci
44862306a36Sopenharmony_ci	struct delayed_work dsi_disable_work;
44962306a36Sopenharmony_ci};
45062306a36Sopenharmony_ci
45162306a36Sopenharmony_cistruct dsi_packet_sent_handler_data {
45262306a36Sopenharmony_ci	struct dsi_data *dsi;
45362306a36Sopenharmony_ci	struct completion *completion;
45462306a36Sopenharmony_ci};
45562306a36Sopenharmony_ci
45662306a36Sopenharmony_ci#endif /* __OMAP_DRM_DSS_DSI_H */
457