blob: 682e9b0c34ac88322f9422ed03f92dd347f444d9 [file] [log] [blame]
/*
* arch/arm/mach-comcerto/board-optimus.c
*
* Copyright (C) 2012 Mindspeed Technologies, Inc.
*
* 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/sched.h>
#include <linux/device.h>
#include <linux/serial_8250.h>
#include <linux/memblock.h>
#include <linux/phy.h>
#include <linux/mtd/mtd.h>
#if defined(CONFIG_MTD_NAND_COMCERTO) || defined(CONFIG_MTD_NAND_COMCERTO_MODULE)
#include <linux/mtd/nand.h>
#endif
#include <linux/mtd/partitions.h>
#if defined(CONFIG_SPI_MSPD_LOW_SPEED) || defined(CONFIG_SPI_MSPD_HIGH_SPEED)
#include <linux/spi/spi.h>
#endif
#if defined(CONFIG_COMCERTO_I2C_SUPPORT)
#include <linux/i2c.h>
#endif
#include <asm/sizes.h>
#include <asm/setup.h>
#include <asm/mach-types.h>
#include <asm/io.h>
#include <asm/mach/flash.h>
#include <asm/mach/arch.h>
#include <mach/hardware.h>
#include <mach/irqs.h>
#include <mach/dma.h>
#include <linux/dw_dmac.h>
#include <linux/clockchips.h>
#include <linux/init.h>
#include <linux/smp.h>
#include <asm/smp_twd.h>
#include <asm/localtimer.h>
#include <asm/hardware/gic.h>
#include <asm/mach/time.h>
#include <mach/gpio.h>
extern void platform_reserve(void);
extern void device_map_io (void);
extern void device_irq_init(void);
extern void device_init(void);
extern void mac_addr_init(struct comcerto_pfe_platform_data *);
extern struct sys_timer comcerto_timer;
static void __init board_gpio_init(void)
{
#ifdef CONFIG_COMCERTO_PFE_UART_SUPPORT
writel((readl(COMCERTO_GPIO_PIN_SELECT_REG) & ~PFE_UART_GPIO) | PFE_UART_BUS, COMCERTO_GPIO_PIN_SELECT_REG);
c2k_gpio_pin_stat.c2k_gpio_pins_0_31 |= PFE_UART_GPIO_PIN; /* GPIOs 12 & 13 are used for PFE_UART */
#endif
#if defined(CONFIG_SPI_MSPD_LOW_SPEED) || defined(CONFIG_SPI2_MSPD_LOW_SPEED)
/* enable SPI pins */
writel((readl(COMCERTO_GPIO_PIN_SELECT_REG1) & ~(SPI_MUX_GPIO_1)) | (SPI_MUX_BUS_1), COMCERTO_GPIO_PIN_SELECT_REG1);
writel((readl(COMCERTO_GPIO_63_32_PIN_SELECT) & ~(SPI_MUX_GPIO_2)) | (SPI_MUX_BUS_2), COMCERTO_GPIO_63_32_PIN_SELECT);
c2k_gpio_pin_stat.c2k_gpio_pins_0_31 |= SPI_MUX_GPIO_1_PIN; /* GPIOs 18,19, 21,22, 30,31 are used for SPI*/
c2k_gpio_pin_stat.c2k_gpio_pins_32_63 |= SPI_MUX_GPIO_2_PIN; /* GPIO 32 is used for SPI*/
#endif
#if defined(CONFIG_SPI_MSPD_HIGH_SPEED)
/* enable SPI pins */
writel((readl(COMCERTO_GPIO_PIN_SELECT_REG1) & ~(SPI_2_MUX_GPIO_1)) | (SPI_2_MUX_BUS_1), COMCERTO_GPIO_PIN_SELECT_REG1);
writel((readl(COMCERTO_GPIO_63_32_PIN_SELECT) & ~(SPI_2_MUX_GPIO_2)) | (SPI_2_MUX_BUS_2), COMCERTO_GPIO_63_32_PIN_SELECT);
c2k_gpio_pin_stat.c2k_gpio_pins_0_31 |= SPI_2_MUX_GPIO_1_PIN;
c2k_gpio_pin_stat.c2k_gpio_pins_32_63 |= SPI_2_MUX_GPIO_2_PIN;
#endif
#if defined(CONFIG_COMCERTO_I2C_SUPPORT)
writel((readl(COMCERTO_GPIO_PIN_SELECT_REG1) & ~I2C_GPIO) | I2C_BUS, COMCERTO_GPIO_PIN_SELECT_REG1);
c2k_gpio_pin_stat.c2k_gpio_pins_0_31 |= I2C_GPIO_PIN;
#endif
#if defined(CONFIG_MTD_NAND_COMCERTO) || defined(CONFIG_MTD_NAND_COMCERTO_MODULE)
writel((readl(COMCERTO_GPIO_PIN_SELECT_REG1) & ~NAND_GPIO) | NAND_BUS, COMCERTO_GPIO_PIN_SELECT_REG1);
c2k_gpio_pin_stat.c2k_gpio_pins_0_31 |= NAND_GPIO_PIN;
#endif
#if defined(CONFIG_MTD_COMCERTO_NOR)
writel((readl(COMCERTO_GPIO_PIN_SELECT_REG1) & ~NOR_GPIO) | NOR_BUS, COMCERTO_GPIO_PIN_SELECT_REG1);
c2k_gpio_pin_stat.c2k_gpio_pins_0_31 |= NOR_GPIO_PIN;
#endif
#ifdef MOCA_RESET_GPIO_PIN
__raw_writel(__raw_readl(COMCERTO_GPIO_OUTPUT_REG) | MOCA_RESET_GPIO_PIN, COMCERTO_GPIO_OUTPUT_REG);
#endif
// enable GPIO0 interrupt (for MoCA) as level triggered, active high.
__raw_writel(__raw_readl(COMCERTO_GPIO_INT_CFG_REG) | (0x3),
COMCERTO_GPIO_INT_CFG_REG);
}
/* --------------------------------------------------------------------
* NOR device
* -------------------------------------------------------------------- */
#if defined(CONFIG_MTD_COMCERTO_NOR)
static struct resource comcerto_nor_resources[] = {
{
.start = NORFLASH_MEMORY_PHY1,
.end = NORFLASH_MEMORY_PHY1 + SZ_64M - 1,
.flags = IORESOURCE_MEM,
},
};
static struct flash_platform_data comcerto_nor_data = {
.map_name = "cfi_probe",
.width = 2,
};
static struct platform_device comcerto_nor = {
.name = "comcertoflash",
.id = 0,
.num_resources = ARRAY_SIZE(comcerto_nor_resources),
.resource = comcerto_nor_resources,
.dev = {
.platform_data = &comcerto_nor_data,
},
};
#endif
static struct resource rtc_res[] = {
{
.start = COMCERTO_APB_RTC_BASE,
.end = COMCERTO_APB_RTC_BASE + SZ_32 - 1,
.flags = IORESOURCE_MEM,
},
{
.start = IRQ_RTC_ALM,
.flags = IORESOURCE_IRQ,
},
{
.start = IRQ_RTC_PRI,
.flags = IORESOURCE_IRQ,
},
};
static struct platform_device rtc_dev = {
.name = "c2k-rtc",
.id = -1,
.num_resources = ARRAY_SIZE(rtc_res),
.resource = rtc_res,
};
/* --------------------------------------------------------------------
* DMAC controller
* -------------------------------------------------------------------- */
#if defined(CONFIG_COMCERTO_DW_DMA_SUPPORT)
static struct resource dw_dmac_resource[] = {
{
.start = DW_DMA_DMAC_BASEADDR,
.end = DW_DMA_DMAC_BASEADDR + 0x2C0,
.flags = IORESOURCE_MEM,
},
{
.start = IRQ_DMAC,
.flags = IORESOURCE_IRQ,
}
};
static struct dw_dma_platform_data dw_dmac_data = {
.nr_channels = 8,
};
static u64 dw_dmac_dma_mask = DMA_BIT_MASK(32);
static struct platform_device dw_dmac_device = {
.name = "dw_dmac",
.id = 0,
.dev = {
.dma_mask = &dw_dmac_dma_mask,
.platform_data = &dw_dmac_data,
.coherent_dma_mask = DMA_BIT_MASK(32),
},
.resource = dw_dmac_resource,
.num_resources = ARRAY_SIZE(dw_dmac_resource),
};
#endif
/* --------------------------------------------------------------------
* NAND device
* -------------------------------------------------------------------- */
#if defined(CONFIG_MTD_NAND_COMCERTO) || defined(CONFIG_MTD_NAND_COMCERTO_MODULE)
static struct resource comcerto_nand_resources[] = {
{
.start = COMCERTO_NAND_FIO_ADDR,
.end = COMCERTO_NAND_FIO_ADDR + COMCERTO_NAND_IO_SZ - 1,
.flags = IORESOURCE_MEM,
}
};
static struct platform_device comcerto_nand = {
.name = "comcertonand",
.id = -1,
.dev = {
.platform_data = NULL,
},
.resource = comcerto_nand_resources,
.num_resources = ARRAY_SIZE(comcerto_nand_resources),
};
#endif
/* --------------------------------------------------------------------
* SPI bus controller
* -------------------------------------------------------------------- */
#if defined(CONFIG_SPI_MSPD_LOW_SPEED) || defined(CONFIG_SPI_MSPD_HIGH_SPEED)
#define CLK_NAME 10
struct spi_controller_pdata {
int use_dma;
int num_chipselects;
int bus_num;
u32 max_freq;
char clk_name[CLK_NAME];
};
struct spi_platform_data {
int type;
int dummy;
};
struct spi_controller_data {
u8 poll_mode; /* 0 for contoller polling mode */
u8 type; /* SPI/SSP/Micrwire */
u8 enable_dma;
void (*cs_control)(u32 command);
};
struct spi_platform_data spi_pdata = {
.type = 0,
.dummy = 0,
};
struct spi_controller_data spi_ctrl_data = {
.poll_mode = 1,
};
// We list more than one bmoca in here because it was attached to different
// chip selects in different variations of the board. We have to trust the
// driver to reject instances that aren't actually present.
static struct spi_board_info comcerto_spi_board_info[] = {
{
.modalias = "bmoca",
.chip_select = 0,
.max_speed_hz = 20*1000*1000,
.bus_num = 0,
.irq = IRQ_G0,
.mode = SPI_MODE_3,
.platform_data = &spi_pdata,
.controller_data = &spi_ctrl_data,
},
{
.modalias = "bmoca",
.chip_select = 0,
.max_speed_hz = 20*1000*1000,
.bus_num = 1,
.irq = IRQ_G0,
.mode = SPI_MODE_3,
.platform_data = &spi_pdata,
.controller_data = &spi_ctrl_data,
},
};
#endif
#if defined(CONFIG_SPI_MSPD_HIGH_SPEED)
struct spi_controller_pdata fast_spi_pdata = {
.use_dma = 0,
.num_chipselects = 2,
.bus_num = 1,
.max_freq = 50 * 1000 * 1000,
.clk_name = "DUS",
};
#endif
#if defined(CONFIG_SPI_MSPD_HIGH_SPEED) || defined(CONFIG_SPI2_MSPD_HIGH_SPEED)
static struct resource comcerto_fast_spi_resource[] = {
{
.start = COMCERTO_AXI_SPI_BASE,
.end = COMCERTO_AXI_SPI_BASE + SZ_4K - 1,
.flags = IORESOURCE_MEM,
},
{
.start = IRQ_SPI,
.flags = IORESOURCE_IRQ,
}
};
static struct platform_device comcerto_fast_spi = {
.name = "comcerto_spi",
.id = 1,
.num_resources = ARRAY_SIZE(comcerto_fast_spi_resource),
.resource = comcerto_fast_spi_resource,
#if defined(CONFIG_SPI_MSPD_HIGH_SPEED)
.dev = {
.platform_data = &fast_spi_pdata,
},
#endif
};
#endif
#if defined(CONFIG_SPI_MSPD_LOW_SPEED)
struct spi_controller_pdata ls_spi_pdata = {
.use_dma = 0,
.num_chipselects = 4,
.bus_num = 0,
.max_freq = 20 * 1000 * 1000,
.clk_name = "spi_i2c",
};
#endif
#if defined(CONFIG_SPI_MSPD_LOW_SPEED) || defined(CONFIG_SPI2_MSPD_LOW_SPEED)
static struct resource comcerto_spi_resource[] = {
{
.start = COMCERTO_APB_SPI_BASE,
.end = COMCERTO_APB_SPI_BASE + SZ_4K - 1,
.flags = IORESOURCE_MEM,
},
{
.start = IRQ_SPI_LS,
.flags = IORESOURCE_IRQ,
}
};
static struct platform_device comcerto_spi = {
.name = "comcerto_spi",
.id = 0,
.num_resources = ARRAY_SIZE(comcerto_spi_resource),
.resource = comcerto_spi_resource,
#if defined(CONFIG_SPI_MSPD_LOW_SPEED)
.dev = {
.platform_data = &ls_spi_pdata,
},
#endif
};
#endif
/* --------------------------------------------------------------------
* I2C bus controller
* -------------------------------------------------------------------- */
#if defined(CONFIG_COMCERTO_I2C_SUPPORT)
static struct resource comcerto_i2c_resources[] = {
{
.start = COMCERTO_APB_I2C_BASE,
.end = COMCERTO_APB_I2C_BASE + SZ_4K - 1,
.flags = IORESOURCE_MEM,
},
{
.start = IRQ_I2C,
.flags = IORESOURCE_IRQ,
},
};
static struct i2c_board_info comcerto_i2c_board_info[] __initdata = {
{
I2C_BOARD_INFO("lm96163", 0x4c),
},
{
I2C_BOARD_INFO("24c512", 0x50),
},
};
static struct platform_device comcerto_i2c = {
.name = "comcerto_i2c",
.id = 0,
.num_resources = ARRAY_SIZE(comcerto_i2c_resources),
.resource = comcerto_i2c_resources,
};
#endif
/* --------------------------------------------------------------------
* Watchdog
* -------------------------------------------------------------------- */
#ifdef CONFIG_MPCORE_WATCHDOG
static struct resource comcerto_a9wd_resources[] = {
{
.start = COMCERTO_TWD_BASE,
.end = COMCERTO_TWD_BASE + 0xFF,
.flags = IORESOURCE_MEM,
},
{
.name = "mpcore_wdt",
.start = IRQ_LOCALWDOG,
.flags = IORESOURCE_IRQ,
},
};
static struct platform_device comcerto_a9wd = {
.name = "mpcore_wdt",
.id = -1,
.num_resources = ARRAY_SIZE(comcerto_a9wd_resources),
.resource = comcerto_a9wd_resources,
};
#endif
#ifdef CONFIG_COMCERTO_WATCHDOG
static struct resource comcerto_wdt_resources[] = {
{
.start = COMCERTO_APB_TIMER_BASE + 0xD0,
.end = COMCERTO_APB_TIMER_BASE + 0xD8,
.flags = IORESOURCE_MEM,
},
};
static struct platform_device comcerto_wdt = {
.name = "comcerto_wdt",
.id = -1,
.num_resources = ARRAY_SIZE(comcerto_wdt_resources),
.resource = comcerto_wdt_resources,
};
#endif
#if defined(CONFIG_COMCERTO_ELP_SUPPORT)
/* --------------------------------------------------------------------
* IPsec
* -------------------------------------------------------------------- */
static struct resource comcerto_elp_resources[] = {
{
.name = "elp",
.start = COMCERTO_AXI_SPACC_PDU_BASE,
.end = COMCERTO_AXI_SPACC_PDU_BASE + SZ_16M - 1,
.flags = IORESOURCE_MEM,
},
{
.name = "irq_spacc",
.start = IRQ_SPACC,
.end = IRQ_SPACC,
.flags = IORESOURCE_IRQ,
}
};
static u64 comcerto_elp_dma_mask = DMA_BIT_MASK(32);
static struct platform_device comcerto_elp_device = {
.name = "Elliptic-EPN1802",
.id = 0,
.num_resources = 2,
.resource = comcerto_elp_resources,
.dev = {
.dma_mask = &comcerto_elp_dma_mask,
.coherent_dma_mask = DMA_BIT_MASK(32),
},
};
#endif
static struct comcerto_tdm_data comcerto_tdm_pdata = {
.fsoutput = 1, /* Generic Pad Control and Version ID Register[2] */
.fspolarity = 0, /* 28 FSYNC_FALL(RISE)_EDGE */
.fshwidth = 1, /* High_Phase_Width[10:0] */
.fslwidth = 0xFF, /* Low_Phase_Width[10:0] */
.clockhz = 2048000, /* INC_VALUE[29:0] According to the desired TDM clock output frequency, this field should be configured */
.clockout = 1, /* 0 -> set bit 21, clear bit 20 in COMCERTO_GPIO_IOCTRL_REG
(software control, clock input)
1 -> set bit 21 and 20 in COMCERTO_GPIO_IOCTRL_REG
(software control, clock output)
2 -> clear bit 21 in COMCERTO_GPIO_IOCTRL_REG (hardware control) */
.tdmmux = 0x1, /* TDM interface Muxing:0x0 - TDM block, 0x1 - ZDS block,
0x2 - GPIO[63:60] signals and 0x3 - MSIF block is selected */
#if 0
/* FIX ME - Need correct values for TDM_DR, TDM_DX, TDM_FS and TDM_CK */
.tdmck = 0x3F,
.tdmfs = 0x3F,
.tdmdx = 0x3F,
.tdmdr = 0x3F,
#endif
};
static struct platform_device comcerto_tdm_device = {
.name = "comcerto-tdm",
.id = 0,
.dev.platform_data = &comcerto_tdm_pdata,
.num_resources = 0,
.resource = NULL,
};
static struct resource comcerto_pfe_resources[] = {
{
.name = "apb",
.start = COMCERTO_APB_PFE_BASE,
.end = COMCERTO_APB_PFE_BASE + COMCERTO_APB_PFE_SIZE - 1,
.flags = IORESOURCE_MEM,
},
{
.name = "axi",
.start = COMCERTO_AXI_PFE_BASE,
.end = COMCERTO_AXI_PFE_BASE + COMCERTO_AXI_PFE_SIZE - 1,
.flags = IORESOURCE_MEM,
},
{
.name = "ddr",
.start = COMCERTO_PFE_DDR_BASE,
.end = COMCERTO_PFE_DDR_BASE + COMCERTO_PFE_DDR_SIZE - 1,
.flags = IORESOURCE_MEM,
},
{
.name = "iram",
.start = COMCERTO_PFE_IRAM_BASE,
.end = COMCERTO_PFE_IRAM_BASE + COMCERTO_PFE_IRAM_SIZE - 1,
.flags = IORESOURCE_MEM,
},
{
.name = "ipsec",
.start = COMCERTO_AXI_IPSEC_BASE,
.end = COMCERTO_AXI_IPSEC_BASE + COMCERTO_AXI_IPSEC_SIZE - 1,
.flags = IORESOURCE_MEM,
},
{
.name = "hif",
.start = IRQ_PFE_HIF,
.flags = IORESOURCE_IRQ,
},
};
static struct comcerto_pfe_platform_data comcerto_pfe_pdata = {
.comcerto_eth_pdata[0] = {
.name = "lan0",
.device_flags = CONFIG_COMCERTO_GEMAC,
.mii_config = CONFIG_COMCERTO_USE_RGMII,
.gemac_mode = GEMAC_SW_CONF | GEMAC_SW_FULL_DUPLEX | GEMAC_SW_SPEED_1G,
.phy_flags = GEMAC_NO_PHY,
.gem_id = 0,
.mac_addr = (u8[])GEM0_MAC,
},
.comcerto_eth_pdata[1] = {
.name = "wan0",
.device_flags = CONFIG_COMCERTO_GEMAC,
.mii_config = CONFIG_COMCERTO_USE_RGMII,
.gemac_mode = GEMAC_SW_CONF | GEMAC_SW_FULL_DUPLEX | GEMAC_SW_SPEED_1G,
.phy_flags = GEMAC_PHY_RGMII_ADD_DELAY,
.bus_id = 0,
.phy_id = 4,
.gem_id = 1,
.mac_addr = (u8[])GEM1_MAC,
},
.comcerto_eth_pdata[2] = {
.name = "moca0",
.device_flags = CONFIG_COMCERTO_GEMAC,
.mii_config = CONFIG_COMCERTO_USE_RGMII,
.gemac_mode = GEMAC_SW_CONF | GEMAC_SW_FULL_DUPLEX | GEMAC_SW_SPEED_1G,
.phy_flags = GEMAC_NO_PHY,
.gem_id = 2,
.mac_addr = (u8[])GEM2_MAC,
},
/**
* There is a single mdio bus coming out of C2K. And that's the one
* connected to GEM0. All PHY's, switchs will be connected to the same
* bus using different addresses. Typically .bus_id is always 0, only
* .phy_id will change in the different comcerto_eth_pdata[] structures above.
*/
.comcerto_mdio_pdata[0] = {
.enabled = 1,
.phy_mask = 0xFFFFFFEF,
.mdc_div = 96,
.irq = {
[4] = PHY_POLL,
},
},
};
static u64 comcerto_pfe_dma_mask = DMA_BIT_MASK(32);
static struct platform_device comcerto_pfe_device = {
.name = "pfe",
.id = 0,
.dev = {
.platform_data = &comcerto_pfe_pdata,
.dma_mask = &comcerto_pfe_dma_mask,
.coherent_dma_mask = DMA_BIT_MASK(32),
},
.num_resources = ARRAY_SIZE(comcerto_pfe_resources),
.resource = comcerto_pfe_resources,
};
static struct platform_device *comcerto_devices[] __initdata = {
#if defined(CONFIG_MTD_NAND_COMCERTO) || defined(CONFIG_MTD_NAND_COMCERTO_MODULE)
&comcerto_nand,
#endif
#if defined(CONFIG_MTD_COMCERTO_NOR)
&comcerto_nor,
#endif
#if defined(CONFIG_COMCERTO_I2C_SUPPORT)
&comcerto_i2c,
#endif
#if defined (CONFIG_MPCORE_WATCHDOG)
&comcerto_a9wd,
#endif
#if defined(CONFIG_COMCERTO_WATCHDOG)
&comcerto_wdt,
#endif
#if defined(CONFIG_SPI_MSPD_HIGH_SPEED) || defined(CONFIG_SPI2_MSPD_HIGH_SPEED)
&comcerto_fast_spi,
#endif
#if defined(CONFIG_SPI_MSPD_LOW_SPEED) || defined(CONFIG_SPI2_MSPD_LOW_SPEED)
&comcerto_spi,
#endif
#if defined(CONFIG_COMCERTO_DW_DMA_SUPPORT)
&dw_dmac_device,
#endif
&comcerto_tdm_device,
&comcerto_pfe_device,
&rtc_dev,
#if defined(CONFIG_COMCERTO_ELP_SUPPORT)
&comcerto_elp_device,
#endif
};
/************************************************************************
* Expansion bus
*
************************************************************************/
/* This variable is used by comcerto-2000.c to initialize the expansion bus */
int comcerto_exp_values[5][7]= {
/* ENABLE, BASE, SEG_SZ, CFG, TMG1, TMG2, TMG3 */
{1, (EXP_BUS_REG_BASE_CS0 >> 12), ((EXP_BUS_REG_BASE_CS0 + EXP_CS0_SEG_SIZE - 1) >> 12), EXP_MEM_BUS_SIZE_16, 0x1A1A401F, 0x06060A04, 0x00000002}, /*TODO Values to check*/
{0, (EXP_BUS_REG_BASE_CS1 >> 12), ((EXP_BUS_REG_BASE_CS1 + EXP_CS1_SEG_SIZE - 1) >> 12), EXP_RDY_EN|EXP_MEM_BUS_SIZE_32, 0x1A1A401F, 0x06060A04, 0x00000002}, /*TODO Values to check*/
{0, (EXP_BUS_REG_BASE_CS2 >> 12), ((EXP_BUS_REG_BASE_CS2 + EXP_CS2_SEG_SIZE - 1) >> 12), EXP_STRB_MODE|EXP_ALE_MODE|EXP_MEM_BUS_SIZE_8, 0x1A10201A, 0x03080403, 0x0000002}, /*TODO Values to check*/
{0, (EXP_BUS_REG_BASE_CS3 >> 12), ((EXP_BUS_REG_BASE_CS3 + EXP_CS3_SEG_SIZE - 1) >> 12), EXP_STRB_MODE|EXP_ALE_MODE|EXP_MEM_BUS_SIZE_8, 0x1A10201A, 0x03080403, 0x0000002}, /*BT8370*/
{0, (EXP_BUS_REG_BASE_CS4 >> 12), ((EXP_BUS_REG_BASE_CS4 + EXP_CS4_SEG_SIZE - 1) >> 12), EXP_NAND_MODE|EXP_MEM_BUS_SIZE_8, 0x01010001, 0x01010101, 0x00000001}, /* NAND: TODO Values to check */
};
/************************************************************************
* Machine definition
*
************************************************************************/
static void __init platform_map_io(void)
{
device_map_io();
}
static void __init platform_irq_init(void)
{
device_irq_init();
}
static void __init platform_init(void)
{
device_init();
board_gpio_init();
#if defined(CONFIG_SPI_MSPD_LOW_SPEED) || defined(CONFIG_SPI_MSPD_HIGH_SPEED)
spi_register_board_info(comcerto_spi_board_info, ARRAY_SIZE(comcerto_spi_board_info));
#endif
#if defined(CONFIG_COMCERTO_I2C_SUPPORT)
i2c_register_board_info(0, comcerto_i2c_board_info, ARRAY_SIZE(comcerto_i2c_board_info));
#endif
mac_addr_init(&comcerto_pfe_pdata);
platform_add_devices(comcerto_devices, ARRAY_SIZE(comcerto_devices));
}
MACHINE_START(COMCERTO, "Google Fiber Optimus")
.atag_offset = COMCERTO_AXI_DDR_BASE + 0x100,
.reserve = platform_reserve,
.map_io = platform_map_io,
.init_irq = platform_irq_init,
.init_machine = platform_init,
.timer = &comcerto_timer,
#ifdef CONFIG_ZONE_DMA
.dma_zone_size = SZ_32M + 3*SZ_4M,
#endif
MACHINE_END