Merge branch 'x86/urgent' into x86/asm, to pick up dependent fixes
Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
commit
f95b23a112
570 changed files with 5420 additions and 3393 deletions
2
.mailmap
2
.mailmap
|
@ -68,6 +68,8 @@ Jacob Shin <Jacob.Shin@amd.com>
|
||||||
James Bottomley <jejb@mulgrave.(none)>
|
James Bottomley <jejb@mulgrave.(none)>
|
||||||
James Bottomley <jejb@titanic.il.steeleye.com>
|
James Bottomley <jejb@titanic.il.steeleye.com>
|
||||||
James E Wilson <wilson@specifix.com>
|
James E Wilson <wilson@specifix.com>
|
||||||
|
James Hogan <jhogan@kernel.org> <james.hogan@imgtec.com>
|
||||||
|
James Hogan <jhogan@kernel.org> <james@albanarts.com>
|
||||||
James Ketrenos <jketreno@io.(none)>
|
James Ketrenos <jketreno@io.(none)>
|
||||||
Javi Merino <javi.merino@kernel.org> <javi.merino@arm.com>
|
Javi Merino <javi.merino@kernel.org> <javi.merino@arm.com>
|
||||||
<javier@osg.samsung.com> <javier.martinez@collabora.co.uk>
|
<javier@osg.samsung.com> <javier.martinez@collabora.co.uk>
|
||||||
|
|
|
@ -14,13 +14,3 @@ Description: Enable/disable VMA based swap readahead.
|
||||||
still used for tmpfs etc. other users. If set to
|
still used for tmpfs etc. other users. If set to
|
||||||
false, the global swap readahead algorithm will be
|
false, the global swap readahead algorithm will be
|
||||||
used for all swappable pages.
|
used for all swappable pages.
|
||||||
|
|
||||||
What: /sys/kernel/mm/swap/vma_ra_max_order
|
|
||||||
Date: August 2017
|
|
||||||
Contact: Linux memory management mailing list <linux-mm@kvack.org>
|
|
||||||
Description: The max readahead size in order for VMA based swap readahead
|
|
||||||
|
|
||||||
VMA based swap readahead algorithm will readahead at
|
|
||||||
most 1 << max_order pages for each readahead. The
|
|
||||||
real readahead size for each readahead will be scaled
|
|
||||||
according to the estimation algorithm.
|
|
||||||
|
|
|
@ -127,7 +127,7 @@ Description:
|
||||||
|
|
||||||
What; /sys/power/pm_trace_dev_match
|
What; /sys/power/pm_trace_dev_match
|
||||||
Date: October 2010
|
Date: October 2010
|
||||||
Contact: James Hogan <james@albanarts.com>
|
Contact: James Hogan <jhogan@kernel.org>
|
||||||
Description:
|
Description:
|
||||||
The /sys/power/pm_trace_dev_match file contains the name of the
|
The /sys/power/pm_trace_dev_match file contains the name of the
|
||||||
device associated with the last PM event point saved in the RTC
|
device associated with the last PM event point saved in the RTC
|
||||||
|
|
|
@ -344,3 +344,4 @@ Version History
|
||||||
(wrong raid10_copies/raid10_format sequence)
|
(wrong raid10_copies/raid10_format sequence)
|
||||||
1.11.1 Add raid4/5/6 journal write-back support via journal_mode option
|
1.11.1 Add raid4/5/6 journal write-back support via journal_mode option
|
||||||
1.12.1 fix for MD deadlock between mddev_suspend() and md_write_start() available
|
1.12.1 fix for MD deadlock between mddev_suspend() and md_write_start() available
|
||||||
|
1.13.0 Fix dev_health status at end of "recover" (was 'a', now 'A')
|
||||||
|
|
|
@ -16,11 +16,13 @@ Required Properties:
|
||||||
|
|
||||||
- clocks:
|
- clocks:
|
||||||
Array of clocks required for SDHC.
|
Array of clocks required for SDHC.
|
||||||
Require at least input clock for Xenon IP core.
|
Require at least input clock for Xenon IP core. For Armada AP806 and
|
||||||
|
CP110, the AXI clock is also mandatory.
|
||||||
|
|
||||||
- clock-names:
|
- clock-names:
|
||||||
Array of names corresponding to clocks property.
|
Array of names corresponding to clocks property.
|
||||||
The input clock for Xenon IP core should be named as "core".
|
The input clock for Xenon IP core should be named as "core".
|
||||||
|
The input clock for the AXI bus must be named as "axi".
|
||||||
|
|
||||||
- reg:
|
- reg:
|
||||||
* For "marvell,armada-3700-sdhci", two register areas.
|
* For "marvell,armada-3700-sdhci", two register areas.
|
||||||
|
@ -106,8 +108,8 @@ Example:
|
||||||
compatible = "marvell,armada-ap806-sdhci";
|
compatible = "marvell,armada-ap806-sdhci";
|
||||||
reg = <0xaa0000 0x1000>;
|
reg = <0xaa0000 0x1000>;
|
||||||
interrupts = <GIC_SPI 13 IRQ_TYPE_LEVEL_HIGH>
|
interrupts = <GIC_SPI 13 IRQ_TYPE_LEVEL_HIGH>
|
||||||
clocks = <&emmc_clk>;
|
clocks = <&emmc_clk>,<&axi_clk>;
|
||||||
clock-names = "core";
|
clock-names = "core", "axi";
|
||||||
bus-width = <4>;
|
bus-width = <4>;
|
||||||
marvell,xenon-phy-slow-mode;
|
marvell,xenon-phy-slow-mode;
|
||||||
marvell,xenon-tun-count = <11>;
|
marvell,xenon-tun-count = <11>;
|
||||||
|
@ -126,8 +128,8 @@ Example:
|
||||||
interrupts = <GIC_SPI 55 IRQ_TYPE_LEVEL_HIGH>
|
interrupts = <GIC_SPI 55 IRQ_TYPE_LEVEL_HIGH>
|
||||||
vqmmc-supply = <&sd_vqmmc_regulator>;
|
vqmmc-supply = <&sd_vqmmc_regulator>;
|
||||||
vmmc-supply = <&sd_vmmc_regulator>;
|
vmmc-supply = <&sd_vmmc_regulator>;
|
||||||
clocks = <&sdclk>;
|
clocks = <&sdclk>, <&axi_clk>;
|
||||||
clock-names = "core";
|
clock-names = "core", "axi";
|
||||||
bus-width = <4>;
|
bus-width = <4>;
|
||||||
marvell,xenon-tun-count = <9>;
|
marvell,xenon-tun-count = <9>;
|
||||||
};
|
};
|
||||||
|
|
|
@ -21,8 +21,9 @@ Required properties:
|
||||||
- main controller clock (for both armada-375-pp2 and armada-7k-pp2)
|
- main controller clock (for both armada-375-pp2 and armada-7k-pp2)
|
||||||
- GOP clock (for both armada-375-pp2 and armada-7k-pp2)
|
- GOP clock (for both armada-375-pp2 and armada-7k-pp2)
|
||||||
- MG clock (only for armada-7k-pp2)
|
- MG clock (only for armada-7k-pp2)
|
||||||
- clock-names: names of used clocks, must be "pp_clk", "gop_clk" and
|
- AXI clock (only for armada-7k-pp2)
|
||||||
"mg_clk" (the latter only for armada-7k-pp2).
|
- clock-names: names of used clocks, must be "pp_clk", "gop_clk", "mg_clk"
|
||||||
|
and "axi_clk" (the 2 latter only for armada-7k-pp2).
|
||||||
|
|
||||||
The ethernet ports are represented by subnodes. At least one port is
|
The ethernet ports are represented by subnodes. At least one port is
|
||||||
required.
|
required.
|
||||||
|
@ -78,8 +79,9 @@ Example for marvell,armada-7k-pp2:
|
||||||
cpm_ethernet: ethernet@0 {
|
cpm_ethernet: ethernet@0 {
|
||||||
compatible = "marvell,armada-7k-pp22";
|
compatible = "marvell,armada-7k-pp22";
|
||||||
reg = <0x0 0x100000>, <0x129000 0xb000>;
|
reg = <0x0 0x100000>, <0x129000 0xb000>;
|
||||||
clocks = <&cpm_syscon0 1 3>, <&cpm_syscon0 1 9>, <&cpm_syscon0 1 5>;
|
clocks = <&cpm_syscon0 1 3>, <&cpm_syscon0 1 9>,
|
||||||
clock-names = "pp_clk", "gop_clk", "gp_clk";
|
<&cpm_syscon0 1 5>, <&cpm_syscon0 1 18>;
|
||||||
|
clock-names = "pp_clk", "gop_clk", "gp_clk", "axi_clk";
|
||||||
|
|
||||||
eth0: eth0 {
|
eth0: eth0 {
|
||||||
interrupts = <ICU_GRP_NSR 39 IRQ_TYPE_LEVEL_HIGH>,
|
interrupts = <ICU_GRP_NSR 39 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
|
|
|
@ -4,6 +4,7 @@ The device node has following properties.
|
||||||
|
|
||||||
Required properties:
|
Required properties:
|
||||||
- compatible: should be "rockchip,<name>-gamc"
|
- compatible: should be "rockchip,<name>-gamc"
|
||||||
|
"rockchip,rk3128-gmac": found on RK312x SoCs
|
||||||
"rockchip,rk3228-gmac": found on RK322x SoCs
|
"rockchip,rk3228-gmac": found on RK322x SoCs
|
||||||
"rockchip,rk3288-gmac": found on RK3288 SoCs
|
"rockchip,rk3288-gmac": found on RK3288 SoCs
|
||||||
"rockchip,rk3328-gmac": found on RK3328 SoCs
|
"rockchip,rk3328-gmac": found on RK3328 SoCs
|
||||||
|
|
28
Documentation/devicetree/bindings/reset/snps,hsdk-reset.txt
Normal file
28
Documentation/devicetree/bindings/reset/snps,hsdk-reset.txt
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
Binding for the Synopsys HSDK reset controller
|
||||||
|
|
||||||
|
This binding uses the common reset binding[1].
|
||||||
|
|
||||||
|
[1] Documentation/devicetree/bindings/reset/reset.txt
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
- compatible: should be "snps,hsdk-reset".
|
||||||
|
- reg: should always contain 2 pairs address - length: first for reset
|
||||||
|
configuration register and second for corresponding SW reset and status bits
|
||||||
|
register.
|
||||||
|
- #reset-cells: from common reset binding; Should always be set to 1.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
reset: reset@880 {
|
||||||
|
compatible = "snps,hsdk-reset";
|
||||||
|
#reset-cells = <1>;
|
||||||
|
reg = <0x8A0 0x4>, <0xFF0 0x4>;
|
||||||
|
};
|
||||||
|
|
||||||
|
Specifying reset lines connected to IP modules:
|
||||||
|
ethernet@.... {
|
||||||
|
....
|
||||||
|
resets = <&reset HSDK_V1_ETH_RESET>;
|
||||||
|
....
|
||||||
|
};
|
||||||
|
|
||||||
|
The index could be found in <dt-bindings/reset/snps,hsdk-reset.h>
|
|
@ -210,8 +210,11 @@ path as another overlay mount and it may use a lower layer path that is
|
||||||
beneath or above the path of another overlay lower layer path.
|
beneath or above the path of another overlay lower layer path.
|
||||||
|
|
||||||
Using an upper layer path and/or a workdir path that are already used by
|
Using an upper layer path and/or a workdir path that are already used by
|
||||||
another overlay mount is not allowed and will fail with EBUSY. Using
|
another overlay mount is not allowed and may fail with EBUSY. Using
|
||||||
partially overlapping paths is not allowed but will not fail with EBUSY.
|
partially overlapping paths is not allowed but will not fail with EBUSY.
|
||||||
|
If files are accessed from two overlayfs mounts which share or overlap the
|
||||||
|
upper layer and/or workdir path the behavior of the overlay is undefined,
|
||||||
|
though it will not result in a crash or deadlock.
|
||||||
|
|
||||||
Mounting an overlay using an upper layer path, where the upper layer path
|
Mounting an overlay using an upper layer path, where the upper layer path
|
||||||
was previously used by another mounted overlay in combination with a
|
was previously used by another mounted overlay in combination with a
|
||||||
|
|
|
@ -36,6 +36,7 @@ Supported adapters:
|
||||||
* Intel Gemini Lake (SOC)
|
* Intel Gemini Lake (SOC)
|
||||||
* Intel Cannon Lake-H (PCH)
|
* Intel Cannon Lake-H (PCH)
|
||||||
* Intel Cannon Lake-LP (PCH)
|
* Intel Cannon Lake-LP (PCH)
|
||||||
|
* Intel Cedar Fork (PCH)
|
||||||
Datasheets: Publicly available at the Intel website
|
Datasheets: Publicly available at the Intel website
|
||||||
|
|
||||||
On Intel Patsburg and later chipsets, both the normal host SMBus controller
|
On Intel Patsburg and later chipsets, both the normal host SMBus controller
|
||||||
|
|
|
@ -2387,7 +2387,7 @@ broadcast: Like active-backup, there is not much advantage to this
|
||||||
and packet type ID), so in a "gatewayed" configuration, all
|
and packet type ID), so in a "gatewayed" configuration, all
|
||||||
outgoing traffic will generally use the same device. Incoming
|
outgoing traffic will generally use the same device. Incoming
|
||||||
traffic may also end up on a single device, but that is
|
traffic may also end up on a single device, but that is
|
||||||
dependent upon the balancing policy of the peer's 8023.ad
|
dependent upon the balancing policy of the peer's 802.3ad
|
||||||
implementation. In a "local" configuration, traffic will be
|
implementation. In a "local" configuration, traffic will be
|
||||||
distributed across the devices in the bond.
|
distributed across the devices in the bond.
|
||||||
|
|
||||||
|
|
29
MAINTAINERS
29
MAINTAINERS
|
@ -5259,7 +5259,8 @@ S: Maintained
|
||||||
F: drivers/iommu/exynos-iommu.c
|
F: drivers/iommu/exynos-iommu.c
|
||||||
|
|
||||||
EZchip NPS platform support
|
EZchip NPS platform support
|
||||||
M: Noam Camus <noamc@ezchip.com>
|
M: Elad Kanfi <eladkan@mellanox.com>
|
||||||
|
M: Vineet Gupta <vgupta@synopsys.com>
|
||||||
S: Supported
|
S: Supported
|
||||||
F: arch/arc/plat-eznps
|
F: arch/arc/plat-eznps
|
||||||
F: arch/arc/boot/dts/eznps.dts
|
F: arch/arc/boot/dts/eznps.dts
|
||||||
|
@ -5345,9 +5346,7 @@ M: "J. Bruce Fields" <bfields@fieldses.org>
|
||||||
L: linux-fsdevel@vger.kernel.org
|
L: linux-fsdevel@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: include/linux/fcntl.h
|
F: include/linux/fcntl.h
|
||||||
F: include/linux/fs.h
|
|
||||||
F: include/uapi/linux/fcntl.h
|
F: include/uapi/linux/fcntl.h
|
||||||
F: include/uapi/linux/fs.h
|
|
||||||
F: fs/fcntl.c
|
F: fs/fcntl.c
|
||||||
F: fs/locks.c
|
F: fs/locks.c
|
||||||
|
|
||||||
|
@ -5356,6 +5355,8 @@ M: Alexander Viro <viro@zeniv.linux.org.uk>
|
||||||
L: linux-fsdevel@vger.kernel.org
|
L: linux-fsdevel@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: fs/*
|
F: fs/*
|
||||||
|
F: include/linux/fs.h
|
||||||
|
F: include/uapi/linux/fs.h
|
||||||
|
|
||||||
FINTEK F75375S HARDWARE MONITOR AND FAN CONTROLLER DRIVER
|
FINTEK F75375S HARDWARE MONITOR AND FAN CONTROLLER DRIVER
|
||||||
M: Riku Voipio <riku.voipio@iki.fi>
|
M: Riku Voipio <riku.voipio@iki.fi>
|
||||||
|
@ -6738,7 +6739,7 @@ F: Documentation/devicetree/bindings/auxdisplay/img-ascii-lcd.txt
|
||||||
F: drivers/auxdisplay/img-ascii-lcd.c
|
F: drivers/auxdisplay/img-ascii-lcd.c
|
||||||
|
|
||||||
IMGTEC IR DECODER DRIVER
|
IMGTEC IR DECODER DRIVER
|
||||||
M: James Hogan <james.hogan@imgtec.com>
|
M: James Hogan <jhogan@kernel.org>
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/media/rc/img-ir/
|
F: drivers/media/rc/img-ir/
|
||||||
|
|
||||||
|
@ -7562,7 +7563,7 @@ F: arch/arm64/include/asm/kvm*
|
||||||
F: arch/arm64/kvm/
|
F: arch/arm64/kvm/
|
||||||
|
|
||||||
KERNEL VIRTUAL MACHINE FOR MIPS (KVM/mips)
|
KERNEL VIRTUAL MACHINE FOR MIPS (KVM/mips)
|
||||||
M: James Hogan <james.hogan@imgtec.com>
|
M: James Hogan <jhogan@kernel.org>
|
||||||
L: linux-mips@linux-mips.org
|
L: linux-mips@linux-mips.org
|
||||||
S: Supported
|
S: Supported
|
||||||
F: arch/mips/include/uapi/asm/kvm*
|
F: arch/mips/include/uapi/asm/kvm*
|
||||||
|
@ -7570,7 +7571,7 @@ F: arch/mips/include/asm/kvm*
|
||||||
F: arch/mips/kvm/
|
F: arch/mips/kvm/
|
||||||
|
|
||||||
KERNEL VIRTUAL MACHINE FOR POWERPC (KVM/powerpc)
|
KERNEL VIRTUAL MACHINE FOR POWERPC (KVM/powerpc)
|
||||||
M: Alexander Graf <agraf@suse.com>
|
M: Paul Mackerras <paulus@ozlabs.org>
|
||||||
L: kvm-ppc@vger.kernel.org
|
L: kvm-ppc@vger.kernel.org
|
||||||
W: http://www.linux-kvm.org/
|
W: http://www.linux-kvm.org/
|
||||||
T: git git://github.com/agraf/linux-2.6.git
|
T: git git://github.com/agraf/linux-2.6.git
|
||||||
|
@ -8264,6 +8265,12 @@ L: libertas-dev@lists.infradead.org
|
||||||
S: Orphan
|
S: Orphan
|
||||||
F: drivers/net/wireless/marvell/libertas/
|
F: drivers/net/wireless/marvell/libertas/
|
||||||
|
|
||||||
|
MARVELL MACCHIATOBIN SUPPORT
|
||||||
|
M: Russell King <rmk@armlinux.org.uk>
|
||||||
|
L: linux-arm-kernel@lists.infradead.org
|
||||||
|
S: Maintained
|
||||||
|
F: arch/arm64/boot/dts/marvell/armada-8040-mcbin.dts
|
||||||
|
|
||||||
MARVELL MV643XX ETHERNET DRIVER
|
MARVELL MV643XX ETHERNET DRIVER
|
||||||
M: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
|
M: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
|
@ -8885,7 +8892,7 @@ F: Documentation/devicetree/bindings/media/meson-ao-cec.txt
|
||||||
T: git git://linuxtv.org/media_tree.git
|
T: git git://linuxtv.org/media_tree.git
|
||||||
|
|
||||||
METAG ARCHITECTURE
|
METAG ARCHITECTURE
|
||||||
M: James Hogan <james.hogan@imgtec.com>
|
M: James Hogan <jhogan@kernel.org>
|
||||||
L: linux-metag@vger.kernel.org
|
L: linux-metag@vger.kernel.org
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/jhogan/metag.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/jhogan/metag.git
|
||||||
S: Odd Fixes
|
S: Odd Fixes
|
||||||
|
@ -9354,7 +9361,7 @@ NETWORK BLOCK DEVICE (NBD)
|
||||||
M: Josef Bacik <jbacik@fb.com>
|
M: Josef Bacik <jbacik@fb.com>
|
||||||
S: Maintained
|
S: Maintained
|
||||||
L: linux-block@vger.kernel.org
|
L: linux-block@vger.kernel.org
|
||||||
L: nbd-general@lists.sourceforge.net
|
L: nbd@other.debian.org
|
||||||
F: Documentation/blockdev/nbd.txt
|
F: Documentation/blockdev/nbd.txt
|
||||||
F: drivers/block/nbd.c
|
F: drivers/block/nbd.c
|
||||||
F: include/uapi/linux/nbd.h
|
F: include/uapi/linux/nbd.h
|
||||||
|
@ -12931,9 +12938,9 @@ F: drivers/mmc/host/dw_mmc*
|
||||||
SYNOPSYS HSDK RESET CONTROLLER DRIVER
|
SYNOPSYS HSDK RESET CONTROLLER DRIVER
|
||||||
M: Eugeniy Paltsev <Eugeniy.Paltsev@synopsys.com>
|
M: Eugeniy Paltsev <Eugeniy.Paltsev@synopsys.com>
|
||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/reset/reset-hsdk-v1.c
|
F: drivers/reset/reset-hsdk.c
|
||||||
F: include/dt-bindings/reset/snps,hsdk-v1-reset.h
|
F: include/dt-bindings/reset/snps,hsdk-reset.h
|
||||||
F: Documentation/devicetree/bindings/reset/snps,hsdk-v1-reset.txt
|
F: Documentation/devicetree/bindings/reset/snps,hsdk-reset.txt
|
||||||
|
|
||||||
SYSTEM CONFIGURATION (SYSCON)
|
SYSTEM CONFIGURATION (SYSCON)
|
||||||
M: Lee Jones <lee.jones@linaro.org>
|
M: Lee Jones <lee.jones@linaro.org>
|
||||||
|
|
2
Makefile
2
Makefile
|
@ -1,7 +1,7 @@
|
||||||
VERSION = 4
|
VERSION = 4
|
||||||
PATCHLEVEL = 14
|
PATCHLEVEL = 14
|
||||||
SUBLEVEL = 0
|
SUBLEVEL = 0
|
||||||
EXTRAVERSION = -rc3
|
EXTRAVERSION = -rc5
|
||||||
NAME = Fearless Coyote
|
NAME = Fearless Coyote
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
|
|
|
@ -937,9 +937,6 @@ config STRICT_MODULE_RWX
|
||||||
and non-text memory will be made non-executable. This provides
|
and non-text memory will be made non-executable. This provides
|
||||||
protection against certain security exploits (e.g. writing to text)
|
protection against certain security exploits (e.g. writing to text)
|
||||||
|
|
||||||
config ARCH_WANT_RELAX_ORDER
|
|
||||||
bool
|
|
||||||
|
|
||||||
config ARCH_HAS_REFCOUNT
|
config ARCH_HAS_REFCOUNT
|
||||||
bool
|
bool
|
||||||
help
|
help
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/mm_types.h>
|
#include <linux/mm_types.h>
|
||||||
|
#include <linux/sched.h>
|
||||||
|
|
||||||
#include <asm/machvec.h>
|
#include <asm/machvec.h>
|
||||||
#include <asm/compiler.h>
|
#include <asm/compiler.h>
|
||||||
|
|
|
@ -24,7 +24,7 @@ config ARC
|
||||||
select GENERIC_SMP_IDLE_THREAD
|
select GENERIC_SMP_IDLE_THREAD
|
||||||
select HAVE_ARCH_KGDB
|
select HAVE_ARCH_KGDB
|
||||||
select HAVE_ARCH_TRACEHOOK
|
select HAVE_ARCH_TRACEHOOK
|
||||||
select HAVE_FUTEX_CMPXCHG
|
select HAVE_FUTEX_CMPXCHG if FUTEX
|
||||||
select HAVE_IOREMAP_PROT
|
select HAVE_IOREMAP_PROT
|
||||||
select HAVE_KPROBES
|
select HAVE_KPROBES
|
||||||
select HAVE_KRETPROBES
|
select HAVE_KRETPROBES
|
||||||
|
|
|
@ -6,8 +6,6 @@
|
||||||
# published by the Free Software Foundation.
|
# published by the Free Software Foundation.
|
||||||
#
|
#
|
||||||
|
|
||||||
UTS_MACHINE := arc
|
|
||||||
|
|
||||||
ifeq ($(CROSS_COMPILE),)
|
ifeq ($(CROSS_COMPILE),)
|
||||||
ifndef CONFIG_CPU_BIG_ENDIAN
|
ifndef CONFIG_CPU_BIG_ENDIAN
|
||||||
CROSS_COMPILE := arc-linux-
|
CROSS_COMPILE := arc-linux-
|
||||||
|
|
|
@ -44,7 +44,14 @@
|
||||||
|
|
||||||
mmcclk: mmcclk {
|
mmcclk: mmcclk {
|
||||||
compatible = "fixed-clock";
|
compatible = "fixed-clock";
|
||||||
clock-frequency = <50000000>;
|
/*
|
||||||
|
* DW sdio controller has external ciu clock divider
|
||||||
|
* controlled via register in SDIO IP. It divides
|
||||||
|
* sdio_ref_clk (which comes from CGU) by 16 for
|
||||||
|
* default. So default mmcclk clock (which comes
|
||||||
|
* to sdk_in) is 25000000 Hz.
|
||||||
|
*/
|
||||||
|
clock-frequency = <25000000>;
|
||||||
#clock-cells = <0>;
|
#clock-cells = <0>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
/dts-v1/;
|
/dts-v1/;
|
||||||
|
|
||||||
#include <dt-bindings/net/ti-dp83867.h>
|
#include <dt-bindings/net/ti-dp83867.h>
|
||||||
|
#include <dt-bindings/reset/snps,hsdk-reset.h>
|
||||||
|
|
||||||
/ {
|
/ {
|
||||||
model = "snps,hsdk";
|
model = "snps,hsdk";
|
||||||
|
@ -57,10 +58,10 @@
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
core_clk: core-clk {
|
input_clk: input-clk {
|
||||||
#clock-cells = <0>;
|
#clock-cells = <0>;
|
||||||
compatible = "fixed-clock";
|
compatible = "fixed-clock";
|
||||||
clock-frequency = <500000000>;
|
clock-frequency = <33333333>;
|
||||||
};
|
};
|
||||||
|
|
||||||
cpu_intc: cpu-interrupt-controller {
|
cpu_intc: cpu-interrupt-controller {
|
||||||
|
@ -102,6 +103,19 @@
|
||||||
|
|
||||||
ranges = <0x00000000 0xf0000000 0x10000000>;
|
ranges = <0x00000000 0xf0000000 0x10000000>;
|
||||||
|
|
||||||
|
cgu_rst: reset-controller@8a0 {
|
||||||
|
compatible = "snps,hsdk-reset";
|
||||||
|
#reset-cells = <1>;
|
||||||
|
reg = <0x8A0 0x4>, <0xFF0 0x4>;
|
||||||
|
};
|
||||||
|
|
||||||
|
core_clk: core-clk@0 {
|
||||||
|
compatible = "snps,hsdk-core-pll-clock";
|
||||||
|
reg = <0x00 0x10>, <0x14B8 0x4>;
|
||||||
|
#clock-cells = <0>;
|
||||||
|
clocks = <&input_clk>;
|
||||||
|
};
|
||||||
|
|
||||||
serial: serial@5000 {
|
serial: serial@5000 {
|
||||||
compatible = "snps,dw-apb-uart";
|
compatible = "snps,dw-apb-uart";
|
||||||
reg = <0x5000 0x100>;
|
reg = <0x5000 0x100>;
|
||||||
|
@ -120,7 +134,17 @@
|
||||||
|
|
||||||
mmcclk_ciu: mmcclk-ciu {
|
mmcclk_ciu: mmcclk-ciu {
|
||||||
compatible = "fixed-clock";
|
compatible = "fixed-clock";
|
||||||
clock-frequency = <100000000>;
|
/*
|
||||||
|
* DW sdio controller has external ciu clock divider
|
||||||
|
* controlled via register in SDIO IP. Due to its
|
||||||
|
* unexpected default value (it should devide by 1
|
||||||
|
* but it devides by 8) SDIO IP uses wrong clock and
|
||||||
|
* works unstable (see STAR 9001204800)
|
||||||
|
* So add temporary fix and change clock frequency
|
||||||
|
* from 100000000 to 12500000 Hz until we fix dw sdio
|
||||||
|
* driver itself.
|
||||||
|
*/
|
||||||
|
clock-frequency = <12500000>;
|
||||||
#clock-cells = <0>;
|
#clock-cells = <0>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -141,6 +165,8 @@
|
||||||
clocks = <&gmacclk>;
|
clocks = <&gmacclk>;
|
||||||
clock-names = "stmmaceth";
|
clock-names = "stmmaceth";
|
||||||
phy-handle = <&phy0>;
|
phy-handle = <&phy0>;
|
||||||
|
resets = <&cgu_rst HSDK_ETH_RESET>;
|
||||||
|
reset-names = "stmmaceth";
|
||||||
|
|
||||||
mdio {
|
mdio {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
|
|
|
@ -105,7 +105,7 @@ CONFIG_NLS_ISO8859_1=y
|
||||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||||
# CONFIG_ENABLE_MUST_CHECK is not set
|
# CONFIG_ENABLE_MUST_CHECK is not set
|
||||||
CONFIG_STRIP_ASM_SYMS=y
|
CONFIG_STRIP_ASM_SYMS=y
|
||||||
CONFIG_LOCKUP_DETECTOR=y
|
CONFIG_SOFTLOCKUP_DETECTOR=y
|
||||||
CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=10
|
CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=10
|
||||||
# CONFIG_SCHED_DEBUG is not set
|
# CONFIG_SCHED_DEBUG is not set
|
||||||
# CONFIG_DEBUG_PREEMPT is not set
|
# CONFIG_DEBUG_PREEMPT is not set
|
||||||
|
|
|
@ -104,7 +104,7 @@ CONFIG_NLS_ISO8859_1=y
|
||||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||||
# CONFIG_ENABLE_MUST_CHECK is not set
|
# CONFIG_ENABLE_MUST_CHECK is not set
|
||||||
CONFIG_STRIP_ASM_SYMS=y
|
CONFIG_STRIP_ASM_SYMS=y
|
||||||
CONFIG_LOCKUP_DETECTOR=y
|
CONFIG_SOFTLOCKUP_DETECTOR=y
|
||||||
CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=10
|
CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=10
|
||||||
# CONFIG_SCHED_DEBUG is not set
|
# CONFIG_SCHED_DEBUG is not set
|
||||||
# CONFIG_DEBUG_PREEMPT is not set
|
# CONFIG_DEBUG_PREEMPT is not set
|
||||||
|
|
|
@ -107,7 +107,7 @@ CONFIG_NLS_ISO8859_1=y
|
||||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||||
# CONFIG_ENABLE_MUST_CHECK is not set
|
# CONFIG_ENABLE_MUST_CHECK is not set
|
||||||
CONFIG_STRIP_ASM_SYMS=y
|
CONFIG_STRIP_ASM_SYMS=y
|
||||||
CONFIG_LOCKUP_DETECTOR=y
|
CONFIG_SOFTLOCKUP_DETECTOR=y
|
||||||
CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=10
|
CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=10
|
||||||
# CONFIG_SCHED_DEBUG is not set
|
# CONFIG_SCHED_DEBUG is not set
|
||||||
# CONFIG_DEBUG_PREEMPT is not set
|
# CONFIG_DEBUG_PREEMPT is not set
|
||||||
|
|
|
@ -84,5 +84,5 @@ CONFIG_TMPFS=y
|
||||||
CONFIG_NFS_FS=y
|
CONFIG_NFS_FS=y
|
||||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||||
# CONFIG_ENABLE_MUST_CHECK is not set
|
# CONFIG_ENABLE_MUST_CHECK is not set
|
||||||
CONFIG_LOCKUP_DETECTOR=y
|
CONFIG_SOFTLOCKUP_DETECTOR=y
|
||||||
# CONFIG_DEBUG_PREEMPT is not set
|
# CONFIG_DEBUG_PREEMPT is not set
|
||||||
|
|
|
@ -63,6 +63,7 @@ CONFIG_MMC_SDHCI=y
|
||||||
CONFIG_MMC_SDHCI_PLTFM=y
|
CONFIG_MMC_SDHCI_PLTFM=y
|
||||||
CONFIG_MMC_DW=y
|
CONFIG_MMC_DW=y
|
||||||
# CONFIG_IOMMU_SUPPORT is not set
|
# CONFIG_IOMMU_SUPPORT is not set
|
||||||
|
CONFIG_RESET_HSDK=y
|
||||||
CONFIG_EXT3_FS=y
|
CONFIG_EXT3_FS=y
|
||||||
CONFIG_VFAT_FS=y
|
CONFIG_VFAT_FS=y
|
||||||
CONFIG_TMPFS=y
|
CONFIG_TMPFS=y
|
||||||
|
@ -72,7 +73,7 @@ CONFIG_NLS_ISO8859_1=y
|
||||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||||
# CONFIG_ENABLE_MUST_CHECK is not set
|
# CONFIG_ENABLE_MUST_CHECK is not set
|
||||||
CONFIG_STRIP_ASM_SYMS=y
|
CONFIG_STRIP_ASM_SYMS=y
|
||||||
CONFIG_LOCKUP_DETECTOR=y
|
CONFIG_SOFTLOCKUP_DETECTOR=y
|
||||||
CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=10
|
CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=10
|
||||||
# CONFIG_SCHED_DEBUG is not set
|
# CONFIG_SCHED_DEBUG is not set
|
||||||
# CONFIG_DEBUG_PREEMPT is not set
|
# CONFIG_DEBUG_PREEMPT is not set
|
||||||
|
|
|
@ -94,7 +94,7 @@ CONFIG_NLS_ISO8859_1=y
|
||||||
# CONFIG_ENABLE_MUST_CHECK is not set
|
# CONFIG_ENABLE_MUST_CHECK is not set
|
||||||
CONFIG_STRIP_ASM_SYMS=y
|
CONFIG_STRIP_ASM_SYMS=y
|
||||||
CONFIG_DEBUG_SHIRQ=y
|
CONFIG_DEBUG_SHIRQ=y
|
||||||
CONFIG_LOCKUP_DETECTOR=y
|
CONFIG_SOFTLOCKUP_DETECTOR=y
|
||||||
CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=10
|
CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=10
|
||||||
# CONFIG_SCHED_DEBUG is not set
|
# CONFIG_SCHED_DEBUG is not set
|
||||||
# CONFIG_DEBUG_PREEMPT is not set
|
# CONFIG_DEBUG_PREEMPT is not set
|
||||||
|
|
|
@ -98,7 +98,7 @@ CONFIG_NLS_ISO8859_1=y
|
||||||
# CONFIG_ENABLE_MUST_CHECK is not set
|
# CONFIG_ENABLE_MUST_CHECK is not set
|
||||||
CONFIG_STRIP_ASM_SYMS=y
|
CONFIG_STRIP_ASM_SYMS=y
|
||||||
CONFIG_DEBUG_SHIRQ=y
|
CONFIG_DEBUG_SHIRQ=y
|
||||||
CONFIG_LOCKUP_DETECTOR=y
|
CONFIG_SOFTLOCKUP_DETECTOR=y
|
||||||
CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=10
|
CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=10
|
||||||
# CONFIG_SCHED_DEBUG is not set
|
# CONFIG_SCHED_DEBUG is not set
|
||||||
# CONFIG_DEBUG_PREEMPT is not set
|
# CONFIG_DEBUG_PREEMPT is not set
|
||||||
|
|
|
@ -98,6 +98,7 @@
|
||||||
|
|
||||||
/* Auxiliary registers */
|
/* Auxiliary registers */
|
||||||
#define AUX_IDENTITY 4
|
#define AUX_IDENTITY 4
|
||||||
|
#define AUX_EXEC_CTRL 8
|
||||||
#define AUX_INTR_VEC_BASE 0x25
|
#define AUX_INTR_VEC_BASE 0x25
|
||||||
#define AUX_VOL 0x5e
|
#define AUX_VOL 0x5e
|
||||||
|
|
||||||
|
@ -135,12 +136,12 @@ struct bcr_identity {
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
struct bcr_isa {
|
struct bcr_isa_arcv2 {
|
||||||
#ifdef CONFIG_CPU_BIG_ENDIAN
|
#ifdef CONFIG_CPU_BIG_ENDIAN
|
||||||
unsigned int div_rem:4, pad2:4, ldd:1, unalign:1, atomic:1, be:1,
|
unsigned int div_rem:4, pad2:4, ldd:1, unalign:1, atomic:1, be:1,
|
||||||
pad1:11, atomic1:1, ver:8;
|
pad1:12, ver:8;
|
||||||
#else
|
#else
|
||||||
unsigned int ver:8, atomic1:1, pad1:11, be:1, atomic:1, unalign:1,
|
unsigned int ver:8, pad1:12, be:1, atomic:1, unalign:1,
|
||||||
ldd:1, pad2:4, div_rem:4;
|
ldd:1, pad2:4, div_rem:4;
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
@ -263,13 +264,13 @@ struct cpuinfo_arc {
|
||||||
struct cpuinfo_arc_mmu mmu;
|
struct cpuinfo_arc_mmu mmu;
|
||||||
struct cpuinfo_arc_bpu bpu;
|
struct cpuinfo_arc_bpu bpu;
|
||||||
struct bcr_identity core;
|
struct bcr_identity core;
|
||||||
struct bcr_isa isa;
|
struct bcr_isa_arcv2 isa;
|
||||||
const char *details, *name;
|
const char *details, *name;
|
||||||
unsigned int vec_base;
|
unsigned int vec_base;
|
||||||
struct cpuinfo_arc_ccm iccm, dccm;
|
struct cpuinfo_arc_ccm iccm, dccm;
|
||||||
struct {
|
struct {
|
||||||
unsigned int swap:1, norm:1, minmax:1, barrel:1, crc:1, swape:1, pad1:2,
|
unsigned int swap:1, norm:1, minmax:1, barrel:1, crc:1, swape:1, pad1:2,
|
||||||
fpu_sp:1, fpu_dp:1, pad2:6,
|
fpu_sp:1, fpu_dp:1, dual_iss_enb:1, dual_iss_exist:1, pad2:4,
|
||||||
debug:1, ap:1, smart:1, rtt:1, pad3:4,
|
debug:1, ap:1, smart:1, rtt:1, pad3:4,
|
||||||
timer0:1, timer1:1, rtc:1, gfrc:1, pad4:4;
|
timer0:1, timer1:1, rtc:1, gfrc:1, pad4:4;
|
||||||
} extn;
|
} extn;
|
||||||
|
|
|
@ -51,6 +51,7 @@ static const struct id_to_str arc_cpu_rel[] = {
|
||||||
{ 0x51, "R2.0" },
|
{ 0x51, "R2.0" },
|
||||||
{ 0x52, "R2.1" },
|
{ 0x52, "R2.1" },
|
||||||
{ 0x53, "R3.0" },
|
{ 0x53, "R3.0" },
|
||||||
|
{ 0x54, "R4.0" },
|
||||||
#endif
|
#endif
|
||||||
{ 0x00, NULL }
|
{ 0x00, NULL }
|
||||||
};
|
};
|
||||||
|
@ -62,6 +63,7 @@ static const struct id_to_str arc_cpu_nm[] = {
|
||||||
#else
|
#else
|
||||||
{ 0x40, "ARC EM" },
|
{ 0x40, "ARC EM" },
|
||||||
{ 0x50, "ARC HS38" },
|
{ 0x50, "ARC HS38" },
|
||||||
|
{ 0x54, "ARC HS48" },
|
||||||
#endif
|
#endif
|
||||||
{ 0x00, "Unknown" }
|
{ 0x00, "Unknown" }
|
||||||
};
|
};
|
||||||
|
@ -119,11 +121,11 @@ static void read_arc_build_cfg_regs(void)
|
||||||
struct bcr_generic bcr;
|
struct bcr_generic bcr;
|
||||||
struct cpuinfo_arc *cpu = &cpuinfo_arc700[smp_processor_id()];
|
struct cpuinfo_arc *cpu = &cpuinfo_arc700[smp_processor_id()];
|
||||||
const struct id_to_str *tbl;
|
const struct id_to_str *tbl;
|
||||||
|
struct bcr_isa_arcv2 isa;
|
||||||
|
|
||||||
FIX_PTR(cpu);
|
FIX_PTR(cpu);
|
||||||
|
|
||||||
READ_BCR(AUX_IDENTITY, cpu->core);
|
READ_BCR(AUX_IDENTITY, cpu->core);
|
||||||
READ_BCR(ARC_REG_ISA_CFG_BCR, cpu->isa);
|
|
||||||
|
|
||||||
for (tbl = &arc_cpu_rel[0]; tbl->id != 0; tbl++) {
|
for (tbl = &arc_cpu_rel[0]; tbl->id != 0; tbl++) {
|
||||||
if (cpu->core.family == tbl->id) {
|
if (cpu->core.family == tbl->id) {
|
||||||
|
@ -133,7 +135,7 @@ static void read_arc_build_cfg_regs(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
for (tbl = &arc_cpu_nm[0]; tbl->id != 0; tbl++) {
|
for (tbl = &arc_cpu_nm[0]; tbl->id != 0; tbl++) {
|
||||||
if ((cpu->core.family & 0xF0) == tbl->id)
|
if ((cpu->core.family & 0xF4) == tbl->id)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
cpu->name = tbl->str;
|
cpu->name = tbl->str;
|
||||||
|
@ -192,6 +194,14 @@ static void read_arc_build_cfg_regs(void)
|
||||||
cpu->bpu.full = bpu.ft;
|
cpu->bpu.full = bpu.ft;
|
||||||
cpu->bpu.num_cache = 256 << bpu.bce;
|
cpu->bpu.num_cache = 256 << bpu.bce;
|
||||||
cpu->bpu.num_pred = 2048 << bpu.pte;
|
cpu->bpu.num_pred = 2048 << bpu.pte;
|
||||||
|
|
||||||
|
if (cpu->core.family >= 0x54) {
|
||||||
|
unsigned int exec_ctrl;
|
||||||
|
|
||||||
|
READ_BCR(AUX_EXEC_CTRL, exec_ctrl);
|
||||||
|
cpu->extn.dual_iss_exist = 1;
|
||||||
|
cpu->extn.dual_iss_enb = exec_ctrl & 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
READ_BCR(ARC_REG_AP_BCR, bcr);
|
READ_BCR(ARC_REG_AP_BCR, bcr);
|
||||||
|
@ -205,18 +215,25 @@ static void read_arc_build_cfg_regs(void)
|
||||||
|
|
||||||
cpu->extn.debug = cpu->extn.ap | cpu->extn.smart | cpu->extn.rtt;
|
cpu->extn.debug = cpu->extn.ap | cpu->extn.smart | cpu->extn.rtt;
|
||||||
|
|
||||||
|
READ_BCR(ARC_REG_ISA_CFG_BCR, isa);
|
||||||
|
|
||||||
/* some hacks for lack of feature BCR info in old ARC700 cores */
|
/* some hacks for lack of feature BCR info in old ARC700 cores */
|
||||||
if (is_isa_arcompact()) {
|
if (is_isa_arcompact()) {
|
||||||
if (!cpu->isa.ver) /* ISA BCR absent, use Kconfig info */
|
if (!isa.ver) /* ISA BCR absent, use Kconfig info */
|
||||||
cpu->isa.atomic = IS_ENABLED(CONFIG_ARC_HAS_LLSC);
|
cpu->isa.atomic = IS_ENABLED(CONFIG_ARC_HAS_LLSC);
|
||||||
else
|
else {
|
||||||
cpu->isa.atomic = cpu->isa.atomic1;
|
/* ARC700_BUILD only has 2 bits of isa info */
|
||||||
|
struct bcr_generic bcr = *(struct bcr_generic *)&isa;
|
||||||
|
cpu->isa.atomic = bcr.info & 1;
|
||||||
|
}
|
||||||
|
|
||||||
cpu->isa.be = IS_ENABLED(CONFIG_CPU_BIG_ENDIAN);
|
cpu->isa.be = IS_ENABLED(CONFIG_CPU_BIG_ENDIAN);
|
||||||
|
|
||||||
/* there's no direct way to distinguish 750 vs. 770 */
|
/* there's no direct way to distinguish 750 vs. 770 */
|
||||||
if (unlikely(cpu->core.family < 0x34 || cpu->mmu.ver < 3))
|
if (unlikely(cpu->core.family < 0x34 || cpu->mmu.ver < 3))
|
||||||
cpu->name = "ARC750";
|
cpu->name = "ARC750";
|
||||||
|
} else {
|
||||||
|
cpu->isa = isa;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -232,10 +249,11 @@ static char *arc_cpu_mumbojumbo(int cpu_id, char *buf, int len)
|
||||||
"\nIDENTITY\t: ARCVER [%#02x] ARCNUM [%#02x] CHIPID [%#4x]\n",
|
"\nIDENTITY\t: ARCVER [%#02x] ARCNUM [%#02x] CHIPID [%#4x]\n",
|
||||||
core->family, core->cpu_id, core->chip_id);
|
core->family, core->cpu_id, core->chip_id);
|
||||||
|
|
||||||
n += scnprintf(buf + n, len - n, "processor [%d]\t: %s %s (%s ISA) %s\n",
|
n += scnprintf(buf + n, len - n, "processor [%d]\t: %s %s (%s ISA) %s%s%s\n",
|
||||||
cpu_id, cpu->name, cpu->details,
|
cpu_id, cpu->name, cpu->details,
|
||||||
is_isa_arcompact() ? "ARCompact" : "ARCv2",
|
is_isa_arcompact() ? "ARCompact" : "ARCv2",
|
||||||
IS_AVAIL1(cpu->isa.be, "[Big-Endian]"));
|
IS_AVAIL1(cpu->isa.be, "[Big-Endian]"),
|
||||||
|
IS_AVAIL3(cpu->extn.dual_iss_exist, cpu->extn.dual_iss_enb, " Dual-Issue"));
|
||||||
|
|
||||||
n += scnprintf(buf + n, len - n, "Timers\t\t: %s%s%s%s%s%s\nISA Extn\t: ",
|
n += scnprintf(buf + n, len - n, "Timers\t\t: %s%s%s%s%s%s\nISA Extn\t: ",
|
||||||
IS_AVAIL1(cpu->extn.timer0, "Timer0 "),
|
IS_AVAIL1(cpu->extn.timer0, "Timer0 "),
|
||||||
|
|
|
@ -111,6 +111,13 @@ static void __init axs10x_early_init(void)
|
||||||
|
|
||||||
axs10x_enable_gpio_intc_wire();
|
axs10x_enable_gpio_intc_wire();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Reset ethernet IP core.
|
||||||
|
* TODO: get rid of this quirk after axs10x reset driver (or simple
|
||||||
|
* reset driver) will be available in upstream.
|
||||||
|
*/
|
||||||
|
iowrite32((1 << 5), (void __iomem *) CREG_MB_SW_RESET);
|
||||||
|
|
||||||
scnprintf(mb, 32, "MainBoard v%d", mb_rev);
|
scnprintf(mb, 32, "MainBoard v%d", mb_rev);
|
||||||
axs10x_print_board_ver(CREG_MB_VER, mb);
|
axs10x_print_board_ver(CREG_MB_VER, mb);
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,4 +6,5 @@
|
||||||
#
|
#
|
||||||
|
|
||||||
menuconfig ARC_SOC_HSDK
|
menuconfig ARC_SOC_HSDK
|
||||||
bool "ARC HS Development Kit SOC"
|
bool "ARC HS Development Kit SOC"
|
||||||
|
select CLK_HSDK
|
||||||
|
|
|
@ -38,6 +38,42 @@ static void __init hsdk_init_per_cpu(unsigned int cpu)
|
||||||
#define CREG_PAE (CREG_BASE + 0x180)
|
#define CREG_PAE (CREG_BASE + 0x180)
|
||||||
#define CREG_PAE_UPDATE (CREG_BASE + 0x194)
|
#define CREG_PAE_UPDATE (CREG_BASE + 0x194)
|
||||||
|
|
||||||
|
#define CREG_CORE_IF_CLK_DIV (CREG_BASE + 0x4B8)
|
||||||
|
#define CREG_CORE_IF_CLK_DIV_2 0x1
|
||||||
|
#define CGU_BASE ARC_PERIPHERAL_BASE
|
||||||
|
#define CGU_PLL_STATUS (ARC_PERIPHERAL_BASE + 0x4)
|
||||||
|
#define CGU_PLL_CTRL (ARC_PERIPHERAL_BASE + 0x0)
|
||||||
|
#define CGU_PLL_STATUS_LOCK BIT(0)
|
||||||
|
#define CGU_PLL_STATUS_ERR BIT(1)
|
||||||
|
#define CGU_PLL_CTRL_1GHZ 0x3A10
|
||||||
|
#define HSDK_PLL_LOCK_TIMEOUT 500
|
||||||
|
|
||||||
|
#define HSDK_PLL_LOCKED() \
|
||||||
|
!!(ioread32((void __iomem *) CGU_PLL_STATUS) & CGU_PLL_STATUS_LOCK)
|
||||||
|
|
||||||
|
#define HSDK_PLL_ERR() \
|
||||||
|
!!(ioread32((void __iomem *) CGU_PLL_STATUS) & CGU_PLL_STATUS_ERR)
|
||||||
|
|
||||||
|
static void __init hsdk_set_cpu_freq_1ghz(void)
|
||||||
|
{
|
||||||
|
u32 timeout = HSDK_PLL_LOCK_TIMEOUT;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* As we set cpu clock which exceeds 500MHz, the divider for the interface
|
||||||
|
* clock must be programmed to div-by-2.
|
||||||
|
*/
|
||||||
|
iowrite32(CREG_CORE_IF_CLK_DIV_2, (void __iomem *) CREG_CORE_IF_CLK_DIV);
|
||||||
|
|
||||||
|
/* Set cpu clock to 1GHz */
|
||||||
|
iowrite32(CGU_PLL_CTRL_1GHZ, (void __iomem *) CGU_PLL_CTRL);
|
||||||
|
|
||||||
|
while (!HSDK_PLL_LOCKED() && timeout--)
|
||||||
|
cpu_relax();
|
||||||
|
|
||||||
|
if (!HSDK_PLL_LOCKED() || HSDK_PLL_ERR())
|
||||||
|
pr_err("Failed to setup CPU frequency to 1GHz!");
|
||||||
|
}
|
||||||
|
|
||||||
static void __init hsdk_init_early(void)
|
static void __init hsdk_init_early(void)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
|
@ -52,6 +88,12 @@ static void __init hsdk_init_early(void)
|
||||||
|
|
||||||
/* Really apply settings made above */
|
/* Really apply settings made above */
|
||||||
writel(1, (void __iomem *) CREG_PAE_UPDATE);
|
writel(1, (void __iomem *) CREG_PAE_UPDATE);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Setup CPU frequency to 1GHz.
|
||||||
|
* TODO: remove it after smart hsdk pll driver will be introduced.
|
||||||
|
*/
|
||||||
|
hsdk_set_cpu_freq_1ghz();
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char *hsdk_compat[] __initconst = {
|
static const char *hsdk_compat[] __initconst = {
|
||||||
|
|
|
@ -36,6 +36,8 @@
|
||||||
phy1 = &usb1_phy;
|
phy1 = &usb1_phy;
|
||||||
ethernet0 = &cpsw_emac0;
|
ethernet0 = &cpsw_emac0;
|
||||||
ethernet1 = &cpsw_emac1;
|
ethernet1 = &cpsw_emac1;
|
||||||
|
spi0 = &spi0;
|
||||||
|
spi1 = &spi1;
|
||||||
};
|
};
|
||||||
|
|
||||||
cpus {
|
cpus {
|
||||||
|
|
|
@ -388,6 +388,7 @@
|
||||||
pinctrl-0 = <&cpsw_default>;
|
pinctrl-0 = <&cpsw_default>;
|
||||||
pinctrl-1 = <&cpsw_sleep>;
|
pinctrl-1 = <&cpsw_sleep>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
slaves = <1>;
|
||||||
};
|
};
|
||||||
|
|
||||||
&davinci_mdio {
|
&davinci_mdio {
|
||||||
|
@ -402,11 +403,6 @@
|
||||||
phy-mode = "rmii";
|
phy-mode = "rmii";
|
||||||
};
|
};
|
||||||
|
|
||||||
&cpsw_emac1 {
|
|
||||||
phy_id = <&davinci_mdio>, <1>;
|
|
||||||
phy-mode = "rmii";
|
|
||||||
};
|
|
||||||
|
|
||||||
&phy_sel {
|
&phy_sel {
|
||||||
rmii-clock-ext;
|
rmii-clock-ext;
|
||||||
};
|
};
|
||||||
|
|
|
@ -67,7 +67,10 @@
|
||||||
|
|
||||||
usb1: ohci@00400000 {
|
usb1: ohci@00400000 {
|
||||||
num-ports = <3>;
|
num-ports = <3>;
|
||||||
atmel,vbus-gpio = <&pioA PIN_PA10 GPIO_ACTIVE_HIGH>;
|
atmel,vbus-gpio = <0 /* &pioA PIN_PD20 GPIO_ACTIVE_HIGH */
|
||||||
|
&pioA PIN_PA27 GPIO_ACTIVE_HIGH
|
||||||
|
0
|
||||||
|
>;
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&pinctrl_usb_default>;
|
pinctrl-0 = <&pinctrl_usb_default>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
@ -120,7 +123,7 @@
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&pinctrl_mikrobus2_uart>;
|
pinctrl-0 = <&pinctrl_mikrobus2_uart>;
|
||||||
atmel,use-dma-rx;
|
atmel,use-dma-rx;
|
||||||
atmel-use-dma-tx;
|
atmel,use-dma-tx;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -178,7 +181,7 @@
|
||||||
uart4: serial@fc00c000 {
|
uart4: serial@fc00c000 {
|
||||||
atmel,use-dma-rx;
|
atmel,use-dma-rx;
|
||||||
atmel,use-dma-tx;
|
atmel,use-dma-tx;
|
||||||
pinctrl-name = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&pinctrl_mikrobus1_uart>;
|
pinctrl-0 = <&pinctrl_mikrobus1_uart>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
|
@ -330,7 +333,7 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
pinctrl_led_gpio_default: led_gpio_default {
|
pinctrl_led_gpio_default: led_gpio_default {
|
||||||
pinmux = <PIN_PA27__GPIO>,
|
pinmux = <PIN_PA10__GPIO>,
|
||||||
<PIN_PB1__GPIO>,
|
<PIN_PB1__GPIO>,
|
||||||
<PIN_PA31__GPIO>;
|
<PIN_PA31__GPIO>;
|
||||||
bias-pull-up;
|
bias-pull-up;
|
||||||
|
@ -396,7 +399,7 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
pinctrl_usb_default: usb_default {
|
pinctrl_usb_default: usb_default {
|
||||||
pinmux = <PIN_PA10__GPIO>,
|
pinmux = <PIN_PA27__GPIO>,
|
||||||
<PIN_PD19__GPIO>;
|
<PIN_PD19__GPIO>;
|
||||||
bias-disable;
|
bias-disable;
|
||||||
};
|
};
|
||||||
|
@ -520,17 +523,17 @@
|
||||||
|
|
||||||
red {
|
red {
|
||||||
label = "red";
|
label = "red";
|
||||||
gpios = <&pioA PIN_PA27 GPIO_ACTIVE_LOW>;
|
gpios = <&pioA PIN_PA10 GPIO_ACTIVE_HIGH>;
|
||||||
};
|
};
|
||||||
|
|
||||||
green {
|
green {
|
||||||
label = "green";
|
label = "green";
|
||||||
gpios = <&pioA PIN_PB1 GPIO_ACTIVE_LOW>;
|
gpios = <&pioA PIN_PB1 GPIO_ACTIVE_HIGH>;
|
||||||
};
|
};
|
||||||
|
|
||||||
blue {
|
blue {
|
||||||
label = "blue";
|
label = "blue";
|
||||||
gpios = <&pioA PIN_PA31 GPIO_ACTIVE_LOW>;
|
gpios = <&pioA PIN_PA31 GPIO_ACTIVE_HIGH>;
|
||||||
linux,default-trigger = "heartbeat";
|
linux,default-trigger = "heartbeat";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -15,6 +15,13 @@
|
||||||
compatible = "ti,da850-evm", "ti,da850";
|
compatible = "ti,da850-evm", "ti,da850";
|
||||||
model = "DA850/AM1808/OMAP-L138 EVM";
|
model = "DA850/AM1808/OMAP-L138 EVM";
|
||||||
|
|
||||||
|
aliases {
|
||||||
|
serial0 = &serial0;
|
||||||
|
serial1 = &serial1;
|
||||||
|
serial2 = &serial2;
|
||||||
|
ethernet0 = ð0;
|
||||||
|
};
|
||||||
|
|
||||||
soc@1c00000 {
|
soc@1c00000 {
|
||||||
pmx_core: pinmux@14120 {
|
pmx_core: pinmux@14120 {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
|
@ -1817,6 +1817,8 @@
|
||||||
clocks = <&abe_24m_fclk>, <&abe_sys_clk_div>, <&func_24m_clk>, <&atl_clkin3_ck>, <&atl_clkin2_ck>, <&atl_clkin1_ck>, <&atl_clkin0_ck>, <&sys_clkin2>, <&ref_clkin0_ck>, <&ref_clkin1_ck>, <&ref_clkin2_ck>, <&ref_clkin3_ck>, <&mlb_clk>, <&mlbp_clk>;
|
clocks = <&abe_24m_fclk>, <&abe_sys_clk_div>, <&func_24m_clk>, <&atl_clkin3_ck>, <&atl_clkin2_ck>, <&atl_clkin1_ck>, <&atl_clkin0_ck>, <&sys_clkin2>, <&ref_clkin0_ck>, <&ref_clkin1_ck>, <&ref_clkin2_ck>, <&ref_clkin3_ck>, <&mlb_clk>, <&mlbp_clk>;
|
||||||
ti,bit-shift = <24>;
|
ti,bit-shift = <24>;
|
||||||
reg = <0x1868>;
|
reg = <0x1868>;
|
||||||
|
assigned-clocks = <&mcasp3_ahclkx_mux>;
|
||||||
|
assigned-clock-parents = <&abe_24m_fclk>;
|
||||||
};
|
};
|
||||||
|
|
||||||
mcasp3_aux_gfclk_mux: mcasp3_aux_gfclk_mux@1868 {
|
mcasp3_aux_gfclk_mux: mcasp3_aux_gfclk_mux@1868 {
|
||||||
|
|
|
@ -144,15 +144,6 @@
|
||||||
io-channel-names = "temp", "bsi", "vbat";
|
io-channel-names = "temp", "bsi", "vbat";
|
||||||
};
|
};
|
||||||
|
|
||||||
rear_camera: camera@0 {
|
|
||||||
compatible = "linux,camera";
|
|
||||||
|
|
||||||
module {
|
|
||||||
model = "TCM8341MD";
|
|
||||||
sensor = <&cam1>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
pwm9: dmtimer-pwm {
|
pwm9: dmtimer-pwm {
|
||||||
compatible = "ti,omap-dmtimer-pwm";
|
compatible = "ti,omap-dmtimer-pwm";
|
||||||
#pwm-cells = <3>;
|
#pwm-cells = <3>;
|
||||||
|
@ -189,10 +180,8 @@
|
||||||
clock-lanes = <1>;
|
clock-lanes = <1>;
|
||||||
data-lanes = <0>;
|
data-lanes = <0>;
|
||||||
lane-polarity = <0 0>;
|
lane-polarity = <0 0>;
|
||||||
clock-inv = <0>;
|
|
||||||
/* Select strobe = <1> for back camera, <0> for front camera */
|
/* Select strobe = <1> for back camera, <0> for front camera */
|
||||||
strobe = <1>;
|
strobe = <1>;
|
||||||
crc = <0>;
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -47,6 +47,7 @@
|
||||||
|
|
||||||
/dts-v1/;
|
/dts-v1/;
|
||||||
#include "stm32f429.dtsi"
|
#include "stm32f429.dtsi"
|
||||||
|
#include "stm32f429-pinctrl.dtsi"
|
||||||
#include <dt-bindings/input/input.h>
|
#include <dt-bindings/input/input.h>
|
||||||
#include <dt-bindings/gpio/gpio.h>
|
#include <dt-bindings/gpio/gpio.h>
|
||||||
|
|
||||||
|
@ -202,10 +203,8 @@
|
||||||
stmpe1600: stmpe1600@42 {
|
stmpe1600: stmpe1600@42 {
|
||||||
compatible = "st,stmpe1600";
|
compatible = "st,stmpe1600";
|
||||||
reg = <0x42>;
|
reg = <0x42>;
|
||||||
irq-gpio = <&gpioi 8 0>;
|
|
||||||
irq-trigger = <3>;
|
|
||||||
interrupts = <8 3>;
|
interrupts = <8 3>;
|
||||||
interrupt-parent = <&exti>;
|
interrupt-parent = <&gpioi>;
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
wakeup-source;
|
wakeup-source;
|
||||||
|
|
||||||
|
|
343
arch/arm/boot/dts/stm32f4-pinctrl.dtsi
Normal file
343
arch/arm/boot/dts/stm32f4-pinctrl.dtsi
Normal file
|
@ -0,0 +1,343 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 - Alexandre Torgue <alexandre.torgue@st.com>
|
||||||
|
*
|
||||||
|
* This file is dual-licensed: you can use it either under the terms
|
||||||
|
* of the GPL or the X11 license, at your option. Note that this dual
|
||||||
|
* licensing only applies to this file, and not this project as a
|
||||||
|
* whole.
|
||||||
|
*
|
||||||
|
* a) This file is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 2 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This file is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* Or, alternatively,
|
||||||
|
*
|
||||||
|
* b) Permission is hereby granted, free of charge, to any person
|
||||||
|
* obtaining a copy of this software and associated documentation
|
||||||
|
* files (the "Software"), to deal in the Software without
|
||||||
|
* restriction, including without limitation the rights to use,
|
||||||
|
* copy, modify, merge, publish, distribute, sublicense, and/or
|
||||||
|
* sell copies of the Software, and to permit persons to whom the
|
||||||
|
* Software is furnished to do so, subject to the following
|
||||||
|
* conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be
|
||||||
|
* included in all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||||
|
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||||
|
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
|
* OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <dt-bindings/pinctrl/stm32f429-pinfunc.h>
|
||||||
|
#include <dt-bindings/mfd/stm32f4-rcc.h>
|
||||||
|
|
||||||
|
/ {
|
||||||
|
soc {
|
||||||
|
pinctrl: pin-controller {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
ranges = <0 0x40020000 0x3000>;
|
||||||
|
interrupt-parent = <&exti>;
|
||||||
|
st,syscfg = <&syscfg 0x8>;
|
||||||
|
pins-are-numbered;
|
||||||
|
|
||||||
|
gpioa: gpio@40020000 {
|
||||||
|
gpio-controller;
|
||||||
|
#gpio-cells = <2>;
|
||||||
|
interrupt-controller;
|
||||||
|
#interrupt-cells = <2>;
|
||||||
|
reg = <0x0 0x400>;
|
||||||
|
clocks = <&rcc 0 STM32F4_AHB1_CLOCK(GPIOA)>;
|
||||||
|
st,bank-name = "GPIOA";
|
||||||
|
};
|
||||||
|
|
||||||
|
gpiob: gpio@40020400 {
|
||||||
|
gpio-controller;
|
||||||
|
#gpio-cells = <2>;
|
||||||
|
interrupt-controller;
|
||||||
|
#interrupt-cells = <2>;
|
||||||
|
reg = <0x400 0x400>;
|
||||||
|
clocks = <&rcc 0 STM32F4_AHB1_CLOCK(GPIOB)>;
|
||||||
|
st,bank-name = "GPIOB";
|
||||||
|
};
|
||||||
|
|
||||||
|
gpioc: gpio@40020800 {
|
||||||
|
gpio-controller;
|
||||||
|
#gpio-cells = <2>;
|
||||||
|
interrupt-controller;
|
||||||
|
#interrupt-cells = <2>;
|
||||||
|
reg = <0x800 0x400>;
|
||||||
|
clocks = <&rcc 0 STM32F4_AHB1_CLOCK(GPIOC)>;
|
||||||
|
st,bank-name = "GPIOC";
|
||||||
|
};
|
||||||
|
|
||||||
|
gpiod: gpio@40020c00 {
|
||||||
|
gpio-controller;
|
||||||
|
#gpio-cells = <2>;
|
||||||
|
interrupt-controller;
|
||||||
|
#interrupt-cells = <2>;
|
||||||
|
reg = <0xc00 0x400>;
|
||||||
|
clocks = <&rcc 0 STM32F4_AHB1_CLOCK(GPIOD)>;
|
||||||
|
st,bank-name = "GPIOD";
|
||||||
|
};
|
||||||
|
|
||||||
|
gpioe: gpio@40021000 {
|
||||||
|
gpio-controller;
|
||||||
|
#gpio-cells = <2>;
|
||||||
|
interrupt-controller;
|
||||||
|
#interrupt-cells = <2>;
|
||||||
|
reg = <0x1000 0x400>;
|
||||||
|
clocks = <&rcc 0 STM32F4_AHB1_CLOCK(GPIOE)>;
|
||||||
|
st,bank-name = "GPIOE";
|
||||||
|
};
|
||||||
|
|
||||||
|
gpiof: gpio@40021400 {
|
||||||
|
gpio-controller;
|
||||||
|
#gpio-cells = <2>;
|
||||||
|
interrupt-controller;
|
||||||
|
#interrupt-cells = <2>;
|
||||||
|
reg = <0x1400 0x400>;
|
||||||
|
clocks = <&rcc 0 STM32F4_AHB1_CLOCK(GPIOF)>;
|
||||||
|
st,bank-name = "GPIOF";
|
||||||
|
};
|
||||||
|
|
||||||
|
gpiog: gpio@40021800 {
|
||||||
|
gpio-controller;
|
||||||
|
#gpio-cells = <2>;
|
||||||
|
interrupt-controller;
|
||||||
|
#interrupt-cells = <2>;
|
||||||
|
reg = <0x1800 0x400>;
|
||||||
|
clocks = <&rcc 0 STM32F4_AHB1_CLOCK(GPIOG)>;
|
||||||
|
st,bank-name = "GPIOG";
|
||||||
|
};
|
||||||
|
|
||||||
|
gpioh: gpio@40021c00 {
|
||||||
|
gpio-controller;
|
||||||
|
#gpio-cells = <2>;
|
||||||
|
interrupt-controller;
|
||||||
|
#interrupt-cells = <2>;
|
||||||
|
reg = <0x1c00 0x400>;
|
||||||
|
clocks = <&rcc 0 STM32F4_AHB1_CLOCK(GPIOH)>;
|
||||||
|
st,bank-name = "GPIOH";
|
||||||
|
};
|
||||||
|
|
||||||
|
gpioi: gpio@40022000 {
|
||||||
|
gpio-controller;
|
||||||
|
#gpio-cells = <2>;
|
||||||
|
interrupt-controller;
|
||||||
|
#interrupt-cells = <2>;
|
||||||
|
reg = <0x2000 0x400>;
|
||||||
|
clocks = <&rcc 0 STM32F4_AHB1_CLOCK(GPIOI)>;
|
||||||
|
st,bank-name = "GPIOI";
|
||||||
|
};
|
||||||
|
|
||||||
|
gpioj: gpio@40022400 {
|
||||||
|
gpio-controller;
|
||||||
|
#gpio-cells = <2>;
|
||||||
|
interrupt-controller;
|
||||||
|
#interrupt-cells = <2>;
|
||||||
|
reg = <0x2400 0x400>;
|
||||||
|
clocks = <&rcc 0 STM32F4_AHB1_CLOCK(GPIOJ)>;
|
||||||
|
st,bank-name = "GPIOJ";
|
||||||
|
};
|
||||||
|
|
||||||
|
gpiok: gpio@40022800 {
|
||||||
|
gpio-controller;
|
||||||
|
#gpio-cells = <2>;
|
||||||
|
interrupt-controller;
|
||||||
|
#interrupt-cells = <2>;
|
||||||
|
reg = <0x2800 0x400>;
|
||||||
|
clocks = <&rcc 0 STM32F4_AHB1_CLOCK(GPIOK)>;
|
||||||
|
st,bank-name = "GPIOK";
|
||||||
|
};
|
||||||
|
|
||||||
|
usart1_pins_a: usart1@0 {
|
||||||
|
pins1 {
|
||||||
|
pinmux = <STM32F429_PA9_FUNC_USART1_TX>;
|
||||||
|
bias-disable;
|
||||||
|
drive-push-pull;
|
||||||
|
slew-rate = <0>;
|
||||||
|
};
|
||||||
|
pins2 {
|
||||||
|
pinmux = <STM32F429_PA10_FUNC_USART1_RX>;
|
||||||
|
bias-disable;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
usart3_pins_a: usart3@0 {
|
||||||
|
pins1 {
|
||||||
|
pinmux = <STM32F429_PB10_FUNC_USART3_TX>;
|
||||||
|
bias-disable;
|
||||||
|
drive-push-pull;
|
||||||
|
slew-rate = <0>;
|
||||||
|
};
|
||||||
|
pins2 {
|
||||||
|
pinmux = <STM32F429_PB11_FUNC_USART3_RX>;
|
||||||
|
bias-disable;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
usbotg_fs_pins_a: usbotg_fs@0 {
|
||||||
|
pins {
|
||||||
|
pinmux = <STM32F429_PA10_FUNC_OTG_FS_ID>,
|
||||||
|
<STM32F429_PA11_FUNC_OTG_FS_DM>,
|
||||||
|
<STM32F429_PA12_FUNC_OTG_FS_DP>;
|
||||||
|
bias-disable;
|
||||||
|
drive-push-pull;
|
||||||
|
slew-rate = <2>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
usbotg_fs_pins_b: usbotg_fs@1 {
|
||||||
|
pins {
|
||||||
|
pinmux = <STM32F429_PB12_FUNC_OTG_HS_ID>,
|
||||||
|
<STM32F429_PB14_FUNC_OTG_HS_DM>,
|
||||||
|
<STM32F429_PB15_FUNC_OTG_HS_DP>;
|
||||||
|
bias-disable;
|
||||||
|
drive-push-pull;
|
||||||
|
slew-rate = <2>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
usbotg_hs_pins_a: usbotg_hs@0 {
|
||||||
|
pins {
|
||||||
|
pinmux = <STM32F429_PH4_FUNC_OTG_HS_ULPI_NXT>,
|
||||||
|
<STM32F429_PI11_FUNC_OTG_HS_ULPI_DIR>,
|
||||||
|
<STM32F429_PC0_FUNC_OTG_HS_ULPI_STP>,
|
||||||
|
<STM32F429_PA5_FUNC_OTG_HS_ULPI_CK>,
|
||||||
|
<STM32F429_PA3_FUNC_OTG_HS_ULPI_D0>,
|
||||||
|
<STM32F429_PB0_FUNC_OTG_HS_ULPI_D1>,
|
||||||
|
<STM32F429_PB1_FUNC_OTG_HS_ULPI_D2>,
|
||||||
|
<STM32F429_PB10_FUNC_OTG_HS_ULPI_D3>,
|
||||||
|
<STM32F429_PB11_FUNC_OTG_HS_ULPI_D4>,
|
||||||
|
<STM32F429_PB12_FUNC_OTG_HS_ULPI_D5>,
|
||||||
|
<STM32F429_PB13_FUNC_OTG_HS_ULPI_D6>,
|
||||||
|
<STM32F429_PB5_FUNC_OTG_HS_ULPI_D7>;
|
||||||
|
bias-disable;
|
||||||
|
drive-push-pull;
|
||||||
|
slew-rate = <2>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
ethernet_mii: mii@0 {
|
||||||
|
pins {
|
||||||
|
pinmux = <STM32F429_PG13_FUNC_ETH_MII_TXD0_ETH_RMII_TXD0>,
|
||||||
|
<STM32F429_PG14_FUNC_ETH_MII_TXD1_ETH_RMII_TXD1>,
|
||||||
|
<STM32F429_PC2_FUNC_ETH_MII_TXD2>,
|
||||||
|
<STM32F429_PB8_FUNC_ETH_MII_TXD3>,
|
||||||
|
<STM32F429_PC3_FUNC_ETH_MII_TX_CLK>,
|
||||||
|
<STM32F429_PG11_FUNC_ETH_MII_TX_EN_ETH_RMII_TX_EN>,
|
||||||
|
<STM32F429_PA2_FUNC_ETH_MDIO>,
|
||||||
|
<STM32F429_PC1_FUNC_ETH_MDC>,
|
||||||
|
<STM32F429_PA1_FUNC_ETH_MII_RX_CLK_ETH_RMII_REF_CLK>,
|
||||||
|
<STM32F429_PA7_FUNC_ETH_MII_RX_DV_ETH_RMII_CRS_DV>,
|
||||||
|
<STM32F429_PC4_FUNC_ETH_MII_RXD0_ETH_RMII_RXD0>,
|
||||||
|
<STM32F429_PC5_FUNC_ETH_MII_RXD1_ETH_RMII_RXD1>,
|
||||||
|
<STM32F429_PH6_FUNC_ETH_MII_RXD2>,
|
||||||
|
<STM32F429_PH7_FUNC_ETH_MII_RXD3>;
|
||||||
|
slew-rate = <2>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
adc3_in8_pin: adc@200 {
|
||||||
|
pins {
|
||||||
|
pinmux = <STM32F429_PF10_FUNC_ANALOG>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
pwm1_pins: pwm@1 {
|
||||||
|
pins {
|
||||||
|
pinmux = <STM32F429_PA8_FUNC_TIM1_CH1>,
|
||||||
|
<STM32F429_PB13_FUNC_TIM1_CH1N>,
|
||||||
|
<STM32F429_PB12_FUNC_TIM1_BKIN>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
pwm3_pins: pwm@3 {
|
||||||
|
pins {
|
||||||
|
pinmux = <STM32F429_PB4_FUNC_TIM3_CH1>,
|
||||||
|
<STM32F429_PB5_FUNC_TIM3_CH2>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
i2c1_pins: i2c1@0 {
|
||||||
|
pins {
|
||||||
|
pinmux = <STM32F429_PB9_FUNC_I2C1_SDA>,
|
||||||
|
<STM32F429_PB6_FUNC_I2C1_SCL>;
|
||||||
|
bias-disable;
|
||||||
|
drive-open-drain;
|
||||||
|
slew-rate = <3>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
ltdc_pins: ltdc@0 {
|
||||||
|
pins {
|
||||||
|
pinmux = <STM32F429_PI12_FUNC_LCD_HSYNC>,
|
||||||
|
<STM32F429_PI13_FUNC_LCD_VSYNC>,
|
||||||
|
<STM32F429_PI14_FUNC_LCD_CLK>,
|
||||||
|
<STM32F429_PI15_FUNC_LCD_R0>,
|
||||||
|
<STM32F429_PJ0_FUNC_LCD_R1>,
|
||||||
|
<STM32F429_PJ1_FUNC_LCD_R2>,
|
||||||
|
<STM32F429_PJ2_FUNC_LCD_R3>,
|
||||||
|
<STM32F429_PJ3_FUNC_LCD_R4>,
|
||||||
|
<STM32F429_PJ4_FUNC_LCD_R5>,
|
||||||
|
<STM32F429_PJ5_FUNC_LCD_R6>,
|
||||||
|
<STM32F429_PJ6_FUNC_LCD_R7>,
|
||||||
|
<STM32F429_PJ7_FUNC_LCD_G0>,
|
||||||
|
<STM32F429_PJ8_FUNC_LCD_G1>,
|
||||||
|
<STM32F429_PJ9_FUNC_LCD_G2>,
|
||||||
|
<STM32F429_PJ10_FUNC_LCD_G3>,
|
||||||
|
<STM32F429_PJ11_FUNC_LCD_G4>,
|
||||||
|
<STM32F429_PJ12_FUNC_LCD_B0>,
|
||||||
|
<STM32F429_PJ13_FUNC_LCD_B1>,
|
||||||
|
<STM32F429_PJ14_FUNC_LCD_B2>,
|
||||||
|
<STM32F429_PJ15_FUNC_LCD_B3>,
|
||||||
|
<STM32F429_PK0_FUNC_LCD_G5>,
|
||||||
|
<STM32F429_PK1_FUNC_LCD_G6>,
|
||||||
|
<STM32F429_PK2_FUNC_LCD_G7>,
|
||||||
|
<STM32F429_PK3_FUNC_LCD_B4>,
|
||||||
|
<STM32F429_PK4_FUNC_LCD_B5>,
|
||||||
|
<STM32F429_PK5_FUNC_LCD_B6>,
|
||||||
|
<STM32F429_PK6_FUNC_LCD_B7>,
|
||||||
|
<STM32F429_PK7_FUNC_LCD_DE>;
|
||||||
|
slew-rate = <2>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
dcmi_pins: dcmi@0 {
|
||||||
|
pins {
|
||||||
|
pinmux = <STM32F429_PA4_FUNC_DCMI_HSYNC>,
|
||||||
|
<STM32F429_PB7_FUNC_DCMI_VSYNC>,
|
||||||
|
<STM32F429_PA6_FUNC_DCMI_PIXCLK>,
|
||||||
|
<STM32F429_PC6_FUNC_DCMI_D0>,
|
||||||
|
<STM32F429_PC7_FUNC_DCMI_D1>,
|
||||||
|
<STM32F429_PC8_FUNC_DCMI_D2>,
|
||||||
|
<STM32F429_PC9_FUNC_DCMI_D3>,
|
||||||
|
<STM32F429_PC11_FUNC_DCMI_D4>,
|
||||||
|
<STM32F429_PD3_FUNC_DCMI_D5>,
|
||||||
|
<STM32F429_PB8_FUNC_DCMI_D6>,
|
||||||
|
<STM32F429_PE6_FUNC_DCMI_D7>,
|
||||||
|
<STM32F429_PC10_FUNC_DCMI_D8>,
|
||||||
|
<STM32F429_PC12_FUNC_DCMI_D9>,
|
||||||
|
<STM32F429_PD6_FUNC_DCMI_D10>,
|
||||||
|
<STM32F429_PD2_FUNC_DCMI_D11>;
|
||||||
|
bias-disable;
|
||||||
|
drive-push-pull;
|
||||||
|
slew-rate = <3>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
|
@ -47,6 +47,7 @@
|
||||||
|
|
||||||
/dts-v1/;
|
/dts-v1/;
|
||||||
#include "stm32f429.dtsi"
|
#include "stm32f429.dtsi"
|
||||||
|
#include "stm32f429-pinctrl.dtsi"
|
||||||
#include <dt-bindings/input/input.h>
|
#include <dt-bindings/input/input.h>
|
||||||
|
|
||||||
/ {
|
/ {
|
||||||
|
|
95
arch/arm/boot/dts/stm32f429-pinctrl.dtsi
Normal file
95
arch/arm/boot/dts/stm32f429-pinctrl.dtsi
Normal file
|
@ -0,0 +1,95 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 - Alexandre Torgue <alexandre.torgue@st.com>
|
||||||
|
*
|
||||||
|
* This file is dual-licensed: you can use it either under the terms
|
||||||
|
* of the GPL or the X11 license, at your option. Note that this dual
|
||||||
|
* licensing only applies to this file, and not this project as a
|
||||||
|
* whole.
|
||||||
|
*
|
||||||
|
* a) This file is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 2 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This file is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* Or, alternatively,
|
||||||
|
*
|
||||||
|
* b) Permission is hereby granted, free of charge, to any person
|
||||||
|
* obtaining a copy of this software and associated documentation
|
||||||
|
* files (the "Software"), to deal in the Software without
|
||||||
|
* restriction, including without limitation the rights to use,
|
||||||
|
* copy, modify, merge, publish, distribute, sublicense, and/or
|
||||||
|
* sell copies of the Software, and to permit persons to whom the
|
||||||
|
* Software is furnished to do so, subject to the following
|
||||||
|
* conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be
|
||||||
|
* included in all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||||
|
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||||
|
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
|
* OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "stm32f4-pinctrl.dtsi"
|
||||||
|
|
||||||
|
/ {
|
||||||
|
soc {
|
||||||
|
pinctrl: pin-controller {
|
||||||
|
compatible = "st,stm32f429-pinctrl";
|
||||||
|
|
||||||
|
gpioa: gpio@40020000 {
|
||||||
|
gpio-ranges = <&pinctrl 0 0 16>;
|
||||||
|
};
|
||||||
|
|
||||||
|
gpiob: gpio@40020400 {
|
||||||
|
gpio-ranges = <&pinctrl 0 16 16>;
|
||||||
|
};
|
||||||
|
|
||||||
|
gpioc: gpio@40020800 {
|
||||||
|
gpio-ranges = <&pinctrl 0 32 16>;
|
||||||
|
};
|
||||||
|
|
||||||
|
gpiod: gpio@40020c00 {
|
||||||
|
gpio-ranges = <&pinctrl 0 48 16>;
|
||||||
|
};
|
||||||
|
|
||||||
|
gpioe: gpio@40021000 {
|
||||||
|
gpio-ranges = <&pinctrl 0 64 16>;
|
||||||
|
};
|
||||||
|
|
||||||
|
gpiof: gpio@40021400 {
|
||||||
|
gpio-ranges = <&pinctrl 0 80 16>;
|
||||||
|
};
|
||||||
|
|
||||||
|
gpiog: gpio@40021800 {
|
||||||
|
gpio-ranges = <&pinctrl 0 96 16>;
|
||||||
|
};
|
||||||
|
|
||||||
|
gpioh: gpio@40021c00 {
|
||||||
|
gpio-ranges = <&pinctrl 0 112 16>;
|
||||||
|
};
|
||||||
|
|
||||||
|
gpioi: gpio@40022000 {
|
||||||
|
gpio-ranges = <&pinctrl 0 128 16>;
|
||||||
|
};
|
||||||
|
|
||||||
|
gpioj: gpio@40022400 {
|
||||||
|
gpio-ranges = <&pinctrl 0 144 16>;
|
||||||
|
};
|
||||||
|
|
||||||
|
gpiok: gpio@40022800 {
|
||||||
|
gpio-ranges = <&pinctrl 0 160 8>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
|
@ -47,7 +47,6 @@
|
||||||
|
|
||||||
#include "skeleton.dtsi"
|
#include "skeleton.dtsi"
|
||||||
#include "armv7-m.dtsi"
|
#include "armv7-m.dtsi"
|
||||||
#include <dt-bindings/pinctrl/stm32f429-pinfunc.h>
|
|
||||||
#include <dt-bindings/clock/stm32fx-clock.h>
|
#include <dt-bindings/clock/stm32fx-clock.h>
|
||||||
#include <dt-bindings/mfd/stm32f4-rcc.h>
|
#include <dt-bindings/mfd/stm32f4-rcc.h>
|
||||||
|
|
||||||
|
@ -591,302 +590,6 @@
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
pinctrl: pin-controller {
|
|
||||||
#address-cells = <1>;
|
|
||||||
#size-cells = <1>;
|
|
||||||
compatible = "st,stm32f429-pinctrl";
|
|
||||||
ranges = <0 0x40020000 0x3000>;
|
|
||||||
interrupt-parent = <&exti>;
|
|
||||||
st,syscfg = <&syscfg 0x8>;
|
|
||||||
pins-are-numbered;
|
|
||||||
|
|
||||||
gpioa: gpio@40020000 {
|
|
||||||
gpio-controller;
|
|
||||||
#gpio-cells = <2>;
|
|
||||||
interrupt-controller;
|
|
||||||
#interrupt-cells = <2>;
|
|
||||||
reg = <0x0 0x400>;
|
|
||||||
clocks = <&rcc 0 STM32F4_AHB1_CLOCK(GPIOA)>;
|
|
||||||
st,bank-name = "GPIOA";
|
|
||||||
};
|
|
||||||
|
|
||||||
gpiob: gpio@40020400 {
|
|
||||||
gpio-controller;
|
|
||||||
#gpio-cells = <2>;
|
|
||||||
interrupt-controller;
|
|
||||||
#interrupt-cells = <2>;
|
|
||||||
reg = <0x400 0x400>;
|
|
||||||
clocks = <&rcc 0 STM32F4_AHB1_CLOCK(GPIOB)>;
|
|
||||||
st,bank-name = "GPIOB";
|
|
||||||
};
|
|
||||||
|
|
||||||
gpioc: gpio@40020800 {
|
|
||||||
gpio-controller;
|
|
||||||
#gpio-cells = <2>;
|
|
||||||
interrupt-controller;
|
|
||||||
#interrupt-cells = <2>;
|
|
||||||
reg = <0x800 0x400>;
|
|
||||||
clocks = <&rcc 0 STM32F4_AHB1_CLOCK(GPIOC)>;
|
|
||||||
st,bank-name = "GPIOC";
|
|
||||||
};
|
|
||||||
|
|
||||||
gpiod: gpio@40020c00 {
|
|
||||||
gpio-controller;
|
|
||||||
#gpio-cells = <2>;
|
|
||||||
interrupt-controller;
|
|
||||||
#interrupt-cells = <2>;
|
|
||||||
reg = <0xc00 0x400>;
|
|
||||||
clocks = <&rcc 0 STM32F4_AHB1_CLOCK(GPIOD)>;
|
|
||||||
st,bank-name = "GPIOD";
|
|
||||||
};
|
|
||||||
|
|
||||||
gpioe: gpio@40021000 {
|
|
||||||
gpio-controller;
|
|
||||||
#gpio-cells = <2>;
|
|
||||||
interrupt-controller;
|
|
||||||
#interrupt-cells = <2>;
|
|
||||||
reg = <0x1000 0x400>;
|
|
||||||
clocks = <&rcc 0 STM32F4_AHB1_CLOCK(GPIOE)>;
|
|
||||||
st,bank-name = "GPIOE";
|
|
||||||
};
|
|
||||||
|
|
||||||
gpiof: gpio@40021400 {
|
|
||||||
gpio-controller;
|
|
||||||
#gpio-cells = <2>;
|
|
||||||
interrupt-controller;
|
|
||||||
#interrupt-cells = <2>;
|
|
||||||
reg = <0x1400 0x400>;
|
|
||||||
clocks = <&rcc 0 STM32F4_AHB1_CLOCK(GPIOF)>;
|
|
||||||
st,bank-name = "GPIOF";
|
|
||||||
};
|
|
||||||
|
|
||||||
gpiog: gpio@40021800 {
|
|
||||||
gpio-controller;
|
|
||||||
#gpio-cells = <2>;
|
|
||||||
interrupt-controller;
|
|
||||||
#interrupt-cells = <2>;
|
|
||||||
reg = <0x1800 0x400>;
|
|
||||||
clocks = <&rcc 0 STM32F4_AHB1_CLOCK(GPIOG)>;
|
|
||||||
st,bank-name = "GPIOG";
|
|
||||||
};
|
|
||||||
|
|
||||||
gpioh: gpio@40021c00 {
|
|
||||||
gpio-controller;
|
|
||||||
#gpio-cells = <2>;
|
|
||||||
interrupt-controller;
|
|
||||||
#interrupt-cells = <2>;
|
|
||||||
reg = <0x1c00 0x400>;
|
|
||||||
clocks = <&rcc 0 STM32F4_AHB1_CLOCK(GPIOH)>;
|
|
||||||
st,bank-name = "GPIOH";
|
|
||||||
};
|
|
||||||
|
|
||||||
gpioi: gpio@40022000 {
|
|
||||||
gpio-controller;
|
|
||||||
#gpio-cells = <2>;
|
|
||||||
interrupt-controller;
|
|
||||||
#interrupt-cells = <2>;
|
|
||||||
reg = <0x2000 0x400>;
|
|
||||||
clocks = <&rcc 0 STM32F4_AHB1_CLOCK(GPIOI)>;
|
|
||||||
st,bank-name = "GPIOI";
|
|
||||||
};
|
|
||||||
|
|
||||||
gpioj: gpio@40022400 {
|
|
||||||
gpio-controller;
|
|
||||||
#gpio-cells = <2>;
|
|
||||||
interrupt-controller;
|
|
||||||
#interrupt-cells = <2>;
|
|
||||||
reg = <0x2400 0x400>;
|
|
||||||
clocks = <&rcc 0 STM32F4_AHB1_CLOCK(GPIOJ)>;
|
|
||||||
st,bank-name = "GPIOJ";
|
|
||||||
};
|
|
||||||
|
|
||||||
gpiok: gpio@40022800 {
|
|
||||||
gpio-controller;
|
|
||||||
#gpio-cells = <2>;
|
|
||||||
interrupt-controller;
|
|
||||||
#interrupt-cells = <2>;
|
|
||||||
reg = <0x2800 0x400>;
|
|
||||||
clocks = <&rcc 0 STM32F4_AHB1_CLOCK(GPIOK)>;
|
|
||||||
st,bank-name = "GPIOK";
|
|
||||||
};
|
|
||||||
|
|
||||||
usart1_pins_a: usart1@0 {
|
|
||||||
pins1 {
|
|
||||||
pinmux = <STM32F429_PA9_FUNC_USART1_TX>;
|
|
||||||
bias-disable;
|
|
||||||
drive-push-pull;
|
|
||||||
slew-rate = <0>;
|
|
||||||
};
|
|
||||||
pins2 {
|
|
||||||
pinmux = <STM32F429_PA10_FUNC_USART1_RX>;
|
|
||||||
bias-disable;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
usart3_pins_a: usart3@0 {
|
|
||||||
pins1 {
|
|
||||||
pinmux = <STM32F429_PB10_FUNC_USART3_TX>;
|
|
||||||
bias-disable;
|
|
||||||
drive-push-pull;
|
|
||||||
slew-rate = <0>;
|
|
||||||
};
|
|
||||||
pins2 {
|
|
||||||
pinmux = <STM32F429_PB11_FUNC_USART3_RX>;
|
|
||||||
bias-disable;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
usbotg_fs_pins_a: usbotg_fs@0 {
|
|
||||||
pins {
|
|
||||||
pinmux = <STM32F429_PA10_FUNC_OTG_FS_ID>,
|
|
||||||
<STM32F429_PA11_FUNC_OTG_FS_DM>,
|
|
||||||
<STM32F429_PA12_FUNC_OTG_FS_DP>;
|
|
||||||
bias-disable;
|
|
||||||
drive-push-pull;
|
|
||||||
slew-rate = <2>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
usbotg_fs_pins_b: usbotg_fs@1 {
|
|
||||||
pins {
|
|
||||||
pinmux = <STM32F429_PB12_FUNC_OTG_HS_ID>,
|
|
||||||
<STM32F429_PB14_FUNC_OTG_HS_DM>,
|
|
||||||
<STM32F429_PB15_FUNC_OTG_HS_DP>;
|
|
||||||
bias-disable;
|
|
||||||
drive-push-pull;
|
|
||||||
slew-rate = <2>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
usbotg_hs_pins_a: usbotg_hs@0 {
|
|
||||||
pins {
|
|
||||||
pinmux = <STM32F429_PH4_FUNC_OTG_HS_ULPI_NXT>,
|
|
||||||
<STM32F429_PI11_FUNC_OTG_HS_ULPI_DIR>,
|
|
||||||
<STM32F429_PC0_FUNC_OTG_HS_ULPI_STP>,
|
|
||||||
<STM32F429_PA5_FUNC_OTG_HS_ULPI_CK>,
|
|
||||||
<STM32F429_PA3_FUNC_OTG_HS_ULPI_D0>,
|
|
||||||
<STM32F429_PB0_FUNC_OTG_HS_ULPI_D1>,
|
|
||||||
<STM32F429_PB1_FUNC_OTG_HS_ULPI_D2>,
|
|
||||||
<STM32F429_PB10_FUNC_OTG_HS_ULPI_D3>,
|
|
||||||
<STM32F429_PB11_FUNC_OTG_HS_ULPI_D4>,
|
|
||||||
<STM32F429_PB12_FUNC_OTG_HS_ULPI_D5>,
|
|
||||||
<STM32F429_PB13_FUNC_OTG_HS_ULPI_D6>,
|
|
||||||
<STM32F429_PB5_FUNC_OTG_HS_ULPI_D7>;
|
|
||||||
bias-disable;
|
|
||||||
drive-push-pull;
|
|
||||||
slew-rate = <2>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
ethernet_mii: mii@0 {
|
|
||||||
pins {
|
|
||||||
pinmux = <STM32F429_PG13_FUNC_ETH_MII_TXD0_ETH_RMII_TXD0>,
|
|
||||||
<STM32F429_PG14_FUNC_ETH_MII_TXD1_ETH_RMII_TXD1>,
|
|
||||||
<STM32F429_PC2_FUNC_ETH_MII_TXD2>,
|
|
||||||
<STM32F429_PB8_FUNC_ETH_MII_TXD3>,
|
|
||||||
<STM32F429_PC3_FUNC_ETH_MII_TX_CLK>,
|
|
||||||
<STM32F429_PG11_FUNC_ETH_MII_TX_EN_ETH_RMII_TX_EN>,
|
|
||||||
<STM32F429_PA2_FUNC_ETH_MDIO>,
|
|
||||||
<STM32F429_PC1_FUNC_ETH_MDC>,
|
|
||||||
<STM32F429_PA1_FUNC_ETH_MII_RX_CLK_ETH_RMII_REF_CLK>,
|
|
||||||
<STM32F429_PA7_FUNC_ETH_MII_RX_DV_ETH_RMII_CRS_DV>,
|
|
||||||
<STM32F429_PC4_FUNC_ETH_MII_RXD0_ETH_RMII_RXD0>,
|
|
||||||
<STM32F429_PC5_FUNC_ETH_MII_RXD1_ETH_RMII_RXD1>,
|
|
||||||
<STM32F429_PH6_FUNC_ETH_MII_RXD2>,
|
|
||||||
<STM32F429_PH7_FUNC_ETH_MII_RXD3>;
|
|
||||||
slew-rate = <2>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
adc3_in8_pin: adc@200 {
|
|
||||||
pins {
|
|
||||||
pinmux = <STM32F429_PF10_FUNC_ANALOG>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
pwm1_pins: pwm@1 {
|
|
||||||
pins {
|
|
||||||
pinmux = <STM32F429_PA8_FUNC_TIM1_CH1>,
|
|
||||||
<STM32F429_PB13_FUNC_TIM1_CH1N>,
|
|
||||||
<STM32F429_PB12_FUNC_TIM1_BKIN>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
pwm3_pins: pwm@3 {
|
|
||||||
pins {
|
|
||||||
pinmux = <STM32F429_PB4_FUNC_TIM3_CH1>,
|
|
||||||
<STM32F429_PB5_FUNC_TIM3_CH2>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
i2c1_pins: i2c1@0 {
|
|
||||||
pins {
|
|
||||||
pinmux = <STM32F429_PB9_FUNC_I2C1_SDA>,
|
|
||||||
<STM32F429_PB6_FUNC_I2C1_SCL>;
|
|
||||||
bias-disable;
|
|
||||||
drive-open-drain;
|
|
||||||
slew-rate = <3>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
ltdc_pins: ltdc@0 {
|
|
||||||
pins {
|
|
||||||
pinmux = <STM32F429_PI12_FUNC_LCD_HSYNC>,
|
|
||||||
<STM32F429_PI13_FUNC_LCD_VSYNC>,
|
|
||||||
<STM32F429_PI14_FUNC_LCD_CLK>,
|
|
||||||
<STM32F429_PI15_FUNC_LCD_R0>,
|
|
||||||
<STM32F429_PJ0_FUNC_LCD_R1>,
|
|
||||||
<STM32F429_PJ1_FUNC_LCD_R2>,
|
|
||||||
<STM32F429_PJ2_FUNC_LCD_R3>,
|
|
||||||
<STM32F429_PJ3_FUNC_LCD_R4>,
|
|
||||||
<STM32F429_PJ4_FUNC_LCD_R5>,
|
|
||||||
<STM32F429_PJ5_FUNC_LCD_R6>,
|
|
||||||
<STM32F429_PJ6_FUNC_LCD_R7>,
|
|
||||||
<STM32F429_PJ7_FUNC_LCD_G0>,
|
|
||||||
<STM32F429_PJ8_FUNC_LCD_G1>,
|
|
||||||
<STM32F429_PJ9_FUNC_LCD_G2>,
|
|
||||||
<STM32F429_PJ10_FUNC_LCD_G3>,
|
|
||||||
<STM32F429_PJ11_FUNC_LCD_G4>,
|
|
||||||
<STM32F429_PJ12_FUNC_LCD_B0>,
|
|
||||||
<STM32F429_PJ13_FUNC_LCD_B1>,
|
|
||||||
<STM32F429_PJ14_FUNC_LCD_B2>,
|
|
||||||
<STM32F429_PJ15_FUNC_LCD_B3>,
|
|
||||||
<STM32F429_PK0_FUNC_LCD_G5>,
|
|
||||||
<STM32F429_PK1_FUNC_LCD_G6>,
|
|
||||||
<STM32F429_PK2_FUNC_LCD_G7>,
|
|
||||||
<STM32F429_PK3_FUNC_LCD_B4>,
|
|
||||||
<STM32F429_PK4_FUNC_LCD_B5>,
|
|
||||||
<STM32F429_PK5_FUNC_LCD_B6>,
|
|
||||||
<STM32F429_PK6_FUNC_LCD_B7>,
|
|
||||||
<STM32F429_PK7_FUNC_LCD_DE>;
|
|
||||||
slew-rate = <2>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
dcmi_pins: dcmi@0 {
|
|
||||||
pins {
|
|
||||||
pinmux = <STM32F429_PA4_FUNC_DCMI_HSYNC>,
|
|
||||||
<STM32F429_PB7_FUNC_DCMI_VSYNC>,
|
|
||||||
<STM32F429_PA6_FUNC_DCMI_PIXCLK>,
|
|
||||||
<STM32F429_PC6_FUNC_DCMI_D0>,
|
|
||||||
<STM32F429_PC7_FUNC_DCMI_D1>,
|
|
||||||
<STM32F429_PC8_FUNC_DCMI_D2>,
|
|
||||||
<STM32F429_PC9_FUNC_DCMI_D3>,
|
|
||||||
<STM32F429_PC11_FUNC_DCMI_D4>,
|
|
||||||
<STM32F429_PD3_FUNC_DCMI_D5>,
|
|
||||||
<STM32F429_PB8_FUNC_DCMI_D6>,
|
|
||||||
<STM32F429_PE6_FUNC_DCMI_D7>,
|
|
||||||
<STM32F429_PC10_FUNC_DCMI_D8>,
|
|
||||||
<STM32F429_PC12_FUNC_DCMI_D9>,
|
|
||||||
<STM32F429_PD6_FUNC_DCMI_D10>,
|
|
||||||
<STM32F429_PD2_FUNC_DCMI_D11>;
|
|
||||||
bias-disable;
|
|
||||||
drive-push-pull;
|
|
||||||
slew-rate = <3>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
crc: crc@40023000 {
|
crc: crc@40023000 {
|
||||||
compatible = "st,stm32f4-crc";
|
compatible = "st,stm32f4-crc";
|
||||||
reg = <0x40023000 0x400>;
|
reg = <0x40023000 0x400>;
|
||||||
|
|
|
@ -47,6 +47,7 @@
|
||||||
|
|
||||||
/dts-v1/;
|
/dts-v1/;
|
||||||
#include "stm32f429.dtsi"
|
#include "stm32f429.dtsi"
|
||||||
|
#include "stm32f469-pinctrl.dtsi"
|
||||||
|
|
||||||
/ {
|
/ {
|
||||||
model = "STMicroelectronics STM32F469i-DISCO board";
|
model = "STMicroelectronics STM32F469i-DISCO board";
|
||||||
|
|
96
arch/arm/boot/dts/stm32f469-pinctrl.dtsi
Normal file
96
arch/arm/boot/dts/stm32f469-pinctrl.dtsi
Normal file
|
@ -0,0 +1,96 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 - Alexandre Torgue <alexandre.torgue@st.com>
|
||||||
|
*
|
||||||
|
* This file is dual-licensed: you can use it either under the terms
|
||||||
|
* of the GPL or the X11 license, at your option. Note that this dual
|
||||||
|
* licensing only applies to this file, and not this project as a
|
||||||
|
* whole.
|
||||||
|
*
|
||||||
|
* a) This file is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 2 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This file is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* Or, alternatively,
|
||||||
|
*
|
||||||
|
* b) Permission is hereby granted, free of charge, to any person
|
||||||
|
* obtaining a copy of this software and associated documentation
|
||||||
|
* files (the "Software"), to deal in the Software without
|
||||||
|
* restriction, including without limitation the rights to use,
|
||||||
|
* copy, modify, merge, publish, distribute, sublicense, and/or
|
||||||
|
* sell copies of the Software, and to permit persons to whom the
|
||||||
|
* Software is furnished to do so, subject to the following
|
||||||
|
* conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be
|
||||||
|
* included in all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||||
|
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||||
|
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
|
* OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "stm32f4-pinctrl.dtsi"
|
||||||
|
|
||||||
|
/ {
|
||||||
|
soc {
|
||||||
|
pinctrl: pin-controller {
|
||||||
|
compatible = "st,stm32f469-pinctrl";
|
||||||
|
|
||||||
|
gpioa: gpio@40020000 {
|
||||||
|
gpio-ranges = <&pinctrl 0 0 16>;
|
||||||
|
};
|
||||||
|
|
||||||
|
gpiob: gpio@40020400 {
|
||||||
|
gpio-ranges = <&pinctrl 0 16 16>;
|
||||||
|
};
|
||||||
|
|
||||||
|
gpioc: gpio@40020800 {
|
||||||
|
gpio-ranges = <&pinctrl 0 32 16>;
|
||||||
|
};
|
||||||
|
|
||||||
|
gpiod: gpio@40020c00 {
|
||||||
|
gpio-ranges = <&pinctrl 0 48 16>;
|
||||||
|
};
|
||||||
|
|
||||||
|
gpioe: gpio@40021000 {
|
||||||
|
gpio-ranges = <&pinctrl 0 64 16>;
|
||||||
|
};
|
||||||
|
|
||||||
|
gpiof: gpio@40021400 {
|
||||||
|
gpio-ranges = <&pinctrl 0 80 16>;
|
||||||
|
};
|
||||||
|
|
||||||
|
gpiog: gpio@40021800 {
|
||||||
|
gpio-ranges = <&pinctrl 0 96 16>;
|
||||||
|
};
|
||||||
|
|
||||||
|
gpioh: gpio@40021c00 {
|
||||||
|
gpio-ranges = <&pinctrl 0 112 16>;
|
||||||
|
};
|
||||||
|
|
||||||
|
gpioi: gpio@40022000 {
|
||||||
|
gpio-ranges = <&pinctrl 0 128 16>;
|
||||||
|
};
|
||||||
|
|
||||||
|
gpioj: gpio@40022400 {
|
||||||
|
gpio-ranges = <&pinctrl 0 144 6>,
|
||||||
|
<&pinctrl 12 156 4>;
|
||||||
|
};
|
||||||
|
|
||||||
|
gpiok: gpio@40022800 {
|
||||||
|
gpio-ranges = <&pinctrl 3 163 5>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
|
@ -32,6 +32,7 @@ CONFIG_BLK_DEV_RAM_SIZE=16384
|
||||||
CONFIG_BLK_DEV_SD=y
|
CONFIG_BLK_DEV_SD=y
|
||||||
# CONFIG_SCSI_LOWLEVEL is not set
|
# CONFIG_SCSI_LOWLEVEL is not set
|
||||||
CONFIG_ATA=y
|
CONFIG_ATA=y
|
||||||
|
CONFIG_PATA_FTIDE010=y
|
||||||
CONFIG_INPUT_EVDEV=y
|
CONFIG_INPUT_EVDEV=y
|
||||||
CONFIG_KEYBOARD_GPIO=y
|
CONFIG_KEYBOARD_GPIO=y
|
||||||
# CONFIG_INPUT_MOUSE is not set
|
# CONFIG_INPUT_MOUSE is not set
|
||||||
|
@ -55,8 +56,8 @@ CONFIG_LEDS_GPIO=y
|
||||||
CONFIG_LEDS_TRIGGERS=y
|
CONFIG_LEDS_TRIGGERS=y
|
||||||
CONFIG_LEDS_TRIGGER_HEARTBEAT=y
|
CONFIG_LEDS_TRIGGER_HEARTBEAT=y
|
||||||
CONFIG_RTC_CLASS=y
|
CONFIG_RTC_CLASS=y
|
||||||
CONFIG_RTC_DRV_GEMINI=y
|
|
||||||
CONFIG_DMADEVICES=y
|
CONFIG_DMADEVICES=y
|
||||||
|
CONFIG_AMBA_PL08X=y
|
||||||
# CONFIG_DNOTIFY is not set
|
# CONFIG_DNOTIFY is not set
|
||||||
CONFIG_TMPFS=y
|
CONFIG_TMPFS=y
|
||||||
CONFIG_TMPFS_POSIX_ACL=y
|
CONFIG_TMPFS_POSIX_ACL=y
|
||||||
|
|
|
@ -471,7 +471,7 @@ CONFIG_LCD_PLATFORM=m
|
||||||
CONFIG_LCD_TOSA=m
|
CONFIG_LCD_TOSA=m
|
||||||
CONFIG_BACKLIGHT_PWM=m
|
CONFIG_BACKLIGHT_PWM=m
|
||||||
CONFIG_BACKLIGHT_TOSA=m
|
CONFIG_BACKLIGHT_TOSA=m
|
||||||
CONFIG_FRAMEBUFFER_CONSOLE=m
|
CONFIG_FRAMEBUFFER_CONSOLE=y
|
||||||
CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
|
CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
|
||||||
CONFIG_LOGO=y
|
CONFIG_LOGO=y
|
||||||
CONFIG_SOUND=m
|
CONFIG_SOUND=m
|
||||||
|
|
|
@ -113,7 +113,7 @@ CONFIG_FB_PXA_PARAMETERS=y
|
||||||
CONFIG_BACKLIGHT_LCD_SUPPORT=y
|
CONFIG_BACKLIGHT_LCD_SUPPORT=y
|
||||||
CONFIG_BACKLIGHT_PWM=m
|
CONFIG_BACKLIGHT_PWM=m
|
||||||
# CONFIG_VGA_CONSOLE is not set
|
# CONFIG_VGA_CONSOLE is not set
|
||||||
CONFIG_FRAMEBUFFER_CONSOLE=m
|
CONFIG_FRAMEBUFFER_CONSOLE=y
|
||||||
CONFIG_LOGO=y
|
CONFIG_LOGO=y
|
||||||
CONFIG_SOUND=m
|
CONFIG_SOUND=m
|
||||||
CONFIG_SND=m
|
CONFIG_SND=m
|
||||||
|
|
|
@ -112,7 +112,7 @@ CONFIG_FB_PXA=m
|
||||||
CONFIG_FB_PXA_PARAMETERS=y
|
CONFIG_FB_PXA_PARAMETERS=y
|
||||||
CONFIG_BACKLIGHT_LCD_SUPPORT=y
|
CONFIG_BACKLIGHT_LCD_SUPPORT=y
|
||||||
# CONFIG_VGA_CONSOLE is not set
|
# CONFIG_VGA_CONSOLE is not set
|
||||||
CONFIG_FRAMEBUFFER_CONSOLE=m
|
CONFIG_FRAMEBUFFER_CONSOLE=y
|
||||||
CONFIG_LOGO=y
|
CONFIG_LOGO=y
|
||||||
CONFIG_SOUND=m
|
CONFIG_SOUND=m
|
||||||
CONFIG_SND=m
|
CONFIG_SND=m
|
||||||
|
|
|
@ -533,8 +533,8 @@ static void __init at91_pm_backup_init(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
pm_bu->suspended = 0;
|
pm_bu->suspended = 0;
|
||||||
pm_bu->canary = virt_to_phys(&canary);
|
pm_bu->canary = __pa_symbol(&canary);
|
||||||
pm_bu->resume = virt_to_phys(cpu_resume);
|
pm_bu->resume = __pa_symbol(cpu_resume);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
|
@ -58,10 +58,10 @@ void omap_hsmmc_late_init(struct omap2_hsmmc_info *c)
|
||||||
struct platform_device *pdev;
|
struct platform_device *pdev;
|
||||||
int res;
|
int res;
|
||||||
|
|
||||||
if (omap_hsmmc_done != 1)
|
if (omap_hsmmc_done)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
omap_hsmmc_done++;
|
omap_hsmmc_done = 1;
|
||||||
|
|
||||||
for (; c->mmc; c++) {
|
for (; c->mmc; c++) {
|
||||||
pdev = c->pdev;
|
pdev = c->pdev;
|
||||||
|
|
|
@ -839,6 +839,7 @@ static struct omap_hwmod dra7xx_gpio1_hwmod = {
|
||||||
.name = "gpio1",
|
.name = "gpio1",
|
||||||
.class = &dra7xx_gpio_hwmod_class,
|
.class = &dra7xx_gpio_hwmod_class,
|
||||||
.clkdm_name = "wkupaon_clkdm",
|
.clkdm_name = "wkupaon_clkdm",
|
||||||
|
.flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
|
||||||
.main_clk = "wkupaon_iclk_mux",
|
.main_clk = "wkupaon_iclk_mux",
|
||||||
.prcm = {
|
.prcm = {
|
||||||
.omap4 = {
|
.omap4 = {
|
||||||
|
|
|
@ -168,7 +168,8 @@
|
||||||
&sd_emmc_a {
|
&sd_emmc_a {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
pinctrl-0 = <&sdio_pins>;
|
pinctrl-0 = <&sdio_pins>;
|
||||||
pinctrl-names = "default";
|
pinctrl-1 = <&sdio_clk_gate_pins>;
|
||||||
|
pinctrl-names = "default", "clk-gate";
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
|
|
||||||
|
@ -194,7 +195,8 @@
|
||||||
&sd_emmc_b {
|
&sd_emmc_b {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
pinctrl-0 = <&sdcard_pins>;
|
pinctrl-0 = <&sdcard_pins>;
|
||||||
pinctrl-names = "default";
|
pinctrl-1 = <&sdcard_clk_gate_pins>;
|
||||||
|
pinctrl-names = "default", "clk-gate";
|
||||||
|
|
||||||
bus-width = <4>;
|
bus-width = <4>;
|
||||||
cap-sd-highspeed;
|
cap-sd-highspeed;
|
||||||
|
@ -212,10 +214,10 @@
|
||||||
&sd_emmc_c {
|
&sd_emmc_c {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
pinctrl-0 = <&emmc_pins>;
|
pinctrl-0 = <&emmc_pins>;
|
||||||
pinctrl-names = "default";
|
pinctrl-1 = <&emmc_clk_gate_pins>;
|
||||||
|
pinctrl-names = "default", "clk-gate";
|
||||||
|
|
||||||
bus-width = <8>;
|
bus-width = <8>;
|
||||||
cap-sd-highspeed;
|
|
||||||
cap-mmc-highspeed;
|
cap-mmc-highspeed;
|
||||||
max-frequency = <200000000>;
|
max-frequency = <200000000>;
|
||||||
non-removable;
|
non-removable;
|
||||||
|
|
|
@ -107,6 +107,9 @@
|
||||||
|
|
||||||
states = <3300000 0>,
|
states = <3300000 0>,
|
||||||
<1800000 1>;
|
<1800000 1>;
|
||||||
|
|
||||||
|
regulator-settling-time-up-us = <100>;
|
||||||
|
regulator-settling-time-down-us = <5000>;
|
||||||
};
|
};
|
||||||
|
|
||||||
wifi_32k: wifi-32k {
|
wifi_32k: wifi-32k {
|
||||||
|
@ -250,7 +253,8 @@
|
||||||
&sd_emmc_a {
|
&sd_emmc_a {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
pinctrl-0 = <&sdio_pins>, <&sdio_irq_pins>;
|
pinctrl-0 = <&sdio_pins>, <&sdio_irq_pins>;
|
||||||
pinctrl-names = "default";
|
pinctrl-1 = <&sdio_clk_gate_pins>;
|
||||||
|
pinctrl-names = "default", "clk-gate";
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
|
|
||||||
|
@ -276,11 +280,16 @@
|
||||||
&sd_emmc_b {
|
&sd_emmc_b {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
pinctrl-0 = <&sdcard_pins>;
|
pinctrl-0 = <&sdcard_pins>;
|
||||||
pinctrl-names = "default";
|
pinctrl-1 = <&sdcard_clk_gate_pins>;
|
||||||
|
pinctrl-names = "default", "clk-gate";
|
||||||
|
|
||||||
bus-width = <4>;
|
bus-width = <4>;
|
||||||
cap-sd-highspeed;
|
cap-sd-highspeed;
|
||||||
max-frequency = <100000000>;
|
sd-uhs-sdr12;
|
||||||
|
sd-uhs-sdr25;
|
||||||
|
sd-uhs-sdr50;
|
||||||
|
sd-uhs-sdr104;
|
||||||
|
max-frequency = <200000000>;
|
||||||
disable-wp;
|
disable-wp;
|
||||||
|
|
||||||
cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_HIGH>;
|
cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_HIGH>;
|
||||||
|
@ -294,10 +303,10 @@
|
||||||
&sd_emmc_c {
|
&sd_emmc_c {
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
pinctrl-0 = <&emmc_pins>;
|
pinctrl-0 = <&emmc_pins>;
|
||||||
pinctrl-names = "default";
|
pinctrl-1 = <&emmc_clk_gate_pins>;
|
||||||
|
pinctrl-names = "default", "clk-gate";
|
||||||
|
|
||||||
bus-width = <8>;
|
bus-width = <8>;
|
||||||
cap-sd-highspeed;
|
|
||||||
max-frequency = <200000000>;
|
max-frequency = <200000000>;
|
||||||
non-removable;
|
non-removable;
|
||||||
disable-wp;
|
disable-wp;
|
||||||
|
|
|
@ -51,7 +51,7 @@
|
||||||
/ {
|
/ {
|
||||||
compatible = "nexbox,a95x", "amlogic,meson-gxbb";
|
compatible = "nexbox,a95x", "amlogic,meson-gxbb";
|
||||||
model = "NEXBOX A95X";
|
model = "NEXBOX A95X";
|
||||||
|
|
||||||
aliases {
|
aliases {
|
||||||
serial0 = &uart_AO;
|
serial0 = &uart_AO;
|
||||||
};
|
};
|
||||||
|
@ -232,7 +232,8 @@
|
||||||
&sd_emmc_a {
|
&sd_emmc_a {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
pinctrl-0 = <&sdio_pins>;
|
pinctrl-0 = <&sdio_pins>;
|
||||||
pinctrl-names = "default";
|
pinctrl-1 = <&sdio_clk_gate_pins>;
|
||||||
|
pinctrl-names = "default", "clk-gate";
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
|
|
||||||
|
@ -253,7 +254,8 @@
|
||||||
&sd_emmc_b {
|
&sd_emmc_b {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
pinctrl-0 = <&sdcard_pins>;
|
pinctrl-0 = <&sdcard_pins>;
|
||||||
pinctrl-names = "default";
|
pinctrl-1 = <&sdcard_clk_gate_pins>;
|
||||||
|
pinctrl-names = "default", "clk-gate";
|
||||||
|
|
||||||
bus-width = <4>;
|
bus-width = <4>;
|
||||||
cap-sd-highspeed;
|
cap-sd-highspeed;
|
||||||
|
@ -271,10 +273,10 @@
|
||||||
&sd_emmc_c {
|
&sd_emmc_c {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
pinctrl-0 = <&emmc_pins>;
|
pinctrl-0 = <&emmc_pins>;
|
||||||
pinctrl-names = "default";
|
pinctrl-1 = <&emmc_clk_gate_pins>;
|
||||||
|
pinctrl-names = "default", "clk-gate";
|
||||||
|
|
||||||
bus-width = <8>;
|
bus-width = <8>;
|
||||||
cap-sd-highspeed;
|
|
||||||
cap-mmc-highspeed;
|
cap-mmc-highspeed;
|
||||||
max-frequency = <200000000>;
|
max-frequency = <200000000>;
|
||||||
non-removable;
|
non-removable;
|
||||||
|
|
|
@ -50,7 +50,7 @@
|
||||||
/ {
|
/ {
|
||||||
compatible = "hardkernel,odroid-c2", "amlogic,meson-gxbb";
|
compatible = "hardkernel,odroid-c2", "amlogic,meson-gxbb";
|
||||||
model = "Hardkernel ODROID-C2";
|
model = "Hardkernel ODROID-C2";
|
||||||
|
|
||||||
aliases {
|
aliases {
|
||||||
serial0 = &uart_AO;
|
serial0 = &uart_AO;
|
||||||
};
|
};
|
||||||
|
@ -253,7 +253,8 @@
|
||||||
&sd_emmc_b {
|
&sd_emmc_b {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
pinctrl-0 = <&sdcard_pins>;
|
pinctrl-0 = <&sdcard_pins>;
|
||||||
pinctrl-names = "default";
|
pinctrl-1 = <&sdcard_clk_gate_pins>;
|
||||||
|
pinctrl-names = "default", "clk-gate";
|
||||||
|
|
||||||
bus-width = <4>;
|
bus-width = <4>;
|
||||||
cap-sd-highspeed;
|
cap-sd-highspeed;
|
||||||
|
@ -271,10 +272,10 @@
|
||||||
&sd_emmc_c {
|
&sd_emmc_c {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
pinctrl-0 = <&emmc_pins>;
|
pinctrl-0 = <&emmc_pins>;
|
||||||
pinctrl-names = "default";
|
pinctrl-1 = <&emmc_clk_gate_pins>;
|
||||||
|
pinctrl-names = "default", "clk-gate";
|
||||||
|
|
||||||
bus-width = <8>;
|
bus-width = <8>;
|
||||||
cap-sd-highspeed;
|
|
||||||
max-frequency = <200000000>;
|
max-frequency = <200000000>;
|
||||||
non-removable;
|
non-removable;
|
||||||
disable-wp;
|
disable-wp;
|
||||||
|
|
|
@ -194,7 +194,8 @@
|
||||||
&sd_emmc_a {
|
&sd_emmc_a {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
pinctrl-0 = <&sdio_pins>;
|
pinctrl-0 = <&sdio_pins>;
|
||||||
pinctrl-names = "default";
|
pinctrl-1 = <&sdio_clk_gate_pins>;
|
||||||
|
pinctrl-names = "default", "clk-gate";
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
|
|
||||||
|
@ -220,10 +221,14 @@
|
||||||
&sd_emmc_b {
|
&sd_emmc_b {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
pinctrl-0 = <&sdcard_pins>;
|
pinctrl-0 = <&sdcard_pins>;
|
||||||
pinctrl-names = "default";
|
pinctrl-1 = <&sdcard_clk_gate_pins>;
|
||||||
|
pinctrl-names = "default", "clk-gate";
|
||||||
|
|
||||||
bus-width = <4>;
|
bus-width = <4>;
|
||||||
cap-sd-highspeed;
|
cap-sd-highspeed;
|
||||||
|
sd-uhs-sdr12;
|
||||||
|
sd-uhs-sdr25;
|
||||||
|
sd-uhs-sdr50;
|
||||||
max-frequency = <100000000>;
|
max-frequency = <100000000>;
|
||||||
disable-wp;
|
disable-wp;
|
||||||
|
|
||||||
|
@ -238,10 +243,10 @@
|
||||||
&sd_emmc_c {
|
&sd_emmc_c {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
pinctrl-0 = <&emmc_pins>;
|
pinctrl-0 = <&emmc_pins>;
|
||||||
pinctrl-names = "default";
|
pinctrl-1 = <&emmc_clk_gate_pins>;
|
||||||
|
pinctrl-names = "default", "clk-gate";
|
||||||
|
|
||||||
bus-width = <8>;
|
bus-width = <8>;
|
||||||
cap-sd-highspeed;
|
|
||||||
cap-mmc-highspeed;
|
cap-mmc-highspeed;
|
||||||
max-frequency = <200000000>;
|
max-frequency = <200000000>;
|
||||||
non-removable;
|
non-removable;
|
||||||
|
|
|
@ -155,7 +155,8 @@
|
||||||
&sd_emmc_a {
|
&sd_emmc_a {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
pinctrl-0 = <&sdio_pins &sdio_irq_pins>;
|
pinctrl-0 = <&sdio_pins &sdio_irq_pins>;
|
||||||
pinctrl-names = "default";
|
pinctrl-1 = <&sdio_clk_gate_pins>;
|
||||||
|
pinctrl-names = "default", "clk-gate";
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
|
|
||||||
|
@ -181,7 +182,8 @@
|
||||||
&sd_emmc_b {
|
&sd_emmc_b {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
pinctrl-0 = <&sdcard_pins>;
|
pinctrl-0 = <&sdcard_pins>;
|
||||||
pinctrl-names = "default";
|
pinctrl-1 = <&sdcard_clk_gate_pins>;
|
||||||
|
pinctrl-names = "default", "clk-gate";
|
||||||
|
|
||||||
bus-width = <4>;
|
bus-width = <4>;
|
||||||
cap-sd-highspeed;
|
cap-sd-highspeed;
|
||||||
|
@ -198,10 +200,10 @@
|
||||||
&sd_emmc_c {
|
&sd_emmc_c {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
pinctrl-0 = <&emmc_pins>;
|
pinctrl-0 = <&emmc_pins>;
|
||||||
pinctrl-names = "default";
|
pinctrl-1 = <&emmc_clk_gate_pins>;
|
||||||
|
pinctrl-names = "default", "clk-gate";
|
||||||
|
|
||||||
bus-width = <8>;
|
bus-width = <8>;
|
||||||
cap-sd-highspeed;
|
|
||||||
cap-mmc-highspeed;
|
cap-mmc-highspeed;
|
||||||
max-frequency = <200000000>;
|
max-frequency = <200000000>;
|
||||||
non-removable;
|
non-removable;
|
||||||
|
|
|
@ -392,6 +392,17 @@
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
emmc_clk_gate_pins: emmc_clk_gate {
|
||||||
|
mux {
|
||||||
|
groups = "BOOT_8";
|
||||||
|
function = "gpio_periphs";
|
||||||
|
};
|
||||||
|
cfg-pull-down {
|
||||||
|
pins = "BOOT_8";
|
||||||
|
bias-pull-down;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
nor_pins: nor {
|
nor_pins: nor {
|
||||||
mux {
|
mux {
|
||||||
groups = "nor_d",
|
groups = "nor_d",
|
||||||
|
@ -430,6 +441,17 @@
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
sdcard_clk_gate_pins: sdcard_clk_gate {
|
||||||
|
mux {
|
||||||
|
groups = "CARD_2";
|
||||||
|
function = "gpio_periphs";
|
||||||
|
};
|
||||||
|
cfg-pull-down {
|
||||||
|
pins = "CARD_2";
|
||||||
|
bias-pull-down;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
sdio_pins: sdio {
|
sdio_pins: sdio {
|
||||||
mux {
|
mux {
|
||||||
groups = "sdio_d0",
|
groups = "sdio_d0",
|
||||||
|
@ -442,6 +464,17 @@
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
sdio_clk_gate_pins: sdio_clk_gate {
|
||||||
|
mux {
|
||||||
|
groups = "GPIOX_4";
|
||||||
|
function = "gpio_periphs";
|
||||||
|
};
|
||||||
|
cfg-pull-down {
|
||||||
|
pins = "GPIOX_4";
|
||||||
|
bias-pull-down;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
sdio_irq_pins: sdio_irq {
|
sdio_irq_pins: sdio_irq {
|
||||||
mux {
|
mux {
|
||||||
groups = "sdio_irq";
|
groups = "sdio_irq";
|
||||||
|
@ -661,21 +694,21 @@
|
||||||
|
|
||||||
&sd_emmc_a {
|
&sd_emmc_a {
|
||||||
clocks = <&clkc CLKID_SD_EMMC_A>,
|
clocks = <&clkc CLKID_SD_EMMC_A>,
|
||||||
<&xtal>,
|
<&clkc CLKID_SD_EMMC_A_CLK0>,
|
||||||
<&clkc CLKID_FCLK_DIV2>;
|
<&clkc CLKID_FCLK_DIV2>;
|
||||||
clock-names = "core", "clkin0", "clkin1";
|
clock-names = "core", "clkin0", "clkin1";
|
||||||
};
|
};
|
||||||
|
|
||||||
&sd_emmc_b {
|
&sd_emmc_b {
|
||||||
clocks = <&clkc CLKID_SD_EMMC_B>,
|
clocks = <&clkc CLKID_SD_EMMC_B>,
|
||||||
<&xtal>,
|
<&clkc CLKID_SD_EMMC_B_CLK0>,
|
||||||
<&clkc CLKID_FCLK_DIV2>;
|
<&clkc CLKID_FCLK_DIV2>;
|
||||||
clock-names = "core", "clkin0", "clkin1";
|
clock-names = "core", "clkin0", "clkin1";
|
||||||
};
|
};
|
||||||
|
|
||||||
&sd_emmc_c {
|
&sd_emmc_c {
|
||||||
clocks = <&clkc CLKID_SD_EMMC_C>,
|
clocks = <&clkc CLKID_SD_EMMC_C>,
|
||||||
<&xtal>,
|
<&clkc CLKID_SD_EMMC_C_CLK0>,
|
||||||
<&clkc CLKID_FCLK_DIV2>;
|
<&clkc CLKID_FCLK_DIV2>;
|
||||||
clock-names = "core", "clkin0", "clkin1";
|
clock-names = "core", "clkin0", "clkin1";
|
||||||
};
|
};
|
||||||
|
|
|
@ -123,7 +123,8 @@
|
||||||
&sd_emmc_b {
|
&sd_emmc_b {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
pinctrl-0 = <&sdcard_pins>;
|
pinctrl-0 = <&sdcard_pins>;
|
||||||
pinctrl-names = "default";
|
pinctrl-1 = <&sdcard_clk_gate_pins>;
|
||||||
|
pinctrl-names = "default", "clk-gate";
|
||||||
|
|
||||||
bus-width = <4>;
|
bus-width = <4>;
|
||||||
cap-sd-highspeed;
|
cap-sd-highspeed;
|
||||||
|
@ -141,10 +142,10 @@
|
||||||
&sd_emmc_c {
|
&sd_emmc_c {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
pinctrl-0 = <&emmc_pins>;
|
pinctrl-0 = <&emmc_pins>;
|
||||||
pinctrl-names = "default";
|
pinctrl-1 = <&emmc_clk_gate_pins>;
|
||||||
|
pinctrl-names = "default", "clk-gate";
|
||||||
|
|
||||||
bus-width = <8>;
|
bus-width = <8>;
|
||||||
cap-sd-highspeed;
|
|
||||||
cap-mmc-highspeed;
|
cap-mmc-highspeed;
|
||||||
max-frequency = <100000000>;
|
max-frequency = <100000000>;
|
||||||
non-removable;
|
non-removable;
|
||||||
|
|
|
@ -91,6 +91,9 @@
|
||||||
|
|
||||||
states = <3300000 0>,
|
states = <3300000 0>,
|
||||||
<1800000 1>;
|
<1800000 1>;
|
||||||
|
|
||||||
|
regulator-settling-time-up-us = <200>;
|
||||||
|
regulator-settling-time-down-us = <50000>;
|
||||||
};
|
};
|
||||||
|
|
||||||
vddio_boot: regulator-vddio_boot {
|
vddio_boot: regulator-vddio_boot {
|
||||||
|
@ -197,10 +200,14 @@
|
||||||
&sd_emmc_b {
|
&sd_emmc_b {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
pinctrl-0 = <&sdcard_pins>;
|
pinctrl-0 = <&sdcard_pins>;
|
||||||
pinctrl-names = "default";
|
pinctrl-1 = <&sdcard_clk_gate_pins>;
|
||||||
|
pinctrl-names = "default", "clk-gate";
|
||||||
|
|
||||||
bus-width = <4>;
|
bus-width = <4>;
|
||||||
cap-sd-highspeed;
|
cap-sd-highspeed;
|
||||||
|
sd-uhs-sdr12;
|
||||||
|
sd-uhs-sdr25;
|
||||||
|
sd-uhs-sdr50;
|
||||||
max-frequency = <100000000>;
|
max-frequency = <100000000>;
|
||||||
disable-wp;
|
disable-wp;
|
||||||
|
|
||||||
|
@ -215,10 +222,12 @@
|
||||||
&sd_emmc_c {
|
&sd_emmc_c {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
pinctrl-0 = <&emmc_pins>;
|
pinctrl-0 = <&emmc_pins>;
|
||||||
pinctrl-names = "default";
|
pinctrl-1 = <&emmc_clk_gate_pins>;
|
||||||
|
pinctrl-names = "default", "clk-gate";
|
||||||
|
|
||||||
bus-width = <8>;
|
bus-width = <8>;
|
||||||
cap-mmc-highspeed;
|
cap-mmc-highspeed;
|
||||||
|
mmc-ddr-3_3v;
|
||||||
max-frequency = <50000000>;
|
max-frequency = <50000000>;
|
||||||
non-removable;
|
non-removable;
|
||||||
disable-wp;
|
disable-wp;
|
||||||
|
|
|
@ -189,7 +189,8 @@
|
||||||
&sd_emmc_a {
|
&sd_emmc_a {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
pinctrl-0 = <&sdio_pins>;
|
pinctrl-0 = <&sdio_pins>;
|
||||||
pinctrl-names = "default";
|
pinctrl-1 = <&sdio_clk_gate_pins>;
|
||||||
|
pinctrl-names = "default", "clk-gate";
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
|
|
||||||
|
@ -210,7 +211,8 @@
|
||||||
&sd_emmc_b {
|
&sd_emmc_b {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
pinctrl-0 = <&sdcard_pins>;
|
pinctrl-0 = <&sdcard_pins>;
|
||||||
pinctrl-names = "default";
|
pinctrl-1 = <&sdcard_clk_gate_pins>;
|
||||||
|
pinctrl-names = "default", "clk-gate";
|
||||||
|
|
||||||
bus-width = <4>;
|
bus-width = <4>;
|
||||||
cap-sd-highspeed;
|
cap-sd-highspeed;
|
||||||
|
@ -228,10 +230,10 @@
|
||||||
&sd_emmc_c {
|
&sd_emmc_c {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
pinctrl-0 = <&emmc_pins>;
|
pinctrl-0 = <&emmc_pins>;
|
||||||
pinctrl-names = "default";
|
pinctrl-1 = <&emmc_clk_gate_pins>;
|
||||||
|
pinctrl-names = "default", "clk-gate";
|
||||||
|
|
||||||
bus-width = <8>;
|
bus-width = <8>;
|
||||||
cap-sd-highspeed;
|
|
||||||
cap-mmc-highspeed;
|
cap-mmc-highspeed;
|
||||||
max-frequency = <200000000>;
|
max-frequency = <200000000>;
|
||||||
non-removable;
|
non-removable;
|
||||||
|
|
|
@ -95,7 +95,8 @@
|
||||||
&sd_emmc_a {
|
&sd_emmc_a {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
pinctrl-0 = <&sdio_pins>;
|
pinctrl-0 = <&sdio_pins>;
|
||||||
pinctrl-names = "default";
|
pinctrl-1 = <&sdio_clk_gate_pins>;
|
||||||
|
pinctrl-names = "default", "clk-gate";
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
|
|
||||||
|
@ -116,7 +117,8 @@
|
||||||
&sd_emmc_b {
|
&sd_emmc_b {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
pinctrl-0 = <&sdcard_pins>;
|
pinctrl-0 = <&sdcard_pins>;
|
||||||
pinctrl-names = "default";
|
pinctrl-1 = <&sdcard_clk_gate_pins>;
|
||||||
|
pinctrl-names = "default", "clk-gate";
|
||||||
|
|
||||||
bus-width = <4>;
|
bus-width = <4>;
|
||||||
cap-sd-highspeed;
|
cap-sd-highspeed;
|
||||||
|
@ -134,10 +136,10 @@
|
||||||
&sd_emmc_c {
|
&sd_emmc_c {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
pinctrl-0 = <&emmc_pins>;
|
pinctrl-0 = <&emmc_pins>;
|
||||||
pinctrl-names = "default";
|
pinctrl-1 = <&emmc_clk_gate_pins>;
|
||||||
|
pinctrl-names = "default", "clk-gate";
|
||||||
|
|
||||||
bus-width = <8>;
|
bus-width = <8>;
|
||||||
cap-sd-highspeed;
|
|
||||||
cap-mmc-highspeed;
|
cap-mmc-highspeed;
|
||||||
max-frequency = <200000000>;
|
max-frequency = <200000000>;
|
||||||
non-removable;
|
non-removable;
|
||||||
|
|
|
@ -281,6 +281,17 @@
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
emmc_clk_gate_pins: emmc_clk_gate {
|
||||||
|
mux {
|
||||||
|
groups = "BOOT_8";
|
||||||
|
function = "gpio_periphs";
|
||||||
|
};
|
||||||
|
cfg-pull-down {
|
||||||
|
pins = "BOOT_8";
|
||||||
|
bias-pull-down;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
nor_pins: nor {
|
nor_pins: nor {
|
||||||
mux {
|
mux {
|
||||||
groups = "nor_d",
|
groups = "nor_d",
|
||||||
|
@ -319,6 +330,17 @@
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
sdcard_clk_gate_pins: sdcard_clk_gate {
|
||||||
|
mux {
|
||||||
|
groups = "CARD_2";
|
||||||
|
function = "gpio_periphs";
|
||||||
|
};
|
||||||
|
cfg-pull-down {
|
||||||
|
pins = "CARD_2";
|
||||||
|
bias-pull-down;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
sdio_pins: sdio {
|
sdio_pins: sdio {
|
||||||
mux {
|
mux {
|
||||||
groups = "sdio_d0",
|
groups = "sdio_d0",
|
||||||
|
@ -331,6 +353,17 @@
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
sdio_clk_gate_pins: sdio_clk_gate {
|
||||||
|
mux {
|
||||||
|
groups = "GPIOX_4";
|
||||||
|
function = "gpio_periphs";
|
||||||
|
};
|
||||||
|
cfg-pull-down {
|
||||||
|
pins = "GPIOX_4";
|
||||||
|
bias-pull-down;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
sdio_irq_pins: sdio_irq {
|
sdio_irq_pins: sdio_irq {
|
||||||
mux {
|
mux {
|
||||||
groups = "sdio_irq";
|
groups = "sdio_irq";
|
||||||
|
@ -603,21 +636,21 @@
|
||||||
|
|
||||||
&sd_emmc_a {
|
&sd_emmc_a {
|
||||||
clocks = <&clkc CLKID_SD_EMMC_A>,
|
clocks = <&clkc CLKID_SD_EMMC_A>,
|
||||||
<&xtal>,
|
<&clkc CLKID_SD_EMMC_A_CLK0>,
|
||||||
<&clkc CLKID_FCLK_DIV2>;
|
<&clkc CLKID_FCLK_DIV2>;
|
||||||
clock-names = "core", "clkin0", "clkin1";
|
clock-names = "core", "clkin0", "clkin1";
|
||||||
};
|
};
|
||||||
|
|
||||||
&sd_emmc_b {
|
&sd_emmc_b {
|
||||||
clocks = <&clkc CLKID_SD_EMMC_B>,
|
clocks = <&clkc CLKID_SD_EMMC_B>,
|
||||||
<&xtal>,
|
<&clkc CLKID_SD_EMMC_B_CLK0>,
|
||||||
<&clkc CLKID_FCLK_DIV2>;
|
<&clkc CLKID_FCLK_DIV2>;
|
||||||
clock-names = "core", "clkin0", "clkin1";
|
clock-names = "core", "clkin0", "clkin1";
|
||||||
};
|
};
|
||||||
|
|
||||||
&sd_emmc_c {
|
&sd_emmc_c {
|
||||||
clocks = <&clkc CLKID_SD_EMMC_C>,
|
clocks = <&clkc CLKID_SD_EMMC_C>,
|
||||||
<&xtal>,
|
<&clkc CLKID_SD_EMMC_C_CLK0>,
|
||||||
<&clkc CLKID_FCLK_DIV2>;
|
<&clkc CLKID_FCLK_DIV2>;
|
||||||
clock-names = "core", "clkin0", "clkin1";
|
clock-names = "core", "clkin0", "clkin1";
|
||||||
};
|
};
|
||||||
|
|
|
@ -175,7 +175,8 @@
|
||||||
&sd_emmc_b {
|
&sd_emmc_b {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
pinctrl-0 = <&sdcard_pins>;
|
pinctrl-0 = <&sdcard_pins>;
|
||||||
pinctrl-names = "default";
|
pinctrl-1 = <&sdcard_clk_gate_pins>;
|
||||||
|
pinctrl-names = "default", "clk-gate";
|
||||||
|
|
||||||
bus-width = <4>;
|
bus-width = <4>;
|
||||||
cap-sd-highspeed;
|
cap-sd-highspeed;
|
||||||
|
@ -193,10 +194,10 @@
|
||||||
&sd_emmc_c {
|
&sd_emmc_c {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
pinctrl-0 = <&emmc_pins>;
|
pinctrl-0 = <&emmc_pins>;
|
||||||
pinctrl-names = "default";
|
pinctrl-1 = <&emmc_clk_gate_pins>;
|
||||||
|
pinctrl-names = "default", "clk-gate";
|
||||||
|
|
||||||
bus-width = <8>;
|
bus-width = <8>;
|
||||||
cap-sd-highspeed;
|
|
||||||
cap-mmc-highspeed;
|
cap-mmc-highspeed;
|
||||||
max-frequency = <200000000>;
|
max-frequency = <200000000>;
|
||||||
non-removable;
|
non-removable;
|
||||||
|
|
|
@ -220,7 +220,6 @@
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
|
|
||||||
bus-width = <8>;
|
bus-width = <8>;
|
||||||
cap-sd-highspeed;
|
|
||||||
cap-mmc-highspeed;
|
cap-mmc-highspeed;
|
||||||
max-frequency = <200000000>;
|
max-frequency = <200000000>;
|
||||||
non-removable;
|
non-removable;
|
||||||
|
|
|
@ -254,7 +254,7 @@
|
||||||
|
|
||||||
ap_syscon: system-controller@6f4000 {
|
ap_syscon: system-controller@6f4000 {
|
||||||
compatible = "syscon", "simple-mfd";
|
compatible = "syscon", "simple-mfd";
|
||||||
reg = <0x6f4000 0x1000>;
|
reg = <0x6f4000 0x2000>;
|
||||||
|
|
||||||
ap_clk: clock {
|
ap_clk: clock {
|
||||||
compatible = "marvell,ap806-clock";
|
compatible = "marvell,ap806-clock";
|
||||||
|
@ -265,7 +265,7 @@
|
||||||
compatible = "marvell,ap806-pinctrl";
|
compatible = "marvell,ap806-pinctrl";
|
||||||
};
|
};
|
||||||
|
|
||||||
ap_gpio: gpio {
|
ap_gpio: gpio@1040 {
|
||||||
compatible = "marvell,armada-8k-gpio";
|
compatible = "marvell,armada-8k-gpio";
|
||||||
offset = <0x1040>;
|
offset = <0x1040>;
|
||||||
ngpios = <20>;
|
ngpios = <20>;
|
||||||
|
|
|
@ -113,8 +113,7 @@
|
||||||
compatible = "arm,cortex-a53", "arm,armv8";
|
compatible = "arm,cortex-a53", "arm,armv8";
|
||||||
reg = <0x0 0x0>;
|
reg = <0x0 0x0>;
|
||||||
enable-method = "psci";
|
enable-method = "psci";
|
||||||
clocks = <&cru ARMCLKL>;
|
|
||||||
operating-points-v2 = <&cluster0_opp>;
|
|
||||||
#cooling-cells = <2>; /* min followed by max */
|
#cooling-cells = <2>; /* min followed by max */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -123,8 +122,6 @@
|
||||||
compatible = "arm,cortex-a53", "arm,armv8";
|
compatible = "arm,cortex-a53", "arm,armv8";
|
||||||
reg = <0x0 0x1>;
|
reg = <0x0 0x1>;
|
||||||
enable-method = "psci";
|
enable-method = "psci";
|
||||||
clocks = <&cru ARMCLKL>;
|
|
||||||
operating-points-v2 = <&cluster0_opp>;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
cpu_l2: cpu@2 {
|
cpu_l2: cpu@2 {
|
||||||
|
@ -132,8 +129,6 @@
|
||||||
compatible = "arm,cortex-a53", "arm,armv8";
|
compatible = "arm,cortex-a53", "arm,armv8";
|
||||||
reg = <0x0 0x2>;
|
reg = <0x0 0x2>;
|
||||||
enable-method = "psci";
|
enable-method = "psci";
|
||||||
clocks = <&cru ARMCLKL>;
|
|
||||||
operating-points-v2 = <&cluster0_opp>;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
cpu_l3: cpu@3 {
|
cpu_l3: cpu@3 {
|
||||||
|
@ -141,8 +136,6 @@
|
||||||
compatible = "arm,cortex-a53", "arm,armv8";
|
compatible = "arm,cortex-a53", "arm,armv8";
|
||||||
reg = <0x0 0x3>;
|
reg = <0x0 0x3>;
|
||||||
enable-method = "psci";
|
enable-method = "psci";
|
||||||
clocks = <&cru ARMCLKL>;
|
|
||||||
operating-points-v2 = <&cluster0_opp>;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
cpu_b0: cpu@100 {
|
cpu_b0: cpu@100 {
|
||||||
|
@ -150,8 +143,7 @@
|
||||||
compatible = "arm,cortex-a53", "arm,armv8";
|
compatible = "arm,cortex-a53", "arm,armv8";
|
||||||
reg = <0x0 0x100>;
|
reg = <0x0 0x100>;
|
||||||
enable-method = "psci";
|
enable-method = "psci";
|
||||||
clocks = <&cru ARMCLKB>;
|
|
||||||
operating-points-v2 = <&cluster1_opp>;
|
|
||||||
#cooling-cells = <2>; /* min followed by max */
|
#cooling-cells = <2>; /* min followed by max */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -160,8 +152,6 @@
|
||||||
compatible = "arm,cortex-a53", "arm,armv8";
|
compatible = "arm,cortex-a53", "arm,armv8";
|
||||||
reg = <0x0 0x101>;
|
reg = <0x0 0x101>;
|
||||||
enable-method = "psci";
|
enable-method = "psci";
|
||||||
clocks = <&cru ARMCLKB>;
|
|
||||||
operating-points-v2 = <&cluster1_opp>;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
cpu_b2: cpu@102 {
|
cpu_b2: cpu@102 {
|
||||||
|
@ -169,8 +159,6 @@
|
||||||
compatible = "arm,cortex-a53", "arm,armv8";
|
compatible = "arm,cortex-a53", "arm,armv8";
|
||||||
reg = <0x0 0x102>;
|
reg = <0x0 0x102>;
|
||||||
enable-method = "psci";
|
enable-method = "psci";
|
||||||
clocks = <&cru ARMCLKB>;
|
|
||||||
operating-points-v2 = <&cluster1_opp>;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
cpu_b3: cpu@103 {
|
cpu_b3: cpu@103 {
|
||||||
|
@ -178,62 +166,6 @@
|
||||||
compatible = "arm,cortex-a53", "arm,armv8";
|
compatible = "arm,cortex-a53", "arm,armv8";
|
||||||
reg = <0x0 0x103>;
|
reg = <0x0 0x103>;
|
||||||
enable-method = "psci";
|
enable-method = "psci";
|
||||||
clocks = <&cru ARMCLKB>;
|
|
||||||
operating-points-v2 = <&cluster1_opp>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
cluster0_opp: opp-table0 {
|
|
||||||
compatible = "operating-points-v2";
|
|
||||||
opp-shared;
|
|
||||||
|
|
||||||
opp00 {
|
|
||||||
opp-hz = /bits/ 64 <312000000>;
|
|
||||||
opp-microvolt = <950000>;
|
|
||||||
clock-latency-ns = <40000>;
|
|
||||||
};
|
|
||||||
opp01 {
|
|
||||||
opp-hz = /bits/ 64 <408000000>;
|
|
||||||
opp-microvolt = <950000>;
|
|
||||||
};
|
|
||||||
opp02 {
|
|
||||||
opp-hz = /bits/ 64 <600000000>;
|
|
||||||
opp-microvolt = <950000>;
|
|
||||||
};
|
|
||||||
opp03 {
|
|
||||||
opp-hz = /bits/ 64 <816000000>;
|
|
||||||
opp-microvolt = <1025000>;
|
|
||||||
};
|
|
||||||
opp04 {
|
|
||||||
opp-hz = /bits/ 64 <1008000000>;
|
|
||||||
opp-microvolt = <1125000>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
cluster1_opp: opp-table1 {
|
|
||||||
compatible = "operating-points-v2";
|
|
||||||
opp-shared;
|
|
||||||
|
|
||||||
opp00 {
|
|
||||||
opp-hz = /bits/ 64 <312000000>;
|
|
||||||
opp-microvolt = <950000>;
|
|
||||||
clock-latency-ns = <40000>;
|
|
||||||
};
|
|
||||||
opp01 {
|
|
||||||
opp-hz = /bits/ 64 <408000000>;
|
|
||||||
opp-microvolt = <950000>;
|
|
||||||
};
|
|
||||||
opp02 {
|
|
||||||
opp-hz = /bits/ 64 <600000000>;
|
|
||||||
opp-microvolt = <950000>;
|
|
||||||
};
|
|
||||||
opp03 {
|
|
||||||
opp-hz = /bits/ 64 <816000000>;
|
|
||||||
opp-microvolt = <975000>;
|
|
||||||
};
|
|
||||||
opp04 {
|
|
||||||
opp-hz = /bits/ 64 <1008000000>;
|
|
||||||
opp-microvolt = <1050000>;
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1629,9 +1629,9 @@
|
||||||
compatible = "rockchip,rk3399-mipi-dsi", "snps,dw-mipi-dsi";
|
compatible = "rockchip,rk3399-mipi-dsi", "snps,dw-mipi-dsi";
|
||||||
reg = <0x0 0xff960000 0x0 0x8000>;
|
reg = <0x0 0xff960000 0x0 0x8000>;
|
||||||
interrupts = <GIC_SPI 45 IRQ_TYPE_LEVEL_HIGH 0>;
|
interrupts = <GIC_SPI 45 IRQ_TYPE_LEVEL_HIGH 0>;
|
||||||
clocks = <&cru SCLK_MIPIDPHY_REF>, <&cru PCLK_MIPI_DSI0>,
|
clocks = <&cru SCLK_DPHY_PLL>, <&cru PCLK_MIPI_DSI0>,
|
||||||
<&cru SCLK_DPHY_TX0_CFG>;
|
<&cru SCLK_DPHY_TX0_CFG>, <&cru PCLK_VIO_GRF>;
|
||||||
clock-names = "ref", "pclk", "phy_cfg";
|
clock-names = "ref", "pclk", "phy_cfg", "grf";
|
||||||
power-domains = <&power RK3399_PD_VIO>;
|
power-domains = <&power RK3399_PD_VIO>;
|
||||||
rockchip,grf = <&grf>;
|
rockchip,grf = <&grf>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
|
|
|
@ -95,16 +95,19 @@
|
||||||
#define KERNEL_END _end
|
#define KERNEL_END _end
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The size of the KASAN shadow region. This should be 1/8th of the
|
* KASAN requires 1/8th of the kernel virtual address space for the shadow
|
||||||
* size of the entire kernel virtual address space.
|
* region. KASAN can bloat the stack significantly, so double the (minimum)
|
||||||
|
* stack size when KASAN is in use.
|
||||||
*/
|
*/
|
||||||
#ifdef CONFIG_KASAN
|
#ifdef CONFIG_KASAN
|
||||||
#define KASAN_SHADOW_SIZE (UL(1) << (VA_BITS - 3))
|
#define KASAN_SHADOW_SIZE (UL(1) << (VA_BITS - 3))
|
||||||
|
#define KASAN_THREAD_SHIFT 1
|
||||||
#else
|
#else
|
||||||
#define KASAN_SHADOW_SIZE (0)
|
#define KASAN_SHADOW_SIZE (0)
|
||||||
|
#define KASAN_THREAD_SHIFT 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define MIN_THREAD_SHIFT 14
|
#define MIN_THREAD_SHIFT (14 + KASAN_THREAD_SHIFT)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* VMAP'd stacks are allocated at page granularity, so we must ensure that such
|
* VMAP'd stacks are allocated at page granularity, so we must ensure that such
|
||||||
|
|
|
@ -649,4 +649,4 @@ static int __init armv8_deprecated_init(void)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
late_initcall(armv8_deprecated_init);
|
core_initcall(armv8_deprecated_init);
|
||||||
|
|
|
@ -1307,4 +1307,4 @@ static int __init enable_mrs_emulation(void)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
late_initcall(enable_mrs_emulation);
|
core_initcall(enable_mrs_emulation);
|
||||||
|
|
|
@ -444,4 +444,4 @@ static int __init fpsimd_init(void)
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
late_initcall(fpsimd_init);
|
core_initcall(fpsimd_init);
|
||||||
|
|
|
@ -97,7 +97,7 @@ static void data_abort_decode(unsigned int esr)
|
||||||
(esr & ESR_ELx_SF) >> ESR_ELx_SF_SHIFT,
|
(esr & ESR_ELx_SF) >> ESR_ELx_SF_SHIFT,
|
||||||
(esr & ESR_ELx_AR) >> ESR_ELx_AR_SHIFT);
|
(esr & ESR_ELx_AR) >> ESR_ELx_AR_SHIFT);
|
||||||
} else {
|
} else {
|
||||||
pr_alert(" ISV = 0, ISS = 0x%08lu\n", esr & ESR_ELx_ISS_MASK);
|
pr_alert(" ISV = 0, ISS = 0x%08lx\n", esr & ESR_ELx_ISS_MASK);
|
||||||
}
|
}
|
||||||
|
|
||||||
pr_alert(" CM = %lu, WnR = %lu\n",
|
pr_alert(" CM = %lu, WnR = %lu\n",
|
||||||
|
|
|
@ -194,6 +194,10 @@ config TIMER_DIVIDE
|
||||||
int "Timer divider (integer)"
|
int "Timer divider (integer)"
|
||||||
default "128"
|
default "128"
|
||||||
|
|
||||||
|
config CPU_BIG_ENDIAN
|
||||||
|
bool "Generate big endian code"
|
||||||
|
default n
|
||||||
|
|
||||||
config CPU_LITTLE_ENDIAN
|
config CPU_LITTLE_ENDIAN
|
||||||
bool "Generate little endian code"
|
bool "Generate little endian code"
|
||||||
default n
|
default n
|
||||||
|
|
|
@ -114,6 +114,15 @@ static void set_eit_vector_entries(void)
|
||||||
_flush_cache_copyback_all();
|
_flush_cache_copyback_all();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void abort(void)
|
||||||
|
{
|
||||||
|
BUG();
|
||||||
|
|
||||||
|
/* if that doesn't kill us, halt */
|
||||||
|
panic("Oops failed to kill thread");
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(abort);
|
||||||
|
|
||||||
void __init trap_init(void)
|
void __init trap_init(void)
|
||||||
{
|
{
|
||||||
set_eit_vector_entries();
|
set_eit_vector_entries();
|
||||||
|
|
|
@ -155,14 +155,16 @@ static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old,
|
||||||
return __cmpxchg_small(ptr, old, new, size);
|
return __cmpxchg_small(ptr, old, new, size);
|
||||||
|
|
||||||
case 4:
|
case 4:
|
||||||
return __cmpxchg_asm("ll", "sc", (volatile u32 *)ptr, old, new);
|
return __cmpxchg_asm("ll", "sc", (volatile u32 *)ptr,
|
||||||
|
(u32)old, new);
|
||||||
|
|
||||||
case 8:
|
case 8:
|
||||||
/* lld/scd are only available for MIPS64 */
|
/* lld/scd are only available for MIPS64 */
|
||||||
if (!IS_ENABLED(CONFIG_64BIT))
|
if (!IS_ENABLED(CONFIG_64BIT))
|
||||||
return __cmpxchg_called_with_bad_pointer();
|
return __cmpxchg_called_with_bad_pointer();
|
||||||
|
|
||||||
return __cmpxchg_asm("lld", "scd", (volatile u64 *)ptr, old, new);
|
return __cmpxchg_asm("lld", "scd", (volatile u64 *)ptr,
|
||||||
|
(u64)old, new);
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return __cmpxchg_called_with_bad_pointer();
|
return __cmpxchg_called_with_bad_pointer();
|
||||||
|
|
|
@ -183,18 +183,20 @@ int ls1x_eth_mux_init(struct platform_device *pdev, void *priv)
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct plat_stmmacenet_data ls1x_eth0_pdata = {
|
static struct plat_stmmacenet_data ls1x_eth0_pdata = {
|
||||||
.bus_id = 0,
|
.bus_id = 0,
|
||||||
.phy_addr = -1,
|
.phy_addr = -1,
|
||||||
#if defined(CONFIG_LOONGSON1_LS1B)
|
#if defined(CONFIG_LOONGSON1_LS1B)
|
||||||
.interface = PHY_INTERFACE_MODE_MII,
|
.interface = PHY_INTERFACE_MODE_MII,
|
||||||
#elif defined(CONFIG_LOONGSON1_LS1C)
|
#elif defined(CONFIG_LOONGSON1_LS1C)
|
||||||
.interface = PHY_INTERFACE_MODE_RMII,
|
.interface = PHY_INTERFACE_MODE_RMII,
|
||||||
#endif
|
#endif
|
||||||
.mdio_bus_data = &ls1x_mdio_bus_data,
|
.mdio_bus_data = &ls1x_mdio_bus_data,
|
||||||
.dma_cfg = &ls1x_eth_dma_cfg,
|
.dma_cfg = &ls1x_eth_dma_cfg,
|
||||||
.has_gmac = 1,
|
.has_gmac = 1,
|
||||||
.tx_coe = 1,
|
.tx_coe = 1,
|
||||||
.init = ls1x_eth_mux_init,
|
.rx_queues_to_use = 1,
|
||||||
|
.tx_queues_to_use = 1,
|
||||||
|
.init = ls1x_eth_mux_init,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct resource ls1x_eth0_resources[] = {
|
static struct resource ls1x_eth0_resources[] = {
|
||||||
|
@ -222,14 +224,16 @@ struct platform_device ls1x_eth0_pdev = {
|
||||||
|
|
||||||
#ifdef CONFIG_LOONGSON1_LS1B
|
#ifdef CONFIG_LOONGSON1_LS1B
|
||||||
static struct plat_stmmacenet_data ls1x_eth1_pdata = {
|
static struct plat_stmmacenet_data ls1x_eth1_pdata = {
|
||||||
.bus_id = 1,
|
.bus_id = 1,
|
||||||
.phy_addr = -1,
|
.phy_addr = -1,
|
||||||
.interface = PHY_INTERFACE_MODE_MII,
|
.interface = PHY_INTERFACE_MODE_MII,
|
||||||
.mdio_bus_data = &ls1x_mdio_bus_data,
|
.mdio_bus_data = &ls1x_mdio_bus_data,
|
||||||
.dma_cfg = &ls1x_eth_dma_cfg,
|
.dma_cfg = &ls1x_eth_dma_cfg,
|
||||||
.has_gmac = 1,
|
.has_gmac = 1,
|
||||||
.tx_coe = 1,
|
.tx_coe = 1,
|
||||||
.init = ls1x_eth_mux_init,
|
.rx_queues_to_use = 1,
|
||||||
|
.tx_queues_to_use = 1,
|
||||||
|
.init = ls1x_eth_mux_init,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct resource ls1x_eth1_resources[] = {
|
static struct resource ls1x_eth1_resources[] = {
|
||||||
|
|
|
@ -2558,7 +2558,6 @@ dcopuop:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
/* Reserved R6 ops */
|
/* Reserved R6 ops */
|
||||||
pr_err("Reserved MIPS R6 CMP.condn.S operation\n");
|
|
||||||
return SIGILL;
|
return SIGILL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2719,7 +2718,6 @@ dcopuop:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
/* Reserved R6 ops */
|
/* Reserved R6 ops */
|
||||||
pr_err("Reserved MIPS R6 CMP.condn.D operation\n");
|
|
||||||
return SIGILL;
|
return SIGILL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -667,7 +667,7 @@ static int build_one_insn(const struct bpf_insn *insn, struct jit_ctx *ctx,
|
||||||
{
|
{
|
||||||
int src, dst, r, td, ts, mem_off, b_off;
|
int src, dst, r, td, ts, mem_off, b_off;
|
||||||
bool need_swap, did_move, cmp_eq;
|
bool need_swap, did_move, cmp_eq;
|
||||||
unsigned int target;
|
unsigned int target = 0;
|
||||||
u64 t64;
|
u64 t64;
|
||||||
s64 t64s;
|
s64 t64s;
|
||||||
int bpf_op = BPF_OP(insn->code);
|
int bpf_op = BPF_OP(insn->code);
|
||||||
|
|
|
@ -30,8 +30,6 @@ cfg="$4"
|
||||||
boards_origin="$5"
|
boards_origin="$5"
|
||||||
shift 5
|
shift 5
|
||||||
|
|
||||||
cd "${srctree}"
|
|
||||||
|
|
||||||
# Only print Skipping... lines if the user explicitly specified BOARDS=. In the
|
# Only print Skipping... lines if the user explicitly specified BOARDS=. In the
|
||||||
# general case it only serves to obscure the useful output about what actually
|
# general case it only serves to obscure the useful output about what actually
|
||||||
# was included.
|
# was included.
|
||||||
|
@ -48,7 +46,7 @@ environment*)
|
||||||
esac
|
esac
|
||||||
|
|
||||||
for board in $@; do
|
for board in $@; do
|
||||||
board_cfg="arch/mips/configs/generic/board-${board}.config"
|
board_cfg="${srctree}/arch/mips/configs/generic/board-${board}.config"
|
||||||
if [ ! -f "${board_cfg}" ]; then
|
if [ ! -f "${board_cfg}" ]; then
|
||||||
echo "WARNING: Board config '${board_cfg}' not found"
|
echo "WARNING: Board config '${board_cfg}' not found"
|
||||||
continue
|
continue
|
||||||
|
@ -84,7 +82,7 @@ for board in $@; do
|
||||||
done || continue
|
done || continue
|
||||||
|
|
||||||
# Merge this board config fragment into our final config file
|
# Merge this board config fragment into our final config file
|
||||||
./scripts/kconfig/merge_config.sh \
|
${srctree}/scripts/kconfig/merge_config.sh \
|
||||||
-m -O ${objtree} ${cfg} ${board_cfg} \
|
-m -O ${objtree} ${cfg} ${board_cfg} \
|
||||||
| grep -Ev '^(#|Using)'
|
| grep -Ev '^(#|Using)'
|
||||||
done
|
done
|
||||||
|
|
|
@ -146,7 +146,7 @@ void machine_power_off(void)
|
||||||
|
|
||||||
/* prevent soft lockup/stalled CPU messages for endless loop. */
|
/* prevent soft lockup/stalled CPU messages for endless loop. */
|
||||||
rcu_sysrq_start();
|
rcu_sysrq_start();
|
||||||
lockup_detector_suspend();
|
lockup_detector_soft_poweroff();
|
||||||
for (;;);
|
for (;;);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -102,10 +102,10 @@ static void cpufeatures_flush_tlb(void)
|
||||||
case PVR_POWER8:
|
case PVR_POWER8:
|
||||||
case PVR_POWER8E:
|
case PVR_POWER8E:
|
||||||
case PVR_POWER8NVL:
|
case PVR_POWER8NVL:
|
||||||
__flush_tlb_power8(POWER8_TLB_SETS);
|
__flush_tlb_power8(TLB_INVAL_SCOPE_GLOBAL);
|
||||||
break;
|
break;
|
||||||
case PVR_POWER9:
|
case PVR_POWER9:
|
||||||
__flush_tlb_power9(POWER9_TLB_SETS_HASH);
|
__flush_tlb_power9(TLB_INVAL_SCOPE_GLOBAL);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
pr_err("unknown CPU version for boot TLB flush\n");
|
pr_err("unknown CPU version for boot TLB flush\n");
|
||||||
|
|
|
@ -734,7 +734,29 @@ EXC_REAL(program_check, 0x700, 0x100)
|
||||||
EXC_VIRT(program_check, 0x4700, 0x100, 0x700)
|
EXC_VIRT(program_check, 0x4700, 0x100, 0x700)
|
||||||
TRAMP_KVM(PACA_EXGEN, 0x700)
|
TRAMP_KVM(PACA_EXGEN, 0x700)
|
||||||
EXC_COMMON_BEGIN(program_check_common)
|
EXC_COMMON_BEGIN(program_check_common)
|
||||||
EXCEPTION_PROLOG_COMMON(0x700, PACA_EXGEN)
|
/*
|
||||||
|
* It's possible to receive a TM Bad Thing type program check with
|
||||||
|
* userspace register values (in particular r1), but with SRR1 reporting
|
||||||
|
* that we came from the kernel. Normally that would confuse the bad
|
||||||
|
* stack logic, and we would report a bad kernel stack pointer. Instead
|
||||||
|
* we switch to the emergency stack if we're taking a TM Bad Thing from
|
||||||
|
* the kernel.
|
||||||
|
*/
|
||||||
|
li r10,MSR_PR /* Build a mask of MSR_PR .. */
|
||||||
|
oris r10,r10,0x200000@h /* .. and SRR1_PROGTM */
|
||||||
|
and r10,r10,r12 /* Mask SRR1 with that. */
|
||||||
|
srdi r10,r10,8 /* Shift it so we can compare */
|
||||||
|
cmpldi r10,(0x200000 >> 8) /* .. with an immediate. */
|
||||||
|
bne 1f /* If != go to normal path. */
|
||||||
|
|
||||||
|
/* SRR1 had PR=0 and SRR1_PROGTM=1, so use the emergency stack */
|
||||||
|
andi. r10,r12,MSR_PR; /* Set CR0 correctly for label */
|
||||||
|
/* 3 in EXCEPTION_PROLOG_COMMON */
|
||||||
|
mr r10,r1 /* Save r1 */
|
||||||
|
ld r1,PACAEMERGSP(r13) /* Use emergency stack */
|
||||||
|
subi r1,r1,INT_FRAME_SIZE /* alloc stack frame */
|
||||||
|
b 3f /* Jump into the macro !! */
|
||||||
|
1: EXCEPTION_PROLOG_COMMON(0x700, PACA_EXGEN)
|
||||||
bl save_nvgprs
|
bl save_nvgprs
|
||||||
RECONCILE_IRQ_STATE(r10, r11)
|
RECONCILE_IRQ_STATE(r10, r11)
|
||||||
addi r3,r1,STACK_FRAME_OVERHEAD
|
addi r3,r1,STACK_FRAME_OVERHEAD
|
||||||
|
|
|
@ -624,5 +624,18 @@ long __machine_check_early_realmode_p8(struct pt_regs *regs)
|
||||||
|
|
||||||
long __machine_check_early_realmode_p9(struct pt_regs *regs)
|
long __machine_check_early_realmode_p9(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
* On POWER9 DD2.1 and below, it's possible to get a machine check
|
||||||
|
* caused by a paste instruction where only DSISR bit 25 is set. This
|
||||||
|
* will result in the MCE handler seeing an unknown event and the kernel
|
||||||
|
* crashing. An MCE that occurs like this is spurious, so we don't need
|
||||||
|
* to do anything in terms of servicing it. If there is something that
|
||||||
|
* needs to be serviced, the CPU will raise the MCE again with the
|
||||||
|
* correct DSISR so that it can be serviced properly. So detect this
|
||||||
|
* case and mark it as handled.
|
||||||
|
*/
|
||||||
|
if (SRR1_MC_LOADSTORE(regs->msr) && regs->dsisr == 0x02000000)
|
||||||
|
return 1;
|
||||||
|
|
||||||
return mce_handle_error(regs, mce_p9_derror_table, mce_p9_ierror_table);
|
return mce_handle_error(regs, mce_p9_derror_table, mce_p9_ierror_table);
|
||||||
}
|
}
|
||||||
|
|
|
@ -904,9 +904,6 @@ void __init setup_arch(char **cmdline_p)
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_PPC_64K_PAGES
|
|
||||||
init_mm.context.pte_frag = NULL;
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_SPAPR_TCE_IOMMU
|
#ifdef CONFIG_SPAPR_TCE_IOMMU
|
||||||
mm_iommu_init(&init_mm);
|
mm_iommu_init(&init_mm);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -452,9 +452,20 @@ static long restore_tm_sigcontexts(struct task_struct *tsk,
|
||||||
if (MSR_TM_RESV(msr))
|
if (MSR_TM_RESV(msr))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
/* pull in MSR TM from user context */
|
/* pull in MSR TS bits from user context */
|
||||||
regs->msr = (regs->msr & ~MSR_TS_MASK) | (msr & MSR_TS_MASK);
|
regs->msr = (regs->msr & ~MSR_TS_MASK) | (msr & MSR_TS_MASK);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Ensure that TM is enabled in regs->msr before we leave the signal
|
||||||
|
* handler. It could be the case that (a) user disabled the TM bit
|
||||||
|
* through the manipulation of the MSR bits in uc_mcontext or (b) the
|
||||||
|
* TM bit was disabled because a sufficient number of context switches
|
||||||
|
* happened whilst in the signal handler and load_tm overflowed,
|
||||||
|
* disabling the TM bit. In either case we can end up with an illegal
|
||||||
|
* TM state leading to a TM Bad Thing when we return to userspace.
|
||||||
|
*/
|
||||||
|
regs->msr |= MSR_TM;
|
||||||
|
|
||||||
/* pull in MSR LE from user context */
|
/* pull in MSR LE from user context */
|
||||||
regs->msr = (regs->msr & ~MSR_LE) | (msr & MSR_LE);
|
regs->msr = (regs->msr & ~MSR_LE) | (msr & MSR_LE);
|
||||||
|
|
||||||
|
|
|
@ -181,34 +181,25 @@ _GLOBAL(ftrace_stub)
|
||||||
* - we have no stack frame and can not allocate one
|
* - we have no stack frame and can not allocate one
|
||||||
* - LR points back to the original caller (in A)
|
* - LR points back to the original caller (in A)
|
||||||
* - CTR holds the new NIP in C
|
* - CTR holds the new NIP in C
|
||||||
* - r0 & r12 are free
|
* - r0, r11 & r12 are free
|
||||||
*
|
|
||||||
* r0 can't be used as the base register for a DS-form load or store, so
|
|
||||||
* we temporarily shuffle r1 (stack pointer) into r0 and then put it back.
|
|
||||||
*/
|
*/
|
||||||
livepatch_handler:
|
livepatch_handler:
|
||||||
CURRENT_THREAD_INFO(r12, r1)
|
CURRENT_THREAD_INFO(r12, r1)
|
||||||
|
|
||||||
/* Save stack pointer into r0 */
|
|
||||||
mr r0, r1
|
|
||||||
|
|
||||||
/* Allocate 3 x 8 bytes */
|
/* Allocate 3 x 8 bytes */
|
||||||
ld r1, TI_livepatch_sp(r12)
|
ld r11, TI_livepatch_sp(r12)
|
||||||
addi r1, r1, 24
|
addi r11, r11, 24
|
||||||
std r1, TI_livepatch_sp(r12)
|
std r11, TI_livepatch_sp(r12)
|
||||||
|
|
||||||
/* Save toc & real LR on livepatch stack */
|
/* Save toc & real LR on livepatch stack */
|
||||||
std r2, -24(r1)
|
std r2, -24(r11)
|
||||||
mflr r12
|
mflr r12
|
||||||
std r12, -16(r1)
|
std r12, -16(r11)
|
||||||
|
|
||||||
/* Store stack end marker */
|
/* Store stack end marker */
|
||||||
lis r12, STACK_END_MAGIC@h
|
lis r12, STACK_END_MAGIC@h
|
||||||
ori r12, r12, STACK_END_MAGIC@l
|
ori r12, r12, STACK_END_MAGIC@l
|
||||||
std r12, -8(r1)
|
std r12, -8(r11)
|
||||||
|
|
||||||
/* Restore real stack pointer */
|
|
||||||
mr r1, r0
|
|
||||||
|
|
||||||
/* Put ctr in r12 for global entry and branch there */
|
/* Put ctr in r12 for global entry and branch there */
|
||||||
mfctr r12
|
mfctr r12
|
||||||
|
@ -216,36 +207,30 @@ livepatch_handler:
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Now we are returning from the patched function to the original
|
* Now we are returning from the patched function to the original
|
||||||
* caller A. We are free to use r0 and r12, and we can use r2 until we
|
* caller A. We are free to use r11, r12 and we can use r2 until we
|
||||||
* restore it.
|
* restore it.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
CURRENT_THREAD_INFO(r12, r1)
|
CURRENT_THREAD_INFO(r12, r1)
|
||||||
|
|
||||||
/* Save stack pointer into r0 */
|
ld r11, TI_livepatch_sp(r12)
|
||||||
mr r0, r1
|
|
||||||
|
|
||||||
ld r1, TI_livepatch_sp(r12)
|
|
||||||
|
|
||||||
/* Check stack marker hasn't been trashed */
|
/* Check stack marker hasn't been trashed */
|
||||||
lis r2, STACK_END_MAGIC@h
|
lis r2, STACK_END_MAGIC@h
|
||||||
ori r2, r2, STACK_END_MAGIC@l
|
ori r2, r2, STACK_END_MAGIC@l
|
||||||
ld r12, -8(r1)
|
ld r12, -8(r11)
|
||||||
1: tdne r12, r2
|
1: tdne r12, r2
|
||||||
EMIT_BUG_ENTRY 1b, __FILE__, __LINE__ - 1, 0
|
EMIT_BUG_ENTRY 1b, __FILE__, __LINE__ - 1, 0
|
||||||
|
|
||||||
/* Restore LR & toc from livepatch stack */
|
/* Restore LR & toc from livepatch stack */
|
||||||
ld r12, -16(r1)
|
ld r12, -16(r11)
|
||||||
mtlr r12
|
mtlr r12
|
||||||
ld r2, -24(r1)
|
ld r2, -24(r11)
|
||||||
|
|
||||||
/* Pop livepatch stack frame */
|
/* Pop livepatch stack frame */
|
||||||
CURRENT_THREAD_INFO(r12, r0)
|
CURRENT_THREAD_INFO(r12, r1)
|
||||||
subi r1, r1, 24
|
subi r11, r11, 24
|
||||||
std r1, TI_livepatch_sp(r12)
|
std r11, TI_livepatch_sp(r12)
|
||||||
|
|
||||||
/* Restore real stack pointer */
|
|
||||||
mr r1, r0
|
|
||||||
|
|
||||||
/* Return to original caller of live patched function */
|
/* Return to original caller of live patched function */
|
||||||
blr
|
blr
|
||||||
|
|
|
@ -310,9 +310,6 @@ static int start_wd_on_cpu(unsigned int cpu)
|
||||||
if (!(watchdog_enabled & NMI_WATCHDOG_ENABLED))
|
if (!(watchdog_enabled & NMI_WATCHDOG_ENABLED))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (watchdog_suspended)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (!cpumask_test_cpu(cpu, &watchdog_cpumask))
|
if (!cpumask_test_cpu(cpu, &watchdog_cpumask))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
@ -358,36 +355,39 @@ static void watchdog_calc_timeouts(void)
|
||||||
wd_timer_period_ms = watchdog_thresh * 1000 * 2 / 5;
|
wd_timer_period_ms = watchdog_thresh * 1000 * 2 / 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
void watchdog_nmi_reconfigure(void)
|
void watchdog_nmi_stop(void)
|
||||||
|
{
|
||||||
|
int cpu;
|
||||||
|
|
||||||
|
for_each_cpu(cpu, &wd_cpus_enabled)
|
||||||
|
stop_wd_on_cpu(cpu);
|
||||||
|
}
|
||||||
|
|
||||||
|
void watchdog_nmi_start(void)
|
||||||
{
|
{
|
||||||
int cpu;
|
int cpu;
|
||||||
|
|
||||||
watchdog_calc_timeouts();
|
watchdog_calc_timeouts();
|
||||||
|
|
||||||
for_each_cpu(cpu, &wd_cpus_enabled)
|
|
||||||
stop_wd_on_cpu(cpu);
|
|
||||||
|
|
||||||
for_each_cpu_and(cpu, cpu_online_mask, &watchdog_cpumask)
|
for_each_cpu_and(cpu, cpu_online_mask, &watchdog_cpumask)
|
||||||
start_wd_on_cpu(cpu);
|
start_wd_on_cpu(cpu);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This runs after lockup_detector_init() which sets up watchdog_cpumask.
|
* Invoked from core watchdog init.
|
||||||
*/
|
*/
|
||||||
static int __init powerpc_watchdog_init(void)
|
int __init watchdog_nmi_probe(void)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
watchdog_calc_timeouts();
|
err = cpuhp_setup_state_nocalls(CPUHP_AP_ONLINE_DYN,
|
||||||
|
"powerpc/watchdog:online",
|
||||||
err = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "powerpc/watchdog:online",
|
start_wd_on_cpu, stop_wd_on_cpu);
|
||||||
start_wd_on_cpu, stop_wd_on_cpu);
|
if (err < 0) {
|
||||||
if (err < 0)
|
|
||||||
pr_warn("Watchdog could not be initialized");
|
pr_warn("Watchdog could not be initialized");
|
||||||
|
return err;
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
arch_initcall(powerpc_watchdog_init);
|
|
||||||
|
|
||||||
static void handle_backtrace_ipi(struct pt_regs *regs)
|
static void handle_backtrace_ipi(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
|
|
|
@ -622,7 +622,7 @@ int kvmppc_xive_get_xive(struct kvm *kvm, u32 irq, u32 *server,
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
state = &sb->irq_state[idx];
|
state = &sb->irq_state[idx];
|
||||||
arch_spin_lock(&sb->lock);
|
arch_spin_lock(&sb->lock);
|
||||||
*server = state->guest_server;
|
*server = state->act_server;
|
||||||
*priority = state->guest_priority;
|
*priority = state->guest_priority;
|
||||||
arch_spin_unlock(&sb->lock);
|
arch_spin_unlock(&sb->lock);
|
||||||
|
|
||||||
|
@ -1331,7 +1331,7 @@ static int xive_get_source(struct kvmppc_xive *xive, long irq, u64 addr)
|
||||||
xive->saved_src_count++;
|
xive->saved_src_count++;
|
||||||
|
|
||||||
/* Convert saved state into something compatible with xics */
|
/* Convert saved state into something compatible with xics */
|
||||||
val = state->guest_server;
|
val = state->act_server;
|
||||||
prio = state->saved_scan_prio;
|
prio = state->saved_scan_prio;
|
||||||
|
|
||||||
if (prio == MASKED) {
|
if (prio == MASKED) {
|
||||||
|
@ -1507,7 +1507,6 @@ static int xive_set_source(struct kvmppc_xive *xive, long irq, u64 addr)
|
||||||
/* First convert prio and mark interrupt as untargetted */
|
/* First convert prio and mark interrupt as untargetted */
|
||||||
act_prio = xive_prio_from_guest(guest_prio);
|
act_prio = xive_prio_from_guest(guest_prio);
|
||||||
state->act_priority = MASKED;
|
state->act_priority = MASKED;
|
||||||
state->guest_server = server;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We need to drop the lock due to the mutex below. Hopefully
|
* We need to drop the lock due to the mutex below. Hopefully
|
||||||
|
|
|
@ -35,7 +35,6 @@ struct kvmppc_xive_irq_state {
|
||||||
struct xive_irq_data *pt_data; /* XIVE Pass-through associated data */
|
struct xive_irq_data *pt_data; /* XIVE Pass-through associated data */
|
||||||
|
|
||||||
/* Targetting as set by guest */
|
/* Targetting as set by guest */
|
||||||
u32 guest_server; /* Current guest selected target */
|
|
||||||
u8 guest_priority; /* Guest set priority */
|
u8 guest_priority; /* Guest set priority */
|
||||||
u8 saved_priority; /* Saved priority when masking */
|
u8 saved_priority; /* Saved priority when masking */
|
||||||
|
|
||||||
|
|
|
@ -1684,11 +1684,13 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,
|
||||||
* Logical instructions
|
* Logical instructions
|
||||||
*/
|
*/
|
||||||
case 26: /* cntlzw */
|
case 26: /* cntlzw */
|
||||||
op->val = __builtin_clz((unsigned int) regs->gpr[rd]);
|
val = (unsigned int) regs->gpr[rd];
|
||||||
|
op->val = ( val ? __builtin_clz(val) : 32 );
|
||||||
goto logical_done;
|
goto logical_done;
|
||||||
#ifdef __powerpc64__
|
#ifdef __powerpc64__
|
||||||
case 58: /* cntlzd */
|
case 58: /* cntlzd */
|
||||||
op->val = __builtin_clzl(regs->gpr[rd]);
|
val = regs->gpr[rd];
|
||||||
|
op->val = ( val ? __builtin_clzl(val) : 64 );
|
||||||
goto logical_done;
|
goto logical_done;
|
||||||
#endif
|
#endif
|
||||||
case 28: /* and */
|
case 28: /* and */
|
||||||
|
|
|
@ -1438,7 +1438,6 @@ out:
|
||||||
|
|
||||||
int arch_update_cpu_topology(void)
|
int arch_update_cpu_topology(void)
|
||||||
{
|
{
|
||||||
lockdep_assert_cpus_held();
|
|
||||||
return numa_update_cpu_topology(true);
|
return numa_update_cpu_topology(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -361,9 +361,9 @@ static int change_page_attr(struct page *page, int numpages, pgprot_t prot)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
wmb();
|
wmb();
|
||||||
|
local_irq_restore(flags);
|
||||||
flush_tlb_kernel_range((unsigned long)page_address(start),
|
flush_tlb_kernel_range((unsigned long)page_address(start),
|
||||||
(unsigned long)page_address(page));
|
(unsigned long)page_address(page));
|
||||||
local_irq_restore(flags);
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -399,6 +399,20 @@ static void nest_imc_counters_release(struct perf_event *event)
|
||||||
|
|
||||||
/* Take the mutex lock for this node and then decrement the reference count */
|
/* Take the mutex lock for this node and then decrement the reference count */
|
||||||
mutex_lock(&ref->lock);
|
mutex_lock(&ref->lock);
|
||||||
|
if (ref->refc == 0) {
|
||||||
|
/*
|
||||||
|
* The scenario where this is true is, when perf session is
|
||||||
|
* started, followed by offlining of all cpus in a given node.
|
||||||
|
*
|
||||||
|
* In the cpuhotplug offline path, ppc_nest_imc_cpu_offline()
|
||||||
|
* function set the ref->count to zero, if the cpu which is
|
||||||
|
* about to offline is the last cpu in a given node and make
|
||||||
|
* an OPAL call to disable the engine in that node.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
mutex_unlock(&ref->lock);
|
||||||
|
return;
|
||||||
|
}
|
||||||
ref->refc--;
|
ref->refc--;
|
||||||
if (ref->refc == 0) {
|
if (ref->refc == 0) {
|
||||||
rc = opal_imc_counters_stop(OPAL_IMC_COUNTERS_NEST,
|
rc = opal_imc_counters_stop(OPAL_IMC_COUNTERS_NEST,
|
||||||
|
@ -523,8 +537,8 @@ static int core_imc_mem_init(int cpu, int size)
|
||||||
|
|
||||||
/* We need only vbase for core counters */
|
/* We need only vbase for core counters */
|
||||||
mem_info->vbase = page_address(alloc_pages_node(phys_id,
|
mem_info->vbase = page_address(alloc_pages_node(phys_id,
|
||||||
GFP_KERNEL | __GFP_ZERO | __GFP_THISNODE,
|
GFP_KERNEL | __GFP_ZERO | __GFP_THISNODE |
|
||||||
get_order(size)));
|
__GFP_NOWARN, get_order(size)));
|
||||||
if (!mem_info->vbase)
|
if (!mem_info->vbase)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
@ -646,6 +660,20 @@ static void core_imc_counters_release(struct perf_event *event)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
mutex_lock(&ref->lock);
|
mutex_lock(&ref->lock);
|
||||||
|
if (ref->refc == 0) {
|
||||||
|
/*
|
||||||
|
* The scenario where this is true is, when perf session is
|
||||||
|
* started, followed by offlining of all cpus in a given core.
|
||||||
|
*
|
||||||
|
* In the cpuhotplug offline path, ppc_core_imc_cpu_offline()
|
||||||
|
* function set the ref->count to zero, if the cpu which is
|
||||||
|
* about to offline is the last cpu in a given core and make
|
||||||
|
* an OPAL call to disable the engine in that core.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
mutex_unlock(&ref->lock);
|
||||||
|
return;
|
||||||
|
}
|
||||||
ref->refc--;
|
ref->refc--;
|
||||||
if (ref->refc == 0) {
|
if (ref->refc == 0) {
|
||||||
rc = opal_imc_counters_stop(OPAL_IMC_COUNTERS_CORE,
|
rc = opal_imc_counters_stop(OPAL_IMC_COUNTERS_CORE,
|
||||||
|
@ -763,8 +791,8 @@ static int thread_imc_mem_alloc(int cpu_id, int size)
|
||||||
* free the memory in cpu offline path.
|
* free the memory in cpu offline path.
|
||||||
*/
|
*/
|
||||||
local_mem = page_address(alloc_pages_node(phys_id,
|
local_mem = page_address(alloc_pages_node(phys_id,
|
||||||
GFP_KERNEL | __GFP_ZERO | __GFP_THISNODE,
|
GFP_KERNEL | __GFP_ZERO | __GFP_THISNODE |
|
||||||
get_order(size)));
|
__GFP_NOWARN, get_order(size)));
|
||||||
if (!local_mem)
|
if (!local_mem)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
@ -1148,7 +1176,8 @@ static void imc_common_cpuhp_mem_free(struct imc_pmu *pmu_ptr)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Only free the attr_groups which are dynamically allocated */
|
/* Only free the attr_groups which are dynamically allocated */
|
||||||
kfree(pmu_ptr->attr_groups[IMC_EVENT_ATTR]->attrs);
|
if (pmu_ptr->attr_groups[IMC_EVENT_ATTR])
|
||||||
|
kfree(pmu_ptr->attr_groups[IMC_EVENT_ATTR]->attrs);
|
||||||
kfree(pmu_ptr->attr_groups[IMC_EVENT_ATTR]);
|
kfree(pmu_ptr->attr_groups[IMC_EVENT_ATTR]);
|
||||||
kfree(pmu_ptr);
|
kfree(pmu_ptr);
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -272,7 +272,15 @@ static void pnv_kexec_cpu_down(int crash_shutdown, int secondary)
|
||||||
#ifdef CONFIG_MEMORY_HOTPLUG_SPARSE
|
#ifdef CONFIG_MEMORY_HOTPLUG_SPARSE
|
||||||
static unsigned long pnv_memory_block_size(void)
|
static unsigned long pnv_memory_block_size(void)
|
||||||
{
|
{
|
||||||
return 256UL * 1024 * 1024;
|
/*
|
||||||
|
* We map the kernel linear region with 1GB large pages on radix. For
|
||||||
|
* memory hot unplug to work our memory block size must be at least
|
||||||
|
* this size.
|
||||||
|
*/
|
||||||
|
if (radix_enabled())
|
||||||
|
return 1UL * 1024 * 1024 * 1024;
|
||||||
|
else
|
||||||
|
return 256UL * 1024 * 1024;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -71,6 +71,8 @@
|
||||||
#define RIWAR_WRTYP_ALLOC 0x00006000
|
#define RIWAR_WRTYP_ALLOC 0x00006000
|
||||||
#define RIWAR_SIZE_MASK 0x0000003F
|
#define RIWAR_SIZE_MASK 0x0000003F
|
||||||
|
|
||||||
|
static DEFINE_SPINLOCK(fsl_rio_config_lock);
|
||||||
|
|
||||||
#define __fsl_read_rio_config(x, addr, err, op) \
|
#define __fsl_read_rio_config(x, addr, err, op) \
|
||||||
__asm__ __volatile__( \
|
__asm__ __volatile__( \
|
||||||
"1: "op" %1,0(%2)\n" \
|
"1: "op" %1,0(%2)\n" \
|
||||||
|
@ -184,6 +186,7 @@ fsl_rio_config_read(struct rio_mport *mport, int index, u16 destid,
|
||||||
u8 hopcount, u32 offset, int len, u32 *val)
|
u8 hopcount, u32 offset, int len, u32 *val)
|
||||||
{
|
{
|
||||||
struct rio_priv *priv = mport->priv;
|
struct rio_priv *priv = mport->priv;
|
||||||
|
unsigned long flags;
|
||||||
u8 *data;
|
u8 *data;
|
||||||
u32 rval, err = 0;
|
u32 rval, err = 0;
|
||||||
|
|
||||||
|
@ -197,6 +200,8 @@ fsl_rio_config_read(struct rio_mport *mport, int index, u16 destid,
|
||||||
if (offset > (0x1000000 - len) || !IS_ALIGNED(offset, len))
|
if (offset > (0x1000000 - len) || !IS_ALIGNED(offset, len))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
spin_lock_irqsave(&fsl_rio_config_lock, flags);
|
||||||
|
|
||||||
out_be32(&priv->maint_atmu_regs->rowtar,
|
out_be32(&priv->maint_atmu_regs->rowtar,
|
||||||
(destid << 22) | (hopcount << 12) | (offset >> 12));
|
(destid << 22) | (hopcount << 12) | (offset >> 12));
|
||||||
out_be32(&priv->maint_atmu_regs->rowtear, (destid >> 10));
|
out_be32(&priv->maint_atmu_regs->rowtear, (destid >> 10));
|
||||||
|
@ -213,6 +218,7 @@ fsl_rio_config_read(struct rio_mport *mport, int index, u16 destid,
|
||||||
__fsl_read_rio_config(rval, data, err, "lwz");
|
__fsl_read_rio_config(rval, data, err, "lwz");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
spin_unlock_irqrestore(&fsl_rio_config_lock, flags);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -221,6 +227,7 @@ fsl_rio_config_read(struct rio_mport *mport, int index, u16 destid,
|
||||||
err, destid, hopcount, offset);
|
err, destid, hopcount, offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
spin_unlock_irqrestore(&fsl_rio_config_lock, flags);
|
||||||
*val = rval;
|
*val = rval;
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
|
@ -244,7 +251,10 @@ fsl_rio_config_write(struct rio_mport *mport, int index, u16 destid,
|
||||||
u8 hopcount, u32 offset, int len, u32 val)
|
u8 hopcount, u32 offset, int len, u32 val)
|
||||||
{
|
{
|
||||||
struct rio_priv *priv = mport->priv;
|
struct rio_priv *priv = mport->priv;
|
||||||
|
unsigned long flags;
|
||||||
u8 *data;
|
u8 *data;
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
pr_debug
|
pr_debug
|
||||||
("fsl_rio_config_write:"
|
("fsl_rio_config_write:"
|
||||||
" index %d destid %d hopcount %d offset %8.8x len %d val %8.8x\n",
|
" index %d destid %d hopcount %d offset %8.8x len %d val %8.8x\n",
|
||||||
|
@ -255,6 +265,8 @@ fsl_rio_config_write(struct rio_mport *mport, int index, u16 destid,
|
||||||
if (offset > (0x1000000 - len) || !IS_ALIGNED(offset, len))
|
if (offset > (0x1000000 - len) || !IS_ALIGNED(offset, len))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
spin_lock_irqsave(&fsl_rio_config_lock, flags);
|
||||||
|
|
||||||
out_be32(&priv->maint_atmu_regs->rowtar,
|
out_be32(&priv->maint_atmu_regs->rowtar,
|
||||||
(destid << 22) | (hopcount << 12) | (offset >> 12));
|
(destid << 22) | (hopcount << 12) | (offset >> 12));
|
||||||
out_be32(&priv->maint_atmu_regs->rowtear, (destid >> 10));
|
out_be32(&priv->maint_atmu_regs->rowtear, (destid >> 10));
|
||||||
|
@ -271,10 +283,11 @@ fsl_rio_config_write(struct rio_mport *mport, int index, u16 destid,
|
||||||
out_be32((u32 *) data, val);
|
out_be32((u32 *) data, val);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return -EINVAL;
|
ret = -EINVAL;
|
||||||
}
|
}
|
||||||
|
spin_unlock_irqrestore(&fsl_rio_config_lock, flags);
|
||||||
|
|
||||||
return 0;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void fsl_rio_inbound_mem_init(struct rio_priv *priv)
|
static void fsl_rio_inbound_mem_init(struct rio_priv *priv)
|
||||||
|
|
|
@ -104,6 +104,8 @@
|
||||||
|
|
||||||
#define DOORBELL_MESSAGE_SIZE 0x08
|
#define DOORBELL_MESSAGE_SIZE 0x08
|
||||||
|
|
||||||
|
static DEFINE_SPINLOCK(fsl_rio_doorbell_lock);
|
||||||
|
|
||||||
struct rio_msg_regs {
|
struct rio_msg_regs {
|
||||||
u32 omr;
|
u32 omr;
|
||||||
u32 osr;
|
u32 osr;
|
||||||
|
@ -626,9 +628,13 @@ err_out:
|
||||||
int fsl_rio_doorbell_send(struct rio_mport *mport,
|
int fsl_rio_doorbell_send(struct rio_mport *mport,
|
||||||
int index, u16 destid, u16 data)
|
int index, u16 destid, u16 data)
|
||||||
{
|
{
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
pr_debug("fsl_doorbell_send: index %d destid %4.4x data %4.4x\n",
|
pr_debug("fsl_doorbell_send: index %d destid %4.4x data %4.4x\n",
|
||||||
index, destid, data);
|
index, destid, data);
|
||||||
|
|
||||||
|
spin_lock_irqsave(&fsl_rio_doorbell_lock, flags);
|
||||||
|
|
||||||
/* In the serial version silicons, such as MPC8548, MPC8641,
|
/* In the serial version silicons, such as MPC8548, MPC8641,
|
||||||
* below operations is must be.
|
* below operations is must be.
|
||||||
*/
|
*/
|
||||||
|
@ -638,6 +644,8 @@ int fsl_rio_doorbell_send(struct rio_mport *mport,
|
||||||
out_be32(&dbell->dbell_regs->oddatr, (index << 20) | data);
|
out_be32(&dbell->dbell_regs->oddatr, (index << 20) | data);
|
||||||
out_be32(&dbell->dbell_regs->odmr, 0x00000001);
|
out_be32(&dbell->dbell_regs->odmr, 0x00000001);
|
||||||
|
|
||||||
|
spin_unlock_irqrestore(&fsl_rio_doorbell_lock, flags);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1402,6 +1402,14 @@ void xive_teardown_cpu(void)
|
||||||
|
|
||||||
if (xive_ops->teardown_cpu)
|
if (xive_ops->teardown_cpu)
|
||||||
xive_ops->teardown_cpu(cpu, xc);
|
xive_ops->teardown_cpu(cpu, xc);
|
||||||
|
|
||||||
|
#ifdef CONFIG_SMP
|
||||||
|
/* Get rid of IPI */
|
||||||
|
xive_cleanup_cpu_ipi(cpu, xc);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Disable and free the queues */
|
||||||
|
xive_cleanup_cpu_queues(cpu, xc);
|
||||||
}
|
}
|
||||||
|
|
||||||
void xive_kexec_teardown_cpu(int secondary)
|
void xive_kexec_teardown_cpu(int secondary)
|
||||||
|
|
|
@ -431,7 +431,11 @@ static int xive_spapr_get_ipi(unsigned int cpu, struct xive_cpu *xc)
|
||||||
|
|
||||||
static void xive_spapr_put_ipi(unsigned int cpu, struct xive_cpu *xc)
|
static void xive_spapr_put_ipi(unsigned int cpu, struct xive_cpu *xc)
|
||||||
{
|
{
|
||||||
|
if (!xc->hw_ipi)
|
||||||
|
return;
|
||||||
|
|
||||||
xive_irq_bitmap_free(xc->hw_ipi);
|
xive_irq_bitmap_free(xc->hw_ipi);
|
||||||
|
xc->hw_ipi = 0;
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_SMP */
|
#endif /* CONFIG_SMP */
|
||||||
|
|
||||||
|
|
|
@ -43,9 +43,7 @@ enum {
|
||||||
GPIO_PG7, GPIO_PG6, GPIO_PG5, GPIO_PG4,
|
GPIO_PG7, GPIO_PG6, GPIO_PG5, GPIO_PG4,
|
||||||
GPIO_PG3, GPIO_PG2, GPIO_PG1, GPIO_PG0,
|
GPIO_PG3, GPIO_PG2, GPIO_PG1, GPIO_PG0,
|
||||||
|
|
||||||
/* Port H */
|
/* Port H - Port H does not have a Data Register */
|
||||||
GPIO_PH7, GPIO_PH6, GPIO_PH5, GPIO_PH4,
|
|
||||||
GPIO_PH3, GPIO_PH2, GPIO_PH1, GPIO_PH0,
|
|
||||||
|
|
||||||
/* Port I - not on device */
|
/* Port I - not on device */
|
||||||
|
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue