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