blob: 1014b4598f5350648dac44828eb57870484b67e3 [file] [log] [blame]
Sachin Bhayare5e5f32a2015-10-07 11:47:19 +05301/* Copyright (c) 2011-2015, 2017, The Linux Foundation. All rights reserved.
Aparna Mallavarapuf712f5e2011-08-04 21:11:00 +05302 *
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.
Padmanabhan Komandurufa4be752012-10-08 16:51:56 +053012 * * Neither the name of The Linux Foundation, Inc. nor the names of its
Aparna Mallavarapuf712f5e2011-08-04 21:11:00 +053013 * 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#include <mdp3.h>
30#include <debug.h>
31#include <reg.h>
Channagoud Kadabi539ef722012-03-29 16:02:50 +053032#include <msm_panel.h>
33#include <err.h>
Aparna Mallavarapuf712f5e2011-08-04 21:11:00 +053034#include <target/display.h>
35#include <platform/timer.h>
36#include <platform/iomap.h>
37
Sachin Bhayare5e5f32a2015-10-07 11:47:19 +053038#define BIT(bit) (1 << (bit))
Shashank Mittal4bfb2e32012-04-16 10:56:27 -070039static int mdp_rev;
40
Sachin Bhayare5e5f32a2015-10-07 11:47:19 +053041/**
42 * mdp3_get_panic_lut_cfg() - calculate panic and robust lut mask
43 * @panel_width: Panel width
44 *
45 * DMA buffer has 16 fill levels. Which needs to configured as safe
46 * and panic levels based on panel resolutions.
47 * No. of fill levels used = ((panel active width * 8) / 512).
48 * Roundoff the use fill levels if needed.
49 * half of the total fill levels used will be treated as panic levels.
50 * Roundoff panic levels if total used fill levels are odd.
51 *
52 * Sample calculation for 720p display:
53 * Fill levels used = (720 * 8) / 512 = 12.5 after round off 13.
54 * panic levels = 13 / 2 = 6.5 after roundoff 7.
55 * Panic mask = 0x3FFF (2 bits per level)
56 * Robust mask = 0xFF80 (1 bit per level)
57 */
58unsigned long long mdp3_get_panic_lut_cfg(int panel_width)
59{
60 unsigned int fill_levels = (((panel_width * 8) / 512) + 1);
61 unsigned int panic_mask = 0;
62 unsigned int robust_mask = 0;
63 int i = 0;
64 unsigned long long panic_config = 0;
65 int panic_levels = 0;
66
67 panic_levels = fill_levels/2;
68 if (fill_levels % 2)
69 panic_levels++;
70 for (i = 0; i < panic_levels; i++) {
71 panic_mask |= (BIT((i * 2) + 1) | BIT(i * 2));
72 robust_mask |= BIT(i);
73 }
74 panic_config = (~robust_mask);
75 panic_config = panic_config << 32;
76 panic_config |= panic_mask;
77 return panic_config;
78}
79
Channagoud Kadabi539ef722012-03-29 16:02:50 +053080int mdp_dsi_video_config(struct msm_panel_info *pinfo,
81 struct fbcon_config *fb)
Aparna Mallavarapuf712f5e2011-08-04 21:11:00 +053082{
Ajay Dudanib01e5062011-12-03 23:23:42 -080083 unsigned long hsync_period;
84 unsigned long vsync_period;
85 unsigned long vsync_period_intmd;
Channagoud Kadabi539ef722012-03-29 16:02:50 +053086 struct lcdc_panel_info *lcdc = NULL;
87 int ystride = 3;
Terence Hampson7385f6a2013-08-16 15:31:25 -040088 int mdp_rev = mdp_get_revision();
Sachin Bhayare5e5f32a2015-10-07 11:47:19 +053089 unsigned long long panic_config = mdp3_get_panic_lut_cfg(pinfo->xres);
Channagoud Kadabi539ef722012-03-29 16:02:50 +053090
91 if (pinfo == NULL)
92 return ERR_INVALID_ARGS;
93
94 lcdc = &(pinfo->lcdc);
95 if (lcdc == NULL)
96 return ERR_INVALID_ARGS;
Aparna Mallavarapuf712f5e2011-08-04 21:11:00 +053097
Ajay Dudanib01e5062011-12-03 23:23:42 -080098 dprintf(SPEW, "MDP3.0.3 for DSI Video Mode\n");
Aparna Mallavarapuf712f5e2011-08-04 21:11:00 +053099
Channagoud Kadabi539ef722012-03-29 16:02:50 +0530100 hsync_period = pinfo->xres + lcdc->h_front_porch + \
101 lcdc->h_back_porch + 1;
102 vsync_period_intmd = pinfo->yres + lcdc->v_front_porch + \
103 lcdc->v_back_porch + 1;
Shivaraj Shettyf9e10c42014-09-17 04:21:15 +0530104 if (mdp_rev == MDP_REV_304 || mdp_rev == MDP_REV_305) {
Terence Hampson7385f6a2013-08-16 15:31:25 -0400105 hsync_period += lcdc->h_pulse_width - 1;
106 vsync_period_intmd += lcdc->v_pulse_width - 1;
107 }
Ajay Dudanib01e5062011-12-03 23:23:42 -0800108 vsync_period = vsync_period_intmd * hsync_period;
Aparna Mallavarapuf712f5e2011-08-04 21:11:00 +0530109
Sandeep Panda09fd9782014-12-26 10:32:01 +0530110 /* Program QOS remapper settings */
111 writel(0x1A9, MDP_DMA_P_QOS_REMAPPER);
112 writel(0x0, MDP_DMA_P_WATERMARK_0);
113 writel(0x0, MDP_DMA_P_WATERMARK_1);
114 writel(0x0, MDP_DMA_P_WATERMARK_2);
Sandeep Panda09fd9782014-12-26 10:32:01 +0530115
Sachin Bhayare5e5f32a2015-10-07 11:47:19 +0530116 writel((panic_config & 0xFFFF), MDP_PANIC_LUT0);
117 writel(((panic_config >> 16) & 0xFFFF) , MDP_PANIC_LUT1);
118 writel(((panic_config >> 32) & 0xFFFF), MDP_ROBUST_LUT);
119 writel(0x1, MDP_PANIC_ROBUST_CTRL);
120 dprintf(INFO, "Panic Lut0 %x Lut1 %x Robest %x\n",
121 (panic_config & 0xFFFF), ((panic_config >> 16) & 0xFFFF),
122 ((panic_config >> 32) & 0xFFFF));
Ajay Dudanib01e5062011-12-03 23:23:42 -0800123 // ------------- programming MDP_DMA_P_CONFIG ---------------------
124 writel(0x1800bf, MDP_DMA_P_CONFIG); // rgb888
Aparna Mallavarapuf712f5e2011-08-04 21:11:00 +0530125
Ajay Dudanib01e5062011-12-03 23:23:42 -0800126 writel(0x00000000, MDP_DMA_P_OUT_XY);
Channagoud Kadabi539ef722012-03-29 16:02:50 +0530127 writel(pinfo->yres << 16 | pinfo->xres, MDP_DMA_P_SIZE);
128 writel(MIPI_FB_ADDR, MDP_DMA_P_BUF_ADDR);
129 writel(pinfo->xres * ystride, MDP_DMA_P_BUF_Y_STRIDE);
130 writel(hsync_period << 16 | lcdc->h_pulse_width, \
131 MDP_DSI_VIDEO_HSYNC_CTL);
Ajay Dudanib01e5062011-12-03 23:23:42 -0800132 writel(vsync_period, MDP_DSI_VIDEO_VSYNC_PERIOD);
Channagoud Kadabi539ef722012-03-29 16:02:50 +0530133 writel(lcdc->v_pulse_width * hsync_period, \
134 MDP_DSI_VIDEO_VSYNC_PULSE_WIDTH);
Shivaraj Shettyf9e10c42014-09-17 04:21:15 +0530135 if (mdp_rev == MDP_REV_304 || mdp_rev == MDP_REV_305) {
Terence Hampson7385f6a2013-08-16 15:31:25 -0400136 writel((pinfo->xres + lcdc->h_back_porch + \
137 lcdc->h_pulse_width - 1) << 16 | \
138 lcdc->h_back_porch + lcdc->h_pulse_width, \
139 MDP_DSI_VIDEO_DISPLAY_HCTL);
140 writel((lcdc->v_back_porch + lcdc->v_pulse_width) \
141 * hsync_period, MDP_DSI_VIDEO_DISPLAY_V_START);
142 writel(vsync_period - lcdc->v_front_porch * hsync_period - 1,
Ajay Dudanib01e5062011-12-03 23:23:42 -0800143 MDP_DSI_VIDEO_DISPLAY_V_END);
Terence Hampson7385f6a2013-08-16 15:31:25 -0400144 } else {
145 writel((pinfo->xres + lcdc->h_back_porch - 1) << 16 | \
146 lcdc->h_back_porch, MDP_DSI_VIDEO_DISPLAY_HCTL);
147 writel(lcdc->v_back_porch * hsync_period, \
148 MDP_DSI_VIDEO_DISPLAY_V_START);
149 writel((pinfo->yres + lcdc->v_back_porch) * hsync_period,
150 MDP_DSI_VIDEO_DISPLAY_V_END);
151 }
Ajay Dudanib01e5062011-12-03 23:23:42 -0800152 writel(0x00ABCDEF, MDP_DSI_VIDEO_BORDER_CLR);
153 writel(0x00000000, MDP_DSI_VIDEO_HSYNC_SKEW);
154 writel(0x00000000, MDP_DSI_VIDEO_CTL_POLARITY);
155 // end of cmd mdp
Aparna Mallavarapuf712f5e2011-08-04 21:11:00 +0530156
Channagoud Kadabi539ef722012-03-29 16:02:50 +0530157 return 0;
Aparna Mallavarapuf712f5e2011-08-04 21:11:00 +0530158}
Ajay Dudanib01e5062011-12-03 23:23:42 -0800159
Channagoud Kadabi10189fd2012-05-25 13:33:39 +0530160int mdp_dsi_cmd_config(struct msm_panel_info *pinfo,
161 struct fbcon_config *fb)
162{
163 int ret = 0;
164 unsigned short pack_pattern = 0x21;
165 unsigned char ystride = 3;
Sachin Bhayare5e5f32a2015-10-07 11:47:19 +0530166 unsigned long long panic_config = 0;
167
168 if (pinfo == NULL)
169 return ERR_INVALID_ARGS;
Channagoud Kadabi10189fd2012-05-25 13:33:39 +0530170
Sandeep Panda09fd9782014-12-26 10:32:01 +0530171 /* Program QOS remapper settings */
172 writel(0x1A9, MDP_DMA_P_QOS_REMAPPER);
173 writel(0x0, MDP_DMA_P_WATERMARK_0);
174 writel(0x0, MDP_DMA_P_WATERMARK_1);
175 writel(0x0, MDP_DMA_P_WATERMARK_2);
Sachin Bhayare5e5f32a2015-10-07 11:47:19 +0530176
177 panic_config = mdp3_get_panic_lut_cfg(pinfo->xres);
178 writel((panic_config & 0xFFFF), MDP_PANIC_LUT0);
179 writel(((panic_config >> 16) & 0xFFFF) , MDP_PANIC_LUT1);
180 writel(((panic_config >> 32) & 0xFFFF), MDP_ROBUST_LUT);
Sandeep Panda09fd9782014-12-26 10:32:01 +0530181 writel(0x1, MDP_PANIC_ROBUST_CTRL);
Sachin Bhayare5e5f32a2015-10-07 11:47:19 +0530182 dprintf(INFO, "Panic Lut0 %x Lut1 %x Robest %x\n",
183 (panic_config & 0xFFFF), ((panic_config >> 16) & 0xFFFF),
184 ((panic_config >> 32) & 0xFFFF));
Sandeep Panda09fd9782014-12-26 10:32:01 +0530185
Channagoud Kadabi10189fd2012-05-25 13:33:39 +0530186 writel(0x03ffffff, MDP_INTR_ENABLE);
187
188 // ------------- programming MDP_DMA_P_CONFIG ---------------------
189 writel(pack_pattern << 8 | 0x3f | (0 << 25)| (1 << 19) | (1 << 7) , MDP_DMA_P_CONFIG); // rgb888
190 writel(0x00000000, MDP_DMA_P_OUT_XY);
191 writel(pinfo->yres << 16 | pinfo->xres, MDP_DMA_P_SIZE);
192 writel(MIPI_FB_ADDR, MDP_DMA_P_BUF_ADDR);
193
194 writel(pinfo->xres * ystride, MDP_DMA_P_BUF_Y_STRIDE);
195
196 writel(0x10, MDP_DSI_CMD_MODE_ID_MAP);
197 writel(0x11, MDP_DSI_CMD_MODE_TRIGGER_EN);
198 mdelay(10);
199
200 return ret;
201}
202
Aparna Mallavarapuf712f5e2011-08-04 21:11:00 +0530203void mdp_disable(void)
204{
Channagoud Kadabif2488462012-06-12 15:22:48 +0530205 if (!target_cont_splash_screen())
206 writel(0x00000000, MDP_DSI_VIDEO_EN);
Aparna Mallavarapuf712f5e2011-08-04 21:11:00 +0530207}
208
Channagoud Kadabi539ef722012-03-29 16:02:50 +0530209int mdp_dsi_video_off(void)
Aparna Mallavarapuf712f5e2011-08-04 21:11:00 +0530210{
Channagoud Kadabif2488462012-06-12 15:22:48 +0530211 if (!target_cont_splash_screen()) {
212 mdp_disable();
213 mdelay(60);
Channagoud Kadabif2488462012-06-12 15:22:48 +0530214 }
Padmanabhan Komandurufa4be752012-10-08 16:51:56 +0530215 writel(0x00000000, MDP_INTR_ENABLE);
216 writel(0x01ffffff, MDP_INTR_CLEAR);
Channagoud Kadabi539ef722012-03-29 16:02:50 +0530217 return NO_ERROR;
Aparna Mallavarapuf712f5e2011-08-04 21:11:00 +0530218}
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700219
Channagoud Kadabi10189fd2012-05-25 13:33:39 +0530220int mdp_dsi_cmd_off(void)
221{
Channagoud Kadabif2488462012-06-12 15:22:48 +0530222 if (!target_cont_splash_screen()) {
223 mdp_dma_off();
224 /*
225 * Allow sometime for the DMA channel to
226 * stop the data transfer
227 */
228 mdelay(10);
Channagoud Kadabif2488462012-06-12 15:22:48 +0530229 }
Padmanabhan Komandurufa4be752012-10-08 16:51:56 +0530230 writel(0x00000000, MDP_INTR_ENABLE);
231 writel(0x01ffffff, MDP_INTR_CLEAR);
Channagoud Kadabi10189fd2012-05-25 13:33:39 +0530232 return NO_ERROR;
233}
234
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700235void mdp_set_revision(int rev)
236{
237 mdp_rev = rev;
238}
239
240int mdp_get_revision(void)
241{
242 return mdp_rev;
243}
Channagoud Kadabi539ef722012-03-29 16:02:50 +0530244
Jayant Shekhar32397f92014-03-27 13:30:41 +0530245int mdp_dsi_video_on(struct msm_panel_info *pinfo)
Channagoud Kadabi539ef722012-03-29 16:02:50 +0530246{
247 int ret = 0;
248
249 writel(0x00000001, MDP_DSI_VIDEO_EN);
250
251 return ret;
252}
Channagoud Kadabi10189fd2012-05-25 13:33:39 +0530253
Jayant Shekhar32397f92014-03-27 13:30:41 +0530254int mdp_dma_on(struct msm_panel_info *pinfo)
Channagoud Kadabi10189fd2012-05-25 13:33:39 +0530255{
256 int ret = 0;
Xiaoming Zhou8d534dd2013-07-29 15:49:19 -0400257 mdelay(100);
Channagoud Kadabi10189fd2012-05-25 13:33:39 +0530258 writel(0x00000001, MDP_DMA_P_START);
259
260 return ret;
261}
262
263int mdp_dma_off()
264{
265 int ret = 0;
266
Channagoud Kadabif2488462012-06-12 15:22:48 +0530267 if (!target_cont_splash_screen())
268 writel(0x00000000, MDP_DMA_P_START);
Channagoud Kadabi10189fd2012-05-25 13:33:39 +0530269
270 return ret;
271}
Asaf Penso6c58a6b2013-07-14 19:57:29 +0300272
273int mdp_edp_config(struct msm_panel_info *pinfo, struct fbcon_config *fb)
274{
275 return NO_ERROR;
276}
277
Jayant Shekhar32397f92014-03-27 13:30:41 +0530278int mdp_edp_on(struct msm_panel_info *pinfo)
Asaf Penso6c58a6b2013-07-14 19:57:29 +0300279{
280 return NO_ERROR;
281}
282
283int mdp_edp_off(void)
284{
285 return NO_ERROR;
286}
Ajay Singh Parmar63c18502014-07-23 23:37:19 -0700287
Ajay Singh Parmar243d82b2014-07-23 23:01:44 -0700288int mdss_hdmi_config(struct msm_panel_info *pinfo, struct fbcon_config *fb)
Ajay Singh Parmar63c18502014-07-23 23:37:19 -0700289{
290 return NO_ERROR;
291}
292
Veera Sundaram Sankarandb0b2bf2014-12-16 18:09:27 -0800293int mdss_hdmi_on(struct msm_panel_info *pinfo)
Ajay Singh Parmar63c18502014-07-23 23:37:19 -0700294{
295 return NO_ERROR;
296}
297
Ajay Singh Parmar243d82b2014-07-23 23:01:44 -0700298int mdss_hdmi_off(void)
Ajay Singh Parmar63c18502014-07-23 23:37:19 -0700299{
300 return NO_ERROR;
301}