/* * linux/arch/arm/mach-integrator/core.c * * Copyright (C) 2000-2003 Deep Blue Solutions Ltd * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. */ #include #include #include #include #include #include #include #include #include #include static struct amba_device rtc_device = { .dev = { .bus_id = "mb:15", }, .res = { .start = INTEGRATOR_RTC_BASE, .end = INTEGRATOR_RTC_BASE + SZ_4K - 1, .flags = IORESOURCE_MEM, }, .irq = { IRQ_RTCINT, NO_IRQ }, .periphid = 0x00041030, }; static struct amba_device uart0_device = { .dev = { .bus_id = "mb:16", }, .res = { .start = INTEGRATOR_UART0_BASE, .end = INTEGRATOR_UART0_BASE + SZ_4K - 1, .flags = IORESOURCE_MEM, }, .irq = { IRQ_UARTINT0, NO_IRQ }, .periphid = 0x0041010, }; static struct amba_device uart1_device = { .dev = { .bus_id = "mb:17", }, .res = { .start = INTEGRATOR_UART1_BASE, .end = INTEGRATOR_UART1_BASE + SZ_4K - 1, .flags = IORESOURCE_MEM, }, .irq = { IRQ_UARTINT1, NO_IRQ }, .periphid = 0x0041010, }; static struct amba_device kmi0_device = { .dev = { .bus_id = "mb:18", }, .res = { .start = KMI0_BASE, .end = KMI0_BASE + SZ_4K - 1, .flags = IORESOURCE_MEM, }, .irq = { IRQ_KMIINT0, NO_IRQ }, .periphid = 0x00041050, }; static struct amba_device kmi1_device = { .dev = { .bus_id = "mb:19", }, .res = { .start = KMI1_BASE, .end = KMI1_BASE + SZ_4K - 1, .flags = IORESOURCE_MEM, }, .irq = { IRQ_KMIINT1, NO_IRQ }, .periphid = 0x00041050, }; static struct amba_device *amba_devs[] __initdata = { &rtc_device, &uart0_device, &uart1_device, &kmi0_device, &kmi1_device, }; static int __init integrator_init(void) { int i; for (i = 0; i < ARRAY_SIZE(amba_devs); i++) { struct amba_device *d = amba_devs[i]; amba_device_register(d, &iomem_resource); } return 0; } arch_initcall(integrator_init); #define CM_CTRL IO_ADDRESS(INTEGRATOR_HDR_BASE) + INTEGRATOR_HDR_CTRL_OFFSET static spinlock_t cm_lock; /** * cm_control - update the CM_CTRL register. * @mask: bits to change * @set: bits to set */ void cm_control(u32 mask, u32 set) { unsigned long flags; u32 val; spin_lock_irqsave(&cm_lock, flags); val = readl(CM_CTRL) & ~mask; writel(val | set, CM_CTRL); spin_unlock_irqrestore(&cm_lock, flags); } EXPORT_SYMBOL(cm_control);