Commit 2dc24b0d authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'soc2-for-3.16' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc

Pull part two of ARM SoC updates from Arnd Bergmann:
 "This is a small follow-up to the larger ARM SoC updates merged last
  week, almost entirely for the keystone platform.

  The main change here is to use the new dma-ranges parsing code that
  came in through Russell's ARM tree.  This allows the keystone platform
  to do cache-coherent DMA and to finally support all the available
  physical memory when LPAE is enabled.

  Aside from this, the keystone reset driver has been rewritten, and
  there is a small bug fix to allow building the orion5x platform again"

* tag 'soc2-for-3.16' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc:
  ARM: keystone: Drop use of meminfo since its not available anymore
  ARM: orion5x: fix mvebu_mbus_dt_init call
  ARM: configs: keystone: enable reset driver support
  ARM: dts: keystone: update reset node to work with reset driver
  ARM: keystone: remove redundant reset stuff
  ARM: keystone: Update the dma offset for non-dt platform devices
  ARM: keystone: Switch over to coherent memory address space
  ARM: configs: keystone: add MTD_SPI_NOR (new dependency for M25P80)
  ARM: configs: keystone: drop CONFIG_COMMON_CLK_DEBUG
parents 2840c566 bbea06f3
...@@ -66,9 +66,21 @@ soc { ...@@ -66,9 +66,21 @@ soc {
ranges = <0x0 0x0 0x0 0xc0000000>; ranges = <0x0 0x0 0x0 0xc0000000>;
dma-ranges = <0x80000000 0x8 0x00000000 0x80000000>; dma-ranges = <0x80000000 0x8 0x00000000 0x80000000>;
pllctrl: pll-controller@02310000 {
compatible = "ti,keystone-pllctrl", "syscon";
reg = <0x02310000 0x200>;
};
devctrl: device-state-control@02620000 {
compatible = "ti,keystone-devctrl", "syscon";
reg = <0x02620000 0x1000>;
};
rstctrl: reset-controller { rstctrl: reset-controller {
compatible = "ti,keystone-reset"; compatible = "ti,keystone-reset";
reg = <0x023100e8 4>; /* pll reset control reg */ ti,syscon-pll = <&pllctrl 0xe4>;
ti,syscon-dev = <&devctrl 0x328>;
ti,wdt-list = <0>;
}; };
/include/ "keystone-clocks.dtsi" /include/ "keystone-clocks.dtsi"
......
...@@ -73,7 +73,6 @@ CONFIG_LEDS_TRIGGER_HEARTBEAT=y ...@@ -73,7 +73,6 @@ CONFIG_LEDS_TRIGGER_HEARTBEAT=y
CONFIG_LEDS_TRIGGER_CPU=y CONFIG_LEDS_TRIGGER_CPU=y
CONFIG_RTC_CLASS=y CONFIG_RTC_CLASS=y
CONFIG_RTC_DRV_PL030=y CONFIG_RTC_DRV_PL030=y
CONFIG_COMMON_CLK_DEBUG=y
CONFIG_EXT2_FS=y CONFIG_EXT2_FS=y
CONFIG_VFAT_FS=y CONFIG_VFAT_FS=y
CONFIG_TMPFS=y CONFIG_TMPFS=y
......
...@@ -112,6 +112,7 @@ CONFIG_MTD_PLATRAM=y ...@@ -112,6 +112,7 @@ CONFIG_MTD_PLATRAM=y
CONFIG_MTD_M25P80=y CONFIG_MTD_M25P80=y
CONFIG_MTD_NAND=y CONFIG_MTD_NAND=y
CONFIG_MTD_NAND_DAVINCI=y CONFIG_MTD_NAND_DAVINCI=y
CONFIG_MTD_SPI_NOR=y
CONFIG_MTD_UBI=y CONFIG_MTD_UBI=y
CONFIG_PROC_DEVICETREE=y CONFIG_PROC_DEVICETREE=y
CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_LOOP=y
...@@ -131,6 +132,9 @@ CONFIG_SPI=y ...@@ -131,6 +132,9 @@ CONFIG_SPI=y
CONFIG_SPI_DAVINCI=y CONFIG_SPI_DAVINCI=y
CONFIG_SPI_SPIDEV=y CONFIG_SPI_SPIDEV=y
# CONFIG_HWMON is not set # CONFIG_HWMON is not set
CONFIG_POWER_SUPPLY=y
CONFIG_POWER_RESET=y
CONFIG_POWER_RESET_KEYSTONE=y
CONFIG_WATCHDOG=y CONFIG_WATCHDOG=y
CONFIG_WATCHDOG_CORE=y CONFIG_WATCHDOG_CORE=y
CONFIG_DAVINCI_WATCHDOG=y CONFIG_DAVINCI_WATCHDOG=y
...@@ -145,7 +149,6 @@ CONFIG_USB_DWC3_VERBOSE=y ...@@ -145,7 +149,6 @@ CONFIG_USB_DWC3_VERBOSE=y
CONFIG_KEYSTONE_USB_PHY=y CONFIG_KEYSTONE_USB_PHY=y
CONFIG_DMADEVICES=y CONFIG_DMADEVICES=y
CONFIG_TI_EDMA=y CONFIG_TI_EDMA=y
CONFIG_COMMON_CLK_DEBUG=y
CONFIG_MEMORY=y CONFIG_MEMORY=y
CONFIG_TI_AEMIF=y CONFIG_TI_AEMIF=y
CONFIG_EXT4_FS=y CONFIG_EXT4_FS=y
......
...@@ -73,7 +73,6 @@ CONFIG_LEDS_TRIGGERS=y ...@@ -73,7 +73,6 @@ CONFIG_LEDS_TRIGGERS=y
CONFIG_RTC_CLASS=y CONFIG_RTC_CLASS=y
CONFIG_RTC_DRV_VT8500=y CONFIG_RTC_DRV_VT8500=y
CONFIG_DMADEVICES=y CONFIG_DMADEVICES=y
CONFIG_COMMON_CLK_DEBUG=y
# CONFIG_IOMMU_SUPPORT is not set # CONFIG_IOMMU_SUPPORT is not set
CONFIG_PWM=y CONFIG_PWM=y
CONFIG_PWM_VT8500=y CONFIG_PWM_VT8500=y
......
...@@ -14,60 +14,100 @@ ...@@ -14,60 +14,100 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/of_platform.h> #include <linux/of_platform.h>
#include <linux/of_address.h> #include <linux/of_address.h>
#include <linux/memblock.h>
#include <asm/setup.h> #include <asm/setup.h>
#include <asm/mach/map.h> #include <asm/mach/map.h>
#include <asm/mach/arch.h> #include <asm/mach/arch.h>
#include <asm/mach/time.h> #include <asm/mach/time.h>
#include <asm/smp_plat.h> #include <asm/smp_plat.h>
#include <asm/memory.h>
#include "keystone.h" #include "memory.h"
#define PLL_RESET_WRITE_KEY_MASK 0xffff0000 #include "keystone.h"
#define PLL_RESET_WRITE_KEY 0x5a69
#define PLL_RESET BIT(16)
static void __iomem *keystone_rstctrl; static struct notifier_block platform_nb;
static unsigned long keystone_dma_pfn_offset __read_mostly;
static void __init keystone_init(void) static int keystone_platform_notifier(struct notifier_block *nb,
unsigned long event, void *data)
{ {
struct device_node *node; struct device *dev = data;
node = of_find_compatible_node(NULL, NULL, "ti,keystone-reset"); if (event != BUS_NOTIFY_ADD_DEVICE)
if (WARN_ON(!node)) return NOTIFY_DONE;
pr_warn("ti,keystone-reset node undefined\n");
keystone_rstctrl = of_iomap(node, 0); if (!dev)
if (WARN_ON(!keystone_rstctrl)) return NOTIFY_BAD;
pr_warn("ti,keystone-reset iomap error\n");
if (!dev->of_node) {
dev->dma_pfn_offset = keystone_dma_pfn_offset;
dev_err(dev, "set dma_pfn_offset%08lx\n",
dev->dma_pfn_offset);
}
return NOTIFY_OK;
}
static void __init keystone_init(void)
{
keystone_pm_runtime_init(); keystone_pm_runtime_init();
if (platform_nb.notifier_call)
bus_register_notifier(&platform_bus_type, &platform_nb);
of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
} }
static const char *keystone_match[] __initconst = { static phys_addr_t keystone_virt_to_idmap(unsigned long x)
"ti,keystone", {
NULL, return (phys_addr_t)(x) - CONFIG_PAGE_OFFSET + KEYSTONE_LOW_PHYS_START;
}; }
void keystone_restart(enum reboot_mode mode, const char *cmd) static void __init keystone_init_meminfo(void)
{ {
u32 val; bool lpae = IS_ENABLED(CONFIG_ARM_LPAE);
bool pvpatch = IS_ENABLED(CONFIG_ARM_PATCH_PHYS_VIRT);
phys_addr_t offset = PHYS_OFFSET - KEYSTONE_LOW_PHYS_START;
phys_addr_t mem_start, mem_end;
mem_start = memblock_start_of_DRAM();
mem_end = memblock_end_of_DRAM();
/* nothing to do if we are running out of the <32-bit space */
if (mem_start >= KEYSTONE_LOW_PHYS_START &&
mem_end <= KEYSTONE_LOW_PHYS_END)
return;
if (!lpae || !pvpatch) {
pr_crit("Enable %s%s%s to run outside 32-bit space\n",
!lpae ? __stringify(CONFIG_ARM_LPAE) : "",
(!lpae && !pvpatch) ? " and " : "",
!pvpatch ? __stringify(CONFIG_ARM_PATCH_PHYS_VIRT) : "");
}
if (mem_start < KEYSTONE_HIGH_PHYS_START ||
mem_end > KEYSTONE_HIGH_PHYS_END) {
pr_crit("Invalid address space for memory (%08llx-%08llx)\n",
(u64)mem_start, (u64)mem_end);
}
BUG_ON(!keystone_rstctrl); offset += KEYSTONE_HIGH_PHYS_START;
__pv_phys_pfn_offset = PFN_DOWN(offset);
__pv_offset = (offset - PAGE_OFFSET);
/* Enable write access to RSTCTRL */ /* Populate the arch idmap hook */
val = readl(keystone_rstctrl); arch_virt_to_idmap = keystone_virt_to_idmap;
val &= PLL_RESET_WRITE_KEY_MASK; platform_nb.notifier_call = keystone_platform_notifier;
val |= PLL_RESET_WRITE_KEY; keystone_dma_pfn_offset = PFN_DOWN(KEYSTONE_HIGH_PHYS_START -
writel(val, keystone_rstctrl); KEYSTONE_LOW_PHYS_START);
/* Reset the SOC */ pr_info("Switching to high address space at 0x%llx\n", (u64)offset);
val = readl(keystone_rstctrl);
val &= ~PLL_RESET;
writel(val, keystone_rstctrl);
} }
static const char *keystone_match[] __initconst = {
"ti,keystone",
NULL,
};
DT_MACHINE_START(KEYSTONE, "Keystone") DT_MACHINE_START(KEYSTONE, "Keystone")
#if defined(CONFIG_ZONE_DMA) && defined(CONFIG_ARM_LPAE) #if defined(CONFIG_ZONE_DMA) && defined(CONFIG_ARM_LPAE)
.dma_zone_size = SZ_2G, .dma_zone_size = SZ_2G,
...@@ -75,5 +115,5 @@ DT_MACHINE_START(KEYSTONE, "Keystone") ...@@ -75,5 +115,5 @@ DT_MACHINE_START(KEYSTONE, "Keystone")
.smp = smp_ops(keystone_smp_ops), .smp = smp_ops(keystone_smp_ops),
.init_machine = keystone_init, .init_machine = keystone_init,
.dt_compat = keystone_match, .dt_compat = keystone_match,
.restart = keystone_restart, .init_meminfo = keystone_init_meminfo,
MACHINE_END MACHINE_END
/*
* Copyright 2014 Texas Instruments, Inc.
* Santosh Shilimkar <santosh.shilimkar@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 __MEMORY_H
#define __MEMORY_H
#define MAX_PHYSMEM_BITS 36
#define SECTION_SIZE_BITS 34
#define KEYSTONE_LOW_PHYS_START 0x80000000ULL
#define KEYSTONE_LOW_PHYS_SIZE 0x80000000ULL /* 2G */
#define KEYSTONE_LOW_PHYS_END (KEYSTONE_LOW_PHYS_START + \
KEYSTONE_LOW_PHYS_SIZE - 1)
#define KEYSTONE_HIGH_PHYS_START 0x800000000ULL
#define KEYSTONE_HIGH_PHYS_SIZE 0x400000000ULL /* 16G */
#define KEYSTONE_HIGH_PHYS_END (KEYSTONE_HIGH_PHYS_START + \
KEYSTONE_HIGH_PHYS_SIZE - 1)
#endif /* __MEMORY_H */
...@@ -17,13 +17,16 @@ ...@@ -17,13 +17,16 @@
#include <linux/io.h> #include <linux/io.h>
#include <asm/smp_plat.h> #include <asm/smp_plat.h>
#include <asm/prom.h>
#include <asm/tlbflush.h>
#include <asm/pgtable.h>
#include "keystone.h" #include "keystone.h"
static int keystone_smp_boot_secondary(unsigned int cpu, static int keystone_smp_boot_secondary(unsigned int cpu,
struct task_struct *idle) struct task_struct *idle)
{ {
unsigned long start = virt_to_phys(&secondary_startup); unsigned long start = virt_to_idmap(&secondary_startup);
int error; int error;
pr_debug("keystone-smp: booting cpu %d, vector %08lx\n", pr_debug("keystone-smp: booting cpu %d, vector %08lx\n",
...@@ -36,6 +39,19 @@ static int keystone_smp_boot_secondary(unsigned int cpu, ...@@ -36,6 +39,19 @@ static int keystone_smp_boot_secondary(unsigned int cpu,
return error; return error;
} }
#ifdef CONFIG_ARM_LPAE
static void __cpuinit keystone_smp_secondary_initmem(unsigned int cpu)
{
pgd_t *pgd0 = pgd_offset_k(0);
cpu_set_ttbr(1, __pa(pgd0) + TTBR1_OFFSET);
local_flush_tlb_all();
}
#else
static inline void __cpuinit keystone_smp_secondary_initmem(unsigned int cpu)
{}
#endif
struct smp_operations keystone_smp_ops __initdata = { struct smp_operations keystone_smp_ops __initdata = {
.smp_boot_secondary = keystone_smp_boot_secondary, .smp_boot_secondary = keystone_smp_boot_secondary,
.smp_secondary_init = keystone_smp_secondary_initmem,
}; };
...@@ -45,7 +45,7 @@ static void __init orion5x_dt_init(void) ...@@ -45,7 +45,7 @@ static void __init orion5x_dt_init(void)
orion5x_id(&dev, &rev, &dev_name); orion5x_id(&dev, &rev, &dev_name);
printk(KERN_INFO "Orion ID: %s. TCLK=%d.\n", dev_name, orion5x_tclk); printk(KERN_INFO "Orion ID: %s. TCLK=%d.\n", dev_name, orion5x_tclk);
BUG_ON(mvebu_mbus_dt_init()); BUG_ON(mvebu_mbus_dt_init(false));
/* /*
* Setup Orion address map * Setup Orion address map
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment