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