162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * arch/arm/mach-spear3xx/spear310.c
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * SPEAr310 machine source file
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci * Copyright (C) 2009-2012 ST Microelectronics
862306a36Sopenharmony_ci * Viresh Kumar <vireshk@kernel.org>
962306a36Sopenharmony_ci */
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#define pr_fmt(fmt) "SPEAr310: " fmt
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci#include <linux/amba/pl08x.h>
1462306a36Sopenharmony_ci#include <linux/amba/serial.h>
1562306a36Sopenharmony_ci#include <linux/of_platform.h>
1662306a36Sopenharmony_ci#include <asm/mach/arch.h>
1762306a36Sopenharmony_ci#include "generic.h"
1862306a36Sopenharmony_ci#include "spear.h"
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci#define SPEAR310_UART1_BASE		UL(0xB2000000)
2162306a36Sopenharmony_ci#define SPEAR310_UART2_BASE		UL(0xB2080000)
2262306a36Sopenharmony_ci#define SPEAR310_UART3_BASE		UL(0xB2100000)
2362306a36Sopenharmony_ci#define SPEAR310_UART4_BASE		UL(0xB2180000)
2462306a36Sopenharmony_ci#define SPEAR310_UART5_BASE		UL(0xB2200000)
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci/* DMAC platform data's slave info */
2762306a36Sopenharmony_cistruct pl08x_channel_data spear310_dma_info[] = {
2862306a36Sopenharmony_ci	{
2962306a36Sopenharmony_ci		.bus_id = "uart0_rx",
3062306a36Sopenharmony_ci		.min_signal = 2,
3162306a36Sopenharmony_ci		.max_signal = 2,
3262306a36Sopenharmony_ci		.muxval = 0,
3362306a36Sopenharmony_ci		.periph_buses = PL08X_AHB1,
3462306a36Sopenharmony_ci	}, {
3562306a36Sopenharmony_ci		.bus_id = "uart0_tx",
3662306a36Sopenharmony_ci		.min_signal = 3,
3762306a36Sopenharmony_ci		.max_signal = 3,
3862306a36Sopenharmony_ci		.muxval = 0,
3962306a36Sopenharmony_ci		.periph_buses = PL08X_AHB1,
4062306a36Sopenharmony_ci	}, {
4162306a36Sopenharmony_ci		.bus_id = "ssp0_rx",
4262306a36Sopenharmony_ci		.min_signal = 8,
4362306a36Sopenharmony_ci		.max_signal = 8,
4462306a36Sopenharmony_ci		.muxval = 0,
4562306a36Sopenharmony_ci		.periph_buses = PL08X_AHB1,
4662306a36Sopenharmony_ci	}, {
4762306a36Sopenharmony_ci		.bus_id = "ssp0_tx",
4862306a36Sopenharmony_ci		.min_signal = 9,
4962306a36Sopenharmony_ci		.max_signal = 9,
5062306a36Sopenharmony_ci		.muxval = 0,
5162306a36Sopenharmony_ci		.periph_buses = PL08X_AHB1,
5262306a36Sopenharmony_ci	}, {
5362306a36Sopenharmony_ci		.bus_id = "i2c_rx",
5462306a36Sopenharmony_ci		.min_signal = 10,
5562306a36Sopenharmony_ci		.max_signal = 10,
5662306a36Sopenharmony_ci		.muxval = 0,
5762306a36Sopenharmony_ci		.periph_buses = PL08X_AHB1,
5862306a36Sopenharmony_ci	}, {
5962306a36Sopenharmony_ci		.bus_id = "i2c_tx",
6062306a36Sopenharmony_ci		.min_signal = 11,
6162306a36Sopenharmony_ci		.max_signal = 11,
6262306a36Sopenharmony_ci		.muxval = 0,
6362306a36Sopenharmony_ci		.periph_buses = PL08X_AHB1,
6462306a36Sopenharmony_ci	}, {
6562306a36Sopenharmony_ci		.bus_id = "irda",
6662306a36Sopenharmony_ci		.min_signal = 12,
6762306a36Sopenharmony_ci		.max_signal = 12,
6862306a36Sopenharmony_ci		.muxval = 0,
6962306a36Sopenharmony_ci		.periph_buses = PL08X_AHB1,
7062306a36Sopenharmony_ci	}, {
7162306a36Sopenharmony_ci		.bus_id = "adc",
7262306a36Sopenharmony_ci		.min_signal = 13,
7362306a36Sopenharmony_ci		.max_signal = 13,
7462306a36Sopenharmony_ci		.muxval = 0,
7562306a36Sopenharmony_ci		.periph_buses = PL08X_AHB1,
7662306a36Sopenharmony_ci	}, {
7762306a36Sopenharmony_ci		.bus_id = "to_jpeg",
7862306a36Sopenharmony_ci		.min_signal = 14,
7962306a36Sopenharmony_ci		.max_signal = 14,
8062306a36Sopenharmony_ci		.muxval = 0,
8162306a36Sopenharmony_ci		.periph_buses = PL08X_AHB1,
8262306a36Sopenharmony_ci	}, {
8362306a36Sopenharmony_ci		.bus_id = "from_jpeg",
8462306a36Sopenharmony_ci		.min_signal = 15,
8562306a36Sopenharmony_ci		.max_signal = 15,
8662306a36Sopenharmony_ci		.muxval = 0,
8762306a36Sopenharmony_ci		.periph_buses = PL08X_AHB1,
8862306a36Sopenharmony_ci	}, {
8962306a36Sopenharmony_ci		.bus_id = "uart1_rx",
9062306a36Sopenharmony_ci		.min_signal = 0,
9162306a36Sopenharmony_ci		.max_signal = 0,
9262306a36Sopenharmony_ci		.muxval = 1,
9362306a36Sopenharmony_ci		.periph_buses = PL08X_AHB1,
9462306a36Sopenharmony_ci	}, {
9562306a36Sopenharmony_ci		.bus_id = "uart1_tx",
9662306a36Sopenharmony_ci		.min_signal = 1,
9762306a36Sopenharmony_ci		.max_signal = 1,
9862306a36Sopenharmony_ci		.muxval = 1,
9962306a36Sopenharmony_ci		.periph_buses = PL08X_AHB1,
10062306a36Sopenharmony_ci	}, {
10162306a36Sopenharmony_ci		.bus_id = "uart2_rx",
10262306a36Sopenharmony_ci		.min_signal = 2,
10362306a36Sopenharmony_ci		.max_signal = 2,
10462306a36Sopenharmony_ci		.muxval = 1,
10562306a36Sopenharmony_ci		.periph_buses = PL08X_AHB1,
10662306a36Sopenharmony_ci	}, {
10762306a36Sopenharmony_ci		.bus_id = "uart2_tx",
10862306a36Sopenharmony_ci		.min_signal = 3,
10962306a36Sopenharmony_ci		.max_signal = 3,
11062306a36Sopenharmony_ci		.muxval = 1,
11162306a36Sopenharmony_ci		.periph_buses = PL08X_AHB1,
11262306a36Sopenharmony_ci	}, {
11362306a36Sopenharmony_ci		.bus_id = "uart3_rx",
11462306a36Sopenharmony_ci		.min_signal = 4,
11562306a36Sopenharmony_ci		.max_signal = 4,
11662306a36Sopenharmony_ci		.muxval = 1,
11762306a36Sopenharmony_ci		.periph_buses = PL08X_AHB1,
11862306a36Sopenharmony_ci	}, {
11962306a36Sopenharmony_ci		.bus_id = "uart3_tx",
12062306a36Sopenharmony_ci		.min_signal = 5,
12162306a36Sopenharmony_ci		.max_signal = 5,
12262306a36Sopenharmony_ci		.muxval = 1,
12362306a36Sopenharmony_ci		.periph_buses = PL08X_AHB1,
12462306a36Sopenharmony_ci	}, {
12562306a36Sopenharmony_ci		.bus_id = "uart4_rx",
12662306a36Sopenharmony_ci		.min_signal = 6,
12762306a36Sopenharmony_ci		.max_signal = 6,
12862306a36Sopenharmony_ci		.muxval = 1,
12962306a36Sopenharmony_ci		.periph_buses = PL08X_AHB1,
13062306a36Sopenharmony_ci	}, {
13162306a36Sopenharmony_ci		.bus_id = "uart4_tx",
13262306a36Sopenharmony_ci		.min_signal = 7,
13362306a36Sopenharmony_ci		.max_signal = 7,
13462306a36Sopenharmony_ci		.muxval = 1,
13562306a36Sopenharmony_ci		.periph_buses = PL08X_AHB1,
13662306a36Sopenharmony_ci	}, {
13762306a36Sopenharmony_ci		.bus_id = "uart5_rx",
13862306a36Sopenharmony_ci		.min_signal = 8,
13962306a36Sopenharmony_ci		.max_signal = 8,
14062306a36Sopenharmony_ci		.muxval = 1,
14162306a36Sopenharmony_ci		.periph_buses = PL08X_AHB1,
14262306a36Sopenharmony_ci	}, {
14362306a36Sopenharmony_ci		.bus_id = "uart5_tx",
14462306a36Sopenharmony_ci		.min_signal = 9,
14562306a36Sopenharmony_ci		.max_signal = 9,
14662306a36Sopenharmony_ci		.muxval = 1,
14762306a36Sopenharmony_ci		.periph_buses = PL08X_AHB1,
14862306a36Sopenharmony_ci	}, {
14962306a36Sopenharmony_ci		.bus_id = "ras5_rx",
15062306a36Sopenharmony_ci		.min_signal = 10,
15162306a36Sopenharmony_ci		.max_signal = 10,
15262306a36Sopenharmony_ci		.muxval = 1,
15362306a36Sopenharmony_ci		.periph_buses = PL08X_AHB1,
15462306a36Sopenharmony_ci	}, {
15562306a36Sopenharmony_ci		.bus_id = "ras5_tx",
15662306a36Sopenharmony_ci		.min_signal = 11,
15762306a36Sopenharmony_ci		.max_signal = 11,
15862306a36Sopenharmony_ci		.muxval = 1,
15962306a36Sopenharmony_ci		.periph_buses = PL08X_AHB1,
16062306a36Sopenharmony_ci	}, {
16162306a36Sopenharmony_ci		.bus_id = "ras6_rx",
16262306a36Sopenharmony_ci		.min_signal = 12,
16362306a36Sopenharmony_ci		.max_signal = 12,
16462306a36Sopenharmony_ci		.muxval = 1,
16562306a36Sopenharmony_ci		.periph_buses = PL08X_AHB1,
16662306a36Sopenharmony_ci	}, {
16762306a36Sopenharmony_ci		.bus_id = "ras6_tx",
16862306a36Sopenharmony_ci		.min_signal = 13,
16962306a36Sopenharmony_ci		.max_signal = 13,
17062306a36Sopenharmony_ci		.muxval = 1,
17162306a36Sopenharmony_ci		.periph_buses = PL08X_AHB1,
17262306a36Sopenharmony_ci	}, {
17362306a36Sopenharmony_ci		.bus_id = "ras7_rx",
17462306a36Sopenharmony_ci		.min_signal = 14,
17562306a36Sopenharmony_ci		.max_signal = 14,
17662306a36Sopenharmony_ci		.muxval = 1,
17762306a36Sopenharmony_ci		.periph_buses = PL08X_AHB1,
17862306a36Sopenharmony_ci	}, {
17962306a36Sopenharmony_ci		.bus_id = "ras7_tx",
18062306a36Sopenharmony_ci		.min_signal = 15,
18162306a36Sopenharmony_ci		.max_signal = 15,
18262306a36Sopenharmony_ci		.muxval = 1,
18362306a36Sopenharmony_ci		.periph_buses = PL08X_AHB1,
18462306a36Sopenharmony_ci	},
18562306a36Sopenharmony_ci};
18662306a36Sopenharmony_ci
18762306a36Sopenharmony_ci/* uart devices plat data */
18862306a36Sopenharmony_cistatic struct amba_pl011_data spear310_uart_data[] = {
18962306a36Sopenharmony_ci	{
19062306a36Sopenharmony_ci		.dma_filter = pl08x_filter_id,
19162306a36Sopenharmony_ci		.dma_tx_param = "uart1_tx",
19262306a36Sopenharmony_ci		.dma_rx_param = "uart1_rx",
19362306a36Sopenharmony_ci	}, {
19462306a36Sopenharmony_ci		.dma_filter = pl08x_filter_id,
19562306a36Sopenharmony_ci		.dma_tx_param = "uart2_tx",
19662306a36Sopenharmony_ci		.dma_rx_param = "uart2_rx",
19762306a36Sopenharmony_ci	}, {
19862306a36Sopenharmony_ci		.dma_filter = pl08x_filter_id,
19962306a36Sopenharmony_ci		.dma_tx_param = "uart3_tx",
20062306a36Sopenharmony_ci		.dma_rx_param = "uart3_rx",
20162306a36Sopenharmony_ci	}, {
20262306a36Sopenharmony_ci		.dma_filter = pl08x_filter_id,
20362306a36Sopenharmony_ci		.dma_tx_param = "uart4_tx",
20462306a36Sopenharmony_ci		.dma_rx_param = "uart4_rx",
20562306a36Sopenharmony_ci	}, {
20662306a36Sopenharmony_ci		.dma_filter = pl08x_filter_id,
20762306a36Sopenharmony_ci		.dma_tx_param = "uart5_tx",
20862306a36Sopenharmony_ci		.dma_rx_param = "uart5_rx",
20962306a36Sopenharmony_ci	},
21062306a36Sopenharmony_ci};
21162306a36Sopenharmony_ci
21262306a36Sopenharmony_ci/* Add SPEAr310 auxdata to pass platform data */
21362306a36Sopenharmony_cistatic struct of_dev_auxdata spear310_auxdata_lookup[] __initdata = {
21462306a36Sopenharmony_ci	OF_DEV_AUXDATA("arm,pl022", SPEAR3XX_ICM1_SSP_BASE, NULL,
21562306a36Sopenharmony_ci			&pl022_plat_data),
21662306a36Sopenharmony_ci	OF_DEV_AUXDATA("arm,pl080", SPEAR_ICM3_DMA_BASE, NULL,
21762306a36Sopenharmony_ci			&pl080_plat_data),
21862306a36Sopenharmony_ci	OF_DEV_AUXDATA("arm,pl011", SPEAR310_UART1_BASE, NULL,
21962306a36Sopenharmony_ci			&spear310_uart_data[0]),
22062306a36Sopenharmony_ci	OF_DEV_AUXDATA("arm,pl011", SPEAR310_UART2_BASE, NULL,
22162306a36Sopenharmony_ci			&spear310_uart_data[1]),
22262306a36Sopenharmony_ci	OF_DEV_AUXDATA("arm,pl011", SPEAR310_UART3_BASE, NULL,
22362306a36Sopenharmony_ci			&spear310_uart_data[2]),
22462306a36Sopenharmony_ci	OF_DEV_AUXDATA("arm,pl011", SPEAR310_UART4_BASE, NULL,
22562306a36Sopenharmony_ci			&spear310_uart_data[3]),
22662306a36Sopenharmony_ci	OF_DEV_AUXDATA("arm,pl011", SPEAR310_UART5_BASE, NULL,
22762306a36Sopenharmony_ci			&spear310_uart_data[4]),
22862306a36Sopenharmony_ci	{}
22962306a36Sopenharmony_ci};
23062306a36Sopenharmony_ci
23162306a36Sopenharmony_cistatic void __init spear310_dt_init(void)
23262306a36Sopenharmony_ci{
23362306a36Sopenharmony_ci	pl080_plat_data.slave_channels = spear310_dma_info;
23462306a36Sopenharmony_ci	pl080_plat_data.num_slave_channels = ARRAY_SIZE(spear310_dma_info);
23562306a36Sopenharmony_ci
23662306a36Sopenharmony_ci	of_platform_default_populate(NULL, spear310_auxdata_lookup, NULL);
23762306a36Sopenharmony_ci}
23862306a36Sopenharmony_ci
23962306a36Sopenharmony_cistatic const char * const spear310_dt_board_compat[] = {
24062306a36Sopenharmony_ci	"st,spear310",
24162306a36Sopenharmony_ci	"st,spear310-evb",
24262306a36Sopenharmony_ci	NULL,
24362306a36Sopenharmony_ci};
24462306a36Sopenharmony_ci
24562306a36Sopenharmony_cistatic void __init spear310_map_io(void)
24662306a36Sopenharmony_ci{
24762306a36Sopenharmony_ci	spear3xx_map_io();
24862306a36Sopenharmony_ci}
24962306a36Sopenharmony_ci
25062306a36Sopenharmony_ciDT_MACHINE_START(SPEAR310_DT, "ST SPEAr310 SoC with Flattened Device Tree")
25162306a36Sopenharmony_ci	.map_io		=	spear310_map_io,
25262306a36Sopenharmony_ci	.init_time	=	spear3xx_timer_init,
25362306a36Sopenharmony_ci	.init_machine	=	spear310_dt_init,
25462306a36Sopenharmony_ci	.restart	=	spear_restart,
25562306a36Sopenharmony_ci	.dt_compat	=	spear310_dt_board_compat,
25662306a36Sopenharmony_ciMACHINE_END
257