linux/arch/sh/boards/board-apsh4a3a.c
<<
>>
Prefs
   1/*
   2 * ALPHAPROJECT AP-SH4A-3A Support.
   3 *
   4 * Copyright (C) 2010 ALPHAPROJECT Co.,Ltd.
   5 * Copyright (C) 2008  Yoshihiro Shimoda
   6 * Copyright (C) 2009  Paul Mundt
   7 *
   8 * This file is subject to the terms and conditions of the GNU General Public
   9 * License.  See the file "COPYING" in the main directory of this archive
  10 * for more details.
  11 */
  12#include <linux/init.h>
  13#include <linux/platform_device.h>
  14#include <linux/io.h>
  15#include <linux/mtd/physmap.h>
  16#include <linux/smsc911x.h>
  17#include <linux/irq.h>
  18#include <linux/clk.h>
  19#include <asm/machvec.h>
  20#include <asm/sizes.h>
  21#include <asm/clock.h>
  22
  23static struct mtd_partition nor_flash_partitions[] = {
  24        {
  25                .name           = "loader",
  26                .offset         = 0x00000000,
  27                .size           = 512 * 1024,
  28        },
  29        {
  30                .name           = "bootenv",
  31                .offset         = MTDPART_OFS_APPEND,
  32                .size           = 512 * 1024,
  33        },
  34        {
  35                .name           = "kernel",
  36                .offset         = MTDPART_OFS_APPEND,
  37                .size           = 4 * 1024 * 1024,
  38        },
  39        {
  40                .name           = "data",
  41                .offset         = MTDPART_OFS_APPEND,
  42                .size           = MTDPART_SIZ_FULL,
  43        },
  44};
  45
  46static struct physmap_flash_data nor_flash_data = {
  47        .width          = 4,
  48        .parts          = nor_flash_partitions,
  49        .nr_parts       = ARRAY_SIZE(nor_flash_partitions),
  50};
  51
  52static struct resource nor_flash_resources[] = {
  53        [0]     = {
  54                .start  = 0x00000000,
  55                .end    = 0x01000000 - 1,
  56                .flags  = IORESOURCE_MEM,
  57        }
  58};
  59
  60static struct platform_device nor_flash_device = {
  61        .name           = "physmap-flash",
  62        .dev            = {
  63                .platform_data  = &nor_flash_data,
  64        },
  65        .num_resources  = ARRAY_SIZE(nor_flash_resources),
  66        .resource       = nor_flash_resources,
  67};
  68
  69static struct resource smsc911x_resources[] = {
  70        [0] = {
  71                .name           = "smsc911x-memory",
  72                .start          = 0xA4000000,
  73                .end            = 0xA4000000 + SZ_256 - 1,
  74                .flags          = IORESOURCE_MEM,
  75        },
  76        [1] = {
  77                .name           = "smsc911x-irq",
  78                .start          = evt2irq(0x200),
  79                .end            = evt2irq(0x200),
  80                .flags          = IORESOURCE_IRQ,
  81        },
  82};
  83
  84static struct smsc911x_platform_config smsc911x_config = {
  85        .irq_polarity   = SMSC911X_IRQ_POLARITY_ACTIVE_LOW,
  86        .irq_type       = SMSC911X_IRQ_TYPE_OPEN_DRAIN,
  87        .flags          = SMSC911X_USE_16BIT,
  88        .phy_interface  = PHY_INTERFACE_MODE_MII,
  89};
  90
  91static struct platform_device smsc911x_device = {
  92        .name           = "smsc911x",
  93        .id             = -1,
  94        .num_resources  = ARRAY_SIZE(smsc911x_resources),
  95        .resource       = smsc911x_resources,
  96        .dev = {
  97                .platform_data = &smsc911x_config,
  98        },
  99};
 100
 101static struct platform_device *apsh4a3a_devices[] __initdata = {
 102        &nor_flash_device,
 103        &smsc911x_device,
 104};
 105
 106static int __init apsh4a3a_devices_setup(void)
 107{
 108        return platform_add_devices(apsh4a3a_devices,
 109                                    ARRAY_SIZE(apsh4a3a_devices));
 110}
 111device_initcall(apsh4a3a_devices_setup);
 112
 113static int apsh4a3a_clk_init(void)
 114{
 115        struct clk *clk;
 116        int ret;
 117
 118        clk = clk_get(NULL, "extal");
 119        if (IS_ERR(clk))
 120                return PTR_ERR(clk);
 121        ret = clk_set_rate(clk, 33333000);
 122        clk_put(clk);
 123
 124        return ret;
 125}
 126
 127/* Initialize the board */
 128static void __init apsh4a3a_setup(char **cmdline_p)
 129{
 130        printk(KERN_INFO "Alpha Project AP-SH4A-3A support:\n");
 131}
 132
 133static void __init apsh4a3a_init_irq(void)
 134{
 135        plat_irq_setup_pins(IRQ_MODE_IRQ7654);
 136}
 137
 138/* Return the board specific boot mode pin configuration */
 139static int apsh4a3a_mode_pins(void)
 140{
 141        int value = 0;
 142
 143        /* These are the factory default settings of SW1 and SW2.
 144         * If you change these dip switches then you will need to
 145         * adjust the values below as well.
 146         */
 147        value &= ~MODE_PIN0;  /* Clock Mode 16 */
 148        value &= ~MODE_PIN1;
 149        value &= ~MODE_PIN2;
 150        value &= ~MODE_PIN3;
 151        value |=  MODE_PIN4;
 152        value &= ~MODE_PIN5;  /* 16-bit Area0 bus width */
 153        value |=  MODE_PIN6;  /* Area 0 SRAM interface */
 154        value |=  MODE_PIN7;
 155        value |=  MODE_PIN8;  /* Little Endian */
 156        value |=  MODE_PIN9;  /* Master Mode */
 157        value |=  MODE_PIN10; /* Crystal resonator */
 158        value |=  MODE_PIN11; /* Display Unit */
 159        value |=  MODE_PIN12;
 160        value &= ~MODE_PIN13; /* 29-bit address mode */
 161        value |=  MODE_PIN14; /* No PLL step-up */
 162
 163        return value;
 164}
 165
 166/*
 167 * The Machine Vector
 168 */
 169static struct sh_machine_vector mv_apsh4a3a __initmv = {
 170        .mv_name                = "AP-SH4A-3A",
 171        .mv_setup               = apsh4a3a_setup,
 172        .mv_clk_init            = apsh4a3a_clk_init,
 173        .mv_init_irq            = apsh4a3a_init_irq,
 174        .mv_mode_pins           = apsh4a3a_mode_pins,
 175};
 176