xref: /openbmc/linux/drivers/gpu/drm/kmb/kmb_dsi.h (revision 74056092)
198521f4dSAnitha Chrisanthus /* SPDX-License-Identifier: GPL-2.0-only
298521f4dSAnitha Chrisanthus  *
398521f4dSAnitha Chrisanthus  * Copyright © 2019-2020 Intel Corporation
498521f4dSAnitha Chrisanthus  */
598521f4dSAnitha Chrisanthus 
698521f4dSAnitha Chrisanthus #ifndef __KMB_DSI_H__
798521f4dSAnitha Chrisanthus #define __KMB_DSI_H__
898521f4dSAnitha Chrisanthus 
998521f4dSAnitha Chrisanthus #include <drm/drm_encoder.h>
1098521f4dSAnitha Chrisanthus #include <drm/drm_mipi_dsi.h>
1198521f4dSAnitha Chrisanthus 
1298521f4dSAnitha Chrisanthus /* MIPI TX CFG */
1398521f4dSAnitha Chrisanthus #define MIPI_TX_LANE_DATA_RATE_MBPS 891
1498521f4dSAnitha Chrisanthus #define MIPI_TX_REF_CLK_KHZ         24000
1598521f4dSAnitha Chrisanthus #define MIPI_TX_CFG_CLK_KHZ         24000
1698521f4dSAnitha Chrisanthus #define MIPI_TX_BPP		    24
1798521f4dSAnitha Chrisanthus 
1898521f4dSAnitha Chrisanthus /* DPHY Tx test codes*/
1998521f4dSAnitha Chrisanthus #define TEST_CODE_FSM_CONTROL				0x03
2098521f4dSAnitha Chrisanthus #define TEST_CODE_MULTIPLE_PHY_CTRL			0x0C
2198521f4dSAnitha Chrisanthus #define TEST_CODE_PLL_PROPORTIONAL_CHARGE_PUMP_CTRL	0x0E
2298521f4dSAnitha Chrisanthus #define TEST_CODE_PLL_INTEGRAL_CHARGE_PUMP_CTRL		0x0F
2398521f4dSAnitha Chrisanthus #define TEST_CODE_PLL_VCO_CTRL				0x12
2498521f4dSAnitha Chrisanthus #define TEST_CODE_PLL_GMP_CTRL				0x13
2598521f4dSAnitha Chrisanthus #define TEST_CODE_PLL_PHASE_ERR_CTRL			0x14
2698521f4dSAnitha Chrisanthus #define TEST_CODE_PLL_LOCK_FILTER			0x15
2798521f4dSAnitha Chrisanthus #define TEST_CODE_PLL_UNLOCK_FILTER			0x16
2898521f4dSAnitha Chrisanthus #define TEST_CODE_PLL_INPUT_DIVIDER			0x17
2998521f4dSAnitha Chrisanthus #define TEST_CODE_PLL_FEEDBACK_DIVIDER			0x18
3098521f4dSAnitha Chrisanthus #define   PLL_FEEDBACK_DIVIDER_HIGH			BIT(7)
3198521f4dSAnitha Chrisanthus #define TEST_CODE_PLL_OUTPUT_CLK_SEL			0x19
3298521f4dSAnitha Chrisanthus #define   PLL_N_OVR_EN					BIT(4)
3398521f4dSAnitha Chrisanthus #define   PLL_M_OVR_EN					BIT(5)
3498521f4dSAnitha Chrisanthus #define TEST_CODE_VOD_LEVEL				0x24
3598521f4dSAnitha Chrisanthus #define TEST_CODE_PLL_CHARGE_PUMP_BIAS			0x1C
3698521f4dSAnitha Chrisanthus #define TEST_CODE_PLL_LOCK_DETECTOR			0x1D
3798521f4dSAnitha Chrisanthus #define TEST_CODE_HS_FREQ_RANGE_CFG			0x44
3898521f4dSAnitha Chrisanthus #define TEST_CODE_PLL_ANALOG_PROG			0x1F
3998521f4dSAnitha Chrisanthus #define TEST_CODE_SLEW_RATE_OVERRIDE_CTRL		0xA0
4098521f4dSAnitha Chrisanthus #define TEST_CODE_SLEW_RATE_DDL_LOOP_CTRL		0xA3
4198521f4dSAnitha Chrisanthus #define TEST_CODE_SLEW_RATE_DDL_CYCLES			0xA4
4298521f4dSAnitha Chrisanthus 
4398521f4dSAnitha Chrisanthus /* DPHY params */
4498521f4dSAnitha Chrisanthus #define PLL_N_MIN	0
4598521f4dSAnitha Chrisanthus #define PLL_N_MAX	15
4698521f4dSAnitha Chrisanthus #define PLL_M_MIN	62
4798521f4dSAnitha Chrisanthus #define PLL_M_MAX	623
4898521f4dSAnitha Chrisanthus #define PLL_FVCO_MAX	1250
4998521f4dSAnitha Chrisanthus 
5098521f4dSAnitha Chrisanthus #define TIMEOUT		600
5198521f4dSAnitha Chrisanthus 
5298521f4dSAnitha Chrisanthus #define MIPI_TX_FRAME_GEN				4
5398521f4dSAnitha Chrisanthus #define MIPI_TX_FRAME_GEN_SECTIONS			4
5498521f4dSAnitha Chrisanthus #define MIPI_CTRL_VIRTUAL_CHANNELS			4
5598521f4dSAnitha Chrisanthus #define MIPI_D_LANES_PER_DPHY				2
5698521f4dSAnitha Chrisanthus #define MIPI_CTRL_2LANE_MAX_MC_FIFO_LOC			255
5798521f4dSAnitha Chrisanthus #define MIPI_CTRL_4LANE_MAX_MC_FIFO_LOC			511
5898521f4dSAnitha Chrisanthus /* 2 Data Lanes per D-PHY */
5998521f4dSAnitha Chrisanthus #define MIPI_DPHY_D_LANES				2
6098521f4dSAnitha Chrisanthus #define MIPI_DPHY_DEFAULT_BIT_RATES			63
6198521f4dSAnitha Chrisanthus 
6298521f4dSAnitha Chrisanthus #define KMB_MIPI_DEFAULT_CLK				24000000
6398521f4dSAnitha Chrisanthus #define KMB_MIPI_DEFAULT_CFG_CLK			24000000
6498521f4dSAnitha Chrisanthus 
6598521f4dSAnitha Chrisanthus #define to_kmb_dsi(x) container_of(x, struct kmb_dsi, base)
6698521f4dSAnitha Chrisanthus 
6798521f4dSAnitha Chrisanthus struct kmb_dsi {
6898521f4dSAnitha Chrisanthus 	struct drm_encoder base;
6998521f4dSAnitha Chrisanthus 	struct device *dev;
7098521f4dSAnitha Chrisanthus 	struct platform_device *pdev;
7198521f4dSAnitha Chrisanthus 	struct mipi_dsi_host *host;
7298521f4dSAnitha Chrisanthus 	struct mipi_dsi_device *device;
7398521f4dSAnitha Chrisanthus 	struct drm_bridge *adv_bridge;
7498521f4dSAnitha Chrisanthus 	void __iomem *mipi_mmio;
7598521f4dSAnitha Chrisanthus 	struct clk *clk_mipi;
7698521f4dSAnitha Chrisanthus 	struct clk *clk_mipi_ecfg;
7798521f4dSAnitha Chrisanthus 	struct clk *clk_mipi_cfg;
7898521f4dSAnitha Chrisanthus 	int sys_clk_mhz;
7998521f4dSAnitha Chrisanthus };
8098521f4dSAnitha Chrisanthus 
8198521f4dSAnitha Chrisanthus /* DPHY Tx test codes */
8298521f4dSAnitha Chrisanthus 
8398521f4dSAnitha Chrisanthus enum mipi_ctrl_num {
8498521f4dSAnitha Chrisanthus 	MIPI_CTRL0 = 0,
8598521f4dSAnitha Chrisanthus 	MIPI_CTRL1,
8698521f4dSAnitha Chrisanthus 	MIPI_CTRL2,
8798521f4dSAnitha Chrisanthus 	MIPI_CTRL3,
8898521f4dSAnitha Chrisanthus 	MIPI_CTRL4,
8998521f4dSAnitha Chrisanthus 	MIPI_CTRL5,
9098521f4dSAnitha Chrisanthus 	MIPI_CTRL6,
9198521f4dSAnitha Chrisanthus 	MIPI_CTRL7,
9298521f4dSAnitha Chrisanthus 	MIPI_CTRL8,
9398521f4dSAnitha Chrisanthus 	MIPI_CTRL9,
9498521f4dSAnitha Chrisanthus 	MIPI_CTRL_NA
9598521f4dSAnitha Chrisanthus };
9698521f4dSAnitha Chrisanthus 
9798521f4dSAnitha Chrisanthus enum mipi_dphy_num {
9898521f4dSAnitha Chrisanthus 	MIPI_DPHY0 = 0,
9998521f4dSAnitha Chrisanthus 	MIPI_DPHY1,
10098521f4dSAnitha Chrisanthus 	MIPI_DPHY2,
10198521f4dSAnitha Chrisanthus 	MIPI_DPHY3,
10298521f4dSAnitha Chrisanthus 	MIPI_DPHY4,
10398521f4dSAnitha Chrisanthus 	MIPI_DPHY5,
10498521f4dSAnitha Chrisanthus 	MIPI_DPHY6,
10598521f4dSAnitha Chrisanthus 	MIPI_DPHY7,
10698521f4dSAnitha Chrisanthus 	MIPI_DPHY8,
10798521f4dSAnitha Chrisanthus 	MIPI_DPHY9,
10898521f4dSAnitha Chrisanthus 	MIPI_DPHY_NA
10998521f4dSAnitha Chrisanthus };
11098521f4dSAnitha Chrisanthus 
11198521f4dSAnitha Chrisanthus enum mipi_dir {
11298521f4dSAnitha Chrisanthus 	MIPI_RX,
11398521f4dSAnitha Chrisanthus 	MIPI_TX
11498521f4dSAnitha Chrisanthus };
11598521f4dSAnitha Chrisanthus 
11698521f4dSAnitha Chrisanthus enum mipi_ctrl_type {
11798521f4dSAnitha Chrisanthus 	MIPI_DSI,
11898521f4dSAnitha Chrisanthus 	MIPI_CSI
11998521f4dSAnitha Chrisanthus };
12098521f4dSAnitha Chrisanthus 
12198521f4dSAnitha Chrisanthus enum mipi_data_if {
12298521f4dSAnitha Chrisanthus 	MIPI_IF_DMA,
12398521f4dSAnitha Chrisanthus 	MIPI_IF_PARALLEL
12498521f4dSAnitha Chrisanthus };
12598521f4dSAnitha Chrisanthus 
12698521f4dSAnitha Chrisanthus enum mipi_data_mode {
12798521f4dSAnitha Chrisanthus 	MIPI_DATA_MODE0,
12898521f4dSAnitha Chrisanthus 	MIPI_DATA_MODE1,
12998521f4dSAnitha Chrisanthus 	MIPI_DATA_MODE2,
13098521f4dSAnitha Chrisanthus 	MIPI_DATA_MODE3
13198521f4dSAnitha Chrisanthus };
13298521f4dSAnitha Chrisanthus 
13398521f4dSAnitha Chrisanthus enum mipi_dsi_video_mode {
13498521f4dSAnitha Chrisanthus 	DSI_VIDEO_MODE_NO_BURST_PULSE,
13598521f4dSAnitha Chrisanthus 	DSI_VIDEO_MODE_NO_BURST_EVENT,
13698521f4dSAnitha Chrisanthus 	DSI_VIDEO_MODE_BURST
13798521f4dSAnitha Chrisanthus };
13898521f4dSAnitha Chrisanthus 
13998521f4dSAnitha Chrisanthus enum mipi_dsi_blanking_mode {
14098521f4dSAnitha Chrisanthus 	TRANSITION_TO_LOW_POWER,
14198521f4dSAnitha Chrisanthus 	SEND_BLANK_PACKET
14298521f4dSAnitha Chrisanthus };
14398521f4dSAnitha Chrisanthus 
14498521f4dSAnitha Chrisanthus enum mipi_dsi_eotp {
14598521f4dSAnitha Chrisanthus 	DSI_EOTP_DISABLED,
14698521f4dSAnitha Chrisanthus 	DSI_EOTP_ENABLES
14798521f4dSAnitha Chrisanthus };
14898521f4dSAnitha Chrisanthus 
14998521f4dSAnitha Chrisanthus enum mipi_dsi_data_type {
15098521f4dSAnitha Chrisanthus 	DSI_SP_DT_RESERVED_00 = 0x00,
15198521f4dSAnitha Chrisanthus 	DSI_SP_DT_VSYNC_START = 0x01,
15298521f4dSAnitha Chrisanthus 	DSI_SP_DT_COLOR_MODE_OFF = 0x02,
15398521f4dSAnitha Chrisanthus 	DSI_SP_DT_GENERIC_SHORT_WR = 0x03,
15498521f4dSAnitha Chrisanthus 	DSI_SP_DT_GENERIC_RD = 0x04,
15598521f4dSAnitha Chrisanthus 	DSI_SP_DT_DCS_SHORT_WR = 0x05,
15698521f4dSAnitha Chrisanthus 	DSI_SP_DT_DCS_RD = 0x06,
15798521f4dSAnitha Chrisanthus 	DSI_SP_DT_EOTP = 0x08,
15898521f4dSAnitha Chrisanthus 	DSI_LP_DT_NULL = 0x09,
15998521f4dSAnitha Chrisanthus 	DSI_LP_DT_RESERVED_0A = 0x0a,
16098521f4dSAnitha Chrisanthus 	DSI_LP_DT_RESERVED_0B = 0x0b,
16198521f4dSAnitha Chrisanthus 	DSI_LP_DT_LPPS_YCBCR422_20B = 0x0c,
16298521f4dSAnitha Chrisanthus 	DSI_LP_DT_PPS_RGB101010_30B = 0x0d,
16398521f4dSAnitha Chrisanthus 	DSI_LP_DT_PPS_RGB565_16B = 0x0e,
16498521f4dSAnitha Chrisanthus 	DSI_LP_DT_RESERVED_0F = 0x0f,
16598521f4dSAnitha Chrisanthus 
16698521f4dSAnitha Chrisanthus 	DSI_SP_DT_RESERVED_10 = 0x10,
16798521f4dSAnitha Chrisanthus 	DSI_SP_DT_VSYNC_END = 0x11,
16898521f4dSAnitha Chrisanthus 	DSI_SP_DT_COLOR_MODE_ON = 0x12,
16998521f4dSAnitha Chrisanthus 	DSI_SP_DT_GENERIC_SHORT_WR_1PAR = 0x13,
17098521f4dSAnitha Chrisanthus 	DSI_SP_DT_GENERIC_RD_1PAR = 0x14,
17198521f4dSAnitha Chrisanthus 	DSI_SP_DT_DCS_SHORT_WR_1PAR = 0x15,
17298521f4dSAnitha Chrisanthus 	DSI_SP_DT_RESERVED_16 = 0x16,
17398521f4dSAnitha Chrisanthus 	DSI_SP_DT_RESERVED_17 = 0x17,
17498521f4dSAnitha Chrisanthus 	DSI_SP_DT_RESERVED_18 = 0x18,
17598521f4dSAnitha Chrisanthus 	DSI_LP_DT_BLANK = 0x19,
17698521f4dSAnitha Chrisanthus 	DSI_LP_DT_RESERVED_1A = 0x1a,
17798521f4dSAnitha Chrisanthus 	DSI_LP_DT_RESERVED_1B = 0x1b,
17898521f4dSAnitha Chrisanthus 	DSI_LP_DT_PPS_YCBCR422_24B = 0x1c,
17998521f4dSAnitha Chrisanthus 	DSI_LP_DT_PPS_RGB121212_36B = 0x1d,
18098521f4dSAnitha Chrisanthus 	DSI_LP_DT_PPS_RGB666_18B = 0x1e,
18198521f4dSAnitha Chrisanthus 	DSI_LP_DT_RESERVED_1F = 0x1f,
18298521f4dSAnitha Chrisanthus 
18398521f4dSAnitha Chrisanthus 	DSI_SP_DT_RESERVED_20 = 0x20,
18498521f4dSAnitha Chrisanthus 	DSI_SP_DT_HSYNC_START = 0x21,
18598521f4dSAnitha Chrisanthus 	DSI_SP_DT_SHUT_DOWN_PERIPH_CMD = 0x22,
18698521f4dSAnitha Chrisanthus 	DSI_SP_DT_GENERIC_SHORT_WR_2PAR = 0x23,
18798521f4dSAnitha Chrisanthus 	DSI_SP_DT_GENERIC_RD_2PAR = 0x24,
18898521f4dSAnitha Chrisanthus 	DSI_SP_DT_RESERVED_25 = 0x25,
18998521f4dSAnitha Chrisanthus 	DSI_SP_DT_RESERVED_26 = 0x26,
19098521f4dSAnitha Chrisanthus 	DSI_SP_DT_RESERVED_27 = 0x27,
19198521f4dSAnitha Chrisanthus 	DSI_SP_DT_RESERVED_28 = 0x28,
19298521f4dSAnitha Chrisanthus 	DSI_LP_DT_GENERIC_LONG_WR = 0x29,
19398521f4dSAnitha Chrisanthus 	DSI_LP_DT_RESERVED_2A = 0x2a,
19498521f4dSAnitha Chrisanthus 	DSI_LP_DT_RESERVED_2B = 0x2b,
19598521f4dSAnitha Chrisanthus 	DSI_LP_DT_PPS_YCBCR422_16B = 0x2c,
19698521f4dSAnitha Chrisanthus 	DSI_LP_DT_RESERVED_2D = 0x2d,
19798521f4dSAnitha Chrisanthus 	DSI_LP_DT_LPPS_RGB666_18B = 0x2e,
19898521f4dSAnitha Chrisanthus 	DSI_LP_DT_RESERVED_2F = 0x2f,
19998521f4dSAnitha Chrisanthus 
20098521f4dSAnitha Chrisanthus 	DSI_SP_DT_RESERVED_30 = 0x30,
20198521f4dSAnitha Chrisanthus 	DSI_SP_DT_HSYNC_END = 0x31,
20298521f4dSAnitha Chrisanthus 	DSI_SP_DT_TURN_ON_PERIPH_CMD = 0x32,
20398521f4dSAnitha Chrisanthus 	DSI_SP_DT_RESERVED_33 = 0x33,
20498521f4dSAnitha Chrisanthus 	DSI_SP_DT_RESERVED_34 = 0x34,
20598521f4dSAnitha Chrisanthus 	DSI_SP_DT_RESERVED_35 = 0x35,
20698521f4dSAnitha Chrisanthus 	DSI_SP_DT_RESERVED_36 = 0x36,
20798521f4dSAnitha Chrisanthus 	DSI_SP_DT_SET_MAX_RETURN_PKT_SIZE = 0x37,
20898521f4dSAnitha Chrisanthus 	DSI_SP_DT_RESERVED_38 = 0x38,
20998521f4dSAnitha Chrisanthus 	DSI_LP_DT_DSC_LONG_WR = 0x39,
21098521f4dSAnitha Chrisanthus 	DSI_LP_DT_RESERVED_3A = 0x3a,
21198521f4dSAnitha Chrisanthus 	DSI_LP_DT_RESERVED_3B = 0x3b,
21298521f4dSAnitha Chrisanthus 	DSI_LP_DT_RESERVED_3C = 0x3c,
21398521f4dSAnitha Chrisanthus 	DSI_LP_DT_PPS_YCBCR420_12B = 0x3d,
21498521f4dSAnitha Chrisanthus 	DSI_LP_DT_PPS_RGB888_24B = 0x3e,
21598521f4dSAnitha Chrisanthus 	DSI_LP_DT_RESERVED_3F = 0x3f
21698521f4dSAnitha Chrisanthus };
21798521f4dSAnitha Chrisanthus 
21898521f4dSAnitha Chrisanthus enum mipi_tx_hs_tp_sel {
21998521f4dSAnitha Chrisanthus 	MIPI_TX_HS_TP_WHOLE_FRAME_COLOR0 = 0,
22098521f4dSAnitha Chrisanthus 	MIPI_TX_HS_TP_WHOLE_FRAME_COLOR1,
22198521f4dSAnitha Chrisanthus 	MIPI_TX_HS_TP_V_STRIPES,
22298521f4dSAnitha Chrisanthus 	MIPI_TX_HS_TP_H_STRIPES,
22398521f4dSAnitha Chrisanthus };
22498521f4dSAnitha Chrisanthus 
22598521f4dSAnitha Chrisanthus enum dphy_mode {
22698521f4dSAnitha Chrisanthus 	MIPI_DPHY_SLAVE = 0,
22798521f4dSAnitha Chrisanthus 	MIPI_DPHY_MASTER
22898521f4dSAnitha Chrisanthus };
22998521f4dSAnitha Chrisanthus 
23098521f4dSAnitha Chrisanthus enum dphy_tx_fsm {
23198521f4dSAnitha Chrisanthus 	DPHY_TX_POWERDWN = 0,
23298521f4dSAnitha Chrisanthus 	DPHY_TX_BGPON,
23398521f4dSAnitha Chrisanthus 	DPHY_TX_TERMCAL,
23498521f4dSAnitha Chrisanthus 	DPHY_TX_TERMCALUP,
23598521f4dSAnitha Chrisanthus 	DPHY_TX_OFFSETCAL,
23698521f4dSAnitha Chrisanthus 	DPHY_TX_LOCK,
23798521f4dSAnitha Chrisanthus 	DPHY_TX_SRCAL,
23898521f4dSAnitha Chrisanthus 	DPHY_TX_IDLE,
23998521f4dSAnitha Chrisanthus 	DPHY_TX_ULP,
24098521f4dSAnitha Chrisanthus 	DPHY_TX_LANESTART,
24198521f4dSAnitha Chrisanthus 	DPHY_TX_CLKALIGN,
24298521f4dSAnitha Chrisanthus 	DPHY_TX_DDLTUNNING,
24398521f4dSAnitha Chrisanthus 	DPHY_TX_ULP_FORCE_PLL,
24498521f4dSAnitha Chrisanthus 	DPHY_TX_LOCK_LOSS
24598521f4dSAnitha Chrisanthus };
24698521f4dSAnitha Chrisanthus 
24798521f4dSAnitha Chrisanthus struct mipi_data_type_params {
24898521f4dSAnitha Chrisanthus 	u8 size_constraint_pixels;
24998521f4dSAnitha Chrisanthus 	u8 size_constraint_bytes;
25098521f4dSAnitha Chrisanthus 	u8 pixels_per_pclk;
25198521f4dSAnitha Chrisanthus 	u8 bits_per_pclk;
25298521f4dSAnitha Chrisanthus };
25398521f4dSAnitha Chrisanthus 
25498521f4dSAnitha Chrisanthus struct mipi_tx_dsi_cfg {
25598521f4dSAnitha Chrisanthus 	u8 hfp_blank_en;	/* Horizontal front porch blanking enable */
25698521f4dSAnitha Chrisanthus 	u8 eotp_en;		/* End of transmission packet enable */
25798521f4dSAnitha Chrisanthus 	/* Last vertical front porch blanking mode */
25898521f4dSAnitha Chrisanthus 	u8 lpm_last_vfp_line;
25998521f4dSAnitha Chrisanthus 	/* First vertical sync active blanking mode */
26098521f4dSAnitha Chrisanthus 	u8 lpm_first_vsa_line;
26198521f4dSAnitha Chrisanthus 	u8 sync_pulse_eventn;	/* Sync type */
26298521f4dSAnitha Chrisanthus 	u8 hfp_blanking;	/* Horizontal front porch blanking mode */
26398521f4dSAnitha Chrisanthus 	u8 hbp_blanking;	/* Horizontal back porch blanking mode */
26498521f4dSAnitha Chrisanthus 	u8 hsa_blanking;	/* Horizontal sync active blanking mode */
26598521f4dSAnitha Chrisanthus 	u8 v_blanking;		/* Vertical timing blanking mode */
26698521f4dSAnitha Chrisanthus };
26798521f4dSAnitha Chrisanthus 
26898521f4dSAnitha Chrisanthus struct mipi_tx_frame_section_cfg {
26998521f4dSAnitha Chrisanthus 	u32 dma_v_stride;
27098521f4dSAnitha Chrisanthus 	u16 dma_v_scale_cfg;
27198521f4dSAnitha Chrisanthus 	u16 width_pixels;
27298521f4dSAnitha Chrisanthus 	u16 height_lines;
27398521f4dSAnitha Chrisanthus 	u8 dma_packed;
27498521f4dSAnitha Chrisanthus 	u8 bpp;
27598521f4dSAnitha Chrisanthus 	u8 bpp_unpacked;
27698521f4dSAnitha Chrisanthus 	u8 dma_h_stride;
27798521f4dSAnitha Chrisanthus 	u8 data_type;
27898521f4dSAnitha Chrisanthus 	u8 data_mode;
27998521f4dSAnitha Chrisanthus 	u8 dma_flip_rotate_sel;
28098521f4dSAnitha Chrisanthus };
28198521f4dSAnitha Chrisanthus 
28298521f4dSAnitha Chrisanthus struct mipi_tx_frame_timing_cfg {
28398521f4dSAnitha Chrisanthus 	u32 bpp;
28498521f4dSAnitha Chrisanthus 	u32 lane_rate_mbps;
28598521f4dSAnitha Chrisanthus 	u32 hsync_width;
28698521f4dSAnitha Chrisanthus 	u32 h_backporch;
28798521f4dSAnitha Chrisanthus 	u32 h_frontporch;
28898521f4dSAnitha Chrisanthus 	u32 h_active;
28998521f4dSAnitha Chrisanthus 	u16 vsync_width;
29098521f4dSAnitha Chrisanthus 	u16 v_backporch;
29198521f4dSAnitha Chrisanthus 	u16 v_frontporch;
29298521f4dSAnitha Chrisanthus 	u16 v_active;
29398521f4dSAnitha Chrisanthus 	u8 active_lanes;
29498521f4dSAnitha Chrisanthus };
29598521f4dSAnitha Chrisanthus 
29698521f4dSAnitha Chrisanthus struct mipi_tx_frame_sect_phcfg {
29798521f4dSAnitha Chrisanthus 	u32 wc;
29898521f4dSAnitha Chrisanthus 	enum mipi_data_mode data_mode;
29998521f4dSAnitha Chrisanthus 	enum mipi_dsi_data_type data_type;
30098521f4dSAnitha Chrisanthus 	u8 vchannel;
30198521f4dSAnitha Chrisanthus 	u8 dma_packed;
30298521f4dSAnitha Chrisanthus };
30398521f4dSAnitha Chrisanthus 
30498521f4dSAnitha Chrisanthus struct mipi_tx_frame_cfg {
30598521f4dSAnitha Chrisanthus 	struct mipi_tx_frame_section_cfg *sections[MIPI_TX_FRAME_GEN_SECTIONS];
30698521f4dSAnitha Chrisanthus 	u32 hsync_width;	/* in pixels */
30798521f4dSAnitha Chrisanthus 	u32 h_backporch;	/* in pixels */
30898521f4dSAnitha Chrisanthus 	u32 h_frontporch;	/* in pixels */
30998521f4dSAnitha Chrisanthus 	u16 vsync_width;	/* in lines */
31098521f4dSAnitha Chrisanthus 	u16 v_backporch;	/* in lines */
31198521f4dSAnitha Chrisanthus 	u16 v_frontporch;	/* in lines */
31298521f4dSAnitha Chrisanthus };
31398521f4dSAnitha Chrisanthus 
31498521f4dSAnitha Chrisanthus struct mipi_tx_ctrl_cfg {
31598521f4dSAnitha Chrisanthus 	struct mipi_tx_frame_cfg *frames[MIPI_TX_FRAME_GEN];
31698521f4dSAnitha Chrisanthus 	const struct mipi_tx_dsi_cfg *tx_dsi_cfg;
31798521f4dSAnitha Chrisanthus 	u8 line_sync_pkt_en;
31898521f4dSAnitha Chrisanthus 	u8 line_counter_active;
31998521f4dSAnitha Chrisanthus 	u8 frame_counter_active;
32098521f4dSAnitha Chrisanthus 	u8 tx_hsclkkidle_cnt;
32198521f4dSAnitha Chrisanthus 	u8 tx_hsexit_cnt;
32298521f4dSAnitha Chrisanthus 	u8 tx_crc_en;
32398521f4dSAnitha Chrisanthus 	u8 tx_hact_wait_stop;
32498521f4dSAnitha Chrisanthus 	u8 tx_always_use_hact;
32598521f4dSAnitha Chrisanthus 	u8 tx_wait_trig;
32698521f4dSAnitha Chrisanthus 	u8 tx_wait_all_sect;
32798521f4dSAnitha Chrisanthus };
32898521f4dSAnitha Chrisanthus 
32998521f4dSAnitha Chrisanthus /* configuration structure for MIPI control */
33098521f4dSAnitha Chrisanthus struct mipi_ctrl_cfg {
33198521f4dSAnitha Chrisanthus 	u8 active_lanes;	/* # active lanes per controller 2/4 */
33298521f4dSAnitha Chrisanthus 	u32 lane_rate_mbps;	/* MBPS */
33398521f4dSAnitha Chrisanthus 	u32 ref_clk_khz;
33498521f4dSAnitha Chrisanthus 	u32 cfg_clk_khz;
33598521f4dSAnitha Chrisanthus 	struct mipi_tx_ctrl_cfg tx_ctrl_cfg;
33698521f4dSAnitha Chrisanthus };
33798521f4dSAnitha Chrisanthus 
kmb_write_mipi(struct kmb_dsi * kmb_dsi,unsigned int reg,u32 value)33898521f4dSAnitha Chrisanthus static inline void kmb_write_mipi(struct kmb_dsi *kmb_dsi,
33998521f4dSAnitha Chrisanthus 				  unsigned int reg, u32 value)
34098521f4dSAnitha Chrisanthus {
34198521f4dSAnitha Chrisanthus 	writel(value, (kmb_dsi->mipi_mmio + reg));
34298521f4dSAnitha Chrisanthus }
34398521f4dSAnitha Chrisanthus 
kmb_read_mipi(struct kmb_dsi * kmb_dsi,unsigned int reg)34498521f4dSAnitha Chrisanthus static inline u32 kmb_read_mipi(struct kmb_dsi *kmb_dsi, unsigned int reg)
34598521f4dSAnitha Chrisanthus {
34698521f4dSAnitha Chrisanthus 	return readl(kmb_dsi->mipi_mmio + reg);
34798521f4dSAnitha Chrisanthus }
34898521f4dSAnitha Chrisanthus 
kmb_write_bits_mipi(struct kmb_dsi * kmb_dsi,unsigned int reg,u32 offset,u32 num_bits,u32 value)34998521f4dSAnitha Chrisanthus static inline void kmb_write_bits_mipi(struct kmb_dsi *kmb_dsi,
35098521f4dSAnitha Chrisanthus 				       unsigned int reg, u32 offset,
35198521f4dSAnitha Chrisanthus 				       u32 num_bits, u32 value)
35298521f4dSAnitha Chrisanthus {
35398521f4dSAnitha Chrisanthus 	u32 reg_val = kmb_read_mipi(kmb_dsi, reg);
35498521f4dSAnitha Chrisanthus 	u32 mask = (1 << num_bits) - 1;
35598521f4dSAnitha Chrisanthus 
35698521f4dSAnitha Chrisanthus 	value &= mask;
35798521f4dSAnitha Chrisanthus 	mask <<= offset;
35898521f4dSAnitha Chrisanthus 	reg_val &= (~mask);
35998521f4dSAnitha Chrisanthus 	reg_val |= (value << offset);
36098521f4dSAnitha Chrisanthus 	kmb_write_mipi(kmb_dsi, reg, reg_val);
36198521f4dSAnitha Chrisanthus }
36298521f4dSAnitha Chrisanthus 
kmb_set_bit_mipi(struct kmb_dsi * kmb_dsi,unsigned int reg,u32 offset)36398521f4dSAnitha Chrisanthus static inline void kmb_set_bit_mipi(struct kmb_dsi *kmb_dsi,
36498521f4dSAnitha Chrisanthus 				    unsigned int reg, u32 offset)
36598521f4dSAnitha Chrisanthus {
36698521f4dSAnitha Chrisanthus 	u32 reg_val = kmb_read_mipi(kmb_dsi, reg);
36798521f4dSAnitha Chrisanthus 
36898521f4dSAnitha Chrisanthus 	kmb_write_mipi(kmb_dsi, reg, reg_val | (1 << offset));
36998521f4dSAnitha Chrisanthus }
37098521f4dSAnitha Chrisanthus 
kmb_clr_bit_mipi(struct kmb_dsi * kmb_dsi,unsigned int reg,u32 offset)37198521f4dSAnitha Chrisanthus static inline void kmb_clr_bit_mipi(struct kmb_dsi *kmb_dsi,
37298521f4dSAnitha Chrisanthus 				    unsigned int reg, u32 offset)
37398521f4dSAnitha Chrisanthus {
37498521f4dSAnitha Chrisanthus 	u32 reg_val = kmb_read_mipi(kmb_dsi, reg);
37598521f4dSAnitha Chrisanthus 
37698521f4dSAnitha Chrisanthus 	kmb_write_mipi(kmb_dsi, reg, reg_val & (~(1 << offset)));
37798521f4dSAnitha Chrisanthus }
37898521f4dSAnitha Chrisanthus 
37998521f4dSAnitha Chrisanthus int kmb_dsi_host_bridge_init(struct device *dev);
38098521f4dSAnitha Chrisanthus struct kmb_dsi *kmb_dsi_init(struct platform_device *pdev);
38198521f4dSAnitha Chrisanthus void kmb_dsi_host_unregister(struct kmb_dsi *kmb_dsi);
38298521f4dSAnitha Chrisanthus int kmb_dsi_mode_set(struct kmb_dsi *kmb_dsi, struct drm_display_mode *mode,
383*74056092SAnitha Chrisanthus 		     int sys_clk_mhz, struct drm_atomic_state *old_state);
38498521f4dSAnitha Chrisanthus int kmb_dsi_map_mmio(struct kmb_dsi *kmb_dsi);
38598521f4dSAnitha Chrisanthus int kmb_dsi_clk_init(struct kmb_dsi *kmb_dsi);
38698521f4dSAnitha Chrisanthus int kmb_dsi_encoder_init(struct drm_device *dev, struct kmb_dsi *kmb_dsi);
38798521f4dSAnitha Chrisanthus #endif /* __KMB_DSI_H__ */
388