162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * arch/arm/mach-spear3xx/spear320.c
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * SPEAr320 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) "SPEAr320: " fmt
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci#include <linux/amba/pl022.h>
1462306a36Sopenharmony_ci#include <linux/amba/pl08x.h>
1562306a36Sopenharmony_ci#include <linux/amba/serial.h>
1662306a36Sopenharmony_ci#include <linux/of_platform.h>
1762306a36Sopenharmony_ci#include <asm/mach/arch.h>
1862306a36Sopenharmony_ci#include <asm/mach/map.h>
1962306a36Sopenharmony_ci#include "generic.h"
2062306a36Sopenharmony_ci#include "spear.h"
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci#define SPEAR320_UART1_BASE		UL(0xA3000000)
2362306a36Sopenharmony_ci#define SPEAR320_UART2_BASE		UL(0xA4000000)
2462306a36Sopenharmony_ci#define SPEAR320_SSP0_BASE		UL(0xA5000000)
2562306a36Sopenharmony_ci#define SPEAR320_SSP1_BASE		UL(0xA6000000)
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci/* DMAC platform data's slave info */
2862306a36Sopenharmony_cistruct pl08x_channel_data spear320_dma_info[] = {
2962306a36Sopenharmony_ci	{
3062306a36Sopenharmony_ci		.bus_id = "uart0_rx",
3162306a36Sopenharmony_ci		.min_signal = 2,
3262306a36Sopenharmony_ci		.max_signal = 2,
3362306a36Sopenharmony_ci		.muxval = 0,
3462306a36Sopenharmony_ci		.periph_buses = PL08X_AHB1,
3562306a36Sopenharmony_ci	}, {
3662306a36Sopenharmony_ci		.bus_id = "uart0_tx",
3762306a36Sopenharmony_ci		.min_signal = 3,
3862306a36Sopenharmony_ci		.max_signal = 3,
3962306a36Sopenharmony_ci		.muxval = 0,
4062306a36Sopenharmony_ci		.periph_buses = PL08X_AHB1,
4162306a36Sopenharmony_ci	}, {
4262306a36Sopenharmony_ci		.bus_id = "ssp0_rx",
4362306a36Sopenharmony_ci		.min_signal = 8,
4462306a36Sopenharmony_ci		.max_signal = 8,
4562306a36Sopenharmony_ci		.muxval = 0,
4662306a36Sopenharmony_ci		.periph_buses = PL08X_AHB1,
4762306a36Sopenharmony_ci	}, {
4862306a36Sopenharmony_ci		.bus_id = "ssp0_tx",
4962306a36Sopenharmony_ci		.min_signal = 9,
5062306a36Sopenharmony_ci		.max_signal = 9,
5162306a36Sopenharmony_ci		.muxval = 0,
5262306a36Sopenharmony_ci		.periph_buses = PL08X_AHB1,
5362306a36Sopenharmony_ci	}, {
5462306a36Sopenharmony_ci		.bus_id = "i2c0_rx",
5562306a36Sopenharmony_ci		.min_signal = 10,
5662306a36Sopenharmony_ci		.max_signal = 10,
5762306a36Sopenharmony_ci		.muxval = 0,
5862306a36Sopenharmony_ci		.periph_buses = PL08X_AHB1,
5962306a36Sopenharmony_ci	}, {
6062306a36Sopenharmony_ci		.bus_id = "i2c0_tx",
6162306a36Sopenharmony_ci		.min_signal = 11,
6262306a36Sopenharmony_ci		.max_signal = 11,
6362306a36Sopenharmony_ci		.muxval = 0,
6462306a36Sopenharmony_ci		.periph_buses = PL08X_AHB1,
6562306a36Sopenharmony_ci	}, {
6662306a36Sopenharmony_ci		.bus_id = "irda",
6762306a36Sopenharmony_ci		.min_signal = 12,
6862306a36Sopenharmony_ci		.max_signal = 12,
6962306a36Sopenharmony_ci		.muxval = 0,
7062306a36Sopenharmony_ci		.periph_buses = PL08X_AHB1,
7162306a36Sopenharmony_ci	}, {
7262306a36Sopenharmony_ci		.bus_id = "adc",
7362306a36Sopenharmony_ci		.min_signal = 13,
7462306a36Sopenharmony_ci		.max_signal = 13,
7562306a36Sopenharmony_ci		.muxval = 0,
7662306a36Sopenharmony_ci		.periph_buses = PL08X_AHB1,
7762306a36Sopenharmony_ci	}, {
7862306a36Sopenharmony_ci		.bus_id = "to_jpeg",
7962306a36Sopenharmony_ci		.min_signal = 14,
8062306a36Sopenharmony_ci		.max_signal = 14,
8162306a36Sopenharmony_ci		.muxval = 0,
8262306a36Sopenharmony_ci		.periph_buses = PL08X_AHB1,
8362306a36Sopenharmony_ci	}, {
8462306a36Sopenharmony_ci		.bus_id = "from_jpeg",
8562306a36Sopenharmony_ci		.min_signal = 15,
8662306a36Sopenharmony_ci		.max_signal = 15,
8762306a36Sopenharmony_ci		.muxval = 0,
8862306a36Sopenharmony_ci		.periph_buses = PL08X_AHB1,
8962306a36Sopenharmony_ci	}, {
9062306a36Sopenharmony_ci		.bus_id = "ssp1_rx",
9162306a36Sopenharmony_ci		.min_signal = 0,
9262306a36Sopenharmony_ci		.max_signal = 0,
9362306a36Sopenharmony_ci		.muxval = 1,
9462306a36Sopenharmony_ci		.periph_buses = PL08X_AHB2,
9562306a36Sopenharmony_ci	}, {
9662306a36Sopenharmony_ci		.bus_id = "ssp1_tx",
9762306a36Sopenharmony_ci		.min_signal = 1,
9862306a36Sopenharmony_ci		.max_signal = 1,
9962306a36Sopenharmony_ci		.muxval = 1,
10062306a36Sopenharmony_ci		.periph_buses = PL08X_AHB2,
10162306a36Sopenharmony_ci	}, {
10262306a36Sopenharmony_ci		.bus_id = "ssp2_rx",
10362306a36Sopenharmony_ci		.min_signal = 2,
10462306a36Sopenharmony_ci		.max_signal = 2,
10562306a36Sopenharmony_ci		.muxval = 1,
10662306a36Sopenharmony_ci		.periph_buses = PL08X_AHB2,
10762306a36Sopenharmony_ci	}, {
10862306a36Sopenharmony_ci		.bus_id = "ssp2_tx",
10962306a36Sopenharmony_ci		.min_signal = 3,
11062306a36Sopenharmony_ci		.max_signal = 3,
11162306a36Sopenharmony_ci		.muxval = 1,
11262306a36Sopenharmony_ci		.periph_buses = PL08X_AHB2,
11362306a36Sopenharmony_ci	}, {
11462306a36Sopenharmony_ci		.bus_id = "uart1_rx",
11562306a36Sopenharmony_ci		.min_signal = 4,
11662306a36Sopenharmony_ci		.max_signal = 4,
11762306a36Sopenharmony_ci		.muxval = 1,
11862306a36Sopenharmony_ci		.periph_buses = PL08X_AHB2,
11962306a36Sopenharmony_ci	}, {
12062306a36Sopenharmony_ci		.bus_id = "uart1_tx",
12162306a36Sopenharmony_ci		.min_signal = 5,
12262306a36Sopenharmony_ci		.max_signal = 5,
12362306a36Sopenharmony_ci		.muxval = 1,
12462306a36Sopenharmony_ci		.periph_buses = PL08X_AHB2,
12562306a36Sopenharmony_ci	}, {
12662306a36Sopenharmony_ci		.bus_id = "uart2_rx",
12762306a36Sopenharmony_ci		.min_signal = 6,
12862306a36Sopenharmony_ci		.max_signal = 6,
12962306a36Sopenharmony_ci		.muxval = 1,
13062306a36Sopenharmony_ci		.periph_buses = PL08X_AHB2,
13162306a36Sopenharmony_ci	}, {
13262306a36Sopenharmony_ci		.bus_id = "uart2_tx",
13362306a36Sopenharmony_ci		.min_signal = 7,
13462306a36Sopenharmony_ci		.max_signal = 7,
13562306a36Sopenharmony_ci		.muxval = 1,
13662306a36Sopenharmony_ci		.periph_buses = PL08X_AHB2,
13762306a36Sopenharmony_ci	}, {
13862306a36Sopenharmony_ci		.bus_id = "i2c1_rx",
13962306a36Sopenharmony_ci		.min_signal = 8,
14062306a36Sopenharmony_ci		.max_signal = 8,
14162306a36Sopenharmony_ci		.muxval = 1,
14262306a36Sopenharmony_ci		.periph_buses = PL08X_AHB2,
14362306a36Sopenharmony_ci	}, {
14462306a36Sopenharmony_ci		.bus_id = "i2c1_tx",
14562306a36Sopenharmony_ci		.min_signal = 9,
14662306a36Sopenharmony_ci		.max_signal = 9,
14762306a36Sopenharmony_ci		.muxval = 1,
14862306a36Sopenharmony_ci		.periph_buses = PL08X_AHB2,
14962306a36Sopenharmony_ci	}, {
15062306a36Sopenharmony_ci		.bus_id = "i2c2_rx",
15162306a36Sopenharmony_ci		.min_signal = 10,
15262306a36Sopenharmony_ci		.max_signal = 10,
15362306a36Sopenharmony_ci		.muxval = 1,
15462306a36Sopenharmony_ci		.periph_buses = PL08X_AHB2,
15562306a36Sopenharmony_ci	}, {
15662306a36Sopenharmony_ci		.bus_id = "i2c2_tx",
15762306a36Sopenharmony_ci		.min_signal = 11,
15862306a36Sopenharmony_ci		.max_signal = 11,
15962306a36Sopenharmony_ci		.muxval = 1,
16062306a36Sopenharmony_ci		.periph_buses = PL08X_AHB2,
16162306a36Sopenharmony_ci	}, {
16262306a36Sopenharmony_ci		.bus_id = "i2s_rx",
16362306a36Sopenharmony_ci		.min_signal = 12,
16462306a36Sopenharmony_ci		.max_signal = 12,
16562306a36Sopenharmony_ci		.muxval = 1,
16662306a36Sopenharmony_ci		.periph_buses = PL08X_AHB2,
16762306a36Sopenharmony_ci	}, {
16862306a36Sopenharmony_ci		.bus_id = "i2s_tx",
16962306a36Sopenharmony_ci		.min_signal = 13,
17062306a36Sopenharmony_ci		.max_signal = 13,
17162306a36Sopenharmony_ci		.muxval = 1,
17262306a36Sopenharmony_ci		.periph_buses = PL08X_AHB2,
17362306a36Sopenharmony_ci	}, {
17462306a36Sopenharmony_ci		.bus_id = "rs485_rx",
17562306a36Sopenharmony_ci		.min_signal = 14,
17662306a36Sopenharmony_ci		.max_signal = 14,
17762306a36Sopenharmony_ci		.muxval = 1,
17862306a36Sopenharmony_ci		.periph_buses = PL08X_AHB2,
17962306a36Sopenharmony_ci	}, {
18062306a36Sopenharmony_ci		.bus_id = "rs485_tx",
18162306a36Sopenharmony_ci		.min_signal = 15,
18262306a36Sopenharmony_ci		.max_signal = 15,
18362306a36Sopenharmony_ci		.muxval = 1,
18462306a36Sopenharmony_ci		.periph_buses = PL08X_AHB2,
18562306a36Sopenharmony_ci	},
18662306a36Sopenharmony_ci};
18762306a36Sopenharmony_ci
18862306a36Sopenharmony_cistatic struct pl022_ssp_controller spear320_ssp_data[] = {
18962306a36Sopenharmony_ci	{
19062306a36Sopenharmony_ci		.bus_id = 1,
19162306a36Sopenharmony_ci		.enable_dma = 1,
19262306a36Sopenharmony_ci		.dma_filter = pl08x_filter_id,
19362306a36Sopenharmony_ci		.dma_tx_param = "ssp1_tx",
19462306a36Sopenharmony_ci		.dma_rx_param = "ssp1_rx",
19562306a36Sopenharmony_ci	}, {
19662306a36Sopenharmony_ci		.bus_id = 2,
19762306a36Sopenharmony_ci		.enable_dma = 1,
19862306a36Sopenharmony_ci		.dma_filter = pl08x_filter_id,
19962306a36Sopenharmony_ci		.dma_tx_param = "ssp2_tx",
20062306a36Sopenharmony_ci		.dma_rx_param = "ssp2_rx",
20162306a36Sopenharmony_ci	}
20262306a36Sopenharmony_ci};
20362306a36Sopenharmony_ci
20462306a36Sopenharmony_cistatic struct amba_pl011_data spear320_uart_data[] = {
20562306a36Sopenharmony_ci	{
20662306a36Sopenharmony_ci		.dma_filter = pl08x_filter_id,
20762306a36Sopenharmony_ci		.dma_tx_param = "uart1_tx",
20862306a36Sopenharmony_ci		.dma_rx_param = "uart1_rx",
20962306a36Sopenharmony_ci	}, {
21062306a36Sopenharmony_ci		.dma_filter = pl08x_filter_id,
21162306a36Sopenharmony_ci		.dma_tx_param = "uart2_tx",
21262306a36Sopenharmony_ci		.dma_rx_param = "uart2_rx",
21362306a36Sopenharmony_ci	},
21462306a36Sopenharmony_ci};
21562306a36Sopenharmony_ci
21662306a36Sopenharmony_ci/* Add SPEAr310 auxdata to pass platform data */
21762306a36Sopenharmony_cistatic struct of_dev_auxdata spear320_auxdata_lookup[] __initdata = {
21862306a36Sopenharmony_ci	OF_DEV_AUXDATA("arm,pl022", SPEAR3XX_ICM1_SSP_BASE, NULL,
21962306a36Sopenharmony_ci			&pl022_plat_data),
22062306a36Sopenharmony_ci	OF_DEV_AUXDATA("arm,pl080", SPEAR_ICM3_DMA_BASE, NULL,
22162306a36Sopenharmony_ci			&pl080_plat_data),
22262306a36Sopenharmony_ci	OF_DEV_AUXDATA("arm,pl022", SPEAR320_SSP0_BASE, NULL,
22362306a36Sopenharmony_ci			&spear320_ssp_data[0]),
22462306a36Sopenharmony_ci	OF_DEV_AUXDATA("arm,pl022", SPEAR320_SSP1_BASE, NULL,
22562306a36Sopenharmony_ci			&spear320_ssp_data[1]),
22662306a36Sopenharmony_ci	OF_DEV_AUXDATA("arm,pl011", SPEAR320_UART1_BASE, NULL,
22762306a36Sopenharmony_ci			&spear320_uart_data[0]),
22862306a36Sopenharmony_ci	OF_DEV_AUXDATA("arm,pl011", SPEAR320_UART2_BASE, NULL,
22962306a36Sopenharmony_ci			&spear320_uart_data[1]),
23062306a36Sopenharmony_ci	{}
23162306a36Sopenharmony_ci};
23262306a36Sopenharmony_ci
23362306a36Sopenharmony_cistatic void __init spear320_dt_init(void)
23462306a36Sopenharmony_ci{
23562306a36Sopenharmony_ci	pl080_plat_data.slave_channels = spear320_dma_info;
23662306a36Sopenharmony_ci	pl080_plat_data.num_slave_channels = ARRAY_SIZE(spear320_dma_info);
23762306a36Sopenharmony_ci
23862306a36Sopenharmony_ci	of_platform_default_populate(NULL, spear320_auxdata_lookup, NULL);
23962306a36Sopenharmony_ci}
24062306a36Sopenharmony_ci
24162306a36Sopenharmony_cistatic const char * const spear320_dt_board_compat[] = {
24262306a36Sopenharmony_ci	"st,spear320",
24362306a36Sopenharmony_ci	"st,spear320-evb",
24462306a36Sopenharmony_ci	"st,spear320-hmi",
24562306a36Sopenharmony_ci	NULL,
24662306a36Sopenharmony_ci};
24762306a36Sopenharmony_ci
24862306a36Sopenharmony_cistruct map_desc spear320_io_desc[] __initdata = {
24962306a36Sopenharmony_ci	{
25062306a36Sopenharmony_ci		.virtual	= (unsigned long)VA_SPEAR320_SOC_CONFIG_BASE,
25162306a36Sopenharmony_ci		.pfn		= __phys_to_pfn(SPEAR320_SOC_CONFIG_BASE),
25262306a36Sopenharmony_ci		.length		= SZ_16M,
25362306a36Sopenharmony_ci		.type		= MT_DEVICE
25462306a36Sopenharmony_ci	},
25562306a36Sopenharmony_ci};
25662306a36Sopenharmony_ci
25762306a36Sopenharmony_cistatic void __init spear320_map_io(void)
25862306a36Sopenharmony_ci{
25962306a36Sopenharmony_ci	iotable_init(spear320_io_desc, ARRAY_SIZE(spear320_io_desc));
26062306a36Sopenharmony_ci	spear3xx_map_io();
26162306a36Sopenharmony_ci}
26262306a36Sopenharmony_ci
26362306a36Sopenharmony_ciDT_MACHINE_START(SPEAR320_DT, "ST SPEAr320 SoC with Flattened Device Tree")
26462306a36Sopenharmony_ci	.map_io		=	spear320_map_io,
26562306a36Sopenharmony_ci	.init_time	=	spear3xx_timer_init,
26662306a36Sopenharmony_ci	.init_machine	=	spear320_dt_init,
26762306a36Sopenharmony_ci	.restart	=	spear_restart,
26862306a36Sopenharmony_ci	.dt_compat	=	spear320_dt_board_compat,
26962306a36Sopenharmony_ciMACHINE_END
270