blob: 564a8bad274451e023d071c7eb29195ece4471d7 [file] [log] [blame]
Padmanabhan Komanduru40f0d3c2018-04-26 17:41:17 +05301/* Copyright (c) 2010-2015, 2018, The Linux Foundation. All rights reserved.
Chandan Uddaraju78ae6752010-10-19 12:57:10 -07002 *
3 * Redistribution and use in source and binary forms, with or without
4 * modification, are permitted provided that the following conditions are
5 * met:
6 * * Redistributions of source code must retain the above copyright
7 * notice, this list of conditions and the following disclaimer.
8 * * Redistributions in binary form must reproduce the above
9 * copyright notice, this list of conditions and the following
10 * disclaimer in the documentation and/or other materials provided
11 * with the distribution.
Siddhartha Agrawal3e694ea2013-01-23 17:01:31 -080012 * * Neither the name of The Linux Foundation nor the names of its
Chandan Uddaraju78ae6752010-10-19 12:57:10 -070013 * contributors may be used to endorse or promote products derived
14 * from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 *
28 */
29
30#ifndef _PLATFORM_MSM_SHARED_MIPI_DSI_H_
31#define _PLATFORM_MSM_SHARED_MIPI_DSI_H_
32
Shashank Mittal4bfb2e32012-04-16 10:56:27 -070033#include <msm_panel.h>
34
Chandan Uddaraju78ae6752010-10-19 12:57:10 -070035#define PASS 0
36#define FAIL 1
37
Aravind Venkateswarance4dd7f2014-12-04 16:54:26 -080038/*
39 * DSI register offsets defined here are only used for non-MDSS targets.
40 * For MDSS targets, all offset definitions are picked up from corresponding
41 * target files.
42 */
43#if (DISPLAY_TYPE_MDSS == 0)
Kinson Chikfe931032011-07-21 10:01:34 -070044#define DSI_CLKOUT_TIMING_CTRL REG_DSI(0x0C0)
45#define DSI_SOFT_RESET REG_DSI(0x114)
Kinson Chikfe931032011-07-21 10:01:34 -070046#define DSIPHY_SW_RESET REG_DSI(0x128)
47#define DSIPHY_PLL_RDY REG_DSI(0x280)
Kinson Chikfe931032011-07-21 10:01:34 -070048#define DSI_CLK_CTRL REG_DSI(0x118)
49#define DSI_TRIG_CTRL REG_DSI(0x080)
Kinson Chikfe931032011-07-21 10:01:34 -070050#define DSI_COMMAND_MODE_DMA_CTRL REG_DSI(0x038)
Kinson Chikfe931032011-07-21 10:01:34 -070051#define DSI_ERR_INT_MASK0 REG_DSI(0x108)
52#define DSI_INT_CTRL REG_DSI(0x10C)
Kinson Chikfe931032011-07-21 10:01:34 -070053#define DSI_CMD_MODE_DMA_SW_TRIGGER REG_DSI(0x08C)
Aravind Venkateswarance4dd7f2014-12-04 16:54:26 -080054#define DSI_DMA_CMD_OFFSET REG_DSI(0x044)
55#define DSI_DMA_CMD_LENGTH REG_DSI(0x048)
56#define DSI_CTRL REG_DSI(0x000)
Kinson Chikfe931032011-07-21 10:01:34 -070057#define DSI_CMD_MODE_MDP_SW_TRIGGER REG_DSI(0x090)
Aravind Venkateswarance4dd7f2014-12-04 16:54:26 -080058#endif
Amir Samuelov2d4ba162012-07-22 11:53:14 +030059
Siddhartha Agrawal007ea9e2014-10-14 15:02:48 -070060#define DSI_VIDEO_MODE_DONE_MASK BIT(17)
61#define DSI_VIDEO_MODE_DONE_AK BIT(16)
62#define DSI_VIDEO_MODE_DONE_STAT BIT(16)
63
Dhaval Patel33ff98f2014-04-15 14:44:31 -070064/**********************************************************
65 DSI register configuration options
66 **********************************************************/
Ajay Dudanib01e5062011-12-03 23:23:42 -080067#define MIPI_DSI_MRPS 0x04 /* Maximum Return Packet Size */
68#define MIPI_DSI_REG_LEN 16 /* 4 x 4 bytes register */
Shashank Mittalcbd271d2011-01-14 15:18:33 -080069
Padmanabhan Komandurudaebf6b2014-08-20 20:39:40 +053070#define TIMING_FLUSH 0x1E4
71#define TIMING_DB_MODE 0x1E8
72
Padmanabhan Komanduru2232c142014-10-29 00:06:24 +053073#define DSI_HW_REV_103 0x10030000 /* 8994 */
Padmanabhan Komanduru0a749892015-06-15 15:38:59 +053074#define DSI_HW_REV_103_1 0x10030001 /* 8936/8939/8952 */
75#define DSI_HW_REV_104_2 0x10040002 /* 8956 */
Dhaval Patel8b9a5822015-03-16 13:01:26 -070076#define DSI_HW_REV_104 0x10040000 /* thulium */
Vineet Bajaj2f08a362014-07-24 20:50:42 +053077
Ajay Dudanib01e5062011-12-03 23:23:42 -080078#define DTYPE_GEN_WRITE2 0x23 /* 4th Byte is 0x80 */
79#define DTYPE_GEN_LWRITE 0x29 /* 4th Byte is 0xc0 */
80#define DTYPE_DCS_WRITE1 0x15 /* 4th Byte is 0x80 */
Kinson Chike5c93432011-06-17 09:10:29 -070081
Shivaraj Shetty5cbb7462014-01-13 17:17:39 +053082#define RDBK_DATA0 0x06C
Casey Piper84036752013-09-05 14:56:37 -070083
Chandan Uddarajufe93e822010-11-21 20:44:47 -080084#define MIPI_VIDEO_MODE 1
85#define MIPI_CMD_MODE 2
86
Dhaval Patel33ff98f2014-04-15 14:44:31 -070087#define DSI_NON_BURST_SYNCH_PULSE 0
88#define DSI_NON_BURST_SYNCH_EVENT 1
89#define DSI_BURST_MODE 2
90
91#define DSI_RGB_SWAP_RGB 0
92#define DSI_RGB_SWAP_RBG 1
93#define DSI_RGB_SWAP_BGR 2
94#define DSI_RGB_SWAP_BRG 3
95#define DSI_RGB_SWAP_GRB 4
96#define DSI_RGB_SWAP_GBR 5
97
98#define DSI_VIDEO_DST_FORMAT_RGB565 0
99#define DSI_VIDEO_DST_FORMAT_RGB666 1
100#define DSI_VIDEO_DST_FORMAT_RGB666_LOOSE 2
101#define DSI_VIDEO_DST_FORMAT_RGB888 3
102
103#define DSI_CMD_DST_FORMAT_RGB111 0
104#define DSI_CMD_DST_FORMAT_RGB332 3
105#define DSI_CMD_DST_FORMAT_RGB444 4
106#define DSI_CMD_DST_FORMAT_RGB565 6
107#define DSI_CMD_DST_FORMAT_RGB666 7
108#define DSI_CMD_DST_FORMAT_RGB888 8
109
110#define DSI_CMD_TRIGGER_NONE 0x0 /* mdp trigger */
111#define DSI_CMD_TRIGGER_TE 0x02
112#define DSI_CMD_TRIGGER_SW 0x04
113#define DSI_CMD_TRIGGER_SW_SEOF 0x05 /* cmd dma only */
114#define DSI_CMD_TRIGGER_SW_TE 0x06
115
116#define DSI_DATALANE_SWAP_0123 0
117#define DSI_DATALANE_SWAP_3012 1
118#define DSI_DATALANE_SWAP_2301 2
119#define DSI_DATALANE_SWAP_1230 3
120#define DSI_DATALANE_SWAP_0321 4
121#define DSI_DATALANE_SWAP_1032 5
122#define DSI_DATALANE_SWAP_2103 6
123#define DSI_DATALANE_SWAP_3210 7
124
125#define MAX_REGULATOR_CONFIG 7
126#define MAX_BIST_CONFIG 6
Dhaval Patel8b9a5822015-03-16 13:01:26 -0700127#define MAX_TIMING_CONFIG 40
Dhaval Patel33ff98f2014-04-15 14:44:31 -0700128#define MAX_LANE_CONFIG 45
Dhaval Patel8b9a5822015-03-16 13:01:26 -0700129#define MAX_STRENGTH_CONFIG 10
Dhaval Patel33ff98f2014-04-15 14:44:31 -0700130#define MAX_CTRL_CONFIG 4
131
132/**********************************************************
133 DSI configuration structures
134 **********************************************************/
Chandan Uddarajufe93e822010-11-21 20:44:47 -0800135struct mipi_dsi_phy_ctrl {
Dhaval Patel33ff98f2014-04-15 14:44:31 -0700136 uint32_t regulator[5];
137 uint32_t timing[12];
138 uint32_t ctrl[4];
139 uint32_t strength[4];
140 uint32_t pll[21];
Chandan Uddarajufe93e822010-11-21 20:44:47 -0800141};
142
Mao Flynn5f137ed2014-04-18 14:59:47 +0800143enum dsi_reg_mode {
144 DSI_PHY_REGULATOR_DCDC_MODE,
145 DSI_PHY_REGULATOR_LDO_MODE,
146};
147
Dhaval Patel8b9a5822015-03-16 13:01:26 -0700148enum {
149 DSI_PLL_TYPE_28NM,
150 DSI_PLL_TYPE_20NM,
151 DSI_PLL_TYPE_THULIUM,
Padmanabhan Komanduru40f0d3c2018-04-26 17:41:17 +0530152 DSI_PLL_TYPE_12NM,
Dhaval Patel8b9a5822015-03-16 13:01:26 -0700153 DSI_PLL_TYPE_MAX,
154};
155
Siddhartha Agrawal3e694ea2013-01-23 17:01:31 -0800156struct mdss_dsi_phy_ctrl {
Dhaval Patel33ff98f2014-04-15 14:44:31 -0700157 uint32_t regulator[MAX_REGULATOR_CONFIG];
158 uint32_t timing[MAX_TIMING_CONFIG];
159 uint32_t ctrl[MAX_CTRL_CONFIG];
160 uint32_t strength[MAX_STRENGTH_CONFIG];
161 char bistCtrl[MAX_BIST_CONFIG];
162 char laneCfg[MAX_LANE_CONFIG];
Mao Flynn5f137ed2014-04-18 14:59:47 +0800163 enum dsi_reg_mode regulator_mode;
Dhaval Patel8b9a5822015-03-16 13:01:26 -0700164 int pll_type;
Siddhartha Agrawal3e694ea2013-01-23 17:01:31 -0800165};
166
Padmanabhan Komanduru1fc8bc42015-12-21 18:30:46 +0530167struct ssc_params {
168 uint32_t kdiv;
169 uint64_t triang_inc_7_0;
170 uint64_t triang_inc_9_8;
171 uint64_t triang_steps;
172 uint64_t dc_offset;
173 uint64_t freq_seed_7_0;
174 uint64_t freq_seed_15_8;
175};
176
177struct mdss_dsi_vco_calc {
178 uint64_t sdm_cfg0;
179 uint64_t sdm_cfg1;
180 uint64_t sdm_cfg2;
181 uint64_t sdm_cfg3;
182 uint64_t cal_cfg10;
183 uint64_t cal_cfg11;
184 uint64_t refclk_cfg;
185 uint64_t gen_vco_clk;
186 uint32_t lpfr_lut_res;
187 struct ssc_params ssc;
188};
189
Veera Sundaram Sankarandb0b2bf2014-12-16 18:09:27 -0800190struct mdss_dsi_pll_config {
Arpita Banerjee2522bc62013-05-24 16:03:53 -0700191 uint32_t pixel_clock;
192 uint32_t pixel_clock_mhz;
193 uint32_t byte_clock;
194 uint32_t bit_clock;
195 uint32_t halfbit_clock;
196 uint32_t vco_clock;
Padmanabhan Komanduru05975022014-04-17 16:47:34 +0530197 uint32_t vco_delay;
Chandan Uddaraju34dda2a2015-02-04 14:33:16 -0800198 uint32_t vco_min;
199 uint32_t vco_max;
200 uint32_t en_vco_zero_phase;
Arpita Banerjee2522bc62013-05-24 16:03:53 -0700201 uint8_t directpath;
202 uint8_t posdiv1;
203 uint8_t posdiv3;
204 uint8_t pclk_m;
205 uint8_t pclk_n;
206 uint8_t pclk_d;
Dhaval Pateld19fcf12014-08-12 13:16:05 -0700207
Padmanabhan Komanduru1fc8bc42015-12-21 18:30:46 +0530208 /* SSC related params */
209 bool ssc_en;
210 bool is_center_spread;
211 uint32_t ssc_freq;
212 uint32_t ssc_ppm;
213
Dhaval Pateld19fcf12014-08-12 13:16:05 -0700214 /* pll 20nm */
215 uint32_t dec_start;
216 uint32_t frac_start;
217 uint32_t lock_comp;
218 uint8_t hr_oclk2;
219 uint8_t hr_oclk3;
220 uint8_t lp_div_mux;
221 uint8_t ndiv;
Dhaval Patel8b9a5822015-03-16 13:01:26 -0700222
223 /* pll thulium */
224 uint32_t postdiv;
225 uint32_t n1div;
226 uint32_t n2div;
Padmanabhan Komanduru40f0d3c2018-04-26 17:41:17 +0530227
228 /* pll 12nm */
229 uint32_t p_div_mux;
230 uint32_t gp_div_mux;
231 uint32_t divhf;
Arpita Banerjee2522bc62013-05-24 16:03:53 -0700232};
233
Chandan Uddarajufe93e822010-11-21 20:44:47 -0800234struct mipi_dsi_cmd {
Aravind Venkateswarance4dd7f2014-12-04 16:54:26 -0800235 uint32_t size;
Veera Sundaram Sankarandb0b2bf2014-12-16 18:09:27 -0800236 char *payload;
Sangani Suryanarayana Raju769f9ac2013-04-30 19:05:06 +0530237 int wait;
Chandan Uddarajufe93e822010-11-21 20:44:47 -0800238};
239
Vineet Bajajc2272462015-05-07 17:35:03 +0530240struct mipi_dsi_i2c_cmd {
241 uint8_t i2c_addr;
242 uint8_t reg;
243 uint8_t val;
244 int sleep_in_ms;
245};
246
Chandan Uddarajufe93e822010-11-21 20:44:47 -0800247struct mipi_dsi_panel_config {
Ajay Dudanib01e5062011-12-03 23:23:42 -0800248 char mode;
249 char num_of_lanes;
Channagoud Kadabi539ef722012-03-29 16:02:50 +0530250 char lane_swap;
Siddhartha Agrawal3e694ea2013-01-23 17:01:31 -0800251 char pack;
Siddhartha Agrawalb6c861f2013-05-31 19:36:44 -0700252 uint8_t t_clk_pre;
253 uint8_t t_clk_post;
Ajay Dudanib01e5062011-12-03 23:23:42 -0800254 struct mipi_dsi_phy_ctrl *dsi_phy_config;
Siddhartha Agrawal3e694ea2013-01-23 17:01:31 -0800255 struct mdss_dsi_phy_ctrl *mdss_dsi_phy_config;
Padmanabhan Komandurub3d31842014-11-04 15:47:53 +0530256 struct mipi_dsi_cmd *panel_on_cmds;
257 int num_of_panel_on_cmds;
Casey Piper84036752013-09-05 14:56:37 -0700258 uint32_t signature;
Siddhartha Agrawal007ea9e2014-10-14 15:02:48 -0700259 char cmds_post_tg;
Chandan Uddarajufe93e822010-11-21 20:44:47 -0800260};
261
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700262enum { /* mipi dsi panel */
263 DSI_VIDEO_MODE,
264 DSI_CMD_MODE,
265};
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700266
Dhaval Patel33ff98f2014-04-15 14:44:31 -0700267/**********************************************************
268 APIs
269 **********************************************************/
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700270int mipi_config(struct msm_fb_panel_data *panel);
Siddhartha Agrawal3e694ea2013-01-23 17:01:31 -0800271int mdss_dsi_config(struct msm_fb_panel_data *panel);
Veera Sundaram Sankarandb0b2bf2014-12-16 18:09:27 -0800272void mdss_dsi_phy_sw_reset(uint32_t ctl_base);
Jeevan Shriram01379322015-01-07 17:41:26 -0800273int mdss_dsi_phy_init(struct mipi_panel_info *mipi);
Aravind Venkateswaranfec354c2014-12-04 18:10:14 -0800274void mdss_dsi_phy_contention_detection(struct mipi_panel_info *mipi,
Xiaoming Zhou03fd48b2014-07-31 15:24:41 -0400275 uint32_t phy_base);
Veera Sundaram Sankarandb0b2bf2014-12-16 18:09:27 -0800276int mipi_dsi_phy_init(struct mipi_dsi_panel_config *pinfo);
Siddhartha Agrawal3e694ea2013-01-23 17:01:31 -0800277
Kuogee Hsiehd58c8092015-07-07 10:31:34 -0700278int mdss_dsi_video_mode_config(struct msm_panel_info *pinfo,
279 uint16_t disp_width,
Siddhartha Agrawal6e760042013-05-30 21:10:18 -0700280 uint16_t disp_height,
281 uint16_t img_width,
282 uint16_t img_height,
283 uint16_t hsync_porch0_fp,
284 uint16_t hsync_porch0_bp,
285 uint16_t vsync_porch0_fp,
286 uint16_t vsync_porch0_bp,
287 uint16_t hsync_width,
288 uint16_t vsync_width,
289 uint16_t dst_format,
290 uint16_t traffic_mode,
291 uint8_t lane_en,
Padmanabhan Komandurue3209872015-01-12 16:33:16 +0530292 uint8_t pulse_mode_hsa_he,
293 uint32_t low_pwr_stop_mode,
Siddhartha Agrawal6e760042013-05-30 21:10:18 -0700294 uint8_t eof_bllp_pwr,
295 uint8_t interleav,
296 uint32_t ctl_base);
Kuogee Hsiehd58c8092015-07-07 10:31:34 -0700297int mdss_dsi_cmd_mode_config(struct msm_panel_info *pinfo,
298 uint16_t disp_width,
Veera Sundaram Sankarandb0b2bf2014-12-16 18:09:27 -0800299 uint16_t disp_height,
300 uint16_t img_width,
301 uint16_t img_height,
302 uint16_t dst_format,
303 uint8_t ystride,
304 uint8_t lane_en,
305 uint8_t interleav,
306 uint32_t ctl_base);
Siddhartha Agrawal6e760042013-05-30 21:10:18 -0700307
Aravind Venkateswaranfec354c2014-12-04 18:10:14 -0800308int mipi_dsi_on(struct msm_panel_info *pinfo);
Veera Sundaram Sankarandb0b2bf2014-12-16 18:09:27 -0800309int mipi_cmd_trigger();
Siddhartha Agrawal24d81b52013-07-01 11:13:32 -0700310int mipi_dsi_off(struct msm_panel_info *pinfo);
Aravind Venkateswaranfec354c2014-12-04 18:10:14 -0800311int mdss_dsi_cmds_tx(struct mipi_panel_info *mipi,
312 struct mipi_dsi_cmd *cmds, int count, char dual_dsi);
313int mdss_dsi_cmds_rx(struct mipi_panel_info *mipi, uint32_t **rp, int rp_len,
314 int rdbk_len);
Veera Sundaram Sankarandb0b2bf2014-12-16 18:09:27 -0800315int32_t mdss_dsi_auto_pll_config(uint32_t pll_base, uint32_t ctl_base,
316 struct mdss_dsi_pll_config *pd);
Aravind Venkateswaranf2702352015-07-23 18:14:13 -0700317void mdss_dsi_auto_pll_20nm_config(struct msm_panel_info *pinfo);
Veera Sundaram Sankarandb0b2bf2014-12-16 18:09:27 -0800318void mdss_dsi_pll_20nm_sw_reset_st_machine(uint32_t pll_base);
319uint32_t mdss_dsi_pll_20nm_lock_status(uint32_t pll_base);
320void mdss_dsi_uniphy_pll_lock_detect_setting(uint32_t pll_base);
321void mdss_dsi_uniphy_pll_sw_reset(uint32_t pll_base);
322int mdss_dsi_post_on(struct msm_fb_panel_data *panel);
Kuogee Hsiehd58c8092015-07-07 10:31:34 -0700323
Chandan Uddaraju78ae6752010-10-19 12:57:10 -0700324#endif