diff -Nrup linux-2.6.23/arch/avr32/boards/atngw100/flash.c linux-2.6.23-patched/arch/avr32/boards/atngw100/flash.c --- a/arch/avr32/boards/atngw100/flash.c 2008-01-31 10:47:55.000000000 -0500 +++ b/arch/avr32/boards/atngw100/flash.c 2008-01-31 10:21:07.000000000 -0500 @@ -42,7 +42,6 @@ static struct mtd_partition flash_parts[ .name = "u-boot", .offset = 0x00000000, .size = 0x00020000, /* 128 KiB */ - .mask_flags = MTD_WRITEABLE, }, { .name = "root", diff -Nrup linux-2.6.23/arch/avr32/boards/atngw100/setup.c linux-2.6.23-patched/arch/avr32/boards/atngw100/setup.c --- a/arch/avr32/boards/atngw100/setup.c 2008-01-31 10:47:55.000000000 -0500 +++ b/arch/avr32/boards/atngw100/setup.c 2008-01-31 10:28:00.000000000 -0500 @@ -16,6 +16,8 @@ #include <linux/types.h> #include <linux/leds.h> #include <linux/spi/spi.h> +#include <linux/fb.h> +#include <video/atmel_lcdc.h> #include <asm/io.h> #include <asm/setup.h> @@ -27,6 +29,58 @@ /* Initialized by bootloader-specific startup code. */ struct tag *bootloader_tags __initdata; +static struct fb_videomode __initdata video_modes[] = { + { + .name = "640x480@60", + .refresh = 60, + .xres = 640, .yres = 480, + .pixclock = KHZ2PICOS(23856), + + .left_margin = 80, .right_margin = 16, + .upper_margin = 13, .lower_margin = 1, + .hsync_len = 64, .vsync_len = 3, + + .sync = 0, + .vmode = FB_VMODE_NONINTERLACED, + }, + { + .name = "320x240@117", + .refresh = 117, + .xres = 320, .yres = 240, + .pixclock = KHZ2PICOS(12074), + + .left_margin = 40, .right_margin = 8, + .upper_margin = 14, .lower_margin = 1, + .hsync_len = 32, .vsync_len = 3, + + .sync = 0, + .vmode = FB_VMODE_NONINTERLACED, + }, +}; + +static struct fb_monspecs __initdata atngw100_default_monspecs = { + .manufacturer = "ATM", + .monitor = "GENERIC", + .modedb = video_modes, + .modedb_len = ARRAY_SIZE(video_modes), + .hfmin = 14820, + .hfmax = 32000, + .vfmin = 30, + .vfmax = 200, + .dclkmax = 30000000, +}; + +struct atmel_lcdfb_info __initdata atngw100_lcdc_data = { + .default_bpp = 16, + .default_dmacon = ATMEL_LCDC_DMAEN | ATMEL_LCDC_DMA2DEN, + .default_lcdcon2 = (ATMEL_LCDC_DISTYPE_TFT + | ATMEL_LCDC_INVCLK + | ATMEL_LCDC_INVDVAL_NORMAL + | ATMEL_LCDC_CLKMOD_ALWAYSACTIVE + | ATMEL_LCDC_MEMOR_BIG), + .default_monspecs = &atngw100_default_monspecs, + .guard_time = 2, +}; struct eth_addr { u8 addr[6]; @@ -156,16 +210,19 @@ static int __init atngw100_init(void) * reserve any pins for it. */ + at32_add_device_lcdc(1, &atngw100_lcdc_data, fbmem_start, fbmem_size); + at32_add_system_devices(); at32_add_device_usart(0); set_hw_addr(at32_add_device_eth(0, ð_data[0])); - set_hw_addr(at32_add_device_eth(1, ð_data[1])); + //set_hw_addr(at32_add_device_eth(1, ð_data[1])); at32_add_device_spi(0, spi0_board_info, ARRAY_SIZE(spi0_board_info)); at32_add_device_mci(0, &mci0_data); at32_add_device_usba(0, NULL); + at32_add_device_ac97c(0); for (i = 0; i < ARRAY_SIZE(ngw_leds); i++) { at32_select_gpio(ngw_leds[i].gpio, diff -Nrup linux-2.6.23/arch/avr32/mach-at32ap/at32ap700x.c linux-2.6.23-patched/arch/avr32/mach-at32ap/at32ap700x.c --- a/arch/avr32/mach-at32ap/at32ap700x.c 2008-01-31 10:47:55.000000000 -0500 +++ b/arch/avr32/mach-at32ap/at32ap700x.c 2008-01-31 10:29:22.000000000 -0500 @@ -1116,6 +1116,15 @@ at32_add_device_lcdc(unsigned int id, st struct fb_videomode *modedb; unsigned int modedb_size; + /* help to prevent DMA underruns, which causes + the screen position to jump around */ + hmatrix_writel(SCFG4, HMATRIX_BIT(ARBT) + | HMATRIX_BF(FIXED_DEFMSTR, 0x5) + | HMATRIX_BF(SLOT_CYCLE, 0x40) + | HMATRIX_BF(DEFMSTR_TYPE + , HMATRIX_DEFMSTR_TYPE_FIXED_DEFAULT)); + hmatrix_writel(PRAS4, 0x0FF00000); + /* * Do a deep copy of the fb data, monspecs and modedb. Make * sure all allocations are done before setting up the @@ -1133,7 +1142,7 @@ at32_add_device_lcdc(unsigned int id, st monspecs->modedb = modedb; switch (id) { - case 0: + case 0: // STK1000 peripheral connections pdev = &atmel_lcdfb0_device; select_peripheral(PC(19), PERIPH_A, 0); /* CC */ select_peripheral(PC(20), PERIPH_A, 0); /* HSYNC */ @@ -1170,6 +1179,43 @@ at32_add_device_lcdc(unsigned int id, st clk_set_parent(&atmel_lcdfb0_pixclk, &pll0); clk_set_rate(&atmel_lcdfb0_pixclk, clk_get_rate(&pll0)); break; + case 1: // NGW100 peripheral connections + pdev = &atmel_lcdfb0_device; + //select_peripheral(PC(19), PERIPH_B, 0); /* CC */ + select_peripheral(PC(20), PERIPH_A, 0); /* HSYNC */ + select_peripheral(PC(21), PERIPH_A, 0); /* PCLK */ + select_peripheral(PC(22), PERIPH_A, 0); /* VSYNC */ + select_peripheral(PE(1), PERIPH_B, 0); /* DVAL */ + select_peripheral(PE(2), PERIPH_B, 0); /* MODE */ + //select_peripheral(PC(25), PERIPH_A, 0); /* PWR */ + select_peripheral(PE(3), PERIPH_B, 0); /* DATA0 */ + select_peripheral(PE(4), PERIPH_B, 0); /* DATA1 */ + select_peripheral(PE(5), PERIPH_B, 0); /* DATA2 */ + select_peripheral(PE(6), PERIPH_B, 0); /* DATA3 */ + select_peripheral(PE(7), PERIPH_B, 0); /* DATA4 */ + select_peripheral(PC(31), PERIPH_A, 0); /* DATA5 */ + select_peripheral(PD(0), PERIPH_A, 0); /* DATA6 */ + select_peripheral(PD(1), PERIPH_A, 0); /* DATA7 */ + select_peripheral(PE(8), PERIPH_B, 0); /* DATA8 */ + select_peripheral(PE(9), PERIPH_B, 0); /* DATA9 */ + select_peripheral(PE(10), PERIPH_B, 0); /* DATA10 */ + select_peripheral(PE(11), PERIPH_B, 0); /* DATA11 */ + select_peripheral(PE(12), PERIPH_B, 0); /* DATA12 */ + select_peripheral(PD(7), PERIPH_A, 0); /* DATA13 */ + select_peripheral(PD(8), PERIPH_A, 0); /* DATA14 */ + select_peripheral(PD(9), PERIPH_A, 0); /* DATA15 */ + select_peripheral(PE(13), PERIPH_B, 0); /* DATA16 */ + select_peripheral(PE(14), PERIPH_B, 0); /* DATA17 */ + select_peripheral(PE(15), PERIPH_B, 0); /* DATA18 */ + select_peripheral(PE(16), PERIPH_B, 0); /* DATA19 */ + select_peripheral(PE(17), PERIPH_B, 0); /* DATA20 */ + select_peripheral(PE(18), PERIPH_B, 0); /* DATA21 */ + select_peripheral(PD(16), PERIPH_A, 0); /* DATA22 */ + select_peripheral(PD(17), PERIPH_A, 0); /* DATA23 */ + + clk_set_parent(&atmel_lcdfb0_pixclk, &pll0); + clk_set_rate(&atmel_lcdfb0_pixclk, clk_get_rate(&pll0)); + break; default: goto err_invalid_id;