OMAP: DSS2: DSI: implement enable/disable SCP clk
[pandora-kernel.git] / drivers / video / omap2 / dss / dsi.c
1 /*
2  * linux/drivers/video/omap2/dss/dsi.c
3  *
4  * Copyright (C) 2009 Nokia Corporation
5  * Author: Tomi Valkeinen <tomi.valkeinen@nokia.com>
6  *
7  * This program is free software; you can redistribute it and/or modify it
8  * under the terms of the GNU General Public License version 2 as published by
9  * the Free Software Foundation.
10  *
11  * This program is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
14  * more details.
15  *
16  * You should have received a copy of the GNU General Public License along with
17  * this program.  If not, see <http://www.gnu.org/licenses/>.
18  */
19
20 #define DSS_SUBSYS_NAME "DSI"
21
22 #include <linux/kernel.h>
23 #include <linux/io.h>
24 #include <linux/clk.h>
25 #include <linux/device.h>
26 #include <linux/err.h>
27 #include <linux/interrupt.h>
28 #include <linux/delay.h>
29 #include <linux/mutex.h>
30 #include <linux/semaphore.h>
31 #include <linux/seq_file.h>
32 #include <linux/platform_device.h>
33 #include <linux/regulator/consumer.h>
34 #include <linux/wait.h>
35 #include <linux/workqueue.h>
36 #include <linux/sched.h>
37
38 #include <video/omapdss.h>
39 #include <plat/clock.h>
40
41 #include "dss.h"
42 #include "dss_features.h"
43
44 /*#define VERBOSE_IRQ*/
45 #define DSI_CATCH_MISSING_TE
46
47 struct dsi_reg { u16 idx; };
48
49 #define DSI_REG(idx)            ((const struct dsi_reg) { idx })
50
51 #define DSI_SZ_REGS             SZ_1K
52 /* DSI Protocol Engine */
53
54 #define DSI_REVISION                    DSI_REG(0x0000)
55 #define DSI_SYSCONFIG                   DSI_REG(0x0010)
56 #define DSI_SYSSTATUS                   DSI_REG(0x0014)
57 #define DSI_IRQSTATUS                   DSI_REG(0x0018)
58 #define DSI_IRQENABLE                   DSI_REG(0x001C)
59 #define DSI_CTRL                        DSI_REG(0x0040)
60 #define DSI_COMPLEXIO_CFG1              DSI_REG(0x0048)
61 #define DSI_COMPLEXIO_IRQ_STATUS        DSI_REG(0x004C)
62 #define DSI_COMPLEXIO_IRQ_ENABLE        DSI_REG(0x0050)
63 #define DSI_CLK_CTRL                    DSI_REG(0x0054)
64 #define DSI_TIMING1                     DSI_REG(0x0058)
65 #define DSI_TIMING2                     DSI_REG(0x005C)
66 #define DSI_VM_TIMING1                  DSI_REG(0x0060)
67 #define DSI_VM_TIMING2                  DSI_REG(0x0064)
68 #define DSI_VM_TIMING3                  DSI_REG(0x0068)
69 #define DSI_CLK_TIMING                  DSI_REG(0x006C)
70 #define DSI_TX_FIFO_VC_SIZE             DSI_REG(0x0070)
71 #define DSI_RX_FIFO_VC_SIZE             DSI_REG(0x0074)
72 #define DSI_COMPLEXIO_CFG2              DSI_REG(0x0078)
73 #define DSI_RX_FIFO_VC_FULLNESS         DSI_REG(0x007C)
74 #define DSI_VM_TIMING4                  DSI_REG(0x0080)
75 #define DSI_TX_FIFO_VC_EMPTINESS        DSI_REG(0x0084)
76 #define DSI_VM_TIMING5                  DSI_REG(0x0088)
77 #define DSI_VM_TIMING6                  DSI_REG(0x008C)
78 #define DSI_VM_TIMING7                  DSI_REG(0x0090)
79 #define DSI_STOPCLK_TIMING              DSI_REG(0x0094)
80 #define DSI_VC_CTRL(n)                  DSI_REG(0x0100 + (n * 0x20))
81 #define DSI_VC_TE(n)                    DSI_REG(0x0104 + (n * 0x20))
82 #define DSI_VC_LONG_PACKET_HEADER(n)    DSI_REG(0x0108 + (n * 0x20))
83 #define DSI_VC_LONG_PACKET_PAYLOAD(n)   DSI_REG(0x010C + (n * 0x20))
84 #define DSI_VC_SHORT_PACKET_HEADER(n)   DSI_REG(0x0110 + (n * 0x20))
85 #define DSI_VC_IRQSTATUS(n)             DSI_REG(0x0118 + (n * 0x20))
86 #define DSI_VC_IRQENABLE(n)             DSI_REG(0x011C + (n * 0x20))
87
88 /* DSIPHY_SCP */
89
90 #define DSI_DSIPHY_CFG0                 DSI_REG(0x200 + 0x0000)
91 #define DSI_DSIPHY_CFG1                 DSI_REG(0x200 + 0x0004)
92 #define DSI_DSIPHY_CFG2                 DSI_REG(0x200 + 0x0008)
93 #define DSI_DSIPHY_CFG5                 DSI_REG(0x200 + 0x0014)
94 #define DSI_DSIPHY_CFG10                DSI_REG(0x200 + 0x0028)
95
96 /* DSI_PLL_CTRL_SCP */
97
98 #define DSI_PLL_CONTROL                 DSI_REG(0x300 + 0x0000)
99 #define DSI_PLL_STATUS                  DSI_REG(0x300 + 0x0004)
100 #define DSI_PLL_GO                      DSI_REG(0x300 + 0x0008)
101 #define DSI_PLL_CONFIGURATION1          DSI_REG(0x300 + 0x000C)
102 #define DSI_PLL_CONFIGURATION2          DSI_REG(0x300 + 0x0010)
103
104 #define REG_GET(idx, start, end) \
105         FLD_GET(dsi_read_reg(idx), start, end)
106
107 #define REG_FLD_MOD(idx, val, start, end) \
108         dsi_write_reg(idx, FLD_MOD(dsi_read_reg(idx), val, start, end))
109
110 /* Global interrupts */
111 #define DSI_IRQ_VC0             (1 << 0)
112 #define DSI_IRQ_VC1             (1 << 1)
113 #define DSI_IRQ_VC2             (1 << 2)
114 #define DSI_IRQ_VC3             (1 << 3)
115 #define DSI_IRQ_WAKEUP          (1 << 4)
116 #define DSI_IRQ_RESYNC          (1 << 5)
117 #define DSI_IRQ_PLL_LOCK        (1 << 7)
118 #define DSI_IRQ_PLL_UNLOCK      (1 << 8)
119 #define DSI_IRQ_PLL_RECALL      (1 << 9)
120 #define DSI_IRQ_COMPLEXIO_ERR   (1 << 10)
121 #define DSI_IRQ_HS_TX_TIMEOUT   (1 << 14)
122 #define DSI_IRQ_LP_RX_TIMEOUT   (1 << 15)
123 #define DSI_IRQ_TE_TRIGGER      (1 << 16)
124 #define DSI_IRQ_ACK_TRIGGER     (1 << 17)
125 #define DSI_IRQ_SYNC_LOST       (1 << 18)
126 #define DSI_IRQ_LDO_POWER_GOOD  (1 << 19)
127 #define DSI_IRQ_TA_TIMEOUT      (1 << 20)
128 #define DSI_IRQ_ERROR_MASK \
129         (DSI_IRQ_HS_TX_TIMEOUT | DSI_IRQ_LP_RX_TIMEOUT | DSI_IRQ_SYNC_LOST | \
130         DSI_IRQ_TA_TIMEOUT)
131 #define DSI_IRQ_CHANNEL_MASK    0xf
132
133 /* Virtual channel interrupts */
134 #define DSI_VC_IRQ_CS           (1 << 0)
135 #define DSI_VC_IRQ_ECC_CORR     (1 << 1)
136 #define DSI_VC_IRQ_PACKET_SENT  (1 << 2)
137 #define DSI_VC_IRQ_FIFO_TX_OVF  (1 << 3)
138 #define DSI_VC_IRQ_FIFO_RX_OVF  (1 << 4)
139 #define DSI_VC_IRQ_BTA          (1 << 5)
140 #define DSI_VC_IRQ_ECC_NO_CORR  (1 << 6)
141 #define DSI_VC_IRQ_FIFO_TX_UDF  (1 << 7)
142 #define DSI_VC_IRQ_PP_BUSY_CHANGE (1 << 8)
143 #define DSI_VC_IRQ_ERROR_MASK \
144         (DSI_VC_IRQ_CS | DSI_VC_IRQ_ECC_CORR | DSI_VC_IRQ_FIFO_TX_OVF | \
145         DSI_VC_IRQ_FIFO_RX_OVF | DSI_VC_IRQ_ECC_NO_CORR | \
146         DSI_VC_IRQ_FIFO_TX_UDF)
147
148 /* ComplexIO interrupts */
149 #define DSI_CIO_IRQ_ERRSYNCESC1         (1 << 0)
150 #define DSI_CIO_IRQ_ERRSYNCESC2         (1 << 1)
151 #define DSI_CIO_IRQ_ERRSYNCESC3         (1 << 2)
152 #define DSI_CIO_IRQ_ERRESC1             (1 << 5)
153 #define DSI_CIO_IRQ_ERRESC2             (1 << 6)
154 #define DSI_CIO_IRQ_ERRESC3             (1 << 7)
155 #define DSI_CIO_IRQ_ERRCONTROL1         (1 << 10)
156 #define DSI_CIO_IRQ_ERRCONTROL2         (1 << 11)
157 #define DSI_CIO_IRQ_ERRCONTROL3         (1 << 12)
158 #define DSI_CIO_IRQ_STATEULPS1          (1 << 15)
159 #define DSI_CIO_IRQ_STATEULPS2          (1 << 16)
160 #define DSI_CIO_IRQ_STATEULPS3          (1 << 17)
161 #define DSI_CIO_IRQ_ERRCONTENTIONLP0_1  (1 << 20)
162 #define DSI_CIO_IRQ_ERRCONTENTIONLP1_1  (1 << 21)
163 #define DSI_CIO_IRQ_ERRCONTENTIONLP0_2  (1 << 22)
164 #define DSI_CIO_IRQ_ERRCONTENTIONLP1_2  (1 << 23)
165 #define DSI_CIO_IRQ_ERRCONTENTIONLP0_3  (1 << 24)
166 #define DSI_CIO_IRQ_ERRCONTENTIONLP1_3  (1 << 25)
167 #define DSI_CIO_IRQ_ULPSACTIVENOT_ALL0  (1 << 30)
168 #define DSI_CIO_IRQ_ULPSACTIVENOT_ALL1  (1 << 31)
169 #define DSI_CIO_IRQ_ERROR_MASK \
170         (DSI_CIO_IRQ_ERRSYNCESC1 | DSI_CIO_IRQ_ERRSYNCESC2 | \
171          DSI_CIO_IRQ_ERRSYNCESC3 | DSI_CIO_IRQ_ERRESC1 | DSI_CIO_IRQ_ERRESC2 | \
172          DSI_CIO_IRQ_ERRESC3 | DSI_CIO_IRQ_ERRCONTROL1 | \
173          DSI_CIO_IRQ_ERRCONTROL2 | DSI_CIO_IRQ_ERRCONTROL3 | \
174          DSI_CIO_IRQ_ERRCONTENTIONLP0_1 | DSI_CIO_IRQ_ERRCONTENTIONLP1_1 | \
175          DSI_CIO_IRQ_ERRCONTENTIONLP0_2 | DSI_CIO_IRQ_ERRCONTENTIONLP1_2 | \
176          DSI_CIO_IRQ_ERRCONTENTIONLP0_3 | DSI_CIO_IRQ_ERRCONTENTIONLP1_3)
177
178 #define DSI_DT_DCS_SHORT_WRITE_0        0x05
179 #define DSI_DT_DCS_SHORT_WRITE_1        0x15
180 #define DSI_DT_DCS_READ                 0x06
181 #define DSI_DT_SET_MAX_RET_PKG_SIZE     0x37
182 #define DSI_DT_NULL_PACKET              0x09
183 #define DSI_DT_DCS_LONG_WRITE           0x39
184
185 #define DSI_DT_RX_ACK_WITH_ERR          0x02
186 #define DSI_DT_RX_DCS_LONG_READ         0x1c
187 #define DSI_DT_RX_SHORT_READ_1          0x21
188 #define DSI_DT_RX_SHORT_READ_2          0x22
189
190 typedef void (*omap_dsi_isr_t) (void *arg, u32 mask);
191
192 #define DSI_MAX_NR_ISRS                2
193
194 struct dsi_isr_data {
195         omap_dsi_isr_t  isr;
196         void            *arg;
197         u32             mask;
198 };
199
200 enum fifo_size {
201         DSI_FIFO_SIZE_0         = 0,
202         DSI_FIFO_SIZE_32        = 1,
203         DSI_FIFO_SIZE_64        = 2,
204         DSI_FIFO_SIZE_96        = 3,
205         DSI_FIFO_SIZE_128       = 4,
206 };
207
208 enum dsi_vc_mode {
209         DSI_VC_MODE_L4 = 0,
210         DSI_VC_MODE_VP,
211 };
212
213 enum dsi_lane {
214         DSI_CLK_P       = 1 << 0,
215         DSI_CLK_N       = 1 << 1,
216         DSI_DATA1_P     = 1 << 2,
217         DSI_DATA1_N     = 1 << 3,
218         DSI_DATA2_P     = 1 << 4,
219         DSI_DATA2_N     = 1 << 5,
220 };
221
222 struct dsi_update_region {
223         u16 x, y, w, h;
224         struct omap_dss_device *device;
225 };
226
227 struct dsi_irq_stats {
228         unsigned long last_reset;
229         unsigned irq_count;
230         unsigned dsi_irqs[32];
231         unsigned vc_irqs[4][32];
232         unsigned cio_irqs[32];
233 };
234
235 struct dsi_isr_tables {
236         struct dsi_isr_data isr_table[DSI_MAX_NR_ISRS];
237         struct dsi_isr_data isr_table_vc[4][DSI_MAX_NR_ISRS];
238         struct dsi_isr_data isr_table_cio[DSI_MAX_NR_ISRS];
239 };
240
241 static struct
242 {
243         struct platform_device *pdev;
244         void __iomem    *base;
245         int irq;
246
247         struct dsi_clock_info current_cinfo;
248
249         bool vdds_dsi_enabled;
250         struct regulator *vdds_dsi_reg;
251
252         struct {
253                 enum dsi_vc_mode mode;
254                 struct omap_dss_device *dssdev;
255                 enum fifo_size fifo_size;
256                 int vc_id;
257         } vc[4];
258
259         struct mutex lock;
260         struct semaphore bus_lock;
261
262         unsigned pll_locked;
263
264         spinlock_t irq_lock;
265         struct dsi_isr_tables isr_tables;
266         /* space for a copy used by the interrupt handler */
267         struct dsi_isr_tables isr_tables_copy;
268
269         int update_channel;
270         struct dsi_update_region update_region;
271
272         bool te_enabled;
273         bool ulps_enabled;
274
275         struct workqueue_struct *workqueue;
276
277         void (*framedone_callback)(int, void *);
278         void *framedone_data;
279
280         struct delayed_work framedone_timeout_work;
281
282 #ifdef DSI_CATCH_MISSING_TE
283         struct timer_list te_timer;
284 #endif
285
286         unsigned long cache_req_pck;
287         unsigned long cache_clk_freq;
288         struct dsi_clock_info cache_cinfo;
289
290         u32             errors;
291         spinlock_t      errors_lock;
292 #ifdef DEBUG
293         ktime_t perf_setup_time;
294         ktime_t perf_start_time;
295 #endif
296         int debug_read;
297         int debug_write;
298
299 #ifdef CONFIG_OMAP2_DSS_COLLECT_IRQ_STATS
300         spinlock_t irq_stats_lock;
301         struct dsi_irq_stats irq_stats;
302 #endif
303         /* DSI PLL Parameter Ranges */
304         unsigned long regm_max, regn_max;
305         unsigned long  regm_dispc_max, regm_dsi_max;
306         unsigned long  fint_min, fint_max;
307         unsigned long lpdiv_max;
308
309         unsigned scp_clk_refcount;
310 } dsi;
311
312 #ifdef DEBUG
313 static unsigned int dsi_perf;
314 module_param_named(dsi_perf, dsi_perf, bool, 0644);
315 #endif
316
317 static inline void dsi_write_reg(const struct dsi_reg idx, u32 val)
318 {
319         __raw_writel(val, dsi.base + idx.idx);
320 }
321
322 static inline u32 dsi_read_reg(const struct dsi_reg idx)
323 {
324         return __raw_readl(dsi.base + idx.idx);
325 }
326
327
328 void dsi_save_context(void)
329 {
330 }
331
332 void dsi_restore_context(void)
333 {
334 }
335
336 void dsi_bus_lock(void)
337 {
338         down(&dsi.bus_lock);
339 }
340 EXPORT_SYMBOL(dsi_bus_lock);
341
342 void dsi_bus_unlock(void)
343 {
344         up(&dsi.bus_lock);
345 }
346 EXPORT_SYMBOL(dsi_bus_unlock);
347
348 static bool dsi_bus_is_locked(void)
349 {
350         return dsi.bus_lock.count == 0;
351 }
352
353 static void dsi_completion_handler(void *data, u32 mask)
354 {
355         complete((struct completion *)data);
356 }
357
358 static inline int wait_for_bit_change(const struct dsi_reg idx, int bitnum,
359                 int value)
360 {
361         int t = 100000;
362
363         while (REG_GET(idx, bitnum, bitnum) != value) {
364                 if (--t == 0)
365                         return !value;
366         }
367
368         return value;
369 }
370
371 #ifdef DEBUG
372 static void dsi_perf_mark_setup(void)
373 {
374         dsi.perf_setup_time = ktime_get();
375 }
376
377 static void dsi_perf_mark_start(void)
378 {
379         dsi.perf_start_time = ktime_get();
380 }
381
382 static void dsi_perf_show(const char *name)
383 {
384         ktime_t t, setup_time, trans_time;
385         u32 total_bytes;
386         u32 setup_us, trans_us, total_us;
387
388         if (!dsi_perf)
389                 return;
390
391         t = ktime_get();
392
393         setup_time = ktime_sub(dsi.perf_start_time, dsi.perf_setup_time);
394         setup_us = (u32)ktime_to_us(setup_time);
395         if (setup_us == 0)
396                 setup_us = 1;
397
398         trans_time = ktime_sub(t, dsi.perf_start_time);
399         trans_us = (u32)ktime_to_us(trans_time);
400         if (trans_us == 0)
401                 trans_us = 1;
402
403         total_us = setup_us + trans_us;
404
405         total_bytes = dsi.update_region.w *
406                 dsi.update_region.h *
407                 dsi.update_region.device->ctrl.pixel_size / 8;
408
409         printk(KERN_INFO "DSI(%s): %u us + %u us = %u us (%uHz), "
410                         "%u bytes, %u kbytes/sec\n",
411                         name,
412                         setup_us,
413                         trans_us,
414                         total_us,
415                         1000*1000 / total_us,
416                         total_bytes,
417                         total_bytes * 1000 / total_us);
418 }
419 #else
420 #define dsi_perf_mark_setup()
421 #define dsi_perf_mark_start()
422 #define dsi_perf_show(x)
423 #endif
424
425 static void print_irq_status(u32 status)
426 {
427         if (status == 0)
428                 return;
429
430 #ifndef VERBOSE_IRQ
431         if ((status & ~DSI_IRQ_CHANNEL_MASK) == 0)
432                 return;
433 #endif
434         printk(KERN_DEBUG "DSI IRQ: 0x%x: ", status);
435
436 #define PIS(x) \
437         if (status & DSI_IRQ_##x) \
438                 printk(#x " ");
439 #ifdef VERBOSE_IRQ
440         PIS(VC0);
441         PIS(VC1);
442         PIS(VC2);
443         PIS(VC3);
444 #endif
445         PIS(WAKEUP);
446         PIS(RESYNC);
447         PIS(PLL_LOCK);
448         PIS(PLL_UNLOCK);
449         PIS(PLL_RECALL);
450         PIS(COMPLEXIO_ERR);
451         PIS(HS_TX_TIMEOUT);
452         PIS(LP_RX_TIMEOUT);
453         PIS(TE_TRIGGER);
454         PIS(ACK_TRIGGER);
455         PIS(SYNC_LOST);
456         PIS(LDO_POWER_GOOD);
457         PIS(TA_TIMEOUT);
458 #undef PIS
459
460         printk("\n");
461 }
462
463 static void print_irq_status_vc(int channel, u32 status)
464 {
465         if (status == 0)
466                 return;
467
468 #ifndef VERBOSE_IRQ
469         if ((status & ~DSI_VC_IRQ_PACKET_SENT) == 0)
470                 return;
471 #endif
472         printk(KERN_DEBUG "DSI VC(%d) IRQ 0x%x: ", channel, status);
473
474 #define PIS(x) \
475         if (status & DSI_VC_IRQ_##x) \
476                 printk(#x " ");
477         PIS(CS);
478         PIS(ECC_CORR);
479 #ifdef VERBOSE_IRQ
480         PIS(PACKET_SENT);
481 #endif
482         PIS(FIFO_TX_OVF);
483         PIS(FIFO_RX_OVF);
484         PIS(BTA);
485         PIS(ECC_NO_CORR);
486         PIS(FIFO_TX_UDF);
487         PIS(PP_BUSY_CHANGE);
488 #undef PIS
489         printk("\n");
490 }
491
492 static void print_irq_status_cio(u32 status)
493 {
494         if (status == 0)
495                 return;
496
497         printk(KERN_DEBUG "DSI CIO IRQ 0x%x: ", status);
498
499 #define PIS(x) \
500         if (status & DSI_CIO_IRQ_##x) \
501                 printk(#x " ");
502         PIS(ERRSYNCESC1);
503         PIS(ERRSYNCESC2);
504         PIS(ERRSYNCESC3);
505         PIS(ERRESC1);
506         PIS(ERRESC2);
507         PIS(ERRESC3);
508         PIS(ERRCONTROL1);
509         PIS(ERRCONTROL2);
510         PIS(ERRCONTROL3);
511         PIS(STATEULPS1);
512         PIS(STATEULPS2);
513         PIS(STATEULPS3);
514         PIS(ERRCONTENTIONLP0_1);
515         PIS(ERRCONTENTIONLP1_1);
516         PIS(ERRCONTENTIONLP0_2);
517         PIS(ERRCONTENTIONLP1_2);
518         PIS(ERRCONTENTIONLP0_3);
519         PIS(ERRCONTENTIONLP1_3);
520         PIS(ULPSACTIVENOT_ALL0);
521         PIS(ULPSACTIVENOT_ALL1);
522 #undef PIS
523
524         printk("\n");
525 }
526
527 #ifdef CONFIG_OMAP2_DSS_COLLECT_IRQ_STATS
528 static void dsi_collect_irq_stats(u32 irqstatus, u32 *vcstatus, u32 ciostatus)
529 {
530         int i;
531
532         spin_lock(&dsi.irq_stats_lock);
533
534         dsi.irq_stats.irq_count++;
535         dss_collect_irq_stats(irqstatus, dsi.irq_stats.dsi_irqs);
536
537         for (i = 0; i < 4; ++i)
538                 dss_collect_irq_stats(vcstatus[i], dsi.irq_stats.vc_irqs[i]);
539
540         dss_collect_irq_stats(ciostatus, dsi.irq_stats.cio_irqs);
541
542         spin_unlock(&dsi.irq_stats_lock);
543 }
544 #else
545 #define dsi_collect_irq_stats(irqstatus, vcstatus, ciostatus)
546 #endif
547
548 static int debug_irq;
549
550 static void dsi_handle_irq_errors(u32 irqstatus, u32 *vcstatus, u32 ciostatus)
551 {
552         int i;
553
554         if (irqstatus & DSI_IRQ_ERROR_MASK) {
555                 DSSERR("DSI error, irqstatus %x\n", irqstatus);
556                 print_irq_status(irqstatus);
557                 spin_lock(&dsi.errors_lock);
558                 dsi.errors |= irqstatus & DSI_IRQ_ERROR_MASK;
559                 spin_unlock(&dsi.errors_lock);
560         } else if (debug_irq) {
561                 print_irq_status(irqstatus);
562         }
563
564         for (i = 0; i < 4; ++i) {
565                 if (vcstatus[i] & DSI_VC_IRQ_ERROR_MASK) {
566                         DSSERR("DSI VC(%d) error, vc irqstatus %x\n",
567                                        i, vcstatus[i]);
568                         print_irq_status_vc(i, vcstatus[i]);
569                 } else if (debug_irq) {
570                         print_irq_status_vc(i, vcstatus[i]);
571                 }
572         }
573
574         if (ciostatus & DSI_CIO_IRQ_ERROR_MASK) {
575                 DSSERR("DSI CIO error, cio irqstatus %x\n", ciostatus);
576                 print_irq_status_cio(ciostatus);
577         } else if (debug_irq) {
578                 print_irq_status_cio(ciostatus);
579         }
580 }
581
582 static void dsi_call_isrs(struct dsi_isr_data *isr_array,
583                 unsigned isr_array_size, u32 irqstatus)
584 {
585         struct dsi_isr_data *isr_data;
586         int i;
587
588         for (i = 0; i < isr_array_size; i++) {
589                 isr_data = &isr_array[i];
590                 if (isr_data->isr && isr_data->mask & irqstatus)
591                         isr_data->isr(isr_data->arg, irqstatus);
592         }
593 }
594
595 static void dsi_handle_isrs(struct dsi_isr_tables *isr_tables,
596                 u32 irqstatus, u32 *vcstatus, u32 ciostatus)
597 {
598         int i;
599
600         dsi_call_isrs(isr_tables->isr_table,
601                         ARRAY_SIZE(isr_tables->isr_table),
602                         irqstatus);
603
604         for (i = 0; i < 4; ++i) {
605                 if (vcstatus[i] == 0)
606                         continue;
607                 dsi_call_isrs(isr_tables->isr_table_vc[i],
608                                 ARRAY_SIZE(isr_tables->isr_table_vc[i]),
609                                 vcstatus[i]);
610         }
611
612         if (ciostatus != 0)
613                 dsi_call_isrs(isr_tables->isr_table_cio,
614                                 ARRAY_SIZE(isr_tables->isr_table_cio),
615                                 ciostatus);
616 }
617
618 static irqreturn_t omap_dsi_irq_handler(int irq, void *arg)
619 {
620         u32 irqstatus, vcstatus[4], ciostatus;
621         int i;
622
623         spin_lock(&dsi.irq_lock);
624
625         irqstatus = dsi_read_reg(DSI_IRQSTATUS);
626
627         /* IRQ is not for us */
628         if (!irqstatus) {
629                 spin_unlock(&dsi.irq_lock);
630                 return IRQ_NONE;
631         }
632
633         dsi_write_reg(DSI_IRQSTATUS, irqstatus & ~DSI_IRQ_CHANNEL_MASK);
634         /* flush posted write */
635         dsi_read_reg(DSI_IRQSTATUS);
636
637         for (i = 0; i < 4; ++i) {
638                 if ((irqstatus & (1 << i)) == 0) {
639                         vcstatus[i] = 0;
640                         continue;
641                 }
642
643                 vcstatus[i] = dsi_read_reg(DSI_VC_IRQSTATUS(i));
644
645                 dsi_write_reg(DSI_VC_IRQSTATUS(i), vcstatus[i]);
646                 /* flush posted write */
647                 dsi_read_reg(DSI_VC_IRQSTATUS(i));
648         }
649
650         if (irqstatus & DSI_IRQ_COMPLEXIO_ERR) {
651                 ciostatus = dsi_read_reg(DSI_COMPLEXIO_IRQ_STATUS);
652
653                 dsi_write_reg(DSI_COMPLEXIO_IRQ_STATUS, ciostatus);
654                 /* flush posted write */
655                 dsi_read_reg(DSI_COMPLEXIO_IRQ_STATUS);
656         } else {
657                 ciostatus = 0;
658         }
659
660 #ifdef DSI_CATCH_MISSING_TE
661         if (irqstatus & DSI_IRQ_TE_TRIGGER)
662                 del_timer(&dsi.te_timer);
663 #endif
664
665         /* make a copy and unlock, so that isrs can unregister
666          * themselves */
667         memcpy(&dsi.isr_tables_copy, &dsi.isr_tables, sizeof(dsi.isr_tables));
668
669         spin_unlock(&dsi.irq_lock);
670
671         dsi_handle_isrs(&dsi.isr_tables_copy, irqstatus, vcstatus, ciostatus);
672
673         dsi_handle_irq_errors(irqstatus, vcstatus, ciostatus);
674
675         dsi_collect_irq_stats(irqstatus, vcstatus, ciostatus);
676
677         return IRQ_HANDLED;
678 }
679
680 /* dsi.irq_lock has to be locked by the caller */
681 static void _omap_dsi_configure_irqs(struct dsi_isr_data *isr_array,
682                 unsigned isr_array_size, u32 default_mask,
683                 const struct dsi_reg enable_reg,
684                 const struct dsi_reg status_reg)
685 {
686         struct dsi_isr_data *isr_data;
687         u32 mask;
688         u32 old_mask;
689         int i;
690
691         mask = default_mask;
692
693         for (i = 0; i < isr_array_size; i++) {
694                 isr_data = &isr_array[i];
695
696                 if (isr_data->isr == NULL)
697                         continue;
698
699                 mask |= isr_data->mask;
700         }
701
702         old_mask = dsi_read_reg(enable_reg);
703         /* clear the irqstatus for newly enabled irqs */
704         dsi_write_reg(status_reg, (mask ^ old_mask) & mask);
705         dsi_write_reg(enable_reg, mask);
706
707         /* flush posted writes */
708         dsi_read_reg(enable_reg);
709         dsi_read_reg(status_reg);
710 }
711
712 /* dsi.irq_lock has to be locked by the caller */
713 static void _omap_dsi_set_irqs(void)
714 {
715         u32 mask = DSI_IRQ_ERROR_MASK;
716 #ifdef DSI_CATCH_MISSING_TE
717         mask |= DSI_IRQ_TE_TRIGGER;
718 #endif
719         _omap_dsi_configure_irqs(dsi.isr_tables.isr_table,
720                         ARRAY_SIZE(dsi.isr_tables.isr_table), mask,
721                         DSI_IRQENABLE, DSI_IRQSTATUS);
722 }
723
724 /* dsi.irq_lock has to be locked by the caller */
725 static void _omap_dsi_set_irqs_vc(int vc)
726 {
727         _omap_dsi_configure_irqs(dsi.isr_tables.isr_table_vc[vc],
728                         ARRAY_SIZE(dsi.isr_tables.isr_table_vc[vc]),
729                         DSI_VC_IRQ_ERROR_MASK,
730                         DSI_VC_IRQENABLE(vc), DSI_VC_IRQSTATUS(vc));
731 }
732
733 /* dsi.irq_lock has to be locked by the caller */
734 static void _omap_dsi_set_irqs_cio(void)
735 {
736         _omap_dsi_configure_irqs(dsi.isr_tables.isr_table_cio,
737                         ARRAY_SIZE(dsi.isr_tables.isr_table_cio),
738                         DSI_CIO_IRQ_ERROR_MASK,
739                         DSI_COMPLEXIO_IRQ_ENABLE, DSI_COMPLEXIO_IRQ_STATUS);
740 }
741
742 static void _dsi_initialize_irq(void)
743 {
744         unsigned long flags;
745         int vc;
746
747         spin_lock_irqsave(&dsi.irq_lock, flags);
748
749         memset(&dsi.isr_tables, 0, sizeof(dsi.isr_tables));
750
751         _omap_dsi_set_irqs();
752         for (vc = 0; vc < 4; ++vc)
753                 _omap_dsi_set_irqs_vc(vc);
754         _omap_dsi_set_irqs_cio();
755
756         spin_unlock_irqrestore(&dsi.irq_lock, flags);
757 }
758
759 static int _dsi_register_isr(omap_dsi_isr_t isr, void *arg, u32 mask,
760                 struct dsi_isr_data *isr_array, unsigned isr_array_size)
761 {
762         struct dsi_isr_data *isr_data;
763         int free_idx;
764         int i;
765
766         BUG_ON(isr == NULL);
767
768         /* check for duplicate entry and find a free slot */
769         free_idx = -1;
770         for (i = 0; i < isr_array_size; i++) {
771                 isr_data = &isr_array[i];
772
773                 if (isr_data->isr == isr && isr_data->arg == arg &&
774                                 isr_data->mask == mask) {
775                         return -EINVAL;
776                 }
777
778                 if (isr_data->isr == NULL && free_idx == -1)
779                         free_idx = i;
780         }
781
782         if (free_idx == -1)
783                 return -EBUSY;
784
785         isr_data = &isr_array[free_idx];
786         isr_data->isr = isr;
787         isr_data->arg = arg;
788         isr_data->mask = mask;
789
790         return 0;
791 }
792
793 static int _dsi_unregister_isr(omap_dsi_isr_t isr, void *arg, u32 mask,
794                 struct dsi_isr_data *isr_array, unsigned isr_array_size)
795 {
796         struct dsi_isr_data *isr_data;
797         int i;
798
799         for (i = 0; i < isr_array_size; i++) {
800                 isr_data = &isr_array[i];
801                 if (isr_data->isr != isr || isr_data->arg != arg ||
802                                 isr_data->mask != mask)
803                         continue;
804
805                 isr_data->isr = NULL;
806                 isr_data->arg = NULL;
807                 isr_data->mask = 0;
808
809                 return 0;
810         }
811
812         return -EINVAL;
813 }
814
815 static int dsi_register_isr(omap_dsi_isr_t isr, void *arg, u32 mask)
816 {
817         unsigned long flags;
818         int r;
819
820         spin_lock_irqsave(&dsi.irq_lock, flags);
821
822         r = _dsi_register_isr(isr, arg, mask, dsi.isr_tables.isr_table,
823                         ARRAY_SIZE(dsi.isr_tables.isr_table));
824
825         if (r == 0)
826                 _omap_dsi_set_irqs();
827
828         spin_unlock_irqrestore(&dsi.irq_lock, flags);
829
830         return r;
831 }
832
833 static int dsi_unregister_isr(omap_dsi_isr_t isr, void *arg, u32 mask)
834 {
835         unsigned long flags;
836         int r;
837
838         spin_lock_irqsave(&dsi.irq_lock, flags);
839
840         r = _dsi_unregister_isr(isr, arg, mask, dsi.isr_tables.isr_table,
841                         ARRAY_SIZE(dsi.isr_tables.isr_table));
842
843         if (r == 0)
844                 _omap_dsi_set_irqs();
845
846         spin_unlock_irqrestore(&dsi.irq_lock, flags);
847
848         return r;
849 }
850
851 static int dsi_register_isr_vc(int channel, omap_dsi_isr_t isr, void *arg,
852                 u32 mask)
853 {
854         unsigned long flags;
855         int r;
856
857         spin_lock_irqsave(&dsi.irq_lock, flags);
858
859         r = _dsi_register_isr(isr, arg, mask,
860                         dsi.isr_tables.isr_table_vc[channel],
861                         ARRAY_SIZE(dsi.isr_tables.isr_table_vc[channel]));
862
863         if (r == 0)
864                 _omap_dsi_set_irqs_vc(channel);
865
866         spin_unlock_irqrestore(&dsi.irq_lock, flags);
867
868         return r;
869 }
870
871 static int dsi_unregister_isr_vc(int channel, omap_dsi_isr_t isr, void *arg,
872                 u32 mask)
873 {
874         unsigned long flags;
875         int r;
876
877         spin_lock_irqsave(&dsi.irq_lock, flags);
878
879         r = _dsi_unregister_isr(isr, arg, mask,
880                         dsi.isr_tables.isr_table_vc[channel],
881                         ARRAY_SIZE(dsi.isr_tables.isr_table_vc[channel]));
882
883         if (r == 0)
884                 _omap_dsi_set_irqs_vc(channel);
885
886         spin_unlock_irqrestore(&dsi.irq_lock, flags);
887
888         return r;
889 }
890
891 static int dsi_register_isr_cio(omap_dsi_isr_t isr, void *arg, u32 mask)
892 {
893         unsigned long flags;
894         int r;
895
896         spin_lock_irqsave(&dsi.irq_lock, flags);
897
898         r = _dsi_register_isr(isr, arg, mask, dsi.isr_tables.isr_table_cio,
899                         ARRAY_SIZE(dsi.isr_tables.isr_table_cio));
900
901         if (r == 0)
902                 _omap_dsi_set_irqs_cio();
903
904         spin_unlock_irqrestore(&dsi.irq_lock, flags);
905
906         return r;
907 }
908
909 static int dsi_unregister_isr_cio(omap_dsi_isr_t isr, void *arg, u32 mask)
910 {
911         unsigned long flags;
912         int r;
913
914         spin_lock_irqsave(&dsi.irq_lock, flags);
915
916         r = _dsi_unregister_isr(isr, arg, mask, dsi.isr_tables.isr_table_cio,
917                         ARRAY_SIZE(dsi.isr_tables.isr_table_cio));
918
919         if (r == 0)
920                 _omap_dsi_set_irqs_cio();
921
922         spin_unlock_irqrestore(&dsi.irq_lock, flags);
923
924         return r;
925 }
926
927 static u32 dsi_get_errors(void)
928 {
929         unsigned long flags;
930         u32 e;
931         spin_lock_irqsave(&dsi.errors_lock, flags);
932         e = dsi.errors;
933         dsi.errors = 0;
934         spin_unlock_irqrestore(&dsi.errors_lock, flags);
935         return e;
936 }
937
938 /* DSI func clock. this could also be dsi_pll_hsdiv_dsi_clk */
939 static inline void enable_clocks(bool enable)
940 {
941         if (enable)
942                 dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK);
943         else
944                 dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK);
945 }
946
947 /* source clock for DSI PLL. this could also be PCLKFREE */
948 static inline void dsi_enable_pll_clock(bool enable)
949 {
950         if (enable)
951                 dss_clk_enable(DSS_CLK_SYSCK);
952         else
953                 dss_clk_disable(DSS_CLK_SYSCK);
954
955         if (enable && dsi.pll_locked) {
956                 if (wait_for_bit_change(DSI_PLL_STATUS, 1, 1) != 1)
957                         DSSERR("cannot lock PLL when enabling clocks\n");
958         }
959 }
960
961 #ifdef DEBUG
962 static void _dsi_print_reset_status(void)
963 {
964         u32 l;
965         int b0, b1, b2;
966
967         if (!dss_debug)
968                 return;
969
970         /* A dummy read using the SCP interface to any DSIPHY register is
971          * required after DSIPHY reset to complete the reset of the DSI complex
972          * I/O. */
973         l = dsi_read_reg(DSI_DSIPHY_CFG5);
974
975         printk(KERN_DEBUG "DSI resets: ");
976
977         l = dsi_read_reg(DSI_PLL_STATUS);
978         printk("PLL (%d) ", FLD_GET(l, 0, 0));
979
980         l = dsi_read_reg(DSI_COMPLEXIO_CFG1);
981         printk("CIO (%d) ", FLD_GET(l, 29, 29));
982
983         if (dss_has_feature(FEAT_DSI_REVERSE_TXCLKESC)) {
984                 b0 = 28;
985                 b1 = 27;
986                 b2 = 26;
987         } else {
988                 b0 = 24;
989                 b1 = 25;
990                 b2 = 26;
991         }
992
993         l = dsi_read_reg(DSI_DSIPHY_CFG5);
994         printk("PHY (%x%x%x, %d, %d, %d)\n",
995                         FLD_GET(l, b0, b0),
996                         FLD_GET(l, b1, b1),
997                         FLD_GET(l, b2, b2),
998                         FLD_GET(l, 29, 29),
999                         FLD_GET(l, 30, 30),
1000                         FLD_GET(l, 31, 31));
1001 }
1002 #else
1003 #define _dsi_print_reset_status()
1004 #endif
1005
1006 static inline int dsi_if_enable(bool enable)
1007 {
1008         DSSDBG("dsi_if_enable(%d)\n", enable);
1009
1010         enable = enable ? 1 : 0;
1011         REG_FLD_MOD(DSI_CTRL, enable, 0, 0); /* IF_EN */
1012
1013         if (wait_for_bit_change(DSI_CTRL, 0, enable) != enable) {
1014                         DSSERR("Failed to set dsi_if_enable to %d\n", enable);
1015                         return -EIO;
1016         }
1017
1018         return 0;
1019 }
1020
1021 unsigned long dsi_get_pll_hsdiv_dispc_rate(void)
1022 {
1023         return dsi.current_cinfo.dsi_pll_hsdiv_dispc_clk;
1024 }
1025
1026 static unsigned long dsi_get_pll_hsdiv_dsi_rate(void)
1027 {
1028         return dsi.current_cinfo.dsi_pll_hsdiv_dsi_clk;
1029 }
1030
1031 static unsigned long dsi_get_txbyteclkhs(void)
1032 {
1033         return dsi.current_cinfo.clkin4ddr / 16;
1034 }
1035
1036 static unsigned long dsi_fclk_rate(void)
1037 {
1038         unsigned long r;
1039
1040         if (dss_get_dsi_clk_source() == OMAP_DSS_CLK_SRC_FCK) {
1041                 /* DSI FCLK source is DSS_CLK_FCK */
1042                 r = dss_clk_get_rate(DSS_CLK_FCK);
1043         } else {
1044                 /* DSI FCLK source is dsi_pll_hsdiv_dsi_clk */
1045                 r = dsi_get_pll_hsdiv_dsi_rate();
1046         }
1047
1048         return r;
1049 }
1050
1051 static int dsi_set_lp_clk_divisor(struct omap_dss_device *dssdev)
1052 {
1053         unsigned long dsi_fclk;
1054         unsigned lp_clk_div;
1055         unsigned long lp_clk;
1056
1057         lp_clk_div = dssdev->clocks.dsi.lp_clk_div;
1058
1059         if (lp_clk_div == 0 || lp_clk_div > dsi.lpdiv_max)
1060                 return -EINVAL;
1061
1062         dsi_fclk = dsi_fclk_rate();
1063
1064         lp_clk = dsi_fclk / 2 / lp_clk_div;
1065
1066         DSSDBG("LP_CLK_DIV %u, LP_CLK %lu\n", lp_clk_div, lp_clk);
1067         dsi.current_cinfo.lp_clk = lp_clk;
1068         dsi.current_cinfo.lp_clk_div = lp_clk_div;
1069
1070         REG_FLD_MOD(DSI_CLK_CTRL, lp_clk_div, 12, 0);   /* LP_CLK_DIVISOR */
1071
1072         REG_FLD_MOD(DSI_CLK_CTRL, dsi_fclk > 30000000 ? 1 : 0,
1073                         21, 21);                /* LP_RX_SYNCHRO_ENABLE */
1074
1075         return 0;
1076 }
1077
1078 static void dsi_enable_scp_clk(void)
1079 {
1080         if (dsi.scp_clk_refcount++ == 0)
1081                 REG_FLD_MOD(DSI_CLK_CTRL, 1, 14, 14); /* CIO_CLK_ICG */
1082 }
1083
1084 static void dsi_disable_scp_clk(void)
1085 {
1086         WARN_ON(dsi.scp_clk_refcount == 0);
1087         if (--dsi.scp_clk_refcount == 0)
1088                 REG_FLD_MOD(DSI_CLK_CTRL, 0, 14, 14); /* CIO_CLK_ICG */
1089 }
1090
1091 enum dsi_pll_power_state {
1092         DSI_PLL_POWER_OFF       = 0x0,
1093         DSI_PLL_POWER_ON_HSCLK  = 0x1,
1094         DSI_PLL_POWER_ON_ALL    = 0x2,
1095         DSI_PLL_POWER_ON_DIV    = 0x3,
1096 };
1097
1098 static int dsi_pll_power(enum dsi_pll_power_state state)
1099 {
1100         int t = 0;
1101
1102         /* DSI-PLL power command 0x3 is not working */
1103         if (dss_has_feature(FEAT_DSI_PLL_PWR_BUG) &&
1104                         state == DSI_PLL_POWER_ON_DIV)
1105                 state = DSI_PLL_POWER_ON_ALL;
1106
1107         REG_FLD_MOD(DSI_CLK_CTRL, state, 31, 30);       /* PLL_PWR_CMD */
1108
1109         /* PLL_PWR_STATUS */
1110         while (FLD_GET(dsi_read_reg(DSI_CLK_CTRL), 29, 28) != state) {
1111                 if (++t > 1000) {
1112                         DSSERR("Failed to set DSI PLL power mode to %d\n",
1113                                         state);
1114                         return -ENODEV;
1115                 }
1116                 udelay(1);
1117         }
1118
1119         return 0;
1120 }
1121
1122 /* calculate clock rates using dividers in cinfo */
1123 static int dsi_calc_clock_rates(struct omap_dss_device *dssdev,
1124                 struct dsi_clock_info *cinfo)
1125 {
1126         if (cinfo->regn == 0 || cinfo->regn > dsi.regn_max)
1127                 return -EINVAL;
1128
1129         if (cinfo->regm == 0 || cinfo->regm > dsi.regm_max)
1130                 return -EINVAL;
1131
1132         if (cinfo->regm_dispc > dsi.regm_dispc_max)
1133                 return -EINVAL;
1134
1135         if (cinfo->regm_dsi > dsi.regm_dsi_max)
1136                 return -EINVAL;
1137
1138         if (cinfo->use_sys_clk) {
1139                 cinfo->clkin = dss_clk_get_rate(DSS_CLK_SYSCK);
1140                 /* XXX it is unclear if highfreq should be used
1141                  * with DSS_SYS_CLK source also */
1142                 cinfo->highfreq = 0;
1143         } else {
1144                 cinfo->clkin = dispc_pclk_rate(dssdev->manager->id);
1145
1146                 if (cinfo->clkin < 32000000)
1147                         cinfo->highfreq = 0;
1148                 else
1149                         cinfo->highfreq = 1;
1150         }
1151
1152         cinfo->fint = cinfo->clkin / (cinfo->regn * (cinfo->highfreq ? 2 : 1));
1153
1154         if (cinfo->fint > dsi.fint_max || cinfo->fint < dsi.fint_min)
1155                 return -EINVAL;
1156
1157         cinfo->clkin4ddr = 2 * cinfo->regm * cinfo->fint;
1158
1159         if (cinfo->clkin4ddr > 1800 * 1000 * 1000)
1160                 return -EINVAL;
1161
1162         if (cinfo->regm_dispc > 0)
1163                 cinfo->dsi_pll_hsdiv_dispc_clk =
1164                         cinfo->clkin4ddr / cinfo->regm_dispc;
1165         else
1166                 cinfo->dsi_pll_hsdiv_dispc_clk = 0;
1167
1168         if (cinfo->regm_dsi > 0)
1169                 cinfo->dsi_pll_hsdiv_dsi_clk =
1170                         cinfo->clkin4ddr / cinfo->regm_dsi;
1171         else
1172                 cinfo->dsi_pll_hsdiv_dsi_clk = 0;
1173
1174         return 0;
1175 }
1176
1177 int dsi_pll_calc_clock_div_pck(bool is_tft, unsigned long req_pck,
1178                 struct dsi_clock_info *dsi_cinfo,
1179                 struct dispc_clock_info *dispc_cinfo)
1180 {
1181         struct dsi_clock_info cur, best;
1182         struct dispc_clock_info best_dispc;
1183         int min_fck_per_pck;
1184         int match = 0;
1185         unsigned long dss_sys_clk, max_dss_fck;
1186
1187         dss_sys_clk = dss_clk_get_rate(DSS_CLK_SYSCK);
1188
1189         max_dss_fck = dss_feat_get_param_max(FEAT_PARAM_DSS_FCK);
1190
1191         if (req_pck == dsi.cache_req_pck &&
1192                         dsi.cache_cinfo.clkin == dss_sys_clk) {
1193                 DSSDBG("DSI clock info found from cache\n");
1194                 *dsi_cinfo = dsi.cache_cinfo;
1195                 dispc_find_clk_divs(is_tft, req_pck,
1196                         dsi_cinfo->dsi_pll_hsdiv_dispc_clk, dispc_cinfo);
1197                 return 0;
1198         }
1199
1200         min_fck_per_pck = CONFIG_OMAP2_DSS_MIN_FCK_PER_PCK;
1201
1202         if (min_fck_per_pck &&
1203                 req_pck * min_fck_per_pck > max_dss_fck) {
1204                 DSSERR("Requested pixel clock not possible with the current "
1205                                 "OMAP2_DSS_MIN_FCK_PER_PCK setting. Turning "
1206                                 "the constraint off.\n");
1207                 min_fck_per_pck = 0;
1208         }
1209
1210         DSSDBG("dsi_pll_calc\n");
1211
1212 retry:
1213         memset(&best, 0, sizeof(best));
1214         memset(&best_dispc, 0, sizeof(best_dispc));
1215
1216         memset(&cur, 0, sizeof(cur));
1217         cur.clkin = dss_sys_clk;
1218         cur.use_sys_clk = 1;
1219         cur.highfreq = 0;
1220
1221         /* no highfreq: 0.75MHz < Fint = clkin / regn < 2.1MHz */
1222         /* highfreq: 0.75MHz < Fint = clkin / (2*regn) < 2.1MHz */
1223         /* To reduce PLL lock time, keep Fint high (around 2 MHz) */
1224         for (cur.regn = 1; cur.regn < dsi.regn_max; ++cur.regn) {
1225                 if (cur.highfreq == 0)
1226                         cur.fint = cur.clkin / cur.regn;
1227                 else
1228                         cur.fint = cur.clkin / (2 * cur.regn);
1229
1230                 if (cur.fint > dsi.fint_max || cur.fint < dsi.fint_min)
1231                         continue;
1232
1233                 /* DSIPHY(MHz) = (2 * regm / regn) * (clkin / (highfreq + 1)) */
1234                 for (cur.regm = 1; cur.regm < dsi.regm_max; ++cur.regm) {
1235                         unsigned long a, b;
1236
1237                         a = 2 * cur.regm * (cur.clkin/1000);
1238                         b = cur.regn * (cur.highfreq + 1);
1239                         cur.clkin4ddr = a / b * 1000;
1240
1241                         if (cur.clkin4ddr > 1800 * 1000 * 1000)
1242                                 break;
1243
1244                         /* dsi_pll_hsdiv_dispc_clk(MHz) =
1245                          * DSIPHY(MHz) / regm_dispc  < 173MHz/186Mhz */
1246                         for (cur.regm_dispc = 1; cur.regm_dispc < dsi.regm_dispc_max;
1247                                         ++cur.regm_dispc) {
1248                                 struct dispc_clock_info cur_dispc;
1249                                 cur.dsi_pll_hsdiv_dispc_clk =
1250                                         cur.clkin4ddr / cur.regm_dispc;
1251
1252                                 /* this will narrow down the search a bit,
1253                                  * but still give pixclocks below what was
1254                                  * requested */
1255                                 if (cur.dsi_pll_hsdiv_dispc_clk  < req_pck)
1256                                         break;
1257
1258                                 if (cur.dsi_pll_hsdiv_dispc_clk > max_dss_fck)
1259                                         continue;
1260
1261                                 if (min_fck_per_pck &&
1262                                         cur.dsi_pll_hsdiv_dispc_clk <
1263                                                 req_pck * min_fck_per_pck)
1264                                         continue;
1265
1266                                 match = 1;
1267
1268                                 dispc_find_clk_divs(is_tft, req_pck,
1269                                                 cur.dsi_pll_hsdiv_dispc_clk,
1270                                                 &cur_dispc);
1271
1272                                 if (abs(cur_dispc.pck - req_pck) <
1273                                                 abs(best_dispc.pck - req_pck)) {
1274                                         best = cur;
1275                                         best_dispc = cur_dispc;
1276
1277                                         if (cur_dispc.pck == req_pck)
1278                                                 goto found;
1279                                 }
1280                         }
1281                 }
1282         }
1283 found:
1284         if (!match) {
1285                 if (min_fck_per_pck) {
1286                         DSSERR("Could not find suitable clock settings.\n"
1287                                         "Turning FCK/PCK constraint off and"
1288                                         "trying again.\n");
1289                         min_fck_per_pck = 0;
1290                         goto retry;
1291                 }
1292
1293                 DSSERR("Could not find suitable clock settings.\n");
1294
1295                 return -EINVAL;
1296         }
1297
1298         /* dsi_pll_hsdiv_dsi_clk (regm_dsi) is not used */
1299         best.regm_dsi = 0;
1300         best.dsi_pll_hsdiv_dsi_clk = 0;
1301
1302         if (dsi_cinfo)
1303                 *dsi_cinfo = best;
1304         if (dispc_cinfo)
1305                 *dispc_cinfo = best_dispc;
1306
1307         dsi.cache_req_pck = req_pck;
1308         dsi.cache_clk_freq = 0;
1309         dsi.cache_cinfo = best;
1310
1311         return 0;
1312 }
1313
1314 int dsi_pll_set_clock_div(struct dsi_clock_info *cinfo)
1315 {
1316         int r = 0;
1317         u32 l;
1318         int f = 0;
1319         u8 regn_start, regn_end, regm_start, regm_end;
1320         u8 regm_dispc_start, regm_dispc_end, regm_dsi_start, regm_dsi_end;
1321
1322         DSSDBGF();
1323
1324         dsi.current_cinfo.use_sys_clk = cinfo->use_sys_clk;
1325         dsi.current_cinfo.highfreq = cinfo->highfreq;
1326
1327         dsi.current_cinfo.fint = cinfo->fint;
1328         dsi.current_cinfo.clkin4ddr = cinfo->clkin4ddr;
1329         dsi.current_cinfo.dsi_pll_hsdiv_dispc_clk =
1330                         cinfo->dsi_pll_hsdiv_dispc_clk;
1331         dsi.current_cinfo.dsi_pll_hsdiv_dsi_clk =
1332                         cinfo->dsi_pll_hsdiv_dsi_clk;
1333
1334         dsi.current_cinfo.regn = cinfo->regn;
1335         dsi.current_cinfo.regm = cinfo->regm;
1336         dsi.current_cinfo.regm_dispc = cinfo->regm_dispc;
1337         dsi.current_cinfo.regm_dsi = cinfo->regm_dsi;
1338
1339         DSSDBG("DSI Fint %ld\n", cinfo->fint);
1340
1341         DSSDBG("clkin (%s) rate %ld, highfreq %d\n",
1342                         cinfo->use_sys_clk ? "dss_sys_clk" : "pclkfree",
1343                         cinfo->clkin,
1344                         cinfo->highfreq);
1345
1346         /* DSIPHY == CLKIN4DDR */
1347         DSSDBG("CLKIN4DDR = 2 * %d / %d * %lu / %d = %lu\n",
1348                         cinfo->regm,
1349                         cinfo->regn,
1350                         cinfo->clkin,
1351                         cinfo->highfreq + 1,
1352                         cinfo->clkin4ddr);
1353
1354         DSSDBG("Data rate on 1 DSI lane %ld Mbps\n",
1355                         cinfo->clkin4ddr / 1000 / 1000 / 2);
1356
1357         DSSDBG("Clock lane freq %ld Hz\n", cinfo->clkin4ddr / 4);
1358
1359         DSSDBG("regm_dispc = %d, %s (%s) = %lu\n", cinfo->regm_dispc,
1360                 dss_get_generic_clk_source_name(OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC),
1361                 dss_feat_get_clk_source_name(OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC),
1362                 cinfo->dsi_pll_hsdiv_dispc_clk);
1363         DSSDBG("regm_dsi = %d, %s (%s) = %lu\n", cinfo->regm_dsi,
1364                 dss_get_generic_clk_source_name(OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DSI),
1365                 dss_feat_get_clk_source_name(OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DSI),
1366                 cinfo->dsi_pll_hsdiv_dsi_clk);
1367
1368         dss_feat_get_reg_field(FEAT_REG_DSIPLL_REGN, &regn_start, &regn_end);
1369         dss_feat_get_reg_field(FEAT_REG_DSIPLL_REGM, &regm_start, &regm_end);
1370         dss_feat_get_reg_field(FEAT_REG_DSIPLL_REGM_DISPC, &regm_dispc_start,
1371                         &regm_dispc_end);
1372         dss_feat_get_reg_field(FEAT_REG_DSIPLL_REGM_DSI, &regm_dsi_start,
1373                         &regm_dsi_end);
1374
1375         REG_FLD_MOD(DSI_PLL_CONTROL, 0, 0, 0); /* DSI_PLL_AUTOMODE = manual */
1376
1377         l = dsi_read_reg(DSI_PLL_CONFIGURATION1);
1378         l = FLD_MOD(l, 1, 0, 0);                /* DSI_PLL_STOPMODE */
1379         /* DSI_PLL_REGN */
1380         l = FLD_MOD(l, cinfo->regn - 1, regn_start, regn_end);
1381         /* DSI_PLL_REGM */
1382         l = FLD_MOD(l, cinfo->regm, regm_start, regm_end);
1383         /* DSI_CLOCK_DIV */
1384         l = FLD_MOD(l, cinfo->regm_dispc > 0 ? cinfo->regm_dispc - 1 : 0,
1385                         regm_dispc_start, regm_dispc_end);
1386         /* DSIPROTO_CLOCK_DIV */
1387         l = FLD_MOD(l, cinfo->regm_dsi > 0 ? cinfo->regm_dsi - 1 : 0,
1388                         regm_dsi_start, regm_dsi_end);
1389         dsi_write_reg(DSI_PLL_CONFIGURATION1, l);
1390
1391         BUG_ON(cinfo->fint < dsi.fint_min || cinfo->fint > dsi.fint_max);
1392
1393         if (dss_has_feature(FEAT_DSI_PLL_FREQSEL)) {
1394                 f = cinfo->fint < 1000000 ? 0x3 :
1395                         cinfo->fint < 1250000 ? 0x4 :
1396                         cinfo->fint < 1500000 ? 0x5 :
1397                         cinfo->fint < 1750000 ? 0x6 :
1398                         0x7;
1399         }
1400
1401         l = dsi_read_reg(DSI_PLL_CONFIGURATION2);
1402
1403         if (dss_has_feature(FEAT_DSI_PLL_FREQSEL))
1404                 l = FLD_MOD(l, f, 4, 1);        /* DSI_PLL_FREQSEL */
1405         l = FLD_MOD(l, cinfo->use_sys_clk ? 0 : 1,
1406                         11, 11);                /* DSI_PLL_CLKSEL */
1407         l = FLD_MOD(l, cinfo->highfreq,
1408                         12, 12);                /* DSI_PLL_HIGHFREQ */
1409         l = FLD_MOD(l, 1, 13, 13);              /* DSI_PLL_REFEN */
1410         l = FLD_MOD(l, 0, 14, 14);              /* DSIPHY_CLKINEN */
1411         l = FLD_MOD(l, 1, 20, 20);              /* DSI_HSDIVBYPASS */
1412         dsi_write_reg(DSI_PLL_CONFIGURATION2, l);
1413
1414         REG_FLD_MOD(DSI_PLL_GO, 1, 0, 0);       /* DSI_PLL_GO */
1415
1416         if (wait_for_bit_change(DSI_PLL_GO, 0, 0) != 0) {
1417                 DSSERR("dsi pll go bit not going down.\n");
1418                 r = -EIO;
1419                 goto err;
1420         }
1421
1422         if (wait_for_bit_change(DSI_PLL_STATUS, 1, 1) != 1) {
1423                 DSSERR("cannot lock PLL\n");
1424                 r = -EIO;
1425                 goto err;
1426         }
1427
1428         dsi.pll_locked = 1;
1429
1430         l = dsi_read_reg(DSI_PLL_CONFIGURATION2);
1431         l = FLD_MOD(l, 0, 0, 0);        /* DSI_PLL_IDLE */
1432         l = FLD_MOD(l, 0, 5, 5);        /* DSI_PLL_PLLLPMODE */
1433         l = FLD_MOD(l, 0, 6, 6);        /* DSI_PLL_LOWCURRSTBY */
1434         l = FLD_MOD(l, 0, 7, 7);        /* DSI_PLL_TIGHTPHASELOCK */
1435         l = FLD_MOD(l, 0, 8, 8);        /* DSI_PLL_DRIFTGUARDEN */
1436         l = FLD_MOD(l, 0, 10, 9);       /* DSI_PLL_LOCKSEL */
1437         l = FLD_MOD(l, 1, 13, 13);      /* DSI_PLL_REFEN */
1438         l = FLD_MOD(l, 1, 14, 14);      /* DSIPHY_CLKINEN */
1439         l = FLD_MOD(l, 0, 15, 15);      /* DSI_BYPASSEN */
1440         l = FLD_MOD(l, 1, 16, 16);      /* DSS_CLOCK_EN */
1441         l = FLD_MOD(l, 0, 17, 17);      /* DSS_CLOCK_PWDN */
1442         l = FLD_MOD(l, 1, 18, 18);      /* DSI_PROTO_CLOCK_EN */
1443         l = FLD_MOD(l, 0, 19, 19);      /* DSI_PROTO_CLOCK_PWDN */
1444         l = FLD_MOD(l, 0, 20, 20);      /* DSI_HSDIVBYPASS */
1445         dsi_write_reg(DSI_PLL_CONFIGURATION2, l);
1446
1447         DSSDBG("PLL config done\n");
1448 err:
1449         return r;
1450 }
1451
1452 int dsi_pll_init(struct omap_dss_device *dssdev, bool enable_hsclk,
1453                 bool enable_hsdiv)
1454 {
1455         int r = 0;
1456         enum dsi_pll_power_state pwstate;
1457
1458         DSSDBG("PLL init\n");
1459
1460         if (dsi.vdds_dsi_reg == NULL) {
1461                 struct regulator *vdds_dsi;
1462
1463                 vdds_dsi = regulator_get(&dsi.pdev->dev, "vdds_dsi");
1464
1465                 if (IS_ERR(vdds_dsi)) {
1466                         DSSERR("can't get VDDS_DSI regulator\n");
1467                         return PTR_ERR(vdds_dsi);
1468                 }
1469
1470                 dsi.vdds_dsi_reg = vdds_dsi;
1471         }
1472
1473         enable_clocks(1);
1474         dsi_enable_pll_clock(1);
1475         /*
1476          * Note: SCP CLK is not required on OMAP3, but it is required on OMAP4.
1477          */
1478         dsi_enable_scp_clk();
1479
1480         if (!dsi.vdds_dsi_enabled) {
1481                 r = regulator_enable(dsi.vdds_dsi_reg);
1482                 if (r)
1483                         goto err0;
1484                 dsi.vdds_dsi_enabled = true;
1485         }
1486
1487         /* XXX PLL does not come out of reset without this... */
1488         dispc_pck_free_enable(1);
1489
1490         if (wait_for_bit_change(DSI_PLL_STATUS, 0, 1) != 1) {
1491                 DSSERR("PLL not coming out of reset.\n");
1492                 r = -ENODEV;
1493                 dispc_pck_free_enable(0);
1494                 goto err1;
1495         }
1496
1497         /* XXX ... but if left on, we get problems when planes do not
1498          * fill the whole display. No idea about this */
1499         dispc_pck_free_enable(0);
1500
1501         if (enable_hsclk && enable_hsdiv)
1502                 pwstate = DSI_PLL_POWER_ON_ALL;
1503         else if (enable_hsclk)
1504                 pwstate = DSI_PLL_POWER_ON_HSCLK;
1505         else if (enable_hsdiv)
1506                 pwstate = DSI_PLL_POWER_ON_DIV;
1507         else
1508                 pwstate = DSI_PLL_POWER_OFF;
1509
1510         r = dsi_pll_power(pwstate);
1511
1512         if (r)
1513                 goto err1;
1514
1515         DSSDBG("PLL init done\n");
1516
1517         return 0;
1518 err1:
1519         if (dsi.vdds_dsi_enabled) {
1520                 regulator_disable(dsi.vdds_dsi_reg);
1521                 dsi.vdds_dsi_enabled = false;
1522         }
1523 err0:
1524         dsi_disable_scp_clk();
1525         enable_clocks(0);
1526         dsi_enable_pll_clock(0);
1527         return r;
1528 }
1529
1530 void dsi_pll_uninit(bool disconnect_lanes)
1531 {
1532         dsi.pll_locked = 0;
1533         dsi_pll_power(DSI_PLL_POWER_OFF);
1534         if (disconnect_lanes) {
1535                 WARN_ON(!dsi.vdds_dsi_enabled);
1536                 regulator_disable(dsi.vdds_dsi_reg);
1537                 dsi.vdds_dsi_enabled = false;
1538         }
1539
1540         dsi_disable_scp_clk();
1541         enable_clocks(0);
1542         dsi_enable_pll_clock(0);
1543
1544         DSSDBG("PLL uninit done\n");
1545 }
1546
1547 void dsi_dump_clocks(struct seq_file *s)
1548 {
1549         struct dsi_clock_info *cinfo = &dsi.current_cinfo;
1550         enum omap_dss_clk_source dispc_clk_src, dsi_clk_src;
1551
1552         dispc_clk_src = dss_get_dispc_clk_source();
1553         dsi_clk_src = dss_get_dsi_clk_source();
1554
1555         enable_clocks(1);
1556
1557         seq_printf(s,   "- DSI PLL -\n");
1558
1559         seq_printf(s,   "dsi pll source = %s\n",
1560                         cinfo->use_sys_clk ? "dss_sys_clk" : "pclkfree");
1561
1562         seq_printf(s,   "Fint\t\t%-16luregn %u\n", cinfo->fint, cinfo->regn);
1563
1564         seq_printf(s,   "CLKIN4DDR\t%-16luregm %u\n",
1565                         cinfo->clkin4ddr, cinfo->regm);
1566
1567         seq_printf(s,   "%s (%s)\t%-16luregm_dispc %u\t(%s)\n",
1568                         dss_get_generic_clk_source_name(dispc_clk_src),
1569                         dss_feat_get_clk_source_name(dispc_clk_src),
1570                         cinfo->dsi_pll_hsdiv_dispc_clk,
1571                         cinfo->regm_dispc,
1572                         dispc_clk_src == OMAP_DSS_CLK_SRC_FCK ?
1573                         "off" : "on");
1574
1575         seq_printf(s,   "%s (%s)\t%-16luregm_dsi %u\t(%s)\n",
1576                         dss_get_generic_clk_source_name(dsi_clk_src),
1577                         dss_feat_get_clk_source_name(dsi_clk_src),
1578                         cinfo->dsi_pll_hsdiv_dsi_clk,
1579                         cinfo->regm_dsi,
1580                         dsi_clk_src == OMAP_DSS_CLK_SRC_FCK ?
1581                         "off" : "on");
1582
1583         seq_printf(s,   "- DSI -\n");
1584
1585         seq_printf(s,   "dsi fclk source = %s (%s)\n",
1586                         dss_get_generic_clk_source_name(dsi_clk_src),
1587                         dss_feat_get_clk_source_name(dsi_clk_src));
1588
1589         seq_printf(s,   "DSI_FCLK\t%lu\n", dsi_fclk_rate());
1590
1591         seq_printf(s,   "DDR_CLK\t\t%lu\n",
1592                         cinfo->clkin4ddr / 4);
1593
1594         seq_printf(s,   "TxByteClkHS\t%lu\n", dsi_get_txbyteclkhs());
1595
1596         seq_printf(s,   "LP_CLK\t\t%lu\n", cinfo->lp_clk);
1597
1598         seq_printf(s,   "VP_CLK\t\t%lu\n"
1599                         "VP_PCLK\t\t%lu\n",
1600                         dispc_lclk_rate(OMAP_DSS_CHANNEL_LCD),
1601                         dispc_pclk_rate(OMAP_DSS_CHANNEL_LCD));
1602
1603         enable_clocks(0);
1604 }
1605
1606 #ifdef CONFIG_OMAP2_DSS_COLLECT_IRQ_STATS
1607 void dsi_dump_irqs(struct seq_file *s)
1608 {
1609         unsigned long flags;
1610         struct dsi_irq_stats stats;
1611
1612         spin_lock_irqsave(&dsi.irq_stats_lock, flags);
1613
1614         stats = dsi.irq_stats;
1615         memset(&dsi.irq_stats, 0, sizeof(dsi.irq_stats));
1616         dsi.irq_stats.last_reset = jiffies;
1617
1618         spin_unlock_irqrestore(&dsi.irq_stats_lock, flags);
1619
1620         seq_printf(s, "period %u ms\n",
1621                         jiffies_to_msecs(jiffies - stats.last_reset));
1622
1623         seq_printf(s, "irqs %d\n", stats.irq_count);
1624 #define PIS(x) \
1625         seq_printf(s, "%-20s %10d\n", #x, stats.dsi_irqs[ffs(DSI_IRQ_##x)-1]);
1626
1627         seq_printf(s, "-- DSI interrupts --\n");
1628         PIS(VC0);
1629         PIS(VC1);
1630         PIS(VC2);
1631         PIS(VC3);
1632         PIS(WAKEUP);
1633         PIS(RESYNC);
1634         PIS(PLL_LOCK);
1635         PIS(PLL_UNLOCK);
1636         PIS(PLL_RECALL);
1637         PIS(COMPLEXIO_ERR);
1638         PIS(HS_TX_TIMEOUT);
1639         PIS(LP_RX_TIMEOUT);
1640         PIS(TE_TRIGGER);
1641         PIS(ACK_TRIGGER);
1642         PIS(SYNC_LOST);
1643         PIS(LDO_POWER_GOOD);
1644         PIS(TA_TIMEOUT);
1645 #undef PIS
1646
1647 #define PIS(x) \
1648         seq_printf(s, "%-20s %10d %10d %10d %10d\n", #x, \
1649                         stats.vc_irqs[0][ffs(DSI_VC_IRQ_##x)-1], \
1650                         stats.vc_irqs[1][ffs(DSI_VC_IRQ_##x)-1], \
1651                         stats.vc_irqs[2][ffs(DSI_VC_IRQ_##x)-1], \
1652                         stats.vc_irqs[3][ffs(DSI_VC_IRQ_##x)-1]);
1653
1654         seq_printf(s, "-- VC interrupts --\n");
1655         PIS(CS);
1656         PIS(ECC_CORR);
1657         PIS(PACKET_SENT);
1658         PIS(FIFO_TX_OVF);
1659         PIS(FIFO_RX_OVF);
1660         PIS(BTA);
1661         PIS(ECC_NO_CORR);
1662         PIS(FIFO_TX_UDF);
1663         PIS(PP_BUSY_CHANGE);
1664 #undef PIS
1665
1666 #define PIS(x) \
1667         seq_printf(s, "%-20s %10d\n", #x, \
1668                         stats.cio_irqs[ffs(DSI_CIO_IRQ_##x)-1]);
1669
1670         seq_printf(s, "-- CIO interrupts --\n");
1671         PIS(ERRSYNCESC1);
1672         PIS(ERRSYNCESC2);
1673         PIS(ERRSYNCESC3);
1674         PIS(ERRESC1);
1675         PIS(ERRESC2);
1676         PIS(ERRESC3);
1677         PIS(ERRCONTROL1);
1678         PIS(ERRCONTROL2);
1679         PIS(ERRCONTROL3);
1680         PIS(STATEULPS1);
1681         PIS(STATEULPS2);
1682         PIS(STATEULPS3);
1683         PIS(ERRCONTENTIONLP0_1);
1684         PIS(ERRCONTENTIONLP1_1);
1685         PIS(ERRCONTENTIONLP0_2);
1686         PIS(ERRCONTENTIONLP1_2);
1687         PIS(ERRCONTENTIONLP0_3);
1688         PIS(ERRCONTENTIONLP1_3);
1689         PIS(ULPSACTIVENOT_ALL0);
1690         PIS(ULPSACTIVENOT_ALL1);
1691 #undef PIS
1692 }
1693 #endif
1694
1695 void dsi_dump_regs(struct seq_file *s)
1696 {
1697 #define DUMPREG(r) seq_printf(s, "%-35s %08x\n", #r, dsi_read_reg(r))
1698
1699         dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK);
1700
1701         DUMPREG(DSI_REVISION);
1702         DUMPREG(DSI_SYSCONFIG);
1703         DUMPREG(DSI_SYSSTATUS);
1704         DUMPREG(DSI_IRQSTATUS);
1705         DUMPREG(DSI_IRQENABLE);
1706         DUMPREG(DSI_CTRL);
1707         DUMPREG(DSI_COMPLEXIO_CFG1);
1708         DUMPREG(DSI_COMPLEXIO_IRQ_STATUS);
1709         DUMPREG(DSI_COMPLEXIO_IRQ_ENABLE);
1710         DUMPREG(DSI_CLK_CTRL);
1711         DUMPREG(DSI_TIMING1);
1712         DUMPREG(DSI_TIMING2);
1713         DUMPREG(DSI_VM_TIMING1);
1714         DUMPREG(DSI_VM_TIMING2);
1715         DUMPREG(DSI_VM_TIMING3);
1716         DUMPREG(DSI_CLK_TIMING);
1717         DUMPREG(DSI_TX_FIFO_VC_SIZE);
1718         DUMPREG(DSI_RX_FIFO_VC_SIZE);
1719         DUMPREG(DSI_COMPLEXIO_CFG2);
1720         DUMPREG(DSI_RX_FIFO_VC_FULLNESS);
1721         DUMPREG(DSI_VM_TIMING4);
1722         DUMPREG(DSI_TX_FIFO_VC_EMPTINESS);
1723         DUMPREG(DSI_VM_TIMING5);
1724         DUMPREG(DSI_VM_TIMING6);
1725         DUMPREG(DSI_VM_TIMING7);
1726         DUMPREG(DSI_STOPCLK_TIMING);
1727
1728         DUMPREG(DSI_VC_CTRL(0));
1729         DUMPREG(DSI_VC_TE(0));
1730         DUMPREG(DSI_VC_LONG_PACKET_HEADER(0));
1731         DUMPREG(DSI_VC_LONG_PACKET_PAYLOAD(0));
1732         DUMPREG(DSI_VC_SHORT_PACKET_HEADER(0));
1733         DUMPREG(DSI_VC_IRQSTATUS(0));
1734         DUMPREG(DSI_VC_IRQENABLE(0));
1735
1736         DUMPREG(DSI_VC_CTRL(1));
1737         DUMPREG(DSI_VC_TE(1));
1738         DUMPREG(DSI_VC_LONG_PACKET_HEADER(1));
1739         DUMPREG(DSI_VC_LONG_PACKET_PAYLOAD(1));
1740         DUMPREG(DSI_VC_SHORT_PACKET_HEADER(1));
1741         DUMPREG(DSI_VC_IRQSTATUS(1));
1742         DUMPREG(DSI_VC_IRQENABLE(1));
1743
1744         DUMPREG(DSI_VC_CTRL(2));
1745         DUMPREG(DSI_VC_TE(2));
1746         DUMPREG(DSI_VC_LONG_PACKET_HEADER(2));
1747         DUMPREG(DSI_VC_LONG_PACKET_PAYLOAD(2));
1748         DUMPREG(DSI_VC_SHORT_PACKET_HEADER(2));
1749         DUMPREG(DSI_VC_IRQSTATUS(2));
1750         DUMPREG(DSI_VC_IRQENABLE(2));
1751
1752         DUMPREG(DSI_VC_CTRL(3));
1753         DUMPREG(DSI_VC_TE(3));
1754         DUMPREG(DSI_VC_LONG_PACKET_HEADER(3));
1755         DUMPREG(DSI_VC_LONG_PACKET_PAYLOAD(3));
1756         DUMPREG(DSI_VC_SHORT_PACKET_HEADER(3));
1757         DUMPREG(DSI_VC_IRQSTATUS(3));
1758         DUMPREG(DSI_VC_IRQENABLE(3));
1759
1760         DUMPREG(DSI_DSIPHY_CFG0);
1761         DUMPREG(DSI_DSIPHY_CFG1);
1762         DUMPREG(DSI_DSIPHY_CFG2);
1763         DUMPREG(DSI_DSIPHY_CFG5);
1764
1765         DUMPREG(DSI_PLL_CONTROL);
1766         DUMPREG(DSI_PLL_STATUS);
1767         DUMPREG(DSI_PLL_GO);
1768         DUMPREG(DSI_PLL_CONFIGURATION1);
1769         DUMPREG(DSI_PLL_CONFIGURATION2);
1770
1771         dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK);
1772 #undef DUMPREG
1773 }
1774
1775 enum dsi_cio_power_state {
1776         DSI_COMPLEXIO_POWER_OFF         = 0x0,
1777         DSI_COMPLEXIO_POWER_ON          = 0x1,
1778         DSI_COMPLEXIO_POWER_ULPS        = 0x2,
1779 };
1780
1781 static int dsi_cio_power(enum dsi_cio_power_state state)
1782 {
1783         int t = 0;
1784
1785         /* PWR_CMD */
1786         REG_FLD_MOD(DSI_COMPLEXIO_CFG1, state, 28, 27);
1787
1788         /* PWR_STATUS */
1789         while (FLD_GET(dsi_read_reg(DSI_COMPLEXIO_CFG1), 26, 25) != state) {
1790                 if (++t > 1000) {
1791                         DSSERR("failed to set complexio power state to "
1792                                         "%d\n", state);
1793                         return -ENODEV;
1794                 }
1795                 udelay(1);
1796         }
1797
1798         return 0;
1799 }
1800
1801 static void dsi_set_lane_config(struct omap_dss_device *dssdev)
1802 {
1803         u32 r;
1804
1805         int clk_lane   = dssdev->phy.dsi.clk_lane;
1806         int data1_lane = dssdev->phy.dsi.data1_lane;
1807         int data2_lane = dssdev->phy.dsi.data2_lane;
1808         int clk_pol    = dssdev->phy.dsi.clk_pol;
1809         int data1_pol  = dssdev->phy.dsi.data1_pol;
1810         int data2_pol  = dssdev->phy.dsi.data2_pol;
1811
1812         r = dsi_read_reg(DSI_COMPLEXIO_CFG1);
1813         r = FLD_MOD(r, clk_lane, 2, 0);
1814         r = FLD_MOD(r, clk_pol, 3, 3);
1815         r = FLD_MOD(r, data1_lane, 6, 4);
1816         r = FLD_MOD(r, data1_pol, 7, 7);
1817         r = FLD_MOD(r, data2_lane, 10, 8);
1818         r = FLD_MOD(r, data2_pol, 11, 11);
1819         dsi_write_reg(DSI_COMPLEXIO_CFG1, r);
1820
1821         /* The configuration of the DSI complex I/O (number of data lanes,
1822            position, differential order) should not be changed while
1823            DSS.DSI_CLK_CRTRL[20] LP_CLK_ENABLE bit is set to 1. In order for
1824            the hardware to take into account a new configuration of the complex
1825            I/O (done in DSS.DSI_COMPLEXIO_CFG1 register), it is recommended to
1826            follow this sequence: First set the DSS.DSI_CTRL[0] IF_EN bit to 1,
1827            then reset the DSS.DSI_CTRL[0] IF_EN to 0, then set
1828            DSS.DSI_CLK_CTRL[20] LP_CLK_ENABLE to 1 and finally set again the
1829            DSS.DSI_CTRL[0] IF_EN bit to 1. If the sequence is not followed, the
1830            DSI complex I/O configuration is unknown. */
1831
1832         /*
1833         REG_FLD_MOD(DSI_CTRL, 1, 0, 0);
1834         REG_FLD_MOD(DSI_CTRL, 0, 0, 0);
1835         REG_FLD_MOD(DSI_CLK_CTRL, 1, 20, 20);
1836         REG_FLD_MOD(DSI_CTRL, 1, 0, 0);
1837         */
1838 }
1839
1840 static inline unsigned ns2ddr(unsigned ns)
1841 {
1842         /* convert time in ns to ddr ticks, rounding up */
1843         unsigned long ddr_clk = dsi.current_cinfo.clkin4ddr / 4;
1844         return (ns * (ddr_clk / 1000 / 1000) + 999) / 1000;
1845 }
1846
1847 static inline unsigned ddr2ns(unsigned ddr)
1848 {
1849         unsigned long ddr_clk = dsi.current_cinfo.clkin4ddr / 4;
1850         return ddr * 1000 * 1000 / (ddr_clk / 1000);
1851 }
1852
1853 static void dsi_cio_timings(void)
1854 {
1855         u32 r;
1856         u32 ths_prepare, ths_prepare_ths_zero, ths_trail, ths_exit;
1857         u32 tlpx_half, tclk_trail, tclk_zero;
1858         u32 tclk_prepare;
1859
1860         /* calculate timings */
1861
1862         /* 1 * DDR_CLK = 2 * UI */
1863
1864         /* min 40ns + 4*UI      max 85ns + 6*UI */
1865         ths_prepare = ns2ddr(70) + 2;
1866
1867         /* min 145ns + 10*UI */
1868         ths_prepare_ths_zero = ns2ddr(175) + 2;
1869
1870         /* min max(8*UI, 60ns+4*UI) */
1871         ths_trail = ns2ddr(60) + 5;
1872
1873         /* min 100ns */
1874         ths_exit = ns2ddr(145);
1875
1876         /* tlpx min 50n */
1877         tlpx_half = ns2ddr(25);
1878
1879         /* min 60ns */
1880         tclk_trail = ns2ddr(60) + 2;
1881
1882         /* min 38ns, max 95ns */
1883         tclk_prepare = ns2ddr(65);
1884
1885         /* min tclk-prepare + tclk-zero = 300ns */
1886         tclk_zero = ns2ddr(260);
1887
1888         DSSDBG("ths_prepare %u (%uns), ths_prepare_ths_zero %u (%uns)\n",
1889                 ths_prepare, ddr2ns(ths_prepare),
1890                 ths_prepare_ths_zero, ddr2ns(ths_prepare_ths_zero));
1891         DSSDBG("ths_trail %u (%uns), ths_exit %u (%uns)\n",
1892                         ths_trail, ddr2ns(ths_trail),
1893                         ths_exit, ddr2ns(ths_exit));
1894
1895         DSSDBG("tlpx_half %u (%uns), tclk_trail %u (%uns), "
1896                         "tclk_zero %u (%uns)\n",
1897                         tlpx_half, ddr2ns(tlpx_half),
1898                         tclk_trail, ddr2ns(tclk_trail),
1899                         tclk_zero, ddr2ns(tclk_zero));
1900         DSSDBG("tclk_prepare %u (%uns)\n",
1901                         tclk_prepare, ddr2ns(tclk_prepare));
1902
1903         /* program timings */
1904
1905         r = dsi_read_reg(DSI_DSIPHY_CFG0);
1906         r = FLD_MOD(r, ths_prepare, 31, 24);
1907         r = FLD_MOD(r, ths_prepare_ths_zero, 23, 16);
1908         r = FLD_MOD(r, ths_trail, 15, 8);
1909         r = FLD_MOD(r, ths_exit, 7, 0);
1910         dsi_write_reg(DSI_DSIPHY_CFG0, r);
1911
1912         r = dsi_read_reg(DSI_DSIPHY_CFG1);
1913         r = FLD_MOD(r, tlpx_half, 22, 16);
1914         r = FLD_MOD(r, tclk_trail, 15, 8);
1915         r = FLD_MOD(r, tclk_zero, 7, 0);
1916         dsi_write_reg(DSI_DSIPHY_CFG1, r);
1917
1918         r = dsi_read_reg(DSI_DSIPHY_CFG2);
1919         r = FLD_MOD(r, tclk_prepare, 7, 0);
1920         dsi_write_reg(DSI_DSIPHY_CFG2, r);
1921 }
1922
1923 static void dsi_cio_enable_lane_override(struct omap_dss_device *dssdev,
1924                 enum dsi_lane lanes)
1925 {
1926         int clk_lane   = dssdev->phy.dsi.clk_lane;
1927         int data1_lane = dssdev->phy.dsi.data1_lane;
1928         int data2_lane = dssdev->phy.dsi.data2_lane;
1929         int clk_pol    = dssdev->phy.dsi.clk_pol;
1930         int data1_pol  = dssdev->phy.dsi.data1_pol;
1931         int data2_pol  = dssdev->phy.dsi.data2_pol;
1932
1933         u32 l = 0;
1934
1935         if (lanes & DSI_CLK_P)
1936                 l |= 1 << ((clk_lane - 1) * 2 + (clk_pol ? 0 : 1));
1937         if (lanes & DSI_CLK_N)
1938                 l |= 1 << ((clk_lane - 1) * 2 + (clk_pol ? 1 : 0));
1939
1940         if (lanes & DSI_DATA1_P)
1941                 l |= 1 << ((data1_lane - 1) * 2 + (data1_pol ? 0 : 1));
1942         if (lanes & DSI_DATA1_N)
1943                 l |= 1 << ((data1_lane - 1) * 2 + (data1_pol ? 1 : 0));
1944
1945         if (lanes & DSI_DATA2_P)
1946                 l |= 1 << ((data2_lane - 1) * 2 + (data2_pol ? 0 : 1));
1947         if (lanes & DSI_DATA2_N)
1948                 l |= 1 << ((data2_lane - 1) * 2 + (data2_pol ? 1 : 0));
1949
1950         /*
1951          * Bits in REGLPTXSCPDAT4TO0DXDY:
1952          * 17: DY0 18: DX0
1953          * 19: DY1 20: DX1
1954          * 21: DY2 22: DX2
1955          */
1956
1957         /* Set the lane override configuration */
1958         REG_FLD_MOD(DSI_DSIPHY_CFG10, l, 22, 17); /* REGLPTXSCPDAT4TO0DXDY */
1959
1960         /* Enable lane override */
1961         REG_FLD_MOD(DSI_DSIPHY_CFG10, 1, 27, 27); /* ENLPTXSCPDAT */
1962 }
1963
1964 static void dsi_cio_disable_lane_override(void)
1965 {
1966         /* Disable lane override */
1967         REG_FLD_MOD(DSI_DSIPHY_CFG10, 0, 27, 27); /* ENLPTXSCPDAT */
1968         /* Reset the lane override configuration */
1969         REG_FLD_MOD(DSI_DSIPHY_CFG10, 0, 22, 17); /* REGLPTXSCPDAT4TO0DXDY */
1970 }
1971
1972 static int dsi_cio_init(struct omap_dss_device *dssdev)
1973 {
1974         int r = 0;
1975         u32 l;
1976
1977         DSSDBGF();
1978
1979         if (dsi.ulps_enabled)
1980                 DSSDBG("manual ulps exit\n");
1981
1982         /* A dummy read using the SCP interface to any DSIPHY register is
1983          * required after DSIPHY reset to complete the reset of the DSI complex
1984          * I/O. */
1985         dsi_read_reg(DSI_DSIPHY_CFG5);
1986
1987         if (wait_for_bit_change(DSI_DSIPHY_CFG5, 30, 1) != 1) {
1988                 DSSERR("ComplexIO PHY not coming out of reset.\n");
1989                 r = -ENODEV;
1990                 goto err;
1991         }
1992
1993         dsi_set_lane_config(dssdev);
1994
1995         dsi_if_enable(true);
1996         dsi_if_enable(false);
1997         REG_FLD_MOD(DSI_CLK_CTRL, 1, 20, 20); /* LP_CLK_ENABLE */
1998
1999         /* set TX STOP MODE timer to maximum for this operation */
2000         l = dsi_read_reg(DSI_TIMING1);
2001         l = FLD_MOD(l, 1, 15, 15);      /* FORCE_TX_STOP_MODE_IO */
2002         l = FLD_MOD(l, 1, 14, 14);      /* STOP_STATE_X16_IO */
2003         l = FLD_MOD(l, 1, 13, 13);      /* STOP_STATE_X4_IO */
2004         l = FLD_MOD(l, 0x1fff, 12, 0);  /* STOP_STATE_COUNTER_IO */
2005         dsi_write_reg(DSI_TIMING1, l);
2006
2007         if (dsi.ulps_enabled) {
2008                 /* ULPS is exited by Mark-1 state for 1ms, followed by
2009                  * stop state. DSS HW cannot do this via the normal
2010                  * ULPS exit sequence, as after reset the DSS HW thinks
2011                  * that we are not in ULPS mode, and refuses to send the
2012                  * sequence. So we need to send the ULPS exit sequence
2013                  * manually.
2014                  */
2015
2016                 dsi_cio_enable_lane_override(dssdev,
2017                                 DSI_CLK_P | DSI_DATA1_P | DSI_DATA2_P);
2018         }
2019
2020         r = dsi_cio_power(DSI_COMPLEXIO_POWER_ON);
2021         if (r)
2022                 goto err;
2023
2024         if (dsi.ulps_enabled) {
2025                 /* Keep Mark-1 state for 1ms (as per DSI spec) */
2026                 ktime_t wait = ns_to_ktime(1000 * 1000);
2027                 set_current_state(TASK_UNINTERRUPTIBLE);
2028                 schedule_hrtimeout(&wait, HRTIMER_MODE_REL);
2029
2030                 /* Disable the override. The lanes should be set to Mark-11
2031                  * state by the HW */
2032                 dsi_cio_disable_lane_override();
2033         }
2034
2035         /* FORCE_TX_STOP_MODE_IO */
2036         REG_FLD_MOD(DSI_TIMING1, 0, 15, 15);
2037
2038         if (wait_for_bit_change(DSI_COMPLEXIO_CFG1, 29, 1) != 1) {
2039                 DSSERR("ComplexIO not coming out of reset.\n");
2040                 r = -ENODEV;
2041                 goto err;
2042         }
2043
2044         dsi_cio_timings();
2045
2046         dsi.ulps_enabled = false;
2047
2048         DSSDBG("CIO init done\n");
2049 err:
2050         return r;
2051 }
2052
2053 static void dsi_cio_uninit(void)
2054 {
2055         dsi_cio_power(DSI_COMPLEXIO_POWER_OFF);
2056 }
2057
2058 static int _dsi_wait_reset(void)
2059 {
2060         int t = 0;
2061
2062         while (REG_GET(DSI_SYSSTATUS, 0, 0) == 0) {
2063                 if (++t > 5) {
2064                         DSSERR("soft reset failed\n");
2065                         return -ENODEV;
2066                 }
2067                 udelay(1);
2068         }
2069
2070         return 0;
2071 }
2072
2073 static int _dsi_reset(void)
2074 {
2075         /* Soft reset */
2076         REG_FLD_MOD(DSI_SYSCONFIG, 1, 1, 1);
2077         return _dsi_wait_reset();
2078 }
2079
2080 static void dsi_config_tx_fifo(enum fifo_size size1, enum fifo_size size2,
2081                 enum fifo_size size3, enum fifo_size size4)
2082 {
2083         u32 r = 0;
2084         int add = 0;
2085         int i;
2086
2087         dsi.vc[0].fifo_size = size1;
2088         dsi.vc[1].fifo_size = size2;
2089         dsi.vc[2].fifo_size = size3;
2090         dsi.vc[3].fifo_size = size4;
2091
2092         for (i = 0; i < 4; i++) {
2093                 u8 v;
2094                 int size = dsi.vc[i].fifo_size;
2095
2096                 if (add + size > 4) {
2097                         DSSERR("Illegal FIFO configuration\n");
2098                         BUG();
2099                 }
2100
2101                 v = FLD_VAL(add, 2, 0) | FLD_VAL(size, 7, 4);
2102                 r |= v << (8 * i);
2103                 /*DSSDBG("TX FIFO vc %d: size %d, add %d\n", i, size, add); */
2104                 add += size;
2105         }
2106
2107         dsi_write_reg(DSI_TX_FIFO_VC_SIZE, r);
2108 }
2109
2110 static void dsi_config_rx_fifo(enum fifo_size size1, enum fifo_size size2,
2111                 enum fifo_size size3, enum fifo_size size4)
2112 {
2113         u32 r = 0;
2114         int add = 0;
2115         int i;
2116
2117         dsi.vc[0].fifo_size = size1;
2118         dsi.vc[1].fifo_size = size2;
2119         dsi.vc[2].fifo_size = size3;
2120         dsi.vc[3].fifo_size = size4;
2121
2122         for (i = 0; i < 4; i++) {
2123                 u8 v;
2124                 int size = dsi.vc[i].fifo_size;
2125
2126                 if (add + size > 4) {
2127                         DSSERR("Illegal FIFO configuration\n");
2128                         BUG();
2129                 }
2130
2131                 v = FLD_VAL(add, 2, 0) | FLD_VAL(size, 7, 4);
2132                 r |= v << (8 * i);
2133                 /*DSSDBG("RX FIFO vc %d: size %d, add %d\n", i, size, add); */
2134                 add += size;
2135         }
2136
2137         dsi_write_reg(DSI_RX_FIFO_VC_SIZE, r);
2138 }
2139
2140 static int dsi_force_tx_stop_mode_io(void)
2141 {
2142         u32 r;
2143
2144         r = dsi_read_reg(DSI_TIMING1);
2145         r = FLD_MOD(r, 1, 15, 15);      /* FORCE_TX_STOP_MODE_IO */
2146         dsi_write_reg(DSI_TIMING1, r);
2147
2148         if (wait_for_bit_change(DSI_TIMING1, 15, 0) != 0) {
2149                 DSSERR("TX_STOP bit not going down\n");
2150                 return -EIO;
2151         }
2152
2153         return 0;
2154 }
2155
2156 static bool dsi_vc_is_enabled(int channel)
2157 {
2158         return REG_GET(DSI_VC_CTRL(channel), 0, 0);
2159 }
2160
2161 static void dsi_packet_sent_handler_vp(void *data, u32 mask)
2162 {
2163         const int channel = dsi.update_channel;
2164         u8 bit = dsi.te_enabled ? 30 : 31;
2165
2166         if (REG_GET(DSI_VC_TE(channel), bit, bit) == 0)
2167                 complete((struct completion *)data);
2168 }
2169
2170 static int dsi_sync_vc_vp(int channel)
2171 {
2172         int r = 0;
2173         u8 bit;
2174
2175         DECLARE_COMPLETION_ONSTACK(completion);
2176
2177         bit = dsi.te_enabled ? 30 : 31;
2178
2179         r = dsi_register_isr_vc(channel, dsi_packet_sent_handler_vp,
2180                 &completion, DSI_VC_IRQ_PACKET_SENT);
2181         if (r)
2182                 goto err0;
2183
2184         /* Wait for completion only if TE_EN/TE_START is still set */
2185         if (REG_GET(DSI_VC_TE(channel), bit, bit)) {
2186                 if (wait_for_completion_timeout(&completion,
2187                                 msecs_to_jiffies(10)) == 0) {
2188                         DSSERR("Failed to complete previous frame transfer\n");
2189                         r = -EIO;
2190                         goto err1;
2191                 }
2192         }
2193
2194         dsi_unregister_isr_vc(channel, dsi_packet_sent_handler_vp,
2195                 &completion, DSI_VC_IRQ_PACKET_SENT);
2196
2197         return 0;
2198 err1:
2199         dsi_unregister_isr_vc(channel, dsi_packet_sent_handler_vp, &completion,
2200                 DSI_VC_IRQ_PACKET_SENT);
2201 err0:
2202         return r;
2203 }
2204
2205 static void dsi_packet_sent_handler_l4(void *data, u32 mask)
2206 {
2207         const int channel = dsi.update_channel;
2208
2209         if (REG_GET(DSI_VC_CTRL(channel), 5, 5) == 0)
2210                 complete((struct completion *)data);
2211 }
2212
2213 static int dsi_sync_vc_l4(int channel)
2214 {
2215         int r = 0;
2216
2217         DECLARE_COMPLETION_ONSTACK(completion);
2218
2219         r = dsi_register_isr_vc(channel, dsi_packet_sent_handler_l4,
2220                 &completion, DSI_VC_IRQ_PACKET_SENT);
2221         if (r)
2222                 goto err0;
2223
2224         /* Wait for completion only if TX_FIFO_NOT_EMPTY is still set */
2225         if (REG_GET(DSI_VC_CTRL(channel), 5, 5)) {
2226                 if (wait_for_completion_timeout(&completion,
2227                                 msecs_to_jiffies(10)) == 0) {
2228                         DSSERR("Failed to complete previous l4 transfer\n");
2229                         r = -EIO;
2230                         goto err1;
2231                 }
2232         }
2233
2234         dsi_unregister_isr_vc(channel, dsi_packet_sent_handler_l4,
2235                 &completion, DSI_VC_IRQ_PACKET_SENT);
2236
2237         return 0;
2238 err1:
2239         dsi_unregister_isr_vc(channel, dsi_packet_sent_handler_l4,
2240                 &completion, DSI_VC_IRQ_PACKET_SENT);
2241 err0:
2242         return r;
2243 }
2244
2245 static int dsi_sync_vc(int channel)
2246 {
2247         WARN_ON(!dsi_bus_is_locked());
2248
2249         WARN_ON(in_interrupt());
2250
2251         if (!dsi_vc_is_enabled(channel))
2252                 return 0;
2253
2254         switch (dsi.vc[channel].mode) {
2255         case DSI_VC_MODE_VP:
2256                 return dsi_sync_vc_vp(channel);
2257         case DSI_VC_MODE_L4:
2258                 return dsi_sync_vc_l4(channel);
2259         default:
2260                 BUG();
2261         }
2262 }
2263
2264 static int dsi_vc_enable(int channel, bool enable)
2265 {
2266         DSSDBG("dsi_vc_enable channel %d, enable %d\n",
2267                         channel, enable);
2268
2269         enable = enable ? 1 : 0;
2270
2271         REG_FLD_MOD(DSI_VC_CTRL(channel), enable, 0, 0);
2272
2273         if (wait_for_bit_change(DSI_VC_CTRL(channel), 0, enable) != enable) {
2274                         DSSERR("Failed to set dsi_vc_enable to %d\n", enable);
2275                         return -EIO;
2276         }
2277
2278         return 0;
2279 }
2280
2281 static void dsi_vc_initial_config(int channel)
2282 {
2283         u32 r;
2284
2285         DSSDBGF("%d", channel);
2286
2287         r = dsi_read_reg(DSI_VC_CTRL(channel));
2288
2289         if (FLD_GET(r, 15, 15)) /* VC_BUSY */
2290                 DSSERR("VC(%d) busy when trying to configure it!\n",
2291                                 channel);
2292
2293         r = FLD_MOD(r, 0, 1, 1); /* SOURCE, 0 = L4 */
2294         r = FLD_MOD(r, 0, 2, 2); /* BTA_SHORT_EN  */
2295         r = FLD_MOD(r, 0, 3, 3); /* BTA_LONG_EN */
2296         r = FLD_MOD(r, 0, 4, 4); /* MODE, 0 = command */
2297         r = FLD_MOD(r, 1, 7, 7); /* CS_TX_EN */
2298         r = FLD_MOD(r, 1, 8, 8); /* ECC_TX_EN */
2299         r = FLD_MOD(r, 0, 9, 9); /* MODE_SPEED, high speed on/off */
2300         if (dss_has_feature(FEAT_DSI_VC_OCP_WIDTH))
2301                 r = FLD_MOD(r, 3, 11, 10);      /* OCP_WIDTH = 32 bit */
2302
2303         r = FLD_MOD(r, 4, 29, 27); /* DMA_RX_REQ_NB = no dma */
2304         r = FLD_MOD(r, 4, 23, 21); /* DMA_TX_REQ_NB = no dma */
2305
2306         dsi_write_reg(DSI_VC_CTRL(channel), r);
2307 }
2308
2309 static int dsi_vc_config_l4(int channel)
2310 {
2311         if (dsi.vc[channel].mode == DSI_VC_MODE_L4)
2312                 return 0;
2313
2314         DSSDBGF("%d", channel);
2315
2316         dsi_sync_vc(channel);
2317
2318         dsi_vc_enable(channel, 0);
2319
2320         /* VC_BUSY */
2321         if (wait_for_bit_change(DSI_VC_CTRL(channel), 15, 0) != 0) {
2322                 DSSERR("vc(%d) busy when trying to config for L4\n", channel);
2323                 return -EIO;
2324         }
2325
2326         REG_FLD_MOD(DSI_VC_CTRL(channel), 0, 1, 1); /* SOURCE, 0 = L4 */
2327
2328         /* DCS_CMD_ENABLE */
2329         if (dss_has_feature(FEAT_DSI_DCS_CMD_CONFIG_VC))
2330                 REG_FLD_MOD(DSI_VC_CTRL(channel), 0, 30, 30);
2331
2332         dsi_vc_enable(channel, 1);
2333
2334         dsi.vc[channel].mode = DSI_VC_MODE_L4;
2335
2336         return 0;
2337 }
2338
2339 static int dsi_vc_config_vp(int channel)
2340 {
2341         if (dsi.vc[channel].mode == DSI_VC_MODE_VP)
2342                 return 0;
2343
2344         DSSDBGF("%d", channel);
2345
2346         dsi_sync_vc(channel);
2347
2348         dsi_vc_enable(channel, 0);
2349
2350         /* VC_BUSY */
2351         if (wait_for_bit_change(DSI_VC_CTRL(channel), 15, 0) != 0) {
2352                 DSSERR("vc(%d) busy when trying to config for VP\n", channel);
2353                 return -EIO;
2354         }
2355
2356         REG_FLD_MOD(DSI_VC_CTRL(channel), 1, 1, 1); /* SOURCE, 1 = video port */
2357
2358         /* DCS_CMD_ENABLE */
2359         if (dss_has_feature(FEAT_DSI_DCS_CMD_CONFIG_VC))
2360                 REG_FLD_MOD(DSI_VC_CTRL(channel), 1, 30, 30);
2361
2362         dsi_vc_enable(channel, 1);
2363
2364         dsi.vc[channel].mode = DSI_VC_MODE_VP;
2365
2366         return 0;
2367 }
2368
2369
2370 void omapdss_dsi_vc_enable_hs(int channel, bool enable)
2371 {
2372         DSSDBG("dsi_vc_enable_hs(%d, %d)\n", channel, enable);
2373
2374         WARN_ON(!dsi_bus_is_locked());
2375
2376         dsi_vc_enable(channel, 0);
2377         dsi_if_enable(0);
2378
2379         REG_FLD_MOD(DSI_VC_CTRL(channel), enable, 9, 9);
2380
2381         dsi_vc_enable(channel, 1);
2382         dsi_if_enable(1);
2383
2384         dsi_force_tx_stop_mode_io();
2385 }
2386 EXPORT_SYMBOL(omapdss_dsi_vc_enable_hs);
2387
2388 static void dsi_vc_flush_long_data(int channel)
2389 {
2390         while (REG_GET(DSI_VC_CTRL(channel), 20, 20)) {
2391                 u32 val;
2392                 val = dsi_read_reg(DSI_VC_SHORT_PACKET_HEADER(channel));
2393                 DSSDBG("\t\tb1 %#02x b2 %#02x b3 %#02x b4 %#02x\n",
2394                                 (val >> 0) & 0xff,
2395                                 (val >> 8) & 0xff,
2396                                 (val >> 16) & 0xff,
2397                                 (val >> 24) & 0xff);
2398         }
2399 }
2400
2401 static void dsi_show_rx_ack_with_err(u16 err)
2402 {
2403         DSSERR("\tACK with ERROR (%#x):\n", err);
2404         if (err & (1 << 0))
2405                 DSSERR("\t\tSoT Error\n");
2406         if (err & (1 << 1))
2407                 DSSERR("\t\tSoT Sync Error\n");
2408         if (err & (1 << 2))
2409                 DSSERR("\t\tEoT Sync Error\n");
2410         if (err & (1 << 3))
2411                 DSSERR("\t\tEscape Mode Entry Command Error\n");
2412         if (err & (1 << 4))
2413                 DSSERR("\t\tLP Transmit Sync Error\n");
2414         if (err & (1 << 5))
2415                 DSSERR("\t\tHS Receive Timeout Error\n");
2416         if (err & (1 << 6))
2417                 DSSERR("\t\tFalse Control Error\n");
2418         if (err & (1 << 7))
2419                 DSSERR("\t\t(reserved7)\n");
2420         if (err & (1 << 8))
2421                 DSSERR("\t\tECC Error, single-bit (corrected)\n");
2422         if (err & (1 << 9))
2423                 DSSERR("\t\tECC Error, multi-bit (not corrected)\n");
2424         if (err & (1 << 10))
2425                 DSSERR("\t\tChecksum Error\n");
2426         if (err & (1 << 11))
2427                 DSSERR("\t\tData type not recognized\n");
2428         if (err & (1 << 12))
2429                 DSSERR("\t\tInvalid VC ID\n");
2430         if (err & (1 << 13))
2431                 DSSERR("\t\tInvalid Transmission Length\n");
2432         if (err & (1 << 14))
2433                 DSSERR("\t\t(reserved14)\n");
2434         if (err & (1 << 15))
2435                 DSSERR("\t\tDSI Protocol Violation\n");
2436 }
2437
2438 static u16 dsi_vc_flush_receive_data(int channel)
2439 {
2440         /* RX_FIFO_NOT_EMPTY */
2441         while (REG_GET(DSI_VC_CTRL(channel), 20, 20)) {
2442                 u32 val;
2443                 u8 dt;
2444                 val = dsi_read_reg(DSI_VC_SHORT_PACKET_HEADER(channel));
2445                 DSSERR("\trawval %#08x\n", val);
2446                 dt = FLD_GET(val, 5, 0);
2447                 if (dt == DSI_DT_RX_ACK_WITH_ERR) {
2448                         u16 err = FLD_GET(val, 23, 8);
2449                         dsi_show_rx_ack_with_err(err);
2450                 } else if (dt == DSI_DT_RX_SHORT_READ_1) {
2451                         DSSERR("\tDCS short response, 1 byte: %#x\n",
2452                                         FLD_GET(val, 23, 8));
2453                 } else if (dt == DSI_DT_RX_SHORT_READ_2) {
2454                         DSSERR("\tDCS short response, 2 byte: %#x\n",
2455                                         FLD_GET(val, 23, 8));
2456                 } else if (dt == DSI_DT_RX_DCS_LONG_READ) {
2457                         DSSERR("\tDCS long response, len %d\n",
2458                                         FLD_GET(val, 23, 8));
2459                         dsi_vc_flush_long_data(channel);
2460                 } else {
2461                         DSSERR("\tunknown datatype 0x%02x\n", dt);
2462                 }
2463         }
2464         return 0;
2465 }
2466
2467 static int dsi_vc_send_bta(int channel)
2468 {
2469         if (dsi.debug_write || dsi.debug_read)
2470                 DSSDBG("dsi_vc_send_bta %d\n", channel);
2471
2472         WARN_ON(!dsi_bus_is_locked());
2473
2474         if (REG_GET(DSI_VC_CTRL(channel), 20, 20)) {    /* RX_FIFO_NOT_EMPTY */
2475                 DSSERR("rx fifo not empty when sending BTA, dumping data:\n");
2476                 dsi_vc_flush_receive_data(channel);
2477         }
2478
2479         REG_FLD_MOD(DSI_VC_CTRL(channel), 1, 6, 6); /* BTA_EN */
2480
2481         return 0;
2482 }
2483
2484 int dsi_vc_send_bta_sync(int channel)
2485 {
2486         DECLARE_COMPLETION_ONSTACK(completion);
2487         int r = 0;
2488         u32 err;
2489
2490         r = dsi_register_isr_vc(channel, dsi_completion_handler,
2491                         &completion, DSI_VC_IRQ_BTA);
2492         if (r)
2493                 goto err0;
2494
2495         r = dsi_register_isr(dsi_completion_handler, &completion,
2496                         DSI_IRQ_ERROR_MASK);
2497         if (r)
2498                 goto err1;
2499
2500         r = dsi_vc_send_bta(channel);
2501         if (r)
2502                 goto err2;
2503
2504         if (wait_for_completion_timeout(&completion,
2505                                 msecs_to_jiffies(500)) == 0) {
2506                 DSSERR("Failed to receive BTA\n");
2507                 r = -EIO;
2508                 goto err2;
2509         }
2510
2511         err = dsi_get_errors();
2512         if (err) {
2513                 DSSERR("Error while sending BTA: %x\n", err);
2514                 r = -EIO;
2515                 goto err2;
2516         }
2517 err2:
2518         dsi_unregister_isr(dsi_completion_handler, &completion,
2519                         DSI_IRQ_ERROR_MASK);
2520 err1:
2521         dsi_unregister_isr_vc(channel, dsi_completion_handler,
2522                         &completion, DSI_VC_IRQ_BTA);
2523 err0:
2524         return r;
2525 }
2526 EXPORT_SYMBOL(dsi_vc_send_bta_sync);
2527
2528 static inline void dsi_vc_write_long_header(int channel, u8 data_type,
2529                 u16 len, u8 ecc)
2530 {
2531         u32 val;
2532         u8 data_id;
2533
2534         WARN_ON(!dsi_bus_is_locked());
2535
2536         data_id = data_type | dsi.vc[channel].vc_id << 6;
2537
2538         val = FLD_VAL(data_id, 7, 0) | FLD_VAL(len, 23, 8) |
2539                 FLD_VAL(ecc, 31, 24);
2540
2541         dsi_write_reg(DSI_VC_LONG_PACKET_HEADER(channel), val);
2542 }
2543
2544 static inline void dsi_vc_write_long_payload(int channel,
2545                 u8 b1, u8 b2, u8 b3, u8 b4)
2546 {
2547         u32 val;
2548
2549         val = b4 << 24 | b3 << 16 | b2 << 8  | b1 << 0;
2550
2551 /*      DSSDBG("\twriting %02x, %02x, %02x, %02x (%#010x)\n",
2552                         b1, b2, b3, b4, val); */
2553
2554         dsi_write_reg(DSI_VC_LONG_PACKET_PAYLOAD(channel), val);
2555 }
2556
2557 static int dsi_vc_send_long(int channel, u8 data_type, u8 *data, u16 len,
2558                 u8 ecc)
2559 {
2560         /*u32 val; */
2561         int i;
2562         u8 *p;
2563         int r = 0;
2564         u8 b1, b2, b3, b4;
2565
2566         if (dsi.debug_write)
2567                 DSSDBG("dsi_vc_send_long, %d bytes\n", len);
2568
2569         /* len + header */
2570         if (dsi.vc[channel].fifo_size * 32 * 4 < len + 4) {
2571                 DSSERR("unable to send long packet: packet too long.\n");
2572                 return -EINVAL;
2573         }
2574
2575         dsi_vc_config_l4(channel);
2576
2577         dsi_vc_write_long_header(channel, data_type, len, ecc);
2578
2579         p = data;
2580         for (i = 0; i < len >> 2; i++) {
2581                 if (dsi.debug_write)
2582                         DSSDBG("\tsending full packet %d\n", i);
2583
2584                 b1 = *p++;
2585                 b2 = *p++;
2586                 b3 = *p++;
2587                 b4 = *p++;
2588
2589                 dsi_vc_write_long_payload(channel, b1, b2, b3, b4);
2590         }
2591
2592         i = len % 4;
2593         if (i) {
2594                 b1 = 0; b2 = 0; b3 = 0;
2595
2596                 if (dsi.debug_write)
2597                         DSSDBG("\tsending remainder bytes %d\n", i);
2598
2599                 switch (i) {
2600                 case 3:
2601                         b1 = *p++;
2602                         b2 = *p++;
2603                         b3 = *p++;
2604                         break;
2605                 case 2:
2606                         b1 = *p++;
2607                         b2 = *p++;
2608                         break;
2609                 case 1:
2610                         b1 = *p++;
2611                         break;
2612                 }
2613
2614                 dsi_vc_write_long_payload(channel, b1, b2, b3, 0);
2615         }
2616
2617         return r;
2618 }
2619
2620 static int dsi_vc_send_short(int channel, u8 data_type, u16 data, u8 ecc)
2621 {
2622         u32 r;
2623         u8 data_id;
2624
2625         WARN_ON(!dsi_bus_is_locked());
2626
2627         if (dsi.debug_write)
2628                 DSSDBG("dsi_vc_send_short(ch%d, dt %#x, b1 %#x, b2 %#x)\n",
2629                                 channel,
2630                                 data_type, data & 0xff, (data >> 8) & 0xff);
2631
2632         dsi_vc_config_l4(channel);
2633
2634         if (FLD_GET(dsi_read_reg(DSI_VC_CTRL(channel)), 16, 16)) {
2635                 DSSERR("ERROR FIFO FULL, aborting transfer\n");
2636                 return -EINVAL;
2637         }
2638
2639         data_id = data_type | dsi.vc[channel].vc_id << 6;
2640
2641         r = (data_id << 0) | (data << 8) | (ecc << 24);
2642
2643         dsi_write_reg(DSI_VC_SHORT_PACKET_HEADER(channel), r);
2644
2645         return 0;
2646 }
2647
2648 int dsi_vc_send_null(int channel)
2649 {
2650         u8 nullpkg[] = {0, 0, 0, 0};
2651         return dsi_vc_send_long(channel, DSI_DT_NULL_PACKET, nullpkg, 4, 0);
2652 }
2653 EXPORT_SYMBOL(dsi_vc_send_null);
2654
2655 int dsi_vc_dcs_write_nosync(int channel, u8 *data, int len)
2656 {
2657         int r;
2658
2659         BUG_ON(len == 0);
2660
2661         if (len == 1) {
2662                 r = dsi_vc_send_short(channel, DSI_DT_DCS_SHORT_WRITE_0,
2663                                 data[0], 0);
2664         } else if (len == 2) {
2665                 r = dsi_vc_send_short(channel, DSI_DT_DCS_SHORT_WRITE_1,
2666                                 data[0] | (data[1] << 8), 0);
2667         } else {
2668                 /* 0x39 = DCS Long Write */
2669                 r = dsi_vc_send_long(channel, DSI_DT_DCS_LONG_WRITE,
2670                                 data, len, 0);
2671         }
2672
2673         return r;
2674 }
2675 EXPORT_SYMBOL(dsi_vc_dcs_write_nosync);
2676
2677 int dsi_vc_dcs_write(int channel, u8 *data, int len)
2678 {
2679         int r;
2680
2681         r = dsi_vc_dcs_write_nosync(channel, data, len);
2682         if (r)
2683                 goto err;
2684
2685         r = dsi_vc_send_bta_sync(channel);
2686         if (r)
2687                 goto err;
2688
2689         if (REG_GET(DSI_VC_CTRL(channel), 20, 20)) {    /* RX_FIFO_NOT_EMPTY */
2690                 DSSERR("rx fifo not empty after write, dumping data:\n");
2691                 dsi_vc_flush_receive_data(channel);
2692                 r = -EIO;
2693                 goto err;
2694         }
2695
2696         return 0;
2697 err:
2698         DSSERR("dsi_vc_dcs_write(ch %d, cmd 0x%02x, len %d) failed\n",
2699                         channel, data[0], len);
2700         return r;
2701 }
2702 EXPORT_SYMBOL(dsi_vc_dcs_write);
2703
2704 int dsi_vc_dcs_write_0(int channel, u8 dcs_cmd)
2705 {
2706         return dsi_vc_dcs_write(channel, &dcs_cmd, 1);
2707 }
2708 EXPORT_SYMBOL(dsi_vc_dcs_write_0);
2709
2710 int dsi_vc_dcs_write_1(int channel, u8 dcs_cmd, u8 param)
2711 {
2712         u8 buf[2];
2713         buf[0] = dcs_cmd;
2714         buf[1] = param;
2715         return dsi_vc_dcs_write(channel, buf, 2);
2716 }
2717 EXPORT_SYMBOL(dsi_vc_dcs_write_1);
2718
2719 int dsi_vc_dcs_read(int channel, u8 dcs_cmd, u8 *buf, int buflen)
2720 {
2721         u32 val;
2722         u8 dt;
2723         int r;
2724
2725         if (dsi.debug_read)
2726                 DSSDBG("dsi_vc_dcs_read(ch%d, dcs_cmd %x)\n", channel, dcs_cmd);
2727
2728         r = dsi_vc_send_short(channel, DSI_DT_DCS_READ, dcs_cmd, 0);
2729         if (r)
2730                 goto err;
2731
2732         r = dsi_vc_send_bta_sync(channel);
2733         if (r)
2734                 goto err;
2735
2736         /* RX_FIFO_NOT_EMPTY */
2737         if (REG_GET(DSI_VC_CTRL(channel), 20, 20) == 0) {
2738                 DSSERR("RX fifo empty when trying to read.\n");
2739                 r = -EIO;
2740                 goto err;
2741         }
2742
2743         val = dsi_read_reg(DSI_VC_SHORT_PACKET_HEADER(channel));
2744         if (dsi.debug_read)
2745                 DSSDBG("\theader: %08x\n", val);
2746         dt = FLD_GET(val, 5, 0);
2747         if (dt == DSI_DT_RX_ACK_WITH_ERR) {
2748                 u16 err = FLD_GET(val, 23, 8);
2749                 dsi_show_rx_ack_with_err(err);
2750                 r = -EIO;
2751                 goto err;
2752
2753         } else if (dt == DSI_DT_RX_SHORT_READ_1) {
2754                 u8 data = FLD_GET(val, 15, 8);
2755                 if (dsi.debug_read)
2756                         DSSDBG("\tDCS short response, 1 byte: %02x\n", data);
2757
2758                 if (buflen < 1) {
2759                         r = -EIO;
2760                         goto err;
2761                 }
2762
2763                 buf[0] = data;
2764
2765                 return 1;
2766         } else if (dt == DSI_DT_RX_SHORT_READ_2) {
2767                 u16 data = FLD_GET(val, 23, 8);
2768                 if (dsi.debug_read)
2769                         DSSDBG("\tDCS short response, 2 byte: %04x\n", data);
2770
2771                 if (buflen < 2) {
2772                         r = -EIO;
2773                         goto err;
2774                 }
2775
2776                 buf[0] = data & 0xff;
2777                 buf[1] = (data >> 8) & 0xff;
2778
2779                 return 2;
2780         } else if (dt == DSI_DT_RX_DCS_LONG_READ) {
2781                 int w;
2782                 int len = FLD_GET(val, 23, 8);
2783                 if (dsi.debug_read)
2784                         DSSDBG("\tDCS long response, len %d\n", len);
2785
2786                 if (len > buflen) {
2787                         r = -EIO;
2788                         goto err;
2789                 }
2790
2791                 /* two byte checksum ends the packet, not included in len */
2792                 for (w = 0; w < len + 2;) {
2793                         int b;
2794                         val = dsi_read_reg(DSI_VC_SHORT_PACKET_HEADER(channel));
2795                         if (dsi.debug_read)
2796                                 DSSDBG("\t\t%02x %02x %02x %02x\n",
2797                                                 (val >> 0) & 0xff,
2798                                                 (val >> 8) & 0xff,
2799                                                 (val >> 16) & 0xff,
2800                                                 (val >> 24) & 0xff);
2801
2802                         for (b = 0; b < 4; ++b) {
2803                                 if (w < len)
2804                                         buf[w] = (val >> (b * 8)) & 0xff;
2805                                 /* we discard the 2 byte checksum */
2806                                 ++w;
2807                         }
2808                 }
2809
2810                 return len;
2811         } else {
2812                 DSSERR("\tunknown datatype 0x%02x\n", dt);
2813                 r = -EIO;
2814                 goto err;
2815         }
2816
2817         BUG();
2818 err:
2819         DSSERR("dsi_vc_dcs_read(ch %d, cmd 0x%02x) failed\n",
2820                         channel, dcs_cmd);
2821         return r;
2822
2823 }
2824 EXPORT_SYMBOL(dsi_vc_dcs_read);
2825
2826 int dsi_vc_dcs_read_1(int channel, u8 dcs_cmd, u8 *data)
2827 {
2828         int r;
2829
2830         r = dsi_vc_dcs_read(channel, dcs_cmd, data, 1);
2831
2832         if (r < 0)
2833                 return r;
2834
2835         if (r != 1)
2836                 return -EIO;
2837
2838         return 0;
2839 }
2840 EXPORT_SYMBOL(dsi_vc_dcs_read_1);
2841
2842 int dsi_vc_dcs_read_2(int channel, u8 dcs_cmd, u8 *data1, u8 *data2)
2843 {
2844         u8 buf[2];
2845         int r;
2846
2847         r = dsi_vc_dcs_read(channel, dcs_cmd, buf, 2);
2848
2849         if (r < 0)
2850                 return r;
2851
2852         if (r != 2)
2853                 return -EIO;
2854
2855         *data1 = buf[0];
2856         *data2 = buf[1];
2857
2858         return 0;
2859 }
2860 EXPORT_SYMBOL(dsi_vc_dcs_read_2);
2861
2862 int dsi_vc_set_max_rx_packet_size(int channel, u16 len)
2863 {
2864         return dsi_vc_send_short(channel, DSI_DT_SET_MAX_RET_PKG_SIZE,
2865                         len, 0);
2866 }
2867 EXPORT_SYMBOL(dsi_vc_set_max_rx_packet_size);
2868
2869 static int dsi_enter_ulps(void)
2870 {
2871         DECLARE_COMPLETION_ONSTACK(completion);
2872         int r;
2873
2874         DSSDBGF();
2875
2876         WARN_ON(!dsi_bus_is_locked());
2877
2878         WARN_ON(dsi.ulps_enabled);
2879
2880         if (dsi.ulps_enabled)
2881                 return 0;
2882
2883         if (REG_GET(DSI_CLK_CTRL, 13, 13)) {
2884                 DSSERR("DDR_CLK_ALWAYS_ON enabled when entering ULPS\n");
2885                 return -EIO;
2886         }
2887
2888         dsi_sync_vc(0);
2889         dsi_sync_vc(1);
2890         dsi_sync_vc(2);
2891         dsi_sync_vc(3);
2892
2893         dsi_force_tx_stop_mode_io();
2894
2895         dsi_vc_enable(0, false);
2896         dsi_vc_enable(1, false);
2897         dsi_vc_enable(2, false);
2898         dsi_vc_enable(3, false);
2899
2900         if (REG_GET(DSI_COMPLEXIO_CFG2, 16, 16)) {      /* HS_BUSY */
2901                 DSSERR("HS busy when enabling ULPS\n");
2902                 return -EIO;
2903         }
2904
2905         if (REG_GET(DSI_COMPLEXIO_CFG2, 17, 17)) {      /* LP_BUSY */
2906                 DSSERR("LP busy when enabling ULPS\n");
2907                 return -EIO;
2908         }
2909
2910         r = dsi_register_isr_cio(dsi_completion_handler, &completion,
2911                         DSI_CIO_IRQ_ULPSACTIVENOT_ALL0);
2912         if (r)
2913                 return r;
2914
2915         /* Assert TxRequestEsc for data lanes and TxUlpsClk for clk lane */
2916         /* LANEx_ULPS_SIG2 */
2917         REG_FLD_MOD(DSI_COMPLEXIO_CFG2, (1 << 0) | (1 << 1) | (1 << 2), 7, 5);
2918
2919         if (wait_for_completion_timeout(&completion,
2920                                 msecs_to_jiffies(1000)) == 0) {
2921                 DSSERR("ULPS enable timeout\n");
2922                 r = -EIO;
2923                 goto err;
2924         }
2925
2926         dsi_unregister_isr_cio(dsi_completion_handler, &completion,
2927                         DSI_CIO_IRQ_ULPSACTIVENOT_ALL0);
2928
2929         dsi_cio_power(DSI_COMPLEXIO_POWER_ULPS);
2930
2931         dsi_if_enable(false);
2932
2933         dsi.ulps_enabled = true;
2934
2935         return 0;
2936
2937 err:
2938         dsi_unregister_isr_cio(dsi_completion_handler, &completion,
2939                         DSI_CIO_IRQ_ULPSACTIVENOT_ALL0);
2940         return r;
2941 }
2942
2943 static void dsi_set_lp_rx_timeout(unsigned ticks, bool x4, bool x16)
2944 {
2945         unsigned long fck;
2946         unsigned long total_ticks;
2947         u32 r;
2948
2949         BUG_ON(ticks > 0x1fff);
2950
2951         /* ticks in DSI_FCK */
2952         fck = dsi_fclk_rate();
2953
2954         r = dsi_read_reg(DSI_TIMING2);
2955         r = FLD_MOD(r, 1, 15, 15);      /* LP_RX_TO */
2956         r = FLD_MOD(r, x16 ? 1 : 0, 14, 14);    /* LP_RX_TO_X16 */
2957         r = FLD_MOD(r, x4 ? 1 : 0, 13, 13);     /* LP_RX_TO_X4 */
2958         r = FLD_MOD(r, ticks, 12, 0);   /* LP_RX_COUNTER */
2959         dsi_write_reg(DSI_TIMING2, r);
2960
2961         total_ticks = ticks * (x16 ? 16 : 1) * (x4 ? 4 : 1);
2962
2963         DSSDBG("LP_RX_TO %lu ticks (%#x%s%s) = %lu ns\n",
2964                         total_ticks,
2965                         ticks, x4 ? " x4" : "", x16 ? " x16" : "",
2966                         (total_ticks * 1000) / (fck / 1000 / 1000));
2967 }
2968
2969 static void dsi_set_ta_timeout(unsigned ticks, bool x8, bool x16)
2970 {
2971         unsigned long fck;
2972         unsigned long total_ticks;
2973         u32 r;
2974
2975         BUG_ON(ticks > 0x1fff);
2976
2977         /* ticks in DSI_FCK */
2978         fck = dsi_fclk_rate();
2979
2980         r = dsi_read_reg(DSI_TIMING1);
2981         r = FLD_MOD(r, 1, 31, 31);      /* TA_TO */
2982         r = FLD_MOD(r, x16 ? 1 : 0, 30, 30);    /* TA_TO_X16 */
2983         r = FLD_MOD(r, x8 ? 1 : 0, 29, 29);     /* TA_TO_X8 */
2984         r = FLD_MOD(r, ticks, 28, 16);  /* TA_TO_COUNTER */
2985         dsi_write_reg(DSI_TIMING1, r);
2986
2987         total_ticks = ticks * (x16 ? 16 : 1) * (x8 ? 8 : 1);
2988
2989         DSSDBG("TA_TO %lu ticks (%#x%s%s) = %lu ns\n",
2990                         total_ticks,
2991                         ticks, x8 ? " x8" : "", x16 ? " x16" : "",
2992                         (total_ticks * 1000) / (fck / 1000 / 1000));
2993 }
2994
2995 static void dsi_set_stop_state_counter(unsigned ticks, bool x4, bool x16)
2996 {
2997         unsigned long fck;
2998         unsigned long total_ticks;
2999         u32 r;
3000
3001         BUG_ON(ticks > 0x1fff);
3002
3003         /* ticks in DSI_FCK */
3004         fck = dsi_fclk_rate();
3005
3006         r = dsi_read_reg(DSI_TIMING1);
3007         r = FLD_MOD(r, 1, 15, 15);      /* FORCE_TX_STOP_MODE_IO */
3008         r = FLD_MOD(r, x16 ? 1 : 0, 14, 14);    /* STOP_STATE_X16_IO */
3009         r = FLD_MOD(r, x4 ? 1 : 0, 13, 13);     /* STOP_STATE_X4_IO */
3010         r = FLD_MOD(r, ticks, 12, 0);   /* STOP_STATE_COUNTER_IO */
3011         dsi_write_reg(DSI_TIMING1, r);
3012
3013         total_ticks = ticks * (x16 ? 16 : 1) * (x4 ? 4 : 1);
3014
3015         DSSDBG("STOP_STATE_COUNTER %lu ticks (%#x%s%s) = %lu ns\n",
3016                         total_ticks,
3017                         ticks, x4 ? " x4" : "", x16 ? " x16" : "",
3018                         (total_ticks * 1000) / (fck / 1000 / 1000));
3019 }
3020
3021 static void dsi_set_hs_tx_timeout(unsigned ticks, bool x4, bool x16)
3022 {
3023         unsigned long fck;
3024         unsigned long total_ticks;
3025         u32 r;
3026
3027         BUG_ON(ticks > 0x1fff);
3028
3029         /* ticks in TxByteClkHS */
3030         fck = dsi_get_txbyteclkhs();
3031
3032         r = dsi_read_reg(DSI_TIMING2);
3033         r = FLD_MOD(r, 1, 31, 31);      /* HS_TX_TO */
3034         r = FLD_MOD(r, x16 ? 1 : 0, 30, 30);    /* HS_TX_TO_X16 */
3035         r = FLD_MOD(r, x4 ? 1 : 0, 29, 29);     /* HS_TX_TO_X8 (4 really) */
3036         r = FLD_MOD(r, ticks, 28, 16);  /* HS_TX_TO_COUNTER */
3037         dsi_write_reg(DSI_TIMING2, r);
3038
3039         total_ticks = ticks * (x16 ? 16 : 1) * (x4 ? 4 : 1);
3040
3041         DSSDBG("HS_TX_TO %lu ticks (%#x%s%s) = %lu ns\n",
3042                         total_ticks,
3043                         ticks, x4 ? " x4" : "", x16 ? " x16" : "",
3044                         (total_ticks * 1000) / (fck / 1000 / 1000));
3045 }
3046 static int dsi_proto_config(struct omap_dss_device *dssdev)
3047 {
3048         u32 r;
3049         int buswidth = 0;
3050
3051         dsi_config_tx_fifo(DSI_FIFO_SIZE_32,
3052                         DSI_FIFO_SIZE_32,
3053                         DSI_FIFO_SIZE_32,
3054                         DSI_FIFO_SIZE_32);
3055
3056         dsi_config_rx_fifo(DSI_FIFO_SIZE_32,
3057                         DSI_FIFO_SIZE_32,
3058                         DSI_FIFO_SIZE_32,
3059                         DSI_FIFO_SIZE_32);
3060
3061         /* XXX what values for the timeouts? */
3062         dsi_set_stop_state_counter(0x1000, false, false);
3063         dsi_set_ta_timeout(0x1fff, true, true);
3064         dsi_set_lp_rx_timeout(0x1fff, true, true);
3065         dsi_set_hs_tx_timeout(0x1fff, true, true);
3066
3067         switch (dssdev->ctrl.pixel_size) {
3068         case 16:
3069                 buswidth = 0;
3070                 break;
3071         case 18:
3072                 buswidth = 1;
3073                 break;
3074         case 24:
3075                 buswidth = 2;
3076                 break;
3077         default:
3078                 BUG();
3079         }
3080
3081         r = dsi_read_reg(DSI_CTRL);
3082         r = FLD_MOD(r, 1, 1, 1);        /* CS_RX_EN */
3083         r = FLD_MOD(r, 1, 2, 2);        /* ECC_RX_EN */
3084         r = FLD_MOD(r, 1, 3, 3);        /* TX_FIFO_ARBITRATION */
3085         r = FLD_MOD(r, 1, 4, 4);        /* VP_CLK_RATIO, always 1, see errata*/
3086         r = FLD_MOD(r, buswidth, 7, 6); /* VP_DATA_BUS_WIDTH */
3087         r = FLD_MOD(r, 0, 8, 8);        /* VP_CLK_POL */
3088         r = FLD_MOD(r, 2, 13, 12);      /* LINE_BUFFER, 2 lines */
3089         r = FLD_MOD(r, 1, 14, 14);      /* TRIGGER_RESET_MODE */
3090         r = FLD_MOD(r, 1, 19, 19);      /* EOT_ENABLE */
3091         if (!dss_has_feature(FEAT_DSI_DCS_CMD_CONFIG_VC)) {
3092                 r = FLD_MOD(r, 1, 24, 24);      /* DCS_CMD_ENABLE */
3093                 /* DCS_CMD_CODE, 1=start, 0=continue */
3094                 r = FLD_MOD(r, 0, 25, 25);
3095         }
3096
3097         dsi_write_reg(DSI_CTRL, r);
3098
3099         dsi_vc_initial_config(0);
3100         dsi_vc_initial_config(1);
3101         dsi_vc_initial_config(2);
3102         dsi_vc_initial_config(3);
3103
3104         return 0;
3105 }
3106
3107 static void dsi_proto_timings(struct omap_dss_device *dssdev)
3108 {
3109         unsigned tlpx, tclk_zero, tclk_prepare, tclk_trail;
3110         unsigned tclk_pre, tclk_post;
3111         unsigned ths_prepare, ths_prepare_ths_zero, ths_zero;
3112         unsigned ths_trail, ths_exit;
3113         unsigned ddr_clk_pre, ddr_clk_post;
3114         unsigned enter_hs_mode_lat, exit_hs_mode_lat;
3115         unsigned ths_eot;
3116         u32 r;
3117
3118         r = dsi_read_reg(DSI_DSIPHY_CFG0);
3119         ths_prepare = FLD_GET(r, 31, 24);
3120         ths_prepare_ths_zero = FLD_GET(r, 23, 16);
3121         ths_zero = ths_prepare_ths_zero - ths_prepare;
3122         ths_trail = FLD_GET(r, 15, 8);
3123         ths_exit = FLD_GET(r, 7, 0);
3124
3125         r = dsi_read_reg(DSI_DSIPHY_CFG1);
3126         tlpx = FLD_GET(r, 22, 16) * 2;
3127         tclk_trail = FLD_GET(r, 15, 8);
3128         tclk_zero = FLD_GET(r, 7, 0);
3129
3130         r = dsi_read_reg(DSI_DSIPHY_CFG2);
3131         tclk_prepare = FLD_GET(r, 7, 0);
3132
3133         /* min 8*UI */
3134         tclk_pre = 20;
3135         /* min 60ns + 52*UI */
3136         tclk_post = ns2ddr(60) + 26;
3137
3138         /* ths_eot is 2 for 2 datalanes and 4 for 1 datalane */
3139         if (dssdev->phy.dsi.data1_lane != 0 &&
3140                         dssdev->phy.dsi.data2_lane != 0)
3141                 ths_eot = 2;
3142         else
3143                 ths_eot = 4;
3144
3145         ddr_clk_pre = DIV_ROUND_UP(tclk_pre + tlpx + tclk_zero + tclk_prepare,
3146                         4);
3147         ddr_clk_post = DIV_ROUND_UP(tclk_post + ths_trail, 4) + ths_eot;
3148
3149         BUG_ON(ddr_clk_pre == 0 || ddr_clk_pre > 255);
3150         BUG_ON(ddr_clk_post == 0 || ddr_clk_post > 255);
3151
3152         r = dsi_read_reg(DSI_CLK_TIMING);
3153         r = FLD_MOD(r, ddr_clk_pre, 15, 8);
3154         r = FLD_MOD(r, ddr_clk_post, 7, 0);
3155         dsi_write_reg(DSI_CLK_TIMING, r);
3156
3157         DSSDBG("ddr_clk_pre %u, ddr_clk_post %u\n",
3158                         ddr_clk_pre,
3159                         ddr_clk_post);
3160
3161         enter_hs_mode_lat = 1 + DIV_ROUND_UP(tlpx, 4) +
3162                 DIV_ROUND_UP(ths_prepare, 4) +
3163                 DIV_ROUND_UP(ths_zero + 3, 4);
3164
3165         exit_hs_mode_lat = DIV_ROUND_UP(ths_trail + ths_exit, 4) + 1 + ths_eot;
3166
3167         r = FLD_VAL(enter_hs_mode_lat, 31, 16) |
3168                 FLD_VAL(exit_hs_mode_lat, 15, 0);
3169         dsi_write_reg(DSI_VM_TIMING7, r);
3170
3171         DSSDBG("enter_hs_mode_lat %u, exit_hs_mode_lat %u\n",
3172                         enter_hs_mode_lat, exit_hs_mode_lat);
3173 }
3174
3175
3176 #define DSI_DECL_VARS \
3177         int __dsi_cb = 0; u32 __dsi_cv = 0;
3178
3179 #define DSI_FLUSH(ch) \
3180         if (__dsi_cb > 0) { \
3181                 /*DSSDBG("sending long packet %#010x\n", __dsi_cv);*/ \
3182                 dsi_write_reg(DSI_VC_LONG_PACKET_PAYLOAD(ch), __dsi_cv); \
3183                 __dsi_cb = __dsi_cv = 0; \
3184         }
3185
3186 #define DSI_PUSH(ch, data) \
3187         do { \
3188                 __dsi_cv |= (data) << (__dsi_cb * 8); \
3189                 /*DSSDBG("cv = %#010x, cb = %d\n", __dsi_cv, __dsi_cb);*/ \
3190                 if (++__dsi_cb > 3) \
3191                         DSI_FLUSH(ch); \
3192         } while (0)
3193
3194 static int dsi_update_screen_l4(struct omap_dss_device *dssdev,
3195                         int x, int y, int w, int h)
3196 {
3197         /* Note: supports only 24bit colors in 32bit container */
3198         int first = 1;
3199         int fifo_stalls = 0;
3200         int max_dsi_packet_size;
3201         int max_data_per_packet;
3202         int max_pixels_per_packet;
3203         int pixels_left;
3204         int bytespp = dssdev->ctrl.pixel_size / 8;
3205         int scr_width;
3206         u32 __iomem *data;
3207         int start_offset;
3208         int horiz_inc;
3209         int current_x;
3210         struct omap_overlay *ovl;
3211
3212         debug_irq = 0;
3213
3214         DSSDBG("dsi_update_screen_l4 (%d,%d %dx%d)\n",
3215                         x, y, w, h);
3216
3217         ovl = dssdev->manager->overlays[0];
3218
3219         if (ovl->info.color_mode != OMAP_DSS_COLOR_RGB24U)
3220                 return -EINVAL;
3221
3222         if (dssdev->ctrl.pixel_size != 24)
3223                 return -EINVAL;
3224
3225         scr_width = ovl->info.screen_width;
3226         data = ovl->info.vaddr;
3227
3228         start_offset = scr_width * y + x;
3229         horiz_inc = scr_width - w;
3230         current_x = x;
3231
3232         /* We need header(4) + DCSCMD(1) + pixels(numpix*bytespp) bytes
3233          * in fifo */
3234
3235         /* When using CPU, max long packet size is TX buffer size */
3236         max_dsi_packet_size = dsi.vc[0].fifo_size * 32 * 4;
3237
3238         /* we seem to get better perf if we divide the tx fifo to half,
3239            and while the other half is being sent, we fill the other half
3240            max_dsi_packet_size /= 2; */
3241
3242         max_data_per_packet = max_dsi_packet_size - 4 - 1;
3243
3244         max_pixels_per_packet = max_data_per_packet / bytespp;
3245
3246         DSSDBG("max_pixels_per_packet %d\n", max_pixels_per_packet);
3247
3248         pixels_left = w * h;
3249
3250         DSSDBG("total pixels %d\n", pixels_left);
3251
3252         data += start_offset;
3253
3254         while (pixels_left > 0) {
3255                 /* 0x2c = write_memory_start */
3256                 /* 0x3c = write_memory_continue */
3257                 u8 dcs_cmd = first ? 0x2c : 0x3c;
3258                 int pixels;
3259                 DSI_DECL_VARS;
3260                 first = 0;
3261
3262 #if 1
3263                 /* using fifo not empty */
3264                 /* TX_FIFO_NOT_EMPTY */
3265                 while (FLD_GET(dsi_read_reg(DSI_VC_CTRL(0)), 5, 5)) {
3266                         fifo_stalls++;
3267                         if (fifo_stalls > 0xfffff) {
3268                                 DSSERR("fifo stalls overflow, pixels left %d\n",
3269                                                 pixels_left);
3270                                 dsi_if_enable(0);
3271                                 return -EIO;
3272                         }
3273                         udelay(1);
3274                 }
3275 #elif 1
3276                 /* using fifo emptiness */
3277                 while ((REG_GET(DSI_TX_FIFO_VC_EMPTINESS, 7, 0)+1)*4 <
3278                                 max_dsi_packet_size) {
3279                         fifo_stalls++;
3280                         if (fifo_stalls > 0xfffff) {
3281                                 DSSERR("fifo stalls overflow, pixels left %d\n",
3282                                                pixels_left);
3283                                 dsi_if_enable(0);
3284                                 return -EIO;
3285                         }
3286                 }
3287 #else
3288                 while ((REG_GET(DSI_TX_FIFO_VC_EMPTINESS, 7, 0)+1)*4 == 0) {
3289                         fifo_stalls++;
3290                         if (fifo_stalls > 0xfffff) {
3291                                 DSSERR("fifo stalls overflow, pixels left %d\n",
3292                                                pixels_left);
3293                                 dsi_if_enable(0);
3294                                 return -EIO;
3295                         }
3296                 }
3297 #endif
3298                 pixels = min(max_pixels_per_packet, pixels_left);
3299
3300                 pixels_left -= pixels;
3301
3302                 dsi_vc_write_long_header(0, DSI_DT_DCS_LONG_WRITE,
3303                                 1 + pixels * bytespp, 0);
3304
3305                 DSI_PUSH(0, dcs_cmd);
3306
3307                 while (pixels-- > 0) {
3308                         u32 pix = __raw_readl(data++);
3309
3310                         DSI_PUSH(0, (pix >> 16) & 0xff);
3311                         DSI_PUSH(0, (pix >> 8) & 0xff);
3312                         DSI_PUSH(0, (pix >> 0) & 0xff);
3313
3314                         current_x++;
3315                         if (current_x == x+w) {
3316                                 current_x = x;
3317                                 data += horiz_inc;
3318                         }
3319                 }
3320
3321                 DSI_FLUSH(0);
3322         }
3323
3324         return 0;
3325 }
3326
3327 static void dsi_update_screen_dispc(struct omap_dss_device *dssdev,
3328                 u16 x, u16 y, u16 w, u16 h)
3329 {
3330         unsigned bytespp;
3331         unsigned bytespl;
3332         unsigned bytespf;
3333         unsigned total_len;
3334         unsigned packet_payload;
3335         unsigned packet_len;
3336         u32 l;
3337         int r;
3338         const unsigned channel = dsi.update_channel;
3339         /* line buffer is 1024 x 24bits */
3340         /* XXX: for some reason using full buffer size causes considerable TX
3341          * slowdown with update sizes that fill the whole buffer */
3342         const unsigned line_buf_size = 1023 * 3;
3343
3344         DSSDBG("dsi_update_screen_dispc(%d,%d %dx%d)\n",
3345                         x, y, w, h);
3346
3347         dsi_vc_config_vp(channel);
3348
3349         bytespp = dssdev->ctrl.pixel_size / 8;
3350         bytespl = w * bytespp;
3351         bytespf = bytespl * h;
3352
3353         /* NOTE: packet_payload has to be equal to N * bytespl, where N is
3354          * number of lines in a packet.  See errata about VP_CLK_RATIO */
3355
3356         if (bytespf < line_buf_size)
3357                 packet_payload = bytespf;
3358         else
3359                 packet_payload = (line_buf_size) / bytespl * bytespl;
3360
3361         packet_len = packet_payload + 1;        /* 1 byte for DCS cmd */
3362         total_len = (bytespf / packet_payload) * packet_len;
3363
3364         if (bytespf % packet_payload)
3365                 total_len += (bytespf % packet_payload) + 1;
3366
3367         l = FLD_VAL(total_len, 23, 0); /* TE_SIZE */
3368         dsi_write_reg(DSI_VC_TE(channel), l);
3369
3370         dsi_vc_write_long_header(channel, DSI_DT_DCS_LONG_WRITE, packet_len, 0);
3371
3372         if (dsi.te_enabled)
3373                 l = FLD_MOD(l, 1, 30, 30); /* TE_EN */
3374         else
3375                 l = FLD_MOD(l, 1, 31, 31); /* TE_START */
3376         dsi_write_reg(DSI_VC_TE(channel), l);
3377
3378         /* We put SIDLEMODE to no-idle for the duration of the transfer,
3379          * because DSS interrupts are not capable of waking up the CPU and the
3380          * framedone interrupt could be delayed for quite a long time. I think
3381          * the same goes for any DSS interrupts, but for some reason I have not
3382          * seen the problem anywhere else than here.
3383          */
3384         dispc_disable_sidle();
3385
3386         dsi_perf_mark_start();
3387
3388         r = queue_delayed_work(dsi.workqueue, &dsi.framedone_timeout_work,
3389                         msecs_to_jiffies(250));
3390         BUG_ON(r == 0);
3391
3392         dss_start_update(dssdev);
3393
3394         if (dsi.te_enabled) {
3395                 /* disable LP_RX_TO, so that we can receive TE.  Time to wait
3396                  * for TE is longer than the timer allows */
3397                 REG_FLD_MOD(DSI_TIMING2, 0, 15, 15); /* LP_RX_TO */
3398
3399                 dsi_vc_send_bta(channel);
3400
3401 #ifdef DSI_CATCH_MISSING_TE
3402                 mod_timer(&dsi.te_timer, jiffies + msecs_to_jiffies(250));
3403 #endif
3404         }
3405 }
3406
3407 #ifdef DSI_CATCH_MISSING_TE
3408 static void dsi_te_timeout(unsigned long arg)
3409 {
3410         DSSERR("TE not received for 250ms!\n");
3411 }
3412 #endif
3413
3414 static void dsi_handle_framedone(int error)
3415 {
3416         /* SIDLEMODE back to smart-idle */
3417         dispc_enable_sidle();
3418
3419         if (dsi.te_enabled) {
3420                 /* enable LP_RX_TO again after the TE */
3421                 REG_FLD_MOD(DSI_TIMING2, 1, 15, 15); /* LP_RX_TO */
3422         }
3423
3424         dsi.framedone_callback(error, dsi.framedone_data);
3425
3426         if (!error)
3427                 dsi_perf_show("DISPC");
3428 }
3429
3430 static void dsi_framedone_timeout_work_callback(struct work_struct *work)
3431 {
3432         /* XXX While extremely unlikely, we could get FRAMEDONE interrupt after
3433          * 250ms which would conflict with this timeout work. What should be
3434          * done is first cancel the transfer on the HW, and then cancel the
3435          * possibly scheduled framedone work. However, cancelling the transfer
3436          * on the HW is buggy, and would probably require resetting the whole
3437          * DSI */
3438
3439         DSSERR("Framedone not received for 250ms!\n");
3440
3441         dsi_handle_framedone(-ETIMEDOUT);
3442 }
3443
3444 static void dsi_framedone_irq_callback(void *data, u32 mask)
3445 {
3446         /* Note: We get FRAMEDONE when DISPC has finished sending pixels and
3447          * turns itself off. However, DSI still has the pixels in its buffers,
3448          * and is sending the data.
3449          */
3450
3451         __cancel_delayed_work(&dsi.framedone_timeout_work);
3452
3453         dsi_handle_framedone(0);
3454
3455 #ifdef CONFIG_OMAP2_DSS_FAKE_VSYNC
3456         dispc_fake_vsync_irq();
3457 #endif
3458 }
3459
3460 int omap_dsi_prepare_update(struct omap_dss_device *dssdev,
3461                                     u16 *x, u16 *y, u16 *w, u16 *h,
3462                                     bool enlarge_update_area)
3463 {
3464         u16 dw, dh;
3465
3466         dssdev->driver->get_resolution(dssdev, &dw, &dh);
3467
3468         if  (*x > dw || *y > dh)
3469                 return -EINVAL;
3470
3471         if (*x + *w > dw)
3472                 return -EINVAL;
3473
3474         if (*y + *h > dh)
3475                 return -EINVAL;
3476
3477         if (*w == 1)
3478                 return -EINVAL;
3479
3480         if (*w == 0 || *h == 0)
3481                 return -EINVAL;
3482
3483         dsi_perf_mark_setup();
3484
3485         if (dssdev->manager->caps & OMAP_DSS_OVL_MGR_CAP_DISPC) {
3486                 dss_setup_partial_planes(dssdev, x, y, w, h,
3487                                 enlarge_update_area);
3488                 dispc_set_lcd_size(dssdev->manager->id, *w, *h);
3489         }
3490
3491         return 0;
3492 }
3493 EXPORT_SYMBOL(omap_dsi_prepare_update);
3494
3495 int omap_dsi_update(struct omap_dss_device *dssdev,
3496                 int channel,
3497                 u16 x, u16 y, u16 w, u16 h,
3498                 void (*callback)(int, void *), void *data)
3499 {
3500         dsi.update_channel = channel;
3501
3502         /* OMAP DSS cannot send updates of odd widths.
3503          * omap_dsi_prepare_update() makes the widths even, but add a BUG_ON
3504          * here to make sure we catch erroneous updates. Otherwise we'll only
3505          * see rather obscure HW error happening, as DSS halts. */
3506         BUG_ON(x % 2 == 1);
3507
3508         if (dssdev->manager->caps & OMAP_DSS_OVL_MGR_CAP_DISPC) {
3509                 dsi.framedone_callback = callback;
3510                 dsi.framedone_data = data;
3511
3512                 dsi.update_region.x = x;
3513                 dsi.update_region.y = y;
3514                 dsi.update_region.w = w;
3515                 dsi.update_region.h = h;
3516                 dsi.update_region.device = dssdev;
3517
3518                 dsi_update_screen_dispc(dssdev, x, y, w, h);
3519         } else {
3520                 int r;
3521
3522                 r = dsi_update_screen_l4(dssdev, x, y, w, h);
3523                 if (r)
3524                         return r;
3525
3526                 dsi_perf_show("L4");
3527                 callback(0, data);
3528         }
3529
3530         return 0;
3531 }
3532 EXPORT_SYMBOL(omap_dsi_update);
3533
3534 /* Display funcs */
3535
3536 static int dsi_display_init_dispc(struct omap_dss_device *dssdev)
3537 {
3538         int r;
3539
3540         r = omap_dispc_register_isr(dsi_framedone_irq_callback, NULL,
3541                         DISPC_IRQ_FRAMEDONE);
3542         if (r) {
3543                 DSSERR("can't get FRAMEDONE irq\n");
3544                 return r;
3545         }
3546
3547         dispc_set_lcd_display_type(dssdev->manager->id,
3548                         OMAP_DSS_LCD_DISPLAY_TFT);
3549
3550         dispc_set_parallel_interface_mode(dssdev->manager->id,
3551                         OMAP_DSS_PARALLELMODE_DSI);
3552         dispc_enable_fifohandcheck(dssdev->manager->id, 1);
3553
3554         dispc_set_tft_data_lines(dssdev->manager->id, dssdev->ctrl.pixel_size);
3555
3556         {
3557                 struct omap_video_timings timings = {
3558                         .hsw            = 1,
3559                         .hfp            = 1,
3560                         .hbp            = 1,
3561                         .vsw            = 1,
3562                         .vfp            = 0,
3563                         .vbp            = 0,
3564                 };
3565
3566                 dispc_set_lcd_timings(dssdev->manager->id, &timings);
3567         }
3568
3569         return 0;
3570 }
3571
3572 static void dsi_display_uninit_dispc(struct omap_dss_device *dssdev)
3573 {
3574         omap_dispc_unregister_isr(dsi_framedone_irq_callback, NULL,
3575                         DISPC_IRQ_FRAMEDONE);
3576 }
3577
3578 static int dsi_configure_dsi_clocks(struct omap_dss_device *dssdev)
3579 {
3580         struct dsi_clock_info cinfo;
3581         int r;
3582
3583         /* we always use DSS_CLK_SYSCK as input clock */
3584         cinfo.use_sys_clk = true;
3585         cinfo.regn  = dssdev->clocks.dsi.regn;
3586         cinfo.regm  = dssdev->clocks.dsi.regm;
3587         cinfo.regm_dispc = dssdev->clocks.dsi.regm_dispc;
3588         cinfo.regm_dsi = dssdev->clocks.dsi.regm_dsi;
3589         r = dsi_calc_clock_rates(dssdev, &cinfo);
3590         if (r) {
3591                 DSSERR("Failed to calc dsi clocks\n");
3592                 return r;
3593         }
3594
3595         r = dsi_pll_set_clock_div(&cinfo);
3596         if (r) {
3597                 DSSERR("Failed to set dsi clocks\n");
3598                 return r;
3599         }
3600
3601         return 0;
3602 }
3603
3604 static int dsi_configure_dispc_clocks(struct omap_dss_device *dssdev)
3605 {
3606         struct dispc_clock_info dispc_cinfo;
3607         int r;
3608         unsigned long long fck;
3609
3610         fck = dsi_get_pll_hsdiv_dispc_rate();
3611
3612         dispc_cinfo.lck_div = dssdev->clocks.dispc.channel.lck_div;
3613         dispc_cinfo.pck_div = dssdev->clocks.dispc.channel.pck_div;
3614
3615         r = dispc_calc_clock_rates(fck, &dispc_cinfo);
3616         if (r) {
3617                 DSSERR("Failed to calc dispc clocks\n");
3618                 return r;
3619         }
3620
3621         r = dispc_set_clock_div(dssdev->manager->id, &dispc_cinfo);
3622         if (r) {
3623                 DSSERR("Failed to set dispc clocks\n");
3624                 return r;
3625         }
3626
3627         return 0;
3628 }
3629
3630 static int dsi_display_init_dsi(struct omap_dss_device *dssdev)
3631 {
3632         int r;
3633
3634         /* The SCPClk is required for both PLL and CIO registers on OMAP4 */
3635         dsi_enable_scp_clk();
3636
3637         _dsi_print_reset_status();
3638
3639         r = dsi_pll_init(dssdev, true, true);
3640         if (r)
3641                 goto err0;
3642
3643         r = dsi_configure_dsi_clocks(dssdev);
3644         if (r)
3645                 goto err1;
3646
3647         dss_select_dispc_clk_source(dssdev->clocks.dispc.dispc_fclk_src);
3648         dss_select_dsi_clk_source(dssdev->clocks.dsi.dsi_fclk_src);
3649         dss_select_lcd_clk_source(dssdev->manager->id,
3650                         dssdev->clocks.dispc.channel.lcd_clk_src);
3651
3652         DSSDBG("PLL OK\n");
3653
3654         r = dsi_configure_dispc_clocks(dssdev);
3655         if (r)
3656                 goto err2;
3657
3658         r = dsi_cio_init(dssdev);
3659         if (r)
3660                 goto err2;
3661
3662         _dsi_print_reset_status();
3663
3664         dsi_proto_timings(dssdev);
3665         dsi_set_lp_clk_divisor(dssdev);
3666
3667         if (1)
3668                 _dsi_print_reset_status();
3669
3670         r = dsi_proto_config(dssdev);
3671         if (r)
3672                 goto err3;
3673
3674         /* enable interface */
3675         dsi_vc_enable(0, 1);
3676         dsi_vc_enable(1, 1);
3677         dsi_vc_enable(2, 1);
3678         dsi_vc_enable(3, 1);
3679         dsi_if_enable(1);
3680         dsi_force_tx_stop_mode_io();
3681
3682         return 0;
3683 err3:
3684         dsi_cio_uninit();
3685 err2:
3686         dss_select_dispc_clk_source(OMAP_DSS_CLK_SRC_FCK);
3687         dss_select_dsi_clk_source(OMAP_DSS_CLK_SRC_FCK);
3688 err1:
3689         dsi_pll_uninit(true);
3690 err0:
3691         dsi_disable_scp_clk();
3692         return r;
3693 }
3694
3695 static void dsi_display_uninit_dsi(struct omap_dss_device *dssdev,
3696                 bool disconnect_lanes)
3697 {
3698         if (!dsi.ulps_enabled)
3699                 dsi_enter_ulps();
3700
3701         /* disable interface */
3702         dsi_if_enable(0);
3703         dsi_vc_enable(0, 0);
3704         dsi_vc_enable(1, 0);
3705         dsi_vc_enable(2, 0);
3706         dsi_vc_enable(3, 0);
3707
3708         dss_select_dispc_clk_source(OMAP_DSS_CLK_SRC_FCK);
3709         dss_select_dsi_clk_source(OMAP_DSS_CLK_SRC_FCK);
3710         dsi_cio_uninit();
3711         dsi_pll_uninit(disconnect_lanes);
3712         dsi_disable_scp_clk();
3713 }
3714
3715 static int dsi_core_init(void)
3716 {
3717         /* Autoidle */
3718         REG_FLD_MOD(DSI_SYSCONFIG, 1, 0, 0);
3719
3720         /* ENWAKEUP */
3721         REG_FLD_MOD(DSI_SYSCONFIG, 1, 2, 2);
3722
3723         /* SIDLEMODE smart-idle */
3724         REG_FLD_MOD(DSI_SYSCONFIG, 2, 4, 3);
3725
3726         _dsi_initialize_irq();
3727
3728         return 0;
3729 }
3730
3731 int omapdss_dsi_display_enable(struct omap_dss_device *dssdev)
3732 {
3733         int r = 0;
3734
3735         DSSDBG("dsi_display_enable\n");
3736
3737         WARN_ON(!dsi_bus_is_locked());
3738
3739         mutex_lock(&dsi.lock);
3740
3741         r = omap_dss_start_device(dssdev);
3742         if (r) {
3743                 DSSERR("failed to start device\n");
3744                 goto err0;
3745         }
3746
3747         enable_clocks(1);
3748         dsi_enable_pll_clock(1);
3749
3750         r = _dsi_reset();
3751         if (r)
3752                 goto err1;
3753
3754         dsi_core_init();
3755
3756         r = dsi_display_init_dispc(dssdev);
3757         if (r)
3758                 goto err1;
3759
3760         r = dsi_display_init_dsi(dssdev);
3761         if (r)
3762                 goto err2;
3763
3764         mutex_unlock(&dsi.lock);
3765
3766         return 0;
3767
3768 err2:
3769         dsi_display_uninit_dispc(dssdev);
3770 err1:
3771         enable_clocks(0);
3772         dsi_enable_pll_clock(0);
3773         omap_dss_stop_device(dssdev);
3774 err0:
3775         mutex_unlock(&dsi.lock);
3776         DSSDBG("dsi_display_enable FAILED\n");
3777         return r;
3778 }
3779 EXPORT_SYMBOL(omapdss_dsi_display_enable);
3780
3781 void omapdss_dsi_display_disable(struct omap_dss_device *dssdev,
3782                 bool disconnect_lanes)
3783 {
3784         DSSDBG("dsi_display_disable\n");
3785
3786         WARN_ON(!dsi_bus_is_locked());
3787
3788         mutex_lock(&dsi.lock);
3789
3790         dsi_display_uninit_dispc(dssdev);
3791
3792         dsi_display_uninit_dsi(dssdev, disconnect_lanes);
3793
3794         enable_clocks(0);
3795         dsi_enable_pll_clock(0);
3796
3797         omap_dss_stop_device(dssdev);
3798
3799         mutex_unlock(&dsi.lock);
3800 }
3801 EXPORT_SYMBOL(omapdss_dsi_display_disable);
3802
3803 int omapdss_dsi_enable_te(struct omap_dss_device *dssdev, bool enable)
3804 {
3805         dsi.te_enabled = enable;
3806         return 0;
3807 }
3808 EXPORT_SYMBOL(omapdss_dsi_enable_te);
3809
3810 void dsi_get_overlay_fifo_thresholds(enum omap_plane plane,
3811                 u32 fifo_size, enum omap_burst_size *burst_size,
3812                 u32 *fifo_low, u32 *fifo_high)
3813 {
3814         unsigned burst_size_bytes;
3815
3816         *burst_size = OMAP_DSS_BURST_16x32;
3817         burst_size_bytes = 16 * 32 / 8;
3818
3819         *fifo_high = fifo_size - burst_size_bytes;
3820         *fifo_low = fifo_size - burst_size_bytes * 2;
3821 }
3822
3823 int dsi_init_display(struct omap_dss_device *dssdev)
3824 {
3825         DSSDBG("DSI init\n");
3826
3827         /* XXX these should be figured out dynamically */
3828         dssdev->caps = OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE |
3829                 OMAP_DSS_DISPLAY_CAP_TEAR_ELIM;
3830
3831         if (dsi.vdds_dsi_reg == NULL) {
3832                 struct regulator *vdds_dsi;
3833
3834                 vdds_dsi = regulator_get(&dsi.pdev->dev, "vdds_dsi");
3835
3836                 if (IS_ERR(vdds_dsi)) {
3837                         DSSERR("can't get VDDS_DSI regulator\n");
3838                         return PTR_ERR(vdds_dsi);
3839                 }
3840
3841                 dsi.vdds_dsi_reg = vdds_dsi;
3842         }
3843
3844         return 0;
3845 }
3846
3847 int omap_dsi_request_vc(struct omap_dss_device *dssdev, int *channel)
3848 {
3849         int i;
3850
3851         for (i = 0; i < ARRAY_SIZE(dsi.vc); i++) {
3852                 if (!dsi.vc[i].dssdev) {
3853                         dsi.vc[i].dssdev = dssdev;
3854                         *channel = i;
3855                         return 0;
3856                 }
3857         }
3858
3859         DSSERR("cannot get VC for display %s", dssdev->name);
3860         return -ENOSPC;
3861 }
3862 EXPORT_SYMBOL(omap_dsi_request_vc);
3863
3864 int omap_dsi_set_vc_id(struct omap_dss_device *dssdev, int channel, int vc_id)
3865 {
3866         if (vc_id < 0 || vc_id > 3) {
3867                 DSSERR("VC ID out of range\n");
3868                 return -EINVAL;
3869         }
3870
3871         if (channel < 0 || channel > 3) {
3872                 DSSERR("Virtual Channel out of range\n");
3873                 return -EINVAL;
3874         }
3875
3876         if (dsi.vc[channel].dssdev != dssdev) {
3877                 DSSERR("Virtual Channel not allocated to display %s\n",
3878                         dssdev->name);
3879                 return -EINVAL;
3880         }
3881
3882         dsi.vc[channel].vc_id = vc_id;
3883
3884         return 0;
3885 }
3886 EXPORT_SYMBOL(omap_dsi_set_vc_id);
3887
3888 void omap_dsi_release_vc(struct omap_dss_device *dssdev, int channel)
3889 {
3890         if ((channel >= 0 && channel <= 3) &&
3891                 dsi.vc[channel].dssdev == dssdev) {
3892                 dsi.vc[channel].dssdev = NULL;
3893                 dsi.vc[channel].vc_id = 0;
3894         }
3895 }
3896 EXPORT_SYMBOL(omap_dsi_release_vc);
3897
3898 void dsi_wait_pll_hsdiv_dispc_active(void)
3899 {
3900         if (wait_for_bit_change(DSI_PLL_STATUS, 7, 1) != 1)
3901                 DSSERR("%s (%s) not active\n",
3902                         dss_get_generic_clk_source_name(OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC),
3903                         dss_feat_get_clk_source_name(OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC));
3904 }
3905
3906 void dsi_wait_pll_hsdiv_dsi_active(void)
3907 {
3908         if (wait_for_bit_change(DSI_PLL_STATUS, 8, 1) != 1)
3909                 DSSERR("%s (%s) not active\n",
3910                         dss_get_generic_clk_source_name(OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DSI),
3911                         dss_feat_get_clk_source_name(OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DSI));
3912 }
3913
3914 static void dsi_calc_clock_param_ranges(void)
3915 {
3916         dsi.regn_max = dss_feat_get_param_max(FEAT_PARAM_DSIPLL_REGN);
3917         dsi.regm_max = dss_feat_get_param_max(FEAT_PARAM_DSIPLL_REGM);
3918         dsi.regm_dispc_max = dss_feat_get_param_max(FEAT_PARAM_DSIPLL_REGM_DISPC);
3919         dsi.regm_dsi_max = dss_feat_get_param_max(FEAT_PARAM_DSIPLL_REGM_DSI);
3920         dsi.fint_min = dss_feat_get_param_min(FEAT_PARAM_DSIPLL_FINT);
3921         dsi.fint_max = dss_feat_get_param_max(FEAT_PARAM_DSIPLL_FINT);
3922         dsi.lpdiv_max = dss_feat_get_param_max(FEAT_PARAM_DSIPLL_LPDIV);
3923 }
3924
3925 static int dsi_init(struct platform_device *pdev)
3926 {
3927         u32 rev;
3928         int r, i;
3929         struct resource *dsi_mem;
3930
3931         spin_lock_init(&dsi.irq_lock);
3932         spin_lock_init(&dsi.errors_lock);
3933         dsi.errors = 0;
3934
3935 #ifdef CONFIG_OMAP2_DSS_COLLECT_IRQ_STATS
3936         spin_lock_init(&dsi.irq_stats_lock);
3937         dsi.irq_stats.last_reset = jiffies;
3938 #endif
3939
3940         mutex_init(&dsi.lock);
3941         sema_init(&dsi.bus_lock, 1);
3942
3943         dsi.workqueue = create_singlethread_workqueue("dsi");
3944         if (dsi.workqueue == NULL)
3945                 return -ENOMEM;
3946
3947         INIT_DELAYED_WORK_DEFERRABLE(&dsi.framedone_timeout_work,
3948                         dsi_framedone_timeout_work_callback);
3949
3950 #ifdef DSI_CATCH_MISSING_TE
3951         init_timer(&dsi.te_timer);
3952         dsi.te_timer.function = dsi_te_timeout;
3953         dsi.te_timer.data = 0;
3954 #endif
3955         dsi_mem = platform_get_resource(dsi.pdev, IORESOURCE_MEM, 0);
3956         if (!dsi_mem) {
3957                 DSSERR("can't get IORESOURCE_MEM DSI\n");
3958                 r = -EINVAL;
3959                 goto err1;
3960         }
3961         dsi.base = ioremap(dsi_mem->start, resource_size(dsi_mem));
3962         if (!dsi.base) {
3963                 DSSERR("can't ioremap DSI\n");
3964                 r = -ENOMEM;
3965                 goto err1;
3966         }
3967         dsi.irq = platform_get_irq(dsi.pdev, 0);
3968         if (dsi.irq < 0) {
3969                 DSSERR("platform_get_irq failed\n");
3970                 r = -ENODEV;
3971                 goto err2;
3972         }
3973
3974         r = request_irq(dsi.irq, omap_dsi_irq_handler, IRQF_SHARED,
3975                 "OMAP DSI1", dsi.pdev);
3976         if (r < 0) {
3977                 DSSERR("request_irq failed\n");
3978                 goto err2;
3979         }
3980
3981         /* DSI VCs initialization */
3982         for (i = 0; i < ARRAY_SIZE(dsi.vc); i++) {
3983                 dsi.vc[i].mode = DSI_VC_MODE_L4;
3984                 dsi.vc[i].dssdev = NULL;
3985                 dsi.vc[i].vc_id = 0;
3986         }
3987
3988         dsi_calc_clock_param_ranges();
3989
3990         enable_clocks(1);
3991
3992         rev = dsi_read_reg(DSI_REVISION);
3993         dev_dbg(&pdev->dev, "OMAP DSI rev %d.%d\n",
3994                FLD_GET(rev, 7, 4), FLD_GET(rev, 3, 0));
3995
3996         enable_clocks(0);
3997
3998         return 0;
3999 err2:
4000         iounmap(dsi.base);
4001 err1:
4002         destroy_workqueue(dsi.workqueue);
4003         return r;
4004 }
4005
4006 static void dsi_exit(void)
4007 {
4008         if (dsi.vdds_dsi_reg != NULL) {
4009                 regulator_put(dsi.vdds_dsi_reg);
4010                 dsi.vdds_dsi_reg = NULL;
4011         }
4012
4013         free_irq(dsi.irq, dsi.pdev);
4014         iounmap(dsi.base);
4015
4016         destroy_workqueue(dsi.workqueue);
4017
4018         DSSDBG("omap_dsi_exit\n");
4019 }
4020
4021 /* DSI1 HW IP initialisation */
4022 static int omap_dsi1hw_probe(struct platform_device *pdev)
4023 {
4024         int r;
4025         dsi.pdev = pdev;
4026         r = dsi_init(pdev);
4027         if (r) {
4028                 DSSERR("Failed to initialize DSI\n");
4029                 goto err_dsi;
4030         }
4031 err_dsi:
4032         return r;
4033 }
4034
4035 static int omap_dsi1hw_remove(struct platform_device *pdev)
4036 {
4037         dsi_exit();
4038         WARN_ON(dsi.scp_clk_refcount > 0);
4039         return 0;
4040 }
4041
4042 static struct platform_driver omap_dsi1hw_driver = {
4043         .probe          = omap_dsi1hw_probe,
4044         .remove         = omap_dsi1hw_remove,
4045         .driver         = {
4046                 .name   = "omapdss_dsi1",
4047                 .owner  = THIS_MODULE,
4048         },
4049 };
4050
4051 int dsi_init_platform_driver(void)
4052 {
4053         return platform_driver_register(&omap_dsi1hw_driver);
4054 }
4055
4056 void dsi_uninit_platform_driver(void)
4057 {
4058         return platform_driver_unregister(&omap_dsi1hw_driver);
4059 }