1/* 2 * linux/arch/arm/mach-pxa/pcm027.c 3 * Support for the Phytec phyCORE-PXA270 CPU card (aka PCM-027). 4 * 5 * Refer 6 * http://www.phytec.com/products/sbc/ARM-XScale/phyCORE-XScale-PXA270.html 7 * for additional hardware info 8 * 9 * Author: Juergen Kilb 10 * Created: April 05, 2005 11 * Copyright: Phytec Messtechnik GmbH 12 * e-Mail: armlinux@phytec.de 13 * 14 * based on Intel Mainstone Board 15 * 16 * Copyright 2007 Juergen Beisert @ Pengutronix (j.beisert@pengutronix.de) 17 * 18 * This program is free software; you can redistribute it and/or modify 19 * it under the terms of the GNU General Public License version 2 as 20 * published by the Free Software Foundation. 21 */ 22 23#include <linux/irq.h> 24#include <linux/platform_device.h> 25#include <linux/mtd/physmap.h> 26#include <linux/spi/spi.h> 27#include <linux/spi/max7301.h> 28#include <linux/leds.h> 29 30#include <asm/mach-types.h> 31#include <asm/mach/arch.h> 32#include <mach/pxa27x.h> 33#include <mach/pxa2xx_spi.h> 34#include <mach/pcm027.h> 35#include "generic.h" 36 37/* 38 * ABSTRACT: 39 * 40 * The PXA270 processor comes with a bunch of hardware on its silicon. 41 * Not all of this hardware can be used at the same time and not all 42 * is routed to module's connectors. Also it depends on the baseboard, what 43 * kind of hardware can be used in which way. 44 * -> So this file supports the main devices on the CPU card only! 45 * Refer pcm990-baseboard.c how to extend this features to get a full 46 * blown system with many common interfaces. 47 * 48 * The PCM-027 supports the following interfaces through its connectors and 49 * will be used in pcm990-baseboard.c: 50 * 51 * - LCD support 52 * - MMC support 53 * - IDE/CF card 54 * - FFUART 55 * - BTUART 56 * - IRUART 57 * - AC97 58 * - SSP 59 * - SSP3 60 * 61 * Claimed GPIOs: 62 * GPIO0 -> IRQ input from RTC 63 * GPIO2 -> SYS_ENA*) 64 * GPIO3 -> PWR_SCL 65 * GPIO4 -> PWR_SDA 66 * GPIO5 -> PowerCap0*) 67 * GPIO6 -> PowerCap1*) 68 * GPIO7 -> PowerCap2*) 69 * GPIO8 -> PowerCap3*) 70 * GPIO15 -> /CS1 71 * GPIO20 -> /CS2 72 * GPIO21 -> /CS3 73 * GPIO33 -> /CS5 network controller select 74 * GPIO52 -> IRQ from network controller 75 * GPIO78 -> /CS2 76 * GPIO80 -> /CS4 77 * GPIO90 -> LED0 78 * GPIO91 -> LED1 79 * GPIO114 -> IRQ from CAN controller 80 * GPIO117 -> SCL 81 * GPIO118 -> SDA 82 * 83 * *) CPU internal use only 84 */ 85 86static unsigned long pcm027_pin_config[] __initdata = { 87 /* Chip Selects */ 88 GPIO20_nSDCS_2, 89 GPIO21_nSDCS_3, 90 GPIO15_nCS_1, 91 GPIO78_nCS_2, 92 GPIO80_nCS_4, 93 GPIO33_nCS_5, /* Ethernet */ 94 95 /* I2C */ 96 GPIO117_I2C_SCL, 97 GPIO118_I2C_SDA, 98 99 /* GPIO */ 100 GPIO52_GPIO, /* IRQ from network controller */ 101#ifdef CONFIG_LEDS_GPIO 102 GPIO90_GPIO, /* PCM027_LED_CPU */ 103 GPIO91_GPIO, /* PCM027_LED_HEART_BEAT */ 104#endif 105 GPIO114_GPIO, /* IRQ from CAN controller */ 106}; 107 108/* 109 * SMC91x network controller specific stuff 110 */ 111static struct resource smc91x_resources[] = { 112 [0] = { 113 .start = PCM027_ETH_PHYS + 0x300, 114 .end = PCM027_ETH_PHYS + PCM027_ETH_SIZE, 115 .flags = IORESOURCE_MEM, 116 }, 117 [1] = { 118 .start = PCM027_ETH_IRQ, 119 .end = PCM027_ETH_IRQ, 120 /* note: smc91x's driver doesn't use the trigger bits yet */ 121 .flags = IORESOURCE_IRQ | PCM027_ETH_IRQ_EDGE, 122 } 123}; 124 125static struct platform_device smc91x_device = { 126 .name = "smc91x", 127 .id = 0, 128 .num_resources = ARRAY_SIZE(smc91x_resources), 129 .resource = smc91x_resources, 130}; 131 132/* 133 * SPI host and devices 134 */ 135static struct pxa2xx_spi_master pxa_ssp_master_info = { 136 .num_chipselect = 1, 137}; 138 139static struct max7301_platform_data max7301_info = { 140 .base = -1, 141}; 142 143/* bus_num must match id in pxa2xx_set_spi_info() call */ 144static struct spi_board_info spi_board_info[] __initdata = { 145 { 146 .modalias = "max7301", 147 .platform_data = &max7301_info, 148 .max_speed_hz = 13000000, 149 .bus_num = 1, 150 .chip_select = 0, 151 .mode = SPI_MODE_0, 152 }, 153}; 154 155/* 156 * NOR flash 157 */ 158static struct physmap_flash_data pcm027_flash_data = { 159 .width = 4, 160}; 161 162static struct resource pcm027_flash_resource = { 163 .start = PCM027_FLASH_PHYS, 164 .end = PCM027_FLASH_PHYS + PCM027_FLASH_SIZE - 1 , 165 .flags = IORESOURCE_MEM, 166}; 167 168static struct platform_device pcm027_flash = { 169 .name = "physmap-flash", 170 .id = 0, 171 .dev = { 172 .platform_data = &pcm027_flash_data, 173 }, 174 .resource = &pcm027_flash_resource, 175 .num_resources = 1, 176}; 177 178#ifdef CONFIG_LEDS_GPIO 179 180static struct gpio_led pcm027_led[] = { 181 { 182 .name = "led0:red", 183 .gpio = PCM027_LED_CPU 184 }, 185 { 186 .name = "led1:green", 187 .gpio = PCM027_LED_HEARD_BEAT 188 }, 189}; 190 191static struct gpio_led_platform_data pcm027_led_data = { 192 .num_leds = ARRAY_SIZE(pcm027_led), 193 .leds = pcm027_led 194}; 195 196static struct platform_device pcm027_led_dev = { 197 .name = "leds-gpio", 198 .id = 0, 199 .dev = { 200 .platform_data = &pcm027_led_data, 201 }, 202}; 203 204#endif /* CONFIG_LEDS_GPIO */ 205 206/* 207 * declare the available device resources on this board 208 */ 209static struct platform_device *devices[] __initdata = { 210 &smc91x_device, 211 &pcm027_flash, 212#ifdef CONFIG_LEDS_GPIO 213 &pcm027_led_dev 214#endif 215}; 216 217/* 218 * pcm027_init - breath some life into the board 219 */ 220static void __init pcm027_init(void) 221{ 222 /* system bus arbiter setting 223 * - Core_Park 224 * - LCD_wt:DMA_wt:CORE_Wt = 2:3:4 225 */ 226 ARB_CNTRL = ARB_CORE_PARK | 0x234; 227 228 pxa2xx_mfp_config(pcm027_pin_config, ARRAY_SIZE(pcm027_pin_config)); 229 230 pxa_set_ffuart_info(NULL); 231 pxa_set_btuart_info(NULL); 232 pxa_set_stuart_info(NULL); 233 234 platform_add_devices(devices, ARRAY_SIZE(devices)); 235 236 /* at last call the baseboard to initialize itself */ 237#ifdef CONFIG_MACH_PCM990_BASEBOARD 238 pcm990_baseboard_init(); 239#endif 240 241 pxa2xx_set_spi_info(1, &pxa_ssp_master_info); 242 spi_register_board_info(spi_board_info, ARRAY_SIZE(spi_board_info)); 243} 244 245static void __init pcm027_map_io(void) 246{ 247 pxa_map_io(); 248 249 /* initialize sleep mode regs (wake-up sources, etc) */ 250 PGSR0 = 0x01308000; 251 PGSR1 = 0x00CF0002; 252 PGSR2 = 0x0E294000; 253 PGSR3 = 0x0000C000; 254 PWER = 0x40000000 | PWER_GPIO0 | PWER_GPIO1; 255 PRER = 0x00000000; 256 PFER = 0x00000003; 257} 258 259MACHINE_START(PCM027, "Phytec Messtechnik GmbH phyCORE-PXA270") 260 /* Maintainer: Pengutronix */ 261 .boot_params = 0xa0000100, 262 .phys_io = 0x40000000, 263 .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, 264 .map_io = pcm027_map_io, 265 .init_irq = pxa27x_init_irq, 266 .timer = &pxa_timer, 267 .init_machine = pcm027_init, 268MACHINE_END 269