linux/arch/sh/kernel/cpu/sh5/setup-sh5.c
<<
>>
Prefs
   1/*
   2 * SH5-101/SH5-103 CPU Setup
   3 *
   4 *  Copyright (C) 2009  Paul Mundt
   5 *
   6 * This file is subject to the terms and conditions of the GNU General Public
   7 * License.  See the file "COPYING" in the main directory of this archive
   8 * for more details.
   9 */
  10#include <linux/platform_device.h>
  11#include <linux/init.h>
  12#include <linux/serial.h>
  13#include <linux/serial_sci.h>
  14#include <linux/io.h>
  15#include <linux/mm.h>
  16#include <linux/sh_timer.h>
  17#include <asm/addrspace.h>
  18
  19static struct plat_sci_port scif0_platform_data = {
  20        .flags          = UPF_BOOT_AUTOCONF | UPF_IOREMAP,
  21        .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
  22        .type           = PORT_SCIF,
  23};
  24
  25static struct resource scif0_resources[] = {
  26        DEFINE_RES_MEM(PHYS_PERIPHERAL_BLOCK + 0x01030000, 0x100),
  27        DEFINE_RES_IRQ(39),
  28        DEFINE_RES_IRQ(40),
  29        DEFINE_RES_IRQ(42),
  30};
  31
  32static struct platform_device scif0_device = {
  33        .name           = "sh-sci",
  34        .id             = 0,
  35        .resource       = scif0_resources,
  36        .num_resources  = ARRAY_SIZE(scif0_resources),
  37        .dev            = {
  38                .platform_data  = &scif0_platform_data,
  39        },
  40};
  41
  42static struct resource rtc_resources[] = {
  43        [0] = {
  44                .start  = PHYS_PERIPHERAL_BLOCK + 0x01040000,
  45                .end    = PHYS_PERIPHERAL_BLOCK + 0x01040000 + 0x58 - 1,
  46                .flags  = IORESOURCE_IO,
  47        },
  48        [1] = {
  49                /* Period IRQ */
  50                .start  = IRQ_PRI,
  51                .flags  = IORESOURCE_IRQ,
  52        },
  53        [2] = {
  54                /* Carry IRQ */
  55                .start  = IRQ_CUI,
  56                .flags  = IORESOURCE_IRQ,
  57        },
  58        [3] = {
  59                /* Alarm IRQ */
  60                .start  = IRQ_ATI,
  61                .flags  = IORESOURCE_IRQ,
  62        },
  63};
  64
  65static struct platform_device rtc_device = {
  66        .name           = "sh-rtc",
  67        .id             = -1,
  68        .num_resources  = ARRAY_SIZE(rtc_resources),
  69        .resource       = rtc_resources,
  70};
  71
  72#define TMU_BLOCK_OFF   0x01020000
  73#define TMU_BASE        PHYS_PERIPHERAL_BLOCK + TMU_BLOCK_OFF
  74
  75static struct sh_timer_config tmu0_platform_data = {
  76        .channels_mask = 7,
  77};
  78
  79static struct resource tmu0_resources[] = {
  80        DEFINE_RES_MEM(TMU_BASE, 0x30),
  81        DEFINE_RES_IRQ(IRQ_TUNI0),
  82        DEFINE_RES_IRQ(IRQ_TUNI1),
  83        DEFINE_RES_IRQ(IRQ_TUNI2),
  84};
  85
  86static struct platform_device tmu0_device = {
  87        .name           = "sh-tmu",
  88        .id             = 0,
  89        .dev = {
  90                .platform_data  = &tmu0_platform_data,
  91        },
  92        .resource       = tmu0_resources,
  93        .num_resources  = ARRAY_SIZE(tmu0_resources),
  94};
  95
  96static struct platform_device *sh5_early_devices[] __initdata = {
  97        &scif0_device,
  98        &tmu0_device,
  99};
 100
 101static struct platform_device *sh5_devices[] __initdata = {
 102        &rtc_device,
 103};
 104
 105static int __init sh5_devices_setup(void)
 106{
 107        int ret;
 108
 109        ret = platform_add_devices(sh5_early_devices,
 110                                   ARRAY_SIZE(sh5_early_devices));
 111        if (unlikely(ret != 0))
 112                return ret;
 113
 114        return platform_add_devices(sh5_devices,
 115                                    ARRAY_SIZE(sh5_devices));
 116}
 117arch_initcall(sh5_devices_setup);
 118
 119void __init plat_early_device_setup(void)
 120{
 121        early_platform_add_devices(sh5_early_devices,
 122                                   ARRAY_SIZE(sh5_early_devices));
 123}
 124