https://github.com/torvalds/linux
Revision e715eb2e73918f4cefbba0b717ff8902e8030b39 authored by Catalin Marinas on 28 April 2014, 16:08:37 UTC, committed by Catalin Marinas on 04 May 2014, 10:35:29 UTC
Following arm64 commit bc3ee18a7a57 (arm64: init: Move of_clk_init to
time_init()), vexpress_osc_of_setup() is called via of_clk_init() long
before initcalls are issued. Initialising the vexpress oscillators
requires the vespress sysregs to be already initialised, so this patch
adds an explicit call to vexpress_sysreg_of_early_init() in vexpress
oscillator setup function.

Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
Tested-by: Will Deacon <will.deacon@arm.com>
Acked-by: Will Deacon <will.deacon@arm.com>
Tested-by: Pawel Moll <pawel.moll@arm.com>
Acked-by: Pawel Moll <pawel.moll@arm.com>
Cc: Mike Turquette <mturquette@linaro.org>
1 parent 7a8d1ec
Raw File
Tip revision: e715eb2e73918f4cefbba0b717ff8902e8030b39 authored by Catalin Marinas on 28 April 2014, 16:08:37 UTC
vexpress: Initialise the sysregs before setting up the clocks
Tip revision: e715eb2
sh7760fb.txt
SH7760/SH7763 integrated LCDC Framebuffer driver
================================================

0. Overview
-----------
The SH7760/SH7763 have an integrated LCD Display controller (LCDC) which
supports (in theory) resolutions ranging from 1x1 to 1024x1024,
with color depths ranging from 1 to 16 bits, on STN, DSTN and TFT Panels.

Caveats:
* Framebuffer memory must be a large chunk allocated at the top
  of Area3 (HW requirement). Because of this requirement you should NOT
  make the driver a module since at runtime it may become impossible to
  get a large enough contiguous chunk of memory.

* The driver does not support changing resolution while loaded
  (displays aren't hotpluggable anyway)

* Heavy flickering may be observed
  a) if you're using 15/16bit color modes at >= 640x480 px resolutions,
  b) during PCMCIA (or any other slow bus) activity.

* Rotation works only 90degress clockwise, and only if horizontal
  resolution is <= 320 pixels.

files:   drivers/video/sh7760fb.c
        include/asm-sh/sh7760fb.h
        Documentation/fb/sh7760fb.txt

1. Platform setup
-----------------
SH7760:
 Video data is fetched via the DMABRG DMA engine, so you have to
 configure the SH DMAC for DMABRG mode (write 0x94808080 to the
 DMARSRA register somewhere at boot).

 PFC registers PCCR and PCDR must be set to peripheral mode.
 (write zeros to both).

The driver does NOT do the above for you since board setup is, well, job
of the board setup code.

2. Panel definitions
--------------------
The LCDC must explicitly be told about the type of LCD panel
attached.  Data must be wrapped in a "struct sh7760fb_platdata" and
passed to the driver as platform_data.

Suggest you take a closer look at the SH7760 Manual, Section 30.
(http://documentation.renesas.com/eng/products/mpumcu/e602291_sh7760.pdf)

The following code illustrates what needs to be done to
get the framebuffer working on a 640x480 TFT:

====================== cut here ======================================

#include <linux/fb.h>
#include <asm/sh7760fb.h>

/*
 * NEC NL6440bc26-01 640x480 TFT
 * dotclock 25175 kHz
 * Xres                640     Yres            480
 * Htotal      800     Vtotal          525
 * HsynStart   656     VsynStart       490
 * HsynLenn    30      VsynLenn        2
 *
 * The linux framebuffer layer does not use the syncstart/synclen
 * values but right/left/upper/lower margin values. The comments
 * for the x_margin explain how to calculate those from given
 * panel sync timings.
 */
static struct fb_videomode nl6448bc26 = {
       .name           = "NL6448BC26",
       .refresh        = 60,
       .xres           = 640,
       .yres           = 480,
       .pixclock       = 39683,        /* in picoseconds! */
       .hsync_len      = 30,
       .vsync_len      = 2,
       .left_margin    = 114,  /* HTOT - (HSYNSLEN + HSYNSTART) */
       .right_margin   = 16,   /* HSYNSTART - XRES */
       .upper_margin   = 33,   /* VTOT - (VSYNLEN + VSYNSTART) */
       .lower_margin   = 10,   /* VSYNSTART - YRES */
       .sync           = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
       .vmode          = FB_VMODE_NONINTERLACED,
       .flag           = 0,
};

static struct sh7760fb_platdata sh7760fb_nl6448 = {
       .def_mode       = &nl6448bc26,
       .ldmtr          = LDMTR_TFT_COLOR_16,   /* 16bit TFT panel */
       .lddfr          = LDDFR_8BPP,           /* we want 8bit output */
       .ldpmmr         = 0x0070,
       .ldpspr         = 0x0500,
       .ldaclnr        = 0,
       .ldickr         = LDICKR_CLKSRC(LCDC_CLKSRC_EXTERNAL) |
                         LDICKR_CLKDIV(1),
       .rotate         = 0,
       .novsync        = 1,
       .blank          = NULL,
};

/* SH7760:
 * 0xFE300800: 256 * 4byte xRGB palette ram
 * 0xFE300C00: 42 bytes ctrl registers
 */
static struct resource sh7760_lcdc_res[] = {
       [0] = {
               .start  = 0xFE300800,
               .end    = 0xFE300CFF,
               .flags  = IORESOURCE_MEM,
       },
       [1] = {
               .start  = 65,
               .end    = 65,
               .flags  = IORESOURCE_IRQ,
       },
};

static struct platform_device sh7760_lcdc_dev = {
       .dev    = {
               .platform_data = &sh7760fb_nl6448,
       },
       .name           = "sh7760-lcdc",
       .id             = -1,
       .resource       = sh7760_lcdc_res,
       .num_resources  = ARRAY_SIZE(sh7760_lcdc_res),
};

====================== cut here ======================================
back to top