| /* |
| * Common devices definition for Gemini |
| * |
| * Copyright (C) 2008-2009 Paulius Zaleckas <paulius.zaleckas@teltonika.lt> |
| * |
| * 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 <linux/kernel.h> |
| #include <linux/init.h> |
| #include <linux/io.h> |
| #include <linux/platform_device.h> |
| #include <linux/serial_8250.h> |
| #include <linux/mtd/physmap.h> |
| |
| #include <mach/irqs.h> |
| #include <mach/hardware.h> |
| #include <mach/global_reg.h> |
| |
| static struct plat_serial8250_port serial_platform_data[] = { |
| { |
| .membase = (void *)IO_ADDRESS(GEMINI_UART_BASE), |
| .mapbase = GEMINI_UART_BASE, |
| .irq = IRQ_UART, |
| .uartclk = UART_CLK, |
| .regshift = 2, |
| .iotype = UPIO_MEM, |
| .type = PORT_16550A, |
| .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_FIXED_TYPE, |
| }, |
| {}, |
| }; |
| |
| static struct platform_device serial_device = { |
| .name = "serial8250", |
| .id = PLAT8250_DEV_PLATFORM, |
| .dev = { |
| .platform_data = serial_platform_data, |
| }, |
| }; |
| |
| int platform_register_uart(void) |
| { |
| return platform_device_register(&serial_device); |
| } |
| |
| static struct resource flash_resource = { |
| .start = GEMINI_FLASH_BASE, |
| .flags = IORESOURCE_MEM, |
| }; |
| |
| static struct physmap_flash_data pflash_platform_data = {}; |
| |
| static struct platform_device pflash_device = { |
| .name = "physmap-flash", |
| .id = 0, |
| .dev = { |
| .platform_data = &pflash_platform_data, |
| }, |
| .resource = &flash_resource, |
| .num_resources = 1, |
| }; |
| |
| int platform_register_pflash(unsigned int size, struct mtd_partition *parts, |
| unsigned int nr_parts) |
| { |
| unsigned int reg; |
| |
| reg = __raw_readl(IO_ADDRESS(GEMINI_GLOBAL_BASE) + GLOBAL_STATUS); |
| |
| if ((reg & FLASH_TYPE_MASK) != FLASH_TYPE_PARALLEL) |
| return -ENXIO; |
| |
| if (reg & FLASH_WIDTH_16BIT) |
| pflash_platform_data.width = 2; |
| else |
| pflash_platform_data.width = 1; |
| |
| /* enable parallel flash pins and disable others */ |
| reg = __raw_readl(IO_ADDRESS(GEMINI_GLOBAL_BASE) + GLOBAL_MISC_CTRL); |
| reg &= ~PFLASH_PADS_DISABLE; |
| reg |= SFLASH_PADS_DISABLE | NAND_PADS_DISABLE; |
| __raw_writel(reg, IO_ADDRESS(GEMINI_GLOBAL_BASE) + GLOBAL_MISC_CTRL); |
| |
| flash_resource.end = flash_resource.start + size - 1; |
| |
| pflash_platform_data.parts = parts; |
| pflash_platform_data.nr_parts = nr_parts; |
| |
| return platform_device_register(&pflash_device); |
| } |
| |
| static struct resource gemini_rtc_resources[] = { |
| [0] = { |
| .start = GEMINI_RTC_BASE, |
| .end = GEMINI_RTC_BASE + 0x24, |
| .flags = IORESOURCE_MEM, |
| }, |
| [1] = { |
| .start = IRQ_RTC, |
| .end = IRQ_RTC, |
| .flags = IORESOURCE_IRQ, |
| }, |
| }; |
| |
| static struct platform_device gemini_rtc_device = { |
| .name = "rtc-gemini", |
| .id = 0, |
| .num_resources = ARRAY_SIZE(gemini_rtc_resources), |
| .resource = gemini_rtc_resources, |
| }; |
| |
| int __init platform_register_rtc(void) |
| { |
| return platform_device_register(&gemini_rtc_device); |
| } |
| |