sh_mobile_lcdcfb.c revision 72c04af9a2d57b7945cf3de8e71461bd80695d50
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 41struct 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 59static 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 79static 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 97static 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 117static int lcdc_chan_is_sublcd(struct sh_mobile_lcdc_chan *chan) 118{ 119 return chan->cfg->chan == LCDC_CHAN_SUBLCD; 120} 121 122static 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 131static 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 138static 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 144static 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 150static 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 156static 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 168static 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 179static 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 190static 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 230static 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 241static 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 252static 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 266struct 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 272static 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 288static 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 329static 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 337static 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 357static 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 368static bool 369sh_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 387static int sh_mobile_check_var(struct fb_var_screeninfo *var, 388 struct fb_info *info); 389 390static 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 453struct sh_mobile_lcdc_format_info { 454 u32 fourcc; 455 unsigned int bpp; 456 bool yuv; 457 u32 lddfr; 458}; 459 460static 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 509static const struct sh_mobile_lcdc_format_info * 510sh_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 522static 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 539static 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 548static 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 588static 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 608static 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 637static 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 */ 695static 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 806static 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 925static 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 982static 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 1006static 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 1017static 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 1024static 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 1031static 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 1038static 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 1102static 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 1119static 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 */ 1161static 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 1182static 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 1195static 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 1316static 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 */ 1361static 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 1396static 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 1413static void 1414sh_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 1420static int __devinit 1421sh_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 1453static void 1454sh_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 1468static int __devinit 1469sh_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 1551static 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 1563static 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 1570static int sh_mobile_lcdc_check_fb(struct backlight_device *bdev, 1571 struct fb_info *info) 1572{ 1573 return (info->bl_dev == bdev); 1574} 1575 1576static 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 1583static 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 1603static void sh_mobile_lcdc_bl_remove(struct backlight_device *bdev) 1604{ 1605 backlight_device_unregister(bdev); 1606} 1607 1608/* ----------------------------------------------------------------------------- 1609 * Power management 1610 */ 1611 1612static 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 1620static 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 1627static 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 1638static 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 1648static 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 */ 1660static 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 1694static 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 1712static 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 1758static 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 1798static int __devinit 1799sh_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 1901static 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; 2025err1: 2026 sh_mobile_lcdc_remove(pdev); 2027 2028 return error; 2029} 2030 2031static 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 2041module_platform_driver(sh_mobile_lcdc_driver); 2042 2043MODULE_DESCRIPTION("SuperH Mobile LCDC Framebuffer driver"); 2044MODULE_AUTHOR("Magnus Damm <damm@opensource.se>"); 2045MODULE_LICENSE("GPL v2"); 2046