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