linux/arch/arm/mach-pxa/colibri-pxa270.c
<<
>>
Prefs
   1/*
   2 *  linux/arch/arm/mach-pxa/colibri-pxa270.c
   3 *
   4 *  Support for Toradex PXA270 based Colibri module
   5 *  Daniel Mack <daniel@caiaq.de>
   6 *
   7 *  This program is free software; you can redistribute it and/or modify
   8 *  it under the terms of the GNU General Public License version 2 as
   9 *  published by the Free Software Foundation.
  10 */
  11
  12#include <linux/init.h>
  13#include <linux/kernel.h>
  14#include <linux/platform_device.h>
  15#include <linux/sysdev.h>
  16#include <linux/interrupt.h>
  17#include <linux/bitops.h>
  18#include <linux/ioport.h>
  19#include <linux/delay.h>
  20#include <linux/mtd/mtd.h>
  21#include <linux/mtd/partitions.h>
  22#include <linux/mtd/physmap.h>
  23#include <linux/gpio.h>
  24#include <asm/mach-types.h>
  25#include <mach/hardware.h>
  26#include <asm/irq.h>
  27#include <asm/sizes.h>
  28#include <asm/mach/arch.h>
  29#include <asm/mach/map.h>
  30#include <asm/mach/irq.h>
  31#include <asm/mach/flash.h>
  32
  33#include <mach/pxa27x.h>
  34#include <mach/colibri.h>
  35
  36#include "generic.h"
  37#include "devices.h"
  38
  39/*
  40 * GPIO configuration
  41 */
  42static mfp_cfg_t colibri_pxa270_pin_config[] __initdata = {
  43        GPIO78_nCS_2,   /* Ethernet CS */
  44        GPIO114_GPIO,   /* Ethernet IRQ */
  45};
  46
  47/*
  48 * NOR flash
  49 */
  50static struct mtd_partition colibri_partitions[] = {
  51        {
  52                .name =         "Bootloader",
  53                .offset =       0x00000000,
  54                .size =         0x00040000,
  55                .mask_flags =   MTD_WRITEABLE  /* force read-only */
  56        }, {
  57                .name =         "Kernel",
  58                .offset =       0x00040000,
  59                .size =         0x00400000,
  60                .mask_flags =   0
  61        }, {
  62                .name =         "Rootfs",
  63                .offset =       0x00440000,
  64                .size =         MTDPART_SIZ_FULL,
  65                .mask_flags =   0
  66        }
  67};
  68
  69static struct physmap_flash_data colibri_flash_data[] = {
  70        {
  71                .width          = 4,                    /* bankwidth in bytes */
  72                .parts          = colibri_partitions,
  73                .nr_parts       = ARRAY_SIZE(colibri_partitions)
  74        }
  75};
  76
  77static struct resource colibri_pxa270_flash_resource = {
  78        .start  = PXA_CS0_PHYS,
  79        .end    = PXA_CS0_PHYS + SZ_32M - 1,
  80        .flags  = IORESOURCE_MEM,
  81};
  82
  83static struct platform_device colibri_pxa270_flash_device = {
  84        .name   = "physmap-flash",
  85        .id     = 0,
  86        .dev    = {
  87                .platform_data = colibri_flash_data,
  88        },
  89        .resource = &colibri_pxa270_flash_resource,
  90        .num_resources = 1,
  91};
  92
  93/*
  94 * DM9000 Ethernet
  95 */
  96#if defined(CONFIG_DM9000)
  97static struct resource dm9000_resources[] = {
  98        [0] = {
  99                .start  = COLIBRI_PXA270_ETH_PHYS,
 100                .end    = COLIBRI_PXA270_ETH_PHYS + 3,
 101                .flags  = IORESOURCE_MEM,
 102        },
 103        [1] = {
 104                .start  = COLIBRI_PXA270_ETH_PHYS + 4,
 105                .end    = COLIBRI_PXA270_ETH_PHYS + 4 + 500,
 106                .flags  = IORESOURCE_MEM,
 107        },
 108        [2] = {
 109                .start  = COLIBRI_PXA270_ETH_IRQ,
 110                .end    = COLIBRI_PXA270_ETH_IRQ,
 111                .flags  = IORESOURCE_IRQ | IRQF_TRIGGER_RISING,
 112        },
 113};
 114
 115static struct platform_device dm9000_device = {
 116        .name           = "dm9000",
 117        .id             = -1,
 118        .num_resources  = ARRAY_SIZE(dm9000_resources),
 119        .resource       = dm9000_resources,
 120};
 121#endif /* CONFIG_DM9000 */
 122
 123static struct platform_device *colibri_pxa270_devices[] __initdata = {
 124        &colibri_pxa270_flash_device,
 125#if defined(CONFIG_DM9000)
 126        &dm9000_device,
 127#endif
 128};
 129
 130static void __init colibri_pxa270_init(void)
 131{
 132        pxa2xx_mfp_config(ARRAY_AND_SIZE(colibri_pxa270_pin_config));
 133        platform_add_devices(ARRAY_AND_SIZE(colibri_pxa270_devices));
 134}
 135
 136MACHINE_START(COLIBRI, "Toradex Colibri PXA270")
 137        .phys_io        = 0x40000000,
 138        .io_pg_offst    = (io_p2v(0x40000000) >> 18) & 0xfffc,
 139        .boot_params    = COLIBRI_SDRAM_BASE + 0x100,
 140        .init_machine   = colibri_pxa270_init,
 141        .map_io         = pxa_map_io,
 142        .init_irq       = pxa27x_init_irq,
 143        .timer          = &pxa_timer,
 144MACHINE_END
 145
 146