1/* 2 * Board-specific setup code for the ATEVKLCD10X addon board to the ATNGW100 3 * Network Gateway 4 * 5 * Copyright (C) 2008 Atmel Corporation 6 * 7 * This program is free software; you can redistribute it and/or modify it 8 * under the terms of the GNU General Public License version 2 as published by 9 * the Free Software Foundation. 10 */ 11 12#include <linux/init.h> 13#include <linux/linkage.h> 14#include <linux/gpio.h> 15#include <linux/fb.h> 16#include <linux/platform_device.h> 17 18#include <video/atmel_lcdc.h> 19 20#include <asm/setup.h> 21 22#include <mach/at32ap700x.h> 23#include <mach/portmux.h> 24#include <mach/board.h> 25 26#include <sound/atmel-ac97c.h> 27 28static struct ac97c_platform_data __initdata ac97c0_data = { 29 .reset_pin = GPIO_PIN_PB(19), 30}; 31 32#ifdef CONFIG_BOARD_ATNGW100_EVKLCD10X_VGA 33static struct fb_videomode __initdata tcg057vglad_modes[] = { 34 { 35 .name = "640x480 @ 50", 36 .refresh = 50, 37 .xres = 640, .yres = 480, 38 .pixclock = KHZ2PICOS(25180), 39 40 .left_margin = 64, .right_margin = 96, 41 .upper_margin = 34, .lower_margin = 11, 42 .hsync_len = 64, .vsync_len = 15, 43 44 .sync = 0, 45 .vmode = FB_VMODE_NONINTERLACED, 46 }, 47}; 48 49static struct fb_monspecs __initdata atevklcd10x_default_monspecs = { 50 .manufacturer = "KYO", 51 .monitor = "TCG057VGLAD", 52 .modedb = tcg057vglad_modes, 53 .modedb_len = ARRAY_SIZE(tcg057vglad_modes), 54 .hfmin = 19948, 55 .hfmax = 31478, 56 .vfmin = 50, 57 .vfmax = 67, 58 .dclkmax = 28330000, 59}; 60 61static struct atmel_lcdfb_info __initdata atevklcd10x_lcdc_data = { 62 .default_bpp = 16, 63 .default_dmacon = ATMEL_LCDC_DMAEN | ATMEL_LCDC_DMA2DEN, 64 .default_lcdcon2 = (ATMEL_LCDC_DISTYPE_TFT 65 | ATMEL_LCDC_CLKMOD_ALWAYSACTIVE 66 | ATMEL_LCDC_MEMOR_BIG), 67 .default_monspecs = &atevklcd10x_default_monspecs, 68 .guard_time = 2, 69}; 70#elif CONFIG_BOARD_ATNGW100_EVKLCD10X_QVGA 71static struct fb_videomode __initdata tcg057qvlad_modes[] = { 72 { 73 .name = "320x240 @ 50", 74 .refresh = 50, 75 .xres = 320, .yres = 240, 76 .pixclock = KHZ2PICOS(6300), 77 78 .left_margin = 34, .right_margin = 46, 79 .upper_margin = 7, .lower_margin = 15, 80 .hsync_len = 64, .vsync_len = 12, 81 82 .sync = 0, 83 .vmode = FB_VMODE_NONINTERLACED, 84 }, 85}; 86 87static struct fb_monspecs __initdata atevklcd10x_default_monspecs = { 88 .manufacturer = "KYO", 89 .monitor = "TCG057QVLAD", 90 .modedb = tcg057qvlad_modes, 91 .modedb_len = ARRAY_SIZE(tcg057qvlad_modes), 92 .hfmin = 19948, 93 .hfmax = 31478, 94 .vfmin = 50, 95 .vfmax = 67, 96 .dclkmax = 7000000, 97}; 98 99static struct atmel_lcdfb_info __initdata atevklcd10x_lcdc_data = { 100 .default_bpp = 16, 101 .default_dmacon = ATMEL_LCDC_DMAEN | ATMEL_LCDC_DMA2DEN, 102 .default_lcdcon2 = (ATMEL_LCDC_DISTYPE_TFT 103 | ATMEL_LCDC_CLKMOD_ALWAYSACTIVE 104 | ATMEL_LCDC_MEMOR_BIG), 105 .default_monspecs = &atevklcd10x_default_monspecs, 106 .guard_time = 2, 107}; 108#elif CONFIG_BOARD_ATNGW100_EVKLCD10X_POW_QVGA 109static struct fb_videomode __initdata ph320240t_modes[] = { 110 { 111 .name = "320x240 @ 60", 112 .refresh = 60, 113 .xres = 320, .yres = 240, 114 .pixclock = KHZ2PICOS(6300), 115 116 .left_margin = 38, .right_margin = 20, 117 .upper_margin = 15, .lower_margin = 5, 118 .hsync_len = 30, .vsync_len = 3, 119 120 .sync = 0, 121 .vmode = FB_VMODE_NONINTERLACED, 122 }, 123}; 124 125static struct fb_monspecs __initdata atevklcd10x_default_monspecs = { 126 .manufacturer = "POW", 127 .monitor = "PH320240T", 128 .modedb = ph320240t_modes, 129 .modedb_len = ARRAY_SIZE(ph320240t_modes), 130 .hfmin = 14400, 131 .hfmax = 21600, 132 .vfmin = 50, 133 .vfmax = 90, 134 .dclkmax = 6400000, 135}; 136 137static struct atmel_lcdfb_info __initdata atevklcd10x_lcdc_data = { 138 .default_bpp = 16, 139 .default_dmacon = ATMEL_LCDC_DMAEN | ATMEL_LCDC_DMA2DEN, 140 .default_lcdcon2 = (ATMEL_LCDC_DISTYPE_TFT 141 | ATMEL_LCDC_CLKMOD_ALWAYSACTIVE 142 | ATMEL_LCDC_MEMOR_BIG), 143 .default_monspecs = &atevklcd10x_default_monspecs, 144 .guard_time = 2, 145}; 146#endif 147 148static void atevklcd10x_lcdc_power_control(int on) 149{ 150 gpio_set_value(GPIO_PIN_PB(15), on); 151} 152 153static int __init atevklcd10x_init(void) 154{ 155 /* PB15 is connected to the enable line on the boost regulator 156 * controlling the backlight for the LCD panel. 157 */ 158 at32_select_gpio(GPIO_PIN_PB(15), AT32_GPIOF_OUTPUT); 159 gpio_request(GPIO_PIN_PB(15), "backlight"); 160 gpio_direction_output(GPIO_PIN_PB(15), 0); 161 162 atevklcd10x_lcdc_data.atmel_lcdfb_power_control = 163 atevklcd10x_lcdc_power_control; 164 165 at32_add_device_lcdc(0, &atevklcd10x_lcdc_data, 166 fbmem_start, fbmem_size, 167#ifdef CONFIG_BOARD_ATNGW100_MKII 168 ATMEL_LCDC_PRI_18BIT | ATMEL_LCDC_PC_DVAL 169#else 170 ATMEL_LCDC_ALT_18BIT | ATMEL_LCDC_PE_DVAL 171#endif 172 ); 173 174 at32_add_device_ac97c(0, &ac97c0_data, AC97C_BOTH); 175 176 return 0; 177} 178postcore_initcall(atevklcd10x_init); 179