Path: blob/master/arch/m68k/platform/520x/config.c
10819 views
/***************************************************************************/12/*3* linux/arch/m68knommu/platform/520x/config.c4*5* Copyright (C) 2005, Freescale (www.freescale.com)6* Copyright (C) 2005, Intec Automation ([email protected])7* Copyright (C) 1999-2007, Greg Ungerer ([email protected])8* Copyright (C) 2001-2003, SnapGear Inc. (www.snapgear.com)9*/1011/***************************************************************************/1213#include <linux/kernel.h>14#include <linux/param.h>15#include <linux/init.h>16#include <linux/io.h>17#include <linux/spi/spi.h>18#include <linux/gpio.h>19#include <asm/machdep.h>20#include <asm/coldfire.h>21#include <asm/mcfsim.h>22#include <asm/mcfuart.h>23#include <asm/mcfqspi.h>2425/***************************************************************************/2627static struct mcf_platform_uart m520x_uart_platform[] = {28{29.mapbase = MCFUART_BASE1,30.irq = MCFINT_VECBASE + MCFINT_UART0,31},32{33.mapbase = MCFUART_BASE2,34.irq = MCFINT_VECBASE + MCFINT_UART1,35},36{37.mapbase = MCFUART_BASE3,38.irq = MCFINT_VECBASE + MCFINT_UART2,39},40{ },41};4243static struct platform_device m520x_uart = {44.name = "mcfuart",45.id = 0,46.dev.platform_data = m520x_uart_platform,47};4849static struct resource m520x_fec_resources[] = {50{51.start = MCFFEC_BASE,52.end = MCFFEC_BASE + MCFFEC_SIZE - 1,53.flags = IORESOURCE_MEM,54},55{56.start = 64 + 36,57.end = 64 + 36,58.flags = IORESOURCE_IRQ,59},60{61.start = 64 + 40,62.end = 64 + 40,63.flags = IORESOURCE_IRQ,64},65{66.start = 64 + 42,67.end = 64 + 42,68.flags = IORESOURCE_IRQ,69},70};7172static struct platform_device m520x_fec = {73.name = "fec",74.id = 0,75.num_resources = ARRAY_SIZE(m520x_fec_resources),76.resource = m520x_fec_resources,77};7879#if defined(CONFIG_SPI_COLDFIRE_QSPI) || defined(CONFIG_SPI_COLDFIRE_QSPI_MODULE)80static struct resource m520x_qspi_resources[] = {81{82.start = MCFQSPI_IOBASE,83.end = MCFQSPI_IOBASE + MCFQSPI_IOSIZE - 1,84.flags = IORESOURCE_MEM,85},86{87.start = MCFINT_VECBASE + MCFINT_QSPI,88.end = MCFINT_VECBASE + MCFINT_QSPI,89.flags = IORESOURCE_IRQ,90},91};9293#define MCFQSPI_CS0 6294#define MCFQSPI_CS1 6395#define MCFQSPI_CS2 449697static int m520x_cs_setup(struct mcfqspi_cs_control *cs_control)98{99int status;100101status = gpio_request(MCFQSPI_CS0, "MCFQSPI_CS0");102if (status) {103pr_debug("gpio_request for MCFQSPI_CS0 failed\n");104goto fail0;105}106status = gpio_direction_output(MCFQSPI_CS0, 1);107if (status) {108pr_debug("gpio_direction_output for MCFQSPI_CS0 failed\n");109goto fail1;110}111112status = gpio_request(MCFQSPI_CS1, "MCFQSPI_CS1");113if (status) {114pr_debug("gpio_request for MCFQSPI_CS1 failed\n");115goto fail1;116}117status = gpio_direction_output(MCFQSPI_CS1, 1);118if (status) {119pr_debug("gpio_direction_output for MCFQSPI_CS1 failed\n");120goto fail2;121}122123status = gpio_request(MCFQSPI_CS2, "MCFQSPI_CS2");124if (status) {125pr_debug("gpio_request for MCFQSPI_CS2 failed\n");126goto fail2;127}128status = gpio_direction_output(MCFQSPI_CS2, 1);129if (status) {130pr_debug("gpio_direction_output for MCFQSPI_CS2 failed\n");131goto fail3;132}133134return 0;135136fail3:137gpio_free(MCFQSPI_CS2);138fail2:139gpio_free(MCFQSPI_CS1);140fail1:141gpio_free(MCFQSPI_CS0);142fail0:143return status;144}145146static void m520x_cs_teardown(struct mcfqspi_cs_control *cs_control)147{148gpio_free(MCFQSPI_CS2);149gpio_free(MCFQSPI_CS1);150gpio_free(MCFQSPI_CS0);151}152153static void m520x_cs_select(struct mcfqspi_cs_control *cs_control,154u8 chip_select, bool cs_high)155{156switch (chip_select) {157case 0:158gpio_set_value(MCFQSPI_CS0, cs_high);159break;160case 1:161gpio_set_value(MCFQSPI_CS1, cs_high);162break;163case 2:164gpio_set_value(MCFQSPI_CS2, cs_high);165break;166}167}168169static void m520x_cs_deselect(struct mcfqspi_cs_control *cs_control,170u8 chip_select, bool cs_high)171{172switch (chip_select) {173case 0:174gpio_set_value(MCFQSPI_CS0, !cs_high);175break;176case 1:177gpio_set_value(MCFQSPI_CS1, !cs_high);178break;179case 2:180gpio_set_value(MCFQSPI_CS2, !cs_high);181break;182}183}184185static struct mcfqspi_cs_control m520x_cs_control = {186.setup = m520x_cs_setup,187.teardown = m520x_cs_teardown,188.select = m520x_cs_select,189.deselect = m520x_cs_deselect,190};191192static struct mcfqspi_platform_data m520x_qspi_data = {193.bus_num = 0,194.num_chipselect = 3,195.cs_control = &m520x_cs_control,196};197198static struct platform_device m520x_qspi = {199.name = "mcfqspi",200.id = 0,201.num_resources = ARRAY_SIZE(m520x_qspi_resources),202.resource = m520x_qspi_resources,203.dev.platform_data = &m520x_qspi_data,204};205206static void __init m520x_qspi_init(void)207{208u16 par;209/* setup Port QS for QSPI with gpio CS control */210writeb(0x3f, MCF_GPIO_PAR_QSPI);211/* make U1CTS and U2RTS gpio for cs_control */212par = readw(MCF_GPIO_PAR_UART);213par &= 0x00ff;214writew(par, MCF_GPIO_PAR_UART);215}216#endif /* defined(CONFIG_SPI_COLDFIRE_QSPI) || defined(CONFIG_SPI_COLDFIRE_QSPI_MODULE) */217218219static struct platform_device *m520x_devices[] __initdata = {220&m520x_uart,221&m520x_fec,222#if defined(CONFIG_SPI_COLDFIRE_QSPI) || defined(CONFIG_SPI_COLDFIRE_QSPI_MODULE)223&m520x_qspi,224#endif225};226227/***************************************************************************/228229static void __init m520x_uart_init_line(int line, int irq)230{231u16 par;232u8 par2;233234switch (line) {235case 0:236par = readw(MCF_GPIO_PAR_UART);237par |= MCF_GPIO_PAR_UART_PAR_UTXD0 |238MCF_GPIO_PAR_UART_PAR_URXD0;239writew(par, MCF_GPIO_PAR_UART);240break;241case 1:242par = readw(MCF_GPIO_PAR_UART);243par |= MCF_GPIO_PAR_UART_PAR_UTXD1 |244MCF_GPIO_PAR_UART_PAR_URXD1;245writew(par, MCF_GPIO_PAR_UART);246break;247case 2:248par2 = readb(MCF_GPIO_PAR_FECI2C);249par2 &= ~0x0F;250par2 |= MCF_GPIO_PAR_FECI2C_PAR_SCL_UTXD2 |251MCF_GPIO_PAR_FECI2C_PAR_SDA_URXD2;252writeb(par2, MCF_GPIO_PAR_FECI2C);253break;254}255}256257static void __init m520x_uarts_init(void)258{259const int nrlines = ARRAY_SIZE(m520x_uart_platform);260int line;261262for (line = 0; (line < nrlines); line++)263m520x_uart_init_line(line, m520x_uart_platform[line].irq);264}265266/***************************************************************************/267268static void __init m520x_fec_init(void)269{270u8 v;271272/* Set multi-function pins to ethernet mode */273v = readb(MCF_GPIO_PAR_FEC);274writeb(v | 0xf0, MCF_GPIO_PAR_FEC);275276v = readb(MCF_GPIO_PAR_FECI2C);277writeb(v | 0x0f, MCF_GPIO_PAR_FECI2C);278}279280/***************************************************************************/281282static void m520x_cpu_reset(void)283{284local_irq_disable();285__raw_writeb(MCF_RCR_SWRESET, MCF_RCR);286}287288/***************************************************************************/289290void __init config_BSP(char *commandp, int size)291{292mach_reset = m520x_cpu_reset;293m520x_uarts_init();294m520x_fec_init();295#if defined(CONFIG_SPI_COLDFIRE_QSPI) || defined(CONFIG_SPI_COLDFIRE_QSPI_MODULE)296m520x_qspi_init();297#endif298}299300/***************************************************************************/301302static int __init init_BSP(void)303{304platform_add_devices(m520x_devices, ARRAY_SIZE(m520x_devices));305return 0;306}307308arch_initcall(init_BSP);309310/***************************************************************************/311312313