2008-06-10 03:00:38 +04:00
/*
* Maxtor Shared Storage II Board Setup
*
* Maintainer : Sylver Bruneau < sylver . bruneau @ googlemail . com >
*
* 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 .
*/
# include <linux/kernel.h>
# include <linux/init.h>
# include <linux/platform_device.h>
# include <linux/pci.h>
# include <linux/irq.h>
# include <linux/mtd/physmap.h>
# include <linux/mv643xx_eth.h>
# include <linux/leds.h>
# include <linux/gpio_keys.h>
# include <linux/input.h>
# include <linux/i2c.h>
# include <linux/ata_platform.h>
# include <linux/gpio.h>
# include <asm/mach-types.h>
# include <asm/mach/arch.h>
# include <asm/mach/pci.h>
2008-08-05 19:14:15 +04:00
# include <mach/orion5x.h>
2009-04-22 23:08:17 +04:00
# include <mach/bridge-regs.h>
2008-06-10 03:00:38 +04:00
# include "common.h"
# include "mpp.h"
# define MSS2_NOR_BOOT_BASE 0xff800000
# define MSS2_NOR_BOOT_SIZE SZ_256K
/*****************************************************************************
* Maxtor Shared Storage II Info
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
* Maxtor Shared Storage II hardware :
* - Marvell 88F 5182 - A2 C500
* - Marvell 88E1111 Gigabit Ethernet PHY
* - RTC M41T81 ( @ 0x68 ) on I2C bus
* - 256 KB NOR flash
* - 64 MB of RAM
*/
/*****************************************************************************
* 256 KB NOR Flash on BOOT Device
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static struct physmap_flash_data mss2_nor_flash_data = {
. width = 1 ,
} ;
static struct resource mss2_nor_flash_resource = {
. flags = IORESOURCE_MEM ,
. start = MSS2_NOR_BOOT_BASE ,
. end = MSS2_NOR_BOOT_BASE + MSS2_NOR_BOOT_SIZE - 1 ,
} ;
static struct platform_device mss2_nor_flash = {
. name = " physmap-flash " ,
. id = 0 ,
. dev = {
. platform_data = & mss2_nor_flash_data ,
} ,
. resource = & mss2_nor_flash_resource ,
. num_resources = 1 ,
} ;
/****************************************************************************
* PCI setup
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static int __init mss2_pci_map_irq ( struct pci_dev * dev , u8 slot , u8 pin )
{
int irq ;
/*
* Check for devices with hard - wired IRQs .
*/
irq = orion5x_pci_map_irq ( dev , slot , pin ) ;
if ( irq ! = - 1 )
return irq ;
return - 1 ;
}
static struct hw_pci mss2_pci __initdata = {
. nr_controllers = 2 ,
. swizzle = pci_std_swizzle ,
. setup = orion5x_pci_sys_setup ,
. scan = orion5x_pci_sys_scan_bus ,
. map_irq = mss2_pci_map_irq ,
} ;
static int __init mss2_pci_init ( void )
{
if ( machine_is_mss2 ( ) )
pci_common_init ( & mss2_pci ) ;
return 0 ;
}
subsys_initcall ( mss2_pci_init ) ;
/*****************************************************************************
* Ethernet
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static struct mv643xx_eth_platform_data mss2_eth_data = {
2008-08-26 16:06:47 +04:00
. phy_addr = MV643XX_ETH_PHY_ADDR ( 8 ) ,
2008-06-10 03:00:38 +04:00
} ;
/*****************************************************************************
* SATA
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static struct mv_sata_platform_data mss2_sata_data = {
. n_ports = 2 ,
} ;
/*****************************************************************************
* GPIO buttons
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# define MSS2_GPIO_KEY_RESET 12
# define MSS2_GPIO_KEY_POWER 11
static struct gpio_keys_button mss2_buttons [ ] = {
{
. code = KEY_POWER ,
. gpio = MSS2_GPIO_KEY_POWER ,
. desc = " Power " ,
. active_low = 1 ,
} , {
. code = KEY_RESTART ,
. gpio = MSS2_GPIO_KEY_RESET ,
. desc = " Reset " ,
. active_low = 1 ,
} ,
} ;
static struct gpio_keys_platform_data mss2_button_data = {
. buttons = mss2_buttons ,
. nbuttons = ARRAY_SIZE ( mss2_buttons ) ,
} ;
static struct platform_device mss2_button_device = {
. name = " gpio-keys " ,
. id = - 1 ,
. dev = {
. platform_data = & mss2_button_data ,
} ,
} ;
/*****************************************************************************
* RTC m41t81 on I2C bus
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# define MSS2_GPIO_RTC_IRQ 3
static struct i2c_board_info __initdata mss2_i2c_rtc = {
I2C_BOARD_INFO ( " m41t81 " , 0x68 ) ,
} ;
/*****************************************************************************
* MSS2 power off method
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
* On the Maxtor Shared Storage II , the shutdown process is the following :
* - Userland modifies U - boot env to tell U - boot to go idle at next boot
* - The board reboots
* - U - boot starts and go into an idle mode until the user press " power "
*/
static void mss2_power_off ( void )
{
u32 reg ;
/*
* Enable and issue soft reset
*/
2009-06-01 15:38:33 +04:00
reg = readl ( RSTOUTn_MASK ) ;
2008-06-10 03:00:38 +04:00
reg | = 1 < < 2 ;
2009-06-01 15:38:33 +04:00
writel ( reg , RSTOUTn_MASK ) ;
2008-06-10 03:00:38 +04:00
reg = readl ( CPU_SOFT_RESET ) ;
reg | = 1 ;
writel ( reg , CPU_SOFT_RESET ) ;
}
/****************************************************************************
* General Setup
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static struct orion5x_mpp_mode mss2_mpp_modes [ ] __initdata = {
{ 0 , MPP_GPIO } , /* Power LED */
{ 1 , MPP_GPIO } , /* Error LED */
{ 2 , MPP_UNUSED } ,
{ 3 , MPP_GPIO } , /* RTC interrupt */
{ 4 , MPP_GPIO } , /* HDD ind. (Single/Dual)*/
{ 5 , MPP_GPIO } , /* HD0 5V control */
{ 6 , MPP_GPIO } , /* HD0 12V control */
{ 7 , MPP_GPIO } , /* HD1 5V control */
{ 8 , MPP_GPIO } , /* HD1 12V control */
{ 9 , MPP_UNUSED } ,
{ 10 , MPP_GPIO } , /* Fan control */
{ 11 , MPP_GPIO } , /* Power button */
{ 12 , MPP_GPIO } , /* Reset button */
{ 13 , MPP_UNUSED } ,
{ 14 , MPP_SATA_LED } , /* SATA 0 active */
{ 15 , MPP_SATA_LED } , /* SATA 1 active */
{ 16 , MPP_UNUSED } ,
{ 17 , MPP_UNUSED } ,
{ 18 , MPP_UNUSED } ,
{ 19 , MPP_UNUSED } ,
{ - 1 } ,
} ;
static void __init mss2_init ( void )
{
/* Setup basic Orion functions. Need to be called early. */
orion5x_init ( ) ;
orion5x_mpp_conf ( mss2_mpp_modes ) ;
/*
* MPP [ 20 ] Unused
* MPP [ 21 ] PCI clock
* MPP [ 22 ] USB 0 over current
* MPP [ 23 ] USB 1 over current
*/
/*
* Configure peripherals .
*/
orion5x_ehci0_init ( ) ;
orion5x_ehci1_init ( ) ;
orion5x_eth_init ( & mss2_eth_data ) ;
orion5x_i2c_init ( ) ;
orion5x_sata_init ( & mss2_sata_data ) ;
orion5x_uart0_init ( ) ;
2008-06-17 14:25:12 +04:00
orion5x_xor_init ( ) ;
2008-06-10 03:00:38 +04:00
orion5x_setup_dev_boot_win ( MSS2_NOR_BOOT_BASE , MSS2_NOR_BOOT_SIZE ) ;
platform_device_register ( & mss2_nor_flash ) ;
platform_device_register ( & mss2_button_device ) ;
if ( gpio_request ( MSS2_GPIO_RTC_IRQ , " rtc " ) = = 0 ) {
if ( gpio_direction_input ( MSS2_GPIO_RTC_IRQ ) = = 0 )
mss2_i2c_rtc . irq = gpio_to_irq ( MSS2_GPIO_RTC_IRQ ) ;
else
gpio_free ( MSS2_GPIO_RTC_IRQ ) ;
}
i2c_register_board_info ( 0 , & mss2_i2c_rtc , 1 ) ;
/* register mss2 specific power-off method */
pm_power_off = mss2_power_off ;
}
MACHINE_START ( MSS2 , " Maxtor Shared Storage II " )
/* Maintainer: Sylver Bruneau <sylver.bruneau@googlemail.com> */
. phys_io = ORION5X_REGS_PHYS_BASE ,
. io_pg_offst = ( ( ORION5X_REGS_VIRT_BASE ) > > 18 ) & 0xFFFC ,
. boot_params = 0x00000100 ,
. init_machine = mss2_init ,
. map_io = orion5x_map_io ,
. init_irq = orion5x_init_irq ,
. timer = & orion5x_timer ,
. fixup = tag_fixup_mem32
MACHINE_END