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