Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
at v4.16 119 lines 2.7 kB view raw
1/* 2 * stmark2.c -- Support for Sysam AMCORE open board 3 * 4 * (C) Copyright 2017, Angelo Dureghello <angelo@sysam.it> 5 * 6 * This file is subject to the terms and conditions of the GNU General Public 7 * License. See the file COPYING in the main directory of this archive 8 * for more details. 9 */ 10 11#include <linux/platform_device.h> 12#include <linux/mtd/partitions.h> 13#include <linux/spi/spi.h> 14#include <linux/spi/spi-fsl-dspi.h> 15#include <linux/spi/flash.h> 16#include <asm/mcfsim.h> 17 18/* 19 * Partitioning of parallel NOR flash (39VF3201B) 20 */ 21static struct mtd_partition stmark2_partitions[] = { 22 { 23 .name = "U-Boot (1024K)", 24 .size = 0x100000, 25 .offset = 0x0 26 }, { 27 .name = "Kernel+initramfs (7168K)", 28 .size = 0x700000, 29 .offset = MTDPART_OFS_APPEND 30 }, { 31 .name = "Flash Free Space (8192K)", 32 .size = MTDPART_SIZ_FULL, 33 .offset = MTDPART_OFS_APPEND 34 } 35}; 36 37static struct flash_platform_data stmark2_spi_flash_data = { 38 .name = "is25lp128", 39 .parts = stmark2_partitions, 40 .nr_parts = ARRAY_SIZE(stmark2_partitions), 41 .type = "is25lp128", 42}; 43 44static struct spi_board_info stmark2_board_info[] __initdata = { 45 { 46 .modalias = "m25p80", 47 .max_speed_hz = 5000000, 48 .bus_num = 0, 49 .chip_select = 1, 50 .platform_data = &stmark2_spi_flash_data, 51 .mode = SPI_MODE_3, 52 } 53}; 54 55/* SPI controller data, SPI (0) */ 56static struct fsl_dspi_platform_data dspi_spi0_info = { 57 .cs_num = 4, 58 .bus_num = 0, 59 .sck_cs_delay = 100, 60 .cs_sck_delay = 100, 61}; 62 63static struct resource dspi_spi0_resource[] = { 64 [0] = { 65 .start = MCFDSPI_BASE0, 66 .end = MCFDSPI_BASE0 + 0xFF, 67 .flags = IORESOURCE_MEM, 68 }, 69 [1] = { 70 .start = 12, 71 .end = 13, 72 .flags = IORESOURCE_DMA, 73 }, 74 [2] = { 75 .start = MCF_IRQ_DSPI0, 76 .end = MCF_IRQ_DSPI0, 77 .flags = IORESOURCE_IRQ, 78 }, 79}; 80 81/* SPI controller, id = bus number */ 82static struct platform_device dspi_spi0_device = { 83 .name = "fsl-dspi", 84 .id = 0, 85 .num_resources = ARRAY_SIZE(dspi_spi0_resource), 86 .resource = dspi_spi0_resource, 87 .dev = { 88 .platform_data = &dspi_spi0_info, 89 }, 90}; 91 92static struct platform_device *stmark2_devices[] __initdata = { 93 &dspi_spi0_device, 94}; 95 96/* 97 * Note: proper pin-mux setup is mandatory for proper SPI functionality. 98 */ 99static int __init init_stmark2(void) 100{ 101 /* DSPI0, all pins as DSPI, and using CS1 */ 102 __raw_writeb(0x80, MCFGPIO_PAR_DSPIOWL); 103 __raw_writeb(0xfc, MCFGPIO_PAR_DSPIOWH); 104 105 /* Board gpio setup */ 106 __raw_writeb(0x00, MCFGPIO_PAR_BE); 107 __raw_writeb(0x00, MCFGPIO_PAR_FBCTL); 108 __raw_writeb(0x00, MCFGPIO_PAR_CS); 109 __raw_writeb(0x00, MCFGPIO_PAR_CANI2C); 110 111 platform_add_devices(stmark2_devices, ARRAY_SIZE(stmark2_devices)); 112 113 spi_register_board_info(stmark2_board_info, 114 ARRAY_SIZE(stmark2_board_info)); 115 116 return 0; 117} 118 119late_initcall(init_stmark2);