]> git.kernelconcepts.de Git - karo-tx-linux.git/blob - drivers/video/sh_mobile_lcdcfb.c
Merge tag 'fbdev-updates-for-3.5' of git://github.com/schandinat/linux-2.6
[karo-tx-linux.git] / drivers / video / sh_mobile_lcdcfb.c
1 /*
2  * SuperH Mobile LCDC Framebuffer
3  *
4  * Copyright (c) 2008 Magnus Damm
5  *
6  * This file is subject to the terms and conditions of the GNU General Public
7  * License.  See the file "COPYING" in the main directory of this archive
8  * for more details.
9  */
10
11 #include <linux/atomic.h>
12 #include <linux/backlight.h>
13 #include <linux/clk.h>
14 #include <linux/console.h>
15 #include <linux/dma-mapping.h>
16 #include <linux/delay.h>
17 #include <linux/gpio.h>
18 #include <linux/init.h>
19 #include <linux/interrupt.h>
20 #include <linux/ioctl.h>
21 #include <linux/kernel.h>
22 #include <linux/mm.h>
23 #include <linux/module.h>
24 #include <linux/platform_device.h>
25 #include <linux/pm_runtime.h>
26 #include <linux/slab.h>
27 #include <linux/videodev2.h>
28 #include <linux/vmalloc.h>
29
30 #include <video/sh_mobile_lcdc.h>
31 #include <video/sh_mobile_meram.h>
32
33 #include "sh_mobile_lcdcfb.h"
34
35 #define SIDE_B_OFFSET 0x1000
36 #define MIRROR_OFFSET 0x2000
37
38 #define MAX_XRES 1920
39 #define MAX_YRES 1080
40
41 struct sh_mobile_lcdc_priv {
42         void __iomem *base;
43         int irq;
44         atomic_t hw_usecnt;
45         struct device *dev;
46         struct clk *dot_clk;
47         unsigned long lddckr;
48         struct sh_mobile_lcdc_chan ch[2];
49         struct notifier_block notifier;
50         int started;
51         int forced_fourcc; /* 2 channel LCDC must share fourcc setting */
52         struct sh_mobile_meram_info *meram_dev;
53 };
54
55 /* -----------------------------------------------------------------------------
56  * Registers access
57  */
58
59 static unsigned long lcdc_offs_mainlcd[NR_CH_REGS] = {
60         [LDDCKPAT1R] = 0x400,
61         [LDDCKPAT2R] = 0x404,
62         [LDMT1R] = 0x418,
63         [LDMT2R] = 0x41c,
64         [LDMT3R] = 0x420,
65         [LDDFR] = 0x424,
66         [LDSM1R] = 0x428,
67         [LDSM2R] = 0x42c,
68         [LDSA1R] = 0x430,
69         [LDSA2R] = 0x434,
70         [LDMLSR] = 0x438,
71         [LDHCNR] = 0x448,
72         [LDHSYNR] = 0x44c,
73         [LDVLNR] = 0x450,
74         [LDVSYNR] = 0x454,
75         [LDPMR] = 0x460,
76         [LDHAJR] = 0x4a0,
77 };
78
79 static unsigned long lcdc_offs_sublcd[NR_CH_REGS] = {
80         [LDDCKPAT1R] = 0x408,
81         [LDDCKPAT2R] = 0x40c,
82         [LDMT1R] = 0x600,
83         [LDMT2R] = 0x604,
84         [LDMT3R] = 0x608,
85         [LDDFR] = 0x60c,
86         [LDSM1R] = 0x610,
87         [LDSM2R] = 0x614,
88         [LDSA1R] = 0x618,
89         [LDMLSR] = 0x620,
90         [LDHCNR] = 0x624,
91         [LDHSYNR] = 0x628,
92         [LDVLNR] = 0x62c,
93         [LDVSYNR] = 0x630,
94         [LDPMR] = 0x63c,
95 };
96
97 static bool banked(int reg_nr)
98 {
99         switch (reg_nr) {
100         case LDMT1R:
101         case LDMT2R:
102         case LDMT3R:
103         case LDDFR:
104         case LDSM1R:
105         case LDSA1R:
106         case LDSA2R:
107         case LDMLSR:
108         case LDHCNR:
109         case LDHSYNR:
110         case LDVLNR:
111         case LDVSYNR:
112                 return true;
113         }
114         return false;
115 }
116
117 static int lcdc_chan_is_sublcd(struct sh_mobile_lcdc_chan *chan)
118 {
119         return chan->cfg->chan == LCDC_CHAN_SUBLCD;
120 }
121
122 static void lcdc_write_chan(struct sh_mobile_lcdc_chan *chan,
123                             int reg_nr, unsigned long data)
124 {
125         iowrite32(data, chan->lcdc->base + chan->reg_offs[reg_nr]);
126         if (banked(reg_nr))
127                 iowrite32(data, chan->lcdc->base + chan->reg_offs[reg_nr] +
128                           SIDE_B_OFFSET);
129 }
130
131 static void lcdc_write_chan_mirror(struct sh_mobile_lcdc_chan *chan,
132                             int reg_nr, unsigned long data)
133 {
134         iowrite32(data, chan->lcdc->base + chan->reg_offs[reg_nr] +
135                   MIRROR_OFFSET);
136 }
137
138 static unsigned long lcdc_read_chan(struct sh_mobile_lcdc_chan *chan,
139                                     int reg_nr)
140 {
141         return ioread32(chan->lcdc->base + chan->reg_offs[reg_nr]);
142 }
143
144 static void lcdc_write(struct sh_mobile_lcdc_priv *priv,
145                        unsigned long reg_offs, unsigned long data)
146 {
147         iowrite32(data, priv->base + reg_offs);
148 }
149
150 static unsigned long lcdc_read(struct sh_mobile_lcdc_priv *priv,
151                                unsigned long reg_offs)
152 {
153         return ioread32(priv->base + reg_offs);
154 }
155
156 static void lcdc_wait_bit(struct sh_mobile_lcdc_priv *priv,
157                           unsigned long reg_offs,
158                           unsigned long mask, unsigned long until)
159 {
160         while ((lcdc_read(priv, reg_offs) & mask) != until)
161                 cpu_relax();
162 }
163
164 /* -----------------------------------------------------------------------------
165  * Clock management
166  */
167
168 static void sh_mobile_lcdc_clk_on(struct sh_mobile_lcdc_priv *priv)
169 {
170         if (atomic_inc_and_test(&priv->hw_usecnt)) {
171                 if (priv->dot_clk)
172                         clk_enable(priv->dot_clk);
173                 pm_runtime_get_sync(priv->dev);
174                 if (priv->meram_dev && priv->meram_dev->pdev)
175                         pm_runtime_get_sync(&priv->meram_dev->pdev->dev);
176         }
177 }
178
179 static void sh_mobile_lcdc_clk_off(struct sh_mobile_lcdc_priv *priv)
180 {
181         if (atomic_sub_return(1, &priv->hw_usecnt) == -1) {
182                 if (priv->meram_dev && priv->meram_dev->pdev)
183                         pm_runtime_put_sync(&priv->meram_dev->pdev->dev);
184                 pm_runtime_put(priv->dev);
185                 if (priv->dot_clk)
186                         clk_disable(priv->dot_clk);
187         }
188 }
189
190 static int sh_mobile_lcdc_setup_clocks(struct sh_mobile_lcdc_priv *priv,
191                                        int clock_source)
192 {
193         struct clk *clk;
194         char *str;
195
196         switch (clock_source) {
197         case LCDC_CLK_BUS:
198                 str = "bus_clk";
199                 priv->lddckr = LDDCKR_ICKSEL_BUS;
200                 break;
201         case LCDC_CLK_PERIPHERAL:
202                 str = "peripheral_clk";
203                 priv->lddckr = LDDCKR_ICKSEL_MIPI;
204                 break;
205         case LCDC_CLK_EXTERNAL:
206                 str = NULL;
207                 priv->lddckr = LDDCKR_ICKSEL_HDMI;
208                 break;
209         default:
210                 return -EINVAL;
211         }
212
213         if (str == NULL)
214                 return 0;
215
216         clk = clk_get(priv->dev, str);
217         if (IS_ERR(clk)) {
218                 dev_err(priv->dev, "cannot get dot clock %s\n", str);
219                 return PTR_ERR(clk);
220         }
221
222         priv->dot_clk = clk;
223         return 0;
224 }
225
226 /* -----------------------------------------------------------------------------
227  * Display, panel and deferred I/O
228  */
229
230 static void lcdc_sys_write_index(void *handle, unsigned long data)
231 {
232         struct sh_mobile_lcdc_chan *ch = handle;
233
234         lcdc_write(ch->lcdc, _LDDWD0R, data | LDDWDxR_WDACT);
235         lcdc_wait_bit(ch->lcdc, _LDSR, LDSR_AS, 0);
236         lcdc_write(ch->lcdc, _LDDWAR, LDDWAR_WA |
237                    (lcdc_chan_is_sublcd(ch) ? 2 : 0));
238         lcdc_wait_bit(ch->lcdc, _LDSR, LDSR_AS, 0);
239 }
240
241 static void lcdc_sys_write_data(void *handle, unsigned long data)
242 {
243         struct sh_mobile_lcdc_chan *ch = handle;
244
245         lcdc_write(ch->lcdc, _LDDWD0R, data | LDDWDxR_WDACT | LDDWDxR_RSW);
246         lcdc_wait_bit(ch->lcdc, _LDSR, LDSR_AS, 0);
247         lcdc_write(ch->lcdc, _LDDWAR, LDDWAR_WA |
248                    (lcdc_chan_is_sublcd(ch) ? 2 : 0));
249         lcdc_wait_bit(ch->lcdc, _LDSR, LDSR_AS, 0);
250 }
251
252 static unsigned long lcdc_sys_read_data(void *handle)
253 {
254         struct sh_mobile_lcdc_chan *ch = handle;
255
256         lcdc_write(ch->lcdc, _LDDRDR, LDDRDR_RSR);
257         lcdc_wait_bit(ch->lcdc, _LDSR, LDSR_AS, 0);
258         lcdc_write(ch->lcdc, _LDDRAR, LDDRAR_RA |
259                    (lcdc_chan_is_sublcd(ch) ? 2 : 0));
260         udelay(1);
261         lcdc_wait_bit(ch->lcdc, _LDSR, LDSR_AS, 0);
262
263         return lcdc_read(ch->lcdc, _LDDRDR) & LDDRDR_DRD_MASK;
264 }
265
266 struct sh_mobile_lcdc_sys_bus_ops sh_mobile_lcdc_sys_bus_ops = {
267         lcdc_sys_write_index,
268         lcdc_sys_write_data,
269         lcdc_sys_read_data,
270 };
271
272 static int sh_mobile_lcdc_sginit(struct fb_info *info,
273                                   struct list_head *pagelist)
274 {
275         struct sh_mobile_lcdc_chan *ch = info->par;
276         unsigned int nr_pages_max = ch->fb_size >> PAGE_SHIFT;
277         struct page *page;
278         int nr_pages = 0;
279
280         sg_init_table(ch->sglist, nr_pages_max);
281
282         list_for_each_entry(page, pagelist, lru)
283                 sg_set_page(&ch->sglist[nr_pages++], page, PAGE_SIZE, 0);
284
285         return nr_pages;
286 }
287
288 static void sh_mobile_lcdc_deferred_io(struct fb_info *info,
289                                        struct list_head *pagelist)
290 {
291         struct sh_mobile_lcdc_chan *ch = info->par;
292         const struct sh_mobile_lcdc_panel_cfg *panel = &ch->cfg->panel_cfg;
293
294         /* enable clocks before accessing hardware */
295         sh_mobile_lcdc_clk_on(ch->lcdc);
296
297         /*
298          * It's possible to get here without anything on the pagelist via
299          * sh_mobile_lcdc_deferred_io_touch() or via a userspace fsync()
300          * invocation. In the former case, the acceleration routines are
301          * stepped in to when using the framebuffer console causing the
302          * workqueue to be scheduled without any dirty pages on the list.
303          *
304          * Despite this, a panel update is still needed given that the
305          * acceleration routines have their own methods for writing in
306          * that still need to be updated.
307          *
308          * The fsync() and empty pagelist case could be optimized for,
309          * but we don't bother, as any application exhibiting such
310          * behaviour is fundamentally broken anyways.
311          */
312         if (!list_empty(pagelist)) {
313                 unsigned int nr_pages = sh_mobile_lcdc_sginit(info, pagelist);
314
315                 /* trigger panel update */
316                 dma_map_sg(ch->lcdc->dev, ch->sglist, nr_pages, DMA_TO_DEVICE);
317                 if (panel->start_transfer)
318                         panel->start_transfer(ch, &sh_mobile_lcdc_sys_bus_ops);
319                 lcdc_write_chan(ch, LDSM2R, LDSM2R_OSTRG);
320                 dma_unmap_sg(ch->lcdc->dev, ch->sglist, nr_pages,
321                              DMA_TO_DEVICE);
322         } else {
323                 if (panel->start_transfer)
324                         panel->start_transfer(ch, &sh_mobile_lcdc_sys_bus_ops);
325                 lcdc_write_chan(ch, LDSM2R, LDSM2R_OSTRG);
326         }
327 }
328
329 static void sh_mobile_lcdc_deferred_io_touch(struct fb_info *info)
330 {
331         struct fb_deferred_io *fbdefio = info->fbdefio;
332
333         if (fbdefio)
334                 schedule_delayed_work(&info->deferred_work, fbdefio->delay);
335 }
336
337 static void sh_mobile_lcdc_display_on(struct sh_mobile_lcdc_chan *ch)
338 {
339         const struct sh_mobile_lcdc_panel_cfg *panel = &ch->cfg->panel_cfg;
340
341         if (ch->tx_dev) {
342                 int ret;
343
344                 ret = ch->tx_dev->ops->display_on(ch->tx_dev);
345                 if (ret < 0)
346                         return;
347
348                 if (ret == SH_MOBILE_LCDC_DISPLAY_DISCONNECTED)
349                         ch->info->state = FBINFO_STATE_SUSPENDED;
350         }
351
352         /* HDMI must be enabled before LCDC configuration */
353         if (panel->display_on)
354                 panel->display_on();
355 }
356
357 static void sh_mobile_lcdc_display_off(struct sh_mobile_lcdc_chan *ch)
358 {
359         const struct sh_mobile_lcdc_panel_cfg *panel = &ch->cfg->panel_cfg;
360
361         if (panel->display_off)
362                 panel->display_off();
363
364         if (ch->tx_dev)
365                 ch->tx_dev->ops->display_off(ch->tx_dev);
366 }
367
368 static bool
369 sh_mobile_lcdc_must_reconfigure(struct sh_mobile_lcdc_chan *ch,
370                                 const struct fb_videomode *new_mode)
371 {
372         dev_dbg(ch->info->dev, "Old %ux%u, new %ux%u\n",
373                 ch->display.mode.xres, ch->display.mode.yres,
374                 new_mode->xres, new_mode->yres);
375
376         /* It can be a different monitor with an equal video-mode */
377         if (fb_mode_is_equal(&ch->display.mode, new_mode))
378                 return false;
379
380         dev_dbg(ch->info->dev, "Switching %u -> %u lines\n",
381                 ch->display.mode.yres, new_mode->yres);
382         ch->display.mode = *new_mode;
383
384         return true;
385 }
386
387 static int sh_mobile_check_var(struct fb_var_screeninfo *var,
388                                struct fb_info *info);
389
390 static int sh_mobile_lcdc_display_notify(struct sh_mobile_lcdc_chan *ch,
391                                          enum sh_mobile_lcdc_entity_event event,
392                                          const struct fb_videomode *mode,
393                                          const struct fb_monspecs *monspec)
394 {
395         struct fb_info *info = ch->info;
396         struct fb_var_screeninfo var;
397         int ret = 0;
398
399         switch (event) {
400         case SH_MOBILE_LCDC_EVENT_DISPLAY_CONNECT:
401                 /* HDMI plug in */
402                 if (lock_fb_info(info)) {
403                         console_lock();
404
405                         ch->display.width = monspec->max_x * 10;
406                         ch->display.height = monspec->max_y * 10;
407
408                         if (!sh_mobile_lcdc_must_reconfigure(ch, mode) &&
409                             info->state == FBINFO_STATE_RUNNING) {
410                                 /* First activation with the default monitor.
411                                  * Just turn on, if we run a resume here, the
412                                  * logo disappears.
413                                  */
414                                 info->var.width = monspec->max_x * 10;
415                                 info->var.height = monspec->max_y * 10;
416                                 sh_mobile_lcdc_display_on(ch);
417                         } else {
418                                 /* New monitor or have to wake up */
419                                 fb_set_suspend(info, 0);
420                         }
421
422                         console_unlock();
423                         unlock_fb_info(info);
424                 }
425                 break;
426
427         case SH_MOBILE_LCDC_EVENT_DISPLAY_DISCONNECT:
428                 /* HDMI disconnect */
429                 if (lock_fb_info(info)) {
430                         console_lock();
431                         fb_set_suspend(info, 1);
432                         console_unlock();
433                         unlock_fb_info(info);
434                 }
435                 break;
436
437         case SH_MOBILE_LCDC_EVENT_DISPLAY_MODE:
438                 /* Validate a proposed new mode */
439                 fb_videomode_to_var(&var, mode);
440                 var.bits_per_pixel = info->var.bits_per_pixel;
441                 var.grayscale = info->var.grayscale;
442                 ret = sh_mobile_check_var(&var, info);
443                 break;
444         }
445
446         return ret;
447 }
448
449 /* -----------------------------------------------------------------------------
450  * Format helpers
451  */
452
453 struct sh_mobile_lcdc_format_info {
454         u32 fourcc;
455         unsigned int bpp;
456         bool yuv;
457         u32 lddfr;
458 };
459
460 static const struct sh_mobile_lcdc_format_info sh_mobile_format_infos[] = {
461         {
462                 .fourcc = V4L2_PIX_FMT_RGB565,
463                 .bpp = 16,
464                 .yuv = false,
465                 .lddfr = LDDFR_PKF_RGB16,
466         }, {
467                 .fourcc = V4L2_PIX_FMT_BGR24,
468                 .bpp = 24,
469                 .yuv = false,
470                 .lddfr = LDDFR_PKF_RGB24,
471         }, {
472                 .fourcc = V4L2_PIX_FMT_BGR32,
473                 .bpp = 32,
474                 .yuv = false,
475                 .lddfr = LDDFR_PKF_ARGB32,
476         }, {
477                 .fourcc = V4L2_PIX_FMT_NV12,
478                 .bpp = 12,
479                 .yuv = true,
480                 .lddfr = LDDFR_CC | LDDFR_YF_420,
481         }, {
482                 .fourcc = V4L2_PIX_FMT_NV21,
483                 .bpp = 12,
484                 .yuv = true,
485                 .lddfr = LDDFR_CC | LDDFR_YF_420,
486         }, {
487                 .fourcc = V4L2_PIX_FMT_NV16,
488                 .bpp = 16,
489                 .yuv = true,
490                 .lddfr = LDDFR_CC | LDDFR_YF_422,
491         }, {
492                 .fourcc = V4L2_PIX_FMT_NV61,
493                 .bpp = 16,
494                 .yuv = true,
495                 .lddfr = LDDFR_CC | LDDFR_YF_422,
496         }, {
497                 .fourcc = V4L2_PIX_FMT_NV24,
498                 .bpp = 24,
499                 .yuv = true,
500                 .lddfr = LDDFR_CC | LDDFR_YF_444,
501         }, {
502                 .fourcc = V4L2_PIX_FMT_NV42,
503                 .bpp = 24,
504                 .yuv = true,
505                 .lddfr = LDDFR_CC | LDDFR_YF_444,
506         },
507 };
508
509 static const struct sh_mobile_lcdc_format_info *
510 sh_mobile_format_info(u32 fourcc)
511 {
512         unsigned int i;
513
514         for (i = 0; i < ARRAY_SIZE(sh_mobile_format_infos); ++i) {
515                 if (sh_mobile_format_infos[i].fourcc == fourcc)
516                         return &sh_mobile_format_infos[i];
517         }
518
519         return NULL;
520 }
521
522 static int sh_mobile_format_fourcc(const struct fb_var_screeninfo *var)
523 {
524         if (var->grayscale > 1)
525                 return var->grayscale;
526
527         switch (var->bits_per_pixel) {
528         case 16:
529                 return V4L2_PIX_FMT_RGB565;
530         case 24:
531                 return V4L2_PIX_FMT_BGR24;
532         case 32:
533                 return V4L2_PIX_FMT_BGR32;
534         default:
535                 return 0;
536         }
537 }
538
539 static int sh_mobile_format_is_fourcc(const struct fb_var_screeninfo *var)
540 {
541         return var->grayscale > 1;
542 }
543
544 /* -----------------------------------------------------------------------------
545  * Start, stop and IRQ
546  */
547
548 static irqreturn_t sh_mobile_lcdc_irq(int irq, void *data)
549 {
550         struct sh_mobile_lcdc_priv *priv = data;
551         struct sh_mobile_lcdc_chan *ch;
552         unsigned long ldintr;
553         int is_sub;
554         int k;
555
556         /* Acknowledge interrupts and disable further VSYNC End IRQs. */
557         ldintr = lcdc_read(priv, _LDINTR);
558         lcdc_write(priv, _LDINTR, (ldintr ^ LDINTR_STATUS_MASK) & ~LDINTR_VEE);
559
560         /* figure out if this interrupt is for main or sub lcd */
561         is_sub = (lcdc_read(priv, _LDSR) & LDSR_MSS) ? 1 : 0;
562
563         /* wake up channel and disable clocks */
564         for (k = 0; k < ARRAY_SIZE(priv->ch); k++) {
565                 ch = &priv->ch[k];
566
567                 if (!ch->enabled)
568                         continue;
569
570                 /* Frame End */
571                 if (ldintr & LDINTR_FS) {
572                         if (is_sub == lcdc_chan_is_sublcd(ch)) {
573                                 ch->frame_end = 1;
574                                 wake_up(&ch->frame_end_wait);
575
576                                 sh_mobile_lcdc_clk_off(priv);
577                         }
578                 }
579
580                 /* VSYNC End */
581                 if (ldintr & LDINTR_VES)
582                         complete(&ch->vsync_completion);
583         }
584
585         return IRQ_HANDLED;
586 }
587
588 static int sh_mobile_wait_for_vsync(struct sh_mobile_lcdc_chan *ch)
589 {
590         unsigned long ldintr;
591         int ret;
592
593         /* Enable VSync End interrupt and be careful not to acknowledge any
594          * pending interrupt.
595          */
596         ldintr = lcdc_read(ch->lcdc, _LDINTR);
597         ldintr |= LDINTR_VEE | LDINTR_STATUS_MASK;
598         lcdc_write(ch->lcdc, _LDINTR, ldintr);
599
600         ret = wait_for_completion_interruptible_timeout(&ch->vsync_completion,
601                                                         msecs_to_jiffies(100));
602         if (!ret)
603                 return -ETIMEDOUT;
604
605         return 0;
606 }
607
608 static void sh_mobile_lcdc_start_stop(struct sh_mobile_lcdc_priv *priv,
609                                       int start)
610 {
611         unsigned long tmp = lcdc_read(priv, _LDCNT2R);
612         int k;
613
614         /* start or stop the lcdc */
615         if (start)
616                 lcdc_write(priv, _LDCNT2R, tmp | LDCNT2R_DO);
617         else
618                 lcdc_write(priv, _LDCNT2R, tmp & ~LDCNT2R_DO);
619
620         /* wait until power is applied/stopped on all channels */
621         for (k = 0; k < ARRAY_SIZE(priv->ch); k++)
622                 if (lcdc_read(priv, _LDCNT2R) & priv->ch[k].enabled)
623                         while (1) {
624                                 tmp = lcdc_read_chan(&priv->ch[k], LDPMR)
625                                     & LDPMR_LPS;
626                                 if (start && tmp == LDPMR_LPS)
627                                         break;
628                                 if (!start && tmp == 0)
629                                         break;
630                                 cpu_relax();
631                         }
632
633         if (!start)
634                 lcdc_write(priv, _LDDCKSTPR, 1); /* stop dotclock */
635 }
636
637 static void sh_mobile_lcdc_geometry(struct sh_mobile_lcdc_chan *ch)
638 {
639         const struct fb_var_screeninfo *var = &ch->info->var;
640         const struct fb_videomode *mode = &ch->display.mode;
641         unsigned long h_total, hsync_pos, display_h_total;
642         u32 tmp;
643
644         tmp = ch->ldmt1r_value;
645         tmp |= (var->sync & FB_SYNC_VERT_HIGH_ACT) ? 0 : LDMT1R_VPOL;
646         tmp |= (var->sync & FB_SYNC_HOR_HIGH_ACT) ? 0 : LDMT1R_HPOL;
647         tmp |= (ch->cfg->flags & LCDC_FLAGS_DWPOL) ? LDMT1R_DWPOL : 0;
648         tmp |= (ch->cfg->flags & LCDC_FLAGS_DIPOL) ? LDMT1R_DIPOL : 0;
649         tmp |= (ch->cfg->flags & LCDC_FLAGS_DAPOL) ? LDMT1R_DAPOL : 0;
650         tmp |= (ch->cfg->flags & LCDC_FLAGS_HSCNT) ? LDMT1R_HSCNT : 0;
651         tmp |= (ch->cfg->flags & LCDC_FLAGS_DWCNT) ? LDMT1R_DWCNT : 0;
652         lcdc_write_chan(ch, LDMT1R, tmp);
653
654         /* setup SYS bus */
655         lcdc_write_chan(ch, LDMT2R, ch->cfg->sys_bus_cfg.ldmt2r);
656         lcdc_write_chan(ch, LDMT3R, ch->cfg->sys_bus_cfg.ldmt3r);
657
658         /* horizontal configuration */
659         h_total = mode->xres + mode->hsync_len + mode->left_margin
660                 + mode->right_margin;
661         tmp = h_total / 8; /* HTCN */
662         tmp |= (min(mode->xres, ch->xres) / 8) << 16; /* HDCN */
663         lcdc_write_chan(ch, LDHCNR, tmp);
664
665         hsync_pos = mode->xres + mode->right_margin;
666         tmp = hsync_pos / 8; /* HSYNP */
667         tmp |= (mode->hsync_len / 8) << 16; /* HSYNW */
668         lcdc_write_chan(ch, LDHSYNR, tmp);
669
670         /* vertical configuration */
671         tmp = mode->yres + mode->vsync_len + mode->upper_margin
672             + mode->lower_margin; /* VTLN */
673         tmp |= min(mode->yres, ch->yres) << 16; /* VDLN */
674         lcdc_write_chan(ch, LDVLNR, tmp);
675
676         tmp = mode->yres + mode->lower_margin; /* VSYNP */
677         tmp |= mode->vsync_len << 16; /* VSYNW */
678         lcdc_write_chan(ch, LDVSYNR, tmp);
679
680         /* Adjust horizontal synchronisation for HDMI */
681         display_h_total = mode->xres + mode->hsync_len + mode->left_margin
682                         + mode->right_margin;
683         tmp = ((mode->xres & 7) << 24) | ((display_h_total & 7) << 16)
684             | ((mode->hsync_len & 7) << 8) | (hsync_pos & 7);
685         lcdc_write_chan(ch, LDHAJR, tmp);
686 }
687
688 /*
689  * __sh_mobile_lcdc_start - Configure and tart the LCDC
690  * @priv: LCDC device
691  *
692  * Configure all enabled channels and start the LCDC device. All external
693  * devices (clocks, MERAM, panels, ...) are not touched by this function.
694  */
695 static void __sh_mobile_lcdc_start(struct sh_mobile_lcdc_priv *priv)
696 {
697         struct sh_mobile_lcdc_chan *ch;
698         unsigned long tmp;
699         int k, m;
700
701         /* Enable LCDC channels. Read data from external memory, avoid using the
702          * BEU for now.
703          */
704         lcdc_write(priv, _LDCNT2R, priv->ch[0].enabled | priv->ch[1].enabled);
705
706         /* Stop the LCDC first and disable all interrupts. */
707         sh_mobile_lcdc_start_stop(priv, 0);
708         lcdc_write(priv, _LDINTR, 0);
709
710         /* Configure power supply, dot clocks and start them. */
711         tmp = priv->lddckr;
712         for (k = 0; k < ARRAY_SIZE(priv->ch); k++) {
713                 ch = &priv->ch[k];
714                 if (!ch->enabled)
715                         continue;
716
717                 /* Power supply */
718                 lcdc_write_chan(ch, LDPMR, 0);
719
720                 m = ch->cfg->clock_divider;
721                 if (!m)
722                         continue;
723
724                 /* FIXME: sh7724 can only use 42, 48, 54 and 60 for the divider
725                  * denominator.
726                  */
727                 lcdc_write_chan(ch, LDDCKPAT1R, 0);
728                 lcdc_write_chan(ch, LDDCKPAT2R, (1 << (m/2)) - 1);
729
730                 if (m == 1)
731                         m = LDDCKR_MOSEL;
732                 tmp |= m << (lcdc_chan_is_sublcd(ch) ? 8 : 0);
733         }
734
735         lcdc_write(priv, _LDDCKR, tmp);
736         lcdc_write(priv, _LDDCKSTPR, 0);
737         lcdc_wait_bit(priv, _LDDCKSTPR, ~0, 0);
738
739         /* Setup geometry, format, frame buffer memory and operation mode. */
740         for (k = 0; k < ARRAY_SIZE(priv->ch); k++) {
741                 ch = &priv->ch[k];
742                 if (!ch->enabled)
743                         continue;
744
745                 sh_mobile_lcdc_geometry(ch);
746
747                 tmp = ch->format->lddfr;
748
749                 if (ch->format->yuv) {
750                         switch (ch->colorspace) {
751                         case V4L2_COLORSPACE_REC709:
752                                 tmp |= LDDFR_CF1;
753                                 break;
754                         case V4L2_COLORSPACE_JPEG:
755                                 tmp |= LDDFR_CF0;
756                                 break;
757                         }
758                 }
759
760                 lcdc_write_chan(ch, LDDFR, tmp);
761                 lcdc_write_chan(ch, LDMLSR, ch->line_size);
762                 lcdc_write_chan(ch, LDSA1R, ch->base_addr_y);
763                 if (ch->format->yuv)
764                         lcdc_write_chan(ch, LDSA2R, ch->base_addr_c);
765
766                 /* When using deferred I/O mode, configure the LCDC for one-shot
767                  * operation and enable the frame end interrupt. Otherwise use
768                  * continuous read mode.
769                  */
770                 if (ch->ldmt1r_value & LDMT1R_IFM &&
771                     ch->cfg->sys_bus_cfg.deferred_io_msec) {
772                         lcdc_write_chan(ch, LDSM1R, LDSM1R_OS);
773                         lcdc_write(priv, _LDINTR, LDINTR_FE);
774                 } else {
775                         lcdc_write_chan(ch, LDSM1R, 0);
776                 }
777         }
778
779         /* Word and long word swap. */
780         switch (priv->ch[0].format->fourcc) {
781         case V4L2_PIX_FMT_RGB565:
782         case V4L2_PIX_FMT_NV21:
783         case V4L2_PIX_FMT_NV61:
784         case V4L2_PIX_FMT_NV42:
785                 tmp = LDDDSR_LS | LDDDSR_WS;
786                 break;
787         case V4L2_PIX_FMT_BGR24:
788         case V4L2_PIX_FMT_NV12:
789         case V4L2_PIX_FMT_NV16:
790         case V4L2_PIX_FMT_NV24:
791                 tmp = LDDDSR_LS | LDDDSR_WS | LDDDSR_BS;
792                 break;
793         case V4L2_PIX_FMT_BGR32:
794         default:
795                 tmp = LDDDSR_LS;
796                 break;
797         }
798         lcdc_write(priv, _LDDDSR, tmp);
799
800         /* Enable the display output. */
801         lcdc_write(priv, _LDCNT1R, LDCNT1R_DE);
802         sh_mobile_lcdc_start_stop(priv, 1);
803         priv->started = 1;
804 }
805
806 static int sh_mobile_lcdc_start(struct sh_mobile_lcdc_priv *priv)
807 {
808         struct sh_mobile_meram_info *mdev = priv->meram_dev;
809         struct sh_mobile_lcdc_chan *ch;
810         unsigned long tmp;
811         int ret;
812         int k;
813
814         /* enable clocks before accessing the hardware */
815         for (k = 0; k < ARRAY_SIZE(priv->ch); k++) {
816                 if (priv->ch[k].enabled)
817                         sh_mobile_lcdc_clk_on(priv);
818         }
819
820         /* reset */
821         lcdc_write(priv, _LDCNT2R, lcdc_read(priv, _LDCNT2R) | LDCNT2R_BR);
822         lcdc_wait_bit(priv, _LDCNT2R, LDCNT2R_BR, 0);
823
824         for (k = 0; k < ARRAY_SIZE(priv->ch); k++) {
825                 const struct sh_mobile_lcdc_panel_cfg *panel;
826
827                 ch = &priv->ch[k];
828                 if (!ch->enabled)
829                         continue;
830
831                 panel = &ch->cfg->panel_cfg;
832                 if (panel->setup_sys) {
833                         ret = panel->setup_sys(ch, &sh_mobile_lcdc_sys_bus_ops);
834                         if (ret)
835                                 return ret;
836                 }
837         }
838
839         /* Compute frame buffer base address and pitch for each channel. */
840         for (k = 0; k < ARRAY_SIZE(priv->ch); k++) {
841                 int pixelformat;
842                 void *meram;
843
844                 ch = &priv->ch[k];
845                 if (!ch->enabled)
846                         continue;
847
848                 ch->base_addr_y = ch->dma_handle;
849                 ch->base_addr_c = ch->base_addr_y + ch->xres * ch->yres_virtual;
850                 ch->line_size = ch->pitch;
851
852                 /* Enable MERAM if possible. */
853                 if (mdev == NULL || mdev->ops == NULL ||
854                     ch->cfg->meram_cfg == NULL)
855                         continue;
856
857                 /* we need to de-init configured ICBs before we can
858                  * re-initialize them.
859                  */
860                 if (ch->meram) {
861                         mdev->ops->meram_unregister(mdev, ch->meram);
862                         ch->meram = NULL;
863                 }
864
865                 switch (ch->format->fourcc) {
866                 case V4L2_PIX_FMT_NV12:
867                 case V4L2_PIX_FMT_NV21:
868                 case V4L2_PIX_FMT_NV16:
869                 case V4L2_PIX_FMT_NV61:
870                         pixelformat = SH_MOBILE_MERAM_PF_NV;
871                         break;
872                 case V4L2_PIX_FMT_NV24:
873                 case V4L2_PIX_FMT_NV42:
874                         pixelformat = SH_MOBILE_MERAM_PF_NV24;
875                         break;
876                 case V4L2_PIX_FMT_RGB565:
877                 case V4L2_PIX_FMT_BGR24:
878                 case V4L2_PIX_FMT_BGR32:
879                 default:
880                         pixelformat = SH_MOBILE_MERAM_PF_RGB;
881                         break;
882                 }
883
884                 meram = mdev->ops->meram_register(mdev, ch->cfg->meram_cfg,
885                                         ch->pitch, ch->yres, pixelformat,
886                                         &ch->line_size);
887                 if (!IS_ERR(meram)) {
888                         mdev->ops->meram_update(mdev, meram,
889                                         ch->base_addr_y, ch->base_addr_c,
890                                         &ch->base_addr_y, &ch->base_addr_c);
891                         ch->meram = meram;
892                 }
893         }
894
895         /* Start the LCDC. */
896         __sh_mobile_lcdc_start(priv);
897
898         /* Setup deferred I/O, tell the board code to enable the panels, and
899          * turn backlight on.
900          */
901         for (k = 0; k < ARRAY_SIZE(priv->ch); k++) {
902                 ch = &priv->ch[k];
903                 if (!ch->enabled)
904                         continue;
905
906                 tmp = ch->cfg->sys_bus_cfg.deferred_io_msec;
907                 if (ch->ldmt1r_value & LDMT1R_IFM && tmp) {
908                         ch->defio.deferred_io = sh_mobile_lcdc_deferred_io;
909                         ch->defio.delay = msecs_to_jiffies(tmp);
910                         ch->info->fbdefio = &ch->defio;
911                         fb_deferred_io_init(ch->info);
912                 }
913
914                 sh_mobile_lcdc_display_on(ch);
915
916                 if (ch->bl) {
917                         ch->bl->props.power = FB_BLANK_UNBLANK;
918                         backlight_update_status(ch->bl);
919                 }
920         }
921
922         return 0;
923 }
924
925 static void sh_mobile_lcdc_stop(struct sh_mobile_lcdc_priv *priv)
926 {
927         struct sh_mobile_lcdc_chan *ch;
928         int k;
929
930         /* clean up deferred io and ask board code to disable panel */
931         for (k = 0; k < ARRAY_SIZE(priv->ch); k++) {
932                 ch = &priv->ch[k];
933                 if (!ch->enabled)
934                         continue;
935
936                 /* deferred io mode:
937                  * flush frame, and wait for frame end interrupt
938                  * clean up deferred io and enable clock
939                  */
940                 if (ch->info && ch->info->fbdefio) {
941                         ch->frame_end = 0;
942                         schedule_delayed_work(&ch->info->deferred_work, 0);
943                         wait_event(ch->frame_end_wait, ch->frame_end);
944                         fb_deferred_io_cleanup(ch->info);
945                         ch->info->fbdefio = NULL;
946                         sh_mobile_lcdc_clk_on(priv);
947                 }
948
949                 if (ch->bl) {
950                         ch->bl->props.power = FB_BLANK_POWERDOWN;
951                         backlight_update_status(ch->bl);
952                 }
953
954                 sh_mobile_lcdc_display_off(ch);
955
956                 /* disable the meram */
957                 if (ch->meram) {
958                         struct sh_mobile_meram_info *mdev;
959                         mdev = priv->meram_dev;
960                         mdev->ops->meram_unregister(mdev, ch->meram);
961                         ch->meram = 0;
962                 }
963
964         }
965
966         /* stop the lcdc */
967         if (priv->started) {
968                 sh_mobile_lcdc_start_stop(priv, 0);
969                 priv->started = 0;
970         }
971
972         /* stop clocks */
973         for (k = 0; k < ARRAY_SIZE(priv->ch); k++)
974                 if (priv->ch[k].enabled)
975                         sh_mobile_lcdc_clk_off(priv);
976 }
977
978 /* -----------------------------------------------------------------------------
979  * Frame buffer operations
980  */
981
982 static int sh_mobile_lcdc_setcolreg(u_int regno,
983                                     u_int red, u_int green, u_int blue,
984                                     u_int transp, struct fb_info *info)
985 {
986         u32 *palette = info->pseudo_palette;
987
988         if (regno >= PALETTE_NR)
989                 return -EINVAL;
990
991         /* only FB_VISUAL_TRUECOLOR supported */
992
993         red >>= 16 - info->var.red.length;
994         green >>= 16 - info->var.green.length;
995         blue >>= 16 - info->var.blue.length;
996         transp >>= 16 - info->var.transp.length;
997
998         palette[regno] = (red << info->var.red.offset) |
999           (green << info->var.green.offset) |
1000           (blue << info->var.blue.offset) |
1001           (transp << info->var.transp.offset);
1002
1003         return 0;
1004 }
1005
1006 static struct fb_fix_screeninfo sh_mobile_lcdc_fix  = {
1007         .id =           "SH Mobile LCDC",
1008         .type =         FB_TYPE_PACKED_PIXELS,
1009         .visual =       FB_VISUAL_TRUECOLOR,
1010         .accel =        FB_ACCEL_NONE,
1011         .xpanstep =     0,
1012         .ypanstep =     1,
1013         .ywrapstep =    0,
1014         .capabilities = FB_CAP_FOURCC,
1015 };
1016
1017 static void sh_mobile_lcdc_fillrect(struct fb_info *info,
1018                                     const struct fb_fillrect *rect)
1019 {
1020         sys_fillrect(info, rect);
1021         sh_mobile_lcdc_deferred_io_touch(info);
1022 }
1023
1024 static void sh_mobile_lcdc_copyarea(struct fb_info *info,
1025                                     const struct fb_copyarea *area)
1026 {
1027         sys_copyarea(info, area);
1028         sh_mobile_lcdc_deferred_io_touch(info);
1029 }
1030
1031 static void sh_mobile_lcdc_imageblit(struct fb_info *info,
1032                                      const struct fb_image *image)
1033 {
1034         sys_imageblit(info, image);
1035         sh_mobile_lcdc_deferred_io_touch(info);
1036 }
1037
1038 static int sh_mobile_fb_pan_display(struct fb_var_screeninfo *var,
1039                                      struct fb_info *info)
1040 {
1041         struct sh_mobile_lcdc_chan *ch = info->par;
1042         struct sh_mobile_lcdc_priv *priv = ch->lcdc;
1043         unsigned long ldrcntr;
1044         unsigned long new_pan_offset;
1045         unsigned long base_addr_y, base_addr_c;
1046         unsigned long c_offset;
1047
1048         if (!ch->format->yuv)
1049                 new_pan_offset = var->yoffset * ch->pitch
1050                                + var->xoffset * (ch->format->bpp / 8);
1051         else
1052                 new_pan_offset = var->yoffset * ch->pitch + var->xoffset;
1053
1054         if (new_pan_offset == ch->pan_offset)
1055                 return 0;       /* No change, do nothing */
1056
1057         ldrcntr = lcdc_read(priv, _LDRCNTR);
1058
1059         /* Set the source address for the next refresh */
1060         base_addr_y = ch->dma_handle + new_pan_offset;
1061         if (ch->format->yuv) {
1062                 /* Set y offset */
1063                 c_offset = var->yoffset * ch->pitch
1064                          * (ch->format->bpp - 8) / 8;
1065                 base_addr_c = ch->dma_handle + ch->xres * ch->yres_virtual
1066                             + c_offset;
1067                 /* Set x offset */
1068                 if (ch->format->fourcc == V4L2_PIX_FMT_NV24)
1069                         base_addr_c += 2 * var->xoffset;
1070                 else
1071                         base_addr_c += var->xoffset;
1072         }
1073
1074         if (ch->meram) {
1075                 struct sh_mobile_meram_info *mdev;
1076
1077                 mdev = priv->meram_dev;
1078                 mdev->ops->meram_update(mdev, ch->meram,
1079                                         base_addr_y, base_addr_c,
1080                                         &base_addr_y, &base_addr_c);
1081         }
1082
1083         ch->base_addr_y = base_addr_y;
1084         ch->base_addr_c = base_addr_c;
1085
1086         lcdc_write_chan_mirror(ch, LDSA1R, base_addr_y);
1087         if (ch->format->yuv)
1088                 lcdc_write_chan_mirror(ch, LDSA2R, base_addr_c);
1089
1090         if (lcdc_chan_is_sublcd(ch))
1091                 lcdc_write(ch->lcdc, _LDRCNTR, ldrcntr ^ LDRCNTR_SRS);
1092         else
1093                 lcdc_write(ch->lcdc, _LDRCNTR, ldrcntr ^ LDRCNTR_MRS);
1094
1095         ch->pan_offset = new_pan_offset;
1096
1097         sh_mobile_lcdc_deferred_io_touch(info);
1098
1099         return 0;
1100 }
1101
1102 static int sh_mobile_ioctl(struct fb_info *info, unsigned int cmd,
1103                        unsigned long arg)
1104 {
1105         int retval;
1106
1107         switch (cmd) {
1108         case FBIO_WAITFORVSYNC:
1109                 retval = sh_mobile_wait_for_vsync(info->par);
1110                 break;
1111
1112         default:
1113                 retval = -ENOIOCTLCMD;
1114                 break;
1115         }
1116         return retval;
1117 }
1118
1119 static void sh_mobile_fb_reconfig(struct fb_info *info)
1120 {
1121         struct sh_mobile_lcdc_chan *ch = info->par;
1122         struct fb_var_screeninfo var;
1123         struct fb_videomode mode;
1124         struct fb_event event;
1125         int evnt = FB_EVENT_MODE_CHANGE_ALL;
1126
1127         if (ch->use_count > 1 || (ch->use_count == 1 && !info->fbcon_par))
1128                 /* More framebuffer users are active */
1129                 return;
1130
1131         fb_var_to_videomode(&mode, &info->var);
1132
1133         if (fb_mode_is_equal(&ch->display.mode, &mode))
1134                 return;
1135
1136         /* Display has been re-plugged, framebuffer is free now, reconfigure */
1137         var = info->var;
1138         fb_videomode_to_var(&var, &ch->display.mode);
1139         var.width = ch->display.width;
1140         var.height = ch->display.height;
1141         var.activate = FB_ACTIVATE_NOW;
1142
1143         if (fb_set_var(info, &var) < 0)
1144                 /* Couldn't reconfigure, hopefully, can continue as before */
1145                 return;
1146
1147         /*
1148          * fb_set_var() calls the notifier change internally, only if
1149          * FBINFO_MISC_USEREVENT flag is set. Since we do not want to fake a
1150          * user event, we have to call the chain ourselves.
1151          */
1152         event.info = info;
1153         event.data = &ch->display.mode;
1154         fb_notifier_call_chain(evnt, &event);
1155 }
1156
1157 /*
1158  * Locking: both .fb_release() and .fb_open() are called with info->lock held if
1159  * user == 1, or with console sem held, if user == 0.
1160  */
1161 static int sh_mobile_release(struct fb_info *info, int user)
1162 {
1163         struct sh_mobile_lcdc_chan *ch = info->par;
1164
1165         mutex_lock(&ch->open_lock);
1166         dev_dbg(info->dev, "%s(): %d users\n", __func__, ch->use_count);
1167
1168         ch->use_count--;
1169
1170         /* Nothing to reconfigure, when called from fbcon */
1171         if (user) {
1172                 console_lock();
1173                 sh_mobile_fb_reconfig(info);
1174                 console_unlock();
1175         }
1176
1177         mutex_unlock(&ch->open_lock);
1178
1179         return 0;
1180 }
1181
1182 static int sh_mobile_open(struct fb_info *info, int user)
1183 {
1184         struct sh_mobile_lcdc_chan *ch = info->par;
1185
1186         mutex_lock(&ch->open_lock);
1187         ch->use_count++;
1188
1189         dev_dbg(info->dev, "%s(): %d users\n", __func__, ch->use_count);
1190         mutex_unlock(&ch->open_lock);
1191
1192         return 0;
1193 }
1194
1195 static int sh_mobile_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
1196 {
1197         struct sh_mobile_lcdc_chan *ch = info->par;
1198         struct sh_mobile_lcdc_priv *p = ch->lcdc;
1199         unsigned int best_dist = (unsigned int)-1;
1200         unsigned int best_xres = 0;
1201         unsigned int best_yres = 0;
1202         unsigned int i;
1203
1204         if (var->xres > MAX_XRES || var->yres > MAX_YRES)
1205                 return -EINVAL;
1206
1207         /* If board code provides us with a list of available modes, make sure
1208          * we use one of them. Find the mode closest to the requested one. The
1209          * distance between two modes is defined as the size of the
1210          * non-overlapping parts of the two rectangles.
1211          */
1212         for (i = 0; i < ch->cfg->num_modes; ++i) {
1213                 const struct fb_videomode *mode = &ch->cfg->lcd_modes[i];
1214                 unsigned int dist;
1215
1216                 /* We can only round up. */
1217                 if (var->xres > mode->xres || var->yres > mode->yres)
1218                         continue;
1219
1220                 dist = var->xres * var->yres + mode->xres * mode->yres
1221                      - 2 * min(var->xres, mode->xres)
1222                          * min(var->yres, mode->yres);
1223
1224                 if (dist < best_dist) {
1225                         best_xres = mode->xres;
1226                         best_yres = mode->yres;
1227                         best_dist = dist;
1228                 }
1229         }
1230
1231         /* If no available mode can be used, return an error. */
1232         if (ch->cfg->num_modes != 0) {
1233                 if (best_dist == (unsigned int)-1)
1234                         return -EINVAL;
1235
1236                 var->xres = best_xres;
1237                 var->yres = best_yres;
1238         }
1239
1240         /* Make sure the virtual resolution is at least as big as the visible
1241          * resolution.
1242          */
1243         if (var->xres_virtual < var->xres)
1244                 var->xres_virtual = var->xres;
1245         if (var->yres_virtual < var->yres)
1246                 var->yres_virtual = var->yres;
1247
1248         if (sh_mobile_format_is_fourcc(var)) {
1249                 const struct sh_mobile_lcdc_format_info *format;
1250
1251                 format = sh_mobile_format_info(var->grayscale);
1252                 if (format == NULL)
1253                         return -EINVAL;
1254                 var->bits_per_pixel = format->bpp;
1255
1256                 /* Default to RGB and JPEG color-spaces for RGB and YUV formats
1257                  * respectively.
1258                  */
1259                 if (!format->yuv)
1260                         var->colorspace = V4L2_COLORSPACE_SRGB;
1261                 else if (var->colorspace != V4L2_COLORSPACE_REC709)
1262                         var->colorspace = V4L2_COLORSPACE_JPEG;
1263         } else {
1264                 if (var->bits_per_pixel <= 16) {                /* RGB 565 */
1265                         var->bits_per_pixel = 16;
1266                         var->red.offset = 11;
1267                         var->red.length = 5;
1268                         var->green.offset = 5;
1269                         var->green.length = 6;
1270                         var->blue.offset = 0;
1271                         var->blue.length = 5;
1272                         var->transp.offset = 0;
1273                         var->transp.length = 0;
1274                 } else if (var->bits_per_pixel <= 24) {         /* RGB 888 */
1275                         var->bits_per_pixel = 24;
1276                         var->red.offset = 16;
1277                         var->red.length = 8;
1278                         var->green.offset = 8;
1279                         var->green.length = 8;
1280                         var->blue.offset = 0;
1281                         var->blue.length = 8;
1282                         var->transp.offset = 0;
1283                         var->transp.length = 0;
1284                 } else if (var->bits_per_pixel <= 32) {         /* RGBA 888 */
1285                         var->bits_per_pixel = 32;
1286                         var->red.offset = 16;
1287                         var->red.length = 8;
1288                         var->green.offset = 8;
1289                         var->green.length = 8;
1290                         var->blue.offset = 0;
1291                         var->blue.length = 8;
1292                         var->transp.offset = 24;
1293                         var->transp.length = 8;
1294                 } else
1295                         return -EINVAL;
1296
1297                 var->red.msb_right = 0;
1298                 var->green.msb_right = 0;
1299                 var->blue.msb_right = 0;
1300                 var->transp.msb_right = 0;
1301         }
1302
1303         /* Make sure we don't exceed our allocated memory. */
1304         if (var->xres_virtual * var->yres_virtual * var->bits_per_pixel / 8 >
1305             info->fix.smem_len)
1306                 return -EINVAL;
1307
1308         /* only accept the forced_fourcc for dual channel configurations */
1309         if (p->forced_fourcc &&
1310             p->forced_fourcc != sh_mobile_format_fourcc(var))
1311                 return -EINVAL;
1312
1313         return 0;
1314 }
1315
1316 static int sh_mobile_set_par(struct fb_info *info)
1317 {
1318         struct sh_mobile_lcdc_chan *ch = info->par;
1319         int ret;
1320
1321         sh_mobile_lcdc_stop(ch->lcdc);
1322
1323         ch->format = sh_mobile_format_info(sh_mobile_format_fourcc(&info->var));
1324         ch->colorspace = info->var.colorspace;
1325
1326         ch->xres = info->var.xres;
1327         ch->xres_virtual = info->var.xres_virtual;
1328         ch->yres = info->var.yres;
1329         ch->yres_virtual = info->var.yres_virtual;
1330
1331         if (ch->format->yuv)
1332                 ch->pitch = info->var.xres;
1333         else
1334                 ch->pitch = info->var.xres * ch->format->bpp / 8;
1335
1336         ret = sh_mobile_lcdc_start(ch->lcdc);
1337         if (ret < 0)
1338                 dev_err(info->dev, "%s: unable to restart LCDC\n", __func__);
1339
1340         info->fix.line_length = ch->pitch;
1341
1342         if (sh_mobile_format_is_fourcc(&info->var)) {
1343                 info->fix.type = FB_TYPE_FOURCC;
1344                 info->fix.visual = FB_VISUAL_FOURCC;
1345         } else {
1346                 info->fix.type = FB_TYPE_PACKED_PIXELS;
1347                 info->fix.visual = FB_VISUAL_TRUECOLOR;
1348         }
1349
1350         return ret;
1351 }
1352
1353 /*
1354  * Screen blanking. Behavior is as follows:
1355  * FB_BLANK_UNBLANK: screen unblanked, clocks enabled
1356  * FB_BLANK_NORMAL: screen blanked, clocks enabled
1357  * FB_BLANK_VSYNC,
1358  * FB_BLANK_HSYNC,
1359  * FB_BLANK_POWEROFF: screen blanked, clocks disabled
1360  */
1361 static int sh_mobile_lcdc_blank(int blank, struct fb_info *info)
1362 {
1363         struct sh_mobile_lcdc_chan *ch = info->par;
1364         struct sh_mobile_lcdc_priv *p = ch->lcdc;
1365
1366         /* blank the screen? */
1367         if (blank > FB_BLANK_UNBLANK && ch->blank_status == FB_BLANK_UNBLANK) {
1368                 struct fb_fillrect rect = {
1369                         .width = ch->xres,
1370                         .height = ch->yres,
1371                 };
1372                 sh_mobile_lcdc_fillrect(info, &rect);
1373         }
1374         /* turn clocks on? */
1375         if (blank <= FB_BLANK_NORMAL && ch->blank_status > FB_BLANK_NORMAL) {
1376                 sh_mobile_lcdc_clk_on(p);
1377         }
1378         /* turn clocks off? */
1379         if (blank > FB_BLANK_NORMAL && ch->blank_status <= FB_BLANK_NORMAL) {
1380                 /* make sure the screen is updated with the black fill before
1381                  * switching the clocks off. one vsync is not enough since
1382                  * blanking may occur in the middle of a refresh. deferred io
1383                  * mode will reenable the clocks and update the screen in time,
1384                  * so it does not need this. */
1385                 if (!info->fbdefio) {
1386                         sh_mobile_wait_for_vsync(ch);
1387                         sh_mobile_wait_for_vsync(ch);
1388                 }
1389                 sh_mobile_lcdc_clk_off(p);
1390         }
1391
1392         ch->blank_status = blank;
1393         return 0;
1394 }
1395
1396 static struct fb_ops sh_mobile_lcdc_ops = {
1397         .owner          = THIS_MODULE,
1398         .fb_setcolreg   = sh_mobile_lcdc_setcolreg,
1399         .fb_read        = fb_sys_read,
1400         .fb_write       = fb_sys_write,
1401         .fb_fillrect    = sh_mobile_lcdc_fillrect,
1402         .fb_copyarea    = sh_mobile_lcdc_copyarea,
1403         .fb_imageblit   = sh_mobile_lcdc_imageblit,
1404         .fb_blank       = sh_mobile_lcdc_blank,
1405         .fb_pan_display = sh_mobile_fb_pan_display,
1406         .fb_ioctl       = sh_mobile_ioctl,
1407         .fb_open        = sh_mobile_open,
1408         .fb_release     = sh_mobile_release,
1409         .fb_check_var   = sh_mobile_check_var,
1410         .fb_set_par     = sh_mobile_set_par,
1411 };
1412
1413 static void
1414 sh_mobile_lcdc_channel_fb_unregister(struct sh_mobile_lcdc_chan *ch)
1415 {
1416         if (ch->info && ch->info->dev)
1417                 unregister_framebuffer(ch->info);
1418 }
1419
1420 static int __devinit
1421 sh_mobile_lcdc_channel_fb_register(struct sh_mobile_lcdc_chan *ch)
1422 {
1423         struct fb_info *info = ch->info;
1424         int ret;
1425
1426         if (info->fbdefio) {
1427                 ch->sglist = vmalloc(sizeof(struct scatterlist) *
1428                                      ch->fb_size >> PAGE_SHIFT);
1429                 if (!ch->sglist) {
1430                         dev_err(ch->lcdc->dev, "cannot allocate sglist\n");
1431                         return -ENOMEM;
1432                 }
1433         }
1434
1435         info->bl_dev = ch->bl;
1436
1437         ret = register_framebuffer(info);
1438         if (ret < 0)
1439                 return ret;
1440
1441         dev_info(ch->lcdc->dev, "registered %s/%s as %dx%d %dbpp.\n",
1442                  dev_name(ch->lcdc->dev), (ch->cfg->chan == LCDC_CHAN_MAINLCD) ?
1443                  "mainlcd" : "sublcd", info->var.xres, info->var.yres,
1444                  info->var.bits_per_pixel);
1445
1446         /* deferred io mode: disable clock to save power */
1447         if (info->fbdefio || info->state == FBINFO_STATE_SUSPENDED)
1448                 sh_mobile_lcdc_clk_off(ch->lcdc);
1449
1450         return ret;
1451 }
1452
1453 static void
1454 sh_mobile_lcdc_channel_fb_cleanup(struct sh_mobile_lcdc_chan *ch)
1455 {
1456         struct fb_info *info = ch->info;
1457
1458         if (!info || !info->device)
1459                 return;
1460
1461         if (ch->sglist)
1462                 vfree(ch->sglist);
1463
1464         fb_dealloc_cmap(&info->cmap);
1465         framebuffer_release(info);
1466 }
1467
1468 static int __devinit
1469 sh_mobile_lcdc_channel_fb_init(struct sh_mobile_lcdc_chan *ch,
1470                                const struct fb_videomode *mode,
1471                                unsigned int num_modes)
1472 {
1473         struct sh_mobile_lcdc_priv *priv = ch->lcdc;
1474         struct fb_var_screeninfo *var;
1475         struct fb_info *info;
1476         int ret;
1477
1478         /* Allocate and initialize the frame buffer device. Create the modes
1479          * list and allocate the color map.
1480          */
1481         info = framebuffer_alloc(0, priv->dev);
1482         if (info == NULL) {
1483                 dev_err(priv->dev, "unable to allocate fb_info\n");
1484                 return -ENOMEM;
1485         }
1486
1487         ch->info = info;
1488
1489         info->flags = FBINFO_FLAG_DEFAULT;
1490         info->fbops = &sh_mobile_lcdc_ops;
1491         info->device = priv->dev;
1492         info->screen_base = ch->fb_mem;
1493         info->pseudo_palette = &ch->pseudo_palette;
1494         info->par = ch;
1495
1496         fb_videomode_to_modelist(mode, num_modes, &info->modelist);
1497
1498         ret = fb_alloc_cmap(&info->cmap, PALETTE_NR, 0);
1499         if (ret < 0) {
1500                 dev_err(priv->dev, "unable to allocate cmap\n");
1501                 return ret;
1502         }
1503
1504         /* Initialize fixed screen information. Restrict pan to 2 lines steps
1505          * for NV12 and NV21.
1506          */
1507         info->fix = sh_mobile_lcdc_fix;
1508         info->fix.smem_start = ch->dma_handle;
1509         info->fix.smem_len = ch->fb_size;
1510         info->fix.line_length = ch->pitch;
1511
1512         if (ch->format->yuv)
1513                 info->fix.visual = FB_VISUAL_FOURCC;
1514         else
1515                 info->fix.visual = FB_VISUAL_TRUECOLOR;
1516
1517         if (ch->format->fourcc == V4L2_PIX_FMT_NV12 ||
1518             ch->format->fourcc == V4L2_PIX_FMT_NV21)
1519                 info->fix.ypanstep = 2;
1520
1521         /* Initialize variable screen information using the first mode as
1522          * default. The default Y virtual resolution is twice the panel size to
1523          * allow for double-buffering.
1524          */
1525         var = &info->var;
1526         fb_videomode_to_var(var, mode);
1527         var->width = ch->cfg->panel_cfg.width;
1528         var->height = ch->cfg->panel_cfg.height;
1529         var->yres_virtual = var->yres * 2;
1530         var->activate = FB_ACTIVATE_NOW;
1531
1532         /* Use the legacy API by default for RGB formats, and the FOURCC API
1533          * for YUV formats.
1534          */
1535         if (!ch->format->yuv)
1536                 var->bits_per_pixel = ch->format->bpp;
1537         else
1538                 var->grayscale = ch->format->fourcc;
1539
1540         ret = sh_mobile_check_var(var, info);
1541         if (ret)
1542                 return ret;
1543
1544         return 0;
1545 }
1546
1547 /* -----------------------------------------------------------------------------
1548  * Backlight
1549  */
1550
1551 static int sh_mobile_lcdc_update_bl(struct backlight_device *bdev)
1552 {
1553         struct sh_mobile_lcdc_chan *ch = bl_get_data(bdev);
1554         int brightness = bdev->props.brightness;
1555
1556         if (bdev->props.power != FB_BLANK_UNBLANK ||
1557             bdev->props.state & (BL_CORE_SUSPENDED | BL_CORE_FBBLANK))
1558                 brightness = 0;
1559
1560         return ch->cfg->bl_info.set_brightness(brightness);
1561 }
1562
1563 static int sh_mobile_lcdc_get_brightness(struct backlight_device *bdev)
1564 {
1565         struct sh_mobile_lcdc_chan *ch = bl_get_data(bdev);
1566
1567         return ch->cfg->bl_info.get_brightness();
1568 }
1569
1570 static int sh_mobile_lcdc_check_fb(struct backlight_device *bdev,
1571                                    struct fb_info *info)
1572 {
1573         return (info->bl_dev == bdev);
1574 }
1575
1576 static struct backlight_ops sh_mobile_lcdc_bl_ops = {
1577         .options        = BL_CORE_SUSPENDRESUME,
1578         .update_status  = sh_mobile_lcdc_update_bl,
1579         .get_brightness = sh_mobile_lcdc_get_brightness,
1580         .check_fb       = sh_mobile_lcdc_check_fb,
1581 };
1582
1583 static struct backlight_device *sh_mobile_lcdc_bl_probe(struct device *parent,
1584                                                struct sh_mobile_lcdc_chan *ch)
1585 {
1586         struct backlight_device *bl;
1587
1588         bl = backlight_device_register(ch->cfg->bl_info.name, parent, ch,
1589                                        &sh_mobile_lcdc_bl_ops, NULL);
1590         if (IS_ERR(bl)) {
1591                 dev_err(parent, "unable to register backlight device: %ld\n",
1592                         PTR_ERR(bl));
1593                 return NULL;
1594         }
1595
1596         bl->props.max_brightness = ch->cfg->bl_info.max_brightness;
1597         bl->props.brightness = bl->props.max_brightness;
1598         backlight_update_status(bl);
1599
1600         return bl;
1601 }
1602
1603 static void sh_mobile_lcdc_bl_remove(struct backlight_device *bdev)
1604 {
1605         backlight_device_unregister(bdev);
1606 }
1607
1608 /* -----------------------------------------------------------------------------
1609  * Power management
1610  */
1611
1612 static int sh_mobile_lcdc_suspend(struct device *dev)
1613 {
1614         struct platform_device *pdev = to_platform_device(dev);
1615
1616         sh_mobile_lcdc_stop(platform_get_drvdata(pdev));
1617         return 0;
1618 }
1619
1620 static int sh_mobile_lcdc_resume(struct device *dev)
1621 {
1622         struct platform_device *pdev = to_platform_device(dev);
1623
1624         return sh_mobile_lcdc_start(platform_get_drvdata(pdev));
1625 }
1626
1627 static int sh_mobile_lcdc_runtime_suspend(struct device *dev)
1628 {
1629         struct platform_device *pdev = to_platform_device(dev);
1630         struct sh_mobile_lcdc_priv *priv = platform_get_drvdata(pdev);
1631
1632         /* turn off LCDC hardware */
1633         lcdc_write(priv, _LDCNT1R, 0);
1634
1635         return 0;
1636 }
1637
1638 static int sh_mobile_lcdc_runtime_resume(struct device *dev)
1639 {
1640         struct platform_device *pdev = to_platform_device(dev);
1641         struct sh_mobile_lcdc_priv *priv = platform_get_drvdata(pdev);
1642
1643         __sh_mobile_lcdc_start(priv);
1644
1645         return 0;
1646 }
1647
1648 static const struct dev_pm_ops sh_mobile_lcdc_dev_pm_ops = {
1649         .suspend = sh_mobile_lcdc_suspend,
1650         .resume = sh_mobile_lcdc_resume,
1651         .runtime_suspend = sh_mobile_lcdc_runtime_suspend,
1652         .runtime_resume = sh_mobile_lcdc_runtime_resume,
1653 };
1654
1655 /* -----------------------------------------------------------------------------
1656  * Framebuffer notifier
1657  */
1658
1659 /* locking: called with info->lock held */
1660 static int sh_mobile_lcdc_notify(struct notifier_block *nb,
1661                                  unsigned long action, void *data)
1662 {
1663         struct fb_event *event = data;
1664         struct fb_info *info = event->info;
1665         struct sh_mobile_lcdc_chan *ch = info->par;
1666
1667         if (&ch->lcdc->notifier != nb)
1668                 return NOTIFY_DONE;
1669
1670         dev_dbg(info->dev, "%s(): action = %lu, data = %p\n",
1671                 __func__, action, event->data);
1672
1673         switch(action) {
1674         case FB_EVENT_SUSPEND:
1675                 sh_mobile_lcdc_display_off(ch);
1676                 sh_mobile_lcdc_stop(ch->lcdc);
1677                 break;
1678         case FB_EVENT_RESUME:
1679                 mutex_lock(&ch->open_lock);
1680                 sh_mobile_fb_reconfig(info);
1681                 mutex_unlock(&ch->open_lock);
1682
1683                 sh_mobile_lcdc_display_on(ch);
1684                 sh_mobile_lcdc_start(ch->lcdc);
1685         }
1686
1687         return NOTIFY_OK;
1688 }
1689
1690 /* -----------------------------------------------------------------------------
1691  * Probe/remove and driver init/exit
1692  */
1693
1694 static const struct fb_videomode default_720p __devinitconst = {
1695         .name = "HDMI 720p",
1696         .xres = 1280,
1697         .yres = 720,
1698
1699         .left_margin = 220,
1700         .right_margin = 110,
1701         .hsync_len = 40,
1702
1703         .upper_margin = 20,
1704         .lower_margin = 5,
1705         .vsync_len = 5,
1706
1707         .pixclock = 13468,
1708         .refresh = 60,
1709         .sync = FB_SYNC_VERT_HIGH_ACT | FB_SYNC_HOR_HIGH_ACT,
1710 };
1711
1712 static int sh_mobile_lcdc_remove(struct platform_device *pdev)
1713 {
1714         struct sh_mobile_lcdc_priv *priv = platform_get_drvdata(pdev);
1715         int i;
1716
1717         fb_unregister_client(&priv->notifier);
1718
1719         for (i = 0; i < ARRAY_SIZE(priv->ch); i++)
1720                 sh_mobile_lcdc_channel_fb_unregister(&priv->ch[i]);
1721
1722         sh_mobile_lcdc_stop(priv);
1723
1724         for (i = 0; i < ARRAY_SIZE(priv->ch); i++) {
1725                 struct sh_mobile_lcdc_chan *ch = &priv->ch[i];
1726
1727                 if (ch->tx_dev) {
1728                         ch->tx_dev->lcdc = NULL;
1729                         module_put(ch->cfg->tx_dev->dev.driver->owner);
1730                 }
1731
1732                 sh_mobile_lcdc_channel_fb_cleanup(ch);
1733
1734                 if (ch->fb_mem)
1735                         dma_free_coherent(&pdev->dev, ch->fb_size,
1736                                           ch->fb_mem, ch->dma_handle);
1737         }
1738
1739         for (i = 0; i < ARRAY_SIZE(priv->ch); i++) {
1740                 if (priv->ch[i].bl)
1741                         sh_mobile_lcdc_bl_remove(priv->ch[i].bl);
1742         }
1743
1744         if (priv->dot_clk) {
1745                 pm_runtime_disable(&pdev->dev);
1746                 clk_put(priv->dot_clk);
1747         }
1748
1749         if (priv->base)
1750                 iounmap(priv->base);
1751
1752         if (priv->irq)
1753                 free_irq(priv->irq, priv);
1754         kfree(priv);
1755         return 0;
1756 }
1757
1758 static int __devinit sh_mobile_lcdc_check_interface(struct sh_mobile_lcdc_chan *ch)
1759 {
1760         int interface_type = ch->cfg->interface_type;
1761
1762         switch (interface_type) {
1763         case RGB8:
1764         case RGB9:
1765         case RGB12A:
1766         case RGB12B:
1767         case RGB16:
1768         case RGB18:
1769         case RGB24:
1770         case SYS8A:
1771         case SYS8B:
1772         case SYS8C:
1773         case SYS8D:
1774         case SYS9:
1775         case SYS12:
1776         case SYS16A:
1777         case SYS16B:
1778         case SYS16C:
1779         case SYS18:
1780         case SYS24:
1781                 break;
1782         default:
1783                 return -EINVAL;
1784         }
1785
1786         /* SUBLCD only supports SYS interface */
1787         if (lcdc_chan_is_sublcd(ch)) {
1788                 if (!(interface_type & LDMT1R_IFM))
1789                         return -EINVAL;
1790
1791                 interface_type &= ~LDMT1R_IFM;
1792         }
1793
1794         ch->ldmt1r_value = interface_type;
1795         return 0;
1796 }
1797
1798 static int __devinit
1799 sh_mobile_lcdc_channel_init(struct sh_mobile_lcdc_priv *priv,
1800                             struct sh_mobile_lcdc_chan *ch)
1801 {
1802         const struct sh_mobile_lcdc_format_info *format;
1803         const struct sh_mobile_lcdc_chan_cfg *cfg = ch->cfg;
1804         const struct fb_videomode *max_mode;
1805         const struct fb_videomode *mode;
1806         unsigned int num_modes;
1807         unsigned int max_size;
1808         unsigned int i;
1809
1810         mutex_init(&ch->open_lock);
1811         ch->notify = sh_mobile_lcdc_display_notify;
1812
1813         /* Validate the format. */
1814         format = sh_mobile_format_info(cfg->fourcc);
1815         if (format == NULL) {
1816                 dev_err(priv->dev, "Invalid FOURCC %08x.\n", cfg->fourcc);
1817                 return -EINVAL;
1818         }
1819
1820         /* Iterate through the modes to validate them and find the highest
1821          * resolution.
1822          */
1823         max_mode = NULL;
1824         max_size = 0;
1825
1826         for (i = 0, mode = cfg->lcd_modes; i < cfg->num_modes; i++, mode++) {
1827                 unsigned int size = mode->yres * mode->xres;
1828
1829                 /* NV12/NV21 buffers must have even number of lines */
1830                 if ((cfg->fourcc == V4L2_PIX_FMT_NV12 ||
1831                      cfg->fourcc == V4L2_PIX_FMT_NV21) && (mode->yres & 0x1)) {
1832                         dev_err(priv->dev, "yres must be multiple of 2 for "
1833                                 "YCbCr420 mode.\n");
1834                         return -EINVAL;
1835                 }
1836
1837                 if (size > max_size) {
1838                         max_mode = mode;
1839                         max_size = size;
1840                 }
1841         }
1842
1843         if (!max_size)
1844                 max_size = MAX_XRES * MAX_YRES;
1845         else
1846                 dev_dbg(priv->dev, "Found largest videomode %ux%u\n",
1847                         max_mode->xres, max_mode->yres);
1848
1849         if (cfg->lcd_modes == NULL) {
1850                 mode = &default_720p;
1851                 num_modes = 1;
1852         } else {
1853                 mode = cfg->lcd_modes;
1854                 num_modes = cfg->num_modes;
1855         }
1856
1857         /* Use the first mode as default. */
1858         ch->format = format;
1859         ch->xres = mode->xres;
1860         ch->xres_virtual = mode->xres;
1861         ch->yres = mode->yres;
1862         ch->yres_virtual = mode->yres * 2;
1863
1864         if (!format->yuv) {
1865                 ch->colorspace = V4L2_COLORSPACE_SRGB;
1866                 ch->pitch = ch->xres * format->bpp / 8;
1867         } else {
1868                 ch->colorspace = V4L2_COLORSPACE_REC709;
1869                 ch->pitch = ch->xres;
1870         }
1871
1872         ch->display.width = cfg->panel_cfg.width;
1873         ch->display.height = cfg->panel_cfg.height;
1874         ch->display.mode = *mode;
1875
1876         /* Allocate frame buffer memory. */
1877         ch->fb_size = max_size * format->bpp / 8 * 2;
1878         ch->fb_mem = dma_alloc_coherent(priv->dev, ch->fb_size, &ch->dma_handle,
1879                                         GFP_KERNEL);
1880         if (ch->fb_mem == NULL) {
1881                 dev_err(priv->dev, "unable to allocate buffer\n");
1882                 return -ENOMEM;
1883         }
1884
1885         /* Initialize the transmitter device if present. */
1886         if (cfg->tx_dev) {
1887                 if (!cfg->tx_dev->dev.driver ||
1888                     !try_module_get(cfg->tx_dev->dev.driver->owner)) {
1889                         dev_warn(priv->dev,
1890                                  "unable to get transmitter device\n");
1891                         return -EINVAL;
1892                 }
1893                 ch->tx_dev = platform_get_drvdata(cfg->tx_dev);
1894                 ch->tx_dev->lcdc = ch;
1895                 ch->tx_dev->def_mode = *mode;
1896         }
1897
1898         return sh_mobile_lcdc_channel_fb_init(ch, mode, num_modes);
1899 }
1900
1901 static int __devinit sh_mobile_lcdc_probe(struct platform_device *pdev)
1902 {
1903         struct sh_mobile_lcdc_info *pdata = pdev->dev.platform_data;
1904         struct sh_mobile_lcdc_priv *priv;
1905         struct resource *res;
1906         int num_channels;
1907         int error;
1908         int i;
1909
1910         if (!pdata) {
1911                 dev_err(&pdev->dev, "no platform data defined\n");
1912                 return -EINVAL;
1913         }
1914
1915         res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1916         i = platform_get_irq(pdev, 0);
1917         if (!res || i < 0) {
1918                 dev_err(&pdev->dev, "cannot get platform resources\n");
1919                 return -ENOENT;
1920         }
1921
1922         priv = kzalloc(sizeof(*priv), GFP_KERNEL);
1923         if (!priv) {
1924                 dev_err(&pdev->dev, "cannot allocate device data\n");
1925                 return -ENOMEM;
1926         }
1927
1928         priv->dev = &pdev->dev;
1929         priv->meram_dev = pdata->meram_dev;
1930         platform_set_drvdata(pdev, priv);
1931
1932         error = request_irq(i, sh_mobile_lcdc_irq, 0,
1933                             dev_name(&pdev->dev), priv);
1934         if (error) {
1935                 dev_err(&pdev->dev, "unable to request irq\n");
1936                 goto err1;
1937         }
1938
1939         priv->irq = i;
1940         atomic_set(&priv->hw_usecnt, -1);
1941
1942         for (i = 0, num_channels = 0; i < ARRAY_SIZE(pdata->ch); i++) {
1943                 struct sh_mobile_lcdc_chan *ch = priv->ch + num_channels;
1944
1945                 ch->lcdc = priv;
1946                 ch->cfg = &pdata->ch[i];
1947
1948                 error = sh_mobile_lcdc_check_interface(ch);
1949                 if (error) {
1950                         dev_err(&pdev->dev, "unsupported interface type\n");
1951                         goto err1;
1952                 }
1953                 init_waitqueue_head(&ch->frame_end_wait);
1954                 init_completion(&ch->vsync_completion);
1955                 ch->pan_offset = 0;
1956
1957                 /* probe the backlight is there is one defined */
1958                 if (ch->cfg->bl_info.max_brightness)
1959                         ch->bl = sh_mobile_lcdc_bl_probe(&pdev->dev, ch);
1960
1961                 switch (pdata->ch[i].chan) {
1962                 case LCDC_CHAN_MAINLCD:
1963                         ch->enabled = LDCNT2R_ME;
1964                         ch->reg_offs = lcdc_offs_mainlcd;
1965                         num_channels++;
1966                         break;
1967                 case LCDC_CHAN_SUBLCD:
1968                         ch->enabled = LDCNT2R_SE;
1969                         ch->reg_offs = lcdc_offs_sublcd;
1970                         num_channels++;
1971                         break;
1972                 }
1973         }
1974
1975         if (!num_channels) {
1976                 dev_err(&pdev->dev, "no channels defined\n");
1977                 error = -EINVAL;
1978                 goto err1;
1979         }
1980
1981         /* for dual channel LCDC (MAIN + SUB) force shared format setting */
1982         if (num_channels == 2)
1983                 priv->forced_fourcc = pdata->ch[0].fourcc;
1984
1985         priv->base = ioremap_nocache(res->start, resource_size(res));
1986         if (!priv->base)
1987                 goto err1;
1988
1989         error = sh_mobile_lcdc_setup_clocks(priv, pdata->clock_source);
1990         if (error) {
1991                 dev_err(&pdev->dev, "unable to setup clocks\n");
1992                 goto err1;
1993         }
1994
1995         /* Enable runtime PM. */
1996         pm_runtime_enable(&pdev->dev);
1997
1998         for (i = 0; i < num_channels; i++) {
1999                 struct sh_mobile_lcdc_chan *ch = priv->ch + i;
2000
2001                 error = sh_mobile_lcdc_channel_init(priv, ch);
2002                 if (error)
2003                         goto err1;
2004         }
2005
2006         error = sh_mobile_lcdc_start(priv);
2007         if (error) {
2008                 dev_err(&pdev->dev, "unable to start hardware\n");
2009                 goto err1;
2010         }
2011
2012         for (i = 0; i < num_channels; i++) {
2013                 struct sh_mobile_lcdc_chan *ch = priv->ch + i;
2014
2015                 error = sh_mobile_lcdc_channel_fb_register(ch);
2016                 if (error)
2017                         goto err1;
2018         }
2019
2020         /* Failure ignored */
2021         priv->notifier.notifier_call = sh_mobile_lcdc_notify;
2022         fb_register_client(&priv->notifier);
2023
2024         return 0;
2025 err1:
2026         sh_mobile_lcdc_remove(pdev);
2027
2028         return error;
2029 }
2030
2031 static struct platform_driver sh_mobile_lcdc_driver = {
2032         .driver         = {
2033                 .name           = "sh_mobile_lcdc_fb",
2034                 .owner          = THIS_MODULE,
2035                 .pm             = &sh_mobile_lcdc_dev_pm_ops,
2036         },
2037         .probe          = sh_mobile_lcdc_probe,
2038         .remove         = sh_mobile_lcdc_remove,
2039 };
2040
2041 module_platform_driver(sh_mobile_lcdc_driver);
2042
2043 MODULE_DESCRIPTION("SuperH Mobile LCDC Framebuffer driver");
2044 MODULE_AUTHOR("Magnus Damm <damm@opensource.se>");
2045 MODULE_LICENSE("GPL v2");