162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci *
362306a36Sopenharmony_ci * Copyright © 2019-2020 Intel Corporation
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#ifndef __KMB_DSI_H__
762306a36Sopenharmony_ci#define __KMB_DSI_H__
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include <drm/drm_encoder.h>
1062306a36Sopenharmony_ci#include <drm/drm_mipi_dsi.h>
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci/* MIPI TX CFG */
1362306a36Sopenharmony_ci#define MIPI_TX_LANE_DATA_RATE_MBPS 891
1462306a36Sopenharmony_ci#define MIPI_TX_REF_CLK_KHZ         24000
1562306a36Sopenharmony_ci#define MIPI_TX_CFG_CLK_KHZ         24000
1662306a36Sopenharmony_ci#define MIPI_TX_BPP		    24
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci/* DPHY Tx test codes*/
1962306a36Sopenharmony_ci#define TEST_CODE_FSM_CONTROL				0x03
2062306a36Sopenharmony_ci#define TEST_CODE_MULTIPLE_PHY_CTRL			0x0C
2162306a36Sopenharmony_ci#define TEST_CODE_PLL_PROPORTIONAL_CHARGE_PUMP_CTRL	0x0E
2262306a36Sopenharmony_ci#define TEST_CODE_PLL_INTEGRAL_CHARGE_PUMP_CTRL		0x0F
2362306a36Sopenharmony_ci#define TEST_CODE_PLL_VCO_CTRL				0x12
2462306a36Sopenharmony_ci#define TEST_CODE_PLL_GMP_CTRL				0x13
2562306a36Sopenharmony_ci#define TEST_CODE_PLL_PHASE_ERR_CTRL			0x14
2662306a36Sopenharmony_ci#define TEST_CODE_PLL_LOCK_FILTER			0x15
2762306a36Sopenharmony_ci#define TEST_CODE_PLL_UNLOCK_FILTER			0x16
2862306a36Sopenharmony_ci#define TEST_CODE_PLL_INPUT_DIVIDER			0x17
2962306a36Sopenharmony_ci#define TEST_CODE_PLL_FEEDBACK_DIVIDER			0x18
3062306a36Sopenharmony_ci#define   PLL_FEEDBACK_DIVIDER_HIGH			BIT(7)
3162306a36Sopenharmony_ci#define TEST_CODE_PLL_OUTPUT_CLK_SEL			0x19
3262306a36Sopenharmony_ci#define   PLL_N_OVR_EN					BIT(4)
3362306a36Sopenharmony_ci#define   PLL_M_OVR_EN					BIT(5)
3462306a36Sopenharmony_ci#define TEST_CODE_VOD_LEVEL				0x24
3562306a36Sopenharmony_ci#define TEST_CODE_PLL_CHARGE_PUMP_BIAS			0x1C
3662306a36Sopenharmony_ci#define TEST_CODE_PLL_LOCK_DETECTOR			0x1D
3762306a36Sopenharmony_ci#define TEST_CODE_HS_FREQ_RANGE_CFG			0x44
3862306a36Sopenharmony_ci#define TEST_CODE_PLL_ANALOG_PROG			0x1F
3962306a36Sopenharmony_ci#define TEST_CODE_SLEW_RATE_OVERRIDE_CTRL		0xA0
4062306a36Sopenharmony_ci#define TEST_CODE_SLEW_RATE_DDL_LOOP_CTRL		0xA3
4162306a36Sopenharmony_ci#define TEST_CODE_SLEW_RATE_DDL_CYCLES			0xA4
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci/* DPHY params */
4462306a36Sopenharmony_ci#define PLL_N_MIN	0
4562306a36Sopenharmony_ci#define PLL_N_MAX	15
4662306a36Sopenharmony_ci#define PLL_M_MIN	62
4762306a36Sopenharmony_ci#define PLL_M_MAX	623
4862306a36Sopenharmony_ci#define PLL_FVCO_MAX	1250
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci#define TIMEOUT		600
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci#define MIPI_TX_FRAME_GEN				4
5362306a36Sopenharmony_ci#define MIPI_TX_FRAME_GEN_SECTIONS			4
5462306a36Sopenharmony_ci#define MIPI_CTRL_VIRTUAL_CHANNELS			4
5562306a36Sopenharmony_ci#define MIPI_D_LANES_PER_DPHY				2
5662306a36Sopenharmony_ci#define MIPI_CTRL_2LANE_MAX_MC_FIFO_LOC			255
5762306a36Sopenharmony_ci#define MIPI_CTRL_4LANE_MAX_MC_FIFO_LOC			511
5862306a36Sopenharmony_ci/* 2 Data Lanes per D-PHY */
5962306a36Sopenharmony_ci#define MIPI_DPHY_D_LANES				2
6062306a36Sopenharmony_ci#define MIPI_DPHY_DEFAULT_BIT_RATES			63
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci#define KMB_MIPI_DEFAULT_CLK				24000000
6362306a36Sopenharmony_ci#define KMB_MIPI_DEFAULT_CFG_CLK			24000000
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ci#define to_kmb_dsi(x) container_of(x, struct kmb_dsi, base)
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_cistruct kmb_dsi {
6862306a36Sopenharmony_ci	struct drm_encoder base;
6962306a36Sopenharmony_ci	struct device *dev;
7062306a36Sopenharmony_ci	struct platform_device *pdev;
7162306a36Sopenharmony_ci	struct mipi_dsi_host *host;
7262306a36Sopenharmony_ci	struct mipi_dsi_device *device;
7362306a36Sopenharmony_ci	struct drm_bridge *adv_bridge;
7462306a36Sopenharmony_ci	void __iomem *mipi_mmio;
7562306a36Sopenharmony_ci	struct clk *clk_mipi;
7662306a36Sopenharmony_ci	struct clk *clk_mipi_ecfg;
7762306a36Sopenharmony_ci	struct clk *clk_mipi_cfg;
7862306a36Sopenharmony_ci	int sys_clk_mhz;
7962306a36Sopenharmony_ci};
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ci/* DPHY Tx test codes */
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_cienum mipi_ctrl_num {
8462306a36Sopenharmony_ci	MIPI_CTRL0 = 0,
8562306a36Sopenharmony_ci	MIPI_CTRL1,
8662306a36Sopenharmony_ci	MIPI_CTRL2,
8762306a36Sopenharmony_ci	MIPI_CTRL3,
8862306a36Sopenharmony_ci	MIPI_CTRL4,
8962306a36Sopenharmony_ci	MIPI_CTRL5,
9062306a36Sopenharmony_ci	MIPI_CTRL6,
9162306a36Sopenharmony_ci	MIPI_CTRL7,
9262306a36Sopenharmony_ci	MIPI_CTRL8,
9362306a36Sopenharmony_ci	MIPI_CTRL9,
9462306a36Sopenharmony_ci	MIPI_CTRL_NA
9562306a36Sopenharmony_ci};
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_cienum mipi_dphy_num {
9862306a36Sopenharmony_ci	MIPI_DPHY0 = 0,
9962306a36Sopenharmony_ci	MIPI_DPHY1,
10062306a36Sopenharmony_ci	MIPI_DPHY2,
10162306a36Sopenharmony_ci	MIPI_DPHY3,
10262306a36Sopenharmony_ci	MIPI_DPHY4,
10362306a36Sopenharmony_ci	MIPI_DPHY5,
10462306a36Sopenharmony_ci	MIPI_DPHY6,
10562306a36Sopenharmony_ci	MIPI_DPHY7,
10662306a36Sopenharmony_ci	MIPI_DPHY8,
10762306a36Sopenharmony_ci	MIPI_DPHY9,
10862306a36Sopenharmony_ci	MIPI_DPHY_NA
10962306a36Sopenharmony_ci};
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_cienum mipi_dir {
11262306a36Sopenharmony_ci	MIPI_RX,
11362306a36Sopenharmony_ci	MIPI_TX
11462306a36Sopenharmony_ci};
11562306a36Sopenharmony_ci
11662306a36Sopenharmony_cienum mipi_ctrl_type {
11762306a36Sopenharmony_ci	MIPI_DSI,
11862306a36Sopenharmony_ci	MIPI_CSI
11962306a36Sopenharmony_ci};
12062306a36Sopenharmony_ci
12162306a36Sopenharmony_cienum mipi_data_if {
12262306a36Sopenharmony_ci	MIPI_IF_DMA,
12362306a36Sopenharmony_ci	MIPI_IF_PARALLEL
12462306a36Sopenharmony_ci};
12562306a36Sopenharmony_ci
12662306a36Sopenharmony_cienum mipi_data_mode {
12762306a36Sopenharmony_ci	MIPI_DATA_MODE0,
12862306a36Sopenharmony_ci	MIPI_DATA_MODE1,
12962306a36Sopenharmony_ci	MIPI_DATA_MODE2,
13062306a36Sopenharmony_ci	MIPI_DATA_MODE3
13162306a36Sopenharmony_ci};
13262306a36Sopenharmony_ci
13362306a36Sopenharmony_cienum mipi_dsi_video_mode {
13462306a36Sopenharmony_ci	DSI_VIDEO_MODE_NO_BURST_PULSE,
13562306a36Sopenharmony_ci	DSI_VIDEO_MODE_NO_BURST_EVENT,
13662306a36Sopenharmony_ci	DSI_VIDEO_MODE_BURST
13762306a36Sopenharmony_ci};
13862306a36Sopenharmony_ci
13962306a36Sopenharmony_cienum mipi_dsi_blanking_mode {
14062306a36Sopenharmony_ci	TRANSITION_TO_LOW_POWER,
14162306a36Sopenharmony_ci	SEND_BLANK_PACKET
14262306a36Sopenharmony_ci};
14362306a36Sopenharmony_ci
14462306a36Sopenharmony_cienum mipi_dsi_eotp {
14562306a36Sopenharmony_ci	DSI_EOTP_DISABLED,
14662306a36Sopenharmony_ci	DSI_EOTP_ENABLES
14762306a36Sopenharmony_ci};
14862306a36Sopenharmony_ci
14962306a36Sopenharmony_cienum mipi_dsi_data_type {
15062306a36Sopenharmony_ci	DSI_SP_DT_RESERVED_00 = 0x00,
15162306a36Sopenharmony_ci	DSI_SP_DT_VSYNC_START = 0x01,
15262306a36Sopenharmony_ci	DSI_SP_DT_COLOR_MODE_OFF = 0x02,
15362306a36Sopenharmony_ci	DSI_SP_DT_GENERIC_SHORT_WR = 0x03,
15462306a36Sopenharmony_ci	DSI_SP_DT_GENERIC_RD = 0x04,
15562306a36Sopenharmony_ci	DSI_SP_DT_DCS_SHORT_WR = 0x05,
15662306a36Sopenharmony_ci	DSI_SP_DT_DCS_RD = 0x06,
15762306a36Sopenharmony_ci	DSI_SP_DT_EOTP = 0x08,
15862306a36Sopenharmony_ci	DSI_LP_DT_NULL = 0x09,
15962306a36Sopenharmony_ci	DSI_LP_DT_RESERVED_0A = 0x0a,
16062306a36Sopenharmony_ci	DSI_LP_DT_RESERVED_0B = 0x0b,
16162306a36Sopenharmony_ci	DSI_LP_DT_LPPS_YCBCR422_20B = 0x0c,
16262306a36Sopenharmony_ci	DSI_LP_DT_PPS_RGB101010_30B = 0x0d,
16362306a36Sopenharmony_ci	DSI_LP_DT_PPS_RGB565_16B = 0x0e,
16462306a36Sopenharmony_ci	DSI_LP_DT_RESERVED_0F = 0x0f,
16562306a36Sopenharmony_ci
16662306a36Sopenharmony_ci	DSI_SP_DT_RESERVED_10 = 0x10,
16762306a36Sopenharmony_ci	DSI_SP_DT_VSYNC_END = 0x11,
16862306a36Sopenharmony_ci	DSI_SP_DT_COLOR_MODE_ON = 0x12,
16962306a36Sopenharmony_ci	DSI_SP_DT_GENERIC_SHORT_WR_1PAR = 0x13,
17062306a36Sopenharmony_ci	DSI_SP_DT_GENERIC_RD_1PAR = 0x14,
17162306a36Sopenharmony_ci	DSI_SP_DT_DCS_SHORT_WR_1PAR = 0x15,
17262306a36Sopenharmony_ci	DSI_SP_DT_RESERVED_16 = 0x16,
17362306a36Sopenharmony_ci	DSI_SP_DT_RESERVED_17 = 0x17,
17462306a36Sopenharmony_ci	DSI_SP_DT_RESERVED_18 = 0x18,
17562306a36Sopenharmony_ci	DSI_LP_DT_BLANK = 0x19,
17662306a36Sopenharmony_ci	DSI_LP_DT_RESERVED_1A = 0x1a,
17762306a36Sopenharmony_ci	DSI_LP_DT_RESERVED_1B = 0x1b,
17862306a36Sopenharmony_ci	DSI_LP_DT_PPS_YCBCR422_24B = 0x1c,
17962306a36Sopenharmony_ci	DSI_LP_DT_PPS_RGB121212_36B = 0x1d,
18062306a36Sopenharmony_ci	DSI_LP_DT_PPS_RGB666_18B = 0x1e,
18162306a36Sopenharmony_ci	DSI_LP_DT_RESERVED_1F = 0x1f,
18262306a36Sopenharmony_ci
18362306a36Sopenharmony_ci	DSI_SP_DT_RESERVED_20 = 0x20,
18462306a36Sopenharmony_ci	DSI_SP_DT_HSYNC_START = 0x21,
18562306a36Sopenharmony_ci	DSI_SP_DT_SHUT_DOWN_PERIPH_CMD = 0x22,
18662306a36Sopenharmony_ci	DSI_SP_DT_GENERIC_SHORT_WR_2PAR = 0x23,
18762306a36Sopenharmony_ci	DSI_SP_DT_GENERIC_RD_2PAR = 0x24,
18862306a36Sopenharmony_ci	DSI_SP_DT_RESERVED_25 = 0x25,
18962306a36Sopenharmony_ci	DSI_SP_DT_RESERVED_26 = 0x26,
19062306a36Sopenharmony_ci	DSI_SP_DT_RESERVED_27 = 0x27,
19162306a36Sopenharmony_ci	DSI_SP_DT_RESERVED_28 = 0x28,
19262306a36Sopenharmony_ci	DSI_LP_DT_GENERIC_LONG_WR = 0x29,
19362306a36Sopenharmony_ci	DSI_LP_DT_RESERVED_2A = 0x2a,
19462306a36Sopenharmony_ci	DSI_LP_DT_RESERVED_2B = 0x2b,
19562306a36Sopenharmony_ci	DSI_LP_DT_PPS_YCBCR422_16B = 0x2c,
19662306a36Sopenharmony_ci	DSI_LP_DT_RESERVED_2D = 0x2d,
19762306a36Sopenharmony_ci	DSI_LP_DT_LPPS_RGB666_18B = 0x2e,
19862306a36Sopenharmony_ci	DSI_LP_DT_RESERVED_2F = 0x2f,
19962306a36Sopenharmony_ci
20062306a36Sopenharmony_ci	DSI_SP_DT_RESERVED_30 = 0x30,
20162306a36Sopenharmony_ci	DSI_SP_DT_HSYNC_END = 0x31,
20262306a36Sopenharmony_ci	DSI_SP_DT_TURN_ON_PERIPH_CMD = 0x32,
20362306a36Sopenharmony_ci	DSI_SP_DT_RESERVED_33 = 0x33,
20462306a36Sopenharmony_ci	DSI_SP_DT_RESERVED_34 = 0x34,
20562306a36Sopenharmony_ci	DSI_SP_DT_RESERVED_35 = 0x35,
20662306a36Sopenharmony_ci	DSI_SP_DT_RESERVED_36 = 0x36,
20762306a36Sopenharmony_ci	DSI_SP_DT_SET_MAX_RETURN_PKT_SIZE = 0x37,
20862306a36Sopenharmony_ci	DSI_SP_DT_RESERVED_38 = 0x38,
20962306a36Sopenharmony_ci	DSI_LP_DT_DSC_LONG_WR = 0x39,
21062306a36Sopenharmony_ci	DSI_LP_DT_RESERVED_3A = 0x3a,
21162306a36Sopenharmony_ci	DSI_LP_DT_RESERVED_3B = 0x3b,
21262306a36Sopenharmony_ci	DSI_LP_DT_RESERVED_3C = 0x3c,
21362306a36Sopenharmony_ci	DSI_LP_DT_PPS_YCBCR420_12B = 0x3d,
21462306a36Sopenharmony_ci	DSI_LP_DT_PPS_RGB888_24B = 0x3e,
21562306a36Sopenharmony_ci	DSI_LP_DT_RESERVED_3F = 0x3f
21662306a36Sopenharmony_ci};
21762306a36Sopenharmony_ci
21862306a36Sopenharmony_cienum mipi_tx_hs_tp_sel {
21962306a36Sopenharmony_ci	MIPI_TX_HS_TP_WHOLE_FRAME_COLOR0 = 0,
22062306a36Sopenharmony_ci	MIPI_TX_HS_TP_WHOLE_FRAME_COLOR1,
22162306a36Sopenharmony_ci	MIPI_TX_HS_TP_V_STRIPES,
22262306a36Sopenharmony_ci	MIPI_TX_HS_TP_H_STRIPES,
22362306a36Sopenharmony_ci};
22462306a36Sopenharmony_ci
22562306a36Sopenharmony_cienum dphy_mode {
22662306a36Sopenharmony_ci	MIPI_DPHY_SLAVE = 0,
22762306a36Sopenharmony_ci	MIPI_DPHY_MASTER
22862306a36Sopenharmony_ci};
22962306a36Sopenharmony_ci
23062306a36Sopenharmony_cienum dphy_tx_fsm {
23162306a36Sopenharmony_ci	DPHY_TX_POWERDWN = 0,
23262306a36Sopenharmony_ci	DPHY_TX_BGPON,
23362306a36Sopenharmony_ci	DPHY_TX_TERMCAL,
23462306a36Sopenharmony_ci	DPHY_TX_TERMCALUP,
23562306a36Sopenharmony_ci	DPHY_TX_OFFSETCAL,
23662306a36Sopenharmony_ci	DPHY_TX_LOCK,
23762306a36Sopenharmony_ci	DPHY_TX_SRCAL,
23862306a36Sopenharmony_ci	DPHY_TX_IDLE,
23962306a36Sopenharmony_ci	DPHY_TX_ULP,
24062306a36Sopenharmony_ci	DPHY_TX_LANESTART,
24162306a36Sopenharmony_ci	DPHY_TX_CLKALIGN,
24262306a36Sopenharmony_ci	DPHY_TX_DDLTUNNING,
24362306a36Sopenharmony_ci	DPHY_TX_ULP_FORCE_PLL,
24462306a36Sopenharmony_ci	DPHY_TX_LOCK_LOSS
24562306a36Sopenharmony_ci};
24662306a36Sopenharmony_ci
24762306a36Sopenharmony_cistruct mipi_data_type_params {
24862306a36Sopenharmony_ci	u8 size_constraint_pixels;
24962306a36Sopenharmony_ci	u8 size_constraint_bytes;
25062306a36Sopenharmony_ci	u8 pixels_per_pclk;
25162306a36Sopenharmony_ci	u8 bits_per_pclk;
25262306a36Sopenharmony_ci};
25362306a36Sopenharmony_ci
25462306a36Sopenharmony_cistruct mipi_tx_dsi_cfg {
25562306a36Sopenharmony_ci	u8 hfp_blank_en;	/* Horizontal front porch blanking enable */
25662306a36Sopenharmony_ci	u8 eotp_en;		/* End of transmission packet enable */
25762306a36Sopenharmony_ci	/* Last vertical front porch blanking mode */
25862306a36Sopenharmony_ci	u8 lpm_last_vfp_line;
25962306a36Sopenharmony_ci	/* First vertical sync active blanking mode */
26062306a36Sopenharmony_ci	u8 lpm_first_vsa_line;
26162306a36Sopenharmony_ci	u8 sync_pulse_eventn;	/* Sync type */
26262306a36Sopenharmony_ci	u8 hfp_blanking;	/* Horizontal front porch blanking mode */
26362306a36Sopenharmony_ci	u8 hbp_blanking;	/* Horizontal back porch blanking mode */
26462306a36Sopenharmony_ci	u8 hsa_blanking;	/* Horizontal sync active blanking mode */
26562306a36Sopenharmony_ci	u8 v_blanking;		/* Vertical timing blanking mode */
26662306a36Sopenharmony_ci};
26762306a36Sopenharmony_ci
26862306a36Sopenharmony_cistruct mipi_tx_frame_section_cfg {
26962306a36Sopenharmony_ci	u32 dma_v_stride;
27062306a36Sopenharmony_ci	u16 dma_v_scale_cfg;
27162306a36Sopenharmony_ci	u16 width_pixels;
27262306a36Sopenharmony_ci	u16 height_lines;
27362306a36Sopenharmony_ci	u8 dma_packed;
27462306a36Sopenharmony_ci	u8 bpp;
27562306a36Sopenharmony_ci	u8 bpp_unpacked;
27662306a36Sopenharmony_ci	u8 dma_h_stride;
27762306a36Sopenharmony_ci	u8 data_type;
27862306a36Sopenharmony_ci	u8 data_mode;
27962306a36Sopenharmony_ci	u8 dma_flip_rotate_sel;
28062306a36Sopenharmony_ci};
28162306a36Sopenharmony_ci
28262306a36Sopenharmony_cistruct mipi_tx_frame_timing_cfg {
28362306a36Sopenharmony_ci	u32 bpp;
28462306a36Sopenharmony_ci	u32 lane_rate_mbps;
28562306a36Sopenharmony_ci	u32 hsync_width;
28662306a36Sopenharmony_ci	u32 h_backporch;
28762306a36Sopenharmony_ci	u32 h_frontporch;
28862306a36Sopenharmony_ci	u32 h_active;
28962306a36Sopenharmony_ci	u16 vsync_width;
29062306a36Sopenharmony_ci	u16 v_backporch;
29162306a36Sopenharmony_ci	u16 v_frontporch;
29262306a36Sopenharmony_ci	u16 v_active;
29362306a36Sopenharmony_ci	u8 active_lanes;
29462306a36Sopenharmony_ci};
29562306a36Sopenharmony_ci
29662306a36Sopenharmony_cistruct mipi_tx_frame_sect_phcfg {
29762306a36Sopenharmony_ci	u32 wc;
29862306a36Sopenharmony_ci	enum mipi_data_mode data_mode;
29962306a36Sopenharmony_ci	enum mipi_dsi_data_type data_type;
30062306a36Sopenharmony_ci	u8 vchannel;
30162306a36Sopenharmony_ci	u8 dma_packed;
30262306a36Sopenharmony_ci};
30362306a36Sopenharmony_ci
30462306a36Sopenharmony_cistruct mipi_tx_frame_cfg {
30562306a36Sopenharmony_ci	struct mipi_tx_frame_section_cfg *sections[MIPI_TX_FRAME_GEN_SECTIONS];
30662306a36Sopenharmony_ci	u32 hsync_width;	/* in pixels */
30762306a36Sopenharmony_ci	u32 h_backporch;	/* in pixels */
30862306a36Sopenharmony_ci	u32 h_frontporch;	/* in pixels */
30962306a36Sopenharmony_ci	u16 vsync_width;	/* in lines */
31062306a36Sopenharmony_ci	u16 v_backporch;	/* in lines */
31162306a36Sopenharmony_ci	u16 v_frontporch;	/* in lines */
31262306a36Sopenharmony_ci};
31362306a36Sopenharmony_ci
31462306a36Sopenharmony_cistruct mipi_tx_ctrl_cfg {
31562306a36Sopenharmony_ci	struct mipi_tx_frame_cfg *frames[MIPI_TX_FRAME_GEN];
31662306a36Sopenharmony_ci	const struct mipi_tx_dsi_cfg *tx_dsi_cfg;
31762306a36Sopenharmony_ci	u8 line_sync_pkt_en;
31862306a36Sopenharmony_ci	u8 line_counter_active;
31962306a36Sopenharmony_ci	u8 frame_counter_active;
32062306a36Sopenharmony_ci	u8 tx_hsclkkidle_cnt;
32162306a36Sopenharmony_ci	u8 tx_hsexit_cnt;
32262306a36Sopenharmony_ci	u8 tx_crc_en;
32362306a36Sopenharmony_ci	u8 tx_hact_wait_stop;
32462306a36Sopenharmony_ci	u8 tx_always_use_hact;
32562306a36Sopenharmony_ci	u8 tx_wait_trig;
32662306a36Sopenharmony_ci	u8 tx_wait_all_sect;
32762306a36Sopenharmony_ci};
32862306a36Sopenharmony_ci
32962306a36Sopenharmony_ci/* configuration structure for MIPI control */
33062306a36Sopenharmony_cistruct mipi_ctrl_cfg {
33162306a36Sopenharmony_ci	u8 active_lanes;	/* # active lanes per controller 2/4 */
33262306a36Sopenharmony_ci	u32 lane_rate_mbps;	/* MBPS */
33362306a36Sopenharmony_ci	u32 ref_clk_khz;
33462306a36Sopenharmony_ci	u32 cfg_clk_khz;
33562306a36Sopenharmony_ci	struct mipi_tx_ctrl_cfg tx_ctrl_cfg;
33662306a36Sopenharmony_ci};
33762306a36Sopenharmony_ci
33862306a36Sopenharmony_cistatic inline void kmb_write_mipi(struct kmb_dsi *kmb_dsi,
33962306a36Sopenharmony_ci				  unsigned int reg, u32 value)
34062306a36Sopenharmony_ci{
34162306a36Sopenharmony_ci	writel(value, (kmb_dsi->mipi_mmio + reg));
34262306a36Sopenharmony_ci}
34362306a36Sopenharmony_ci
34462306a36Sopenharmony_cistatic inline u32 kmb_read_mipi(struct kmb_dsi *kmb_dsi, unsigned int reg)
34562306a36Sopenharmony_ci{
34662306a36Sopenharmony_ci	return readl(kmb_dsi->mipi_mmio + reg);
34762306a36Sopenharmony_ci}
34862306a36Sopenharmony_ci
34962306a36Sopenharmony_cistatic inline void kmb_write_bits_mipi(struct kmb_dsi *kmb_dsi,
35062306a36Sopenharmony_ci				       unsigned int reg, u32 offset,
35162306a36Sopenharmony_ci				       u32 num_bits, u32 value)
35262306a36Sopenharmony_ci{
35362306a36Sopenharmony_ci	u32 reg_val = kmb_read_mipi(kmb_dsi, reg);
35462306a36Sopenharmony_ci	u32 mask = (1 << num_bits) - 1;
35562306a36Sopenharmony_ci
35662306a36Sopenharmony_ci	value &= mask;
35762306a36Sopenharmony_ci	mask <<= offset;
35862306a36Sopenharmony_ci	reg_val &= (~mask);
35962306a36Sopenharmony_ci	reg_val |= (value << offset);
36062306a36Sopenharmony_ci	kmb_write_mipi(kmb_dsi, reg, reg_val);
36162306a36Sopenharmony_ci}
36262306a36Sopenharmony_ci
36362306a36Sopenharmony_cistatic inline void kmb_set_bit_mipi(struct kmb_dsi *kmb_dsi,
36462306a36Sopenharmony_ci				    unsigned int reg, u32 offset)
36562306a36Sopenharmony_ci{
36662306a36Sopenharmony_ci	u32 reg_val = kmb_read_mipi(kmb_dsi, reg);
36762306a36Sopenharmony_ci
36862306a36Sopenharmony_ci	kmb_write_mipi(kmb_dsi, reg, reg_val | (1 << offset));
36962306a36Sopenharmony_ci}
37062306a36Sopenharmony_ci
37162306a36Sopenharmony_cistatic inline void kmb_clr_bit_mipi(struct kmb_dsi *kmb_dsi,
37262306a36Sopenharmony_ci				    unsigned int reg, u32 offset)
37362306a36Sopenharmony_ci{
37462306a36Sopenharmony_ci	u32 reg_val = kmb_read_mipi(kmb_dsi, reg);
37562306a36Sopenharmony_ci
37662306a36Sopenharmony_ci	kmb_write_mipi(kmb_dsi, reg, reg_val & (~(1 << offset)));
37762306a36Sopenharmony_ci}
37862306a36Sopenharmony_ci
37962306a36Sopenharmony_ciint kmb_dsi_host_bridge_init(struct device *dev);
38062306a36Sopenharmony_cistruct kmb_dsi *kmb_dsi_init(struct platform_device *pdev);
38162306a36Sopenharmony_civoid kmb_dsi_host_unregister(struct kmb_dsi *kmb_dsi);
38262306a36Sopenharmony_ciint kmb_dsi_mode_set(struct kmb_dsi *kmb_dsi, struct drm_display_mode *mode,
38362306a36Sopenharmony_ci		     int sys_clk_mhz, struct drm_atomic_state *old_state);
38462306a36Sopenharmony_ciint kmb_dsi_map_mmio(struct kmb_dsi *kmb_dsi);
38562306a36Sopenharmony_ciint kmb_dsi_clk_init(struct kmb_dsi *kmb_dsi);
38662306a36Sopenharmony_ciint kmb_dsi_encoder_init(struct drm_device *dev, struct kmb_dsi *kmb_dsi);
38762306a36Sopenharmony_ci#endif /* __KMB_DSI_H__ */
388