mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
138 lines
3.0 KiB
138 lines
3.0 KiB
/* |
|
* This file is subject to the terms and conditions of the GNU General Public |
|
* License. See the file "COPYING" in the main directory of this archive |
|
* for more details. |
|
* |
|
* Copyright (C) 2007 Ralf Baechle ([email protected]) |
|
*/ |
|
#include <linux/init.h> |
|
#include <linux/platform_device.h> |
|
#include <linux/serial_8250.h> |
|
#include <linux/rtc/ds1685.h> |
|
|
|
#include <asm/ip32/mace.h> |
|
#include <asm/ip32/ip32_ints.h> |
|
|
|
extern void ip32_prepare_poweroff(void); |
|
|
|
#define MACEISA_SERIAL1_OFFS offsetof(struct sgi_mace, isa.serial1) |
|
#define MACEISA_SERIAL2_OFFS offsetof(struct sgi_mace, isa.serial2) |
|
|
|
#define MACE_PORT(offset,_irq) \ |
|
{ \ |
|
.mapbase = MACE_BASE + offset, \ |
|
.irq = _irq, \ |
|
.uartclk = 1843200, \ |
|
.iotype = UPIO_MEM, \ |
|
.flags = UPF_SKIP_TEST|UPF_IOREMAP, \ |
|
.regshift = 8, \ |
|
} |
|
|
|
static struct plat_serial8250_port uart8250_data[] = { |
|
MACE_PORT(MACEISA_SERIAL1_OFFS, MACEISA_SERIAL1_IRQ), |
|
MACE_PORT(MACEISA_SERIAL2_OFFS, MACEISA_SERIAL2_IRQ), |
|
{ }, |
|
}; |
|
|
|
static struct platform_device uart8250_device = { |
|
.name = "serial8250", |
|
.id = PLAT8250_DEV_PLATFORM, |
|
.dev = { |
|
.platform_data = uart8250_data, |
|
}, |
|
}; |
|
|
|
static int __init uart8250_init(void) |
|
{ |
|
return platform_device_register(&uart8250_device); |
|
} |
|
|
|
device_initcall(uart8250_init); |
|
|
|
static __init int meth_devinit(void) |
|
{ |
|
struct platform_device *pd; |
|
int ret; |
|
|
|
pd = platform_device_alloc("meth", -1); |
|
if (!pd) |
|
return -ENOMEM; |
|
|
|
ret = platform_device_add(pd); |
|
if (ret) |
|
platform_device_put(pd); |
|
|
|
return ret; |
|
} |
|
|
|
device_initcall(meth_devinit); |
|
|
|
static __init int sgio2audio_devinit(void) |
|
{ |
|
struct platform_device *pd; |
|
int ret; |
|
|
|
pd = platform_device_alloc("sgio2audio", -1); |
|
if (!pd) |
|
return -ENOMEM; |
|
|
|
ret = platform_device_add(pd); |
|
if (ret) |
|
platform_device_put(pd); |
|
|
|
return ret; |
|
} |
|
|
|
device_initcall(sgio2audio_devinit); |
|
|
|
static __init int sgio2btns_devinit(void) |
|
{ |
|
return IS_ERR(platform_device_register_simple("sgibtns", -1, NULL, 0)); |
|
} |
|
|
|
device_initcall(sgio2btns_devinit); |
|
|
|
#define MACE_RTC_RES_START (MACE_BASE + offsetof(struct sgi_mace, isa.rtc)) |
|
#define MACE_RTC_RES_END (MACE_RTC_RES_START + 32767) |
|
|
|
static struct resource ip32_rtc_resources[] = { |
|
{ |
|
.start = MACEISA_RTC_IRQ, |
|
.end = MACEISA_RTC_IRQ, |
|
.flags = IORESOURCE_IRQ |
|
}, { |
|
.start = MACE_RTC_RES_START, |
|
.end = MACE_RTC_RES_END, |
|
.flags = IORESOURCE_MEM, |
|
} |
|
}; |
|
|
|
/* RTC registers on IP32 are each padded by 256 bytes (0x100). */ |
|
static struct ds1685_rtc_platform_data |
|
ip32_rtc_platform_data[] = { |
|
{ |
|
.regstep = 0x100, |
|
.bcd_mode = true, |
|
.no_irq = false, |
|
.uie_unsupported = false, |
|
.access_type = ds1685_reg_direct, |
|
.plat_prepare_poweroff = ip32_prepare_poweroff, |
|
}, |
|
}; |
|
|
|
struct platform_device ip32_rtc_device = { |
|
.name = "rtc-ds1685", |
|
.id = -1, |
|
.dev = { |
|
.platform_data = ip32_rtc_platform_data, |
|
}, |
|
.num_resources = ARRAY_SIZE(ip32_rtc_resources), |
|
.resource = ip32_rtc_resources, |
|
}; |
|
|
|
static __init int sgio2_rtc_devinit(void) |
|
{ |
|
return platform_device_register(&ip32_rtc_device); |
|
} |
|
|
|
device_initcall(sgio2_rtc_devinit);
|
|
|