Path: blob/master/arch/avr32/boards/atngw100/mrmt.c
10819 views
/*1* Board-specific setup code for Remote Media Terminal 1 (RMT1)2* add-on board for the ATNGW100 Network Gateway3*4* Copyright (C) 2008 Mediama Technologies5* Based on ATNGW100 Network Gateway (Copyright (C) Atmel)6*7* This program is free software; you can redistribute it and/or modify8* it under the terms of the GNU General Public License version 2 as9* published by the Free Software Foundation.10*/11#include <linux/gpio.h>12#include <linux/init.h>13#include <linux/irq.h>14#include <linux/linkage.h>15#include <linux/platform_device.h>16#include <linux/types.h>17#include <linux/fb.h>18#include <linux/leds.h>19#include <linux/input.h>20#include <linux/gpio_keys.h>21#include <linux/atmel_serial.h>22#include <linux/spi/spi.h>23#include <linux/spi/ads7846.h>2425#include <video/atmel_lcdc.h>26#include <sound/atmel-ac97c.h>2728#include <asm/delay.h>29#include <asm/io.h>30#include <asm/setup.h>3132#include <mach/at32ap700x.h>33#include <mach/board.h>34#include <mach/init.h>35#include <mach/portmux.h>3637/* Define board-specifoic GPIO assignments */38#define PIN_LCD_BL GPIO_PIN_PA(28)39#define PWM_CH_BL 0 /* Must match with GPIO pin definition */40#define PIN_LCD_DISP GPIO_PIN_PA(31)41#define PIN_AC97_RST_N GPIO_PIN_PA(30)42#define PB_EXTINT_BASE 2543#define TS_IRQ 044#define PIN_TS_EXTINT GPIO_PIN_PB(PB_EXTINT_BASE+TS_IRQ)45#define PIN_PB_LEFT GPIO_PIN_PB(11)46#define PIN_PB_RIGHT GPIO_PIN_PB(12)47#define PIN_PWR_SW_N GPIO_PIN_PB(14)48#define PIN_PWR_ON GPIO_PIN_PB(13)49#define PIN_ZB_RST_N GPIO_PIN_PA(21)50#define PIN_BT_RST GPIO_PIN_PA(22)51#define PIN_LED_SYS GPIO_PIN_PA(16)52#define PIN_LED_A GPIO_PIN_PA(19)53#define PIN_LED_B GPIO_PIN_PE(19)5455#ifdef CONFIG_BOARD_MRMT_LCD_LQ043T3DX0X56/* Sharp LQ043T3DX0x (or compatible) panel */57static struct fb_videomode __initdata lcd_fb_modes[] = {58{59.name = "480x272 @ 59.94Hz",60.refresh = 59.94,61.xres = 480, .yres = 272,62.pixclock = KHZ2PICOS(9000),6364.left_margin = 2, .right_margin = 2,65.upper_margin = 3, .lower_margin = 9,66.hsync_len = 41, .vsync_len = 1,6768.sync = 0,69.vmode = FB_VMODE_NONINTERLACED,70},71};7273static struct fb_monspecs __initdata lcd_fb_default_monspecs = {74.manufacturer = "SHA",75.monitor = "LQ043T3DX02",76.modedb = lcd_fb_modes,77.modedb_len = ARRAY_SIZE(lcd_fb_modes),78.hfmin = 14915,79.hfmax = 17638,80.vfmin = 53,81.vfmax = 61,82.dclkmax = 9260000,83};8485static struct atmel_lcdfb_info __initdata rmt_lcdc_data = {86.default_bpp = 24,87.default_dmacon = ATMEL_LCDC_DMAEN | ATMEL_LCDC_DMA2DEN,88.default_lcdcon2 = (ATMEL_LCDC_DISTYPE_TFT89| ATMEL_LCDC_CLKMOD_ALWAYSACTIVE90| ATMEL_LCDC_INVCLK_NORMAL91| ATMEL_LCDC_MEMOR_BIG),92.lcd_wiring_mode = ATMEL_LCDC_WIRING_RGB,93.default_monspecs = &lcd_fb_default_monspecs,94.guard_time = 2,95};96#endif9798#ifdef CONFIG_BOARD_MRMT_LCD_KWH043GM0899/* Sharp KWH043GM08-Fxx (or compatible) panel */100static struct fb_videomode __initdata lcd_fb_modes[] = {101{102.name = "480x272 @ 59.94Hz",103.refresh = 59.94,104.xres = 480, .yres = 272,105.pixclock = KHZ2PICOS(9000),106107.left_margin = 2, .right_margin = 2,108.upper_margin = 3, .lower_margin = 9,109.hsync_len = 41, .vsync_len = 1,110111.sync = 0,112.vmode = FB_VMODE_NONINTERLACED,113},114};115116static struct fb_monspecs __initdata lcd_fb_default_monspecs = {117.manufacturer = "FOR",118.monitor = "KWH043GM08",119.modedb = lcd_fb_modes,120.modedb_len = ARRAY_SIZE(lcd_fb_modes),121.hfmin = 14915,122.hfmax = 17638,123.vfmin = 53,124.vfmax = 61,125.dclkmax = 9260000,126};127128static struct atmel_lcdfb_info __initdata rmt_lcdc_data = {129.default_bpp = 24,130.default_dmacon = ATMEL_LCDC_DMAEN | ATMEL_LCDC_DMA2DEN,131.default_lcdcon2 = (ATMEL_LCDC_DISTYPE_TFT132| ATMEL_LCDC_CLKMOD_ALWAYSACTIVE133| ATMEL_LCDC_INVCLK_INVERTED134| ATMEL_LCDC_MEMOR_BIG),135.lcd_wiring_mode = ATMEL_LCDC_WIRING_RGB,136.default_monspecs = &lcd_fb_default_monspecs,137.guard_time = 2,138};139#endif140141#ifdef CONFIG_BOARD_MRMT_AC97142static struct ac97c_platform_data __initdata ac97c0_data = {143.reset_pin = PIN_AC97_RST_N,144};145#endif146147#ifdef CONFIG_BOARD_MRMT_UCB1400_TS148/* NOTE: IRQ assignment relies on kernel module parameter */149static struct platform_device rmt_ts_device = {150.name = "ucb1400_ts",151.id = -1,152}153};154#endif155156#ifdef CONFIG_BOARD_MRMT_BL_PWM157/* PWM LEDs: LCD Backlight, etc */158static struct gpio_led rmt_pwm_led[] = {159/* here the "gpio" is actually a PWM channel */160{ .name = "backlight", .gpio = PWM_CH_BL, },161};162163static struct gpio_led_platform_data rmt_pwm_led_data = {164.num_leds = ARRAY_SIZE(rmt_pwm_led),165.leds = rmt_pwm_led,166};167168static struct platform_device rmt_pwm_led_dev = {169.name = "leds-atmel-pwm",170.id = -1,171.dev = {172.platform_data = &rmt_pwm_led_data,173},174};175#endif176177#ifdef CONFIG_BOARD_MRMT_ADS7846_TS178static int ads7846_pendown_state(void)179{180return !gpio_get_value( PIN_TS_EXTINT ); /* PENIRQ.*/181}182183static struct ads7846_platform_data ads_info = {184.model = 7846,185.keep_vref_on = 0, /* Use external VREF pin */186.vref_delay_usecs = 0,187.vref_mv = 3300, /* VREF = 3.3V */188.settle_delay_usecs = 800,189.penirq_recheck_delay_usecs = 800,190.x_plate_ohms = 750,191.y_plate_ohms = 300,192.pressure_max = 4096,193.debounce_max = 1,194.debounce_rep = 0,195.debounce_tol = (~0),196.get_pendown_state = ads7846_pendown_state,197.filter = NULL,198.filter_init = NULL,199};200201static struct spi_board_info spi01_board_info[] __initdata = {202{203.modalias = "ads7846",204.max_speed_hz = 31250*26,205.bus_num = 0,206.chip_select = 1,207.platform_data = &ads_info,208.irq = AT32_EXTINT(TS_IRQ),209},210};211#endif212213/* GPIO Keys: left, right, power, etc */214static const struct gpio_keys_button rmt_gpio_keys_buttons[] = {215[0] = {216.type = EV_KEY,217.code = KEY_POWER,218.gpio = PIN_PWR_SW_N,219.active_low = 1,220.desc = "power button",221},222[1] = {223.type = EV_KEY,224.code = KEY_LEFT,225.gpio = PIN_PB_LEFT,226.active_low = 1,227.desc = "left button",228},229[2] = {230.type = EV_KEY,231.code = KEY_RIGHT,232.gpio = PIN_PB_RIGHT,233.active_low = 1,234.desc = "right button",235},236};237238static const struct gpio_keys_platform_data rmt_gpio_keys_data = {239.nbuttons = ARRAY_SIZE(rmt_gpio_keys_buttons),240.buttons = (void *) rmt_gpio_keys_buttons,241};242243static struct platform_device rmt_gpio_keys = {244.name = "gpio-keys",245.id = -1,246.dev = {247.platform_data = (void *) &rmt_gpio_keys_data,248}249};250251#ifdef CONFIG_BOARD_MRMT_RTC_I2C252static struct i2c_board_info __initdata mrmt1_i2c_rtc = {253I2C_BOARD_INFO("s35390a", 0x30),254.irq = 0,255};256#endif257258static void mrmt_power_off(void)259{260/* PWR_ON=0 will force power off */261gpio_set_value( PIN_PWR_ON, 0 );262}263264static int __init mrmt1_init(void)265{266gpio_set_value( PIN_PWR_ON, 1 ); /* Ensure PWR_ON is enabled */267268pm_power_off = mrmt_power_off;269270/* Setup USARTS (other than console) */271at32_map_usart(2, 1, 0); /* USART 2: /dev/ttyS1, RMT1:DB9M */272at32_map_usart(3, 2, ATMEL_USART_RTS | ATMEL_USART_CTS);273/* USART 3: /dev/ttyS2, RMT1:Wireless, w/ RTS/CTS */274at32_add_device_usart(1);275at32_add_device_usart(2);276277/* Select GPIO Key pins */278at32_select_gpio( PIN_PWR_SW_N, AT32_GPIOF_DEGLITCH);279at32_select_gpio( PIN_PB_LEFT, AT32_GPIOF_DEGLITCH);280at32_select_gpio( PIN_PB_RIGHT, AT32_GPIOF_DEGLITCH);281platform_device_register(&rmt_gpio_keys);282283#ifdef CONFIG_BOARD_MRMT_RTC_I2C284i2c_register_board_info(0, &mrmt1_i2c_rtc, 1);285#endif286287#ifndef CONFIG_BOARD_MRMT_LCD_DISABLE288/* User "alternate" LCDC inferface on Port E & D */289/* NB: exclude LCDC_CC pin, as NGW100 reserves it for other use */290at32_add_device_lcdc(0, &rmt_lcdc_data,291fbmem_start, fbmem_size,292(ATMEL_LCDC_ALT_24BIT | ATMEL_LCDC_PE_DVAL ) );293#endif294295#ifdef CONFIG_BOARD_MRMT_AC97296at32_add_device_ac97c(0, &ac97c0_data, AC97C_BOTH);297#endif298299#ifdef CONFIG_BOARD_MRMT_ADS7846_TS300/* Select the Touchscreen interrupt pin mode */301at32_select_periph( GPIO_PIOB_BASE, 1 << (PB_EXTINT_BASE+TS_IRQ),302GPIO_PERIPH_A, AT32_GPIOF_DEGLITCH);303irq_set_irq_type(AT32_EXTINT(TS_IRQ), IRQ_TYPE_EDGE_FALLING);304at32_spi_setup_slaves(0,spi01_board_info,ARRAY_SIZE(spi01_board_info));305spi_register_board_info(spi01_board_info,ARRAY_SIZE(spi01_board_info));306#endif307308#ifdef CONFIG_BOARD_MRMT_UCB1400_TS309/* Select the Touchscreen interrupt pin mode */310at32_select_periph( GPIO_PIOB_BASE, 1 << (PB_EXTINT_BASE+TS_IRQ),311GPIO_PERIPH_A, AT32_GPIOF_DEGLITCH);312platform_device_register(&rmt_ts_device);313#endif314315at32_select_gpio( PIN_LCD_DISP, AT32_GPIOF_OUTPUT );316gpio_request( PIN_LCD_DISP, "LCD_DISP" );317gpio_direction_output( PIN_LCD_DISP, 0 ); /* LCD DISP */318#ifdef CONFIG_BOARD_MRMT_LCD_DISABLE319/* Keep Backlight and DISP off */320at32_select_gpio( PIN_LCD_BL, AT32_GPIOF_OUTPUT );321gpio_request( PIN_LCD_BL, "LCD_BL" );322gpio_direction_output( PIN_LCD_BL, 0 ); /* Backlight */323#else324gpio_set_value( PIN_LCD_DISP, 1 ); /* DISP asserted first */325#ifdef CONFIG_BOARD_MRMT_BL_PWM326/* Use PWM for Backlight controls */327at32_add_device_pwm(1 << PWM_CH_BL);328platform_device_register(&rmt_pwm_led_dev);329#else330/* Backlight always on */331udelay( 1 );332at32_select_gpio( PIN_LCD_BL, AT32_GPIOF_OUTPUT );333gpio_request( PIN_LCD_BL, "LCD_BL" );334gpio_direction_output( PIN_LCD_BL, 1 );335#endif336#endif337338/* Make sure BT and Zigbee modules in reset */339at32_select_gpio( PIN_BT_RST, AT32_GPIOF_OUTPUT );340gpio_request( PIN_BT_RST, "BT_RST" );341gpio_direction_output( PIN_BT_RST, 1 );342/* BT Module in Reset */343344at32_select_gpio( PIN_ZB_RST_N, AT32_GPIOF_OUTPUT );345gpio_request( PIN_ZB_RST_N, "ZB_RST_N" );346gpio_direction_output( PIN_ZB_RST_N, 0 );347/* XBee Module in Reset */348349#ifdef CONFIG_BOARD_MRMT_WIRELESS_ZB350udelay( 1000 );351/* Unreset the XBee Module */352gpio_set_value( PIN_ZB_RST_N, 1 );353#endif354#ifdef CONFIG_BOARD_MRMT_WIRELESS_BT355udelay( 1000 );356/* Unreset the BT Module */357gpio_set_value( PIN_BT_RST, 0 );358#endif359360return 0;361}362arch_initcall(mrmt1_init);363364static int __init mrmt1_early_init(void)365{366/* To maintain power-on signal in case boot loader did not already */367at32_select_gpio( PIN_PWR_ON, AT32_GPIOF_OUTPUT );368gpio_request( PIN_PWR_ON, "PIN_PWR_ON" );369gpio_direction_output( PIN_PWR_ON, 1 );370371return 0;372}373core_initcall(mrmt1_early_init);374375376