Path: blob/master/arch/m68k/platform/5249/config.c
10819 views
/***************************************************************************/12/*3* linux/arch/m68knommu/platform/5249/config.c4*5* Copyright (C) 2002, Greg Ungerer ([email protected])6*/78/***************************************************************************/910#include <linux/kernel.h>11#include <linux/param.h>12#include <linux/init.h>13#include <linux/io.h>14#include <linux/spi/spi.h>15#include <linux/gpio.h>16#include <asm/machdep.h>17#include <asm/coldfire.h>18#include <asm/mcfsim.h>19#include <asm/mcfuart.h>20#include <asm/mcfqspi.h>2122/***************************************************************************/2324static struct mcf_platform_uart m5249_uart_platform[] = {25{26.mapbase = MCF_MBAR + MCFUART_BASE1,27.irq = 73,28},29{30.mapbase = MCF_MBAR + MCFUART_BASE2,31.irq = 74,32},33{ },34};3536static struct platform_device m5249_uart = {37.name = "mcfuart",38.id = 0,39.dev.platform_data = m5249_uart_platform,40};4142#ifdef CONFIG_M5249C34344static struct resource m5249_smc91x_resources[] = {45{46.start = 0xe0000300,47.end = 0xe0000300 + 0x100,48.flags = IORESOURCE_MEM,49},50{51.start = MCFINTC2_GPIOIRQ6,52.end = MCFINTC2_GPIOIRQ6,53.flags = IORESOURCE_IRQ,54},55};5657static struct platform_device m5249_smc91x = {58.name = "smc91x",59.id = 0,60.num_resources = ARRAY_SIZE(m5249_smc91x_resources),61.resource = m5249_smc91x_resources,62};6364#endif /* CONFIG_M5249C3 */6566#if defined(CONFIG_SPI_COLDFIRE_QSPI) || defined(CONFIG_SPI_COLDFIRE_QSPI_MODULE)67static struct resource m5249_qspi_resources[] = {68{69.start = MCFQSPI_IOBASE,70.end = MCFQSPI_IOBASE + MCFQSPI_IOSIZE - 1,71.flags = IORESOURCE_MEM,72},73{74.start = MCF_IRQ_QSPI,75.end = MCF_IRQ_QSPI,76.flags = IORESOURCE_IRQ,77},78};7980#define MCFQSPI_CS0 2981#define MCFQSPI_CS1 2482#define MCFQSPI_CS2 2183#define MCFQSPI_CS3 228485static int m5249_cs_setup(struct mcfqspi_cs_control *cs_control)86{87int status;8889status = gpio_request(MCFQSPI_CS0, "MCFQSPI_CS0");90if (status) {91pr_debug("gpio_request for MCFQSPI_CS0 failed\n");92goto fail0;93}94status = gpio_direction_output(MCFQSPI_CS0, 1);95if (status) {96pr_debug("gpio_direction_output for MCFQSPI_CS0 failed\n");97goto fail1;98}99100status = gpio_request(MCFQSPI_CS1, "MCFQSPI_CS1");101if (status) {102pr_debug("gpio_request for MCFQSPI_CS1 failed\n");103goto fail1;104}105status = gpio_direction_output(MCFQSPI_CS1, 1);106if (status) {107pr_debug("gpio_direction_output for MCFQSPI_CS1 failed\n");108goto fail2;109}110111status = gpio_request(MCFQSPI_CS2, "MCFQSPI_CS2");112if (status) {113pr_debug("gpio_request for MCFQSPI_CS2 failed\n");114goto fail2;115}116status = gpio_direction_output(MCFQSPI_CS2, 1);117if (status) {118pr_debug("gpio_direction_output for MCFQSPI_CS2 failed\n");119goto fail3;120}121122status = gpio_request(MCFQSPI_CS3, "MCFQSPI_CS3");123if (status) {124pr_debug("gpio_request for MCFQSPI_CS3 failed\n");125goto fail3;126}127status = gpio_direction_output(MCFQSPI_CS3, 1);128if (status) {129pr_debug("gpio_direction_output for MCFQSPI_CS3 failed\n");130goto fail4;131}132133return 0;134135fail4:136gpio_free(MCFQSPI_CS3);137fail3:138gpio_free(MCFQSPI_CS2);139fail2:140gpio_free(MCFQSPI_CS1);141fail1:142gpio_free(MCFQSPI_CS0);143fail0:144return status;145}146147static void m5249_cs_teardown(struct mcfqspi_cs_control *cs_control)148{149gpio_free(MCFQSPI_CS3);150gpio_free(MCFQSPI_CS2);151gpio_free(MCFQSPI_CS1);152gpio_free(MCFQSPI_CS0);153}154155static void m5249_cs_select(struct mcfqspi_cs_control *cs_control,156u8 chip_select, bool cs_high)157{158switch (chip_select) {159case 0:160gpio_set_value(MCFQSPI_CS0, cs_high);161break;162case 1:163gpio_set_value(MCFQSPI_CS1, cs_high);164break;165case 2:166gpio_set_value(MCFQSPI_CS2, cs_high);167break;168case 3:169gpio_set_value(MCFQSPI_CS3, cs_high);170break;171}172}173174static void m5249_cs_deselect(struct mcfqspi_cs_control *cs_control,175u8 chip_select, bool cs_high)176{177switch (chip_select) {178case 0:179gpio_set_value(MCFQSPI_CS0, !cs_high);180break;181case 1:182gpio_set_value(MCFQSPI_CS1, !cs_high);183break;184case 2:185gpio_set_value(MCFQSPI_CS2, !cs_high);186break;187case 3:188gpio_set_value(MCFQSPI_CS3, !cs_high);189break;190}191}192193static struct mcfqspi_cs_control m5249_cs_control = {194.setup = m5249_cs_setup,195.teardown = m5249_cs_teardown,196.select = m5249_cs_select,197.deselect = m5249_cs_deselect,198};199200static struct mcfqspi_platform_data m5249_qspi_data = {201.bus_num = 0,202.num_chipselect = 4,203.cs_control = &m5249_cs_control,204};205206static struct platform_device m5249_qspi = {207.name = "mcfqspi",208.id = 0,209.num_resources = ARRAY_SIZE(m5249_qspi_resources),210.resource = m5249_qspi_resources,211.dev.platform_data = &m5249_qspi_data,212};213214static void __init m5249_qspi_init(void)215{216/* QSPI irq setup */217writeb(MCFSIM_ICR_AUTOVEC | MCFSIM_ICR_LEVEL4 | MCFSIM_ICR_PRI0,218MCF_MBAR + MCFSIM_QSPIICR);219mcf_mapirq2imr(MCF_IRQ_QSPI, MCFINTC_QSPI);220}221#endif /* defined(CONFIG_SPI_COLDFIRE_QSPI) || defined(CONFIG_SPI_COLDFIRE_QSPI_MODULE) */222223224static struct platform_device *m5249_devices[] __initdata = {225&m5249_uart,226#ifdef CONFIG_M5249C3227&m5249_smc91x,228#endif229#if defined(CONFIG_SPI_COLDFIRE_QSPI) || defined(CONFIG_SPI_COLDFIRE_QSPI_MODULE)230&m5249_qspi,231#endif232};233234/***************************************************************************/235236static void __init m5249_uart_init_line(int line, int irq)237{238if (line == 0) {239writeb(MCFSIM_ICR_LEVEL6 | MCFSIM_ICR_PRI1, MCF_MBAR + MCFSIM_UART1ICR);240writeb(irq, MCF_MBAR + MCFUART_BASE1 + MCFUART_UIVR);241mcf_mapirq2imr(irq, MCFINTC_UART0);242} else if (line == 1) {243writeb(MCFSIM_ICR_LEVEL6 | MCFSIM_ICR_PRI2, MCF_MBAR + MCFSIM_UART2ICR);244writeb(irq, MCF_MBAR + MCFUART_BASE2 + MCFUART_UIVR);245mcf_mapirq2imr(irq, MCFINTC_UART1);246}247}248249static void __init m5249_uarts_init(void)250{251const int nrlines = ARRAY_SIZE(m5249_uart_platform);252int line;253254for (line = 0; (line < nrlines); line++)255m5249_uart_init_line(line, m5249_uart_platform[line].irq);256}257258/***************************************************************************/259260#ifdef CONFIG_M5249C3261262static void __init m5249_smc91x_init(void)263{264u32 gpio;265266/* Set the GPIO line as interrupt source for smc91x device */267gpio = readl(MCF_MBAR2 + MCFSIM2_GPIOINTENABLE);268writel(gpio | 0x40, MCF_MBAR2 + MCFSIM2_GPIOINTENABLE);269270gpio = readl(MCF_MBAR2 + MCFSIM2_INTLEVEL5);271writel(gpio | 0x04000000, MCF_MBAR2 + MCFSIM2_INTLEVEL5);272}273274#endif /* CONFIG_M5249C3 */275276/***************************************************************************/277278static void __init m5249_timers_init(void)279{280/* Timer1 is always used as system timer */281writeb(MCFSIM_ICR_AUTOVEC | MCFSIM_ICR_LEVEL6 | MCFSIM_ICR_PRI3,282MCF_MBAR + MCFSIM_TIMER1ICR);283mcf_mapirq2imr(MCF_IRQ_TIMER, MCFINTC_TIMER1);284285#ifdef CONFIG_HIGHPROFILE286/* Timer2 is to be used as a high speed profile timer */287writeb(MCFSIM_ICR_AUTOVEC | MCFSIM_ICR_LEVEL7 | MCFSIM_ICR_PRI3,288MCF_MBAR + MCFSIM_TIMER2ICR);289mcf_mapirq2imr(MCF_IRQ_PROFILER, MCFINTC_TIMER2);290#endif291}292293/***************************************************************************/294295void m5249_cpu_reset(void)296{297local_irq_disable();298/* Set watchdog to soft reset, and enabled */299__raw_writeb(0xc0, MCF_MBAR + MCFSIM_SYPCR);300for (;;)301/* wait for watchdog to timeout */;302}303304/***************************************************************************/305306void __init config_BSP(char *commandp, int size)307{308mach_reset = m5249_cpu_reset;309m5249_timers_init();310m5249_uarts_init();311#ifdef CONFIG_M5249C3312m5249_smc91x_init();313#endif314#if defined(CONFIG_SPI_COLDFIRE_QSPI) || defined(CONFIG_SPI_COLDFIRE_QSPI_MODULE)315m5249_qspi_init();316#endif317}318319/***************************************************************************/320321static int __init init_BSP(void)322{323platform_add_devices(m5249_devices, ARRAY_SIZE(m5249_devices));324return 0;325}326327arch_initcall(init_BSP);328329/***************************************************************************/330331332