Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
mdfld_dsi_dpi.c
Go to the documentation of this file.
1 /*
2  * Copyright © 2010 Intel Corporation
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice (including the next
12  * paragraph) shall be included in all copies or substantial portions of the
13  * Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21  * DEALINGS IN THE SOFTWARE.
22  *
23  * Authors:
24  * jim liu <[email protected]>
25  * Jackie Li<[email protected]>
26  */
27 
28 #include "mdfld_dsi_dpi.h"
29 #include "mdfld_output.h"
30 #include "mdfld_dsi_pkg_sender.h"
31 #include "psb_drv.h"
32 #include "tc35876x-dsi-lvds.h"
33 
34 static void mdfld_dsi_dpi_shut_down(struct mdfld_dsi_dpi_output *output,
35  int pipe);
36 
37 static void mdfld_wait_for_HS_DATA_FIFO(struct drm_device *dev, u32 pipe)
38 {
39  u32 gen_fifo_stat_reg = MIPI_GEN_FIFO_STAT_REG(pipe);
40  int timeout = 0;
41 
42  udelay(500);
43 
44  /* This will time out after approximately 2+ seconds */
45  while ((timeout < 20000) &&
46  (REG_READ(gen_fifo_stat_reg) & DSI_FIFO_GEN_HS_DATA_FULL)) {
47  udelay(100);
48  timeout++;
49  }
50 
51  if (timeout == 20000)
52  DRM_INFO("MIPI: HS Data FIFO was never cleared!\n");
53 }
54 
55 static void mdfld_wait_for_HS_CTRL_FIFO(struct drm_device *dev, u32 pipe)
56 {
57  u32 gen_fifo_stat_reg = MIPI_GEN_FIFO_STAT_REG(pipe);
58  int timeout = 0;
59 
60  udelay(500);
61 
62  /* This will time out after approximately 2+ seconds */
63  while ((timeout < 20000) && (REG_READ(gen_fifo_stat_reg)
65  udelay(100);
66  timeout++;
67  }
68  if (timeout == 20000)
69  DRM_INFO("MIPI: HS CMD FIFO was never cleared!\n");
70 }
71 
72 static void mdfld_wait_for_DPI_CTRL_FIFO(struct drm_device *dev, u32 pipe)
73 {
74  u32 gen_fifo_stat_reg = MIPI_GEN_FIFO_STAT_REG(pipe);
75  int timeout = 0;
76 
77  udelay(500);
78 
79  /* This will time out after approximately 2+ seconds */
80  while ((timeout < 20000) && ((REG_READ(gen_fifo_stat_reg) &
81  DPI_FIFO_EMPTY) != DPI_FIFO_EMPTY)) {
82  udelay(100);
83  timeout++;
84  }
85 
86  if (timeout == 20000)
87  DRM_ERROR("MIPI: DPI FIFO was never cleared\n");
88 }
89 
90 static void mdfld_wait_for_SPL_PKG_SENT(struct drm_device *dev, u32 pipe)
91 {
92  u32 intr_stat_reg = MIPI_INTR_STAT_REG(pipe);
93  int timeout = 0;
94 
95  udelay(500);
96 
97  /* This will time out after approximately 2+ seconds */
98  while ((timeout < 20000) && (!(REG_READ(intr_stat_reg)
100  udelay(100);
101  timeout++;
102  }
103 
104  if (timeout == 20000)
105  DRM_ERROR("MIPI: SPL_PKT_SENT_INTERRUPT was not sent successfully!\n");
106 }
107 
108 /* For TC35876X */
109 
110 static void dsi_set_device_ready_state(struct drm_device *dev, int state,
111  int pipe)
112 {
113  REG_FLD_MOD(MIPI_DEVICE_READY_REG(pipe), !!state, 0, 0);
114 }
115 
116 static void dsi_set_pipe_plane_enable_state(struct drm_device *dev,
117  int state, int pipe)
118 {
119  struct drm_psb_private *dev_priv = dev->dev_private;
120  u32 pipeconf_reg = PIPEACONF;
121  u32 dspcntr_reg = DSPACNTR;
122 
123  u32 dspcntr = dev_priv->dspcntr[pipe];
125 
126  if (pipe) {
127  pipeconf_reg = PIPECCONF;
128  dspcntr_reg = DSPCCNTR;
129  } else
130  mipi &= (~0x03);
131 
132  if (state) {
133  /*Set up pipe */
134  REG_WRITE(pipeconf_reg, BIT(31));
135 
136  if (REG_BIT_WAIT(pipeconf_reg, 1, 30))
137  dev_err(&dev->pdev->dev, "%s: Pipe enable timeout\n",
138  __func__);
139 
140  /*Set up display plane */
141  REG_WRITE(dspcntr_reg, dspcntr);
142  } else {
143  u32 dspbase_reg = pipe ? MDFLD_DSPCBASE : MRST_DSPABASE;
144 
145  /* Put DSI lanes to ULPS to disable pipe */
146  REG_FLD_MOD(MIPI_DEVICE_READY_REG(pipe), 2, 2, 1);
147  REG_READ(MIPI_DEVICE_READY_REG(pipe)); /* posted write? */
148 
149  /* LP Hold */
150  REG_FLD_MOD(MIPI_PORT_CONTROL(pipe), 0, 16, 16);
151  REG_READ(MIPI_PORT_CONTROL(pipe)); /* posted write? */
152 
153  /* Disable display plane */
154  REG_FLD_MOD(dspcntr_reg, 0, 31, 31);
155 
156  /* Flush the plane changes ??? posted write? */
157  REG_WRITE(dspbase_reg, REG_READ(dspbase_reg));
158  REG_READ(dspbase_reg);
159 
160  /* Disable PIPE */
161  REG_FLD_MOD(pipeconf_reg, 0, 31, 31);
162 
163  if (REG_BIT_WAIT(pipeconf_reg, 0, 30))
164  dev_err(&dev->pdev->dev, "%s: Pipe disable timeout\n",
165  __func__);
166 
167  if (REG_BIT_WAIT(MIPI_GEN_FIFO_STAT_REG(pipe), 1, 28))
168  dev_err(&dev->pdev->dev, "%s: FIFO not empty\n",
169  __func__);
170  }
171 }
172 
173 static void mdfld_dsi_configure_down(struct mdfld_dsi_encoder *dsi_encoder,
174  int pipe)
175 {
176  struct mdfld_dsi_dpi_output *dpi_output =
177  MDFLD_DSI_DPI_OUTPUT(dsi_encoder);
178  struct mdfld_dsi_config *dsi_config =
179  mdfld_dsi_encoder_get_config(dsi_encoder);
180  struct drm_device *dev = dsi_config->dev;
181  struct drm_psb_private *dev_priv = dev->dev_private;
182 
183  if (!dev_priv->dpi_panel_on[pipe]) {
184  dev_err(dev->dev, "DPI panel is already off\n");
185  return;
186  }
189  dsi_set_pipe_plane_enable_state(dev, 0, pipe);
190  mdfld_dsi_dpi_shut_down(dpi_output, pipe);
191  dsi_set_device_ready_state(dev, 0, pipe);
192 }
193 
194 static void mdfld_dsi_configure_up(struct mdfld_dsi_encoder *dsi_encoder,
195  int pipe)
196 {
197  struct mdfld_dsi_dpi_output *dpi_output =
198  MDFLD_DSI_DPI_OUTPUT(dsi_encoder);
199  struct mdfld_dsi_config *dsi_config =
200  mdfld_dsi_encoder_get_config(dsi_encoder);
201  struct drm_device *dev = dsi_config->dev;
202  struct drm_psb_private *dev_priv = dev->dev_private;
203 
204  if (dev_priv->dpi_panel_on[pipe]) {
205  dev_err(dev->dev, "DPI panel is already on\n");
206  return;
207  }
208 
209  /* For resume path sequence */
210  mdfld_dsi_dpi_shut_down(dpi_output, pipe);
211  dsi_set_device_ready_state(dev, 0, pipe);
212 
213  dsi_set_device_ready_state(dev, 1, pipe);
216  mdfld_dsi_dpi_turn_on(dpi_output, pipe); /* Send turn on command */
217  dsi_set_pipe_plane_enable_state(dev, 1, pipe);
218 }
219 /* End for TC35876X */
220 
221 /* ************************************************************************* *\
222  * FUNCTION: mdfld_dsi_tpo_ic_init
223  *
224  * DESCRIPTION: This function is called only by mrst_dsi_mode_set and
225  * restore_display_registers. since this function does not
226  * acquire the mutex, it is important that the calling function
227  * does!
228 \* ************************************************************************* */
229 static void mdfld_dsi_tpo_ic_init(struct mdfld_dsi_config *dsi_config, u32 pipe)
230 {
231  struct drm_device *dev = dsi_config->dev;
232  u32 dcsChannelNumber = dsi_config->channel_num;
233  u32 gen_data_reg = MIPI_HS_GEN_DATA_REG(pipe);
234  u32 gen_ctrl_reg = MIPI_HS_GEN_CTRL_REG(pipe);
235  u32 gen_ctrl_val = GEN_LONG_WRITE;
236 
237  DRM_INFO("Enter mrst init TPO MIPI display.\n");
238 
239  gen_ctrl_val |= dcsChannelNumber << DCS_CHANNEL_NUMBER_POS;
240 
241  /* Flip page order */
242  mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
243  REG_WRITE(gen_data_reg, 0x00008036);
244  mdfld_wait_for_HS_CTRL_FIFO(dev, pipe);
245  REG_WRITE(gen_ctrl_reg, gen_ctrl_val | (0x02 << WORD_COUNTS_POS));
246 
247  /* 0xF0 */
248  mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
249  REG_WRITE(gen_data_reg, 0x005a5af0);
250  mdfld_wait_for_HS_CTRL_FIFO(dev, pipe);
251  REG_WRITE(gen_ctrl_reg, gen_ctrl_val | (0x03 << WORD_COUNTS_POS));
252 
253  /* Write protection key */
254  mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
255  REG_WRITE(gen_data_reg, 0x005a5af1);
256  mdfld_wait_for_HS_CTRL_FIFO(dev, pipe);
257  REG_WRITE(gen_ctrl_reg, gen_ctrl_val | (0x03 << WORD_COUNTS_POS));
258 
259  /* 0xFC */
260  mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
261  REG_WRITE(gen_data_reg, 0x005a5afc);
262  mdfld_wait_for_HS_CTRL_FIFO(dev, pipe);
263  REG_WRITE(gen_ctrl_reg, gen_ctrl_val | (0x03 << WORD_COUNTS_POS));
264 
265  /* 0xB7 */
266  mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
267  REG_WRITE(gen_data_reg, 0x770000b7);
268  mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
269  REG_WRITE(gen_data_reg, 0x00000044);
270  mdfld_wait_for_HS_CTRL_FIFO(dev, pipe);
271  REG_WRITE(gen_ctrl_reg, gen_ctrl_val | (0x05 << WORD_COUNTS_POS));
272 
273  /* 0xB6 */
274  mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
275  REG_WRITE(gen_data_reg, 0x000a0ab6);
276  mdfld_wait_for_HS_CTRL_FIFO(dev, pipe);
277  REG_WRITE(gen_ctrl_reg, gen_ctrl_val | (0x03 << WORD_COUNTS_POS));
278 
279  /* 0xF2 */
280  mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
281  REG_WRITE(gen_data_reg, 0x081010f2);
282  mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
283  REG_WRITE(gen_data_reg, 0x4a070708);
284  mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
285  REG_WRITE(gen_data_reg, 0x000000c5);
286  mdfld_wait_for_HS_CTRL_FIFO(dev, pipe);
287  REG_WRITE(gen_ctrl_reg, gen_ctrl_val | (0x09 << WORD_COUNTS_POS));
288 
289  /* 0xF8 */
290  mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
291  REG_WRITE(gen_data_reg, 0x024003f8);
292  mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
293  REG_WRITE(gen_data_reg, 0x01030a04);
294  mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
295  REG_WRITE(gen_data_reg, 0x0e020220);
296  mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
297  REG_WRITE(gen_data_reg, 0x00000004);
298  mdfld_wait_for_HS_CTRL_FIFO(dev, pipe);
299  REG_WRITE(gen_ctrl_reg, gen_ctrl_val | (0x0d << WORD_COUNTS_POS));
300 
301  /* 0xE2 */
302  mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
303  REG_WRITE(gen_data_reg, 0x398fc3e2);
304  mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
305  REG_WRITE(gen_data_reg, 0x0000916f);
306  mdfld_wait_for_HS_CTRL_FIFO(dev, pipe);
307  REG_WRITE(gen_ctrl_reg, gen_ctrl_val | (0x06 << WORD_COUNTS_POS));
308 
309  /* 0xB0 */
310  mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
311  REG_WRITE(gen_data_reg, 0x000000b0);
312  mdfld_wait_for_HS_CTRL_FIFO(dev, pipe);
313  REG_WRITE(gen_ctrl_reg, gen_ctrl_val | (0x02 << WORD_COUNTS_POS));
314 
315  /* 0xF4 */
316  mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
317  REG_WRITE(gen_data_reg, 0x240242f4);
318  mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
319  REG_WRITE(gen_data_reg, 0x78ee2002);
320  mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
321  REG_WRITE(gen_data_reg, 0x2a071050);
322  mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
323  REG_WRITE(gen_data_reg, 0x507fee10);
324  mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
325  REG_WRITE(gen_data_reg, 0x10300710);
326  mdfld_wait_for_HS_CTRL_FIFO(dev, pipe);
327  REG_WRITE(gen_ctrl_reg, gen_ctrl_val | (0x14 << WORD_COUNTS_POS));
328 
329  /* 0xBA */
330  mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
331  REG_WRITE(gen_data_reg, 0x19fe07ba);
332  mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
333  REG_WRITE(gen_data_reg, 0x101c0a31);
334  mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
335  REG_WRITE(gen_data_reg, 0x00000010);
336  mdfld_wait_for_HS_CTRL_FIFO(dev, pipe);
337  REG_WRITE(gen_ctrl_reg, gen_ctrl_val | (0x09 << WORD_COUNTS_POS));
338 
339  /* 0xBB */
340  mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
341  REG_WRITE(gen_data_reg, 0x28ff07bb);
342  mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
343  REG_WRITE(gen_data_reg, 0x24280a31);
344  mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
345  REG_WRITE(gen_data_reg, 0x00000034);
346  mdfld_wait_for_HS_CTRL_FIFO(dev, pipe);
347  REG_WRITE(gen_ctrl_reg, gen_ctrl_val | (0x09 << WORD_COUNTS_POS));
348 
349  /* 0xFB */
350  mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
351  REG_WRITE(gen_data_reg, 0x535d05fb);
352  mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
353  REG_WRITE(gen_data_reg, 0x1b1a2130);
354  mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
355  REG_WRITE(gen_data_reg, 0x221e180e);
356  mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
357  REG_WRITE(gen_data_reg, 0x131d2120);
358  mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
359  REG_WRITE(gen_data_reg, 0x535d0508);
360  mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
361  REG_WRITE(gen_data_reg, 0x1c1a2131);
362  mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
363  REG_WRITE(gen_data_reg, 0x231f160d);
364  mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
365  REG_WRITE(gen_data_reg, 0x111b2220);
366  mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
367  REG_WRITE(gen_data_reg, 0x535c2008);
368  mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
369  REG_WRITE(gen_data_reg, 0x1f1d2433);
370  mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
371  REG_WRITE(gen_data_reg, 0x2c251a10);
372  mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
373  REG_WRITE(gen_data_reg, 0x2c34372d);
374  mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
375  REG_WRITE(gen_data_reg, 0x00000023);
376  mdfld_wait_for_HS_CTRL_FIFO(dev, pipe);
377  REG_WRITE(gen_ctrl_reg, gen_ctrl_val | (0x31 << WORD_COUNTS_POS));
378 
379  /* 0xFA */
380  mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
381  REG_WRITE(gen_data_reg, 0x525c0bfa);
382  mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
383  REG_WRITE(gen_data_reg, 0x1c1c232f);
384  mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
385  REG_WRITE(gen_data_reg, 0x2623190e);
386  mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
387  REG_WRITE(gen_data_reg, 0x18212625);
388  mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
389  REG_WRITE(gen_data_reg, 0x545d0d0e);
390  mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
391  REG_WRITE(gen_data_reg, 0x1e1d2333);
392  mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
393  REG_WRITE(gen_data_reg, 0x26231a10);
394  mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
395  REG_WRITE(gen_data_reg, 0x1a222725);
396  mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
397  REG_WRITE(gen_data_reg, 0x545d280f);
398  mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
399  REG_WRITE(gen_data_reg, 0x21202635);
400  mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
401  REG_WRITE(gen_data_reg, 0x31292013);
402  mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
403  REG_WRITE(gen_data_reg, 0x31393d33);
404  mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
405  REG_WRITE(gen_data_reg, 0x00000029);
406  mdfld_wait_for_HS_CTRL_FIFO(dev, pipe);
407  REG_WRITE(gen_ctrl_reg, gen_ctrl_val | (0x31 << WORD_COUNTS_POS));
408 
409  /* Set DM */
410  mdfld_wait_for_HS_DATA_FIFO(dev, pipe);
411  REG_WRITE(gen_data_reg, 0x000100f7);
412  mdfld_wait_for_HS_CTRL_FIFO(dev, pipe);
413  REG_WRITE(gen_ctrl_reg, gen_ctrl_val | (0x03 << WORD_COUNTS_POS));
414 }
415 
416 static u16 mdfld_dsi_dpi_to_byte_clock_count(int pixel_clock_count,
417  int num_lane, int bpp)
418 {
419  return (u16)((pixel_clock_count * bpp) / (num_lane * 8));
420 }
421 
422 /*
423  * Calculate the dpi time basing on a given drm mode @mode
424  * return 0 on success.
425  * FIXME: I was using proposed mode value for calculation, may need to
426  * use crtc mode values later
427  */
429  struct mdfld_dsi_dpi_timing *dpi_timing,
430  int num_lane, int bpp)
431 {
432  int pclk_hsync, pclk_hfp, pclk_hbp, pclk_hactive;
433  int pclk_vsync, pclk_vfp, pclk_vbp;
434 
435  pclk_hactive = mode->hdisplay;
436  pclk_hfp = mode->hsync_start - mode->hdisplay;
437  pclk_hsync = mode->hsync_end - mode->hsync_start;
438  pclk_hbp = mode->htotal - mode->hsync_end;
439 
440  pclk_vfp = mode->vsync_start - mode->vdisplay;
441  pclk_vsync = mode->vsync_end - mode->vsync_start;
442  pclk_vbp = mode->vtotal - mode->vsync_end;
443 
444  /*
445  * byte clock counts were calculated by following formula
446  * bclock_count = pclk_count * bpp / num_lane / 8
447  */
448  dpi_timing->hsync_count = mdfld_dsi_dpi_to_byte_clock_count(
449  pclk_hsync, num_lane, bpp);
450  dpi_timing->hbp_count = mdfld_dsi_dpi_to_byte_clock_count(
451  pclk_hbp, num_lane, bpp);
452  dpi_timing->hfp_count = mdfld_dsi_dpi_to_byte_clock_count(
453  pclk_hfp, num_lane, bpp);
454  dpi_timing->hactive_count = mdfld_dsi_dpi_to_byte_clock_count(
455  pclk_hactive, num_lane, bpp);
456  dpi_timing->vsync_count = mdfld_dsi_dpi_to_byte_clock_count(
457  pclk_vsync, num_lane, bpp);
458  dpi_timing->vbp_count = mdfld_dsi_dpi_to_byte_clock_count(
459  pclk_vbp, num_lane, bpp);
460  dpi_timing->vfp_count = mdfld_dsi_dpi_to_byte_clock_count(
461  pclk_vfp, num_lane, bpp);
462 
463  return 0;
464 }
465 
467  int pipe)
468 {
469  struct drm_device *dev = dsi_config->dev;
470  int lane_count = dsi_config->lane_count;
471  struct mdfld_dsi_dpi_timing dpi_timing;
472  struct drm_display_mode *mode = dsi_config->mode;
473  u32 val;
474 
475  /*un-ready device*/
476  REG_FLD_MOD(MIPI_DEVICE_READY_REG(pipe), 0, 0, 0);
477 
478  /*init dsi adapter before kicking off*/
479  REG_WRITE(MIPI_CTRL_REG(pipe), 0x00000018);
480 
481  /*enable all interrupts*/
482  REG_WRITE(MIPI_INTR_EN_REG(pipe), 0xffffffff);
483 
484  /*set up func_prg*/
485  val = lane_count;
486  val |= dsi_config->channel_num << DSI_DPI_VIRT_CHANNEL_OFFSET;
487 
488  switch (dsi_config->bpp) {
489  case 16:
491  break;
492  case 18:
494  break;
495  case 24:
497  break;
498  default:
499  DRM_ERROR("unsupported color format, bpp = %d\n",
500  dsi_config->bpp);
501  }
502  REG_WRITE(MIPI_DSI_FUNC_PRG_REG(pipe), val);
503 
505  (mode->vtotal * mode->htotal * dsi_config->bpp /
506  (8 * lane_count)) & DSI_HS_TX_TIMEOUT_MASK);
508  0xffff & DSI_LP_RX_TIMEOUT_MASK);
509 
510  /*max value: 20 clock cycles of txclkesc*/
513 
514  /*min 21 txclkesc, max: ffffh*/
516  0xffff & DSI_RESET_TIMER_MASK);
517 
519  mode->vdisplay << 16 | mode->hdisplay);
520 
521  /*set DPI timing registers*/
522  mdfld_dsi_dpi_timing_calculation(mode, &dpi_timing,
523  dsi_config->lane_count, dsi_config->bpp);
524 
526  dpi_timing.hsync_count & DSI_DPI_TIMING_MASK);
528  dpi_timing.hbp_count & DSI_DPI_TIMING_MASK);
530  dpi_timing.hfp_count & DSI_DPI_TIMING_MASK);
532  dpi_timing.hactive_count & DSI_DPI_TIMING_MASK);
534  dpi_timing.vsync_count & DSI_DPI_TIMING_MASK);
536  dpi_timing.vbp_count & DSI_DPI_TIMING_MASK);
538  dpi_timing.vfp_count & DSI_DPI_TIMING_MASK);
539 
541 
542  /*min: 7d0 max: 4e20*/
543  REG_WRITE(MIPI_INIT_COUNT_REG(pipe), 0x000007d0);
544 
545  /*set up video mode*/
546  val = dsi_config->video_mode | DSI_DPI_COMPLETE_LAST_LINE;
548 
549  REG_WRITE(MIPI_EOT_DISABLE_REG(pipe), 0x00000000);
550 
551  REG_WRITE(MIPI_LP_BYTECLK_REG(pipe), 0x00000004);
552 
553  /*TODO: figure out how to setup these registers*/
554  if (mdfld_get_panel_type(dev, pipe) == TC35876X)
555  REG_WRITE(MIPI_DPHY_PARAM_REG(pipe), 0x2A0c6008);
556  else
557  REG_WRITE(MIPI_DPHY_PARAM_REG(pipe), 0x150c3408);
558 
559  REG_WRITE(MIPI_CLK_LANE_SWITCH_TIME_CNT_REG(pipe), (0xa << 16) | 0x14);
560 
561  if (mdfld_get_panel_type(dev, pipe) == TC35876X)
562  tc35876x_set_bridge_reset_state(dev, 0); /*Pull High Reset */
563 
564  /*set device ready*/
565  REG_FLD_MOD(MIPI_DEVICE_READY_REG(pipe), 1, 0, 0);
566 }
567 
568 void mdfld_dsi_dpi_turn_on(struct mdfld_dsi_dpi_output *output, int pipe)
569 {
570  struct drm_device *dev = output->dev;
571 
572  /* clear special packet sent bit */
573  if (REG_READ(MIPI_INTR_STAT_REG(pipe)) & DSI_INTR_STATE_SPL_PKG_SENT)
575  DSI_INTR_STATE_SPL_PKG_SENT);
576 
577  /*send turn on package*/
579 
580  /*wait for SPL_PKG_SENT interrupt*/
581  mdfld_wait_for_SPL_PKG_SENT(dev, pipe);
582 
583  if (REG_READ(MIPI_INTR_STAT_REG(pipe)) & DSI_INTR_STATE_SPL_PKG_SENT)
585  DSI_INTR_STATE_SPL_PKG_SENT);
586 
587  output->panel_on = 1;
588 
589  /* FIXME the following is disabled to WA the X slow start issue
590  for TMD panel
591  if (pipe == 2)
592  dev_priv->dpi_panel_on2 = true;
593  else if (pipe == 0)
594  dev_priv->dpi_panel_on = true; */
595 }
596 
597 static void mdfld_dsi_dpi_shut_down(struct mdfld_dsi_dpi_output *output,
598  int pipe)
599 {
600  struct drm_device *dev = output->dev;
601 
602  /*if output is on, or mode setting didn't happen, ignore this*/
603  if ((!output->panel_on) || output->first_boot) {
604  output->first_boot = 0;
605  return;
606  }
607 
608  /* Wait for dpi fifo to empty */
609  mdfld_wait_for_DPI_CTRL_FIFO(dev, pipe);
610 
611  /* Clear the special packet interrupt bit if set */
612  if (REG_READ(MIPI_INTR_STAT_REG(pipe)) & DSI_INTR_STATE_SPL_PKG_SENT)
614  DSI_INTR_STATE_SPL_PKG_SENT);
615 
617  goto shutdown_out;
618 
620 
621 shutdown_out:
622  output->panel_on = 0;
623  output->first_boot = 0;
624 
625  /* FIXME the following is disabled to WA the X slow start issue
626  for TMD panel
627  if (pipe == 2)
628  dev_priv->dpi_panel_on2 = false;
629  else if (pipe == 0)
630  dev_priv->dpi_panel_on = false; */
631 }
632 
633 static void mdfld_dsi_dpi_set_power(struct drm_encoder *encoder, bool on)
634 {
635  struct mdfld_dsi_encoder *dsi_encoder = mdfld_dsi_encoder(encoder);
636  struct mdfld_dsi_dpi_output *dpi_output =
637  MDFLD_DSI_DPI_OUTPUT(dsi_encoder);
638  struct mdfld_dsi_config *dsi_config =
639  mdfld_dsi_encoder_get_config(dsi_encoder);
640  int pipe = mdfld_dsi_encoder_get_pipe(dsi_encoder);
641  struct drm_device *dev = dsi_config->dev;
642  struct drm_psb_private *dev_priv = dev->dev_private;
643 
644  /*start up display island if it was shutdown*/
645  if (!gma_power_begin(dev, true))
646  return;
647 
648  if (on) {
649  if (mdfld_get_panel_type(dev, pipe) == TMD_VID)
650  mdfld_dsi_dpi_turn_on(dpi_output, pipe);
651  else if (mdfld_get_panel_type(dev, pipe) == TC35876X)
652  mdfld_dsi_configure_up(dsi_encoder, pipe);
653  else {
654  /*enable mipi port*/
656  REG_READ(MIPI_PORT_CONTROL(pipe)) | BIT(31));
658 
659  mdfld_dsi_dpi_turn_on(dpi_output, pipe);
660  mdfld_dsi_tpo_ic_init(dsi_config, pipe);
661  }
662  dev_priv->dpi_panel_on[pipe] = true;
663  } else {
664  if (mdfld_get_panel_type(dev, pipe) == TMD_VID)
665  mdfld_dsi_dpi_shut_down(dpi_output, pipe);
666  else if (mdfld_get_panel_type(dev, pipe) == TC35876X)
667  mdfld_dsi_configure_down(dsi_encoder, pipe);
668  else {
669  mdfld_dsi_dpi_shut_down(dpi_output, pipe);
670 
671  /*disable mipi port*/
673  REG_READ(MIPI_PORT_CONTROL(pipe)) & ~BIT(31));
675  }
676  dev_priv->dpi_panel_on[pipe] = false;
677  }
678  gma_power_end(dev);
679 }
680 
681 void mdfld_dsi_dpi_dpms(struct drm_encoder *encoder, int mode)
682 {
683  mdfld_dsi_dpi_set_power(encoder, mode == DRM_MODE_DPMS_ON);
684 }
685 
687  const struct drm_display_mode *mode,
688  struct drm_display_mode *adjusted_mode)
689 {
690  struct mdfld_dsi_encoder *dsi_encoder = mdfld_dsi_encoder(encoder);
691  struct mdfld_dsi_config *dsi_config =
692  mdfld_dsi_encoder_get_config(dsi_encoder);
693  struct drm_display_mode *fixed_mode = dsi_config->fixed_mode;
694 
695  if (fixed_mode) {
696  adjusted_mode->hdisplay = fixed_mode->hdisplay;
697  adjusted_mode->hsync_start = fixed_mode->hsync_start;
698  adjusted_mode->hsync_end = fixed_mode->hsync_end;
699  adjusted_mode->htotal = fixed_mode->htotal;
700  adjusted_mode->vdisplay = fixed_mode->vdisplay;
701  adjusted_mode->vsync_start = fixed_mode->vsync_start;
702  adjusted_mode->vsync_end = fixed_mode->vsync_end;
703  adjusted_mode->vtotal = fixed_mode->vtotal;
704  adjusted_mode->clock = fixed_mode->clock;
706  }
707  return true;
708 }
709 
710 void mdfld_dsi_dpi_prepare(struct drm_encoder *encoder)
711 {
712  mdfld_dsi_dpi_set_power(encoder, false);
713 }
714 
715 void mdfld_dsi_dpi_commit(struct drm_encoder *encoder)
716 {
717  mdfld_dsi_dpi_set_power(encoder, true);
718 }
719 
720 /* For TC35876X */
721 /* This functionality was implemented in FW in iCDK */
722 /* But removed in DV0 and later. So need to add here. */
723 static void mipi_set_properties(struct mdfld_dsi_config *dsi_config, int pipe)
724 {
725  struct drm_device *dev = dsi_config->dev;
726 
727  REG_WRITE(MIPI_CTRL_REG(pipe), 0x00000018);
728  REG_WRITE(MIPI_INTR_EN_REG(pipe), 0xffffffff);
729  REG_WRITE(MIPI_HS_TX_TIMEOUT_REG(pipe), 0xffffff);
730  REG_WRITE(MIPI_LP_RX_TIMEOUT_REG(pipe), 0xffffff);
734  REG_WRITE(MIPI_INIT_COUNT_REG(pipe), 0xf0);
735  REG_WRITE(MIPI_EOT_DISABLE_REG(pipe), 0x00000000);
736  REG_WRITE(MIPI_LP_BYTECLK_REG(pipe), 0x00000004);
737  REG_WRITE(MIPI_DBI_BW_CTRL_REG(pipe), 0x00000820);
738  REG_WRITE(MIPI_CLK_LANE_SWITCH_TIME_CNT_REG(pipe), (0xa << 16) | 0x14);
739 }
740 
741 static void mdfld_mipi_set_video_timing(struct mdfld_dsi_config *dsi_config,
742  int pipe)
743 {
744  struct drm_device *dev = dsi_config->dev;
745  struct mdfld_dsi_dpi_timing dpi_timing;
746  struct drm_display_mode *mode = dsi_config->mode;
747 
748  mdfld_dsi_dpi_timing_calculation(mode, &dpi_timing,
749  dsi_config->lane_count,
750  dsi_config->bpp);
751 
753  mode->vdisplay << 16 | mode->hdisplay);
755  dpi_timing.hsync_count & DSI_DPI_TIMING_MASK);
757  dpi_timing.hbp_count & DSI_DPI_TIMING_MASK);
759  dpi_timing.hfp_count & DSI_DPI_TIMING_MASK);
761  dpi_timing.hactive_count & DSI_DPI_TIMING_MASK);
763  dpi_timing.vsync_count & DSI_DPI_TIMING_MASK);
765  dpi_timing.vbp_count & DSI_DPI_TIMING_MASK);
767  dpi_timing.vfp_count & DSI_DPI_TIMING_MASK);
768 }
769 
770 static void mdfld_mipi_config(struct mdfld_dsi_config *dsi_config, int pipe)
771 {
772  struct drm_device *dev = dsi_config->dev;
773  int lane_count = dsi_config->lane_count;
774 
775  if (pipe) {
776  REG_WRITE(MIPI_PORT_CONTROL(0), 0x00000002);
777  REG_WRITE(MIPI_PORT_CONTROL(2), 0x80000000);
778  } else {
779  REG_WRITE(MIPI_PORT_CONTROL(0), 0x80010000);
780  REG_WRITE(MIPI_PORT_CONTROL(2), 0x00);
781  }
782 
783  REG_WRITE(MIPI_DPHY_PARAM_REG(pipe), 0x150A600F);
784  REG_WRITE(MIPI_VIDEO_MODE_FORMAT_REG(pipe), 0x0000000F);
785 
786  /* lane_count = 3 */
787  REG_WRITE(MIPI_DSI_FUNC_PRG_REG(pipe), 0x00000200 | lane_count);
788 
789  mdfld_mipi_set_video_timing(dsi_config, pipe);
790 }
791 
792 static void mdfld_set_pipe_timing(struct mdfld_dsi_config *dsi_config, int pipe)
793 {
794  struct drm_device *dev = dsi_config->dev;
795  struct drm_display_mode *mode = dsi_config->mode;
796 
797  REG_WRITE(HTOTAL_A, ((mode->htotal - 1) << 16) | (mode->hdisplay - 1));
798  REG_WRITE(HBLANK_A, ((mode->htotal - 1) << 16) | (mode->hdisplay - 1));
800  ((mode->hsync_end - 1) << 16) | (mode->hsync_start - 1));
801 
802  REG_WRITE(VTOTAL_A, ((mode->vtotal - 1) << 16) | (mode->vdisplay - 1));
803  REG_WRITE(VBLANK_A, ((mode->vtotal - 1) << 16) | (mode->vdisplay - 1));
805  ((mode->vsync_end - 1) << 16) | (mode->vsync_start - 1));
806 
808  ((mode->hdisplay - 1) << 16) | (mode->vdisplay - 1));
809 }
810 /* End for TC35876X */
811 
812 void mdfld_dsi_dpi_mode_set(struct drm_encoder *encoder,
813  struct drm_display_mode *mode,
814  struct drm_display_mode *adjusted_mode)
815 {
816  struct mdfld_dsi_encoder *dsi_encoder = mdfld_dsi_encoder(encoder);
817  struct mdfld_dsi_dpi_output *dpi_output =
818  MDFLD_DSI_DPI_OUTPUT(dsi_encoder);
819  struct mdfld_dsi_config *dsi_config =
820  mdfld_dsi_encoder_get_config(dsi_encoder);
821  struct drm_device *dev = dsi_config->dev;
822  struct drm_psb_private *dev_priv = dev->dev_private;
823  int pipe = mdfld_dsi_encoder_get_pipe(dsi_encoder);
824 
825  u32 pipeconf_reg = PIPEACONF;
826  u32 dspcntr_reg = DSPACNTR;
827 
828  u32 pipeconf = dev_priv->pipeconf[pipe];
829  u32 dspcntr = dev_priv->dspcntr[pipe];
831 
832  if (pipe) {
833  pipeconf_reg = PIPECCONF;
834  dspcntr_reg = DSPCCNTR;
835  } else {
836  if (mdfld_get_panel_type(dev, pipe) == TC35876X)
837  mipi &= (~0x03); /* Use all four lanes */
838  else
839  mipi |= 2;
840  }
841 
842  /*start up display island if it was shutdown*/
843  if (!gma_power_begin(dev, true))
844  return;
845 
846  if (mdfld_get_panel_type(dev, pipe) == TC35876X) {
847  /*
848  * The following logic is required to reset the bridge and
849  * configure. This also starts the DSI clock at 200MHz.
850  */
851  tc35876x_set_bridge_reset_state(dev, 0); /*Pull High Reset */
853  udelay(100);
854  /* Now start the DSI clock */
855  REG_WRITE(MRST_DPLL_A, 0x00);
856  REG_WRITE(MRST_FPA0, 0xC1);
857  REG_WRITE(MRST_DPLL_A, 0x00800000);
858  udelay(500);
859  REG_WRITE(MRST_DPLL_A, 0x80800000);
860 
861  if (REG_BIT_WAIT(pipeconf_reg, 1, 29))
862  dev_err(&dev->pdev->dev, "%s: DSI PLL lock timeout\n",
863  __func__);
864 
865  REG_WRITE(MIPI_DPHY_PARAM_REG(pipe), 0x2A0c6008);
866 
867  mipi_set_properties(dsi_config, pipe);
868  mdfld_mipi_config(dsi_config, pipe);
869  mdfld_set_pipe_timing(dsi_config, pipe);
870 
871  REG_WRITE(DSPABASE, 0x00);
873  ((mode->vdisplay - 1) << 16) | (mode->hdisplay - 1));
874 
875  REG_WRITE(DSPACNTR, 0x98000000);
876  REG_WRITE(DSPASURF, 0x00);
877 
878  REG_WRITE(VGACNTRL, 0x80000000);
879  REG_WRITE(DEVICE_READY_REG, 0x00000001);
880 
881  REG_WRITE(MIPI_PORT_CONTROL(pipe), 0x80810000);
882  } else {
883  /*set up mipi port FIXME: do at init time */
884  REG_WRITE(MIPI_PORT_CONTROL(pipe), mipi);
885  }
887 
888  if (mdfld_get_panel_type(dev, pipe) == TMD_VID) {
889  /* NOP */
890  } else if (mdfld_get_panel_type(dev, pipe) == TC35876X) {
891  /* set up DSI controller DPI interface */
892  mdfld_dsi_dpi_controller_init(dsi_config, pipe);
893 
894  /* Configure MIPI Bridge and Panel */
896  dev_priv->dpi_panel_on[pipe] = true;
897  } else {
898  /*turn on DPI interface*/
899  mdfld_dsi_dpi_turn_on(dpi_output, pipe);
900  }
901 
902  /*set up pipe*/
903  REG_WRITE(pipeconf_reg, pipeconf);
904  REG_READ(pipeconf_reg);
905 
906  /*set up display plane*/
907  REG_WRITE(dspcntr_reg, dspcntr);
908  REG_READ(dspcntr_reg);
909 
910  msleep(20); /* FIXME: this should wait for vblank */
911 
912  if (mdfld_get_panel_type(dev, pipe) == TMD_VID) {
913  /* NOP */
914  } else if (mdfld_get_panel_type(dev, pipe) == TC35876X) {
915  mdfld_dsi_dpi_turn_on(dpi_output, pipe);
916  } else {
917  /* init driver ic */
918  mdfld_dsi_tpo_ic_init(dsi_config, pipe);
919  /*init backlight*/
920  mdfld_dsi_brightness_init(dsi_config, pipe);
921  }
922 
923  gma_power_end(dev);
924 }
925 
926 /*
927  * Init DSI DPI encoder.
928  * Allocate an mdfld_dsi_encoder and attach it to given @dsi_connector
929  * return pointer of newly allocated DPI encoder, NULL on error
930  */
932  struct mdfld_dsi_connector *dsi_connector,
933  const struct panel_funcs *p_funcs)
934 {
935  struct mdfld_dsi_dpi_output *dpi_output = NULL;
936  struct mdfld_dsi_config *dsi_config;
937  struct drm_connector *connector = NULL;
938  struct drm_encoder *encoder = NULL;
939  int pipe;
940  u32 data;
941  int ret;
942 
943  pipe = dsi_connector->pipe;
944 
945  if (mdfld_get_panel_type(dev, pipe) != TC35876X) {
946  dsi_config = mdfld_dsi_get_config(dsi_connector);
947 
948  /* panel hard-reset */
949  if (p_funcs->reset) {
950  ret = p_funcs->reset(pipe);
951  if (ret) {
952  DRM_ERROR("Panel %d hard-reset failed\n", pipe);
953  return NULL;
954  }
955  }
956 
957  /* panel drvIC init */
958  if (p_funcs->drv_ic_init)
959  p_funcs->drv_ic_init(dsi_config, pipe);
960 
961  /* panel power mode detect */
962  ret = mdfld_dsi_get_power_mode(dsi_config, &data, false);
963  if (ret) {
964  DRM_ERROR("Panel %d get power mode failed\n", pipe);
965  dsi_connector->status = connector_status_disconnected;
966  } else {
967  DRM_INFO("pipe %d power mode 0x%x\n", pipe, data);
968  dsi_connector->status = connector_status_connected;
969  }
970  }
971 
972  dpi_output = kzalloc(sizeof(struct mdfld_dsi_dpi_output), GFP_KERNEL);
973  if (!dpi_output) {
974  DRM_ERROR("No memory\n");
975  return NULL;
976  }
977 
978  if (dsi_connector->pipe)
979  dpi_output->panel_on = 0;
980  else
981  dpi_output->panel_on = 0;
982 
983  dpi_output->dev = dev;
984  if (mdfld_get_panel_type(dev, pipe) != TC35876X)
985  dpi_output->p_funcs = p_funcs;
986  dpi_output->first_boot = 1;
987 
988  /*get fixed mode*/
989  dsi_config = mdfld_dsi_get_config(dsi_connector);
990 
991  /*create drm encoder object*/
992  connector = &dsi_connector->base.base;
993  encoder = &dpi_output->base.base.base;
994  drm_encoder_init(dev,
995  encoder,
996  p_funcs->encoder_funcs,
998  drm_encoder_helper_add(encoder,
999  p_funcs->encoder_helper_funcs);
1000 
1001  /*attach to given connector*/
1002  drm_mode_connector_attach_encoder(connector, encoder);
1003 
1004  /*set possible crtcs and clones*/
1005  if (dsi_connector->pipe) {
1006  encoder->possible_crtcs = (1 << 2);
1007  encoder->possible_clones = (1 << 1);
1008  } else {
1009  encoder->possible_crtcs = (1 << 0);
1010  encoder->possible_clones = (1 << 0);
1011  }
1012 
1013  dsi_connector->base.encoder = &dpi_output->base.base;
1014 
1015  return &dpi_output->base;
1016 }