Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ARM: vexpress: Remove non-DT code

Now, with the CLCD DT support available, there is no
more reason to keep the non-DT support for V2P-CA9.

Removed, together with "some" supporting code. It was
necessary to make PLAT_VERSATILE_SCHED_CLOCK optional
and selected by the machines still interested in it.

Acked-by: Mike Turquette <mturquette@linaro.org>
Signed-off-by: Pawel Moll <pawel.moll@arm.com>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>

authored by

Pawel Moll and committed by
Arnd Bergmann
81cc3f86 ad77b791

+16 -942
+2
arch/arm/Kconfig
··· 350 350 select ICST 351 351 select NEED_MACH_MEMORY_H 352 352 select PLAT_VERSATILE 353 + select PLAT_VERSATILE_SCHED_CLOCK 353 354 help 354 355 This enables support for ARM Ltd RealView boards. 355 356 ··· 366 365 select ICST 367 366 select PLAT_VERSATILE 368 367 select PLAT_VERSATILE_CLOCK 368 + select PLAT_VERSATILE_SCHED_CLOCK 369 369 select VERSATILE_FPGA_IRQ 370 370 help 371 371 This enables support for ARM Ltd Versatile board.
-3
arch/arm/mach-vexpress/Kconfig
··· 49 49 build a working kernel, you must also enable relevant core 50 50 tile support or Flattened Device Tree based support options. 51 51 52 - config ARCH_VEXPRESS_CA9X4 53 - bool "Versatile Express Cortex-A9x4 tile" 54 - 55 52 config ARCH_VEXPRESS_DCSCB 56 53 bool "Dual Cluster System Control Block (DCSCB) support" 57 54 depends on MCPM
+1 -2
arch/arm/mach-vexpress/Makefile
··· 1 1 # 2 2 # Makefile for the linux kernel. 3 3 # 4 - ccflags-$(CONFIG_ARCH_MULTIPLATFORM) := -I$(srctree)/$(src)/include \ 4 + ccflags-$(CONFIG_ARCH_MULTIPLATFORM) := \ 5 5 -I$(srctree)/arch/arm/plat-versatile/include 6 6 7 7 obj-y := v2m.o 8 - obj-$(CONFIG_ARCH_VEXPRESS_CA9X4) += ct-ca9x4.o 9 8 obj-$(CONFIG_ARCH_VEXPRESS_DCSCB) += dcscb.o dcscb_setup.o 10 9 CFLAGS_dcscb.o += -march=armv7-a 11 10 CFLAGS_REMOVE_dcscb.o = -pg
-7
arch/arm/mach-vexpress/core.h
··· 1 - /* 2MB large area for motherboard's peripherals static mapping */ 2 - #define V2M_PERIPH 0xf8000000 3 - 4 - /* Tile's peripherals static mappings should start here */ 5 - #define V2T_PERIPH 0xf8200000 6 - 7 1 bool vexpress_smp_init_ops(void); 8 2 9 - extern struct smp_operations vexpress_smp_ops; 10 3 extern struct smp_operations vexpress_smp_dt_ops; 11 4 12 5 extern void vexpress_cpu_die(unsigned int cpu);
-212
arch/arm/mach-vexpress/ct-ca9x4.c
··· 1 - /* 2 - * Versatile Express Core Tile Cortex A9x4 Support 3 - */ 4 - #include <linux/init.h> 5 - #include <linux/gfp.h> 6 - #include <linux/device.h> 7 - #include <linux/dma-mapping.h> 8 - #include <linux/platform_device.h> 9 - #include <linux/amba/bus.h> 10 - #include <linux/amba/clcd.h> 11 - #include <linux/platform_data/video-clcd-versatile.h> 12 - #include <linux/clkdev.h> 13 - #include <linux/vexpress.h> 14 - #include <linux/irqchip/arm-gic.h> 15 - 16 - #include <asm/hardware/arm_timer.h> 17 - #include <asm/hardware/cache-l2x0.h> 18 - #include <asm/smp_scu.h> 19 - #include <asm/smp_twd.h> 20 - 21 - #include <mach/ct-ca9x4.h> 22 - 23 - #include <asm/hardware/timer-sp.h> 24 - 25 - #include <asm/mach/map.h> 26 - #include <asm/mach/time.h> 27 - 28 - #include "core.h" 29 - 30 - #include <mach/motherboard.h> 31 - #include <mach/irqs.h> 32 - 33 - static struct map_desc ct_ca9x4_io_desc[] __initdata = { 34 - { 35 - .virtual = V2T_PERIPH, 36 - .pfn = __phys_to_pfn(CT_CA9X4_MPIC), 37 - .length = SZ_8K, 38 - .type = MT_DEVICE, 39 - }, 40 - }; 41 - 42 - static void __init ct_ca9x4_map_io(void) 43 - { 44 - iotable_init(ct_ca9x4_io_desc, ARRAY_SIZE(ct_ca9x4_io_desc)); 45 - } 46 - 47 - static void __init ca9x4_l2_init(void) 48 - { 49 - #ifdef CONFIG_CACHE_L2X0 50 - void __iomem *l2x0_base = ioremap(CT_CA9X4_L2CC, SZ_4K); 51 - 52 - if (l2x0_base) { 53 - /* set RAM latencies to 1 cycle for this core tile. */ 54 - writel(0, l2x0_base + L310_TAG_LATENCY_CTRL); 55 - writel(0, l2x0_base + L310_DATA_LATENCY_CTRL); 56 - 57 - l2x0_init(l2x0_base, 0x00400000, 0xfe0fffff); 58 - } else { 59 - pr_err("L2C: unable to map L2 cache controller\n"); 60 - } 61 - #endif 62 - } 63 - 64 - #ifdef CONFIG_HAVE_ARM_TWD 65 - static DEFINE_TWD_LOCAL_TIMER(twd_local_timer, A9_MPCORE_TWD, IRQ_LOCALTIMER); 66 - 67 - static void __init ca9x4_twd_init(void) 68 - { 69 - int err = twd_local_timer_register(&twd_local_timer); 70 - if (err) 71 - pr_err("twd_local_timer_register failed %d\n", err); 72 - } 73 - #else 74 - #define ca9x4_twd_init() do {} while(0) 75 - #endif 76 - 77 - static void __init ct_ca9x4_init_irq(void) 78 - { 79 - gic_init(0, 29, ioremap(A9_MPCORE_GIC_DIST, SZ_4K), 80 - ioremap(A9_MPCORE_GIC_CPU, SZ_256)); 81 - ca9x4_twd_init(); 82 - ca9x4_l2_init(); 83 - } 84 - 85 - static int ct_ca9x4_clcd_setup(struct clcd_fb *fb) 86 - { 87 - unsigned long framesize = 1024 * 768 * 2; 88 - 89 - fb->panel = versatile_clcd_get_panel("XVGA"); 90 - if (!fb->panel) 91 - return -EINVAL; 92 - 93 - return versatile_clcd_setup_dma(fb, framesize); 94 - } 95 - 96 - static struct clcd_board ct_ca9x4_clcd_data = { 97 - .name = "CT-CA9X4", 98 - .caps = CLCD_CAP_5551 | CLCD_CAP_565, 99 - .check = clcdfb_check, 100 - .decode = clcdfb_decode, 101 - .setup = ct_ca9x4_clcd_setup, 102 - .mmap = versatile_clcd_mmap_dma, 103 - .remove = versatile_clcd_remove_dma, 104 - }; 105 - 106 - static AMBA_AHB_DEVICE(clcd, "ct:clcd", 0, CT_CA9X4_CLCDC, IRQ_CT_CA9X4_CLCDC, &ct_ca9x4_clcd_data); 107 - static AMBA_APB_DEVICE(dmc, "ct:dmc", 0, CT_CA9X4_DMC, IRQ_CT_CA9X4_DMC, NULL); 108 - static AMBA_APB_DEVICE(smc, "ct:smc", 0, CT_CA9X4_SMC, IRQ_CT_CA9X4_SMC, NULL); 109 - static AMBA_APB_DEVICE(gpio, "ct:gpio", 0, CT_CA9X4_GPIO, IRQ_CT_CA9X4_GPIO, NULL); 110 - 111 - static struct amba_device *ct_ca9x4_amba_devs[] __initdata = { 112 - &clcd_device, 113 - &dmc_device, 114 - &smc_device, 115 - &gpio_device, 116 - }; 117 - 118 - static struct resource pmu_resources[] = { 119 - [0] = { 120 - .start = IRQ_CT_CA9X4_PMU_CPU0, 121 - .end = IRQ_CT_CA9X4_PMU_CPU0, 122 - .flags = IORESOURCE_IRQ, 123 - }, 124 - [1] = { 125 - .start = IRQ_CT_CA9X4_PMU_CPU1, 126 - .end = IRQ_CT_CA9X4_PMU_CPU1, 127 - .flags = IORESOURCE_IRQ, 128 - }, 129 - [2] = { 130 - .start = IRQ_CT_CA9X4_PMU_CPU2, 131 - .end = IRQ_CT_CA9X4_PMU_CPU2, 132 - .flags = IORESOURCE_IRQ, 133 - }, 134 - [3] = { 135 - .start = IRQ_CT_CA9X4_PMU_CPU3, 136 - .end = IRQ_CT_CA9X4_PMU_CPU3, 137 - .flags = IORESOURCE_IRQ, 138 - }, 139 - }; 140 - 141 - static struct platform_device pmu_device = { 142 - .name = "arm-pmu", 143 - .id = -1, 144 - .num_resources = ARRAY_SIZE(pmu_resources), 145 - .resource = pmu_resources, 146 - }; 147 - 148 - static struct clk_lookup osc1_lookup = { 149 - .dev_id = "ct:clcd", 150 - }; 151 - 152 - static struct platform_device osc1_device = { 153 - .name = "vexpress-osc", 154 - .id = 1, 155 - .num_resources = 1, 156 - .resource = (struct resource []) { 157 - VEXPRESS_RES_FUNC(0xf, 1), 158 - }, 159 - .dev.platform_data = &osc1_lookup, 160 - }; 161 - 162 - static void __init ct_ca9x4_init(void) 163 - { 164 - int i; 165 - 166 - for (i = 0; i < ARRAY_SIZE(ct_ca9x4_amba_devs); i++) 167 - amba_device_register(ct_ca9x4_amba_devs[i], &iomem_resource); 168 - 169 - platform_device_register(&pmu_device); 170 - vexpress_syscfg_device_register(&osc1_device); 171 - } 172 - 173 - #ifdef CONFIG_SMP 174 - static void *ct_ca9x4_scu_base __initdata; 175 - 176 - static void __init ct_ca9x4_init_cpu_map(void) 177 - { 178 - int i, ncores; 179 - 180 - ct_ca9x4_scu_base = ioremap(A9_MPCORE_SCU, SZ_128); 181 - if (WARN_ON(!ct_ca9x4_scu_base)) 182 - return; 183 - 184 - ncores = scu_get_core_count(ct_ca9x4_scu_base); 185 - 186 - if (ncores > nr_cpu_ids) { 187 - pr_warn("SMP: %u cores greater than maximum (%u), clipping\n", 188 - ncores, nr_cpu_ids); 189 - ncores = nr_cpu_ids; 190 - } 191 - 192 - for (i = 0; i < ncores; ++i) 193 - set_cpu_possible(i, true); 194 - } 195 - 196 - static void __init ct_ca9x4_smp_enable(unsigned int max_cpus) 197 - { 198 - scu_enable(ct_ca9x4_scu_base); 199 - } 200 - #endif 201 - 202 - struct ct_desc ct_ca9x4_desc __initdata = { 203 - .id = V2M_CT_ID_CA9, 204 - .name = "CA9x4", 205 - .map_io = ct_ca9x4_map_io, 206 - .init_irq = ct_ca9x4_init_irq, 207 - .init_tile = ct_ca9x4_init, 208 - #ifdef CONFIG_SMP 209 - .init_cpu_map = ct_ca9x4_init_cpu_map, 210 - .smp_enable = ct_ca9x4_smp_enable, 211 - #endif 212 - };
-47
arch/arm/mach-vexpress/include/mach/ct-ca9x4.h
··· 1 - #ifndef __MACH_CT_CA9X4_H 2 - #define __MACH_CT_CA9X4_H 3 - 4 - /* 5 - * Physical base addresses 6 - */ 7 - #define CT_CA9X4_CLCDC (0x10020000) 8 - #define CT_CA9X4_AXIRAM (0x10060000) 9 - #define CT_CA9X4_DMC (0x100e0000) 10 - #define CT_CA9X4_SMC (0x100e1000) 11 - #define CT_CA9X4_SCC (0x100e2000) 12 - #define CT_CA9X4_SP804_TIMER (0x100e4000) 13 - #define CT_CA9X4_SP805_WDT (0x100e5000) 14 - #define CT_CA9X4_TZPC (0x100e6000) 15 - #define CT_CA9X4_GPIO (0x100e8000) 16 - #define CT_CA9X4_FASTAXI (0x100e9000) 17 - #define CT_CA9X4_SLOWAXI (0x100ea000) 18 - #define CT_CA9X4_TZASC (0x100ec000) 19 - #define CT_CA9X4_CORESIGHT (0x10200000) 20 - #define CT_CA9X4_MPIC (0x1e000000) 21 - #define CT_CA9X4_SYSTIMER (0x1e004000) 22 - #define CT_CA9X4_SYSWDT (0x1e007000) 23 - #define CT_CA9X4_L2CC (0x1e00a000) 24 - 25 - #define A9_MPCORE_SCU (CT_CA9X4_MPIC + 0x0000) 26 - #define A9_MPCORE_GIC_CPU (CT_CA9X4_MPIC + 0x0100) 27 - #define A9_MPCORE_GIT (CT_CA9X4_MPIC + 0x0200) 28 - #define A9_MPCORE_TWD (CT_CA9X4_MPIC + 0x0600) 29 - #define A9_MPCORE_GIC_DIST (CT_CA9X4_MPIC + 0x1000) 30 - 31 - /* 32 - * Interrupts. Those in {} are for AMBA devices 33 - */ 34 - #define IRQ_CT_CA9X4_CLCDC { 76 } 35 - #define IRQ_CT_CA9X4_DMC { 0 } 36 - #define IRQ_CT_CA9X4_SMC { 77, 78 } 37 - #define IRQ_CT_CA9X4_TIMER0 80 38 - #define IRQ_CT_CA9X4_TIMER1 81 39 - #define IRQ_CT_CA9X4_GPIO { 82 } 40 - #define IRQ_CT_CA9X4_PMU_CPU0 92 41 - #define IRQ_CT_CA9X4_PMU_CPU1 93 42 - #define IRQ_CT_CA9X4_PMU_CPU2 94 43 - #define IRQ_CT_CA9X4_PMU_CPU3 95 44 - 45 - extern struct ct_desc ct_ca9x4_desc; 46 - 47 - #endif
-1
arch/arm/mach-vexpress/include/mach/hardware.h
··· 1 - /* empty */
-6
arch/arm/mach-vexpress/include/mach/irqs.h
··· 1 - #define IRQ_LOCALTIMER 29 2 - #define IRQ_LOCALWDOG 30 3 - 4 - #ifndef CONFIG_SPARSE_IRQ 5 - #define NR_IRQS 256 6 - #endif
-88
arch/arm/mach-vexpress/include/mach/motherboard.h
··· 1 - #ifndef __MACH_MOTHERBOARD_H 2 - #define __MACH_MOTHERBOARD_H 3 - 4 - /* 5 - * Physical addresses, offset from V2M_PA_CS0-3 6 - */ 7 - #define V2M_NOR0 (V2M_PA_CS0) 8 - #define V2M_NOR1 (V2M_PA_CS1) 9 - #define V2M_SRAM (V2M_PA_CS2) 10 - #define V2M_VIDEO_SRAM (V2M_PA_CS3 + 0x00000000) 11 - #define V2M_LAN9118 (V2M_PA_CS3 + 0x02000000) 12 - #define V2M_ISP1761 (V2M_PA_CS3 + 0x03000000) 13 - 14 - /* 15 - * Physical addresses, offset from V2M_PA_CS7 16 - */ 17 - #define V2M_SYSREGS (V2M_PA_CS7 + 0x00000000) 18 - #define V2M_SYSCTL (V2M_PA_CS7 + 0x00001000) 19 - #define V2M_SERIAL_BUS_PCI (V2M_PA_CS7 + 0x00002000) 20 - 21 - #define V2M_AACI (V2M_PA_CS7 + 0x00004000) 22 - #define V2M_MMCI (V2M_PA_CS7 + 0x00005000) 23 - #define V2M_KMI0 (V2M_PA_CS7 + 0x00006000) 24 - #define V2M_KMI1 (V2M_PA_CS7 + 0x00007000) 25 - 26 - #define V2M_UART0 (V2M_PA_CS7 + 0x00009000) 27 - #define V2M_UART1 (V2M_PA_CS7 + 0x0000a000) 28 - #define V2M_UART2 (V2M_PA_CS7 + 0x0000b000) 29 - #define V2M_UART3 (V2M_PA_CS7 + 0x0000c000) 30 - 31 - #define V2M_WDT (V2M_PA_CS7 + 0x0000f000) 32 - 33 - #define V2M_TIMER01 (V2M_PA_CS7 + 0x00011000) 34 - #define V2M_TIMER23 (V2M_PA_CS7 + 0x00012000) 35 - 36 - #define V2M_SERIAL_BUS_DVI (V2M_PA_CS7 + 0x00016000) 37 - #define V2M_RTC (V2M_PA_CS7 + 0x00017000) 38 - 39 - #define V2M_CF (V2M_PA_CS7 + 0x0001a000) 40 - #define V2M_CLCD (V2M_PA_CS7 + 0x0001f000) 41 - 42 - 43 - /* 44 - * Interrupts. Those in {} are for AMBA devices 45 - */ 46 - #define IRQ_V2M_WDT { (32 + 0) } 47 - #define IRQ_V2M_TIMER0 (32 + 2) 48 - #define IRQ_V2M_TIMER1 (32 + 2) 49 - #define IRQ_V2M_TIMER2 (32 + 3) 50 - #define IRQ_V2M_TIMER3 (32 + 3) 51 - #define IRQ_V2M_RTC { (32 + 4) } 52 - #define IRQ_V2M_UART0 { (32 + 5) } 53 - #define IRQ_V2M_UART1 { (32 + 6) } 54 - #define IRQ_V2M_UART2 { (32 + 7) } 55 - #define IRQ_V2M_UART3 { (32 + 8) } 56 - #define IRQ_V2M_MMCI { (32 + 9), (32 + 10) } 57 - #define IRQ_V2M_AACI { (32 + 11) } 58 - #define IRQ_V2M_KMI0 { (32 + 12) } 59 - #define IRQ_V2M_KMI1 { (32 + 13) } 60 - #define IRQ_V2M_CLCD { (32 + 14) } 61 - #define IRQ_V2M_LAN9118 (32 + 15) 62 - #define IRQ_V2M_ISP1761 (32 + 16) 63 - #define IRQ_V2M_PCIE (32 + 17) 64 - 65 - 66 - /* 67 - * Core tile IDs 68 - */ 69 - #define V2M_CT_ID_CA9 0x0c000191 70 - #define V2M_CT_ID_UNSUPPORTED 0xff000191 71 - #define V2M_CT_ID_MASK 0xff000fff 72 - 73 - struct ct_desc { 74 - u32 id; 75 - const char *name; 76 - void (*map_io)(void); 77 - void (*init_early)(void); 78 - void (*init_irq)(void); 79 - void (*init_tile)(void); 80 - #ifdef CONFIG_SMP 81 - void (*init_cpu_map)(void); 82 - void (*smp_enable)(unsigned int); 83 - #endif 84 - }; 85 - 86 - extern struct ct_desc *ct_desc; 87 - 88 - #endif
-42
arch/arm/mach-vexpress/platsmp.c
··· 19 19 #include <asm/smp_scu.h> 20 20 #include <asm/mach/map.h> 21 21 22 - #include <mach/motherboard.h> 23 - 24 22 #include <plat/platsmp.h> 25 23 26 24 #include "core.h" 27 - 28 - /* 29 - * Initialise the CPU possible map early - this describes the CPUs 30 - * which may be present or become present in the system. 31 - */ 32 - static void __init vexpress_smp_init_cpus(void) 33 - { 34 - ct_desc->init_cpu_map(); 35 - } 36 - 37 - static void __init vexpress_smp_prepare_cpus(unsigned int max_cpus) 38 - { 39 - /* 40 - * Initialise the present map, which describes the set of CPUs 41 - * actually populated at the present time. 42 - */ 43 - ct_desc->smp_enable(max_cpus); 44 - 45 - /* 46 - * Write the address of secondary startup into the 47 - * system-wide flags register. The boot monitor waits 48 - * until it receives a soft interrupt, and then the 49 - * secondary CPU branches to this address. 50 - */ 51 - vexpress_flags_set(virt_to_phys(versatile_secondary_startup)); 52 - } 53 - 54 - struct smp_operations __initdata vexpress_smp_ops = { 55 - .smp_init_cpus = vexpress_smp_init_cpus, 56 - .smp_prepare_cpus = vexpress_smp_prepare_cpus, 57 - .smp_secondary_init = versatile_secondary_init, 58 - .smp_boot_secondary = versatile_boot_secondary, 59 - #ifdef CONFIG_HOTPLUG_CPU 60 - .cpu_die = vexpress_cpu_die, 61 - #endif 62 - }; 63 25 64 26 bool __init vexpress_smp_init_ops(void) 65 27 { ··· 40 78 #endif 41 79 return false; 42 80 } 43 - 44 - #if defined(CONFIG_OF) 45 81 46 82 static const struct of_device_id vexpress_smp_dt_scu_match[] __initconst = { 47 83 { .compatible = "arm,cortex-a5-scu", }, ··· 72 112 .cpu_die = vexpress_cpu_die, 73 113 #endif 74 114 }; 75 - 76 - #endif
-374
arch/arm/mach-vexpress/v2m.c
··· 1 - /* 2 - * Versatile Express V2M Motherboard Support 3 - */ 4 - #include <linux/device.h> 5 - #include <linux/amba/bus.h> 6 - #include <linux/amba/mmci.h> 7 - #include <linux/io.h> 8 - #include <linux/smp.h> 9 - #include <linux/init.h> 10 - #include <linux/of_address.h> 11 - #include <linux/of_fdt.h> 12 - #include <linux/of_irq.h> 13 - #include <linux/of_platform.h> 14 - #include <linux/platform_device.h> 15 - #include <linux/ata_platform.h> 16 - #include <linux/smsc911x.h> 17 - #include <linux/spinlock.h> 18 - #include <linux/usb/isp1760.h> 19 - #include <linux/mtd/physmap.h> 20 - #include <linux/regulator/fixed.h> 21 - #include <linux/regulator/machine.h> 22 - #include <linux/vexpress.h> 23 - #include <linux/clkdev.h> 24 - 25 - #include <asm/mach-types.h> 26 - #include <asm/sizes.h> 27 1 #include <asm/mach/arch.h> 28 - #include <asm/mach/map.h> 29 - #include <asm/mach/time.h> 30 - #include <asm/hardware/arm_timer.h> 31 - #include <asm/hardware/cache-l2x0.h> 32 - #include <asm/hardware/timer-sp.h> 33 - 34 - #include <mach/ct-ca9x4.h> 35 - #include <mach/motherboard.h> 36 - 37 - #include <plat/sched_clock.h> 38 - #include <plat/platsmp.h> 39 2 40 3 #include "core.h" 41 - 42 - #define V2M_PA_CS0 0x40000000 43 - #define V2M_PA_CS1 0x44000000 44 - #define V2M_PA_CS2 0x48000000 45 - #define V2M_PA_CS3 0x4c000000 46 - #define V2M_PA_CS7 0x10000000 47 - 48 - static struct map_desc v2m_io_desc[] __initdata = { 49 - { 50 - .virtual = V2M_PERIPH, 51 - .pfn = __phys_to_pfn(V2M_PA_CS7), 52 - .length = SZ_128K, 53 - .type = MT_DEVICE, 54 - }, 55 - }; 56 - 57 - static void __init v2m_sp804_init(void __iomem *base, unsigned int irq) 58 - { 59 - if (WARN_ON(!base || irq == NO_IRQ)) 60 - return; 61 - 62 - sp804_clocksource_init(base + TIMER_2_BASE, "v2m-timer1"); 63 - sp804_clockevents_init(base + TIMER_1_BASE, irq, "v2m-timer0"); 64 - } 65 - 66 - 67 - static struct resource v2m_pcie_i2c_resource = { 68 - .start = V2M_SERIAL_BUS_PCI, 69 - .end = V2M_SERIAL_BUS_PCI + SZ_4K - 1, 70 - .flags = IORESOURCE_MEM, 71 - }; 72 - 73 - static struct platform_device v2m_pcie_i2c_device = { 74 - .name = "versatile-i2c", 75 - .id = 0, 76 - .num_resources = 1, 77 - .resource = &v2m_pcie_i2c_resource, 78 - }; 79 - 80 - static struct resource v2m_ddc_i2c_resource = { 81 - .start = V2M_SERIAL_BUS_DVI, 82 - .end = V2M_SERIAL_BUS_DVI + SZ_4K - 1, 83 - .flags = IORESOURCE_MEM, 84 - }; 85 - 86 - static struct platform_device v2m_ddc_i2c_device = { 87 - .name = "versatile-i2c", 88 - .id = 1, 89 - .num_resources = 1, 90 - .resource = &v2m_ddc_i2c_resource, 91 - }; 92 - 93 - static struct resource v2m_eth_resources[] = { 94 - { 95 - .start = V2M_LAN9118, 96 - .end = V2M_LAN9118 + SZ_64K - 1, 97 - .flags = IORESOURCE_MEM, 98 - }, { 99 - .start = IRQ_V2M_LAN9118, 100 - .end = IRQ_V2M_LAN9118, 101 - .flags = IORESOURCE_IRQ, 102 - }, 103 - }; 104 - 105 - static struct smsc911x_platform_config v2m_eth_config = { 106 - .flags = SMSC911X_USE_32BIT, 107 - .irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_HIGH, 108 - .irq_type = SMSC911X_IRQ_TYPE_PUSH_PULL, 109 - .phy_interface = PHY_INTERFACE_MODE_MII, 110 - }; 111 - 112 - static struct platform_device v2m_eth_device = { 113 - .name = "smsc911x", 114 - .id = -1, 115 - .resource = v2m_eth_resources, 116 - .num_resources = ARRAY_SIZE(v2m_eth_resources), 117 - .dev.platform_data = &v2m_eth_config, 118 - }; 119 - 120 - static struct regulator_consumer_supply v2m_eth_supplies[] = { 121 - REGULATOR_SUPPLY("vddvario", "smsc911x"), 122 - REGULATOR_SUPPLY("vdd33a", "smsc911x"), 123 - }; 124 - 125 - static struct resource v2m_usb_resources[] = { 126 - { 127 - .start = V2M_ISP1761, 128 - .end = V2M_ISP1761 + SZ_128K - 1, 129 - .flags = IORESOURCE_MEM, 130 - }, { 131 - .start = IRQ_V2M_ISP1761, 132 - .end = IRQ_V2M_ISP1761, 133 - .flags = IORESOURCE_IRQ, 134 - }, 135 - }; 136 - 137 - static struct isp1760_platform_data v2m_usb_config = { 138 - .is_isp1761 = true, 139 - .bus_width_16 = false, 140 - .port1_otg = true, 141 - .analog_oc = false, 142 - .dack_polarity_high = false, 143 - .dreq_polarity_high = false, 144 - }; 145 - 146 - static struct platform_device v2m_usb_device = { 147 - .name = "isp1760", 148 - .id = -1, 149 - .resource = v2m_usb_resources, 150 - .num_resources = ARRAY_SIZE(v2m_usb_resources), 151 - .dev.platform_data = &v2m_usb_config, 152 - }; 153 - 154 - static struct physmap_flash_data v2m_flash_data = { 155 - .width = 4, 156 - }; 157 - 158 - static struct resource v2m_flash_resources[] = { 159 - { 160 - .start = V2M_NOR0, 161 - .end = V2M_NOR0 + SZ_64M - 1, 162 - .flags = IORESOURCE_MEM, 163 - }, { 164 - .start = V2M_NOR1, 165 - .end = V2M_NOR1 + SZ_64M - 1, 166 - .flags = IORESOURCE_MEM, 167 - }, 168 - }; 169 - 170 - static struct platform_device v2m_flash_device = { 171 - .name = "physmap-flash", 172 - .id = -1, 173 - .resource = v2m_flash_resources, 174 - .num_resources = ARRAY_SIZE(v2m_flash_resources), 175 - .dev.platform_data = &v2m_flash_data, 176 - }; 177 - 178 - static struct pata_platform_info v2m_pata_data = { 179 - .ioport_shift = 2, 180 - }; 181 - 182 - static struct resource v2m_pata_resources[] = { 183 - { 184 - .start = V2M_CF, 185 - .end = V2M_CF + 0xff, 186 - .flags = IORESOURCE_MEM, 187 - }, { 188 - .start = V2M_CF + 0x100, 189 - .end = V2M_CF + SZ_4K - 1, 190 - .flags = IORESOURCE_MEM, 191 - }, 192 - }; 193 - 194 - static struct platform_device v2m_cf_device = { 195 - .name = "pata_platform", 196 - .id = -1, 197 - .resource = v2m_pata_resources, 198 - .num_resources = ARRAY_SIZE(v2m_pata_resources), 199 - .dev.platform_data = &v2m_pata_data, 200 - }; 201 - 202 - static struct mmci_platform_data v2m_mmci_data = { 203 - .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34, 204 - .status = vexpress_get_mci_cardin, 205 - .gpio_cd = -1, 206 - .gpio_wp = -1, 207 - }; 208 - 209 - static struct resource v2m_sysreg_resources[] = { 210 - { 211 - .start = V2M_SYSREGS, 212 - .end = V2M_SYSREGS + 0xfff, 213 - .flags = IORESOURCE_MEM, 214 - }, 215 - }; 216 - 217 - static struct platform_device v2m_sysreg_device = { 218 - .name = "vexpress-sysreg", 219 - .id = -1, 220 - .resource = v2m_sysreg_resources, 221 - .num_resources = ARRAY_SIZE(v2m_sysreg_resources), 222 - }; 223 - 224 - static struct platform_device v2m_muxfpga_device = { 225 - .name = "vexpress-muxfpga", 226 - .id = 0, 227 - .num_resources = 1, 228 - .resource = (struct resource []) { 229 - VEXPRESS_RES_FUNC(0, 7), 230 - } 231 - }; 232 - 233 - static struct platform_device v2m_shutdown_device = { 234 - .name = "vexpress-shutdown", 235 - .id = 0, 236 - .num_resources = 1, 237 - .resource = (struct resource []) { 238 - VEXPRESS_RES_FUNC(0, 8), 239 - } 240 - }; 241 - 242 - static struct platform_device v2m_reboot_device = { 243 - .name = "vexpress-reboot", 244 - .id = 0, 245 - .num_resources = 1, 246 - .resource = (struct resource []) { 247 - VEXPRESS_RES_FUNC(0, 9), 248 - } 249 - }; 250 - 251 - static struct platform_device v2m_dvimode_device = { 252 - .name = "vexpress-dvimode", 253 - .id = 0, 254 - .num_resources = 1, 255 - .resource = (struct resource []) { 256 - VEXPRESS_RES_FUNC(0, 11), 257 - } 258 - }; 259 - 260 - static AMBA_APB_DEVICE(aaci, "mb:aaci", 0, V2M_AACI, IRQ_V2M_AACI, NULL); 261 - static AMBA_APB_DEVICE(mmci, "mb:mmci", 0, V2M_MMCI, IRQ_V2M_MMCI, &v2m_mmci_data); 262 - static AMBA_APB_DEVICE(kmi0, "mb:kmi0", 0, V2M_KMI0, IRQ_V2M_KMI0, NULL); 263 - static AMBA_APB_DEVICE(kmi1, "mb:kmi1", 0, V2M_KMI1, IRQ_V2M_KMI1, NULL); 264 - static AMBA_APB_DEVICE(uart0, "mb:uart0", 0, V2M_UART0, IRQ_V2M_UART0, NULL); 265 - static AMBA_APB_DEVICE(uart1, "mb:uart1", 0, V2M_UART1, IRQ_V2M_UART1, NULL); 266 - static AMBA_APB_DEVICE(uart2, "mb:uart2", 0, V2M_UART2, IRQ_V2M_UART2, NULL); 267 - static AMBA_APB_DEVICE(uart3, "mb:uart3", 0, V2M_UART3, IRQ_V2M_UART3, NULL); 268 - static AMBA_APB_DEVICE(wdt, "mb:wdt", 0, V2M_WDT, IRQ_V2M_WDT, NULL); 269 - static AMBA_APB_DEVICE(rtc, "mb:rtc", 0, V2M_RTC, IRQ_V2M_RTC, NULL); 270 - 271 - static struct amba_device *v2m_amba_devs[] __initdata = { 272 - &aaci_device, 273 - &mmci_device, 274 - &kmi0_device, 275 - &kmi1_device, 276 - &uart0_device, 277 - &uart1_device, 278 - &uart2_device, 279 - &uart3_device, 280 - &wdt_device, 281 - &rtc_device, 282 - }; 283 - 284 - static void __init v2m_timer_init(void) 285 - { 286 - vexpress_clk_init(ioremap(V2M_SYSCTL, SZ_4K)); 287 - v2m_sp804_init(ioremap(V2M_TIMER01, SZ_4K), IRQ_V2M_TIMER0); 288 - } 289 - 290 - static void __init v2m_init_early(void) 291 - { 292 - if (ct_desc->init_early) 293 - ct_desc->init_early(); 294 - versatile_sched_clock_init(vexpress_get_24mhz_clock_base(), 24000000); 295 - } 296 - 297 - struct ct_desc *ct_desc; 298 - 299 - static struct ct_desc *ct_descs[] __initdata = { 300 - #ifdef CONFIG_ARCH_VEXPRESS_CA9X4 301 - &ct_ca9x4_desc, 302 - #endif 303 - }; 304 - 305 - static void __init v2m_populate_ct_desc(void) 306 - { 307 - int i; 308 - u32 current_tile_id; 309 - 310 - ct_desc = NULL; 311 - current_tile_id = vexpress_get_procid(VEXPRESS_SITE_MASTER) 312 - & V2M_CT_ID_MASK; 313 - 314 - for (i = 0; i < ARRAY_SIZE(ct_descs) && !ct_desc; ++i) 315 - if (ct_descs[i]->id == current_tile_id) 316 - ct_desc = ct_descs[i]; 317 - 318 - if (!ct_desc) 319 - panic("vexpress: this kernel does not support core tile ID 0x%08x when booting via ATAGs.\n" 320 - "You may need a device tree blob or a different kernel to boot on this board.\n", 321 - current_tile_id); 322 - } 323 - 324 - static void __init v2m_map_io(void) 325 - { 326 - iotable_init(v2m_io_desc, ARRAY_SIZE(v2m_io_desc)); 327 - vexpress_sysreg_early_init(ioremap(V2M_SYSREGS, SZ_4K)); 328 - v2m_populate_ct_desc(); 329 - ct_desc->map_io(); 330 - } 331 - 332 - static void __init v2m_init_irq(void) 333 - { 334 - ct_desc->init_irq(); 335 - } 336 - 337 - static void __init v2m_init(void) 338 - { 339 - int i; 340 - 341 - regulator_register_fixed(0, v2m_eth_supplies, 342 - ARRAY_SIZE(v2m_eth_supplies)); 343 - 344 - platform_device_register(&v2m_sysreg_device); 345 - platform_device_register(&v2m_pcie_i2c_device); 346 - platform_device_register(&v2m_ddc_i2c_device); 347 - platform_device_register(&v2m_flash_device); 348 - platform_device_register(&v2m_cf_device); 349 - platform_device_register(&v2m_eth_device); 350 - platform_device_register(&v2m_usb_device); 351 - 352 - for (i = 0; i < ARRAY_SIZE(v2m_amba_devs); i++) 353 - amba_device_register(v2m_amba_devs[i], &iomem_resource); 354 - 355 - vexpress_syscfg_device_register(&v2m_muxfpga_device); 356 - vexpress_syscfg_device_register(&v2m_shutdown_device); 357 - vexpress_syscfg_device_register(&v2m_reboot_device); 358 - vexpress_syscfg_device_register(&v2m_dvimode_device); 359 - 360 - ct_desc->init_tile(); 361 - } 362 - 363 - MACHINE_START(VEXPRESS, "ARM-Versatile Express") 364 - .atag_offset = 0x100, 365 - .smp = smp_ops(vexpress_smp_ops), 366 - .map_io = v2m_map_io, 367 - .init_early = v2m_init_early, 368 - .init_irq = v2m_init_irq, 369 - .init_time = v2m_timer_init, 370 - .init_machine = v2m_init, 371 - MACHINE_END 372 - 373 - static void __init v2m_dt_init(void) 374 - { 375 - of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); 376 - } 377 4 378 5 static const char * const v2m_dt_match[] __initconst = { 379 6 "arm,vexpress", ··· 13 386 .l2c_aux_mask = 0xfe0fffff, 14 387 .smp = smp_ops(vexpress_smp_dt_ops), 15 388 .smp_init = smp_init_ops(vexpress_smp_init_ops), 16 - .init_machine = v2m_dt_init, 17 389 MACHINE_END
+1 -1
arch/arm/plat-versatile/Kconfig
··· 4 4 bool 5 5 6 6 config PLAT_VERSATILE_SCHED_CLOCK 7 - def_bool y 7 + bool 8 8 9 9 endif
-1
drivers/clk/versatile/Makefile
··· 2 2 obj-$(CONFIG_ICST) += clk-icst.o clk-versatile.o 3 3 obj-$(CONFIG_INTEGRATOR_IMPD1) += clk-impd1.o 4 4 obj-$(CONFIG_ARCH_REALVIEW) += clk-realview.o 5 - obj-$(CONFIG_ARCH_VEXPRESS) += clk-vexpress.o 6 5 obj-$(CONFIG_CLK_SP810) += clk-sp810.o 7 6 obj-$(CONFIG_CLK_VEXPRESS_OSC) += clk-vexpress-osc.o
-7
drivers/clk/versatile/clk-vexpress-osc.c
··· 70 70 71 71 static int vexpress_osc_probe(struct platform_device *pdev) 72 72 { 73 - struct clk_lookup *cl = pdev->dev.platform_data; /* Non-DT lookup */ 74 73 struct clk_init_data init; 75 74 struct vexpress_osc *osc; 76 75 struct clk *clk; ··· 104 105 return PTR_ERR(clk); 105 106 106 107 of_clk_add_provider(pdev->dev.of_node, of_clk_src_simple_get, clk); 107 - 108 - /* Only happens for non-DT cases */ 109 - if (cl) { 110 - cl->clk = clk; 111 - clkdev_add(cl); 112 - } 113 108 114 109 dev_dbg(&pdev->dev, "Registered clock '%s'\n", init.name); 115 110
-86
drivers/clk/versatile/clk-vexpress.c
··· 1 - /* 2 - * This program is free software; you can redistribute it and/or modify 3 - * it under the terms of the GNU General Public License version 2 as 4 - * published by the Free Software Foundation. 5 - * 6 - * This program is distributed in the hope that it will be useful, 7 - * but WITHOUT ANY WARRANTY; without even the implied warranty of 8 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 9 - * GNU General Public License for more details. 10 - * 11 - * Copyright (C) 2012 ARM Limited 12 - */ 13 - 14 - #include <linux/amba/sp810.h> 15 - #include <linux/clkdev.h> 16 - #include <linux/clk-provider.h> 17 - #include <linux/err.h> 18 - #include <linux/vexpress.h> 19 - 20 - static struct clk *vexpress_sp810_timerclken[4]; 21 - static DEFINE_SPINLOCK(vexpress_sp810_lock); 22 - 23 - static void __init vexpress_sp810_init(void __iomem *base) 24 - { 25 - int i; 26 - 27 - if (WARN_ON(!base)) 28 - return; 29 - 30 - for (i = 0; i < ARRAY_SIZE(vexpress_sp810_timerclken); i++) { 31 - char name[12]; 32 - const char *parents[] = { 33 - "v2m:refclk32khz", /* REFCLK */ 34 - "v2m:refclk1mhz" /* TIMCLK */ 35 - }; 36 - 37 - snprintf(name, ARRAY_SIZE(name), "timerclken%d", i); 38 - 39 - vexpress_sp810_timerclken[i] = clk_register_mux(NULL, name, 40 - parents, 2, CLK_SET_RATE_NO_REPARENT, 41 - base + SCCTRL, SCCTRL_TIMERENnSEL_SHIFT(i), 1, 42 - 0, &vexpress_sp810_lock); 43 - 44 - if (WARN_ON(IS_ERR(vexpress_sp810_timerclken[i]))) 45 - break; 46 - } 47 - } 48 - 49 - 50 - static const char * const vexpress_clk_24mhz_periphs[] __initconst = { 51 - "mb:uart0", "mb:uart1", "mb:uart2", "mb:uart3", 52 - "mb:mmci", "mb:kmi0", "mb:kmi1" 53 - }; 54 - 55 - void __init vexpress_clk_init(void __iomem *sp810_base) 56 - { 57 - struct clk *clk; 58 - int i; 59 - 60 - clk = clk_register_fixed_rate(NULL, "dummy_apb_pclk", NULL, 61 - CLK_IS_ROOT, 0); 62 - WARN_ON(clk_register_clkdev(clk, "apb_pclk", NULL)); 63 - 64 - clk = clk_register_fixed_rate(NULL, "v2m:clk_24mhz", NULL, 65 - CLK_IS_ROOT, 24000000); 66 - for (i = 0; i < ARRAY_SIZE(vexpress_clk_24mhz_periphs); i++) 67 - WARN_ON(clk_register_clkdev(clk, NULL, 68 - vexpress_clk_24mhz_periphs[i])); 69 - 70 - clk = clk_register_fixed_rate(NULL, "v2m:refclk32khz", NULL, 71 - CLK_IS_ROOT, 32768); 72 - WARN_ON(clk_register_clkdev(clk, NULL, "v2m:wdt")); 73 - 74 - clk = clk_register_fixed_rate(NULL, "v2m:refclk1mhz", NULL, 75 - CLK_IS_ROOT, 1000000); 76 - 77 - vexpress_sp810_init(sp810_base); 78 - 79 - for (i = 0; i < ARRAY_SIZE(vexpress_sp810_timerclken); i++) 80 - WARN_ON(clk_set_parent(vexpress_sp810_timerclken[i], clk)); 81 - 82 - WARN_ON(clk_register_clkdev(vexpress_sp810_timerclken[0], 83 - "v2m-timer0", "sp804")); 84 - WARN_ON(clk_register_clkdev(vexpress_sp810_timerclken[1], 85 - "v2m-timer1", "sp804")); 86 - }
+12 -46
drivers/misc/vexpress-syscfg.c
··· 145 145 static struct regmap *vexpress_syscfg_regmap_init(struct device *dev, 146 146 void *context) 147 147 { 148 - struct platform_device *pdev = to_platform_device(dev); 148 + int err; 149 149 struct vexpress_syscfg *syscfg = context; 150 150 struct vexpress_syscfg_func *func; 151 151 struct property *prop; ··· 155 155 u32 site, position, dcc; 156 156 int i; 157 157 158 - if (dev->of_node) { 159 - int err = vexpress_config_get_topo(dev->of_node, &site, 158 + err = vexpress_config_get_topo(dev->of_node, &site, 160 159 &position, &dcc); 160 + if (err) 161 + return ERR_PTR(err); 161 162 162 - if (err) 163 - return ERR_PTR(err); 163 + prop = of_find_property(dev->of_node, 164 + "arm,vexpress-sysreg,func", NULL); 165 + if (!prop) 166 + return ERR_PTR(-EINVAL); 164 167 165 - prop = of_find_property(dev->of_node, 166 - "arm,vexpress-sysreg,func", NULL); 167 - if (!prop) 168 - return ERR_PTR(-EINVAL); 169 - 170 - num = prop->length / sizeof(u32) / 2; 171 - val = prop->value; 172 - } else { 173 - if (pdev->num_resources != 1 || 174 - pdev->resource[0].flags != IORESOURCE_BUS) 175 - return ERR_PTR(-EFAULT); 176 - 177 - site = pdev->resource[0].start; 178 - if (site == VEXPRESS_SITE_MASTER) 179 - site = vexpress_config_get_master(); 180 - position = 0; 181 - dcc = 0; 182 - num = 1; 183 - } 168 + num = prop->length / sizeof(u32) / 2; 169 + val = prop->value; 184 170 185 171 /* 186 172 * "arm,vexpress-energy" function used to be described ··· 193 207 for (i = 0; i < num; i++) { 194 208 u32 function, device; 195 209 196 - if (dev->of_node) { 197 - function = be32_to_cpup(val++); 198 - device = be32_to_cpup(val++); 199 - } else { 200 - function = pdev->resource[0].end; 201 - device = pdev->id; 202 - } 210 + function = be32_to_cpup(val++); 211 + device = be32_to_cpup(val++); 203 212 204 213 dev_dbg(dev, "func %p: %u/%u/%u/%u/%u\n", 205 214 func, site, position, dcc, ··· 246 265 }; 247 266 248 267 249 - /* Non-DT hack, to be gone... */ 250 - static struct device *vexpress_syscfg_bridge; 251 - 252 - int vexpress_syscfg_device_register(struct platform_device *pdev) 253 - { 254 - pdev->dev.parent = vexpress_syscfg_bridge; 255 - 256 - return platform_device_register(pdev); 257 - } 258 - 259 - 260 268 static int vexpress_syscfg_probe(struct platform_device *pdev) 261 269 { 262 270 struct vexpress_syscfg *syscfg; ··· 272 302 &vexpress_syscfg_bridge_ops, syscfg); 273 303 if (IS_ERR(bridge)) 274 304 return PTR_ERR(bridge); 275 - 276 - /* Non-DT case */ 277 - if (!pdev->dev.of_node) 278 - vexpress_syscfg_bridge = bridge; 279 305 280 306 return 0; 281 307 }
-19
include/linux/vexpress.h
··· 15 15 #define _LINUX_VEXPRESS_H 16 16 17 17 #include <linux/device.h> 18 - #include <linux/platform_device.h> 19 - #include <linux/reboot.h> 20 18 #include <linux/regmap.h> 21 19 22 20 #define VEXPRESS_SITE_MB 0 23 21 #define VEXPRESS_SITE_DB1 1 24 22 #define VEXPRESS_SITE_DB2 2 25 23 #define VEXPRESS_SITE_MASTER 0xf 26 - 27 - #define VEXPRESS_RES_FUNC(_site, _func) \ 28 - { \ 29 - .start = (_site), \ 30 - .end = (_func), \ 31 - .flags = IORESOURCE_BUS, \ 32 - } 33 24 34 25 /* Config infrastructure */ 35 26 ··· 49 58 50 59 /* Platform control */ 51 60 52 - unsigned int vexpress_get_mci_cardin(struct device *dev); 53 - u32 vexpress_get_procid(int site); 54 - void *vexpress_get_24mhz_clock_base(void); 55 61 void vexpress_flags_set(u32 data); 56 - 57 - void vexpress_sysreg_early_init(void __iomem *base); 58 - int vexpress_syscfg_device_register(struct platform_device *pdev); 59 - 60 - /* Clocks */ 61 - 62 - void vexpress_clk_init(void __iomem *sp810_base); 63 62 64 63 #endif