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