diff options
Diffstat (limited to 'target/device/Atmel/atngw100-expanded/kernel-patches/linux-2.6.23-300-atngw100-video.patch')
-rw-r--r-- | target/device/Atmel/atngw100-expanded/kernel-patches/linux-2.6.23-300-atngw100-video.patch | 175 |
1 files changed, 175 insertions, 0 deletions
diff --git a/target/device/Atmel/atngw100-expanded/kernel-patches/linux-2.6.23-300-atngw100-video.patch b/target/device/Atmel/atngw100-expanded/kernel-patches/linux-2.6.23-300-atngw100-video.patch new file mode 100644 index 000000000..16d2b9675 --- /dev/null +++ b/target/device/Atmel/atngw100-expanded/kernel-patches/linux-2.6.23-300-atngw100-video.patch @@ -0,0 +1,175 @@ +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; |