Driver for PXA25x LCD controller
================================

The driver supports the following options, either via
options=<OPTIONS> when modular or video=pxafb:<OPTIONS> when built in.

For example:
	modprobe pxafb options=vmem:2M,mode:640x480-8,passive
or on the kernel command line
	video=pxafb:vmem:2M,mode:640x480-8,passive

vmem: VIDEO_MEM_SIZE
	Amount of video memory to allocate (can be suffixed with K or M
	for kilobytes or megabytes)

mode:XRESxYRES[-BPP]
	XRES == LCCR1_PPL + 1
	YRES == LLCR2_LPP + 1
		The resolution of the display in pixels
	BPP == The bit depth. Valid values are 1, 2, 4, 8 and 16.

pixclock:PIXCLOCK
	Pixel clock in picoseconds

left:LEFT == LCCR1_BLW + 1
right:RIGHT == LCCR1_ELW + 1
hsynclen:HSYNC == LCCR1_HSW + 1
upper:UPPER == LCCR2_BFW
lower:LOWER == LCCR2_EFR
vsynclen:VSYNC == LCCR2_VSW + 1
	Display margins and sync times

color | mono => LCCR0_CMS
	umm...

active | passive => LCCR0_PAS
	Active (TFT) or Passive (STN) display

single | dual => LCCR0_SDS
	Single or dual panel passive display

4pix | 8pix => LCCR0_DPD
	4 or 8 pixel monochrome single panel data

hsync:HSYNC
vsync:VSYNC
	Horizontal and vertical sync. 0 => active low, 1 => active
	high.

dpc:DPC
	Double pixel clock. 1=>true, 0=>false

outputen:POLARITY
	Output Enable Polarity. 0 => active low, 1 => active high

pixclockpol:POLARITY
	pixel clock polarity
	0 => falling edge, 1 => rising edge


Overlay Support for PXA27x and later LCD controllers
====================================================

  PXA27x and later processors support overlay1 and overlay2 on-top of the
  base framebuffer (although under-neath the base is also possible). They
  support palette and no-palette RGB formats, as well as YUV formats (only
  available on overlay2). These overlays have dedicated DMA channels and
  behave in a similar way as a framebuffer.

  However, there are some differences between these overlay framebuffers
  and normal framebuffers, as listed below:

  1. overlay can start at a 32-bit word aligned position within the base
     framebuffer, which means they have a start (x, y). This information
     is encoded into var->nonstd (no, var->xoffset and var->yoffset are
     not for such purpose).

  2. overlay framebuffer is allocated dynamically according to specified
     'struct fb_var_screeninfo', the amount is decided by:

        var->xres_virtual * var->yres_virtual * bpp

     bpp = 16 -- for RGB565 or RGBT555
         = 24 -- for YUV444 packed
         = 24 -- for YUV444 planar
	 = 16 -- for YUV422 planar (1 pixel = 1 Y + 1/2 Cb + 1/2 Cr)
	 = 12 -- for YUV420 planar (1 pixel = 1 Y + 1/4 Cb + 1/4 Cr)

     NOTE:

     a. overlay does not support panning in x-direction, thus
        var->xres_virtual will always be equal to var->xres

     b. line length of overlay(s) must be on a 32-bit word boundary,
        for YUV planar modes, it is a requirement for the component
	with minimum bits per pixel,  e.g. for YUV420, Cr component
	for one pixel is actually 2-bits, it means the line length
	should be a multiple of 16-pixels

     c. starting horizontal position (XPOS) should start on a 32-bit
        word boundary, otherwise the fb_check_var() will just fail.

     d. the rectangle of the overlay should be within the base plane,
        otherwise fail

     Applications should follow the sequence below to operate an overlay
     framebuffer:

         a. open("/dev/fb[1-2]", ...)
	 b. ioctl(fd, FBIOGET_VSCREENINFO, ...)
	 c. modify 'var' with desired parameters:
	    1) var->xres and var->yres
	    2) larger var->yres_virtual if more memory is required,
	       usually for double-buffering
	    3) var->nonstd for starting (x, y) and color format
	    4) var->{red, green, blue, transp} if RGB mode is to be used
	 d. ioctl(fd, FBIOPUT_VSCREENINFO, ...)
	 e. ioctl(fd, FBIOGET_FSCREENINFO, ...)
	 f. mmap
	 g. ...

  3. for YUV planar formats, these are actually not supported within the
     framebuffer framework, application has to take care of the offsets
     and lengths of each component within the framebuffer.

  4. var->nonstd is used to pass starting (x, y) position and color format,
     the detailed bit fields are shown below:

    31                23  20         10          0
     +-----------------+---+----------+----------+
     |  ... unused ... |FOR|   XPOS   |   YPOS   |
     +-----------------+---+----------+----------+

     FOR  - color format, as defined by OVERLAY_FORMAT_* in pxafb.h
            0 - RGB
	    1 - YUV444 PACKED
	    2 - YUV444 PLANAR
	    3 - YUV422 PLANAR
	    4 - YUR420 PLANAR

     XPOS - starting horizontal position
     YPOS - starting vertical position
