Path: blob/master/arch/m68k/platform/523x/config.c
10821 views
/***************************************************************************/12/*3* linux/arch/m68knommu/platform/523x/config.c4*5* Sub-architcture dependent initialization code for the Freescale6* 523x CPUs.7*8* Copyright (C) 1999-2005, Greg Ungerer ([email protected])9* Copyright (C) 2001-2003, 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 m523x_uart_platform[] = {29{30.mapbase = MCFUART_BASE1,31.irq = MCFINT_VECBASE + MCFINT_UART0,32},33{34.mapbase = MCFUART_BASE2,35.irq = MCFINT_VECBASE + MCFINT_UART0 + 1,36},37{38.mapbase = MCFUART_BASE3,39.irq = MCFINT_VECBASE + MCFINT_UART0 + 2,40},41{ },42};4344static struct platform_device m523x_uart = {45.name = "mcfuart",46.id = 0,47.dev.platform_data = m523x_uart_platform,48};4950static struct resource m523x_fec_resources[] = {51{52.start = MCFFEC_BASE,53.end = MCFFEC_BASE + MCFFEC_SIZE - 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 platform_device m523x_fec = {74.name = "fec",75.id = 0,76.num_resources = ARRAY_SIZE(m523x_fec_resources),77.resource = m523x_fec_resources,78};7980#if defined(CONFIG_SPI_COLDFIRE_QSPI) || defined(CONFIG_SPI_COLDFIRE_QSPI_MODULE)81static struct resource m523x_qspi_resources[] = {82{83.start = MCFQSPI_IOBASE,84.end = MCFQSPI_IOBASE + MCFQSPI_IOSIZE - 1,85.flags = IORESOURCE_MEM,86},87{88.start = MCFINT_VECBASE + MCFINT_QSPI,89.end = MCFINT_VECBASE + MCFINT_QSPI,90.flags = IORESOURCE_IRQ,91},92};9394#define MCFQSPI_CS0 9195#define MCFQSPI_CS1 9296#define MCFQSPI_CS2 10397#define MCFQSPI_CS3 999899static int m523x_cs_setup(struct mcfqspi_cs_control *cs_control)100{101int status;102103status = gpio_request(MCFQSPI_CS0, "MCFQSPI_CS0");104if (status) {105pr_debug("gpio_request for MCFQSPI_CS0 failed\n");106goto fail0;107}108status = gpio_direction_output(MCFQSPI_CS0, 1);109if (status) {110pr_debug("gpio_direction_output for MCFQSPI_CS0 failed\n");111goto fail1;112}113114status = gpio_request(MCFQSPI_CS1, "MCFQSPI_CS1");115if (status) {116pr_debug("gpio_request for MCFQSPI_CS1 failed\n");117goto fail1;118}119status = gpio_direction_output(MCFQSPI_CS1, 1);120if (status) {121pr_debug("gpio_direction_output for MCFQSPI_CS1 failed\n");122goto fail2;123}124125status = gpio_request(MCFQSPI_CS2, "MCFQSPI_CS2");126if (status) {127pr_debug("gpio_request for MCFQSPI_CS2 failed\n");128goto fail2;129}130status = gpio_direction_output(MCFQSPI_CS2, 1);131if (status) {132pr_debug("gpio_direction_output for MCFQSPI_CS2 failed\n");133goto fail3;134}135136status = gpio_request(MCFQSPI_CS3, "MCFQSPI_CS3");137if (status) {138pr_debug("gpio_request for MCFQSPI_CS3 failed\n");139goto fail3;140}141status = gpio_direction_output(MCFQSPI_CS3, 1);142if (status) {143pr_debug("gpio_direction_output for MCFQSPI_CS3 failed\n");144goto fail4;145}146147return 0;148149fail4:150gpio_free(MCFQSPI_CS3);151fail3:152gpio_free(MCFQSPI_CS2);153fail2:154gpio_free(MCFQSPI_CS1);155fail1:156gpio_free(MCFQSPI_CS0);157fail0:158return status;159}160161static void m523x_cs_teardown(struct mcfqspi_cs_control *cs_control)162{163gpio_free(MCFQSPI_CS3);164gpio_free(MCFQSPI_CS2);165gpio_free(MCFQSPI_CS1);166gpio_free(MCFQSPI_CS0);167}168169static void m523x_cs_select(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;182case 3:183gpio_set_value(MCFQSPI_CS3, cs_high);184break;185}186}187188static void m523x_cs_deselect(struct mcfqspi_cs_control *cs_control,189u8 chip_select, bool cs_high)190{191switch (chip_select) {192case 0:193gpio_set_value(MCFQSPI_CS0, !cs_high);194break;195case 1:196gpio_set_value(MCFQSPI_CS1, !cs_high);197break;198case 2:199gpio_set_value(MCFQSPI_CS2, !cs_high);200break;201case 3:202gpio_set_value(MCFQSPI_CS3, !cs_high);203break;204}205}206207static struct mcfqspi_cs_control m523x_cs_control = {208.setup = m523x_cs_setup,209.teardown = m523x_cs_teardown,210.select = m523x_cs_select,211.deselect = m523x_cs_deselect,212};213214static struct mcfqspi_platform_data m523x_qspi_data = {215.bus_num = 0,216.num_chipselect = 4,217.cs_control = &m523x_cs_control,218};219220static struct platform_device m523x_qspi = {221.name = "mcfqspi",222.id = 0,223.num_resources = ARRAY_SIZE(m523x_qspi_resources),224.resource = m523x_qspi_resources,225.dev.platform_data = &m523x_qspi_data,226};227228static void __init m523x_qspi_init(void)229{230u16 par;231232/* setup QSPS pins for QSPI with gpio CS control */233writeb(0x1f, MCFGPIO_PAR_QSPI);234/* and CS2 & CS3 as gpio */235par = readw(MCFGPIO_PAR_TIMER);236par &= 0x3f3f;237writew(par, MCFGPIO_PAR_TIMER);238}239#endif /* defined(CONFIG_SPI_COLDFIRE_QSPI) || defined(CONFIG_SPI_COLDFIRE_QSPI_MODULE) */240241static struct platform_device *m523x_devices[] __initdata = {242&m523x_uart,243&m523x_fec,244#if defined(CONFIG_SPI_COLDFIRE_QSPI) || defined(CONFIG_SPI_COLDFIRE_QSPI_MODULE)245&m523x_qspi,246#endif247};248249/***************************************************************************/250251static void __init m523x_fec_init(void)252{253u16 par;254u8 v;255256/* Set multi-function pins to ethernet use */257par = readw(MCF_IPSBAR + 0x100082);258writew(par | 0xf00, MCF_IPSBAR + 0x100082);259v = readb(MCF_IPSBAR + 0x100078);260writeb(v | 0xc0, MCF_IPSBAR + 0x100078);261}262263/***************************************************************************/264265static void m523x_cpu_reset(void)266{267local_irq_disable();268__raw_writeb(MCF_RCR_SWRESET, MCF_IPSBAR + MCF_RCR);269}270271/***************************************************************************/272273void __init config_BSP(char *commandp, int size)274{275mach_reset = m523x_cpu_reset;276}277278/***************************************************************************/279280static int __init init_BSP(void)281{282m523x_fec_init();283#if defined(CONFIG_SPI_COLDFIRE_QSPI) || defined(CONFIG_SPI_COLDFIRE_QSPI_MODULE)284m523x_qspi_init();285#endif286platform_add_devices(m523x_devices, ARRAY_SIZE(m523x_devices));287return 0;288}289290arch_initcall(init_BSP);291292/***************************************************************************/293294295