xref: /linux/arch/m68k/coldfire/stmark2.c (revision b7019ac550eb3916f34d79db583e9b7ea2524afa)
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  */
21 static 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 
37 static 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 
44 static 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) */
56 static 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 
63 static 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 */
82 static 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 
92 static 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  */
99 static 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 
119 late_initcall(init_stmark2);
120