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