Commit 6a1aa09b authored by Arnd Bergmann's avatar Arnd Bergmann

Merge tag 'renesas-soc-for-v4.14' of...

Merge tag 'renesas-soc-for-v4.14' of https://git.kernel.org/pub/scm/linux/kernel/git/horms/renesas into next/soc

Pull "Renesas ARM Based SoC Updates for v4.14" Simon Horman:

* Add debug-ll support to RZ/G1M (r8a7743) SoC

  Chris Paterson says, "RZ/G1M uses SCIF0 for the debug console, like most
  of the R-Car Gen2 SoCs."

* Remove ARCH_SHMOBILE_MULTI

  Geert Uytterhoeven says, "The migration from ARCH_SHMOBILE_MULTI to
  ARCH_RENESAS has been completed in v4.12..."

* Correct arch timer frequency on RZ/G1M (r8a7743) SoC

  Geert Uytterhoeven says, "According to the datasheet, the frequency of
  the ARM architecture timer on RZ/G1E depends on the frequency of the ZS
  clock..."

* Add support for CPG/MSSR bindings

  Geert Uytterhoeven says, "When using the new CPG/MSSR bindings, there is
  no longer a "renesas,rcar-gen2-cpg-clocks" node, and the code to obtain
  the external clock crystal frequency falls back to a default of 20 MHz.
  While this is correct for all upstream R-Car Gen2 and RZ/G1 boards, this
  is not necessarily the case for out-of-tree third party boards.

  Add support for finding the external clock crystal oscillator on RZ/G1M,
  and on R-Car H2, M2-W, and M2-N using the new CPG/MSSR bindings, through
  the corresponding "renesas,r8a77xx-cpg-mssr" nodes."

* Obtain jump stub region from DT

  Geert Uytterhoeven says, "Add support for obtaining from DT the SRAM
  region to store the jump stub for CPU core bringup, according to the
  renesas,smp-sram DT bindings."

* tag 'renesas-soc-for-v4.14' of https://git.kernel.org/pub/scm/linux/kernel/git/horms/renesas:
  ARM: shmobile: Remove ARCH_SHMOBILE_MULTI
  ARM: shmobile: rcar-gen2: Correct arch timer frequency on RZ/G1E
  ARM: shmobile: rcar-gen2: Add support for CPG/MSSR bindings
  ARM: shmobile: rcar-gen2: Obtain jump stub region from DT
  ARM: debug-ll: Add support for r8a7743
