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