162306a36Sopenharmony_ci/*
262306a36Sopenharmony_ci * stmark2.c -- Support for Sysam AMCORE open board
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * (C) Copyright 2017, Angelo Dureghello <angelo@sysam.it>
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci * This file is subject to the terms and conditions of the GNU General Public
762306a36Sopenharmony_ci * License.  See the file COPYING in the main directory of this archive
862306a36Sopenharmony_ci * for more details.
962306a36Sopenharmony_ci */
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#include <linux/platform_device.h>
1262306a36Sopenharmony_ci#include <linux/mtd/partitions.h>
1362306a36Sopenharmony_ci#include <linux/spi/spi.h>
1462306a36Sopenharmony_ci#include <linux/spi/spi-fsl-dspi.h>
1562306a36Sopenharmony_ci#include <linux/spi/flash.h>
1662306a36Sopenharmony_ci#include <linux/dma-mapping.h>
1762306a36Sopenharmony_ci#include <asm/mcfsim.h>
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci/*
2062306a36Sopenharmony_ci * Partitioning of parallel NOR flash (39VF3201B)
2162306a36Sopenharmony_ci */
2262306a36Sopenharmony_cistatic struct mtd_partition stmark2_partitions[] = {
2362306a36Sopenharmony_ci	{
2462306a36Sopenharmony_ci		.name = "U-Boot (1024K)",
2562306a36Sopenharmony_ci		.size = 0x100000,
2662306a36Sopenharmony_ci		.offset = 0x0
2762306a36Sopenharmony_ci	}, {
2862306a36Sopenharmony_ci		.name = "Kernel+initramfs (7168K)",
2962306a36Sopenharmony_ci		.size = 0x700000,
3062306a36Sopenharmony_ci		.offset = MTDPART_OFS_APPEND
3162306a36Sopenharmony_ci	}, {
3262306a36Sopenharmony_ci		.name = "Flash Free Space (8192K)",
3362306a36Sopenharmony_ci		.size = MTDPART_SIZ_FULL,
3462306a36Sopenharmony_ci		.offset = MTDPART_OFS_APPEND
3562306a36Sopenharmony_ci	}
3662306a36Sopenharmony_ci};
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_cistatic struct flash_platform_data stmark2_spi_flash_data = {
3962306a36Sopenharmony_ci	.name = "is25lp128",
4062306a36Sopenharmony_ci	.parts = stmark2_partitions,
4162306a36Sopenharmony_ci	.nr_parts = ARRAY_SIZE(stmark2_partitions),
4262306a36Sopenharmony_ci	.type = "is25lp128",
4362306a36Sopenharmony_ci};
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_cistatic struct spi_board_info stmark2_board_info[] __initdata = {
4662306a36Sopenharmony_ci	{
4762306a36Sopenharmony_ci		.modalias = "m25p80",
4862306a36Sopenharmony_ci		.max_speed_hz = 5000000,
4962306a36Sopenharmony_ci		.bus_num = 0,
5062306a36Sopenharmony_ci		.chip_select = 1,
5162306a36Sopenharmony_ci		.platform_data = &stmark2_spi_flash_data,
5262306a36Sopenharmony_ci		.mode = SPI_MODE_3,
5362306a36Sopenharmony_ci	}
5462306a36Sopenharmony_ci};
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci/* SPI controller data, SPI (0) */
5762306a36Sopenharmony_cistatic struct fsl_dspi_platform_data dspi_spi0_info = {
5862306a36Sopenharmony_ci	.cs_num = 4,
5962306a36Sopenharmony_ci	.bus_num = 0,
6062306a36Sopenharmony_ci	.sck_cs_delay = 100,
6162306a36Sopenharmony_ci	.cs_sck_delay = 100,
6262306a36Sopenharmony_ci};
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_cistatic struct resource dspi_spi0_resource[] = {
6562306a36Sopenharmony_ci	[0] = {
6662306a36Sopenharmony_ci		.start = MCFDSPI_BASE0,
6762306a36Sopenharmony_ci		.end   = MCFDSPI_BASE0 + 0xFF,
6862306a36Sopenharmony_ci		.flags = IORESOURCE_MEM,
6962306a36Sopenharmony_ci		},
7062306a36Sopenharmony_ci	[1] = {
7162306a36Sopenharmony_ci		.start = 12,
7262306a36Sopenharmony_ci		.end   = 13,
7362306a36Sopenharmony_ci		.flags = IORESOURCE_DMA,
7462306a36Sopenharmony_ci	},
7562306a36Sopenharmony_ci	[2] = {
7662306a36Sopenharmony_ci		.start = MCF_IRQ_DSPI0,
7762306a36Sopenharmony_ci		.end   = MCF_IRQ_DSPI0,
7862306a36Sopenharmony_ci		.flags = IORESOURCE_IRQ,
7962306a36Sopenharmony_ci	},
8062306a36Sopenharmony_ci};
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_cistatic u64 stmark2_dspi_mask = DMA_BIT_MASK(32);
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_ci/* SPI controller, id = bus number */
8562306a36Sopenharmony_cistatic struct platform_device dspi_spi0_device = {
8662306a36Sopenharmony_ci	.name = "fsl-dspi",
8762306a36Sopenharmony_ci	.id = 0,
8862306a36Sopenharmony_ci	.num_resources = ARRAY_SIZE(dspi_spi0_resource),
8962306a36Sopenharmony_ci	.resource = dspi_spi0_resource,
9062306a36Sopenharmony_ci	.dev = {
9162306a36Sopenharmony_ci		.platform_data = &dspi_spi0_info,
9262306a36Sopenharmony_ci		.dma_mask = &stmark2_dspi_mask,
9362306a36Sopenharmony_ci		.coherent_dma_mask = DMA_BIT_MASK(32),
9462306a36Sopenharmony_ci	},
9562306a36Sopenharmony_ci};
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_cistatic struct platform_device *stmark2_devices[] __initdata = {
9862306a36Sopenharmony_ci	&dspi_spi0_device,
9962306a36Sopenharmony_ci};
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_ci/*
10262306a36Sopenharmony_ci * Note: proper pin-mux setup is mandatory for proper SPI functionality.
10362306a36Sopenharmony_ci */
10462306a36Sopenharmony_cistatic int __init init_stmark2(void)
10562306a36Sopenharmony_ci{
10662306a36Sopenharmony_ci	/* DSPI0, all pins as DSPI, and using CS1 */
10762306a36Sopenharmony_ci	__raw_writeb(0x80, MCFGPIO_PAR_DSPIOWL);
10862306a36Sopenharmony_ci	__raw_writeb(0xfc, MCFGPIO_PAR_DSPIOWH);
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_ci	/* Board gpio setup */
11162306a36Sopenharmony_ci	__raw_writeb(0x00, MCFGPIO_PAR_BE);
11262306a36Sopenharmony_ci	__raw_writeb(0x00, MCFGPIO_PAR_FBCTL);
11362306a36Sopenharmony_ci	__raw_writeb(0x00, MCFGPIO_PAR_CS);
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_ci	/* CAN pads */
11662306a36Sopenharmony_ci	__raw_writeb(0x50, MCFGPIO_PAR_CANI2C);
11762306a36Sopenharmony_ci
11862306a36Sopenharmony_ci	platform_add_devices(stmark2_devices, ARRAY_SIZE(stmark2_devices));
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_ci	spi_register_board_info(stmark2_board_info,
12162306a36Sopenharmony_ci				ARRAY_SIZE(stmark2_board_info));
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_ci	return 0;
12462306a36Sopenharmony_ci}
12562306a36Sopenharmony_ci
12662306a36Sopenharmony_cidevice_initcall(init_stmark2);
127