| // SPDX-License-Identifier: GPL-2.0-only |
| /* |
| * linux/arch/arm/mach-pxa/pcm027.c |
| * Support for the Phytec phyCORE-PXA270 CPU card (aka PCM-027). |
| * |
| * Refer |
| * http://www.phytec.com/products/sbc/ARM-XScale/phyCORE-XScale-PXA270.html |
| * for additional hardware info |
| * |
| * Author: Juergen Kilb |
| * Created: April 05, 2005 |
| * Copyright: Phytec Messtechnik GmbH |
| * e-Mail: armlinux@phytec.de |
| * |
| * based on Intel Mainstone Board |
| * |
| * Copyright 2007 Juergen Beisert @ Pengutronix (j.beisert@pengutronix.de) |
| */ |
| |
| #include <linux/irq.h> |
| #include <linux/platform_device.h> |
| #include <linux/mtd/physmap.h> |
| #include <linux/spi/spi.h> |
| #include <linux/spi/max7301.h> |
| #include <linux/spi/pxa2xx_spi.h> |
| #include <linux/leds.h> |
| |
| #include <asm/mach-types.h> |
| #include <asm/mach/arch.h> |
| #include "pxa27x.h" |
| #include "pcm027.h" |
| #include "generic.h" |
| |
| /* |
| * ABSTRACT: |
| * |
| * The PXA270 processor comes with a bunch of hardware on its silicon. |
| * Not all of this hardware can be used at the same time and not all |
| * is routed to module's connectors. Also it depends on the baseboard, what |
| * kind of hardware can be used in which way. |
| * -> So this file supports the main devices on the CPU card only! |
| * Refer pcm990-baseboard.c how to extend this features to get a full |
| * blown system with many common interfaces. |
| * |
| * The PCM-027 supports the following interfaces through its connectors and |
| * will be used in pcm990-baseboard.c: |
| * |
| * - LCD support |
| * - MMC support |
| * - IDE/CF card |
| * - FFUART |
| * - BTUART |
| * - IRUART |
| * - AC97 |
| * - SSP |
| * - SSP3 |
| * |
| * Claimed GPIOs: |
| * GPIO0 -> IRQ input from RTC |
| * GPIO2 -> SYS_ENA*) |
| * GPIO3 -> PWR_SCL |
| * GPIO4 -> PWR_SDA |
| * GPIO5 -> PowerCap0*) |
| * GPIO6 -> PowerCap1*) |
| * GPIO7 -> PowerCap2*) |
| * GPIO8 -> PowerCap3*) |
| * GPIO15 -> /CS1 |
| * GPIO20 -> /CS2 |
| * GPIO21 -> /CS3 |
| * GPIO33 -> /CS5 network controller select |
| * GPIO52 -> IRQ from network controller |
| * GPIO78 -> /CS2 |
| * GPIO80 -> /CS4 |
| * GPIO90 -> LED0 |
| * GPIO91 -> LED1 |
| * GPIO114 -> IRQ from CAN controller |
| * GPIO117 -> SCL |
| * GPIO118 -> SDA |
| * |
| * *) CPU internal use only |
| */ |
| |
| static unsigned long pcm027_pin_config[] __initdata = { |
| /* Chip Selects */ |
| GPIO20_nSDCS_2, |
| GPIO21_nSDCS_3, |
| GPIO15_nCS_1, |
| GPIO78_nCS_2, |
| GPIO80_nCS_4, |
| GPIO33_nCS_5, /* Ethernet */ |
| |
| /* I2C */ |
| GPIO117_I2C_SCL, |
| GPIO118_I2C_SDA, |
| |
| /* GPIO */ |
| GPIO52_GPIO, /* IRQ from network controller */ |
| #ifdef CONFIG_LEDS_GPIO |
| GPIO90_GPIO, /* PCM027_LED_CPU */ |
| GPIO91_GPIO, /* PCM027_LED_HEART_BEAT */ |
| #endif |
| GPIO114_GPIO, /* IRQ from CAN controller */ |
| }; |
| |
| /* |
| * SMC91x network controller specific stuff |
| */ |
| static struct resource smc91x_resources[] = { |
| [0] = { |
| .start = PCM027_ETH_PHYS + 0x300, |
| .end = PCM027_ETH_PHYS + PCM027_ETH_SIZE, |
| .flags = IORESOURCE_MEM, |
| }, |
| [1] = { |
| .start = PCM027_ETH_IRQ, |
| .end = PCM027_ETH_IRQ, |
| /* note: smc91x's driver doesn't use the trigger bits yet */ |
| .flags = IORESOURCE_IRQ | PCM027_ETH_IRQ_EDGE, |
| } |
| }; |
| |
| static struct platform_device smc91x_device = { |
| .name = "smc91x", |
| .id = 0, |
| .num_resources = ARRAY_SIZE(smc91x_resources), |
| .resource = smc91x_resources, |
| }; |
| |
| /* |
| * SPI host and devices |
| */ |
| static struct pxa2xx_spi_controller pxa_ssp_master_info = { |
| .num_chipselect = 1, |
| }; |
| |
| static struct max7301_platform_data max7301_info = { |
| .base = -1, |
| }; |
| |
| /* bus_num must match id in pxa2xx_set_spi_info() call */ |
| static struct spi_board_info spi_board_info[] __initdata = { |
| { |
| .modalias = "max7301", |
| .platform_data = &max7301_info, |
| .max_speed_hz = 13000000, |
| .bus_num = 1, |
| .chip_select = 0, |
| .mode = SPI_MODE_0, |
| }, |
| }; |
| |
| /* |
| * NOR flash |
| */ |
| static struct physmap_flash_data pcm027_flash_data = { |
| .width = 4, |
| }; |
| |
| static struct resource pcm027_flash_resource = { |
| .start = PCM027_FLASH_PHYS, |
| .end = PCM027_FLASH_PHYS + PCM027_FLASH_SIZE - 1 , |
| .flags = IORESOURCE_MEM, |
| }; |
| |
| static struct platform_device pcm027_flash = { |
| .name = "physmap-flash", |
| .id = 0, |
| .dev = { |
| .platform_data = &pcm027_flash_data, |
| }, |
| .resource = &pcm027_flash_resource, |
| .num_resources = 1, |
| }; |
| |
| #ifdef CONFIG_LEDS_GPIO |
| |
| static struct gpio_led pcm027_led[] = { |
| { |
| .name = "led0:red", /* FIXME */ |
| .gpio = PCM027_LED_CPU |
| }, |
| { |
| .name = "led1:green", /* FIXME */ |
| .gpio = PCM027_LED_HEARD_BEAT |
| }, |
| }; |
| |
| static struct gpio_led_platform_data pcm027_led_data = { |
| .num_leds = ARRAY_SIZE(pcm027_led), |
| .leds = pcm027_led |
| }; |
| |
| static struct platform_device pcm027_led_dev = { |
| .name = "leds-gpio", |
| .id = 0, |
| .dev = { |
| .platform_data = &pcm027_led_data, |
| }, |
| }; |
| |
| #endif /* CONFIG_LEDS_GPIO */ |
| |
| /* |
| * declare the available device resources on this board |
| */ |
| static struct platform_device *devices[] __initdata = { |
| &smc91x_device, |
| &pcm027_flash, |
| #ifdef CONFIG_LEDS_GPIO |
| &pcm027_led_dev |
| #endif |
| }; |
| |
| /* |
| * pcm027_init - breath some life into the board |
| */ |
| static void __init pcm027_init(void) |
| { |
| /* system bus arbiter setting |
| * - Core_Park |
| * - LCD_wt:DMA_wt:CORE_Wt = 2:3:4 |
| */ |
| ARB_CNTRL = ARB_CORE_PARK | 0x234; |
| |
| pxa2xx_mfp_config(pcm027_pin_config, ARRAY_SIZE(pcm027_pin_config)); |
| |
| pxa_set_ffuart_info(NULL); |
| pxa_set_btuart_info(NULL); |
| pxa_set_stuart_info(NULL); |
| |
| platform_add_devices(devices, ARRAY_SIZE(devices)); |
| |
| /* at last call the baseboard to initialize itself */ |
| #ifdef CONFIG_MACH_PCM990_BASEBOARD |
| pcm990_baseboard_init(); |
| #endif |
| |
| pxa2xx_set_spi_info(1, &pxa_ssp_master_info); |
| spi_register_board_info(spi_board_info, ARRAY_SIZE(spi_board_info)); |
| } |
| |
| static void __init pcm027_map_io(void) |
| { |
| pxa27x_map_io(); |
| |
| /* initialize sleep mode regs (wake-up sources, etc) */ |
| PGSR0 = 0x01308000; |
| PGSR1 = 0x00CF0002; |
| PGSR2 = 0x0E294000; |
| PGSR3 = 0x0000C000; |
| PWER = 0x40000000 | PWER_GPIO0 | PWER_GPIO1; |
| PRER = 0x00000000; |
| PFER = 0x00000003; |
| } |
| |
| MACHINE_START(PCM027, "Phytec Messtechnik GmbH phyCORE-PXA270") |
| /* Maintainer: Pengutronix */ |
| .atag_offset = 0x100, |
| .map_io = pcm027_map_io, |
| .nr_irqs = PCM027_NR_IRQS, |
| .init_irq = pxa27x_init_irq, |
| .handle_irq = pxa27x_handle_irq, |
| .init_time = pxa_timer_init, |
| .init_machine = pcm027_init, |
| .restart = pxa_restart, |
| MACHINE_END |