diff options
author | Alan Cox <alan@linux.intel.com> | 2011-07-15 12:35:36 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2011-07-15 13:05:08 -0400 |
commit | 3caa89e933646263cb4efedd5660dba00a107b51 (patch) | |
tree | 79fc0790523e21665c231244ea1855b51c9d9f12 | |
parent | f75c7538c5ee3bfd0ac50d20457e773c43858a75 (diff) |
gma500: resync with Medfield progress
Signed-off-by: Alan Cox <alan@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r-- | drivers/staging/gma500/mdfld_dsi_dbi.c | 369 | ||||
-rw-r--r-- | drivers/staging/gma500/mdfld_dsi_dbi.h | 21 | ||||
-rw-r--r-- | drivers/staging/gma500/mdfld_dsi_dbi_dpu.h | 3 | ||||
-rw-r--r-- | drivers/staging/gma500/mdfld_dsi_dpi.c | 319 | ||||
-rw-r--r-- | drivers/staging/gma500/mdfld_dsi_dpi.h | 6 | ||||
-rw-r--r-- | drivers/staging/gma500/mdfld_dsi_output.c | 250 | ||||
-rw-r--r-- | drivers/staging/gma500/mdfld_dsi_output.h | 203 | ||||
-rw-r--r-- | drivers/staging/gma500/mdfld_dsi_pkg_sender.c | 403 | ||||
-rw-r--r-- | drivers/staging/gma500/mdfld_dsi_pkg_sender.h | 26 | ||||
-rw-r--r-- | drivers/staging/gma500/mdfld_intel_display.c | 6 | ||||
-rw-r--r-- | drivers/staging/gma500/mdfld_output.c | 8 | ||||
-rw-r--r-- | drivers/staging/gma500/mdfld_output.h | 41 | ||||
-rw-r--r-- | drivers/staging/gma500/mdfld_pyr_cmd.c | 18 | ||||
-rw-r--r-- | drivers/staging/gma500/mdfld_tmd_vid.c | 62 | ||||
-rw-r--r-- | drivers/staging/gma500/mdfld_tpo_cmd.c | 64 | ||||
-rw-r--r-- | drivers/staging/gma500/mrst_lvds.c | 35 | ||||
-rw-r--r-- | drivers/staging/gma500/psb_drv.h | 7 |
17 files changed, 917 insertions, 924 deletions
diff --git a/drivers/staging/gma500/mdfld_dsi_dbi.c b/drivers/staging/gma500/mdfld_dsi_dbi.c index 1421f497d0ab..06424f945bc8 100644 --- a/drivers/staging/gma500/mdfld_dsi_dbi.c +++ b/drivers/staging/gma500/mdfld_dsi_dbi.c | |||
@@ -39,29 +39,10 @@ extern int gfxrtdelay; | |||
39 | int enter_dsr; | 39 | int enter_dsr; |
40 | struct mdfld_dsi_dbi_output *gdbi_output; | 40 | struct mdfld_dsi_dbi_output *gdbi_output; |
41 | extern bool gbgfxsuspended; | 41 | extern bool gbgfxsuspended; |
42 | extern int enable_gfx_rtpm; | ||
42 | extern int gfxrtdelay; | 43 | extern int gfxrtdelay; |
43 | 44 | ||
44 | #ifdef CONFIG_GFX_RTPM | 45 | #define MDFLD_DSR_MAX_IDLE_COUNT 2 |
45 | static void psb_runtimepm_wq_handler(struct work_struct *work); | ||
46 | DECLARE_DELAYED_WORK(rtpm_work, psb_runtimepm_wq_handler); | ||
47 | |||
48 | void psb_runtimepm_wq_handler(struct work_struct *work) | ||
49 | { | ||
50 | struct drm_psb_private *dev_priv = gpDrmDevice->dev_private; | ||
51 | |||
52 | if (drm_psb_ospm && !enable_gfx_rtpm) { | ||
53 | pr_info("Enable GFX runtime_pm\n"); | ||
54 | dev_priv->rpm_enabled = 1; | ||
55 | enable_gfx_rtpm = 1; | ||
56 | |||
57 | pm_runtime_enable(&gpDrmDevice->pdev->dev); | ||
58 | pm_runtime_set_active(&gpDrmDevice->pdev->dev); | ||
59 | |||
60 | pm_runtime_allow(&gpDrmDevice->pdev->dev); | ||
61 | } | ||
62 | } | ||
63 | #endif | ||
64 | |||
65 | 46 | ||
66 | /* | 47 | /* |
67 | * set refreshing area | 48 | * set refreshing area |
@@ -80,8 +61,8 @@ int mdfld_dsi_dbi_update_area(struct mdfld_dsi_dbi_output *dbi_output, | |||
80 | return -EINVAL; | 61 | return -EINVAL; |
81 | } | 62 | } |
82 | 63 | ||
83 | /*set column*/ | 64 | /* Set column */ |
84 | cmd = set_column_address; | 65 | cmd = DCS_SET_COLUMN_ADDRESS; |
85 | param[0] = x1 >> 8; | 66 | param[0] = x1 >> 8; |
86 | param[1] = x1; | 67 | param[1] = x1; |
87 | param[2] = x2 >> 8; | 68 | param[2] = x2 >> 8; |
@@ -98,8 +79,8 @@ int mdfld_dsi_dbi_update_area(struct mdfld_dsi_dbi_output *dbi_output, | |||
98 | goto err_out; | 79 | goto err_out; |
99 | } | 80 | } |
100 | 81 | ||
101 | /*set page*/ | 82 | /* Set page */ |
102 | cmd = set_page_addr; | 83 | cmd = DCS_SET_PAGE_ADDRESS; |
103 | param[0] = y1 >> 8; | 84 | param[0] = y1 >> 8; |
104 | param[1] = y1; | 85 | param[1] = y1; |
105 | param[2] = y2 >> 8; | 86 | param[2] = y2 >> 8; |
@@ -139,56 +120,46 @@ int mdfld_dsi_dbi_update_power(struct mdfld_dsi_dbi_output *dbi_output, | |||
139 | int mode) | 120 | int mode) |
140 | { | 121 | { |
141 | struct drm_device *dev = dbi_output->dev; | 122 | struct drm_device *dev = dbi_output->dev; |
142 | struct drm_psb_private *dev_priv = dev->dev_private; | ||
143 | struct mdfld_dsi_pkg_sender *sender = | 123 | struct mdfld_dsi_pkg_sender *sender = |
144 | mdfld_dsi_encoder_get_pkg_sender(&dbi_output->base); | 124 | mdfld_dsi_encoder_get_pkg_sender(&dbi_output->base); |
145 | u8 param = 0; | 125 | u8 param = 0; |
146 | u32 err = 0; | 126 | u32 err = 0; |
147 | 127 | ||
148 | if (!dev_priv->dispstatus && mode != DRM_MODE_DPMS_ON) { | ||
149 | dev_err(dev->dev, "%s: already OFF ignoring\n", __func__); | ||
150 | return 0; | ||
151 | } | ||
152 | if (dev_priv->dispstatus && mode == DRM_MODE_DPMS_ON) { | ||
153 | dev_err(dev->dev, "%s: already ON ignoring\n", __func__); | ||
154 | return 0; | ||
155 | } | ||
156 | |||
157 | if (!sender) { | 128 | if (!sender) { |
158 | WARN_ON(1); | 129 | WARN_ON(1); |
159 | return -EINVAL; | 130 | return -EINVAL; |
160 | } | 131 | } |
161 | 132 | ||
162 | if (mode == DRM_MODE_DPMS_ON) { | 133 | if (mode == DRM_MODE_DPMS_ON) { |
163 | /*exit sleep mode*/ | 134 | /* Exit sleep mode */ |
164 | err = mdfld_dsi_send_dcs(sender, | 135 | err = mdfld_dsi_send_dcs(sender, |
165 | exit_sleep_mode, | 136 | DCS_EXIT_SLEEP_MODE, |
166 | NULL, | 137 | NULL, |
167 | 0, | 138 | 0, |
168 | CMD_DATA_SRC_SYSTEM_MEM, | 139 | CMD_DATA_SRC_SYSTEM_MEM, |
169 | MDFLD_DSI_QUEUE_PACKAGE); | 140 | MDFLD_DSI_QUEUE_PACKAGE); |
170 | if (err) { | 141 | if (err) { |
171 | dev_err(dev->dev, "DCS 0x%x sent failed\n", | 142 | dev_err(dev->dev, "DCS 0x%x sent failed\n", |
172 | exit_sleep_mode); | 143 | DCS_EXIT_SLEEP_MODE); |
173 | goto power_err; | 144 | goto power_err; |
174 | } | 145 | } |
175 | 146 | ||
176 | /*set display on*/ | 147 | /* Set display on */ |
177 | err = mdfld_dsi_send_dcs(sender, | 148 | err = mdfld_dsi_send_dcs(sender, |
178 | set_display_on, | 149 | DCS_SET_DISPLAY_ON, |
179 | NULL, | 150 | NULL, |
180 | 0, | 151 | 0, |
181 | CMD_DATA_SRC_SYSTEM_MEM, | 152 | CMD_DATA_SRC_SYSTEM_MEM, |
182 | MDFLD_DSI_QUEUE_PACKAGE); | 153 | MDFLD_DSI_QUEUE_PACKAGE); |
183 | if (err) { | 154 | if (err) { |
184 | dev_err(dev->dev, "DCS 0x%x sent failed\n", | 155 | dev_err(dev->dev, "DCS 0x%x sent failed\n", |
185 | set_display_on); | 156 | DCS_SET_DISPLAY_ON); |
186 | goto power_err; | 157 | goto power_err; |
187 | } | 158 | } |
188 | 159 | ||
189 | /* set tear effect on */ | 160 | /* set tear effect on */ |
190 | err = mdfld_dsi_send_dcs(sender, | 161 | err = mdfld_dsi_send_dcs(sender, |
191 | set_tear_on, | 162 | DCS_SET_TEAR_ON, |
192 | ¶m, | 163 | ¶m, |
193 | 1, | 164 | 1, |
194 | CMD_DATA_SRC_SYSTEM_MEM, | 165 | CMD_DATA_SRC_SYSTEM_MEM, |
@@ -203,53 +174,53 @@ int mdfld_dsi_dbi_update_power(struct mdfld_dsi_dbi_output *dbi_output, | |||
203 | * FIXME: remove this later | 174 | * FIXME: remove this later |
204 | */ | 175 | */ |
205 | err = mdfld_dsi_send_dcs(sender, | 176 | err = mdfld_dsi_send_dcs(sender, |
206 | write_mem_start, | 177 | DCS_WRITE_MEM_START, |
207 | NULL, | 178 | NULL, |
208 | 0, | 179 | 0, |
209 | CMD_DATA_SRC_PIPE, | 180 | CMD_DATA_SRC_PIPE, |
210 | MDFLD_DSI_QUEUE_PACKAGE); | 181 | MDFLD_DSI_QUEUE_PACKAGE); |
211 | if (err) { | 182 | if (err) { |
212 | dev_err(dev->dev, "DCS 0x%x sent failed\n", | 183 | dev_err(dev->dev, "DCS 0x%x sent failed\n", |
213 | set_display_on); | 184 | DCS_WRITE_MEM_START); |
214 | goto power_err; | 185 | goto power_err; |
215 | } | 186 | } |
216 | } else { | 187 | } else { |
217 | /*set tear effect off */ | 188 | /* Set tear effect off */ |
218 | err = mdfld_dsi_send_dcs(sender, | 189 | err = mdfld_dsi_send_dcs(sender, |
219 | set_tear_off, | 190 | DCS_SET_TEAR_OFF, |
220 | NULL, | 191 | NULL, |
221 | 0, | 192 | 0, |
222 | CMD_DATA_SRC_SYSTEM_MEM, | 193 | CMD_DATA_SRC_SYSTEM_MEM, |
223 | MDFLD_DSI_QUEUE_PACKAGE); | 194 | MDFLD_DSI_QUEUE_PACKAGE); |
224 | if (err) { | 195 | if (err) { |
225 | dev_err(dev->dev, "DCS 0x%x sent failed\n", | 196 | dev_err(dev->dev, "DCS 0x%x sent failed\n", |
226 | set_tear_off); | 197 | DCS_SET_TEAR_OFF); |
227 | goto power_err; | 198 | goto power_err; |
228 | } | 199 | } |
229 | 200 | ||
230 | /*set display off*/ | 201 | /* Turn display off */ |
231 | err = mdfld_dsi_send_dcs(sender, | 202 | err = mdfld_dsi_send_dcs(sender, |
232 | set_display_off, | 203 | DCS_SET_DISPLAY_OFF, |
233 | NULL, | 204 | NULL, |
234 | 0, | 205 | 0, |
235 | CMD_DATA_SRC_SYSTEM_MEM, | 206 | CMD_DATA_SRC_SYSTEM_MEM, |
236 | MDFLD_DSI_QUEUE_PACKAGE); | 207 | MDFLD_DSI_QUEUE_PACKAGE); |
237 | if (err) { | 208 | if (err) { |
238 | dev_err(dev->dev, "DCS 0x%x sent failed\n", | 209 | dev_err(dev->dev, "DCS 0x%x sent failed\n", |
239 | set_display_off); | 210 | DCS_SET_DISPLAY_OFF); |
240 | goto power_err; | 211 | goto power_err; |
241 | } | 212 | } |
242 | 213 | ||
243 | /*enter sleep mode*/ | 214 | /* Now enter sleep mode */ |
244 | err = mdfld_dsi_send_dcs(sender, | 215 | err = mdfld_dsi_send_dcs(sender, |
245 | enter_sleep_mode, | 216 | DCS_ENTER_SLEEP_MODE, |
246 | NULL, | 217 | NULL, |
247 | 0, | 218 | 0, |
248 | CMD_DATA_SRC_SYSTEM_MEM, | 219 | CMD_DATA_SRC_SYSTEM_MEM, |
249 | MDFLD_DSI_QUEUE_PACKAGE); | 220 | MDFLD_DSI_QUEUE_PACKAGE); |
250 | if (err) { | 221 | if (err) { |
251 | dev_err(dev->dev, "DCS 0x%x sent failed\n", | 222 | dev_err(dev->dev, "DCS 0x%x sent failed\n", |
252 | enter_sleep_mode); | 223 | DCS_ENTER_SLEEP_MODE); |
253 | goto power_err; | 224 | goto power_err; |
254 | } | 225 | } |
255 | } | 226 | } |
@@ -283,7 +254,6 @@ int mdfld_dsi_dbi_send_dcs(struct mdfld_dsi_dbi_output *dbi_output, | |||
283 | return ret; | 254 | return ret; |
284 | } | 255 | } |
285 | 256 | ||
286 | |||
287 | /* | 257 | /* |
288 | * Enter DSR | 258 | * Enter DSR |
289 | */ | 259 | */ |
@@ -299,11 +269,12 @@ void mdfld_dsi_dbi_enter_dsr(struct mdfld_dsi_dbi_output *dbi_output, int pipe) | |||
299 | u32 pipeconf_reg = PIPEACONF; | 269 | u32 pipeconf_reg = PIPEACONF; |
300 | u32 dspcntr_reg = DSPACNTR; | 270 | u32 dspcntr_reg = DSPACNTR; |
301 | 271 | ||
302 | dev_priv->is_in_idle = true; | ||
303 | |||
304 | if (!dbi_output) | 272 | if (!dbi_output) |
305 | return; | 273 | return; |
306 | 274 | ||
275 | /* FIXME check if can go */ | ||
276 | dev_priv->is_in_idle = true; | ||
277 | |||
307 | gdbi_output = dbi_output; | 278 | gdbi_output = dbi_output; |
308 | if ((dbi_output->mode_flags & MODE_SETTING_ON_GOING) || | 279 | if ((dbi_output->mode_flags & MODE_SETTING_ON_GOING) || |
309 | (psb_crtc && psb_crtc->mode_flags & MODE_SETTING_ON_GOING)) | 280 | (psb_crtc && psb_crtc->mode_flags & MODE_SETTING_ON_GOING)) |
@@ -319,16 +290,17 @@ void mdfld_dsi_dbi_enter_dsr(struct mdfld_dsi_dbi_output *dbi_output, int pipe) | |||
319 | dev_err(dev->dev, "hw begin failed\n"); | 290 | dev_err(dev->dev, "hw begin failed\n"); |
320 | return; | 291 | return; |
321 | } | 292 | } |
322 | /*disable te interrupts. */ | 293 | /* Disable te interrupts */ |
323 | mdfld_disable_te(dev, pipe); | 294 | mdfld_disable_te(dev, pipe); |
324 | 295 | ||
325 | /*disable plane*/ | 296 | /* Disable plane */ |
326 | reg_val = REG_READ(dspcntr_reg); | 297 | reg_val = REG_READ(dspcntr_reg); |
327 | if (!(reg_val & DISPLAY_PLANE_ENABLE)) { | 298 | if (!(reg_val & DISPLAY_PLANE_ENABLE)) { |
328 | REG_WRITE(dspcntr_reg, reg_val & ~DISPLAY_PLANE_ENABLE); | 299 | REG_WRITE(dspcntr_reg, reg_val & ~DISPLAY_PLANE_ENABLE); |
329 | REG_READ(dspcntr_reg); | 300 | REG_READ(dspcntr_reg); |
330 | } | 301 | } |
331 | /*disable pipe*/ | 302 | |
303 | /* Disable pipe */ | ||
332 | reg_val = REG_READ(pipeconf_reg); | 304 | reg_val = REG_READ(pipeconf_reg); |
333 | if (!(reg_val & DISPLAY_PLANE_ENABLE)) { | 305 | if (!(reg_val & DISPLAY_PLANE_ENABLE)) { |
334 | reg_val &= ~DISPLAY_PLANE_ENABLE; | 306 | reg_val &= ~DISPLAY_PLANE_ENABLE; |
@@ -338,7 +310,7 @@ void mdfld_dsi_dbi_enter_dsr(struct mdfld_dsi_dbi_output *dbi_output, int pipe) | |||
338 | mdfldWaitForPipeDisable(dev, pipe); | 310 | mdfldWaitForPipeDisable(dev, pipe); |
339 | } | 311 | } |
340 | 312 | ||
341 | /*disable DPLL*/ | 313 | /* Disable DPLL */ |
342 | reg_val = REG_READ(dpll_reg); | 314 | reg_val = REG_READ(dpll_reg); |
343 | if (!(reg_val & DPLL_VCO_ENABLE)) { | 315 | if (!(reg_val & DPLL_VCO_ENABLE)) { |
344 | reg_val &= ~DPLL_VCO_ENABLE; | 316 | reg_val &= ~DPLL_VCO_ENABLE; |
@@ -357,10 +329,9 @@ void mdfld_dsi_dbi_enter_dsr(struct mdfld_dsi_dbi_output *dbi_output, int pipe) | |||
357 | 329 | ||
358 | #ifndef CONFIG_MDFLD_DSI_DPU | 330 | #ifndef CONFIG_MDFLD_DSI_DPU |
359 | static void mdfld_dbi_output_exit_dsr(struct mdfld_dsi_dbi_output *dbi_output, | 331 | static void mdfld_dbi_output_exit_dsr(struct mdfld_dsi_dbi_output *dbi_output, |
360 | int pipe, void *p_surfaceAddr, bool check_hw_on_only) | 332 | int pipe) |
361 | { | 333 | { |
362 | struct drm_device *dev = dbi_output->dev; | 334 | struct drm_device *dev = dbi_output->dev; |
363 | struct drm_psb_private *dev_priv = dev->dev_private; | ||
364 | struct drm_crtc *crtc = dbi_output->base.base.crtc; | 335 | struct drm_crtc *crtc = dbi_output->base.base.crtc; |
365 | struct psb_intel_crtc *psb_crtc = (crtc) ? | 336 | struct psb_intel_crtc *psb_crtc = (crtc) ? |
366 | to_psb_intel_crtc(crtc) : NULL; | 337 | to_psb_intel_crtc(crtc) : NULL; |
@@ -368,7 +339,6 @@ static void mdfld_dbi_output_exit_dsr(struct mdfld_dsi_dbi_output *dbi_output, | |||
368 | u32 dpll_reg = MRST_DPLL_A; | 339 | u32 dpll_reg = MRST_DPLL_A; |
369 | u32 pipeconf_reg = PIPEACONF; | 340 | u32 pipeconf_reg = PIPEACONF; |
370 | u32 dspcntr_reg = DSPACNTR; | 341 | u32 dspcntr_reg = DSPACNTR; |
371 | u32 dspsurf_reg = DSPASURF; | ||
372 | u32 reg_offset = 0; | 342 | u32 reg_offset = 0; |
373 | 343 | ||
374 | /*if mode setting on-going, back off*/ | 344 | /*if mode setting on-going, back off*/ |
@@ -380,24 +350,17 @@ static void mdfld_dbi_output_exit_dsr(struct mdfld_dsi_dbi_output *dbi_output, | |||
380 | dpll_reg = MRST_DPLL_A; | 350 | dpll_reg = MRST_DPLL_A; |
381 | pipeconf_reg = PIPECCONF; | 351 | pipeconf_reg = PIPECCONF; |
382 | dspcntr_reg = DSPCCNTR; | 352 | dspcntr_reg = DSPCCNTR; |
383 | dspsurf_reg = DSPCSURF; | ||
384 | reg_offset = MIPIC_REG_OFFSET; | 353 | reg_offset = MIPIC_REG_OFFSET; |
385 | } | 354 | } |
386 | 355 | ||
387 | if (check_hw_on_only) { | 356 | if (!gma_power_begin(dev, true)) { |
388 | if (0/* FIXME!ospm_power_is_hw_on(_DISPLAY_ISLAND)*/) { | ||
389 | dev_err(dev->dev, "hw begin failed\n"); | ||
390 | return; | ||
391 | } | ||
392 | } else if (!gma_power_begin(dev, true)) { | ||
393 | dev_err(dev->dev, "hw begin failed\n"); | 357 | dev_err(dev->dev, "hw begin failed\n"); |
394 | return; | 358 | return; |
395 | } | 359 | } |
396 | 360 | ||
397 | /*enable DPLL*/ | 361 | /* Enable DPLL */ |
398 | reg_val = REG_READ(dpll_reg); | 362 | reg_val = REG_READ(dpll_reg); |
399 | if (!(reg_val & DPLL_VCO_ENABLE)) { | 363 | if (!(reg_val & DPLL_VCO_ENABLE)) { |
400 | |||
401 | if (reg_val & MDFLD_PWR_GATE_EN) { | 364 | if (reg_val & MDFLD_PWR_GATE_EN) { |
402 | reg_val &= ~MDFLD_PWR_GATE_EN; | 365 | reg_val &= ~MDFLD_PWR_GATE_EN; |
403 | REG_WRITE(dpll_reg, reg_val); | 366 | REG_WRITE(dpll_reg, reg_val); |
@@ -415,7 +378,7 @@ static void mdfld_dbi_output_exit_dsr(struct mdfld_dsi_dbi_output *dbi_output, | |||
415 | cpu_relax(); | 378 | cpu_relax(); |
416 | } | 379 | } |
417 | 380 | ||
418 | /*enable pipe*/ | 381 | /* Enable pipe */ |
419 | reg_val = REG_READ(pipeconf_reg); | 382 | reg_val = REG_READ(pipeconf_reg); |
420 | if (!(reg_val & PIPEACONF_ENABLE)) { | 383 | if (!(reg_val & PIPEACONF_ENABLE)) { |
421 | reg_val |= PIPEACONF_ENABLE; | 384 | reg_val |= PIPEACONF_ENABLE; |
@@ -425,7 +388,7 @@ static void mdfld_dbi_output_exit_dsr(struct mdfld_dsi_dbi_output *dbi_output, | |||
425 | mdfldWaitForPipeEnable(dev, pipe); | 388 | mdfldWaitForPipeEnable(dev, pipe); |
426 | } | 389 | } |
427 | 390 | ||
428 | /*enable plane*/ | 391 | /* Enable plane */ |
429 | reg_val = REG_READ(dspcntr_reg); | 392 | reg_val = REG_READ(dspcntr_reg); |
430 | if (!(reg_val & DISPLAY_PLANE_ENABLE)) { | 393 | if (!(reg_val & DISPLAY_PLANE_ENABLE)) { |
431 | reg_val |= DISPLAY_PLANE_ENABLE; | 394 | reg_val |= DISPLAY_PLANE_ENABLE; |
@@ -434,15 +397,9 @@ static void mdfld_dbi_output_exit_dsr(struct mdfld_dsi_dbi_output *dbi_output, | |||
434 | udelay(500); | 397 | udelay(500); |
435 | } | 398 | } |
436 | 399 | ||
437 | /* update the surface base address. */ | 400 | /* Enable TE interrupt on this pipe */ |
438 | if (p_surfaceAddr) | ||
439 | REG_WRITE(dspsurf_reg, *((u32 *)p_surfaceAddr)); | ||
440 | |||
441 | if (!check_hw_on_only) | ||
442 | gma_power_end(dev); | ||
443 | |||
444 | /*enable TE interrupt on this pipe*/ | ||
445 | mdfld_enable_te(dev, pipe); | 401 | mdfld_enable_te(dev, pipe); |
402 | gma_power_end(dev); | ||
446 | 403 | ||
447 | /*clean IN_DSR flag*/ | 404 | /*clean IN_DSR flag*/ |
448 | dbi_output->mode_flags &= ~MODE_SETTING_IN_DSR; | 405 | dbi_output->mode_flags &= ~MODE_SETTING_IN_DSR; |
@@ -451,33 +408,33 @@ static void mdfld_dbi_output_exit_dsr(struct mdfld_dsi_dbi_output *dbi_output, | |||
451 | /* | 408 | /* |
452 | * Exit from DSR | 409 | * Exit from DSR |
453 | */ | 410 | */ |
454 | void mdfld_dsi_dbi_exit_dsr(struct drm_device *dev, u32 update_src, | 411 | void mdfld_dsi_dbi_exit_dsr(struct drm_device *dev, u32 update_src) |
455 | void *p_surfaceAddr, bool check_hw_on_only) | ||
456 | { | 412 | { |
457 | struct drm_psb_private *dev_priv = dev->dev_private; | 413 | struct drm_psb_private *dev_priv = dev->dev_private; |
458 | struct mdfld_dbi_dsr_info *dsr_info = dev_priv->dbi_dsr_info; | 414 | struct mdfld_dbi_dsr_info *dsr_info = dev_priv->dbi_dsr_info; |
459 | struct mdfld_dsi_dbi_output **dbi_output; | 415 | struct mdfld_dsi_dbi_output **dbi_output; |
460 | int i; | 416 | int i; |
417 | int pipe; | ||
461 | 418 | ||
419 | /* FIXME can go ? */ | ||
462 | dev_priv->is_in_idle = false; | 420 | dev_priv->is_in_idle = false; |
463 | dbi_output = dsr_info->dbi_outputs; | 421 | dbi_output = dsr_info->dbi_outputs; |
464 | 422 | ||
465 | #ifdef CONFIG_PM_RUNTIME | 423 | #ifdef CONFIG_PM_RUNTIME |
466 | if (!enable_gfx_rtpm) { | 424 | if (!enable_gfx_rtpm) { |
467 | /* pm_runtime_allow(&gpDrmDevice->pdev->dev); */ | 425 | /* pm_runtime_allow(&gpDrmDevice->pdev->dev); */ |
468 | /* schedule_delayed_work(&rtpm_work, 120 * 1000); */ | 426 | /* schedule_delayed_work(&rtpm_work, 30 * 1000);*/ /* FIXME: HZ ? */ |
469 | } | 427 | } |
470 | #endif | 428 | #endif |
471 | 429 | ||
472 | /*for each output, exit dsr*/ | 430 | /* For each output, exit dsr */ |
473 | for (i = 0; i < dsr_info->dbi_output_num; i++) { | 431 | for (i = 0; i < dsr_info->dbi_output_num; i++) { |
474 | /*if panel has been turned off, skip*/ | 432 | /* If panel has been turned off, skip */ |
475 | if (!dbi_output[i]->dbi_panel_on) | 433 | if (!dbi_output[i] || !dbi_output[i]->dbi_panel_on) |
476 | continue; | 434 | continue; |
477 | if (dbi_output[i]->mode_flags & MODE_SETTING_IN_DSR) { | 435 | pipe = dbi_output[i]->channel_num ? 2 : 0; |
478 | enter_dsr = 0; | 436 | enter_dsr = 0; |
479 | mdfld_dbi_output_exit_dsr(dbi_output[i], dbi_output[i]->channel_num ? 2 : 0, p_surfaceAddr, check_hw_on_only); | 437 | mdfld_dbi_output_exit_dsr(dbi_output[i], pipe); |
480 | } | ||
481 | } | 438 | } |
482 | dev_priv->dsr_fb_update |= update_src; | 439 | dev_priv->dsr_fb_update |= update_src; |
483 | } | 440 | } |
@@ -496,7 +453,7 @@ static bool mdfld_dbi_is_in_dsr(struct drm_device *dev) | |||
496 | return true; | 453 | return true; |
497 | } | 454 | } |
498 | 455 | ||
499 | /* Perodically update dbi panel */ | 456 | /* Periodically update dbi panel */ |
500 | void mdfld_dbi_update_panel(struct drm_device *dev, int pipe) | 457 | void mdfld_dbi_update_panel(struct drm_device *dev, int pipe) |
501 | { | 458 | { |
502 | struct drm_psb_private *dev_priv = dev->dev_private; | 459 | struct drm_psb_private *dev_priv = dev->dev_private; |
@@ -504,8 +461,8 @@ void mdfld_dbi_update_panel(struct drm_device *dev, int pipe) | |||
504 | struct mdfld_dsi_dbi_output **dbi_outputs; | 461 | struct mdfld_dsi_dbi_output **dbi_outputs; |
505 | struct mdfld_dsi_dbi_output *dbi_output; | 462 | struct mdfld_dsi_dbi_output *dbi_output; |
506 | int i; | 463 | int i; |
507 | int enter_dsr = 0; | 464 | int can_enter_dsr = 0; |
508 | u32 damage_mask = 0; | 465 | u32 damage_mask; |
509 | 466 | ||
510 | dbi_outputs = dsr_info->dbi_outputs; | 467 | dbi_outputs = dsr_info->dbi_outputs; |
511 | dbi_output = pipe ? dbi_outputs[1] : dbi_outputs[0]; | 468 | dbi_output = pipe ? dbi_outputs[1] : dbi_outputs[0]; |
@@ -514,13 +471,13 @@ void mdfld_dbi_update_panel(struct drm_device *dev, int pipe) | |||
514 | return; | 471 | return; |
515 | 472 | ||
516 | if (pipe == 0) | 473 | if (pipe == 0) |
517 | damage_mask = dev_priv->dsr_fb_update & (MDFLD_DSR_DAMAGE_MASK_0); | 474 | damage_mask = dev_priv->dsr_fb_update & MDFLD_DSR_DAMAGE_MASK_0; |
518 | else if (pipe == 2) | 475 | else if (pipe == 2) |
519 | damage_mask = dev_priv->dsr_fb_update & (MDFLD_DSR_DAMAGE_MASK_2); | 476 | damage_mask = dev_priv->dsr_fb_update & MDFLD_DSR_DAMAGE_MASK_2; |
520 | else | 477 | else |
521 | return; | 478 | return; |
522 | 479 | ||
523 | /*if FB is damaged and panel is on update on-panel FB*/ | 480 | /* If FB is damaged and panel is on update on-panel FB */ |
524 | if (damage_mask && dbi_output->dbi_panel_on) { | 481 | if (damage_mask && dbi_output->dbi_panel_on) { |
525 | dbi_output->dsr_fb_update_done = false; | 482 | dbi_output->dsr_fb_update_done = false; |
526 | 483 | ||
@@ -538,11 +495,24 @@ void mdfld_dbi_update_panel(struct drm_device *dev, int pipe) | |||
538 | dbi_output->dsr_idle_count++; | 495 | dbi_output->dsr_idle_count++; |
539 | } | 496 | } |
540 | 497 | ||
541 | /*try to enter DSR*/ | 498 | switch (dsr_info->dbi_output_num) { |
542 | if (dbi_outputs[0]->dsr_idle_count > 1 | 499 | case 1: |
543 | && dbi_outputs[1]->dsr_idle_count > 1) { | 500 | if (dbi_output->dsr_idle_count > MDFLD_DSR_MAX_IDLE_COUNT) |
501 | can_enter_dsr = 1; | ||
502 | break; | ||
503 | case 2: | ||
504 | if (dbi_outputs[0]->dsr_idle_count > MDFLD_DSR_MAX_IDLE_COUNT | ||
505 | && dbi_outputs[1]->dsr_idle_count > MDFLD_DSR_MAX_IDLE_COUNT) | ||
506 | can_enter_dsr = 1; | ||
507 | break; | ||
508 | default: | ||
509 | DRM_ERROR("Wrong DBI output number\n"); | ||
510 | } | ||
511 | |||
512 | /* Try to enter DSR */ | ||
513 | if (can_enter_dsr) { | ||
544 | for (i = 0; i < dsr_info->dbi_output_num; i++) { | 514 | for (i = 0; i < dsr_info->dbi_output_num; i++) { |
545 | if (!mdfld_dbi_is_in_dsr(dev) && | 515 | if (!mdfld_dbi_is_in_dsr(dev) && dbi_outputs[i] && |
546 | !(dbi_outputs[i]->mode_flags & MODE_SETTING_ON_GOING)) { | 516 | !(dbi_outputs[i]->mode_flags & MODE_SETTING_ON_GOING)) { |
547 | mdfld_dsi_dbi_enter_dsr(dbi_outputs[i], | 517 | mdfld_dsi_dbi_enter_dsr(dbi_outputs[i], |
548 | dbi_outputs[i]->channel_num ? 2 : 0); | 518 | dbi_outputs[i]->channel_num ? 2 : 0); |
@@ -565,61 +535,6 @@ void mdfld_dbi_update_panel(struct drm_device *dev, int pipe) | |||
565 | } | 535 | } |
566 | } | 536 | } |
567 | 537 | ||
568 | /*timers for DSR*/ | ||
569 | static void mdfld_dsi_dbi_dsr_timer_func(unsigned long data) | ||
570 | { | ||
571 | struct drm_device *dev = (struct drm_device *)data; | ||
572 | struct drm_psb_private *dev_priv = dev->dev_private; | ||
573 | struct mdfld_dbi_dsr_info *dsr_info = dev_priv->dbi_dsr_info; | ||
574 | struct timer_list *dsr_timer = &dsr_info->dsr_timer; | ||
575 | unsigned long flags; | ||
576 | |||
577 | mdfld_dbi_update_panel(dev, 0); | ||
578 | |||
579 | if (dsr_info->dsr_idle_count > 1) | ||
580 | return; | ||
581 | |||
582 | spin_lock_irqsave(&dsr_info->dsr_timer_lock, flags); | ||
583 | if (!timer_pending(dsr_timer)) { | ||
584 | dsr_timer->expires = jiffies + MDFLD_DSR_DELAY; | ||
585 | add_timer(dsr_timer); | ||
586 | } | ||
587 | spin_unlock_irqrestore(&dsr_info->dsr_timer_lock, flags); | ||
588 | } | ||
589 | |||
590 | static int mdfld_dsi_dbi_dsr_timer_init(struct drm_device *dev) | ||
591 | { | ||
592 | struct drm_psb_private *dev_priv = dev->dev_private; | ||
593 | struct mdfld_dbi_dsr_info *dsr_info = dev_priv->dbi_dsr_info; | ||
594 | struct timer_list *dsr_timer = &dsr_info->dsr_timer; | ||
595 | unsigned long flags; | ||
596 | |||
597 | spin_lock_init(&dsr_info->dsr_timer_lock); | ||
598 | spin_lock_irqsave(&dsr_info->dsr_timer_lock, flags); | ||
599 | |||
600 | init_timer(dsr_timer); | ||
601 | |||
602 | dsr_timer->data = (unsigned long)dev; | ||
603 | dsr_timer->function = mdfld_dsi_dbi_dsr_timer_func; | ||
604 | dsr_timer->expires = jiffies + MDFLD_DSR_DELAY; | ||
605 | |||
606 | spin_unlock_irqrestore(&dsr_info->dsr_timer_lock, flags); | ||
607 | return 0; | ||
608 | } | ||
609 | |||
610 | void mdfld_dbi_dsr_timer_start(struct mdfld_dbi_dsr_info *dsr_info) | ||
611 | { | ||
612 | struct timer_list *dsr_timer = &dsr_info->dsr_timer; | ||
613 | unsigned long flags; | ||
614 | |||
615 | spin_lock_irqsave(&dsr_info->dsr_timer_lock, flags); | ||
616 | if (!timer_pending(dsr_timer)) { | ||
617 | dsr_timer->expires = jiffies + MDFLD_DSR_DELAY; | ||
618 | add_timer(dsr_timer); | ||
619 | } | ||
620 | spin_unlock_irqrestore(&dsr_info->dsr_timer_lock, flags); | ||
621 | } | ||
622 | |||
623 | int mdfld_dbi_dsr_init(struct drm_device *dev) | 538 | int mdfld_dbi_dsr_init(struct drm_device *dev) |
624 | { | 539 | { |
625 | struct drm_psb_private *dev_priv = dev->dev_private; | 540 | struct drm_psb_private *dev_priv = dev->dev_private; |
@@ -643,7 +558,6 @@ void mdfld_dbi_dsr_exit(struct drm_device *dev) | |||
643 | struct mdfld_dbi_dsr_info *dsr_info = dev_priv->dbi_dsr_info; | 558 | struct mdfld_dbi_dsr_info *dsr_info = dev_priv->dbi_dsr_info; |
644 | 559 | ||
645 | if (dsr_info) { | 560 | if (dsr_info) { |
646 | del_timer_sync(&dsr_info->dsr_timer); | ||
647 | kfree(dsr_info); | 561 | kfree(dsr_info); |
648 | dev_priv->dbi_dsr_info = NULL; | 562 | dev_priv->dbi_dsr_info = NULL; |
649 | } | 563 | } |
@@ -660,13 +574,13 @@ void mdfld_dsi_controller_dbi_init(struct mdfld_dsi_config *dsi_config, | |||
660 | 574 | ||
661 | dev_dbg(dev->dev, "Init DBI interface on pipe %d...\n", pipe); | 575 | dev_dbg(dev->dev, "Init DBI interface on pipe %d...\n", pipe); |
662 | 576 | ||
663 | /*un-ready device*/ | 577 | /* Un-ready device */ |
664 | REG_WRITE((MIPIA_DEVICE_READY_REG + reg_offset), 0x00000000); | 578 | REG_WRITE((MIPIA_DEVICE_READY_REG + reg_offset), 0x00000000); |
665 | 579 | ||
666 | /*init dsi adapter before kicking off*/ | 580 | /* Init dsi adapter before kicking off */ |
667 | REG_WRITE((MIPIA_CONTROL_REG + reg_offset), 0x00000018); | 581 | REG_WRITE((MIPIA_CONTROL_REG + reg_offset), 0x00000018); |
668 | 582 | ||
669 | /*TODO: figure out how to setup these registers*/ | 583 | /* TODO: figure out how to setup these registers */ |
670 | REG_WRITE((MIPIA_DPHY_PARAM_REG + reg_offset), 0x150c3408); | 584 | REG_WRITE((MIPIA_DPHY_PARAM_REG + reg_offset), 0x150c3408); |
671 | REG_WRITE((MIPIA_CLK_LANE_SWITCH_TIME_CNT_REG + reg_offset), | 585 | REG_WRITE((MIPIA_CLK_LANE_SWITCH_TIME_CNT_REG + reg_offset), |
672 | 0x000a0014); | 586 | 0x000a0014); |
@@ -674,16 +588,16 @@ void mdfld_dsi_controller_dbi_init(struct mdfld_dsi_config *dsi_config, | |||
674 | REG_WRITE((MIPIA_DBI_FIFO_THROTTLE_REG + reg_offset), 0x00000001); | 588 | REG_WRITE((MIPIA_DBI_FIFO_THROTTLE_REG + reg_offset), 0x00000001); |
675 | REG_WRITE((MIPIA_HS_LS_DBI_ENABLE_REG + reg_offset), 0x00000000); | 589 | REG_WRITE((MIPIA_HS_LS_DBI_ENABLE_REG + reg_offset), 0x00000000); |
676 | 590 | ||
677 | /*enable all interrupts*/ | 591 | /* Enable all interrupts */ |
678 | REG_WRITE((MIPIA_INTR_EN_REG + reg_offset), 0xffffffff); | 592 | REG_WRITE((MIPIA_INTR_EN_REG + reg_offset), 0xffffffff); |
679 | /*max value: 20 clock cycles of txclkesc*/ | 593 | /* Max value: 20 clock cycles of txclkesc */ |
680 | REG_WRITE((MIPIA_TURN_AROUND_TIMEOUT_REG + reg_offset), 0x0000001f); | 594 | REG_WRITE((MIPIA_TURN_AROUND_TIMEOUT_REG + reg_offset), 0x0000001f); |
681 | /*min 21 txclkesc, max: ffffh*/ | 595 | /* Min 21 txclkesc, max: ffffh */ |
682 | REG_WRITE((MIPIA_DEVICE_RESET_TIMER_REG + reg_offset), 0x0000ffff); | 596 | REG_WRITE((MIPIA_DEVICE_RESET_TIMER_REG + reg_offset), 0x0000ffff); |
683 | /*min: 7d0 max: 4e20*/ | 597 | /* Min: 7d0 max: 4e20 */ |
684 | REG_WRITE((MIPIA_INIT_COUNT_REG + reg_offset), 0x00000fa0); | 598 | REG_WRITE((MIPIA_INIT_COUNT_REG + reg_offset), 0x00000fa0); |
685 | 599 | ||
686 | /*set up func_prg*/ | 600 | /* Set up func_prg */ |
687 | val |= lane_count; | 601 | val |= lane_count; |
688 | val |= (dsi_config->channel_num << DSI_DBI_VIRT_CHANNEL_OFFSET); | 602 | val |= (dsi_config->channel_num << DSI_DBI_VIRT_CHANNEL_OFFSET); |
689 | val |= DSI_DBI_COLOR_FORMAT_OPTION2; | 603 | val |= DSI_DBI_COLOR_FORMAT_OPTION2; |
@@ -692,7 +606,7 @@ void mdfld_dsi_controller_dbi_init(struct mdfld_dsi_config *dsi_config, | |||
692 | REG_WRITE((MIPIA_HS_TX_TIMEOUT_REG + reg_offset), 0x3fffff); | 606 | REG_WRITE((MIPIA_HS_TX_TIMEOUT_REG + reg_offset), 0x3fffff); |
693 | REG_WRITE((MIPIA_LP_RX_TIMEOUT_REG + reg_offset), 0xffff); | 607 | REG_WRITE((MIPIA_LP_RX_TIMEOUT_REG + reg_offset), 0xffff); |
694 | 608 | ||
695 | /*de-assert dbi_stall when half of DBI FIFO is empty*/ | 609 | /* De-assert dbi_stall when half of DBI FIFO is empty */ |
696 | /* REG_WRITE((MIPIA_DBI_FIFO_THROTTLE_REG + reg_offset), 0x00000000); */ | 610 | /* REG_WRITE((MIPIA_DBI_FIFO_THROTTLE_REG + reg_offset), 0x00000000); */ |
697 | 611 | ||
698 | REG_WRITE((MIPIA_HIGH_LOW_SWITCH_COUNT_REG + reg_offset), 0x46); | 612 | REG_WRITE((MIPIA_HIGH_LOW_SWITCH_COUNT_REG + reg_offset), 0x46); |
@@ -718,42 +632,6 @@ static const struct drm_encoder_funcs mdfld_dsi_dbi_encoder_funcs = { | |||
718 | 632 | ||
719 | #endif | 633 | #endif |
720 | 634 | ||
721 | static int mdfld_dbi_panel_reset(struct mdfld_dsi_dbi_output *output) | ||
722 | { | ||
723 | unsigned gpio; | ||
724 | int ret; | ||
725 | |||
726 | switch (output->channel_num) { | ||
727 | case 0: | ||
728 | gpio = 128; | ||
729 | break; | ||
730 | case 1: | ||
731 | gpio = 34; | ||
732 | break; | ||
733 | default: | ||
734 | pr_err("Invalid output\n"); | ||
735 | return -EINVAL; | ||
736 | } | ||
737 | |||
738 | ret = gpio_request(gpio, "gfx"); | ||
739 | if (ret) { | ||
740 | pr_err("gpio_rqueset failed\n"); | ||
741 | return ret; | ||
742 | } | ||
743 | |||
744 | ret = gpio_direction_output(gpio, 1); | ||
745 | if (ret) { | ||
746 | pr_err("gpio_direction_output failed\n"); | ||
747 | goto gpio_error; | ||
748 | } | ||
749 | gpio_get_value(128); | ||
750 | gpio_error: | ||
751 | if (gpio_is_valid(gpio)) | ||
752 | gpio_free(gpio); | ||
753 | |||
754 | return ret; | ||
755 | } | ||
756 | |||
757 | /* | 635 | /* |
758 | * Init DSI DBI encoder. | 636 | * Init DSI DBI encoder. |
759 | * Allocate an mdfld_dsi_encoder and attach it to given @dsi_connector | 637 | * Allocate an mdfld_dsi_encoder and attach it to given @dsi_connector |
@@ -776,13 +654,44 @@ struct mdfld_dsi_encoder *mdfld_dsi_dbi_init(struct drm_device *dev, | |||
776 | #else | 654 | #else |
777 | struct mdfld_dbi_dsr_info *dsr_info = dev_priv ? (dev_priv->dbi_dsr_info) : NULL; | 655 | struct mdfld_dbi_dsr_info *dsr_info = dev_priv ? (dev_priv->dbi_dsr_info) : NULL; |
778 | #endif | 656 | #endif |
657 | u32 data = 0; | ||
658 | int pipe; | ||
779 | int ret; | 659 | int ret; |
780 | 660 | ||
781 | if (!pg || !dsi_connector) { | 661 | if (!pg || !dsi_connector || !p_funcs) { |
782 | WARN_ON(1); | 662 | WARN_ON(1); |
783 | return NULL; | 663 | return NULL; |
784 | } | 664 | } |
785 | 665 | ||
666 | dsi_config = mdfld_dsi_get_config(dsi_connector); | ||
667 | pipe = dsi_connector->pipe; | ||
668 | |||
669 | /*panel hard-reset*/ | ||
670 | if (p_funcs->reset) { | ||
671 | ret = p_funcs->reset(pipe); | ||
672 | if (ret) { | ||
673 | DRM_ERROR("Panel %d hard-reset failed\n", pipe); | ||
674 | return NULL; | ||
675 | } | ||
676 | } | ||
677 | /* Panel drvIC init */ | ||
678 | if (p_funcs->drv_ic_init) | ||
679 | p_funcs->drv_ic_init(dsi_config, pipe); | ||
680 | |||
681 | /* Panel power mode detect */ | ||
682 | ret = mdfld_dsi_get_power_mode(dsi_config, | ||
683 | &data, | ||
684 | MDFLD_DSI_HS_TRANSMISSION); | ||
685 | if (ret) { | ||
686 | DRM_ERROR("Panel %d get power mode failed\n", pipe); | ||
687 | dsi_connector->status = connector_status_disconnected; | ||
688 | } else { | ||
689 | DRM_INFO("pipe %d power mode 0x%x\n", pipe, data); | ||
690 | dsi_connector->status = connector_status_connected; | ||
691 | } | ||
692 | |||
693 | /*TODO: get panel info from DDB*/ | ||
694 | |||
786 | dbi_output = kzalloc(sizeof(struct mdfld_dsi_dbi_output), GFP_KERNEL); | 695 | dbi_output = kzalloc(sizeof(struct mdfld_dsi_dbi_output), GFP_KERNEL); |
787 | if (!dbi_output) { | 696 | if (!dbi_output) { |
788 | dev_err(dev->dev, "No memory\n"); | 697 | dev_err(dev->dev, "No memory\n"); |
@@ -802,23 +711,10 @@ struct mdfld_dsi_encoder *mdfld_dsi_dbi_init(struct drm_device *dev, | |||
802 | 711 | ||
803 | dbi_output->dev = dev; | 712 | dbi_output->dev = dev; |
804 | dbi_output->p_funcs = p_funcs; | 713 | dbi_output->p_funcs = p_funcs; |
805 | |||
806 | /*panel reset*/ | ||
807 | ret = mdfld_dbi_panel_reset(dbi_output); | ||
808 | if (ret) { | ||
809 | dev_err(dev->dev, "reset panel error\n"); | ||
810 | goto out_err1; | ||
811 | } | ||
812 | |||
813 | /*TODO: get panel info from DDB*/ | ||
814 | |||
815 | /*get fixed mode*/ | ||
816 | dsi_config = mdfld_dsi_get_config(dsi_connector); | ||
817 | fixed_mode = dsi_config->fixed_mode; | 714 | fixed_mode = dsi_config->fixed_mode; |
818 | |||
819 | dbi_output->panel_fixed_mode = fixed_mode; | 715 | dbi_output->panel_fixed_mode = fixed_mode; |
820 | 716 | ||
821 | /*create drm encoder object*/ | 717 | /* Create drm encoder object */ |
822 | connector = &dsi_connector->base.base; | 718 | connector = &dsi_connector->base.base; |
823 | encoder = &dbi_output->base.base; | 719 | encoder = &dbi_output->base.base; |
824 | drm_encoder_init(dev, | 720 | drm_encoder_init(dev, |
@@ -827,10 +723,10 @@ struct mdfld_dsi_encoder *mdfld_dsi_dbi_init(struct drm_device *dev, | |||
827 | DRM_MODE_ENCODER_MIPI); | 723 | DRM_MODE_ENCODER_MIPI); |
828 | drm_encoder_helper_add(encoder, p_funcs->encoder_helper_funcs); | 724 | drm_encoder_helper_add(encoder, p_funcs->encoder_helper_funcs); |
829 | 725 | ||
830 | /*attach to given connector*/ | 726 | /* Attach to given connector */ |
831 | drm_mode_connector_attach_encoder(connector, encoder); | 727 | drm_mode_connector_attach_encoder(connector, encoder); |
832 | 728 | ||
833 | /*set possible crtcs and clones*/ | 729 | /* Set possible CRTCs and clones */ |
834 | if (dsi_connector->pipe) { | 730 | if (dsi_connector->pipe) { |
835 | encoder->possible_crtcs = (1 << 2); | 731 | encoder->possible_crtcs = (1 << 2); |
836 | encoder->possible_clones = (1 << 1); | 732 | encoder->possible_clones = (1 << 1); |
@@ -842,28 +738,31 @@ struct mdfld_dsi_encoder *mdfld_dsi_dbi_init(struct drm_device *dev, | |||
842 | dev_priv->dsr_fb_update = 0; | 738 | dev_priv->dsr_fb_update = 0; |
843 | dev_priv->dsr_enable = false; | 739 | dev_priv->dsr_enable = false; |
844 | dev_priv->exit_idle = mdfld_dsi_dbi_exit_dsr; | 740 | dev_priv->exit_idle = mdfld_dsi_dbi_exit_dsr; |
845 | #if defined(CONFIG_MDFLD_DSI_DPU) || defined(CONFIG_MDFLD_DSI_DSR) | ||
846 | dev_priv->dsr_enable_config = false; | ||
847 | #endif /*CONFIG_MDFLD_DSI_DSR*/ | ||
848 | 741 | ||
849 | dbi_output->first_boot = true; | 742 | dbi_output->first_boot = true; |
850 | dbi_output->mode_flags = MODE_SETTING_IN_ENCODER; | 743 | dbi_output->mode_flags = MODE_SETTING_IN_ENCODER; |
851 | 744 | ||
852 | #ifdef CONFIG_MDFLD_DSI_DPU | 745 | #ifdef CONFIG_MDFLD_DSI_DPU |
853 | /*add this output to dpu_info*/ | 746 | /* Add this output to dpu_info */ |
854 | if (dsi_connector->pipe == 0) | 747 | if (dsi_connector->status == connector_status_connected) { |
855 | dpu_info->dbi_outputs[0] = dbi_output; | 748 | if (dsi_connector->pipe == 0) |
856 | } else { | 749 | dpu_info->dbi_outputs[0] = dbi_output; |
857 | dpu_info->dbi_outputs[1] = dbi_output; | 750 | else |
751 | dpu_info->dbi_outputs[1] = dbi_output; | ||
752 | |||
753 | dpu_info->dbi_output_num++; | ||
858 | } | 754 | } |
859 | dpu_info->dbi_output_num++; | 755 | |
860 | #else /*CONFIG_MDFLD_DSI_DPU*/ | 756 | #else /*CONFIG_MDFLD_DSI_DPU*/ |
861 | /*add this output to dsr_info*/ | 757 | if (dsi_connector->status == connector_status_connected) { |
862 | if (dsi_connector->pipe == 0) | 758 | /* Add this output to dsr_info */ |
863 | dsr_info->dbi_outputs[0] = dbi_output; | 759 | if (dsi_connector->pipe == 0) |
864 | else | 760 | dsr_info->dbi_outputs[0] = dbi_output; |
865 | dsr_info->dbi_outputs[1] = dbi_output; | 761 | else |
866 | dsr_info->dbi_output_num++; | 762 | dsr_info->dbi_outputs[1] = dbi_output; |
763 | |||
764 | dsr_info->dbi_output_num++; | ||
765 | } | ||
867 | #endif | 766 | #endif |
868 | return &dbi_output->base; | 767 | return &dbi_output->base; |
869 | out_err1: | 768 | out_err1: |
diff --git a/drivers/staging/gma500/mdfld_dsi_dbi.h b/drivers/staging/gma500/mdfld_dsi_dbi.h index a51e2f875186..a2ec6fd94aed 100644 --- a/drivers/staging/gma500/mdfld_dsi_dbi.h +++ b/drivers/staging/gma500/mdfld_dsi_dbi.h | |||
@@ -59,9 +59,6 @@ struct mdfld_dsi_dbi_output { | |||
59 | /* Backlight operations */ | 59 | /* Backlight operations */ |
60 | 60 | ||
61 | /* DSR timer */ | 61 | /* DSR timer */ |
62 | spinlock_t dsr_timer_lock; | ||
63 | struct timer_list dsr_timer; | ||
64 | void(*dsi_timer_func)(unsigned long data); | ||
65 | u32 dsr_idle_count; | 62 | u32 dsr_idle_count; |
66 | bool dsr_fb_update_done; | 63 | bool dsr_fb_update_done; |
67 | 64 | ||
@@ -81,22 +78,11 @@ struct mdfld_dbi_dsr_info { | |||
81 | int dbi_output_num; | 78 | int dbi_output_num; |
82 | struct mdfld_dsi_dbi_output *dbi_outputs[2]; | 79 | struct mdfld_dsi_dbi_output *dbi_outputs[2]; |
83 | 80 | ||
84 | spinlock_t dsr_timer_lock; | ||
85 | struct timer_list dsr_timer; | ||
86 | u32 dsr_idle_count; | 81 | u32 dsr_idle_count; |
87 | }; | 82 | }; |
88 | 83 | ||
89 | #define DBI_CB_TIMEOUT_COUNT 0xffff | 84 | #define DBI_CB_TIMEOUT_COUNT 0xffff |
90 | 85 | ||
91 | /* DCS commands */ | ||
92 | #define enter_sleep_mode 0x10 | ||
93 | #define exit_sleep_mode 0x11 | ||
94 | #define set_display_off 0x28 | ||
95 | #define set_dispaly_on 0x29 | ||
96 | #define set_column_address 0x2a | ||
97 | #define set_page_addr 0x2b | ||
98 | #define write_mem_start 0x2c | ||
99 | |||
100 | /* Offsets */ | 86 | /* Offsets */ |
101 | #define CMD_MEM_ADDR_OFFSET 0 | 87 | #define CMD_MEM_ADDR_OFFSET 0 |
102 | 88 | ||
@@ -132,7 +118,7 @@ static inline int mdfld_dsi_dbi_cmd_sent(struct mdfld_dsi_dbi_output *dbi_output | |||
132 | 118 | ||
133 | /* Query the command execution status */ | 119 | /* Query the command execution status */ |
134 | while (retry--) | 120 | while (retry--) |
135 | if (!(REG_READ(MIPIA_CMD_ADD_REG + reg_offset) & (1 << 10))) | 121 | if (!(REG_READ(MIPIA_CMD_ADD_REG + reg_offset) & (1 << 0))) |
136 | break; | 122 | break; |
137 | 123 | ||
138 | if (!retry) { | 124 | if (!retry) { |
@@ -164,13 +150,11 @@ static inline int mdfld_dsi_dbi_cb_ready(struct mdfld_dsi_dbi_output *dbi_output | |||
164 | 150 | ||
165 | extern void mdfld_dsi_dbi_output_init(struct drm_device *dev, | 151 | extern void mdfld_dsi_dbi_output_init(struct drm_device *dev, |
166 | struct psb_intel_mode_device *mode_dev, int pipe); | 152 | struct psb_intel_mode_device *mode_dev, int pipe); |
167 | extern void mdfld_dsi_dbi_exit_dsr(struct drm_device *dev, u32 update_src, | 153 | extern void mdfld_dsi_dbi_exit_dsr(struct drm_device *dev, u32 update_src); |
168 | void *p_surfaceAddr, bool check_hw_on_only); | ||
169 | extern void mdfld_dsi_dbi_enter_dsr(struct mdfld_dsi_dbi_output *dbi_output, | 154 | extern void mdfld_dsi_dbi_enter_dsr(struct mdfld_dsi_dbi_output *dbi_output, |
170 | int pipe); | 155 | int pipe); |
171 | extern int mdfld_dbi_dsr_init(struct drm_device *dev); | 156 | extern int mdfld_dbi_dsr_init(struct drm_device *dev); |
172 | extern void mdfld_dbi_dsr_exit(struct drm_device *dev); | 157 | extern void mdfld_dbi_dsr_exit(struct drm_device *dev); |
173 | extern void mdfld_dbi_dsr_timer_start(struct mdfld_dbi_dsr_info *dsr_info); | ||
174 | extern struct mdfld_dsi_encoder *mdfld_dsi_dbi_init(struct drm_device *dev, | 158 | extern struct mdfld_dsi_encoder *mdfld_dsi_dbi_init(struct drm_device *dev, |
175 | struct mdfld_dsi_connector *dsi_connector, | 159 | struct mdfld_dsi_connector *dsi_connector, |
176 | struct panel_funcs *p_funcs); | 160 | struct panel_funcs *p_funcs); |
@@ -178,7 +162,6 @@ extern int mdfld_dsi_dbi_send_dcs(struct mdfld_dsi_dbi_output *dbi_output, | |||
178 | u8 dcs, u8 *param, u32 num, u8 data_src); | 162 | u8 dcs, u8 *param, u32 num, u8 data_src); |
179 | extern int mdfld_dsi_dbi_update_area(struct mdfld_dsi_dbi_output *dbi_output, | 163 | extern int mdfld_dsi_dbi_update_area(struct mdfld_dsi_dbi_output *dbi_output, |
180 | u16 x1, u16 y1, u16 x2, u16 y2); | 164 | u16 x1, u16 y1, u16 x2, u16 y2); |
181 | extern void mdfld_dbi_dsr_timer_start(struct mdfld_dbi_dsr_info *dsr_info); | ||
182 | extern int mdfld_dsi_dbi_update_power(struct mdfld_dsi_dbi_output *dbi_output, | 165 | extern int mdfld_dsi_dbi_update_power(struct mdfld_dsi_dbi_output *dbi_output, |
183 | int mode); | 166 | int mode); |
184 | extern void mdfld_dsi_controller_dbi_init(struct mdfld_dsi_config *dsi_config, | 167 | extern void mdfld_dsi_controller_dbi_init(struct mdfld_dsi_config *dsi_config, |
diff --git a/drivers/staging/gma500/mdfld_dsi_dbi_dpu.h b/drivers/staging/gma500/mdfld_dsi_dbi_dpu.h index 4ca9682c47c5..42367ed48c08 100644 --- a/drivers/staging/gma500/mdfld_dsi_dbi_dpu.h +++ b/drivers/staging/gma500/mdfld_dsi_dbi_dpu.h | |||
@@ -90,9 +90,6 @@ static inline int mdfld_dpu_region_extent(struct psb_drm_dpu_rect *origin, | |||
90 | { | 90 | { |
91 | int x1, y1, x2, y2; | 91 | int x1, y1, x2, y2; |
92 | 92 | ||
93 | /* PSB_DEBUG_ENTRY("rect (%d, %d, %d, %d)\n", | ||
94 | rect->x, rect->y, rect->width, rect->height); */ | ||
95 | |||
96 | x1 = origin->x + origin->width; | 93 | x1 = origin->x + origin->width; |
97 | y1 = origin->y + origin->height; | 94 | y1 = origin->y + origin->height; |
98 | 95 | ||
diff --git a/drivers/staging/gma500/mdfld_dsi_dpi.c b/drivers/staging/gma500/mdfld_dsi_dpi.c index fce3c2031347..6e03a91e947e 100644 --- a/drivers/staging/gma500/mdfld_dsi_dpi.c +++ b/drivers/staging/gma500/mdfld_dsi_dpi.c | |||
@@ -69,26 +69,6 @@ static void mdfld_wait_for_HS_CTRL_FIFO(struct drm_device *dev, u32 pipe) | |||
69 | dev_warn(dev->dev, "MIPI: HS CMD FIFO was never cleared!\n"); | 69 | dev_warn(dev->dev, "MIPI: HS CMD FIFO was never cleared!\n"); |
70 | } | 70 | } |
71 | 71 | ||
72 | static void mdfld_wait_for_PIPEA_DISABLE(struct drm_device *dev, u32 pipe) | ||
73 | { | ||
74 | u32 pipeconf_reg = PIPEACONF; | ||
75 | int timeout = 0; | ||
76 | |||
77 | if (pipe == 2) | ||
78 | pipeconf_reg = PIPECCONF; | ||
79 | |||
80 | udelay(500); | ||
81 | |||
82 | /* This will time out after approximately 2+ seconds */ | ||
83 | while ((timeout < 20000) && (REG_READ(pipeconf_reg) & 0x40000000)) { | ||
84 | udelay(100); | ||
85 | timeout++; | ||
86 | } | ||
87 | |||
88 | if (timeout == 20000) | ||
89 | dev_warn(dev->dev, "MIPI: PIPE was not disabled!\n"); | ||
90 | } | ||
91 | |||
92 | static void mdfld_wait_for_DPI_CTRL_FIFO(struct drm_device *dev, u32 pipe) | 72 | static void mdfld_wait_for_DPI_CTRL_FIFO(struct drm_device *dev, u32 pipe) |
93 | { | 73 | { |
94 | u32 gen_fifo_stat_reg = MIPIA_GEN_FIFO_STAT_REG; | 74 | u32 gen_fifo_stat_reg = MIPIA_GEN_FIFO_STAT_REG; |
@@ -147,8 +127,6 @@ void mdfld_dsi_tpo_ic_init(struct mdfld_dsi_config *dsi_config, u32 pipe) | |||
147 | u32 gen_ctrl_reg = MIPIA_HS_GEN_CTRL_REG; | 127 | u32 gen_ctrl_reg = MIPIA_HS_GEN_CTRL_REG; |
148 | u32 gen_ctrl_val = GEN_LONG_WRITE; | 128 | u32 gen_ctrl_val = GEN_LONG_WRITE; |
149 | 129 | ||
150 | dev_warn(dev->dev, "Enter mrst init TPO MIPI display.\n"); | ||
151 | |||
152 | if (pipe == 2) { | 130 | if (pipe == 2) { |
153 | gen_data_reg = HS_GEN_DATA_REG + MIPIC_REG_OFFSET; | 131 | gen_data_reg = HS_GEN_DATA_REG + MIPIC_REG_OFFSET; |
154 | gen_ctrl_reg = HS_GEN_CTRL_REG + MIPIC_REG_OFFSET; | 132 | gen_ctrl_reg = HS_GEN_CTRL_REG + MIPIC_REG_OFFSET; |
@@ -331,51 +309,8 @@ void mdfld_dsi_tpo_ic_init(struct mdfld_dsi_config *dsi_config, u32 pipe) | |||
331 | REG_WRITE(gen_ctrl_reg, gen_ctrl_val | (0x03 << WORD_COUNTS_POS)); | 309 | REG_WRITE(gen_ctrl_reg, gen_ctrl_val | (0x03 << WORD_COUNTS_POS)); |
332 | } | 310 | } |
333 | 311 | ||
334 | /* ************************************************************************* *\ | 312 | static u16 mdfld_dsi_dpi_to_byte_clock_count(int pixel_clock_count, |
335 | * FUNCTION: mdfld_init_TMD_MIPI | 313 | int num_lane, int bpp) |
336 | * | ||
337 | * DESCRIPTION: This function is called only by mrst_dsi_mode_set and | ||
338 | * restore_display_registers. since this function does not | ||
339 | * acquire the mutex, it is important that the calling function | ||
340 | * does! | ||
341 | \* ************************************************************************* */ | ||
342 | |||
343 | static u32 tmd_cmd_mcap_off[] = {0x000000b2}; | ||
344 | static u32 tmd_cmd_enable_lane_switch[] = {0x000101ef}; | ||
345 | static u32 tmd_cmd_set_lane_num[] = {0x006360ef}; | ||
346 | static u32 tmd_cmd_set_mode[] = {0x000000b3}; | ||
347 | static u32 tmd_cmd_set_sync_pulse_mode[] = {0x000961ef}; | ||
348 | static u32 tmd_cmd_set_video_mode[] = {0x00000153}; | ||
349 | static u32 tmd_cmd_enable_backlight[] = {0x00005ab4};//no auto_bl,need add in furtrue | ||
350 | static u32 tmd_cmd_set_backlight_dimming[] = {0x00000ebd}; | ||
351 | |||
352 | void mdfld_dsi_tmd_drv_ic_init(struct mdfld_dsi_config *dsi_config, u32 pipe) | ||
353 | { | ||
354 | struct mdfld_dsi_pkg_sender *sender = mdfld_dsi_get_pkg_sender(dsi_config); | ||
355 | |||
356 | if(!sender) { | ||
357 | WARN_ON(1); | ||
358 | return; | ||
359 | } | ||
360 | |||
361 | if(dsi_config->dvr_ic_inited) | ||
362 | return; | ||
363 | |||
364 | msleep(3); | ||
365 | |||
366 | mdfld_dsi_send_gen_long_lp(sender, tmd_cmd_mcap_off, 1, 0); | ||
367 | mdfld_dsi_send_gen_long_lp(sender, tmd_cmd_enable_lane_switch, 1, 0); | ||
368 | mdfld_dsi_send_gen_long_lp(sender, tmd_cmd_set_lane_num, 1, 0); | ||
369 | mdfld_dsi_send_gen_long_lp(sender, tmd_cmd_set_mode, 1, 0); | ||
370 | mdfld_dsi_send_gen_long_lp(sender, tmd_cmd_set_sync_pulse_mode, 1, 0); | ||
371 | /*TODO: set page and column here*/ | ||
372 | mdfld_dsi_send_gen_long_lp(sender, tmd_cmd_set_video_mode, 1, 0); | ||
373 | mdfld_dsi_send_gen_long_lp(sender, tmd_cmd_enable_backlight, 1, 0); | ||
374 | mdfld_dsi_send_gen_long_lp(sender, tmd_cmd_set_backlight_dimming,1,0); | ||
375 | dsi_config->dvr_ic_inited = 1; | ||
376 | } | ||
377 | |||
378 | static u16 mdfld_dsi_dpi_to_byte_clock_count(int pixel_clock_count, int num_lane, int bpp) | ||
379 | { | 314 | { |
380 | return (u16)((pixel_clock_count * bpp) / (num_lane * 8)); | 315 | return (u16)((pixel_clock_count * bpp) / (num_lane * 8)); |
381 | } | 316 | } |
@@ -387,8 +322,8 @@ static u16 mdfld_dsi_dpi_to_byte_clock_count(int pixel_clock_count, int num_lane | |||
387 | * use crtc mode values later | 322 | * use crtc mode values later |
388 | */ | 323 | */ |
389 | int mdfld_dsi_dpi_timing_calculation(struct drm_display_mode *mode, | 324 | int mdfld_dsi_dpi_timing_calculation(struct drm_display_mode *mode, |
390 | struct mdfld_dsi_dpi_timing *dpi_timing, | 325 | struct mdfld_dsi_dpi_timing *dpi_timing, |
391 | int num_lane, int bpp) | 326 | int num_lane, int bpp) |
392 | { | 327 | { |
393 | int pclk_hsync, pclk_hfp, pclk_hbp, pclk_hactive; | 328 | int pclk_hsync, pclk_hfp, pclk_hbp, pclk_hactive; |
394 | int pclk_vsync, pclk_vfp, pclk_vbp, pclk_vactive; | 329 | int pclk_vsync, pclk_vfp, pclk_vbp, pclk_vactive; |
@@ -408,16 +343,6 @@ int mdfld_dsi_dpi_timing_calculation(struct drm_display_mode *mode, | |||
408 | pclk_vsync = mode->vsync_end - mode->vsync_start; | 343 | pclk_vsync = mode->vsync_end - mode->vsync_start; |
409 | pclk_vbp = mode->vtotal - mode->vsync_end; | 344 | pclk_vbp = mode->vtotal - mode->vsync_end; |
410 | 345 | ||
411 | #ifdef MIPI_DEBUG_LOG | ||
412 | printk(KERN_ALERT "[DISPLAY] %s: pclk_hactive = %d\n", __func__, pclk_hactive); | ||
413 | printk(KERN_ALERT "[DISPLAY] %s: pclk_hfp = %d\n", __func__, pclk_hfp); | ||
414 | printk(KERN_ALERT "[DISPLAY] %s: pclk_hsync = %d\n", __func__, pclk_hsync); | ||
415 | printk(KERN_ALERT "[DISPLAY] %s: pclk_hbp = %d\n", __func__, pclk_hbp); | ||
416 | printk(KERN_ALERT "[DISPLAY] %s: pclk_vactive = %d\n", __func__, pclk_vactive); | ||
417 | printk(KERN_ALERT "[DISPLAY] %s: pclk_vfp = %d\n", __func__, pclk_vfp); | ||
418 | printk(KERN_ALERT "[DISPLAY] %s: pclk_vsync = %d\n", __func__, pclk_vsync); | ||
419 | printk(KERN_ALERT "[DISPLAY] %s: pclk_vbp = %d\n", __func__, pclk_vbp); | ||
420 | #endif | ||
421 | /* | 346 | /* |
422 | * byte clock counts were calculated by following formula | 347 | * byte clock counts were calculated by following formula |
423 | * bclock_count = pclk_count * bpp / num_lane / 8 | 348 | * bclock_count = pclk_count * bpp / num_lane / 8 |
@@ -519,7 +444,6 @@ void mdfld_dsi_dpi_controller_init(struct mdfld_dsi_config *dsi_config, int pipe | |||
519 | void mdfld_dsi_dpi_turn_on(struct mdfld_dsi_dpi_output *output, int pipe) | 444 | void mdfld_dsi_dpi_turn_on(struct mdfld_dsi_dpi_output *output, int pipe) |
520 | { | 445 | { |
521 | struct drm_device *dev = output->dev; | 446 | struct drm_device *dev = output->dev; |
522 | /* struct drm_psb_private *dev_priv = dev->dev_private; */ | ||
523 | u32 reg_offset = 0; | 447 | u32 reg_offset = 0; |
524 | 448 | ||
525 | if(output->panel_on) | 449 | if(output->panel_on) |
@@ -555,7 +479,6 @@ void mdfld_dsi_dpi_turn_on(struct mdfld_dsi_dpi_output *output, int pipe) | |||
555 | static void mdfld_dsi_dpi_shut_down(struct mdfld_dsi_dpi_output *output, int pipe) | 479 | static void mdfld_dsi_dpi_shut_down(struct mdfld_dsi_dpi_output *output, int pipe) |
556 | { | 480 | { |
557 | struct drm_device *dev = output->dev; | 481 | struct drm_device *dev = output->dev; |
558 | /* struct drm_psb_private *dev_priv = dev->dev_private; */ | ||
559 | u32 reg_offset = 0; | 482 | u32 reg_offset = 0; |
560 | 483 | ||
561 | /*if output is on, or mode setting didn't happen, ignore this*/ | 484 | /*if output is on, or mode setting didn't happen, ignore this*/ |
@@ -576,6 +499,7 @@ static void mdfld_dsi_dpi_shut_down(struct mdfld_dsi_dpi_output *output, int pip | |||
576 | } | 499 | } |
577 | 500 | ||
578 | if(REG_READ(MIPIA_DPI_CONTROL_REG + reg_offset) == DSI_DPI_CTRL_HS_SHUTDOWN) { | 501 | if(REG_READ(MIPIA_DPI_CONTROL_REG + reg_offset) == DSI_DPI_CTRL_HS_SHUTDOWN) { |
502 | dev_warn(dev->dev, "try to send the same package again, abort!"); | ||
579 | goto shutdown_out; | 503 | goto shutdown_out; |
580 | } | 504 | } |
581 | 505 | ||
@@ -590,6 +514,14 @@ shutdown_out: | |||
590 | /* dev_priv->dpi_panel_on2 = false; */ | 514 | /* dev_priv->dpi_panel_on2 = false; */ |
591 | /* else if (pipe == 0) */ | 515 | /* else if (pipe == 0) */ |
592 | /* dev_priv->dpi_panel_on = false; */ | 516 | /* dev_priv->dpi_panel_on = false; */ |
517 | /* #ifdef CONFIG_PM_RUNTIME*/ | ||
518 | /* if (drm_psb_ospm && !enable_gfx_rtpm) { */ | ||
519 | /* pm_runtime_allow(&gpDrmDevice->pdev->dev); */ | ||
520 | /* schedule_delayed_work(&dev_priv->rtpm_work, 30 * 1000); */ | ||
521 | /* } */ | ||
522 | /*if (enable_gfx_rtpm) */ | ||
523 | /* pm_schedule_suspend(&dev->pdev->dev, gfxrtdelay); */ | ||
524 | /* #endif */ | ||
593 | } | 525 | } |
594 | 526 | ||
595 | void mdfld_dsi_dpi_set_power(struct drm_encoder *encoder, bool on) | 527 | void mdfld_dsi_dpi_set_power(struct drm_encoder *encoder, bool on) |
@@ -616,7 +548,7 @@ void mdfld_dsi_dpi_set_power(struct drm_encoder *encoder, bool on) | |||
616 | if (mdfld_get_panel_type(dev, pipe) == TMD_VID){ | 548 | if (mdfld_get_panel_type(dev, pipe) == TMD_VID){ |
617 | mdfld_dsi_dpi_turn_on(dpi_output, pipe); | 549 | mdfld_dsi_dpi_turn_on(dpi_output, pipe); |
618 | } else { | 550 | } else { |
619 | /*enable mipi port*/ | 551 | /* Enable mipi port */ |
620 | REG_WRITE(mipi_reg, (REG_READ(mipi_reg) | (1 << 31))); | 552 | REG_WRITE(mipi_reg, (REG_READ(mipi_reg) | (1 << 31))); |
621 | REG_READ(mipi_reg); | 553 | REG_READ(mipi_reg); |
622 | 554 | ||
@@ -636,7 +568,7 @@ void mdfld_dsi_dpi_set_power(struct drm_encoder *encoder, bool on) | |||
636 | mdfld_dsi_dpi_shut_down(dpi_output, pipe); | 568 | mdfld_dsi_dpi_shut_down(dpi_output, pipe); |
637 | } else { | 569 | } else { |
638 | mdfld_dsi_dpi_shut_down(dpi_output, pipe); | 570 | mdfld_dsi_dpi_shut_down(dpi_output, pipe); |
639 | /*disable mipi port*/ | 571 | /* Disable mipi port */ |
640 | REG_WRITE(mipi_reg, (REG_READ(mipi_reg) & ~(1<<31))); | 572 | REG_WRITE(mipi_reg, (REG_READ(mipi_reg) & ~(1<<31))); |
641 | REG_READ(mipi_reg); | 573 | REG_READ(mipi_reg); |
642 | } | 574 | } |
@@ -656,8 +588,15 @@ void mdfld_dsi_dpi_dpms(struct drm_encoder *encoder, int mode) | |||
656 | 588 | ||
657 | if (mode == DRM_MODE_DPMS_ON) | 589 | if (mode == DRM_MODE_DPMS_ON) |
658 | mdfld_dsi_dpi_set_power(encoder, true); | 590 | mdfld_dsi_dpi_set_power(encoder, true); |
659 | else | 591 | else { |
660 | mdfld_dsi_dpi_set_power(encoder, false); | 592 | mdfld_dsi_dpi_set_power(encoder, false); |
593 | #if 0 /* FIXME */ | ||
594 | #ifdef CONFIG_PM_RUNTIME | ||
595 | if (enable_gfx_rtpm) | ||
596 | pm_schedule_suspend(&gpDrmDevice->pdev->dev, gfxrtdelay); | ||
597 | #endif | ||
598 | #endif | ||
599 | } | ||
661 | } | 600 | } |
662 | 601 | ||
663 | bool mdfld_dsi_dpi_mode_fixup(struct drm_encoder *encoder, | 602 | bool mdfld_dsi_dpi_mode_fixup(struct drm_encoder *encoder, |
@@ -694,77 +633,6 @@ void mdfld_dsi_dpi_commit(struct drm_encoder *encoder) | |||
694 | mdfld_dsi_dpi_set_power(encoder, true); | 633 | mdfld_dsi_dpi_set_power(encoder, true); |
695 | } | 634 | } |
696 | 635 | ||
697 | void dsi_debug_MIPI_reg(struct drm_device *dev) | ||
698 | { | ||
699 | u32 temp_val = 0; | ||
700 | |||
701 | temp_val = REG_READ(MIPI); | ||
702 | printk(KERN_ALERT "[DISPLAY] MIPI = %x\n", temp_val); | ||
703 | |||
704 | /* set the lane speed */ | ||
705 | temp_val = REG_READ(MIPI_CONTROL_REG); | ||
706 | printk(KERN_ALERT "[DISPLAY] MIPI_CONTROL_REG = %x\n", temp_val); | ||
707 | |||
708 | /* Enable all the error interrupt */ | ||
709 | temp_val = REG_READ(INTR_EN_REG); | ||
710 | printk(KERN_ALERT "[DISPLAY] INTR_EN_REG = %x\n", temp_val); | ||
711 | temp_val = REG_READ(TURN_AROUND_TIMEOUT_REG); | ||
712 | printk(KERN_ALERT "[DISPLAY] TURN_AROUND_TIMEOUT_REG = %x\n", temp_val); | ||
713 | temp_val = REG_READ(DEVICE_RESET_REG); | ||
714 | printk(KERN_ALERT "[DISPLAY] DEVICE_RESET_REG = %x\n", temp_val); | ||
715 | temp_val = REG_READ(INIT_COUNT_REG); | ||
716 | printk(KERN_ALERT "[DISPLAY] INIT_COUNT_REG = %x\n", temp_val); | ||
717 | |||
718 | temp_val = REG_READ(DSI_FUNC_PRG_REG); | ||
719 | printk(KERN_ALERT "[DISPLAY] DSI_FUNC_PRG_REG = %x\n", temp_val); | ||
720 | |||
721 | temp_val = REG_READ(DPI_RESOLUTION_REG); | ||
722 | printk(KERN_ALERT "[DISPLAY] DPI_RESOLUTION_REG = %x\n", temp_val); | ||
723 | |||
724 | temp_val = REG_READ(VERT_SYNC_PAD_COUNT_REG); | ||
725 | printk(KERN_ALERT "[DISPLAY] VERT_SYNC_PAD_COUNT_REG = %x\n", temp_val); | ||
726 | temp_val = REG_READ(VERT_BACK_PORCH_COUNT_REG); | ||
727 | printk(KERN_ALERT "[DISPLAY] VERT_BACK_PORCH_COUNT_REG = %x\n", temp_val); | ||
728 | temp_val = REG_READ(VERT_FRONT_PORCH_COUNT_REG); | ||
729 | printk(KERN_ALERT "[DISPLAY] VERT_FRONT_PORCH_COUNT_REG = %x\n", temp_val); | ||
730 | |||
731 | temp_val = REG_READ(HORIZ_SYNC_PAD_COUNT_REG); | ||
732 | printk(KERN_ALERT "[DISPLAY] HORIZ_SYNC_PAD_COUNT_REG = %x\n", temp_val); | ||
733 | temp_val = REG_READ(HORIZ_BACK_PORCH_COUNT_REG); | ||
734 | printk(KERN_ALERT "[DISPLAY] HORIZ_BACK_PORCH_COUNT_REG = %x\n", temp_val); | ||
735 | temp_val = REG_READ(HORIZ_FRONT_PORCH_COUNT_REG); | ||
736 | printk(KERN_ALERT "[DISPLAY] HORIZ_FRONT_PORCH_COUNT_REG = %x\n", temp_val); | ||
737 | temp_val = REG_READ(HORIZ_ACTIVE_AREA_COUNT_REG); | ||
738 | printk(KERN_ALERT "[DISPLAY] HORIZ_ACTIVE_AREA_COUNT_REG = %x\n", temp_val); | ||
739 | |||
740 | temp_val = REG_READ(VIDEO_FMT_REG); | ||
741 | printk(KERN_ALERT "[DISPLAY] VIDEO_FMT_REG = %x\n", temp_val); | ||
742 | |||
743 | temp_val = REG_READ(HS_TX_TIMEOUT_REG); | ||
744 | printk(KERN_ALERT "[DISPLAY] HS_TX_TIMEOUT_REG = %x\n", temp_val); | ||
745 | temp_val = REG_READ(LP_RX_TIMEOUT_REG); | ||
746 | printk(KERN_ALERT "[DISPLAY] LP_RX_TIMEOUT_REG = %x\n", temp_val); | ||
747 | |||
748 | temp_val = REG_READ(HIGH_LOW_SWITCH_COUNT_REG); | ||
749 | printk(KERN_ALERT "[DISPLAY] HIGH_LOW_SWITCH_COUNT_REG = %x\n", temp_val); | ||
750 | |||
751 | temp_val = REG_READ(EOT_DISABLE_REG); | ||
752 | printk(KERN_ALERT "[DISPLAY] EOT_DISABLE_REG = %x\n", temp_val); | ||
753 | |||
754 | temp_val = REG_READ(LP_BYTECLK_REG); | ||
755 | printk(KERN_ALERT "[DISPLAY] LP_BYTECLK_REG = %x\n", temp_val); | ||
756 | temp_val = REG_READ(MAX_RET_PAK_REG); | ||
757 | printk(KERN_ALERT "[DISPLAY] MAX_RET_PAK_REG = %x\n", temp_val); | ||
758 | temp_val = REG_READ(DPI_CONTROL_REG); | ||
759 | printk(KERN_ALERT "[DISPLAY] DPI_CONTROL_REG = %x\n", temp_val); | ||
760 | temp_val = REG_READ(DPHY_PARAM_REG); | ||
761 | printk(KERN_ALERT "[DISPLAY] DPHY_PARAM_REG = %x\n", temp_val); | ||
762 | // temp_val = REG_READ(PIPEACONF); | ||
763 | // printk(KERN_INFO "[DISPLAY] PIPEACONF = %x\n", temp_val); | ||
764 | // temp_val = REG_READ(DSPACNTR); | ||
765 | // printk(KERN_INFO "[DISPLAY] DSPACNTR = %x\n", temp_val); | ||
766 | } | ||
767 | |||
768 | void mdfld_dsi_dpi_mode_set(struct drm_encoder *encoder, | 636 | void mdfld_dsi_dpi_mode_set(struct drm_encoder *encoder, |
769 | struct drm_display_mode *mode, | 637 | struct drm_display_mode *mode, |
770 | struct drm_display_mode *adjusted_mode) | 638 | struct drm_display_mode *adjusted_mode) |
@@ -804,14 +672,11 @@ void mdfld_dsi_dpi_mode_set(struct drm_encoder *encoder, | |||
804 | REG_WRITE(mipi_reg, mipi); | 672 | REG_WRITE(mipi_reg, mipi); |
805 | REG_READ(mipi_reg); | 673 | REG_READ(mipi_reg); |
806 | 674 | ||
807 | /* Set up DSI controller DPI interface*/ | 675 | /* Set up DSI controller DPI interface */ |
808 | mdfld_dsi_dpi_controller_init(dsi_config, pipe); | 676 | mdfld_dsi_dpi_controller_init(dsi_config, pipe); |
809 | 677 | ||
810 | if (mdfld_get_panel_type(dev, pipe) == TMD_VID) { | 678 | if (mdfld_get_panel_type(dev, pipe) != TMD_VID) { |
811 | /* init driver ic */ | 679 | /* Turn on DPI interface */ |
812 | mdfld_dsi_tmd_drv_ic_init(dsi_config, pipe); | ||
813 | } else { | ||
814 | /*turn on DPI interface*/ | ||
815 | mdfld_dsi_dpi_turn_on(dpi_output, pipe); | 680 | mdfld_dsi_dpi_turn_on(dpi_output, pipe); |
816 | } | 681 | } |
817 | 682 | ||
@@ -829,81 +694,15 @@ void mdfld_dsi_dpi_mode_set(struct drm_encoder *encoder, | |||
829 | REG_READ(MIPIA_INTR_STAT_REG + reg_offset), | 694 | REG_READ(MIPIA_INTR_STAT_REG + reg_offset), |
830 | dpi_output->panel_on); | 695 | dpi_output->panel_on); |
831 | 696 | ||
832 | if (mdfld_get_panel_type(dev, pipe) == TMD_VID) { | 697 | if (mdfld_get_panel_type(dev, pipe) != TMD_VID) { |
833 | //mdfld_dsi_dpi_turn_on(dpi_output, pipe); | 698 | /* Init driver ic */ |
834 | } else { | ||
835 | /* init driver ic */ | ||
836 | mdfld_dsi_tpo_ic_init(dsi_config, pipe); | 699 | mdfld_dsi_tpo_ic_init(dsi_config, pipe); |
837 | /*init backlight*/ | 700 | /* Init backlight */ |
838 | mdfld_dsi_brightness_init(dsi_config, pipe); | 701 | mdfld_dsi_brightness_init(dsi_config, pipe); |
839 | } | 702 | } |
840 | |||
841 | #ifdef MIPI_DEBUG_LOG | ||
842 | dsi_debug_MIPI_reg(dev); | ||
843 | #endif | ||
844 | gma_power_end(dev); | 703 | gma_power_end(dev); |
845 | } | 704 | } |
846 | 705 | ||
847 | static int mdfld_dpi_panel_reset(int pipe) | ||
848 | { | ||
849 | unsigned gpio; | ||
850 | int ret = 0; | ||
851 | |||
852 | switch(pipe) { | ||
853 | case 0: | ||
854 | gpio = 128; | ||
855 | break; | ||
856 | case 2: | ||
857 | gpio = 34; | ||
858 | break; | ||
859 | default: | ||
860 | DRM_ERROR("Invalid output\n"); | ||
861 | return -EINVAL; | ||
862 | } | ||
863 | |||
864 | ret = gpio_request(gpio, "gfx"); | ||
865 | if(ret) { | ||
866 | DRM_ERROR("gpio_rqueset failed\n"); | ||
867 | return ret; | ||
868 | } | ||
869 | ret = gpio_direction_output(gpio, 1); | ||
870 | if(ret) { | ||
871 | DRM_ERROR("gpio_direction_output failed\n"); | ||
872 | goto gpio_error; | ||
873 | } | ||
874 | |||
875 | gpio_get_value(128); | ||
876 | |||
877 | gpio_error: | ||
878 | if(gpio_is_valid(gpio)) | ||
879 | gpio_free(gpio); | ||
880 | return ret; | ||
881 | } | ||
882 | |||
883 | /** | ||
884 | * Exit from DSR | ||
885 | */ | ||
886 | void mdfld_dsi_dpi_exit_idle (struct drm_device *dev, u32 update_src, void *p_surfaceAddr, bool check_hw_on_only) | ||
887 | { | ||
888 | struct drm_psb_private *dev_priv = dev->dev_private; | ||
889 | |||
890 | if (!gma_power_begin(dev, true)) { | ||
891 | DRM_ERROR("hw begin failed\n"); | ||
892 | return; | ||
893 | } | ||
894 | |||
895 | /* update the surface base address. */ | ||
896 | if (p_surfaceAddr) { | ||
897 | REG_WRITE(DSPASURF, *((u32 *)p_surfaceAddr)); | ||
898 | #if defined(CONFIG_MDFD_DUAL_MIPI) | ||
899 | REG_WRITE(DSPCSURF, *((u32 *)p_surfaceAddr)); | ||
900 | #endif | ||
901 | } | ||
902 | mid_enable_pipe_event(dev_priv, 0); | ||
903 | psb_enable_pipestat(dev_priv, 0, PIPE_VBLANK_INTERRUPT_ENABLE); | ||
904 | dev_priv->is_in_idle = false; | ||
905 | dev_priv->dsr_idle_count = 0; | ||
906 | } | ||
907 | 706 | ||
908 | /* | 707 | /* |
909 | * Init DSI DPI encoder. | 708 | * Init DSI DPI encoder. |
@@ -912,40 +711,63 @@ void mdfld_dsi_dpi_exit_idle (struct drm_device *dev, u32 update_src, void *p_su | |||
912 | */ | 711 | */ |
913 | struct mdfld_dsi_encoder *mdfld_dsi_dpi_init(struct drm_device *dev, | 712 | struct mdfld_dsi_encoder *mdfld_dsi_dpi_init(struct drm_device *dev, |
914 | struct mdfld_dsi_connector *dsi_connector, | 713 | struct mdfld_dsi_connector *dsi_connector, |
915 | struct panel_funcs*p_funcs) | 714 | struct panel_funcs *p_funcs) |
916 | { | 715 | { |
917 | struct drm_psb_private *dev_priv = dev->dev_private; | ||
918 | struct mdfld_dsi_dpi_output *dpi_output = NULL; | 716 | struct mdfld_dsi_dpi_output *dpi_output = NULL; |
919 | struct mdfld_dsi_config *dsi_config; | 717 | struct mdfld_dsi_config *dsi_config; |
920 | struct drm_connector *connector = NULL; | 718 | struct drm_connector *connector = NULL; |
921 | struct drm_encoder *encoder = NULL; | 719 | struct drm_encoder *encoder = NULL; |
922 | struct drm_display_mode *fixed_mode = NULL; | 720 | struct drm_display_mode *fixed_mode = NULL; |
721 | int pipe; | ||
722 | u32 data; | ||
923 | int ret; | 723 | int ret; |
924 | 724 | ||
925 | if (!dsi_connector) { | 725 | if (!dsi_connector || !p_funcs) { |
926 | WARN_ON(1); | 726 | WARN_ON(1); |
927 | return NULL; | 727 | return NULL; |
928 | } | 728 | } |
929 | 729 | ||
730 | dsi_config = mdfld_dsi_get_config(dsi_connector); | ||
731 | pipe = dsi_connector->pipe; | ||
732 | |||
733 | /* Panel hard-reset */ | ||
734 | if (p_funcs->reset) { | ||
735 | ret = p_funcs->reset(pipe); | ||
736 | if (ret) { | ||
737 | DRM_ERROR("Panel %d hard-reset failed\n", pipe); | ||
738 | return NULL; | ||
739 | } | ||
740 | } | ||
741 | |||
742 | /* Panel drvIC init */ | ||
743 | if (p_funcs->drv_ic_init) | ||
744 | p_funcs->drv_ic_init(dsi_config, pipe); | ||
745 | |||
746 | /* Panel power mode detect */ | ||
747 | ret = mdfld_dsi_get_power_mode(dsi_config, | ||
748 | &data, | ||
749 | MDFLD_DSI_LP_TRANSMISSION); | ||
750 | if (ret) { | ||
751 | DRM_ERROR("Panel %d get power mode failed\n", pipe); | ||
752 | dsi_connector->status = connector_status_disconnected; | ||
753 | } else { | ||
754 | DRM_INFO("pipe %d power mode 0x%x\n", pipe, data); | ||
755 | dsi_connector->status = connector_status_connected; | ||
756 | } | ||
757 | |||
930 | dpi_output = kzalloc(sizeof(struct mdfld_dsi_dpi_output), GFP_KERNEL); | 758 | dpi_output = kzalloc(sizeof(struct mdfld_dsi_dpi_output), GFP_KERNEL); |
931 | if(!dpi_output) { | 759 | if(!dpi_output) { |
932 | dev_err(dev->dev, "No memory for dsi_dpi_output\n"); | 760 | dev_err(dev->dev, "No memory for dsi_dpi_output\n"); |
933 | return NULL; | 761 | return NULL; |
934 | } | 762 | } |
935 | /* Panel reset */ | 763 | |
936 | ret = mdfld_dpi_panel_reset(dsi_connector->pipe); | ||
937 | if(ret) { | ||
938 | DRM_ERROR("reset panel error\n"); | ||
939 | goto out_err1; | ||
940 | } | ||
941 | |||
942 | if(dsi_connector->pipe) | 764 | if(dsi_connector->pipe) |
943 | dpi_output->panel_on = 0; | 765 | dpi_output->panel_on = 0; |
944 | 766 | else | |
945 | dpi_output->panel_on = 0; | 767 | dpi_output->panel_on = 0; |
946 | 768 | ||
947 | |||
948 | dpi_output->dev = dev; | 769 | dpi_output->dev = dev; |
770 | dpi_output->p_funcs = p_funcs; | ||
949 | dpi_output->first_boot = 1; | 771 | dpi_output->first_boot = 1; |
950 | 772 | ||
951 | /* Get fixed mode */ | 773 | /* Get fixed mode */ |
@@ -973,19 +795,6 @@ struct mdfld_dsi_encoder *mdfld_dsi_dpi_init(struct drm_device *dev, | |||
973 | encoder->possible_crtcs = (1 << 0); | 795 | encoder->possible_crtcs = (1 << 0); |
974 | encoder->possible_clones = (1 << 0); | 796 | encoder->possible_clones = (1 << 0); |
975 | } | 797 | } |
976 | |||
977 | dev_priv->dsr_fb_update = 0; | ||
978 | dev_priv->dsr_enable = false; | ||
979 | dev_priv->exit_idle = mdfld_dsi_dpi_exit_idle; | ||
980 | #if defined(CONFIG_MDFLD_DSI_DPU) || defined(CONFIG_MDFLD_DSI_DSR) | ||
981 | dev_priv->dsr_enable_config = true; | ||
982 | #endif /*CONFIG_MDFLD_DSI_DSR*/ | ||
983 | |||
984 | return &dpi_output->base; | 798 | return &dpi_output->base; |
985 | |||
986 | out_err1: | ||
987 | if(dpi_output) | ||
988 | kfree(dpi_output); | ||
989 | return NULL; | ||
990 | } | 799 | } |
991 | 800 | ||
diff --git a/drivers/staging/gma500/mdfld_dsi_dpi.h b/drivers/staging/gma500/mdfld_dsi_dpi.h index 68e65cce2a76..ed92d45ee74a 100644 --- a/drivers/staging/gma500/mdfld_dsi_dpi.h +++ b/drivers/staging/gma500/mdfld_dsi_dpi.h | |||
@@ -47,6 +47,8 @@ struct mdfld_dsi_dpi_output { | |||
47 | 47 | ||
48 | int panel_on; | 48 | int panel_on; |
49 | int first_boot; | 49 | int first_boot; |
50 | |||
51 | struct panel_funcs *p_funcs; | ||
50 | }; | 52 | }; |
51 | 53 | ||
52 | #define MDFLD_DSI_DPI_OUTPUT(dsi_encoder) \ | 54 | #define MDFLD_DSI_DPI_OUTPUT(dsi_encoder) \ |
@@ -73,8 +75,4 @@ extern void mdfld_dsi_dpi_turn_on(struct mdfld_dsi_dpi_output *output, | |||
73 | int pipe); | 75 | int pipe); |
74 | extern void mdfld_dsi_dpi_controller_init(struct mdfld_dsi_config *si_config, | 76 | extern void mdfld_dsi_dpi_controller_init(struct mdfld_dsi_config *si_config, |
75 | int pipe); | 77 | int pipe); |
76 | extern void mid_enable_pipe_event(struct drm_psb_private *dev_priv, int pipe); | ||
77 | extern void psb_enable_pipestat(struct drm_psb_private *dev_priv, int pipe, | ||
78 | u32 mask); | ||
79 | |||
80 | #endif /*__MDFLD_DSI_DPI_H__*/ | 78 | #endif /*__MDFLD_DSI_DPI_H__*/ |
diff --git a/drivers/staging/gma500/mdfld_dsi_output.c b/drivers/staging/gma500/mdfld_dsi_output.c index ff75ece9dcf8..3286c3da4d70 100644 --- a/drivers/staging/gma500/mdfld_dsi_output.c +++ b/drivers/staging/gma500/mdfld_dsi_output.c | |||
@@ -35,55 +35,18 @@ | |||
35 | 35 | ||
36 | #define MDFLD_DSI_BRIGHTNESS_MAX_LEVEL 100 | 36 | #define MDFLD_DSI_BRIGHTNESS_MAX_LEVEL 100 |
37 | 37 | ||
38 | /* get the CABC LABC from command line. */ | ||
39 | static int CABC_control = 1; | 38 | static int CABC_control = 1; |
40 | static int LABC_control = 1; | 39 | static int LABC_control = 1; |
41 | 40 | ||
42 | #ifdef MODULE | ||
43 | module_param (CABC_control, int, 0644); | 41 | module_param (CABC_control, int, 0644); |
44 | module_param (LABC_control, int, 0644); | 42 | module_param (LABC_control, int, 0644); |
45 | #else | ||
46 | static int __init parse_CABC_control(char *arg) | ||
47 | { | ||
48 | /* CABC control can be passed in as a cmdline parameter */ | ||
49 | /* to enable this feature add CABC=1 to cmdline */ | ||
50 | /* to disable this feature add CABC=0 to cmdline */ | ||
51 | if (!arg) | ||
52 | return -EINVAL; | ||
53 | |||
54 | if (!strcasecmp(arg, "0")) | ||
55 | CABC_control = 0; | ||
56 | else if (!strcasecmp (arg, "1")) | ||
57 | CABC_control = 1; | ||
58 | |||
59 | return 0; | ||
60 | } | ||
61 | early_param ("CABC", parse_CABC_control); | ||
62 | |||
63 | static int __init parse_LABC_control(char *arg) | ||
64 | { | ||
65 | /* LABC control can be passed in as a cmdline parameter */ | ||
66 | /* to enable this feature add LABC=1 to cmdline */ | ||
67 | /* to disable this feature add LABC=0 to cmdline */ | ||
68 | if (!arg) | ||
69 | return -EINVAL; | ||
70 | |||
71 | if (!strcasecmp(arg, "0")) | ||
72 | LABC_control = 0; | ||
73 | else if (!strcasecmp (arg, "1")) | ||
74 | LABC_control = 1; | ||
75 | |||
76 | return 0; | ||
77 | } | ||
78 | early_param ("LABC", parse_LABC_control); | ||
79 | #endif | ||
80 | 43 | ||
81 | /** | 44 | /** |
82 | * make these MCS command global | 45 | * make these MCS command global |
83 | * we don't need 'movl' everytime we send them. | 46 | * we don't need 'movl' everytime we send them. |
84 | * FIXME: these datas were provided by OEM, we should get them from GCT. | 47 | * FIXME: these datas were provided by OEM, we should get them from GCT. |
85 | **/ | 48 | **/ |
86 | static u32 mdfld_dbi_mcs_hysteresis[] = { | 49 | static const u32 mdfld_dbi_mcs_hysteresis[] = { |
87 | 0x42000f57, 0x8c006400, 0xff00bf00, 0xffffffff, | 50 | 0x42000f57, 0x8c006400, 0xff00bf00, 0xffffffff, |
88 | 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, | 51 | 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, |
89 | 0x38000aff, 0x82005000, 0xff00ab00, 0xffffffff, | 52 | 0x38000aff, 0x82005000, 0xff00ab00, 0xffffffff, |
@@ -91,25 +54,26 @@ static u32 mdfld_dbi_mcs_hysteresis[] = { | |||
91 | 0x000000ff, | 54 | 0x000000ff, |
92 | }; | 55 | }; |
93 | 56 | ||
94 | static u32 mdfld_dbi_mcs_display_profile[] = { | 57 | static const u32 mdfld_dbi_mcs_display_profile[] = { |
95 | 0x50281450, 0x0000c882, 0x00000000, 0x00000000, | 58 | 0x50281450, 0x0000c882, 0x00000000, 0x00000000, |
96 | 0x00000000, | 59 | 0x00000000, |
97 | }; | 60 | }; |
98 | 61 | ||
99 | static u32 mdfld_dbi_mcs_kbbc_profile[] = { | 62 | static const u32 mdfld_dbi_mcs_kbbc_profile[] = { |
100 | 0x00ffcc60, 0x00000000, 0x00000000, 0x00000000, | 63 | 0x00ffcc60, 0x00000000, 0x00000000, 0x00000000, |
101 | }; | 64 | }; |
102 | 65 | ||
103 | static u32 mdfld_dbi_mcs_gamma_profile[] = { | 66 | static const u32 mdfld_dbi_mcs_gamma_profile[] = { |
104 | 0x81111158, 0x88888888, 0x88888888, | 67 | 0x81111158, 0x88888888, 0x88888888, |
105 | }; | 68 | }; |
106 | 69 | ||
107 | /* | 70 | /* |
108 | * write hysteresis values. | 71 | * write hysteresis values. |
109 | */ | 72 | */ |
110 | static void mdfld_dsi_write_hysteresis (struct mdfld_dsi_config * dsi_config, int pipe) | 73 | static void mdfld_dsi_write_hysteresis (struct mdfld_dsi_config *dsi_config, |
74 | int pipe) | ||
111 | { | 75 | { |
112 | struct mdfld_dsi_pkg_sender * sender = mdfld_dsi_get_pkg_sender(dsi_config); | 76 | struct mdfld_dsi_pkg_sender *sender = mdfld_dsi_get_pkg_sender(dsi_config); |
113 | 77 | ||
114 | if(!sender) { | 78 | if(!sender) { |
115 | WARN_ON(1); | 79 | WARN_ON(1); |
@@ -124,9 +88,9 @@ static void mdfld_dsi_write_hysteresis (struct mdfld_dsi_config * dsi_config, in | |||
124 | /* | 88 | /* |
125 | * write display profile values. | 89 | * write display profile values. |
126 | */ | 90 | */ |
127 | static void mdfld_dsi_write_display_profile (struct mdfld_dsi_config * dsi_config, int pipe) | 91 | static void mdfld_dsi_write_display_profile(struct mdfld_dsi_config *dsi_config, int pipe) |
128 | { | 92 | { |
129 | struct mdfld_dsi_pkg_sender * sender = mdfld_dsi_get_pkg_sender(dsi_config); | 93 | struct mdfld_dsi_pkg_sender *sender = mdfld_dsi_get_pkg_sender(dsi_config); |
130 | 94 | ||
131 | if(!sender) { | 95 | if(!sender) { |
132 | WARN_ON(1); | 96 | WARN_ON(1); |
@@ -143,7 +107,7 @@ static void mdfld_dsi_write_display_profile (struct mdfld_dsi_config * dsi_confi | |||
143 | */ | 107 | */ |
144 | static void mdfld_dsi_write_kbbc_profile (struct mdfld_dsi_config * dsi_config, int pipe) | 108 | static void mdfld_dsi_write_kbbc_profile (struct mdfld_dsi_config * dsi_config, int pipe) |
145 | { | 109 | { |
146 | struct mdfld_dsi_pkg_sender * sender = mdfld_dsi_get_pkg_sender(dsi_config); | 110 | struct mdfld_dsi_pkg_sender *sender = mdfld_dsi_get_pkg_sender(dsi_config); |
147 | 111 | ||
148 | if(!sender) { | 112 | if(!sender) { |
149 | WARN_ON(1); | 113 | WARN_ON(1); |
@@ -155,12 +119,12 @@ static void mdfld_dsi_write_kbbc_profile (struct mdfld_dsi_config * dsi_config, | |||
155 | MDFLD_DSI_SEND_PACKAGE); | 119 | MDFLD_DSI_SEND_PACKAGE); |
156 | } | 120 | } |
157 | 121 | ||
158 | /** | 122 | /* |
159 | * write gamma setting. | 123 | * write gamma setting. |
160 | */ | 124 | */ |
161 | static void mdfld_dsi_write_gamma_setting (struct mdfld_dsi_config * dsi_config, int pipe) | 125 | static void mdfld_dsi_write_gamma_setting (struct mdfld_dsi_config *dsi_config, int pipe) |
162 | { | 126 | { |
163 | struct mdfld_dsi_pkg_sender * sender = mdfld_dsi_get_pkg_sender(dsi_config); | 127 | struct mdfld_dsi_pkg_sender *sender = mdfld_dsi_get_pkg_sender(dsi_config); |
164 | 128 | ||
165 | if(!sender) { | 129 | if(!sender) { |
166 | WARN_ON(1); | 130 | WARN_ON(1); |
@@ -172,7 +136,7 @@ static void mdfld_dsi_write_gamma_setting (struct mdfld_dsi_config * dsi_config, | |||
172 | MDFLD_DSI_SEND_PACKAGE); | 136 | MDFLD_DSI_SEND_PACKAGE); |
173 | } | 137 | } |
174 | 138 | ||
175 | /** | 139 | /* |
176 | * Check and see if the generic control or data buffer is empty and ready. | 140 | * Check and see if the generic control or data buffer is empty and ready. |
177 | */ | 141 | */ |
178 | void mdfld_dsi_gen_fifo_ready (struct drm_device *dev, u32 gen_fifo_stat_reg, u32 fifo_stat) | 142 | void mdfld_dsi_gen_fifo_ready (struct drm_device *dev, u32 gen_fifo_stat_reg, u32 fifo_stat) |
@@ -193,16 +157,16 @@ void mdfld_dsi_gen_fifo_ready (struct drm_device *dev, u32 gen_fifo_stat_reg, u3 | |||
193 | gen_fifo_stat_reg); | 157 | gen_fifo_stat_reg); |
194 | } | 158 | } |
195 | 159 | ||
196 | /** | 160 | /* |
197 | * Manage the DSI MIPI keyboard and display brightness. | 161 | * Manage the DSI MIPI keyboard and display brightness. |
198 | * FIXME: this is exported to OSPM code. should work out an specific | 162 | * FIXME: this is exported to OSPM code. should work out an specific |
199 | * display interface to OSPM. | 163 | * display interface to OSPM. |
200 | */ | 164 | */ |
201 | void mdfld_dsi_brightness_init (struct mdfld_dsi_config * dsi_config, int pipe) | 165 | void mdfld_dsi_brightness_init(struct mdfld_dsi_config *dsi_config, int pipe) |
202 | { | 166 | { |
203 | struct mdfld_dsi_pkg_sender * sender = mdfld_dsi_get_pkg_sender(dsi_config); | 167 | struct mdfld_dsi_pkg_sender *sender = mdfld_dsi_get_pkg_sender(dsi_config); |
204 | struct drm_device * dev = sender->dev; | 168 | struct drm_device *dev = sender->dev; |
205 | struct drm_psb_private * dev_priv = dev->dev_private; | 169 | struct drm_psb_private *dev_priv = dev->dev_private; |
206 | u32 gen_ctrl_val; | 170 | u32 gen_ctrl_val; |
207 | 171 | ||
208 | if(!sender) { | 172 | if(!sender) { |
@@ -223,7 +187,7 @@ void mdfld_dsi_brightness_init (struct mdfld_dsi_config * dsi_config, int pipe) | |||
223 | 1, | 187 | 1, |
224 | MDFLD_DSI_SEND_PACKAGE); | 188 | MDFLD_DSI_SEND_PACKAGE); |
225 | 189 | ||
226 | mdfld_dsi_write_hysteresis (dsi_config, pipe); | 190 | mdfld_dsi_write_hysteresis(dsi_config, pipe); |
227 | mdfld_dsi_write_display_profile (dsi_config, pipe); | 191 | mdfld_dsi_write_display_profile (dsi_config, pipe); |
228 | mdfld_dsi_write_kbbc_profile (dsi_config, pipe); | 192 | mdfld_dsi_write_kbbc_profile (dsi_config, pipe); |
229 | mdfld_dsi_write_gamma_setting (dsi_config, pipe); | 193 | mdfld_dsi_write_gamma_setting (dsi_config, pipe); |
@@ -253,7 +217,7 @@ void mdfld_dsi_brightness_init (struct mdfld_dsi_config * dsi_config, int pipe) | |||
253 | MDFLD_DSI_SEND_PACKAGE); | 217 | MDFLD_DSI_SEND_PACKAGE); |
254 | } | 218 | } |
255 | 219 | ||
256 | /** | 220 | /* |
257 | * Manage the mipi display brightness. | 221 | * Manage the mipi display brightness. |
258 | * TODO: refine this interface later | 222 | * TODO: refine this interface later |
259 | */ | 223 | */ |
@@ -262,8 +226,8 @@ void mdfld_dsi_brightness_control(struct drm_device *dev, int pipe, int level) | |||
262 | struct mdfld_dsi_pkg_sender *sender; | 226 | struct mdfld_dsi_pkg_sender *sender; |
263 | struct drm_psb_private *dev_priv; | 227 | struct drm_psb_private *dev_priv; |
264 | struct mdfld_dsi_config *dsi_config; | 228 | struct mdfld_dsi_config *dsi_config; |
265 | u32 gen_ctrl_val = 0; | 229 | u32 gen_ctrl_val; |
266 | int p_type = TMD_VID; | 230 | int p_type; |
267 | 231 | ||
268 | if (!dev || (pipe != 0 && pipe != 2)) { | 232 | if (!dev || (pipe != 0 && pipe != 2)) { |
269 | dev_err(dev->dev, "Invalid parameter\n"); | 233 | dev_err(dev->dev, "Invalid parameter\n"); |
@@ -288,7 +252,8 @@ void mdfld_dsi_brightness_control(struct drm_device *dev, int pipe, int level) | |||
288 | 252 | ||
289 | gen_ctrl_val = ((level * 0xff) / MDFLD_DSI_BRIGHTNESS_MAX_LEVEL) & 0xff; | 253 | gen_ctrl_val = ((level * 0xff) / MDFLD_DSI_BRIGHTNESS_MAX_LEVEL) & 0xff; |
290 | 254 | ||
291 | dev_dbg(dev->dev, "pipe = %d, gen_ctrl_val = %d. \n", pipe, gen_ctrl_val); | 255 | dev_dbg(dev->dev, |
256 | "pipe = %d, gen_ctrl_val = %d. \n", pipe, gen_ctrl_val); | ||
292 | 257 | ||
293 | if(p_type == TMD_VID || p_type == TMD_CMD){ | 258 | if(p_type == TMD_VID || p_type == TMD_CMD){ |
294 | /* Set display backlight value */ | 259 | /* Set display backlight value */ |
@@ -344,7 +309,7 @@ void mdfld_dsi_controller_shutdown(struct mdfld_dsi_config * dsi_config, int pip | |||
344 | if(!(REG_READ(MIPIA_DEVICE_READY_REG + reg_offset) & DSI_DEVICE_READY)) | 309 | if(!(REG_READ(MIPIA_DEVICE_READY_REG + reg_offset) & DSI_DEVICE_READY)) |
345 | goto shutdown_out; | 310 | goto shutdown_out; |
346 | 311 | ||
347 | /*send shut down package, clean packet send bit first*/ | 312 | /* Send shut down package, clean packet send bit first */ |
348 | if(REG_READ(MIPIA_INTR_STAT_REG + reg_offset) & DSI_INTR_STATE_SPL_PKG_SENT) { | 313 | if(REG_READ(MIPIA_INTR_STAT_REG + reg_offset) & DSI_INTR_STATE_SPL_PKG_SENT) { |
349 | REG_WRITE((MIPIA_INTR_STAT_REG + reg_offset), | 314 | REG_WRITE((MIPIA_INTR_STAT_REG + reg_offset), |
350 | (REG_READ(MIPIA_INTR_STAT_REG + reg_offset) | DSI_INTR_STATE_SPL_PKG_SENT)); | 315 | (REG_READ(MIPIA_INTR_STAT_REG + reg_offset) | DSI_INTR_STATE_SPL_PKG_SENT)); |
@@ -432,6 +397,53 @@ startup_out: | |||
432 | gma_power_end(dev); | 397 | gma_power_end(dev); |
433 | } | 398 | } |
434 | 399 | ||
400 | |||
401 | static int mdfld_dsi_get_panel_status(struct mdfld_dsi_config *dsi_config, | ||
402 | u8 dcs, | ||
403 | u32 *data, | ||
404 | u8 transmission) | ||
405 | { | ||
406 | struct mdfld_dsi_pkg_sender *sender | ||
407 | = mdfld_dsi_get_pkg_sender(dsi_config); | ||
408 | |||
409 | if (!sender || !data) { | ||
410 | DRM_ERROR("Invalid parameter\n"); | ||
411 | return -EINVAL; | ||
412 | } | ||
413 | |||
414 | if (transmission == MDFLD_DSI_HS_TRANSMISSION) | ||
415 | return mdfld_dsi_read_mcs_hs(sender, dcs, data, 1); | ||
416 | else if (transmission == MDFLD_DSI_LP_TRANSMISSION) | ||
417 | return mdfld_dsi_read_mcs_lp(sender, dcs, data, 1); | ||
418 | else | ||
419 | return -EINVAL; | ||
420 | } | ||
421 | |||
422 | int mdfld_dsi_get_power_mode(struct mdfld_dsi_config *dsi_config, | ||
423 | u32 *mode, | ||
424 | u8 transmission) | ||
425 | { | ||
426 | if (!dsi_config || !mode) { | ||
427 | DRM_ERROR("Invalid parameter\n"); | ||
428 | return -EINVAL; | ||
429 | } | ||
430 | |||
431 | return mdfld_dsi_get_panel_status(dsi_config, 0x0a, mode, transmission); | ||
432 | } | ||
433 | |||
434 | int mdfld_dsi_get_diagnostic_result(struct mdfld_dsi_config *dsi_config, | ||
435 | u32 *result, | ||
436 | u8 transmission) | ||
437 | { | ||
438 | if (!dsi_config || !result) { | ||
439 | DRM_ERROR("Invalid parameter\n"); | ||
440 | return -EINVAL; | ||
441 | } | ||
442 | |||
443 | return mdfld_dsi_get_panel_status(dsi_config, 0x0f, result, | ||
444 | transmission); | ||
445 | } | ||
446 | |||
435 | /* | 447 | /* |
436 | * NOTE: this function was used by OSPM. | 448 | * NOTE: this function was used by OSPM. |
437 | * TODO: will be removed later, should work out display interfaces for OSPM | 449 | * TODO: will be removed later, should work out display interfaces for OSPM |
@@ -459,14 +471,18 @@ static void mdfld_dsi_connector_restore(struct drm_connector * connector) | |||
459 | 471 | ||
460 | static enum drm_connector_status mdfld_dsi_connector_detect(struct drm_connector * connector, bool force) | 472 | static enum drm_connector_status mdfld_dsi_connector_detect(struct drm_connector * connector, bool force) |
461 | { | 473 | { |
462 | return connector_status_connected; | 474 | struct psb_intel_output *psb_output |
475 | = to_psb_intel_output(connector); | ||
476 | struct mdfld_dsi_connector *dsi_connector | ||
477 | = MDFLD_DSI_CONNECTOR(psb_output); | ||
478 | return dsi_connector->status; | ||
463 | } | 479 | } |
464 | 480 | ||
465 | static int mdfld_dsi_connector_set_property(struct drm_connector * connector, | 481 | static int mdfld_dsi_connector_set_property(struct drm_connector *connector, |
466 | struct drm_property * property, | 482 | struct drm_property *property, |
467 | uint64_t value) | 483 | uint64_t value) |
468 | { | 484 | { |
469 | struct drm_encoder * encoder = connector->encoder; | 485 | struct drm_encoder *encoder = connector->encoder; |
470 | 486 | ||
471 | if (!strcmp(property->name, "scaling mode") && encoder) { | 487 | if (!strcmp(property->name, "scaling mode") && encoder) { |
472 | struct psb_intel_crtc * psb_crtc = to_psb_intel_crtc(encoder->crtc); | 488 | struct psb_intel_crtc * psb_crtc = to_psb_intel_crtc(encoder->crtc); |
@@ -633,9 +649,12 @@ static void mdfld_dsi_connector_dpms(struct drm_connector *connector, int mode) | |||
633 | } | 649 | } |
634 | 650 | ||
635 | /* Then check all display panels + monitors status */ | 651 | /* Then check all display panels + monitors status */ |
652 | /* Make sure that the Display (B) sub-system status isn't i3 when | ||
653 | * R/W the DC register, otherwise "Fabric error" issue would occur | ||
654 | * during S0i3 state. */ | ||
636 | if(!panel_on && !panel_on2 && !(REG_READ(HDMIB_CONTROL) | 655 | if(!panel_on && !panel_on2 && !(REG_READ(HDMIB_CONTROL) |
637 | & HDMIB_PORT_EN)) { | 656 | & HDMIB_PORT_EN)) { |
638 | /*request rpm idle*/ | 657 | /* Request rpm idle */ |
639 | if(dev_priv->rpm_enabled) | 658 | if(dev_priv->rpm_enabled) |
640 | pm_request_idle(&dev->pdev->dev); | 659 | pm_request_idle(&dev->pdev->dev); |
641 | } | 660 | } |
@@ -652,8 +671,8 @@ static void mdfld_dsi_connector_dpms(struct drm_connector *connector, int mode) | |||
652 | #endif | 671 | #endif |
653 | } | 672 | } |
654 | 673 | ||
655 | static struct drm_encoder * mdfld_dsi_connector_best_encoder( | 674 | static struct drm_encoder *mdfld_dsi_connector_best_encoder( |
656 | struct drm_connector * connector) | 675 | struct drm_connector *connector) |
657 | { | 676 | { |
658 | struct psb_intel_output * psb_output = to_psb_intel_output(connector); | 677 | struct psb_intel_output * psb_output = to_psb_intel_output(connector); |
659 | struct mdfld_dsi_connector * dsi_connector = MDFLD_DSI_CONNECTOR(psb_output); | 678 | struct mdfld_dsi_connector * dsi_connector = MDFLD_DSI_CONNECTOR(psb_output); |
@@ -755,16 +774,6 @@ mdfld_dsi_get_configuration_mode(struct mdfld_dsi_config * dsi_config, int pipe) | |||
755 | mode->vtotal = mode->vdisplay + \ | 774 | mode->vtotal = mode->vdisplay + \ |
756 | ((ti->vblank_hi << 8) | ti->vblank_lo); | 775 | ((ti->vblank_hi << 8) | ti->vblank_lo); |
757 | mode->clock = ti->pixel_clock * 10; | 776 | mode->clock = ti->pixel_clock * 10; |
758 | |||
759 | dev_dbg(dev->dev, "hdisplay is %d\n", mode->hdisplay); | ||
760 | dev_dbg(dev->dev, "vdisplay is %d\n", mode->vdisplay); | ||
761 | dev_dbg(dev->dev, "HSS is %d\n", mode->hsync_start); | ||
762 | dev_dbg(dev->dev, "HSE is %d\n", mode->hsync_end); | ||
763 | dev_dbg(dev->dev, "htotal is %d\n", mode->htotal); | ||
764 | dev_dbg(dev->dev, "VSS is %d\n", mode->vsync_start); | ||
765 | dev_dbg(dev->dev, "VSE is %d\n", mode->vsync_end); | ||
766 | dev_dbg(dev->dev, "vtotal is %d\n", mode->vtotal); | ||
767 | dev_dbg(dev->dev, "clock is %d\n", mode->clock); | ||
768 | } else { | 777 | } else { |
769 | if(dsi_config->type == MDFLD_DSI_ENCODER_DPI) { | 778 | if(dsi_config->type == MDFLD_DSI_ENCODER_DPI) { |
770 | if (mdfld_get_panel_type(dev, pipe) == TMD_VID) { | 779 | if (mdfld_get_panel_type(dev, pipe) == TMD_VID) { |
@@ -810,6 +819,44 @@ mdfld_dsi_get_configuration_mode(struct mdfld_dsi_config * dsi_config, int pipe) | |||
810 | return mode; | 819 | return mode; |
811 | } | 820 | } |
812 | 821 | ||
822 | int mdfld_dsi_panel_reset(int pipe) | ||
823 | { | ||
824 | unsigned gpio; | ||
825 | int ret = 0; | ||
826 | |||
827 | switch (pipe) { | ||
828 | case 0: | ||
829 | gpio = 128; | ||
830 | break; | ||
831 | case 2: | ||
832 | gpio = 34; | ||
833 | break; | ||
834 | default: | ||
835 | DRM_ERROR("Invalid output\n"); | ||
836 | return -EINVAL; | ||
837 | } | ||
838 | |||
839 | ret = gpio_request(gpio, "gfx"); | ||
840 | if (ret) { | ||
841 | DRM_ERROR("gpio_rqueset failed\n"); | ||
842 | return ret; | ||
843 | } | ||
844 | |||
845 | ret = gpio_direction_output(gpio, 1); | ||
846 | if (ret) { | ||
847 | DRM_ERROR("gpio_direction_output failed\n"); | ||
848 | goto gpio_error; | ||
849 | } | ||
850 | |||
851 | gpio_get_value(128); | ||
852 | |||
853 | gpio_error: | ||
854 | if (gpio_is_valid(gpio)) | ||
855 | gpio_free(gpio); | ||
856 | |||
857 | return ret; | ||
858 | } | ||
859 | |||
813 | /* | 860 | /* |
814 | * MIPI output init | 861 | * MIPI output init |
815 | * @dev drm device | 862 | * @dev drm device |
@@ -819,9 +866,9 @@ mdfld_dsi_get_configuration_mode(struct mdfld_dsi_config * dsi_config, int pipe) | |||
819 | * Do the initialization of a MIPI output, including create DRM mode objects | 866 | * Do the initialization of a MIPI output, including create DRM mode objects |
820 | * initialization of DSI output on @pipe | 867 | * initialization of DSI output on @pipe |
821 | */ | 868 | */ |
822 | void mdfld_dsi_output_init(struct drm_device * dev, | 869 | void mdfld_dsi_output_init(struct drm_device *dev, |
823 | int pipe, | 870 | int pipe, |
824 | struct mdfld_dsi_config * config, | 871 | struct mdfld_dsi_config *config, |
825 | struct panel_funcs* p_cmd_funcs, | 872 | struct panel_funcs* p_cmd_funcs, |
826 | struct panel_funcs* p_vid_funcs) | 873 | struct panel_funcs* p_vid_funcs) |
827 | { | 874 | { |
@@ -869,7 +916,7 @@ void mdfld_dsi_output_init(struct drm_device * dev, | |||
869 | dsi_config->changed = 1; | 916 | dsi_config->changed = 1; |
870 | dsi_config->dev = dev; | 917 | dsi_config->dev = dev; |
871 | 918 | ||
872 | /*init fixed mode basing on DSI config type*/ | 919 | /* Init fixed mode basing on DSI config type */ |
873 | if(dsi_config->type == MDFLD_DSI_ENCODER_DBI) { | 920 | if(dsi_config->type == MDFLD_DSI_ENCODER_DBI) { |
874 | dsi_config->fixed_mode = p_cmd_funcs->get_config_mode(dev); | 921 | dsi_config->fixed_mode = p_cmd_funcs->get_config_mode(dev); |
875 | if(p_cmd_funcs->get_panel_info(dev, pipe, &dsi_panel_info)) | 922 | if(p_cmd_funcs->get_panel_info(dev, pipe, &dsi_panel_info)) |
@@ -917,12 +964,18 @@ void mdfld_dsi_output_init(struct drm_device * dev, | |||
917 | connector->interlace_allowed = false; | 964 | connector->interlace_allowed = false; |
918 | connector->doublescan_allowed = false; | 965 | connector->doublescan_allowed = false; |
919 | 966 | ||
920 | /*attach properties*/ | 967 | /* Attach properties */ |
921 | drm_connector_attach_property(connector, dev->mode_config.scaling_mode_property, DRM_MODE_SCALE_FULLSCREEN); | 968 | drm_connector_attach_property(connector, dev->mode_config.scaling_mode_property, DRM_MODE_SCALE_FULLSCREEN); |
922 | drm_connector_attach_property(connector, dev_priv->backlight_property, MDFLD_DSI_BRIGHTNESS_MAX_LEVEL); | 969 | drm_connector_attach_property(connector, dev_priv->backlight_property, MDFLD_DSI_BRIGHTNESS_MAX_LEVEL); |
923 | 970 | ||
924 | /*init DBI & DPI encoders*/ | 971 | /* Init DSI package sender on this output */ |
925 | if(p_cmd_funcs) { | 972 | if (mdfld_dsi_pkg_sender_init(dsi_connector, pipe)) { |
973 | DRM_ERROR("Package Sender initialization failed on pipe %d\n", pipe); | ||
974 | goto dsi_init_err0; | ||
975 | } | ||
976 | |||
977 | /* Init DBI & DPI encoders */ | ||
978 | if (p_cmd_funcs) { | ||
926 | encoder = mdfld_dsi_dbi_init(dev, dsi_connector, p_cmd_funcs); | 979 | encoder = mdfld_dsi_dbi_init(dev, dsi_connector, p_cmd_funcs); |
927 | if(!encoder) { | 980 | if(!encoder) { |
928 | dev_err(dev->dev, "Create DBI encoder failed\n"); | 981 | dev_err(dev->dev, "Create DBI encoder failed\n"); |
@@ -930,12 +983,6 @@ void mdfld_dsi_output_init(struct drm_device * dev, | |||
930 | } | 983 | } |
931 | encoder->private = dsi_config; | 984 | encoder->private = dsi_config; |
932 | dsi_config->encoders[MDFLD_DSI_ENCODER_DBI] = encoder; | 985 | dsi_config->encoders[MDFLD_DSI_ENCODER_DBI] = encoder; |
933 | if(pipe == 2) | ||
934 | dev_priv->encoder2 = encoder; | ||
935 | |||
936 | if(pipe == 0) | ||
937 | dev_priv->encoder0 = encoder; | ||
938 | |||
939 | } | 986 | } |
940 | 987 | ||
941 | if(p_vid_funcs) { | 988 | if(p_vid_funcs) { |
@@ -946,31 +993,16 @@ void mdfld_dsi_output_init(struct drm_device * dev, | |||
946 | } | 993 | } |
947 | encoder->private = dsi_config; | 994 | encoder->private = dsi_config; |
948 | dsi_config->encoders[MDFLD_DSI_ENCODER_DPI] = encoder; | 995 | dsi_config->encoders[MDFLD_DSI_ENCODER_DPI] = encoder; |
949 | |||
950 | if(pipe == 2) | ||
951 | dev_priv->encoder2 = encoder; | ||
952 | |||
953 | if(pipe == 0) | ||
954 | dev_priv->encoder0 = encoder; | ||
955 | } | 996 | } |
956 | 997 | ||
957 | drm_sysfs_connector_add(connector); | 998 | drm_sysfs_connector_add(connector); |
958 | |||
959 | /*init DSI package sender on this output*/ | ||
960 | if(mdfld_dsi_pkg_sender_init(dsi_connector, pipe)) { | ||
961 | dev_err(dev->dev, | ||
962 | "Package Sender initialization failed on pipe %d\n", | ||
963 | pipe); | ||
964 | goto dsi_init_err2; | ||
965 | } | ||
966 | |||
967 | dev_dbg(dev->dev, "successfully\n"); | ||
968 | return; | 999 | return; |
969 | 1000 | ||
970 | /*TODO: add code to destroy outputs on error*/ | 1001 | /*TODO: add code to destroy outputs on error*/ |
971 | dsi_init_err2: | ||
972 | drm_sysfs_connector_remove(connector); | ||
973 | dsi_init_err1: | 1002 | dsi_init_err1: |
1003 | /*destroy sender*/ | ||
1004 | mdfld_dsi_pkg_sender_destroy(dsi_connector->pkg_sender); | ||
1005 | |||
974 | drm_connector_cleanup(connector); | 1006 | drm_connector_cleanup(connector); |
975 | kfree(dsi_config->fixed_mode); | 1007 | kfree(dsi_config->fixed_mode); |
976 | kfree(dsi_config); | 1008 | kfree(dsi_config); |
diff --git a/drivers/staging/gma500/mdfld_dsi_output.h b/drivers/staging/gma500/mdfld_dsi_output.h index 4300f10fbc86..4699267efd60 100644 --- a/drivers/staging/gma500/mdfld_dsi_output.h +++ b/drivers/staging/gma500/mdfld_dsi_output.h | |||
@@ -42,202 +42,6 @@ | |||
42 | 42 | ||
43 | #include <asm/mrst.h> | 43 | #include <asm/mrst.h> |
44 | 44 | ||
45 | #define DRM_MODE_ENCODER_MIPI 5 | ||
46 | |||
47 | /* Medfield DSI controller registers */ | ||
48 | |||
49 | #define MIPIA_DEVICE_READY_REG 0xb000 | ||
50 | #define MIPIA_INTR_STAT_REG 0xb004 | ||
51 | #define MIPIA_INTR_EN_REG 0xb008 | ||
52 | #define MIPIA_DSI_FUNC_PRG_REG 0xb00c | ||
53 | #define MIPIA_HS_TX_TIMEOUT_REG 0xb010 | ||
54 | #define MIPIA_LP_RX_TIMEOUT_REG 0xb014 | ||
55 | #define MIPIA_TURN_AROUND_TIMEOUT_REG 0xb018 | ||
56 | #define MIPIA_DEVICE_RESET_TIMER_REG 0xb01c | ||
57 | #define MIPIA_DPI_RESOLUTION_REG 0xb020 | ||
58 | #define MIPIA_DBI_FIFO_THROTTLE_REG 0xb024 | ||
59 | #define MIPIA_HSYNC_COUNT_REG 0xb028 | ||
60 | #define MIPIA_HBP_COUNT_REG 0xb02c | ||
61 | #define MIPIA_HFP_COUNT_REG 0xb030 | ||
62 | #define MIPIA_HACTIVE_COUNT_REG 0xb034 | ||
63 | #define MIPIA_VSYNC_COUNT_REG 0xb038 | ||
64 | #define MIPIA_VBP_COUNT_REG 0xb03c | ||
65 | #define MIPIA_VFP_COUNT_REG 0xb040 | ||
66 | #define MIPIA_HIGH_LOW_SWITCH_COUNT_REG 0xb044 | ||
67 | #define MIPIA_DPI_CONTROL_REG 0xb048 | ||
68 | #define MIPIA_DPI_DATA_REG 0xb04c | ||
69 | #define MIPIA_INIT_COUNT_REG 0xb050 | ||
70 | #define MIPIA_MAX_RETURN_PACK_SIZE_REG 0xb054 | ||
71 | #define MIPIA_VIDEO_MODE_FORMAT_REG 0xb058 | ||
72 | #define MIPIA_EOT_DISABLE_REG 0xb05c | ||
73 | #define MIPIA_LP_BYTECLK_REG 0xb060 | ||
74 | #define MIPIA_LP_GEN_DATA_REG 0xb064 | ||
75 | #define MIPIA_HS_GEN_DATA_REG 0xb068 | ||
76 | #define MIPIA_LP_GEN_CTRL_REG 0xb06c | ||
77 | #define MIPIA_HS_GEN_CTRL_REG 0xb070 | ||
78 | #define MIPIA_GEN_FIFO_STAT_REG 0xb074 | ||
79 | #define MIPIA_HS_LS_DBI_ENABLE_REG 0xb078 | ||
80 | #define MIPIA_DPHY_PARAM_REG 0xb080 | ||
81 | #define MIPIA_DBI_BW_CTRL_REG 0xb084 | ||
82 | #define MIPIA_CLK_LANE_SWITCH_TIME_CNT_REG 0xb088 | ||
83 | |||
84 | #define DSI_DEVICE_READY (0x1) | ||
85 | #define DSI_POWER_STATE_ULPS_ENTER (0x2 << 1) | ||
86 | #define DSI_POWER_STATE_ULPS_EXIT (0x1 << 1) | ||
87 | #define DSI_POWER_STATE_ULPS_OFFSET (0x1) | ||
88 | |||
89 | |||
90 | #define DSI_ONE_DATA_LANE (0x1) | ||
91 | #define DSI_TWO_DATA_LANE (0x2) | ||
92 | #define DSI_THREE_DATA_LANE (0X3) | ||
93 | #define DSI_FOUR_DATA_LANE (0x4) | ||
94 | #define DSI_DPI_VIRT_CHANNEL_OFFSET (0x3) | ||
95 | #define DSI_DBI_VIRT_CHANNEL_OFFSET (0x5) | ||
96 | #define DSI_DPI_COLOR_FORMAT_RGB565 (0x01 << 7) | ||
97 | #define DSI_DPI_COLOR_FORMAT_RGB666 (0x02 << 7) | ||
98 | #define DSI_DPI_COLOR_FORMAT_RGB666_UNPACK (0x03 << 7) | ||
99 | #define DSI_DPI_COLOR_FORMAT_RGB888 (0x04 << 7) | ||
100 | #define DSI_DBI_COLOR_FORMAT_OPTION2 (0x05 << 13) | ||
101 | |||
102 | #define DSI_INTR_STATE_RXSOTERROR 1 | ||
103 | |||
104 | #define DSI_INTR_STATE_SPL_PKG_SENT (1 << 30) | ||
105 | #define DSI_INTR_STATE_TE (1 << 31) | ||
106 | |||
107 | #define DSI_HS_TX_TIMEOUT_MASK (0xffffff) | ||
108 | |||
109 | #define DSI_LP_RX_TIMEOUT_MASK (0xffffff) | ||
110 | |||
111 | #define DSI_TURN_AROUND_TIMEOUT_MASK (0x3f) | ||
112 | |||
113 | #define DSI_RESET_TIMER_MASK (0xffff) | ||
114 | |||
115 | #define DSI_DBI_FIFO_WM_HALF (0x0) | ||
116 | #define DSI_DBI_FIFO_WM_QUARTER (0x1) | ||
117 | #define DSI_DBI_FIFO_WM_LOW (0x2) | ||
118 | |||
119 | #define DSI_DPI_TIMING_MASK (0xffff) | ||
120 | |||
121 | #define DSI_INIT_TIMER_MASK (0xffff) | ||
122 | |||
123 | #define DSI_DBI_RETURN_PACK_SIZE_MASK (0x3ff) | ||
124 | |||
125 | #define DSI_LP_BYTECLK_MASK (0x0ffff) | ||
126 | |||
127 | #define DSI_HS_CTRL_GEN_SHORT_W0 (0x03) | ||
128 | #define DSI_HS_CTRL_GEN_SHORT_W1 (0x13) | ||
129 | #define DSI_HS_CTRL_GEN_SHORT_W2 (0x23) | ||
130 | #define DSI_HS_CTRL_GEN_R0 (0x04) | ||
131 | #define DSI_HS_CTRL_GEN_R1 (0x14) | ||
132 | #define DSI_HS_CTRL_GEN_R2 (0x24) | ||
133 | #define DSI_HS_CTRL_GEN_LONG_W (0x29) | ||
134 | #define DSI_HS_CTRL_MCS_SHORT_W0 (0x05) | ||
135 | #define DSI_HS_CTRL_MCS_SHORT_W1 (0x15) | ||
136 | #define DSI_HS_CTRL_MCS_R0 (0x06) | ||
137 | #define DSI_HS_CTRL_MCS_LONG_W (0x39) | ||
138 | #define DSI_HS_CTRL_VC_OFFSET (0x06) | ||
139 | #define DSI_HS_CTRL_WC_OFFSET (0x08) | ||
140 | |||
141 | #define DSI_FIFO_GEN_HS_DATA_FULL (1 << 0) | ||
142 | #define DSI_FIFO_GEN_HS_DATA_HALF_EMPTY (1 << 1) | ||
143 | #define DSI_FIFO_GEN_HS_DATA_EMPTY (1 << 2) | ||
144 | #define DSI_FIFO_GEN_LP_DATA_FULL (1 << 8) | ||
145 | #define DSI_FIFO_GEN_LP_DATA_HALF_EMPTY (1 << 9) | ||
146 | #define DSI_FIFO_GEN_LP_DATA_EMPTY (1 << 10) | ||
147 | #define DSI_FIFO_GEN_HS_CTRL_FULL (1 << 16) | ||
148 | #define DSI_FIFO_GEN_HS_CTRL_HALF_EMPTY (1 << 17) | ||
149 | #define DSI_FIFO_GEN_HS_CTRL_EMPTY (1 << 18) | ||
150 | #define DSI_FIFO_GEN_LP_CTRL_FULL (1 << 24) | ||
151 | #define DSI_FIFO_GEN_LP_CTRL_HALF_EMPTY (1 << 25) | ||
152 | #define DSI_FIFO_GEN_LP_CTRL_EMPTY (1 << 26) | ||
153 | #define DSI_FIFO_DBI_EMPTY (1 << 27) | ||
154 | #define DSI_FIFO_DPI_EMPTY (1 << 28) | ||
155 | |||
156 | #define DSI_DBI_HS_LP_SWITCH_MASK (0x1) | ||
157 | |||
158 | #define DSI_HS_LP_SWITCH_COUNTER_OFFSET (0x0) | ||
159 | #define DSI_LP_HS_SWITCH_COUNTER_OFFSET (0x16) | ||
160 | |||
161 | #define DSI_DPI_CTRL_HS_SHUTDOWN (0x00000001) | ||
162 | #define DSI_DPI_CTRL_HS_TURN_ON (0x00000002) | ||
163 | |||
164 | /* Medfield DSI adapter registers */ | ||
165 | #define MIPIA_CONTROL_REG 0xb104 | ||
166 | #define MIPIA_DATA_ADD_REG 0xb108 | ||
167 | #define MIPIA_DATA_LEN_REG 0xb10c | ||
168 | #define MIPIA_CMD_ADD_REG 0xb110 | ||
169 | #define MIPIA_CMD_LEN_REG 0xb114 | ||
170 | |||
171 | enum { | ||
172 | MDFLD_DSI_ENCODER_DBI = 0, | ||
173 | MDFLD_DSI_ENCODER_DPI, | ||
174 | }; | ||
175 | |||
176 | enum { | ||
177 | MDFLD_DSI_VIDEO_NON_BURST_MODE_SYNC_PULSE = 1, | ||
178 | MDFLD_DSI_VIDEO_NON_BURST_MODE_SYNC_EVENTS = 2, | ||
179 | MDFLD_DSI_VIDEO_BURST_MODE = 3, | ||
180 | }; | ||
181 | |||
182 | #define DSI_DPI_COMPLETE_LAST_LINE (1 << 2) | ||
183 | #define DSI_DPI_DISABLE_BTA (1 << 3) | ||
184 | |||
185 | struct mdfld_dsi_connector_state { | ||
186 | u32 mipi_ctrl_reg; | ||
187 | }; | ||
188 | |||
189 | struct mdfld_dsi_encoder_state { | ||
190 | |||
191 | }; | ||
192 | |||
193 | struct mdfld_dsi_connector { | ||
194 | /* | ||
195 | * This is ugly, but I have to use connector in it! :-( | ||
196 | * FIXME: use drm_connector instead. | ||
197 | */ | ||
198 | struct psb_intel_output base; | ||
199 | |||
200 | int pipe; | ||
201 | void *private; | ||
202 | void *pkg_sender; | ||
203 | }; | ||
204 | |||
205 | struct mdfld_dsi_encoder { | ||
206 | struct drm_encoder base; | ||
207 | void *private; | ||
208 | }; | ||
209 | |||
210 | /* | ||
211 | * DSI config, consists of one DSI connector, two DSI encoders. | ||
212 | * DRM will pick up on DSI encoder basing on differents configs. | ||
213 | */ | ||
214 | struct mdfld_dsi_config { | ||
215 | struct drm_device *dev; | ||
216 | struct drm_display_mode *fixed_mode; | ||
217 | struct drm_display_mode *mode; | ||
218 | |||
219 | struct mdfld_dsi_connector *connector; | ||
220 | struct mdfld_dsi_encoder *encoders[DRM_CONNECTOR_MAX_ENCODER]; | ||
221 | struct mdfld_dsi_encoder *encoder; | ||
222 | |||
223 | int changed; | ||
224 | |||
225 | int bpp; | ||
226 | int type; | ||
227 | int lane_count; | ||
228 | /*Virtual channel number for this encoder*/ | ||
229 | int channel_num; | ||
230 | /*video mode configure*/ | ||
231 | int video_mode; | ||
232 | |||
233 | int dvr_ic_inited; | ||
234 | }; | ||
235 | |||
236 | #define MDFLD_DSI_CONNECTOR(psb_output) \ | ||
237 | (container_of(psb_output, struct mdfld_dsi_connector, base)) | ||
238 | |||
239 | #define MDFLD_DSI_ENCODER(encoder) \ | ||
240 | (container_of(encoder, struct mdfld_dsi_encoder, base)) | ||
241 | 45 | ||
242 | static inline struct mdfld_dsi_config * | 46 | static inline struct mdfld_dsi_config * |
243 | mdfld_dsi_get_config(struct mdfld_dsi_connector *connector) | 47 | mdfld_dsi_get_config(struct mdfld_dsi_connector *connector) |
@@ -323,5 +127,12 @@ extern void mdfld_dsi_output_init(struct drm_device *dev, int pipe, | |||
323 | struct panel_funcs *p_vid_funcs); | 127 | struct panel_funcs *p_vid_funcs); |
324 | extern void mdfld_dsi_controller_init(struct mdfld_dsi_config *dsi_config, | 128 | extern void mdfld_dsi_controller_init(struct mdfld_dsi_config *dsi_config, |
325 | int pipe); | 129 | int pipe); |
130 | extern int mdfld_dsi_get_power_mode(struct mdfld_dsi_config *dsi_config, | ||
131 | u32 *mode, | ||
132 | u8 transmission); | ||
133 | extern int mdfld_dsi_get_diagnostic_result(struct mdfld_dsi_config *dsi_config, | ||
134 | u32 *result, | ||
135 | u8 transmission); | ||
136 | extern int mdfld_dsi_panel_reset(int pipe); | ||
326 | 137 | ||
327 | #endif /*__MDFLD_DSI_OUTPUT_H__*/ | 138 | #endif /*__MDFLD_DSI_OUTPUT_H__*/ |
diff --git a/drivers/staging/gma500/mdfld_dsi_pkg_sender.c b/drivers/staging/gma500/mdfld_dsi_pkg_sender.c index 745d4adc82b2..9b96a5c9abcd 100644 --- a/drivers/staging/gma500/mdfld_dsi_pkg_sender.c +++ b/drivers/staging/gma500/mdfld_dsi_pkg_sender.c | |||
@@ -29,8 +29,11 @@ | |||
29 | #include "mdfld_dsi_output.h" | 29 | #include "mdfld_dsi_output.h" |
30 | #include "mdfld_dsi_pkg_sender.h" | 30 | #include "mdfld_dsi_pkg_sender.h" |
31 | #include "mdfld_dsi_dbi.h" | 31 | #include "mdfld_dsi_dbi.h" |
32 | #include "mdfld_dsi_dpi.h" | ||
32 | 33 | ||
33 | #define MDFLD_DSI_DBI_FIFO_TIMEOUT 100 | 34 | #define MDFLD_DSI_DBI_FIFO_TIMEOUT 100 |
35 | #define MDFLD_DSI_MAX_RETURN_PACKET_SIZE 512 | ||
36 | #define MDFLD_DSI_READ_MAX_COUNT 5000 | ||
34 | 37 | ||
35 | static const char * const dsi_errors[] = { | 38 | static const char * const dsi_errors[] = { |
36 | "RX SOT Error", | 39 | "RX SOT Error", |
@@ -404,8 +407,10 @@ static int send_pkg_prepare(struct mdfld_dsi_pkg_sender *sender, | |||
404 | } | 407 | } |
405 | 408 | ||
406 | /* Wait for 120 milliseconds in case exit_sleep_mode just be sent */ | 409 | /* Wait for 120 milliseconds in case exit_sleep_mode just be sent */ |
407 | if (cmd == enter_sleep_mode) | 410 | if (cmd == DCS_ENTER_SLEEP_MODE) { |
411 | /*TODO: replace it with msleep later*/ | ||
408 | mdelay(120); | 412 | mdelay(120); |
413 | } | ||
409 | return 0; | 414 | return 0; |
410 | } | 415 | } |
411 | 416 | ||
@@ -432,16 +437,18 @@ static int send_pkg_done(struct mdfld_dsi_pkg_sender *sender, | |||
432 | } | 437 | } |
433 | 438 | ||
434 | /* Update panel status */ | 439 | /* Update panel status */ |
435 | if (cmd == enter_sleep_mode) { | 440 | if (cmd == DCS_ENTER_SLEEP_MODE) { |
436 | sender->panel_mode |= MDFLD_DSI_PANEL_MODE_SLEEP; | 441 | sender->panel_mode |= MDFLD_DSI_PANEL_MODE_SLEEP; |
437 | /*TODO: replace it with msleep later*/ | 442 | /*TODO: replace it with msleep later*/ |
438 | mdelay(120); | 443 | mdelay(120); |
439 | } else if (cmd == exit_sleep_mode) { | 444 | } else if (cmd == DCS_EXIT_SLEEP_MODE) { |
440 | sender->panel_mode &= ~MDFLD_DSI_PANEL_MODE_SLEEP; | 445 | sender->panel_mode &= ~MDFLD_DSI_PANEL_MODE_SLEEP; |
441 | /*TODO: replace it with msleep later*/ | 446 | /*TODO: replace it with msleep later*/ |
442 | mdelay(120); | 447 | mdelay(120); |
443 | } | 448 | } else if (unlikely(cmd == DCS_SOFT_RESET)) { |
444 | 449 | /*TODO: replace it with msleep later*/ | |
450 | mdelay(5); | ||
451 | } | ||
445 | sender->status = MDFLD_DSI_PKG_SENDER_FREE; | 452 | sender->status = MDFLD_DSI_PKG_SENDER_FREE; |
446 | return 0; | 453 | return 0; |
447 | 454 | ||
@@ -470,6 +477,9 @@ static int do_send_pkg(struct mdfld_dsi_pkg_sender *sender, | |||
470 | case MDFLD_DSI_PKG_GEN_SHORT_WRITE_0: | 477 | case MDFLD_DSI_PKG_GEN_SHORT_WRITE_0: |
471 | case MDFLD_DSI_PKG_GEN_SHORT_WRITE_1: | 478 | case MDFLD_DSI_PKG_GEN_SHORT_WRITE_1: |
472 | case MDFLD_DSI_PKG_GEN_SHORT_WRITE_2: | 479 | case MDFLD_DSI_PKG_GEN_SHORT_WRITE_2: |
480 | case MDFLD_DSI_PKG_GEN_READ_0: | ||
481 | case MDFLD_DSI_PKG_GEN_READ_1: | ||
482 | case MDFLD_DSI_PKG_GEN_READ_2: | ||
473 | ret = send_gen_short_pkg(sender, pkg); | 483 | ret = send_gen_short_pkg(sender, pkg); |
474 | break; | 484 | break; |
475 | case MDFLD_DSI_PKG_GEN_LONG_WRITE: | 485 | case MDFLD_DSI_PKG_GEN_LONG_WRITE: |
@@ -477,6 +487,7 @@ static int do_send_pkg(struct mdfld_dsi_pkg_sender *sender, | |||
477 | break; | 487 | break; |
478 | case MDFLD_DSI_PKG_MCS_SHORT_WRITE_0: | 488 | case MDFLD_DSI_PKG_MCS_SHORT_WRITE_0: |
479 | case MDFLD_DSI_PKG_MCS_SHORT_WRITE_1: | 489 | case MDFLD_DSI_PKG_MCS_SHORT_WRITE_1: |
490 | case MDFLD_DSI_PKG_MCS_READ: | ||
480 | ret = send_mcs_short_pkg(sender, pkg); | 491 | ret = send_mcs_short_pkg(sender, pkg); |
481 | break; | 492 | break; |
482 | case MDFLD_DSI_PKG_MCS_LONG_WRITE: | 493 | case MDFLD_DSI_PKG_MCS_LONG_WRITE: |
@@ -548,6 +559,7 @@ static int mdfld_dbi_cb_init(struct mdfld_dsi_pkg_sender *sender, | |||
548 | 559 | ||
549 | switch (pipe) { | 560 | switch (pipe) { |
550 | case 0: | 561 | case 0: |
562 | /* FIXME: Doesn't this collide with stolen space ? */ | ||
551 | phys = pg->gtt_phys_start - 0x1000; | 563 | phys = pg->gtt_phys_start - 0x1000; |
552 | break; | 564 | break; |
553 | case 2: | 565 | case 2: |
@@ -735,6 +747,292 @@ static int mdfld_dsi_send_gen_long(struct mdfld_dsi_pkg_sender *sender, | |||
735 | return 0; | 747 | return 0; |
736 | } | 748 | } |
737 | 749 | ||
750 | static int __read_panel_data(struct mdfld_dsi_pkg_sender *sender, | ||
751 | struct mdfld_dsi_pkg *pkg, | ||
752 | u32 *data, | ||
753 | u16 len) | ||
754 | { | ||
755 | unsigned long flags; | ||
756 | struct drm_device *dev = sender->dev; | ||
757 | int i; | ||
758 | u32 gen_data_reg; | ||
759 | int retry = MDFLD_DSI_READ_MAX_COUNT; | ||
760 | u8 transmission = pkg->transmission_type; | ||
761 | |||
762 | /* | ||
763 | * do reading. | ||
764 | * 0) send out generic read request | ||
765 | * 1) polling read data avail interrupt | ||
766 | * 2) read data | ||
767 | */ | ||
768 | spin_lock_irqsave(&sender->lock, flags); | ||
769 | |||
770 | REG_WRITE(sender->mipi_intr_stat_reg, 1 << 29); | ||
771 | |||
772 | if ((REG_READ(sender->mipi_intr_stat_reg) & (1 << 29))) | ||
773 | DRM_ERROR("Can NOT clean read data valid interrupt\n"); | ||
774 | |||
775 | /*send out read request*/ | ||
776 | send_pkg(sender, pkg); | ||
777 | |||
778 | pkg_sender_put_pkg_locked(sender, pkg); | ||
779 | |||
780 | /*polling read data avail interrupt*/ | ||
781 | while (retry && !(REG_READ(sender->mipi_intr_stat_reg) & (1 << 29))) { | ||
782 | udelay(100); | ||
783 | retry--; | ||
784 | } | ||
785 | |||
786 | if (!retry) { | ||
787 | spin_unlock_irqrestore(&sender->lock, flags); | ||
788 | return -ETIMEDOUT; | ||
789 | } | ||
790 | |||
791 | REG_WRITE(sender->mipi_intr_stat_reg, (1 << 29)); | ||
792 | |||
793 | /*read data*/ | ||
794 | if (transmission == MDFLD_DSI_HS_TRANSMISSION) | ||
795 | gen_data_reg = sender->mipi_hs_gen_data_reg; | ||
796 | else if (transmission == MDFLD_DSI_LP_TRANSMISSION) | ||
797 | gen_data_reg = sender->mipi_lp_gen_data_reg; | ||
798 | else { | ||
799 | DRM_ERROR("Unknown transmission"); | ||
800 | spin_unlock_irqrestore(&sender->lock, flags); | ||
801 | return -EINVAL; | ||
802 | } | ||
803 | |||
804 | for (i=0; i<len; i++) | ||
805 | *(data + i) = REG_READ(gen_data_reg); | ||
806 | |||
807 | spin_unlock_irqrestore(&sender->lock, flags); | ||
808 | |||
809 | return 0; | ||
810 | } | ||
811 | |||
812 | static int mdfld_dsi_read_gen(struct mdfld_dsi_pkg_sender *sender, | ||
813 | u8 param0, | ||
814 | u8 param1, | ||
815 | u8 param_num, | ||
816 | u32 *data, | ||
817 | u16 len, | ||
818 | u8 transmission) | ||
819 | { | ||
820 | struct mdfld_dsi_pkg *pkg; | ||
821 | unsigned long flags; | ||
822 | |||
823 | spin_lock_irqsave(&sender->lock, flags); | ||
824 | |||
825 | pkg = pkg_sender_get_pkg_locked(sender); | ||
826 | |||
827 | spin_unlock_irqrestore(&sender->lock,flags); | ||
828 | |||
829 | if (!pkg) { | ||
830 | dev_err(sender->dev->dev, "No pkg memory\n"); | ||
831 | return -ENOMEM; | ||
832 | } | ||
833 | |||
834 | switch (param_num) { | ||
835 | case 0: | ||
836 | pkg->pkg_type = MDFLD_DSI_PKG_GEN_READ_0; | ||
837 | pkg->pkg.short_pkg.cmd = 0; | ||
838 | pkg->pkg.short_pkg.param = 0; | ||
839 | break; | ||
840 | case 1: | ||
841 | pkg->pkg_type = MDFLD_DSI_PKG_GEN_READ_1; | ||
842 | pkg->pkg.short_pkg.cmd = param0; | ||
843 | pkg->pkg.short_pkg.param = 0; | ||
844 | break; | ||
845 | case 2: | ||
846 | pkg->pkg_type = MDFLD_DSI_PKG_GEN_READ_2; | ||
847 | pkg->pkg.short_pkg.cmd = param0; | ||
848 | pkg->pkg.short_pkg.param = param1; | ||
849 | break; | ||
850 | } | ||
851 | |||
852 | pkg->transmission_type = transmission; | ||
853 | |||
854 | INIT_LIST_HEAD(&pkg->entry); | ||
855 | |||
856 | return __read_panel_data(sender, pkg, data, len); | ||
857 | } | ||
858 | |||
859 | static int mdfld_dsi_read_mcs(struct mdfld_dsi_pkg_sender *sender, | ||
860 | u8 cmd, | ||
861 | u32 *data, | ||
862 | u16 len, | ||
863 | u8 transmission) | ||
864 | { | ||
865 | struct mdfld_dsi_pkg *pkg; | ||
866 | unsigned long flags; | ||
867 | |||
868 | spin_lock_irqsave(&sender->lock, flags); | ||
869 | |||
870 | pkg = pkg_sender_get_pkg_locked(sender); | ||
871 | |||
872 | spin_unlock_irqrestore(&sender->lock, flags); | ||
873 | |||
874 | if (!pkg) { | ||
875 | dev_err(sender->dev->dev, "No pkg memory\n"); | ||
876 | return -ENOMEM; | ||
877 | } | ||
878 | |||
879 | pkg->pkg_type = MDFLD_DSI_PKG_MCS_READ; | ||
880 | pkg->pkg.short_pkg.cmd = cmd; | ||
881 | pkg->pkg.short_pkg.param = 0; | ||
882 | |||
883 | pkg->transmission_type = transmission; | ||
884 | |||
885 | INIT_LIST_HEAD(&pkg->entry); | ||
886 | |||
887 | return __read_panel_data(sender, pkg, data, len); | ||
888 | } | ||
889 | |||
890 | void dsi_controller_dbi_init(struct mdfld_dsi_config * dsi_config, int pipe) | ||
891 | { | ||
892 | struct drm_device * dev = dsi_config->dev; | ||
893 | u32 reg_offset = pipe ? MIPIC_REG_OFFSET : 0; | ||
894 | int lane_count = dsi_config->lane_count; | ||
895 | u32 val = 0; | ||
896 | |||
897 | /*un-ready device*/ | ||
898 | REG_WRITE((MIPIA_DEVICE_READY_REG + reg_offset), 0x00000000); | ||
899 | |||
900 | /*init dsi adapter before kicking off*/ | ||
901 | REG_WRITE((MIPIA_CONTROL_REG + reg_offset), 0x00000018); | ||
902 | |||
903 | /*TODO: figure out how to setup these registers*/ | ||
904 | REG_WRITE((MIPIA_DPHY_PARAM_REG + reg_offset), 0x150c3408); | ||
905 | REG_WRITE((MIPIA_CLK_LANE_SWITCH_TIME_CNT_REG + reg_offset), 0x000a0014); | ||
906 | REG_WRITE((MIPIA_DBI_BW_CTRL_REG + reg_offset), 0x00000400); | ||
907 | REG_WRITE((MIPIA_DBI_FIFO_THROTTLE_REG + reg_offset), 0x00000001); | ||
908 | REG_WRITE((MIPIA_HS_LS_DBI_ENABLE_REG + reg_offset), 0x00000000); | ||
909 | |||
910 | /*enable all interrupts*/ | ||
911 | REG_WRITE((MIPIA_INTR_EN_REG + reg_offset), 0xffffffff); | ||
912 | /*max value: 20 clock cycles of txclkesc*/ | ||
913 | REG_WRITE((MIPIA_TURN_AROUND_TIMEOUT_REG + reg_offset), 0x0000001f); | ||
914 | /*min 21 txclkesc, max: ffffh*/ | ||
915 | REG_WRITE((MIPIA_DEVICE_RESET_TIMER_REG + reg_offset), 0x0000ffff); | ||
916 | /*min: 7d0 max: 4e20*/ | ||
917 | REG_WRITE((MIPIA_INIT_COUNT_REG + reg_offset), 0x00000fa0); | ||
918 | |||
919 | /*set up max return packet size*/ | ||
920 | REG_WRITE((MIPIA_MAX_RETURN_PACK_SIZE_REG + reg_offset), | ||
921 | MDFLD_DSI_MAX_RETURN_PACKET_SIZE); | ||
922 | |||
923 | /*set up func_prg*/ | ||
924 | val |= lane_count; | ||
925 | val |= (dsi_config->channel_num << DSI_DBI_VIRT_CHANNEL_OFFSET); | ||
926 | val |= DSI_DBI_COLOR_FORMAT_OPTION2; | ||
927 | REG_WRITE((MIPIA_DSI_FUNC_PRG_REG + reg_offset), val); | ||
928 | |||
929 | REG_WRITE((MIPIA_HS_TX_TIMEOUT_REG + reg_offset), 0x3fffff); | ||
930 | REG_WRITE((MIPIA_LP_RX_TIMEOUT_REG + reg_offset), 0xffff); | ||
931 | |||
932 | REG_WRITE((MIPIA_HIGH_LOW_SWITCH_COUNT_REG + reg_offset), 0x46); | ||
933 | REG_WRITE((MIPIA_EOT_DISABLE_REG + reg_offset), 0x00000000); | ||
934 | REG_WRITE((MIPIA_LP_BYTECLK_REG + reg_offset), 0x00000004); | ||
935 | REG_WRITE((MIPIA_DEVICE_READY_REG + reg_offset), 0x00000001); | ||
936 | } | ||
937 | |||
938 | void dsi_controller_dpi_init(struct mdfld_dsi_config * dsi_config, int pipe) | ||
939 | { | ||
940 | struct drm_device * dev = dsi_config->dev; | ||
941 | u32 reg_offset = pipe ? MIPIC_REG_OFFSET : 0; | ||
942 | int lane_count = dsi_config->lane_count; | ||
943 | struct mdfld_dsi_dpi_timing dpi_timing; | ||
944 | struct drm_display_mode * mode = dsi_config->mode; | ||
945 | u32 val = 0; | ||
946 | |||
947 | /*un-ready device*/ | ||
948 | REG_WRITE((MIPIA_DEVICE_READY_REG + reg_offset), 0x00000000); | ||
949 | |||
950 | /*init dsi adapter before kicking off*/ | ||
951 | REG_WRITE((MIPIA_CONTROL_REG + reg_offset), 0x00000018); | ||
952 | |||
953 | /*enable all interrupts*/ | ||
954 | REG_WRITE((MIPIA_INTR_EN_REG + reg_offset), 0xffffffff); | ||
955 | |||
956 | /*set up func_prg*/ | ||
957 | val |= lane_count; | ||
958 | val |= dsi_config->channel_num << DSI_DPI_VIRT_CHANNEL_OFFSET; | ||
959 | |||
960 | switch(dsi_config->bpp) { | ||
961 | case 16: | ||
962 | val |= DSI_DPI_COLOR_FORMAT_RGB565; | ||
963 | break; | ||
964 | case 18: | ||
965 | val |= DSI_DPI_COLOR_FORMAT_RGB666; | ||
966 | break; | ||
967 | case 24: | ||
968 | val |= DSI_DPI_COLOR_FORMAT_RGB888; | ||
969 | break; | ||
970 | default: | ||
971 | DRM_ERROR("unsupported color format, bpp = %d\n", dsi_config->bpp); | ||
972 | } | ||
973 | |||
974 | REG_WRITE((MIPIA_DSI_FUNC_PRG_REG + reg_offset), val); | ||
975 | |||
976 | REG_WRITE((MIPIA_HS_TX_TIMEOUT_REG + reg_offset), | ||
977 | (mode->vtotal * mode->htotal * dsi_config->bpp / (8 * lane_count)) & DSI_HS_TX_TIMEOUT_MASK); | ||
978 | REG_WRITE((MIPIA_LP_RX_TIMEOUT_REG + reg_offset), 0xffff & DSI_LP_RX_TIMEOUT_MASK); | ||
979 | |||
980 | /*max value: 20 clock cycles of txclkesc*/ | ||
981 | REG_WRITE((MIPIA_TURN_AROUND_TIMEOUT_REG + reg_offset), 0x14 & DSI_TURN_AROUND_TIMEOUT_MASK); | ||
982 | |||
983 | /*min 21 txclkesc, max: ffffh*/ | ||
984 | REG_WRITE((MIPIA_DEVICE_RESET_TIMER_REG + reg_offset), 0xffff & DSI_RESET_TIMER_MASK); | ||
985 | |||
986 | REG_WRITE((MIPIA_DPI_RESOLUTION_REG + reg_offset), mode->vdisplay << 16 | mode->hdisplay); | ||
987 | |||
988 | /*set DPI timing registers*/ | ||
989 | mdfld_dsi_dpi_timing_calculation(mode, &dpi_timing, dsi_config->lane_count, dsi_config->bpp); | ||
990 | |||
991 | REG_WRITE((MIPIA_HSYNC_COUNT_REG + reg_offset), dpi_timing.hsync_count & DSI_DPI_TIMING_MASK); | ||
992 | REG_WRITE((MIPIA_HBP_COUNT_REG + reg_offset), dpi_timing.hbp_count & DSI_DPI_TIMING_MASK); | ||
993 | REG_WRITE((MIPIA_HFP_COUNT_REG + reg_offset), dpi_timing.hfp_count & DSI_DPI_TIMING_MASK); | ||
994 | REG_WRITE((MIPIA_HACTIVE_COUNT_REG + reg_offset), dpi_timing.hactive_count & DSI_DPI_TIMING_MASK); | ||
995 | REG_WRITE((MIPIA_VSYNC_COUNT_REG + reg_offset), dpi_timing.vsync_count & DSI_DPI_TIMING_MASK); | ||
996 | REG_WRITE((MIPIA_VBP_COUNT_REG + reg_offset), dpi_timing.vbp_count & DSI_DPI_TIMING_MASK); | ||
997 | REG_WRITE((MIPIA_VFP_COUNT_REG + reg_offset), dpi_timing.vfp_count & DSI_DPI_TIMING_MASK); | ||
998 | |||
999 | REG_WRITE((MIPIA_HIGH_LOW_SWITCH_COUNT_REG + reg_offset), 0x46); | ||
1000 | |||
1001 | /*min: 7d0 max: 4e20*/ | ||
1002 | REG_WRITE((MIPIA_INIT_COUNT_REG + reg_offset), 0x000007d0); | ||
1003 | |||
1004 | /*set up video mode*/ | ||
1005 | val = dsi_config->video_mode | DSI_DPI_COMPLETE_LAST_LINE; | ||
1006 | REG_WRITE((MIPIA_VIDEO_MODE_FORMAT_REG + reg_offset), val); | ||
1007 | |||
1008 | REG_WRITE((MIPIA_EOT_DISABLE_REG + reg_offset), 0x00000000); | ||
1009 | |||
1010 | REG_WRITE((MIPIA_LP_BYTECLK_REG + reg_offset), 0x00000004); | ||
1011 | |||
1012 | /*TODO: figure out how to setup these registers*/ | ||
1013 | REG_WRITE((MIPIA_DPHY_PARAM_REG + reg_offset), 0x150c3408); | ||
1014 | |||
1015 | REG_WRITE((MIPIA_CLK_LANE_SWITCH_TIME_CNT_REG + reg_offset), (0xa << 16) | 0x14); | ||
1016 | |||
1017 | /*set device ready*/ | ||
1018 | REG_WRITE((MIPIA_DEVICE_READY_REG + reg_offset), 0x00000001); | ||
1019 | } | ||
1020 | |||
1021 | static void dsi_controller_init(struct mdfld_dsi_config * dsi_config, int pipe) | ||
1022 | { | ||
1023 | if (!dsi_config || ((pipe != 0) && (pipe != 2))) { | ||
1024 | DRM_ERROR("Invalid parameters\n"); | ||
1025 | return; | ||
1026 | } | ||
1027 | |||
1028 | if (dsi_config->type == MDFLD_DSI_ENCODER_DPI) | ||
1029 | dsi_controller_dpi_init(dsi_config, pipe); | ||
1030 | else if (dsi_config->type == MDFLD_DSI_ENCODER_DBI) | ||
1031 | dsi_controller_dbi_init(dsi_config, pipe); | ||
1032 | else | ||
1033 | DRM_ERROR("Bad DSI encoder type\n"); | ||
1034 | } | ||
1035 | |||
738 | void mdfld_dsi_cmds_kick_out(struct mdfld_dsi_pkg_sender *sender) | 1036 | void mdfld_dsi_cmds_kick_out(struct mdfld_dsi_pkg_sender *sender) |
739 | { | 1037 | { |
740 | process_pkg_list(sender); | 1038 | process_pkg_list(sender); |
@@ -774,7 +1072,7 @@ int mdfld_dsi_send_dcs(struct mdfld_dsi_pkg_sender *sender, | |||
774 | * If dcs is write_mem_start, send it directly using DSI adapter | 1072 | * If dcs is write_mem_start, send it directly using DSI adapter |
775 | * interface | 1073 | * interface |
776 | */ | 1074 | */ |
777 | if (dcs == write_mem_start) { | 1075 | if (dcs == DCS_WRITE_MEM_START) { |
778 | if (!spin_trylock(&sender->lock)) | 1076 | if (!spin_trylock(&sender->lock)) |
779 | return -EAGAIN; | 1077 | return -EAGAIN; |
780 | 1078 | ||
@@ -944,6 +1242,69 @@ int mdfld_dsi_send_gen_long_lp(struct mdfld_dsi_pkg_sender *sender, | |||
944 | MDFLD_DSI_LP_TRANSMISSION, delay); | 1242 | MDFLD_DSI_LP_TRANSMISSION, delay); |
945 | } | 1243 | } |
946 | 1244 | ||
1245 | int mdfld_dsi_read_gen_hs(struct mdfld_dsi_pkg_sender *sender, | ||
1246 | u8 param0, | ||
1247 | u8 param1, | ||
1248 | u8 param_num, | ||
1249 | u32 *data, | ||
1250 | u16 len) | ||
1251 | { | ||
1252 | if (!sender || !data || param_num < 0 || param_num > 2 | ||
1253 | || !data || !len) { | ||
1254 | DRM_ERROR("Invalid parameters\n"); | ||
1255 | return -EINVAL; | ||
1256 | } | ||
1257 | |||
1258 | return mdfld_dsi_read_gen(sender, param0, param1, param_num, | ||
1259 | data, len, MDFLD_DSI_HS_TRANSMISSION); | ||
1260 | |||
1261 | } | ||
1262 | |||
1263 | int mdfld_dsi_read_gen_lp(struct mdfld_dsi_pkg_sender *sender, | ||
1264 | u8 param0, | ||
1265 | u8 param1, | ||
1266 | u8 param_num, | ||
1267 | u32 *data, | ||
1268 | u16 len) | ||
1269 | { | ||
1270 | if (!sender || !data || param_num < 0 || param_num > 2 | ||
1271 | || !data || !len) { | ||
1272 | DRM_ERROR("Invalid parameters\n"); | ||
1273 | return -EINVAL; | ||
1274 | } | ||
1275 | |||
1276 | return mdfld_dsi_read_gen(sender, param0, param1, param_num, | ||
1277 | data, len, MDFLD_DSI_LP_TRANSMISSION); | ||
1278 | } | ||
1279 | |||
1280 | int mdfld_dsi_read_mcs_hs(struct mdfld_dsi_pkg_sender *sender, | ||
1281 | u8 cmd, | ||
1282 | u32 *data, | ||
1283 | u16 len) | ||
1284 | { | ||
1285 | if (!sender || !data || !len) { | ||
1286 | DRM_ERROR("Invalid parameters\n"); | ||
1287 | return -EINVAL; | ||
1288 | } | ||
1289 | |||
1290 | return mdfld_dsi_read_mcs(sender, cmd, data, len, | ||
1291 | MDFLD_DSI_HS_TRANSMISSION); | ||
1292 | } | ||
1293 | |||
1294 | int mdfld_dsi_read_mcs_lp(struct mdfld_dsi_pkg_sender *sender, | ||
1295 | u8 cmd, | ||
1296 | u32 *data, | ||
1297 | u16 len) | ||
1298 | { | ||
1299 | if (!sender || !data || !len) { | ||
1300 | WARN_ON(1); | ||
1301 | return -EINVAL; | ||
1302 | } | ||
1303 | |||
1304 | return mdfld_dsi_read_mcs(sender, cmd, data, len, | ||
1305 | MDFLD_DSI_LP_TRANSMISSION); | ||
1306 | } | ||
1307 | |||
947 | int mdfld_dsi_pkg_sender_init(struct mdfld_dsi_connector *dsi_connector, | 1308 | int mdfld_dsi_pkg_sender_init(struct mdfld_dsi_connector *dsi_connector, |
948 | int pipe) | 1309 | int pipe) |
949 | { | 1310 | { |
@@ -956,6 +1317,7 @@ int mdfld_dsi_pkg_sender_init(struct mdfld_dsi_connector *dsi_connector, | |||
956 | struct psb_gtt *pg = &dev_priv->gtt; | 1317 | struct psb_gtt *pg = &dev_priv->gtt; |
957 | int i; | 1318 | int i; |
958 | struct mdfld_dsi_pkg *pkg, *tmp; | 1319 | struct mdfld_dsi_pkg *pkg, *tmp; |
1320 | u32 mipi_val = 0; | ||
959 | 1321 | ||
960 | if (!dsi_connector) { | 1322 | if (!dsi_connector) { |
961 | WARN_ON(1); | 1323 | WARN_ON(1); |
@@ -1018,7 +1380,7 @@ int mdfld_dsi_pkg_sender_init(struct mdfld_dsi_connector *dsi_connector, | |||
1018 | pkg_sender->pipeconf_reg = PIPECCONF; | 1380 | pkg_sender->pipeconf_reg = PIPECCONF; |
1019 | pkg_sender->dsplinoff_reg = DSPCLINOFF; | 1381 | pkg_sender->dsplinoff_reg = DSPCLINOFF; |
1020 | pkg_sender->dspsurf_reg = DSPCSURF; | 1382 | pkg_sender->dspsurf_reg = DSPCSURF; |
1021 | pkg_sender->pipestat_reg = 72024; | 1383 | pkg_sender->pipestat_reg = PIPECSTAT; |
1022 | 1384 | ||
1023 | pkg_sender->mipi_intr_stat_reg = | 1385 | pkg_sender->mipi_intr_stat_reg = |
1024 | MIPIA_INTR_STAT_REG + MIPIC_REG_OFFSET; | 1386 | MIPIA_INTR_STAT_REG + MIPIC_REG_OFFSET; |
@@ -1059,6 +1421,31 @@ int mdfld_dsi_pkg_sender_init(struct mdfld_dsi_connector *dsi_connector, | |||
1059 | INIT_LIST_HEAD(&pkg->entry); | 1421 | INIT_LIST_HEAD(&pkg->entry); |
1060 | list_add_tail(&pkg->entry, &pkg_sender->free_list); | 1422 | list_add_tail(&pkg->entry, &pkg_sender->free_list); |
1061 | } | 1423 | } |
1424 | |||
1425 | /* | ||
1426 | * For video mode, don't enable DPI timing output here, | ||
1427 | * will init the DPI timing output during mode setting. | ||
1428 | */ | ||
1429 | if (dsi_config->type == MDFLD_DSI_ENCODER_DPI) | ||
1430 | mipi_val = PASS_FROM_SPHY_TO_AFE | SEL_FLOPPED_HSTX; | ||
1431 | else if (dsi_config->type == MDFLD_DSI_ENCODER_DBI) | ||
1432 | mipi_val = PASS_FROM_SPHY_TO_AFE | SEL_FLOPPED_HSTX | ||
1433 | | TE_TRIGGER_GPIO_PIN; | ||
1434 | else | ||
1435 | DRM_ERROR("Bad DSI encoder type\n"); | ||
1436 | |||
1437 | if (pipe == 0) { | ||
1438 | mipi_val |= 0x2; | ||
1439 | REG_WRITE(MIPI, mipi_val); | ||
1440 | REG_READ(MIPI); | ||
1441 | } else if (pipe == 2) { | ||
1442 | REG_WRITE(MIPI_C, mipi_val); | ||
1443 | REG_READ(MIPI_C); | ||
1444 | } | ||
1445 | |||
1446 | /*do dsi controller init*/ | ||
1447 | dsi_controller_init(dsi_config, pipe); | ||
1448 | |||
1062 | return 0; | 1449 | return 0; |
1063 | 1450 | ||
1064 | pkg_alloc_err: | 1451 | pkg_alloc_err: |
diff --git a/drivers/staging/gma500/mdfld_dsi_pkg_sender.h b/drivers/staging/gma500/mdfld_dsi_pkg_sender.h index 296b1eac1404..f24abc700684 100644 --- a/drivers/staging/gma500/mdfld_dsi_pkg_sender.h +++ b/drivers/staging/gma500/mdfld_dsi_pkg_sender.h | |||
@@ -36,9 +36,13 @@ enum { | |||
36 | MDFLD_DSI_PKG_GEN_SHORT_WRITE_0 = 0x03, | 36 | MDFLD_DSI_PKG_GEN_SHORT_WRITE_0 = 0x03, |
37 | MDFLD_DSI_PKG_GEN_SHORT_WRITE_1 = 0x13, | 37 | MDFLD_DSI_PKG_GEN_SHORT_WRITE_1 = 0x13, |
38 | MDFLD_DSI_PKG_GEN_SHORT_WRITE_2 = 0x23, | 38 | MDFLD_DSI_PKG_GEN_SHORT_WRITE_2 = 0x23, |
39 | MDFLD_DSI_PKG_GEN_READ_0 = 0x04, | ||
40 | MDFLD_DSI_PKG_GEN_READ_1 = 0x14, | ||
41 | MDFLD_DSI_PKG_GEN_READ_2 = 0x24, | ||
39 | MDFLD_DSI_PKG_GEN_LONG_WRITE = 0x29, | 42 | MDFLD_DSI_PKG_GEN_LONG_WRITE = 0x29, |
40 | MDFLD_DSI_PKG_MCS_SHORT_WRITE_0 = 0x05, | 43 | MDFLD_DSI_PKG_MCS_SHORT_WRITE_0 = 0x05, |
41 | MDFLD_DSI_PKG_MCS_SHORT_WRITE_1 = 0x15, | 44 | MDFLD_DSI_PKG_MCS_SHORT_WRITE_1 = 0x15, |
45 | MDFLD_DSI_PKG_MCS_READ = 0x06, | ||
42 | MDFLD_DSI_PKG_MCS_LONG_WRITE = 0x39, | 46 | MDFLD_DSI_PKG_MCS_LONG_WRITE = 0x39, |
43 | }; | 47 | }; |
44 | 48 | ||
@@ -132,6 +136,18 @@ struct mdfld_dsi_pkg_sender { | |||
132 | u32 mipi_cmd_len_reg; | 136 | u32 mipi_cmd_len_reg; |
133 | }; | 137 | }; |
134 | 138 | ||
139 | /* DCS definitions */ | ||
140 | #define DCS_SOFT_RESET 0x01 | ||
141 | #define DCS_ENTER_SLEEP_MODE 0x10 | ||
142 | #define DCS_EXIT_SLEEP_MODE 0x11 | ||
143 | #define DCS_SET_DISPLAY_OFF 0x28 | ||
144 | #define DCS_SET_DISPLAY_ON 0x29 | ||
145 | #define DCS_SET_COLUMN_ADDRESS 0x2a | ||
146 | #define DCS_SET_PAGE_ADDRESS 0x2b | ||
147 | #define DCS_WRITE_MEM_START 0x2c | ||
148 | #define DCS_SET_TEAR_OFF 0x34 | ||
149 | #define DCS_SET_TEAR_ON 0x35 | ||
150 | |||
135 | extern int mdfld_dsi_pkg_sender_init(struct mdfld_dsi_connector *dsi_connector, | 151 | extern int mdfld_dsi_pkg_sender_init(struct mdfld_dsi_connector *dsi_connector, |
136 | int pipe); | 152 | int pipe); |
137 | extern void mdfld_dsi_pkg_sender_destroy(struct mdfld_dsi_pkg_sender *sender); | 153 | extern void mdfld_dsi_pkg_sender_destroy(struct mdfld_dsi_pkg_sender *sender); |
@@ -153,6 +169,16 @@ extern int mdfld_dsi_send_gen_long_hs(struct mdfld_dsi_pkg_sender *sender, | |||
153 | u32 *data, u32 len, int delay); | 169 | u32 *data, u32 len, int delay); |
154 | extern int mdfld_dsi_send_gen_long_lp(struct mdfld_dsi_pkg_sender *sender, | 170 | extern int mdfld_dsi_send_gen_long_lp(struct mdfld_dsi_pkg_sender *sender, |
155 | u32 *data, u32 len, int delay); | 171 | u32 *data, u32 len, int delay); |
172 | |||
173 | extern int mdfld_dsi_read_gen_hs(struct mdfld_dsi_pkg_sender *sender, | ||
174 | u8 param0, u8 param1, u8 param_num, u32 *data, u16 len); | ||
175 | extern int mdfld_dsi_read_gen_lp(struct mdfld_dsi_pkg_sender *sender, | ||
176 | u8 param0, u8 param1, u8 param_num, u32 *data, u16 len); | ||
177 | extern int mdfld_dsi_read_mcs_hs(struct mdfld_dsi_pkg_sender *sender, | ||
178 | u8 cmd, u32 *data, u16 len); | ||
179 | extern int mdfld_dsi_read_mcs_lp(struct mdfld_dsi_pkg_sender *sender, | ||
180 | u8 cmd, u32 *data, u16 len); | ||
181 | |||
156 | extern void mdfld_dsi_cmds_kick_out(struct mdfld_dsi_pkg_sender *sender); | 182 | extern void mdfld_dsi_cmds_kick_out(struct mdfld_dsi_pkg_sender *sender); |
157 | 183 | ||
158 | #endif /* __MDFLD_DSI_PKG_SENDER_H__ */ | 184 | #endif /* __MDFLD_DSI_PKG_SENDER_H__ */ |
diff --git a/drivers/staging/gma500/mdfld_intel_display.c b/drivers/staging/gma500/mdfld_intel_display.c index fa8499082813..ac74a8d00b58 100644 --- a/drivers/staging/gma500/mdfld_intel_display.c +++ b/drivers/staging/gma500/mdfld_intel_display.c | |||
@@ -140,7 +140,6 @@ static int mdfld_intel_crtc_cursor_set(struct drm_crtc *crtc, | |||
140 | uint32_t width, uint32_t height) | 140 | uint32_t width, uint32_t height) |
141 | { | 141 | { |
142 | struct drm_device *dev = crtc->dev; | 142 | struct drm_device *dev = crtc->dev; |
143 | struct drm_psb_private * dev_priv = (struct drm_psb_private *)dev->dev_private; | ||
144 | struct psb_intel_crtc *psb_intel_crtc = to_psb_intel_crtc(crtc); | 143 | struct psb_intel_crtc *psb_intel_crtc = to_psb_intel_crtc(crtc); |
145 | int pipe = psb_intel_crtc->pipe; | 144 | int pipe = psb_intel_crtc->pipe; |
146 | uint32_t control = CURACNTR; | 145 | uint32_t control = CURACNTR; |
@@ -263,7 +262,7 @@ static int mdfld_intel_crtc_cursor_move(struct drm_crtc *crtc, int x, int y) | |||
263 | case 0: | 262 | case 0: |
264 | #ifndef CONFIG_MDFLD_DSI_DPU | 263 | #ifndef CONFIG_MDFLD_DSI_DPU |
265 | if (!(dev_priv->dsr_fb_update & MDFLD_DSR_CURSOR_0)) | 264 | if (!(dev_priv->dsr_fb_update & MDFLD_DSR_CURSOR_0)) |
266 | mdfld_dsi_dbi_exit_dsr (dev, MDFLD_DSR_CURSOR_0, 0, 0); | 265 | mdfld_dsi_dbi_exit_dsr (dev, MDFLD_DSR_CURSOR_0); |
267 | #else /*CONFIG_MDFLD_DSI_DPU*/ | 266 | #else /*CONFIG_MDFLD_DSI_DPU*/ |
268 | rect.x = x; | 267 | rect.x = x; |
269 | rect.y = y; | 268 | rect.y = y; |
@@ -279,7 +278,7 @@ static int mdfld_intel_crtc_cursor_move(struct drm_crtc *crtc, int x, int y) | |||
279 | case 2: | 278 | case 2: |
280 | #ifndef CONFIG_MDFLD_DSI_DPU | 279 | #ifndef CONFIG_MDFLD_DSI_DPU |
281 | if (!(dev_priv->dsr_fb_update & MDFLD_DSR_CURSOR_2)) | 280 | if (!(dev_priv->dsr_fb_update & MDFLD_DSR_CURSOR_2)) |
282 | mdfld_dsi_dbi_exit_dsr (dev, MDFLD_DSR_CURSOR_2, 0, 0); | 281 | mdfld_dsi_dbi_exit_dsr (dev, MDFLD_DSR_CURSOR_2); |
283 | #else /*CONFIG_MDFLD_DSI_DPU*/ | 282 | #else /*CONFIG_MDFLD_DSI_DPU*/ |
284 | mdfld_dbi_dpu_report_damage(dev, MDFLD_CURSORC, &rect); | 283 | mdfld_dbi_dpu_report_damage(dev, MDFLD_CURSORC, &rect); |
285 | mdfld_dpu_exit_dsr(dev); | 284 | mdfld_dpu_exit_dsr(dev); |
@@ -354,7 +353,6 @@ int mdfld__intel_pipe_set_base(struct drm_crtc *crtc, int x, int y, struct drm_f | |||
354 | /* struct drm_i915_master_private *master_priv; */ | 353 | /* struct drm_i915_master_private *master_priv; */ |
355 | struct psb_intel_crtc *psb_intel_crtc = to_psb_intel_crtc(crtc); | 354 | struct psb_intel_crtc *psb_intel_crtc = to_psb_intel_crtc(crtc); |
356 | struct psb_framebuffer *psbfb = to_psb_fb(crtc->fb); | 355 | struct psb_framebuffer *psbfb = to_psb_fb(crtc->fb); |
357 | struct psb_intel_mode_device *mode_dev = psb_intel_crtc->mode_dev; | ||
358 | int pipe = psb_intel_crtc->pipe; | 356 | int pipe = psb_intel_crtc->pipe; |
359 | unsigned long start, offset; | 357 | unsigned long start, offset; |
360 | int dsplinoff = DSPALINOFF; | 358 | int dsplinoff = DSPALINOFF; |
diff --git a/drivers/staging/gma500/mdfld_output.c b/drivers/staging/gma500/mdfld_output.c index 7e11401d67bb..ffa2c1f0c192 100644 --- a/drivers/staging/gma500/mdfld_output.c +++ b/drivers/staging/gma500/mdfld_output.c | |||
@@ -100,7 +100,6 @@ static int init_panel(struct drm_device *dev, int mipi_pipe, int p_type) | |||
100 | mdfld_dsi_output_init(dev, mipi_pipe, NULL, p_cmd_funcs, NULL); | 100 | mdfld_dsi_output_init(dev, mipi_pipe, NULL, p_cmd_funcs, NULL); |
101 | break; | 101 | break; |
102 | case PYR_VID: | 102 | case PYR_VID: |
103 | /*pyr_vid_init(dev, p_vid_funcs); */ | ||
104 | mdfld_dsi_output_init(dev, mipi_pipe, NULL, NULL, p_vid_funcs); | 103 | mdfld_dsi_output_init(dev, mipi_pipe, NULL, NULL, p_vid_funcs); |
105 | break; | 104 | break; |
106 | case TPO: /* TPO panel supports both cmd & vid interfaces */ | 105 | case TPO: /* TPO panel supports both cmd & vid interfaces */ |
@@ -135,10 +134,15 @@ int mdfld_output_init(struct drm_device *dev) | |||
135 | dev_info(dev->dev, "panel 1: type is %d\n", type); | 134 | dev_info(dev->dev, "panel 1: type is %d\n", type); |
136 | init_panel(dev, 0, type); | 135 | init_panel(dev, 0, type); |
137 | 136 | ||
137 | #ifdef CONFIG_MDFD_DUAL_MIPI | ||
138 | /* MIPI panel 2 */ | 138 | /* MIPI panel 2 */ |
139 | type = mdfld_get_panel_type(dev, 2); | 139 | type = mdfld_get_panel_type(dev, 2); |
140 | dev_info(dev->dev, "panel 2: type is %d\n", type); | 140 | dev_info(dev->dev, "panel 2: type is %d\n", type); |
141 | init_panel(dev, 2, type); | 141 | init_panel(dev, 2, type); |
142 | 142 | #endif | |
143 | #ifdef CONFIG_MDFD_HDMI | ||
144 | /* HDMI panel */ | ||
145 | init_panel(dev, 0, HDMI); | ||
146 | #endif | ||
143 | return 0; | 147 | return 0; |
144 | } | 148 | } |
diff --git a/drivers/staging/gma500/mdfld_output.h b/drivers/staging/gma500/mdfld_output.h index 70f2302ad25f..e747fdb8913d 100644 --- a/drivers/staging/gma500/mdfld_output.h +++ b/drivers/staging/gma500/mdfld_output.h | |||
@@ -28,47 +28,6 @@ | |||
28 | #ifndef MDFLD_OUTPUT_H | 28 | #ifndef MDFLD_OUTPUT_H |
29 | #define MDFLD_OUTPUT_H | 29 | #define MDFLD_OUTPUT_H |
30 | 30 | ||
31 | #include "psb_drv.h" | ||
32 | |||
33 | /* Panel types */ | ||
34 | enum { | ||
35 | TPO_CMD, | ||
36 | TPO_VID, | ||
37 | TMD_CMD, | ||
38 | TMD_VID, | ||
39 | PYR_CMD, | ||
40 | PYR_VID, | ||
41 | TPO, | ||
42 | TMD, | ||
43 | PYR, | ||
44 | HDMI, | ||
45 | GCT_DETECT | ||
46 | }; | ||
47 | |||
48 | /* Junk that belongs elsewhere */ | ||
49 | #define TPO_PANEL_WIDTH 84 | ||
50 | #define TPO_PANEL_HEIGHT 46 | ||
51 | #define TMD_PANEL_WIDTH 39 | ||
52 | #define TMD_PANEL_HEIGHT 71 | ||
53 | #define PYR_PANEL_WIDTH 53 | ||
54 | #define PYR_PANEL_HEIGHT 95 | ||
55 | |||
56 | /* Panel interface */ | ||
57 | struct panel_info { | ||
58 | u32 width_mm; | ||
59 | u32 height_mm; | ||
60 | }; | ||
61 | |||
62 | struct mdfld_dsi_dbi_output; | ||
63 | |||
64 | struct panel_funcs { | ||
65 | const struct drm_encoder_funcs *encoder_funcs; | ||
66 | const struct drm_encoder_helper_funcs *encoder_helper_funcs; | ||
67 | struct drm_display_mode *(*get_config_mode) (struct drm_device *); | ||
68 | void (*update_fb) (struct mdfld_dsi_dbi_output *, int); | ||
69 | int (*get_panel_info) (struct drm_device *, int, struct panel_info *); | ||
70 | }; | ||
71 | |||
72 | int mdfld_output_init(struct drm_device *dev); | 31 | int mdfld_output_init(struct drm_device *dev); |
73 | int mdfld_panel_dpi(struct drm_device *dev); | 32 | int mdfld_panel_dpi(struct drm_device *dev); |
74 | int mdfld_get_panel_type(struct drm_device *dev, int pipe); | 33 | int mdfld_get_panel_type(struct drm_device *dev, int pipe); |
diff --git a/drivers/staging/gma500/mdfld_pyr_cmd.c b/drivers/staging/gma500/mdfld_pyr_cmd.c index 0d89384fe37d..5f38e8df3759 100644 --- a/drivers/staging/gma500/mdfld_pyr_cmd.c +++ b/drivers/staging/gma500/mdfld_pyr_cmd.c | |||
@@ -188,7 +188,7 @@ static void pyr_dsi_controller_dbi_init(struct mdfld_dsi_config *dsi_config, | |||
188 | 188 | ||
189 | dev_dbg(dev->dev, "Init DBI interface on pipe %d...\n", pipe); | 189 | dev_dbg(dev->dev, "Init DBI interface on pipe %d...\n", pipe); |
190 | 190 | ||
191 | /* In-ready device */ | 191 | /* Un-ready device */ |
192 | REG_WRITE((MIPIA_DEVICE_READY_REG + reg_offset), 0x00000000); | 192 | REG_WRITE((MIPIA_DEVICE_READY_REG + reg_offset), 0x00000000); |
193 | 193 | ||
194 | /* Init dsi adapter before kicking off */ | 194 | /* Init dsi adapter before kicking off */ |
@@ -394,25 +394,13 @@ static void pyr_dsi_dbi_dpms(struct drm_encoder *encoder, int mode) | |||
394 | struct mdfld_dsi_dbi_output *dbi_output = | 394 | struct mdfld_dsi_dbi_output *dbi_output = |
395 | MDFLD_DSI_DBI_OUTPUT(dsi_encoder); | 395 | MDFLD_DSI_DBI_OUTPUT(dsi_encoder); |
396 | struct drm_device *dev = dbi_output->dev; | 396 | struct drm_device *dev = dbi_output->dev; |
397 | struct drm_psb_private *dev_priv = dev->dev_private; | ||
398 | static bool bdispoff; | ||
399 | 397 | ||
400 | dev_dbg(dev->dev, "%s\n", (mode == DRM_MODE_DPMS_ON ? "on" : "off")); | 398 | dev_dbg(dev->dev, "%s\n", (mode == DRM_MODE_DPMS_ON ? "on" : "off")); |
401 | 399 | ||
402 | if (mode == DRM_MODE_DPMS_ON) { | 400 | if (mode == DRM_MODE_DPMS_ON) |
403 | if (/*gbgfxsuspended && */bdispoff) { | ||
404 | bdispoff = false; | ||
405 | dev_priv->dispstatus = true; | ||
406 | /*gbgfxsuspended = false; | ||
407 | */ | ||
408 | mdfld_dsi_dbi_exit_dsr(dev, MDFLD_DSR_2D_3D, 0, 0); | ||
409 | } | ||
410 | pyr_dsi_dbi_set_power(encoder, true); | 401 | pyr_dsi_dbi_set_power(encoder, true); |
411 | } else { | 402 | else |
412 | bdispoff = true; | ||
413 | dev_priv->dispstatus = false; | ||
414 | pyr_dsi_dbi_set_power(encoder, false); | 403 | pyr_dsi_dbi_set_power(encoder, false); |
415 | } | ||
416 | } | 404 | } |
417 | 405 | ||
418 | /* | 406 | /* |
diff --git a/drivers/staging/gma500/mdfld_tmd_vid.c b/drivers/staging/gma500/mdfld_tmd_vid.c index b29c905f0771..affdc09c6769 100644 --- a/drivers/staging/gma500/mdfld_tmd_vid.c +++ b/drivers/staging/gma500/mdfld_tmd_vid.c | |||
@@ -114,6 +114,66 @@ static int tmd_vid_get_panel_info(struct drm_device *dev, | |||
114 | return 0; | 114 | return 0; |
115 | } | 115 | } |
116 | 116 | ||
117 | /* | ||
118 | * mdfld_init_TMD_MIPI - initialise a TMD interface | ||
119 | * @dsi_config: configuration | ||
120 | * @pipe: pipe to configure | ||
121 | * | ||
122 | * This function is called only by mrst_dsi_mode_set and | ||
123 | * restore_display_registers. since this function does not | ||
124 | * acquire the mutex, it is important that the calling function | ||
125 | * does! | ||
126 | */ | ||
127 | |||
128 | |||
129 | static void mdfld_dsi_tmd_drv_ic_init(struct mdfld_dsi_config *dsi_config, | ||
130 | int pipe) | ||
131 | { | ||
132 | static u32 tmd_cmd_mcap_off[] = {0x000000b2}; | ||
133 | static u32 tmd_cmd_enable_lane_switch[] = {0x000101ef}; | ||
134 | static u32 tmd_cmd_set_lane_num[] = {0x006360ef}; | ||
135 | static u32 tmd_cmd_pushing_clock0[] = {0x00cc2fef}; | ||
136 | static u32 tmd_cmd_pushing_clock1[] = {0x00dd6eef}; | ||
137 | static u32 tmd_cmd_set_mode[] = {0x000000b3}; | ||
138 | static u32 tmd_cmd_set_sync_pulse_mode[] = {0x000961ef}; | ||
139 | static u32 tmd_cmd_set_column[] = {0x0100002a, 0x000000df}; | ||
140 | static u32 tmd_cmd_set_page[] = {0x0300002b, 0x00000055}; | ||
141 | static u32 tmd_cmd_set_video_mode[] = {0x00000153}; | ||
142 | /*no auto_bl,need add in furture*/ | ||
143 | static u32 tmd_cmd_enable_backlight[] = {0x00005ab4}; | ||
144 | static u32 tmd_cmd_set_backlight_dimming[] = {0x00000ebd}; | ||
145 | |||
146 | struct mdfld_dsi_pkg_sender *sender | ||
147 | = mdfld_dsi_get_pkg_sender(dsi_config); | ||
148 | |||
149 | DRM_INFO("Enter mdfld init TMD MIPI display.\n"); | ||
150 | |||
151 | if (!sender) { | ||
152 | DRM_ERROR("Cannot get sender\n"); | ||
153 | return; | ||
154 | } | ||
155 | |||
156 | if (dsi_config->dvr_ic_inited) | ||
157 | return; | ||
158 | |||
159 | msleep(3); | ||
160 | |||
161 | mdfld_dsi_send_gen_long_lp(sender, tmd_cmd_mcap_off, 1, 0); | ||
162 | mdfld_dsi_send_gen_long_lp(sender, tmd_cmd_enable_lane_switch, 1, 0); | ||
163 | mdfld_dsi_send_gen_long_lp(sender, tmd_cmd_set_lane_num, 1, 0); | ||
164 | mdfld_dsi_send_gen_long_lp(sender, tmd_cmd_pushing_clock0, 1, 0); | ||
165 | mdfld_dsi_send_gen_long_lp(sender, tmd_cmd_pushing_clock1, 1, 0); | ||
166 | mdfld_dsi_send_gen_long_lp(sender, tmd_cmd_set_mode, 1, 0); | ||
167 | mdfld_dsi_send_gen_long_lp(sender, tmd_cmd_set_sync_pulse_mode, 1, 0); | ||
168 | mdfld_dsi_send_mcs_long_lp(sender, tmd_cmd_set_column, 2, 0); | ||
169 | mdfld_dsi_send_mcs_long_lp(sender, tmd_cmd_set_page, 2, 0); | ||
170 | mdfld_dsi_send_gen_long_lp(sender, tmd_cmd_set_video_mode, 1, 0); | ||
171 | mdfld_dsi_send_gen_long_lp(sender, tmd_cmd_enable_backlight, 1, 0); | ||
172 | mdfld_dsi_send_gen_long_lp(sender, tmd_cmd_set_backlight_dimming, 1, 0); | ||
173 | |||
174 | dsi_config->dvr_ic_inited = 1; | ||
175 | } | ||
176 | |||
117 | /* TMD DPI encoder helper funcs */ | 177 | /* TMD DPI encoder helper funcs */ |
118 | static const struct drm_encoder_helper_funcs | 178 | static const struct drm_encoder_helper_funcs |
119 | mdfld_tpo_dpi_encoder_helper_funcs = { | 179 | mdfld_tpo_dpi_encoder_helper_funcs = { |
@@ -141,4 +201,6 @@ void tmd_vid_init(struct drm_device *dev, struct panel_funcs *p_funcs) | |||
141 | p_funcs->get_config_mode = &tmd_vid_get_config_mode; | 201 | p_funcs->get_config_mode = &tmd_vid_get_config_mode; |
142 | p_funcs->update_fb = NULL; | 202 | p_funcs->update_fb = NULL; |
143 | p_funcs->get_panel_info = tmd_vid_get_panel_info; | 203 | p_funcs->get_panel_info = tmd_vid_get_panel_info; |
204 | p_funcs->reset = mdfld_dsi_panel_reset; | ||
205 | p_funcs->drv_ic_init = mdfld_dsi_tmd_drv_ic_init; | ||
144 | } | 206 | } |
diff --git a/drivers/staging/gma500/mdfld_tpo_cmd.c b/drivers/staging/gma500/mdfld_tpo_cmd.c index d2e1818bb412..4cf7647257f9 100644 --- a/drivers/staging/gma500/mdfld_tpo_cmd.c +++ b/drivers/staging/gma500/mdfld_tpo_cmd.c | |||
@@ -126,11 +126,15 @@ static void mdfld_dsi_dbi_set_power(struct drm_encoder *encoder, bool on) | |||
126 | struct mdfld_dsi_encoder *dsi_encoder = MDFLD_DSI_ENCODER(encoder); | 126 | struct mdfld_dsi_encoder *dsi_encoder = MDFLD_DSI_ENCODER(encoder); |
127 | struct mdfld_dsi_dbi_output *dbi_output = | 127 | struct mdfld_dsi_dbi_output *dbi_output = |
128 | MDFLD_DSI_DBI_OUTPUT(dsi_encoder); | 128 | MDFLD_DSI_DBI_OUTPUT(dsi_encoder); |
129 | /*struct drm_device *dev = dbi_output->dev;*/ | 129 | struct mdfld_dsi_config *dsi_config = |
130 | mdfld_dsi_encoder_get_config(dsi_encoder); | ||
131 | struct mdfld_dsi_pkg_sender *sender = | ||
132 | mdfld_dsi_encoder_get_pkg_sender(dsi_encoder); | ||
130 | struct drm_device *dev = encoder->dev; | 133 | struct drm_device *dev = encoder->dev; |
131 | struct drm_psb_private *dev_priv = dev->dev_private; | 134 | struct drm_psb_private *dev_priv = dev->dev_private; |
132 | u32 reg_offset = 0; | 135 | u32 reg_offset = 0; |
133 | int pipe = (dbi_output->channel_num == 0) ? 0 : 2; | 136 | int pipe = (dbi_output->channel_num == 0) ? 0 : 2; |
137 | u32 data = 0; | ||
134 | 138 | ||
135 | dev_dbg(dev->dev, "pipe %d : %s, panel on: %s\n", | 139 | dev_dbg(dev->dev, "pipe %d : %s, panel on: %s\n", |
136 | pipe, on ? "On" : "Off", | 140 | pipe, on ? "On" : "Off", |
@@ -190,9 +194,33 @@ static void mdfld_dsi_dbi_set_power(struct drm_encoder *encoder, bool on) | |||
190 | } | 194 | } |
191 | } | 195 | } |
192 | 196 | ||
197 | /* | ||
198 | * FIXME: this is a WA for TPO panel crash on DPMS on & off around | ||
199 | * 83 times. the root cause of this issue is that Booster in | ||
200 | * drvIC crashed. Add this WA so that we can resume the driver IC | ||
201 | * once we found that booster has a fault | ||
202 | */ | ||
203 | mdfld_dsi_get_power_mode(dsi_config, | ||
204 | &data, | ||
205 | MDFLD_DSI_HS_TRANSMISSION); | ||
206 | |||
207 | if (on && data && !(data & (1 << 7))) { | ||
208 | /* Soft reset */ | ||
209 | mdfld_dsi_send_dcs(sender, | ||
210 | DCS_SOFT_RESET, | ||
211 | NULL, | ||
212 | 0, | ||
213 | CMD_DATA_SRC_PIPE, | ||
214 | MDFLD_DSI_SEND_PACKAGE); | ||
215 | |||
216 | /* Init drvIC */ | ||
217 | if (dbi_output->p_funcs->drv_ic_init) | ||
218 | dbi_output->p_funcs->drv_ic_init(dsi_config, | ||
219 | pipe); | ||
220 | } | ||
221 | |||
193 | out_err: | 222 | out_err: |
194 | gma_power_end(dev); | 223 | gma_power_end(dev); |
195 | |||
196 | if (ret) | 224 | if (ret) |
197 | dev_err(dev->dev, "failed\n"); | 225 | dev_err(dev->dev, "failed\n"); |
198 | } | 226 | } |
@@ -253,14 +281,6 @@ static void mdfld_dsi_dbi_mode_set(struct drm_encoder *encoder, | |||
253 | return; | 281 | return; |
254 | } | 282 | } |
255 | 283 | ||
256 | /* Set up pipe related registers */ | ||
257 | REG_WRITE(mipi_reg, mipi_val); | ||
258 | REG_READ(mipi_reg); | ||
259 | |||
260 | mdfld_dsi_controller_dbi_init(dsi_config, pipe); | ||
261 | |||
262 | msleep(20); | ||
263 | |||
264 | REG_WRITE(dspcntr_reg, dspcntr_val); | 284 | REG_WRITE(dspcntr_reg, dspcntr_val); |
265 | REG_READ(dspcntr_reg); | 285 | REG_READ(dspcntr_reg); |
266 | 286 | ||
@@ -268,7 +288,7 @@ static void mdfld_dsi_dbi_mode_set(struct drm_encoder *encoder, | |||
268 | msleep(20); | 288 | msleep(20); |
269 | 289 | ||
270 | /* Send exit_sleep_mode DCS */ | 290 | /* Send exit_sleep_mode DCS */ |
271 | ret = mdfld_dsi_dbi_send_dcs(dsi_output, exit_sleep_mode, | 291 | ret = mdfld_dsi_dbi_send_dcs(dsi_output, DCS_EXIT_SLEEP_MODE, |
272 | NULL, 0, CMD_DATA_SRC_SYSTEM_MEM); | 292 | NULL, 0, CMD_DATA_SRC_SYSTEM_MEM); |
273 | if (ret) { | 293 | if (ret) { |
274 | dev_err(dev->dev, "sent exit_sleep_mode faild\n"); | 294 | dev_err(dev->dev, "sent exit_sleep_mode faild\n"); |
@@ -276,7 +296,7 @@ static void mdfld_dsi_dbi_mode_set(struct drm_encoder *encoder, | |||
276 | } | 296 | } |
277 | 297 | ||
278 | /* Send set_tear_on DCS */ | 298 | /* Send set_tear_on DCS */ |
279 | ret = mdfld_dsi_dbi_send_dcs(dsi_output, set_tear_on, | 299 | ret = mdfld_dsi_dbi_send_dcs(dsi_output, DCS_SET_TEAR_ON, |
280 | ¶m, 1, CMD_DATA_SRC_SYSTEM_MEM); | 300 | ¶m, 1, CMD_DATA_SRC_SYSTEM_MEM); |
281 | if (ret) { | 301 | if (ret) { |
282 | dev_err(dev->dev, "%s - sent set_tear_on faild\n", __func__); | 302 | dev_err(dev->dev, "%s - sent set_tear_on faild\n", __func__); |
@@ -284,11 +304,6 @@ static void mdfld_dsi_dbi_mode_set(struct drm_encoder *encoder, | |||
284 | } | 304 | } |
285 | 305 | ||
286 | /* Do some init stuff */ | 306 | /* Do some init stuff */ |
287 | mdfld_dsi_brightness_init(dsi_config, pipe); | ||
288 | |||
289 | mdfld_dsi_gen_fifo_ready(dev, (MIPIA_GEN_FIFO_STAT_REG + reg_offset), | ||
290 | HS_CTRL_FIFO_EMPTY | HS_DATA_FIFO_EMPTY); | ||
291 | |||
292 | REG_WRITE(pipeconf_reg, pipeconf_val | PIPEACONF_DSR); | 307 | REG_WRITE(pipeconf_reg, pipeconf_val | PIPEACONF_DSR); |
293 | REG_READ(pipeconf_reg); | 308 | REG_READ(pipeconf_reg); |
294 | 309 | ||
@@ -375,23 +390,24 @@ static void mdfld_dsi_dbi_dpms(struct drm_encoder *encoder, int mode) | |||
375 | * if everything goes right, hw_begin will resume them all | 390 | * if everything goes right, hw_begin will resume them all |
376 | * during set_power. | 391 | * during set_power. |
377 | */ | 392 | */ |
378 | if (bdispoff) | 393 | if (bdispoff /* FIXME && gbgfxsuspended */) { |
379 | mdfld_dsi_dbi_exit_dsr(dev, MDFLD_DSR_2D_3D, 0, 0); | 394 | mdfld_dsi_dbi_exit_dsr(dev, MDFLD_DSR_2D_3D); |
395 | bdispoff = false; | ||
396 | dev_priv->dispstatus = true; | ||
397 | } | ||
380 | 398 | ||
381 | mdfld_dsi_dbi_set_power(encoder, true); | 399 | mdfld_dsi_dbi_set_power(encoder, true); |
382 | /* FIXME if (gbgfxsuspended) | 400 | /* FIXME if (gbgfxsuspended) |
383 | gbgfxsuspended = false; */ | 401 | gbgfxsuspended = false; */ |
384 | bdispoff = false; | ||
385 | dev_priv->dispstatus = true; | ||
386 | } else { | 402 | } else { |
387 | /* | 403 | /* |
388 | * I am not sure whether this is the perfect place to | 404 | * I am not sure whether this is the perfect place to |
389 | * turn rpm on since we still have a lot of CRTC turnning | 405 | * turn rpm on since we still have a lot of CRTC turnning |
390 | * on work to do. | 406 | * on work to do. |
391 | */ | 407 | */ |
392 | mdfld_dsi_dbi_set_power(encoder, false); | ||
393 | bdispoff = true; | 408 | bdispoff = true; |
394 | dev_priv->dispstatus = false; | 409 | dev_priv->dispstatus = false; |
410 | mdfld_dsi_dbi_set_power(encoder, false); | ||
395 | } | 411 | } |
396 | } | 412 | } |
397 | 413 | ||
@@ -446,7 +462,7 @@ static void mdfld_dsi_dbi_update_fb(struct mdfld_dsi_dbi_output *dbi_output, | |||
446 | REG_READ(dspsurf_reg); | 462 | REG_READ(dspsurf_reg); |
447 | 463 | ||
448 | mdfld_dsi_send_dcs(sender, | 464 | mdfld_dsi_send_dcs(sender, |
449 | write_mem_start, | 465 | DCS_WRITE_MEM_START, |
450 | NULL, | 466 | NULL, |
451 | 0, | 467 | 0, |
452 | CMD_DATA_SRC_PIPE, | 468 | CMD_DATA_SRC_PIPE, |
@@ -492,4 +508,6 @@ void tpo_cmd_init(struct drm_device *dev, struct panel_funcs *p_funcs) | |||
492 | p_funcs->get_config_mode = &tpo_cmd_get_config_mode; | 508 | p_funcs->get_config_mode = &tpo_cmd_get_config_mode; |
493 | p_funcs->update_fb = mdfld_dsi_dbi_update_fb; | 509 | p_funcs->update_fb = mdfld_dsi_dbi_update_fb; |
494 | p_funcs->get_panel_info = tpo_cmd_get_panel_info; | 510 | p_funcs->get_panel_info = tpo_cmd_get_panel_info; |
511 | p_funcs->reset = mdfld_dsi_panel_reset; | ||
512 | p_funcs->drv_ic_init = mdfld_dsi_brightness_init; | ||
495 | } | 513 | } |
diff --git a/drivers/staging/gma500/mrst_lvds.c b/drivers/staging/gma500/mrst_lvds.c index 25fde4cc910e..ac791c48eeda 100644 --- a/drivers/staging/gma500/mrst_lvds.c +++ b/drivers/staging/gma500/mrst_lvds.c | |||
@@ -58,11 +58,11 @@ static void mrst_lvds_set_power(struct drm_device *dev, | |||
58 | pp_status = REG_READ(PP_STATUS); | 58 | pp_status = REG_READ(PP_STATUS); |
59 | } while ((pp_status & (PP_ON | PP_READY)) == PP_READY); | 59 | } while ((pp_status & (PP_ON | PP_READY)) == PP_READY); |
60 | dev_priv->is_lvds_on = true; | 60 | dev_priv->is_lvds_on = true; |
61 | if (dev_priv->ops->lvds_bl_power) | 61 | if (dev_priv->ops->lvds_bl_power) |
62 | dev_priv->ops->lvds_bl_power(dev, true); | 62 | dev_priv->ops->lvds_bl_power(dev, true); |
63 | } else { | 63 | } else { |
64 | if (dev_priv->ops->lvds_bl_power) | 64 | if (dev_priv->ops->lvds_bl_power) |
65 | dev_priv->ops->lvds_bl_power(dev, false); | 65 | dev_priv->ops->lvds_bl_power(dev, false); |
66 | REG_WRITE(PP_CONTROL, REG_READ(PP_CONTROL) & | 66 | REG_WRITE(PP_CONTROL, REG_READ(PP_CONTROL) & |
67 | ~POWER_TARGET_ON); | 67 | ~POWER_TARGET_ON); |
68 | do { | 68 | do { |
@@ -151,6 +151,7 @@ static void mrst_lvds_prepare(struct drm_encoder *encoder) | |||
151 | { | 151 | { |
152 | struct drm_device *dev = encoder->dev; | 152 | struct drm_device *dev = encoder->dev; |
153 | struct psb_intel_output *output = enc_to_psb_intel_output(encoder); | 153 | struct psb_intel_output *output = enc_to_psb_intel_output(encoder); |
154 | struct psb_intel_mode_device *mode_dev = output->mode_dev; | ||
154 | 155 | ||
155 | if (!gma_power_begin(dev, true)) | 156 | if (!gma_power_begin(dev, true)) |
156 | return; | 157 | return; |
@@ -162,23 +163,43 @@ static void mrst_lvds_prepare(struct drm_encoder *encoder) | |||
162 | gma_power_end(dev); | 163 | gma_power_end(dev); |
163 | } | 164 | } |
164 | 165 | ||
166 | static u32 mrst_lvds_get_max_backlight(struct drm_device *dev) | ||
167 | { | ||
168 | struct drm_psb_private *dev_priv = dev->dev_private; | ||
169 | u32 ret; | ||
170 | |||
171 | if (gma_power_begin(dev, false)) { | ||
172 | ret = ((REG_READ(BLC_PWM_CTL) & | ||
173 | BACKLIGHT_MODULATION_FREQ_MASK) >> | ||
174 | BACKLIGHT_MODULATION_FREQ_SHIFT) * 2; | ||
175 | |||
176 | gma_power_end(dev); | ||
177 | } else | ||
178 | ret = ((dev_priv->saveBLC_PWM_CTL & | ||
179 | BACKLIGHT_MODULATION_FREQ_MASK) >> | ||
180 | BACKLIGHT_MODULATION_FREQ_SHIFT) * 2; | ||
181 | |||
182 | return ret; | ||
183 | } | ||
184 | |||
165 | static void mrst_lvds_commit(struct drm_encoder *encoder) | 185 | static void mrst_lvds_commit(struct drm_encoder *encoder) |
166 | { | 186 | { |
167 | struct drm_device *dev = encoder->dev; | 187 | struct drm_device *dev = encoder->dev; |
168 | struct psb_intel_output *output = enc_to_psb_intel_output(encoder); | 188 | struct psb_intel_output *output = enc_to_psb_intel_output(encoder); |
189 | struct psb_intel_mode_device *mode_dev = output->mode_dev; | ||
169 | 190 | ||
170 | if (mode_dev->backlight_duty_cycle == 0) | 191 | if (mode_dev->backlight_duty_cycle == 0) |
171 | mode_dev->backlight_duty_cycle = | 192 | mode_dev->backlight_duty_cycle = |
172 | psb_intel_lvds_get_max_backlight(dev); | 193 | mrst_lvds_get_max_backlight(dev); |
173 | mrst_lvds_set_power(dev, output, true); | 194 | mrst_lvds_set_power(dev, output, true); |
174 | } | 195 | } |
175 | 196 | ||
176 | static const struct drm_encoder_helper_funcs mrst_lvds_helper_funcs = { | 197 | static const struct drm_encoder_helper_funcs mrst_lvds_helper_funcs = { |
177 | .dpms = mrst_lvds_dpms, | 198 | .dpms = mrst_lvds_dpms, |
178 | .mode_fixup = psb_intel_lvds_mode_fixup, | 199 | .mode_fixup = psb_intel_lvds_mode_fixup, |
179 | .prepare = mrst_intel_lvds_prepare, | 200 | .prepare = mrst_lvds_prepare, |
180 | .mode_set = mrst_lvds_mode_set, | 201 | .mode_set = mrst_lvds_mode_set, |
181 | .commit = mrst_intel_lvds_commit, | 202 | .commit = mrst_lvds_commit, |
182 | }; | 203 | }; |
183 | 204 | ||
184 | static struct drm_display_mode lvds_configuration_modes[] = { | 205 | static struct drm_display_mode lvds_configuration_modes[] = { |
diff --git a/drivers/staging/gma500/psb_drv.h b/drivers/staging/gma500/psb_drv.h index 194c64fb6c68..72f487a2a1b7 100644 --- a/drivers/staging/gma500/psb_drv.h +++ b/drivers/staging/gma500/psb_drv.h | |||
@@ -31,6 +31,7 @@ | |||
31 | #include "gtt.h" | 31 | #include "gtt.h" |
32 | #include "power.h" | 32 | #include "power.h" |
33 | #include "mrst.h" | 33 | #include "mrst.h" |
34 | #include "medfield.h" | ||
34 | 35 | ||
35 | /* Append new drm mode definition here, align with libdrm definition */ | 36 | /* Append new drm mode definition here, align with libdrm definition */ |
36 | #define DRM_MODE_SCALE_NO_SCALE 2 | 37 | #define DRM_MODE_SCALE_NO_SCALE 2 |
@@ -216,8 +217,8 @@ enum { | |||
216 | #define MDFLD_DSR_OVERLAY_0 (1 << 4) | 217 | #define MDFLD_DSR_OVERLAY_0 (1 << 4) |
217 | #define MDFLD_DSR_OVERLAY_2 (1 << 5) | 218 | #define MDFLD_DSR_OVERLAY_2 (1 << 5) |
218 | #define MDFLD_DSR_MIPI_CONTROL (1 << 6) | 219 | #define MDFLD_DSR_MIPI_CONTROL (1 << 6) |
219 | #define MDFLD_DSR_DAMAGE_MASK_0 (1 << 0) | (1 << 2) | (1 << 4) | 220 | #define MDFLD_DSR_DAMAGE_MASK_0 ((1 << 0) | (1 << 2) | (1 << 4)) |
220 | #define MDFLD_DSR_DAMAGE_MASK_2 (1 << 1) | (1 << 3) | (1 << 5) | 221 | #define MDFLD_DSR_DAMAGE_MASK_2 ((1 << 1) | (1 << 3) | (1 << 5)) |
221 | #define MDFLD_DSR_2D_3D (MDFLD_DSR_2D_3D_0 | MDFLD_DSR_2D_3D_2) | 222 | #define MDFLD_DSR_2D_3D (MDFLD_DSR_2D_3D_0 | MDFLD_DSR_2D_3D_2) |
222 | 223 | ||
223 | #define MDFLD_DSR_RR 45 | 224 | #define MDFLD_DSR_RR 45 |
@@ -605,7 +606,7 @@ struct drm_psb_private { | |||
605 | uint32_t dsr_idle_count; | 606 | uint32_t dsr_idle_count; |
606 | bool is_in_idle; | 607 | bool is_in_idle; |
607 | bool dsr_enable; | 608 | bool dsr_enable; |
608 | void (*exit_idle)(struct drm_device *dev, u32 update_src, void *p_surfaceAddr, bool check_hw_on_only); | 609 | void (*exit_idle)(struct drm_device *dev, u32 update_src); |
609 | 610 | ||
610 | /* 2D acceleration */ | 611 | /* 2D acceleration */ |
611 | struct mutex mutex_2d; | 612 | struct mutex mutex_2d; |