* [PATCHv1 0/2] ARM: socfpga: Soft reset, hotplug and device tree clocks
@ 2013-03-13 21:55 dinguyen at altera.com
2013-03-13 21:55 ` [PATCHv1 1/2] ARM: socfpga: Enable hotplug and soft reset dinguyen at altera.com
` (2 more replies)
0 siblings, 3 replies; 13+ messages in thread
From: dinguyen at altera.com @ 2013-03-13 21:55 UTC (permalink / raw)
To: linux-arm-kernel
From: Dinh Nguyen <dinguyen@altera.com>
Hi Arnd/Olof,
Just 2 patches for mach-socfpga:
0001: ARM: socfpga: Enable hotplug and soft reset
- Able to hotplug CPU1 by putting it into reset and bringing back online.
0002: ARM: socfpga: Add clock entries into device tree
- Correctly use the clock framework with device tree entries.
- Based from clk-highbank.c
Based on arm-soc/for-next.
Thanks,
Dinh
Dinh Nguyen (2):
ARM: socfpga: Enable hotplug and soft reset
ARM: socfpga: Add clock entries into device tree
.../bindings/arm/altera/socfpga-clk-manager.txt | 11 ++
.../devicetree/bindings/clock/altr_socfpga.txt | 15 ++
arch/arm/boot/dts/socfpga.dtsi | 154 +++++++++++++++++
arch/arm/boot/dts/socfpga_cyclone5.dts | 8 +
arch/arm/boot/dts/socfpga_vt.dts | 8 +
arch/arm/mach-socfpga/core.h | 17 ++
arch/arm/mach-socfpga/platsmp.c | 9 +-
arch/arm/mach-socfpga/socfpga.c | 16 +-
drivers/clk/socfpga/clk.c | 174 +++++++++++++++++---
9 files changed, 387 insertions(+), 25 deletions(-)
create mode 100644 Documentation/devicetree/bindings/arm/altera/socfpga-clk-manager.txt
create mode 100644 Documentation/devicetree/bindings/clock/altr_socfpga.txt
--
1.7.9.5
^ permalink raw reply [flat|nested] 13+ messages in thread* [PATCHv1 1/2] ARM: socfpga: Enable hotplug and soft reset 2013-03-13 21:55 [PATCHv1 0/2] ARM: socfpga: Soft reset, hotplug and device tree clocks dinguyen at altera.com @ 2013-03-13 21:55 ` dinguyen at altera.com 2013-03-17 18:18 ` Pavel Machek 2013-03-13 21:55 ` [PATCHv1 2/2] ARM: socfpga: Add clock entries into device tree dinguyen at altera.com 2013-03-14 1:04 ` [PATCHv1 0/2] ARM: socfpga: Soft reset, hotplug and device tree clocks Rob Herring 2 siblings, 1 reply; 13+ messages in thread From: dinguyen at altera.com @ 2013-03-13 21:55 UTC (permalink / raw) To: linux-arm-kernel From: Dinh Nguyen <dinguyen@altera.com> Put CPU1 into reset when it is hotplugged. Enable a cold or warm reset to the HW from userspace. Also fix a few sparse errors: warning: symbol 'sys_manager_base_addr' was not declared. Should it be static? warning: symbol 'rst_manager_base_addr' was not declared. Should it be static? Signed-off-by: Dinh Nguyen <dinguyen@altera.com> --- arch/arm/mach-socfpga/core.h | 17 +++++++++++++++++ arch/arm/mach-socfpga/platsmp.c | 9 ++++++--- arch/arm/mach-socfpga/socfpga.c | 10 +++++++++- 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/arch/arm/mach-socfpga/core.h b/arch/arm/mach-socfpga/core.h index 315edff..d2a251f 100644 --- a/arch/arm/mach-socfpga/core.h +++ b/arch/arm/mach-socfpga/core.h @@ -20,12 +20,29 @@ #ifndef __MACH_CORE_H #define __MACH_CORE_H +#define SOCFPGA_RSTMGR_CTRL 0x04 +#define SOCFPGA_RSTMGR_MODPERRST 0x14 +#define SOCFPGA_RSTMGR_BRGMODRST 0x1c + +/* System Manager bits */ +#define RSTMGR_CTRL_SWCOLDRSTREQ 0x1 /* Cold Reset */ +#define RSTMGR_CTRL_SWWARMRSTREQ 0x2 /* Warm Reset */ +/*MPU Module Reset Register */ +#define RSTMGR_MPUMODRST_CPU0 0x1 /*CPU0 Reset*/ +#define RSTMGR_MPUMODRST_CPU1 0x2 /*CPU1 Reset*/ +#define RSTMGR_MPUMODRST_WDS 0x4 /*Watchdog Reset*/ +#define RSTMGR_MPUMODRST_SCUPER 0x8 /*SCU and periphs reset*/ +#define RSTMGR_MPUMODRST_L2 0x10 /*L2 Cache reset*/ + extern void socfpga_secondary_startup(void); extern void __iomem *socfpga_scu_base_addr; extern void socfpga_init_clocks(void); extern void socfpga_sysmgr_init(void); +extern void __iomem *sys_manager_base_addr; +extern void __iomem *rst_manager_base_addr; + extern struct smp_operations socfpga_smp_ops; extern char secondary_trampoline, secondary_trampoline_end; diff --git a/arch/arm/mach-socfpga/platsmp.c b/arch/arm/mach-socfpga/platsmp.c index 84c60fa..c75c33d 100644 --- a/arch/arm/mach-socfpga/platsmp.c +++ b/arch/arm/mach-socfpga/platsmp.c @@ -30,9 +30,6 @@ #include "core.h" -extern void __iomem *sys_manager_base_addr; -extern void __iomem *rst_manager_base_addr; - static void __cpuinit socfpga_secondary_init(unsigned int cpu) { /* @@ -100,6 +97,12 @@ static void __init socfpga_smp_prepare_cpus(unsigned int max_cpus) */ static void socfpga_cpu_die(unsigned int cpu) { + /* Flush the L1 data cache. */ + flush_cache_all(); + + /* This will put CPU1 into reset.*/ + __raw_writel(RSTMGR_MPUMODRST_CPU1, rst_manager_base_addr + 0x10); + cpu_do_idle(); /* We should have never returned from idle */ diff --git a/arch/arm/mach-socfpga/socfpga.c b/arch/arm/mach-socfpga/socfpga.c index 1042c02..b41a945 100644 --- a/arch/arm/mach-socfpga/socfpga.c +++ b/arch/arm/mach-socfpga/socfpga.c @@ -87,7 +87,15 @@ static void __init socfpga_init_irq(void) static void socfpga_cyclone5_restart(char mode, const char *cmd) { - /* TODO: */ + u32 temp; + + temp = __raw_readl(rst_manager_base_addr + SOCFPGA_RSTMGR_CTRL); + + if (mode == 'h') + temp |= RSTMGR_CTRL_SWCOLDRSTREQ; + else + temp |= RSTMGR_CTRL_SWWARMRSTREQ; + __raw_writel(temp, rst_manager_base_addr + SOCFPGA_RSTMGR_CTRL); } static void __init socfpga_cyclone5_init(void) -- 1.7.9.5 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCHv1 1/2] ARM: socfpga: Enable hotplug and soft reset 2013-03-13 21:55 ` [PATCHv1 1/2] ARM: socfpga: Enable hotplug and soft reset dinguyen at altera.com @ 2013-03-17 18:18 ` Pavel Machek 0 siblings, 0 replies; 13+ messages in thread From: Pavel Machek @ 2013-03-17 18:18 UTC (permalink / raw) To: linux-arm-kernel Hi! > Put CPU1 into reset when it is hotplugged. > Enable a cold or warm reset to the HW from userspace. > > Also fix a few sparse errors: > > warning: symbol 'sys_manager_base_addr' was not declared. Should it be static? > warning: symbol 'rst_manager_base_addr' was not declared. Should it be static? > > Signed-off-by: Dinh Nguyen <dinguyen@altera.com> It seems pretty good. > --- a/arch/arm/mach-socfpga/core.h > +++ b/arch/arm/mach-socfpga/core.h > +/*MPU Module Reset Register */ > +#define RSTMGR_MPUMODRST_CPU0 0x1 /*CPU0 Reset*/ > +#define RSTMGR_MPUMODRST_CPU1 0x2 /*CPU1 Reset*/ > +#define RSTMGR_MPUMODRST_WDS 0x4 /*Watchdog Reset*/ > +#define RSTMGR_MPUMODRST_SCUPER 0x8 /*SCU and periphs reset*/ > +#define RSTMGR_MPUMODRST_L2 0x10 /*L2 Cache reset*/ > + I'd include space after /* and before */. > @@ -100,6 +97,12 @@ static void __init socfpga_smp_prepare_cpus(unsigned int max_cpus) > */ > static void socfpga_cpu_die(unsigned int cpu) > { > + /* Flush the L1 data cache. */ > + flush_cache_all(); > + > + /* This will put CPU1 into reset.*/ > + __raw_writel(RSTMGR_MPUMODRST_CPU1, rst_manager_base_addr + 0x10); Is there reason to do __raw_* operations? I believe we want the memory barriers etc, so we should use plain writel(). Same for actual reset code. Thanks, Pavel -- (english) http://www.livejournal.com/~pavelmachek (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCHv1 2/2] ARM: socfpga: Add clock entries into device tree 2013-03-13 21:55 [PATCHv1 0/2] ARM: socfpga: Soft reset, hotplug and device tree clocks dinguyen at altera.com 2013-03-13 21:55 ` [PATCHv1 1/2] ARM: socfpga: Enable hotplug and soft reset dinguyen at altera.com @ 2013-03-13 21:55 ` dinguyen at altera.com 2013-03-17 18:35 ` Pavel Machek 2013-03-14 1:04 ` [PATCHv1 0/2] ARM: socfpga: Soft reset, hotplug and device tree clocks Rob Herring 2 siblings, 1 reply; 13+ messages in thread From: dinguyen at altera.com @ 2013-03-13 21:55 UTC (permalink / raw) To: linux-arm-kernel From: Dinh Nguyen <dinguyen@altera.com> Adds the main PLL clock groups for SOCFPGA into device tree file so that the clock framework to query the clock and clock rates appropriately. $cat /sys/kernel/debug/clk/clk_summary clock enable_cnt prepare_cnt rate --------------------------------------------------------------------- osc1 2 2 25000000 sdram_pll 0 0 400000000 s2f_usr2_clk 0 0 66666666 ddr_dq_clk 0 0 200000000 ddr_2x_dqs_clk 0 0 400000000 ddr_dqs_clk 0 0 200000000 periph_pll 2 2 500000000 s2f_usr1_clk 0 0 50000000 per_base_clk 4 4 100000000 per_nand_mmc_clk 0 0 25000000 per_qsi_clk 0 0 250000000 emac1_clk 1 1 125000000 emac0_clk 0 0 125000000 main_pll 1 1 1600000000 cfg_s2f_usr0_clk 0 0 100000000 main_nand_sdmmc_clk 0 0 100000000 main_qspi_clk 0 0 400000000 dbg_base_clk 0 0 400000000 mainclk 0 0 400000000 mpuclk 1 1 800000000 smp_twd 1 1 200000000 Signed-off-by: Dinh Nguyen <dinguyen@altera.com> --- .../bindings/arm/altera/socfpga-clk-manager.txt | 11 ++ .../devicetree/bindings/clock/altr_socfpga.txt | 15 ++ arch/arm/boot/dts/socfpga.dtsi | 154 +++++++++++++++++ arch/arm/boot/dts/socfpga_cyclone5.dts | 8 + arch/arm/boot/dts/socfpga_vt.dts | 8 + arch/arm/mach-socfpga/socfpga.c | 6 + drivers/clk/socfpga/clk.c | 174 +++++++++++++++++--- 7 files changed, 355 insertions(+), 21 deletions(-) create mode 100644 Documentation/devicetree/bindings/arm/altera/socfpga-clk-manager.txt create mode 100644 Documentation/devicetree/bindings/clock/altr_socfpga.txt diff --git a/Documentation/devicetree/bindings/arm/altera/socfpga-clk-manager.txt b/Documentation/devicetree/bindings/arm/altera/socfpga-clk-manager.txt new file mode 100644 index 0000000..38cf62b --- /dev/null +++ b/Documentation/devicetree/bindings/arm/altera/socfpga-clk-manager.txt @@ -0,0 +1,11 @@ +Altera SOCFPGA Clock Manager + +Required properties: +- compatible : "altr,clk-mgr" +- reg : Should contain 1 register ranges(address and length) + +Example: + clkmgr at ffd04000 { + compatible = "altr,clk-mgr"; + reg = <0xffd04000 0x1000>; + }; diff --git a/Documentation/devicetree/bindings/clock/altr_socfpga.txt b/Documentation/devicetree/bindings/clock/altr_socfpga.txt new file mode 100644 index 0000000..47b8b76 --- /dev/null +++ b/Documentation/devicetree/bindings/clock/altr_socfpga.txt @@ -0,0 +1,15 @@ +Device Tree Clock bindings for Altera's SoCFPGA platform + +This binding uses the common clock binding[1]. + +[1] Documentation/devicetree/bindings/clock/clock-bindings.txt + +Required properties: +- compatible : shall be one of the following: + "altr,socfpga-pll-clock" - for a PLL clock + "altr,socfpga-perip-clock" - The peripheral clock divided from the + PLL clock. +- reg : shall be the control register offset from CLOCK_MANAGER's base for the clock. +- clocks : shall be the input parent clock phandle for the clock. This is + either an oscillator or a pll output. +- #clock-cells : from common clock binding; shall be set to 0. \ No newline at end of file diff --git a/arch/arm/boot/dts/socfpga.dtsi b/arch/arm/boot/dts/socfpga.dtsi index 7e8769b..376a3a4 100644 --- a/arch/arm/boot/dts/socfpga.dtsi +++ b/arch/arm/boot/dts/socfpga.dtsi @@ -81,6 +81,160 @@ }; }; + clkmgr at ffd04000 { + compatible = "altr,clk-mgr"; + reg = <0xffd04000 0x1000>; + + clocks { + #address-cells = <1>; + #size-cells = <0>; + + osc: osc1 { + #clock-cells = <0>; + compatible = "fixed-clock"; + }; + + main_pll: main_pll { + #address-cells = <1>; + #size-cells = <0>; + #clock-cells = <0>; + compatible = "altr,socfpga-pll-clock"; + clocks = <&osc>; + reg = <0x40>; + + mpuclk: mpuclk { + #clock-cells = <0>; + compatible = "altr,socfpga-perip-clk"; + clocks = <&main_pll>; + reg = <0x48>; + }; + + mainclk: mainclk { + #clock-cells = <0>; + compatible = "altr,socfpga-perip-clk"; + clocks = <&main_pll>; + reg = <0x4C>; + }; + + dbg_base_clk: dbg_base_clk { + #clock-cells = <0>; + compatible = "altr,socfpga-perip-clk"; + clocks = <&main_pll>; + reg = <0x50>; + }; + + main_qspi_clk: main_qspi_clk { + #clock-cells = <0>; + compatible = "altr,socfpga-perip-clk"; + clocks = <&main_pll>; + reg = <0x54>; + }; + + main_nand_sdmmc_clk: main_nand_sdmmc_clk { + #clock-cells = <0>; + compatible = "altr,socfpga-perip-clk"; + clocks = <&main_pll>; + reg = <0x58>; + }; + + cfg_s2f_usr0_clk: cfg_s2f_usr0_clk { + #clock-cells = <0>; + compatible = "altr,socfpga-perip-clk"; + clocks = <&main_pll>; + reg = <0x5C>; + }; + }; + + periph_pll: periph_pll { + #address-cells = <1>; + #size-cells = <0>; + #clock-cells = <0>; + compatible = "altr,socfpga-pll-clock"; + clocks = <&osc>; + reg = <0x80>; + + emac0_clk: emac0_clk { + #clock-cells = <0>; + compatible = "altr,socfpga-perip-clk"; + clocks = <&periph_pll>; + reg = <0x88>; + }; + + emac1_clk: emac1_clk { + #clock-cells = <0>; + compatible = "altr,socfpga-perip-clk"; + clocks = <&periph_pll>; + reg = <0x8C>; + }; + + per_qspi_clk: per_qsi_clk { + #clock-cells = <0>; + compatible = "altr,socfpga-perip-clk"; + clocks = <&periph_pll>; + reg = <0x90>; + }; + + per_nand_mmc_clk: per_nand_mmc_clk { + #clock-cells = <0>; + compatible = "altr,socfpga-perip-clk"; + clocks = <&periph_pll>; + reg = <0x94>; + }; + + per_base_clk: per_base_clk { + #clock-cells = <0>; + compatible = "altr,socfpga-perip-clk"; + clocks = <&periph_pll>; + reg = <0x98>; + }; + + s2f_usr1_clk: s2f_usr1_clk { + #clock-cells = <0>; + compatible = "altr,socfpga-perip-clk"; + clocks = <&periph_pll>; + reg = <0x9C>; + }; + }; + + sdram_pll: sdram_pll { + #address-cells = <1>; + #size-cells = <0>; + #clock-cells = <0>; + compatible = "altr,socfpga-pll-clock"; + clocks = <&osc>; + reg = <0xC0>; + + ddr_dqs_clk: ddr_dqs_clk { + #clock-cells = <0>; + compatible = "altr,socfpga-perip-clk"; + clocks = <&sdram_pll>; + reg = <0xC8>; + }; + + ddr_2x_dqs_clk: ddr_2x_dqs_clk { + #clock-cells = <0>; + compatible = "altr,socfpga-perip-clk"; + clocks = <&sdram_pll>; + reg = <0xCC>; + }; + + ddr_dq_clk: ddr_dq_clk { + #clock-cells = <0>; + compatible = "altr,socfpga-perip-clk"; + clocks = <&sdram_pll>; + reg = <0xD0>; + }; + + s2f_usr2_clk: s2f_usr2_clk { + #clock-cells = <0>; + compatible = "altr,socfpga-perip-clk"; + clocks = <&sdram_pll>; + reg = <0xD4>; + }; + }; + }; + }; + gmac0: stmmac at ff700000 { compatible = "altr,socfpga-stmmac", "snps,dwmac-3.70a", "snps,dwmac"; reg = <0xff700000 0x2000>; diff --git a/arch/arm/boot/dts/socfpga_cyclone5.dts b/arch/arm/boot/dts/socfpga_cyclone5.dts index 3ae8a83..2495958 100644 --- a/arch/arm/boot/dts/socfpga_cyclone5.dts +++ b/arch/arm/boot/dts/socfpga_cyclone5.dts @@ -33,6 +33,14 @@ }; soc { + clkmgr at ffd04000 { + clocks { + osc1 { + clock-frequency = <25000000>; + }; + }; + }; + timer0 at ffc08000 { clock-frequency = <100000000>; }; diff --git a/arch/arm/boot/dts/socfpga_vt.dts b/arch/arm/boot/dts/socfpga_vt.dts index 1036eba..0bf035d 100644 --- a/arch/arm/boot/dts/socfpga_vt.dts +++ b/arch/arm/boot/dts/socfpga_vt.dts @@ -33,6 +33,14 @@ }; soc { + clkmgr at ffd04000 { + clocks { + osc1 { + clock-frequency = <10000000>; + }; + }; + }; + timer0 at ffc08000 { clock-frequency = <7000000>; }; diff --git a/arch/arm/mach-socfpga/socfpga.c b/arch/arm/mach-socfpga/socfpga.c index b41a945..856625a 100644 --- a/arch/arm/mach-socfpga/socfpga.c +++ b/arch/arm/mach-socfpga/socfpga.c @@ -15,6 +15,7 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ #include <linux/dw_apb_timer.h> +#include <linux/clk-provider.h> #include <linux/irqchip.h> #include <linux/of_address.h> #include <linux/of_irq.h> @@ -29,6 +30,7 @@ void __iomem *socfpga_scu_base_addr = ((void __iomem *)(SOCFPGA_SCU_VIRT_BASE)); void __iomem *sys_manager_base_addr; void __iomem *rst_manager_base_addr; +void __iomem *clk_mgr_base_addr; unsigned long cpu1start_addr; static struct map_desc scu_io_desc __initdata = { @@ -77,6 +79,9 @@ void __init socfpga_sysmgr_init(void) np = of_find_compatible_node(NULL, NULL, "altr,rst-mgr"); rst_manager_base_addr = of_iomap(np, 0); + + np = of_find_compatible_node(NULL, NULL, "altr,clk-mgr"); + clk_mgr_base_addr = of_iomap(np, 0); } static void __init socfpga_init_irq(void) @@ -102,6 +107,7 @@ static void __init socfpga_cyclone5_init(void) { l2x0_of_init(0, ~0UL); of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); + of_clk_init(NULL); socfpga_init_clocks(); } diff --git a/drivers/clk/socfpga/clk.c b/drivers/clk/socfpga/clk.c index 2c855a6..9379b1c 100644 --- a/drivers/clk/socfpga/clk.c +++ b/drivers/clk/socfpga/clk.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2012 Altera Corporation <www.altera.com> + * Copyright (C) 2012-2013 Altera Corporation <www.altera.com> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -11,41 +11,173 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * + * Based from clk-highbank.c + * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ #include <linux/clk.h> #include <linux/clkdev.h> #include <linux/clk-provider.h> +#include <linux/io.h> +#include <linux/of.h> -#define SOCFPGA_OSC1_CLK 10000000 -#define SOCFPGA_MPU_CLK 800000000 -#define SOCFPGA_MAIN_QSPI_CLK 432000000 -#define SOCFPGA_MAIN_NAND_SDMMC_CLK 250000000 -#define SOCFPGA_S2F_USR_CLK 125000000 +/* Clock Manager offsets */ +#define CLKMGR_CTRL 0x0 +#define CLKMGR_BYPASS 0x4 -void __init socfpga_init_clocks(void) +/* Clock bypass bits */ +#define MAINPLL_BYPASS (1<<0) +#define SDRAMPLL_BYPASS (1<<1) +#define SDRAMPLL_SRC_BYPASS (1<<2) +#define PERPLL_BYPASS (1<<3) +#define PERPLL_SRC_BYPASS (1<<4) + +#define SOCFPGA_PLL_BG_PWRDWN 0x00000001 +#define SOCFPGA_PLL_EXT_ENA 0x00000002 +#define SOCFPGA_PLL_PWR_DOWN 0x00000004 +#define SOCFPGA_PLL_DIVF_MASK 0x0000FFF8 +#define SOCFPGA_PLL_DIVF_SHIFT 3 +#define SOCFPGA_PLL_DIVQ_MASK 0x003F0000 +#define SOCFPGA_PLL_DIVQ_SHIFT 15 + +extern void __iomem *clk_mgr_base_addr; + +struct socfpga_clk { + struct clk_hw hw; + void __iomem *reg; + char *parent_name; +}; +#define to_socfpga_clk(p) container_of(p, struct socfpga_clk, hw) + +static int clk_pll_enable(struct clk_hw *hwclk) +{ + struct socfpga_clk *socfpgaclk = to_socfpga_clk(hwclk); + u32 reg; + + reg = readl(socfpgaclk->reg); + reg |= SOCFPGA_PLL_EXT_ENA; + writel(reg, socfpgaclk->reg); + + return 0; +} + +static void clk_pll_disable(struct clk_hw *hwclk) +{ + struct socfpga_clk *socfpgaclk = to_socfpga_clk(hwclk); + u32 reg; + + reg = readl(socfpgaclk->reg); + reg &= ~SOCFPGA_PLL_EXT_ENA; + writel(reg, socfpgaclk->reg); +} + +static unsigned long clk_pll_recalc_rate(struct clk_hw *hwclk, + unsigned long parent_rate) +{ + struct socfpga_clk *socfpgaclk = to_socfpga_clk(hwclk); + unsigned long divf, divq, vco_freq, reg; + unsigned long bypass; + + reg = readl(socfpgaclk->reg); + bypass = readl(clk_mgr_base_addr + CLKMGR_BYPASS); + if (bypass & MAINPLL_BYPASS) + return parent_rate; + + divf = (reg & SOCFPGA_PLL_DIVF_MASK) >> SOCFPGA_PLL_DIVF_SHIFT; + divq = (reg & SOCFPGA_PLL_DIVQ_MASK) >> SOCFPGA_PLL_DIVQ_SHIFT; + vco_freq = parent_rate * (divf + 1); + return vco_freq / (1 << divq); +} + + +static const struct clk_ops clk_pll_ops = { + .enable = clk_pll_enable, + .disable = clk_pll_disable, + .recalc_rate = clk_pll_recalc_rate, +}; + +static unsigned long clk_periclk_recalc_rate(struct clk_hw *hwclk, + unsigned long parent_rate) +{ + struct socfpga_clk *socfpgaclk = to_socfpga_clk(hwclk); + u32 div; + + /* mpuclk, mainclk, and dbg_base_clk divisors are fixed.*/ + if (strcmp(hwclk->init->name, "mpuclk") == 0) + div = 2; + else if ((strcmp(hwclk->init->name, "mainclk") == 0) || + (strcmp(hwclk->init->name, "dbg_base_clk") == 0)) + div = 4; + else + div = ((readl(socfpgaclk->reg) & 0x1ff) + 1); + + return parent_rate / div; +} + +static const struct clk_ops periclk_ops = { + .recalc_rate = clk_periclk_recalc_rate, +}; + +static __init struct clk *socfpga_clk_init(struct device_node *node, const struct clk_ops *ops) { + u32 reg; struct clk *clk; + struct socfpga_clk *socfpga_clk; + const char *clk_name = node->name; + const char *parent_name; + struct clk_init_data init; + int rc; + + rc = of_property_read_u32(node, "reg", ®); + if (WARN_ON(rc)) + return NULL; + + socfpga_clk = kzalloc(sizeof(*socfpga_clk), GFP_KERNEL); + if (WARN_ON(!socfpga_clk)) + return NULL; - clk = clk_register_fixed_rate(NULL, "osc1_clk", NULL, CLK_IS_ROOT, SOCFPGA_OSC1_CLK); - clk_register_clkdev(clk, "osc1_clk", NULL); + socfpga_clk->reg = clk_mgr_base_addr + reg; - clk = clk_register_fixed_rate(NULL, "mpu_clk", NULL, CLK_IS_ROOT, SOCFPGA_MPU_CLK); - clk_register_clkdev(clk, "mpu_clk", NULL); + of_property_read_string(node, "clock-output-names", &clk_name); - clk = clk_register_fixed_rate(NULL, "main_clk", NULL, CLK_IS_ROOT, SOCFPGA_MPU_CLK/2); - clk_register_clkdev(clk, "main_clk", NULL); + init.name = clk_name; + init.ops = ops; + init.flags = 0; + parent_name = of_clk_get_parent_name(node, 0); + init.parent_names = &parent_name; + init.num_parents = 1; - clk = clk_register_fixed_rate(NULL, "dbg_base_clk", NULL, CLK_IS_ROOT, SOCFPGA_MPU_CLK/2); - clk_register_clkdev(clk, "dbg_base_clk", NULL); + socfpga_clk->hw.init = &init; - clk = clk_register_fixed_rate(NULL, "main_qspi_clk", NULL, CLK_IS_ROOT, SOCFPGA_MAIN_QSPI_CLK); - clk_register_clkdev(clk, "main_qspi_clk", NULL); + clk = clk_register(NULL, &socfpga_clk->hw); + if (WARN_ON(IS_ERR(clk))) { + kfree(socfpga_clk); + return NULL; + } + rc = of_clk_add_provider(node, of_clk_src_simple_get, clk); + return clk; +} + +static void __init socfpga_pll_init(struct device_node *node) +{ + socfpga_clk_init(node, &clk_pll_ops); +} +CLK_OF_DECLARE(socfpga_pll, "altr,socfpga-pll-clock", socfpga_pll_init); + +static void __init socfpga_periph_init(struct device_node *node) +{ + socfpga_clk_init(node, &periclk_ops); +} +CLK_OF_DECLARE(socfpga_periph, "altr,socfpga-perip-clk", socfpga_periph_init); - clk = clk_register_fixed_rate(NULL, "main_nand_sdmmc_clk", NULL, CLK_IS_ROOT, SOCFPGA_MAIN_NAND_SDMMC_CLK); - clk_register_clkdev(clk, "main_nand_sdmmc_clk", NULL); +void __init socfpga_init_clocks(void) +{ + struct clk *clk; + int ret; - clk = clk_register_fixed_rate(NULL, "s2f_usr_clk", NULL, CLK_IS_ROOT, SOCFPGA_S2F_USR_CLK); - clk_register_clkdev(clk, "s2f_usr_clk", NULL); + clk = clk_register_fixed_factor(NULL, "smp_twd", "mpuclk", 0, 1, 4); + ret = clk_register_clkdev(clk, NULL, "smp_twd"); + if (ret) + pr_err("smp_twd alias not registered\n"); } -- 1.7.9.5 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCHv1 2/2] ARM: socfpga: Add clock entries into device tree 2013-03-13 21:55 ` [PATCHv1 2/2] ARM: socfpga: Add clock entries into device tree dinguyen at altera.com @ 2013-03-17 18:35 ` Pavel Machek 0 siblings, 0 replies; 13+ messages in thread From: Pavel Machek @ 2013-03-17 18:35 UTC (permalink / raw) To: linux-arm-kernel Hi! > Adds the main PLL clock groups for SOCFPGA into device tree file > so that the clock framework to query the clock and clock rates insert "works" here? > appropriately. > > diff --git a/Documentation/devicetree/bindings/arm/altera/socfpga-clk-manager.txt b/Documentation/devicetree/bindings/arm/altera/socfpga-clk-manager.txt > new file mode 100644 > index 0000000..38cf62b > --- /dev/null > +++ b/Documentation/devicetree/bindings/arm/altera/socfpga-clk-manager.txt > @@ -0,0 +1,11 @@ > +Altera SOCFPGA Clock Manager > + > +Required properties: > +- compatible : "altr,clk-mgr" > +- reg : Should contain 1 register ranges(address and length) "1 register range (address"... ? > --- /dev/null > +++ b/Documentation/devicetree/bindings/clock/altr_socfpga.txt > @@ -0,0 +1,15 @@ > +- reg : shall be the control register offset from CLOCK_MANAGER's base for the clock. > +- clocks : shall be the input parent clock phandle for the clock. This is > + either an oscillator or a pll output. > +- #clock-cells : from common clock binding; shall be set to 0. > \ No newline at end of file Newline would be nice :-). > diff --git a/drivers/clk/socfpga/clk.c b/drivers/clk/socfpga/clk.c > index 2c855a6..9379b1c 100644 > --- a/drivers/clk/socfpga/clk.c > +++ b/drivers/clk/socfpga/clk.c > @@ -1,5 +1,5 @@ > /* > - * Copyright (C) 2012 Altera Corporation <www.altera.com> > + * Copyright (C) 2012-2013 Altera Corporation <www.altera.com> > * > * This program is free software; you can redistribute it and/or modify > * it under the terms of the GNU General Public License as published by > @@ -11,41 +11,173 @@ > * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > * GNU General Public License for more details. > * > + * Based from clk-highbank.c "Based on"? Does it make sense to add * Copyright 2011-2012 Calxeda, Inc. ? > +extern void __iomem *clk_mgr_base_addr; > + > +struct socfpga_clk { > + struct clk_hw hw; > + void __iomem *reg; > + char *parent_name; > +}; Either align all fields using tabs, or none. This looks weird. > +static unsigned long clk_pll_recalc_rate(struct clk_hw *hwclk, > + unsigned long parent_rate) > +{ > + struct socfpga_clk *socfpgaclk = to_socfpga_clk(hwclk); > + unsigned long divf, divq, vco_freq, reg; > + unsigned long bypass; > + > + reg = readl(socfpgaclk->reg); > + bypass = readl(clk_mgr_base_addr + CLKMGR_BYPASS); Would it make sense to create structure for clk_mgr_base_addr, too? At least code would be consistent that way. > +static unsigned long clk_periclk_recalc_rate(struct clk_hw *hwclk, > + unsigned long parent_rate) > +{ > + struct socfpga_clk *socfpgaclk = to_socfpga_clk(hwclk); > + u32 div; > + > + /* mpuclk, mainclk, and dbg_base_clk divisors are fixed.*/ > + if (strcmp(hwclk->init->name, "mpuclk") == 0) > + div = 2; > + else if ((strcmp(hwclk->init->name, "mainclk") == 0) || > + (strcmp(hwclk->init->name, "dbg_base_clk") == 0)) > + div = 4; > + else > + div = ((readl(socfpgaclk->reg) & 0x1ff) + 1); Would it make sense to cache have div value in struct socfpga_clk ... so that it does not have to be recomputed based on strcmp? Otherwise it looks good to me. Thanks, Pavel -- (english) http://www.livejournal.com/~pavelmachek (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCHv1 0/2] ARM: socfpga: Soft reset, hotplug and device tree clocks 2013-03-13 21:55 [PATCHv1 0/2] ARM: socfpga: Soft reset, hotplug and device tree clocks dinguyen at altera.com 2013-03-13 21:55 ` [PATCHv1 1/2] ARM: socfpga: Enable hotplug and soft reset dinguyen at altera.com 2013-03-13 21:55 ` [PATCHv1 2/2] ARM: socfpga: Add clock entries into device tree dinguyen at altera.com @ 2013-03-14 1:04 ` Rob Herring 2013-03-14 11:03 ` Pavel Machek ` (2 more replies) 2 siblings, 3 replies; 13+ messages in thread From: Rob Herring @ 2013-03-14 1:04 UTC (permalink / raw) To: linux-arm-kernel Dinh, On 03/13/2013 04:55 PM, dinguyen at altera.com wrote: > From: Dinh Nguyen <dinguyen@altera.com> > > Hi Arnd/Olof, > > Just 2 patches for mach-socfpga: > > 0001: ARM: socfpga: Enable hotplug and soft reset > - Able to hotplug CPU1 by putting it into reset and bringing back online. > Have you seen the discussion on PSCI? There's an ARM doc on it and Linaro session from last week. Is there a possibility you can use that? You would need to be able to run in non-secure mode and implement smc calls. Rob > 0002: ARM: socfpga: Add clock entries into device tree > - Correctly use the clock framework with device tree entries. > - Based from clk-highbank.c > > Based on arm-soc/for-next. > > Thanks, > Dinh > > Dinh Nguyen (2): > ARM: socfpga: Enable hotplug and soft reset > ARM: socfpga: Add clock entries into device tree > > .../bindings/arm/altera/socfpga-clk-manager.txt | 11 ++ > .../devicetree/bindings/clock/altr_socfpga.txt | 15 ++ > arch/arm/boot/dts/socfpga.dtsi | 154 +++++++++++++++++ > arch/arm/boot/dts/socfpga_cyclone5.dts | 8 + > arch/arm/boot/dts/socfpga_vt.dts | 8 + > arch/arm/mach-socfpga/core.h | 17 ++ > arch/arm/mach-socfpga/platsmp.c | 9 +- > arch/arm/mach-socfpga/socfpga.c | 16 +- > drivers/clk/socfpga/clk.c | 174 +++++++++++++++++--- > 9 files changed, 387 insertions(+), 25 deletions(-) > create mode 100644 Documentation/devicetree/bindings/arm/altera/socfpga-clk-manager.txt > create mode 100644 Documentation/devicetree/bindings/clock/altr_socfpga.txt > ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCHv1 0/2] ARM: socfpga: Soft reset, hotplug and device tree clocks 2013-03-14 1:04 ` [PATCHv1 0/2] ARM: socfpga: Soft reset, hotplug and device tree clocks Rob Herring @ 2013-03-14 11:03 ` Pavel Machek 2013-03-14 13:26 ` Arnd Bergmann 2013-03-14 13:39 ` Dinh Nguyen 2013-03-17 18:13 ` Pavel Machek 2 siblings, 1 reply; 13+ messages in thread From: Pavel Machek @ 2013-03-14 11:03 UTC (permalink / raw) To: linux-arm-kernel Hi! > > Just 2 patches for mach-socfpga: > > > > 0001: ARM: socfpga: Enable hotplug and soft reset > > - Able to hotplug CPU1 by putting it into reset and bringing back online. > > > > Have you seen the discussion on PSCI? There's an ARM doc on it and > Linaro session from last week. Is there a possibility you can use that? > You would need to be able to run in non-secure mode and implement > smc calls. I tried googling PSCI, but got: Power State Coordination Interface System Software on ARM Processors This document is only available in a PDF version to registered ARM customers. Do you have better pointer? Pavel -- (english) http://www.livejournal.com/~pavelmachek (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCHv1 0/2] ARM: socfpga: Soft reset, hotplug and device tree clocks 2013-03-14 11:03 ` Pavel Machek @ 2013-03-14 13:26 ` Arnd Bergmann 0 siblings, 0 replies; 13+ messages in thread From: Arnd Bergmann @ 2013-03-14 13:26 UTC (permalink / raw) To: linux-arm-kernel On Thursday 14 March 2013, Pavel Machek wrote: > > Hi! > > > > Just 2 patches for mach-socfpga: > > > > > > 0001: ARM: socfpga: Enable hotplug and soft reset > > > - Able to hotplug CPU1 by putting it into reset and bringing back online. > > > > > > > Have you seen the discussion on PSCI? There's an ARM doc on it and > > Linaro session from last week. Is there a possibility you can use that? > > You would need to be able to run in non-secure mode and implement > > smc calls. > > I tried googling PSCI, but got: > > Power State Coordination Interface > System Software on ARM Processors > This document is only available in a PDF version to registered ARM > customers. > > Do you have better pointer? The easiest ist if you look at the kernel source at arch/arm/kernel/psci.c. I think the registration at ARM is free, but I agree it's annoying to force people to go through that. Arnd ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCHv1 0/2] ARM: socfpga: Soft reset, hotplug and device tree clocks 2013-03-14 1:04 ` [PATCHv1 0/2] ARM: socfpga: Soft reset, hotplug and device tree clocks Rob Herring 2013-03-14 11:03 ` Pavel Machek @ 2013-03-14 13:39 ` Dinh Nguyen 2013-03-17 18:13 ` Pavel Machek 2 siblings, 0 replies; 13+ messages in thread From: Dinh Nguyen @ 2013-03-14 13:39 UTC (permalink / raw) To: linux-arm-kernel Hi Rob, On 03/13/2013 08:04 PM, Rob Herring wrote: > Dinh, > > On 03/13/2013 04:55 PM, dinguyen at altera.com wrote: >> From: Dinh Nguyen <dinguyen@altera.com> >> >> Hi Arnd/Olof, >> >> Just 2 patches for mach-socfpga: >> >> 0001: ARM: socfpga: Enable hotplug and soft reset >> - Able to hotplug CPU1 by putting it into reset and bringing back online. >> > > Have you seen the discussion on PSCI? There's an ARM doc on it and > Linaro session from last week. Is there a possibility you can use that? > You would need to be able to run in non-secure mode and implement smc calls. I just briefly skimmed the ARM doc and Linaro slidedeck. It looks like PSCI is already in the kernel, but I don't see any usage of it yet? I'll try to use PSCI for our hotplug. Do you know where those opcodes for cpu_on or cpu_off came from? Currently we are running in non-secure mode, but may have a requirement to run in secure mode in other applications, so will PSCI still work for that case? Thanks, Dinh > > Rob > > >> 0002: ARM: socfpga: Add clock entries into device tree >> - Correctly use the clock framework with device tree entries. >> - Based from clk-highbank.c >> >> Based on arm-soc/for-next. >> >> Thanks, >> Dinh >> >> Dinh Nguyen (2): >> ARM: socfpga: Enable hotplug and soft reset >> ARM: socfpga: Add clock entries into device tree >> >> .../bindings/arm/altera/socfpga-clk-manager.txt | 11 ++ >> .../devicetree/bindings/clock/altr_socfpga.txt | 15 ++ >> arch/arm/boot/dts/socfpga.dtsi | 154 +++++++++++++++++ >> arch/arm/boot/dts/socfpga_cyclone5.dts | 8 + >> arch/arm/boot/dts/socfpga_vt.dts | 8 + >> arch/arm/mach-socfpga/core.h | 17 ++ >> arch/arm/mach-socfpga/platsmp.c | 9 +- >> arch/arm/mach-socfpga/socfpga.c | 16 +- >> drivers/clk/socfpga/clk.c | 174 +++++++++++++++++--- >> 9 files changed, 387 insertions(+), 25 deletions(-) >> create mode 100644 Documentation/devicetree/bindings/arm/altera/socfpga-clk-manager.txt >> create mode 100644 Documentation/devicetree/bindings/clock/altr_socfpga.txt >> > ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCHv1 0/2] ARM: socfpga: Soft reset, hotplug and device tree clocks 2013-03-14 1:04 ` [PATCHv1 0/2] ARM: socfpga: Soft reset, hotplug and device tree clocks Rob Herring 2013-03-14 11:03 ` Pavel Machek 2013-03-14 13:39 ` Dinh Nguyen @ 2013-03-17 18:13 ` Pavel Machek 2013-03-18 13:01 ` Rob Herring 2 siblings, 1 reply; 13+ messages in thread From: Pavel Machek @ 2013-03-17 18:13 UTC (permalink / raw) To: linux-arm-kernel Hi! > > From: Dinh Nguyen <dinguyen@altera.com> > > > > Hi Arnd/Olof, > > > > Just 2 patches for mach-socfpga: > > > > 0001: ARM: socfpga: Enable hotplug and soft reset > > - Able to hotplug CPU1 by putting it into reset and bringing back online. > > > > Have you seen the discussion on PSCI? There's an ARM doc on it and > Linaro session from last week. Is there a possibility you can use that? > You would need to be able to run in non-secure mode and implement > smc calls. What would be the advantage? We do not have suitable hypervisor at the moment. Nor I see why it would be good to push power management into it. (Plus, the implementation seems pretty incomplete for arm32.). Pavel -- (english) http://www.livejournal.com/~pavelmachek (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCHv1 0/2] ARM: socfpga: Soft reset, hotplug and device tree clocks 2013-03-17 18:13 ` Pavel Machek @ 2013-03-18 13:01 ` Rob Herring 2013-03-18 14:24 ` Pavel Machek 0 siblings, 1 reply; 13+ messages in thread From: Rob Herring @ 2013-03-18 13:01 UTC (permalink / raw) To: linux-arm-kernel On 03/17/2013 01:13 PM, Pavel Machek wrote: > Hi! > >>> From: Dinh Nguyen <dinguyen@altera.com> >>> >>> Hi Arnd/Olof, >>> >>> Just 2 patches for mach-socfpga: >>> >>> 0001: ARM: socfpga: Enable hotplug and soft reset >>> - Able to hotplug CPU1 by putting it into reset and bringing back online. >>> >> >> Have you seen the discussion on PSCI? There's an ARM doc on it and >> Linaro session from last week. Is there a possibility you can use that? >> You would need to be able to run in non-secure mode and implement >> smc calls. > > What would be the advantage? It gets rid of some platform code. If you do an A15 part, it abstracts out the differences between the cores on entering/exiting coherency. It should also save you from writing suspend/resume and cpuidle support for your platform. Once you do go to an A15, you will have to run in non-secure world. Once you run in non-secure mode, you cannot do everything within the kernel. So either you create custom smc calls or you use PSCI. If you really support secure mode too, then the SOC design should prevent non-secure accesses to anything that would affect the secure world like powergating a core or cache. > We do not have suitable hypervisor at the moment. Nor I see why it > would be good to push power management into it. It's not a hypervisor. A minimal implementation is only about 100 lines of assembly. > (Plus, the implementation seems pretty incomplete for arm32.). That's the point. The linux side is simple. The secure monitor side is also simplified somewhat. When you enter secure monitor mode, you are automatically running with the cache and mmu off. This avoids the side effects of cache allocations while trying to flush the caches. Rob > > Pavel > ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCHv1 0/2] ARM: socfpga: Soft reset, hotplug and device tree clocks 2013-03-18 13:01 ` Rob Herring @ 2013-03-18 14:24 ` Pavel Machek 2013-03-18 14:39 ` Dinh Nguyen 0 siblings, 1 reply; 13+ messages in thread From: Pavel Machek @ 2013-03-18 14:24 UTC (permalink / raw) To: linux-arm-kernel Hi! > >>> Just 2 patches for mach-socfpga: > >>> > >>> 0001: ARM: socfpga: Enable hotplug and soft reset > >>> - Able to hotplug CPU1 by putting it into reset and bringing back online. > >>> > >> > >> Have you seen the discussion on PSCI? There's an ARM doc on it and > >> Linaro session from last week. Is there a possibility you can use that? > >> You would need to be able to run in non-secure mode and implement > >> smc calls. > > > > What would be the advantage? > > It gets rid of some platform code. If you do an A15 part, it abstracts > out the differences between the cores on entering/exiting coherency. It > should also save you from writing suspend/resume and cpuidle support for > your platform. I don't see how PSCI would be useful at this point. Clock framework is needed for basic MMC and Ethernet support; PSCI would not help there. > > We do not have suitable hypervisor at the moment. Nor I see why it > > would be good to push power management into it. > > It's not a hypervisor. A minimal implementation is only about 100 lines > of assembly. So... we could reduce some complexity of the kernel by inventing another component, inventing API, and putting the complex code into the newly invented component... when no other arm32 architecture does that. (Where would you put the 100 lines? u-boot?) > > (Plus, the implementation seems pretty incomplete for arm32.). > > That's the point. The linux side is simple. The secure monitor side is > also simplified somewhat. When you enter secure monitor mode, you are > automatically running with the cache and mmu off. This avoids the side > effects of cache allocations while trying to flush the caches. This is clock framework. It does not touch any caches, and does not have problems with MMU. Even if we would implement PSCI in future, this code would stay the same AFAICT. Pavel -- (english) http://www.livejournal.com/~pavelmachek (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCHv1 0/2] ARM: socfpga: Soft reset, hotplug and device tree clocks 2013-03-18 14:24 ` Pavel Machek @ 2013-03-18 14:39 ` Dinh Nguyen 0 siblings, 0 replies; 13+ messages in thread From: Dinh Nguyen @ 2013-03-18 14:39 UTC (permalink / raw) To: linux-arm-kernel Hi Pavel, On Mon, 2013-03-18 at 15:24 +0100, ZY - pavel wrote: > Hi! > > > >>> Just 2 patches for mach-socfpga: > > >>> > > >>> 0001: ARM: socfpga: Enable hotplug and soft reset > > >>> - Able to hotplug CPU1 by putting it into reset and bringing back online. > > >>> > > >> > > >> Have you seen the discussion on PSCI? There's an ARM doc on it and > > >> Linaro session from last week. Is there a possibility you can use that? > > >> You would need to be able to run in non-secure mode and implement > > >> smc calls. > > > > > > What would be the advantage? > > > > It gets rid of some platform code. If you do an A15 part, it abstracts > > out the differences between the cores on entering/exiting coherency. It > > should also save you from writing suspend/resume and cpuidle support for > > your platform. > > I don't see how PSCI would be useful at this point. Clock framework is > needed for basic MMC and Ethernet support; PSCI would not help there. > > > > We do not have suitable hypervisor at the moment. Nor I see why it > > > would be good to push power management into it. > > > > It's not a hypervisor. A minimal implementation is only about 100 lines > > of assembly. > > So... we could reduce some complexity of the kernel by inventing > another component, inventing API, and putting the complex code into > the newly invented component... when no other arm32 architecture does > that. (Where would you put the 100 lines? u-boot?) Let me just rework the patches to have just the clock framework and a soft reset support for SOCFPGA. I'll work on add PSCI for hotplug in a separate patch. Dinh > > > > (Plus, the implementation seems pretty incomplete for arm32.). > > > > That's the point. The linux side is simple. The secure monitor side is > > also simplified somewhat. When you enter secure monitor mode, you are > > automatically running with the cache and mmu off. This avoids the side > > effects of cache allocations while trying to flush the caches. > > This is clock framework. It does not touch any caches, and does not > have problems with MMU. Even if we would implement PSCI in future, > this code would stay the same AFAICT. > Pavel ^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2013-03-18 14:39 UTC | newest] Thread overview: 13+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2013-03-13 21:55 [PATCHv1 0/2] ARM: socfpga: Soft reset, hotplug and device tree clocks dinguyen at altera.com 2013-03-13 21:55 ` [PATCHv1 1/2] ARM: socfpga: Enable hotplug and soft reset dinguyen at altera.com 2013-03-17 18:18 ` Pavel Machek 2013-03-13 21:55 ` [PATCHv1 2/2] ARM: socfpga: Add clock entries into device tree dinguyen at altera.com 2013-03-17 18:35 ` Pavel Machek 2013-03-14 1:04 ` [PATCHv1 0/2] ARM: socfpga: Soft reset, hotplug and device tree clocks Rob Herring 2013-03-14 11:03 ` Pavel Machek 2013-03-14 13:26 ` Arnd Bergmann 2013-03-14 13:39 ` Dinh Nguyen 2013-03-17 18:13 ` Pavel Machek 2013-03-18 13:01 ` Rob Herring 2013-03-18 14:24 ` Pavel Machek 2013-03-18 14:39 ` Dinh Nguyen
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).