summaryrefslogtreecommitdiff
path: root/packages/linux/linux-2.6.18/atmel-lcdc-framebuffer-driver.patch
diff options
context:
space:
mode:
Diffstat (limited to 'packages/linux/linux-2.6.18/atmel-lcdc-framebuffer-driver.patch')
-rw-r--r--packages/linux/linux-2.6.18/atmel-lcdc-framebuffer-driver.patch1192
1 files changed, 0 insertions, 1192 deletions
diff --git a/packages/linux/linux-2.6.18/atmel-lcdc-framebuffer-driver.patch b/packages/linux/linux-2.6.18/atmel-lcdc-framebuffer-driver.patch
deleted file mode 100644
index d4c9204059..0000000000
--- a/packages/linux/linux-2.6.18/atmel-lcdc-framebuffer-driver.patch
+++ /dev/null
@@ -1,1192 +0,0 @@
----
- drivers/video/Kconfig | 22 +
- drivers/video/Makefile | 1
- drivers/video/fbmem.c | 6
- drivers/video/sidsafb.c | 805 ++++++++++++++++++++++++++++++++++++++++
- include/asm-avr32/periph/lcdc.h | 271 +++++++++++++
- include/linux/fb.h | 3
- 6 files changed, 1107 insertions(+), 1 deletion(-)
-
-Index: linux-2.6.18-avr32/drivers/video/Kconfig
-===================================================================
---- linux-2.6.18-avr32.orig/drivers/video/Kconfig 2006-11-02 15:54:18.000000000 +0100
-+++ linux-2.6.18-avr32/drivers/video/Kconfig 2006-11-02 15:56:20.000000000 +0100
-@@ -271,6 +271,28 @@ config FB_SA1100
- If you plan to use the LCD display with your SA-1100 system, say
- Y here.
-
-+config FB_SIDSA
-+ tristate "SIDSA LCDC support"
-+ select FB_CFB_FILLRECT
-+ select FB_CFB_COPYAREA
-+ select FB_CFB_IMAGEBLIT
-+ depends on FB && AVR32
-+ help
-+ This enables support for the SIDSA LCD Controller.
-+
-+config FB_SIDSA_DEFAULT_BPP
-+ int "SIDSA LCDC default color depth"
-+ default 24
-+ depends on FB_SIDSA
-+ help
-+ Specify the maximum color depth you want to be able to
-+ support. This, together with the resolution of the LCD
-+ panel, determines the amount of framebuffer memory allocated
-+ when the driver is initialized.
-+
-+ Allowable values are 1, 2, 4, 8, 16, 24 and 32. If unsure,
-+ say 24.
-+
- config FB_IMX
- tristate "Motorola i.MX LCD support"
- depends on FB && ARM && ARCH_IMX
-Index: linux-2.6.18-avr32/drivers/video/Makefile
-===================================================================
---- linux-2.6.18-avr32.orig/drivers/video/Makefile 2006-11-02 15:54:18.000000000 +0100
-+++ linux-2.6.18-avr32/drivers/video/Makefile 2006-11-02 15:56:20.000000000 +0100
-@@ -75,6 +75,7 @@ obj-$(CONFIG_FB_HP300) += hpf
- obj-$(CONFIG_FB_G364) += g364fb.o
- obj-$(CONFIG_FB_SA1100) += sa1100fb.o
- obj-$(CONFIG_FB_SUN3) += sun3fb.o
-+obj-$(CONFIG_FB_SIDSA) += sidsafb.o
- obj-$(CONFIG_FB_HIT) += hitfb.o
- obj-$(CONFIG_FB_EPSON1355) += epson1355fb.o
- obj-$(CONFIG_FB_PVR2) += pvr2fb.o
-Index: linux-2.6.18-avr32/drivers/video/fbmem.c
-===================================================================
---- linux-2.6.18-avr32.orig/drivers/video/fbmem.c 2006-11-02 15:54:18.000000000 +0100
-+++ linux-2.6.18-avr32/drivers/video/fbmem.c 2006-11-02 15:56:20.000000000 +0100
-@@ -1153,6 +1153,7 @@ fb_mmap(struct file *file, struct vm_are
- /* frame buffer memory */
- start = info->fix.smem_start;
- len = PAGE_ALIGN((start & ~PAGE_MASK) + info->fix.smem_len);
-+ pr_debug("fb_mmap: start = 0x%08lx, len = 0x%08lx\n", start, len);
- if (off >= len) {
- /* memory mapped io */
- off -= len;
-@@ -1168,6 +1169,7 @@ fb_mmap(struct file *file, struct vm_are
- if ((vma->vm_end - vma->vm_start + off) > len)
- return -EINVAL;
- off += start;
-+ pr_debug("fb_mmap: off = 0x%08lx\n", off);
- vma->vm_pgoff = off >> PAGE_SHIFT;
- /* This is an IO map - tell maydump to skip this VMA */
- vma->vm_flags |= VM_IO | VM_RESERVED;
-@@ -1198,6 +1200,10 @@ fb_mmap(struct file *file, struct vm_are
- pgprot_val(vma->vm_page_prot) |= _PAGE_NO_CACHE;
- #elif defined(__arm__) || defined(__sh__) || defined(__m32r__)
- vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot);
-+#elif defined(__avr32__)
-+ vma->vm_page_prot = __pgprot((pgprot_val(vma->vm_page_prot)
-+ & ~_PAGE_CACHABLE)
-+ | (_PAGE_BUFFER | _PAGE_DIRTY));
- #elif defined(__ia64__)
- if (efi_range_is_wc(vma->vm_start, vma->vm_end - vma->vm_start))
- vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot);
-Index: linux-2.6.18-avr32/drivers/video/sidsafb.c
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.18-avr32/drivers/video/sidsafb.c 2006-11-02 16:07:55.000000000 +0100
-@@ -0,0 +1,805 @@
-+/*
-+ * Framebuffer Driver for Atmel/SIDSA LCD Controller
-+ *
-+ * Copyright (C) 2004-2006 Atmel Corporation
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ */
-+#undef DEBUG
-+
-+#include <linux/config.h>
-+#include <linux/clk.h>
-+#include <linux/kernel.h>
-+#include <linux/dma-mapping.h>
-+#include <linux/interrupt.h>
-+#include <linux/fb.h>
-+#include <linux/init.h>
-+#include <linux/delay.h>
-+#include <linux/platform_device.h>
-+
-+#include <asm/arch/board.h>
-+
-+#include <asm/periph/lcdc.h>
-+
-+/* More or less configurable parameters */
-+#define SIDSAFB_FIFO_SIZE 512
-+#define SIDSAFB_DMA_BURST_LEN 8
-+
-+/* TODO: These should be autogenerated from part description file */
-+#define LCDC_DISTYPE_STN_MONO 0
-+#define LCDC_DISTYPE_STN_COLOR 1
-+#define LCDC_DISTYPE_TFT 2
-+#define LCDC_LUT 0xc00
-+
-+struct sidsafb_info {
-+ spinlock_t lock;
-+ struct fb_info * info;
-+ void __iomem * regs;
-+ unsigned long irq_base;
-+ wait_queue_head_t vsync_wait;
-+ unsigned int guard_time;
-+ struct clk *hclk;
-+ struct clk *pixclk;
-+ struct platform_device *pdev;
-+ u32 pseudo_palette[16];
-+};
-+
-+/*
-+ * How large framebuffer to allocate if none was provided by the
-+ * platform. This default is the smallest we can possibly get away
-+ * with.
-+ */
-+static unsigned long fb_size = (320 * 240);
-+
-+#if 0
-+static struct fb_videomode sony_modes[] = {
-+ {
-+ .refresh = 48,
-+ .xres = 240, .yres = 160,
-+ .pixclock = 520833,
-+
-+ .left_margin = 7, .right_margin = 9,
-+ .upper_margin = 19, .lower_margin = 20,
-+ .hsync_len = 9, .vsync_len = 2,
-+
-+ .sync = 0,
-+ .vmode = FB_VMODE_NONINTERLACED,
-+ },
-+};
-+#endif
-+
-+#if 0
-+static struct fb_videomode vga_modes[] = {
-+ {
-+ .refresh = 122,
-+ .xres = 320, .yres = 240,
-+ .pixclock = 80000,
-+
-+ .left_margin = 10, .right_margin = 20,
-+ .upper_margin = 30, .lower_margin = 5,
-+ .hsync_len = 20, .vsync_len = 3,
-+
-+ .sync = 0,
-+ .vmode = FB_VMODE_NONINTERLACED,
-+ },
-+ {
-+ .refresh = 70,
-+ .xres = 640, .yres = 480,
-+ .pixclock = 40000,
-+
-+ .left_margin = 10, .right_margin = 20,
-+ .upper_margin = 30, .lower_margin = 5,
-+ .hsync_len = 20, .vsync_len = 3,
-+
-+ .sync = 0,
-+ .vmode = FB_VMODE_NONINTERLACED,
-+ },
-+};
-+#else
-+static struct fb_videomode samsung_modes[] = {
-+ {
-+ .refresh = 75,
-+ .xres = 320, .yres = 240,
-+ .pixclock = 145111,
-+
-+ .left_margin = 17, .right_margin = 33,
-+ .upper_margin = 8, .lower_margin = 10,
-+ .hsync_len = 16, .vsync_len = 1,
-+
-+ .sync = FB_SYNC_PCLK_RISING,
-+ .vmode = FB_VMODE_NONINTERLACED,
-+ },
-+};
-+#endif
-+
-+#if 1
-+static struct fb_monspecs default_monspecs = {
-+ .modedb = samsung_modes,
-+ .manufacturer = "SNG",
-+ .monitor = "LCD panel",
-+ .serial_no = "xxxx",
-+ .ascii = "yyyy",
-+ .modedb_len = ARRAY_SIZE(samsung_modes),
-+ .hfmin = 14820,
-+ .hfmax = 22230,
-+ .vfmin = 60,
-+ .vfmax = 90,
-+ .dclkmax = 30000000,
-+};
-+#endif
-+
-+#if 0
-+static struct fb_monspecs default_monspecs = {
-+ .modedb = sony_modes,
-+ .manufacturer = "SNY", /* 4 chars?!? */
-+ .monitor = "LCD panel",
-+ .serial_no = "xxxx",
-+ .ascii = "yyyy",
-+ .modedb_len = ARRAY_SIZE(sony_modes),
-+ .hfmin = 7000,
-+ .hfmax = 8000,
-+ .vfmin = 45,
-+ .vfmax = 50,
-+};
-+// #else
-+static struct fb_monspecs default_monspecs = {
-+ .modedb = vga_modes,
-+ .manufacturer = "VGA",
-+ .monitor = "Generic VGA",
-+ .serial_no = "xxxx",
-+ .ascii = "yyyy",
-+ .modedb_len = ARRAY_SIZE(vga_modes),
-+ .hfmin = 30000,
-+ .hfmax = 64000,
-+ .vfmin = 50,
-+ .vfmax = 150,
-+};
-+#endif
-+
-+/* Driver defaults */
-+static struct fb_fix_screeninfo sidsafb_fix __devinitdata = {
-+ .id = "sidsafb",
-+ .type = FB_TYPE_PACKED_PIXELS,
-+ .visual = FB_VISUAL_TRUECOLOR,
-+ .xpanstep = 1,
-+ .ypanstep = 1,
-+ .ywrapstep = 0,
-+ .accel = FB_ACCEL_NONE,
-+};
-+
-+static void sidsafb_update_dma(struct fb_info *info,
-+ struct fb_var_screeninfo *var)
-+{
-+ struct sidsafb_info *sinfo = info->par;
-+ struct fb_fix_screeninfo *fix = &info->fix;
-+ unsigned long dma_addr;
-+ unsigned long pixeloff;
-+ unsigned long dma2dcfg;
-+
-+ dma_addr = (fix->smem_start + var->yoffset * fix->line_length
-+ + var->xoffset * var->bits_per_pixel / 8);
-+
-+ dma_addr &= ~3UL;
-+ pixeloff = LCDC_MKBF(DMA2DCFG_PIXELOFF, var->xoffset * var->bits_per_pixel);
-+
-+ /* Set framebuffer DMA base address and pixel offset */
-+ lcdc_writel(sinfo, DMABADDR1, dma_addr);
-+ dma2dcfg = lcdc_readl(sinfo, DMA2DCFG);
-+ dma2dcfg = LCDC_INSBF(DMA2DCFG_PIXELOFF, pixeloff, dma2dcfg);
-+ lcdc_writel(sinfo, DMA2DCFG, dma2dcfg);
-+
-+ /* Update configuration */
-+ lcdc_writel(sinfo, DMACON, (lcdc_readl(sinfo, DMACON)
-+ | LCDC_BIT(DMACON_DMAUPDT)));
-+}
-+
-+/**
-+ * sidsafb_check_var - Validates a var passed in.
-+ * @var: frame buffer variable screen structure
-+ * @info: frame buffer structure that represents a single frame buffer
-+ *
-+ * Checks to see if the hardware supports the state requested by
-+ * var passed in. This function does not alter the hardware
-+ * state!!! This means the data stored in struct fb_info and
-+ * struct sidsafb_info do not change. This includes the var
-+ * inside of struct fb_info. Do NOT change these. This function
-+ * can be called on its own if we intent to only test a mode and
-+ * not actually set it. The stuff in modedb.c is a example of
-+ * this. If the var passed in is slightly off by what the
-+ * hardware can support then we alter the var PASSED in to what
-+ * we can do. If the hardware doesn't support mode change a
-+ * -EINVAL will be returned by the upper layers. You don't need
-+ * to implement this function then. If you hardware doesn't
-+ * support changing the resolution then this function is not
-+ * needed. In this case the driver would just provide a var that
-+ * represents the static state the screen is in.
-+ *
-+ * Returns negative errno on error, or zero on success.
-+ */
-+static int sidsafb_check_var(struct fb_var_screeninfo *var,
-+ struct fb_info *info)
-+{
-+ unsigned long new_fb_size;
-+
-+ pr_debug("sidsafb_check_var:\n");
-+ pr_debug(" resolution: %ux%u\n", var->xres, var->yres);
-+ pr_debug(" pixclk: %llu Hz\n", 1000000000000ULL / var->pixclock);
-+ pr_debug(" bpp: %u\n", var->bits_per_pixel);
-+
-+ new_fb_size = (var->xres_virtual * var->yres_virtual
-+ * ((var->bits_per_pixel + 7) / 8));
-+ if (new_fb_size > info->fix.smem_len) {
-+ printk(KERN_NOTICE
-+ "sidsafb: %uB framebuffer too small for %ux%ux%u\n",
-+ info->fix.smem_len, var->xres_virtual,
-+ var->yres_virtual, var->bits_per_pixel);
-+ return -EINVAL;
-+ }
-+
-+ /* Force same alignment for each line */
-+ var->xres = (var->xres + 3) & ~3UL;
-+ var->xres_virtual = (var->xres_virtual + 3) & ~3UL;
-+
-+ var->red.msb_right = var->green.msb_right = var->blue.msb_right = 0;
-+ var->transp.offset = var->transp.length = 0;
-+
-+ switch (var->bits_per_pixel) {
-+ case 2:
-+ case 4:
-+ case 8:
-+ var->red.offset = var->green.offset = var->blue.offset = 0;
-+ var->red.length = var->green.length = var->blue.length
-+ = var->bits_per_pixel;
-+ break;
-+ case 15:
-+ case 16:
-+ /*
-+ * Bit 16 is the "intensity" bit, I think. Not sure
-+ * what we're going to use that for...
-+ */
-+ var->red.offset = 0;
-+ var->green.offset = 5;
-+ var->blue.offset = 10;
-+ var->red.length = 5;
-+ var->green.length = 5;
-+ var->blue.length = 5;
-+ break;
-+ case 24:
-+ case 32:
-+ var->red.offset = 16;
-+ var->green.offset = 8;
-+ var->blue.offset = 0;
-+ var->red.length = var->green.length = var->blue.length = 8;
-+ break;
-+ default:
-+ printk(KERN_NOTICE "sidsafb: color depth %d not supported\n",
-+ var->bits_per_pixel);
-+ return -EINVAL;
-+ }
-+
-+ var->xoffset = var->yoffset = 0;
-+ var->red.msb_right = var->green.msb_right = var->blue.msb_right =
-+ var->transp.msb_right = 0;
-+
-+ return 0;
-+}
-+
-+/**
-+ * sidsafb_set_par - Alters the hardware state.
-+ * @info: frame buffer structure that represents a single frame buffer
-+ *
-+ * Using the fb_var_screeninfo in fb_info we set the resolution
-+ * of the this particular framebuffer. This function alters the
-+ * par AND the fb_fix_screeninfo stored in fb_info. It doesn't
-+ * not alter var in fb_info since we are using that data. This
-+ * means we depend on the data in var inside fb_info to be
-+ * supported by the hardware. sidsafb_check_var is always called
-+ * before sidsafb_set_par to ensure this. Again if you can't
-+ * change the resolution you don't need this function.
-+ *
-+ */
-+static int sidsafb_set_par(struct fb_info *info)
-+{
-+ struct sidsafb_info *sinfo = info->par;
-+ unsigned long value;
-+
-+ pr_debug("sidsafb_set_par:\n");
-+ pr_debug(" * resolution: %ux%u (%ux%u virtual)\n",
-+ info->var.xres, info->var.yres,
-+ info->var.xres_virtual, info->var.yres_virtual);
-+
-+ /* Turn off the LCD controller and the DMA controller */
-+ pr_debug("writing 0x%08x to %p\n",
-+ LCDC_MKBF(PWRCON_GUARD_TIME, sinfo->guard_time),
-+ sinfo->regs + LCDC_PWRCON);
-+ lcdc_writel(sinfo, PWRCON,
-+ LCDC_MKBF(PWRCON_GUARD_TIME, sinfo->guard_time));
-+ pr_debug("writing 0 to %p\n", sinfo->regs + LCDC_DMACON);
-+ lcdc_writel(sinfo, DMACON, 0);
-+
-+ info->fix.line_length = (info->var.xres_virtual
-+ * (info->var.bits_per_pixel / 8));
-+
-+ if (info->var.bits_per_pixel <= 8)
-+ info->fix.visual = FB_VISUAL_PSEUDOCOLOR;
-+ else
-+ info->fix.visual = FB_VISUAL_TRUECOLOR;
-+
-+ /* Re-initialize the DMA engine... */
-+ pr_debug(" * update DMA engine\n");
-+ sidsafb_update_dma(info, &info->var);
-+
-+ /* ...set frame size and burst length = 8 words (?) */
-+ value = LCDC_MKBF(DMAFRMCFG_FRMSIZE,
-+ (info->var.yres * info->fix.line_length + 3) / 4);
-+ value |= LCDC_MKBF(DMAFRMCFG_BRSTLEN, (SIDSAFB_DMA_BURST_LEN - 1));
-+ lcdc_writel(sinfo, DMAFRMCFG, value);
-+
-+ /* ...set 2D configuration (necessary for xres_virtual != xres) */
-+ value = LCDC_MKBF(DMA2DCFG_ADDRINC,
-+ info->var.xres_virtual - info->var.xres);
-+ lcdc_writel(sinfo, DMA2DCFG, value);
-+
-+ /* ...wait for DMA engine to become idle... */
-+ while (lcdc_readl(sinfo, DMACON) & LCDC_BIT(DMACON_DMABUSY))
-+ msleep(10);
-+
-+ pr_debug(" * re-enable DMA engine\n");
-+ /* ...and enable it with updated configuration */
-+ lcdc_writel(sinfo, DMACON, (LCDC_BIT(DMACON_DMAEN)
-+ | LCDC_BIT(DMACON_DMAUPDT)
-+ | LCDC_BIT(DMACON_DMA2DEN)));
-+
-+ /* Now, the LCD core... */
-+
-+ /* Set pixel clock. */
-+ value = (clk_get_rate(sinfo->pixclk) / 100000) * info->var.pixclock;
-+ value /= 10000000;
-+ value = (value + 1) / 2;
-+ if (value == 0) {
-+ printk("sidsafb: Bypassing lcdc_pclk divider\n");
-+ lcdc_writel(sinfo, LCDCON1, LCDC_BIT(LCDCON1_BYPASS));
-+ } else {
-+ lcdc_writel(sinfo, LCDCON1, LCDC_MKBF(LCDCON1_CLKVAL, value - 1));
-+ }
-+
-+ /* Initialize control register 2 */
-+ value = (LCDC_BIT(LCDCON2_CLKMOD)
-+ | LCDC_MKBF(LCDCON2_DISTYPE, LCDC_DISTYPE_TFT));
-+ if (!(info->var.sync & FB_SYNC_HOR_HIGH_ACT))
-+ value |= LCDC_BIT(LCDCON2_INVLINE);
-+ if (!(info->var.sync & FB_SYNC_VERT_HIGH_ACT))
-+ value |= LCDC_BIT(LCDCON2_INVFRAME);
-+ if (info->var.sync & FB_SYNC_PCLK_RISING)
-+ value |= LCDC_BIT(LCDCON2_INVCLK);
-+
-+ switch (info->var.bits_per_pixel) {
-+ case 1: value |= LCDC_MKBF(LCDCON2_PIXELSIZE, 0); break;
-+ case 2: value |= LCDC_MKBF(LCDCON2_PIXELSIZE, 1); break;
-+ case 4: value |= LCDC_MKBF(LCDCON2_PIXELSIZE, 2); break;
-+ case 8: value |= LCDC_MKBF(LCDCON2_PIXELSIZE, 3); break;
-+ case 15: /* fall through */
-+ case 16: value |= LCDC_MKBF(LCDCON2_PIXELSIZE, 4); break;
-+ case 24: value |= LCDC_MKBF(LCDCON2_PIXELSIZE, 5); break;
-+ case 32: value |= LCDC_MKBF(LCDCON2_PIXELSIZE, 6); break;
-+ default: BUG(); break;
-+ }
-+ pr_debug(" * LCDCON2 = %08lx\n", value);
-+ lcdc_writel(sinfo, LCDCON2, value);
-+
-+ /* Vertical timing */
-+ value = LCDC_MKBF(LCDTIM1_VPW, info->var.vsync_len - 1);
-+ value |= LCDC_MKBF(LCDTIM1_VBP, info->var.upper_margin);
-+ value |= LCDC_MKBF(LCDTIM1_VFP, info->var.lower_margin);
-+ pr_debug(" * LCDTIM1 = %08lx\n", value);
-+ lcdc_writel(sinfo, LCDTIM1, value);
-+
-+ /* Horizontal timing */
-+ value = LCDC_MKBF(LCDTIM2_HFP, info->var.right_margin - 1);
-+ value |= LCDC_MKBF(LCDTIM2_HPW, info->var.hsync_len - 1);
-+ value |= LCDC_MKBF(LCDTIM2_HBP, info->var.left_margin - 1);
-+ pr_debug(" * LCDTIM2 = %08lx\n", value);
-+ lcdc_writel(sinfo, LCDTIM2, value);
-+
-+ /* Display size */
-+ value = LCDC_MKBF(LCDFRMCFG_LINESIZE, info->var.xres - 1);
-+ value |= LCDC_MKBF(LCDFRMCFG_LINEVAL, info->var.yres - 1);
-+ lcdc_writel(sinfo, LCDFRMCFG, value);
-+
-+ /* FIFO Threshold: Use formula from data sheet */
-+ value = SIDSAFB_FIFO_SIZE - (2 * SIDSAFB_DMA_BURST_LEN + 3);
-+ lcdc_writel(sinfo, LCDFIFO, value);
-+
-+ /* Toggle LCD_MODE every frame */
-+ lcdc_writel(sinfo, LCDMVAL, 0);
-+
-+ /* Disable all interrupts */
-+ lcdc_writel(sinfo, LCD_IDR, ~0UL);
-+
-+ /* Wait for the LCDC core to become idle and enable it */
-+ while(lcdc_readl(sinfo, PWRCON) & LCDC_BIT(PWRCON_LCD_BUSY))
-+ msleep(10);
-+
-+ pr_debug(" * re-enable LCD core\n");
-+ lcdc_writel(sinfo, PWRCON,
-+ LCDC_MKBF(PWRCON_GUARD_TIME, sinfo->guard_time)
-+ | LCDC_BIT(PWRCON_LCD_PWR));
-+
-+ pr_debug(" * DONE\n");
-+ return 0;
-+}
-+
-+static inline u_int chan_to_field(u_int chan, const struct fb_bitfield *bf)
-+{
-+ chan &= 0xffff;
-+ chan >>= 16 - bf->length;
-+ return chan << bf->offset;
-+}
-+
-+/**
-+ * sidsafb_setcolreg - Optional function. Sets a color register.
-+ * @regno: Which register in the CLUT we are programming
-+ * @red: The red value which can be up to 16 bits wide
-+ * @green: The green value which can be up to 16 bits wide
-+ * @blue: The blue value which can be up to 16 bits wide.
-+ * @transp: If supported the alpha value which can be up to 16 bits wide.
-+ * @info: frame buffer info structure
-+ *
-+ * Set a single color register. The values supplied have a 16 bit
-+ * magnitude which needs to be scaled in this function for the hardware.
-+ * Things to take into consideration are how many color registers, if
-+ * any, are supported with the current color visual. With truecolor mode
-+ * no color palettes are supported. Here a psuedo palette is created
-+ * which we store the value in pseudo_palette in struct fb_info. For
-+ * pseudocolor mode we have a limited color palette. To deal with this
-+ * we can program what color is displayed for a particular pixel value.
-+ * DirectColor is similar in that we can program each color field. If
-+ * we have a static colormap we don't need to implement this function.
-+ *
-+ * Returns negative errno on error, or zero on success. In an
-+ * ideal world, this would have been the case, but as it turns
-+ * out, the other drivers return 1 on failure, so that's what
-+ * we're going to do.
-+ */
-+static int sidsafb_setcolreg(unsigned int regno, unsigned int red,
-+ unsigned int green, unsigned int blue,
-+ unsigned int transp, struct fb_info *info)
-+{
-+ struct sidsafb_info *sinfo = info->par;
-+ unsigned int val;
-+ u32 *pal;
-+ int ret = 1;
-+
-+ if (info->var.grayscale)
-+ red = green = blue = (19595 * red + 38470 * green
-+ + 7471 * blue) >> 16;
-+
-+ switch (info->fix.visual) {
-+ case FB_VISUAL_TRUECOLOR:
-+ if (regno < 16) {
-+ pal = info->pseudo_palette;
-+
-+ val = chan_to_field(red, &info->var.red);
-+ val |= chan_to_field(green, &info->var.green);
-+ val |= chan_to_field(blue, &info->var.blue);
-+
-+ pal[regno] = val;
-+ ret = 0;
-+ }
-+ break;
-+
-+ case FB_VISUAL_PSEUDOCOLOR:
-+ if (regno < 256) {
-+ val = ((red >> 11) & 0x001f);
-+ val |= ((green >> 6) & 0x03e0);
-+ val |= ((blue >> 1) & 0x7c00);
-+
-+ /*
-+ * TODO: intensity bit. Maybe something like
-+ * ~(red[10] ^ green[10] ^ blue[10]) & 1
-+ */
-+
-+ lcdc_writel(sinfo, LUT + regno * 4, val);
-+ ret = 0;
-+ }
-+ break;
-+ }
-+
-+ return ret;
-+}
-+
-+static int sidsafb_pan_display(struct fb_var_screeninfo *var,
-+ struct fb_info *info)
-+{
-+ pr_debug("sidsafb_pan_display\n");
-+
-+ sidsafb_update_dma(info, var);
-+
-+ return 0;
-+}
-+
-+static struct fb_ops sidsafb_ops = {
-+ .owner = THIS_MODULE,
-+ .fb_check_var = sidsafb_check_var,
-+ .fb_set_par = sidsafb_set_par,
-+ .fb_setcolreg = sidsafb_setcolreg,
-+ .fb_pan_display = sidsafb_pan_display,
-+ .fb_fillrect = cfb_fillrect,
-+ .fb_copyarea = cfb_copyarea,
-+ .fb_imageblit = cfb_imageblit,
-+};
-+
-+static irqreturn_t sidsafb_interrupt(int irq, void *dev_id,
-+ struct pt_regs *regs)
-+{
-+ struct fb_info *info = dev_id;
-+ struct sidsafb_info *sinfo = info->par;
-+ u32 status;
-+
-+ status = lcdc_readl(sinfo, LCD_ISR);
-+ while (status) {
-+ if (status & LCDC_BIT(LCD_ISR_EOFIS)) {
-+ pr_debug("sidsafb: DMA End Of Frame interrupt\n");
-+
-+ lcdc_writel(sinfo, LCD_ICR, LCDC_BIT(LCD_ICR_EOFIC));
-+ status &= ~LCDC_BIT(LCD_ISR_EOFIS);
-+ wake_up(&sinfo->vsync_wait);
-+ }
-+
-+ if (status) {
-+ printk(KERN_ERR
-+ "LCDC: Interrupts still pending: 0x%x\n",
-+ status);
-+ lcdc_writel(sinfo, LCD_IDR, status);
-+ }
-+
-+ status = lcdc_readl(sinfo, LCD_ISR);
-+ }
-+
-+ return IRQ_HANDLED;
-+}
-+
-+static void __devinit init_pseudo_palette(u32 *palette)
-+{
-+ static const u32 init_palette[16] = {
-+ 0x000000,
-+ 0xaa0000,
-+ 0x00aa00,
-+ 0xaa5500,
-+ 0x0000aa,
-+ 0xaa00aa,
-+ 0x00aaaa,
-+ 0xaaaaaa,
-+ 0x555555,
-+ 0xff5555,
-+ 0x55ff55,
-+ 0xffff55,
-+ 0x5555ff,
-+ 0xff55ff,
-+ 0x55ffff,
-+ 0xffffff
-+ };
-+
-+ memcpy(palette, init_palette, sizeof(init_palette));
-+}
-+
-+static int __devinit sidsafb_set_fbinfo(struct sidsafb_info *sinfo)
-+{
-+ struct fb_info *info = sinfo->info;
-+
-+ init_pseudo_palette(sinfo->pseudo_palette);
-+
-+ info->flags = (FBINFO_DEFAULT
-+ | FBINFO_PARTIAL_PAN_OK
-+ | FBINFO_HWACCEL_XPAN
-+ | FBINFO_HWACCEL_YPAN);
-+ memcpy(&info->fix, &sidsafb_fix, sizeof(info->fix));
-+ memcpy(&info->monspecs, &default_monspecs, sizeof(info->monspecs));
-+ info->fbops = &sidsafb_ops;
-+ info->pseudo_palette = sinfo->pseudo_palette;
-+
-+ init_waitqueue_head(&sinfo->vsync_wait);
-+
-+ return 0;
-+}
-+
-+static int __devinit sidsafb_probe(struct platform_device *pdev)
-+{
-+ struct lcdc_platform_data *fb_data = pdev->dev.platform_data;
-+ struct fb_info *info;
-+ struct sidsafb_info *sinfo;
-+ const struct resource *mmio_resource;
-+ int ret;
-+
-+ pr_debug("sidsafb_probe BEGIN\n");
-+
-+ mmio_resource = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-+ if (!mmio_resource) {
-+ dev_err(&pdev->dev, "no MMIO resource found\n");
-+ return -ENXIO;
-+ }
-+
-+ ret = -ENOMEM;
-+ info = framebuffer_alloc(sizeof(struct sidsafb_info), &pdev->dev);
-+ if (!info) {
-+ dev_err(&pdev->dev, "failed to allocate memory\n");
-+ goto out;
-+ }
-+
-+ sinfo = info->par;
-+ sinfo->info = info;
-+ sinfo->pdev = pdev;
-+ sinfo->guard_time = 1;
-+
-+ spin_lock_init(&sinfo->lock);
-+ sidsafb_set_fbinfo(sinfo);
-+ info->fix.mmio_start = mmio_resource->start;
-+ info->fix.mmio_len = mmio_resource->end - mmio_resource->start + 1;
-+ sinfo->irq_base = platform_get_irq(pdev, 0);
-+
-+ sinfo->hclk = clk_get(&pdev->dev, "hclk");
-+ if (IS_ERR(sinfo->hclk)) {
-+ dev_err(&pdev->dev, "failed to get hclk\n");
-+ ret = PTR_ERR(sinfo->hclk);
-+ goto free_info;
-+ }
-+ sinfo->pixclk = clk_get(&pdev->dev, "pixclk");
-+ if (IS_ERR(sinfo->pixclk)) {
-+ dev_err(&pdev->dev, "failed to get pixel clock\n");
-+ ret = PTR_ERR(sinfo->hclk);
-+ goto put_hclk;
-+ }
-+
-+ clk_enable(sinfo->hclk);
-+ clk_enable(sinfo->pixclk);
-+
-+ /* Use platform-supplied framebuffer memory if available */
-+ if (fb_data && fb_data->fbmem_size != 0) {
-+ info->fix.smem_start = fb_data->fbmem_start;
-+ info->fix.smem_len = fb_data->fbmem_size;
-+ info->screen_base = ioremap(info->fix.smem_start,
-+ info->fix.smem_len);
-+ } else {
-+ dma_addr_t paddr;
-+
-+ info->fix.smem_len = fb_size;
-+ info->screen_base = dma_alloc_coherent(&pdev->dev, fb_size,
-+ &paddr, GFP_KERNEL);
-+ info->fix.smem_start = paddr;
-+ }
-+
-+ if (!info->screen_base) {
-+ printk(KERN_ERR "sidsafb: Could not allocate framebuffer\n");
-+ goto disable_clocks;
-+ }
-+
-+ sinfo->regs = ioremap(info->fix.mmio_start, info->fix.mmio_len);
-+ if (!sinfo->regs) {
-+ printk(KERN_ERR "sidsafb: Could not map LCDC registers\n");
-+ goto free_fb;
-+ }
-+
-+ ret = fb_find_mode(&info->var, info, NULL, info->monspecs.modedb,
-+ info->monspecs.modedb_len, info->monspecs.modedb,
-+ CONFIG_FB_SIDSA_DEFAULT_BPP);
-+ if (!ret) {
-+ printk(KERN_ERR "sidsafb: No suitable video mode found\n");
-+ goto unmap_regs;
-+ }
-+
-+ ret = request_irq(sinfo->irq_base, sidsafb_interrupt, 0,
-+ "sidsafb", info);
-+ if (ret)
-+ goto unmap_regs;
-+
-+ /* Allocate colormap */
-+ if (fb_alloc_cmap(&info->cmap, 256, 0)) {
-+ ret = -ENOMEM;
-+ goto unregister_irqs;
-+ }
-+
-+ /*
-+ * Tell the world that we're ready to go
-+ */
-+ ret = register_framebuffer(info);
-+ if (ret)
-+ goto free_cmap;
-+
-+ printk("fb%d: Atmel LCDC at 0x%08lx (mapped at %p), irq %lu\n",
-+ info->node, info->fix.mmio_start, sinfo->regs, sinfo->irq_base);
-+
-+ platform_set_drvdata(pdev, info);
-+
-+ memset_io(info->screen_base, 0, info->fix.smem_len);
-+ info->var.activate |= FB_ACTIVATE_FORCE | FB_ACTIVATE_NOW;
-+ ret = fb_set_var(info, &info->var);
-+ if (ret)
-+ printk(KERN_WARNING
-+ "sidsafb: Unable to set display parameters\n");
-+ info->var.activate &= ~(FB_ACTIVATE_FORCE | FB_ACTIVATE_NOW);
-+
-+ pr_debug("sidsafb_probe SUCCESS\n");
-+ return 0;
-+
-+
-+free_cmap:
-+ fb_dealloc_cmap(&info->cmap);
-+unregister_irqs:
-+ free_irq(sinfo->irq_base, info);
-+unmap_regs:
-+ iounmap(sinfo->regs);
-+free_fb:
-+ if (!fb_data || fb_data->fbmem_size == 0)
-+ dma_free_coherent(&pdev->dev, info->fix.smem_len,
-+ (void __force *)info->screen_base,
-+ info->fix.smem_start);
-+disable_clocks:
-+ clk_disable(sinfo->pixclk);
-+ clk_disable(sinfo->hclk);
-+ clk_put(sinfo->pixclk);
-+put_hclk:
-+ clk_put(sinfo->hclk);
-+free_info:
-+ framebuffer_release(info);
-+out:
-+ pr_debug("sidsafb_probe FAILED\n");
-+ return ret;
-+}
-+
-+static int __devexit sidsafb_remove(struct platform_device *pdev)
-+{
-+ struct lcdc_platform_data *fb_data = pdev->dev.platform_data;
-+ struct fb_info *info = platform_get_drvdata(pdev);
-+ struct sidsafb_info *sinfo;
-+
-+ if (!info)
-+ return 0;
-+ sinfo = info->par;
-+
-+ /* TODO: Restore original state */
-+ unregister_framebuffer(info);
-+
-+ fb_dealloc_cmap(&info->cmap);
-+ free_irq(sinfo->irq_base, info);
-+ iounmap(sinfo->regs);
-+ if (!fb_data || fb_data->fbmem_size == 0)
-+ dma_free_coherent(&pdev->dev, info->fix.smem_len,
-+ (void __force *)info->screen_base,
-+ info->fix.smem_start);
-+ clk_disable(sinfo->hclk);
-+ clk_put(sinfo->hclk);
-+ platform_set_drvdata(pdev, NULL);
-+ framebuffer_release(info);
-+
-+ return 0;
-+}
-+
-+static struct platform_driver sidsafb_driver = {
-+ .probe = sidsafb_probe,
-+ .remove = __devexit_p(sidsafb_remove),
-+ .driver = {
-+ .name = "lcdc",
-+ },
-+};
-+
-+int __init sidsafb_init(void)
-+{
-+ return platform_driver_register(&sidsafb_driver);
-+}
-+
-+static void __exit sidsafb_exit(void)
-+{
-+ platform_driver_unregister(&sidsafb_driver);
-+}
-+
-+module_init(sidsafb_init);
-+module_exit(sidsafb_exit);
-+
-+module_param(fb_size, ulong, 0644);
-+MODULE_PARM_DESC(fb_size, "Minimum framebuffer size to allocate");
-+
-+MODULE_AUTHOR("Haavard Skinnemoen <hskinnemoen@atmel.com>");
-+MODULE_DESCRIPTION("Atmel/SIDSA LCD Controller framebuffer driver");
-+MODULE_LICENSE("GPL");
-Index: linux-2.6.18-avr32/include/asm-avr32/periph/lcdc.h
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.18-avr32/include/asm-avr32/periph/lcdc.h 2006-11-02 16:08:35.000000000 +0100
-@@ -0,0 +1,271 @@
-+/*
-+ * Register definitions for Atmel/SIDSA LCD Controller
-+ *
-+ * Copyright (C) 2004-2006 Atmel Corporation
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ */
-+#ifndef __ASM_AVR32_PERIPH_LCDC_H__
-+#define __ASM_AVR32_PERIPH_LCDC_H__
-+
-+#define LCDC_CONTRAST_CTR 0x00000840
-+# define LCDC_CONTRAST_CTR_ENA_OFFSET 3
-+# define LCDC_CONTRAST_CTR_ENA_SIZE 1
-+# define LCDC_CONTRAST_CTR_POL_OFFSET 2
-+# define LCDC_CONTRAST_CTR_POL_SIZE 1
-+# define LCDC_CONTRAST_CTR_PS_OFFSET 0
-+# define LCDC_CONTRAST_CTR_PS_SIZE 2
-+#define LCDC_CONTRAST_VAL 0x00000844
-+# define LCDC_CONTRAST_VAL_CVAL_OFFSET 0
-+# define LCDC_CONTRAST_VAL_CVAL_SIZE 8
-+#define LCDC_DMABADDR1 0x00000000
-+# define LCDC_DMABADDR1_BADDR_U_OFFSET 0
-+# define LCDC_DMABADDR1_BADDR_U_SIZE 32
-+#define LCDC_DMABADDR2 0x00000004
-+# define LCDC_DMABADDR2_BADDR_L_OFFSET 0
-+# define LCDC_DMABADDR2_BADDR_L_SIZE 32
-+#define LCDC_DMACON 0x0000001C
-+# define LCDC_DMACON_DMABUSY_OFFSET 2
-+# define LCDC_DMACON_DMABUSY_SIZE 1
-+# define LCDC_DMACON_DMAEN_OFFSET 0
-+# define LCDC_DMACON_DMAEN_SIZE 1
-+# define LCDC_DMACON_DMARST_OFFSET 1
-+# define LCDC_DMACON_DMARST_SIZE 1
-+# define LCDC_DMACON_DMAUPDT_OFFSET 3
-+# define LCDC_DMACON_DMAUPDT_SIZE 1
-+# define LCDC_DMACON_DMA2DEN_OFFSET 4
-+# define LCDC_DMACON_DMA2DEN_SIZE 1
-+#define LCDC_DMAFRMADD1 0x00000010
-+# define LCDC_DMAFRMADD1_FRMADD_U_OFFSET 0
-+# define LCDC_DMAFRMADD1_FRMADD_U_SIZE 32
-+#define LCDC_DMAFRMADD2 0x00000014
-+# define LCDC_DMAFRMADD2_FRMADD_L_OFFSET 0
-+# define LCDC_DMAFRMADD2_FRMADD_L_SIZE 32
-+#define LCDC_DMAFRMCFG 0x00000018
-+# define LCDC_DMAFRMCFG_BRSTLEN_OFFSET 24
-+# define LCDC_DMAFRMCFG_BRSTLEN_SIZE 7
-+# define LCDC_DMAFRMCFG_FRMSIZE_OFFSET 0
-+# define LCDC_DMAFRMCFG_FRMSIZE_SIZE 23
-+#define LCDC_DMAFRMPT1 0x00000008
-+# define LCDC_DMAFRMPT1_FRMPT_U_OFFSET 0
-+# define LCDC_DMAFRMPT1_FRMPT_U_SIZE 23
-+#define LCDC_DMAFRMPT2 0x0000000C
-+# define LCDC_DMAFRMPT2_FRMPT_L_OFFSET 0
-+# define LCDC_DMAFRMPT2_FRMPT_L_SIZE 23
-+#define LCDC_DMA2DCFG 0x00000020
-+# define LCDC_DMA2DCFG_ADDRINC_OFFSET 0
-+# define LCDC_DMA2DCFG_ADDRINC_SIZE 16
-+# define LCDC_DMA2DCFG_PIXELOFF_OFFSET 24
-+# define LCDC_DMA2DCFG_PIXELOFF_SIZE 5
-+#define LCDC_DP1_2 0x0000081C
-+# define LCDC_DP1_2_DP1_2_OFFSET 0
-+# define LCDC_DP1_2_DP1_2_SIZE 8
-+#define LCDC_DP2_3 0x00000828
-+# define LCDC_DP2_3_DP2_3_OFFSET 0
-+# define LCDC_DP2_3_DP2_3_SIZE 12
-+#define LCDC_DP3_4 0x00000830
-+# define LCDC_DP3_4_DP3_4_OFFSET 0
-+# define LCDC_DP3_4_DP3_4_SIZE 16
-+#define LCDC_DP3_5 0x00000824
-+# define LCDC_DP3_5_DP3_5_OFFSET 0
-+# define LCDC_DP3_5_DP3_5_SIZE 20
-+#define LCDC_DP4_5 0x00000834
-+# define LCDC_DP4_5_DP4_5_OFFSET 0
-+# define LCDC_DP4_5_DP4_5_SIZE 20
-+#define LCDC_DP4_7 0x00000820
-+# define LCDC_DP4_7_DP4_7_OFFSET 0
-+# define LCDC_DP4_7_DP4_7_SIZE 28
-+#define LCDC_DP5_7 0x0000082C
-+# define LCDC_DP5_7_DP5_7_OFFSET 0
-+# define LCDC_DP5_7_DP5_7_SIZE 28
-+#define LCDC_DP6_7 0x00000838
-+# define LCDC_DP6_7_DP6_7_OFFSET 0
-+# define LCDC_DP6_7_DP6_7_SIZE 28
-+#define LCDC_LCDCON1 0x00000800
-+# define LCDC_LCDCON1_BYPASS_OFFSET 0
-+# define LCDC_LCDCON1_BYPASS_SIZE 1
-+# define LCDC_LCDCON1_CLKVAL_OFFSET 12
-+# define LCDC_LCDCON1_CLKVAL_SIZE 9
-+# define LCDC_LCDCON1_LINECNT_OFFSET 21
-+# define LCDC_LCDCON1_LINECNT_SIZE 11
-+#define LCDC_LCDCON2 0x00000804
-+# define LCDC_LCDCON2_CLKMOD_OFFSET 15
-+# define LCDC_LCDCON2_CLKMOD_SIZE 1
-+# define LCDC_LCDCON2_DISTYPE_OFFSET 0
-+# define LCDC_LCDCON2_DISTYPE_SIZE 2
-+# define LCDC_LCDCON2_IFWIDTH_OFFSET 3
-+# define LCDC_LCDCON2_IFWIDTH_SIZE 2
-+# define LCDC_LCDCON2_INVCLK_OFFSET 11
-+# define LCDC_LCDCON2_INVCLK_SIZE 1
-+# define LCDC_LCDCON2_INVDVAL_OFFSET 12
-+# define LCDC_LCDCON2_INVDVAL_SIZE 1
-+# define LCDC_LCDCON2_INVFRAME_OFFSET 9
-+# define LCDC_LCDCON2_INVFRAME_SIZE 1
-+# define LCDC_LCDCON2_INVLINE_OFFSET 10
-+# define LCDC_LCDCON2_INVLINE_SIZE 1
-+# define LCDC_LCDCON2_INVVD_OFFSET 8
-+# define LCDC_LCDCON2_INVVD_SIZE 1
-+# define LCDC_LCDCON2_MEMOR_OFFSET 30
-+# define LCDC_LCDCON2_MEMOR_SIZE 2
-+# define LCDC_LCDCON2_PIXELSIZE_OFFSET 5
-+# define LCDC_LCDCON2_PIXELSIZE_SIZE 3
-+# define LCDC_LCDCON2_SCANMOD_OFFSET 2
-+# define LCDC_LCDCON2_SCANMOD_SIZE 1
-+#define LCDC_LCDFIFO 0x00000814
-+# define LCDC_LCDFIFO_FIFOTH_OFFSET 0
-+# define LCDC_LCDFIFO_FIFOTH_SIZE 16
-+#define LCDC_LCDFRMCFG 0x00000810
-+# define LCDC_LCDFRMCFG_LINESIZE_OFFSET 21
-+# define LCDC_LCDFRMCFG_LINESIZE_SIZE 11
-+# define LCDC_LCDFRMCFG_LINEVAL_OFFSET 0
-+# define LCDC_LCDFRMCFG_LINEVAL_SIZE 11
-+#define LCDC_LCDMVAL 0x00000818
-+# define LCDC_LCDMVAL_MMODE_OFFSET 31
-+# define LCDC_LCDMVAL_MMODE_SIZE 1
-+# define LCDC_LCDMVAL_MVAL_OFFSET 0
-+# define LCDC_LCDMVAL_MVAL_SIZE 8
-+#define LCDC_LCDTIM1 0x00000808
-+# define LCDC_LCDTIM1_VBP_OFFSET 8
-+# define LCDC_LCDTIM1_VBP_SIZE 8
-+# define LCDC_LCDTIM1_VFP_OFFSET 0
-+# define LCDC_LCDTIM1_VFP_SIZE 8
-+# define LCDC_LCDTIM1_VHDLY_OFFSET 24
-+# define LCDC_LCDTIM1_VHDLY_SIZE 4
-+# define LCDC_LCDTIM1_VPW_OFFSET 16
-+# define LCDC_LCDTIM1_VPW_SIZE 6
-+#define LCDC_LCDTIM2 0x0000080C
-+# define LCDC_LCDTIM2_HBP_OFFSET 0
-+# define LCDC_LCDTIM2_HBP_SIZE 8
-+# define LCDC_LCDTIM2_HFP_OFFSET 21
-+# define LCDC_LCDTIM2_HFP_SIZE 11
-+# define LCDC_LCDTIM2_HPW_OFFSET 8
-+# define LCDC_LCDTIM2_HPW_SIZE 6
-+#define LCDC_LCD_GPR 0x0000085C
-+# define LCDC_LCD_GPR_GPRB0_OFFSET 0
-+# define LCDC_LCD_GPR_GPRB0_SIZE 1
-+# define LCDC_LCD_GPR_GPRB1_OFFSET 1
-+# define LCDC_LCD_GPR_GPRB1_SIZE 1
-+# define LCDC_LCD_GPR_GPRB2_OFFSET 2
-+# define LCDC_LCD_GPR_GPRB2_SIZE 1
-+# define LCDC_LCD_GPR_GPRB3_OFFSET 3
-+# define LCDC_LCD_GPR_GPRB3_SIZE 1
-+# define LCDC_LCD_GPR_GPRB4_OFFSET 4
-+# define LCDC_LCD_GPR_GPRB4_SIZE 1
-+# define LCDC_LCD_GPR_GPRB5_OFFSET 5
-+# define LCDC_LCD_GPR_GPRB5_SIZE 1
-+# define LCDC_LCD_GPR_GPRB6_OFFSET 6
-+# define LCDC_LCD_GPR_GPRB6_SIZE 1
-+# define LCDC_LCD_GPR_GPRB7_OFFSET 7
-+# define LCDC_LCD_GPR_GPRB7_SIZE 1
-+#define LCDC_LCD_ICR 0x00000858
-+# define LCDC_LCD_ICR_EOFIC_OFFSET 2
-+# define LCDC_LCD_ICR_EOFIC_SIZE 1
-+# define LCDC_LCD_ICR_LNIC_OFFSET 0
-+# define LCDC_LCD_ICR_LNIC_SIZE 1
-+# define LCDC_LCD_ICR_LSTLNIC_OFFSET 1
-+# define LCDC_LCD_ICR_LSTLNIC_SIZE 1
-+# define LCDC_LCD_ICR_MERIC_OFFSET 6
-+# define LCDC_LCD_ICR_MERIC_SIZE 1
-+# define LCDC_LCD_ICR_OWRIC_OFFSET 5
-+# define LCDC_LCD_ICR_OWRIC_SIZE 1
-+# define LCDC_LCD_ICR_UFLWIC_OFFSET 4
-+# define LCDC_LCD_ICR_UFLWIC_SIZE 1
-+#define LCDC_LCD_IDR 0x0000084C
-+# define LCDC_LCD_IDR_EOFID_OFFSET 2
-+# define LCDC_LCD_IDR_EOFID_SIZE 1
-+# define LCDC_LCD_IDR_LNID_OFFSET 0
-+# define LCDC_LCD_IDR_LNID_SIZE 1
-+# define LCDC_LCD_IDR_LSTLNID_OFFSET 1
-+# define LCDC_LCD_IDR_LSTLNID_SIZE 1
-+# define LCDC_LCD_IDR_MERID_OFFSET 6
-+# define LCDC_LCD_IDR_MERID_SIZE 1
-+# define LCDC_LCD_IDR_OWRID_OFFSET 5
-+# define LCDC_LCD_IDR_OWRID_SIZE 1
-+# define LCDC_LCD_IDR_UFLWID_OFFSET 4
-+# define LCDC_LCD_IDR_UFLWID_SIZE 1
-+#define LCDC_LCD_IER 0x00000848
-+# define LCDC_LCD_IER_EOFIE_OFFSET 2
-+# define LCDC_LCD_IER_EOFIE_SIZE 1
-+# define LCDC_LCD_IER_LNIE_OFFSET 0
-+# define LCDC_LCD_IER_LNIE_SIZE 1
-+# define LCDC_LCD_IER_LSTLNIE_OFFSET 1
-+# define LCDC_LCD_IER_LSTLNIE_SIZE 1
-+# define LCDC_LCD_IER_MERIE_OFFSET 6
-+# define LCDC_LCD_IER_MERIE_SIZE 1
-+# define LCDC_LCD_IER_OWRIE_OFFSET 5
-+# define LCDC_LCD_IER_OWRIE_SIZE 1
-+# define LCDC_LCD_IER_UFLWIE_OFFSET 4
-+# define LCDC_LCD_IER_UFLWIE_SIZE 1
-+#define LCDC_LCD_IMR 0x00000850
-+# define LCDC_LCD_IMR_EOFIM_OFFSET 2
-+# define LCDC_LCD_IMR_EOFIM_SIZE 1
-+# define LCDC_LCD_IMR_LNIM_OFFSET 0
-+# define LCDC_LCD_IMR_LNIM_SIZE 1
-+# define LCDC_LCD_IMR_LSTLNIM_OFFSET 1
-+# define LCDC_LCD_IMR_LSTLNIM_SIZE 1
-+# define LCDC_LCD_IMR_MERIM_OFFSET 6
-+# define LCDC_LCD_IMR_MERIM_SIZE 1
-+# define LCDC_LCD_IMR_OWRIM_OFFSET 5
-+# define LCDC_LCD_IMR_OWRIM_SIZE 1
-+# define LCDC_LCD_IMR_UFLWIM_OFFSET 4
-+# define LCDC_LCD_IMR_UFLWIM_SIZE 1
-+#define LCDC_LCD_IRR 0x00000864
-+# define LCDC_LCD_IRR_EOFIR_OFFSET 2
-+# define LCDC_LCD_IRR_EOFIR_SIZE 1
-+# define LCDC_LCD_IRR_LNIR_OFFSET 0
-+# define LCDC_LCD_IRR_LNIR_SIZE 1
-+# define LCDC_LCD_IRR_LSTLNIR_OFFSET 1
-+# define LCDC_LCD_IRR_LSTLNIR_SIZE 1
-+# define LCDC_LCD_IRR_MERIR_OFFSET 6
-+# define LCDC_LCD_IRR_MERIR_SIZE 1
-+# define LCDC_LCD_IRR_OWRIR_OFFSET 5
-+# define LCDC_LCD_IRR_OWRIR_SIZE 1
-+# define LCDC_LCD_IRR_UFLWIR_OFFSET 4
-+# define LCDC_LCD_IRR_UFLWIR_SIZE 1
-+#define LCDC_LCD_ISR 0x00000854
-+# define LCDC_LCD_ISR_EOFIS_OFFSET 2
-+# define LCDC_LCD_ISR_EOFIS_SIZE 1
-+# define LCDC_LCD_ISR_LNIS_OFFSET 0
-+# define LCDC_LCD_ISR_LNIS_SIZE 1
-+# define LCDC_LCD_ISR_LSTLNIS_OFFSET 1
-+# define LCDC_LCD_ISR_LSTLNIS_SIZE 1
-+# define LCDC_LCD_ISR_MERIS_OFFSET 6
-+# define LCDC_LCD_ISR_MERIS_SIZE 1
-+# define LCDC_LCD_ISR_OWRIS_OFFSET 5
-+# define LCDC_LCD_ISR_OWRIS_SIZE 1
-+# define LCDC_LCD_ISR_UFLWIS_OFFSET 4
-+# define LCDC_LCD_ISR_UFLWIS_SIZE 1
-+#define LCDC_LCD_ITR 0x00000860
-+# define LCDC_LCD_ITR_EOFIT_OFFSET 2
-+# define LCDC_LCD_ITR_EOFIT_SIZE 1
-+# define LCDC_LCD_ITR_LNIT_OFFSET 0
-+# define LCDC_LCD_ITR_LNIT_SIZE 1
-+# define LCDC_LCD_ITR_LSTLNIT_OFFSET 1
-+# define LCDC_LCD_ITR_LSTLNIT_SIZE 1
-+# define LCDC_LCD_ITR_MERIT_OFFSET 6
-+# define LCDC_LCD_ITR_MERIT_SIZE 1
-+# define LCDC_LCD_ITR_OWRIT_OFFSET 5
-+# define LCDC_LCD_ITR_OWRIT_SIZE 1
-+# define LCDC_LCD_ITR_UFLWIT_OFFSET 4
-+# define LCDC_LCD_ITR_UFLWIT_SIZE 1
-+#define LCDC_PWRCON 0x0000083C
-+# define LCDC_PWRCON_GUARD_TIME_OFFSET 1
-+# define LCDC_PWRCON_GUARD_TIME_SIZE 7
-+# define LCDC_PWRCON_LCD_BUSY_OFFSET 31
-+# define LCDC_PWRCON_LCD_BUSY_SIZE 1
-+# define LCDC_PWRCON_LCD_PWR_OFFSET 0
-+# define LCDC_PWRCON_LCD_PWR_SIZE 1
-+
-+#define LCDC_BIT(name) (1 << LCDC_##name##_OFFSET)
-+#define LCDC_MKBF(name,value) (((value) & ((1 << LCDC_##name##_SIZE) - 1)) << LCDC_##name##_OFFSET)
-+#define LCDC_GETBF(name,value) (((value) >> LCDC_##name##_OFFSET) & ((1 << LCDC_##name##_SIZE) - 1))
-+#define LCDC_INSBF(name,value,old) (((old) & ~(((1 << LCDC_##name##_SIZE) - 1) << LCDC_##name##_OFFSET)) | LCDC_MKBF(name, value))
-+
-+#define lcdc_readl(port,reg) \
-+ __raw_readl((port)->regs + LCDC_##reg)
-+#define lcdc_writel(port,reg,value) \
-+ __raw_writel((value), (port)->regs + LCDC_##reg)
-+
-+#endif /* __ASM_AVR32_PERIPH_LCDC_H__ */
-Index: linux-2.6.18-avr32/include/linux/fb.h
-===================================================================
---- linux-2.6.18-avr32.orig/include/linux/fb.h 2006-11-02 15:54:18.000000000 +0100
-+++ linux-2.6.18-avr32/include/linux/fb.h 2006-11-02 15:56:20.000000000 +0100
-@@ -191,6 +191,7 @@ struct fb_bitfield {
- /* vtotal = 144d/288n/576i => PAL */
- /* vtotal = 121d/242n/484i => NTSC */
- #define FB_SYNC_ON_GREEN 32 /* sync on green */
-+#define FB_SYNC_PCLK_RISING 64 /* pixel data sampled on rising pclk */
-
- #define FB_VMODE_NONINTERLACED 0 /* non interlaced */
- #define FB_VMODE_INTERLACED 1 /* interlaced */
-@@ -825,7 +826,7 @@ struct fb_info {
- #define fb_writeq sbus_writeq
- #define fb_memset sbus_memset_io
-
--#elif defined(__i386__) || defined(__alpha__) || defined(__x86_64__) || defined(__hppa__) || (defined(__sh__) && !defined(__SH5__)) || defined(__powerpc__)
-+#elif defined(__i386__) || defined(__alpha__) || defined(__x86_64__) || defined(__hppa__) || (defined(__sh__) && !defined(__SH5__)) || defined(__powerpc__) || defined(__avr32__)
-
- #define fb_readb __raw_readb
- #define fb_readw __raw_readw