1/* 2 * Copyright(C) MontaVista Software Inc, 2006 3 * 4 * Author: dmitry pervushin <dpervushin@ru.mvista.com> 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation; either version 2 of the License, or 9 * (at your option) any later version. 10 * 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with this program; if not, write to the Free Software 18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 19 */ 20#include <linux/init.h> 21#include <linux/kernel.h> 22#include <linux/types.h> 23#include <linux/ioport.h> 24#include <linux/serial_8250.h> 25#include <linux/mtd/physmap.h> 26 27#include <asm/cpu.h> 28#include <asm/bootinfo.h> 29#include <asm/addrspace.h> 30#include <asm/time.h> 31#include <asm/bcache.h> 32#include <asm/irq.h> 33#include <asm/reboot.h> 34#include <asm/traps.h> 35 36#include <asm/emma/emma2rh.h> 37 38 39#define I2C_EMMA2RH "emma2rh-iic" /* must be in sync with IIC driver */ 40 41static struct resource i2c_emma_resources_0[] = { 42 { 43 .name = NULL, 44 .start = EMMA2RH_IRQ_PIIC0, 45 .end = EMMA2RH_IRQ_PIIC0, 46 .flags = IORESOURCE_IRQ 47 }, { 48 .name = NULL, 49 .start = EMMA2RH_PIIC0_BASE, 50 .end = EMMA2RH_PIIC0_BASE + 0x1000, 51 .flags = 0 52 }, 53}; 54 55struct resource i2c_emma_resources_1[] = { 56 { 57 .name = NULL, 58 .start = EMMA2RH_IRQ_PIIC1, 59 .end = EMMA2RH_IRQ_PIIC1, 60 .flags = IORESOURCE_IRQ 61 }, { 62 .name = NULL, 63 .start = EMMA2RH_PIIC1_BASE, 64 .end = EMMA2RH_PIIC1_BASE + 0x1000, 65 .flags = 0 66 }, 67}; 68 69struct resource i2c_emma_resources_2[] = { 70 { 71 .name = NULL, 72 .start = EMMA2RH_IRQ_PIIC2, 73 .end = EMMA2RH_IRQ_PIIC2, 74 .flags = IORESOURCE_IRQ 75 }, { 76 .name = NULL, 77 .start = EMMA2RH_PIIC2_BASE, 78 .end = EMMA2RH_PIIC2_BASE + 0x1000, 79 .flags = 0 80 }, 81}; 82 83struct platform_device i2c_emma_devices[] = { 84 [0] = { 85 .name = I2C_EMMA2RH, 86 .id = 0, 87 .resource = i2c_emma_resources_0, 88 .num_resources = ARRAY_SIZE(i2c_emma_resources_0), 89 }, 90 [1] = { 91 .name = I2C_EMMA2RH, 92 .id = 1, 93 .resource = i2c_emma_resources_1, 94 .num_resources = ARRAY_SIZE(i2c_emma_resources_1), 95 }, 96 [2] = { 97 .name = I2C_EMMA2RH, 98 .id = 2, 99 .resource = i2c_emma_resources_2, 100 .num_resources = ARRAY_SIZE(i2c_emma_resources_2), 101 }, 102}; 103 104#define EMMA2RH_SERIAL_CLOCK 18544000 105#define EMMA2RH_SERIAL_FLAGS UPF_BOOT_AUTOCONF | UPF_SKIP_TEST 106 107static struct plat_serial8250_port platform_serial_ports[] = { 108 [0] = { 109 .membase= (void __iomem*)KSEG1ADDR(EMMA2RH_PFUR0_BASE + 3), 110 .mapbase = EMMA2RH_PFUR0_BASE + 3, 111 .irq = EMMA2RH_IRQ_PFUR0, 112 .uartclk = EMMA2RH_SERIAL_CLOCK, 113 .regshift = 4, 114 .iotype = UPIO_MEM, 115 .flags = EMMA2RH_SERIAL_FLAGS, 116 }, [1] = { 117 .membase = (void __iomem*)KSEG1ADDR(EMMA2RH_PFUR1_BASE + 3), 118 .mapbase = EMMA2RH_PFUR1_BASE + 3, 119 .irq = EMMA2RH_IRQ_PFUR1, 120 .uartclk = EMMA2RH_SERIAL_CLOCK, 121 .regshift = 4, 122 .iotype = UPIO_MEM, 123 .flags = EMMA2RH_SERIAL_FLAGS, 124 }, [2] = { 125 .membase = (void __iomem*)KSEG1ADDR(EMMA2RH_PFUR2_BASE + 3), 126 .mapbase = EMMA2RH_PFUR2_BASE + 3, 127 .irq = EMMA2RH_IRQ_PFUR2, 128 .uartclk = EMMA2RH_SERIAL_CLOCK, 129 .regshift = 4, 130 .iotype = UPIO_MEM, 131 .flags = EMMA2RH_SERIAL_FLAGS, 132 }, [3] = { 133 .flags = 0, 134 }, 135}; 136 137static struct platform_device serial_emma = { 138 .name = "serial8250", 139 .dev = { 140 .platform_data = &platform_serial_ports, 141 }, 142}; 143 144static struct mtd_partition markeins_parts[] = { 145 [0] = { 146 .name = "RootFS", 147 .offset = 0x00000000, 148 .size = 0x00c00000, 149 }, 150 [1] = { 151 .name = "boot code area", 152 .offset = MTDPART_OFS_APPEND, 153 .size = 0x00100000, 154 }, 155 [2] = { 156 .name = "kernel image", 157 .offset = MTDPART_OFS_APPEND, 158 .size = 0x00300000, 159 }, 160 [3] = { 161 .name = "RootFS2", 162 .offset = MTDPART_OFS_APPEND, 163 .size = 0x00c00000, 164 }, 165 [4] = { 166 .name = "boot code area2", 167 .offset = MTDPART_OFS_APPEND, 168 .size = 0x00100000, 169 }, 170 [5] = { 171 .name = "kernel image2", 172 .offset = MTDPART_OFS_APPEND, 173 .size = MTDPART_SIZ_FULL, 174 }, 175}; 176 177static struct physmap_flash_data markeins_flash_data = { 178 .width = 2, 179 .nr_parts = ARRAY_SIZE(markeins_parts), 180 .parts = markeins_parts 181}; 182 183static struct resource markeins_flash_resource = { 184 .start = 0x1e000000, 185 .end = 0x02000000, 186 .flags = IORESOURCE_MEM 187}; 188 189static struct platform_device markeins_flash_device = { 190 .name = "physmap-flash", 191 .id = 0, 192 .dev = { 193 .platform_data = &markeins_flash_data, 194 }, 195 .num_resources = 1, 196 .resource = &markeins_flash_resource, 197}; 198 199static struct platform_device *devices[] = { 200 i2c_emma_devices, 201 i2c_emma_devices + 1, 202 i2c_emma_devices + 2, 203 &serial_emma, 204 &markeins_flash_device, 205}; 206 207static int __init platform_devices_setup(void) 208{ 209 return platform_add_devices(devices, ARRAY_SIZE(devices)); 210} 211 212arch_initcall(platform_devices_setup); 213