2008-02-09 06:49:55 +03:00
/*
* linux / arch / arm / mach - at91 / board - yl - 9200. c
*
2008-05-24 20:06:45 +04:00
* Adapted from various board files in arch / arm / mach - at91
*
* Modifications for YL - 9200 platform :
* Copyright ( C ) 2007 S . Birtles
2008-02-09 06:49:55 +03:00
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307 USA
*/
# include <linux/types.h>
2011-07-26 13:53:52 +04:00
# include <linux/gpio.h>
2008-02-09 06:49:55 +03:00
# include <linux/init.h>
# include <linux/mm.h>
# include <linux/module.h>
2008-05-24 20:06:45 +04:00
# include <linux/dma-mapping.h>
2008-02-09 06:49:55 +03:00
# include <linux/platform_device.h>
# include <linux/spi/spi.h>
# include <linux/spi/ads7846.h>
# include <linux/mtd/physmap.h>
2008-05-24 20:06:45 +04:00
# include <linux/gpio_keys.h>
# include <linux/input.h>
2008-02-09 06:49:55 +03:00
# include <asm/setup.h>
# include <asm/mach-types.h>
# include <asm/irq.h>
# include <asm/mach/arch.h>
# include <asm/mach/map.h>
# include <asm/mach/irq.h>
2008-09-22 00:30:02 +04:00
# include <mach/hardware.h>
2008-08-05 19:14:15 +04:00
# include <mach/board.h>
2012-06-11 17:38:03 +04:00
# include <mach/at91_aic.h>
2008-08-05 19:14:15 +04:00
# include <mach/at91rm9200_mc.h>
2012-02-13 08:58:53 +04:00
# include <mach/at91_ramc.h>
2011-04-24 07:40:22 +04:00
# include <mach/cpu.h>
2008-02-09 06:49:55 +03:00
# include "generic.h"
2011-04-28 16:19:32 +04:00
static void __init yl9200_init_early ( void )
2008-05-24 20:06:45 +04:00
{
2011-04-24 07:40:22 +04:00
/* Set cpu type: PQFP */
at91rm9200_set_type ( ARCH_REVISON_9200_PQFP ) ;
2008-05-24 20:06:45 +04:00
/* Initialize processor: 18.432 MHz crystal */
2011-04-23 11:28:34 +04:00
at91_initialize ( 18432000 ) ;
2008-02-09 06:49:55 +03:00
}
2008-05-24 20:06:45 +04:00
/*
* LEDs
*/
static struct gpio_led yl9200_leds [ ] = {
{ /* D2 */
. name = " led2 " ,
. gpio = AT91_PIN_PB17 ,
. active_low = 1 ,
. default_trigger = " timer " ,
} ,
{ /* D3 */
. name = " led3 " ,
. gpio = AT91_PIN_PB16 ,
. active_low = 1 ,
. default_trigger = " heartbeat " ,
} ,
{ /* D4 */
. name = " led4 " ,
. gpio = AT91_PIN_PB15 ,
. active_low = 1 ,
} ,
{ /* D5 */
. name = " led5 " ,
. gpio = AT91_PIN_PB8 ,
. active_low = 1 ,
}
2008-02-09 06:49:55 +03:00
} ;
/*
2008-05-24 20:06:45 +04:00
* Ethernet
*/
2011-03-08 23:17:06 +03:00
static struct macb_platform_data __initdata yl9200_eth_data = {
2008-05-24 20:06:45 +04:00
. phy_irq_pin = AT91_PIN_PB28 ,
. is_rmii = 1 ,
2008-02-09 06:49:55 +03:00
} ;
2008-05-24 20:06:45 +04:00
/*
* USB Host
*/
static struct at91_usbh_data __initdata yl9200_usbh_data = {
. ports = 1 , /* PQFP version of AT91RM9200 */
2011-11-24 21:51:06 +04:00
. vbus_pin = { - EINVAL , - EINVAL } ,
. overcurrent_pin = { - EINVAL , - EINVAL } ,
2008-02-09 06:49:55 +03:00
} ;
2008-05-24 20:06:45 +04:00
/*
* USB Device
*/
static struct at91_udc_data __initdata yl9200_udc_data = {
. pullup_pin = AT91_PIN_PC4 ,
. vbus_pin = AT91_PIN_PC5 ,
. pullup_active_low = 1 , /* Active Low due to PNP transistor (pg 7) */
2008-02-09 06:49:55 +03:00
} ;
2008-05-24 20:06:45 +04:00
/*
* MMC
*/
static struct at91_mmc_data __initdata yl9200_mmc_data = {
. det_pin = AT91_PIN_PB9 ,
. wire4 = 1 ,
2011-11-24 21:51:06 +04:00
. wp_pin = - EINVAL ,
. vcc_pin = - EINVAL ,
2008-02-09 06:49:55 +03:00
} ;
2008-05-24 20:06:45 +04:00
/*
* NAND Flash
*/
static struct mtd_partition __initdata yl9200_nand_partition [ ] = {
2008-02-09 06:49:55 +03:00
{
. name = " AT91 NAND partition 1, boot " ,
. offset = 0 ,
2008-09-22 00:30:02 +04:00
. size = SZ_256K
2008-02-09 06:49:55 +03:00
} ,
{
. name = " AT91 NAND partition 2, kernel " ,
2008-09-22 00:30:02 +04:00
. offset = MTDPART_OFS_NXTBLK ,
. size = ( 2 * SZ_1M ) - SZ_256K
2008-02-09 06:49:55 +03:00
} ,
{
. name = " AT91 NAND partition 3, filesystem " ,
2008-09-22 00:30:02 +04:00
. offset = MTDPART_OFS_NXTBLK ,
2008-02-09 06:49:55 +03:00
. size = 14 * SZ_1M
} ,
{
. name = " AT91 NAND partition 4, storage " ,
2008-09-22 00:30:02 +04:00
. offset = MTDPART_OFS_NXTBLK ,
. size = SZ_16M
2008-02-09 06:49:55 +03:00
} ,
{
. name = " AT91 NAND partition 5, ext-fs " ,
2008-09-22 00:30:02 +04:00
. offset = MTDPART_OFS_NXTBLK ,
. size = SZ_32M
2008-05-24 20:06:45 +04:00
}
2008-02-09 06:49:55 +03:00
} ;
2008-07-25 18:40:14 +04:00
static struct atmel_nand_data __initdata yl9200_nand_data = {
2008-05-24 20:06:45 +04:00
. ale = 6 ,
. cle = 7 ,
2011-11-24 21:51:06 +04:00
. det_pin = - EINVAL ,
2008-05-24 20:06:45 +04:00
. rdy_pin = AT91_PIN_PC14 , /* R/!B (Sheet10) */
. enable_pin = AT91_PIN_PC15 , /* !CE (Sheet10) */
2011-12-29 10:43:24 +04:00
. ecc_mode = NAND_ECC_SOFT ,
2011-05-29 17:49:22 +04:00
. parts = yl9200_nand_partition ,
. num_parts = ARRAY_SIZE ( yl9200_nand_partition ) ,
2008-02-09 06:49:55 +03:00
} ;
/*
2008-05-24 20:06:45 +04:00
* NOR Flash
*/
# define YL9200_FLASH_BASE AT91_CHIPSELECT_0
2008-09-22 00:30:02 +04:00
# define YL9200_FLASH_SIZE SZ_16M
2008-02-09 06:49:55 +03:00
2008-05-24 20:06:45 +04:00
static struct mtd_partition yl9200_flash_partitions [ ] = {
{
. name = " Bootloader " ,
. offset = 0 ,
2008-09-22 00:30:02 +04:00
. size = SZ_256K ,
2008-05-24 20:06:45 +04:00
. mask_flags = MTD_WRITEABLE , /* force read-only */
} ,
2008-02-09 06:49:55 +03:00
{
2008-05-24 20:06:45 +04:00
. name = " Kernel " ,
2008-09-22 00:30:02 +04:00
. offset = MTDPART_OFS_NXTBLK ,
. size = ( 2 * SZ_1M ) - SZ_256K
2008-05-24 20:06:45 +04:00
} ,
{
. name = " Filesystem " ,
2008-09-22 00:30:02 +04:00
. offset = MTDPART_OFS_NXTBLK ,
. size = MTDPART_SIZ_FULL
2008-02-09 06:49:55 +03:00
}
} ;
2008-05-24 20:06:45 +04:00
static struct physmap_flash_data yl9200_flash_data = {
. width = 2 ,
. parts = yl9200_flash_partitions ,
. nr_parts = ARRAY_SIZE ( yl9200_flash_partitions ) ,
2008-02-09 06:49:55 +03:00
} ;
2008-05-24 20:06:45 +04:00
static struct resource yl9200_flash_resources [ ] = {
{
. start = YL9200_FLASH_BASE ,
. end = YL9200_FLASH_BASE + YL9200_FLASH_SIZE - 1 ,
. flags = IORESOURCE_MEM ,
2008-02-09 06:49:55 +03:00
}
} ;
2008-05-24 20:06:45 +04:00
static struct platform_device yl9200_flash = {
2008-02-09 06:49:55 +03:00
. name = " physmap-flash " ,
. id = 0 ,
. dev = {
2008-05-24 20:06:45 +04:00
. platform_data = & yl9200_flash_data ,
2008-02-09 06:49:55 +03:00
} ,
2008-05-24 20:06:45 +04:00
. resource = yl9200_flash_resources ,
. num_resources = ARRAY_SIZE ( yl9200_flash_resources ) ,
2008-02-09 06:49:55 +03:00
} ;
2008-05-24 20:06:45 +04:00
/*
* I2C ( TWI )
*/
static struct i2c_board_info __initdata yl9200_i2c_devices [ ] = {
{ /* EEPROM */
I2C_BOARD_INFO ( " 24c128 " , 0x50 ) ,
2008-02-09 06:49:55 +03:00
}
} ;
2008-05-24 20:06:45 +04:00
/*
2008-02-09 06:49:55 +03:00
* GPIO Buttons
2008-05-24 20:06:45 +04:00
*/
2008-02-09 06:49:55 +03:00
# if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
2008-05-24 20:06:45 +04:00
static struct gpio_keys_button yl9200_buttons [ ] = {
2008-02-09 06:49:55 +03:00
{
. gpio = AT91_PIN_PA24 ,
2008-05-24 20:06:45 +04:00
. code = BTN_2 ,
2008-02-09 06:49:55 +03:00
. desc = " SW2 " ,
. active_low = 1 ,
. wakeup = 1 ,
} ,
{
. gpio = AT91_PIN_PB1 ,
2008-05-24 20:06:45 +04:00
. code = BTN_3 ,
2008-02-09 06:49:55 +03:00
. desc = " SW3 " ,
. active_low = 1 ,
. wakeup = 1 ,
} ,
{
. gpio = AT91_PIN_PB2 ,
2008-05-24 20:06:45 +04:00
. code = BTN_4 ,
2008-02-09 06:49:55 +03:00
. desc = " SW4 " ,
. active_low = 1 ,
. wakeup = 1 ,
} ,
{
. gpio = AT91_PIN_PB6 ,
2008-05-24 20:06:45 +04:00
. code = BTN_5 ,
2008-02-09 06:49:55 +03:00
. desc = " SW5 " ,
. active_low = 1 ,
. wakeup = 1 ,
2008-05-24 20:06:45 +04:00
}
2008-02-09 06:49:55 +03:00
} ;
2008-05-24 20:06:45 +04:00
static struct gpio_keys_platform_data yl9200_button_data = {
. buttons = yl9200_buttons ,
. nbuttons = ARRAY_SIZE ( yl9200_buttons ) ,
2008-02-09 06:49:55 +03:00
} ;
2008-05-24 20:06:45 +04:00
static struct platform_device yl9200_button_device = {
2008-02-09 06:49:55 +03:00
. name = " gpio-keys " ,
. id = - 1 ,
. num_resources = 0 ,
. dev = {
2008-05-24 20:06:45 +04:00
. platform_data = & yl9200_button_data ,
2008-02-09 06:49:55 +03:00
}
} ;
2008-05-24 20:06:45 +04:00
static void __init yl9200_add_device_buttons ( void )
2008-02-09 06:49:55 +03:00
{
2008-05-24 20:06:45 +04:00
at91_set_gpio_input ( AT91_PIN_PA24 , 1 ) ; /* SW2 */
2008-02-09 06:49:55 +03:00
at91_set_deglitch ( AT91_PIN_PA24 , 1 ) ;
2008-05-24 20:06:45 +04:00
at91_set_gpio_input ( AT91_PIN_PB1 , 1 ) ; /* SW3 */
2008-02-09 06:49:55 +03:00
at91_set_deglitch ( AT91_PIN_PB1 , 1 ) ;
2008-05-24 20:06:45 +04:00
at91_set_gpio_input ( AT91_PIN_PB2 , 1 ) ; /* SW4 */
2008-02-09 06:49:55 +03:00
at91_set_deglitch ( AT91_PIN_PB2 , 1 ) ;
2008-05-24 20:06:45 +04:00
at91_set_gpio_input ( AT91_PIN_PB6 , 1 ) ; /* SW5 */
2008-02-09 06:49:55 +03:00
at91_set_deglitch ( AT91_PIN_PB6 , 1 ) ;
2008-05-24 20:06:45 +04:00
/* Enable buttons (Sheet 5) */
at91_set_gpio_output ( AT91_PIN_PB7 , 1 ) ;
platform_device_register ( & yl9200_button_device ) ;
}
# else
static void __init yl9200_add_device_buttons ( void ) { }
# endif
/*
* Touchscreen
*/
# if defined(CONFIG_TOUCHSCREEN_ADS7846) || defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE)
static int ads7843_pendown_state ( void )
{
return ! at91_get_gpio_value ( AT91_PIN_PB11 ) ; /* Touchscreen PENIRQ */
}
static struct ads7846_platform_data ads_info = {
. model = 7843 ,
. x_min = 150 ,
. x_max = 3830 ,
. y_min = 190 ,
. y_max = 3830 ,
. vref_delay_usecs = 100 ,
/* For a 8" touch-screen */
// .x_plate_ohms = 603,
// .y_plate_ohms = 332,
/* For a 10.4" touch-screen */
// .x_plate_ohms = 611,
// .y_plate_ohms = 325,
. x_plate_ohms = 576 ,
. y_plate_ohms = 366 ,
. pressure_max = 15000 , /* generally nonsense on the 7843 */
. debounce_max = 1 ,
. debounce_rep = 0 ,
. debounce_tol = ( ~ 0 ) ,
. get_pendown_state = ads7843_pendown_state ,
} ;
2008-02-09 06:49:55 +03:00
2008-05-24 20:06:45 +04:00
static void __init yl9200_add_device_ts ( void )
{
at91_set_gpio_input ( AT91_PIN_PB11 , 1 ) ; /* Touchscreen interrupt pin */
at91_set_gpio_input ( AT91_PIN_PB10 , 1 ) ; /* Touchscreen BUSY signal - not used! */
2008-02-09 06:49:55 +03:00
}
# else
2008-05-24 20:06:45 +04:00
static void __init yl9200_add_device_ts ( void ) { }
# endif
/*
* SPI devices
*/
static struct spi_board_info yl9200_spi_devices [ ] = {
# if defined(CONFIG_TOUCHSCREEN_ADS7846) || defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE)
{ /* Touchscreen */
. modalias = " ads7846 " ,
. chip_select = 0 ,
. max_speed_hz = 5000 * 26 ,
. platform_data = & ads_info ,
. irq = AT91_PIN_PB11 ,
} ,
2008-02-09 06:49:55 +03:00
# endif
2008-05-24 20:06:45 +04:00
{ /* CAN */
. modalias = " mcp2510 " ,
. chip_select = 1 ,
. max_speed_hz = 25000 * 26 ,
. irq = AT91_PIN_PC0 ,
}
} ;
2008-02-09 06:49:55 +03:00
2008-05-24 20:06:45 +04:00
/*
* LCD / VGA
*
* EPSON S1D13806 FB ( discontinued chip )
* EPSON S1D13506 FB
*/
2010-11-21 06:24:07 +03:00
# if defined(CONFIG_FB_S1D13XXX) || defined(CONFIG_FB_S1D13XXX_MODULE)
2008-02-09 06:49:55 +03:00
# include <video/s1d13xxxfb.h>
2011-09-19 15:26:52 +04:00
static void yl9200_init_video ( void )
2008-02-09 06:49:55 +03:00
{
2008-05-24 20:06:45 +04:00
/* NWAIT Signal */
at91_set_A_periph ( AT91_PIN_PC6 , 0 ) ;
2008-02-09 06:49:55 +03:00
2008-05-24 20:06:45 +04:00
/* Initialization of the Static Memory Controller for Chip Select 2 */
2012-02-13 08:58:53 +04:00
at91_ramc_write ( 0 , AT91_SMC_CSR ( 2 ) , AT91_SMC_DBW_16 /* 16 bit */
2008-05-24 20:06:45 +04:00
| AT91_SMC_WSEN | AT91_SMC_NWS_ ( 0x4 ) /* wait states */
| AT91_SMC_TDF_ ( 0x100 ) /* float time */
) ;
2008-02-09 06:49:55 +03:00
}
2008-05-24 20:06:45 +04:00
static struct s1d13xxxfb_regval yl9200_s1dfb_initregs [ ] =
2008-02-09 06:49:55 +03:00
{
2008-05-24 20:06:45 +04:00
{ S1DREG_MISC , 0x00 } , /* Miscellaneous Register*/
{ S1DREG_COM_DISP_MODE , 0x01 } , /* Display Mode Register, LCD only*/
{ S1DREG_GPIO_CNF0 , 0x00 } , /* General IO Pins Configuration Register*/
{ S1DREG_GPIO_CTL0 , 0x00 } , /* General IO Pins Control Register*/
{ S1DREG_CLK_CNF , 0x11 } , /* Memory Clock Configuration Register*/
{ S1DREG_LCD_CLK_CNF , 0x10 } , /* LCD Pixel Clock Configuration Register*/
{ S1DREG_CRT_CLK_CNF , 0x12 } , /* CRT/TV Pixel Clock Configuration Register*/
{ S1DREG_MPLUG_CLK_CNF , 0x01 } , /* MediaPlug Clock Configuration Register*/
{ S1DREG_CPU2MEM_WST_SEL , 0x02 } , /* CPU To Memory Wait State Select Register*/
{ S1DREG_MEM_CNF , 0x00 } , /* Memory Configuration Register*/
{ S1DREG_SDRAM_REF_RATE , 0x04 } , /* DRAM Refresh Rate Register, MCLK source*/
{ S1DREG_SDRAM_TC0 , 0x12 } , /* DRAM Timings Control Register 0*/
{ S1DREG_SDRAM_TC1 , 0x02 } , /* DRAM Timings Control Register 1*/
{ S1DREG_PANEL_TYPE , 0x25 } , /* Panel Type Register*/
{ S1DREG_MOD_RATE , 0x00 } , /* MOD Rate Register*/
{ S1DREG_LCD_DISP_HWIDTH , 0x4F } , /* LCD Horizontal Display Width Register*/
{ S1DREG_LCD_NDISP_HPER , 0x13 } , /* LCD Horizontal Non-Display Period Register*/
{ S1DREG_TFT_FPLINE_START , 0x01 } , /* TFT FPLINE Start Position Register*/
{ S1DREG_TFT_FPLINE_PWIDTH , 0x0c } , /* TFT FPLINE Pulse Width Register*/
{ S1DREG_LCD_DISP_VHEIGHT0 , 0xDF } , /* LCD Vertical Display Height Register 0*/
{ S1DREG_LCD_DISP_VHEIGHT1 , 0x01 } , /* LCD Vertical Display Height Register 1*/
{ S1DREG_LCD_NDISP_VPER , 0x2c } , /* LCD Vertical Non-Display Period Register*/
{ S1DREG_TFT_FPFRAME_START , 0x0a } , /* TFT FPFRAME Start Position Register*/
{ S1DREG_TFT_FPFRAME_PWIDTH , 0x02 } , /* TFT FPFRAME Pulse Width Register*/
{ S1DREG_LCD_DISP_MODE , 0x05 } , /* LCD Display Mode Register*/
{ S1DREG_LCD_MISC , 0x01 } , /* LCD Miscellaneous Register*/
{ S1DREG_LCD_DISP_START0 , 0x00 } , /* LCD Display Start Address Register 0*/
{ S1DREG_LCD_DISP_START1 , 0x00 } , /* LCD Display Start Address Register 1*/
{ S1DREG_LCD_DISP_START2 , 0x00 } , /* LCD Display Start Address Register 2*/
{ S1DREG_LCD_MEM_OFF0 , 0x80 } , /* LCD Memory Address Offset Register 0*/
{ S1DREG_LCD_MEM_OFF1 , 0x02 } , /* LCD Memory Address Offset Register 1*/
{ S1DREG_LCD_PIX_PAN , 0x03 } , /* LCD Pixel Panning Register*/
{ S1DREG_LCD_DISP_FIFO_HTC , 0x00 } , /* LCD Display FIFO High Threshold Control Register*/
{ S1DREG_LCD_DISP_FIFO_LTC , 0x00 } , /* LCD Display FIFO Low Threshold Control Register*/
{ S1DREG_CRT_DISP_HWIDTH , 0x4F } , /* CRT/TV Horizontal Display Width Register*/
{ S1DREG_CRT_NDISP_HPER , 0x13 } , /* CRT/TV Horizontal Non-Display Period Register*/
{ S1DREG_CRT_HRTC_START , 0x01 } , /* CRT/TV HRTC Start Position Register*/
{ S1DREG_CRT_HRTC_PWIDTH , 0x0B } , /* CRT/TV HRTC Pulse Width Register*/
{ S1DREG_CRT_DISP_VHEIGHT0 , 0xDF } , /* CRT/TV Vertical Display Height Register 0*/
{ S1DREG_CRT_DISP_VHEIGHT1 , 0x01 } , /* CRT/TV Vertical Display Height Register 1*/
{ S1DREG_CRT_NDISP_VPER , 0x2B } , /* CRT/TV Vertical Non-Display Period Register*/
{ S1DREG_CRT_VRTC_START , 0x09 } , /* CRT/TV VRTC Start Position Register*/
{ S1DREG_CRT_VRTC_PWIDTH , 0x01 } , /* CRT/TV VRTC Pulse Width Register*/
{ S1DREG_TV_OUT_CTL , 0x18 } , /* TV Output Control Register */
{ S1DREG_CRT_DISP_MODE , 0x05 } , /* CRT/TV Display Mode Register, 16BPP*/
{ S1DREG_CRT_DISP_START0 , 0x00 } , /* CRT/TV Display Start Address Register 0*/
{ S1DREG_CRT_DISP_START1 , 0x00 } , /* CRT/TV Display Start Address Register 1*/
{ S1DREG_CRT_DISP_START2 , 0x00 } , /* CRT/TV Display Start Address Register 2*/
{ S1DREG_CRT_MEM_OFF0 , 0x80 } , /* CRT/TV Memory Address Offset Register 0*/
{ S1DREG_CRT_MEM_OFF1 , 0x02 } , /* CRT/TV Memory Address Offset Register 1*/
{ S1DREG_CRT_PIX_PAN , 0x00 } , /* CRT/TV Pixel Panning Register*/
{ S1DREG_CRT_DISP_FIFO_HTC , 0x00 } , /* CRT/TV Display FIFO High Threshold Control Register*/
{ S1DREG_CRT_DISP_FIFO_LTC , 0x00 } , /* CRT/TV Display FIFO Low Threshold Control Register*/
{ S1DREG_LCD_CUR_CTL , 0x00 } , /* LCD Ink/Cursor Control Register*/
{ S1DREG_LCD_CUR_START , 0x01 } , /* LCD Ink/Cursor Start Address Register*/
{ S1DREG_LCD_CUR_XPOS0 , 0x00 } , /* LCD Cursor X Position Register 0*/
{ S1DREG_LCD_CUR_XPOS1 , 0x00 } , /* LCD Cursor X Position Register 1*/
{ S1DREG_LCD_CUR_YPOS0 , 0x00 } , /* LCD Cursor Y Position Register 0*/
{ S1DREG_LCD_CUR_YPOS1 , 0x00 } , /* LCD Cursor Y Position Register 1*/
{ S1DREG_LCD_CUR_BCTL0 , 0x00 } , /* LCD Ink/Cursor Blue Color 0 Register*/
{ S1DREG_LCD_CUR_GCTL0 , 0x00 } , /* LCD Ink/Cursor Green Color 0 Register*/
{ S1DREG_LCD_CUR_RCTL0 , 0x00 } , /* LCD Ink/Cursor Red Color 0 Register*/
{ S1DREG_LCD_CUR_BCTL1 , 0x1F } , /* LCD Ink/Cursor Blue Color 1 Register*/
{ S1DREG_LCD_CUR_GCTL1 , 0x3F } , /* LCD Ink/Cursor Green Color 1 Register*/
{ S1DREG_LCD_CUR_RCTL1 , 0x1F } , /* LCD Ink/Cursor Red Color 1 Register*/
{ S1DREG_LCD_CUR_FIFO_HTC , 0x00 } , /* LCD Ink/Cursor FIFO Threshold Register*/
{ S1DREG_CRT_CUR_CTL , 0x00 } , /* CRT/TV Ink/Cursor Control Register*/
{ S1DREG_CRT_CUR_START , 0x01 } , /* CRT/TV Ink/Cursor Start Address Register*/
{ S1DREG_CRT_CUR_XPOS0 , 0x00 } , /* CRT/TV Cursor X Position Register 0*/
{ S1DREG_CRT_CUR_XPOS1 , 0x00 } , /* CRT/TV Cursor X Position Register 1*/
{ S1DREG_CRT_CUR_YPOS0 , 0x00 } , /* CRT/TV Cursor Y Position Register 0*/
{ S1DREG_CRT_CUR_YPOS1 , 0x00 } , /* CRT/TV Cursor Y Position Register 1*/
{ S1DREG_CRT_CUR_BCTL0 , 0x00 } , /* CRT/TV Ink/Cursor Blue Color 0 Register*/
{ S1DREG_CRT_CUR_GCTL0 , 0x00 } , /* CRT/TV Ink/Cursor Green Color 0 Register*/
{ S1DREG_CRT_CUR_RCTL0 , 0x00 } , /* CRT/TV Ink/Cursor Red Color 0 Register*/
{ S1DREG_CRT_CUR_BCTL1 , 0x1F } , /* CRT/TV Ink/Cursor Blue Color 1 Register*/
{ S1DREG_CRT_CUR_GCTL1 , 0x3F } , /* CRT/TV Ink/Cursor Green Color 1 Register*/
{ S1DREG_CRT_CUR_RCTL1 , 0x1F } , /* CRT/TV Ink/Cursor Red Color 1 Register*/
{ S1DREG_CRT_CUR_FIFO_HTC , 0x00 } , /* CRT/TV Ink/Cursor FIFO Threshold Register*/
{ S1DREG_BBLT_CTL0 , 0x00 } , /* BitBlt Control Register 0*/
{ S1DREG_BBLT_CTL1 , 0x01 } , /* BitBlt Control Register 1*/
{ S1DREG_BBLT_CC_EXP , 0x00 } , /* BitBlt ROP Code/Color Expansion Register*/
{ S1DREG_BBLT_OP , 0x00 } , /* BitBlt Operation Register*/
{ S1DREG_BBLT_SRC_START0 , 0x00 } , /* BitBlt Source Start Address Register 0*/
{ S1DREG_BBLT_SRC_START1 , 0x00 } , /* BitBlt Source Start Address Register 1*/
{ S1DREG_BBLT_SRC_START2 , 0x00 } , /* BitBlt Source Start Address Register 2*/
{ S1DREG_BBLT_DST_START0 , 0x00 } , /* BitBlt Destination Start Address Register 0*/
{ S1DREG_BBLT_DST_START1 , 0x00 } , /* BitBlt Destination Start Address Register 1*/
{ S1DREG_BBLT_DST_START2 , 0x00 } , /* BitBlt Destination Start Address Register 2*/
{ S1DREG_BBLT_MEM_OFF0 , 0x00 } , /* BitBlt Memory Address Offset Register 0*/
{ S1DREG_BBLT_MEM_OFF1 , 0x00 } , /* BitBlt Memory Address Offset Register 1*/
{ S1DREG_BBLT_WIDTH0 , 0x00 } , /* BitBlt Width Register 0*/
{ S1DREG_BBLT_WIDTH1 , 0x00 } , /* BitBlt Width Register 1*/
{ S1DREG_BBLT_HEIGHT0 , 0x00 } , /* BitBlt Height Register 0*/
{ S1DREG_BBLT_HEIGHT1 , 0x00 } , /* BitBlt Height Register 1*/
{ S1DREG_BBLT_BGC0 , 0x00 } , /* BitBlt Background Color Register 0*/
{ S1DREG_BBLT_BGC1 , 0x00 } , /* BitBlt Background Color Register 1*/
{ S1DREG_BBLT_FGC0 , 0x00 } , /* BitBlt Foreground Color Register 0*/
{ S1DREG_BBLT_FGC1 , 0x00 } , /* BitBlt Foreground Color Register 1*/
{ S1DREG_LKUP_MODE , 0x00 } , /* Look-Up Table Mode Register*/
{ S1DREG_LKUP_ADDR , 0x00 } , /* Look-Up Table Address Register*/
{ S1DREG_PS_CNF , 0x00 } , /* Power Save Configuration Register*/
{ S1DREG_PS_STATUS , 0x00 } , /* Power Save Status Register*/
{ S1DREG_CPU2MEM_WDOGT , 0x00 } , /* CPU-to-Memory Access Watchdog Timer Register*/
{ S1DREG_COM_DISP_MODE , 0x01 } , /* Display Mode Register, LCD only*/
2008-02-09 06:49:55 +03:00
} ;
2008-05-24 20:06:45 +04:00
static struct s1d13xxxfb_pdata yl9200_s1dfb_pdata = {
. initregs = yl9200_s1dfb_initregs ,
. initregssize = ARRAY_SIZE ( yl9200_s1dfb_initregs ) ,
. platform_init_video = yl9200_init_video ,
2008-02-09 06:49:55 +03:00
} ;
2008-09-22 00:30:02 +04:00
# define YL9200_FB_REG_BASE AT91_CHIPSELECT_7
# define YL9200_FB_VMEM_BASE YL9200_FB_REG_BASE + SZ_2M
# define YL9200_FB_VMEM_SIZE SZ_2M
2008-05-24 20:06:45 +04:00
static struct resource yl9200_s1dfb_resource [ ] = {
2008-02-09 06:49:55 +03:00
[ 0 ] = { /* video mem */
2008-05-24 20:06:45 +04:00
. name = " s1d13xxxfb memory " ,
2008-09-22 00:30:02 +04:00
. start = YL9200_FB_VMEM_BASE ,
. end = YL9200_FB_VMEM_BASE + YL9200_FB_VMEM_SIZE - 1 ,
2008-05-24 20:06:45 +04:00
. flags = IORESOURCE_MEM ,
2008-02-09 06:49:55 +03:00
} ,
[ 1 ] = { /* video registers */
2008-05-24 20:06:45 +04:00
. name = " s1d13xxxfb registers " ,
2008-09-22 00:30:02 +04:00
. start = YL9200_FB_REG_BASE ,
. end = YL9200_FB_REG_BASE + SZ_512 - 1 ,
2008-05-24 20:06:45 +04:00
. flags = IORESOURCE_MEM ,
2008-02-09 06:49:55 +03:00
} ,
} ;
2008-09-22 00:30:02 +04:00
static u64 s1dfb_dmamask = DMA_BIT_MASK ( 32 ) ;
2008-05-24 20:06:45 +04:00
static struct platform_device yl9200_s1dfb_device = {
. name = " s1d13806fb " ,
. id = - 1 ,
. dev = {
2008-02-09 06:49:55 +03:00
. dma_mask = & s1dfb_dmamask ,
2008-05-24 20:06:45 +04:00
. coherent_dma_mask = DMA_BIT_MASK ( 32 ) ,
. platform_data = & yl9200_s1dfb_pdata ,
2008-02-09 06:49:55 +03:00
} ,
2008-05-24 20:06:45 +04:00
. resource = yl9200_s1dfb_resource ,
. num_resources = ARRAY_SIZE ( yl9200_s1dfb_resource ) ,
2008-02-09 06:49:55 +03:00
} ;
2008-05-24 20:06:45 +04:00
void __init yl9200_add_device_video ( void )
2008-02-09 06:49:55 +03:00
{
2008-05-24 20:06:45 +04:00
platform_device_register ( & yl9200_s1dfb_device ) ;
2008-02-09 06:49:55 +03:00
}
# else
2008-05-24 20:06:45 +04:00
void __init yl9200_add_device_video ( void ) { }
2008-02-09 06:49:55 +03:00
# endif
2008-05-24 20:06:45 +04:00
static void __init yl9200_board_init ( void )
2008-02-09 06:49:55 +03:00
{
2012-04-05 10:27:57 +04:00
/* Setup the LEDs D2=PB17 (timer), D3=PB16 (cpu) */
at91_init_leds ( AT91_PIN_PB16 , AT91_PIN_PB17 ) ;
2008-02-09 06:49:55 +03:00
/* Serial */
2012-04-05 10:14:28 +04:00
/* DBGU on ttyS0. (Rx & Tx only) */
at91_register_uart ( 0 , 0 , 0 ) ;
/* USART1 on ttyS1. (Rx, Tx, CTS, RTS, DTR, DSR, DCD, RI) */
at91_register_uart ( AT91RM9200_ID_US1 , 1 , ATMEL_UART_CTS | ATMEL_UART_RTS
| ATMEL_UART_DTR | ATMEL_UART_DSR | ATMEL_UART_DCD
| ATMEL_UART_RI ) ;
/* USART0 on ttyS2. (Rx & Tx only to JP3) */
at91_register_uart ( AT91RM9200_ID_US0 , 2 , 0 ) ;
/* USART3 on ttyS3. (Rx, Tx, RTS - RS485 interface) */
at91_register_uart ( AT91RM9200_ID_US3 , 3 , ATMEL_UART_RTS ) ;
2008-02-09 06:49:55 +03:00
at91_add_device_serial ( ) ;
/* Ethernet */
2008-05-24 20:06:45 +04:00
at91_add_device_eth ( & yl9200_eth_data ) ;
2008-02-09 06:49:55 +03:00
/* USB Host */
2008-05-24 20:06:45 +04:00
at91_add_device_usbh ( & yl9200_usbh_data ) ;
2008-02-09 06:49:55 +03:00
/* USB Device */
2008-05-24 20:06:45 +04:00
at91_add_device_udc ( & yl9200_udc_data ) ;
2008-02-09 06:49:55 +03:00
/* I2C */
2008-05-24 20:06:45 +04:00
at91_add_device_i2c ( yl9200_i2c_devices , ARRAY_SIZE ( yl9200_i2c_devices ) ) ;
/* MMC */
at91_add_device_mmc ( 0 , & yl9200_mmc_data ) ;
2008-02-09 06:49:55 +03:00
/* NAND */
2008-05-24 20:06:45 +04:00
at91_add_device_nand ( & yl9200_nand_data ) ;
2008-02-09 06:49:55 +03:00
/* NOR Flash */
2008-05-24 20:06:45 +04:00
platform_device_register ( & yl9200_flash ) ;
# if defined(CONFIG_SPI_ATMEL) || defined(CONFIG_SPI_ATMEL_MODULE)
/* SPI */
at91_add_device_spi ( yl9200_spi_devices , ARRAY_SIZE ( yl9200_spi_devices ) ) ;
/* Touchscreen */
yl9200_add_device_ts ( ) ;
# endif
/* LEDs. */
at91_gpio_leds ( yl9200_leds , ARRAY_SIZE ( yl9200_leds ) ) ;
2008-02-09 06:49:55 +03:00
/* Push Buttons */
2008-05-24 20:06:45 +04:00
yl9200_add_device_buttons ( ) ;
/* VGA */
yl9200_add_device_video ( ) ;
2008-02-09 06:49:55 +03:00
}
MACHINE_START ( YL9200 , " uCdragon YL-9200 " )
2008-05-24 20:06:45 +04:00
/* Maintainer: S.Birtles */
. timer = & at91rm9200_timer ,
2011-04-23 11:28:34 +04:00
. map_io = at91_map_io ,
2012-06-11 17:38:03 +04:00
. handle_irq = at91_aic_handle_irq ,
2011-04-28 16:19:32 +04:00
. init_early = yl9200_init_early ,
2011-04-23 11:28:34 +04:00
. init_irq = at91_init_irq_default ,
2008-05-24 20:06:45 +04:00
. init_machine = yl9200_board_init ,
2008-02-09 06:49:55 +03:00
MACHINE_END