/* * stmark2.c -- Support for Sysam AMCORE open board * * (C) Copyright 2017, Angelo Dureghello <angelo@sysam.it> * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of this archive * for more details. */ #include <linux/platform_device.h> #include <linux/mtd/partitions.h> #include <linux/spi/spi.h> #include <linux/spi/spi-fsl-dspi.h> #include <linux/spi/flash.h> #include <linux/dma-mapping.h> #include <asm/mcfsim.h> /* * Partitioning of parallel NOR flash (39VF3201B) */ static struct mtd_partition stmark2_partitions[] = { { .name = "U-Boot (1024K)", .size = 0x100000, .offset = 0x0 }, { .name = "Kernel+initramfs (7168K)", .size = 0x700000, .offset = MTDPART_OFS_APPEND }, { .name = "Flash Free Space (8192K)", .size = MTDPART_SIZ_FULL, .offset = MTDPART_OFS_APPEND } }; static struct flash_platform_data stmark2_spi_flash_data = { .name = "is25lp128", .parts = stmark2_partitions, .nr_parts = ARRAY_SIZE(stmark2_partitions), .type = "is25lp128", }; static struct spi_board_info stmark2_board_info[] __initdata = { { .modalias = "m25p80", .max_speed_hz = 5000000, .bus_num = 0, .chip_select = 1, .platform_data = &stmark2_spi_flash_data, .mode = SPI_MODE_3, } }; /* SPI controller data, SPI (0) */ static struct fsl_dspi_platform_data dspi_spi0_info = { .cs_num = 4, .bus_num = 0, .sck_cs_delay = 100, .cs_sck_delay = 100, }; static struct resource dspi_spi0_resource[] = { [0] = { .start = MCFDSPI_BASE0, .end = MCFDSPI_BASE0 + 0xFF, .flags = IORESOURCE_MEM, }, [1] = { .start = 12, .end = 13, .flags = IORESOURCE_DMA, }, [2] = { .start = MCF_IRQ_DSPI0, .end = MCF_IRQ_DSPI0, .flags = IORESOURCE_IRQ, }, }; static u64 stmark2_dspi_mask = DMA_BIT_MASK(32); /* SPI controller, id = bus number */ static struct platform_device dspi_spi0_device = { .name = "fsl-dspi", .id = 0, .num_resources = ARRAY_SIZE(dspi_spi0_resource), .resource = dspi_spi0_resource, .dev = { .platform_data = &dspi_spi0_info, .dma_mask = &stmark2_dspi_mask, .coherent_dma_mask = DMA_BIT_MASK(32), }, }; static struct platform_device *stmark2_devices[] __initdata = { &dspi_spi0_device, }; /* * Note: proper pin-mux setup is mandatory for proper SPI functionality. */ static int __init init_stmark2(void) { /* DSPI0, all pins as DSPI, and using CS1 */ __raw_writeb(0x80, MCFGPIO_PAR_DSPIOWL); __raw_writeb(0xfc, MCFGPIO_PAR_DSPIOWH); /* Board gpio setup */ __raw_writeb(0x00, MCFGPIO_PAR_BE); __raw_writeb(0x00, MCFGPIO_PAR_FBCTL); __raw_writeb(0x00, MCFGPIO_PAR_CS); /* CAN pads */ __raw_writeb(0x50, MCFGPIO_PAR_CANI2C); platform_add_devices(stmark2_devices, ARRAY_SIZE(stmark2_devices)); spi_register_board_info(stmark2_board_info, ARRAY_SIZE(stmark2_board_info)); return 0; } device_initcall(init_stmark2);