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