xref: /linux/arch/mips/dec/platform.c (revision 5d7a49d60b8fda66da60e240fd7315232fa1754f)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  *	DEC platform devices.
4  *
5  *	Copyright (c) 2014  Maciej W. Rozycki
6  */
7 
8 #include <linux/ioport.h>
9 #include <linux/kernel.h>
10 #include <linux/mc146818rtc.h>
11 #include <linux/platform_device.h>
12 
13 #include <asm/bootinfo.h>
14 
15 #include <asm/dec/interrupts.h>
16 #include <asm/dec/kn01.h>
17 #include <asm/dec/kn02.h>
18 #include <asm/dec/system.h>
19 
20 static struct resource dec_rtc_resources[] = {
21 	{
22 		.name = "rtc",
23 		.flags = IORESOURCE_MEM,
24 	},
25 };
26 
27 static struct cmos_rtc_board_info dec_rtc_info = {
28 	.flags = CMOS_RTC_FLAGS_NOFREQ,
29 	.address_space = 64,
30 };
31 
32 static struct platform_device dec_rtc_device = {
33 	.name = "rtc_cmos",
34 	.id = PLATFORM_DEVID_NONE,
35 	.dev.platform_data = &dec_rtc_info,
36 	.resource = dec_rtc_resources,
37 	.num_resources = ARRAY_SIZE(dec_rtc_resources),
38 };
39 
40 static struct resource dec_dz_resources[] = {
41 	{ .name = "dz", .flags = IORESOURCE_MEM, },
42 	{ .name = "dz", .flags = IORESOURCE_IRQ, },
43 };
44 
45 static struct platform_device dec_dz_device = {
46 	.name = "dz",
47 	.id = PLATFORM_DEVID_NONE,
48 	.resource = dec_dz_resources,
49 	.num_resources = ARRAY_SIZE(dec_dz_resources),
50 };
51 
52 static struct platform_device *dec_dz_devices[] __initdata = {
53 	&dec_dz_device,
54 };
55 
56 static int __init dec_add_devices(void)
57 {
58 	int ret1, ret2;
59 	int num_dz;
60 	int irq, i;
61 
62 	dec_rtc_resources[0].start = RTC_PORT(0);
63 	dec_rtc_resources[0].end = RTC_PORT(0) + dec_kn_slot_size - 1;
64 
65 	i = 0;
66 	irq = dec_interrupt[DEC_IRQ_DZ11];
67 	if (IS_ENABLED(CONFIG_32BIT) && irq >= 0) {
68 		resource_size_t base;
69 
70 		switch (mips_machtype) {
71 		case MACH_DS23100:
72 		case MACH_DS5100:
73 			base = dec_kn_slot_base + KN01_DZ11;
74 			break;
75 		default:
76 			base = dec_kn_slot_base + KN02_DZ11;
77 			break;
78 		}
79 		dec_dz_device.resource[0].start = base;
80 		dec_dz_device.resource[0].end = base + dec_kn_slot_size - 1;
81 		dec_dz_device.resource[1].start = irq;
82 		dec_dz_device.resource[1].end = irq;
83 		i++;
84 	}
85 	num_dz = i;
86 
87 	ret1 = platform_device_register(&dec_rtc_device);
88 	ret2 = IS_ENABLED(CONFIG_32BIT) ?
89 	       platform_add_devices(dec_dz_devices, num_dz) : 0;
90 	return ret1 ? ret1 : ret2;
91 }
92 
93 device_initcall(dec_add_devices);
94