10d2fe946474196e586e492d9e9b381e184c774eaGreg Ungerer/*
20d2fe946474196e586e492d9e9b381e184c774eaGreg Ungerer * device.c  -- common ColdFire SoC device support
30d2fe946474196e586e492d9e9b381e184c774eaGreg Ungerer *
40d2fe946474196e586e492d9e9b381e184c774eaGreg Ungerer * (C) Copyright 2011, Greg Ungerer <gerg@uclinux.org>
50d2fe946474196e586e492d9e9b381e184c774eaGreg Ungerer *
60d2fe946474196e586e492d9e9b381e184c774eaGreg Ungerer * This file is subject to the terms and conditions of the GNU General Public
70d2fe946474196e586e492d9e9b381e184c774eaGreg Ungerer * License.  See the file COPYING in the main directory of this archive
80d2fe946474196e586e492d9e9b381e184c774eaGreg Ungerer * for more details.
90d2fe946474196e586e492d9e9b381e184c774eaGreg Ungerer */
100d2fe946474196e586e492d9e9b381e184c774eaGreg Ungerer
110d2fe946474196e586e492d9e9b381e184c774eaGreg Ungerer#include <linux/kernel.h>
120d2fe946474196e586e492d9e9b381e184c774eaGreg Ungerer#include <linux/init.h>
130d2fe946474196e586e492d9e9b381e184c774eaGreg Ungerer#include <linux/io.h>
14fa1fc24662d57170259948314b0759376eb75777Greg Ungerer#include <linux/spi/spi.h>
15fa1fc24662d57170259948314b0759376eb75777Greg Ungerer#include <linux/gpio.h>
160d2fe946474196e586e492d9e9b381e184c774eaGreg Ungerer#include <asm/traps.h>
170d2fe946474196e586e492d9e9b381e184c774eaGreg Ungerer#include <asm/coldfire.h>
180d2fe946474196e586e492d9e9b381e184c774eaGreg Ungerer#include <asm/mcfsim.h>
190d2fe946474196e586e492d9e9b381e184c774eaGreg Ungerer#include <asm/mcfuart.h>
20fa1fc24662d57170259948314b0759376eb75777Greg Ungerer#include <asm/mcfqspi.h>
210d2fe946474196e586e492d9e9b381e184c774eaGreg Ungerer
22b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer/*
23b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer *	All current ColdFire parts contain from 2, 3 or 4 UARTS.
24b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer */
250d2fe946474196e586e492d9e9b381e184c774eaGreg Ungererstatic struct mcf_platform_uart mcf_uart_platform_data[] = {
260d2fe946474196e586e492d9e9b381e184c774eaGreg Ungerer	{
270d2fe946474196e586e492d9e9b381e184c774eaGreg Ungerer		.mapbase	= MCFUART_BASE0,
280d2fe946474196e586e492d9e9b381e184c774eaGreg Ungerer		.irq		= MCF_IRQ_UART0,
290d2fe946474196e586e492d9e9b381e184c774eaGreg Ungerer	},
300d2fe946474196e586e492d9e9b381e184c774eaGreg Ungerer	{
310d2fe946474196e586e492d9e9b381e184c774eaGreg Ungerer		.mapbase	= MCFUART_BASE1,
320d2fe946474196e586e492d9e9b381e184c774eaGreg Ungerer		.irq		= MCF_IRQ_UART1,
330d2fe946474196e586e492d9e9b381e184c774eaGreg Ungerer	},
340d2fe946474196e586e492d9e9b381e184c774eaGreg Ungerer#ifdef MCFUART_BASE2
350d2fe946474196e586e492d9e9b381e184c774eaGreg Ungerer	{
360d2fe946474196e586e492d9e9b381e184c774eaGreg Ungerer		.mapbase	= MCFUART_BASE2,
370d2fe946474196e586e492d9e9b381e184c774eaGreg Ungerer		.irq		= MCF_IRQ_UART2,
380d2fe946474196e586e492d9e9b381e184c774eaGreg Ungerer	},
390d2fe946474196e586e492d9e9b381e184c774eaGreg Ungerer#endif
400d2fe946474196e586e492d9e9b381e184c774eaGreg Ungerer#ifdef MCFUART_BASE3
410d2fe946474196e586e492d9e9b381e184c774eaGreg Ungerer	{
420d2fe946474196e586e492d9e9b381e184c774eaGreg Ungerer		.mapbase	= MCFUART_BASE3,
430d2fe946474196e586e492d9e9b381e184c774eaGreg Ungerer		.irq		= MCF_IRQ_UART3,
440d2fe946474196e586e492d9e9b381e184c774eaGreg Ungerer	},
450d2fe946474196e586e492d9e9b381e184c774eaGreg Ungerer#endif
460d2fe946474196e586e492d9e9b381e184c774eaGreg Ungerer	{ },
470d2fe946474196e586e492d9e9b381e184c774eaGreg Ungerer};
480d2fe946474196e586e492d9e9b381e184c774eaGreg Ungerer
490d2fe946474196e586e492d9e9b381e184c774eaGreg Ungererstatic struct platform_device mcf_uart = {
500d2fe946474196e586e492d9e9b381e184c774eaGreg Ungerer	.name			= "mcfuart",
510d2fe946474196e586e492d9e9b381e184c774eaGreg Ungerer	.id			= 0,
520d2fe946474196e586e492d9e9b381e184c774eaGreg Ungerer	.dev.platform_data	= mcf_uart_platform_data,
530d2fe946474196e586e492d9e9b381e184c774eaGreg Ungerer};
540d2fe946474196e586e492d9e9b381e184c774eaGreg Ungerer
55b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer#ifdef CONFIG_FEC
56b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer/*
57b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer *	Some ColdFire cores contain the Fast Ethernet Controller (FEC)
58b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer *	block. It is Freescale's own hardware block. Some ColdFires
59b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer *	have 2 of these.
60b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer */
61b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungererstatic struct resource mcf_fec0_resources[] = {
62b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer	{
63b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer		.start		= MCFFEC_BASE0,
64b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer		.end		= MCFFEC_BASE0 + MCFFEC_SIZE0 - 1,
65b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer		.flags		= IORESOURCE_MEM,
66b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer	},
67b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer	{
68b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer		.start		= MCF_IRQ_FECRX0,
69b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer		.end		= MCF_IRQ_FECRX0,
70b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer		.flags		= IORESOURCE_IRQ,
71b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer	},
72b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer	{
73b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer		.start		= MCF_IRQ_FECTX0,
74b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer		.end		= MCF_IRQ_FECTX0,
75b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer		.flags		= IORESOURCE_IRQ,
76b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer	},
77b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer	{
78b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer		.start		= MCF_IRQ_FECENTC0,
79b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer		.end		= MCF_IRQ_FECENTC0,
80b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer		.flags		= IORESOURCE_IRQ,
81b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer	},
82b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer};
83b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer
84b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungererstatic struct platform_device mcf_fec0 = {
85b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer	.name			= "fec",
86b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer	.id			= 0,
87b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer	.num_resources		= ARRAY_SIZE(mcf_fec0_resources),
88b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer	.resource		= mcf_fec0_resources,
89b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer};
90b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer
91b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer#ifdef MCFFEC_BASE1
92b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungererstatic struct resource mcf_fec1_resources[] = {
93b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer	{
94b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer		.start		= MCFFEC_BASE1,
95b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer		.end		= MCFFEC_BASE1 + MCFFEC_SIZE1 - 1,
96b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer		.flags		= IORESOURCE_MEM,
97b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer	},
98b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer	{
99b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer		.start		= MCF_IRQ_FECRX1,
100b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer		.end		= MCF_IRQ_FECRX1,
101b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer		.flags		= IORESOURCE_IRQ,
102b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer	},
103b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer	{
104b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer		.start		= MCF_IRQ_FECTX1,
105b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer		.end		= MCF_IRQ_FECTX1,
106b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer		.flags		= IORESOURCE_IRQ,
107b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer	},
108b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer	{
109b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer		.start		= MCF_IRQ_FECENTC1,
110b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer		.end		= MCF_IRQ_FECENTC1,
111b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer		.flags		= IORESOURCE_IRQ,
112b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer	},
113b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer};
114b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer
115b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungererstatic struct platform_device mcf_fec1 = {
116b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer	.name			= "fec",
117bfdd769ac51cb68cb99902192fac81bc67cb23b0Greg Ungerer	.id			= 1,
118b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer	.num_resources		= ARRAY_SIZE(mcf_fec1_resources),
119b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer	.resource		= mcf_fec1_resources,
120b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer};
121b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer#endif /* MCFFEC_BASE1 */
122b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer#endif /* CONFIG_FEC */
123b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer
12483ca60094e5e907b8b43c60b4c29b1119604cbb8Steven King#if IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI)
125fa1fc24662d57170259948314b0759376eb75777Greg Ungerer/*
126fa1fc24662d57170259948314b0759376eb75777Greg Ungerer *	The ColdFire QSPI module is an SPI protocol hardware block used
127fa1fc24662d57170259948314b0759376eb75777Greg Ungerer *	on a number of different ColdFire CPUs.
128fa1fc24662d57170259948314b0759376eb75777Greg Ungerer */
129fa1fc24662d57170259948314b0759376eb75777Greg Ungererstatic struct resource mcf_qspi_resources[] = {
130fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	{
131fa1fc24662d57170259948314b0759376eb75777Greg Ungerer		.start		= MCFQSPI_BASE,
132fa1fc24662d57170259948314b0759376eb75777Greg Ungerer		.end		= MCFQSPI_BASE + MCFQSPI_SIZE - 1,
133fa1fc24662d57170259948314b0759376eb75777Greg Ungerer		.flags		= IORESOURCE_MEM,
134fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	},
135fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	{
136fa1fc24662d57170259948314b0759376eb75777Greg Ungerer		.start		= MCF_IRQ_QSPI,
137fa1fc24662d57170259948314b0759376eb75777Greg Ungerer		.end		= MCF_IRQ_QSPI,
138fa1fc24662d57170259948314b0759376eb75777Greg Ungerer		.flags		= IORESOURCE_IRQ,
139fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	},
140fa1fc24662d57170259948314b0759376eb75777Greg Ungerer};
141fa1fc24662d57170259948314b0759376eb75777Greg Ungerer
142fa1fc24662d57170259948314b0759376eb75777Greg Ungererstatic int mcf_cs_setup(struct mcfqspi_cs_control *cs_control)
143fa1fc24662d57170259948314b0759376eb75777Greg Ungerer{
144fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	int status;
145fa1fc24662d57170259948314b0759376eb75777Greg Ungerer
146fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	status = gpio_request(MCFQSPI_CS0, "MCFQSPI_CS0");
147fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	if (status) {
148fa1fc24662d57170259948314b0759376eb75777Greg Ungerer		pr_debug("gpio_request for MCFQSPI_CS0 failed\n");
149fa1fc24662d57170259948314b0759376eb75777Greg Ungerer		goto fail0;
150fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	}
151fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	status = gpio_direction_output(MCFQSPI_CS0, 1);
152fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	if (status) {
153fa1fc24662d57170259948314b0759376eb75777Greg Ungerer		pr_debug("gpio_direction_output for MCFQSPI_CS0 failed\n");
154fa1fc24662d57170259948314b0759376eb75777Greg Ungerer		goto fail1;
155fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	}
156fa1fc24662d57170259948314b0759376eb75777Greg Ungerer
157fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	status = gpio_request(MCFQSPI_CS1, "MCFQSPI_CS1");
158fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	if (status) {
159fa1fc24662d57170259948314b0759376eb75777Greg Ungerer		pr_debug("gpio_request for MCFQSPI_CS1 failed\n");
160fa1fc24662d57170259948314b0759376eb75777Greg Ungerer		goto fail1;
161fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	}
162fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	status = gpio_direction_output(MCFQSPI_CS1, 1);
163fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	if (status) {
164fa1fc24662d57170259948314b0759376eb75777Greg Ungerer		pr_debug("gpio_direction_output for MCFQSPI_CS1 failed\n");
165fa1fc24662d57170259948314b0759376eb75777Greg Ungerer		goto fail2;
166fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	}
167fa1fc24662d57170259948314b0759376eb75777Greg Ungerer
168fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	status = gpio_request(MCFQSPI_CS2, "MCFQSPI_CS2");
169fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	if (status) {
170fa1fc24662d57170259948314b0759376eb75777Greg Ungerer		pr_debug("gpio_request for MCFQSPI_CS2 failed\n");
171fa1fc24662d57170259948314b0759376eb75777Greg Ungerer		goto fail2;
172fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	}
173fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	status = gpio_direction_output(MCFQSPI_CS2, 1);
174fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	if (status) {
175fa1fc24662d57170259948314b0759376eb75777Greg Ungerer		pr_debug("gpio_direction_output for MCFQSPI_CS2 failed\n");
176fa1fc24662d57170259948314b0759376eb75777Greg Ungerer		goto fail3;
177fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	}
178fa1fc24662d57170259948314b0759376eb75777Greg Ungerer
179fa1fc24662d57170259948314b0759376eb75777Greg Ungerer#ifdef MCFQSPI_CS3
180fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	status = gpio_request(MCFQSPI_CS3, "MCFQSPI_CS3");
181fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	if (status) {
182fa1fc24662d57170259948314b0759376eb75777Greg Ungerer		pr_debug("gpio_request for MCFQSPI_CS3 failed\n");
183fa1fc24662d57170259948314b0759376eb75777Greg Ungerer		goto fail3;
184fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	}
185fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	status = gpio_direction_output(MCFQSPI_CS3, 1);
186fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	if (status) {
187fa1fc24662d57170259948314b0759376eb75777Greg Ungerer		pr_debug("gpio_direction_output for MCFQSPI_CS3 failed\n");
188fa1fc24662d57170259948314b0759376eb75777Greg Ungerer		gpio_free(MCFQSPI_CS3);
189fa1fc24662d57170259948314b0759376eb75777Greg Ungerer		goto fail3;
190fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	}
191fa1fc24662d57170259948314b0759376eb75777Greg Ungerer#endif
192fa1fc24662d57170259948314b0759376eb75777Greg Ungerer
193fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	return 0;
194fa1fc24662d57170259948314b0759376eb75777Greg Ungerer
195fa1fc24662d57170259948314b0759376eb75777Greg Ungererfail3:
196fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	gpio_free(MCFQSPI_CS2);
197fa1fc24662d57170259948314b0759376eb75777Greg Ungererfail2:
198fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	gpio_free(MCFQSPI_CS1);
199fa1fc24662d57170259948314b0759376eb75777Greg Ungererfail1:
200fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	gpio_free(MCFQSPI_CS0);
201fa1fc24662d57170259948314b0759376eb75777Greg Ungererfail0:
202fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	return status;
203fa1fc24662d57170259948314b0759376eb75777Greg Ungerer}
204fa1fc24662d57170259948314b0759376eb75777Greg Ungerer
205fa1fc24662d57170259948314b0759376eb75777Greg Ungererstatic void mcf_cs_teardown(struct mcfqspi_cs_control *cs_control)
206fa1fc24662d57170259948314b0759376eb75777Greg Ungerer{
207fa1fc24662d57170259948314b0759376eb75777Greg Ungerer#ifdef MCFQSPI_CS3
208fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	gpio_free(MCFQSPI_CS3);
209fa1fc24662d57170259948314b0759376eb75777Greg Ungerer#endif
210fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	gpio_free(MCFQSPI_CS2);
211fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	gpio_free(MCFQSPI_CS1);
212fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	gpio_free(MCFQSPI_CS0);
213fa1fc24662d57170259948314b0759376eb75777Greg Ungerer}
214fa1fc24662d57170259948314b0759376eb75777Greg Ungerer
215fa1fc24662d57170259948314b0759376eb75777Greg Ungererstatic void mcf_cs_select(struct mcfqspi_cs_control *cs_control,
216fa1fc24662d57170259948314b0759376eb75777Greg Ungerer			  u8 chip_select, bool cs_high)
217fa1fc24662d57170259948314b0759376eb75777Greg Ungerer{
218fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	switch (chip_select) {
219fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	case 0:
220fa1fc24662d57170259948314b0759376eb75777Greg Ungerer		gpio_set_value(MCFQSPI_CS0, cs_high);
221fa1fc24662d57170259948314b0759376eb75777Greg Ungerer		break;
222fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	case 1:
223fa1fc24662d57170259948314b0759376eb75777Greg Ungerer		gpio_set_value(MCFQSPI_CS1, cs_high);
224fa1fc24662d57170259948314b0759376eb75777Greg Ungerer		break;
225fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	case 2:
226fa1fc24662d57170259948314b0759376eb75777Greg Ungerer		gpio_set_value(MCFQSPI_CS2, cs_high);
227fa1fc24662d57170259948314b0759376eb75777Greg Ungerer		break;
228fa1fc24662d57170259948314b0759376eb75777Greg Ungerer#ifdef MCFQSPI_CS3
229fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	case 3:
230fa1fc24662d57170259948314b0759376eb75777Greg Ungerer		gpio_set_value(MCFQSPI_CS3, cs_high);
231fa1fc24662d57170259948314b0759376eb75777Greg Ungerer		break;
232fa1fc24662d57170259948314b0759376eb75777Greg Ungerer#endif
233fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	}
234fa1fc24662d57170259948314b0759376eb75777Greg Ungerer}
235fa1fc24662d57170259948314b0759376eb75777Greg Ungerer
236fa1fc24662d57170259948314b0759376eb75777Greg Ungererstatic void mcf_cs_deselect(struct mcfqspi_cs_control *cs_control,
237fa1fc24662d57170259948314b0759376eb75777Greg Ungerer			    u8 chip_select, bool cs_high)
238fa1fc24662d57170259948314b0759376eb75777Greg Ungerer{
239fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	switch (chip_select) {
240fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	case 0:
241fa1fc24662d57170259948314b0759376eb75777Greg Ungerer		gpio_set_value(MCFQSPI_CS0, !cs_high);
242fa1fc24662d57170259948314b0759376eb75777Greg Ungerer		break;
243fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	case 1:
244fa1fc24662d57170259948314b0759376eb75777Greg Ungerer		gpio_set_value(MCFQSPI_CS1, !cs_high);
245fa1fc24662d57170259948314b0759376eb75777Greg Ungerer		break;
246fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	case 2:
247fa1fc24662d57170259948314b0759376eb75777Greg Ungerer		gpio_set_value(MCFQSPI_CS2, !cs_high);
248fa1fc24662d57170259948314b0759376eb75777Greg Ungerer		break;
249fa1fc24662d57170259948314b0759376eb75777Greg Ungerer#ifdef MCFQSPI_CS3
250fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	case 3:
251fa1fc24662d57170259948314b0759376eb75777Greg Ungerer		gpio_set_value(MCFQSPI_CS3, !cs_high);
252fa1fc24662d57170259948314b0759376eb75777Greg Ungerer		break;
253fa1fc24662d57170259948314b0759376eb75777Greg Ungerer#endif
254fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	}
255fa1fc24662d57170259948314b0759376eb75777Greg Ungerer}
256fa1fc24662d57170259948314b0759376eb75777Greg Ungerer
257fa1fc24662d57170259948314b0759376eb75777Greg Ungererstatic struct mcfqspi_cs_control mcf_cs_control = {
258fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	.setup			= mcf_cs_setup,
259fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	.teardown		= mcf_cs_teardown,
260fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	.select			= mcf_cs_select,
261fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	.deselect		= mcf_cs_deselect,
262fa1fc24662d57170259948314b0759376eb75777Greg Ungerer};
263fa1fc24662d57170259948314b0759376eb75777Greg Ungerer
264fa1fc24662d57170259948314b0759376eb75777Greg Ungererstatic struct mcfqspi_platform_data mcf_qspi_data = {
265fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	.bus_num		= 0,
266fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	.num_chipselect		= 4,
267fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	.cs_control		= &mcf_cs_control,
268fa1fc24662d57170259948314b0759376eb75777Greg Ungerer};
269fa1fc24662d57170259948314b0759376eb75777Greg Ungerer
270fa1fc24662d57170259948314b0759376eb75777Greg Ungererstatic struct platform_device mcf_qspi = {
271fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	.name			= "mcfqspi",
272fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	.id			= 0,
273fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	.num_resources		= ARRAY_SIZE(mcf_qspi_resources),
274fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	.resource		= mcf_qspi_resources,
275fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	.dev.platform_data	= &mcf_qspi_data,
276fa1fc24662d57170259948314b0759376eb75777Greg Ungerer};
27783ca60094e5e907b8b43c60b4c29b1119604cbb8Steven King#endif /* IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI) */
278fa1fc24662d57170259948314b0759376eb75777Greg Ungerer
2790d2fe946474196e586e492d9e9b381e184c774eaGreg Ungererstatic struct platform_device *mcf_devices[] __initdata = {
2800d2fe946474196e586e492d9e9b381e184c774eaGreg Ungerer	&mcf_uart,
281b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer#ifdef CONFIG_FEC
282b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer	&mcf_fec0,
283b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer#ifdef MCFFEC_BASE1
284b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer	&mcf_fec1,
285b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer#endif
286b7ce7f0d0efc1a95154fa6872d5d7c970d281c71Greg Ungerer#endif
28783ca60094e5e907b8b43c60b4c29b1119604cbb8Steven King#if IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI)
288fa1fc24662d57170259948314b0759376eb75777Greg Ungerer	&mcf_qspi,
289fa1fc24662d57170259948314b0759376eb75777Greg Ungerer#endif
2900d2fe946474196e586e492d9e9b381e184c774eaGreg Ungerer};
2910d2fe946474196e586e492d9e9b381e184c774eaGreg Ungerer
29255148f6f886a1b77dba1a5c3169208606827b9dbGreg Ungerer/*
29355148f6f886a1b77dba1a5c3169208606827b9dbGreg Ungerer *	Some ColdFire UARTs let you set the IRQ line to use.
29455148f6f886a1b77dba1a5c3169208606827b9dbGreg Ungerer */
29555148f6f886a1b77dba1a5c3169208606827b9dbGreg Ungererstatic void __init mcf_uart_set_irq(void)
29655148f6f886a1b77dba1a5c3169208606827b9dbGreg Ungerer{
29755148f6f886a1b77dba1a5c3169208606827b9dbGreg Ungerer#ifdef MCFUART_UIVR
29855148f6f886a1b77dba1a5c3169208606827b9dbGreg Ungerer	/* UART0 interrupt setup */
29955148f6f886a1b77dba1a5c3169208606827b9dbGreg Ungerer	writeb(MCFSIM_ICR_LEVEL6 | MCFSIM_ICR_PRI1, MCF_MBAR + MCFSIM_UART1ICR);
30055148f6f886a1b77dba1a5c3169208606827b9dbGreg Ungerer	writeb(MCF_IRQ_UART0, MCFUART_BASE0 + MCFUART_UIVR);
30155148f6f886a1b77dba1a5c3169208606827b9dbGreg Ungerer	mcf_mapirq2imr(MCF_IRQ_UART0, MCFINTC_UART0);
30255148f6f886a1b77dba1a5c3169208606827b9dbGreg Ungerer
30355148f6f886a1b77dba1a5c3169208606827b9dbGreg Ungerer	/* UART1 interrupt setup */
30455148f6f886a1b77dba1a5c3169208606827b9dbGreg Ungerer	writeb(MCFSIM_ICR_LEVEL6 | MCFSIM_ICR_PRI2, MCF_MBAR + MCFSIM_UART2ICR);
30555148f6f886a1b77dba1a5c3169208606827b9dbGreg Ungerer	writeb(MCF_IRQ_UART1, MCFUART_BASE1 + MCFUART_UIVR);
30655148f6f886a1b77dba1a5c3169208606827b9dbGreg Ungerer	mcf_mapirq2imr(MCF_IRQ_UART1, MCFINTC_UART1);
30755148f6f886a1b77dba1a5c3169208606827b9dbGreg Ungerer#endif
30855148f6f886a1b77dba1a5c3169208606827b9dbGreg Ungerer}
30955148f6f886a1b77dba1a5c3169208606827b9dbGreg Ungerer
3100d2fe946474196e586e492d9e9b381e184c774eaGreg Ungererstatic int __init mcf_init_devices(void)
3110d2fe946474196e586e492d9e9b381e184c774eaGreg Ungerer{
31255148f6f886a1b77dba1a5c3169208606827b9dbGreg Ungerer	mcf_uart_set_irq();
3130d2fe946474196e586e492d9e9b381e184c774eaGreg Ungerer	platform_add_devices(mcf_devices, ARRAY_SIZE(mcf_devices));
3140d2fe946474196e586e492d9e9b381e184c774eaGreg Ungerer	return 0;
3150d2fe946474196e586e492d9e9b381e184c774eaGreg Ungerer}
3160d2fe946474196e586e492d9e9b381e184c774eaGreg Ungerer
3170d2fe946474196e586e492d9e9b381e184c774eaGreg Ungererarch_initcall(mcf_init_devices);
3180d2fe946474196e586e492d9e9b381e184c774eaGreg Ungerer
319