162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * This file is subject to the terms and conditions of the GNU General Public 362306a36Sopenharmony_ci * License. See the file "COPYING" in the main directory of this archive 462306a36Sopenharmony_ci * for more details. 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * Copyright (C) 2007 Ralf Baechle (ralf@linux-mips.org) 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci#include <linux/init.h> 962306a36Sopenharmony_ci#include <linux/platform_device.h> 1062306a36Sopenharmony_ci#include <linux/serial_8250.h> 1162306a36Sopenharmony_ci#include <linux/rtc/ds1685.h> 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#include <asm/ip32/mace.h> 1462306a36Sopenharmony_ci#include <asm/ip32/ip32_ints.h> 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ciextern void ip32_prepare_poweroff(void); 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#define MACEISA_SERIAL1_OFFS offsetof(struct sgi_mace, isa.serial1) 1962306a36Sopenharmony_ci#define MACEISA_SERIAL2_OFFS offsetof(struct sgi_mace, isa.serial2) 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci#define MACE_PORT(offset,_irq) \ 2262306a36Sopenharmony_ci{ \ 2362306a36Sopenharmony_ci .mapbase = MACE_BASE + offset, \ 2462306a36Sopenharmony_ci .irq = _irq, \ 2562306a36Sopenharmony_ci .uartclk = 1843200, \ 2662306a36Sopenharmony_ci .iotype = UPIO_MEM, \ 2762306a36Sopenharmony_ci .flags = UPF_SKIP_TEST|UPF_IOREMAP, \ 2862306a36Sopenharmony_ci .regshift = 8, \ 2962306a36Sopenharmony_ci} 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_cistatic struct plat_serial8250_port uart8250_data[] = { 3262306a36Sopenharmony_ci MACE_PORT(MACEISA_SERIAL1_OFFS, MACEISA_SERIAL1_IRQ), 3362306a36Sopenharmony_ci MACE_PORT(MACEISA_SERIAL2_OFFS, MACEISA_SERIAL2_IRQ), 3462306a36Sopenharmony_ci { }, 3562306a36Sopenharmony_ci}; 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_cistatic struct platform_device uart8250_device = { 3862306a36Sopenharmony_ci .name = "serial8250", 3962306a36Sopenharmony_ci .id = PLAT8250_DEV_PLATFORM, 4062306a36Sopenharmony_ci .dev = { 4162306a36Sopenharmony_ci .platform_data = uart8250_data, 4262306a36Sopenharmony_ci }, 4362306a36Sopenharmony_ci}; 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_cistatic int __init uart8250_init(void) 4662306a36Sopenharmony_ci{ 4762306a36Sopenharmony_ci return platform_device_register(&uart8250_device); 4862306a36Sopenharmony_ci} 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_cidevice_initcall(uart8250_init); 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_cistatic __init int meth_devinit(void) 5362306a36Sopenharmony_ci{ 5462306a36Sopenharmony_ci struct platform_device *pd; 5562306a36Sopenharmony_ci int ret; 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci pd = platform_device_alloc("meth", -1); 5862306a36Sopenharmony_ci if (!pd) 5962306a36Sopenharmony_ci return -ENOMEM; 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci ret = platform_device_add(pd); 6262306a36Sopenharmony_ci if (ret) 6362306a36Sopenharmony_ci platform_device_put(pd); 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci return ret; 6662306a36Sopenharmony_ci} 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_cidevice_initcall(meth_devinit); 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_cistatic __init int sgio2audio_devinit(void) 7162306a36Sopenharmony_ci{ 7262306a36Sopenharmony_ci struct platform_device *pd; 7362306a36Sopenharmony_ci int ret; 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci pd = platform_device_alloc("sgio2audio", -1); 7662306a36Sopenharmony_ci if (!pd) 7762306a36Sopenharmony_ci return -ENOMEM; 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ci ret = platform_device_add(pd); 8062306a36Sopenharmony_ci if (ret) 8162306a36Sopenharmony_ci platform_device_put(pd); 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci return ret; 8462306a36Sopenharmony_ci} 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_cidevice_initcall(sgio2audio_devinit); 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_cistatic __init int sgio2btns_devinit(void) 8962306a36Sopenharmony_ci{ 9062306a36Sopenharmony_ci return IS_ERR(platform_device_register_simple("sgibtns", -1, NULL, 0)); 9162306a36Sopenharmony_ci} 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_cidevice_initcall(sgio2btns_devinit); 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_ci#define MACE_RTC_RES_START (MACE_BASE + offsetof(struct sgi_mace, isa.rtc)) 9662306a36Sopenharmony_ci#define MACE_RTC_RES_END (MACE_RTC_RES_START + 32767) 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_cistatic struct resource ip32_rtc_resources[] = { 9962306a36Sopenharmony_ci { 10062306a36Sopenharmony_ci .start = MACEISA_RTC_IRQ, 10162306a36Sopenharmony_ci .end = MACEISA_RTC_IRQ, 10262306a36Sopenharmony_ci .flags = IORESOURCE_IRQ 10362306a36Sopenharmony_ci }, { 10462306a36Sopenharmony_ci .start = MACE_RTC_RES_START, 10562306a36Sopenharmony_ci .end = MACE_RTC_RES_END, 10662306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 10762306a36Sopenharmony_ci } 10862306a36Sopenharmony_ci}; 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_ci/* RTC registers on IP32 are each padded by 256 bytes (0x100). */ 11162306a36Sopenharmony_cistatic struct ds1685_rtc_platform_data 11262306a36Sopenharmony_ciip32_rtc_platform_data[] = { 11362306a36Sopenharmony_ci { 11462306a36Sopenharmony_ci .regstep = 0x100, 11562306a36Sopenharmony_ci .bcd_mode = true, 11662306a36Sopenharmony_ci .no_irq = false, 11762306a36Sopenharmony_ci .uie_unsupported = false, 11862306a36Sopenharmony_ci .access_type = ds1685_reg_direct, 11962306a36Sopenharmony_ci .plat_prepare_poweroff = ip32_prepare_poweroff, 12062306a36Sopenharmony_ci }, 12162306a36Sopenharmony_ci}; 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_cistruct platform_device ip32_rtc_device = { 12462306a36Sopenharmony_ci .name = "rtc-ds1685", 12562306a36Sopenharmony_ci .id = -1, 12662306a36Sopenharmony_ci .dev = { 12762306a36Sopenharmony_ci .platform_data = ip32_rtc_platform_data, 12862306a36Sopenharmony_ci }, 12962306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(ip32_rtc_resources), 13062306a36Sopenharmony_ci .resource = ip32_rtc_resources, 13162306a36Sopenharmony_ci}; 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_cistatic __init int sgio2_rtc_devinit(void) 13462306a36Sopenharmony_ci{ 13562306a36Sopenharmony_ci return platform_device_register(&ip32_rtc_device); 13662306a36Sopenharmony_ci} 13762306a36Sopenharmony_ci 13862306a36Sopenharmony_cidevice_initcall(sgio2_rtc_devinit); 139