1 /* 2 * arch/arm/mach-orion5x/kurobox_pro-setup.c 3 * 4 * Maintainer: Ronen Shitrit <rshitrit@marvell.com> 5 * 6 * This file is licensed under the terms of the GNU General Public 7 * License version 2. This program is licensed "as is" without any 8 * warranty of any kind, whether express or implied. 9 */ 10 11 #include <linux/kernel.h> 12 #include <linux/init.h> 13 #include <linux/platform_device.h> 14 #include <linux/pci.h> 15 #include <linux/irq.h> 16 #include <linux/mtd/physmap.h> 17 #include <linux/mtd/nand.h> 18 #include <linux/mv643xx_eth.h> 19 #include <linux/i2c.h> 20 #include <linux/ata_platform.h> 21 #include <asm/mach-types.h> 22 #include <asm/gpio.h> 23 #include <asm/mach/arch.h> 24 #include <asm/mach/pci.h> 25 #include <asm/arch/orion5x.h> 26 #include <asm/plat-orion/orion_nand.h> 27 #include "common.h" 28 29 /***************************************************************************** 30 * KUROBOX-PRO Info 31 ****************************************************************************/ 32 33 /* 34 * 256K NOR flash Device bus boot chip select 35 */ 36 37 #define KUROBOX_PRO_NOR_BOOT_BASE 0xf4000000 38 #define KUROBOX_PRO_NOR_BOOT_SIZE SZ_256K 39 40 /* 41 * 256M NAND flash on Device bus chip select 1 42 */ 43 44 #define KUROBOX_PRO_NAND_BASE 0xfc000000 45 #define KUROBOX_PRO_NAND_SIZE SZ_2M 46 47 /***************************************************************************** 48 * 256MB NAND Flash on Device bus CS0 49 ****************************************************************************/ 50 51 static struct mtd_partition kurobox_pro_nand_parts[] = { 52 { 53 .name = "uImage", 54 .offset = 0, 55 .size = SZ_4M, 56 }, 57 { 58 .name = "rootfs", 59 .offset = SZ_4M, 60 .size = SZ_64M, 61 }, 62 { 63 .name = "extra", 64 .offset = SZ_4M + SZ_64M, 65 .size = SZ_256M - (SZ_4M + SZ_64M), 66 }, 67 }; 68 69 static struct resource kurobox_pro_nand_resource = { 70 .flags = IORESOURCE_MEM, 71 .start = KUROBOX_PRO_NAND_BASE, 72 .end = KUROBOX_PRO_NAND_BASE + KUROBOX_PRO_NAND_SIZE - 1, 73 }; 74 75 static struct orion_nand_data kurobox_pro_nand_data = { 76 .parts = kurobox_pro_nand_parts, 77 .nr_parts = ARRAY_SIZE(kurobox_pro_nand_parts), 78 .cle = 0, 79 .ale = 1, 80 .width = 8, 81 }; 82 83 static struct platform_device kurobox_pro_nand_flash = { 84 .name = "orion_nand", 85 .id = -1, 86 .dev = { 87 .platform_data = &kurobox_pro_nand_data, 88 }, 89 .resource = &kurobox_pro_nand_resource, 90 .num_resources = 1, 91 }; 92 93 /***************************************************************************** 94 * 256KB NOR Flash on BOOT Device 95 ****************************************************************************/ 96 97 static struct physmap_flash_data kurobox_pro_nor_flash_data = { 98 .width = 1, 99 }; 100 101 static struct resource kurobox_pro_nor_flash_resource = { 102 .flags = IORESOURCE_MEM, 103 .start = KUROBOX_PRO_NOR_BOOT_BASE, 104 .end = KUROBOX_PRO_NOR_BOOT_BASE + KUROBOX_PRO_NOR_BOOT_SIZE - 1, 105 }; 106 107 static struct platform_device kurobox_pro_nor_flash = { 108 .name = "physmap-flash", 109 .id = 0, 110 .dev = { 111 .platform_data = &kurobox_pro_nor_flash_data, 112 }, 113 .num_resources = 1, 114 .resource = &kurobox_pro_nor_flash_resource, 115 }; 116 117 /***************************************************************************** 118 * PCI 119 ****************************************************************************/ 120 121 static int __init kurobox_pro_pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin) 122 { 123 int irq; 124 125 /* 126 * Check for devices with hard-wired IRQs. 127 */ 128 irq = orion5x_pci_map_irq(dev, slot, pin); 129 if (irq != -1) 130 return irq; 131 132 /* 133 * PCI isn't used on the Kuro 134 */ 135 printk(KERN_ERR "kurobox_pro_pci_map_irq failed, unknown bus\n"); 136 137 return -1; 138 } 139 140 static struct hw_pci kurobox_pro_pci __initdata = { 141 .nr_controllers = 2, 142 .swizzle = pci_std_swizzle, 143 .setup = orion5x_pci_sys_setup, 144 .scan = orion5x_pci_sys_scan_bus, 145 .map_irq = kurobox_pro_pci_map_irq, 146 }; 147 148 static int __init kurobox_pro_pci_init(void) 149 { 150 if (machine_is_kurobox_pro()) 151 pci_common_init(&kurobox_pro_pci); 152 153 return 0; 154 } 155 156 subsys_initcall(kurobox_pro_pci_init); 157 158 /***************************************************************************** 159 * Ethernet 160 ****************************************************************************/ 161 162 static struct mv643xx_eth_platform_data kurobox_pro_eth_data = { 163 .phy_addr = 8, 164 .force_phy_addr = 1, 165 }; 166 167 /***************************************************************************** 168 * RTC 5C372a on I2C bus 169 ****************************************************************************/ 170 static struct i2c_board_info __initdata kurobox_pro_i2c_rtc = { 171 I2C_BOARD_INFO("rs5c372a", 0x32), 172 }; 173 174 /***************************************************************************** 175 * SATA 176 ****************************************************************************/ 177 static struct mv_sata_platform_data kurobox_pro_sata_data = { 178 .n_ports = 2, 179 }; 180 181 /***************************************************************************** 182 * General Setup 183 ****************************************************************************/ 184 185 static void __init kurobox_pro_init(void) 186 { 187 /* 188 * Setup basic Orion functions. Need to be called early. 189 */ 190 orion5x_init(); 191 192 /* 193 * Setup the CPU address decode windows for our devices 194 */ 195 orion5x_setup_dev_boot_win(KUROBOX_PRO_NOR_BOOT_BASE, 196 KUROBOX_PRO_NOR_BOOT_SIZE); 197 orion5x_setup_dev0_win(KUROBOX_PRO_NAND_BASE, KUROBOX_PRO_NAND_SIZE); 198 199 /* 200 * Open a special address decode windows for the PCIe WA. 201 */ 202 orion5x_setup_pcie_wa_win(ORION5X_PCIE_WA_PHYS_BASE, 203 ORION5X_PCIE_WA_SIZE); 204 205 /* 206 * Setup Multiplexing Pins -- 207 * MPP[0-1] Not used 208 * MPP[2] GPIO Micon 209 * MPP[3] GPIO RTC 210 * MPP[4-5] Not used 211 * MPP[6] Nand Flash REn 212 * MPP[7] Nand Flash WEn 213 * MPP[8-11] Not used 214 * MPP[12] SATA 0 presence Indication 215 * MPP[13] SATA 1 presence Indication 216 * MPP[14] SATA 0 active Indication 217 * MPP[15] SATA 1 active indication 218 * MPP[16-19] Not used 219 */ 220 orion5x_write(MPP_0_7_CTRL, 0x44220003); 221 orion5x_write(MPP_8_15_CTRL, 0x55550000); 222 orion5x_write(MPP_16_19_CTRL, 0x0); 223 224 orion5x_gpio_set_valid_pins(0x0000000c); 225 226 platform_device_register(&kurobox_pro_nor_flash); 227 if (machine_is_kurobox_pro()) 228 platform_device_register(&kurobox_pro_nand_flash); 229 i2c_register_board_info(0, &kurobox_pro_i2c_rtc, 1); 230 orion5x_eth_init(&kurobox_pro_eth_data); 231 orion5x_sata_init(&kurobox_pro_sata_data); 232 } 233 234 #ifdef CONFIG_MACH_KUROBOX_PRO 235 MACHINE_START(KUROBOX_PRO, "Buffalo/Revogear Kurobox Pro") 236 /* Maintainer: Ronen Shitrit <rshitrit@marvell.com> */ 237 .phys_io = ORION5X_REGS_PHYS_BASE, 238 .io_pg_offst = ((ORION5X_REGS_VIRT_BASE) >> 18) & 0xFFFC, 239 .boot_params = 0x00000100, 240 .init_machine = kurobox_pro_init, 241 .map_io = orion5x_map_io, 242 .init_irq = orion5x_init_irq, 243 .timer = &orion5x_timer, 244 .fixup = tag_fixup_mem32, 245 MACHINE_END 246 #endif 247 248 #ifdef CONFIG_MACH_LINKSTATION_PRO 249 MACHINE_START(LINKSTATION_PRO, "Buffalo Linkstation Pro/Live") 250 /* Maintainer: Byron Bradley <byron.bbradley@gmail.com> */ 251 .phys_io = ORION5X_REGS_PHYS_BASE, 252 .io_pg_offst = ((ORION5X_REGS_VIRT_BASE) >> 18) & 0xFFFC, 253 .boot_params = 0x00000100, 254 .init_machine = kurobox_pro_init, 255 .map_io = orion5x_map_io, 256 .init_irq = orion5x_init_irq, 257 .timer = &orion5x_timer, 258 .fixup = tag_fixup_mem32, 259 MACHINE_END 260 #endif 261