[PATCH v2 2/3] ARM: keystone: Add minimal TI Keystone platform support

Olof Johansson olof at lixom.net
Mon Jun 17 17:19:39 EDT 2013


Hi,

More little nits below.

On Wed, Jun 12, 2013 at 05:25:16PM -0400, Santosh Shilimkar wrote:
> Texas Instruments Keystone family of multi-core devices are
> based on ARM Cortex A15. Patch adds basic definitions for a
> new Keystone sub-architecture in ARM.
> 
> The TCI66xxK2H Communications Infrastructure Keystone SoCs
> are member of the C66x family based on TI's new KeyStone 2
> multi-core SoC Architecture designed specifically for high
> performance wireless and networking infrastructure applications.
> The SOCs contains many subsystems like Cortex A15 ARM CorePacs,
> C66XX DSP CorePacs, MSMC memory controller, Tera Net bus,
> IP Network, Navigator, Hyperlink, 1G/10G Ethernet, Radio layers
> and queue based communication systems.
> 
> Cc: Olof Johansson <olof at lixom.net>
> Cc: Arnd Bergmann <arnd at arndb.de>
> Cc: arm at kernel.org
> 
> Signed-off-by: Santosh Shilimkar <santosh.shilimkar at ti.com>
> ---
>  arch/arm/Kconfig                     |    3 +
>  arch/arm/Kconfig.debug               |   16 ++++
>  arch/arm/Makefile                    |    1 +
>  arch/arm/configs/keystone_defconfig  |  157 ++++++++++++++++++++++++++++++++++
>  arch/arm/include/debug/keystone.S    |   43 ++++++++++
>  arch/arm/mach-keystone/Kconfig       |   14 +++
>  arch/arm/mach-keystone/Makefile      |    1 +
>  arch/arm/mach-keystone/Makefile.boot |    1 +
>  arch/arm/mach-keystone/keystone.c    |   73 ++++++++++++++++
>  9 files changed, 309 insertions(+)
>  create mode 100644 arch/arm/configs/keystone_defconfig
>  create mode 100644 arch/arm/include/debug/keystone.S
>  create mode 100644 arch/arm/mach-keystone/Kconfig
>  create mode 100644 arch/arm/mach-keystone/Makefile
>  create mode 100644 arch/arm/mach-keystone/Makefile.boot
>  create mode 100644 arch/arm/mach-keystone/keystone.c
> 
> diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
> index 49d993c..37fe64c 100644
> --- a/arch/arm/Kconfig
> +++ b/arch/arm/Kconfig
> @@ -948,6 +948,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"
> @@ -1564,6 +1566,7 @@ config ARCH_NR_GPIO
>  	default 352 if ARCH_VT8500
>  	default 288 if ARCH_SUNXI
>  	default 264 if MACH_H4700
> +	default 512 if ARCH_KEYSTONE

These are ordered in falling order, so please insert higher.

>  	default 0
>  	help
>  	  Maximum number of GPIOs in the system.
> diff --git a/arch/arm/Kconfig.debug b/arch/arm/Kconfig.debug
> index 1d41908..62e7f95 100644
> --- a/arch/arm/Kconfig.debug
> +++ b/arch/arm/Kconfig.debug
> @@ -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
> @@ -632,6 +646,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
>  	default "debug/mxs.S" if DEBUG_IMX23_UART || DEBUG_IMX28_UART
>  	default "debug/nomadik.S" if DEBUG_NOMADIK_UART
> diff --git a/arch/arm/Makefile b/arch/arm/Makefile
> index 1ba358b..a1c9a78 100644
> --- a/arch/arm/Makefile
> +++ b/arch/arm/Makefile
> @@ -194,6 +194,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.
> diff --git a/arch/arm/configs/keystone_defconfig b/arch/arm/configs/keystone_defconfig
> new file mode 100644
> index 0000000..62e968c
> --- /dev/null
> +++ b/arch/arm/configs/keystone_defconfig
> @@ -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
> diff --git a/arch/arm/include/debug/keystone.S b/arch/arm/include/debug/keystone.S
> new file mode 100644
> index 0000000..9c75a4c
> --- /dev/null
> +++ b/arch/arm/include/debug/keystone.S
> @@ -0,0 +1,43 @@
> +/*
> + * Early serial debug output macro for Keystone SOCs
> + *
> + * Copyright 2013 Texas Instruments, Inc.
> + *	Santosh Shilimkar ,santosh.shilimkar at ti.com>

Typo?

> + *
> + * 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
> diff --git a/arch/arm/mach-keystone/Kconfig b/arch/arm/mach-keystone/Kconfig
> new file mode 100644
> index 0000000..aebe8cd
> --- /dev/null
> +++ b/arch/arm/mach-keystone/Kconfig
> @@ -0,0 +1,14 @@
> +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 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.
> diff --git a/arch/arm/mach-keystone/Makefile b/arch/arm/mach-keystone/Makefile
> new file mode 100644
> index 0000000..d4671d5
> --- /dev/null
> +++ b/arch/arm/mach-keystone/Makefile
> @@ -0,0 +1 @@
> +obj-y					:= keystone.o
> diff --git a/arch/arm/mach-keystone/Makefile.boot b/arch/arm/mach-keystone/Makefile.boot
> new file mode 100644
> index 0000000..f3835c4
> --- /dev/null
> +++ b/arch/arm/mach-keystone/Makefile.boot
> @@ -0,0 +1 @@
> +zreladdr-y	:= 0x80008000
> diff --git a/arch/arm/mach-keystone/keystone.c b/arch/arm/mach-keystone/keystone.c
> new file mode 100644
> index 0000000..c4912c4
> --- /dev/null
> +++ b/arch/arm/mach-keystone/keystone.c
> @@ -0,0 +1,73 @@
> +/*
> + * Keystone2 based boards and SOC related code.
> + *
> + * Copyright 2013 Texas Instruments, Inc.
> + *	Cyril Chemparathy <cyril at ti.com>
> + *	Santosh Shilimkar <santosh.shillimkar at 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>
> +
> +#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");

ti,keystone-reset (no space). Also, you probably want to continue populate
other devices so you have a chance to get up to prompt to debug your issue;
it's not like panicking will be able to reset anyway.

> +		return;
> +	}
> +
> +	keystone_rstctrl = of_iomap(node, 0);
> +	if (WARN_ON(!keystone_rstctrl)) {
> +		pr_warn("ti, keystone-reset iomap error\n");

again ti,keystone-reset and the return

> +		return;
> +	}
> +
> +	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;
> +

It makes sense to do some sanity check of keystone_rstctrl here and warn and
spin (or similar) in case it's not configured, since the configuration can fail
above.

> +	/* 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")
> +	.init_machine	= keystone_init,
> +	.dt_compat	= keystone_match,
> +	.restart	= keystone_restart,
> +MACHINE_END



More information about the linux-arm-kernel mailing list