2 * Copyright (C) 2008-2009 ST-Ericsson
4 * Author: Srinidhi KASAGAR <srinidhi.kasagar@stericsson.com>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2, as
8 * published by the Free Software Foundation.
11 #include <linux/kernel.h>
12 #include <linux/init.h>
13 #include <linux/interrupt.h>
14 #include <linux/platform_device.h>
16 #include <linux/amba/bus.h>
17 #include <linux/amba/pl022.h>
18 #include <linux/spi/spi.h>
20 #include <asm/mach-types.h>
21 #include <asm/mach/arch.h>
25 #include <mach/hardware.h>
26 #include <mach/setup.h>
28 #define __MEM_4K_RESOURCE(x) \
29 .res = {.start = (x), .end = (x) + SZ_4K - 1, .flags = IORESOURCE_MEM}
31 /* These are active devices on this board */
32 static struct amba_device uart0_device = {
33 .dev = { .init_name = "uart0" },
34 __MEM_4K_RESOURCE(U8500_UART0_BASE),
35 .irq = {IRQ_UART0, NO_IRQ},
38 static struct amba_device uart1_device = {
39 .dev = { .init_name = "uart1" },
40 __MEM_4K_RESOURCE(U8500_UART1_BASE),
41 .irq = {IRQ_UART1, NO_IRQ},
44 static struct amba_device uart2_device = {
45 .dev = { .init_name = "uart2" },
46 __MEM_4K_RESOURCE(U8500_UART2_BASE),
47 .irq = {IRQ_UART2, NO_IRQ},
50 static void ab4500_spi_cs_control(u32 command)
52 /* set the FRM signal, which is CS - TODO */
55 struct pl022_config_chip ab4500_chip_info = {
56 .lbm = LOOPBACK_DISABLED,
57 .com_mode = INTERRUPT_TRANSFER,
58 .iface = SSP_INTERFACE_MOTOROLA_SPI,
59 /* we can act as master only */
60 .hierarchy = SSP_MASTER,
61 .slave_tx_disable = 0,
62 .endian_rx = SSP_RX_MSB,
63 .endian_tx = SSP_TX_MSB,
64 .data_size = SSP_DATA_BITS_24,
65 .rx_lev_trig = SSP_RX_1_OR_MORE_ELEM,
66 .tx_lev_trig = SSP_TX_1_OR_MORE_EMPTY_LOC,
67 .clk_phase = SSP_CLK_SECOND_EDGE,
68 .clk_pol = SSP_CLK_POL_IDLE_HIGH,
69 .cs_control = ab4500_spi_cs_control,
72 static struct spi_board_info u8500_spi_devices[] = {
75 .controller_data = &ab4500_chip_info,
76 .max_speed_hz = 12000000,
84 static struct pl022_ssp_controller ssp0_platform_data = {
86 /* pl022 not yet supports dma */
88 /* on this platform, gpio 31,142,144,214 &
89 * 224 are connected as chip selects
94 static struct amba_device pl022_device = {
96 .coherent_dma_mask = ~0,
98 .platform_data = &ssp0_platform_data,
101 .start = U8500_SSP0_BASE,
102 .end = U8500_SSP0_BASE + SZ_4K - 1,
103 .flags = IORESOURCE_MEM,
105 .irq = {IRQ_SSP0, NO_IRQ },
106 /* ST-Ericsson modified id */
107 .periphid = SSP_PER_ID,
110 static struct amba_device pl031_device = {
112 .init_name = "pl031",
115 .start = U8500_RTC_BASE,
116 .end = U8500_RTC_BASE + SZ_4K - 1,
117 .flags = IORESOURCE_MEM,
119 .irq = {IRQ_RTC_RTT, NO_IRQ},
122 #define U8500_I2C_RESOURCES(id, size) \
123 static struct resource u8500_i2c_resources_##id[] = { \
125 .start = U8500_I2C##id##_BASE, \
126 .end = U8500_I2C##id##_BASE + size - 1, \
127 .flags = IORESOURCE_MEM, \
130 .start = IRQ_I2C##id, \
131 .end = IRQ_I2C##id, \
132 .flags = IORESOURCE_IRQ \
136 U8500_I2C_RESOURCES(0, SZ_4K);
137 U8500_I2C_RESOURCES(1, SZ_4K);
138 U8500_I2C_RESOURCES(2, SZ_4K);
139 U8500_I2C_RESOURCES(3, SZ_4K);
141 #define U8500_I2C_CONTROLLER(id, _slsu, _tft, _rft, clk, _sm) \
142 static struct nmk_i2c_controller u8500_i2c_##id = { \
144 * slave data setup time, which is \
145 * 250 ns,100ns,10ns which is 14,6,2 \
146 * respectively for a 48 Mhz \
150 /* Tx FIFO threshold */ \
152 /* Rx FIFO threshold */ \
154 /* std. mode operation */ \
160 * The board uses 4 i2c controllers, initialize all of
161 * them with slave data setup time of 250 ns,
162 * Tx & Rx FIFO threshold values as 1 and standard
165 U8500_I2C_CONTROLLER(0, 0xe, 1, 1, 100000, I2C_FREQ_MODE_STANDARD);
166 U8500_I2C_CONTROLLER(1, 0xe, 1, 1, 100000, I2C_FREQ_MODE_STANDARD);
167 U8500_I2C_CONTROLLER(2, 0xe, 1, 1, 100000, I2C_FREQ_MODE_STANDARD);
168 U8500_I2C_CONTROLLER(3, 0xe, 1, 1, 100000, I2C_FREQ_MODE_STANDARD);
170 #define U8500_I2C_PDEVICE(cid) \
171 static struct platform_device i2c_controller##cid = { \
174 .num_resources = 2, \
175 .resource = u8500_i2c_resources_##cid, \
177 .platform_data = &u8500_i2c_##cid \
181 U8500_I2C_PDEVICE(0);
182 U8500_I2C_PDEVICE(1);
183 U8500_I2C_PDEVICE(2);
184 U8500_I2C_PDEVICE(3);
186 static struct amba_device *amba_devs[] __initdata = {
194 /* add any platform devices here - TODO */
195 static struct platform_device *platform_devs[] __initdata = {
202 static void __init u8500_init_machine(void)
206 /* Register the active AMBA devices on this board */
207 for (i = 0; i < ARRAY_SIZE(amba_devs); i++)
208 amba_device_register(amba_devs[i], &iomem_resource);
210 platform_add_devices(platform_devs, ARRAY_SIZE(platform_devs));
212 spi_register_board_info(u8500_spi_devices,
213 ARRAY_SIZE(u8500_spi_devices));
215 u8500_init_devices();
218 MACHINE_START(U8500, "ST-Ericsson MOP500 platform")
219 /* Maintainer: Srinidhi Kasagar <srinidhi.kasagar@stericsson.com> */
220 .phys_io = U8500_UART2_BASE,
221 .io_pg_offst = (IO_ADDRESS(U8500_UART2_BASE) >> 18) & 0xfffc,
222 .boot_params = 0x100,
223 .map_io = u8500_map_io,
224 .init_irq = ux500_init_irq,
225 /* we re-use nomadik timer here */
226 .timer = &u8500_timer,
227 .init_machine = u8500_init_machine,