Path: blob/master/arch/m68k/platform/527x/config.c
10819 views
/***************************************************************************/12/*3* linux/arch/m68knommu/platform/527x/config.c4*5* Sub-architcture dependent initialization code for the Freescale6* 5270/5271 CPUs.7*8* Copyright (C) 1999-2004, Greg Ungerer ([email protected])9* Copyright (C) 2001-2004, SnapGear Inc. (www.snapgear.com)10*/1112/***************************************************************************/1314#include <linux/kernel.h>15#include <linux/param.h>16#include <linux/init.h>17#include <linux/io.h>18#include <linux/spi/spi.h>19#include <linux/gpio.h>20#include <asm/machdep.h>21#include <asm/coldfire.h>22#include <asm/mcfsim.h>23#include <asm/mcfuart.h>24#include <asm/mcfqspi.h>2526/***************************************************************************/2728static struct mcf_platform_uart m527x_uart_platform[] = {29{30.mapbase = MCFUART_BASE1,31.irq = MCFINT_VECBASE + MCFINT_UART0,32},33{34.mapbase = MCFUART_BASE2,35.irq = MCFINT_VECBASE + MCFINT_UART1,36},37{38.mapbase = MCFUART_BASE3,39.irq = MCFINT_VECBASE + MCFINT_UART2,40},41{ },42};4344static struct platform_device m527x_uart = {45.name = "mcfuart",46.id = 0,47.dev.platform_data = m527x_uart_platform,48};4950static struct resource m527x_fec0_resources[] = {51{52.start = MCFFEC_BASE0,53.end = MCFFEC_BASE0 + MCFFEC_SIZE0 - 1,54.flags = IORESOURCE_MEM,55},56{57.start = 64 + 23,58.end = 64 + 23,59.flags = IORESOURCE_IRQ,60},61{62.start = 64 + 27,63.end = 64 + 27,64.flags = IORESOURCE_IRQ,65},66{67.start = 64 + 29,68.end = 64 + 29,69.flags = IORESOURCE_IRQ,70},71};7273static struct resource m527x_fec1_resources[] = {74{75.start = MCFFEC_BASE1,76.end = MCFFEC_BASE1 + MCFFEC_SIZE1 - 1,77.flags = IORESOURCE_MEM,78},79{80.start = 128 + 23,81.end = 128 + 23,82.flags = IORESOURCE_IRQ,83},84{85.start = 128 + 27,86.end = 128 + 27,87.flags = IORESOURCE_IRQ,88},89{90.start = 128 + 29,91.end = 128 + 29,92.flags = IORESOURCE_IRQ,93},94};9596static struct platform_device m527x_fec[] = {97{98.name = "fec",99.id = 0,100.num_resources = ARRAY_SIZE(m527x_fec0_resources),101.resource = m527x_fec0_resources,102},103{104.name = "fec",105.id = 1,106.num_resources = ARRAY_SIZE(m527x_fec1_resources),107.resource = m527x_fec1_resources,108},109};110111#if defined(CONFIG_SPI_COLDFIRE_QSPI) || defined(CONFIG_SPI_COLDFIRE_QSPI_MODULE)112static struct resource m527x_qspi_resources[] = {113{114.start = MCFQSPI_IOBASE,115.end = MCFQSPI_IOBASE + MCFQSPI_IOSIZE - 1,116.flags = IORESOURCE_MEM,117},118{119.start = MCFINT_VECBASE + MCFINT_QSPI,120.end = MCFINT_VECBASE + MCFINT_QSPI,121.flags = IORESOURCE_IRQ,122},123};124125#if defined(CONFIG_M5271)126#define MCFQSPI_CS0 91127#define MCFQSPI_CS1 92128#define MCFQSPI_CS2 99129#define MCFQSPI_CS3 103130#elif defined(CONFIG_M5275)131#define MCFQSPI_CS0 59132#define MCFQSPI_CS1 60133#define MCFQSPI_CS2 61134#define MCFQSPI_CS3 62135#endif136137static int m527x_cs_setup(struct mcfqspi_cs_control *cs_control)138{139int status;140141status = gpio_request(MCFQSPI_CS0, "MCFQSPI_CS0");142if (status) {143pr_debug("gpio_request for MCFQSPI_CS0 failed\n");144goto fail0;145}146status = gpio_direction_output(MCFQSPI_CS0, 1);147if (status) {148pr_debug("gpio_direction_output for MCFQSPI_CS0 failed\n");149goto fail1;150}151152status = gpio_request(MCFQSPI_CS1, "MCFQSPI_CS1");153if (status) {154pr_debug("gpio_request for MCFQSPI_CS1 failed\n");155goto fail1;156}157status = gpio_direction_output(MCFQSPI_CS1, 1);158if (status) {159pr_debug("gpio_direction_output for MCFQSPI_CS1 failed\n");160goto fail2;161}162163status = gpio_request(MCFQSPI_CS2, "MCFQSPI_CS2");164if (status) {165pr_debug("gpio_request for MCFQSPI_CS2 failed\n");166goto fail2;167}168status = gpio_direction_output(MCFQSPI_CS2, 1);169if (status) {170pr_debug("gpio_direction_output for MCFQSPI_CS2 failed\n");171goto fail3;172}173174status = gpio_request(MCFQSPI_CS3, "MCFQSPI_CS3");175if (status) {176pr_debug("gpio_request for MCFQSPI_CS3 failed\n");177goto fail3;178}179status = gpio_direction_output(MCFQSPI_CS3, 1);180if (status) {181pr_debug("gpio_direction_output for MCFQSPI_CS3 failed\n");182goto fail4;183}184185return 0;186187fail4:188gpio_free(MCFQSPI_CS3);189fail3:190gpio_free(MCFQSPI_CS2);191fail2:192gpio_free(MCFQSPI_CS1);193fail1:194gpio_free(MCFQSPI_CS0);195fail0:196return status;197}198199static void m527x_cs_teardown(struct mcfqspi_cs_control *cs_control)200{201gpio_free(MCFQSPI_CS3);202gpio_free(MCFQSPI_CS2);203gpio_free(MCFQSPI_CS1);204gpio_free(MCFQSPI_CS0);205}206207static void m527x_cs_select(struct mcfqspi_cs_control *cs_control,208u8 chip_select, bool cs_high)209{210switch (chip_select) {211case 0:212gpio_set_value(MCFQSPI_CS0, cs_high);213break;214case 1:215gpio_set_value(MCFQSPI_CS1, cs_high);216break;217case 2:218gpio_set_value(MCFQSPI_CS2, cs_high);219break;220case 3:221gpio_set_value(MCFQSPI_CS3, cs_high);222break;223}224}225226static void m527x_cs_deselect(struct mcfqspi_cs_control *cs_control,227u8 chip_select, bool cs_high)228{229switch (chip_select) {230case 0:231gpio_set_value(MCFQSPI_CS0, !cs_high);232break;233case 1:234gpio_set_value(MCFQSPI_CS1, !cs_high);235break;236case 2:237gpio_set_value(MCFQSPI_CS2, !cs_high);238break;239case 3:240gpio_set_value(MCFQSPI_CS3, !cs_high);241break;242}243}244245static struct mcfqspi_cs_control m527x_cs_control = {246.setup = m527x_cs_setup,247.teardown = m527x_cs_teardown,248.select = m527x_cs_select,249.deselect = m527x_cs_deselect,250};251252static struct mcfqspi_platform_data m527x_qspi_data = {253.bus_num = 0,254.num_chipselect = 4,255.cs_control = &m527x_cs_control,256};257258static struct platform_device m527x_qspi = {259.name = "mcfqspi",260.id = 0,261.num_resources = ARRAY_SIZE(m527x_qspi_resources),262.resource = m527x_qspi_resources,263.dev.platform_data = &m527x_qspi_data,264};265266static void __init m527x_qspi_init(void)267{268#if defined(CONFIG_M5271)269u16 par;270271/* setup QSPS pins for QSPI with gpio CS control */272writeb(0x1f, MCFGPIO_PAR_QSPI);273/* and CS2 & CS3 as gpio */274par = readw(MCFGPIO_PAR_TIMER);275par &= 0x3f3f;276writew(par, MCFGPIO_PAR_TIMER);277#elif defined(CONFIG_M5275)278/* setup QSPS pins for QSPI with gpio CS control */279writew(0x003e, MCFGPIO_PAR_QSPI);280#endif281}282#endif /* defined(CONFIG_SPI_COLDFIRE_QSPI) || defined(CONFIG_SPI_COLDFIRE_QSPI_MODULE) */283284static struct platform_device *m527x_devices[] __initdata = {285&m527x_uart,286&m527x_fec[0],287#ifdef CONFIG_FEC2288&m527x_fec[1],289#endif290#if defined(CONFIG_SPI_COLDFIRE_QSPI) || defined(CONFIG_SPI_COLDFIRE_QSPI_MODULE)291&m527x_qspi,292#endif293};294295/***************************************************************************/296297static void __init m527x_uart_init_line(int line, int irq)298{299u16 sepmask;300301if ((line < 0) || (line > 2))302return;303304/*305* External Pin Mask Setting & Enable External Pin for Interface306*/307sepmask = readw(MCF_IPSBAR + MCF_GPIO_PAR_UART);308if (line == 0)309sepmask |= UART0_ENABLE_MASK;310else if (line == 1)311sepmask |= UART1_ENABLE_MASK;312else if (line == 2)313sepmask |= UART2_ENABLE_MASK;314writew(sepmask, MCF_IPSBAR + MCF_GPIO_PAR_UART);315}316317static void __init m527x_uarts_init(void)318{319const int nrlines = ARRAY_SIZE(m527x_uart_platform);320int line;321322for (line = 0; (line < nrlines); line++)323m527x_uart_init_line(line, m527x_uart_platform[line].irq);324}325326/***************************************************************************/327328static void __init m527x_fec_init(void)329{330u16 par;331u8 v;332333/* Set multi-function pins to ethernet mode for fec0 */334#if defined(CONFIG_M5271)335v = readb(MCF_IPSBAR + 0x100047);336writeb(v | 0xf0, MCF_IPSBAR + 0x100047);337#else338par = readw(MCF_IPSBAR + 0x100082);339writew(par | 0xf00, MCF_IPSBAR + 0x100082);340v = readb(MCF_IPSBAR + 0x100078);341writeb(v | 0xc0, MCF_IPSBAR + 0x100078);342#endif343344#ifdef CONFIG_FEC2345/* Set multi-function pins to ethernet mode for fec1 */346par = readw(MCF_IPSBAR + 0x100082);347writew(par | 0xa0, MCF_IPSBAR + 0x100082);348v = readb(MCF_IPSBAR + 0x100079);349writeb(v | 0xc0, MCF_IPSBAR + 0x100079);350#endif351}352353/***************************************************************************/354355static void m527x_cpu_reset(void)356{357local_irq_disable();358__raw_writeb(MCF_RCR_SWRESET, MCF_IPSBAR + MCF_RCR);359}360361/***************************************************************************/362363void __init config_BSP(char *commandp, int size)364{365mach_reset = m527x_cpu_reset;366m527x_uarts_init();367m527x_fec_init();368#if defined(CONFIG_SPI_COLDFIRE_QSPI) || defined(CONFIG_SPI_COLDFIRE_QSPI_MODULE)369m527x_qspi_init();370#endif371}372373/***************************************************************************/374375static int __init init_BSP(void)376{377platform_add_devices(m527x_devices, ARRAY_SIZE(m527x_devices));378return 0;379}380381arch_initcall(init_BSP);382383/***************************************************************************/384385386