linux/arch/m68knommu/platform/520x/config.c
<<
>>
Prefs
   1/***************************************************************************/
   2
   3/*
   4 *  linux/arch/m68knommu/platform/520x/config.c
   5 *
   6 *  Copyright (C) 2005,      Freescale (www.freescale.com)
   7 *  Copyright (C) 2005,      Intec Automation (mike@steroidmicros.com)
   8 *  Copyright (C) 1999-2007, Greg Ungerer (gerg@snapgear.com)
   9 *  Copyright (C) 2001-2003, SnapGear Inc. (www.snapgear.com)
  10 */
  11
  12/***************************************************************************/
  13
  14#include <linux/kernel.h>
  15#include <linux/param.h>
  16#include <linux/init.h>
  17#include <linux/io.h>
  18#include <asm/machdep.h>
  19#include <asm/coldfire.h>
  20#include <asm/mcfsim.h>
  21#include <asm/mcfuart.h>
  22
  23/***************************************************************************/
  24
  25static struct mcf_platform_uart m520x_uart_platform[] = {
  26        {
  27                .mapbase        = MCF_MBAR + MCFUART_BASE1,
  28                .irq            = MCFINT_VECBASE + MCFINT_UART0,
  29        },
  30        {
  31                .mapbase        = MCF_MBAR + MCFUART_BASE2,
  32                .irq            = MCFINT_VECBASE + MCFINT_UART1,
  33        },
  34        {
  35                .mapbase        = MCF_MBAR + MCFUART_BASE3,
  36                .irq            = MCFINT_VECBASE + MCFINT_UART2,
  37        },
  38        { },
  39};
  40
  41static struct platform_device m520x_uart = {
  42        .name                   = "mcfuart",
  43        .id                     = 0,
  44        .dev.platform_data      = m520x_uart_platform,
  45};
  46
  47static struct resource m520x_fec_resources[] = {
  48        {
  49                .start          = MCF_MBAR + 0x30000,
  50                .end            = MCF_MBAR + 0x30000 + 0x7ff,
  51                .flags          = IORESOURCE_MEM,
  52        },
  53        {
  54                .start          = 64 + 36,
  55                .end            = 64 + 36,
  56                .flags          = IORESOURCE_IRQ,
  57        },
  58        {
  59                .start          = 64 + 40,
  60                .end            = 64 + 40,
  61                .flags          = IORESOURCE_IRQ,
  62        },
  63        {
  64                .start          = 64 + 42,
  65                .end            = 64 + 42,
  66                .flags          = IORESOURCE_IRQ,
  67        },
  68};
  69
  70static struct platform_device m520x_fec = {
  71        .name                   = "fec",
  72        .id                     = 0,
  73        .num_resources          = ARRAY_SIZE(m520x_fec_resources),
  74        .resource               = m520x_fec_resources,
  75};
  76
  77static struct platform_device *m520x_devices[] __initdata = {
  78        &m520x_uart,
  79        &m520x_fec,
  80};
  81
  82/***************************************************************************/
  83
  84static void __init m520x_uart_init_line(int line, int irq)
  85{
  86        u16 par;
  87        u8 par2;
  88
  89        switch (line) {
  90        case 0:
  91                par = readw(MCF_IPSBAR + MCF_GPIO_PAR_UART);
  92                par |= MCF_GPIO_PAR_UART_PAR_UTXD0 |
  93                       MCF_GPIO_PAR_UART_PAR_URXD0;
  94                writew(par, MCF_IPSBAR + MCF_GPIO_PAR_UART);
  95                break;
  96        case 1:
  97                par = readw(MCF_IPSBAR + MCF_GPIO_PAR_UART);
  98                par |= MCF_GPIO_PAR_UART_PAR_UTXD1 |
  99                       MCF_GPIO_PAR_UART_PAR_URXD1;
 100                writew(par, MCF_IPSBAR + MCF_GPIO_PAR_UART);
 101                break;
 102        case 2:
 103                par2 = readb(MCF_IPSBAR + MCF_GPIO_PAR_FECI2C);
 104                par2 &= ~0x0F;
 105                par2 |= MCF_GPIO_PAR_FECI2C_PAR_SCL_UTXD2 |
 106                        MCF_GPIO_PAR_FECI2C_PAR_SDA_URXD2;
 107                writeb(par2, MCF_IPSBAR + MCF_GPIO_PAR_FECI2C);
 108                break;
 109        }
 110}
 111
 112static void __init m520x_uarts_init(void)
 113{
 114        const int nrlines = ARRAY_SIZE(m520x_uart_platform);
 115        int line;
 116
 117        for (line = 0; (line < nrlines); line++)
 118                m520x_uart_init_line(line, m520x_uart_platform[line].irq);
 119}
 120
 121/***************************************************************************/
 122
 123static void __init m520x_fec_init(void)
 124{
 125        u8 v;
 126
 127        /* Set multi-function pins to ethernet mode */
 128        v = readb(MCF_IPSBAR + MCF_GPIO_PAR_FEC);
 129        writeb(v | 0xf0, MCF_IPSBAR + MCF_GPIO_PAR_FEC);
 130
 131        v = readb(MCF_IPSBAR + MCF_GPIO_PAR_FECI2C);
 132        writeb(v | 0x0f, MCF_IPSBAR + MCF_GPIO_PAR_FECI2C);
 133}
 134
 135/***************************************************************************/
 136
 137static void m520x_cpu_reset(void)
 138{
 139        local_irq_disable();
 140        __raw_writeb(MCF_RCR_SWRESET, MCF_RCR);
 141}
 142
 143/***************************************************************************/
 144
 145void __init config_BSP(char *commandp, int size)
 146{
 147        mach_reset = m520x_cpu_reset;
 148        m520x_uarts_init();
 149        m520x_fec_init();
 150}
 151
 152/***************************************************************************/
 153
 154static int __init init_BSP(void)
 155{
 156        platform_add_devices(m520x_devices, ARRAY_SIZE(m520x_devices));
 157        return 0;
 158}
 159
 160arch_initcall(init_BSP);
 161
 162/***************************************************************************/
 163