linux/arch/mips/mti-malta/malta-platform.c
<<
>>
Prefs
   1/*
   2 * This file is subject to the terms and conditions of the GNU General Public
   3 * License.  See the file "COPYING" in the main directory of this archive
   4 * for more details.
   5 *
   6 * Copyright (C) 2006, 07 MIPS Technologies, Inc.
   7 *   written by Ralf Baechle (ralf@linux-mips.org)
   8 *     written by Ralf Baechle <ralf@linux-mips.org>
   9 *
  10 * Copyright (C) 2008 Wind River Systems, Inc.
  11 *   updated by Tiejun Chen <tiejun.chen@windriver.com>
  12 *
  13 * 1. Probe driver for the Malta's UART ports:
  14 *
  15 *   o 2 ports in the SMC SuperIO
  16 *   o 1 port in the CBUS UART, a discrete 16550 which normally is only used
  17 *     for bringups.
  18 *
  19 * We don't use 8250_platform.c on Malta as it would result in the CBUS
  20 * UART becoming ttyS0.
  21 *
  22 * 2. Register RTC-CMOS platform device on Malta.
  23 */
  24#include <linux/init.h>
  25#include <linux/serial_8250.h>
  26#include <linux/mc146818rtc.h>
  27#include <linux/module.h>
  28#include <linux/irq.h>
  29#include <linux/mtd/partitions.h>
  30#include <linux/mtd/physmap.h>
  31#include <linux/platform_device.h>
  32#include <asm/mips-boards/maltaint.h>
  33#include <mtd/mtd-abi.h>
  34
  35#define SMC_PORT(base, int)                                             \
  36{                                                                       \
  37        .iobase         = base,                                         \
  38        .irq            = int,                                          \
  39        .uartclk        = 1843200,                                      \
  40        .iotype         = UPIO_PORT,                                    \
  41        .flags          = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST,            \
  42        .regshift       = 0,                                            \
  43}
  44
  45#define CBUS_UART_FLAGS (UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_IOREMAP)
  46
  47static struct plat_serial8250_port uart8250_data[] = {
  48        SMC_PORT(0x3F8, 4),
  49        SMC_PORT(0x2F8, 3),
  50        {
  51                .mapbase        = 0x1f000900,   /* The CBUS UART */
  52                .irq            = MIPS_CPU_IRQ_BASE + MIPSCPU_INT_MB2,
  53                .uartclk        = 3686400,      /* Twice the usual clk! */
  54                .iotype         = UPIO_MEM32,
  55                .flags          = CBUS_UART_FLAGS,
  56                .regshift       = 3,
  57        },
  58        { },
  59};
  60
  61static struct platform_device malta_uart8250_device = {
  62        .name                   = "serial8250",
  63        .id                     = PLAT8250_DEV_PLATFORM,
  64        .dev                    = {
  65                .platform_data  = uart8250_data,
  66        },
  67};
  68
  69struct resource malta_rtc_resources[] = {
  70        {
  71                .start  = RTC_PORT(0),
  72                .end    = RTC_PORT(7),
  73                .flags  = IORESOURCE_IO,
  74        }, {
  75                .start  = RTC_IRQ,
  76                .end    = RTC_IRQ,
  77                .flags  = IORESOURCE_IRQ,
  78        }
  79};
  80
  81static struct platform_device malta_rtc_device = {
  82        .name           = "rtc_cmos",
  83        .id             = -1,
  84        .resource       = malta_rtc_resources,
  85        .num_resources  = ARRAY_SIZE(malta_rtc_resources),
  86};
  87
  88static struct mtd_partition malta_mtd_partitions[] = {
  89        {
  90                .name =         "YAMON",
  91                .offset =       0x0,
  92                .size =         0x100000,
  93                .mask_flags =   MTD_WRITEABLE
  94        }, {
  95                .name =         "User FS",
  96                .offset =       0x100000,
  97                .size =         0x2e0000
  98        }, {
  99                .name =         "Board Config",
 100                .offset =       0x3e0000,
 101                .size =         0x020000,
 102                .mask_flags =   MTD_WRITEABLE
 103        }
 104};
 105
 106static struct physmap_flash_data malta_flash_data = {
 107        .width          = 4,
 108        .nr_parts       = ARRAY_SIZE(malta_mtd_partitions),
 109        .parts          = malta_mtd_partitions
 110};
 111
 112static struct resource malta_flash_resource = {
 113        .start          = 0x1e000000,
 114        .end            = 0x1e3fffff,
 115        .flags          = IORESOURCE_MEM
 116};
 117
 118static struct platform_device malta_flash_device = {
 119        .name           = "physmap-flash",
 120        .id             = 0,
 121        .dev            = {
 122                .platform_data  = &malta_flash_data,
 123        },
 124        .num_resources  = 1,
 125        .resource       = &malta_flash_resource,
 126};
 127
 128static struct platform_device *malta_devices[] __initdata = {
 129        &malta_uart8250_device,
 130        &malta_rtc_device,
 131        &malta_flash_device,
 132};
 133
 134static int __init malta_add_devices(void)
 135{
 136        int err;
 137
 138        err = platform_add_devices(malta_devices, ARRAY_SIZE(malta_devices));
 139        if (err)
 140                return err;
 141
 142        return 0;
 143}
 144
 145device_initcall(malta_add_devices);
 146