162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) 2020 Unisoc Inc. 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#ifndef __SPRD_DSI_H__ 762306a36Sopenharmony_ci#define __SPRD_DSI_H__ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <linux/of.h> 1062306a36Sopenharmony_ci#include <linux/device.h> 1162306a36Sopenharmony_ci#include <linux/regmap.h> 1262306a36Sopenharmony_ci#include <video/videomode.h> 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci#include <drm/drm_bridge.h> 1562306a36Sopenharmony_ci#include <drm/drm_connector.h> 1662306a36Sopenharmony_ci#include <drm/drm_encoder.h> 1762306a36Sopenharmony_ci#include <drm/drm_mipi_dsi.h> 1862306a36Sopenharmony_ci#include <drm/drm_print.h> 1962306a36Sopenharmony_ci#include <drm/drm_panel.h> 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci#define encoder_to_dsi(encoder) \ 2262306a36Sopenharmony_ci container_of(encoder, struct sprd_dsi, encoder) 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_cienum dsi_work_mode { 2562306a36Sopenharmony_ci DSI_MODE_CMD = 0, 2662306a36Sopenharmony_ci DSI_MODE_VIDEO 2762306a36Sopenharmony_ci}; 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_cienum video_burst_mode { 3062306a36Sopenharmony_ci VIDEO_NON_BURST_WITH_SYNC_PULSES = 0, 3162306a36Sopenharmony_ci VIDEO_NON_BURST_WITH_SYNC_EVENTS, 3262306a36Sopenharmony_ci VIDEO_BURST_WITH_SYNC_PULSES 3362306a36Sopenharmony_ci}; 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_cienum dsi_color_coding { 3662306a36Sopenharmony_ci COLOR_CODE_16BIT_CONFIG1 = 0, 3762306a36Sopenharmony_ci COLOR_CODE_16BIT_CONFIG2, 3862306a36Sopenharmony_ci COLOR_CODE_16BIT_CONFIG3, 3962306a36Sopenharmony_ci COLOR_CODE_18BIT_CONFIG1, 4062306a36Sopenharmony_ci COLOR_CODE_18BIT_CONFIG2, 4162306a36Sopenharmony_ci COLOR_CODE_24BIT, 4262306a36Sopenharmony_ci COLOR_CODE_20BIT_YCC422_LOOSELY, 4362306a36Sopenharmony_ci COLOR_CODE_24BIT_YCC422, 4462306a36Sopenharmony_ci COLOR_CODE_16BIT_YCC422, 4562306a36Sopenharmony_ci COLOR_CODE_30BIT, 4662306a36Sopenharmony_ci COLOR_CODE_36BIT, 4762306a36Sopenharmony_ci COLOR_CODE_12BIT_YCC420, 4862306a36Sopenharmony_ci COLOR_CODE_COMPRESSTION, 4962306a36Sopenharmony_ci COLOR_CODE_MAX 5062306a36Sopenharmony_ci}; 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_cienum pll_timing { 5362306a36Sopenharmony_ci NONE, 5462306a36Sopenharmony_ci REQUEST_TIME, 5562306a36Sopenharmony_ci PREPARE_TIME, 5662306a36Sopenharmony_ci SETTLE_TIME, 5762306a36Sopenharmony_ci ZERO_TIME, 5862306a36Sopenharmony_ci TRAIL_TIME, 5962306a36Sopenharmony_ci EXIT_TIME, 6062306a36Sopenharmony_ci CLKPOST_TIME, 6162306a36Sopenharmony_ci TA_GET, 6262306a36Sopenharmony_ci TA_GO, 6362306a36Sopenharmony_ci TA_SURE, 6462306a36Sopenharmony_ci TA_WAIT, 6562306a36Sopenharmony_ci}; 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_cistruct dphy_pll { 6862306a36Sopenharmony_ci u8 refin; /* Pre-divider control signal */ 6962306a36Sopenharmony_ci u8 cp_s; /* 00: SDM_EN=1, 10: SDM_EN=0 */ 7062306a36Sopenharmony_ci u8 fdk_s; /* PLL mode control: integer or fraction */ 7162306a36Sopenharmony_ci u8 sdm_en; 7262306a36Sopenharmony_ci u8 div; 7362306a36Sopenharmony_ci u8 int_n; /* integer N PLL */ 7462306a36Sopenharmony_ci u32 ref_clk; /* dphy reference clock, unit: MHz */ 7562306a36Sopenharmony_ci u32 freq; /* panel config, unit: KHz */ 7662306a36Sopenharmony_ci u32 fvco; 7762306a36Sopenharmony_ci u32 potential_fvco; 7862306a36Sopenharmony_ci u32 nint; /* sigma delta modulator NINT control */ 7962306a36Sopenharmony_ci u32 kint; /* sigma delta modulator KINT control */ 8062306a36Sopenharmony_ci u8 lpf_sel; /* low pass filter control */ 8162306a36Sopenharmony_ci u8 out_sel; /* post divider control */ 8262306a36Sopenharmony_ci u8 vco_band; /* vco range */ 8362306a36Sopenharmony_ci u8 det_delay; 8462306a36Sopenharmony_ci}; 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_cistruct dsi_context { 8762306a36Sopenharmony_ci void __iomem *base; 8862306a36Sopenharmony_ci struct regmap *regmap; 8962306a36Sopenharmony_ci struct dphy_pll pll; 9062306a36Sopenharmony_ci struct videomode vm; 9162306a36Sopenharmony_ci bool enabled; 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ci u8 work_mode; 9462306a36Sopenharmony_ci u8 burst_mode; 9562306a36Sopenharmony_ci u32 int0_mask; 9662306a36Sopenharmony_ci u32 int1_mask; 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ci /* maximum time (ns) for data lanes from HS to LP */ 9962306a36Sopenharmony_ci u16 data_hs2lp; 10062306a36Sopenharmony_ci /* maximum time (ns) for data lanes from LP to HS */ 10162306a36Sopenharmony_ci u16 data_lp2hs; 10262306a36Sopenharmony_ci /* maximum time (ns) for clk lanes from HS to LP */ 10362306a36Sopenharmony_ci u16 clk_hs2lp; 10462306a36Sopenharmony_ci /* maximum time (ns) for clk lanes from LP to HS */ 10562306a36Sopenharmony_ci u16 clk_lp2hs; 10662306a36Sopenharmony_ci /* maximum time (ns) for BTA operation - REQUIRED */ 10762306a36Sopenharmony_ci u16 max_rd_time; 10862306a36Sopenharmony_ci /* enable receiving frame ack packets - for video mode */ 10962306a36Sopenharmony_ci bool frame_ack_en; 11062306a36Sopenharmony_ci /* enable receiving tear effect ack packets - for cmd mode */ 11162306a36Sopenharmony_ci bool te_ack_en; 11262306a36Sopenharmony_ci}; 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_cistruct sprd_dsi { 11562306a36Sopenharmony_ci struct drm_device *drm; 11662306a36Sopenharmony_ci struct mipi_dsi_host host; 11762306a36Sopenharmony_ci struct mipi_dsi_device *slave; 11862306a36Sopenharmony_ci struct drm_encoder encoder; 11962306a36Sopenharmony_ci struct drm_bridge *panel_bridge; 12062306a36Sopenharmony_ci struct dsi_context ctx; 12162306a36Sopenharmony_ci}; 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_ciint dphy_pll_config(struct dsi_context *ctx); 12462306a36Sopenharmony_civoid dphy_timing_config(struct dsi_context *ctx); 12562306a36Sopenharmony_ci 12662306a36Sopenharmony_ci#endif /* __SPRD_DSI_H__ */ 127