linux/arch/arm/mach-imx/mach-apf9328.c
<<
>>
Prefs
   1/*
   2 * linux/arch/arm/mach-imx/mach-apf9328.c
   3 *
   4 * Copyright (c) 2005-2011 ARMadeus systems <support@armadeus.com>
   5 *
   6 * This work is based on mach-scb9328.c which is:
   7 * Copyright (c) 2004 Sascha Hauer <saschahauer@web.de>
   8 * Copyright (c) 2006-2008 Juergen Beisert <jbeisert@netscape.net>
   9 *
  10 * This program is free software; you can redistribute it and/or modify
  11 * it under the terms of the GNU General Public License version 2 as
  12 * published by the Free Software Foundation.
  13 *
  14 */
  15
  16#include <linux/init.h>
  17#include <linux/kernel.h>
  18#include <linux/platform_device.h>
  19#include <linux/mtd/physmap.h>
  20#include <linux/dm9000.h>
  21#include <linux/gpio.h>
  22#include <linux/i2c.h>
  23
  24#include <asm/mach-types.h>
  25#include <asm/mach/arch.h>
  26#include <asm/mach/time.h>
  27
  28#include "common.h"
  29#include "devices-imx1.h"
  30#include "hardware.h"
  31#include "iomux-mx1.h"
  32
  33static const int apf9328_pins[] __initconst = {
  34        /* UART1 */
  35        PC9_PF_UART1_CTS,
  36        PC10_PF_UART1_RTS,
  37        PC11_PF_UART1_TXD,
  38        PC12_PF_UART1_RXD,
  39        /* UART2 */
  40        PB28_PF_UART2_CTS,
  41        PB29_PF_UART2_RTS,
  42        PB30_PF_UART2_TXD,
  43        PB31_PF_UART2_RXD,
  44        /* I2C */
  45        PA15_PF_I2C_SDA,
  46        PA16_PF_I2C_SCL,
  47};
  48
  49/*
  50 * The APF9328 can have up to 32MB NOR Flash
  51 */
  52static struct resource flash_resource = {
  53        .start  = MX1_CS0_PHYS,
  54        .end    = MX1_CS0_PHYS + SZ_32M - 1,
  55        .flags  = IORESOURCE_MEM,
  56};
  57
  58static struct physmap_flash_data apf9328_flash_data = {
  59        .width  = 2,
  60};
  61
  62static struct platform_device apf9328_flash_device = {
  63        .name           = "physmap-flash",
  64        .id             = 0,
  65        .dev = {
  66                .platform_data = &apf9328_flash_data,
  67        },
  68        .resource = &flash_resource,
  69        .num_resources = 1,
  70};
  71
  72/*
  73 * APF9328 has a DM9000 Ethernet controller
  74 */
  75static struct dm9000_plat_data dm9000_setup = {
  76        .flags          = DM9000_PLATF_16BITONLY
  77};
  78
  79static struct resource dm9000_resources[] = {
  80        {
  81                .start  = MX1_CS4_PHYS + 0x00C00000,
  82                .end    = MX1_CS4_PHYS + 0x00C00001,
  83                .flags  = IORESOURCE_MEM,
  84        }, {
  85                .start  = MX1_CS4_PHYS + 0x00C00002,
  86                .end    = MX1_CS4_PHYS + 0x00C00003,
  87                .flags  = IORESOURCE_MEM,
  88        }, {
  89                /* irq number is run-time assigned */
  90                .flags  = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL,
  91        },
  92};
  93
  94static struct platform_device dm9000x_device = {
  95        .name           = "dm9000",
  96        .id             = 0,
  97        .num_resources  = ARRAY_SIZE(dm9000_resources),
  98        .resource       = dm9000_resources,
  99        .dev            = {
 100                .platform_data = &dm9000_setup,
 101        }
 102};
 103
 104static const struct imxuart_platform_data uart1_pdata __initconst = {
 105        .flags = IMXUART_HAVE_RTSCTS,
 106};
 107
 108static const struct imxi2c_platform_data apf9328_i2c_data __initconst = {
 109        .bitrate = 100000,
 110};
 111
 112static struct platform_device *devices[] __initdata = {
 113        &apf9328_flash_device,
 114        &dm9000x_device,
 115};
 116
 117static void __init apf9328_init(void)
 118{
 119        imx1_soc_init();
 120
 121        mxc_gpio_setup_multiple_pins(apf9328_pins,
 122                        ARRAY_SIZE(apf9328_pins),
 123                        "APF9328");
 124
 125        imx1_add_imx_uart0(NULL);
 126        imx1_add_imx_uart1(&uart1_pdata);
 127
 128        imx1_add_imx_i2c(&apf9328_i2c_data);
 129
 130        dm9000_resources[2].start = gpio_to_irq(IMX_GPIO_NR(2, 14));
 131        dm9000_resources[2].end = gpio_to_irq(IMX_GPIO_NR(2, 14));
 132        platform_add_devices(devices, ARRAY_SIZE(devices));
 133}
 134
 135static void __init apf9328_timer_init(void)
 136{
 137        mx1_clocks_init(32768);
 138}
 139
 140MACHINE_START(APF9328, "Armadeus APF9328")
 141        /* Maintainer: Gwenhael Goavec-Merou, ARMadeus Systems */
 142        .map_io       = mx1_map_io,
 143        .init_early   = imx1_init_early,
 144        .init_irq     = mx1_init_irq,
 145        .handle_irq   = imx1_handle_irq,
 146        .init_time      = apf9328_timer_init,
 147        .init_machine = apf9328_init,
 148        .restart        = mxc_restart,
 149MACHINE_END
 150