xref: /linux/drivers/gpu/drm/omapdrm/dss/dsi.h (revision dfd2edcc)
17aa52346STomi Valkeinen /* SPDX-License-Identifier: GPL-2.0-only */
27aa52346STomi Valkeinen /*
37aa52346STomi Valkeinen  * Copyright (C) 2016 Texas Instruments Incorporated - http://www.ti.com/
47aa52346STomi Valkeinen  * Author: Tomi Valkeinen <tomi.valkeinen@ti.com>
57aa52346STomi Valkeinen  */
67aa52346STomi Valkeinen 
77aa52346STomi Valkeinen #ifndef __OMAP_DRM_DSS_DSI_H
87aa52346STomi Valkeinen #define __OMAP_DRM_DSS_DSI_H
97aa52346STomi Valkeinen 
107aa52346STomi Valkeinen #include <drm/drm_mipi_dsi.h>
117aa52346STomi Valkeinen 
127aa52346STomi Valkeinen struct dsi_reg {
137aa52346STomi Valkeinen 	u16 module;
147aa52346STomi Valkeinen 	u16 idx;
157aa52346STomi Valkeinen };
167aa52346STomi Valkeinen 
177aa52346STomi Valkeinen #define DSI_REG(mod, idx)		((const struct dsi_reg) { mod, idx })
187aa52346STomi Valkeinen 
197aa52346STomi Valkeinen /* DSI Protocol Engine */
207aa52346STomi Valkeinen 
217aa52346STomi Valkeinen #define DSI_PROTO			0
227aa52346STomi Valkeinen #define DSI_PROTO_SZ			0x200
237aa52346STomi Valkeinen 
247aa52346STomi Valkeinen #define DSI_REVISION			DSI_REG(DSI_PROTO, 0x0000)
257aa52346STomi Valkeinen #define DSI_SYSCONFIG			DSI_REG(DSI_PROTO, 0x0010)
267aa52346STomi Valkeinen #define DSI_SYSSTATUS			DSI_REG(DSI_PROTO, 0x0014)
277aa52346STomi Valkeinen #define DSI_IRQSTATUS			DSI_REG(DSI_PROTO, 0x0018)
287aa52346STomi Valkeinen #define DSI_IRQENABLE			DSI_REG(DSI_PROTO, 0x001C)
297aa52346STomi Valkeinen #define DSI_CTRL			DSI_REG(DSI_PROTO, 0x0040)
307aa52346STomi Valkeinen #define DSI_GNQ				DSI_REG(DSI_PROTO, 0x0044)
317aa52346STomi Valkeinen #define DSI_COMPLEXIO_CFG1		DSI_REG(DSI_PROTO, 0x0048)
327aa52346STomi Valkeinen #define DSI_COMPLEXIO_IRQ_STATUS	DSI_REG(DSI_PROTO, 0x004C)
337aa52346STomi Valkeinen #define DSI_COMPLEXIO_IRQ_ENABLE	DSI_REG(DSI_PROTO, 0x0050)
347aa52346STomi Valkeinen #define DSI_CLK_CTRL			DSI_REG(DSI_PROTO, 0x0054)
357aa52346STomi Valkeinen #define DSI_TIMING1			DSI_REG(DSI_PROTO, 0x0058)
367aa52346STomi Valkeinen #define DSI_TIMING2			DSI_REG(DSI_PROTO, 0x005C)
377aa52346STomi Valkeinen #define DSI_VM_TIMING1			DSI_REG(DSI_PROTO, 0x0060)
387aa52346STomi Valkeinen #define DSI_VM_TIMING2			DSI_REG(DSI_PROTO, 0x0064)
397aa52346STomi Valkeinen #define DSI_VM_TIMING3			DSI_REG(DSI_PROTO, 0x0068)
407aa52346STomi Valkeinen #define DSI_CLK_TIMING			DSI_REG(DSI_PROTO, 0x006C)
417aa52346STomi Valkeinen #define DSI_TX_FIFO_VC_SIZE		DSI_REG(DSI_PROTO, 0x0070)
427aa52346STomi Valkeinen #define DSI_RX_FIFO_VC_SIZE		DSI_REG(DSI_PROTO, 0x0074)
437aa52346STomi Valkeinen #define DSI_COMPLEXIO_CFG2		DSI_REG(DSI_PROTO, 0x0078)
447aa52346STomi Valkeinen #define DSI_RX_FIFO_VC_FULLNESS		DSI_REG(DSI_PROTO, 0x007C)
457aa52346STomi Valkeinen #define DSI_VM_TIMING4			DSI_REG(DSI_PROTO, 0x0080)
467aa52346STomi Valkeinen #define DSI_TX_FIFO_VC_EMPTINESS	DSI_REG(DSI_PROTO, 0x0084)
477aa52346STomi Valkeinen #define DSI_VM_TIMING5			DSI_REG(DSI_PROTO, 0x0088)
487aa52346STomi Valkeinen #define DSI_VM_TIMING6			DSI_REG(DSI_PROTO, 0x008C)
497aa52346STomi Valkeinen #define DSI_VM_TIMING7			DSI_REG(DSI_PROTO, 0x0090)
507aa52346STomi Valkeinen #define DSI_STOPCLK_TIMING		DSI_REG(DSI_PROTO, 0x0094)
517aa52346STomi Valkeinen #define DSI_VC_CTRL(n)			DSI_REG(DSI_PROTO, 0x0100 + (n * 0x20))
527aa52346STomi Valkeinen #define DSI_VC_TE(n)			DSI_REG(DSI_PROTO, 0x0104 + (n * 0x20))
537aa52346STomi Valkeinen #define DSI_VC_LONG_PACKET_HEADER(n)	DSI_REG(DSI_PROTO, 0x0108 + (n * 0x20))
547aa52346STomi Valkeinen #define DSI_VC_LONG_PACKET_PAYLOAD(n)	DSI_REG(DSI_PROTO, 0x010C + (n * 0x20))
557aa52346STomi Valkeinen #define DSI_VC_SHORT_PACKET_HEADER(n)	DSI_REG(DSI_PROTO, 0x0110 + (n * 0x20))
567aa52346STomi Valkeinen #define DSI_VC_IRQSTATUS(n)		DSI_REG(DSI_PROTO, 0x0118 + (n * 0x20))
577aa52346STomi Valkeinen #define DSI_VC_IRQENABLE(n)		DSI_REG(DSI_PROTO, 0x011C + (n * 0x20))
587aa52346STomi Valkeinen 
597aa52346STomi Valkeinen /* DSIPHY_SCP */
607aa52346STomi Valkeinen 
617aa52346STomi Valkeinen #define DSI_PHY				1
627aa52346STomi Valkeinen #define DSI_PHY_OFFSET			0x200
637aa52346STomi Valkeinen #define DSI_PHY_SZ			0x40
647aa52346STomi Valkeinen 
657aa52346STomi Valkeinen #define DSI_DSIPHY_CFG0			DSI_REG(DSI_PHY, 0x0000)
667aa52346STomi Valkeinen #define DSI_DSIPHY_CFG1			DSI_REG(DSI_PHY, 0x0004)
677aa52346STomi Valkeinen #define DSI_DSIPHY_CFG2			DSI_REG(DSI_PHY, 0x0008)
687aa52346STomi Valkeinen #define DSI_DSIPHY_CFG5			DSI_REG(DSI_PHY, 0x0014)
697aa52346STomi Valkeinen #define DSI_DSIPHY_CFG10		DSI_REG(DSI_PHY, 0x0028)
707aa52346STomi Valkeinen 
717aa52346STomi Valkeinen /* DSI_PLL_CTRL_SCP */
727aa52346STomi Valkeinen 
737aa52346STomi Valkeinen #define DSI_PLL				2
747aa52346STomi Valkeinen #define DSI_PLL_OFFSET			0x300
757aa52346STomi Valkeinen #define DSI_PLL_SZ			0x20
767aa52346STomi Valkeinen 
777aa52346STomi Valkeinen #define DSI_PLL_CONTROL			DSI_REG(DSI_PLL, 0x0000)
787aa52346STomi Valkeinen #define DSI_PLL_STATUS			DSI_REG(DSI_PLL, 0x0004)
797aa52346STomi Valkeinen #define DSI_PLL_GO			DSI_REG(DSI_PLL, 0x0008)
807aa52346STomi Valkeinen #define DSI_PLL_CONFIGURATION1		DSI_REG(DSI_PLL, 0x000C)
817aa52346STomi Valkeinen #define DSI_PLL_CONFIGURATION2		DSI_REG(DSI_PLL, 0x0010)
827aa52346STomi Valkeinen 
837aa52346STomi Valkeinen /* Global interrupts */
847aa52346STomi Valkeinen #define DSI_IRQ_VC0		(1 << 0)
857aa52346STomi Valkeinen #define DSI_IRQ_VC1		(1 << 1)
867aa52346STomi Valkeinen #define DSI_IRQ_VC2		(1 << 2)
877aa52346STomi Valkeinen #define DSI_IRQ_VC3		(1 << 3)
887aa52346STomi Valkeinen #define DSI_IRQ_WAKEUP		(1 << 4)
897aa52346STomi Valkeinen #define DSI_IRQ_RESYNC		(1 << 5)
907aa52346STomi Valkeinen #define DSI_IRQ_PLL_LOCK	(1 << 7)
917aa52346STomi Valkeinen #define DSI_IRQ_PLL_UNLOCK	(1 << 8)
927aa52346STomi Valkeinen #define DSI_IRQ_PLL_RECALL	(1 << 9)
937aa52346STomi Valkeinen #define DSI_IRQ_COMPLEXIO_ERR	(1 << 10)
947aa52346STomi Valkeinen #define DSI_IRQ_HS_TX_TIMEOUT	(1 << 14)
957aa52346STomi Valkeinen #define DSI_IRQ_LP_RX_TIMEOUT	(1 << 15)
967aa52346STomi Valkeinen #define DSI_IRQ_TE_TRIGGER	(1 << 16)
977aa52346STomi Valkeinen #define DSI_IRQ_ACK_TRIGGER	(1 << 17)
987aa52346STomi Valkeinen #define DSI_IRQ_SYNC_LOST	(1 << 18)
997aa52346STomi Valkeinen #define DSI_IRQ_LDO_POWER_GOOD	(1 << 19)
1007aa52346STomi Valkeinen #define DSI_IRQ_TA_TIMEOUT	(1 << 20)
1017aa52346STomi Valkeinen #define DSI_IRQ_ERROR_MASK \
1027aa52346STomi Valkeinen 	(DSI_IRQ_HS_TX_TIMEOUT | DSI_IRQ_LP_RX_TIMEOUT | DSI_IRQ_SYNC_LOST | \
1037aa52346STomi Valkeinen 	DSI_IRQ_TA_TIMEOUT)
1047aa52346STomi Valkeinen #define DSI_IRQ_CHANNEL_MASK	0xf
1057aa52346STomi Valkeinen 
1067aa52346STomi Valkeinen /* Virtual channel interrupts */
1077aa52346STomi Valkeinen #define DSI_VC_IRQ_CS		(1 << 0)
1087aa52346STomi Valkeinen #define DSI_VC_IRQ_ECC_CORR	(1 << 1)
1097aa52346STomi Valkeinen #define DSI_VC_IRQ_PACKET_SENT	(1 << 2)
1107aa52346STomi Valkeinen #define DSI_VC_IRQ_FIFO_TX_OVF	(1 << 3)
1117aa52346STomi Valkeinen #define DSI_VC_IRQ_FIFO_RX_OVF	(1 << 4)
1127aa52346STomi Valkeinen #define DSI_VC_IRQ_BTA		(1 << 5)
1137aa52346STomi Valkeinen #define DSI_VC_IRQ_ECC_NO_CORR	(1 << 6)
1147aa52346STomi Valkeinen #define DSI_VC_IRQ_FIFO_TX_UDF	(1 << 7)
1157aa52346STomi Valkeinen #define DSI_VC_IRQ_PP_BUSY_CHANGE (1 << 8)
1167aa52346STomi Valkeinen #define DSI_VC_IRQ_ERROR_MASK \
1177aa52346STomi Valkeinen 	(DSI_VC_IRQ_CS | DSI_VC_IRQ_ECC_CORR | DSI_VC_IRQ_FIFO_TX_OVF | \
1187aa52346STomi Valkeinen 	DSI_VC_IRQ_FIFO_RX_OVF | DSI_VC_IRQ_ECC_NO_CORR | \
1197aa52346STomi Valkeinen 	DSI_VC_IRQ_FIFO_TX_UDF)
1207aa52346STomi Valkeinen 
1217aa52346STomi Valkeinen /* ComplexIO interrupts */
1227aa52346STomi Valkeinen #define DSI_CIO_IRQ_ERRSYNCESC1		(1 << 0)
1237aa52346STomi Valkeinen #define DSI_CIO_IRQ_ERRSYNCESC2		(1 << 1)
1247aa52346STomi Valkeinen #define DSI_CIO_IRQ_ERRSYNCESC3		(1 << 2)
1257aa52346STomi Valkeinen #define DSI_CIO_IRQ_ERRSYNCESC4		(1 << 3)
1267aa52346STomi Valkeinen #define DSI_CIO_IRQ_ERRSYNCESC5		(1 << 4)
1277aa52346STomi Valkeinen #define DSI_CIO_IRQ_ERRESC1		(1 << 5)
1287aa52346STomi Valkeinen #define DSI_CIO_IRQ_ERRESC2		(1 << 6)
1297aa52346STomi Valkeinen #define DSI_CIO_IRQ_ERRESC3		(1 << 7)
1307aa52346STomi Valkeinen #define DSI_CIO_IRQ_ERRESC4		(1 << 8)
1317aa52346STomi Valkeinen #define DSI_CIO_IRQ_ERRESC5		(1 << 9)
1327aa52346STomi Valkeinen #define DSI_CIO_IRQ_ERRCONTROL1		(1 << 10)
1337aa52346STomi Valkeinen #define DSI_CIO_IRQ_ERRCONTROL2		(1 << 11)
1347aa52346STomi Valkeinen #define DSI_CIO_IRQ_ERRCONTROL3		(1 << 12)
1357aa52346STomi Valkeinen #define DSI_CIO_IRQ_ERRCONTROL4		(1 << 13)
1367aa52346STomi Valkeinen #define DSI_CIO_IRQ_ERRCONTROL5		(1 << 14)
1377aa52346STomi Valkeinen #define DSI_CIO_IRQ_STATEULPS1		(1 << 15)
1387aa52346STomi Valkeinen #define DSI_CIO_IRQ_STATEULPS2		(1 << 16)
1397aa52346STomi Valkeinen #define DSI_CIO_IRQ_STATEULPS3		(1 << 17)
1407aa52346STomi Valkeinen #define DSI_CIO_IRQ_STATEULPS4		(1 << 18)
1417aa52346STomi Valkeinen #define DSI_CIO_IRQ_STATEULPS5		(1 << 19)
1427aa52346STomi Valkeinen #define DSI_CIO_IRQ_ERRCONTENTIONLP0_1	(1 << 20)
1437aa52346STomi Valkeinen #define DSI_CIO_IRQ_ERRCONTENTIONLP1_1	(1 << 21)
1447aa52346STomi Valkeinen #define DSI_CIO_IRQ_ERRCONTENTIONLP0_2	(1 << 22)
1457aa52346STomi Valkeinen #define DSI_CIO_IRQ_ERRCONTENTIONLP1_2	(1 << 23)
1467aa52346STomi Valkeinen #define DSI_CIO_IRQ_ERRCONTENTIONLP0_3	(1 << 24)
1477aa52346STomi Valkeinen #define DSI_CIO_IRQ_ERRCONTENTIONLP1_3	(1 << 25)
1487aa52346STomi Valkeinen #define DSI_CIO_IRQ_ERRCONTENTIONLP0_4	(1 << 26)
1497aa52346STomi Valkeinen #define DSI_CIO_IRQ_ERRCONTENTIONLP1_4	(1 << 27)
1507aa52346STomi Valkeinen #define DSI_CIO_IRQ_ERRCONTENTIONLP0_5	(1 << 28)
1517aa52346STomi Valkeinen #define DSI_CIO_IRQ_ERRCONTENTIONLP1_5	(1 << 29)
1527aa52346STomi Valkeinen #define DSI_CIO_IRQ_ULPSACTIVENOT_ALL0	(1 << 30)
1537aa52346STomi Valkeinen #define DSI_CIO_IRQ_ULPSACTIVENOT_ALL1	(1 << 31)
1547aa52346STomi Valkeinen #define DSI_CIO_IRQ_ERROR_MASK \
1557aa52346STomi Valkeinen 	(DSI_CIO_IRQ_ERRSYNCESC1 | DSI_CIO_IRQ_ERRSYNCESC2 | \
1567aa52346STomi Valkeinen 	 DSI_CIO_IRQ_ERRSYNCESC3 | DSI_CIO_IRQ_ERRSYNCESC4 | \
1577aa52346STomi Valkeinen 	 DSI_CIO_IRQ_ERRSYNCESC5 | \
1587aa52346STomi Valkeinen 	 DSI_CIO_IRQ_ERRESC1 | DSI_CIO_IRQ_ERRESC2 | \
1597aa52346STomi Valkeinen 	 DSI_CIO_IRQ_ERRESC3 | DSI_CIO_IRQ_ERRESC4 | \
1607aa52346STomi Valkeinen 	 DSI_CIO_IRQ_ERRESC5 | \
1617aa52346STomi Valkeinen 	 DSI_CIO_IRQ_ERRCONTROL1 | DSI_CIO_IRQ_ERRCONTROL2 | \
1627aa52346STomi Valkeinen 	 DSI_CIO_IRQ_ERRCONTROL3 | DSI_CIO_IRQ_ERRCONTROL4 | \
1637aa52346STomi Valkeinen 	 DSI_CIO_IRQ_ERRCONTROL5 | \
1647aa52346STomi Valkeinen 	 DSI_CIO_IRQ_ERRCONTENTIONLP0_1 | DSI_CIO_IRQ_ERRCONTENTIONLP1_1 | \
1657aa52346STomi Valkeinen 	 DSI_CIO_IRQ_ERRCONTENTIONLP0_2 | DSI_CIO_IRQ_ERRCONTENTIONLP1_2 | \
1667aa52346STomi Valkeinen 	 DSI_CIO_IRQ_ERRCONTENTIONLP0_3 | DSI_CIO_IRQ_ERRCONTENTIONLP1_3 | \
1677aa52346STomi Valkeinen 	 DSI_CIO_IRQ_ERRCONTENTIONLP0_4 | DSI_CIO_IRQ_ERRCONTENTIONLP1_4 | \
1687aa52346STomi Valkeinen 	 DSI_CIO_IRQ_ERRCONTENTIONLP0_5 | DSI_CIO_IRQ_ERRCONTENTIONLP1_5)
1697aa52346STomi Valkeinen 
1707aa52346STomi Valkeinen enum omap_dss_dsi_mode {
1717aa52346STomi Valkeinen 	OMAP_DSS_DSI_CMD_MODE = 0,
1727aa52346STomi Valkeinen 	OMAP_DSS_DSI_VIDEO_MODE,
1737aa52346STomi Valkeinen };
1747aa52346STomi Valkeinen 
1757aa52346STomi Valkeinen enum omap_dss_dsi_trans_mode {
1767aa52346STomi Valkeinen 	/* Sync Pulses: both sync start and end packets sent */
1777aa52346STomi Valkeinen 	OMAP_DSS_DSI_PULSE_MODE,
1787aa52346STomi Valkeinen 	/* Sync Events: only sync start packets sent */
1797aa52346STomi Valkeinen 	OMAP_DSS_DSI_EVENT_MODE,
1807aa52346STomi Valkeinen 	/* Burst: only sync start packets sent, pixels are time compressed */
1817aa52346STomi Valkeinen 	OMAP_DSS_DSI_BURST_MODE,
1827aa52346STomi Valkeinen };
1837aa52346STomi Valkeinen 
1847aa52346STomi Valkeinen struct omap_dss_dsi_videomode_timings {
1857aa52346STomi Valkeinen 	unsigned long hsclk;
1867aa52346STomi Valkeinen 
1877aa52346STomi Valkeinen 	unsigned int ndl;
1887aa52346STomi Valkeinen 	unsigned int bitspp;
1897aa52346STomi Valkeinen 
1907aa52346STomi Valkeinen 	/* pixels */
1917aa52346STomi Valkeinen 	u16 hact;
1927aa52346STomi Valkeinen 	/* lines */
1937aa52346STomi Valkeinen 	u16 vact;
1947aa52346STomi Valkeinen 
1957aa52346STomi Valkeinen 	/* DSI video mode blanking data */
1967aa52346STomi Valkeinen 	/* Unit: byte clock cycles */
1977aa52346STomi Valkeinen 	u16 hss;
1987aa52346STomi Valkeinen 	u16 hsa;
1997aa52346STomi Valkeinen 	u16 hse;
2007aa52346STomi Valkeinen 	u16 hfp;
2017aa52346STomi Valkeinen 	u16 hbp;
2027aa52346STomi Valkeinen 	/* Unit: line clocks */
2037aa52346STomi Valkeinen 	u16 vsa;
2047aa52346STomi Valkeinen 	u16 vfp;
2057aa52346STomi Valkeinen 	u16 vbp;
2067aa52346STomi Valkeinen 
2077aa52346STomi Valkeinen 	/* DSI blanking modes */
2087aa52346STomi Valkeinen 	int blanking_mode;
2097aa52346STomi Valkeinen 	int hsa_blanking_mode;
2107aa52346STomi Valkeinen 	int hbp_blanking_mode;
2117aa52346STomi Valkeinen 	int hfp_blanking_mode;
2127aa52346STomi Valkeinen 
2137aa52346STomi Valkeinen 	enum omap_dss_dsi_trans_mode trans_mode;
2147aa52346STomi Valkeinen 
2157aa52346STomi Valkeinen 	int window_sync;
2167aa52346STomi Valkeinen };
2177aa52346STomi Valkeinen 
2187aa52346STomi Valkeinen struct omap_dss_dsi_config {
2197aa52346STomi Valkeinen 	enum omap_dss_dsi_mode mode;
2207aa52346STomi Valkeinen 	enum mipi_dsi_pixel_format pixel_format;
2217aa52346STomi Valkeinen 	const struct videomode *vm;
2227aa52346STomi Valkeinen 
2237aa52346STomi Valkeinen 	unsigned long hs_clk_min, hs_clk_max;
2247aa52346STomi Valkeinen 	unsigned long lp_clk_min, lp_clk_max;
2257aa52346STomi Valkeinen 
2267aa52346STomi Valkeinen 	enum omap_dss_dsi_trans_mode trans_mode;
2277aa52346STomi Valkeinen };
2287aa52346STomi Valkeinen 
2297aa52346STomi Valkeinen /* DSI PLL HSDIV indices */
2307aa52346STomi Valkeinen #define HSDIV_DISPC	0
2317aa52346STomi Valkeinen #define HSDIV_DSI	1
2327aa52346STomi Valkeinen 
2337aa52346STomi Valkeinen #define DSI_MAX_NR_ISRS                2
2347aa52346STomi Valkeinen #define DSI_MAX_NR_LANES	5
2357aa52346STomi Valkeinen 
2367aa52346STomi Valkeinen enum dsi_model {
2377aa52346STomi Valkeinen 	DSI_MODEL_OMAP3,
2387aa52346STomi Valkeinen 	DSI_MODEL_OMAP4,
2397aa52346STomi Valkeinen 	DSI_MODEL_OMAP5,
2407aa52346STomi Valkeinen };
2417aa52346STomi Valkeinen 
2427aa52346STomi Valkeinen enum dsi_lane_function {
2437aa52346STomi Valkeinen 	DSI_LANE_UNUSED	= 0,
2447aa52346STomi Valkeinen 	DSI_LANE_CLK,
2457aa52346STomi Valkeinen 	DSI_LANE_DATA1,
2467aa52346STomi Valkeinen 	DSI_LANE_DATA2,
2477aa52346STomi Valkeinen 	DSI_LANE_DATA3,
2487aa52346STomi Valkeinen 	DSI_LANE_DATA4,
2497aa52346STomi Valkeinen };
2507aa52346STomi Valkeinen 
2517aa52346STomi Valkeinen struct dsi_lane_config {
2527aa52346STomi Valkeinen 	enum dsi_lane_function function;
2537aa52346STomi Valkeinen 	u8 polarity;
2547aa52346STomi Valkeinen };
2557aa52346STomi Valkeinen 
2567aa52346STomi Valkeinen typedef void (*omap_dsi_isr_t) (void *arg, u32 mask);
2577aa52346STomi Valkeinen 
2587aa52346STomi Valkeinen struct dsi_isr_data {
2597aa52346STomi Valkeinen 	omap_dsi_isr_t	isr;
2607aa52346STomi Valkeinen 	void		*arg;
2617aa52346STomi Valkeinen 	u32		mask;
2627aa52346STomi Valkeinen };
2637aa52346STomi Valkeinen 
2647aa52346STomi Valkeinen enum fifo_size {
2657aa52346STomi Valkeinen 	DSI_FIFO_SIZE_0		= 0,
2667aa52346STomi Valkeinen 	DSI_FIFO_SIZE_32	= 1,
2677aa52346STomi Valkeinen 	DSI_FIFO_SIZE_64	= 2,
2687aa52346STomi Valkeinen 	DSI_FIFO_SIZE_96	= 3,
2697aa52346STomi Valkeinen 	DSI_FIFO_SIZE_128	= 4,
2707aa52346STomi Valkeinen };
2717aa52346STomi Valkeinen 
2727aa52346STomi Valkeinen enum dsi_vc_source {
2737aa52346STomi Valkeinen 	DSI_VC_SOURCE_L4 = 0,
2747aa52346STomi Valkeinen 	DSI_VC_SOURCE_VP,
2757aa52346STomi Valkeinen };
2767aa52346STomi Valkeinen 
2777aa52346STomi Valkeinen struct dsi_irq_stats {
2787aa52346STomi Valkeinen 	unsigned long last_reset;
2797aa52346STomi Valkeinen 	unsigned int irq_count;
2807aa52346STomi Valkeinen 	unsigned int dsi_irqs[32];
2817aa52346STomi Valkeinen 	unsigned int vc_irqs[4][32];
2827aa52346STomi Valkeinen 	unsigned int cio_irqs[32];
2837aa52346STomi Valkeinen };
2847aa52346STomi Valkeinen 
2857aa52346STomi Valkeinen struct dsi_isr_tables {
2867aa52346STomi Valkeinen 	struct dsi_isr_data isr_table[DSI_MAX_NR_ISRS];
2877aa52346STomi Valkeinen 	struct dsi_isr_data isr_table_vc[4][DSI_MAX_NR_ISRS];
2887aa52346STomi Valkeinen 	struct dsi_isr_data isr_table_cio[DSI_MAX_NR_ISRS];
2897aa52346STomi Valkeinen };
2907aa52346STomi Valkeinen 
2917aa52346STomi Valkeinen struct dsi_lp_clock_info {
2927aa52346STomi Valkeinen 	unsigned long lp_clk;
2937aa52346STomi Valkeinen 	u16 lp_clk_div;
2947aa52346STomi Valkeinen };
2957aa52346STomi Valkeinen 
2967aa52346STomi Valkeinen struct dsi_clk_calc_ctx {
2977aa52346STomi Valkeinen 	struct dsi_data *dsi;
2987aa52346STomi Valkeinen 	struct dss_pll *pll;
2997aa52346STomi Valkeinen 
3007aa52346STomi Valkeinen 	/* inputs */
3017aa52346STomi Valkeinen 
3027aa52346STomi Valkeinen 	const struct omap_dss_dsi_config *config;
3037aa52346STomi Valkeinen 
3047aa52346STomi Valkeinen 	unsigned long req_pck_min, req_pck_nom, req_pck_max;
3057aa52346STomi Valkeinen 
3067aa52346STomi Valkeinen 	/* outputs */
3077aa52346STomi Valkeinen 
3087aa52346STomi Valkeinen 	struct dss_pll_clock_info dsi_cinfo;
3097aa52346STomi Valkeinen 	struct dispc_clock_info dispc_cinfo;
3107aa52346STomi Valkeinen 	struct dsi_lp_clock_info lp_cinfo;
3117aa52346STomi Valkeinen 
3127aa52346STomi Valkeinen 	struct videomode vm;
3137aa52346STomi Valkeinen 	struct omap_dss_dsi_videomode_timings dsi_vm;
3147aa52346STomi Valkeinen };
3157aa52346STomi Valkeinen 
3167aa52346STomi Valkeinen struct dsi_module_id_data {
3177aa52346STomi Valkeinen 	u32 address;
3187aa52346STomi Valkeinen 	int id;
3197aa52346STomi Valkeinen };
3207aa52346STomi Valkeinen 
3217aa52346STomi Valkeinen enum dsi_quirks {
3227aa52346STomi Valkeinen 	DSI_QUIRK_PLL_PWR_BUG = (1 << 0),	/* DSI-PLL power command 0x3 is not working */
3237aa52346STomi Valkeinen 	DSI_QUIRK_DCS_CMD_CONFIG_VC = (1 << 1),
3247aa52346STomi Valkeinen 	DSI_QUIRK_VC_OCP_WIDTH = (1 << 2),
3257aa52346STomi Valkeinen 	DSI_QUIRK_REVERSE_TXCLKESC = (1 << 3),
3267aa52346STomi Valkeinen 	DSI_QUIRK_GNQ = (1 << 4),
3277aa52346STomi Valkeinen 	DSI_QUIRK_PHY_DCC = (1 << 5),
3287aa52346STomi Valkeinen };
3297aa52346STomi Valkeinen 
3307aa52346STomi Valkeinen struct dsi_of_data {
3317aa52346STomi Valkeinen 	enum dsi_model model;
3327aa52346STomi Valkeinen 	const struct dss_pll_hw *pll_hw;
3337aa52346STomi Valkeinen 	const struct dsi_module_id_data *modules;
3347aa52346STomi Valkeinen 	unsigned int max_fck_freq;
3357aa52346STomi Valkeinen 	unsigned int max_pll_lpdiv;
3367aa52346STomi Valkeinen 	enum dsi_quirks quirks;
3377aa52346STomi Valkeinen };
3387aa52346STomi Valkeinen 
3397aa52346STomi Valkeinen struct dsi_data {
3407aa52346STomi Valkeinen 	struct device *dev;
3417aa52346STomi Valkeinen 	void __iomem *proto_base;
3427aa52346STomi Valkeinen 	void __iomem *phy_base;
3437aa52346STomi Valkeinen 	void __iomem *pll_base;
3447aa52346STomi Valkeinen 
3457aa52346STomi Valkeinen 	const struct dsi_of_data *data;
3467aa52346STomi Valkeinen 	int module_id;
3477aa52346STomi Valkeinen 
3487aa52346STomi Valkeinen 	int irq;
3497aa52346STomi Valkeinen 
3507aa52346STomi Valkeinen 	bool is_enabled;
3517aa52346STomi Valkeinen 
3527aa52346STomi Valkeinen 	struct clk *dss_clk;
3537aa52346STomi Valkeinen 	struct regmap *syscon;
3547aa52346STomi Valkeinen 	struct dss_device *dss;
3557aa52346STomi Valkeinen 
3567aa52346STomi Valkeinen 	struct mipi_dsi_host host;
3577aa52346STomi Valkeinen 
3587aa52346STomi Valkeinen 	struct dispc_clock_info user_dispc_cinfo;
3597aa52346STomi Valkeinen 	struct dss_pll_clock_info user_dsi_cinfo;
3607aa52346STomi Valkeinen 
3617aa52346STomi Valkeinen 	struct dsi_lp_clock_info user_lp_cinfo;
3627aa52346STomi Valkeinen 	struct dsi_lp_clock_info current_lp_cinfo;
3637aa52346STomi Valkeinen 
3647aa52346STomi Valkeinen 	struct dss_pll pll;
3657aa52346STomi Valkeinen 
3667aa52346STomi Valkeinen 	bool vdds_dsi_enabled;
3677aa52346STomi Valkeinen 	struct regulator *vdds_dsi_reg;
3687aa52346STomi Valkeinen 
3697aa52346STomi Valkeinen 	struct mipi_dsi_device *dsidev;
3707aa52346STomi Valkeinen 
3717aa52346STomi Valkeinen 	struct {
3727aa52346STomi Valkeinen 		enum dsi_vc_source source;
3737aa52346STomi Valkeinen 		enum fifo_size tx_fifo_size;
3747aa52346STomi Valkeinen 		enum fifo_size rx_fifo_size;
3757aa52346STomi Valkeinen 	} vc[4];
3767aa52346STomi Valkeinen 
3777aa52346STomi Valkeinen 	struct mutex lock;
3787aa52346STomi Valkeinen 	struct semaphore bus_lock;
3797aa52346STomi Valkeinen 
3807aa52346STomi Valkeinen 	spinlock_t irq_lock;
3817aa52346STomi Valkeinen 	struct dsi_isr_tables isr_tables;
3827aa52346STomi Valkeinen 	/* space for a copy used by the interrupt handler */
3837aa52346STomi Valkeinen 	struct dsi_isr_tables isr_tables_copy;
3847aa52346STomi Valkeinen 
3857aa52346STomi Valkeinen 	int update_vc;
3867aa52346STomi Valkeinen #ifdef DSI_PERF_MEASURE
3877aa52346STomi Valkeinen 	unsigned int update_bytes;
3887aa52346STomi Valkeinen #endif
3897aa52346STomi Valkeinen 
3907aa52346STomi Valkeinen 	/* external TE GPIO */
3917aa52346STomi Valkeinen 	struct gpio_desc *te_gpio;
3927aa52346STomi Valkeinen 	int te_irq;
3937aa52346STomi Valkeinen 	struct delayed_work te_timeout_work;
3947aa52346STomi Valkeinen 	atomic_t do_ext_te_update;
3957aa52346STomi Valkeinen 
3967aa52346STomi Valkeinen 	bool te_enabled;
397*dfd2edccSTomi Valkeinen 	bool iface_enabled;
3987aa52346STomi Valkeinen 	bool video_enabled;
3997aa52346STomi Valkeinen 
4007aa52346STomi Valkeinen 	struct delayed_work framedone_timeout_work;
4017aa52346STomi Valkeinen 
4027aa52346STomi Valkeinen #ifdef DSI_CATCH_MISSING_TE
4037aa52346STomi Valkeinen 	struct timer_list te_timer;
4047aa52346STomi Valkeinen #endif
4057aa52346STomi Valkeinen 
4067aa52346STomi Valkeinen 	unsigned long cache_req_pck;
4077aa52346STomi Valkeinen 	unsigned long cache_clk_freq;
4087aa52346STomi Valkeinen 	struct dss_pll_clock_info cache_cinfo;
4097aa52346STomi Valkeinen 
4107aa52346STomi Valkeinen 	u32		errors;
4117aa52346STomi Valkeinen 	spinlock_t	errors_lock;
4127aa52346STomi Valkeinen #ifdef DSI_PERF_MEASURE
4137aa52346STomi Valkeinen 	ktime_t perf_setup_time;
4147aa52346STomi Valkeinen 	ktime_t perf_start_time;
4157aa52346STomi Valkeinen #endif
4167aa52346STomi Valkeinen 	int debug_read;
4177aa52346STomi Valkeinen 	int debug_write;
4187aa52346STomi Valkeinen 	struct {
4197aa52346STomi Valkeinen 		struct dss_debugfs_entry *irqs;
4207aa52346STomi Valkeinen 		struct dss_debugfs_entry *regs;
4217aa52346STomi Valkeinen 		struct dss_debugfs_entry *clks;
4227aa52346STomi Valkeinen 	} debugfs;
4237aa52346STomi Valkeinen 
4247aa52346STomi Valkeinen #ifdef CONFIG_OMAP2_DSS_COLLECT_IRQ_STATS
4257aa52346STomi Valkeinen 	spinlock_t irq_stats_lock;
4267aa52346STomi Valkeinen 	struct dsi_irq_stats irq_stats;
4277aa52346STomi Valkeinen #endif
4287aa52346STomi Valkeinen 
4297aa52346STomi Valkeinen 	unsigned int num_lanes_supported;
4307aa52346STomi Valkeinen 	unsigned int line_buffer_size;
4317aa52346STomi Valkeinen 
4327aa52346STomi Valkeinen 	struct dsi_lane_config lanes[DSI_MAX_NR_LANES];
4337aa52346STomi Valkeinen 	unsigned int num_lanes_used;
4347aa52346STomi Valkeinen 
4357aa52346STomi Valkeinen 	unsigned int scp_clk_refcount;
4367aa52346STomi Valkeinen 
4377aa52346STomi Valkeinen 	struct omap_dss_dsi_config config;
4387aa52346STomi Valkeinen 
4397aa52346STomi Valkeinen 	struct dss_lcd_mgr_config mgr_config;
4407aa52346STomi Valkeinen 	struct videomode vm;
4417aa52346STomi Valkeinen 	enum mipi_dsi_pixel_format pix_fmt;
4427aa52346STomi Valkeinen 	enum omap_dss_dsi_mode mode;
4437aa52346STomi Valkeinen 	struct omap_dss_dsi_videomode_timings vm_timings;
4447aa52346STomi Valkeinen 
4457aa52346STomi Valkeinen 	struct omap_dss_device output;
4467aa52346STomi Valkeinen 	struct drm_bridge bridge;
447*dfd2edccSTomi Valkeinen 
448*dfd2edccSTomi Valkeinen 	struct delayed_work dsi_disable_work;
4497aa52346STomi Valkeinen };
4507aa52346STomi Valkeinen 
4517aa52346STomi Valkeinen struct dsi_packet_sent_handler_data {
4527aa52346STomi Valkeinen 	struct dsi_data *dsi;
4537aa52346STomi Valkeinen 	struct completion *completion;
4547aa52346STomi Valkeinen };
4557aa52346STomi Valkeinen 
4567aa52346STomi Valkeinen #endif /* __OMAP_DRM_DSS_DSI_H */
457