18c2ecf20Sopenharmony_ci/*
28c2ecf20Sopenharmony_ci * stmark2.c -- Support for Sysam AMCORE open board
38c2ecf20Sopenharmony_ci *
48c2ecf20Sopenharmony_ci * (C) Copyright 2017, Angelo Dureghello <angelo@sysam.it>
58c2ecf20Sopenharmony_ci *
68c2ecf20Sopenharmony_ci * This file is subject to the terms and conditions of the GNU General Public
78c2ecf20Sopenharmony_ci * License.  See the file COPYING in the main directory of this archive
88c2ecf20Sopenharmony_ci * for more details.
98c2ecf20Sopenharmony_ci */
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_ci#include <linux/platform_device.h>
128c2ecf20Sopenharmony_ci#include <linux/mtd/partitions.h>
138c2ecf20Sopenharmony_ci#include <linux/spi/spi.h>
148c2ecf20Sopenharmony_ci#include <linux/spi/spi-fsl-dspi.h>
158c2ecf20Sopenharmony_ci#include <linux/spi/flash.h>
168c2ecf20Sopenharmony_ci#include <linux/dma-mapping.h>
178c2ecf20Sopenharmony_ci#include <asm/mcfsim.h>
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_ci/*
208c2ecf20Sopenharmony_ci * Partitioning of parallel NOR flash (39VF3201B)
218c2ecf20Sopenharmony_ci */
228c2ecf20Sopenharmony_cistatic struct mtd_partition stmark2_partitions[] = {
238c2ecf20Sopenharmony_ci	{
248c2ecf20Sopenharmony_ci		.name = "U-Boot (1024K)",
258c2ecf20Sopenharmony_ci		.size = 0x100000,
268c2ecf20Sopenharmony_ci		.offset = 0x0
278c2ecf20Sopenharmony_ci	}, {
288c2ecf20Sopenharmony_ci		.name = "Kernel+initramfs (7168K)",
298c2ecf20Sopenharmony_ci		.size = 0x700000,
308c2ecf20Sopenharmony_ci		.offset = MTDPART_OFS_APPEND
318c2ecf20Sopenharmony_ci	}, {
328c2ecf20Sopenharmony_ci		.name = "Flash Free Space (8192K)",
338c2ecf20Sopenharmony_ci		.size = MTDPART_SIZ_FULL,
348c2ecf20Sopenharmony_ci		.offset = MTDPART_OFS_APPEND
358c2ecf20Sopenharmony_ci	}
368c2ecf20Sopenharmony_ci};
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_cistatic struct flash_platform_data stmark2_spi_flash_data = {
398c2ecf20Sopenharmony_ci	.name = "is25lp128",
408c2ecf20Sopenharmony_ci	.parts = stmark2_partitions,
418c2ecf20Sopenharmony_ci	.nr_parts = ARRAY_SIZE(stmark2_partitions),
428c2ecf20Sopenharmony_ci	.type = "is25lp128",
438c2ecf20Sopenharmony_ci};
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_cistatic struct spi_board_info stmark2_board_info[] __initdata = {
468c2ecf20Sopenharmony_ci	{
478c2ecf20Sopenharmony_ci		.modalias = "m25p80",
488c2ecf20Sopenharmony_ci		.max_speed_hz = 5000000,
498c2ecf20Sopenharmony_ci		.bus_num = 0,
508c2ecf20Sopenharmony_ci		.chip_select = 1,
518c2ecf20Sopenharmony_ci		.platform_data = &stmark2_spi_flash_data,
528c2ecf20Sopenharmony_ci		.mode = SPI_MODE_3,
538c2ecf20Sopenharmony_ci	}
548c2ecf20Sopenharmony_ci};
558c2ecf20Sopenharmony_ci
568c2ecf20Sopenharmony_ci/* SPI controller data, SPI (0) */
578c2ecf20Sopenharmony_cistatic struct fsl_dspi_platform_data dspi_spi0_info = {
588c2ecf20Sopenharmony_ci	.cs_num = 4,
598c2ecf20Sopenharmony_ci	.bus_num = 0,
608c2ecf20Sopenharmony_ci	.sck_cs_delay = 100,
618c2ecf20Sopenharmony_ci	.cs_sck_delay = 100,
628c2ecf20Sopenharmony_ci};
638c2ecf20Sopenharmony_ci
648c2ecf20Sopenharmony_cistatic struct resource dspi_spi0_resource[] = {
658c2ecf20Sopenharmony_ci	[0] = {
668c2ecf20Sopenharmony_ci		.start = MCFDSPI_BASE0,
678c2ecf20Sopenharmony_ci		.end   = MCFDSPI_BASE0 + 0xFF,
688c2ecf20Sopenharmony_ci		.flags = IORESOURCE_MEM,
698c2ecf20Sopenharmony_ci		},
708c2ecf20Sopenharmony_ci	[1] = {
718c2ecf20Sopenharmony_ci		.start = 12,
728c2ecf20Sopenharmony_ci		.end   = 13,
738c2ecf20Sopenharmony_ci		.flags = IORESOURCE_DMA,
748c2ecf20Sopenharmony_ci	},
758c2ecf20Sopenharmony_ci	[2] = {
768c2ecf20Sopenharmony_ci		.start = MCF_IRQ_DSPI0,
778c2ecf20Sopenharmony_ci		.end   = MCF_IRQ_DSPI0,
788c2ecf20Sopenharmony_ci		.flags = IORESOURCE_IRQ,
798c2ecf20Sopenharmony_ci	},
808c2ecf20Sopenharmony_ci};
818c2ecf20Sopenharmony_ci
828c2ecf20Sopenharmony_cistatic u64 stmark2_dspi_mask = DMA_BIT_MASK(32);
838c2ecf20Sopenharmony_ci
848c2ecf20Sopenharmony_ci/* SPI controller, id = bus number */
858c2ecf20Sopenharmony_cistatic struct platform_device dspi_spi0_device = {
868c2ecf20Sopenharmony_ci	.name = "fsl-dspi",
878c2ecf20Sopenharmony_ci	.id = 0,
888c2ecf20Sopenharmony_ci	.num_resources = ARRAY_SIZE(dspi_spi0_resource),
898c2ecf20Sopenharmony_ci	.resource = dspi_spi0_resource,
908c2ecf20Sopenharmony_ci	.dev = {
918c2ecf20Sopenharmony_ci		.platform_data = &dspi_spi0_info,
928c2ecf20Sopenharmony_ci		.dma_mask = &stmark2_dspi_mask,
938c2ecf20Sopenharmony_ci		.coherent_dma_mask = DMA_BIT_MASK(32),
948c2ecf20Sopenharmony_ci	},
958c2ecf20Sopenharmony_ci};
968c2ecf20Sopenharmony_ci
978c2ecf20Sopenharmony_cistatic struct platform_device *stmark2_devices[] __initdata = {
988c2ecf20Sopenharmony_ci	&dspi_spi0_device,
998c2ecf20Sopenharmony_ci};
1008c2ecf20Sopenharmony_ci
1018c2ecf20Sopenharmony_ci/*
1028c2ecf20Sopenharmony_ci * Note: proper pin-mux setup is mandatory for proper SPI functionality.
1038c2ecf20Sopenharmony_ci */
1048c2ecf20Sopenharmony_cistatic int __init init_stmark2(void)
1058c2ecf20Sopenharmony_ci{
1068c2ecf20Sopenharmony_ci	/* DSPI0, all pins as DSPI, and using CS1 */
1078c2ecf20Sopenharmony_ci	__raw_writeb(0x80, MCFGPIO_PAR_DSPIOWL);
1088c2ecf20Sopenharmony_ci	__raw_writeb(0xfc, MCFGPIO_PAR_DSPIOWH);
1098c2ecf20Sopenharmony_ci
1108c2ecf20Sopenharmony_ci	/* Board gpio setup */
1118c2ecf20Sopenharmony_ci	__raw_writeb(0x00, MCFGPIO_PAR_BE);
1128c2ecf20Sopenharmony_ci	__raw_writeb(0x00, MCFGPIO_PAR_FBCTL);
1138c2ecf20Sopenharmony_ci	__raw_writeb(0x00, MCFGPIO_PAR_CS);
1148c2ecf20Sopenharmony_ci	__raw_writeb(0x00, MCFGPIO_PAR_CANI2C);
1158c2ecf20Sopenharmony_ci
1168c2ecf20Sopenharmony_ci	platform_add_devices(stmark2_devices, ARRAY_SIZE(stmark2_devices));
1178c2ecf20Sopenharmony_ci
1188c2ecf20Sopenharmony_ci	spi_register_board_info(stmark2_board_info,
1198c2ecf20Sopenharmony_ci				ARRAY_SIZE(stmark2_board_info));
1208c2ecf20Sopenharmony_ci
1218c2ecf20Sopenharmony_ci	return 0;
1228c2ecf20Sopenharmony_ci}
1238c2ecf20Sopenharmony_ci
1248c2ecf20Sopenharmony_cilate_initcall(init_stmark2);
125