1a7ed099fSArnd Bergmann /* 2a7ed099fSArnd Bergmann * arch/arm/mach-spear3xx/spear310.c 3a7ed099fSArnd Bergmann * 4a7ed099fSArnd Bergmann * SPEAr310 machine source file 5a7ed099fSArnd Bergmann * 6a7ed099fSArnd Bergmann * Copyright (C) 2009-2012 ST Microelectronics 7a7ed099fSArnd Bergmann * Viresh Kumar <viresh.linux@gmail.com> 8a7ed099fSArnd Bergmann * 9a7ed099fSArnd Bergmann * This file is licensed under the terms of the GNU General Public 10a7ed099fSArnd Bergmann * License version 2. This program is licensed "as is" without any 11a7ed099fSArnd Bergmann * warranty of any kind, whether express or implied. 12a7ed099fSArnd Bergmann */ 13a7ed099fSArnd Bergmann 14a7ed099fSArnd Bergmann #define pr_fmt(fmt) "SPEAr310: " fmt 15a7ed099fSArnd Bergmann 16a7ed099fSArnd Bergmann #include <linux/amba/pl08x.h> 17a7ed099fSArnd Bergmann #include <linux/amba/serial.h> 18a7ed099fSArnd Bergmann #include <linux/irqchip.h> 19a7ed099fSArnd Bergmann #include <linux/of_platform.h> 20a7ed099fSArnd Bergmann #include <asm/mach/arch.h> 212b9c613cSArnd Bergmann #include "generic.h" 22a7ed099fSArnd Bergmann #include <mach/spear.h> 23a7ed099fSArnd Bergmann 24a7ed099fSArnd Bergmann #define SPEAR310_UART1_BASE UL(0xB2000000) 25a7ed099fSArnd Bergmann #define SPEAR310_UART2_BASE UL(0xB2080000) 26a7ed099fSArnd Bergmann #define SPEAR310_UART3_BASE UL(0xB2100000) 27a7ed099fSArnd Bergmann #define SPEAR310_UART4_BASE UL(0xB2180000) 28a7ed099fSArnd Bergmann #define SPEAR310_UART5_BASE UL(0xB2200000) 29a7ed099fSArnd Bergmann 30a7ed099fSArnd Bergmann /* DMAC platform data's slave info */ 31a7ed099fSArnd Bergmann struct pl08x_channel_data spear310_dma_info[] = { 32a7ed099fSArnd Bergmann { 33a7ed099fSArnd Bergmann .bus_id = "uart0_rx", 34a7ed099fSArnd Bergmann .min_signal = 2, 35a7ed099fSArnd Bergmann .max_signal = 2, 36a7ed099fSArnd Bergmann .muxval = 0, 37a7ed099fSArnd Bergmann .periph_buses = PL08X_AHB1, 38a7ed099fSArnd Bergmann }, { 39a7ed099fSArnd Bergmann .bus_id = "uart0_tx", 40a7ed099fSArnd Bergmann .min_signal = 3, 41a7ed099fSArnd Bergmann .max_signal = 3, 42a7ed099fSArnd Bergmann .muxval = 0, 43a7ed099fSArnd Bergmann .periph_buses = PL08X_AHB1, 44a7ed099fSArnd Bergmann }, { 45a7ed099fSArnd Bergmann .bus_id = "ssp0_rx", 46a7ed099fSArnd Bergmann .min_signal = 8, 47a7ed099fSArnd Bergmann .max_signal = 8, 48a7ed099fSArnd Bergmann .muxval = 0, 49a7ed099fSArnd Bergmann .periph_buses = PL08X_AHB1, 50a7ed099fSArnd Bergmann }, { 51a7ed099fSArnd Bergmann .bus_id = "ssp0_tx", 52a7ed099fSArnd Bergmann .min_signal = 9, 53a7ed099fSArnd Bergmann .max_signal = 9, 54a7ed099fSArnd Bergmann .muxval = 0, 55a7ed099fSArnd Bergmann .periph_buses = PL08X_AHB1, 56a7ed099fSArnd Bergmann }, { 57a7ed099fSArnd Bergmann .bus_id = "i2c_rx", 58a7ed099fSArnd Bergmann .min_signal = 10, 59a7ed099fSArnd Bergmann .max_signal = 10, 60a7ed099fSArnd Bergmann .muxval = 0, 61a7ed099fSArnd Bergmann .periph_buses = PL08X_AHB1, 62a7ed099fSArnd Bergmann }, { 63a7ed099fSArnd Bergmann .bus_id = "i2c_tx", 64a7ed099fSArnd Bergmann .min_signal = 11, 65a7ed099fSArnd Bergmann .max_signal = 11, 66a7ed099fSArnd Bergmann .muxval = 0, 67a7ed099fSArnd Bergmann .periph_buses = PL08X_AHB1, 68a7ed099fSArnd Bergmann }, { 69a7ed099fSArnd Bergmann .bus_id = "irda", 70a7ed099fSArnd Bergmann .min_signal = 12, 71a7ed099fSArnd Bergmann .max_signal = 12, 72a7ed099fSArnd Bergmann .muxval = 0, 73a7ed099fSArnd Bergmann .periph_buses = PL08X_AHB1, 74a7ed099fSArnd Bergmann }, { 75a7ed099fSArnd Bergmann .bus_id = "adc", 76a7ed099fSArnd Bergmann .min_signal = 13, 77a7ed099fSArnd Bergmann .max_signal = 13, 78a7ed099fSArnd Bergmann .muxval = 0, 79a7ed099fSArnd Bergmann .periph_buses = PL08X_AHB1, 80a7ed099fSArnd Bergmann }, { 81a7ed099fSArnd Bergmann .bus_id = "to_jpeg", 82a7ed099fSArnd Bergmann .min_signal = 14, 83a7ed099fSArnd Bergmann .max_signal = 14, 84a7ed099fSArnd Bergmann .muxval = 0, 85a7ed099fSArnd Bergmann .periph_buses = PL08X_AHB1, 86a7ed099fSArnd Bergmann }, { 87a7ed099fSArnd Bergmann .bus_id = "from_jpeg", 88a7ed099fSArnd Bergmann .min_signal = 15, 89a7ed099fSArnd Bergmann .max_signal = 15, 90a7ed099fSArnd Bergmann .muxval = 0, 91a7ed099fSArnd Bergmann .periph_buses = PL08X_AHB1, 92a7ed099fSArnd Bergmann }, { 93a7ed099fSArnd Bergmann .bus_id = "uart1_rx", 94a7ed099fSArnd Bergmann .min_signal = 0, 95a7ed099fSArnd Bergmann .max_signal = 0, 96a7ed099fSArnd Bergmann .muxval = 1, 97a7ed099fSArnd Bergmann .periph_buses = PL08X_AHB1, 98a7ed099fSArnd Bergmann }, { 99a7ed099fSArnd Bergmann .bus_id = "uart1_tx", 100a7ed099fSArnd Bergmann .min_signal = 1, 101a7ed099fSArnd Bergmann .max_signal = 1, 102a7ed099fSArnd Bergmann .muxval = 1, 103a7ed099fSArnd Bergmann .periph_buses = PL08X_AHB1, 104a7ed099fSArnd Bergmann }, { 105a7ed099fSArnd Bergmann .bus_id = "uart2_rx", 106a7ed099fSArnd Bergmann .min_signal = 2, 107a7ed099fSArnd Bergmann .max_signal = 2, 108a7ed099fSArnd Bergmann .muxval = 1, 109a7ed099fSArnd Bergmann .periph_buses = PL08X_AHB1, 110a7ed099fSArnd Bergmann }, { 111a7ed099fSArnd Bergmann .bus_id = "uart2_tx", 112a7ed099fSArnd Bergmann .min_signal = 3, 113a7ed099fSArnd Bergmann .max_signal = 3, 114a7ed099fSArnd Bergmann .muxval = 1, 115a7ed099fSArnd Bergmann .periph_buses = PL08X_AHB1, 116a7ed099fSArnd Bergmann }, { 117a7ed099fSArnd Bergmann .bus_id = "uart3_rx", 118a7ed099fSArnd Bergmann .min_signal = 4, 119a7ed099fSArnd Bergmann .max_signal = 4, 120a7ed099fSArnd Bergmann .muxval = 1, 121a7ed099fSArnd Bergmann .periph_buses = PL08X_AHB1, 122a7ed099fSArnd Bergmann }, { 123a7ed099fSArnd Bergmann .bus_id = "uart3_tx", 124a7ed099fSArnd Bergmann .min_signal = 5, 125a7ed099fSArnd Bergmann .max_signal = 5, 126a7ed099fSArnd Bergmann .muxval = 1, 127a7ed099fSArnd Bergmann .periph_buses = PL08X_AHB1, 128a7ed099fSArnd Bergmann }, { 129a7ed099fSArnd Bergmann .bus_id = "uart4_rx", 130a7ed099fSArnd Bergmann .min_signal = 6, 131a7ed099fSArnd Bergmann .max_signal = 6, 132a7ed099fSArnd Bergmann .muxval = 1, 133a7ed099fSArnd Bergmann .periph_buses = PL08X_AHB1, 134a7ed099fSArnd Bergmann }, { 135a7ed099fSArnd Bergmann .bus_id = "uart4_tx", 136a7ed099fSArnd Bergmann .min_signal = 7, 137a7ed099fSArnd Bergmann .max_signal = 7, 138a7ed099fSArnd Bergmann .muxval = 1, 139a7ed099fSArnd Bergmann .periph_buses = PL08X_AHB1, 140a7ed099fSArnd Bergmann }, { 141a7ed099fSArnd Bergmann .bus_id = "uart5_rx", 142a7ed099fSArnd Bergmann .min_signal = 8, 143a7ed099fSArnd Bergmann .max_signal = 8, 144a7ed099fSArnd Bergmann .muxval = 1, 145a7ed099fSArnd Bergmann .periph_buses = PL08X_AHB1, 146a7ed099fSArnd Bergmann }, { 147a7ed099fSArnd Bergmann .bus_id = "uart5_tx", 148a7ed099fSArnd Bergmann .min_signal = 9, 149a7ed099fSArnd Bergmann .max_signal = 9, 150a7ed099fSArnd Bergmann .muxval = 1, 151a7ed099fSArnd Bergmann .periph_buses = PL08X_AHB1, 152a7ed099fSArnd Bergmann }, { 153a7ed099fSArnd Bergmann .bus_id = "ras5_rx", 154a7ed099fSArnd Bergmann .min_signal = 10, 155a7ed099fSArnd Bergmann .max_signal = 10, 156a7ed099fSArnd Bergmann .muxval = 1, 157a7ed099fSArnd Bergmann .periph_buses = PL08X_AHB1, 158a7ed099fSArnd Bergmann }, { 159a7ed099fSArnd Bergmann .bus_id = "ras5_tx", 160a7ed099fSArnd Bergmann .min_signal = 11, 161a7ed099fSArnd Bergmann .max_signal = 11, 162a7ed099fSArnd Bergmann .muxval = 1, 163a7ed099fSArnd Bergmann .periph_buses = PL08X_AHB1, 164a7ed099fSArnd Bergmann }, { 165a7ed099fSArnd Bergmann .bus_id = "ras6_rx", 166a7ed099fSArnd Bergmann .min_signal = 12, 167a7ed099fSArnd Bergmann .max_signal = 12, 168a7ed099fSArnd Bergmann .muxval = 1, 169a7ed099fSArnd Bergmann .periph_buses = PL08X_AHB1, 170a7ed099fSArnd Bergmann }, { 171a7ed099fSArnd Bergmann .bus_id = "ras6_tx", 172a7ed099fSArnd Bergmann .min_signal = 13, 173a7ed099fSArnd Bergmann .max_signal = 13, 174a7ed099fSArnd Bergmann .muxval = 1, 175a7ed099fSArnd Bergmann .periph_buses = PL08X_AHB1, 176a7ed099fSArnd Bergmann }, { 177a7ed099fSArnd Bergmann .bus_id = "ras7_rx", 178a7ed099fSArnd Bergmann .min_signal = 14, 179a7ed099fSArnd Bergmann .max_signal = 14, 180a7ed099fSArnd Bergmann .muxval = 1, 181a7ed099fSArnd Bergmann .periph_buses = PL08X_AHB1, 182a7ed099fSArnd Bergmann }, { 183a7ed099fSArnd Bergmann .bus_id = "ras7_tx", 184a7ed099fSArnd Bergmann .min_signal = 15, 185a7ed099fSArnd Bergmann .max_signal = 15, 186a7ed099fSArnd Bergmann .muxval = 1, 187a7ed099fSArnd Bergmann .periph_buses = PL08X_AHB1, 188a7ed099fSArnd Bergmann }, 189a7ed099fSArnd Bergmann }; 190a7ed099fSArnd Bergmann 191a7ed099fSArnd Bergmann /* uart devices plat data */ 192a7ed099fSArnd Bergmann static struct amba_pl011_data spear310_uart_data[] = { 193a7ed099fSArnd Bergmann { 194a7ed099fSArnd Bergmann .dma_filter = pl08x_filter_id, 195a7ed099fSArnd Bergmann .dma_tx_param = "uart1_tx", 196a7ed099fSArnd Bergmann .dma_rx_param = "uart1_rx", 197a7ed099fSArnd Bergmann }, { 198a7ed099fSArnd Bergmann .dma_filter = pl08x_filter_id, 199a7ed099fSArnd Bergmann .dma_tx_param = "uart2_tx", 200a7ed099fSArnd Bergmann .dma_rx_param = "uart2_rx", 201a7ed099fSArnd Bergmann }, { 202a7ed099fSArnd Bergmann .dma_filter = pl08x_filter_id, 203a7ed099fSArnd Bergmann .dma_tx_param = "uart3_tx", 204a7ed099fSArnd Bergmann .dma_rx_param = "uart3_rx", 205a7ed099fSArnd Bergmann }, { 206a7ed099fSArnd Bergmann .dma_filter = pl08x_filter_id, 207a7ed099fSArnd Bergmann .dma_tx_param = "uart4_tx", 208a7ed099fSArnd Bergmann .dma_rx_param = "uart4_rx", 209a7ed099fSArnd Bergmann }, { 210a7ed099fSArnd Bergmann .dma_filter = pl08x_filter_id, 211a7ed099fSArnd Bergmann .dma_tx_param = "uart5_tx", 212a7ed099fSArnd Bergmann .dma_rx_param = "uart5_rx", 213a7ed099fSArnd Bergmann }, 214a7ed099fSArnd Bergmann }; 215a7ed099fSArnd Bergmann 216a7ed099fSArnd Bergmann /* Add SPEAr310 auxdata to pass platform data */ 217a7ed099fSArnd Bergmann static struct of_dev_auxdata spear310_auxdata_lookup[] __initdata = { 218a7ed099fSArnd Bergmann OF_DEV_AUXDATA("arm,pl022", SPEAR3XX_ICM1_SSP_BASE, NULL, 219a7ed099fSArnd Bergmann &pl022_plat_data), 220a7ed099fSArnd Bergmann OF_DEV_AUXDATA("arm,pl080", SPEAR_ICM3_DMA_BASE, NULL, 221a7ed099fSArnd Bergmann &pl080_plat_data), 222a7ed099fSArnd Bergmann OF_DEV_AUXDATA("arm,pl011", SPEAR310_UART1_BASE, NULL, 223a7ed099fSArnd Bergmann &spear310_uart_data[0]), 224a7ed099fSArnd Bergmann OF_DEV_AUXDATA("arm,pl011", SPEAR310_UART2_BASE, NULL, 225a7ed099fSArnd Bergmann &spear310_uart_data[1]), 226a7ed099fSArnd Bergmann OF_DEV_AUXDATA("arm,pl011", SPEAR310_UART3_BASE, NULL, 227a7ed099fSArnd Bergmann &spear310_uart_data[2]), 228a7ed099fSArnd Bergmann OF_DEV_AUXDATA("arm,pl011", SPEAR310_UART4_BASE, NULL, 229a7ed099fSArnd Bergmann &spear310_uart_data[3]), 230a7ed099fSArnd Bergmann OF_DEV_AUXDATA("arm,pl011", SPEAR310_UART5_BASE, NULL, 231a7ed099fSArnd Bergmann &spear310_uart_data[4]), 232a7ed099fSArnd Bergmann {} 233a7ed099fSArnd Bergmann }; 234a7ed099fSArnd Bergmann 235a7ed099fSArnd Bergmann static void __init spear310_dt_init(void) 236a7ed099fSArnd Bergmann { 237a7ed099fSArnd Bergmann pl080_plat_data.slave_channels = spear310_dma_info; 238a7ed099fSArnd Bergmann pl080_plat_data.num_slave_channels = ARRAY_SIZE(spear310_dma_info); 239a7ed099fSArnd Bergmann 240a7ed099fSArnd Bergmann of_platform_populate(NULL, of_default_bus_match_table, 241a7ed099fSArnd Bergmann spear310_auxdata_lookup, NULL); 242a7ed099fSArnd Bergmann } 243a7ed099fSArnd Bergmann 244a7ed099fSArnd Bergmann static const char * const spear310_dt_board_compat[] = { 245a7ed099fSArnd Bergmann "st,spear310", 246a7ed099fSArnd Bergmann "st,spear310-evb", 247a7ed099fSArnd Bergmann NULL, 248a7ed099fSArnd Bergmann }; 249a7ed099fSArnd Bergmann 250a7ed099fSArnd Bergmann static void __init spear310_map_io(void) 251a7ed099fSArnd Bergmann { 252a7ed099fSArnd Bergmann spear3xx_map_io(); 253a7ed099fSArnd Bergmann } 254a7ed099fSArnd Bergmann 255a7ed099fSArnd Bergmann DT_MACHINE_START(SPEAR310_DT, "ST SPEAr310 SoC with Flattened Device Tree") 256a7ed099fSArnd Bergmann .map_io = spear310_map_io, 257a7ed099fSArnd Bergmann .init_irq = irqchip_init, 258a7ed099fSArnd Bergmann .init_time = spear3xx_timer_init, 259a7ed099fSArnd Bergmann .init_machine = spear310_dt_init, 260a7ed099fSArnd Bergmann .restart = spear_restart, 261a7ed099fSArnd Bergmann .dt_compat = spear310_dt_board_compat, 262a7ed099fSArnd Bergmann MACHINE_END 263