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