162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0+
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Platform support for LPC32xx SoC
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Author: Kevin Wells <kevin.wells@nxp.com>
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci * Copyright (C) 2012 Roland Stigge <stigge@antcom.de>
862306a36Sopenharmony_ci * Copyright (C) 2010 NXP Semiconductors
962306a36Sopenharmony_ci */
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#include <linux/amba/pl08x.h>
1262306a36Sopenharmony_ci#include <linux/mtd/lpc32xx_mlc.h>
1362306a36Sopenharmony_ci#include <linux/mtd/lpc32xx_slc.h>
1462306a36Sopenharmony_ci#include <linux/of_platform.h>
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci#include <asm/mach/arch.h>
1762306a36Sopenharmony_ci#include "common.h"
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_cistatic struct pl08x_channel_data pl08x_slave_channels[] = {
2062306a36Sopenharmony_ci	{
2162306a36Sopenharmony_ci		.bus_id = "nand-slc",
2262306a36Sopenharmony_ci		.min_signal = 1, /* SLC NAND Flash */
2362306a36Sopenharmony_ci		.max_signal = 1,
2462306a36Sopenharmony_ci		.periph_buses = PL08X_AHB1,
2562306a36Sopenharmony_ci	},
2662306a36Sopenharmony_ci	{
2762306a36Sopenharmony_ci		.bus_id = "nand-mlc",
2862306a36Sopenharmony_ci		.min_signal = 12, /* MLC NAND Flash */
2962306a36Sopenharmony_ci		.max_signal = 12,
3062306a36Sopenharmony_ci		.periph_buses = PL08X_AHB1,
3162306a36Sopenharmony_ci	},
3262306a36Sopenharmony_ci};
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_cistatic int pl08x_get_signal(const struct pl08x_channel_data *cd)
3562306a36Sopenharmony_ci{
3662306a36Sopenharmony_ci	return cd->min_signal;
3762306a36Sopenharmony_ci}
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_cistatic void pl08x_put_signal(const struct pl08x_channel_data *cd, int ch)
4062306a36Sopenharmony_ci{
4162306a36Sopenharmony_ci}
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_cistatic struct pl08x_platform_data pl08x_pd = {
4462306a36Sopenharmony_ci	/* Some reasonable memcpy defaults */
4562306a36Sopenharmony_ci	.memcpy_burst_size = PL08X_BURST_SZ_256,
4662306a36Sopenharmony_ci	.memcpy_bus_width = PL08X_BUS_WIDTH_32_BITS,
4762306a36Sopenharmony_ci	.slave_channels = &pl08x_slave_channels[0],
4862306a36Sopenharmony_ci	.num_slave_channels = ARRAY_SIZE(pl08x_slave_channels),
4962306a36Sopenharmony_ci	.get_xfer_signal = pl08x_get_signal,
5062306a36Sopenharmony_ci	.put_xfer_signal = pl08x_put_signal,
5162306a36Sopenharmony_ci	.lli_buses = PL08X_AHB1,
5262306a36Sopenharmony_ci	.mem_buses = PL08X_AHB1,
5362306a36Sopenharmony_ci};
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_cistatic struct lpc32xx_slc_platform_data lpc32xx_slc_data = {
5662306a36Sopenharmony_ci	.dma_filter = pl08x_filter_id,
5762306a36Sopenharmony_ci};
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_cistatic struct lpc32xx_mlc_platform_data lpc32xx_mlc_data = {
6062306a36Sopenharmony_ci	.dma_filter = pl08x_filter_id,
6162306a36Sopenharmony_ci};
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_cistatic const struct of_dev_auxdata lpc32xx_auxdata_lookup[] __initconst = {
6462306a36Sopenharmony_ci	OF_DEV_AUXDATA("arm,pl080", 0x31000000, "pl08xdmac", &pl08x_pd),
6562306a36Sopenharmony_ci	OF_DEV_AUXDATA("nxp,lpc3220-slc", 0x20020000, "20020000.flash",
6662306a36Sopenharmony_ci		       &lpc32xx_slc_data),
6762306a36Sopenharmony_ci	OF_DEV_AUXDATA("nxp,lpc3220-mlc", 0x200a8000, "200a8000.flash",
6862306a36Sopenharmony_ci		       &lpc32xx_mlc_data),
6962306a36Sopenharmony_ci	{ }
7062306a36Sopenharmony_ci};
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_cistatic void __init lpc3250_machine_init(void)
7362306a36Sopenharmony_ci{
7462306a36Sopenharmony_ci	lpc32xx_serial_init();
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ci	of_platform_default_populate(NULL, lpc32xx_auxdata_lookup, NULL);
7762306a36Sopenharmony_ci}
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_cistatic const char *const lpc32xx_dt_compat[] __initconst = {
8062306a36Sopenharmony_ci	"nxp,lpc3220",
8162306a36Sopenharmony_ci	"nxp,lpc3230",
8262306a36Sopenharmony_ci	"nxp,lpc3240",
8362306a36Sopenharmony_ci	"nxp,lpc3250",
8462306a36Sopenharmony_ci	NULL
8562306a36Sopenharmony_ci};
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ciDT_MACHINE_START(LPC32XX_DT, "LPC32XX SoC (Flattened Device Tree)")
8862306a36Sopenharmony_ci	.atag_offset	= 0x100,
8962306a36Sopenharmony_ci	.map_io		= lpc32xx_map_io,
9062306a36Sopenharmony_ci	.init_machine	= lpc3250_machine_init,
9162306a36Sopenharmony_ci	.dt_compat	= lpc32xx_dt_compat,
9262306a36Sopenharmony_ciMACHINE_END
93