parents 5cc3928c 84a1e84b
...@@ -896,12 +896,13 @@ choice ...@@ -896,12 +896,13 @@ choice
via SCIF2 on Renesas R-Car H1 (R8A7779). via SCIF2 on Renesas R-Car H1 (R8A7779).
config DEBUG_RCAR_GEN2_SCIF0 config DEBUG_RCAR_GEN2_SCIF0
bool "Kernel low-level debugging messages via SCIF0 on R8A7790/R8A7791/R8A7792/R8A7793" bool "Kernel low-level debugging messages via SCIF0 on R-Car Gen2 and RZ/G1"
depends on ARCH_R8A7790 || ARCH_R8A7791 || ARCH_R8A7792 || ARCH_R8A7793 depends on ARCH_R8A7743 || ARCH_R8A7790 || ARCH_R8A7791 || \
ARCH_R8A7792 || ARCH_R8A7793
help help
Say Y here if you want kernel low-level debugging support Say Y here if you want kernel low-level debugging support
via SCIF0 on Renesas R-Car H2 (R8A7790), M2-W (R8A7791), V2H via SCIF0 on Renesas RZ/G1M (R8A7743), R-Car H2 (R8A7790),
(R8A7792), or M2-N (R8A7793). M2-W (R8A7791), V2H (R8A7792), or M2-N (R8A7793).
config DEBUG_RCAR_GEN2_SCIF2 config DEBUG_RCAR_GEN2_SCIF2
bool "Kernel low-level debugging messages via SCIF2 on R8A7794" bool "Kernel low-level debugging messages via SCIF2 on R8A7794"
......
config ARCH_SHMOBILE config ARCH_SHMOBILE
bool bool
config ARCH_SHMOBILE_MULTI
bool
config PM_RMOBILE config PM_RMOBILE
bool bool
select PM select PM
...@@ -34,7 +31,6 @@ menuconfig ARCH_RENESAS ...@@ -34,7 +31,6 @@ menuconfig ARCH_RENESAS
depends on ARCH_MULTI_V7 && MMU depends on ARCH_MULTI_V7 && MMU
select ARCH_DMA_ADDR_T_64BIT if ARM_LPAE select ARCH_DMA_ADDR_T_64BIT if ARM_LPAE
select ARCH_SHMOBILE select ARCH_SHMOBILE
select ARCH_SHMOBILE_MULTI
select ARM_GIC select ARM_GIC
select GPIOLIB select GPIOLIB
select HAVE_ARM_SCU if SMP select HAVE_ARM_SCU if SMP
......
...@@ -11,7 +11,9 @@ ...@@ -11,7 +11,9 @@
*/ */
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/ioport.h>
#include <linux/of.h> #include <linux/of.h>
#include <linux/of_address.h>
#include <linux/smp.h> #include <linux/smp.h>
#include <linux/soc/renesas/rcar-sysc.h> #include <linux/soc/renesas/rcar-sysc.h>
#include <asm/io.h> #include <asm/io.h>
...@@ -69,8 +71,9 @@ void __init rcar_gen2_pm_init(void) ...@@ -69,8 +71,9 @@ void __init rcar_gen2_pm_init(void)
struct device_node *np, *cpus; struct device_node *np, *cpus;
bool has_a7 = false; bool has_a7 = false;
bool has_a15 = false; bool has_a15 = false;
phys_addr_t boot_vector_addr = ICRAM1; struct resource res;
u32 syscier = 0; u32 syscier = 0;
int error;
if (once++) if (once++)
return; return;
...@@ -91,14 +94,38 @@ void __init rcar_gen2_pm_init(void) ...@@ -91,14 +94,38 @@ void __init rcar_gen2_pm_init(void)
else if (of_machine_is_compatible("renesas,r8a7791")) else if (of_machine_is_compatible("renesas,r8a7791"))
syscier = 0x00111003; syscier = 0x00111003;
np = of_find_compatible_node(NULL, NULL, "renesas,smp-sram");
if (!np) {
/* No smp-sram in DT, fall back to hardcoded address */
res = (struct resource)DEFINE_RES_MEM(ICRAM1,
shmobile_boot_size);
goto map;
}
error = of_address_to_resource(np, 0, &res);
if (error) {
pr_err("Failed to get smp-sram address: %d\n", error);
return;
}
map:
/* RAM for jump stub, because BAR requires 256KB aligned address */ /* RAM for jump stub, because BAR requires 256KB aligned address */
p = ioremap_nocache(boot_vector_addr, shmobile_boot_size); if (res.start & (256 * 1024 - 1) ||
resource_size(&res) < shmobile_boot_size) {
pr_err("Invalid smp-sram region\n");
return;
}
p = ioremap(res.start, resource_size(&res));
if (!p)
return;
memcpy_toio(p, shmobile_boot_vector, shmobile_boot_size); memcpy_toio(p, shmobile_boot_vector, shmobile_boot_size);
iounmap(p); iounmap(p);
/* setup reset vectors */ /* setup reset vectors */
p = ioremap_nocache(RST, 0x63); p = ioremap_nocache(RST, 0x63);
bar = phys_to_sbar(boot_vector_addr); bar = phys_to_sbar(res.start);
if (has_a15) { if (has_a15) {
writel_relaxed(bar, p + CA15BAR); writel_relaxed(bar, p + CA15BAR);
writel_relaxed(bar | SBAR_BAREN, p + CA15BAR); writel_relaxed(bar | SBAR_BAREN, p + CA15BAR);
......
...@@ -29,17 +29,29 @@ ...@@ -29,17 +29,29 @@
#include "common.h" #include "common.h"
#include "rcar-gen2.h" #include "rcar-gen2.h"
static const struct of_device_id cpg_matches[] __initconst = {
{ .compatible = "renesas,rcar-gen2-cpg-clocks", },
{ .compatible = "renesas,r8a7743-cpg-mssr", .data = "extal" },
{ .compatible = "renesas,r8a7790-cpg-mssr", .data = "extal" },
{ .compatible = "renesas,r8a7791-cpg-mssr", .data = "extal" },
{ .compatible = "renesas,r8a7793-cpg-mssr", .data = "extal" },
{ /* sentinel */ }
};
static unsigned int __init get_extal_freq(void) static unsigned int __init get_extal_freq(void)
{ {
const struct of_device_id *match;
struct device_node *cpg, *extal; struct device_node *cpg, *extal;
u32 freq = 20000000; u32 freq = 20000000;
int idx = 0;
cpg = of_find_compatible_node(NULL, NULL, cpg = of_find_matching_node_and_match(NULL, cpg_matches, &match);
"renesas,rcar-gen2-cpg-clocks");
if (!cpg) if (!cpg)
return freq; return freq;
extal = of_parse_phandle(cpg, "clocks", 0); if (match->data)
idx = of_property_match_string(cpg, "clock-names", match->data);
extal = of_parse_phandle(cpg, "clocks", idx);
of_node_put(cpg); of_node_put(cpg);
if (!extal) if (!extal)
return freq; return freq;
...@@ -58,7 +70,8 @@ void __init rcar_gen2_timer_init(void) ...@@ -58,7 +70,8 @@ void __init rcar_gen2_timer_init(void)
void __iomem *base; void __iomem *base;
u32 freq; u32 freq;
if (of_machine_is_compatible("renesas,r8a7792") || if (of_machine_is_compatible("renesas,r8a7745") ||
of_machine_is_compatible("renesas,r8a7792") ||
of_machine_is_compatible("renesas,r8a7794")) { of_machine_is_compatible("renesas,r8a7794")) {
freq = 260000000 / 8; /* ZS / 8 */ freq = 260000000 / 8; /* ZS / 8 */
/* CNTVOFF has to be initialized either from non-secure /* CNTVOFF has to be initialized either from non-secure
......
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