| /* |
| * Copyright(C) MontaVista Software Inc, 2006 |
| * |
| * Author: dmitry pervushin <dpervushin@ru.mvista.com> |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License as published by |
| * the Free Software Foundation; either version 2 of the License, or |
| * (at your option) any later version. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| * |
| * You should have received a copy of the GNU General Public License |
| * along with this program; if not, write to the Free Software |
| * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| */ |
| #include <linux/init.h> |
| #include <linux/kernel.h> |
| #include <linux/types.h> |
| #include <linux/ioport.h> |
| #include <linux/serial_8250.h> |
| #include <linux/mtd/physmap.h> |
| |
| #include <asm/cpu.h> |
| #include <asm/bootinfo.h> |
| #include <asm/addrspace.h> |
| #include <asm/time.h> |
| #include <asm/bcache.h> |
| #include <asm/irq.h> |
| #include <asm/reboot.h> |
| #include <asm/traps.h> |
| |
| #include <asm/emma/emma2rh.h> |
| |
| |
| #define I2C_EMMA2RH "emma2rh-iic" /* must be in sync with IIC driver */ |
| |
| static struct resource i2c_emma_resources_0[] = { |
| { |
| .name = NULL, |
| .start = EMMA2RH_IRQ_PIIC0, |
| .end = EMMA2RH_IRQ_PIIC0, |
| .flags = IORESOURCE_IRQ |
| }, { |
| .name = NULL, |
| .start = EMMA2RH_PIIC0_BASE, |
| .end = EMMA2RH_PIIC0_BASE + 0x1000, |
| .flags = 0 |
| }, |
| }; |
| |
| struct resource i2c_emma_resources_1[] = { |
| { |
| .name = NULL, |
| .start = EMMA2RH_IRQ_PIIC1, |
| .end = EMMA2RH_IRQ_PIIC1, |
| .flags = IORESOURCE_IRQ |
| }, { |
| .name = NULL, |
| .start = EMMA2RH_PIIC1_BASE, |
| .end = EMMA2RH_PIIC1_BASE + 0x1000, |
| .flags = 0 |
| }, |
| }; |
| |
| struct resource i2c_emma_resources_2[] = { |
| { |
| .name = NULL, |
| .start = EMMA2RH_IRQ_PIIC2, |
| .end = EMMA2RH_IRQ_PIIC2, |
| .flags = IORESOURCE_IRQ |
| }, { |
| .name = NULL, |
| .start = EMMA2RH_PIIC2_BASE, |
| .end = EMMA2RH_PIIC2_BASE + 0x1000, |
| .flags = 0 |
| }, |
| }; |
| |
| struct platform_device i2c_emma_devices[] = { |
| [0] = { |
| .name = I2C_EMMA2RH, |
| .id = 0, |
| .resource = i2c_emma_resources_0, |
| .num_resources = ARRAY_SIZE(i2c_emma_resources_0), |
| }, |
| [1] = { |
| .name = I2C_EMMA2RH, |
| .id = 1, |
| .resource = i2c_emma_resources_1, |
| .num_resources = ARRAY_SIZE(i2c_emma_resources_1), |
| }, |
| [2] = { |
| .name = I2C_EMMA2RH, |
| .id = 2, |
| .resource = i2c_emma_resources_2, |
| .num_resources = ARRAY_SIZE(i2c_emma_resources_2), |
| }, |
| }; |
| |
| #define EMMA2RH_SERIAL_CLOCK 18544000 |
| #define EMMA2RH_SERIAL_FLAGS UPF_BOOT_AUTOCONF | UPF_SKIP_TEST |
| |
| static struct plat_serial8250_port platform_serial_ports[] = { |
| [0] = { |
| .membase= (void __iomem*)KSEG1ADDR(EMMA2RH_PFUR0_BASE + 3), |
| .mapbase = EMMA2RH_PFUR0_BASE + 3, |
| .irq = EMMA2RH_IRQ_PFUR0, |
| .uartclk = EMMA2RH_SERIAL_CLOCK, |
| .regshift = 4, |
| .iotype = UPIO_MEM, |
| .flags = EMMA2RH_SERIAL_FLAGS, |
| }, [1] = { |
| .membase = (void __iomem*)KSEG1ADDR(EMMA2RH_PFUR1_BASE + 3), |
| .mapbase = EMMA2RH_PFUR1_BASE + 3, |
| .irq = EMMA2RH_IRQ_PFUR1, |
| .uartclk = EMMA2RH_SERIAL_CLOCK, |
| .regshift = 4, |
| .iotype = UPIO_MEM, |
| .flags = EMMA2RH_SERIAL_FLAGS, |
| }, [2] = { |
| .membase = (void __iomem*)KSEG1ADDR(EMMA2RH_PFUR2_BASE + 3), |
| .mapbase = EMMA2RH_PFUR2_BASE + 3, |
| .irq = EMMA2RH_IRQ_PFUR2, |
| .uartclk = EMMA2RH_SERIAL_CLOCK, |
| .regshift = 4, |
| .iotype = UPIO_MEM, |
| .flags = EMMA2RH_SERIAL_FLAGS, |
| }, [3] = { |
| .flags = 0, |
| }, |
| }; |
| |
| static struct platform_device serial_emma = { |
| .name = "serial8250", |
| .dev = { |
| .platform_data = &platform_serial_ports, |
| }, |
| }; |
| |
| static struct mtd_partition markeins_parts[] = { |
| [0] = { |
| .name = "RootFS", |
| .offset = 0x00000000, |
| .size = 0x00c00000, |
| }, |
| [1] = { |
| .name = "boot code area", |
| .offset = MTDPART_OFS_APPEND, |
| .size = 0x00100000, |
| }, |
| [2] = { |
| .name = "kernel image", |
| .offset = MTDPART_OFS_APPEND, |
| .size = 0x00300000, |
| }, |
| [3] = { |
| .name = "RootFS2", |
| .offset = MTDPART_OFS_APPEND, |
| .size = 0x00c00000, |
| }, |
| [4] = { |
| .name = "boot code area2", |
| .offset = MTDPART_OFS_APPEND, |
| .size = 0x00100000, |
| }, |
| [5] = { |
| .name = "kernel image2", |
| .offset = MTDPART_OFS_APPEND, |
| .size = MTDPART_SIZ_FULL, |
| }, |
| }; |
| |
| static struct physmap_flash_data markeins_flash_data = { |
| .width = 2, |
| .nr_parts = ARRAY_SIZE(markeins_parts), |
| .parts = markeins_parts |
| }; |
| |
| static struct resource markeins_flash_resource = { |
| .start = 0x1e000000, |
| .end = 0x02000000, |
| .flags = IORESOURCE_MEM |
| }; |
| |
| static struct platform_device markeins_flash_device = { |
| .name = "physmap-flash", |
| .id = 0, |
| .dev = { |
| .platform_data = &markeins_flash_data, |
| }, |
| .num_resources = 1, |
| .resource = &markeins_flash_resource, |
| }; |
| |
| static struct platform_device *devices[] = { |
| i2c_emma_devices, |
| i2c_emma_devices + 1, |
| i2c_emma_devices + 2, |
| &serial_emma, |
| &markeins_flash_device, |
| }; |
| |
| static int __init platform_devices_setup(void) |
| { |
| return platform_add_devices(devices, ARRAY_SIZE(devices)); |
| } |
| |
| arch_initcall(platform_devices_setup); |