Commit 88e23761 authored by Linus Torvalds's avatar Linus Torvalds

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

Pull ARM SoC fixes from Olof Johansson:
 "Another week, another small batch of fixes.

  Most of these make zynq, socfpga and sunxi platforms work a bit
  better:

   - due to new requirements for regulators, DWMMC on socfpga broke past
     v3.17
   - SMP spinup fix for socfpga
   - a few DT fixes for zynq
   - another option (FIXED_REGULATOR) for sunxi is needed that used to
     be selected by other options but no longer is.
   - a couple of small DT fixes for at91
   - ...and a couple for i.MX"

* tag 'armsoc-for-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc:
  ARM: dts: imx28-evk: Let i2c0 run at 100kHz
  ARM: i.MX6: Fix "emi" clock name typo
  ARM: multi_v7_defconfig: enable CONFIG_MMC_DW_ROCKCHIP
  ARM: sunxi_defconfig: enable CONFIG_REGULATOR_FIXED_VOLTAGE
  ARM: dts: socfpga: Add a 3.3V fixed regulator node
  ARM: dts: socfpga: Fix SD card detect
  ARM: dts: socfpga: rename gpio nodes
  ARM: at91/dt: sam9263: fix PLLB frequencies
  power: reset: at91-reset: fix power down register
  MAINTAINERS: add atmel ssc driver maintainer entry
  arm: socfpga: fix fetching cpu1start_addr for SMP
  ARM: zynq: DT: trivial: Fix mc node
  ARM: zynq: DT: Add cadence watchdog node
  ARM: zynq: DT: Add missing reference for memory-controller
  ARM: zynq: DT: Add missing reference for ADC
  ARM: zynq: DT: Add missing address for L2 pl310
  ARM: zynq: DT: Remove 222 MHz OPP
  ARM: zynq: DT: Fix GEM register area size
