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

Merge tag 'keystone-soc-for-arm-soc' of git://git.kernel.org/pub/scm/linux/kernel/git/ssantosh/linux-keystone into next/soc

From Santosh Shilimkar:
SOC support for Keystone II devices:
- Minimal machine and device-tree support with arch_timers and console UART
- Reboot hook using PLL reset
- Low level debug support using UART
- SMP boot support

* tag 'keystone-soc-for-arm-soc' of git://git.kernel.org/pub/scm/linux/kernel/git/ssantosh/linux-keystone:
ARM: keystone: Enable SMP support on Keystone machines
ARM: keystone: Add minimal TI Keystone platform support
ARM: dts: keystone: Add minimal Keystone SOC device tree data

Signed-off-by: Olof Johansson <olof@lixom.net>

+509
+10
Documentation/devicetree/bindings/arm/keystone/keystone.txt
··· 1 + TI Keystone Platforms Device Tree Bindings 2 + ----------------------------------------------- 3 + 4 + Boards with Keystone2 based devices (TCI66xxK2H) SOC shall have the 5 + following properties. 6 + 7 + Required properties: 8 + - compatible: All TI specific devices present in Keystone SOC should be in 9 + the form "ti,keystone-*". Generic devices like gic, arch_timers, ns16550 10 + type UART should use the specified compatible for those devices.
+3
arch/arm/Kconfig
··· 950 950 951 951 source "arch/arm/mach-ixp4xx/Kconfig" 952 952 953 + source "arch/arm/mach-keystone/Kconfig" 954 + 953 955 source "arch/arm/mach-kirkwood/Kconfig" 954 956 955 957 source "arch/arm/mach-ks8695/Kconfig" ··· 1564 1562 int 1565 1563 default 1024 if ARCH_SHMOBILE || ARCH_TEGRA 1566 1564 default 512 if SOC_OMAP5 1565 + default 512 if ARCH_KEYSTONE 1567 1566 default 392 if ARCH_U8500 1568 1567 default 352 if ARCH_VT8500 1569 1568 default 288 if ARCH_SUNXI
+16
arch/arm/Kconfig.debug
··· 251 251 Say Y here if you want kernel low-level debugging support 252 252 on i.MX6Q/DL. 253 253 254 + config DEBUG_KEYSTONE_UART0 255 + bool "Kernel low-level debugging on KEYSTONE2 using UART0" 256 + depends on ARCH_KEYSTONE 257 + help 258 + Say Y here if you want the debug print routines to direct 259 + their output to UART0 serial port on KEYSTONE2 devices. 260 + 261 + config DEBUG_KEYSTONE_UART1 262 + bool "Kernel low-level debugging on KEYSTONE2 using UART1" 263 + depends on ARCH_KEYSTONE 264 + help 265 + Say Y here if you want the debug print routines to direct 266 + their output to UART1 serial port on KEYSTONE2 devices. 267 + 254 268 config DEBUG_MMP_UART2 255 269 bool "Kernel low-level debugging message via MMP UART2" 256 270 depends on ARCH_MMP ··· 671 657 DEBUG_IMX51_UART || \ 672 658 DEBUG_IMX53_UART ||\ 673 659 DEBUG_IMX6Q_UART 660 + default "debug/keystone.S" if DEBUG_KEYSTONE_UART0 || \ 661 + DEBUG_KEYSTONE_UART1 674 662 default "debug/mvebu.S" if DEBUG_MVEBU_UART || \ 675 663 DEBUG_MVEBU_UART_ALTERNATE 676 664 default "debug/mxs.S" if DEBUG_IMX23_UART || DEBUG_IMX28_UART
+1
arch/arm/Makefile
··· 195 195 machine-$(CONFIG_ARCH_VIRT) += virt 196 196 machine-$(CONFIG_ARCH_ZYNQ) += zynq 197 197 machine-$(CONFIG_ARCH_SUNXI) += sunxi 198 + machine-$(CONFIG_ARCH_KEYSTONE) += keystone 198 199 199 200 # Platform directory name. This list is sorted alphanumerically 200 201 # by CONFIG_* macro name.
+117
arch/arm/boot/dts/keystone.dts
··· 1 + /* 2 + * Copyright 2013 Texas Instruments, Inc. 3 + * 4 + * This program is free software; you can redistribute it and/or modify 5 + * it under the terms of the GNU General Public License version 2 as 6 + * published by the Free Software Foundation. 7 + */ 8 + 9 + /dts-v1/; 10 + /include/ "skeleton.dtsi" 11 + 12 + / { 13 + model = "Texas Instruments Keystone 2 SoC"; 14 + compatible = "ti,keystone-evm"; 15 + #address-cells = <2>; 16 + #size-cells = <2>; 17 + interrupt-parent = <&gic>; 18 + 19 + aliases { 20 + serial0 = &uart0; 21 + }; 22 + 23 + memory { 24 + reg = <0x00000000 0x80000000 0x00000000 0x40000000>; 25 + }; 26 + 27 + cpus { 28 + #address-cells = <1>; 29 + #size-cells = <0>; 30 + 31 + interrupt-parent = <&gic>; 32 + 33 + cpu@0 { 34 + compatible = "arm,cortex-a15"; 35 + device_type = "cpu"; 36 + reg = <0>; 37 + }; 38 + 39 + cpu@1 { 40 + compatible = "arm,cortex-a15"; 41 + device_type = "cpu"; 42 + reg = <1>; 43 + }; 44 + 45 + cpu@2 { 46 + compatible = "arm,cortex-a15"; 47 + device_type = "cpu"; 48 + reg = <2>; 49 + }; 50 + 51 + cpu@3 { 52 + compatible = "arm,cortex-a15"; 53 + device_type = "cpu"; 54 + reg = <3>; 55 + }; 56 + }; 57 + 58 + gic: interrupt-controller { 59 + compatible = "arm,cortex-a15-gic"; 60 + #interrupt-cells = <3>; 61 + #size-cells = <0>; 62 + #address-cells = <1>; 63 + interrupt-controller; 64 + reg = <0x0 0x02561000 0x0 0x1000>, 65 + <0x0 0x02562000 0x0 0x2000>; 66 + }; 67 + 68 + timer { 69 + compatible = "arm,armv7-timer"; 70 + interrupts = <1 13 0xf08>, 71 + <1 14 0xf08>, 72 + <1 11 0xf08>, 73 + <1 10 0x308>; 74 + }; 75 + 76 + pmu { 77 + compatible = "arm,cortex-a15-pmu"; 78 + interrupts = <0 20 0xf01>, 79 + <0 21 0xf01>, 80 + <0 22 0xf01>, 81 + <0 23 0xf01>; 82 + }; 83 + 84 + soc { 85 + #address-cells = <1>; 86 + #size-cells = <1>; 87 + compatible = "ti,keystone","simple-bus"; 88 + interrupt-parent = <&gic>; 89 + ranges = <0x0 0x0 0x0 0xc0000000>; 90 + 91 + rstctrl: reset-controller { 92 + compatible = "ti,keystone-reset"; 93 + reg = <0x023100e8 4>; /* pll reset control reg */ 94 + }; 95 + 96 + uart0: serial@02530c00 { 97 + compatible = "ns16550a"; 98 + current-speed = <115200>; 99 + reg-shift = <2>; 100 + reg-io-width = <4>; 101 + reg = <0x02530c00 0x100>; 102 + clock-frequency = <133120000>; 103 + interrupts = <0 277 0xf01>; 104 + }; 105 + 106 + uart1: serial@02531000 { 107 + compatible = "ns16550a"; 108 + current-speed = <115200>; 109 + reg-shift = <2>; 110 + reg-io-width = <4>; 111 + reg = <0x02531000 0x100>; 112 + clock-frequency = <133120000>; 113 + interrupts = <0 280 0xf01>; 114 + }; 115 + 116 + }; 117 + };
+157
arch/arm/configs/keystone_defconfig
··· 1 + # CONFIG_SWAP is not set 2 + CONFIG_POSIX_MQUEUE=y 3 + CONFIG_HIGH_RES_TIMERS=y 4 + CONFIG_IKCONFIG=y 5 + CONFIG_IKCONFIG_PROC=y 6 + CONFIG_LOG_BUF_SHIFT=14 7 + CONFIG_BLK_DEV_INITRD=y 8 + CONFIG_SYSCTL_SYSCALL=y 9 + CONFIG_KALLSYMS_ALL=y 10 + # CONFIG_ELF_CORE is not set 11 + # CONFIG_BASE_FULL is not set 12 + CONFIG_EMBEDDED=y 13 + CONFIG_PROFILING=y 14 + CONFIG_OPROFILE=y 15 + CONFIG_KPROBES=y 16 + CONFIG_MODULES=y 17 + CONFIG_MODULE_FORCE_LOAD=y 18 + CONFIG_MODULE_UNLOAD=y 19 + CONFIG_MODULE_FORCE_UNLOAD=y 20 + CONFIG_MODVERSIONS=y 21 + CONFIG_ARCH_KEYSTONE=y 22 + CONFIG_ARM_LPAE=y 23 + CONFIG_SMP=y 24 + CONFIG_PREEMPT=y 25 + CONFIG_AEABI=y 26 + CONFIG_HIGHMEM=y 27 + CONFIG_VFP=y 28 + CONFIG_NEON=y 29 + # CONFIG_SUSPEND is not set 30 + CONFIG_PM_RUNTIME=y 31 + CONFIG_NET=y 32 + CONFIG_PACKET=y 33 + CONFIG_UNIX=y 34 + CONFIG_UNIX_DIAG=y 35 + CONFIG_XFRM_USER=y 36 + CONFIG_XFRM_SUB_POLICY=y 37 + CONFIG_XFRM_STATISTICS=y 38 + CONFIG_NET_KEY=y 39 + CONFIG_NET_KEY_MIGRATE=y 40 + CONFIG_INET=y 41 + CONFIG_IP_MULTICAST=y 42 + CONFIG_IP_ADVANCED_ROUTER=y 43 + CONFIG_IP_MULTIPLE_TABLES=y 44 + CONFIG_IP_ROUTE_MULTIPATH=y 45 + CONFIG_IP_ROUTE_VERBOSE=y 46 + CONFIG_IP_PNP=y 47 + CONFIG_IP_PNP_DHCP=y 48 + CONFIG_IP_PNP_BOOTP=y 49 + CONFIG_NET_IPIP=y 50 + CONFIG_NET_IPGRE_DEMUX=y 51 + CONFIG_NET_IPGRE=y 52 + CONFIG_IP_MROUTE=y 53 + CONFIG_IP_MROUTE_MULTIPLE_TABLES=y 54 + CONFIG_IP_PIMSM_V2=y 55 + CONFIG_INET_AH=y 56 + CONFIG_INET_IPCOMP=y 57 + CONFIG_IPV6=y 58 + CONFIG_INET6_XFRM_MODE_TRANSPORT=m 59 + CONFIG_INET6_XFRM_MODE_TUNNEL=m 60 + CONFIG_INET6_XFRM_MODE_BEET=m 61 + CONFIG_IPV6_SIT=m 62 + CONFIG_IPV6_MULTIPLE_TABLES=y 63 + CONFIG_IPV6_SUBTREES=y 64 + CONFIG_IPV6_MROUTE=y 65 + CONFIG_IPV6_PIMSM_V2=y 66 + CONFIG_NETFILTER=y 67 + CONFIG_NF_CONNTRACK=y 68 + CONFIG_NF_CT_NETLINK=y 69 + CONFIG_NETFILTER_XT_TARGET_CLASSIFY=y 70 + CONFIG_NETFILTER_XT_TARGET_CONNMARK=y 71 + CONFIG_NETFILTER_XT_TARGET_IDLETIMER=y 72 + CONFIG_NETFILTER_XT_TARGET_MARK=y 73 + CONFIG_NETFILTER_XT_MATCH_COMMENT=y 74 + CONFIG_NETFILTER_XT_MATCH_CONNBYTES=y 75 + CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=y 76 + CONFIG_NETFILTER_XT_MATCH_CONNMARK=y 77 + CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y 78 + CONFIG_NETFILTER_XT_MATCH_CPU=y 79 + CONFIG_NETFILTER_XT_MATCH_IPRANGE=y 80 + CONFIG_NETFILTER_XT_MATCH_LENGTH=y 81 + CONFIG_NETFILTER_XT_MATCH_MAC=y 82 + CONFIG_NETFILTER_XT_MATCH_MARK=y 83 + CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y 84 + CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y 85 + CONFIG_NETFILTER_XT_MATCH_STATE=y 86 + CONFIG_NF_CONNTRACK_IPV4=y 87 + CONFIG_IP_NF_IPTABLES=y 88 + CONFIG_IP_NF_MATCH_AH=y 89 + CONFIG_IP_NF_MATCH_ECN=y 90 + CONFIG_IP_NF_MATCH_TTL=y 91 + CONFIG_IP_NF_FILTER=y 92 + CONFIG_IP_NF_TARGET_REJECT=y 93 + CONFIG_IP_NF_TARGET_ULOG=y 94 + CONFIG_IP_NF_MANGLE=y 95 + CONFIG_IP_NF_TARGET_CLUSTERIP=y 96 + CONFIG_IP_NF_TARGET_ECN=y 97 + CONFIG_IP_NF_TARGET_TTL=y 98 + CONFIG_IP_NF_RAW=y 99 + CONFIG_IP_NF_ARPTABLES=y 100 + CONFIG_IP_NF_ARPFILTER=y 101 + CONFIG_IP_NF_ARP_MANGLE=y 102 + CONFIG_IP6_NF_IPTABLES=m 103 + CONFIG_IP_SCTP=y 104 + CONFIG_VLAN_8021Q=y 105 + CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" 106 + CONFIG_CMA=y 107 + CONFIG_MTD=y 108 + CONFIG_MTD_CMDLINE_PARTS=y 109 + CONFIG_MTD_BLOCK=y 110 + CONFIG_MTD_PLATRAM=y 111 + CONFIG_MTD_M25P80=y 112 + CONFIG_MTD_NAND=y 113 + CONFIG_MTD_UBI=y 114 + CONFIG_PROC_DEVICETREE=y 115 + CONFIG_BLK_DEV_LOOP=y 116 + CONFIG_EEPROM_AT24=y 117 + CONFIG_NETDEVICES=y 118 + CONFIG_SERIAL_8250=y 119 + CONFIG_SERIAL_8250_CONSOLE=y 120 + CONFIG_SERIAL_OF_PLATFORM=y 121 + # CONFIG_HW_RANDOM is not set 122 + CONFIG_I2C=y 123 + # CONFIG_I2C_COMPAT is not set 124 + CONFIG_I2C_CHARDEV=y 125 + CONFIG_SPI=y 126 + CONFIG_SPI_SPIDEV=y 127 + # CONFIG_HWMON is not set 128 + CONFIG_WATCHDOG=y 129 + # CONFIG_USB_SUPPORT is not set 130 + CONFIG_DMADEVICES=y 131 + CONFIG_COMMON_CLK_DEBUG=y 132 + CONFIG_MEMORY=y 133 + CONFIG_TMPFS=y 134 + CONFIG_JFFS2_FS=y 135 + CONFIG_JFFS2_FS_WBUF_VERIFY=y 136 + CONFIG_UBIFS_FS=y 137 + CONFIG_CRAMFS=y 138 + CONFIG_NFS_FS=y 139 + CONFIG_NFS_V3_ACL=y 140 + CONFIG_ROOT_NFS=y 141 + CONFIG_NFSD=y 142 + CONFIG_NFSD_V3=y 143 + CONFIG_NFSD_V3_ACL=y 144 + CONFIG_PRINTK_TIME=y 145 + CONFIG_DEBUG_SHIRQ=y 146 + CONFIG_DEBUG_INFO=y 147 + CONFIG_DEBUG_USER=y 148 + CONFIG_CRYPTO_USER=y 149 + CONFIG_CRYPTO_NULL=y 150 + CONFIG_CRYPTO_AUTHENC=y 151 + CONFIG_CRYPTO_CBC=y 152 + CONFIG_CRYPTO_CTR=y 153 + CONFIG_CRYPTO_XCBC=y 154 + CONFIG_CRYPTO_DES=y 155 + CONFIG_CRYPTO_ANSI_CPRNG=y 156 + CONFIG_CRYPTO_USER_API_HASH=y 157 + CONFIG_CRYPTO_USER_API_SKCIPHER=y
+43
arch/arm/include/debug/keystone.S
··· 1 + /* 2 + * Early serial debug output macro for Keystone SOCs 3 + * 4 + * Copyright 2013 Texas Instruments, Inc. 5 + * Santosh Shilimkar <santosh.shilimkar@ti.com> 6 + * 7 + * Based on RMKs low level debug code. 8 + * Copyright (C) 1994-1999 Russell King 9 + * 10 + * This program is free software; you can redistribute it and/or modify 11 + * it under the terms of the GNU General Public License version 2 as 12 + * published by the Free Software Foundation. 13 + */ 14 + 15 + #include <linux/serial_reg.h> 16 + 17 + #define UART_SHIFT 2 18 + #if defined(CONFIG_DEBUG_KEYSTONE_UART0) 19 + #define UART_PHYS 0x02530c00 20 + #define UART_VIRT 0xfeb30c00 21 + #elif defined(CONFIG_DEBUG_KEYSTONE_UART1) 22 + #define UART_PHYS 0x02531000 23 + #define UART_VIRT 0xfeb31000 24 + #endif 25 + 26 + .macro addruart, rp, rv, tmp 27 + ldr \rv, =UART_VIRT @ physical base address 28 + ldr \rp, =UART_PHYS @ virtual base address 29 + .endm 30 + 31 + .macro senduart,rd,rx 32 + str \rd, [\rx, #UART_TX << UART_SHIFT] 33 + .endm 34 + 35 + .macro busyuart,rd,rx 36 + 1002: ldr \rd, [\rx, #UART_LSR << UART_SHIFT] 37 + and \rd, \rd, #UART_LSR_TEMT | UART_LSR_THRE 38 + teq \rd, #UART_LSR_TEMT | UART_LSR_THRE 39 + bne 1002b 40 + .endm 41 + 42 + .macro waituart,rd,rx 43 + .endm
+15
arch/arm/mach-keystone/Kconfig
··· 1 + config ARCH_KEYSTONE 2 + bool "Texas Instruments Keystone Devices" 3 + depends on ARCH_MULTI_V7 4 + select CPU_V7 5 + select ARM_GIC 6 + select HAVE_ARM_ARCH_TIMER 7 + select HAVE_SMP 8 + select CLKSRC_MMIO 9 + select GENERIC_CLOCKEVENTS 10 + select HAVE_SCHED_CLOCK 11 + select ARCH_WANT_OPTIONAL_GPIOLIB 12 + select ARM_ERRATA_798181 13 + help 14 + Support for boards based on the Texas Instruments Keystone family of 15 + SoCs.
+2
arch/arm/mach-keystone/Makefile
··· 1 + obj-y := keystone.o 2 + obj-$(CONFIG_SMP) += platsmp.o
+1
arch/arm/mach-keystone/Makefile.boot
··· 1 + zreladdr-y := 0x80008000
+75
arch/arm/mach-keystone/keystone.c
··· 1 + /* 2 + * Keystone2 based boards and SOC related code. 3 + * 4 + * Copyright 2013 Texas Instruments, Inc. 5 + * Cyril Chemparathy <cyril@ti.com> 6 + * Santosh Shilimkar <santosh.shillimkar@ti.com> 7 + * 8 + * This program is free software; you can redistribute it and/or modify it 9 + * under the terms and conditions of the GNU General Public License, 10 + * version 2, as published by the Free Software Foundation. 11 + */ 12 + #include <linux/io.h> 13 + #include <linux/of.h> 14 + #include <linux/init.h> 15 + #include <linux/of_platform.h> 16 + #include <linux/of_address.h> 17 + 18 + #include <asm/setup.h> 19 + #include <asm/mach/map.h> 20 + #include <asm/mach/arch.h> 21 + #include <asm/mach/time.h> 22 + #include <asm/smp_plat.h> 23 + 24 + #include "keystone.h" 25 + 26 + #define PLL_RESET_WRITE_KEY_MASK 0xffff0000 27 + #define PLL_RESET_WRITE_KEY 0x5a69 28 + #define PLL_RESET BIT(16) 29 + 30 + static void __iomem *keystone_rstctrl; 31 + 32 + static void __init keystone_init(void) 33 + { 34 + struct device_node *node; 35 + 36 + node = of_find_compatible_node(NULL, NULL, "ti,keystone-reset"); 37 + if (WARN_ON(!node)) 38 + pr_warn("ti,keystone-reset node undefined\n"); 39 + 40 + keystone_rstctrl = of_iomap(node, 0); 41 + if (WARN_ON(!keystone_rstctrl)) 42 + pr_warn("ti,keystone-reset iomap error\n"); 43 + 44 + of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); 45 + } 46 + 47 + static const char *keystone_match[] __initconst = { 48 + "ti,keystone-evm", 49 + NULL, 50 + }; 51 + 52 + void keystone_restart(char mode, const char *cmd) 53 + { 54 + u32 val; 55 + 56 + BUG_ON(!keystone_rstctrl); 57 + 58 + /* Enable write access to RSTCTRL */ 59 + val = readl(keystone_rstctrl); 60 + val &= PLL_RESET_WRITE_KEY_MASK; 61 + val |= PLL_RESET_WRITE_KEY; 62 + writel(val, keystone_rstctrl); 63 + 64 + /* Reset the SOC */ 65 + val = readl(keystone_rstctrl); 66 + val &= ~PLL_RESET; 67 + writel(val, keystone_rstctrl); 68 + } 69 + 70 + DT_MACHINE_START(KEYSTONE, "Keystone") 71 + .smp = smp_ops(keystone_smp_ops), 72 + .init_machine = keystone_init, 73 + .dt_compat = keystone_match, 74 + .restart = keystone_restart, 75 + MACHINE_END
+17
arch/arm/mach-keystone/keystone.h
··· 1 + /* 2 + * Copyright 2013 Texas Instruments, Inc. 3 + * Cyril Chemparathy <cyril@ti.com> 4 + * Santosh Shilimkar <santosh.shillimkar@ti.com> 5 + * 6 + * This program is free software; you can redistribute it and/or modify it 7 + * under the terms and conditions of the GNU General Public License, 8 + * version 2, as published by the Free Software Foundation. 9 + */ 10 + 11 + #ifndef __KEYSTONE_H__ 12 + #define __KEYSTONE_H__ 13 + 14 + extern struct smp_operations keystone_smp_ops; 15 + extern void secondary_startup(void); 16 + 17 + #endif /* __KEYSTONE_H__ */
+52
arch/arm/mach-keystone/platsmp.c
··· 1 + /* 2 + * Keystone SOC SMP platform code 3 + * 4 + * Copyright 2013 Texas Instruments, Inc. 5 + * Cyril Chemparathy <cyril@ti.com> 6 + * Santosh Shilimkar <santosh.shillimkar@ti.com> 7 + * 8 + * Based on platsmp.c, Copyright (C) 2002 ARM Ltd. 9 + * 10 + * This program is free software; you can redistribute it and/or modify it 11 + * under the terms and conditions of the GNU General Public License, 12 + * version 2, as published by the Free Software Foundation. 13 + */ 14 + 15 + #include <linux/init.h> 16 + #include <linux/smp.h> 17 + #include <linux/io.h> 18 + 19 + #include <asm/smp_plat.h> 20 + #include <asm/prom.h> 21 + 22 + #include "keystone.h" 23 + 24 + static int __cpuinit keystone_smp_boot_secondary(unsigned int cpu, 25 + struct task_struct *idle) 26 + { 27 + unsigned long start = virt_to_phys(&secondary_startup); 28 + int error; 29 + 30 + pr_debug("keystone-smp: booting cpu %d, vector %08lx\n", 31 + cpu, start); 32 + 33 + asm volatile ( 34 + "mov r0, #0\n" /* power on cmd */ 35 + "mov r1, %1\n" /* cpu */ 36 + "mov r2, %2\n" /* start */ 37 + ".inst 0xe1600070\n" /* smc #0 */ 38 + "mov %0, r0\n" 39 + : "=r" (error) 40 + : "r"(cpu), "r"(start) 41 + : "cc", "r0", "r1", "r2", "memory" 42 + ); 43 + 44 + pr_debug("keystone-smp: monitor returned %d\n", error); 45 + 46 + return error; 47 + } 48 + 49 + struct smp_operations keystone_smp_ops __initdata = { 50 + .smp_init_cpus = arm_dt_init_cpu_maps, 51 + .smp_boot_secondary = keystone_smp_boot_secondary, 52 + };