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 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) iQIcBAABAgAGBQJRv4/wAAoJEHJsHOdBp5c/IgsQAIRBEH3do787aX8WnvE2K2eH bertrD86dcHGe4oNRg+L6WFxS/0SLYTzvkwizBSUl6gs1e0LkruAqiKM5LJmyBfr G+ay0Z/j6oROwCpVF1aVL1sqC0dn7uUk9jhqaTy9DhLQjol6xLELvOy16+0WlpCC uDJamki+i+PyO3HyLmyT+exgsLxdKmo3PzDn4fsgab0a/Y1wEniYrraSr5158uj2 Zpo9uDgDaMtPn0bC7WUPI+lC4F8s4GqQp87GH90QpVFPIR/yKCuurHocC8vvVER1 HBhZ9e6VVSuRYc3pkZO8Xtr/hvoopnDO07SYrMGxL2F3tzUqab900o9IsYWkBbYT Z8DrPHFx6ZDhx0yEOdTeNq+wSXL2jduz78Wh20/Sh3lBDl6hn5YSIyWR+WiPpheo MlJRKNs0cKwsPwTIK3x4LEkLzDe3tVGbBGigNDex5m5azQci10Cctbc+DnBjLOnj AZiLuKM0LxNUx9riErWMmkskgNpRB31d7q9dgAC+rxA66MqBnz6x4nTTGFXNSkGC /iRU5YO/BgwL/IeiX2gY/msFLW0YyjXakpQ8XcqoAxGb6y6qvbD6SNtjfxA16OHT o6uPSpA82TprHzePFCSbzIkSE+Jj1o0Dqc4PWZkuX0X7TmW9R+k6TUU9OF+VnlCV q0Jjsrod/6z8CQ/tIpD8 =pkFT -----END PGP SIGNATURE----- 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>
This commit is contained in:
commit
99ff183042
|
@ -0,0 +1,10 @@
|
|||
TI Keystone Platforms Device Tree Bindings
|
||||
-----------------------------------------------
|
||||
|
||||
Boards with Keystone2 based devices (TCI66xxK2H) SOC shall have the
|
||||
following properties.
|
||||
|
||||
Required properties:
|
||||
- compatible: All TI specific devices present in Keystone SOC should be in
|
||||
the form "ti,keystone-*". Generic devices like gic, arch_timers, ns16550
|
||||
type UART should use the specified compatible for those devices.
|
|
@ -950,6 +950,8 @@ source "arch/arm/mach-iop13xx/Kconfig"
|
|||
|
||||
source "arch/arm/mach-ixp4xx/Kconfig"
|
||||
|
||||
source "arch/arm/mach-keystone/Kconfig"
|
||||
|
||||
source "arch/arm/mach-kirkwood/Kconfig"
|
||||
|
||||
source "arch/arm/mach-ks8695/Kconfig"
|
||||
|
@ -1562,6 +1564,7 @@ config ARCH_NR_GPIO
|
|||
int
|
||||
default 1024 if ARCH_SHMOBILE || ARCH_TEGRA
|
||||
default 512 if SOC_OMAP5
|
||||
default 512 if ARCH_KEYSTONE
|
||||
default 392 if ARCH_U8500
|
||||
default 352 if ARCH_VT8500
|
||||
default 288 if ARCH_SUNXI
|
||||
|
|
|
@ -251,6 +251,20 @@ choice
|
|||
Say Y here if you want kernel low-level debugging support
|
||||
on i.MX6Q/DL.
|
||||
|
||||
config DEBUG_KEYSTONE_UART0
|
||||
bool "Kernel low-level debugging on KEYSTONE2 using UART0"
|
||||
depends on ARCH_KEYSTONE
|
||||
help
|
||||
Say Y here if you want the debug print routines to direct
|
||||
their output to UART0 serial port on KEYSTONE2 devices.
|
||||
|
||||
config DEBUG_KEYSTONE_UART1
|
||||
bool "Kernel low-level debugging on KEYSTONE2 using UART1"
|
||||
depends on ARCH_KEYSTONE
|
||||
help
|
||||
Say Y here if you want the debug print routines to direct
|
||||
their output to UART1 serial port on KEYSTONE2 devices.
|
||||
|
||||
config DEBUG_MMP_UART2
|
||||
bool "Kernel low-level debugging message via MMP UART2"
|
||||
depends on ARCH_MMP
|
||||
|
@ -657,6 +671,8 @@ config DEBUG_LL_INCLUDE
|
|||
DEBUG_IMX51_UART || \
|
||||
DEBUG_IMX53_UART ||\
|
||||
DEBUG_IMX6Q_UART
|
||||
default "debug/keystone.S" if DEBUG_KEYSTONE_UART0 || \
|
||||
DEBUG_KEYSTONE_UART1
|
||||
default "debug/mvebu.S" if DEBUG_MVEBU_UART || \
|
||||
DEBUG_MVEBU_UART_ALTERNATE
|
||||
default "debug/mxs.S" if DEBUG_IMX23_UART || DEBUG_IMX28_UART
|
||||
|
|
|
@ -195,6 +195,7 @@ machine-$(CONFIG_PLAT_SPEAR) += spear
|
|||
machine-$(CONFIG_ARCH_VIRT) += virt
|
||||
machine-$(CONFIG_ARCH_ZYNQ) += zynq
|
||||
machine-$(CONFIG_ARCH_SUNXI) += sunxi
|
||||
machine-$(CONFIG_ARCH_KEYSTONE) += keystone
|
||||
|
||||
# Platform directory name. This list is sorted alphanumerically
|
||||
# by CONFIG_* macro name.
|
||||
|
|
|
@ -0,0 +1,117 @@
|
|||
/*
|
||||
* Copyright 2013 Texas Instruments, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
/include/ "skeleton.dtsi"
|
||||
|
||||
/ {
|
||||
model = "Texas Instruments Keystone 2 SoC";
|
||||
compatible = "ti,keystone-evm";
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
interrupt-parent = <&gic>;
|
||||
|
||||
aliases {
|
||||
serial0 = &uart0;
|
||||
};
|
||||
|
||||
memory {
|
||||
reg = <0x00000000 0x80000000 0x00000000 0x40000000>;
|
||||
};
|
||||
|
||||
cpus {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
interrupt-parent = <&gic>;
|
||||
|
||||
cpu@0 {
|
||||
compatible = "arm,cortex-a15";
|
||||
device_type = "cpu";
|
||||
reg = <0>;
|
||||
};
|
||||
|
||||
cpu@1 {
|
||||
compatible = "arm,cortex-a15";
|
||||
device_type = "cpu";
|
||||
reg = <1>;
|
||||
};
|
||||
|
||||
cpu@2 {
|
||||
compatible = "arm,cortex-a15";
|
||||
device_type = "cpu";
|
||||
reg = <2>;
|
||||
};
|
||||
|
||||
cpu@3 {
|
||||
compatible = "arm,cortex-a15";
|
||||
device_type = "cpu";
|
||||
reg = <3>;
|
||||
};
|
||||
};
|
||||
|
||||
gic: interrupt-controller {
|
||||
compatible = "arm,cortex-a15-gic";
|
||||
#interrupt-cells = <3>;
|
||||
#size-cells = <0>;
|
||||
#address-cells = <1>;
|
||||
interrupt-controller;
|
||||
reg = <0x0 0x02561000 0x0 0x1000>,
|
||||
<0x0 0x02562000 0x0 0x2000>;
|
||||
};
|
||||
|
||||
timer {
|
||||
compatible = "arm,armv7-timer";
|
||||
interrupts = <1 13 0xf08>,
|
||||
<1 14 0xf08>,
|
||||
<1 11 0xf08>,
|
||||
<1 10 0x308>;
|
||||
};
|
||||
|
||||
pmu {
|
||||
compatible = "arm,cortex-a15-pmu";
|
||||
interrupts = <0 20 0xf01>,
|
||||
<0 21 0xf01>,
|
||||
<0 22 0xf01>,
|
||||
<0 23 0xf01>;
|
||||
};
|
||||
|
||||
soc {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "ti,keystone","simple-bus";
|
||||
interrupt-parent = <&gic>;
|
||||
ranges = <0x0 0x0 0x0 0xc0000000>;
|
||||
|
||||
rstctrl: reset-controller {
|
||||
compatible = "ti,keystone-reset";
|
||||
reg = <0x023100e8 4>; /* pll reset control reg */
|
||||
};
|
||||
|
||||
uart0: serial@02530c00 {
|
||||
compatible = "ns16550a";
|
||||
current-speed = <115200>;
|
||||
reg-shift = <2>;
|
||||
reg-io-width = <4>;
|
||||
reg = <0x02530c00 0x100>;
|
||||
clock-frequency = <133120000>;
|
||||
interrupts = <0 277 0xf01>;
|
||||
};
|
||||
|
||||
uart1: serial@02531000 {
|
||||
compatible = "ns16550a";
|
||||
current-speed = <115200>;
|
||||
reg-shift = <2>;
|
||||
reg-io-width = <4>;
|
||||
reg = <0x02531000 0x100>;
|
||||
clock-frequency = <133120000>;
|
||||
interrupts = <0 280 0xf01>;
|
||||
};
|
||||
|
||||
};
|
||||
};
|
|
@ -0,0 +1,157 @@
|
|||
# CONFIG_SWAP is not set
|
||||
CONFIG_POSIX_MQUEUE=y
|
||||
CONFIG_HIGH_RES_TIMERS=y
|
||||
CONFIG_IKCONFIG=y
|
||||
CONFIG_IKCONFIG_PROC=y
|
||||
CONFIG_LOG_BUF_SHIFT=14
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
CONFIG_SYSCTL_SYSCALL=y
|
||||
CONFIG_KALLSYMS_ALL=y
|
||||
# CONFIG_ELF_CORE is not set
|
||||
# CONFIG_BASE_FULL is not set
|
||||
CONFIG_EMBEDDED=y
|
||||
CONFIG_PROFILING=y
|
||||
CONFIG_OPROFILE=y
|
||||
CONFIG_KPROBES=y
|
||||
CONFIG_MODULES=y
|
||||
CONFIG_MODULE_FORCE_LOAD=y
|
||||
CONFIG_MODULE_UNLOAD=y
|
||||
CONFIG_MODULE_FORCE_UNLOAD=y
|
||||
CONFIG_MODVERSIONS=y
|
||||
CONFIG_ARCH_KEYSTONE=y
|
||||
CONFIG_ARM_LPAE=y
|
||||
CONFIG_SMP=y
|
||||
CONFIG_PREEMPT=y
|
||||
CONFIG_AEABI=y
|
||||
CONFIG_HIGHMEM=y
|
||||
CONFIG_VFP=y
|
||||
CONFIG_NEON=y
|
||||
# CONFIG_SUSPEND is not set
|
||||
CONFIG_PM_RUNTIME=y
|
||||
CONFIG_NET=y
|
||||
CONFIG_PACKET=y
|
||||
CONFIG_UNIX=y
|
||||
CONFIG_UNIX_DIAG=y
|
||||
CONFIG_XFRM_USER=y
|
||||
CONFIG_XFRM_SUB_POLICY=y
|
||||
CONFIG_XFRM_STATISTICS=y
|
||||
CONFIG_NET_KEY=y
|
||||
CONFIG_NET_KEY_MIGRATE=y
|
||||
CONFIG_INET=y
|
||||
CONFIG_IP_MULTICAST=y
|
||||
CONFIG_IP_ADVANCED_ROUTER=y
|
||||
CONFIG_IP_MULTIPLE_TABLES=y
|
||||
CONFIG_IP_ROUTE_MULTIPATH=y
|
||||
CONFIG_IP_ROUTE_VERBOSE=y
|
||||
CONFIG_IP_PNP=y
|
||||
CONFIG_IP_PNP_DHCP=y
|
||||
CONFIG_IP_PNP_BOOTP=y
|
||||
CONFIG_NET_IPIP=y
|
||||
CONFIG_NET_IPGRE_DEMUX=y
|
||||
CONFIG_NET_IPGRE=y
|
||||
CONFIG_IP_MROUTE=y
|
||||
CONFIG_IP_MROUTE_MULTIPLE_TABLES=y
|
||||
CONFIG_IP_PIMSM_V2=y
|
||||
CONFIG_INET_AH=y
|
||||
CONFIG_INET_IPCOMP=y
|
||||
CONFIG_IPV6=y
|
||||
CONFIG_INET6_XFRM_MODE_TRANSPORT=m
|
||||
CONFIG_INET6_XFRM_MODE_TUNNEL=m
|
||||
CONFIG_INET6_XFRM_MODE_BEET=m
|
||||
CONFIG_IPV6_SIT=m
|
||||
CONFIG_IPV6_MULTIPLE_TABLES=y
|
||||
CONFIG_IPV6_SUBTREES=y
|
||||
CONFIG_IPV6_MROUTE=y
|
||||
CONFIG_IPV6_PIMSM_V2=y
|
||||
CONFIG_NETFILTER=y
|
||||
CONFIG_NF_CONNTRACK=y
|
||||
CONFIG_NF_CT_NETLINK=y
|
||||
CONFIG_NETFILTER_XT_TARGET_CLASSIFY=y
|
||||
CONFIG_NETFILTER_XT_TARGET_CONNMARK=y
|
||||
CONFIG_NETFILTER_XT_TARGET_IDLETIMER=y
|
||||
CONFIG_NETFILTER_XT_TARGET_MARK=y
|
||||
CONFIG_NETFILTER_XT_MATCH_COMMENT=y
|
||||
CONFIG_NETFILTER_XT_MATCH_CONNBYTES=y
|
||||
CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=y
|
||||
CONFIG_NETFILTER_XT_MATCH_CONNMARK=y
|
||||
CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y
|
||||
CONFIG_NETFILTER_XT_MATCH_CPU=y
|
||||
CONFIG_NETFILTER_XT_MATCH_IPRANGE=y
|
||||
CONFIG_NETFILTER_XT_MATCH_LENGTH=y
|
||||
CONFIG_NETFILTER_XT_MATCH_MAC=y
|
||||
CONFIG_NETFILTER_XT_MATCH_MARK=y
|
||||
CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y
|
||||
CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y
|
||||
CONFIG_NETFILTER_XT_MATCH_STATE=y
|
||||
CONFIG_NF_CONNTRACK_IPV4=y
|
||||
CONFIG_IP_NF_IPTABLES=y
|
||||
CONFIG_IP_NF_MATCH_AH=y
|
||||
CONFIG_IP_NF_MATCH_ECN=y
|
||||
CONFIG_IP_NF_MATCH_TTL=y
|
||||
CONFIG_IP_NF_FILTER=y
|
||||
CONFIG_IP_NF_TARGET_REJECT=y
|
||||
CONFIG_IP_NF_TARGET_ULOG=y
|
||||
CONFIG_IP_NF_MANGLE=y
|
||||
CONFIG_IP_NF_TARGET_CLUSTERIP=y
|
||||
CONFIG_IP_NF_TARGET_ECN=y
|
||||
CONFIG_IP_NF_TARGET_TTL=y
|
||||
CONFIG_IP_NF_RAW=y
|
||||
CONFIG_IP_NF_ARPTABLES=y
|
||||
CONFIG_IP_NF_ARPFILTER=y
|
||||
CONFIG_IP_NF_ARP_MANGLE=y
|
||||
CONFIG_IP6_NF_IPTABLES=m
|
||||
CONFIG_IP_SCTP=y
|
||||
CONFIG_VLAN_8021Q=y
|
||||
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
||||
CONFIG_CMA=y
|
||||
CONFIG_MTD=y
|
||||
CONFIG_MTD_CMDLINE_PARTS=y
|
||||
CONFIG_MTD_BLOCK=y
|
||||
CONFIG_MTD_PLATRAM=y
|
||||
CONFIG_MTD_M25P80=y
|
||||
CONFIG_MTD_NAND=y
|
||||
CONFIG_MTD_UBI=y
|
||||
CONFIG_PROC_DEVICETREE=y
|
||||
CONFIG_BLK_DEV_LOOP=y
|
||||
CONFIG_EEPROM_AT24=y
|
||||
CONFIG_NETDEVICES=y
|
||||
CONFIG_SERIAL_8250=y
|
||||
CONFIG_SERIAL_8250_CONSOLE=y
|
||||
CONFIG_SERIAL_OF_PLATFORM=y
|
||||
# CONFIG_HW_RANDOM is not set
|
||||
CONFIG_I2C=y
|
||||
# CONFIG_I2C_COMPAT is not set
|
||||
CONFIG_I2C_CHARDEV=y
|
||||
CONFIG_SPI=y
|
||||
CONFIG_SPI_SPIDEV=y
|
||||
# CONFIG_HWMON is not set
|
||||
CONFIG_WATCHDOG=y
|
||||
# CONFIG_USB_SUPPORT is not set
|
||||
CONFIG_DMADEVICES=y
|
||||
CONFIG_COMMON_CLK_DEBUG=y
|
||||
CONFIG_MEMORY=y
|
||||
CONFIG_TMPFS=y
|
||||
CONFIG_JFFS2_FS=y
|
||||
CONFIG_JFFS2_FS_WBUF_VERIFY=y
|
||||
CONFIG_UBIFS_FS=y
|
||||
CONFIG_CRAMFS=y
|
||||
CONFIG_NFS_FS=y
|
||||
CONFIG_NFS_V3_ACL=y
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_NFSD=y
|
||||
CONFIG_NFSD_V3=y
|
||||
CONFIG_NFSD_V3_ACL=y
|
||||
CONFIG_PRINTK_TIME=y
|
||||
CONFIG_DEBUG_SHIRQ=y
|
||||
CONFIG_DEBUG_INFO=y
|
||||
CONFIG_DEBUG_USER=y
|
||||
CONFIG_CRYPTO_USER=y
|
||||
CONFIG_CRYPTO_NULL=y
|
||||
CONFIG_CRYPTO_AUTHENC=y
|
||||
CONFIG_CRYPTO_CBC=y
|
||||
CONFIG_CRYPTO_CTR=y
|
||||
CONFIG_CRYPTO_XCBC=y
|
||||
CONFIG_CRYPTO_DES=y
|
||||
CONFIG_CRYPTO_ANSI_CPRNG=y
|
||||
CONFIG_CRYPTO_USER_API_HASH=y
|
||||
CONFIG_CRYPTO_USER_API_SKCIPHER=y
|
|
@ -0,0 +1,43 @@
|
|||
/*
|
||||
* Early serial debug output macro for Keystone SOCs
|
||||
*
|
||||
* Copyright 2013 Texas Instruments, Inc.
|
||||
* Santosh Shilimkar <santosh.shilimkar@ti.com>
|
||||
*
|
||||
* Based on RMKs low level debug code.
|
||||
* Copyright (C) 1994-1999 Russell King
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <linux/serial_reg.h>
|
||||
|
||||
#define UART_SHIFT 2
|
||||
#if defined(CONFIG_DEBUG_KEYSTONE_UART0)
|
||||
#define UART_PHYS 0x02530c00
|
||||
#define UART_VIRT 0xfeb30c00
|
||||
#elif defined(CONFIG_DEBUG_KEYSTONE_UART1)
|
||||
#define UART_PHYS 0x02531000
|
||||
#define UART_VIRT 0xfeb31000
|
||||
#endif
|
||||
|
||||
.macro addruart, rp, rv, tmp
|
||||
ldr \rv, =UART_VIRT @ physical base address
|
||||
ldr \rp, =UART_PHYS @ virtual base address
|
||||
.endm
|
||||
|
||||
.macro senduart,rd,rx
|
||||
str \rd, [\rx, #UART_TX << UART_SHIFT]
|
||||
.endm
|
||||
|
||||
.macro busyuart,rd,rx
|
||||
1002: ldr \rd, [\rx, #UART_LSR << UART_SHIFT]
|
||||
and \rd, \rd, #UART_LSR_TEMT | UART_LSR_THRE
|
||||
teq \rd, #UART_LSR_TEMT | UART_LSR_THRE
|
||||
bne 1002b
|
||||
.endm
|
||||
|
||||
.macro waituart,rd,rx
|
||||
.endm
|
|
@ -0,0 +1,15 @@
|
|||
config ARCH_KEYSTONE
|
||||
bool "Texas Instruments Keystone Devices"
|
||||
depends on ARCH_MULTI_V7
|
||||
select CPU_V7
|
||||
select ARM_GIC
|
||||
select HAVE_ARM_ARCH_TIMER
|
||||
select HAVE_SMP
|
||||
select CLKSRC_MMIO
|
||||
select GENERIC_CLOCKEVENTS
|
||||
select HAVE_SCHED_CLOCK
|
||||
select ARCH_WANT_OPTIONAL_GPIOLIB
|
||||
select ARM_ERRATA_798181
|
||||
help
|
||||
Support for boards based on the Texas Instruments Keystone family of
|
||||
SoCs.
|
|
@ -0,0 +1,2 @@
|
|||
obj-y := keystone.o
|
||||
obj-$(CONFIG_SMP) += platsmp.o
|
|
@ -0,0 +1 @@
|
|||
zreladdr-y := 0x80008000
|
|
@ -0,0 +1,75 @@
|
|||
/*
|
||||
* Keystone2 based boards and SOC related code.
|
||||
*
|
||||
* Copyright 2013 Texas Instruments, Inc.
|
||||
* Cyril Chemparathy <cyril@ti.com>
|
||||
* Santosh Shilimkar <santosh.shillimkar@ti.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms and conditions of the GNU General Public License,
|
||||
* version 2, as published by the Free Software Foundation.
|
||||
*/
|
||||
#include <linux/io.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/of_address.h>
|
||||
|
||||
#include <asm/setup.h>
|
||||
#include <asm/mach/map.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/time.h>
|
||||
#include <asm/smp_plat.h>
|
||||
|
||||
#include "keystone.h"
|
||||
|
||||
#define PLL_RESET_WRITE_KEY_MASK 0xffff0000
|
||||
#define PLL_RESET_WRITE_KEY 0x5a69
|
||||
#define PLL_RESET BIT(16)
|
||||
|
||||
static void __iomem *keystone_rstctrl;
|
||||
|
||||
static void __init keystone_init(void)
|
||||
{
|
||||
struct device_node *node;
|
||||
|
||||
node = of_find_compatible_node(NULL, NULL, "ti,keystone-reset");
|
||||
if (WARN_ON(!node))
|
||||
pr_warn("ti,keystone-reset node undefined\n");
|
||||
|
||||
keystone_rstctrl = of_iomap(node, 0);
|
||||
if (WARN_ON(!keystone_rstctrl))
|
||||
pr_warn("ti,keystone-reset iomap error\n");
|
||||
|
||||
of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
|
||||
}
|
||||
|
||||
static const char *keystone_match[] __initconst = {
|
||||
"ti,keystone-evm",
|
||||
NULL,
|
||||
};
|
||||
|
||||
void keystone_restart(char mode, const char *cmd)
|
||||
{
|
||||
u32 val;
|
||||
|
||||
BUG_ON(!keystone_rstctrl);
|
||||
|
||||
/* Enable write access to RSTCTRL */
|
||||
val = readl(keystone_rstctrl);
|
||||
val &= PLL_RESET_WRITE_KEY_MASK;
|
||||
val |= PLL_RESET_WRITE_KEY;
|
||||
writel(val, keystone_rstctrl);
|
||||
|
||||
/* Reset the SOC */
|
||||
val = readl(keystone_rstctrl);
|
||||
val &= ~PLL_RESET;
|
||||
writel(val, keystone_rstctrl);
|
||||
}
|
||||
|
||||
DT_MACHINE_START(KEYSTONE, "Keystone")
|
||||
.smp = smp_ops(keystone_smp_ops),
|
||||
.init_machine = keystone_init,
|
||||
.dt_compat = keystone_match,
|
||||
.restart = keystone_restart,
|
||||
MACHINE_END
|
|
@ -0,0 +1,17 @@
|
|||
/*
|
||||
* Copyright 2013 Texas Instruments, Inc.
|
||||
* Cyril Chemparathy <cyril@ti.com>
|
||||
* Santosh Shilimkar <santosh.shillimkar@ti.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms and conditions of the GNU General Public License,
|
||||
* version 2, as published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#ifndef __KEYSTONE_H__
|
||||
#define __KEYSTONE_H__
|
||||
|
||||
extern struct smp_operations keystone_smp_ops;
|
||||
extern void secondary_startup(void);
|
||||
|
||||
#endif /* __KEYSTONE_H__ */
|
|
@ -0,0 +1,52 @@
|
|||
/*
|
||||
* Keystone SOC SMP platform code
|
||||
*
|
||||
* Copyright 2013 Texas Instruments, Inc.
|
||||
* Cyril Chemparathy <cyril@ti.com>
|
||||
* Santosh Shilimkar <santosh.shillimkar@ti.com>
|
||||
*
|
||||
* Based on platsmp.c, Copyright (C) 2002 ARM Ltd.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms and conditions of the GNU General Public License,
|
||||
* version 2, as published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/smp.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
#include <asm/smp_plat.h>
|
||||
#include <asm/prom.h>
|
||||
|
||||
#include "keystone.h"
|
||||
|
||||
static int __cpuinit keystone_smp_boot_secondary(unsigned int cpu,
|
||||
struct task_struct *idle)
|
||||
{
|
||||
unsigned long start = virt_to_phys(&secondary_startup);
|
||||
int error;
|
||||
|
||||
pr_debug("keystone-smp: booting cpu %d, vector %08lx\n",
|
||||
cpu, start);
|
||||
|
||||
asm volatile (
|
||||
"mov r0, #0\n" /* power on cmd */
|
||||
"mov r1, %1\n" /* cpu */
|
||||
"mov r2, %2\n" /* start */
|
||||
".inst 0xe1600070\n" /* smc #0 */
|
||||
"mov %0, r0\n"
|
||||
: "=r" (error)
|
||||
: "r"(cpu), "r"(start)
|
||||
: "cc", "r0", "r1", "r2", "memory"
|
||||
);
|
||||
|
||||
pr_debug("keystone-smp: monitor returned %d\n", error);
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
struct smp_operations keystone_smp_ops __initdata = {
|
||||
.smp_init_cpus = arm_dt_init_cpu_maps,
|
||||
.smp_boot_secondary = keystone_smp_boot_secondary,
|
||||
};
|
Loading…
Reference in New Issue