parents d1e14f1d efc176a8
...@@ -1749,6 +1749,13 @@ M: Nicolas Ferre <nicolas.ferre@atmel.com> ...@@ -1749,6 +1749,13 @@ M: Nicolas Ferre <nicolas.ferre@atmel.com>
S: Supported S: Supported
F: drivers/spi/spi-atmel.* F: drivers/spi/spi-atmel.*
ATMEL SSC DRIVER
M: Bo Shen <voice.shen@atmel.com>
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
S: Supported
F: drivers/misc/atmel-ssc.c
F: include/linux/atmel-ssc.h
ATMEL Timer Counter (TC) AND CLOCKSOURCE DRIVERS ATMEL Timer Counter (TC) AND CLOCKSOURCE DRIVERS
M: Nicolas Ferre <nicolas.ferre@atmel.com> M: Nicolas Ferre <nicolas.ferre@atmel.com>
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
......
...@@ -122,9 +122,10 @@ pllb: pllbck { ...@@ -122,9 +122,10 @@ pllb: pllbck {
interrupts-extended = <&pmc AT91_PMC_LOCKB>; interrupts-extended = <&pmc AT91_PMC_LOCKB>;
clocks = <&main>; clocks = <&main>;
reg = <1>; reg = <1>;
atmel,clk-input-range = <1000000 5000000>; atmel,clk-input-range = <1000000 32000000>;
#atmel,pll-clk-output-range-cells = <4>; #atmel,pll-clk-output-range-cells = <4>;
atmel,pll-clk-output-ranges = <70000000 130000000 1 1>; atmel,pll-clk-output-ranges = <80000000 200000000 0 1>,
<190000000 240000000 2 1>;
}; };
mck: masterck { mck: masterck {
......
...@@ -193,7 +193,6 @@ lradc@80050000 { ...@@ -193,7 +193,6 @@ lradc@80050000 {
i2c0: i2c@80058000 { i2c0: i2c@80058000 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&i2c0_pins_a>; pinctrl-0 = <&i2c0_pins_a>;
clock-frequency = <400000>;
status = "okay"; status = "okay";
sgtl5000: codec@0a { sgtl5000: codec@0a {
......
...@@ -547,7 +547,7 @@ i2c3: i2c@ffc07000 { ...@@ -547,7 +547,7 @@ i2c3: i2c@ffc07000 {
status = "disabled"; status = "disabled";
}; };
gpio@ff708000 { gpio0: gpio@ff708000 {
#address-cells = <1>; #address-cells = <1>;
#size-cells = <0>; #size-cells = <0>;
compatible = "snps,dw-apb-gpio"; compatible = "snps,dw-apb-gpio";
...@@ -555,7 +555,7 @@ gpio@ff708000 { ...@@ -555,7 +555,7 @@ gpio@ff708000 {
clocks = <&per_base_clk>; clocks = <&per_base_clk>;
status = "disabled"; status = "disabled";
gpio0: gpio-controller@0 { porta: gpio-controller@0 {
compatible = "snps,dw-apb-gpio-port"; compatible = "snps,dw-apb-gpio-port";
gpio-controller; gpio-controller;
#gpio-cells = <2>; #gpio-cells = <2>;
...@@ -567,7 +567,7 @@ gpio0: gpio-controller@0 { ...@@ -567,7 +567,7 @@ gpio0: gpio-controller@0 {
}; };
}; };
gpio@ff709000 { gpio1: gpio@ff709000 {
#address-cells = <1>; #address-cells = <1>;
#size-cells = <0>; #size-cells = <0>;
compatible = "snps,dw-apb-gpio"; compatible = "snps,dw-apb-gpio";
...@@ -575,7 +575,7 @@ gpio@ff709000 { ...@@ -575,7 +575,7 @@ gpio@ff709000 {
clocks = <&per_base_clk>; clocks = <&per_base_clk>;
status = "disabled"; status = "disabled";
gpio1: gpio-controller@0 { portb: gpio-controller@0 {
compatible = "snps,dw-apb-gpio-port"; compatible = "snps,dw-apb-gpio-port";
gpio-controller; gpio-controller;
#gpio-cells = <2>; #gpio-cells = <2>;
...@@ -587,7 +587,7 @@ gpio1: gpio-controller@0 { ...@@ -587,7 +587,7 @@ gpio1: gpio-controller@0 {
}; };
}; };
gpio@ff70a000 { gpio2: gpio@ff70a000 {
#address-cells = <1>; #address-cells = <1>;
#size-cells = <0>; #size-cells = <0>;
compatible = "snps,dw-apb-gpio"; compatible = "snps,dw-apb-gpio";
...@@ -595,7 +595,7 @@ gpio@ff70a000 { ...@@ -595,7 +595,7 @@ gpio@ff70a000 {
clocks = <&per_base_clk>; clocks = <&per_base_clk>;
status = "disabled"; status = "disabled";
gpio2: gpio-controller@0 { portc: gpio-controller@0 {
compatible = "snps,dw-apb-gpio-port"; compatible = "snps,dw-apb-gpio-port";
gpio-controller; gpio-controller;
#gpio-cells = <2>; #gpio-cells = <2>;
......
...@@ -29,7 +29,7 @@ osc1 { ...@@ -29,7 +29,7 @@ osc1 {
}; };
}; };
dwmmc0@ff704000 { mmc0: dwmmc0@ff704000 {
num-slots = <1>; num-slots = <1>;
broken-cd; broken-cd;
bus-width = <4>; bus-width = <4>;
......
...@@ -37,6 +37,13 @@ aliases { ...@@ -37,6 +37,13 @@ aliases {
*/ */
ethernet0 = &gmac1; ethernet0 = &gmac1;
}; };
regulator_3_3v: 3-3-v-regulator {
compatible = "regulator-fixed";
regulator-name = "3.3V";
regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>;
};
}; };
&gmac1 { &gmac1 {
...@@ -68,6 +75,11 @@ rtc@68 { ...@@ -68,6 +75,11 @@ rtc@68 {
}; };
}; };
&mmc0 {
vmmc-supply = <&regulator_3_3v>;
vqmmc-supply = <&regulator_3_3v>;
};
&usb1 { &usb1 {
status = "okay"; status = "okay";
}; };
...@@ -37,6 +37,13 @@ aliases { ...@@ -37,6 +37,13 @@ aliases {
*/ */
ethernet0 = &gmac1; ethernet0 = &gmac1;
}; };
regulator_3_3v: 3-3-v-regulator {
compatible = "regulator-fixed";
regulator-name = "3.3V";
regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>;
};
}; };
&gmac1 { &gmac1 {
...@@ -53,6 +60,10 @@ &gmac1 { ...@@ -53,6 +60,10 @@ &gmac1 {
rxc-skew-ps = <2000>; rxc-skew-ps = <2000>;
}; };
&gpio1 {
status = "okay";
};
&i2c0 { &i2c0 {
status = "okay"; status = "okay";
...@@ -69,7 +80,9 @@ rtc@68 { ...@@ -69,7 +80,9 @@ rtc@68 {
}; };
&mmc0 { &mmc0 {
cd-gpios = <&gpio1 18 0>; cd-gpios = <&portb 18 0>;
vmmc-supply = <&regulator_3_3v>;
vqmmc-supply = <&regulator_3_3v>;
}; };
&usb1 { &usb1 {
......
...@@ -37,6 +37,13 @@ aliases { ...@@ -37,6 +37,13 @@ aliases {
*/ */
ethernet0 = &gmac1; ethernet0 = &gmac1;
}; };
regulator_3_3v: vcc3p3-regulator {
compatible = "regulator-fixed";
regulator-name = "VCC3P3";
regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>;
};
}; };
&gmac1 { &gmac1 {
...@@ -53,6 +60,11 @@ &gmac1 { ...@@ -53,6 +60,11 @@ &gmac1 {
rxc-skew-ps = <2000>; rxc-skew-ps = <2000>;
}; };
&mmc0 {
vmmc-supply = <&regulator_3_3v>;
vqmmc-supply = <&regulator_3_3v>;
};
&usb1 { &usb1 {
status = "okay"; status = "okay";
}; };
...@@ -30,7 +30,6 @@ cpu@0 { ...@@ -30,7 +30,6 @@ cpu@0 {
/* kHz uV */ /* kHz uV */
666667 1000000 666667 1000000
333334 1000000 333334 1000000
222223 1000000
>; >;
}; };
...@@ -65,7 +64,7 @@ amba { ...@@ -65,7 +64,7 @@ amba {
interrupt-parent = <&intc>; interrupt-parent = <&intc>;
ranges; ranges;
adc@f8007100 { adc: adc@f8007100 {
compatible = "xlnx,zynq-xadc-1.00.a"; compatible = "xlnx,zynq-xadc-1.00.a";
reg = <0xf8007100 0x20>; reg = <0xf8007100 0x20>;
interrupts = <0 7 4>; interrupts = <0 7 4>;
...@@ -137,7 +136,7 @@ intc: interrupt-controller@f8f01000 { ...@@ -137,7 +136,7 @@ intc: interrupt-controller@f8f01000 {
<0xF8F00100 0x100>; <0xF8F00100 0x100>;
}; };
L2: cache-controller { L2: cache-controller@f8f02000 {
compatible = "arm,pl310-cache"; compatible = "arm,pl310-cache";
reg = <0xF8F02000 0x1000>; reg = <0xF8F02000 0x1000>;
arm,data-latency = <3 2 2>; arm,data-latency = <3 2 2>;
...@@ -146,10 +145,10 @@ L2: cache-controller { ...@@ -146,10 +145,10 @@ L2: cache-controller {
cache-level = <2>; cache-level = <2>;
}; };
memory-controller@f8006000 { mc: memory-controller@f8006000 {
compatible = "xlnx,zynq-ddrc-a05"; compatible = "xlnx,zynq-ddrc-a05";
reg = <0xf8006000 0x1000>; reg = <0xf8006000 0x1000>;
} ; };
uart0: serial@e0000000 { uart0: serial@e0000000 {
compatible = "xlnx,xuartps", "cdns,uart-r1p8"; compatible = "xlnx,xuartps", "cdns,uart-r1p8";
...@@ -195,7 +194,7 @@ spi1: spi@e0007000 { ...@@ -195,7 +194,7 @@ spi1: spi@e0007000 {
gem0: ethernet@e000b000 { gem0: ethernet@e000b000 {
compatible = "cdns,gem"; compatible = "cdns,gem";
reg = <0xe000b000 0x4000>; reg = <0xe000b000 0x1000>;
status = "disabled"; status = "disabled";
interrupts = <0 22 4>; interrupts = <0 22 4>;
clocks = <&clkc 30>, <&clkc 30>, <&clkc 13>; clocks = <&clkc 30>, <&clkc 30>, <&clkc 13>;
...@@ -206,7 +205,7 @@ gem0: ethernet@e000b000 { ...@@ -206,7 +205,7 @@ gem0: ethernet@e000b000 {
gem1: ethernet@e000c000 { gem1: ethernet@e000c000 {
compatible = "cdns,gem"; compatible = "cdns,gem";
reg = <0xe000c000 0x4000>; reg = <0xe000c000 0x1000>;
status = "disabled"; status = "disabled";
interrupts = <0 45 4>; interrupts = <0 45 4>;
clocks = <&clkc 31>, <&clkc 31>, <&clkc 14>; clocks = <&clkc 31>, <&clkc 31>, <&clkc 14>;
...@@ -315,5 +314,16 @@ scutimer: timer@f8f00600 { ...@@ -315,5 +314,16 @@ scutimer: timer@f8f00600 {
reg = <0xf8f00600 0x20>; reg = <0xf8f00600 0x20>;
clocks = <&clkc 4>; clocks = <&clkc 4>;
}; };
watchdog0: watchdog@f8005000 {
clocks = <&clkc 45>;
compatible = "xlnx,zynq-wdt-r1p2";
device_type = "watchdog";
interrupt-parent = <&intc>;
interrupts = <0 9 1>;
reg = <0xf8005000 0x1000>;
reset = <0>;
timeout-sec = <10>;
};
}; };
}; };
...@@ -354,6 +354,7 @@ CONFIG_MMC_MVSDIO=y ...@@ -354,6 +354,7 @@ CONFIG_MMC_MVSDIO=y
CONFIG_MMC_SUNXI=y CONFIG_MMC_SUNXI=y
CONFIG_MMC_DW=y CONFIG_MMC_DW=y
CONFIG_MMC_DW_EXYNOS=y CONFIG_MMC_DW_EXYNOS=y
CONFIG_MMC_DW_ROCKCHIP=y
CONFIG_NEW_LEDS=y CONFIG_NEW_LEDS=y
CONFIG_LEDS_CLASS=y CONFIG_LEDS_CLASS=y
CONFIG_LEDS_GPIO=y CONFIG_LEDS_GPIO=y
......
...@@ -76,6 +76,7 @@ CONFIG_WATCHDOG=y ...@@ -76,6 +76,7 @@ CONFIG_WATCHDOG=y
CONFIG_SUNXI_WATCHDOG=y CONFIG_SUNXI_WATCHDOG=y
CONFIG_MFD_AXP20X=y CONFIG_MFD_AXP20X=y
CONFIG_REGULATOR=y CONFIG_REGULATOR=y
CONFIG_REGULATOR_FIXED_VOLTAGE=y
CONFIG_REGULATOR_GPIO=y CONFIG_REGULATOR_GPIO=y
CONFIG_USB=y CONFIG_USB=y
CONFIG_USB_EHCI_HCD=y CONFIG_USB_EHCI_HCD=y
......
...@@ -50,8 +50,8 @@ static const char *pcie_axi_sels[] = { "axi", "ahb", }; ...@@ -50,8 +50,8 @@ static const char *pcie_axi_sels[] = { "axi", "ahb", };
static const char *ssi_sels[] = { "pll3_pfd2_508m", "pll3_pfd3_454m", "pll4_audio_div", }; static const char *ssi_sels[] = { "pll3_pfd2_508m", "pll3_pfd3_454m", "pll4_audio_div", };
static const char *usdhc_sels[] = { "pll2_pfd2_396m", "pll2_pfd0_352m", }; static const char *usdhc_sels[] = { "pll2_pfd2_396m", "pll2_pfd0_352m", };
static const char *enfc_sels[] = { "pll2_pfd0_352m", "pll2_bus", "pll3_usb_otg", "pll2_pfd2_396m", }; static const char *enfc_sels[] = { "pll2_pfd0_352m", "pll2_bus", "pll3_usb_otg", "pll2_pfd2_396m", };
static const char *emi_sels[] = { "pll2_pfd2_396m", "pll3_usb_otg", "axi", "pll2_pfd0_352m", }; static const char *eim_sels[] = { "pll2_pfd2_396m", "pll3_usb_otg", "axi", "pll2_pfd0_352m", };
static const char *emi_slow_sels[] = { "axi", "pll3_usb_otg", "pll2_pfd2_396m", "pll2_pfd0_352m", }; static const char *eim_slow_sels[] = { "axi", "pll3_usb_otg", "pll2_pfd2_396m", "pll2_pfd0_352m", };
static const char *vdo_axi_sels[] = { "axi", "ahb", }; static const char *vdo_axi_sels[] = { "axi", "ahb", };
static const char *vpu_axi_sels[] = { "axi", "pll2_pfd2_396m", "pll2_pfd0_352m", }; static const char *vpu_axi_sels[] = { "axi", "pll2_pfd2_396m", "pll2_pfd0_352m", };
static const char *cko1_sels[] = { "pll3_usb_otg", "pll2_bus", "pll1_sys", "pll5_video_div", static const char *cko1_sels[] = { "pll3_usb_otg", "pll2_bus", "pll1_sys", "pll5_video_div",
...@@ -302,8 +302,8 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node) ...@@ -302,8 +302,8 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node)
clk[IMX6QDL_CLK_USDHC3_SEL] = imx_clk_fixup_mux("usdhc3_sel", base + 0x1c, 18, 1, usdhc_sels, ARRAY_SIZE(usdhc_sels), imx_cscmr1_fixup); clk[IMX6QDL_CLK_USDHC3_SEL] = imx_clk_fixup_mux("usdhc3_sel", base + 0x1c, 18, 1, usdhc_sels, ARRAY_SIZE(usdhc_sels), imx_cscmr1_fixup);
clk[IMX6QDL_CLK_USDHC4_SEL] = imx_clk_fixup_mux("usdhc4_sel", base + 0x1c, 19, 1, usdhc_sels, ARRAY_SIZE(usdhc_sels), imx_cscmr1_fixup); clk[IMX6QDL_CLK_USDHC4_SEL] = imx_clk_fixup_mux("usdhc4_sel", base + 0x1c, 19, 1, usdhc_sels, ARRAY_SIZE(usdhc_sels), imx_cscmr1_fixup);
clk[IMX6QDL_CLK_ENFC_SEL] = imx_clk_mux("enfc_sel", base + 0x2c, 16, 2, enfc_sels, ARRAY_SIZE(enfc_sels)); clk[IMX6QDL_CLK_ENFC_SEL] = imx_clk_mux("enfc_sel", base + 0x2c, 16, 2, enfc_sels, ARRAY_SIZE(enfc_sels));
clk[IMX6QDL_CLK_EMI_SEL] = imx_clk_fixup_mux("emi_sel", base + 0x1c, 27, 2, emi_sels, ARRAY_SIZE(emi_sels), imx_cscmr1_fixup); clk[IMX6QDL_CLK_EIM_SEL] = imx_clk_fixup_mux("eim_sel", base + 0x1c, 27, 2, eim_sels, ARRAY_SIZE(eim_sels), imx_cscmr1_fixup);
clk[IMX6QDL_CLK_EMI_SLOW_SEL] = imx_clk_fixup_mux("emi_slow_sel", base + 0x1c, 29, 2, emi_slow_sels, ARRAY_SIZE(emi_slow_sels), imx_cscmr1_fixup); clk[IMX6QDL_CLK_EIM_SLOW_SEL] = imx_clk_fixup_mux("eim_slow_sel", base + 0x1c, 29, 2, eim_slow_sels, ARRAY_SIZE(eim_slow_sels), imx_cscmr1_fixup);
clk[IMX6QDL_CLK_VDO_AXI_SEL] = imx_clk_mux("vdo_axi_sel", base + 0x18, 11, 1, vdo_axi_sels, ARRAY_SIZE(vdo_axi_sels)); clk[IMX6QDL_CLK_VDO_AXI_SEL] = imx_clk_mux("vdo_axi_sel", base + 0x18, 11, 1, vdo_axi_sels, ARRAY_SIZE(vdo_axi_sels));
clk[IMX6QDL_CLK_VPU_AXI_SEL] = imx_clk_mux("vpu_axi_sel", base + 0x18, 14, 2, vpu_axi_sels, ARRAY_SIZE(vpu_axi_sels)); clk[IMX6QDL_CLK_VPU_AXI_SEL] = imx_clk_mux("vpu_axi_sel", base + 0x18, 14, 2, vpu_axi_sels, ARRAY_SIZE(vpu_axi_sels));
clk[IMX6QDL_CLK_CKO1_SEL] = imx_clk_mux("cko1_sel", base + 0x60, 0, 4, cko1_sels, ARRAY_SIZE(cko1_sels)); clk[IMX6QDL_CLK_CKO1_SEL] = imx_clk_mux("cko1_sel", base + 0x60, 0, 4, cko1_sels, ARRAY_SIZE(cko1_sels));
...@@ -354,8 +354,8 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node) ...@@ -354,8 +354,8 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node)
clk[IMX6QDL_CLK_USDHC4_PODF] = imx_clk_divider("usdhc4_podf", "usdhc4_sel", base + 0x24, 22, 3); clk[IMX6QDL_CLK_USDHC4_PODF] = imx_clk_divider("usdhc4_podf", "usdhc4_sel", base + 0x24, 22, 3);
clk[IMX6QDL_CLK_ENFC_PRED] = imx_clk_divider("enfc_pred", "enfc_sel", base + 0x2c, 18, 3); clk[IMX6QDL_CLK_ENFC_PRED] = imx_clk_divider("enfc_pred", "enfc_sel", base + 0x2c, 18, 3);
clk[IMX6QDL_CLK_ENFC_PODF] = imx_clk_divider("enfc_podf", "enfc_pred", base + 0x2c, 21, 6); clk[IMX6QDL_CLK_ENFC_PODF] = imx_clk_divider("enfc_podf", "enfc_pred", base + 0x2c, 21, 6);
clk[IMX6QDL_CLK_EMI_PODF] = imx_clk_fixup_divider("emi_podf", "emi_sel", base + 0x1c, 20, 3, imx_cscmr1_fixup); clk[IMX6QDL_CLK_EIM_PODF] = imx_clk_fixup_divider("eim_podf", "eim_sel", base + 0x1c, 20, 3, imx_cscmr1_fixup);
clk[IMX6QDL_CLK_EMI_SLOW_PODF] = imx_clk_fixup_divider("emi_slow_podf", "emi_slow_sel", base + 0x1c, 23, 3, imx_cscmr1_fixup); clk[IMX6QDL_CLK_EIM_SLOW_PODF] = imx_clk_fixup_divider("eim_slow_podf", "eim_slow_sel", base + 0x1c, 23, 3, imx_cscmr1_fixup);
clk[IMX6QDL_CLK_VPU_AXI_PODF] = imx_clk_divider("vpu_axi_podf", "vpu_axi_sel", base + 0x24, 25, 3); clk[IMX6QDL_CLK_VPU_AXI_PODF] = imx_clk_divider("vpu_axi_podf", "vpu_axi_sel", base + 0x24, 25, 3);
clk[IMX6QDL_CLK_CKO1_PODF] = imx_clk_divider("cko1_podf", "cko1_sel", base + 0x60, 4, 3); clk[IMX6QDL_CLK_CKO1_PODF] = imx_clk_divider("cko1_podf", "cko1_sel", base + 0x60, 4, 3);
clk[IMX6QDL_CLK_CKO2_PODF] = imx_clk_divider("cko2_podf", "cko2_sel", base + 0x60, 21, 3); clk[IMX6QDL_CLK_CKO2_PODF] = imx_clk_divider("cko2_podf", "cko2_sel", base + 0x60, 21, 3);
...@@ -456,7 +456,7 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node) ...@@ -456,7 +456,7 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node)
clk[IMX6QDL_CLK_USDHC2] = imx_clk_gate2("usdhc2", "usdhc2_podf", base + 0x80, 4); clk[IMX6QDL_CLK_USDHC2] = imx_clk_gate2("usdhc2", "usdhc2_podf", base + 0x80, 4);
clk[IMX6QDL_CLK_USDHC3] = imx_clk_gate2("usdhc3", "usdhc3_podf", base + 0x80, 6); clk[IMX6QDL_CLK_USDHC3] = imx_clk_gate2("usdhc3", "usdhc3_podf", base + 0x80, 6);
clk[IMX6QDL_CLK_USDHC4] = imx_clk_gate2("usdhc4", "usdhc4_podf", base + 0x80, 8); clk[IMX6QDL_CLK_USDHC4] = imx_clk_gate2("usdhc4", "usdhc4_podf", base + 0x80, 8);
clk[IMX6QDL_CLK_EIM_SLOW] = imx_clk_gate2("eim_slow", "emi_slow_podf", base + 0x80, 10); clk[IMX6QDL_CLK_EIM_SLOW] = imx_clk_gate2("eim_slow", "eim_slow_podf", base + 0x80, 10);
clk[IMX6QDL_CLK_VDO_AXI] = imx_clk_gate2("vdo_axi", "vdo_axi_sel", base + 0x80, 12); clk[IMX6QDL_CLK_VDO_AXI] = imx_clk_gate2("vdo_axi", "vdo_axi_sel", base + 0x80, 12);
clk[IMX6QDL_CLK_VPU_AXI] = imx_clk_gate2("vpu_axi", "vpu_axi_podf", base + 0x80, 14); clk[IMX6QDL_CLK_VPU_AXI] = imx_clk_gate2("vpu_axi", "vpu_axi_podf", base + 0x80, 14);
clk[IMX6QDL_CLK_CKO1] = imx_clk_gate("cko1", "cko1_podf", base + 0x60, 7); clk[IMX6QDL_CLK_CKO1] = imx_clk_gate("cko1", "cko1_podf", base + 0x60, 7);
......
...@@ -40,7 +40,7 @@ extern void __iomem *rst_manager_base_addr; ...@@ -40,7 +40,7 @@ extern void __iomem *rst_manager_base_addr;
extern struct smp_operations socfpga_smp_ops; extern struct smp_operations socfpga_smp_ops;
extern char secondary_trampoline, secondary_trampoline_end; extern char secondary_trampoline, secondary_trampoline_end;
extern unsigned long cpu1start_addr; extern unsigned long socfpga_cpu1start_addr;
#define SOCFPGA_SCU_VIRT_BASE 0xfffec000 #define SOCFPGA_SCU_VIRT_BASE 0xfffec000
......
...@@ -9,21 +9,26 @@ ...@@ -9,21 +9,26 @@
*/ */
#include <linux/linkage.h> #include <linux/linkage.h>
#include <linux/init.h> #include <linux/init.h>
#include <asm/memory.h>
.arch armv7-a .arch armv7-a
ENTRY(secondary_trampoline) ENTRY(secondary_trampoline)
movw r2, #:lower16:cpu1start_addr /* CPU1 will always fetch from 0x0 when it is brought out of reset.
movt r2, #:upper16:cpu1start_addr * Thus, we can just subtract the PAGE_OFFSET to get the physical
* address of &cpu1start_addr. This would not work for platforms
/* The socfpga VT cannot handle a 0xC0000000 page offset when loading * where the physical memory does not start at 0x0.
the cpu1start_addr, we bit clear it. Tested on HW and VT. */ */
bic r2, r2, #0x40000000 adr r0, 1f
ldmia r0, {r1, r2}
ldr r0, [r2] sub r2, r2, #PAGE_OFFSET
ldr r1, [r0] ldr r3, [r2]
bx r1 ldr r4, [r3]
bx r4
.align
1: .long .
.long socfpga_cpu1start_addr
ENTRY(secondary_trampoline_end) ENTRY(secondary_trampoline_end)
ENTRY(socfpga_secondary_startup) ENTRY(socfpga_secondary_startup)
......
...@@ -33,11 +33,11 @@ static int socfpga_boot_secondary(unsigned int cpu, struct task_struct *idle) ...@@ -33,11 +33,11 @@ static int socfpga_boot_secondary(unsigned int cpu, struct task_struct *idle)
{ {
int trampoline_size = &secondary_trampoline_end - &secondary_trampoline; int trampoline_size = &secondary_trampoline_end - &secondary_trampoline;
if (cpu1start_addr) { if (socfpga_cpu1start_addr) {
memcpy(phys_to_virt(0), &secondary_trampoline, trampoline_size); memcpy(phys_to_virt(0), &secondary_trampoline, trampoline_size);
__raw_writel(virt_to_phys(socfpga_secondary_startup), __raw_writel(virt_to_phys(socfpga_secondary_startup),
(sys_manager_base_addr + (cpu1start_addr & 0x000000ff))); (sys_manager_base_addr + (socfpga_cpu1start_addr & 0x000000ff)));
flush_cache_all(); flush_cache_all();
smp_wmb(); smp_wmb();
......
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
void __iomem *socfpga_scu_base_addr = ((void __iomem *)(SOCFPGA_SCU_VIRT_BASE)); void __iomem *socfpga_scu_base_addr = ((void __iomem *)(SOCFPGA_SCU_VIRT_BASE));
void __iomem *sys_manager_base_addr; void __iomem *sys_manager_base_addr;
void __iomem *rst_manager_base_addr; void __iomem *rst_manager_base_addr;
unsigned long cpu1start_addr; unsigned long socfpga_cpu1start_addr;
static struct map_desc scu_io_desc __initdata = { static struct map_desc scu_io_desc __initdata = {
.virtual = SOCFPGA_SCU_VIRT_BASE, .virtual = SOCFPGA_SCU_VIRT_BASE,
...@@ -70,7 +70,7 @@ void __init socfpga_sysmgr_init(void) ...@@ -70,7 +70,7 @@ void __init socfpga_sysmgr_init(void)
np = of_find_compatible_node(NULL, NULL, "altr,sys-mgr"); np = of_find_compatible_node(NULL, NULL, "altr,sys-mgr");
if (of_property_read_u32(np, "cpu1-start-addr", if (of_property_read_u32(np, "cpu1-start-addr",
(u32 *) &cpu1start_addr)) (u32 *) &socfpga_cpu1start_addr))
pr_err("SMP: Need cpu1-start-addr in device tree.\n"); pr_err("SMP: Need cpu1-start-addr in device tree.\n");
sys_manager_base_addr = of_iomap(np, 0); sys_manager_base_addr = of_iomap(np, 0);
......
...@@ -100,11 +100,11 @@ static void at91sam9g45_restart(enum reboot_mode mode, const char *cmd) ...@@ -100,11 +100,11 @@ static void at91sam9g45_restart(enum reboot_mode mode, const char *cmd)
/* Disable SDRAM0 accesses */ /* Disable SDRAM0 accesses */
"1: str %3, [%0, #" __stringify(AT91_DDRSDRC_RTR) "]\n\t" "1: str %3, [%0, #" __stringify(AT91_DDRSDRC_RTR) "]\n\t"
/* Power down SDRAM0 */ /* Power down SDRAM0 */
" str %4, [%0, #" __stringify(AT91_DDRSDRC_RTR) "]\n\t" " str %4, [%0, #" __stringify(AT91_DDRSDRC_LPR) "]\n\t"
/* Disable SDRAM1 accesses */ /* Disable SDRAM1 accesses */
" strne %3, [%1, #" __stringify(AT91_DDRSDRC_RTR) "]\n\t" " strne %3, [%1, #" __stringify(AT91_DDRSDRC_RTR) "]\n\t"
/* Power down SDRAM1 */ /* Power down SDRAM1 */
" strne %4, [%1, #" __stringify(AT91_DDRSDRC_RTR) "]\n\t" " strne %4, [%1, #" __stringify(AT91_DDRSDRC_LPR) "]\n\t"
/* Reset CPU */ /* Reset CPU */
" str %5, [%2, #" __stringify(AT91_RSTC_CR) "]\n\t" " str %5, [%2, #" __stringify(AT91_RSTC_CR) "]\n\t"
......
...@@ -62,8 +62,8 @@ ...@@ -62,8 +62,8 @@
#define IMX6QDL_CLK_USDHC3_SEL 50 #define IMX6QDL_CLK_USDHC3_SEL 50
#define IMX6QDL_CLK_USDHC4_SEL 51 #define IMX6QDL_CLK_USDHC4_SEL 51
#define IMX6QDL_CLK_ENFC_SEL 52 #define IMX6QDL_CLK_ENFC_SEL 52
#define IMX6QDL_CLK_EMI_SEL 53 #define IMX6QDL_CLK_EIM_SEL 53
#define IMX6QDL_CLK_EMI_SLOW_SEL 54 #define IMX6QDL_CLK_EIM_SLOW_SEL 54
#define IMX6QDL_CLK_VDO_AXI_SEL 55 #define IMX6QDL_CLK_VDO_AXI_SEL 55
#define IMX6QDL_CLK_VPU_AXI_SEL 56 #define IMX6QDL_CLK_VPU_AXI_SEL 56
#define IMX6QDL_CLK_CKO1_SEL 57 #define IMX6QDL_CLK_CKO1_SEL 57
...@@ -106,8 +106,8 @@ ...@@ -106,8 +106,8 @@
#define IMX6QDL_CLK_USDHC4_PODF 94 #define IMX6QDL_CLK_USDHC4_PODF 94
#define IMX6QDL_CLK_ENFC_PRED 95 #define IMX6QDL_CLK_ENFC_PRED 95
#define IMX6QDL_CLK_ENFC_PODF 96 #define IMX6QDL_CLK_ENFC_PODF 96
#define IMX6QDL_CLK_EMI_PODF 97 #define IMX6QDL_CLK_EIM_PODF 97
#define IMX6QDL_CLK_EMI_SLOW_PODF 98 #define IMX6QDL_CLK_EIM_SLOW_PODF 98
#define IMX6QDL_CLK_VPU_AXI_PODF 99 #define IMX6QDL_CLK_VPU_AXI_PODF 99
#define IMX6QDL_CLK_CKO1_PODF 100 #define IMX6QDL_CLK_CKO1_PODF 100
#define IMX6QDL_CLK_AXI 101 #define IMX6QDL_CLK_AXI 101
......
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