| /* SPDX-License-Identifier: GPL-2.0 */ | |
| /* | |
| * Copyright (C) 2020 Unisoc Inc. | |
| */ | |
| #ifndef __SPRD_DSI_H__ | |
| #define __SPRD_DSI_H__ | |
| #include <linux/of.h> | |
| #include <linux/device.h> | |
| #include <linux/regmap.h> | |
| #include <video/videomode.h> | |
| #include <drm/drm_bridge.h> | |
| #include <drm/drm_connector.h> | |
| #include <drm/drm_encoder.h> | |
| #include <drm/drm_mipi_dsi.h> | |
| #include <drm/drm_print.h> | |
| #include <drm/drm_panel.h> | |
| #define encoder_to_dsi(encoder) \ | |
| container_of(encoder, struct sprd_dsi, encoder) | |
| enum dsi_work_mode { | |
| DSI_MODE_CMD = 0, | |
| DSI_MODE_VIDEO | |
| }; | |
| enum video_burst_mode { | |
| VIDEO_NON_BURST_WITH_SYNC_PULSES = 0, | |
| VIDEO_NON_BURST_WITH_SYNC_EVENTS, | |
| VIDEO_BURST_WITH_SYNC_PULSES | |
| }; | |
| enum dsi_color_coding { | |
| COLOR_CODE_16BIT_CONFIG1 = 0, | |
| COLOR_CODE_16BIT_CONFIG2, | |
| COLOR_CODE_16BIT_CONFIG3, | |
| COLOR_CODE_18BIT_CONFIG1, | |
| COLOR_CODE_18BIT_CONFIG2, | |
| COLOR_CODE_24BIT, | |
| COLOR_CODE_20BIT_YCC422_LOOSELY, | |
| COLOR_CODE_24BIT_YCC422, | |
| COLOR_CODE_16BIT_YCC422, | |
| COLOR_CODE_30BIT, | |
| COLOR_CODE_36BIT, | |
| COLOR_CODE_12BIT_YCC420, | |
| COLOR_CODE_COMPRESSTION, | |
| COLOR_CODE_MAX | |
| }; | |
| enum pll_timing { | |
| NONE, | |
| REQUEST_TIME, | |
| PREPARE_TIME, | |
| SETTLE_TIME, | |
| ZERO_TIME, | |
| TRAIL_TIME, | |
| EXIT_TIME, | |
| CLKPOST_TIME, | |
| TA_GET, | |
| TA_GO, | |
| TA_SURE, | |
| TA_WAIT, | |
| }; | |
| struct dphy_pll { | |
| u8 refin; /* Pre-divider control signal */ | |
| u8 cp_s; /* 00: SDM_EN=1, 10: SDM_EN=0 */ | |
| u8 fdk_s; /* PLL mode control: integer or fraction */ | |
| u8 sdm_en; | |
| u8 div; | |
| u8 int_n; /* integer N PLL */ | |
| u32 ref_clk; /* dphy reference clock, unit: MHz */ | |
| u32 freq; /* panel config, unit: KHz */ | |
| u32 fvco; | |
| u32 potential_fvco; | |
| u32 nint; /* sigma delta modulator NINT control */ | |
| u32 kint; /* sigma delta modulator KINT control */ | |
| u8 lpf_sel; /* low pass filter control */ | |
| u8 out_sel; /* post divider control */ | |
| u8 vco_band; /* vco range */ | |
| u8 det_delay; | |
| }; | |
| struct dsi_context { | |
| void __iomem *base; | |
| struct regmap *regmap; | |
| struct dphy_pll pll; | |
| struct videomode vm; | |
| bool enabled; | |
| u8 work_mode; | |
| u8 burst_mode; | |
| u32 int0_mask; | |
| u32 int1_mask; | |
| /* maximum time (ns) for data lanes from HS to LP */ | |
| u16 data_hs2lp; | |
| /* maximum time (ns) for data lanes from LP to HS */ | |
| u16 data_lp2hs; | |
| /* maximum time (ns) for clk lanes from HS to LP */ | |
| u16 clk_hs2lp; | |
| /* maximum time (ns) for clk lanes from LP to HS */ | |
| u16 clk_lp2hs; | |
| /* maximum time (ns) for BTA operation - REQUIRED */ | |
| u16 max_rd_time; | |
| /* enable receiving frame ack packets - for video mode */ | |
| bool frame_ack_en; | |
| /* enable receiving tear effect ack packets - for cmd mode */ | |
| bool te_ack_en; | |
| }; | |
| struct sprd_dsi { | |
| struct drm_device *drm; | |
| struct mipi_dsi_host host; | |
| struct mipi_dsi_device *slave; | |
| struct drm_encoder encoder; | |
| struct drm_bridge *panel_bridge; | |
| struct dsi_context ctx; | |
| }; | |
| int dphy_pll_config(struct dsi_context *ctx); | |
| void dphy_timing_config(struct dsi_context *ctx); | |
| #endif /* __SPRD_DSI_H__ */ |