Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /*
0003  * arch/arm/mach-spear3xx/spear310.c
0004  *
0005  * SPEAr310 machine source file
0006  *
0007  * Copyright (C) 2009-2012 ST Microelectronics
0008  * Viresh Kumar <vireshk@kernel.org>
0009  */
0010 
0011 #define pr_fmt(fmt) "SPEAr310: " fmt
0012 
0013 #include <linux/amba/pl08x.h>
0014 #include <linux/amba/serial.h>
0015 #include <linux/of_platform.h>
0016 #include <asm/mach/arch.h>
0017 #include "generic.h"
0018 #include "spear.h"
0019 
0020 #define SPEAR310_UART1_BASE     UL(0xB2000000)
0021 #define SPEAR310_UART2_BASE     UL(0xB2080000)
0022 #define SPEAR310_UART3_BASE     UL(0xB2100000)
0023 #define SPEAR310_UART4_BASE     UL(0xB2180000)
0024 #define SPEAR310_UART5_BASE     UL(0xB2200000)
0025 
0026 /* DMAC platform data's slave info */
0027 struct pl08x_channel_data spear310_dma_info[] = {
0028     {
0029         .bus_id = "uart0_rx",
0030         .min_signal = 2,
0031         .max_signal = 2,
0032         .muxval = 0,
0033         .periph_buses = PL08X_AHB1,
0034     }, {
0035         .bus_id = "uart0_tx",
0036         .min_signal = 3,
0037         .max_signal = 3,
0038         .muxval = 0,
0039         .periph_buses = PL08X_AHB1,
0040     }, {
0041         .bus_id = "ssp0_rx",
0042         .min_signal = 8,
0043         .max_signal = 8,
0044         .muxval = 0,
0045         .periph_buses = PL08X_AHB1,
0046     }, {
0047         .bus_id = "ssp0_tx",
0048         .min_signal = 9,
0049         .max_signal = 9,
0050         .muxval = 0,
0051         .periph_buses = PL08X_AHB1,
0052     }, {
0053         .bus_id = "i2c_rx",
0054         .min_signal = 10,
0055         .max_signal = 10,
0056         .muxval = 0,
0057         .periph_buses = PL08X_AHB1,
0058     }, {
0059         .bus_id = "i2c_tx",
0060         .min_signal = 11,
0061         .max_signal = 11,
0062         .muxval = 0,
0063         .periph_buses = PL08X_AHB1,
0064     }, {
0065         .bus_id = "irda",
0066         .min_signal = 12,
0067         .max_signal = 12,
0068         .muxval = 0,
0069         .periph_buses = PL08X_AHB1,
0070     }, {
0071         .bus_id = "adc",
0072         .min_signal = 13,
0073         .max_signal = 13,
0074         .muxval = 0,
0075         .periph_buses = PL08X_AHB1,
0076     }, {
0077         .bus_id = "to_jpeg",
0078         .min_signal = 14,
0079         .max_signal = 14,
0080         .muxval = 0,
0081         .periph_buses = PL08X_AHB1,
0082     }, {
0083         .bus_id = "from_jpeg",
0084         .min_signal = 15,
0085         .max_signal = 15,
0086         .muxval = 0,
0087         .periph_buses = PL08X_AHB1,
0088     }, {
0089         .bus_id = "uart1_rx",
0090         .min_signal = 0,
0091         .max_signal = 0,
0092         .muxval = 1,
0093         .periph_buses = PL08X_AHB1,
0094     }, {
0095         .bus_id = "uart1_tx",
0096         .min_signal = 1,
0097         .max_signal = 1,
0098         .muxval = 1,
0099         .periph_buses = PL08X_AHB1,
0100     }, {
0101         .bus_id = "uart2_rx",
0102         .min_signal = 2,
0103         .max_signal = 2,
0104         .muxval = 1,
0105         .periph_buses = PL08X_AHB1,
0106     }, {
0107         .bus_id = "uart2_tx",
0108         .min_signal = 3,
0109         .max_signal = 3,
0110         .muxval = 1,
0111         .periph_buses = PL08X_AHB1,
0112     }, {
0113         .bus_id = "uart3_rx",
0114         .min_signal = 4,
0115         .max_signal = 4,
0116         .muxval = 1,
0117         .periph_buses = PL08X_AHB1,
0118     }, {
0119         .bus_id = "uart3_tx",
0120         .min_signal = 5,
0121         .max_signal = 5,
0122         .muxval = 1,
0123         .periph_buses = PL08X_AHB1,
0124     }, {
0125         .bus_id = "uart4_rx",
0126         .min_signal = 6,
0127         .max_signal = 6,
0128         .muxval = 1,
0129         .periph_buses = PL08X_AHB1,
0130     }, {
0131         .bus_id = "uart4_tx",
0132         .min_signal = 7,
0133         .max_signal = 7,
0134         .muxval = 1,
0135         .periph_buses = PL08X_AHB1,
0136     }, {
0137         .bus_id = "uart5_rx",
0138         .min_signal = 8,
0139         .max_signal = 8,
0140         .muxval = 1,
0141         .periph_buses = PL08X_AHB1,
0142     }, {
0143         .bus_id = "uart5_tx",
0144         .min_signal = 9,
0145         .max_signal = 9,
0146         .muxval = 1,
0147         .periph_buses = PL08X_AHB1,
0148     }, {
0149         .bus_id = "ras5_rx",
0150         .min_signal = 10,
0151         .max_signal = 10,
0152         .muxval = 1,
0153         .periph_buses = PL08X_AHB1,
0154     }, {
0155         .bus_id = "ras5_tx",
0156         .min_signal = 11,
0157         .max_signal = 11,
0158         .muxval = 1,
0159         .periph_buses = PL08X_AHB1,
0160     }, {
0161         .bus_id = "ras6_rx",
0162         .min_signal = 12,
0163         .max_signal = 12,
0164         .muxval = 1,
0165         .periph_buses = PL08X_AHB1,
0166     }, {
0167         .bus_id = "ras6_tx",
0168         .min_signal = 13,
0169         .max_signal = 13,
0170         .muxval = 1,
0171         .periph_buses = PL08X_AHB1,
0172     }, {
0173         .bus_id = "ras7_rx",
0174         .min_signal = 14,
0175         .max_signal = 14,
0176         .muxval = 1,
0177         .periph_buses = PL08X_AHB1,
0178     }, {
0179         .bus_id = "ras7_tx",
0180         .min_signal = 15,
0181         .max_signal = 15,
0182         .muxval = 1,
0183         .periph_buses = PL08X_AHB1,
0184     },
0185 };
0186 
0187 /* uart devices plat data */
0188 static struct amba_pl011_data spear310_uart_data[] = {
0189     {
0190         .dma_filter = pl08x_filter_id,
0191         .dma_tx_param = "uart1_tx",
0192         .dma_rx_param = "uart1_rx",
0193     }, {
0194         .dma_filter = pl08x_filter_id,
0195         .dma_tx_param = "uart2_tx",
0196         .dma_rx_param = "uart2_rx",
0197     }, {
0198         .dma_filter = pl08x_filter_id,
0199         .dma_tx_param = "uart3_tx",
0200         .dma_rx_param = "uart3_rx",
0201     }, {
0202         .dma_filter = pl08x_filter_id,
0203         .dma_tx_param = "uart4_tx",
0204         .dma_rx_param = "uart4_rx",
0205     }, {
0206         .dma_filter = pl08x_filter_id,
0207         .dma_tx_param = "uart5_tx",
0208         .dma_rx_param = "uart5_rx",
0209     },
0210 };
0211 
0212 /* Add SPEAr310 auxdata to pass platform data */
0213 static struct of_dev_auxdata spear310_auxdata_lookup[] __initdata = {
0214     OF_DEV_AUXDATA("arm,pl022", SPEAR3XX_ICM1_SSP_BASE, NULL,
0215             &pl022_plat_data),
0216     OF_DEV_AUXDATA("arm,pl080", SPEAR_ICM3_DMA_BASE, NULL,
0217             &pl080_plat_data),
0218     OF_DEV_AUXDATA("arm,pl011", SPEAR310_UART1_BASE, NULL,
0219             &spear310_uart_data[0]),
0220     OF_DEV_AUXDATA("arm,pl011", SPEAR310_UART2_BASE, NULL,
0221             &spear310_uart_data[1]),
0222     OF_DEV_AUXDATA("arm,pl011", SPEAR310_UART3_BASE, NULL,
0223             &spear310_uart_data[2]),
0224     OF_DEV_AUXDATA("arm,pl011", SPEAR310_UART4_BASE, NULL,
0225             &spear310_uart_data[3]),
0226     OF_DEV_AUXDATA("arm,pl011", SPEAR310_UART5_BASE, NULL,
0227             &spear310_uart_data[4]),
0228     {}
0229 };
0230 
0231 static void __init spear310_dt_init(void)
0232 {
0233     pl080_plat_data.slave_channels = spear310_dma_info;
0234     pl080_plat_data.num_slave_channels = ARRAY_SIZE(spear310_dma_info);
0235 
0236     of_platform_default_populate(NULL, spear310_auxdata_lookup, NULL);
0237 }
0238 
0239 static const char * const spear310_dt_board_compat[] = {
0240     "st,spear310",
0241     "st,spear310-evb",
0242     NULL,
0243 };
0244 
0245 static void __init spear310_map_io(void)
0246 {
0247     spear3xx_map_io();
0248 }
0249 
0250 DT_MACHINE_START(SPEAR310_DT, "ST SPEAr310 SoC with Flattened Device Tree")
0251     .map_io     =   spear310_map_io,
0252     .init_time  =   spear3xx_timer_init,
0253     .init_machine   =   spear310_dt_init,
0254     .restart    =   spear_restart,
0255     .dt_compat  =   spear310_dt_board_compat,
0256 MACHINE_END