mvebu: drop 3.10 support
Signed-off-by: Luka Perkov <luka@openwrt.org> SVN-Revision: 41406
This commit is contained in:
parent
be2a057787
commit
26b06940a9
197 changed files with 0 additions and 20508 deletions
|
@ -1,272 +0,0 @@
|
|||
CONFIG_ALIGNMENT_TRAP=y
|
||||
# CONFIG_ARCH_BCM is not set
|
||||
CONFIG_ARCH_BINFMT_ELF_RANDOMIZE_PIE=y
|
||||
CONFIG_ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE=y
|
||||
CONFIG_ARCH_HAS_TICK_BROADCAST=y
|
||||
CONFIG_ARCH_HAVE_CUSTOM_GPIO_H=y
|
||||
CONFIG_ARCH_MULTIPLATFORM=y
|
||||
# CONFIG_ARCH_MULTI_CPU_AUTO is not set
|
||||
# CONFIG_ARCH_MULTI_V6 is not set
|
||||
CONFIG_ARCH_MULTI_V6_V7=y
|
||||
CONFIG_ARCH_MULTI_V7=y
|
||||
CONFIG_ARCH_MVEBU=y
|
||||
# CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED is not set
|
||||
CONFIG_ARCH_NR_GPIO=0
|
||||
CONFIG_ARCH_REQUIRE_GPIOLIB=y
|
||||
# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set
|
||||
# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set
|
||||
# CONFIG_ARCH_SUNXI is not set
|
||||
CONFIG_ARCH_SUSPEND_POSSIBLE=y
|
||||
# CONFIG_ARCH_VIRT is not set
|
||||
CONFIG_ARCH_WANT_IPC_PARSE_VERSION=y
|
||||
# CONFIG_ARCH_WM8850 is not set
|
||||
CONFIG_ARM=y
|
||||
CONFIG_ARMADA_370_XP_TIMER=y
|
||||
CONFIG_ARM_APPENDED_DTB=y
|
||||
CONFIG_ARM_ATAG_DTB_COMPAT=y
|
||||
# CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_EXTEND is not set
|
||||
CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_FROM_BOOTLOADER=y
|
||||
# CONFIG_ARM_CPU_SUSPEND is not set
|
||||
CONFIG_ARM_L1_CACHE_SHIFT=6
|
||||
CONFIG_ARM_L1_CACHE_SHIFT_6=y
|
||||
# CONFIG_ARM_LPAE is not set
|
||||
CONFIG_ARM_NR_BANKS=8
|
||||
CONFIG_ARM_PATCH_PHYS_VIRT=y
|
||||
CONFIG_ARM_THUMB=y
|
||||
# CONFIG_ARM_THUMBEE is not set
|
||||
CONFIG_ARM_VIRT_EXT=y
|
||||
CONFIG_ASYNC_TX_ENABLE_CHANNEL_SWITCH=y
|
||||
CONFIG_ATAGS=y
|
||||
CONFIG_AUTO_ZRELADDR=y
|
||||
CONFIG_BOUNCE=y
|
||||
CONFIG_CACHE_L2X0=y
|
||||
CONFIG_CACHE_PL310=y
|
||||
CONFIG_CLKDEV_LOOKUP=y
|
||||
CONFIG_CLKSRC_MMIO=y
|
||||
CONFIG_CLKSRC_OF=y
|
||||
CONFIG_CLONE_BACKWARDS=y
|
||||
CONFIG_COMMON_CLK=y
|
||||
CONFIG_CPU_32v6K=y
|
||||
CONFIG_CPU_32v7=y
|
||||
CONFIG_CPU_ABRT_EV7=y
|
||||
# CONFIG_CPU_BPREDICT_DISABLE is not set
|
||||
CONFIG_CPU_CACHE_V7=y
|
||||
CONFIG_CPU_CACHE_VIPT=y
|
||||
CONFIG_CPU_COPY_V6=y
|
||||
CONFIG_CPU_CP15=y
|
||||
CONFIG_CPU_CP15_MMU=y
|
||||
CONFIG_CPU_HAS_ASID=y
|
||||
# CONFIG_CPU_ICACHE_DISABLE is not set
|
||||
CONFIG_CPU_PABRT_V7=y
|
||||
CONFIG_CPU_PJ4B=y
|
||||
CONFIG_CPU_RMAP=y
|
||||
CONFIG_CPU_TLB_V7=y
|
||||
CONFIG_CPU_V7=y
|
||||
CONFIG_CRC16=y
|
||||
CONFIG_DCACHE_WORD_ACCESS=y
|
||||
CONFIG_DEBUG_INFO=y
|
||||
CONFIG_DEBUG_LL=y
|
||||
CONFIG_DEBUG_LL_INCLUDE="debug/mvebu.S"
|
||||
CONFIG_DEBUG_MVEBU_UART=y
|
||||
# CONFIG_DEBUG_MVEBU_UART_ALTERNATE is not set
|
||||
# CONFIG_DEBUG_PINCTRL is not set
|
||||
CONFIG_DEBUG_UNCOMPRESS=y
|
||||
CONFIG_DEBUG_USER=y
|
||||
CONFIG_DMADEVICES=y
|
||||
CONFIG_DMA_ENGINE=y
|
||||
CONFIG_DMA_OF=y
|
||||
CONFIG_DTC=y
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
CONFIG_EXT2_FS=y
|
||||
CONFIG_EXT3_FS=y
|
||||
CONFIG_FAT_FS=y
|
||||
CONFIG_FRAME_POINTER=y
|
||||
CONFIG_GENERIC_BUG=y
|
||||
CONFIG_GENERIC_CLOCKEVENTS=y
|
||||
CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y
|
||||
CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
|
||||
CONFIG_GENERIC_IDLE_POLL_SETUP=y
|
||||
CONFIG_GENERIC_IO=y
|
||||
CONFIG_GENERIC_IRQ_CHIP=y
|
||||
CONFIG_GENERIC_IRQ_SHOW=y
|
||||
CONFIG_GENERIC_PCI_IOMAP=y
|
||||
CONFIG_GENERIC_SMP_IDLE_THREAD=y
|
||||
CONFIG_GENERIC_STRNCPY_FROM_USER=y
|
||||
CONFIG_GENERIC_STRNLEN_USER=y
|
||||
CONFIG_GPIOLIB=y
|
||||
CONFIG_GPIO_DEVRES=y
|
||||
CONFIG_GPIO_GENERIC=y
|
||||
CONFIG_GPIO_MVEBU=y
|
||||
CONFIG_GPIO_SYSFS=y
|
||||
CONFIG_HARDIRQS_SW_RESEND=y
|
||||
CONFIG_HAS_DMA=y
|
||||
CONFIG_HAS_IOMEM=y
|
||||
CONFIG_HAS_IOPORT=y
|
||||
# CONFIG_HAVE_64BIT_ALIGNED_ACCESS is not set
|
||||
CONFIG_HAVE_ARCH_JUMP_LABEL=y
|
||||
CONFIG_HAVE_ARCH_KGDB=y
|
||||
CONFIG_HAVE_ARCH_PFN_VALID=y
|
||||
CONFIG_HAVE_ARCH_SECCOMP_FILTER=y
|
||||
CONFIG_HAVE_ARCH_TRACEHOOK=y
|
||||
# CONFIG_HAVE_BOOTMEM_INFO_NODE is not set
|
||||
CONFIG_HAVE_BPF_JIT=y
|
||||
CONFIG_HAVE_CLK=y
|
||||
CONFIG_HAVE_CLK_PREPARE=y
|
||||
CONFIG_HAVE_CONTEXT_TRACKING=y
|
||||
CONFIG_HAVE_C_RECORDMCOUNT=y
|
||||
CONFIG_HAVE_DEBUG_KMEMLEAK=y
|
||||
CONFIG_HAVE_DMA_API_DEBUG=y
|
||||
CONFIG_HAVE_DMA_ATTRS=y
|
||||
CONFIG_HAVE_DMA_CONTIGUOUS=y
|
||||
CONFIG_HAVE_DYNAMIC_FTRACE=y
|
||||
CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
|
||||
CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
|
||||
CONFIG_HAVE_FUNCTION_TRACER=y
|
||||
CONFIG_HAVE_GENERIC_DMA_COHERENT=y
|
||||
CONFIG_HAVE_GENERIC_HARDIRQS=y
|
||||
CONFIG_HAVE_IDE=y
|
||||
CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y
|
||||
CONFIG_HAVE_KERNEL_GZIP=y
|
||||
CONFIG_HAVE_KERNEL_LZMA=y
|
||||
CONFIG_HAVE_KERNEL_LZO=y
|
||||
CONFIG_HAVE_KERNEL_XZ=y
|
||||
CONFIG_HAVE_MEMBLOCK=y
|
||||
CONFIG_HAVE_NET_DSA=y
|
||||
CONFIG_HAVE_OPROFILE=y
|
||||
CONFIG_HAVE_PERF_EVENTS=y
|
||||
CONFIG_HAVE_PROC_CPU=y
|
||||
CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y
|
||||
CONFIG_HAVE_SMP=y
|
||||
CONFIG_HAVE_SYSCALL_TRACEPOINTS=y
|
||||
CONFIG_HAVE_UID16=y
|
||||
CONFIG_HIGHMEM=y
|
||||
# CONFIG_HIGHPTE is not set
|
||||
CONFIG_HZ_PERIODIC=y
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
CONFIG_IRQCHIP=y
|
||||
CONFIG_IRQ_DOMAIN=y
|
||||
CONFIG_IRQ_DOMAIN_DEBUG=y
|
||||
CONFIG_IRQ_WORK=y
|
||||
CONFIG_ISO9660_FS=y
|
||||
CONFIG_JBD=y
|
||||
CONFIG_KTIME_SCALAR=y
|
||||
CONFIG_LEDS_TRIGGER_HEARTBEAT=y
|
||||
CONFIG_LOCAL_TIMERS=y
|
||||
CONFIG_LOG_BUF_SHIFT=14
|
||||
CONFIG_M25PXX_USE_FAST_READ=y
|
||||
CONFIG_MACH_ARMADA_370=y
|
||||
CONFIG_MACH_ARMADA_370_XP=y
|
||||
CONFIG_MACH_ARMADA_XP=y
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_MARVELL_PHY=y
|
||||
CONFIG_MDIO_BOARDINFO=y
|
||||
CONFIG_MEMORY=y
|
||||
CONFIG_MIGHT_HAVE_PCI=y
|
||||
CONFIG_MODULES_USE_ELF_REL=y
|
||||
CONFIG_MSDOS_FS=y
|
||||
CONFIG_MTD_CFI_STAA=y
|
||||
CONFIG_MTD_M25P80=y
|
||||
CONFIG_MTD_NAND=y
|
||||
CONFIG_MTD_NAND_ECC=y
|
||||
CONFIG_MTD_NAND_PXA3xx=y
|
||||
CONFIG_MTD_OF_PARTS=y
|
||||
CONFIG_MTD_PHYSMAP_OF=y
|
||||
# CONFIG_MTD_SM_COMMON is not set
|
||||
CONFIG_MULTI_IRQ_HANDLER=y
|
||||
CONFIG_MUTEX_SPIN_ON_OWNER=y
|
||||
CONFIG_MVEBU_CLK_CORE=y
|
||||
CONFIG_MVEBU_CLK_COREDIV=y
|
||||
CONFIG_MVEBU_CLK_CPU=y
|
||||
CONFIG_MVEBU_CLK_GATING=y
|
||||
CONFIG_MVEBU_DEVBUS=y
|
||||
CONFIG_MVEBU_MBUS=y
|
||||
CONFIG_MVMDIO=y
|
||||
CONFIG_MVNETA=y
|
||||
CONFIG_MV_XOR=y
|
||||
CONFIG_NEED_DMA_MAP_STATE=y
|
||||
# CONFIG_NEON is not set
|
||||
CONFIG_NLS=y
|
||||
CONFIG_NLS_CODEPAGE_437=y
|
||||
CONFIG_NLS_CODEPAGE_850=y
|
||||
CONFIG_NLS_ISO8859_1=y
|
||||
CONFIG_NLS_ISO8859_2=y
|
||||
CONFIG_NLS_UTF8=y
|
||||
CONFIG_NR_CPUS=4
|
||||
CONFIG_OF=y
|
||||
CONFIG_OF_ADDRESS=y
|
||||
CONFIG_OF_DEVICE=y
|
||||
CONFIG_OF_EARLY_FLATTREE=y
|
||||
CONFIG_OF_FLATTREE=y
|
||||
CONFIG_OF_GPIO=y
|
||||
CONFIG_OF_IRQ=y
|
||||
CONFIG_OF_MDIO=y
|
||||
CONFIG_OF_MTD=y
|
||||
CONFIG_OF_NET=y
|
||||
CONFIG_OF_PCI=y
|
||||
CONFIG_OF_PCI_IRQ=y
|
||||
CONFIG_OLD_SIGACTION=y
|
||||
CONFIG_OLD_SIGSUSPEND3=y
|
||||
CONFIG_OUTER_CACHE=y
|
||||
CONFIG_OUTER_CACHE_SYNC=y
|
||||
CONFIG_PAGEFLAGS_EXTENDED=y
|
||||
CONFIG_PAGE_OFFSET=0xC0000000
|
||||
CONFIG_PCI=y
|
||||
CONFIG_PCI_MSI=y
|
||||
CONFIG_PCI_MVEBU=y
|
||||
CONFIG_PERF_USE_VMALLOC=y
|
||||
CONFIG_PHYLIB=y
|
||||
CONFIG_PINCONF=y
|
||||
CONFIG_PINCTRL=y
|
||||
CONFIG_PINCTRL_ARMADA_370=y
|
||||
CONFIG_PINCTRL_ARMADA_XP=y
|
||||
CONFIG_PINCTRL_MVEBU=y
|
||||
# CONFIG_PINCTRL_SINGLE is not set
|
||||
CONFIG_PINMUX=y
|
||||
CONFIG_PJ4B_ERRATA_4742=y
|
||||
# CONFIG_PL310_ERRATA_588369 is not set
|
||||
# CONFIG_PL310_ERRATA_727915 is not set
|
||||
# CONFIG_PL310_ERRATA_753970 is not set
|
||||
# CONFIG_PL310_ERRATA_769419 is not set
|
||||
CONFIG_PLAT_ORION=y
|
||||
# CONFIG_PREEMPT_RCU is not set
|
||||
CONFIG_PROC_DEVICETREE=y
|
||||
CONFIG_RCU_STALL_COMMON=y
|
||||
CONFIG_RFS_ACCEL=y
|
||||
CONFIG_RPS=y
|
||||
CONFIG_RTC_CLASS=y
|
||||
# CONFIG_RTC_DRV_MV is not set
|
||||
CONFIG_SCHED_HRTICK=y
|
||||
# CONFIG_SCSI_DMA is not set
|
||||
CONFIG_SERIAL_8250_DW=y
|
||||
CONFIG_SMP=y
|
||||
CONFIG_SMP_ON_UP=y
|
||||
CONFIG_SPARSE_IRQ=y
|
||||
CONFIG_SPI=y
|
||||
CONFIG_SPI_MASTER=y
|
||||
CONFIG_SPI_ORION=y
|
||||
CONFIG_STOP_MACHINE=y
|
||||
# CONFIG_SWP_EMULATE is not set
|
||||
CONFIG_SYS_SUPPORTS_APM_EMULATION=y
|
||||
# CONFIG_TEGRA_HOST1X is not set
|
||||
# CONFIG_THUMB2_KERNEL is not set
|
||||
CONFIG_TICK_CPU_ACCOUNTING=y
|
||||
CONFIG_TIMER_STATS=y
|
||||
CONFIG_TREE_RCU=y
|
||||
CONFIG_UID16=y
|
||||
CONFIG_UIDGID_CONVERTED=y
|
||||
CONFIG_UNCOMPRESS_INCLUDE="debug/uncompress.h"
|
||||
CONFIG_USB_ARCH_HAS_XHCI=y
|
||||
CONFIG_USB_SUPPORT=y
|
||||
CONFIG_USE_GENERIC_SMP_HELPERS=y
|
||||
CONFIG_USE_OF=y
|
||||
CONFIG_VECTORS_BASE=0xffff0000
|
||||
CONFIG_VFAT_FS=y
|
||||
CONFIG_VFP=y
|
||||
CONFIG_VFPv3=y
|
||||
# CONFIG_XEN is not set
|
||||
CONFIG_XPS=y
|
||||
CONFIG_XZ_DEC_ARM=y
|
||||
CONFIG_XZ_DEC_BCJ=y
|
||||
CONFIG_ZBOOT_ROM_BSS=0x0
|
||||
CONFIG_ZBOOT_ROM_TEXT=0x0
|
||||
CONFIG_ZONE_DMA_FLAG=0
|
|
@ -1,28 +0,0 @@
|
|||
From 6c52eba54044791592aefd139bdc2a7b6127e981 Mon Sep 17 00:00:00 2001
|
||||
From: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Date: Wed, 17 Apr 2013 16:51:34 -0300
|
||||
Subject: [PATCH 001/203] ARM: mvebu: Add support for USB storage class in
|
||||
mvebu_defconfig
|
||||
|
||||
Some boards can have built-in USB storage class controllers so
|
||||
it's better to have this option included by default.
|
||||
|
||||
Currently this option is needed to support built-in USB MMC controller
|
||||
found in Globalscale Mirabox board.
|
||||
|
||||
Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Signed-off-by: Jason Cooper <jason@lakedaemon.net>
|
||||
---
|
||||
arch/arm/configs/mvebu_defconfig | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/arch/arm/configs/mvebu_defconfig
|
||||
+++ b/arch/arm/configs/mvebu_defconfig
|
||||
@@ -60,6 +60,7 @@ CONFIG_USB_SUPPORT=y
|
||||
CONFIG_USB=y
|
||||
CONFIG_USB_EHCI_HCD=y
|
||||
CONFIG_USB_EHCI_ROOT_HUB_TT=y
|
||||
+CONFIG_USB_STORAGE=y
|
||||
CONFIG_MMC=y
|
||||
CONFIG_MMC_MVSDIO=y
|
||||
CONFIG_NEW_LEDS=y
|
|
@ -1,133 +0,0 @@
|
|||
From cf6eb4599d60cb9fa81465aa018c71d11e19ea6a Mon Sep 17 00:00:00 2001
|
||||
From: Simon Baatz <gmbnomis@gmail.com>
|
||||
Date: Mon, 13 May 2013 23:18:58 +0200
|
||||
Subject: [PATCH 002/203] ARM: mvebu: Use standard MMC binding for all users of
|
||||
mvsdio
|
||||
|
||||
In order to prepare the switch to the standard MMC device tree parser
|
||||
for mvsdio, adapt all current uses of mvsdio in the dts files to the
|
||||
standard format.
|
||||
|
||||
Signed-off-by: Simon Baatz <gmbnomis@gmail.com>
|
||||
Signed-off-by: Jason Cooper <jason@lakedaemon.net>
|
||||
---
|
||||
arch/arm/boot/dts/armada-370-db.dts | 1 +
|
||||
arch/arm/boot/dts/armada-370-mirabox.dts | 1 +
|
||||
arch/arm/boot/dts/armada-370-rd.dts | 1 +
|
||||
arch/arm/boot/dts/armada-370-xp.dtsi | 4 ++++
|
||||
arch/arm/boot/dts/armada-xp-db.dts | 1 +
|
||||
arch/arm/boot/dts/kirkwood-dreamplug.dts | 1 +
|
||||
arch/arm/boot/dts/kirkwood-guruplug-server-plus.dts | 2 ++
|
||||
arch/arm/boot/dts/kirkwood-mplcec4.dts | 2 +-
|
||||
arch/arm/boot/dts/kirkwood-topkick.dts | 1 +
|
||||
arch/arm/boot/dts/kirkwood.dtsi | 4 ++++
|
||||
10 files changed, 17 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/arch/arm/boot/dts/armada-370-db.dts
|
||||
+++ b/arch/arm/boot/dts/armada-370-db.dts
|
||||
@@ -74,6 +74,7 @@
|
||||
*/
|
||||
status = "disabled";
|
||||
/* No CD or WP GPIOs */
|
||||
+ broken-cd;
|
||||
};
|
||||
|
||||
usb@50000 {
|
||||
--- a/arch/arm/boot/dts/armada-370-mirabox.dts
|
||||
+++ b/arch/arm/boot/dts/armada-370-mirabox.dts
|
||||
@@ -99,6 +99,7 @@
|
||||
* No CD or WP GPIOs: SDIO interface used for
|
||||
* Wifi/Bluetooth chip
|
||||
*/
|
||||
+ broken-cd;
|
||||
};
|
||||
|
||||
usb@50000 {
|
||||
--- a/arch/arm/boot/dts/armada-370-rd.dts
|
||||
+++ b/arch/arm/boot/dts/armada-370-rd.dts
|
||||
@@ -64,6 +64,7 @@
|
||||
pinctrl-names = "default";
|
||||
status = "okay";
|
||||
/* No CD or WP GPIOs */
|
||||
+ broken-cd;
|
||||
};
|
||||
|
||||
usb@50000 {
|
||||
--- a/arch/arm/boot/dts/armada-370-xp.dtsi
|
||||
+++ b/arch/arm/boot/dts/armada-370-xp.dtsi
|
||||
@@ -143,6 +143,10 @@
|
||||
reg = <0xd4000 0x200>;
|
||||
interrupts = <54>;
|
||||
clocks = <&gateclk 17>;
|
||||
+ bus-width = <4>;
|
||||
+ cap-sdio-irq;
|
||||
+ cap-sd-highspeed;
|
||||
+ cap-mmc-highspeed;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
--- a/arch/arm/boot/dts/armada-xp-db.dts
|
||||
+++ b/arch/arm/boot/dts/armada-xp-db.dts
|
||||
@@ -97,6 +97,7 @@
|
||||
pinctrl-names = "default";
|
||||
status = "okay";
|
||||
/* No CD or WP GPIOs */
|
||||
+ broken-cd;
|
||||
};
|
||||
|
||||
usb@50000 {
|
||||
--- a/arch/arm/boot/dts/kirkwood-dreamplug.dts
|
||||
+++ b/arch/arm/boot/dts/kirkwood-dreamplug.dts
|
||||
@@ -79,6 +79,7 @@
|
||||
pinctrl-names = "default";
|
||||
status = "okay";
|
||||
/* No CD or WP GPIOs */
|
||||
+ broken-cd;
|
||||
};
|
||||
};
|
||||
|
||||
--- a/arch/arm/boot/dts/kirkwood-guruplug-server-plus.dts
|
||||
+++ b/arch/arm/boot/dts/kirkwood-guruplug-server-plus.dts
|
||||
@@ -72,6 +72,8 @@
|
||||
|
||||
mvsdio@90000 {
|
||||
status = "okay";
|
||||
+ /* No CD or WP GPIOs */
|
||||
+ broken-cd;
|
||||
};
|
||||
};
|
||||
|
||||
--- a/arch/arm/boot/dts/kirkwood-mplcec4.dts
|
||||
+++ b/arch/arm/boot/dts/kirkwood-mplcec4.dts
|
||||
@@ -136,7 +136,7 @@
|
||||
pinctrl-0 = <&pmx_sdio &pmx_sdio_cd>;
|
||||
pinctrl-names = "default";
|
||||
status = "okay";
|
||||
- cd-gpios = <&gpio1 15 0>;
|
||||
+ cd-gpios = <&gpio1 15 1>;
|
||||
/* No WP GPIO */
|
||||
};
|
||||
};
|
||||
--- a/arch/arm/boot/dts/kirkwood-topkick.dts
|
||||
+++ b/arch/arm/boot/dts/kirkwood-topkick.dts
|
||||
@@ -154,6 +154,7 @@
|
||||
pinctrl-names = "default";
|
||||
status = "okay";
|
||||
/* No CD or WP GPIOs */
|
||||
+ broken-cd;
|
||||
};
|
||||
};
|
||||
|
||||
--- a/arch/arm/boot/dts/kirkwood.dtsi
|
||||
+++ b/arch/arm/boot/dts/kirkwood.dtsi
|
||||
@@ -200,6 +200,10 @@
|
||||
reg = <0x90000 0x200>;
|
||||
interrupts = <28>;
|
||||
clocks = <&gate_clk 4>;
|
||||
+ bus-width = <4>;
|
||||
+ cap-sdio-irq;
|
||||
+ cap-sd-highspeed;
|
||||
+ cap-mmc-highspeed;
|
||||
status = "disabled";
|
||||
};
|
||||
};
|
|
@ -1,71 +0,0 @@
|
|||
From 74cd8c09ae416261d7595021fc8062836dc750a2 Mon Sep 17 00:00:00 2001
|
||||
From: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Date: Fri, 17 May 2013 08:09:58 -0300
|
||||
Subject: [PATCH 003/203] ARM: mvebu: Add support for NOR flash device on
|
||||
Armada XP-DB board
|
||||
|
||||
The Armada XP Development Board (DB-78460-BP) has a NOR flash device
|
||||
connected to the Device Bus. This commit adds the device tree node
|
||||
to support this device.
|
||||
|
||||
This SoC supports a flexible and dynamic decoding window allocation
|
||||
scheme; but since this feature is still not implemented we need
|
||||
to specify the window base address in the device tree node itself.
|
||||
|
||||
This base address has been selected in a completely arbitrary fashion.
|
||||
|
||||
Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Signed-off-by: Jason Cooper <jason@lakedaemon.net>
|
||||
---
|
||||
arch/arm/boot/dts/armada-xp-db.dts | 32 ++++++++++++++++++++++++++++++++
|
||||
1 file changed, 32 insertions(+)
|
||||
|
||||
--- a/arch/arm/boot/dts/armada-xp-db.dts
|
||||
+++ b/arch/arm/boot/dts/armada-xp-db.dts
|
||||
@@ -30,6 +30,9 @@
|
||||
};
|
||||
|
||||
soc {
|
||||
+ ranges = <0 0 0xd0000000 0x100000 /* Internal registers 1MiB */
|
||||
+ 0xf0000000 0 0xf0000000 0x1000000>; /* Device Bus, NOR 16MiB */
|
||||
+
|
||||
internal-regs {
|
||||
serial@12000 {
|
||||
clock-frequency = <250000000>;
|
||||
@@ -156,6 +159,35 @@
|
||||
status = "okay";
|
||||
};
|
||||
};
|
||||
+
|
||||
+ devbus-bootcs@10400 {
|
||||
+ status = "okay";
|
||||
+ ranges = <0 0xf0000000 0x1000000>;
|
||||
+
|
||||
+ /* Device Bus parameters are required */
|
||||
+
|
||||
+ /* Read parameters */
|
||||
+ devbus,bus-width = <8>;
|
||||
+ devbus,turn-off-ps = <60000>;
|
||||
+ devbus,badr-skew-ps = <0>;
|
||||
+ devbus,acc-first-ps = <124000>;
|
||||
+ devbus,acc-next-ps = <248000>;
|
||||
+ devbus,rd-setup-ps = <0>;
|
||||
+ devbus,rd-hold-ps = <0>;
|
||||
+
|
||||
+ /* Write parameters */
|
||||
+ devbus,sync-enable = <0>;
|
||||
+ devbus,wr-high-ps = <60000>;
|
||||
+ devbus,wr-low-ps = <60000>;
|
||||
+ devbus,ale-wr-ps = <60000>;
|
||||
+
|
||||
+ /* NOR 16 MiB */
|
||||
+ nor@0 {
|
||||
+ compatible = "cfi-flash";
|
||||
+ reg = <0 0x1000000>;
|
||||
+ bank-width = <2>;
|
||||
+ };
|
||||
+ };
|
||||
};
|
||||
};
|
||||
};
|
|
@ -1,196 +0,0 @@
|
|||
From 7d375772a601bdf227902454705e402fc65b8bdf Mon Sep 17 00:00:00 2001
|
||||
From: Andrew Murray <Andrew.Murray@arm.com>
|
||||
Date: Tue, 7 May 2013 16:31:12 +0100
|
||||
Subject: [PATCH 004/203] of/pci: Provide support for parsing PCI DT ranges
|
||||
property
|
||||
|
||||
This patch factors out common implementation patterns to reduce overall kernel
|
||||
code and provide a means for host bridge drivers to directly obtain struct
|
||||
resources from the DT's ranges property without relying on architecture specific
|
||||
DT handling. This will make it easier to write archiecture independent host bridge
|
||||
drivers and mitigate against further duplication of DT parsing code.
|
||||
|
||||
This patch can be used in the following way:
|
||||
|
||||
struct of_pci_range_parser parser;
|
||||
struct of_pci_range range;
|
||||
|
||||
if (of_pci_range_parser_init(&parser, np))
|
||||
; //no ranges property
|
||||
|
||||
for_each_of_pci_range(&parser, &range) {
|
||||
|
||||
/*
|
||||
directly access properties of the address range, e.g.:
|
||||
range.pci_space, range.pci_addr, range.cpu_addr,
|
||||
range.size, range.flags
|
||||
|
||||
alternatively obtain a struct resource, e.g.:
|
||||
struct resource res;
|
||||
of_pci_range_to_resource(&range, np, &res);
|
||||
*/
|
||||
}
|
||||
|
||||
Additionally the implementation takes care of adjacent ranges and merges them
|
||||
into a single range (as was the case with powerpc and microblaze).
|
||||
|
||||
Signed-off-by: Andrew Murray <Andrew.Murray@arm.com>
|
||||
Signed-off-by: Liviu Dudau <Liviu.Dudau@arm.com>
|
||||
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Reviewed-by: Rob Herring <rob.herring@calxeda.com>
|
||||
Tested-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Tested-by: Linus Walleij <linus.walleij@linaro.org>
|
||||
Tested-by: Jingoo Han <jg1.han@samsung.com>
|
||||
Acked-by: Grant Likely <grant.likely@secretlab.ca>
|
||||
---
|
||||
drivers/of/address.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++
|
||||
include/linux/of_address.h | 48 +++++++++++++++++++++++++++++++++
|
||||
2 files changed, 115 insertions(+)
|
||||
|
||||
--- a/drivers/of/address.c
|
||||
+++ b/drivers/of/address.c
|
||||
@@ -224,6 +224,73 @@ int of_pci_address_to_resource(struct de
|
||||
return __of_address_to_resource(dev, addrp, size, flags, NULL, r);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(of_pci_address_to_resource);
|
||||
+
|
||||
+int of_pci_range_parser_init(struct of_pci_range_parser *parser,
|
||||
+ struct device_node *node)
|
||||
+{
|
||||
+ const int na = 3, ns = 2;
|
||||
+ int rlen;
|
||||
+
|
||||
+ parser->node = node;
|
||||
+ parser->pna = of_n_addr_cells(node);
|
||||
+ parser->np = parser->pna + na + ns;
|
||||
+
|
||||
+ parser->range = of_get_property(node, "ranges", &rlen);
|
||||
+ if (parser->range == NULL)
|
||||
+ return -ENOENT;
|
||||
+
|
||||
+ parser->end = parser->range + rlen / sizeof(__be32);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(of_pci_range_parser_init);
|
||||
+
|
||||
+struct of_pci_range *of_pci_range_parser_one(struct of_pci_range_parser *parser,
|
||||
+ struct of_pci_range *range)
|
||||
+{
|
||||
+ const int na = 3, ns = 2;
|
||||
+
|
||||
+ if (!range)
|
||||
+ return NULL;
|
||||
+
|
||||
+ if (!parser->range || parser->range + parser->np > parser->end)
|
||||
+ return NULL;
|
||||
+
|
||||
+ range->pci_space = parser->range[0];
|
||||
+ range->flags = of_bus_pci_get_flags(parser->range);
|
||||
+ range->pci_addr = of_read_number(parser->range + 1, ns);
|
||||
+ range->cpu_addr = of_translate_address(parser->node,
|
||||
+ parser->range + na);
|
||||
+ range->size = of_read_number(parser->range + parser->pna + na, ns);
|
||||
+
|
||||
+ parser->range += parser->np;
|
||||
+
|
||||
+ /* Now consume following elements while they are contiguous */
|
||||
+ while (parser->range + parser->np <= parser->end) {
|
||||
+ u32 flags, pci_space;
|
||||
+ u64 pci_addr, cpu_addr, size;
|
||||
+
|
||||
+ pci_space = be32_to_cpup(parser->range);
|
||||
+ flags = of_bus_pci_get_flags(parser->range);
|
||||
+ pci_addr = of_read_number(parser->range + 1, ns);
|
||||
+ cpu_addr = of_translate_address(parser->node,
|
||||
+ parser->range + na);
|
||||
+ size = of_read_number(parser->range + parser->pna + na, ns);
|
||||
+
|
||||
+ if (flags != range->flags)
|
||||
+ break;
|
||||
+ if (pci_addr != range->pci_addr + range->size ||
|
||||
+ cpu_addr != range->cpu_addr + range->size)
|
||||
+ break;
|
||||
+
|
||||
+ range->size += size;
|
||||
+ parser->range += parser->np;
|
||||
+ }
|
||||
+
|
||||
+ return range;
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(of_pci_range_parser_one);
|
||||
+
|
||||
#endif /* CONFIG_PCI */
|
||||
|
||||
/*
|
||||
--- a/include/linux/of_address.h
|
||||
+++ b/include/linux/of_address.h
|
||||
@@ -4,6 +4,36 @@
|
||||
#include <linux/errno.h>
|
||||
#include <linux/of.h>
|
||||
|
||||
+struct of_pci_range_parser {
|
||||
+ struct device_node *node;
|
||||
+ const __be32 *range;
|
||||
+ const __be32 *end;
|
||||
+ int np;
|
||||
+ int pna;
|
||||
+};
|
||||
+
|
||||
+struct of_pci_range {
|
||||
+ u32 pci_space;
|
||||
+ u64 pci_addr;
|
||||
+ u64 cpu_addr;
|
||||
+ u64 size;
|
||||
+ u32 flags;
|
||||
+};
|
||||
+
|
||||
+#define for_each_of_pci_range(parser, range) \
|
||||
+ for (; of_pci_range_parser_one(parser, range);)
|
||||
+
|
||||
+static inline void of_pci_range_to_resource(struct of_pci_range *range,
|
||||
+ struct device_node *np,
|
||||
+ struct resource *res)
|
||||
+{
|
||||
+ res->flags = range->flags;
|
||||
+ res->start = range->cpu_addr;
|
||||
+ res->end = range->cpu_addr + range->size - 1;
|
||||
+ res->parent = res->child = res->sibling = NULL;
|
||||
+ res->name = np->full_name;
|
||||
+}
|
||||
+
|
||||
#ifdef CONFIG_OF_ADDRESS
|
||||
extern u64 of_translate_address(struct device_node *np, const __be32 *addr);
|
||||
extern bool of_can_translate_address(struct device_node *dev);
|
||||
@@ -27,6 +57,11 @@ static inline unsigned long pci_address_
|
||||
#define pci_address_to_pio pci_address_to_pio
|
||||
#endif
|
||||
|
||||
+extern int of_pci_range_parser_init(struct of_pci_range_parser *parser,
|
||||
+ struct device_node *node);
|
||||
+extern struct of_pci_range *of_pci_range_parser_one(
|
||||
+ struct of_pci_range_parser *parser,
|
||||
+ struct of_pci_range *range);
|
||||
#else /* CONFIG_OF_ADDRESS */
|
||||
#ifndef of_address_to_resource
|
||||
static inline int of_address_to_resource(struct device_node *dev, int index,
|
||||
@@ -53,6 +88,19 @@ static inline const __be32 *of_get_addre
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
+
|
||||
+static inline int of_pci_range_parser_init(struct of_pci_range_parser *parser,
|
||||
+ struct device_node *node)
|
||||
+{
|
||||
+ return -1;
|
||||
+}
|
||||
+
|
||||
+static inline struct of_pci_range *of_pci_range_parser_one(
|
||||
+ struct of_pci_range_parser *parser,
|
||||
+ struct of_pci_range *range)
|
||||
+{
|
||||
+ return NULL;
|
||||
+}
|
||||
#endif /* CONFIG_OF_ADDRESS */
|
||||
|
||||
|
|
@ -1,54 +0,0 @@
|
|||
From 3f368ae1994efc17b59ffd34307c76b1f642527e Mon Sep 17 00:00:00 2001
|
||||
From: Thierry Reding <thierry.reding@avionic-design.de>
|
||||
Date: Mon, 11 Feb 2013 09:22:20 +0100
|
||||
Subject: [PATCH 006/203] of/pci: Add of_pci_parse_bus_range() function
|
||||
|
||||
This function can be used to parse a bus-range property as specified by
|
||||
device nodes representing PCI bridges.
|
||||
|
||||
Signed-off-by: Thierry Reding <thierry.reding@avionic-design.de>
|
||||
---
|
||||
drivers/of/of_pci.c | 25 +++++++++++++++++++++++++
|
||||
include/linux/of_pci.h | 1 +
|
||||
2 files changed, 26 insertions(+)
|
||||
|
||||
--- a/drivers/of/of_pci.c
|
||||
+++ b/drivers/of/of_pci.c
|
||||
@@ -64,3 +64,28 @@ int of_pci_get_devfn(struct device_node
|
||||
return (be32_to_cpup(reg) >> 8) & 0xff;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(of_pci_get_devfn);
|
||||
+
|
||||
+/**
|
||||
+ * of_pci_parse_bus_range() - parse the bus-range property of a PCI device
|
||||
+ * @node: device node
|
||||
+ * @res: address to a struct resource to return the bus-range
|
||||
+ *
|
||||
+ * Returns 0 on success or a negative error-code on failure.
|
||||
+ */
|
||||
+int of_pci_parse_bus_range(struct device_node *node, struct resource *res)
|
||||
+{
|
||||
+ const __be32 *values;
|
||||
+ int len;
|
||||
+
|
||||
+ values = of_get_property(node, "bus-range", &len);
|
||||
+ if (!values || len < sizeof(*values) * 2)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ res->name = node->name;
|
||||
+ res->start = be32_to_cpup(values++);
|
||||
+ res->end = be32_to_cpup(values);
|
||||
+ res->flags = IORESOURCE_BUS;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(of_pci_parse_bus_range);
|
||||
--- a/include/linux/of_pci.h
|
||||
+++ b/include/linux/of_pci.h
|
||||
@@ -11,5 +11,6 @@ struct device_node;
|
||||
struct device_node *of_pci_find_child_device(struct device_node *parent,
|
||||
unsigned int devfn);
|
||||
int of_pci_get_devfn(struct device_node *np);
|
||||
+int of_pci_parse_bus_range(struct device_node *node, struct resource *res);
|
||||
|
||||
#endif
|
|
@ -1,30 +0,0 @@
|
|||
From f12aa05cbfb88e5541814ffa7be7e195471568bd Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Date: Fri, 7 Dec 2012 20:35:20 +0100
|
||||
Subject: [PATCH 007/203] clk: mvebu: create parent-child relation for PCIe
|
||||
clocks on Armada 370
|
||||
|
||||
The Armada 370 has two gatable clocks for each PCIe interface, and we
|
||||
want both of them to be enabled. We therefore make one of the two
|
||||
clocks a child of the other, as we did for the sataX and sataXlnk
|
||||
clocks on Armada XP.
|
||||
|
||||
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Cc: Mike Turquette <mturquette@linaro.org>
|
||||
---
|
||||
drivers/clk/mvebu/clk-gating-ctrl.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/clk/mvebu/clk-gating-ctrl.c
|
||||
+++ b/drivers/clk/mvebu/clk-gating-ctrl.c
|
||||
@@ -119,8 +119,8 @@ static const struct mvebu_soc_descr __in
|
||||
{ "pex1_en", NULL, 2 },
|
||||
{ "ge1", NULL, 3 },
|
||||
{ "ge0", NULL, 4 },
|
||||
- { "pex0", NULL, 5 },
|
||||
- { "pex1", NULL, 9 },
|
||||
+ { "pex0", "pex0_en", 5 },
|
||||
+ { "pex1", "pex1_en", 9 },
|
||||
{ "sata0", NULL, 15 },
|
||||
{ "sdio", NULL, 17 },
|
||||
{ "tdm", NULL, 25 },
|
|
@ -1,50 +0,0 @@
|
|||
From 5006da299ae65cadf92932f2f7b062b5a8c65798 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Date: Fri, 18 Jan 2013 16:42:01 +0100
|
||||
Subject: [PATCH 008/203] clk: mvebu: add more PCIe clocks for Armada XP
|
||||
|
||||
The current revision of the datasheet only mentions the gatable clocks
|
||||
for the PCIe 0.0, 0.1, 0.2 and 0.3 interfaces, and forgot to mention
|
||||
the ones for the PCIe 1.0, 1.1, 1.2, 1.3, 2.0 and 3.0
|
||||
interfaces. After confirmation with Marvell engineers, this patch adds
|
||||
the missing gatable clocks for those PCIe interfaces.
|
||||
|
||||
It also changes the name of the previously existing PCIe gatable
|
||||
clocks, in order to match the naming using the datasheets.
|
||||
|
||||
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Cc: Mike Turquette <mturquette@linaro.org>
|
||||
---
|
||||
drivers/clk/mvebu/clk-gating-ctrl.c | 14 ++++++++++----
|
||||
1 file changed, 10 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/drivers/clk/mvebu/clk-gating-ctrl.c
|
||||
+++ b/drivers/clk/mvebu/clk-gating-ctrl.c
|
||||
@@ -137,10 +137,14 @@ static const struct mvebu_soc_descr __in
|
||||
{ "ge2", NULL, 2 },
|
||||
{ "ge1", NULL, 3 },
|
||||
{ "ge0", NULL, 4 },
|
||||
- { "pex0", NULL, 5 },
|
||||
- { "pex1", NULL, 6 },
|
||||
- { "pex2", NULL, 7 },
|
||||
- { "pex3", NULL, 8 },
|
||||
+ { "pex00", NULL, 5 },
|
||||
+ { "pex01", NULL, 6 },
|
||||
+ { "pex02", NULL, 7 },
|
||||
+ { "pex03", NULL, 8 },
|
||||
+ { "pex10", NULL, 9 },
|
||||
+ { "pex11", NULL, 10 },
|
||||
+ { "pex12", NULL, 11 },
|
||||
+ { "pex13", NULL, 12 },
|
||||
{ "bp", NULL, 13 },
|
||||
{ "sata0lnk", NULL, 14 },
|
||||
{ "sata0", "sata0lnk", 15 },
|
||||
@@ -152,6 +156,8 @@ static const struct mvebu_soc_descr __in
|
||||
{ "xor0", NULL, 22 },
|
||||
{ "crypto", NULL, 23 },
|
||||
{ "tdm", NULL, 25 },
|
||||
+ { "pex20", NULL, 26 },
|
||||
+ { "pex30", NULL, 27 },
|
||||
{ "xor1", NULL, 28 },
|
||||
{ "sata1lnk", NULL, 29 },
|
||||
{ "sata1", "sata1lnk", 30 },
|
File diff suppressed because it is too large
Load diff
|
@ -1,25 +0,0 @@
|
|||
From 430d545623552ddc6b68785032cc9129d0a00b43 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Date: Fri, 7 Dec 2012 20:56:52 +0100
|
||||
Subject: [PATCH 010/203] arm: mvebu: PCIe support is now available on mvebu
|
||||
|
||||
Now that the PCIe driver for mvebu has been integrated and all its
|
||||
relevant dependencies, we can mark the ARCH_MVEBU platform has
|
||||
MIGHT_HAVE_PCI, which allows to select the PCI bus support if needed.
|
||||
|
||||
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
---
|
||||
arch/arm/mach-mvebu/Kconfig | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
--- a/arch/arm/mach-mvebu/Kconfig
|
||||
+++ b/arch/arm/mach-mvebu/Kconfig
|
||||
@@ -16,6 +16,8 @@ config ARCH_MVEBU
|
||||
select MVEBU_MBUS
|
||||
select ZONE_DMA if ARM_LPAE
|
||||
select ARCH_REQUIRE_GPIOLIB
|
||||
+ select MIGHT_HAVE_PCI
|
||||
+ select PCI_QUIRKS if PCI
|
||||
|
||||
if ARCH_MVEBU
|
||||
|
|
@ -1,36 +0,0 @@
|
|||
From c3da1bb20af37c09a07756d54420470788f131c7 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Date: Fri, 7 Dec 2012 22:49:57 +0100
|
||||
Subject: [PATCH 011/203] arm: mvebu: update defconfig with PCI and USB support
|
||||
|
||||
Now that we have the necessary drivers and Device Tree informations to
|
||||
support PCIe on Armada 370 and Armada XP, enable the CONFIG_PCI
|
||||
option.
|
||||
|
||||
Also, since the Armada 370 Mirabox has a built-in USB XHCI controller
|
||||
connected on the PCIe bus, enable the corresponding options as well.
|
||||
|
||||
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
---
|
||||
arch/arm/configs/mvebu_defconfig | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
--- a/arch/arm/configs/mvebu_defconfig
|
||||
+++ b/arch/arm/configs/mvebu_defconfig
|
||||
@@ -13,6 +13,8 @@ CONFIG_MACH_ARMADA_370=y
|
||||
CONFIG_MACH_ARMADA_XP=y
|
||||
# CONFIG_CACHE_L2X0 is not set
|
||||
# CONFIG_SWP_EMULATE is not set
|
||||
+CONFIG_PCI=y
|
||||
+CONFIG_PCI_MVEBU=y
|
||||
CONFIG_SMP=y
|
||||
CONFIG_AEABI=y
|
||||
CONFIG_HIGHMEM=y
|
||||
@@ -61,6 +63,7 @@ CONFIG_USB=y
|
||||
CONFIG_USB_EHCI_HCD=y
|
||||
CONFIG_USB_EHCI_ROOT_HUB_TT=y
|
||||
CONFIG_USB_STORAGE=y
|
||||
+CONFIG_USB_XHCI_HCD=y
|
||||
CONFIG_MMC=y
|
||||
CONFIG_MMC_MVSDIO=y
|
||||
CONFIG_NEW_LEDS=y
|
|
@ -1,40 +0,0 @@
|
|||
From f865fd0e1c10bb044d56037eaa6ac4a4a122c62a Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Date: Tue, 21 May 2013 12:33:28 +0200
|
||||
Subject: [PATCH 012/203] arm: mvebu: mark functions of armada-370-xp.c as
|
||||
static
|
||||
|
||||
All the functions in armada-370-xp.c are called from the
|
||||
DT_MACHINE_START function pointers, so there is no need for them to be
|
||||
visible outside of this file, and we therefore mark them as static.
|
||||
|
||||
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Signed-off-by: Jason Cooper <jason@lakedaemon.net>
|
||||
---
|
||||
arch/arm/mach-mvebu/armada-370-xp.c | 6 +++---
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/arch/arm/mach-mvebu/armada-370-xp.c
|
||||
+++ b/arch/arm/mach-mvebu/armada-370-xp.c
|
||||
@@ -38,18 +38,18 @@ static struct map_desc armada_370_xp_io_
|
||||
},
|
||||
};
|
||||
|
||||
-void __init armada_370_xp_map_io(void)
|
||||
+static void __init armada_370_xp_map_io(void)
|
||||
{
|
||||
iotable_init(armada_370_xp_io_desc, ARRAY_SIZE(armada_370_xp_io_desc));
|
||||
}
|
||||
|
||||
-void __init armada_370_xp_timer_and_clk_init(void)
|
||||
+static void __init armada_370_xp_timer_and_clk_init(void)
|
||||
{
|
||||
mvebu_clocks_init();
|
||||
armada_370_xp_timer_init();
|
||||
}
|
||||
|
||||
-void __init armada_370_xp_init_early(void)
|
||||
+static void __init armada_370_xp_init_early(void)
|
||||
{
|
||||
char *mbus_soc_name;
|
||||
|
|
@ -1,568 +0,0 @@
|
|||
From 8b417cc752ac4158dcfcf02beafce80b90fd827d Mon Sep 17 00:00:00 2001
|
||||
From: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Date: Tue, 23 Apr 2013 16:21:26 -0300
|
||||
Subject: [PATCH 013/203] drivers: memory: Introduce Marvell EBU Device Bus
|
||||
driver
|
||||
|
||||
Marvell EBU SoCs such as Armada 370/XP, Orion5x (88f5xxx) and
|
||||
Discovery (mv78xx0) supports a Device Bus controller to access several
|
||||
kinds of memories and I/O devices (NOR, NAND, SRAM, FPGA).
|
||||
|
||||
This commit adds a driver to handle this controller. So far only
|
||||
Armada 370, Armada XP and Discovery SoCs are supported.
|
||||
|
||||
The driver must be registered through a device tree node;
|
||||
as explained in the binding document.
|
||||
|
||||
For each child node in the device tree, this driver will:
|
||||
* set timing parameters
|
||||
* register a child device
|
||||
* setup an address decoding window, using the mbus driver
|
||||
|
||||
Keep in mind the address decoding window setup is only a temporary hack.
|
||||
This code will be removed from this devbus driver as soon as a proper device
|
||||
tree binding for the mbus driver is added.
|
||||
|
||||
Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Acked-by: Arnd Bergmann <arnd@arndb.de>
|
||||
Acked-by: Jason Cooper <jason@lakedaemon.net>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
.../bindings/memory-controllers/mvebu-devbus.txt | 156 ++++++++++
|
||||
drivers/memory/Kconfig | 10 +
|
||||
drivers/memory/Makefile | 1 +
|
||||
drivers/memory/mvebu-devbus.c | 340 +++++++++++++++++++++
|
||||
4 files changed, 507 insertions(+)
|
||||
create mode 100644 Documentation/devicetree/bindings/memory-controllers/mvebu-devbus.txt
|
||||
create mode 100644 drivers/memory/mvebu-devbus.c
|
||||
|
||||
--- /dev/null
|
||||
+++ b/Documentation/devicetree/bindings/memory-controllers/mvebu-devbus.txt
|
||||
@@ -0,0 +1,156 @@
|
||||
+Device tree bindings for MVEBU Device Bus controllers
|
||||
+
|
||||
+The Device Bus controller available in some Marvell's SoC allows to control
|
||||
+different types of standard memory and I/O devices such as NOR, NAND, and FPGA.
|
||||
+The actual devices are instantiated from the child nodes of a Device Bus node.
|
||||
+
|
||||
+Required properties:
|
||||
+
|
||||
+ - compatible: Currently only Armada 370/XP SoC are supported,
|
||||
+ with this compatible string:
|
||||
+
|
||||
+ marvell,mvebu-devbus
|
||||
+
|
||||
+ - reg: A resource specifier for the register space.
|
||||
+ This is the base address of a chip select within
|
||||
+ the controller's register space.
|
||||
+ (see the example below)
|
||||
+
|
||||
+ - #address-cells: Must be set to 1
|
||||
+ - #size-cells: Must be set to 1
|
||||
+ - ranges: Must be set up to reflect the memory layout with four
|
||||
+ integer values for each chip-select line in use:
|
||||
+ 0 <physical address of mapping> <size>
|
||||
+
|
||||
+Mandatory timing properties for child nodes:
|
||||
+
|
||||
+Read parameters:
|
||||
+
|
||||
+ - devbus,turn-off-ps: Defines the time during which the controller does not
|
||||
+ drive the AD bus after the completion of a device read.
|
||||
+ This prevents contentions on the Device Bus after a read
|
||||
+ cycle from a slow device.
|
||||
+
|
||||
+ - devbus,bus-width: Defines the bus width (e.g. <16>)
|
||||
+
|
||||
+ - devbus,badr-skew-ps: Defines the time delay from from A[2:0] toggle,
|
||||
+ to read data sample. This parameter is useful for
|
||||
+ synchronous pipelined devices, where the address
|
||||
+ precedes the read data by one or two cycles.
|
||||
+
|
||||
+ - devbus,acc-first-ps: Defines the time delay from the negation of
|
||||
+ ALE[0] to the cycle that the first read data is sampled
|
||||
+ by the controller.
|
||||
+
|
||||
+ - devbus,acc-next-ps: Defines the time delay between the cycle that
|
||||
+ samples data N and the cycle that samples data N+1
|
||||
+ (in burst accesses).
|
||||
+
|
||||
+ - devbus,rd-setup-ps: Defines the time delay between DEV_CSn assertion to
|
||||
+ DEV_OEn assertion. If set to 0 (default),
|
||||
+ DEV_OEn and DEV_CSn are asserted at the same cycle.
|
||||
+ This parameter has no affect on <acc-first-ps> parameter
|
||||
+ (no affect on first data sample). Set <rd-setup-ps>
|
||||
+ to a value smaller than <acc-first-ps>.
|
||||
+
|
||||
+ - devbus,rd-hold-ps: Defines the time between the last data sample to the
|
||||
+ de-assertion of DEV_CSn. If set to 0 (default),
|
||||
+ DEV_OEn and DEV_CSn are de-asserted at the same cycle
|
||||
+ (the cycle of the last data sample).
|
||||
+ This parameter has no affect on DEV_OEn de-assertion.
|
||||
+ DEV_OEn is always de-asserted the next cycle after
|
||||
+ last data sampled. Also this parameter has no
|
||||
+ affect on <turn-off-ps> parameter.
|
||||
+ Set <rd-hold-ps> to a value smaller than <turn-off-ps>.
|
||||
+
|
||||
+Write parameters:
|
||||
+
|
||||
+ - devbus,ale-wr-ps: Defines the time delay from the ALE[0] negation cycle
|
||||
+ to the DEV_WEn assertion.
|
||||
+
|
||||
+ - devbus,wr-low-ps: Defines the time during which DEV_WEn is active.
|
||||
+ A[2:0] and Data are kept valid as long as DEV_WEn
|
||||
+ is active. This parameter defines the setup time of
|
||||
+ address and data to DEV_WEn rise.
|
||||
+
|
||||
+ - devbus,wr-high-ps: Defines the time during which DEV_WEn is kept
|
||||
+ inactive (high) between data beats of a burst write.
|
||||
+ DEV_A[2:0] and Data are kept valid (do not toggle) for
|
||||
+ <wr-high-ps> - <tick> ps.
|
||||
+ This parameter defines the hold time of address and
|
||||
+ data after DEV_WEn rise.
|
||||
+
|
||||
+ - devbus,sync-enable: Synchronous device enable.
|
||||
+ 1: True
|
||||
+ 0: False
|
||||
+
|
||||
+An example for an Armada XP GP board, with a 16 MiB NOR device as child
|
||||
+is showed below. Note that the Device Bus driver is in charge of allocating
|
||||
+the mbus address decoding window for each of its child devices.
|
||||
+The window is created using the chip select specified in the child
|
||||
+device node together with the base address and size specified in the ranges
|
||||
+property. For instance, in the example below the allocated decoding window
|
||||
+will start at base address 0xf0000000, with a size 0x1000000 (16 MiB)
|
||||
+for chip select 0 (a.k.a DEV_BOOTCS).
|
||||
+
|
||||
+This address window handling is done in this mvebu-devbus only as a temporary
|
||||
+solution. It will be removed when the support for mbus device tree binding is
|
||||
+added.
|
||||
+
|
||||
+The reg property implicitly specifies the chip select as this:
|
||||
+
|
||||
+ 0x10400: DEV_BOOTCS
|
||||
+ 0x10408: DEV_CS0
|
||||
+ 0x10410: DEV_CS1
|
||||
+ 0x10418: DEV_CS2
|
||||
+ 0x10420: DEV_CS3
|
||||
+
|
||||
+Example:
|
||||
+
|
||||
+ devbus-bootcs@d0010400 {
|
||||
+ status = "okay";
|
||||
+ ranges = <0 0xf0000000 0x1000000>; /* @addr 0xf0000000, size 0x1000000 */
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+
|
||||
+ /* Device Bus parameters are required */
|
||||
+
|
||||
+ /* Read parameters */
|
||||
+ devbus,bus-width = <8>;
|
||||
+ devbus,turn-off-ps = <60000>;
|
||||
+ devbus,badr-skew-ps = <0>;
|
||||
+ devbus,acc-first-ps = <124000>;
|
||||
+ devbus,acc-next-ps = <248000>;
|
||||
+ devbus,rd-setup-ps = <0>;
|
||||
+ devbus,rd-hold-ps = <0>;
|
||||
+
|
||||
+ /* Write parameters */
|
||||
+ devbus,sync-enable = <0>;
|
||||
+ devbus,wr-high-ps = <60000>;
|
||||
+ devbus,wr-low-ps = <60000>;
|
||||
+ devbus,ale-wr-ps = <60000>;
|
||||
+
|
||||
+ flash@0 {
|
||||
+ compatible = "cfi-flash";
|
||||
+
|
||||
+ /* 16 MiB */
|
||||
+ reg = <0 0x1000000>;
|
||||
+ bank-width = <2>;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+
|
||||
+ /*
|
||||
+ * We split the 16 MiB in two partitions,
|
||||
+ * just as an example.
|
||||
+ */
|
||||
+ partition@0 {
|
||||
+ label = "First";
|
||||
+ reg = <0 0x800000>;
|
||||
+ };
|
||||
+
|
||||
+ partition@800000 {
|
||||
+ label = "Second";
|
||||
+ reg = <0x800000 0x800000>;
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
--- a/drivers/memory/Kconfig
|
||||
+++ b/drivers/memory/Kconfig
|
||||
@@ -20,6 +20,16 @@ config TI_EMIF
|
||||
parameters and other settings during frequency, voltage and
|
||||
temperature changes
|
||||
|
||||
+config MVEBU_DEVBUS
|
||||
+ bool "Marvell EBU Device Bus Controller"
|
||||
+ default y
|
||||
+ depends on PLAT_ORION && OF
|
||||
+ help
|
||||
+ This driver is for the Device Bus controller available in some
|
||||
+ Marvell EBU SoCs such as Discovery (mv78xx0), Orion (88f5xxx) and
|
||||
+ Armada 370 and Armada XP. This controller allows to handle flash
|
||||
+ devices such as NOR, NAND, SRAM, and FPGA.
|
||||
+
|
||||
config TEGRA20_MC
|
||||
bool "Tegra20 Memory Controller(MC) driver"
|
||||
default y
|
||||
--- a/drivers/memory/Makefile
|
||||
+++ b/drivers/memory/Makefile
|
||||
@@ -6,5 +6,6 @@ ifeq ($(CONFIG_DDR),y)
|
||||
obj-$(CONFIG_OF) += of_memory.o
|
||||
endif
|
||||
obj-$(CONFIG_TI_EMIF) += emif.o
|
||||
+obj-$(CONFIG_MVEBU_DEVBUS) += mvebu-devbus.o
|
||||
obj-$(CONFIG_TEGRA20_MC) += tegra20-mc.o
|
||||
obj-$(CONFIG_TEGRA30_MC) += tegra30-mc.o
|
||||
--- /dev/null
|
||||
+++ b/drivers/memory/mvebu-devbus.c
|
||||
@@ -0,0 +1,340 @@
|
||||
+/*
|
||||
+ * Marvell EBU SoC Device Bus Controller
|
||||
+ * (memory controller for NOR/NAND/SRAM/FPGA devices)
|
||||
+ *
|
||||
+ * Copyright (C) 2013 Marvell
|
||||
+ *
|
||||
+ * This program is free software: you can redistribute it and/or modify
|
||||
+ * it under the terms of the GNU General Public License as published by
|
||||
+ * the Free Software Foundation version 2 of the License.
|
||||
+ *
|
||||
+ * This program 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.
|
||||
+ *
|
||||
+ * You should have received a copy of the GNU General Public License
|
||||
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
+ *
|
||||
+ */
|
||||
+
|
||||
+#include <linux/kernel.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/slab.h>
|
||||
+#include <linux/err.h>
|
||||
+#include <linux/io.h>
|
||||
+#include <linux/clk.h>
|
||||
+#include <linux/mbus.h>
|
||||
+#include <linux/of_platform.h>
|
||||
+#include <linux/of_address.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+
|
||||
+/* Register definitions */
|
||||
+#define DEV_WIDTH_BIT 30
|
||||
+#define BADR_SKEW_BIT 28
|
||||
+#define RD_HOLD_BIT 23
|
||||
+#define ACC_NEXT_BIT 17
|
||||
+#define RD_SETUP_BIT 12
|
||||
+#define ACC_FIRST_BIT 6
|
||||
+
|
||||
+#define SYNC_ENABLE_BIT 24
|
||||
+#define WR_HIGH_BIT 16
|
||||
+#define WR_LOW_BIT 8
|
||||
+
|
||||
+#define READ_PARAM_OFFSET 0x0
|
||||
+#define WRITE_PARAM_OFFSET 0x4
|
||||
+
|
||||
+static const char * const devbus_wins[] = {
|
||||
+ "devbus-boot",
|
||||
+ "devbus-cs0",
|
||||
+ "devbus-cs1",
|
||||
+ "devbus-cs2",
|
||||
+ "devbus-cs3",
|
||||
+};
|
||||
+
|
||||
+struct devbus_read_params {
|
||||
+ u32 bus_width;
|
||||
+ u32 badr_skew;
|
||||
+ u32 turn_off;
|
||||
+ u32 acc_first;
|
||||
+ u32 acc_next;
|
||||
+ u32 rd_setup;
|
||||
+ u32 rd_hold;
|
||||
+};
|
||||
+
|
||||
+struct devbus_write_params {
|
||||
+ u32 sync_enable;
|
||||
+ u32 wr_high;
|
||||
+ u32 wr_low;
|
||||
+ u32 ale_wr;
|
||||
+};
|
||||
+
|
||||
+struct devbus {
|
||||
+ struct device *dev;
|
||||
+ void __iomem *base;
|
||||
+ unsigned long tick_ps;
|
||||
+};
|
||||
+
|
||||
+static int get_timing_param_ps(struct devbus *devbus,
|
||||
+ struct device_node *node,
|
||||
+ const char *name,
|
||||
+ u32 *ticks)
|
||||
+{
|
||||
+ u32 time_ps;
|
||||
+ int err;
|
||||
+
|
||||
+ err = of_property_read_u32(node, name, &time_ps);
|
||||
+ if (err < 0) {
|
||||
+ dev_err(devbus->dev, "%s has no '%s' property\n",
|
||||
+ name, node->full_name);
|
||||
+ return err;
|
||||
+ }
|
||||
+
|
||||
+ *ticks = (time_ps + devbus->tick_ps - 1) / devbus->tick_ps;
|
||||
+
|
||||
+ dev_dbg(devbus->dev, "%s: %u ps -> 0x%x\n",
|
||||
+ name, time_ps, *ticks);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int devbus_set_timing_params(struct devbus *devbus,
|
||||
+ struct device_node *node)
|
||||
+{
|
||||
+ struct devbus_read_params r;
|
||||
+ struct devbus_write_params w;
|
||||
+ u32 value;
|
||||
+ int err;
|
||||
+
|
||||
+ dev_dbg(devbus->dev, "Setting timing parameter, tick is %lu ps\n",
|
||||
+ devbus->tick_ps);
|
||||
+
|
||||
+ /* Get read timings */
|
||||
+ err = of_property_read_u32(node, "devbus,bus-width", &r.bus_width);
|
||||
+ if (err < 0) {
|
||||
+ dev_err(devbus->dev,
|
||||
+ "%s has no 'devbus,bus-width' property\n",
|
||||
+ node->full_name);
|
||||
+ return err;
|
||||
+ }
|
||||
+ /* Convert bit width to byte width */
|
||||
+ r.bus_width /= 8;
|
||||
+
|
||||
+ err = get_timing_param_ps(devbus, node, "devbus,badr-skew-ps",
|
||||
+ &r.badr_skew);
|
||||
+ if (err < 0)
|
||||
+ return err;
|
||||
+
|
||||
+ err = get_timing_param_ps(devbus, node, "devbus,turn-off-ps",
|
||||
+ &r.turn_off);
|
||||
+ if (err < 0)
|
||||
+ return err;
|
||||
+
|
||||
+ err = get_timing_param_ps(devbus, node, "devbus,acc-first-ps",
|
||||
+ &r.acc_first);
|
||||
+ if (err < 0)
|
||||
+ return err;
|
||||
+
|
||||
+ err = get_timing_param_ps(devbus, node, "devbus,acc-next-ps",
|
||||
+ &r.acc_next);
|
||||
+ if (err < 0)
|
||||
+ return err;
|
||||
+
|
||||
+ err = get_timing_param_ps(devbus, node, "devbus,rd-setup-ps",
|
||||
+ &r.rd_setup);
|
||||
+ if (err < 0)
|
||||
+ return err;
|
||||
+
|
||||
+ err = get_timing_param_ps(devbus, node, "devbus,rd-hold-ps",
|
||||
+ &r.rd_hold);
|
||||
+ if (err < 0)
|
||||
+ return err;
|
||||
+
|
||||
+ /* Get write timings */
|
||||
+ err = of_property_read_u32(node, "devbus,sync-enable",
|
||||
+ &w.sync_enable);
|
||||
+ if (err < 0) {
|
||||
+ dev_err(devbus->dev,
|
||||
+ "%s has no 'devbus,sync-enable' property\n",
|
||||
+ node->full_name);
|
||||
+ return err;
|
||||
+ }
|
||||
+
|
||||
+ err = get_timing_param_ps(devbus, node, "devbus,ale-wr-ps",
|
||||
+ &w.ale_wr);
|
||||
+ if (err < 0)
|
||||
+ return err;
|
||||
+
|
||||
+ err = get_timing_param_ps(devbus, node, "devbus,wr-low-ps",
|
||||
+ &w.wr_low);
|
||||
+ if (err < 0)
|
||||
+ return err;
|
||||
+
|
||||
+ err = get_timing_param_ps(devbus, node, "devbus,wr-high-ps",
|
||||
+ &w.wr_high);
|
||||
+ if (err < 0)
|
||||
+ return err;
|
||||
+
|
||||
+ /* Set read timings */
|
||||
+ value = r.bus_width << DEV_WIDTH_BIT |
|
||||
+ r.badr_skew << BADR_SKEW_BIT |
|
||||
+ r.rd_hold << RD_HOLD_BIT |
|
||||
+ r.acc_next << ACC_NEXT_BIT |
|
||||
+ r.rd_setup << RD_SETUP_BIT |
|
||||
+ r.acc_first << ACC_FIRST_BIT |
|
||||
+ r.turn_off;
|
||||
+
|
||||
+ dev_dbg(devbus->dev, "read parameters register 0x%p = 0x%x\n",
|
||||
+ devbus->base + READ_PARAM_OFFSET,
|
||||
+ value);
|
||||
+
|
||||
+ writel(value, devbus->base + READ_PARAM_OFFSET);
|
||||
+
|
||||
+ /* Set write timings */
|
||||
+ value = w.sync_enable << SYNC_ENABLE_BIT |
|
||||
+ w.wr_low << WR_LOW_BIT |
|
||||
+ w.wr_high << WR_HIGH_BIT |
|
||||
+ w.ale_wr;
|
||||
+
|
||||
+ dev_dbg(devbus->dev, "write parameters register: 0x%p = 0x%x\n",
|
||||
+ devbus->base + WRITE_PARAM_OFFSET,
|
||||
+ value);
|
||||
+
|
||||
+ writel(value, devbus->base + WRITE_PARAM_OFFSET);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int mvebu_devbus_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct device *dev = &pdev->dev;
|
||||
+ struct device_node *node = pdev->dev.of_node;
|
||||
+ struct device_node *parent;
|
||||
+ struct devbus *devbus;
|
||||
+ struct resource *res;
|
||||
+ struct clk *clk;
|
||||
+ unsigned long rate;
|
||||
+ const __be32 *ranges;
|
||||
+ int err, cs;
|
||||
+ int addr_cells, p_addr_cells, size_cells;
|
||||
+ int ranges_len, tuple_len;
|
||||
+ u32 base, size;
|
||||
+
|
||||
+ devbus = devm_kzalloc(&pdev->dev, sizeof(struct devbus), GFP_KERNEL);
|
||||
+ if (!devbus)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ devbus->dev = dev;
|
||||
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
+ devbus->base = devm_ioremap_resource(&pdev->dev, res);
|
||||
+ if (IS_ERR(devbus->base))
|
||||
+ return PTR_ERR(devbus->base);
|
||||
+
|
||||
+ clk = devm_clk_get(&pdev->dev, NULL);
|
||||
+ if (IS_ERR(clk))
|
||||
+ return PTR_ERR(clk);
|
||||
+ clk_prepare_enable(clk);
|
||||
+
|
||||
+ /*
|
||||
+ * Obtain clock period in picoseconds,
|
||||
+ * we need this in order to convert timing
|
||||
+ * parameters from cycles to picoseconds.
|
||||
+ */
|
||||
+ rate = clk_get_rate(clk) / 1000;
|
||||
+ devbus->tick_ps = 1000000000 / rate;
|
||||
+
|
||||
+ /* Read the device tree node and set the new timing parameters */
|
||||
+ err = devbus_set_timing_params(devbus, node);
|
||||
+ if (err < 0)
|
||||
+ return err;
|
||||
+
|
||||
+ /*
|
||||
+ * Allocate an address window for this device.
|
||||
+ * If the device probing fails, then we won't be able to
|
||||
+ * remove the allocated address decoding window.
|
||||
+ *
|
||||
+ * FIXME: This is only a temporary hack! We need to do this here
|
||||
+ * because we still don't have device tree bindings for mbus.
|
||||
+ * Once that support is added, we will declare these address windows
|
||||
+ * statically in the device tree, and remove the window configuration
|
||||
+ * from here.
|
||||
+ */
|
||||
+
|
||||
+ /*
|
||||
+ * Get the CS to choose the window string.
|
||||
+ * This is a bit hacky, but it will be removed once the
|
||||
+ * address windows are declared in the device tree.
|
||||
+ */
|
||||
+ cs = (((unsigned long)devbus->base) % 0x400) / 8;
|
||||
+
|
||||
+ /*
|
||||
+ * Parse 'ranges' property to obtain a (base,size) window tuple.
|
||||
+ * This will be removed once the address windows
|
||||
+ * are declared in the device tree.
|
||||
+ */
|
||||
+ parent = of_get_parent(node);
|
||||
+ if (!parent)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ p_addr_cells = of_n_addr_cells(parent);
|
||||
+ of_node_put(parent);
|
||||
+
|
||||
+ addr_cells = of_n_addr_cells(node);
|
||||
+ size_cells = of_n_size_cells(node);
|
||||
+ tuple_len = (p_addr_cells + addr_cells + size_cells) * sizeof(__be32);
|
||||
+
|
||||
+ ranges = of_get_property(node, "ranges", &ranges_len);
|
||||
+ if (ranges == NULL || ranges_len != tuple_len)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ base = of_translate_address(node, ranges + addr_cells);
|
||||
+ if (base == OF_BAD_ADDR)
|
||||
+ return -EINVAL;
|
||||
+ size = of_read_number(ranges + addr_cells + p_addr_cells, size_cells);
|
||||
+
|
||||
+ /*
|
||||
+ * Create an mbus address windows.
|
||||
+ * FIXME: Remove this, together with the above code, once the
|
||||
+ * address windows are declared in the device tree.
|
||||
+ */
|
||||
+ err = mvebu_mbus_add_window(devbus_wins[cs], base, size);
|
||||
+ if (err < 0)
|
||||
+ return err;
|
||||
+
|
||||
+ /*
|
||||
+ * We need to create a child device explicitly from here to
|
||||
+ * guarantee that the child will be probed after the timing
|
||||
+ * parameters for the bus are written.
|
||||
+ */
|
||||
+ err = of_platform_populate(node, NULL, NULL, dev);
|
||||
+ if (err < 0) {
|
||||
+ mvebu_mbus_del_window(base, size);
|
||||
+ return err;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static const struct of_device_id mvebu_devbus_of_match[] = {
|
||||
+ { .compatible = "marvell,mvebu-devbus" },
|
||||
+ {},
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(of, mvebu_devbus_of_match);
|
||||
+
|
||||
+static struct platform_driver mvebu_devbus_driver = {
|
||||
+ .probe = mvebu_devbus_probe,
|
||||
+ .driver = {
|
||||
+ .name = "mvebu-devbus",
|
||||
+ .owner = THIS_MODULE,
|
||||
+ .of_match_table = mvebu_devbus_of_match,
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+static int __init mvebu_devbus_init(void)
|
||||
+{
|
||||
+ return platform_driver_register(&mvebu_devbus_driver);
|
||||
+}
|
||||
+module_init(mvebu_devbus_init);
|
||||
+
|
||||
+MODULE_LICENSE("GPL v2");
|
||||
+MODULE_AUTHOR("Ezequiel Garcia <ezequiel.garcia@free-electrons.com>");
|
||||
+MODULE_DESCRIPTION("Marvell EBU SoC Device Bus controller");
|
|
@ -1,35 +0,0 @@
|
|||
From 348fc73a301b88ec3f2da8c1f02858c75e79455e Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Date: Tue, 21 May 2013 19:53:09 +0200
|
||||
Subject: [PATCH 014/203] arm: mvebu: enable two USB interfaces on the Armada
|
||||
XP GP board
|
||||
|
||||
The Armada XP GP board has two USB slots: one on the front side and
|
||||
one on the back side. This commit enables the two USB host controllers
|
||||
that correspond to those wo USB slots.
|
||||
|
||||
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Signed-off-by: Jason Cooper <jason@lakedaemon.net>
|
||||
---
|
||||
arch/arm/boot/dts/armada-xp-gp.dts | 10 ++++++++++
|
||||
1 file changed, 10 insertions(+)
|
||||
|
||||
--- a/arch/arm/boot/dts/armada-xp-gp.dts
|
||||
+++ b/arch/arm/boot/dts/armada-xp-gp.dts
|
||||
@@ -105,6 +105,16 @@
|
||||
phy-mode = "rgmii-id";
|
||||
};
|
||||
|
||||
+ /* Front-side USB slot */
|
||||
+ usb@50000 {
|
||||
+ status = "okay";
|
||||
+ };
|
||||
+
|
||||
+ /* Back-side USB slot */
|
||||
+ usb@51000 {
|
||||
+ status = "okay";
|
||||
+ };
|
||||
+
|
||||
spi0: spi@10600 {
|
||||
status = "okay";
|
||||
|
|
@ -1,97 +0,0 @@
|
|||
From 34361044442206dd7d10ff3309f8e0713e0fd856 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Date: Thu, 23 May 2013 16:32:51 +0200
|
||||
Subject: [PATCH 015/203] pci: mvebu: no longer fake the slot location of
|
||||
downstream devices
|
||||
|
||||
By default, the Marvell hardware, for each PCIe interface, exhibits
|
||||
the following devices:
|
||||
|
||||
* On slot 0, a "Marvell Memory controller", identical on all PCIe
|
||||
interfaces, and which isn't useful when the Marvell SoC is the PCIe
|
||||
root complex (i.e, the normal case when we run Linux on the Marvell
|
||||
SoC).
|
||||
|
||||
* On slot 1, the real PCIe card connected into the PCIe slot of the
|
||||
board.
|
||||
|
||||
So, what the Marvell PCIe driver was doing in its PCI-to-PCI bridge
|
||||
emulation is that when the Linux PCI core was trying to access the
|
||||
device in slot 0, we were in fact forwarding the configuration
|
||||
transaction to the device in slot 1. For all other slots, we were
|
||||
telling the Linux PCI core that there was no device connected.
|
||||
|
||||
However, new versions of bootloaders from Marvell change the default
|
||||
PCIe configuration, and make the real device appear in slot 0, and the
|
||||
"Marvell Memory controller" in slot 1.
|
||||
|
||||
Therefore, this commit modifies the Marvell PCIe driver to adjust the
|
||||
PCIe hardware configuration to make sure that this behavior (real
|
||||
device in slot 0, "Marvell Memory controller" in slot 1) is the one
|
||||
we'll see regardless of what the bootloader has done. It allows to
|
||||
remove the little hack that was forwarding configuration transactions
|
||||
on slot 0 to slot 1, which is nice.
|
||||
|
||||
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
|
||||
Signed-off-by: Jason Cooper <jason@lakedaemon.net>
|
||||
---
|
||||
drivers/pci/host/pci-mvebu.c | 19 +++++++++++++++----
|
||||
1 file changed, 15 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/drivers/pci/host/pci-mvebu.c
|
||||
+++ b/drivers/pci/host/pci-mvebu.c
|
||||
@@ -51,6 +51,7 @@
|
||||
#define PCIE_CTRL_X1_MODE 0x0001
|
||||
#define PCIE_STAT_OFF 0x1a04
|
||||
#define PCIE_STAT_BUS 0xff00
|
||||
+#define PCIE_STAT_DEV 0x1f0000
|
||||
#define PCIE_STAT_LINK_DOWN BIT(0)
|
||||
#define PCIE_DEBUG_CTRL 0x1a60
|
||||
#define PCIE_DEBUG_SOFT_RESET BIT(20)
|
||||
@@ -148,6 +149,16 @@ static void mvebu_pcie_set_local_bus_nr(
|
||||
writel(stat, port->base + PCIE_STAT_OFF);
|
||||
}
|
||||
|
||||
+static void mvebu_pcie_set_local_dev_nr(struct mvebu_pcie_port *port, int nr)
|
||||
+{
|
||||
+ u32 stat;
|
||||
+
|
||||
+ stat = readl(port->base + PCIE_STAT_OFF);
|
||||
+ stat &= ~PCIE_STAT_DEV;
|
||||
+ stat |= nr << 16;
|
||||
+ writel(stat, port->base + PCIE_STAT_OFF);
|
||||
+}
|
||||
+
|
||||
/*
|
||||
* Setup PCIE BARs and Address Decode Wins:
|
||||
* BAR[0,2] -> disabled, BAR[1] -> covers all DRAM banks
|
||||
@@ -572,8 +583,7 @@ static int mvebu_pcie_wr_conf(struct pci
|
||||
|
||||
/* Access the real PCIe interface */
|
||||
spin_lock_irqsave(&port->conf_lock, flags);
|
||||
- ret = mvebu_pcie_hw_wr_conf(port, bus,
|
||||
- PCI_DEVFN(1, PCI_FUNC(devfn)),
|
||||
+ ret = mvebu_pcie_hw_wr_conf(port, bus, devfn,
|
||||
where, size, val);
|
||||
spin_unlock_irqrestore(&port->conf_lock, flags);
|
||||
|
||||
@@ -606,8 +616,7 @@ static int mvebu_pcie_rd_conf(struct pci
|
||||
|
||||
/* Access the real PCIe interface */
|
||||
spin_lock_irqsave(&port->conf_lock, flags);
|
||||
- ret = mvebu_pcie_hw_rd_conf(port, bus,
|
||||
- PCI_DEVFN(1, PCI_FUNC(devfn)),
|
||||
+ ret = mvebu_pcie_hw_rd_conf(port, bus, devfn,
|
||||
where, size, val);
|
||||
spin_unlock_irqrestore(&port->conf_lock, flags);
|
||||
|
||||
@@ -817,6 +826,8 @@ static int __init mvebu_pcie_probe(struc
|
||||
continue;
|
||||
}
|
||||
|
||||
+ mvebu_pcie_set_local_dev_nr(port, 1);
|
||||
+
|
||||
if (mvebu_pcie_link_up(port)) {
|
||||
port->haslink = 1;
|
||||
dev_info(&pdev->dev, "PCIe%d.%d: link up\n",
|
|
@ -1,97 +0,0 @@
|
|||
From 10f725e3a9e73aab2e5601206c88cf9cbc599243 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Date: Thu, 23 May 2013 16:32:52 +0200
|
||||
Subject: [PATCH 016/203] pci: mvebu: allow the enumeration of devices beyond
|
||||
physical bridges
|
||||
|
||||
Until now, the Marvell PCIe driver was only allowing the enumeration
|
||||
of the devices in the secondary bus of the emulated PCI-to-PCI
|
||||
bridge. This works fine when a PCIe device is directly connected into
|
||||
a PCIe slot of the Marvell board.
|
||||
|
||||
However, when the device connected in the PCIe slot is a physical PCIe
|
||||
bridge, beyond which a real PCIe device is connected, it no longer
|
||||
worked, as the driver was preventing the Linux PCI core from seeing
|
||||
such devices.
|
||||
|
||||
This commit fixes that by ensuring that configuration transactions on
|
||||
subordinate busses are properly forwarded on the right PCIe interface.
|
||||
|
||||
Thanks to this patch, a PCIe card beyond a PCIe bridge, itself beyond
|
||||
the emulated PCI-to-PCI bridge is properly detected, with the
|
||||
following layout:
|
||||
|
||||
-[0000:00]-+-01.0-[01]----00.0
|
||||
+-09.0-[02-07]----00.0-[03-07]--+-01.0-[04]--
|
||||
| +-05.0-[05]--
|
||||
| +-07.0-[06]--
|
||||
| \-09.0-[07]----00.0
|
||||
\-0a.0-[08]----00.0
|
||||
|
||||
Where the PCIe interface that sits beyond the emulated PCI-to-PCI
|
||||
bridge at 09.0 allows to access the secondary bus 02, on which there
|
||||
is a PCIe bridge that allows to access the 3 to 7 busses, that are
|
||||
subordinates to this bridge. And on one of this bus (bus 7), there is
|
||||
one real PCIe device connected.
|
||||
|
||||
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
|
||||
Signed-off-by: Jason Cooper <jason@lakedaemon.net>
|
||||
---
|
||||
drivers/pci/host/pci-mvebu.c | 31 ++++++++++++++++++++++++++++---
|
||||
1 file changed, 28 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/pci/host/pci-mvebu.c
|
||||
+++ b/drivers/pci/host/pci-mvebu.c
|
||||
@@ -554,7 +554,8 @@ mvebu_pcie_find_port(struct mvebu_pcie *
|
||||
if (bus->number == 0 && port->devfn == devfn)
|
||||
return port;
|
||||
if (bus->number != 0 &&
|
||||
- port->bridge.secondary_bus == bus->number)
|
||||
+ bus->number >= port->bridge.secondary_bus &&
|
||||
+ bus->number <= port->bridge.subordinate_bus)
|
||||
return port;
|
||||
}
|
||||
|
||||
@@ -578,7 +579,18 @@ static int mvebu_pcie_wr_conf(struct pci
|
||||
if (bus->number == 0)
|
||||
return mvebu_sw_pci_bridge_write(port, where, size, val);
|
||||
|
||||
- if (!port->haslink || PCI_SLOT(devfn) != 0)
|
||||
+ if (!port->haslink)
|
||||
+ return PCIBIOS_DEVICE_NOT_FOUND;
|
||||
+
|
||||
+ /*
|
||||
+ * On the secondary bus, we don't want to expose any other
|
||||
+ * device than the device physically connected in the PCIe
|
||||
+ * slot, visible in slot 0. In slot 1, there's a special
|
||||
+ * Marvell device that only makes sense when the Armada is
|
||||
+ * used as a PCIe endpoint.
|
||||
+ */
|
||||
+ if (bus->number == port->bridge.secondary_bus &&
|
||||
+ PCI_SLOT(devfn) != 0)
|
||||
return PCIBIOS_DEVICE_NOT_FOUND;
|
||||
|
||||
/* Access the real PCIe interface */
|
||||
@@ -609,7 +621,20 @@ static int mvebu_pcie_rd_conf(struct pci
|
||||
if (bus->number == 0)
|
||||
return mvebu_sw_pci_bridge_read(port, where, size, val);
|
||||
|
||||
- if (!port->haslink || PCI_SLOT(devfn) != 0) {
|
||||
+ if (!port->haslink) {
|
||||
+ *val = 0xffffffff;
|
||||
+ return PCIBIOS_DEVICE_NOT_FOUND;
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
+ * On the secondary bus, we don't want to expose any other
|
||||
+ * device than the device physically connected in the PCIe
|
||||
+ * slot, visible in slot 0. In slot 1, there's a special
|
||||
+ * Marvell device that only makes sense when the Armada is
|
||||
+ * used as a PCIe endpoint.
|
||||
+ */
|
||||
+ if (bus->number == port->bridge.secondary_bus &&
|
||||
+ PCI_SLOT(devfn) != 0) {
|
||||
*val = 0xffffffff;
|
||||
return PCIBIOS_DEVICE_NOT_FOUND;
|
||||
}
|
|
@ -1,87 +0,0 @@
|
|||
From 33e771556f5e1a59c7dbcd953ce858dd3e50ed66 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Date: Thu, 23 May 2013 16:32:53 +0200
|
||||
Subject: [PATCH 017/203] pci: mvebu: fix the emulation of the status register
|
||||
|
||||
The status register of the PCI configuration space of PCI-to-PCI
|
||||
bridges contain some read-only bits, and so write-1-to-clear bits. So,
|
||||
the Linux PCI core sometimes writes 0xffff to this status register,
|
||||
and in the current PCI-to-PCI bridge emulation code of the Marvell
|
||||
driver, we do take all those 1s being written. Even the read-only bits
|
||||
are being overwritten.
|
||||
|
||||
For now, all the read-only bits should be emulated to have the zero
|
||||
value.
|
||||
|
||||
The other bits, that are write-1-to-clear bits are used to report
|
||||
various kind of errors, and are never set by the emulated bridge, so
|
||||
there is no need to support this write-1-to-clear bits mechanism.
|
||||
|
||||
As a conclusion, the easiest solution is to simply emulate this status
|
||||
register by returning zero when read, and ignore the writes to it.
|
||||
|
||||
This has two visible effects:
|
||||
|
||||
* The devsel is no longer 'unknown' in, i.e
|
||||
|
||||
Flags: bus master, 66MHz, user-definable features, ?? devsel, latency 0
|
||||
|
||||
becomes:
|
||||
|
||||
Flags: bus master, 66MHz, user-definable features, fast devsel, latency 0
|
||||
|
||||
in lspci -v.
|
||||
|
||||
This was caused by a value of 11b being read for devsel, which is
|
||||
an invalid value. This 11b value being read was due to a previous
|
||||
write of 0xffff into the status register.
|
||||
|
||||
* The capability list is no longer broken, because we indicate to the
|
||||
Linux PCI core that we don't have a Capabilities Pointer in the PCI
|
||||
configuration space of this bridge. The following message is
|
||||
therefore no longer visible in lspci -v:
|
||||
|
||||
Capabilities: [fc] <chain broken>
|
||||
|
||||
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
|
||||
Signed-off-by: Jason Cooper <jason@lakedaemon.net>
|
||||
---
|
||||
drivers/pci/host/pci-mvebu.c | 5 +----
|
||||
1 file changed, 1 insertion(+), 4 deletions(-)
|
||||
|
||||
--- a/drivers/pci/host/pci-mvebu.c
|
||||
+++ b/drivers/pci/host/pci-mvebu.c
|
||||
@@ -69,7 +69,6 @@ struct mvebu_sw_pci_bridge {
|
||||
u16 vendor;
|
||||
u16 device;
|
||||
u16 command;
|
||||
- u16 status;
|
||||
u16 class;
|
||||
u8 interface;
|
||||
u8 revision;
|
||||
@@ -359,7 +358,6 @@ static void mvebu_sw_pci_bridge_init(str
|
||||
|
||||
memset(bridge, 0, sizeof(struct mvebu_sw_pci_bridge));
|
||||
|
||||
- bridge->status = PCI_STATUS_CAP_LIST;
|
||||
bridge->class = PCI_CLASS_BRIDGE_PCI;
|
||||
bridge->vendor = PCI_VENDOR_ID_MARVELL;
|
||||
bridge->device = MARVELL_EMULATED_PCI_PCI_BRIDGE_ID;
|
||||
@@ -386,7 +384,7 @@ static int mvebu_sw_pci_bridge_read(stru
|
||||
break;
|
||||
|
||||
case PCI_COMMAND:
|
||||
- *value = bridge->status << 16 | bridge->command;
|
||||
+ *value = bridge->command;
|
||||
break;
|
||||
|
||||
case PCI_CLASS_REVISION:
|
||||
@@ -479,7 +477,6 @@ static int mvebu_sw_pci_bridge_write(str
|
||||
switch (where & ~3) {
|
||||
case PCI_COMMAND:
|
||||
bridge->command = value & 0xffff;
|
||||
- bridge->status = value >> 16;
|
||||
break;
|
||||
|
||||
case PCI_BASE_ADDRESS_0 ... PCI_BASE_ADDRESS_1:
|
|
@ -1,30 +0,0 @@
|
|||
From fc7dfe5cd096f5b5343f01f679a96ebc23e9da67 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Date: Tue, 21 May 2013 12:33:26 +0200
|
||||
Subject: [PATCH 018/203] arm: mvebu: fix length of SATA registers area in
|
||||
.dtsi
|
||||
|
||||
The length of the registers area for the Marvell 370/XP SATA
|
||||
controller was incorrect in the .dtsi: 0x2400 while it should have
|
||||
been 0x5000. Until now, this problem wasn't noticed because there was
|
||||
a large static mapping for all I/Os set up by ->map_io(). But since
|
||||
we're going to get rid of this static mapping, we need to ensure that
|
||||
the register areas are properly sized.
|
||||
|
||||
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Signed-off-by: Jason Cooper <jason@lakedaemon.net>
|
||||
---
|
||||
arch/arm/boot/dts/armada-370-xp.dtsi | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/arch/arm/boot/dts/armada-370-xp.dtsi
|
||||
+++ b/arch/arm/boot/dts/armada-370-xp.dtsi
|
||||
@@ -80,7 +80,7 @@
|
||||
|
||||
sata@a0000 {
|
||||
compatible = "marvell,orion-sata";
|
||||
- reg = <0xa0000 0x2400>;
|
||||
+ reg = <0xa0000 0x5000>;
|
||||
interrupts = <55>;
|
||||
clocks = <&gateclk 15>, <&gateclk 30>;
|
||||
clock-names = "0", "1";
|
|
@ -1,63 +0,0 @@
|
|||
From d887da014c3fabf5fa4da47b143edc069e72fd62 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Date: Tue, 21 May 2013 12:33:27 +0200
|
||||
Subject: [PATCH 019/203] arm: mvebu: fix length of Ethernet registers area in
|
||||
.dtsi
|
||||
|
||||
The length of the registers area for the Marvell 370/XP Ethernet
|
||||
controller was incorrect in the .dtsi: 0x2400 while it should have
|
||||
been 0x4000. Until now, this problem wasn't noticed because there was
|
||||
a large static mapping for all I/Os set up by ->map_io(). But since
|
||||
we're going to get rid of this static mapping, we need to ensure that
|
||||
the register areas are properly sized.
|
||||
|
||||
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Signed-off-by: Jason Cooper <jason@lakedaemon.net>
|
||||
---
|
||||
arch/arm/boot/dts/armada-370-xp.dtsi | 4 ++--
|
||||
arch/arm/boot/dts/armada-xp-mv78460.dtsi | 2 +-
|
||||
arch/arm/boot/dts/armada-xp.dtsi | 2 +-
|
||||
3 files changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/arch/arm/boot/dts/armada-370-xp.dtsi
|
||||
+++ b/arch/arm/boot/dts/armada-370-xp.dtsi
|
||||
@@ -96,7 +96,7 @@
|
||||
|
||||
ethernet@70000 {
|
||||
compatible = "marvell,armada-370-neta";
|
||||
- reg = <0x70000 0x2500>;
|
||||
+ reg = <0x70000 0x4000>;
|
||||
interrupts = <8>;
|
||||
clocks = <&gateclk 4>;
|
||||
status = "disabled";
|
||||
@@ -104,7 +104,7 @@
|
||||
|
||||
ethernet@74000 {
|
||||
compatible = "marvell,armada-370-neta";
|
||||
- reg = <0x74000 0x2500>;
|
||||
+ reg = <0x74000 0x4000>;
|
||||
interrupts = <10>;
|
||||
clocks = <&gateclk 3>;
|
||||
status = "disabled";
|
||||
--- a/arch/arm/boot/dts/armada-xp-mv78460.dtsi
|
||||
+++ b/arch/arm/boot/dts/armada-xp-mv78460.dtsi
|
||||
@@ -107,7 +107,7 @@
|
||||
|
||||
ethernet@34000 {
|
||||
compatible = "marvell,armada-370-neta";
|
||||
- reg = <0x34000 0x2500>;
|
||||
+ reg = <0x34000 0x4000>;
|
||||
interrupts = <14>;
|
||||
clocks = <&gateclk 1>;
|
||||
status = "disabled";
|
||||
--- a/arch/arm/boot/dts/armada-xp.dtsi
|
||||
+++ b/arch/arm/boot/dts/armada-xp.dtsi
|
||||
@@ -88,7 +88,7 @@
|
||||
|
||||
ethernet@30000 {
|
||||
compatible = "marvell,armada-370-neta";
|
||||
- reg = <0x30000 0x2500>;
|
||||
+ reg = <0x30000 0x4000>;
|
||||
interrupts = <12>;
|
||||
clocks = <&gateclk 2>;
|
||||
status = "disabled";
|
|
@ -1,112 +0,0 @@
|
|||
From 25d3318a445c4f4360f86bf6d1d1a320d9646bb5 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Date: Tue, 4 Jun 2013 04:52:23 +0000
|
||||
Subject: [PATCH 020/203] net: mvneta: read MAC address from hardware when
|
||||
available
|
||||
|
||||
This patch improves the logic used by the mvneta driver to find a MAC
|
||||
address for a particular interface. Until now, it was only looking at
|
||||
the Device Tree, and if no address was found, was falling back to
|
||||
generating a random MAC address.
|
||||
|
||||
This patch adds the intermediate solution of reading the MAC address
|
||||
from the hardware registers, in case it has been set by the
|
||||
bootloader. So the order is now:
|
||||
|
||||
1) MAC address from the Device Tree
|
||||
2) MAC address from the hardware registers
|
||||
3) Random MAC address
|
||||
|
||||
This requires moving the MAC address initialization a little bit later
|
||||
in the ->probe() code, because it now requires the hardware registers
|
||||
to be remapped.
|
||||
|
||||
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Cc: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>
|
||||
Cc: Joe Perches <joe@perches.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
---
|
||||
drivers/net/ethernet/marvell/mvneta.c | 44 ++++++++++++++++++++++++++++-------
|
||||
1 file changed, 35 insertions(+), 9 deletions(-)
|
||||
|
||||
--- a/drivers/net/ethernet/marvell/mvneta.c
|
||||
+++ b/drivers/net/ethernet/marvell/mvneta.c
|
||||
@@ -2260,6 +2260,21 @@ static int mvneta_change_mtu(struct net_
|
||||
return 0;
|
||||
}
|
||||
|
||||
+/* Get mac address */
|
||||
+static void mvneta_get_mac_addr(struct mvneta_port *pp, unsigned char *addr)
|
||||
+{
|
||||
+ u32 mac_addr_l, mac_addr_h;
|
||||
+
|
||||
+ mac_addr_l = mvreg_read(pp, MVNETA_MAC_ADDR_LOW);
|
||||
+ mac_addr_h = mvreg_read(pp, MVNETA_MAC_ADDR_HIGH);
|
||||
+ addr[0] = (mac_addr_h >> 24) & 0xFF;
|
||||
+ addr[1] = (mac_addr_h >> 16) & 0xFF;
|
||||
+ addr[2] = (mac_addr_h >> 8) & 0xFF;
|
||||
+ addr[3] = mac_addr_h & 0xFF;
|
||||
+ addr[4] = (mac_addr_l >> 8) & 0xFF;
|
||||
+ addr[5] = mac_addr_l & 0xFF;
|
||||
+}
|
||||
+
|
||||
/* Handle setting mac address */
|
||||
static int mvneta_set_mac_addr(struct net_device *dev, void *addr)
|
||||
{
|
||||
@@ -2678,7 +2693,9 @@ static int mvneta_probe(struct platform_
|
||||
u32 phy_addr;
|
||||
struct mvneta_port *pp;
|
||||
struct net_device *dev;
|
||||
- const char *mac_addr;
|
||||
+ const char *dt_mac_addr;
|
||||
+ char hw_mac_addr[ETH_ALEN];
|
||||
+ const char *mac_from;
|
||||
int phy_mode;
|
||||
int err;
|
||||
|
||||
@@ -2714,13 +2731,6 @@ static int mvneta_probe(struct platform_
|
||||
goto err_free_irq;
|
||||
}
|
||||
|
||||
- mac_addr = of_get_mac_address(dn);
|
||||
-
|
||||
- if (!mac_addr || !is_valid_ether_addr(mac_addr))
|
||||
- eth_hw_addr_random(dev);
|
||||
- else
|
||||
- memcpy(dev->dev_addr, mac_addr, ETH_ALEN);
|
||||
-
|
||||
dev->tx_queue_len = MVNETA_MAX_TXD;
|
||||
dev->watchdog_timeo = 5 * HZ;
|
||||
dev->netdev_ops = &mvneta_netdev_ops;
|
||||
@@ -2751,6 +2761,21 @@ static int mvneta_probe(struct platform_
|
||||
|
||||
clk_prepare_enable(pp->clk);
|
||||
|
||||
+ dt_mac_addr = of_get_mac_address(dn);
|
||||
+ if (dt_mac_addr && is_valid_ether_addr(dt_mac_addr)) {
|
||||
+ mac_from = "device tree";
|
||||
+ memcpy(dev->dev_addr, dt_mac_addr, ETH_ALEN);
|
||||
+ } else {
|
||||
+ mvneta_get_mac_addr(pp, hw_mac_addr);
|
||||
+ if (is_valid_ether_addr(hw_mac_addr)) {
|
||||
+ mac_from = "hardware";
|
||||
+ memcpy(dev->dev_addr, hw_mac_addr, ETH_ALEN);
|
||||
+ } else {
|
||||
+ mac_from = "random";
|
||||
+ eth_hw_addr_random(dev);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
pp->tx_done_timer.data = (unsigned long)dev;
|
||||
|
||||
pp->tx_ring_size = MVNETA_MAX_TXD;
|
||||
@@ -2783,7 +2808,8 @@ static int mvneta_probe(struct platform_
|
||||
goto err_deinit;
|
||||
}
|
||||
|
||||
- netdev_info(dev, "mac: %pM\n", dev->dev_addr);
|
||||
+ netdev_info(dev, "Using %s mac address %pM\n", mac_from,
|
||||
+ dev->dev_addr);
|
||||
|
||||
platform_set_drvdata(pdev, pp->dev);
|
||||
|
|
@ -1,31 +0,0 @@
|
|||
From 67373874e07eb8c54ab27f8fe9998690e50b1e91 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Date: Thu, 6 Jun 2013 11:21:23 +0200
|
||||
Subject: [PATCH 021/203] arm: mvebu: armada-xp-db: ensure PCIe range is
|
||||
specified
|
||||
|
||||
The ranges DT entry needed by the PCIe controller is defined at the
|
||||
SoC .dtsi level. However, some boards have a NOR flash, and to support
|
||||
it, they need to override the SoC-level ranges property to add an
|
||||
additional range. Since PCIe and NOR support came separately, some
|
||||
boards were not properly changed to include the PCIe range in their
|
||||
ranges property at the .dts level.
|
||||
|
||||
This commit fixes those platforms.
|
||||
|
||||
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Signed-off-by: Jason Cooper <jason@lakedaemon.net>
|
||||
---
|
||||
arch/arm/boot/dts/armada-xp-db.dts | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/arch/arm/boot/dts/armada-xp-db.dts
|
||||
+++ b/arch/arm/boot/dts/armada-xp-db.dts
|
||||
@@ -31,6 +31,7 @@
|
||||
|
||||
soc {
|
||||
ranges = <0 0 0xd0000000 0x100000 /* Internal registers 1MiB */
|
||||
+ 0xe0000000 0 0xe0000000 0x8100000 /* PCIe */
|
||||
0xf0000000 0 0xf0000000 0x1000000>; /* Device Bus, NOR 16MiB */
|
||||
|
||||
internal-regs {
|
|
@ -1,54 +0,0 @@
|
|||
From 35e8d985e056f583290406258e3f17789bd05bce Mon Sep 17 00:00:00 2001
|
||||
From: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Date: Fri, 7 Jun 2013 13:47:38 -0300
|
||||
Subject: [PATCH 022/203] bus: mvebu-mbus: Use pr_fmt
|
||||
|
||||
In order to clean message printing, we replace pr_info with pr_fmt.
|
||||
This is purely cosmetic change, with the sole purpose of making
|
||||
the code a bit more readable.
|
||||
|
||||
Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Acked-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Signed-off-by: Jason Cooper <jason@lakedaemon.net>
|
||||
---
|
||||
drivers/bus/mvebu-mbus.c | 8 +++++---
|
||||
1 file changed, 5 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/bus/mvebu-mbus.c
|
||||
+++ b/drivers/bus/mvebu-mbus.c
|
||||
@@ -49,6 +49,8 @@
|
||||
* configuration (file 'devices').
|
||||
*/
|
||||
|
||||
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
+
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
@@ -762,7 +764,7 @@ int mvebu_mbus_add_window_remap_flags(co
|
||||
break;
|
||||
|
||||
if (!s->soc->map[i].name) {
|
||||
- pr_err("mvebu-mbus: unknown device '%s'\n", devname);
|
||||
+ pr_err("unknown device '%s'\n", devname);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
@@ -775,7 +777,7 @@ int mvebu_mbus_add_window_remap_flags(co
|
||||
attr |= 0x28;
|
||||
|
||||
if (!mvebu_mbus_window_conflicts(s, base, size, target, attr)) {
|
||||
- pr_err("mvebu-mbus: cannot add window '%s', conflicts with another window\n",
|
||||
+ pr_err("cannot add window '%s', conflicts with another window\n",
|
||||
devname);
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -842,7 +844,7 @@ int __init mvebu_mbus_init(const char *s
|
||||
break;
|
||||
|
||||
if (!of_id->compatible) {
|
||||
- pr_err("mvebu-mbus: could not find a matching SoC family\n");
|
||||
+ pr_err("could not find a matching SoC family\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
|
@ -1,28 +0,0 @@
|
|||
From df8ceea297967c3452a514bbde715acebf3bda29 Mon Sep 17 00:00:00 2001
|
||||
From: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Date: Fri, 7 Jun 2013 13:47:49 -0300
|
||||
Subject: [PATCH 023/203] ARM: mvebu: Remove device tree unused properties on
|
||||
A370
|
||||
|
||||
These properties are not needed so it's safe to remove them.
|
||||
|
||||
Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Acked-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Signed-off-by: Jason Cooper <jason@lakedaemon.net>
|
||||
---
|
||||
arch/arm/boot/dts/armada-370.dtsi | 4 ----
|
||||
1 file changed, 4 deletions(-)
|
||||
|
||||
--- a/arch/arm/boot/dts/armada-370.dtsi
|
||||
+++ b/arch/arm/boot/dts/armada-370.dtsi
|
||||
@@ -180,10 +180,6 @@
|
||||
|
||||
bus-range = <0x00 0xff>;
|
||||
|
||||
- reg = <0x40000 0x2000>, <0x80000 0x2000>;
|
||||
-
|
||||
- reg-names = "pcie0.0", "pcie1.0";
|
||||
-
|
||||
ranges = <0x82000000 0 0x40000 0x40000 0 0x00002000 /* Port 0.0 registers */
|
||||
0x82000000 0 0x80000 0x80000 0 0x00002000 /* Port 1.0 registers */
|
||||
0x82000000 0 0xe0000000 0xe0000000 0 0x08000000 /* non-prefetchable memory */
|
|
@ -1,99 +0,0 @@
|
|||
From 9398729313b826469fede3acda5fedd1eb21cb3e Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Date: Wed, 5 Jun 2013 09:04:54 +0200
|
||||
Subject: [PATCH 024/203] arm: mvebu: remove dependency of SMP init on static
|
||||
I/O mapping
|
||||
|
||||
The ->smp_init_cpus() function is called very early during boot, at a
|
||||
point where dynamic I/O mappings are not yet possible. However, in the
|
||||
Armada 370/XP implementation of this function, we have to get the
|
||||
number of CPUs. We used to do that by accessing a hardware register,
|
||||
which requires relying on a static I/O mapping set up by
|
||||
->map_io(). Not only this requires hardcoding a virtual address, but
|
||||
it also prevents us from removing the static I/O mapping.
|
||||
|
||||
So this commit changes the way used to get the number of CPUs: we now
|
||||
use the Device Tree, which is a representation of the hardware, and
|
||||
provides us the number of available CPUs. This is also more accurate,
|
||||
because it potentially allows to boot the Linux kernel on only a
|
||||
number of CPUs given by the Device Tree, instead of unconditionally on
|
||||
all CPUs.
|
||||
|
||||
As a consequence, the coherency_get_cpu_count() function becomes no
|
||||
longer used, so we remove it.
|
||||
|
||||
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Acked-by: Arnd Bergmann <arnd@arndb.de>
|
||||
Signed-off-by: Jason Cooper <jason@lakedaemon.net>
|
||||
---
|
||||
arch/arm/mach-mvebu/coherency.c | 12 ------------
|
||||
arch/arm/mach-mvebu/coherency.h | 4 ----
|
||||
arch/arm/mach-mvebu/common.h | 2 ++
|
||||
arch/arm/mach-mvebu/platsmp.c | 10 +++++++++-
|
||||
4 files changed, 11 insertions(+), 17 deletions(-)
|
||||
|
||||
--- a/arch/arm/mach-mvebu/coherency.c
|
||||
+++ b/arch/arm/mach-mvebu/coherency.c
|
||||
@@ -47,18 +47,6 @@ static struct of_device_id of_coherency_
|
||||
{ /* end of list */ },
|
||||
};
|
||||
|
||||
-#ifdef CONFIG_SMP
|
||||
-int coherency_get_cpu_count(void)
|
||||
-{
|
||||
- int reg, cnt;
|
||||
-
|
||||
- reg = readl(coherency_base + COHERENCY_FABRIC_CFG_OFFSET);
|
||||
- cnt = (reg & 0xF) + 1;
|
||||
-
|
||||
- return cnt;
|
||||
-}
|
||||
-#endif
|
||||
-
|
||||
/* Function defined in coherency_ll.S */
|
||||
int ll_set_cpu_coherent(void __iomem *base_addr, unsigned int hw_cpu_id);
|
||||
|
||||
--- a/arch/arm/mach-mvebu/coherency.h
|
||||
+++ b/arch/arm/mach-mvebu/coherency.h
|
||||
@@ -14,10 +14,6 @@
|
||||
#ifndef __MACH_370_XP_COHERENCY_H
|
||||
#define __MACH_370_XP_COHERENCY_H
|
||||
|
||||
-#ifdef CONFIG_SMP
|
||||
-int coherency_get_cpu_count(void);
|
||||
-#endif
|
||||
-
|
||||
int set_cpu_coherent(int cpu_id, int smp_group_id);
|
||||
int coherency_init(void);
|
||||
|
||||
--- a/arch/arm/mach-mvebu/common.h
|
||||
+++ b/arch/arm/mach-mvebu/common.h
|
||||
@@ -15,6 +15,8 @@
|
||||
#ifndef __ARCH_MVEBU_COMMON_H
|
||||
#define __ARCH_MVEBU_COMMON_H
|
||||
|
||||
+#define ARMADA_XP_MAX_CPUS 4
|
||||
+
|
||||
void mvebu_restart(char mode, const char *cmd);
|
||||
|
||||
void armada_370_xp_init_irq(void);
|
||||
--- a/arch/arm/mach-mvebu/platsmp.c
|
||||
+++ b/arch/arm/mach-mvebu/platsmp.c
|
||||
@@ -88,8 +88,16 @@ static int __cpuinit armada_xp_boot_seco
|
||||
|
||||
static void __init armada_xp_smp_init_cpus(void)
|
||||
{
|
||||
+ struct device_node *np;
|
||||
unsigned int i, ncores;
|
||||
- ncores = coherency_get_cpu_count();
|
||||
+
|
||||
+ np = of_find_node_by_name(NULL, "cpus");
|
||||
+ if (!np)
|
||||
+ panic("No 'cpus' node found\n");
|
||||
+
|
||||
+ ncores = of_get_child_count(np);
|
||||
+ if (ncores == 0 || ncores > ARMADA_XP_MAX_CPUS)
|
||||
+ panic("Invalid number of CPUs in DT\n");
|
||||
|
||||
/* Limit possible CPUs to defconfig */
|
||||
if (ncores > nr_cpu_ids) {
|
|
@ -1,81 +0,0 @@
|
|||
From a4dd628f515f361cecfae08e568891442042e4e2 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Date: Wed, 5 Jun 2013 09:04:55 +0200
|
||||
Subject: [PATCH 025/203] arm: mvebu: avoid hardcoded virtual address in
|
||||
coherency code
|
||||
|
||||
Now that the coherency_get_cpu_count() function no longer requires a
|
||||
very early mapping of the coherency unit registers, we can avoid the
|
||||
hardcoded virtual address in coherency.c. However, the coherency
|
||||
features are still used quite early, so we need to do the of_iomap()
|
||||
early enough, at the ->init_timer() level, so we have the call of
|
||||
coherency_init() at this point.
|
||||
|
||||
Unfortunately, at ->init_timer() time, it is not possible to register
|
||||
a bus notifier, so we add a separate coherency_late_init() function
|
||||
that gets called as as postcore_initcall(), when bus notifiers are
|
||||
available.
|
||||
|
||||
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Acked-by: Arnd Bergmann <arnd@arndb.de>
|
||||
Signed-off-by: Jason Cooper <jason@lakedaemon.net>
|
||||
---
|
||||
arch/arm/mach-mvebu/armada-370-xp.c | 2 +-
|
||||
arch/arm/mach-mvebu/coherency.c | 20 ++++++++++----------
|
||||
2 files changed, 11 insertions(+), 11 deletions(-)
|
||||
|
||||
--- a/arch/arm/mach-mvebu/armada-370-xp.c
|
||||
+++ b/arch/arm/mach-mvebu/armada-370-xp.c
|
||||
@@ -47,6 +47,7 @@ static void __init armada_370_xp_timer_a
|
||||
{
|
||||
mvebu_clocks_init();
|
||||
armada_370_xp_timer_init();
|
||||
+ coherency_init();
|
||||
}
|
||||
|
||||
static void __init armada_370_xp_init_early(void)
|
||||
@@ -76,7 +77,6 @@ static void __init armada_370_xp_init_ea
|
||||
static void __init armada_370_xp_dt_init(void)
|
||||
{
|
||||
of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
|
||||
- coherency_init();
|
||||
}
|
||||
|
||||
static const char * const armada_370_xp_dt_compat[] = {
|
||||
--- a/arch/arm/mach-mvebu/coherency.c
|
||||
+++ b/arch/arm/mach-mvebu/coherency.c
|
||||
@@ -27,14 +27,7 @@
|
||||
#include <asm/smp_plat.h>
|
||||
#include "armada-370-xp.h"
|
||||
|
||||
-/*
|
||||
- * Some functions in this file are called very early during SMP
|
||||
- * initialization. At that time the device tree framework is not yet
|
||||
- * ready, and it is not possible to get the register address to
|
||||
- * ioremap it. That's why the pointer below is given with an initial
|
||||
- * value matching its virtual mapping
|
||||
- */
|
||||
-static void __iomem *coherency_base = ARMADA_370_XP_REGS_VIRT_BASE + 0x20200;
|
||||
+static void __iomem *coherency_base;
|
||||
static void __iomem *coherency_cpu_base;
|
||||
|
||||
/* Coherency fabric registers */
|
||||
@@ -135,9 +128,16 @@ int __init coherency_init(void)
|
||||
coherency_base = of_iomap(np, 0);
|
||||
coherency_cpu_base = of_iomap(np, 1);
|
||||
set_cpu_coherent(cpu_logical_map(smp_processor_id()), 0);
|
||||
- bus_register_notifier(&platform_bus_type,
|
||||
- &mvebu_hwcc_platform_nb);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
+
|
||||
+static int __init coherency_late_init(void)
|
||||
+{
|
||||
+ bus_register_notifier(&platform_bus_type,
|
||||
+ &mvebu_hwcc_platform_nb);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+postcore_initcall(coherency_late_init);
|
|
@ -1,54 +0,0 @@
|
|||
From c7c7e6309ae12f2cb0d9053875876b57bb7587e4 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Date: Wed, 5 Jun 2013 09:04:56 +0200
|
||||
Subject: [PATCH 026/203] arm: mvebu: move cache and mvebu-mbus initialization
|
||||
later
|
||||
|
||||
Current, the L2 cache and the mvebu-mbus drivers are initialized at
|
||||
->init_early() time. However, at ->init_early() time, ioremap() only
|
||||
works if a static I/O mapping has already been put in place. If it's
|
||||
not the case, it tries to do a memory allocation with kmalloc() which
|
||||
is not possible so early at this stage of the initialization.
|
||||
|
||||
Since we want to get rid of the static I/O mapping, we cannot
|
||||
initialize the L2 cache driver and the mvebu-mbus driver so early. So,
|
||||
we move their initialization to the ->init_time() level, which is
|
||||
slightly later (so ioremap() works properly), but sufficiently early
|
||||
to be before the call of the ->smp_prepare_cpus() hook, which creates
|
||||
an address decoding window for the BootROM, which requires the
|
||||
mvebu-mbus driver to be properly initialized.
|
||||
|
||||
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Acked-by: Arnd Bergmann <arnd@arndb.de>
|
||||
Signed-off-by: Jason Cooper <jason@lakedaemon.net>
|
||||
---
|
||||
arch/arm/mach-mvebu/armada-370-xp.c | 8 ++------
|
||||
1 file changed, 2 insertions(+), 6 deletions(-)
|
||||
|
||||
--- a/arch/arm/mach-mvebu/armada-370-xp.c
|
||||
+++ b/arch/arm/mach-mvebu/armada-370-xp.c
|
||||
@@ -45,14 +45,11 @@ static void __init armada_370_xp_map_io(
|
||||
|
||||
static void __init armada_370_xp_timer_and_clk_init(void)
|
||||
{
|
||||
+ char *mbus_soc_name;
|
||||
+
|
||||
mvebu_clocks_init();
|
||||
armada_370_xp_timer_init();
|
||||
coherency_init();
|
||||
-}
|
||||
-
|
||||
-static void __init armada_370_xp_init_early(void)
|
||||
-{
|
||||
- char *mbus_soc_name;
|
||||
|
||||
/*
|
||||
* This initialization will be replaced by a DT-based
|
||||
@@ -88,7 +85,6 @@ DT_MACHINE_START(ARMADA_XP_DT, "Marvell
|
||||
.smp = smp_ops(armada_xp_smp_ops),
|
||||
.init_machine = armada_370_xp_dt_init,
|
||||
.map_io = armada_370_xp_map_io,
|
||||
- .init_early = armada_370_xp_init_early,
|
||||
.init_irq = irqchip_init,
|
||||
.init_time = armada_370_xp_timer_and_clk_init,
|
||||
.restart = mvebu_restart,
|
|
@ -1,52 +0,0 @@
|
|||
From fe4fce3c521f5d9f3a64c4d06a73a5e6b7324116 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Date: Wed, 5 Jun 2013 09:04:57 +0200
|
||||
Subject: [PATCH 027/203] arm: mvebu: remove hardcoded static I/O mapping
|
||||
|
||||
Now that we have removed the need of the static I/O mapping for early
|
||||
initialization reasons, and fixed the registers area length that were
|
||||
broken, we can get rid of the static I/O mapping. Only the earlyprintk
|
||||
mapping needs to be set up, using the debug_ll_io_init() helper
|
||||
function.
|
||||
|
||||
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Acked-by: Arnd Bergmann <arnd@arndb.de>
|
||||
Signed-off-by: Jason Cooper <jason@lakedaemon.net>
|
||||
---
|
||||
arch/arm/mach-mvebu/armada-370-xp.c | 11 +----------
|
||||
arch/arm/mach-mvebu/armada-370-xp.h | 2 --
|
||||
2 files changed, 1 insertion(+), 12 deletions(-)
|
||||
|
||||
--- a/arch/arm/mach-mvebu/armada-370-xp.c
|
||||
+++ b/arch/arm/mach-mvebu/armada-370-xp.c
|
||||
@@ -29,18 +29,9 @@
|
||||
#include "common.h"
|
||||
#include "coherency.h"
|
||||
|
||||
-static struct map_desc armada_370_xp_io_desc[] __initdata = {
|
||||
- {
|
||||
- .virtual = (unsigned long) ARMADA_370_XP_REGS_VIRT_BASE,
|
||||
- .pfn = __phys_to_pfn(ARMADA_370_XP_REGS_PHYS_BASE),
|
||||
- .length = ARMADA_370_XP_REGS_SIZE,
|
||||
- .type = MT_DEVICE,
|
||||
- },
|
||||
-};
|
||||
-
|
||||
static void __init armada_370_xp_map_io(void)
|
||||
{
|
||||
- iotable_init(armada_370_xp_io_desc, ARRAY_SIZE(armada_370_xp_io_desc));
|
||||
+ debug_ll_io_init();
|
||||
}
|
||||
|
||||
static void __init armada_370_xp_timer_and_clk_init(void)
|
||||
--- a/arch/arm/mach-mvebu/armada-370-xp.h
|
||||
+++ b/arch/arm/mach-mvebu/armada-370-xp.h
|
||||
@@ -16,8 +16,6 @@
|
||||
#define __MACH_ARMADA_370_XP_H
|
||||
|
||||
#define ARMADA_370_XP_REGS_PHYS_BASE 0xd0000000
|
||||
-#define ARMADA_370_XP_REGS_VIRT_BASE IOMEM(0xfec00000)
|
||||
-#define ARMADA_370_XP_REGS_SIZE SZ_1M
|
||||
|
||||
/* These defines can go away once mvebu-mbus has a DT binding */
|
||||
#define ARMADA_370_XP_MBUS_WINS_BASE (ARMADA_370_XP_REGS_PHYS_BASE + 0x20000)
|
|
@ -1,91 +0,0 @@
|
|||
From 88260610ea7a2c5a164721af28f59856880221b4 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Date: Thu, 6 Jun 2013 12:24:28 +0200
|
||||
Subject: [PATCH 028/203] arm: mvebu: don't hardcode a physical address in
|
||||
headsmp.S
|
||||
|
||||
Now that the coherency_init() function is called a bit earlier, we can
|
||||
actually read the physical address of the coherency unit registers
|
||||
from the Device Tree, and communicate that to the headsmp.S code,
|
||||
which avoids hardcoding a physical address.
|
||||
|
||||
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Acked-by: Arnd Bergmann <arnd@arndb.de>
|
||||
Reviewed-by: Will Deacon <will.deacon@arm.com>
|
||||
Acked-by: Nicolas Pitre <nico@linaro.org>
|
||||
Signed-off-by: Jason Cooper <jason@lakedaemon.net>
|
||||
---
|
||||
arch/arm/mach-mvebu/coherency.c | 12 ++++++++++++
|
||||
arch/arm/mach-mvebu/headsmp.S | 16 ++++++++--------
|
||||
2 files changed, 20 insertions(+), 8 deletions(-)
|
||||
|
||||
--- a/arch/arm/mach-mvebu/coherency.c
|
||||
+++ b/arch/arm/mach-mvebu/coherency.c
|
||||
@@ -25,8 +25,10 @@
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <asm/smp_plat.h>
|
||||
+#include <asm/cacheflush.h>
|
||||
#include "armada-370-xp.h"
|
||||
|
||||
+unsigned long __cpuinitdata coherency_phys_base;
|
||||
static void __iomem *coherency_base;
|
||||
static void __iomem *coherency_cpu_base;
|
||||
|
||||
@@ -124,7 +126,17 @@ int __init coherency_init(void)
|
||||
|
||||
np = of_find_matching_node(NULL, of_coherency_table);
|
||||
if (np) {
|
||||
+ struct resource res;
|
||||
pr_info("Initializing Coherency fabric\n");
|
||||
+ of_address_to_resource(np, 0, &res);
|
||||
+ coherency_phys_base = res.start;
|
||||
+ /*
|
||||
+ * Ensure secondary CPUs will see the updated value,
|
||||
+ * which they read before they join the coherency
|
||||
+ * fabric, and therefore before they are coherent with
|
||||
+ * the boot CPU cache.
|
||||
+ */
|
||||
+ sync_cache_w(&coherency_phys_base);
|
||||
coherency_base = of_iomap(np, 0);
|
||||
coherency_cpu_base = of_iomap(np, 1);
|
||||
set_cpu_coherent(cpu_logical_map(smp_processor_id()), 0);
|
||||
--- a/arch/arm/mach-mvebu/headsmp.S
|
||||
+++ b/arch/arm/mach-mvebu/headsmp.S
|
||||
@@ -21,12 +21,6 @@
|
||||
#include <linux/linkage.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
-/*
|
||||
- * At this stage the secondary CPUs don't have acces yet to the MMU, so
|
||||
- * we have to provide physical addresses
|
||||
- */
|
||||
-#define ARMADA_XP_CFB_BASE 0xD0020200
|
||||
-
|
||||
__CPUINIT
|
||||
|
||||
/*
|
||||
@@ -35,15 +29,21 @@
|
||||
* startup
|
||||
*/
|
||||
ENTRY(armada_xp_secondary_startup)
|
||||
+ /* Get coherency fabric base physical address */
|
||||
+ adr r0, 1f
|
||||
+ ldr r1, [r0]
|
||||
+ ldr r0, [r0, r1]
|
||||
|
||||
/* Read CPU id */
|
||||
mrc p15, 0, r1, c0, c0, 5
|
||||
and r1, r1, #0xF
|
||||
|
||||
/* Add CPU to coherency fabric */
|
||||
- ldr r0, =ARMADA_XP_CFB_BASE
|
||||
-
|
||||
bl ll_set_cpu_coherent
|
||||
b secondary_startup
|
||||
|
||||
ENDPROC(armada_xp_secondary_startup)
|
||||
+
|
||||
+ .align 2
|
||||
+1:
|
||||
+ .long coherency_phys_base - .
|
|
@ -1,109 +0,0 @@
|
|||
From 070469397154c87b14fab48d2fc231ba83007c1b Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Date: Wed, 5 Jun 2013 09:04:59 +0200
|
||||
Subject: [PATCH 029/203] arm: mvebu: don't hardcode the physical address for
|
||||
mvebu-mbus
|
||||
|
||||
Since the mvebu-mbus driver doesn't yet have a DT binding (and this DT
|
||||
binding may not necessarily be ready for 3.11), the physical address
|
||||
of the mvebu-mbus registers are currently hardcoded. This doesn't play
|
||||
well with the fact that the internal registers base address may be
|
||||
different depending on the bootloader.
|
||||
|
||||
In order to have only one central place for the physical address of
|
||||
the internal registers, we now use of_translate_address() to translate
|
||||
the mvebu-mbus register offsets into the real physical address, by
|
||||
using DT-based address translation. This will go away once the
|
||||
mvebu-mbus driver gains a proper DT binding.
|
||||
|
||||
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Acked-by: Arnd Bergmann <arnd@arndb.de>
|
||||
Signed-off-by: Jason Cooper <jason@lakedaemon.net>
|
||||
---
|
||||
arch/arm/mach-mvebu/armada-370-xp.c | 38 ++++++++++++++++++++++++++-----------
|
||||
arch/arm/mach-mvebu/armada-370-xp.h | 8 --------
|
||||
2 files changed, 27 insertions(+), 19 deletions(-)
|
||||
|
||||
--- a/arch/arm/mach-mvebu/armada-370-xp.c
|
||||
+++ b/arch/arm/mach-mvebu/armada-370-xp.c
|
||||
@@ -14,6 +14,7 @@
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
+#include <linux/of_address.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/time-armada-370-xp.h>
|
||||
@@ -34,29 +35,44 @@ static void __init armada_370_xp_map_io(
|
||||
debug_ll_io_init();
|
||||
}
|
||||
|
||||
-static void __init armada_370_xp_timer_and_clk_init(void)
|
||||
+/*
|
||||
+ * This initialization will be replaced by a DT-based
|
||||
+ * initialization once the mvebu-mbus driver gains DT support.
|
||||
+ */
|
||||
+
|
||||
+#define ARMADA_370_XP_MBUS_WINS_OFFS 0x20000
|
||||
+#define ARMADA_370_XP_MBUS_WINS_SIZE 0x100
|
||||
+#define ARMADA_370_XP_SDRAM_WINS_OFFS 0x20180
|
||||
+#define ARMADA_370_XP_SDRAM_WINS_SIZE 0x20
|
||||
+
|
||||
+static void __init armada_370_xp_mbus_init(void)
|
||||
{
|
||||
char *mbus_soc_name;
|
||||
+ struct device_node *dn;
|
||||
+ const __be32 mbus_wins_offs = cpu_to_be32(ARMADA_370_XP_MBUS_WINS_OFFS);
|
||||
+ const __be32 sdram_wins_offs = cpu_to_be32(ARMADA_370_XP_SDRAM_WINS_OFFS);
|
||||
|
||||
- mvebu_clocks_init();
|
||||
- armada_370_xp_timer_init();
|
||||
- coherency_init();
|
||||
-
|
||||
- /*
|
||||
- * This initialization will be replaced by a DT-based
|
||||
- * initialization once the mvebu-mbus driver gains DT support.
|
||||
- */
|
||||
if (of_machine_is_compatible("marvell,armada370"))
|
||||
mbus_soc_name = "marvell,armada370-mbus";
|
||||
else
|
||||
mbus_soc_name = "marvell,armadaxp-mbus";
|
||||
|
||||
+ dn = of_find_node_by_name(NULL, "internal-regs");
|
||||
+ BUG_ON(!dn);
|
||||
+
|
||||
mvebu_mbus_init(mbus_soc_name,
|
||||
- ARMADA_370_XP_MBUS_WINS_BASE,
|
||||
+ of_translate_address(dn, &mbus_wins_offs),
|
||||
ARMADA_370_XP_MBUS_WINS_SIZE,
|
||||
- ARMADA_370_XP_SDRAM_WINS_BASE,
|
||||
+ of_translate_address(dn, &sdram_wins_offs),
|
||||
ARMADA_370_XP_SDRAM_WINS_SIZE);
|
||||
+}
|
||||
|
||||
+static void __init armada_370_xp_timer_and_clk_init(void)
|
||||
+{
|
||||
+ mvebu_clocks_init();
|
||||
+ armada_370_xp_timer_init();
|
||||
+ coherency_init();
|
||||
+ armada_370_xp_mbus_init();
|
||||
#ifdef CONFIG_CACHE_L2X0
|
||||
l2x0_of_init(0, ~0UL);
|
||||
#endif
|
||||
--- a/arch/arm/mach-mvebu/armada-370-xp.h
|
||||
+++ b/arch/arm/mach-mvebu/armada-370-xp.h
|
||||
@@ -15,14 +15,6 @@
|
||||
#ifndef __MACH_ARMADA_370_XP_H
|
||||
#define __MACH_ARMADA_370_XP_H
|
||||
|
||||
-#define ARMADA_370_XP_REGS_PHYS_BASE 0xd0000000
|
||||
-
|
||||
-/* These defines can go away once mvebu-mbus has a DT binding */
|
||||
-#define ARMADA_370_XP_MBUS_WINS_BASE (ARMADA_370_XP_REGS_PHYS_BASE + 0x20000)
|
||||
-#define ARMADA_370_XP_MBUS_WINS_SIZE 0x100
|
||||
-#define ARMADA_370_XP_SDRAM_WINS_BASE (ARMADA_370_XP_REGS_PHYS_BASE + 0x20180)
|
||||
-#define ARMADA_370_XP_SDRAM_WINS_SIZE 0x20
|
||||
-
|
||||
#ifdef CONFIG_SMP
|
||||
#include <linux/cpumask.h>
|
||||
|
|
@ -1,85 +0,0 @@
|
|||
From 70c30ca997919a4b8c9051a3903f30c79c735f12 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Date: Wed, 5 Jun 2013 09:05:00 +0200
|
||||
Subject: [PATCH 030/203] arm: mvebu: add another earlyprintk Kconfig option
|
||||
|
||||
In order to support both old and new bootloaders, we add a new Kconfig
|
||||
option for the earlyprintk UART selection. The existing option allows
|
||||
to work with old bootloaders (that keep the internal registers mapped
|
||||
at 0xd0000000), while the newly introduced option allows to work with
|
||||
new bootloaders (that remap the internal registers at 0xf1000000).
|
||||
|
||||
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Acked-by: Arnd Bergmann <arnd@arndb.de>
|
||||
Signed-off-by: Jason Cooper <jason@lakedaemon.net>
|
||||
---
|
||||
arch/arm/Kconfig.debug | 30 ++++++++++++++++++++++++++++--
|
||||
arch/arm/include/debug/mvebu.S | 5 +++++
|
||||
2 files changed, 33 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/arch/arm/Kconfig.debug
|
||||
+++ b/arch/arm/Kconfig.debug
|
||||
@@ -303,12 +303,37 @@ choice
|
||||
their output to the serial port on MSM 8960 devices.
|
||||
|
||||
config DEBUG_MVEBU_UART
|
||||
- bool "Kernel low-level debugging messages via MVEBU UART"
|
||||
+ bool "Kernel low-level debugging messages via MVEBU UART (old bootloaders)"
|
||||
depends on ARCH_MVEBU
|
||||
help
|
||||
Say Y here if you want kernel low-level debugging support
|
||||
on MVEBU based platforms.
|
||||
|
||||
+ This option should be used with the old bootloaders
|
||||
+ that left the internal registers mapped at
|
||||
+ 0xd0000000. As of today, this is the case on
|
||||
+ platforms such as the Globalscale Mirabox or the
|
||||
+ Plathome OpenBlocks AX3, when using the original
|
||||
+ bootloader.
|
||||
+
|
||||
+ If the wrong DEBUG_MVEBU_UART* option is selected,
|
||||
+ when u-boot hands over to the kernel, the system
|
||||
+ silently crashes, with no serial output at all.
|
||||
+
|
||||
+ config DEBUG_MVEBU_UART_ALTERNATE
|
||||
+ bool "Kernel low-level debugging messages via MVEBU UART (new bootloaders)"
|
||||
+ depends on ARCH_MVEBU
|
||||
+ help
|
||||
+ Say Y here if you want kernel low-level debugging support
|
||||
+ on MVEBU based platforms.
|
||||
+
|
||||
+ This option should be used with the new bootloaders
|
||||
+ that remap the internal registers at 0xf1000000.
|
||||
+
|
||||
+ If the wrong DEBUG_MVEBU_UART* option is selected,
|
||||
+ when u-boot hands over to the kernel, the system
|
||||
+ silently crashes, with no serial output at all.
|
||||
+
|
||||
config DEBUG_NOMADIK_UART
|
||||
bool "Kernel low-level debugging messages via NOMADIK UART"
|
||||
depends on ARCH_NOMADIK
|
||||
@@ -632,7 +657,8 @@ config DEBUG_LL_INCLUDE
|
||||
DEBUG_IMX51_UART || \
|
||||
DEBUG_IMX53_UART ||\
|
||||
DEBUG_IMX6Q_UART
|
||||
- default "debug/mvebu.S" if DEBUG_MVEBU_UART
|
||||
+ default "debug/mvebu.S" if DEBUG_MVEBU_UART || \
|
||||
+ DEBUG_MVEBU_UART_ALTERNATE
|
||||
default "debug/mxs.S" if DEBUG_IMX23_UART || DEBUG_IMX28_UART
|
||||
default "debug/nomadik.S" if DEBUG_NOMADIK_UART
|
||||
default "debug/omap2plus.S" if DEBUG_OMAP2PLUS_UART
|
||||
--- a/arch/arm/include/debug/mvebu.S
|
||||
+++ b/arch/arm/include/debug/mvebu.S
|
||||
@@ -11,7 +11,12 @@
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
+#ifdef CONFIG_DEBUG_MVEBU_UART_ALTERNATE
|
||||
+#define ARMADA_370_XP_REGS_PHYS_BASE 0xf1000000
|
||||
+#else
|
||||
#define ARMADA_370_XP_REGS_PHYS_BASE 0xd0000000
|
||||
+#endif
|
||||
+
|
||||
#define ARMADA_370_XP_REGS_VIRT_BASE 0xfec00000
|
||||
|
||||
.macro addruart, rp, rv, tmp
|
|
@ -1,27 +0,0 @@
|
|||
From 7a3b99b8d16f2eb9ae5ac4ddf5e201eacdfacbf4 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Date: Wed, 5 Jun 2013 09:05:01 +0200
|
||||
Subject: [PATCH 031/203] arm: mvebu: disable DEBUG_LL/EARLY_PRINTK in
|
||||
defconfig
|
||||
|
||||
Now that we have two different addresses for the UART, depending on
|
||||
which bootloader is used, it is no longer desirable to enable
|
||||
earlyprintk by default in the defconfig. Users who need earlyprintk
|
||||
support will have to enable it explicitly, and select the right UART
|
||||
configuration depending on their platform.
|
||||
|
||||
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Acked-by: Arnd Bergmann <arnd@arndb.de>
|
||||
Signed-off-by: Jason Cooper <jason@lakedaemon.net>
|
||||
---
|
||||
arch/arm/configs/mvebu_defconfig | 2 --
|
||||
1 file changed, 2 deletions(-)
|
||||
|
||||
--- a/arch/arm/configs/mvebu_defconfig
|
||||
+++ b/arch/arm/configs/mvebu_defconfig
|
||||
@@ -100,5 +100,3 @@ CONFIG_TIMER_STATS=y
|
||||
# CONFIG_DEBUG_BUGVERBOSE is not set
|
||||
CONFIG_DEBUG_INFO=y
|
||||
CONFIG_DEBUG_USER=y
|
||||
-CONFIG_DEBUG_LL=y
|
||||
-CONFIG_EARLY_PRINTK=y
|
|
@ -1,42 +0,0 @@
|
|||
From e552d168344e941a1781682207269dbfd27850b1 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Date: Tue, 18 Jun 2013 15:37:41 +0200
|
||||
Subject: [PATCH 032/203] arm: mvebu: enable mini-PCIe connectors on Armada 370
|
||||
RD
|
||||
|
||||
The Armada 370 RD board has two internal mini-PCIe connectors. This
|
||||
commit adds the necessary Device Tree informations to enable the usage
|
||||
of those mini-PCIe connectors.
|
||||
|
||||
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Cc: Florian Fainelli <florian@openwrt.org>
|
||||
Signed-off-by: Jason Cooper <jason@lakedaemon.net>
|
||||
---
|
||||
arch/arm/boot/dts/armada-370-rd.dts | 16 ++++++++++++++++
|
||||
1 file changed, 16 insertions(+)
|
||||
|
||||
--- a/arch/arm/boot/dts/armada-370-rd.dts
|
||||
+++ b/arch/arm/boot/dts/armada-370-rd.dts
|
||||
@@ -85,6 +85,22 @@
|
||||
gpios = <&gpio0 6 1>;
|
||||
};
|
||||
};
|
||||
+
|
||||
+ pcie-controller {
|
||||
+ status = "okay";
|
||||
+
|
||||
+ /* Internal mini-PCIe connector */
|
||||
+ pcie@1,0 {
|
||||
+ /* Port 0, Lane 0 */
|
||||
+ status = "okay";
|
||||
+ };
|
||||
+
|
||||
+ /* Internal mini-PCIe connector */
|
||||
+ pcie@2,0 {
|
||||
+ /* Port 1, Lane 0 */
|
||||
+ status = "okay";
|
||||
+ };
|
||||
+ };
|
||||
};
|
||||
};
|
||||
};
|
|
@ -1,41 +0,0 @@
|
|||
From 3891658a01af7e875d4c176ebb5d713d74a6e998 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Date: Thu, 20 Jun 2013 09:45:26 +0200
|
||||
Subject: [PATCH 033/203] arm: mvebu: fix coherency_late_init() for
|
||||
multiplatform
|
||||
|
||||
As noticed by Arnaud Patard (Rtp) <arnaud.patard@rtp-net.org>, commit
|
||||
865e0527d2d7 ('arm: mvebu: avoid hardcoded virtual address in
|
||||
coherency code') added a postcore_initcall() to register the bus
|
||||
notifier that the mvebu code needs to apply correct DMA operations on
|
||||
its platform devices breaks the multiplatform boot on other platforms,
|
||||
because the bus notifier registration is unconditional.
|
||||
|
||||
This commit fixes that by registering the bus notifier only if we have
|
||||
the mvebu coherency unit described in the Device Tree. The conditional
|
||||
used is exactly the same in which the bus_register_notifier() call was
|
||||
originally enclosed before 865e0527d2d7 ('arm: mvebu: avoid hardcoded
|
||||
virtual address in coherency code').
|
||||
|
||||
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Reported-by: Arnaud Patard (Rtp) <arnaud.patard@rtp-net.org>
|
||||
Acked-by: Andrew Lunn <andrew@lunn.ch>
|
||||
Signed-off-by: Jason Cooper <jason@lakedaemon.net>
|
||||
---
|
||||
arch/arm/mach-mvebu/coherency.c | 5 +++--
|
||||
1 file changed, 3 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/arch/arm/mach-mvebu/coherency.c
|
||||
+++ b/arch/arm/mach-mvebu/coherency.c
|
||||
@@ -147,8 +147,9 @@ int __init coherency_init(void)
|
||||
|
||||
static int __init coherency_late_init(void)
|
||||
{
|
||||
- bus_register_notifier(&platform_bus_type,
|
||||
- &mvebu_hwcc_platform_nb);
|
||||
+ if (of_find_matching_node(NULL, of_coherency_table))
|
||||
+ bus_register_notifier(&platform_bus_type,
|
||||
+ &mvebu_hwcc_platform_nb);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1,53 +0,0 @@
|
|||
From 4f6da1286d2602e00c049c29eb9e816587c752a5 Mon Sep 17 00:00:00 2001
|
||||
From: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Date: Sat, 22 Jun 2013 13:52:27 -0300
|
||||
Subject: [PATCH 034/203] ARM: mvebu: fix length of ethernet registers in
|
||||
mv78260 dtsi
|
||||
|
||||
The length of the registers area for the Marvell 370/XP Ethernet controller
|
||||
was incorrect in the .dtsi: 0x2500, while it should have been 0x4000.
|
||||
This problem wasn't noticed because there used to be a static mapping for
|
||||
all the MMIO register region set up by ->map_io().
|
||||
|
||||
The register length was fixed in all the other device tree files,
|
||||
except from the armada-xp-mv78260.dtsi, in the following commit:
|
||||
|
||||
commit cf8088c5cac6ce20d914b9131533844b9291a054
|
||||
Author: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Date: Tue May 21 12:33:27 2013 +0200
|
||||
|
||||
arm: mvebu: fix length of Ethernet registers area in .dtsi
|
||||
|
||||
This commit fixes a kernel panic in mvneta_probe(), when the kernel
|
||||
tries to access the unmapped registers:
|
||||
|
||||
[ 163.639092] mvneta d0070000.ethernet eth0: mac: 6e:3c:4f:87:17:2e
|
||||
[ 163.646962] mvneta d0074000.ethernet eth1: mac: 6a:04:4e:6f:f5:ef
|
||||
[ 163.654853] mvneta d0030000.ethernet eth2: mac: 2a:99:19:19:fc:4c
|
||||
[ 163.661258] Unable to handle kernel paging request at virtual address f011bcf0
|
||||
[ 163.668523] pgd = c0004000
|
||||
[ 163.671237] [f011bcf0] *pgd=2f006811, *pte=00000000, *ppte=00000000
|
||||
[ 163.677565] Internal error: Oops: 807 [#1] SMP ARM
|
||||
[ 163.682370] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 3.10.0-rc6-01850-gba0682e #11
|
||||
[ 163.690046] task: ef04c000 ti: ef03e000 task.ti: ef03e000
|
||||
[ 163.695467] PC is at mvneta_probe+0x34c/0xabc
|
||||
[...]
|
||||
|
||||
Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Acked-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Signed-off-by: Jason Cooper <jason@lakedaemon.net>
|
||||
---
|
||||
arch/arm/boot/dts/armada-xp-mv78260.dtsi | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/arch/arm/boot/dts/armada-xp-mv78260.dtsi
|
||||
+++ b/arch/arm/boot/dts/armada-xp-mv78260.dtsi
|
||||
@@ -92,7 +92,7 @@
|
||||
|
||||
ethernet@34000 {
|
||||
compatible = "marvell,armada-370-neta";
|
||||
- reg = <0x34000 0x2500>;
|
||||
+ reg = <0x34000 0x4000>;
|
||||
interrupts = <14>;
|
||||
clocks = <&gateclk 1>;
|
||||
status = "disabled";
|
|
@ -1,51 +0,0 @@
|
|||
From 76de914223ec09274a7857e0d8cd7b739205dc3c Mon Sep 17 00:00:00 2001
|
||||
From: Gregory CLEMENT <gregory.clement@free-electrons.com>
|
||||
Date: Fri, 21 Jun 2013 15:32:06 +0200
|
||||
Subject: [PATCH 035/203] i2c: mv64xxx: Set bus frequency to 100kHz if
|
||||
clock-frequency is not provided
|
||||
|
||||
This commit adds checking whether clock-frequency property acquisition
|
||||
has succeeded. If not, the frequency is set to 100kHz by default.
|
||||
|
||||
The Device Tree binding documentation is updated accordingly.
|
||||
|
||||
Based on the intials patches from Zbigniew Bodek
|
||||
|
||||
Signed-off-by: Gregory CLEMENT <gregory.clement@free-electrons.com>
|
||||
Signed-off-by: Zbigniew Bodek <zbb@semihalf.com>
|
||||
Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
|
||||
---
|
||||
Documentation/devicetree/bindings/i2c/i2c-mv64xxx.txt | 6 +++++-
|
||||
drivers/i2c/busses/i2c-mv64xxx.c | 6 +++++-
|
||||
2 files changed, 10 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/Documentation/devicetree/bindings/i2c/i2c-mv64xxx.txt
|
||||
+++ b/Documentation/devicetree/bindings/i2c/i2c-mv64xxx.txt
|
||||
@@ -6,7 +6,11 @@ Required properties :
|
||||
- reg : Offset and length of the register set for the device
|
||||
- compatible : Should be "marvell,mv64xxx-i2c"
|
||||
- interrupts : The interrupt number
|
||||
- - clock-frequency : Desired I2C bus clock frequency in Hz.
|
||||
+
|
||||
+Optional properties :
|
||||
+
|
||||
+ - clock-frequency : Desired I2C bus clock frequency in Hz. If not set the
|
||||
+default frequency is 100kHz
|
||||
|
||||
Examples:
|
||||
|
||||
--- a/drivers/i2c/busses/i2c-mv64xxx.c
|
||||
+++ b/drivers/i2c/busses/i2c-mv64xxx.c
|
||||
@@ -580,7 +580,11 @@ mv64xxx_of_config(struct mv64xxx_i2c_dat
|
||||
goto out;
|
||||
}
|
||||
tclk = clk_get_rate(drv_data->clk);
|
||||
- of_property_read_u32(np, "clock-frequency", &bus_freq);
|
||||
+
|
||||
+ rc = of_property_read_u32(np, "clock-frequency", &bus_freq);
|
||||
+ if (rc)
|
||||
+ bus_freq = 100000; /* 100kHz by default */
|
||||
+
|
||||
if (!mv64xxx_find_baud_factors(bus_freq, tclk,
|
||||
&drv_data->freq_n, &drv_data->freq_m)) {
|
||||
rc = -EINVAL;
|
|
@ -1,91 +0,0 @@
|
|||
From 71a32c9519ba223d1dafcbe58d1699710720c5a8 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Date: Thu, 1 Aug 2013 15:44:19 +0200
|
||||
Subject: [PATCH 036/203] PCI: mvebu: Disable prefetchable memory support in
|
||||
PCI-to-PCI bridge
|
||||
|
||||
The Marvell PCIe driver uses an emulated PCI-to-PCI bridge to be able
|
||||
to dynamically set up MBus address decoding windows for PCI I/O and
|
||||
memory regions depending on the PCI devices enumerated by Linux.
|
||||
|
||||
However, this emulated PCI-to-PCI bridge logic makes the Linux PCI
|
||||
core believe that prefetchable memory regions are supported (because
|
||||
the registers are read/write), while in fact no adress decoding window
|
||||
is ever created for such regions. Since the Marvell MBus address
|
||||
decoding windows do not distinguish memory regions and prefetchable
|
||||
memory regions, this patch takes a simple approach: change the
|
||||
PCI-to-PCI bridge emulation to let the Linux PCI core know that we
|
||||
don't support prefetchable memory regions.
|
||||
|
||||
To achieve this, we simply make the prefetchable memory base a
|
||||
read-only register that always returns 0. Reading/writing all the
|
||||
other prefetchable memory related registers has no effect.
|
||||
|
||||
This problem was originally reported by Finn Hoffmann
|
||||
<finn@uni-bremen.de>, who couldn't get a RTL8111/8168B PCI NIC working
|
||||
on the NSA310 Kirkwood platform after updating to 3.11-rc. The problem
|
||||
was that the PCI-to-PCI bridge emulation was making the Linux PCI core
|
||||
believe that we support prefetchable memory, so the Linux PCI core was
|
||||
only filling the prefetchable memory base and limit registers, which
|
||||
does not lead to a MBus window being created. The below patch has been
|
||||
confirmed by Finn Hoffmann to fix his problem on Kirkwood, and has
|
||||
otherwise been successfully tested on the Armada XP GP platform with a
|
||||
e1000e PCIe NIC and a Marvell SATA PCIe card.
|
||||
|
||||
Reported-by: Finn Hoffmann <finn@uni-bremen.de>
|
||||
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
|
||||
---
|
||||
drivers/pci/host/pci-mvebu.c | 27 +--------------------------
|
||||
1 file changed, 1 insertion(+), 26 deletions(-)
|
||||
|
||||
--- a/drivers/pci/host/pci-mvebu.c
|
||||
+++ b/drivers/pci/host/pci-mvebu.c
|
||||
@@ -86,10 +86,6 @@ struct mvebu_sw_pci_bridge {
|
||||
u16 secondary_status;
|
||||
u16 membase;
|
||||
u16 memlimit;
|
||||
- u16 prefmembase;
|
||||
- u16 prefmemlimit;
|
||||
- u32 prefbaseupper;
|
||||
- u32 preflimitupper;
|
||||
u16 iobaseupper;
|
||||
u16 iolimitupper;
|
||||
u8 cappointer;
|
||||
@@ -419,15 +415,7 @@ static int mvebu_sw_pci_bridge_read(stru
|
||||
break;
|
||||
|
||||
case PCI_PREF_MEMORY_BASE:
|
||||
- *value = (bridge->prefmemlimit << 16 | bridge->prefmembase);
|
||||
- break;
|
||||
-
|
||||
- case PCI_PREF_BASE_UPPER32:
|
||||
- *value = bridge->prefbaseupper;
|
||||
- break;
|
||||
-
|
||||
- case PCI_PREF_LIMIT_UPPER32:
|
||||
- *value = bridge->preflimitupper;
|
||||
+ *value = 0;
|
||||
break;
|
||||
|
||||
case PCI_IO_BASE_UPPER16:
|
||||
@@ -501,19 +489,6 @@ static int mvebu_sw_pci_bridge_write(str
|
||||
mvebu_pcie_handle_membase_change(port);
|
||||
break;
|
||||
|
||||
- case PCI_PREF_MEMORY_BASE:
|
||||
- bridge->prefmembase = value & 0xffff;
|
||||
- bridge->prefmemlimit = value >> 16;
|
||||
- break;
|
||||
-
|
||||
- case PCI_PREF_BASE_UPPER32:
|
||||
- bridge->prefbaseupper = value;
|
||||
- break;
|
||||
-
|
||||
- case PCI_PREF_LIMIT_UPPER32:
|
||||
- bridge->preflimitupper = value;
|
||||
- break;
|
||||
-
|
||||
case PCI_IO_BASE_UPPER16:
|
||||
bridge->iobaseupper = value & 0xffff;
|
||||
bridge->iolimitupper = value >> 16;
|
|
@ -1,109 +0,0 @@
|
|||
From 9760aafa716292050a96d71a4bd7bd4e66053975 Mon Sep 17 00:00:00 2001
|
||||
From: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Date: Tue, 21 May 2013 10:24:48 -0300
|
||||
Subject: [PATCH 037/203] memory: mvebu-devbus: Remove address decoding window
|
||||
workaround
|
||||
|
||||
Now that mbus device tree binding has been introduced, remove the address
|
||||
decoding window management from this driver.
|
||||
A suitable 'ranges' entry should be added to the devbus-compatible node in
|
||||
the device tree, as described by the mbus binding documentation.
|
||||
|
||||
Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Tested-by: Andrew Lunn <andrew@lunn.ch>
|
||||
Tested-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
|
||||
---
|
||||
drivers/memory/mvebu-devbus.c | 64 ++-----------------------------------------
|
||||
1 file changed, 2 insertions(+), 62 deletions(-)
|
||||
|
||||
--- a/drivers/memory/mvebu-devbus.c
|
||||
+++ b/drivers/memory/mvebu-devbus.c
|
||||
@@ -208,16 +208,11 @@ static int mvebu_devbus_probe(struct pla
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
struct device_node *node = pdev->dev.of_node;
|
||||
- struct device_node *parent;
|
||||
struct devbus *devbus;
|
||||
struct resource *res;
|
||||
struct clk *clk;
|
||||
unsigned long rate;
|
||||
- const __be32 *ranges;
|
||||
- int err, cs;
|
||||
- int addr_cells, p_addr_cells, size_cells;
|
||||
- int ranges_len, tuple_len;
|
||||
- u32 base, size;
|
||||
+ int err;
|
||||
|
||||
devbus = devm_kzalloc(&pdev->dev, sizeof(struct devbus), GFP_KERNEL);
|
||||
if (!devbus)
|
||||
@@ -248,68 +243,13 @@ static int mvebu_devbus_probe(struct pla
|
||||
return err;
|
||||
|
||||
/*
|
||||
- * Allocate an address window for this device.
|
||||
- * If the device probing fails, then we won't be able to
|
||||
- * remove the allocated address decoding window.
|
||||
- *
|
||||
- * FIXME: This is only a temporary hack! We need to do this here
|
||||
- * because we still don't have device tree bindings for mbus.
|
||||
- * Once that support is added, we will declare these address windows
|
||||
- * statically in the device tree, and remove the window configuration
|
||||
- * from here.
|
||||
- */
|
||||
-
|
||||
- /*
|
||||
- * Get the CS to choose the window string.
|
||||
- * This is a bit hacky, but it will be removed once the
|
||||
- * address windows are declared in the device tree.
|
||||
- */
|
||||
- cs = (((unsigned long)devbus->base) % 0x400) / 8;
|
||||
-
|
||||
- /*
|
||||
- * Parse 'ranges' property to obtain a (base,size) window tuple.
|
||||
- * This will be removed once the address windows
|
||||
- * are declared in the device tree.
|
||||
- */
|
||||
- parent = of_get_parent(node);
|
||||
- if (!parent)
|
||||
- return -EINVAL;
|
||||
-
|
||||
- p_addr_cells = of_n_addr_cells(parent);
|
||||
- of_node_put(parent);
|
||||
-
|
||||
- addr_cells = of_n_addr_cells(node);
|
||||
- size_cells = of_n_size_cells(node);
|
||||
- tuple_len = (p_addr_cells + addr_cells + size_cells) * sizeof(__be32);
|
||||
-
|
||||
- ranges = of_get_property(node, "ranges", &ranges_len);
|
||||
- if (ranges == NULL || ranges_len != tuple_len)
|
||||
- return -EINVAL;
|
||||
-
|
||||
- base = of_translate_address(node, ranges + addr_cells);
|
||||
- if (base == OF_BAD_ADDR)
|
||||
- return -EINVAL;
|
||||
- size = of_read_number(ranges + addr_cells + p_addr_cells, size_cells);
|
||||
-
|
||||
- /*
|
||||
- * Create an mbus address windows.
|
||||
- * FIXME: Remove this, together with the above code, once the
|
||||
- * address windows are declared in the device tree.
|
||||
- */
|
||||
- err = mvebu_mbus_add_window(devbus_wins[cs], base, size);
|
||||
- if (err < 0)
|
||||
- return err;
|
||||
-
|
||||
- /*
|
||||
* We need to create a child device explicitly from here to
|
||||
* guarantee that the child will be probed after the timing
|
||||
* parameters for the bus are written.
|
||||
*/
|
||||
err = of_platform_populate(node, NULL, NULL, dev);
|
||||
- if (err < 0) {
|
||||
- mvebu_mbus_del_window(base, size);
|
||||
+ if (err < 0)
|
||||
return err;
|
||||
- }
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -1,90 +0,0 @@
|
|||
From 93b6bd1bf81cffd3e5739478c4434bf25458ec7d Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Date: Fri, 5 Jul 2013 14:54:16 +0200
|
||||
Subject: [PATCH 038/203] bus: mvebu-mbus: Add new API for window creation
|
||||
|
||||
We add an API to create MBus address decoding windows from the target
|
||||
ID and attribute. This function will be used later and deprecate the
|
||||
current name based scheme.
|
||||
|
||||
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Tested-by: Andrew Lunn <andrew@lunn.ch>
|
||||
Tested-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
|
||||
---
|
||||
drivers/bus/mvebu-mbus.c | 33 +++++++++++++++++++++++++--------
|
||||
include/linux/mbus.h | 6 ++++++
|
||||
2 files changed, 31 insertions(+), 8 deletions(-)
|
||||
|
||||
--- a/drivers/bus/mvebu-mbus.c
|
||||
+++ b/drivers/bus/mvebu-mbus.c
|
||||
@@ -748,6 +748,22 @@ static const struct of_device_id of_mveb
|
||||
/*
|
||||
* Public API of the driver
|
||||
*/
|
||||
+int mvebu_mbus_add_window_remap_by_id(unsigned int target,
|
||||
+ unsigned int attribute,
|
||||
+ phys_addr_t base, size_t size,
|
||||
+ phys_addr_t remap)
|
||||
+{
|
||||
+ struct mvebu_mbus_state *s = &mbus_state;
|
||||
+
|
||||
+ if (!mvebu_mbus_window_conflicts(s, base, size, target, attribute)) {
|
||||
+ pr_err("cannot add window '%x:%x', conflicts with another window\n",
|
||||
+ target, attribute);
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ return mvebu_mbus_alloc_window(s, base, size, remap, target, attribute);
|
||||
+}
|
||||
+
|
||||
int mvebu_mbus_add_window_remap_flags(const char *devname, phys_addr_t base,
|
||||
size_t size, phys_addr_t remap,
|
||||
unsigned int flags)
|
||||
@@ -776,14 +792,8 @@ int mvebu_mbus_add_window_remap_flags(co
|
||||
else if (flags == MVEBU_MBUS_PCI_WA)
|
||||
attr |= 0x28;
|
||||
|
||||
- if (!mvebu_mbus_window_conflicts(s, base, size, target, attr)) {
|
||||
- pr_err("cannot add window '%s', conflicts with another window\n",
|
||||
- devname);
|
||||
- return -EINVAL;
|
||||
- }
|
||||
-
|
||||
- return mvebu_mbus_alloc_window(s, base, size, remap, target, attr);
|
||||
-
|
||||
+ return mvebu_mbus_add_window_remap_by_id(target, attr, base,
|
||||
+ size, remap);
|
||||
}
|
||||
|
||||
int mvebu_mbus_add_window(const char *devname, phys_addr_t base, size_t size)
|
||||
@@ -792,6 +802,13 @@ int mvebu_mbus_add_window(const char *de
|
||||
MVEBU_MBUS_NO_REMAP, 0);
|
||||
}
|
||||
|
||||
+int mvebu_mbus_add_window_by_id(unsigned int target, unsigned int attribute,
|
||||
+ phys_addr_t base, size_t size)
|
||||
+{
|
||||
+ return mvebu_mbus_add_window_remap_by_id(target, attribute, base,
|
||||
+ size, MVEBU_MBUS_NO_REMAP);
|
||||
+}
|
||||
+
|
||||
int mvebu_mbus_del_window(phys_addr_t base, size_t size)
|
||||
{
|
||||
int win;
|
||||
--- a/include/linux/mbus.h
|
||||
+++ b/include/linux/mbus.h
|
||||
@@ -62,8 +62,14 @@ static inline const struct mbus_dram_tar
|
||||
int mvebu_mbus_add_window_remap_flags(const char *devname, phys_addr_t base,
|
||||
size_t size, phys_addr_t remap,
|
||||
unsigned int flags);
|
||||
+int mvebu_mbus_add_window_remap_by_id(unsigned int target,
|
||||
+ unsigned int attribute,
|
||||
+ phys_addr_t base, size_t size,
|
||||
+ phys_addr_t remap);
|
||||
int mvebu_mbus_add_window(const char *devname, phys_addr_t base,
|
||||
size_t size);
|
||||
+int mvebu_mbus_add_window_by_id(unsigned int target, unsigned int attribute,
|
||||
+ phys_addr_t base, size_t size);
|
||||
int mvebu_mbus_del_window(phys_addr_t base, size_t size);
|
||||
int mvebu_mbus_init(const char *soc, phys_addr_t mbus_phys_base,
|
||||
size_t mbus_size, phys_addr_t sdram_phys_base,
|
|
@ -1,81 +0,0 @@
|
|||
From 5be79ea0d2bcec8c7360cfe3e7a491e5f176fa84 Mon Sep 17 00:00:00 2001
|
||||
From: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Date: Tue, 21 May 2013 10:44:54 -0300
|
||||
Subject: [PATCH 043/203] bus: mvebu-mbus: Factor out initialization details
|
||||
|
||||
We introduce a common initialization function mvebu_mbus_common_init()
|
||||
that will be used by both legacy and device-tree initialization code.
|
||||
This patch is an intermediate step, which will allow to introduce the
|
||||
DT binding for this driver in a less intrusive way.
|
||||
|
||||
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Tested-by: Andrew Lunn <andrew@lunn.ch>
|
||||
Tested-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
|
||||
---
|
||||
drivers/bus/mvebu-mbus.c | 47 ++++++++++++++++++++++++++++++-----------------
|
||||
1 file changed, 30 insertions(+), 17 deletions(-)
|
||||
|
||||
--- a/drivers/bus/mvebu-mbus.c
|
||||
+++ b/drivers/bus/mvebu-mbus.c
|
||||
@@ -847,26 +847,14 @@ static __init int mvebu_mbus_debugfs_ini
|
||||
}
|
||||
fs_initcall(mvebu_mbus_debugfs_init);
|
||||
|
||||
-int __init mvebu_mbus_init(const char *soc, phys_addr_t mbuswins_phys_base,
|
||||
- size_t mbuswins_size,
|
||||
- phys_addr_t sdramwins_phys_base,
|
||||
- size_t sdramwins_size)
|
||||
+static int __init mvebu_mbus_common_init(struct mvebu_mbus_state *mbus,
|
||||
+ phys_addr_t mbuswins_phys_base,
|
||||
+ size_t mbuswins_size,
|
||||
+ phys_addr_t sdramwins_phys_base,
|
||||
+ size_t sdramwins_size)
|
||||
{
|
||||
- struct mvebu_mbus_state *mbus = &mbus_state;
|
||||
- const struct of_device_id *of_id;
|
||||
int win;
|
||||
|
||||
- for (of_id = of_mvebu_mbus_ids; of_id->compatible; of_id++)
|
||||
- if (!strcmp(of_id->compatible, soc))
|
||||
- break;
|
||||
-
|
||||
- if (!of_id->compatible) {
|
||||
- pr_err("could not find a matching SoC family\n");
|
||||
- return -ENODEV;
|
||||
- }
|
||||
-
|
||||
- mbus->soc = of_id->data;
|
||||
-
|
||||
mbus->mbuswins_base = ioremap(mbuswins_phys_base, mbuswins_size);
|
||||
if (!mbus->mbuswins_base)
|
||||
return -ENOMEM;
|
||||
@@ -887,3 +875,28 @@ int __init mvebu_mbus_init(const char *s
|
||||
|
||||
return 0;
|
||||
}
|
||||
+
|
||||
+int __init mvebu_mbus_init(const char *soc, phys_addr_t mbuswins_phys_base,
|
||||
+ size_t mbuswins_size,
|
||||
+ phys_addr_t sdramwins_phys_base,
|
||||
+ size_t sdramwins_size)
|
||||
+{
|
||||
+ const struct of_device_id *of_id;
|
||||
+
|
||||
+ for (of_id = of_mvebu_mbus_ids; of_id->compatible; of_id++)
|
||||
+ if (!strcmp(of_id->compatible, soc))
|
||||
+ break;
|
||||
+
|
||||
+ if (!of_id->compatible) {
|
||||
+ pr_err("could not find a matching SoC family\n");
|
||||
+ return -ENODEV;
|
||||
+ }
|
||||
+
|
||||
+ mbus_state.soc = of_id->data;
|
||||
+
|
||||
+ return mvebu_mbus_common_init(&mbus_state,
|
||||
+ mbuswins_phys_base,
|
||||
+ mbuswins_size,
|
||||
+ sdramwins_phys_base,
|
||||
+ sdramwins_size);
|
||||
+}
|
|
@ -1,83 +0,0 @@
|
|||
From e4123095febc94c547c0459db752e7879db79d76 Mon Sep 17 00:00:00 2001
|
||||
From: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Date: Tue, 21 May 2013 10:48:54 -0300
|
||||
Subject: [PATCH 044/203] bus: mvebu-mbus: Introduce device tree binding
|
||||
|
||||
This patch adds the most fundamental device-tree initialization.
|
||||
We only introduce what's required to be able to probe the mvebu-mbus
|
||||
driver from the DT. Follow-up patches will extend the device tree binding,
|
||||
allowing to describe static address decoding windows.
|
||||
|
||||
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Tested-by: Andrew Lunn <andrew@lunn.ch>
|
||||
Tested-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
|
||||
---
|
||||
drivers/bus/mvebu-mbus.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
include/linux/mbus.h | 1 +
|
||||
2 files changed, 50 insertions(+)
|
||||
|
||||
--- a/drivers/bus/mvebu-mbus.c
|
||||
+++ b/drivers/bus/mvebu-mbus.c
|
||||
@@ -900,3 +900,52 @@ int __init mvebu_mbus_init(const char *s
|
||||
sdramwins_phys_base,
|
||||
sdramwins_size);
|
||||
}
|
||||
+
|
||||
+#ifdef CONFIG_OF
|
||||
+int __init mvebu_mbus_dt_init(void)
|
||||
+{
|
||||
+ struct resource mbuswins_res, sdramwins_res;
|
||||
+ struct device_node *np, *controller;
|
||||
+ const struct of_device_id *of_id;
|
||||
+ const __be32 *prop;
|
||||
+ int ret;
|
||||
+
|
||||
+ np = of_find_matching_node(NULL, of_mvebu_mbus_ids);
|
||||
+ if (!np) {
|
||||
+ pr_err("could not find a matching SoC family\n");
|
||||
+ return -ENODEV;
|
||||
+ }
|
||||
+
|
||||
+ of_id = of_match_node(of_mvebu_mbus_ids, np);
|
||||
+ mbus_state.soc = of_id->data;
|
||||
+
|
||||
+ prop = of_get_property(np, "controller", NULL);
|
||||
+ if (!prop) {
|
||||
+ pr_err("required 'controller' property missing\n");
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ controller = of_find_node_by_phandle(be32_to_cpup(prop));
|
||||
+ if (!controller) {
|
||||
+ pr_err("could not find an 'mbus-controller' node\n");
|
||||
+ return -ENODEV;
|
||||
+ }
|
||||
+
|
||||
+ if (of_address_to_resource(controller, 0, &mbuswins_res)) {
|
||||
+ pr_err("cannot get MBUS register address\n");
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ if (of_address_to_resource(controller, 1, &sdramwins_res)) {
|
||||
+ pr_err("cannot get SDRAM register address\n");
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ ret = mvebu_mbus_common_init(&mbus_state,
|
||||
+ mbuswins_res.start,
|
||||
+ resource_size(&mbuswins_res),
|
||||
+ sdramwins_res.start,
|
||||
+ resource_size(&sdramwins_res));
|
||||
+ return ret;
|
||||
+}
|
||||
+#endif
|
||||
--- a/include/linux/mbus.h
|
||||
+++ b/include/linux/mbus.h
|
||||
@@ -74,5 +74,6 @@ int mvebu_mbus_del_window(phys_addr_t ba
|
||||
int mvebu_mbus_init(const char *soc, phys_addr_t mbus_phys_base,
|
||||
size_t mbus_size, phys_addr_t sdram_phys_base,
|
||||
size_t sdram_size);
|
||||
+int mvebu_mbus_dt_init(void);
|
||||
|
||||
#endif /* __LINUX_MBUS_H */
|
|
@ -1,160 +0,0 @@
|
|||
From ece28a7e105cedb5a9ebd2553aa41d965fb83b64 Mon Sep 17 00:00:00 2001
|
||||
From: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Date: Tue, 28 May 2013 07:58:31 -0300
|
||||
Subject: [PATCH 045/203] bus: mvebu-mbus: Add static window allocation to the
|
||||
DT binding
|
||||
|
||||
This patch adds static window allocation to the device tree binding.
|
||||
Each first-child of the mbus-compatible node, with a suitable 'ranges'
|
||||
property, declaring an address translation, will trigger an address
|
||||
decoding window allocation.
|
||||
|
||||
Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Tested-by: Andrew Lunn <andrew@lunn.ch>
|
||||
Tested-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
|
||||
---
|
||||
drivers/bus/mvebu-mbus.c | 127 ++++++++++++++++++++++++++++++++++++++++++++++-
|
||||
1 file changed, 126 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/bus/mvebu-mbus.c
|
||||
+++ b/drivers/bus/mvebu-mbus.c
|
||||
@@ -902,6 +902,127 @@ int __init mvebu_mbus_init(const char *s
|
||||
}
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
+/*
|
||||
+ * The window IDs in the ranges DT property have the following format:
|
||||
+ * - bits 28 to 31: MBus custom field
|
||||
+ * - bits 24 to 27: window target ID
|
||||
+ * - bits 16 to 23: window attribute ID
|
||||
+ * - bits 0 to 15: unused
|
||||
+ */
|
||||
+#define CUSTOM(id) (((id) & 0xF0000000) >> 24)
|
||||
+#define TARGET(id) (((id) & 0x0F000000) >> 24)
|
||||
+#define ATTR(id) (((id) & 0x00FF0000) >> 16)
|
||||
+
|
||||
+static int __init mbus_dt_setup_win(struct mvebu_mbus_state *mbus,
|
||||
+ u32 base, u32 size,
|
||||
+ u8 target, u8 attr)
|
||||
+{
|
||||
+ const struct mvebu_mbus_mapping *map = mbus->soc->map;
|
||||
+ const char *name;
|
||||
+ int i;
|
||||
+
|
||||
+ /* Search for a suitable window in the existing mappings */
|
||||
+ for (i = 0; map[i].name; i++)
|
||||
+ if (map[i].target == target &&
|
||||
+ map[i].attr == (attr & map[i].attrmask))
|
||||
+ break;
|
||||
+
|
||||
+ name = map[i].name;
|
||||
+ if (!name) {
|
||||
+ pr_err("window 0x%x:0x%x is unknown, skipping\n",
|
||||
+ target, attr);
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ if (!mvebu_mbus_window_conflicts(mbus, base, size, target, attr)) {
|
||||
+ pr_err("cannot add window '%s', conflicts with another window\n",
|
||||
+ name);
|
||||
+ return -EBUSY;
|
||||
+ }
|
||||
+
|
||||
+ if (mvebu_mbus_alloc_window(mbus, base, size, MVEBU_MBUS_NO_REMAP,
|
||||
+ target, attr)) {
|
||||
+ pr_err("cannot add window '%s', too many windows\n",
|
||||
+ name);
|
||||
+ return -ENOMEM;
|
||||
+ }
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int __init
|
||||
+mbus_parse_ranges(struct device_node *node,
|
||||
+ int *addr_cells, int *c_addr_cells, int *c_size_cells,
|
||||
+ int *cell_count, const __be32 **ranges_start,
|
||||
+ const __be32 **ranges_end)
|
||||
+{
|
||||
+ const __be32 *prop;
|
||||
+ int ranges_len, tuple_len;
|
||||
+
|
||||
+ /* Allow a node with no 'ranges' property */
|
||||
+ *ranges_start = of_get_property(node, "ranges", &ranges_len);
|
||||
+ if (*ranges_start == NULL) {
|
||||
+ *addr_cells = *c_addr_cells = *c_size_cells = *cell_count = 0;
|
||||
+ *ranges_start = *ranges_end = NULL;
|
||||
+ return 0;
|
||||
+ }
|
||||
+ *ranges_end = *ranges_start + ranges_len / sizeof(__be32);
|
||||
+
|
||||
+ *addr_cells = of_n_addr_cells(node);
|
||||
+
|
||||
+ prop = of_get_property(node, "#address-cells", NULL);
|
||||
+ *c_addr_cells = be32_to_cpup(prop);
|
||||
+
|
||||
+ prop = of_get_property(node, "#size-cells", NULL);
|
||||
+ *c_size_cells = be32_to_cpup(prop);
|
||||
+
|
||||
+ *cell_count = *addr_cells + *c_addr_cells + *c_size_cells;
|
||||
+ tuple_len = (*cell_count) * sizeof(__be32);
|
||||
+
|
||||
+ if (ranges_len % tuple_len) {
|
||||
+ pr_warn("malformed ranges entry '%s'\n", node->name);
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int __init mbus_dt_setup(struct mvebu_mbus_state *mbus,
|
||||
+ struct device_node *np)
|
||||
+{
|
||||
+ int addr_cells, c_addr_cells, c_size_cells;
|
||||
+ int i, ret, cell_count;
|
||||
+ const __be32 *r, *ranges_start, *ranges_end;
|
||||
+
|
||||
+ ret = mbus_parse_ranges(np, &addr_cells, &c_addr_cells,
|
||||
+ &c_size_cells, &cell_count,
|
||||
+ &ranges_start, &ranges_end);
|
||||
+ if (ret < 0)
|
||||
+ return ret;
|
||||
+
|
||||
+ for (i = 0, r = ranges_start; r < ranges_end; r += cell_count, i++) {
|
||||
+ u32 windowid, base, size;
|
||||
+ u8 target, attr;
|
||||
+
|
||||
+ /*
|
||||
+ * An entry with a non-zero custom field do not
|
||||
+ * correspond to a static window, so skip it.
|
||||
+ */
|
||||
+ windowid = of_read_number(r, 1);
|
||||
+ if (CUSTOM(windowid))
|
||||
+ continue;
|
||||
+
|
||||
+ target = TARGET(windowid);
|
||||
+ attr = ATTR(windowid);
|
||||
+
|
||||
+ base = of_read_number(r + c_addr_cells, addr_cells);
|
||||
+ size = of_read_number(r + c_addr_cells + addr_cells,
|
||||
+ c_size_cells);
|
||||
+ ret = mbus_dt_setup_win(mbus, base, size, target, attr);
|
||||
+ if (ret < 0)
|
||||
+ return ret;
|
||||
+ }
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
int __init mvebu_mbus_dt_init(void)
|
||||
{
|
||||
struct resource mbuswins_res, sdramwins_res;
|
||||
@@ -946,6 +1067,10 @@ int __init mvebu_mbus_dt_init(void)
|
||||
resource_size(&mbuswins_res),
|
||||
sdramwins_res.start,
|
||||
resource_size(&sdramwins_res));
|
||||
- return ret;
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ /* Setup statically declared windows in the DT */
|
||||
+ return mbus_dt_setup(&mbus_state, np);
|
||||
}
|
||||
#endif
|
|
@ -1,121 +0,0 @@
|
|||
From c9646c891dbd07061a9ff5e061f9f9e54c571349 Mon Sep 17 00:00:00 2001
|
||||
From: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Date: Tue, 9 Jul 2013 10:41:53 -0300
|
||||
Subject: [PATCH 046/203] bus: mvebu-mbus: Add new API for the PCIe memory and
|
||||
IO aperture
|
||||
|
||||
We add two optional properties to the MBus DT binding, to encode
|
||||
the PCIe memory and IO aperture. This allows such information to
|
||||
be retrieved by -for instance- the pci driver to allocate the
|
||||
MBus decoding windows.
|
||||
|
||||
Correspondingly, and in order to retrieve this information,
|
||||
we add two new APIs.
|
||||
|
||||
Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Tested-by: Andrew Lunn <andrew@lunn.ch>
|
||||
Tested-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
|
||||
---
|
||||
drivers/bus/mvebu-mbus.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
include/linux/mbus.h | 4 ++++
|
||||
2 files changed, 53 insertions(+)
|
||||
|
||||
--- a/drivers/bus/mvebu-mbus.c
|
||||
+++ b/drivers/bus/mvebu-mbus.c
|
||||
@@ -142,6 +142,8 @@ struct mvebu_mbus_state {
|
||||
struct dentry *debugfs_root;
|
||||
struct dentry *debugfs_sdram;
|
||||
struct dentry *debugfs_devs;
|
||||
+ struct resource pcie_mem_aperture;
|
||||
+ struct resource pcie_io_aperture;
|
||||
const struct mvebu_mbus_soc_data *soc;
|
||||
int hw_io_coherency;
|
||||
};
|
||||
@@ -821,6 +823,20 @@ int mvebu_mbus_del_window(phys_addr_t ba
|
||||
return 0;
|
||||
}
|
||||
|
||||
+void mvebu_mbus_get_pcie_mem_aperture(struct resource *res)
|
||||
+{
|
||||
+ if (!res)
|
||||
+ return;
|
||||
+ *res = mbus_state.pcie_mem_aperture;
|
||||
+}
|
||||
+
|
||||
+void mvebu_mbus_get_pcie_io_aperture(struct resource *res)
|
||||
+{
|
||||
+ if (!res)
|
||||
+ return;
|
||||
+ *res = mbus_state.pcie_io_aperture;
|
||||
+}
|
||||
+
|
||||
static __init int mvebu_mbus_debugfs_init(void)
|
||||
{
|
||||
struct mvebu_mbus_state *s = &mbus_state;
|
||||
@@ -1023,6 +1039,35 @@ static int __init mbus_dt_setup(struct m
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static void __init mvebu_mbus_get_pcie_resources(struct device_node *np,
|
||||
+ struct resource *mem,
|
||||
+ struct resource *io)
|
||||
+{
|
||||
+ u32 reg[2];
|
||||
+ int ret;
|
||||
+
|
||||
+ /*
|
||||
+ * These are optional, so we clear them and they'll
|
||||
+ * be zero if they are missing from the DT.
|
||||
+ */
|
||||
+ memset(mem, 0, sizeof(struct resource));
|
||||
+ memset(io, 0, sizeof(struct resource));
|
||||
+
|
||||
+ ret = of_property_read_u32_array(np, "pcie-mem-aperture", reg, ARRAY_SIZE(reg));
|
||||
+ if (!ret) {
|
||||
+ mem->start = reg[0];
|
||||
+ mem->end = mem->start + reg[1];
|
||||
+ mem->flags = IORESOURCE_MEM;
|
||||
+ }
|
||||
+
|
||||
+ ret = of_property_read_u32_array(np, "pcie-io-aperture", reg, ARRAY_SIZE(reg));
|
||||
+ if (!ret) {
|
||||
+ io->start = reg[0];
|
||||
+ io->end = io->start + reg[1];
|
||||
+ io->flags = IORESOURCE_IO;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
int __init mvebu_mbus_dt_init(void)
|
||||
{
|
||||
struct resource mbuswins_res, sdramwins_res;
|
||||
@@ -1062,6 +1107,10 @@ int __init mvebu_mbus_dt_init(void)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
+ /* Get optional pcie-{mem,io}-aperture properties */
|
||||
+ mvebu_mbus_get_pcie_resources(np, &mbus_state.pcie_mem_aperture,
|
||||
+ &mbus_state.pcie_io_aperture);
|
||||
+
|
||||
ret = mvebu_mbus_common_init(&mbus_state,
|
||||
mbuswins_res.start,
|
||||
resource_size(&mbuswins_res),
|
||||
--- a/include/linux/mbus.h
|
||||
+++ b/include/linux/mbus.h
|
||||
@@ -11,6 +11,8 @@
|
||||
#ifndef __LINUX_MBUS_H
|
||||
#define __LINUX_MBUS_H
|
||||
|
||||
+struct resource;
|
||||
+
|
||||
struct mbus_dram_target_info
|
||||
{
|
||||
/*
|
||||
@@ -59,6 +61,8 @@ static inline const struct mbus_dram_tar
|
||||
}
|
||||
#endif
|
||||
|
||||
+void mvebu_mbus_get_pcie_mem_aperture(struct resource *res);
|
||||
+void mvebu_mbus_get_pcie_io_aperture(struct resource *res);
|
||||
int mvebu_mbus_add_window_remap_flags(const char *devname, phys_addr_t base,
|
||||
size_t size, phys_addr_t remap,
|
||||
unsigned int flags);
|
|
@ -1,184 +0,0 @@
|
|||
From 90b1f963b07d05e8243e5053a910e8a47222f7a1 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Date: Fri, 5 Jul 2013 14:54:17 +0200
|
||||
Subject: [PATCH 047/203] PCI: mvebu: Adapt to the new device tree layout
|
||||
|
||||
The new device tree layout encodes the window's target ID and attribute
|
||||
in the PCIe controller node's ranges property. This allows to parse
|
||||
such entries to obtain such information and use the recently introduced
|
||||
MBus API to create the windows, instead of using the current name based
|
||||
scheme.
|
||||
|
||||
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
|
||||
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Tested-by: Andrew Lunn <andrew@lunn.ch>
|
||||
Tested-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
|
||||
---
|
||||
drivers/pci/host/pci-mvebu.c | 113 ++++++++++++++++++++++++++++++++-----------
|
||||
1 file changed, 84 insertions(+), 29 deletions(-)
|
||||
|
||||
--- a/drivers/pci/host/pci-mvebu.c
|
||||
+++ b/drivers/pci/host/pci-mvebu.c
|
||||
@@ -119,6 +119,10 @@ struct mvebu_pcie_port {
|
||||
u32 port;
|
||||
u32 lane;
|
||||
int devfn;
|
||||
+ unsigned int mem_target;
|
||||
+ unsigned int mem_attr;
|
||||
+ unsigned int io_target;
|
||||
+ unsigned int io_attr;
|
||||
struct clk *clk;
|
||||
struct mvebu_sw_pci_bridge bridge;
|
||||
struct device_node *dn;
|
||||
@@ -303,10 +307,9 @@ static void mvebu_pcie_handle_iobase_cha
|
||||
(port->bridge.iolimitupper << 16)) -
|
||||
iobase);
|
||||
|
||||
- mvebu_mbus_add_window_remap_flags(port->name, port->iowin_base,
|
||||
- port->iowin_size,
|
||||
- iobase,
|
||||
- MVEBU_MBUS_PCI_IO);
|
||||
+ mvebu_mbus_add_window_remap_by_id(port->io_target, port->io_attr,
|
||||
+ port->iowin_base, port->iowin_size,
|
||||
+ iobase);
|
||||
|
||||
pci_ioremap_io(iobase, port->iowin_base);
|
||||
}
|
||||
@@ -338,10 +341,8 @@ static void mvebu_pcie_handle_membase_ch
|
||||
(((port->bridge.memlimit & 0xFFF0) << 16) | 0xFFFFF) -
|
||||
port->memwin_base;
|
||||
|
||||
- mvebu_mbus_add_window_remap_flags(port->name, port->memwin_base,
|
||||
- port->memwin_size,
|
||||
- MVEBU_MBUS_NO_REMAP,
|
||||
- MVEBU_MBUS_PCI_MEM);
|
||||
+ mvebu_mbus_add_window_by_id(port->mem_target, port->mem_attr,
|
||||
+ port->memwin_base, port->memwin_size);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -730,12 +731,54 @@ mvebu_pcie_map_registers(struct platform
|
||||
return devm_request_and_ioremap(&pdev->dev, ®s);
|
||||
}
|
||||
|
||||
+#define DT_FLAGS_TO_TYPE(flags) (((flags) >> 24) & 0x03)
|
||||
+#define DT_TYPE_IO 0x1
|
||||
+#define DT_TYPE_MEM32 0x2
|
||||
+#define DT_CPUADDR_TO_TARGET(cpuaddr) (((cpuaddr) >> 56) & 0xFF)
|
||||
+#define DT_CPUADDR_TO_ATTR(cpuaddr) (((cpuaddr) >> 48) & 0xFF)
|
||||
+
|
||||
+static int mvebu_get_tgt_attr(struct device_node *np, int devfn,
|
||||
+ unsigned long type, int *tgt, int *attr)
|
||||
+{
|
||||
+ const int na = 3, ns = 2;
|
||||
+ const __be32 *range;
|
||||
+ int rlen, nranges, rangesz, pna, i;
|
||||
+
|
||||
+ range = of_get_property(np, "ranges", &rlen);
|
||||
+ if (!range)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ pna = of_n_addr_cells(np);
|
||||
+ rangesz = pna + na + ns;
|
||||
+ nranges = rlen / sizeof(__be32) / rangesz;
|
||||
+
|
||||
+ for (i = 0; i < nranges; i++) {
|
||||
+ u32 flags = of_read_number(range, 1);
|
||||
+ u32 slot = of_read_number(range, 2);
|
||||
+ u64 cpuaddr = of_read_number(range + na, pna);
|
||||
+ unsigned long rtype;
|
||||
+
|
||||
+ if (DT_FLAGS_TO_TYPE(flags) == DT_TYPE_IO)
|
||||
+ rtype = IORESOURCE_IO;
|
||||
+ else if (DT_FLAGS_TO_TYPE(flags) == DT_TYPE_MEM32)
|
||||
+ rtype = IORESOURCE_MEM;
|
||||
+
|
||||
+ if (slot == PCI_SLOT(devfn) && type == rtype) {
|
||||
+ *tgt = DT_CPUADDR_TO_TARGET(cpuaddr);
|
||||
+ *attr = DT_CPUADDR_TO_ATTR(cpuaddr);
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+ range += rangesz;
|
||||
+ }
|
||||
+
|
||||
+ return -ENOENT;
|
||||
+}
|
||||
+
|
||||
static int __init mvebu_pcie_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct mvebu_pcie *pcie;
|
||||
struct device_node *np = pdev->dev.of_node;
|
||||
- struct of_pci_range range;
|
||||
- struct of_pci_range_parser parser;
|
||||
struct device_node *child;
|
||||
int i, ret;
|
||||
|
||||
@@ -746,29 +789,25 @@ static int __init mvebu_pcie_probe(struc
|
||||
|
||||
pcie->pdev = pdev;
|
||||
|
||||
- if (of_pci_range_parser_init(&parser, np))
|
||||
+ /* Get the PCIe memory and I/O aperture */
|
||||
+ mvebu_mbus_get_pcie_mem_aperture(&pcie->mem);
|
||||
+ if (resource_size(&pcie->mem) == 0) {
|
||||
+ dev_err(&pdev->dev, "invalid memory aperture size\n");
|
||||
return -EINVAL;
|
||||
+ }
|
||||
|
||||
- /* Get the I/O and memory ranges from DT */
|
||||
- for_each_of_pci_range(&parser, &range) {
|
||||
- unsigned long restype = range.flags & IORESOURCE_TYPE_BITS;
|
||||
- if (restype == IORESOURCE_IO) {
|
||||
- of_pci_range_to_resource(&range, np, &pcie->io);
|
||||
- of_pci_range_to_resource(&range, np, &pcie->realio);
|
||||
- pcie->io.name = "I/O";
|
||||
- pcie->realio.start = max_t(resource_size_t,
|
||||
- PCIBIOS_MIN_IO,
|
||||
- range.pci_addr);
|
||||
- pcie->realio.end = min_t(resource_size_t,
|
||||
- IO_SPACE_LIMIT,
|
||||
- range.pci_addr + range.size);
|
||||
- }
|
||||
- if (restype == IORESOURCE_MEM) {
|
||||
- of_pci_range_to_resource(&range, np, &pcie->mem);
|
||||
- pcie->mem.name = "MEM";
|
||||
- }
|
||||
+ mvebu_mbus_get_pcie_io_aperture(&pcie->io);
|
||||
+ if (resource_size(&pcie->io) == 0) {
|
||||
+ dev_err(&pdev->dev, "invalid I/O aperture size\n");
|
||||
+ return -EINVAL;
|
||||
}
|
||||
|
||||
+ pcie->realio.flags = pcie->io.flags;
|
||||
+ pcie->realio.start = PCIBIOS_MIN_IO;
|
||||
+ pcie->realio.end = min_t(resource_size_t,
|
||||
+ IO_SPACE_LIMIT,
|
||||
+ resource_size(&pcie->io));
|
||||
+
|
||||
/* Get the bus range */
|
||||
ret = of_pci_parse_bus_range(np, &pcie->busn);
|
||||
if (ret) {
|
||||
@@ -816,6 +855,22 @@ static int __init mvebu_pcie_probe(struc
|
||||
if (port->devfn < 0)
|
||||
continue;
|
||||
|
||||
+ ret = mvebu_get_tgt_attr(np, port->devfn, IORESOURCE_MEM,
|
||||
+ &port->mem_target, &port->mem_attr);
|
||||
+ if (ret < 0) {
|
||||
+ dev_err(&pdev->dev, "PCIe%d.%d: cannot get tgt/attr for mem window\n",
|
||||
+ port->port, port->lane);
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
+ ret = mvebu_get_tgt_attr(np, port->devfn, IORESOURCE_IO,
|
||||
+ &port->io_target, &port->io_attr);
|
||||
+ if (ret < 0) {
|
||||
+ dev_err(&pdev->dev, "PCIe%d.%d: cannot get tgt/attr for io window\n",
|
||||
+ port->port, port->lane);
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
port->base = mvebu_pcie_map_registers(pdev, child, port);
|
||||
if (!port->base) {
|
||||
dev_err(&pdev->dev, "PCIe%d.%d: cannot map registers\n",
|
|
@ -1,29 +0,0 @@
|
|||
From 3dc077a80c71050e198e7884707ece042443fe3c Mon Sep 17 00:00:00 2001
|
||||
From: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Date: Tue, 23 Jul 2013 07:36:00 -0300
|
||||
Subject: [PATCH 048/203] PCI: mvebu: Check valid base address before port
|
||||
setup
|
||||
|
||||
This driver does not fail to probe when it cannot obtain
|
||||
a port base address. Therefore, add a check for NULL base address
|
||||
before setting up the port, which prevents a kernel panic in such
|
||||
cases.
|
||||
|
||||
Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Tested-by: Andrew Lunn <andrew@lunn.ch>
|
||||
Tested-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
|
||||
---
|
||||
drivers/pci/host/pci-mvebu.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
--- a/drivers/pci/host/pci-mvebu.c
|
||||
+++ b/drivers/pci/host/pci-mvebu.c
|
||||
@@ -637,6 +637,8 @@ static int __init mvebu_pcie_setup(int n
|
||||
|
||||
for (i = 0; i < pcie->nports; i++) {
|
||||
struct mvebu_pcie_port *port = &pcie->ports[i];
|
||||
+ if (!port->base)
|
||||
+ continue;
|
||||
mvebu_pcie_setup_hw(port);
|
||||
}
|
||||
|
|
@ -1,82 +0,0 @@
|
|||
From 1e94a8740cb1f9c328a3ae8ec4727d90bfb2d7f7 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Date: Fri, 5 Jul 2013 14:54:23 +0200
|
||||
Subject: [PATCH 049/203] bus: mvebu-mbus: Remove the no longer used name-based
|
||||
API
|
||||
|
||||
Now that every user of the deprecated name-based API has been
|
||||
converted to using the ID-based API, let's remove the former one.
|
||||
|
||||
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Tested-by: Andrew Lunn <andrew@lunn.ch>
|
||||
Tested-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
|
||||
---
|
||||
drivers/bus/mvebu-mbus.c | 38 --------------------------------------
|
||||
include/linux/mbus.h | 5 -----
|
||||
2 files changed, 43 deletions(-)
|
||||
|
||||
--- a/drivers/bus/mvebu-mbus.c
|
||||
+++ b/drivers/bus/mvebu-mbus.c
|
||||
@@ -766,44 +766,6 @@ int mvebu_mbus_add_window_remap_by_id(un
|
||||
return mvebu_mbus_alloc_window(s, base, size, remap, target, attribute);
|
||||
}
|
||||
|
||||
-int mvebu_mbus_add_window_remap_flags(const char *devname, phys_addr_t base,
|
||||
- size_t size, phys_addr_t remap,
|
||||
- unsigned int flags)
|
||||
-{
|
||||
- struct mvebu_mbus_state *s = &mbus_state;
|
||||
- u8 target, attr;
|
||||
- int i;
|
||||
-
|
||||
- if (!s->soc->map)
|
||||
- return -ENODEV;
|
||||
-
|
||||
- for (i = 0; s->soc->map[i].name; i++)
|
||||
- if (!strcmp(s->soc->map[i].name, devname))
|
||||
- break;
|
||||
-
|
||||
- if (!s->soc->map[i].name) {
|
||||
- pr_err("unknown device '%s'\n", devname);
|
||||
- return -ENODEV;
|
||||
- }
|
||||
-
|
||||
- target = s->soc->map[i].target;
|
||||
- attr = s->soc->map[i].attr;
|
||||
-
|
||||
- if (flags == MVEBU_MBUS_PCI_MEM)
|
||||
- attr |= 0x8;
|
||||
- else if (flags == MVEBU_MBUS_PCI_WA)
|
||||
- attr |= 0x28;
|
||||
-
|
||||
- return mvebu_mbus_add_window_remap_by_id(target, attr, base,
|
||||
- size, remap);
|
||||
-}
|
||||
-
|
||||
-int mvebu_mbus_add_window(const char *devname, phys_addr_t base, size_t size)
|
||||
-{
|
||||
- return mvebu_mbus_add_window_remap_flags(devname, base, size,
|
||||
- MVEBU_MBUS_NO_REMAP, 0);
|
||||
-}
|
||||
-
|
||||
int mvebu_mbus_add_window_by_id(unsigned int target, unsigned int attribute,
|
||||
phys_addr_t base, size_t size)
|
||||
{
|
||||
--- a/include/linux/mbus.h
|
||||
+++ b/include/linux/mbus.h
|
||||
@@ -63,15 +63,10 @@ static inline const struct mbus_dram_tar
|
||||
|
||||
void mvebu_mbus_get_pcie_mem_aperture(struct resource *res);
|
||||
void mvebu_mbus_get_pcie_io_aperture(struct resource *res);
|
||||
-int mvebu_mbus_add_window_remap_flags(const char *devname, phys_addr_t base,
|
||||
- size_t size, phys_addr_t remap,
|
||||
- unsigned int flags);
|
||||
int mvebu_mbus_add_window_remap_by_id(unsigned int target,
|
||||
unsigned int attribute,
|
||||
phys_addr_t base, size_t size,
|
||||
phys_addr_t remap);
|
||||
-int mvebu_mbus_add_window(const char *devname, phys_addr_t base,
|
||||
- size_t size);
|
||||
int mvebu_mbus_add_window_by_id(unsigned int target, unsigned int attribute,
|
||||
phys_addr_t base, size_t size);
|
||||
int mvebu_mbus_del_window(phys_addr_t base, size_t size);
|
|
@ -1,266 +0,0 @@
|
|||
From 08c3b38a75ca47b74c81d14e1715ab9dc7b0e5cb Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Date: Fri, 5 Jul 2013 14:54:24 +0200
|
||||
Subject: [PATCH 050/203] bus: mvebu-mbus: Remove name -> target, attribute
|
||||
mapping tables
|
||||
|
||||
This tables were used together with the name-based MBus window
|
||||
creation API. Since that's has been removed, we can also remove
|
||||
the tables.
|
||||
|
||||
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Tested-by: Andrew Lunn <andrew@lunn.ch>
|
||||
Tested-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
|
||||
---
|
||||
drivers/bus/mvebu-mbus.c | 150 +++--------------------------------------------
|
||||
1 file changed, 7 insertions(+), 143 deletions(-)
|
||||
|
||||
--- a/drivers/bus/mvebu-mbus.c
|
||||
+++ b/drivers/bus/mvebu-mbus.c
|
||||
@@ -97,33 +97,6 @@
|
||||
|
||||
#define DOVE_DDR_BASE_CS_OFF(n) ((n) << 4)
|
||||
|
||||
-struct mvebu_mbus_mapping {
|
||||
- const char *name;
|
||||
- u8 target;
|
||||
- u8 attr;
|
||||
- u8 attrmask;
|
||||
-};
|
||||
-
|
||||
-/*
|
||||
- * Masks used for the 'attrmask' field of mvebu_mbus_mapping. They
|
||||
- * allow to get the real attribute value, discarding the special bits
|
||||
- * used to select a PCI MEM region or a PCI WA region. This allows the
|
||||
- * debugfs code to reverse-match the name of a device from its
|
||||
- * target/attr values.
|
||||
- *
|
||||
- * For all devices except PCI, all bits of 'attr' must be
|
||||
- * considered. For most SoCs, only bit 3 should be ignored (it allows
|
||||
- * to select between PCI MEM and PCI I/O). On Orion5x however, there
|
||||
- * is the special bit 5 to select a PCI WA region.
|
||||
- */
|
||||
-#define MAPDEF_NOMASK 0xff
|
||||
-#define MAPDEF_PCIMASK 0xf7
|
||||
-#define MAPDEF_ORIONPCIMASK 0xd7
|
||||
-
|
||||
-/* Macro used to define one mvebu_mbus_mapping entry */
|
||||
-#define MAPDEF(__n, __t, __a, __m) \
|
||||
- { .name = __n, .target = __t, .attr = __a, .attrmask = __m }
|
||||
-
|
||||
struct mvebu_mbus_state;
|
||||
|
||||
struct mvebu_mbus_soc_data {
|
||||
@@ -133,7 +106,6 @@ struct mvebu_mbus_soc_data {
|
||||
void (*setup_cpu_target)(struct mvebu_mbus_state *s);
|
||||
int (*show_cpu_target)(struct mvebu_mbus_state *s,
|
||||
struct seq_file *seq, void *v);
|
||||
- const struct mvebu_mbus_mapping *map;
|
||||
};
|
||||
|
||||
struct mvebu_mbus_state {
|
||||
@@ -430,8 +402,7 @@ static int mvebu_devs_debug_show(struct
|
||||
u64 wbase, wremap;
|
||||
u32 wsize;
|
||||
u8 wtarget, wattr;
|
||||
- int enabled, i;
|
||||
- const char *name;
|
||||
+ int enabled;
|
||||
|
||||
mvebu_mbus_read_window(mbus, win,
|
||||
&enabled, &wbase, &wsize,
|
||||
@@ -442,18 +413,9 @@ static int mvebu_devs_debug_show(struct
|
||||
continue;
|
||||
}
|
||||
|
||||
-
|
||||
- for (i = 0; mbus->soc->map[i].name; i++)
|
||||
- if (mbus->soc->map[i].target == wtarget &&
|
||||
- mbus->soc->map[i].attr ==
|
||||
- (wattr & mbus->soc->map[i].attrmask))
|
||||
- break;
|
||||
-
|
||||
- name = mbus->soc->map[i].name ?: "unknown";
|
||||
-
|
||||
- seq_printf(seq, "[%02d] %016llx - %016llx : %s",
|
||||
+ seq_printf(seq, "[%02d] %016llx - %016llx : %04x:%04x",
|
||||
win, (unsigned long long)wbase,
|
||||
- (unsigned long long)(wbase + wsize), name);
|
||||
+ (unsigned long long)(wbase + wsize), wtarget, wattr);
|
||||
|
||||
if (win < mbus->soc->num_remappable_wins) {
|
||||
seq_printf(seq, " (remap %016llx)\n",
|
||||
@@ -578,45 +540,12 @@ mvebu_mbus_dove_setup_cpu_target(struct
|
||||
mvebu_mbus_dram_info.num_cs = cs;
|
||||
}
|
||||
|
||||
-static const struct mvebu_mbus_mapping armada_370_map[] = {
|
||||
- MAPDEF("bootrom", 1, 0xe0, MAPDEF_NOMASK),
|
||||
- MAPDEF("devbus-boot", 1, 0x2f, MAPDEF_NOMASK),
|
||||
- MAPDEF("devbus-cs0", 1, 0x3e, MAPDEF_NOMASK),
|
||||
- MAPDEF("devbus-cs1", 1, 0x3d, MAPDEF_NOMASK),
|
||||
- MAPDEF("devbus-cs2", 1, 0x3b, MAPDEF_NOMASK),
|
||||
- MAPDEF("devbus-cs3", 1, 0x37, MAPDEF_NOMASK),
|
||||
- MAPDEF("pcie0.0", 4, 0xe0, MAPDEF_PCIMASK),
|
||||
- MAPDEF("pcie1.0", 8, 0xe0, MAPDEF_PCIMASK),
|
||||
- {},
|
||||
-};
|
||||
-
|
||||
static const struct mvebu_mbus_soc_data armada_370_mbus_data = {
|
||||
.num_wins = 20,
|
||||
.num_remappable_wins = 8,
|
||||
.win_cfg_offset = armada_370_xp_mbus_win_offset,
|
||||
.setup_cpu_target = mvebu_mbus_default_setup_cpu_target,
|
||||
.show_cpu_target = mvebu_sdram_debug_show_orion,
|
||||
- .map = armada_370_map,
|
||||
-};
|
||||
-
|
||||
-static const struct mvebu_mbus_mapping armada_xp_map[] = {
|
||||
- MAPDEF("bootrom", 1, 0x1d, MAPDEF_NOMASK),
|
||||
- MAPDEF("devbus-boot", 1, 0x2f, MAPDEF_NOMASK),
|
||||
- MAPDEF("devbus-cs0", 1, 0x3e, MAPDEF_NOMASK),
|
||||
- MAPDEF("devbus-cs1", 1, 0x3d, MAPDEF_NOMASK),
|
||||
- MAPDEF("devbus-cs2", 1, 0x3b, MAPDEF_NOMASK),
|
||||
- MAPDEF("devbus-cs3", 1, 0x37, MAPDEF_NOMASK),
|
||||
- MAPDEF("pcie0.0", 4, 0xe0, MAPDEF_PCIMASK),
|
||||
- MAPDEF("pcie0.1", 4, 0xd0, MAPDEF_PCIMASK),
|
||||
- MAPDEF("pcie0.2", 4, 0xb0, MAPDEF_PCIMASK),
|
||||
- MAPDEF("pcie0.3", 4, 0x70, MAPDEF_PCIMASK),
|
||||
- MAPDEF("pcie1.0", 8, 0xe0, MAPDEF_PCIMASK),
|
||||
- MAPDEF("pcie1.1", 8, 0xd0, MAPDEF_PCIMASK),
|
||||
- MAPDEF("pcie1.2", 8, 0xb0, MAPDEF_PCIMASK),
|
||||
- MAPDEF("pcie1.3", 8, 0x70, MAPDEF_PCIMASK),
|
||||
- MAPDEF("pcie2.0", 4, 0xf0, MAPDEF_PCIMASK),
|
||||
- MAPDEF("pcie3.0", 8, 0xf0, MAPDEF_PCIMASK),
|
||||
- {},
|
||||
};
|
||||
|
||||
static const struct mvebu_mbus_soc_data armada_xp_mbus_data = {
|
||||
@@ -625,15 +554,6 @@ static const struct mvebu_mbus_soc_data
|
||||
.win_cfg_offset = armada_370_xp_mbus_win_offset,
|
||||
.setup_cpu_target = mvebu_mbus_default_setup_cpu_target,
|
||||
.show_cpu_target = mvebu_sdram_debug_show_orion,
|
||||
- .map = armada_xp_map,
|
||||
-};
|
||||
-
|
||||
-static const struct mvebu_mbus_mapping kirkwood_map[] = {
|
||||
- MAPDEF("pcie0.0", 4, 0xe0, MAPDEF_PCIMASK),
|
||||
- MAPDEF("pcie1.0", 4, 0xd0, MAPDEF_PCIMASK),
|
||||
- MAPDEF("sram", 3, 0x01, MAPDEF_NOMASK),
|
||||
- MAPDEF("nand", 1, 0x2f, MAPDEF_NOMASK),
|
||||
- {},
|
||||
};
|
||||
|
||||
static const struct mvebu_mbus_soc_data kirkwood_mbus_data = {
|
||||
@@ -642,16 +562,6 @@ static const struct mvebu_mbus_soc_data
|
||||
.win_cfg_offset = orion_mbus_win_offset,
|
||||
.setup_cpu_target = mvebu_mbus_default_setup_cpu_target,
|
||||
.show_cpu_target = mvebu_sdram_debug_show_orion,
|
||||
- .map = kirkwood_map,
|
||||
-};
|
||||
-
|
||||
-static const struct mvebu_mbus_mapping dove_map[] = {
|
||||
- MAPDEF("pcie0.0", 0x4, 0xe0, MAPDEF_PCIMASK),
|
||||
- MAPDEF("pcie1.0", 0x8, 0xe0, MAPDEF_PCIMASK),
|
||||
- MAPDEF("cesa", 0x3, 0x01, MAPDEF_NOMASK),
|
||||
- MAPDEF("bootrom", 0x1, 0xfd, MAPDEF_NOMASK),
|
||||
- MAPDEF("scratchpad", 0xd, 0x0, MAPDEF_NOMASK),
|
||||
- {},
|
||||
};
|
||||
|
||||
static const struct mvebu_mbus_soc_data dove_mbus_data = {
|
||||
@@ -660,18 +570,6 @@ static const struct mvebu_mbus_soc_data
|
||||
.win_cfg_offset = orion_mbus_win_offset,
|
||||
.setup_cpu_target = mvebu_mbus_dove_setup_cpu_target,
|
||||
.show_cpu_target = mvebu_sdram_debug_show_dove,
|
||||
- .map = dove_map,
|
||||
-};
|
||||
-
|
||||
-static const struct mvebu_mbus_mapping orion5x_map[] = {
|
||||
- MAPDEF("pcie0.0", 4, 0x51, MAPDEF_ORIONPCIMASK),
|
||||
- MAPDEF("pci0.0", 3, 0x51, MAPDEF_ORIONPCIMASK),
|
||||
- MAPDEF("devbus-boot", 1, 0x0f, MAPDEF_NOMASK),
|
||||
- MAPDEF("devbus-cs0", 1, 0x1e, MAPDEF_NOMASK),
|
||||
- MAPDEF("devbus-cs1", 1, 0x1d, MAPDEF_NOMASK),
|
||||
- MAPDEF("devbus-cs2", 1, 0x1b, MAPDEF_NOMASK),
|
||||
- MAPDEF("sram", 0, 0x00, MAPDEF_NOMASK),
|
||||
- {},
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -684,7 +582,6 @@ static const struct mvebu_mbus_soc_data
|
||||
.win_cfg_offset = orion_mbus_win_offset,
|
||||
.setup_cpu_target = mvebu_mbus_default_setup_cpu_target,
|
||||
.show_cpu_target = mvebu_sdram_debug_show_orion,
|
||||
- .map = orion5x_map,
|
||||
};
|
||||
|
||||
static const struct mvebu_mbus_soc_data orion5x_2win_mbus_data = {
|
||||
@@ -693,21 +590,6 @@ static const struct mvebu_mbus_soc_data
|
||||
.win_cfg_offset = orion_mbus_win_offset,
|
||||
.setup_cpu_target = mvebu_mbus_default_setup_cpu_target,
|
||||
.show_cpu_target = mvebu_sdram_debug_show_orion,
|
||||
- .map = orion5x_map,
|
||||
-};
|
||||
-
|
||||
-static const struct mvebu_mbus_mapping mv78xx0_map[] = {
|
||||
- MAPDEF("pcie0.0", 4, 0xe0, MAPDEF_PCIMASK),
|
||||
- MAPDEF("pcie0.1", 4, 0xd0, MAPDEF_PCIMASK),
|
||||
- MAPDEF("pcie0.2", 4, 0xb0, MAPDEF_PCIMASK),
|
||||
- MAPDEF("pcie0.3", 4, 0x70, MAPDEF_PCIMASK),
|
||||
- MAPDEF("pcie1.0", 8, 0xe0, MAPDEF_PCIMASK),
|
||||
- MAPDEF("pcie1.1", 8, 0xd0, MAPDEF_PCIMASK),
|
||||
- MAPDEF("pcie1.2", 8, 0xb0, MAPDEF_PCIMASK),
|
||||
- MAPDEF("pcie1.3", 8, 0x70, MAPDEF_PCIMASK),
|
||||
- MAPDEF("pcie2.0", 4, 0xf0, MAPDEF_PCIMASK),
|
||||
- MAPDEF("pcie3.0", 8, 0xf0, MAPDEF_PCIMASK),
|
||||
- {},
|
||||
};
|
||||
|
||||
static const struct mvebu_mbus_soc_data mv78xx0_mbus_data = {
|
||||
@@ -716,7 +598,6 @@ static const struct mvebu_mbus_soc_data
|
||||
.win_cfg_offset = mv78xx0_mbus_win_offset,
|
||||
.setup_cpu_target = mvebu_mbus_default_setup_cpu_target,
|
||||
.show_cpu_target = mvebu_sdram_debug_show_orion,
|
||||
- .map = mv78xx0_map,
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -895,33 +776,16 @@ static int __init mbus_dt_setup_win(stru
|
||||
u32 base, u32 size,
|
||||
u8 target, u8 attr)
|
||||
{
|
||||
- const struct mvebu_mbus_mapping *map = mbus->soc->map;
|
||||
- const char *name;
|
||||
- int i;
|
||||
-
|
||||
- /* Search for a suitable window in the existing mappings */
|
||||
- for (i = 0; map[i].name; i++)
|
||||
- if (map[i].target == target &&
|
||||
- map[i].attr == (attr & map[i].attrmask))
|
||||
- break;
|
||||
-
|
||||
- name = map[i].name;
|
||||
- if (!name) {
|
||||
- pr_err("window 0x%x:0x%x is unknown, skipping\n",
|
||||
- target, attr);
|
||||
- return -EINVAL;
|
||||
- }
|
||||
-
|
||||
if (!mvebu_mbus_window_conflicts(mbus, base, size, target, attr)) {
|
||||
- pr_err("cannot add window '%s', conflicts with another window\n",
|
||||
- name);
|
||||
+ pr_err("cannot add window '%04x:%04x', conflicts with another window\n",
|
||||
+ target, attr);
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
if (mvebu_mbus_alloc_window(mbus, base, size, MVEBU_MBUS_NO_REMAP,
|
||||
target, attr)) {
|
||||
- pr_err("cannot add window '%s', too many windows\n",
|
||||
- name);
|
||||
+ pr_err("cannot add window '%04x:%04x', too many windows\n",
|
||||
+ target, attr);
|
||||
return -ENOMEM;
|
||||
}
|
||||
return 0;
|
|
@ -1,35 +0,0 @@
|
|||
From 8f14bc2a883316dfd95383900c61d7d9183e8eaf Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Date: Fri, 5 Jul 2013 14:54:25 +0200
|
||||
Subject: [PATCH 051/203] bus: mvebu-mbus: Update main description
|
||||
|
||||
After replacing the MBus name-based by the new ID-based API
|
||||
let's fix the general description of the driver at the beginning
|
||||
of the file.
|
||||
|
||||
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Tested-by: Andrew Lunn <andrew@lunn.ch>
|
||||
Tested-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
|
||||
---
|
||||
drivers/bus/mvebu-mbus.c | 10 +++-------
|
||||
1 file changed, 3 insertions(+), 7 deletions(-)
|
||||
|
||||
--- a/drivers/bus/mvebu-mbus.c
|
||||
+++ b/drivers/bus/mvebu-mbus.c
|
||||
@@ -35,13 +35,9 @@
|
||||
*
|
||||
* - Provides an API for platform code or device drivers to
|
||||
* dynamically add or remove address decoding windows for the CPU ->
|
||||
- * device accesses. This API is mvebu_mbus_add_window(),
|
||||
- * mvebu_mbus_add_window_remap_flags() and
|
||||
- * mvebu_mbus_del_window(). Since the (target, attribute) values
|
||||
- * differ from one SoC family to another, the API uses a 'const char
|
||||
- * *' string to identify devices, and this driver is responsible for
|
||||
- * knowing the mapping between the name of a device and its
|
||||
- * corresponding (target, attribute) in the current SoC family.
|
||||
+ * device accesses. This API is mvebu_mbus_add_window_by_id(),
|
||||
+ * mvebu_mbus_add_window_remap_by_id() and
|
||||
+ * mvebu_mbus_del_window().
|
||||
*
|
||||
* - Provides a debugfs interface in /sys/kernel/debug/mvebu-mbus/ to
|
||||
* see the list of CPU -> SDRAM windows and their configuration
|
|
@ -1,48 +0,0 @@
|
|||
From 2c8f0b1810ff9cd45ed2055441b4c43afcfb7d2a Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Date: Fri, 5 Jul 2013 14:54:26 +0200
|
||||
Subject: [PATCH 052/203] bus: mvebu-mbus: Factorize Armada 370/XP data
|
||||
structures
|
||||
|
||||
These structures were only different in the mapping tables.
|
||||
Now that those tables have been removed, it doesn't make any sense
|
||||
to keep different structures.
|
||||
|
||||
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Tested-by: Andrew Lunn <andrew@lunn.ch>
|
||||
Tested-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
|
||||
---
|
||||
drivers/bus/mvebu-mbus.c | 14 +++-----------
|
||||
1 file changed, 3 insertions(+), 11 deletions(-)
|
||||
|
||||
--- a/drivers/bus/mvebu-mbus.c
|
||||
+++ b/drivers/bus/mvebu-mbus.c
|
||||
@@ -536,15 +536,7 @@ mvebu_mbus_dove_setup_cpu_target(struct
|
||||
mvebu_mbus_dram_info.num_cs = cs;
|
||||
}
|
||||
|
||||
-static const struct mvebu_mbus_soc_data armada_370_mbus_data = {
|
||||
- .num_wins = 20,
|
||||
- .num_remappable_wins = 8,
|
||||
- .win_cfg_offset = armada_370_xp_mbus_win_offset,
|
||||
- .setup_cpu_target = mvebu_mbus_default_setup_cpu_target,
|
||||
- .show_cpu_target = mvebu_sdram_debug_show_orion,
|
||||
-};
|
||||
-
|
||||
-static const struct mvebu_mbus_soc_data armada_xp_mbus_data = {
|
||||
+static const struct mvebu_mbus_soc_data armada_370_xp_mbus_data = {
|
||||
.num_wins = 20,
|
||||
.num_remappable_wins = 8,
|
||||
.win_cfg_offset = armada_370_xp_mbus_win_offset,
|
||||
@@ -604,9 +596,9 @@ static const struct mvebu_mbus_soc_data
|
||||
*/
|
||||
static const struct of_device_id of_mvebu_mbus_ids[] = {
|
||||
{ .compatible = "marvell,armada370-mbus",
|
||||
- .data = &armada_370_mbus_data, },
|
||||
+ .data = &armada_370_xp_mbus_data, },
|
||||
{ .compatible = "marvell,armadaxp-mbus",
|
||||
- .data = &armada_xp_mbus_data, },
|
||||
+ .data = &armada_370_xp_mbus_data, },
|
||||
{ .compatible = "marvell,kirkwood-mbus",
|
||||
.data = &kirkwood_mbus_data, },
|
||||
{ .compatible = "marvell,dove-mbus",
|
|
@ -1,67 +0,0 @@
|
|||
From 23a9b291a7b9ba28b31da56e6ced7a8168baa3de Mon Sep 17 00:00:00 2001
|
||||
From: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Date: Tue, 21 May 2013 11:01:33 -0300
|
||||
Subject: [PATCH 053/203] ARM: mvebu: Remove the harcoded BootROM window
|
||||
allocation
|
||||
|
||||
The address decoding window to access the BootROM should not be
|
||||
allocated programatically, but instead declared in the device tree.
|
||||
|
||||
Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Tested-by: Andrew Lunn <andrew@lunn.ch>
|
||||
Tested-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
|
||||
---
|
||||
arch/arm/mach-mvebu/platsmp.c | 25 ++++++++++++++++++++++++-
|
||||
1 file changed, 24 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/arch/arm/mach-mvebu/platsmp.c
|
||||
+++ b/arch/arm/mach-mvebu/platsmp.c
|
||||
@@ -21,6 +21,7 @@
|
||||
#include <linux/smp.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/of.h>
|
||||
+#include <linux/of_address.h>
|
||||
#include <linux/mbus.h>
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/smp_plat.h>
|
||||
@@ -29,6 +30,9 @@
|
||||
#include "pmsu.h"
|
||||
#include "coherency.h"
|
||||
|
||||
+#define AXP_BOOTROM_BASE 0xfff00000
|
||||
+#define AXP_BOOTROM_SIZE 0x100000
|
||||
+
|
||||
void __init set_secondary_cpus_clock(void)
|
||||
{
|
||||
int thiscpu;
|
||||
@@ -115,10 +119,29 @@ static void __init armada_xp_smp_init_cp
|
||||
|
||||
void __init armada_xp_smp_prepare_cpus(unsigned int max_cpus)
|
||||
{
|
||||
+ struct device_node *node;
|
||||
+ struct resource res;
|
||||
+ int err;
|
||||
+
|
||||
set_secondary_cpus_clock();
|
||||
flush_cache_all();
|
||||
set_cpu_coherent(cpu_logical_map(smp_processor_id()), 0);
|
||||
- mvebu_mbus_add_window("bootrom", 0xfff00000, SZ_1M);
|
||||
+
|
||||
+ /*
|
||||
+ * In order to boot the secondary CPUs we need to ensure
|
||||
+ * the bootROM is mapped at the correct address.
|
||||
+ */
|
||||
+ node = of_find_compatible_node(NULL, NULL, "marvell,bootrom");
|
||||
+ if (!node)
|
||||
+ panic("Cannot find 'marvell,bootrom' compatible node");
|
||||
+
|
||||
+ err = of_address_to_resource(node, 0, &res);
|
||||
+ if (err < 0)
|
||||
+ panic("Cannot get 'bootrom' node address");
|
||||
+
|
||||
+ if (res.start != AXP_BOOTROM_BASE ||
|
||||
+ resource_size(&res) != AXP_BOOTROM_SIZE)
|
||||
+ panic("The address for the BootROM is incorrect");
|
||||
}
|
||||
|
||||
struct smp_operations armada_xp_smp_ops __initdata = {
|
|
@ -1,67 +0,0 @@
|
|||
From 08fe0e166c06fd86d6c8eed145d6508c3e5efaac Mon Sep 17 00:00:00 2001
|
||||
From: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Date: Tue, 21 May 2013 11:12:00 -0300
|
||||
Subject: [PATCH 054/203] ARM: mvebu: Initialize MBus using the DT binding
|
||||
|
||||
Now that the mbus device tree binding has been introduced, we can
|
||||
switch over to it.
|
||||
|
||||
Also, and since the initialization of the mbus driver is quite
|
||||
fundamental for the system to work properly, this patch adds a BUG()
|
||||
in case mbus fails to initialize.
|
||||
|
||||
Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Tested-by: Andrew Lunn <andrew@lunn.ch>
|
||||
Tested-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
|
||||
---
|
||||
arch/arm/mach-mvebu/armada-370-xp.c | 34 +---------------------------------
|
||||
1 file changed, 1 insertion(+), 33 deletions(-)
|
||||
|
||||
--- a/arch/arm/mach-mvebu/armada-370-xp.c
|
||||
+++ b/arch/arm/mach-mvebu/armada-370-xp.c
|
||||
@@ -35,44 +35,12 @@ static void __init armada_370_xp_map_io(
|
||||
debug_ll_io_init();
|
||||
}
|
||||
|
||||
-/*
|
||||
- * This initialization will be replaced by a DT-based
|
||||
- * initialization once the mvebu-mbus driver gains DT support.
|
||||
- */
|
||||
-
|
||||
-#define ARMADA_370_XP_MBUS_WINS_OFFS 0x20000
|
||||
-#define ARMADA_370_XP_MBUS_WINS_SIZE 0x100
|
||||
-#define ARMADA_370_XP_SDRAM_WINS_OFFS 0x20180
|
||||
-#define ARMADA_370_XP_SDRAM_WINS_SIZE 0x20
|
||||
-
|
||||
-static void __init armada_370_xp_mbus_init(void)
|
||||
-{
|
||||
- char *mbus_soc_name;
|
||||
- struct device_node *dn;
|
||||
- const __be32 mbus_wins_offs = cpu_to_be32(ARMADA_370_XP_MBUS_WINS_OFFS);
|
||||
- const __be32 sdram_wins_offs = cpu_to_be32(ARMADA_370_XP_SDRAM_WINS_OFFS);
|
||||
-
|
||||
- if (of_machine_is_compatible("marvell,armada370"))
|
||||
- mbus_soc_name = "marvell,armada370-mbus";
|
||||
- else
|
||||
- mbus_soc_name = "marvell,armadaxp-mbus";
|
||||
-
|
||||
- dn = of_find_node_by_name(NULL, "internal-regs");
|
||||
- BUG_ON(!dn);
|
||||
-
|
||||
- mvebu_mbus_init(mbus_soc_name,
|
||||
- of_translate_address(dn, &mbus_wins_offs),
|
||||
- ARMADA_370_XP_MBUS_WINS_SIZE,
|
||||
- of_translate_address(dn, &sdram_wins_offs),
|
||||
- ARMADA_370_XP_SDRAM_WINS_SIZE);
|
||||
-}
|
||||
-
|
||||
static void __init armada_370_xp_timer_and_clk_init(void)
|
||||
{
|
||||
mvebu_clocks_init();
|
||||
armada_370_xp_timer_init();
|
||||
coherency_init();
|
||||
- armada_370_xp_mbus_init();
|
||||
+ BUG_ON(mvebu_mbus_dt_init());
|
||||
#ifdef CONFIG_CACHE_L2X0
|
||||
l2x0_of_init(0, ~0UL);
|
||||
#endif
|
|
@ -1,132 +0,0 @@
|
|||
From 09aa74a11d05763043b1925628f65a5ac0d42237 Mon Sep 17 00:00:00 2001
|
||||
From: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Date: Wed, 12 Jun 2013 15:42:00 -0300
|
||||
Subject: [PATCH 055/203] ARM: mvebu: Use the preprocessor on Armada 370/XP
|
||||
device tree files
|
||||
|
||||
Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Tested-by: Andrew Lunn <andrew@lunn.ch>
|
||||
Tested-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/armada-370-db.dts | 2 +-
|
||||
arch/arm/boot/dts/armada-370-mirabox.dts | 2 +-
|
||||
arch/arm/boot/dts/armada-370-rd.dts | 2 +-
|
||||
arch/arm/boot/dts/armada-370.dtsi | 2 +-
|
||||
arch/arm/boot/dts/armada-xp-db.dts | 2 +-
|
||||
arch/arm/boot/dts/armada-xp-gp.dts | 2 +-
|
||||
arch/arm/boot/dts/armada-xp-mv78260.dtsi | 2 +-
|
||||
arch/arm/boot/dts/armada-xp-mv78460.dtsi | 2 +-
|
||||
arch/arm/boot/dts/armada-xp-openblocks-ax3-4.dts | 2 +-
|
||||
arch/arm/boot/dts/armada-xp.dtsi | 2 +-
|
||||
10 files changed, 10 insertions(+), 10 deletions(-)
|
||||
|
||||
--- a/arch/arm/boot/dts/armada-370-db.dts
|
||||
+++ b/arch/arm/boot/dts/armada-370-db.dts
|
||||
@@ -14,7 +14,7 @@
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
-/include/ "armada-370.dtsi"
|
||||
+#include "armada-370.dtsi"
|
||||
|
||||
/ {
|
||||
model = "Marvell Armada 370 Evaluation Board";
|
||||
--- a/arch/arm/boot/dts/armada-370-mirabox.dts
|
||||
+++ b/arch/arm/boot/dts/armada-370-mirabox.dts
|
||||
@@ -9,7 +9,7 @@
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
-/include/ "armada-370.dtsi"
|
||||
+#include "armada-370.dtsi"
|
||||
|
||||
/ {
|
||||
model = "Globalscale Mirabox";
|
||||
--- a/arch/arm/boot/dts/armada-370-rd.dts
|
||||
+++ b/arch/arm/boot/dts/armada-370-rd.dts
|
||||
@@ -12,7 +12,7 @@
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
-/include/ "armada-370.dtsi"
|
||||
+#include "armada-370.dtsi"
|
||||
|
||||
/ {
|
||||
model = "Marvell Armada 370 Reference Design";
|
||||
--- a/arch/arm/boot/dts/armada-370.dtsi
|
||||
+++ b/arch/arm/boot/dts/armada-370.dtsi
|
||||
@@ -15,7 +15,7 @@
|
||||
* common to all Armada SoCs.
|
||||
*/
|
||||
|
||||
-/include/ "armada-370-xp.dtsi"
|
||||
+#include "armada-370-xp.dtsi"
|
||||
/include/ "skeleton.dtsi"
|
||||
|
||||
/ {
|
||||
--- a/arch/arm/boot/dts/armada-xp-db.dts
|
||||
+++ b/arch/arm/boot/dts/armada-xp-db.dts
|
||||
@@ -14,7 +14,7 @@
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
-/include/ "armada-xp-mv78460.dtsi"
|
||||
+#include "armada-xp-mv78460.dtsi"
|
||||
|
||||
/ {
|
||||
model = "Marvell Armada XP Evaluation Board";
|
||||
--- a/arch/arm/boot/dts/armada-xp-gp.dts
|
||||
+++ b/arch/arm/boot/dts/armada-xp-gp.dts
|
||||
@@ -14,7 +14,7 @@
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
-/include/ "armada-xp-mv78460.dtsi"
|
||||
+#include "armada-xp-mv78460.dtsi"
|
||||
|
||||
/ {
|
||||
model = "Marvell Armada XP Development Board DB-MV784MP-GP";
|
||||
--- a/arch/arm/boot/dts/armada-xp-mv78260.dtsi
|
||||
+++ b/arch/arm/boot/dts/armada-xp-mv78260.dtsi
|
||||
@@ -13,7 +13,7 @@
|
||||
* common to all Armada XP SoCs.
|
||||
*/
|
||||
|
||||
-/include/ "armada-xp.dtsi"
|
||||
+#include "armada-xp.dtsi"
|
||||
|
||||
/ {
|
||||
model = "Marvell Armada XP MV78260 SoC";
|
||||
--- a/arch/arm/boot/dts/armada-xp-mv78460.dtsi
|
||||
+++ b/arch/arm/boot/dts/armada-xp-mv78460.dtsi
|
||||
@@ -13,7 +13,7 @@
|
||||
* common to all Armada XP SoCs.
|
||||
*/
|
||||
|
||||
-/include/ "armada-xp.dtsi"
|
||||
+#include "armada-xp.dtsi"
|
||||
|
||||
/ {
|
||||
model = "Marvell Armada XP MV78460 SoC";
|
||||
--- a/arch/arm/boot/dts/armada-xp-openblocks-ax3-4.dts
|
||||
+++ b/arch/arm/boot/dts/armada-xp-openblocks-ax3-4.dts
|
||||
@@ -11,7 +11,7 @@
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
-/include/ "armada-xp-mv78260.dtsi"
|
||||
+#include "armada-xp-mv78260.dtsi"
|
||||
|
||||
/ {
|
||||
model = "PlatHome OpenBlocks AX3-4 board";
|
||||
--- a/arch/arm/boot/dts/armada-xp.dtsi
|
||||
+++ b/arch/arm/boot/dts/armada-xp.dtsi
|
||||
@@ -16,7 +16,7 @@
|
||||
* common to all Armada SoCs.
|
||||
*/
|
||||
|
||||
-/include/ "armada-370-xp.dtsi"
|
||||
+#include "armada-370-xp.dtsi"
|
||||
|
||||
/ {
|
||||
model = "Marvell Armada XP family SoC";
|
|
@ -1,167 +0,0 @@
|
|||
From 8298866bfa7fe9c1e33055322c415f612c16a477 Mon Sep 17 00:00:00 2001
|
||||
From: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Date: Tue, 28 May 2013 08:56:04 -0300
|
||||
Subject: [PATCH 056/203] ARM: mvebu: Add MBus to Armada 370/XP device tree
|
||||
|
||||
The Armada 370/XP SoC family has a completely configurable address
|
||||
space handled by the MBus controller.
|
||||
|
||||
This patch introduces the device tree layout of MBus, making the
|
||||
'soc' node as mbus-compatible.
|
||||
Since every peripheral/controller is a child of this 'soc' node,
|
||||
this makes all of them sit behind the mbus, thus describing the
|
||||
hardware accurately.
|
||||
|
||||
A translation entry has been added for the internal-regs mapping.
|
||||
This can't be done in the common armada-370-xp.dtsi because A370
|
||||
and AXP have different addressing width.
|
||||
|
||||
Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Tested-by: Andrew Lunn <andrew@lunn.ch>
|
||||
Tested-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/armada-370-db.dts | 2 ++
|
||||
arch/arm/boot/dts/armada-370-mirabox.dts | 2 ++
|
||||
arch/arm/boot/dts/armada-370-rd.dts | 2 ++
|
||||
arch/arm/boot/dts/armada-370-xp.dtsi | 15 ++++++++++-----
|
||||
arch/arm/boot/dts/armada-370.dtsi | 4 ++--
|
||||
arch/arm/boot/dts/armada-xp-db.dts | 4 +---
|
||||
arch/arm/boot/dts/armada-xp-gp.dts | 4 +---
|
||||
arch/arm/boot/dts/armada-xp-openblocks-ax3-4.dts | 4 +---
|
||||
arch/arm/boot/dts/armada-xp.dtsi | 2 ++
|
||||
9 files changed, 23 insertions(+), 16 deletions(-)
|
||||
|
||||
--- a/arch/arm/boot/dts/armada-370-db.dts
|
||||
+++ b/arch/arm/boot/dts/armada-370-db.dts
|
||||
@@ -30,6 +30,8 @@
|
||||
};
|
||||
|
||||
soc {
|
||||
+ ranges = <MBUS_ID(0xf0, 0x01) 0 0xd0000000 0x100000>;
|
||||
+
|
||||
internal-regs {
|
||||
serial@12000 {
|
||||
clock-frequency = <200000000>;
|
||||
--- a/arch/arm/boot/dts/armada-370-mirabox.dts
|
||||
+++ b/arch/arm/boot/dts/armada-370-mirabox.dts
|
||||
@@ -25,6 +25,8 @@
|
||||
};
|
||||
|
||||
soc {
|
||||
+ ranges = <MBUS_ID(0xf0, 0x01) 0 0xd0000000 0x100000>;
|
||||
+
|
||||
internal-regs {
|
||||
serial@12000 {
|
||||
clock-frequency = <200000000>;
|
||||
--- a/arch/arm/boot/dts/armada-370-rd.dts
|
||||
+++ b/arch/arm/boot/dts/armada-370-rd.dts
|
||||
@@ -28,6 +28,8 @@
|
||||
};
|
||||
|
||||
soc {
|
||||
+ ranges = <MBUS_ID(0xf0, 0x01) 0 0xd0000000 0x100000>;
|
||||
+
|
||||
internal-regs {
|
||||
serial@12000 {
|
||||
clock-frequency = <200000000>;
|
||||
--- a/arch/arm/boot/dts/armada-370-xp.dtsi
|
||||
+++ b/arch/arm/boot/dts/armada-370-xp.dtsi
|
||||
@@ -18,6 +18,8 @@
|
||||
|
||||
/include/ "skeleton64.dtsi"
|
||||
|
||||
+#define MBUS_ID(target,attributes) (((target) << 24) | ((attributes) << 16))
|
||||
+
|
||||
/ {
|
||||
model = "Marvell Armada 370 and XP SoC";
|
||||
compatible = "marvell,armada-370-xp";
|
||||
@@ -29,18 +31,21 @@
|
||||
};
|
||||
|
||||
soc {
|
||||
- #address-cells = <1>;
|
||||
+ #address-cells = <2>;
|
||||
#size-cells = <1>;
|
||||
- compatible = "simple-bus";
|
||||
+ controller = <&mbusc>;
|
||||
interrupt-parent = <&mpic>;
|
||||
- ranges = <0 0 0xd0000000 0x0100000 /* internal registers */
|
||||
- 0xe0000000 0 0xe0000000 0x8100000 /* PCIe */>;
|
||||
|
||||
internal-regs {
|
||||
compatible = "simple-bus";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
- ranges;
|
||||
+ ranges = <0 MBUS_ID(0xf0, 0x01) 0 0x100000>;
|
||||
+
|
||||
+ mbusc: mbus-controller@20000 {
|
||||
+ compatible = "marvell,mbus-controller";
|
||||
+ reg = <0x20000 0x100>, <0x20180 0x20>;
|
||||
+ };
|
||||
|
||||
mpic: interrupt-controller@20000 {
|
||||
compatible = "marvell,mpic";
|
||||
--- a/arch/arm/boot/dts/armada-370.dtsi
|
||||
+++ b/arch/arm/boot/dts/armada-370.dtsi
|
||||
@@ -29,8 +29,8 @@
|
||||
};
|
||||
|
||||
soc {
|
||||
- ranges = <0 0xd0000000 0x0100000 /* internal registers */
|
||||
- 0xe0000000 0xe0000000 0x8100000 /* PCIe */>;
|
||||
+ compatible = "marvell,armada370-mbus", "simple-bus";
|
||||
+
|
||||
internal-regs {
|
||||
system-controller@18200 {
|
||||
compatible = "marvell,armada-370-xp-system-controller";
|
||||
--- a/arch/arm/boot/dts/armada-xp-db.dts
|
||||
+++ b/arch/arm/boot/dts/armada-xp-db.dts
|
||||
@@ -30,9 +30,7 @@
|
||||
};
|
||||
|
||||
soc {
|
||||
- ranges = <0 0 0xd0000000 0x100000 /* Internal registers 1MiB */
|
||||
- 0xe0000000 0 0xe0000000 0x8100000 /* PCIe */
|
||||
- 0xf0000000 0 0xf0000000 0x1000000>; /* Device Bus, NOR 16MiB */
|
||||
+ ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xd0000000 0x100000>;
|
||||
|
||||
internal-regs {
|
||||
serial@12000 {
|
||||
--- a/arch/arm/boot/dts/armada-xp-gp.dts
|
||||
+++ b/arch/arm/boot/dts/armada-xp-gp.dts
|
||||
@@ -39,9 +39,7 @@
|
||||
};
|
||||
|
||||
soc {
|
||||
- ranges = <0 0 0xd0000000 0x100000 /* Internal registers 1MiB */
|
||||
- 0xe0000000 0 0xe0000000 0x8100000 /* PCIe */
|
||||
- 0xf0000000 0 0xf0000000 0x1000000 /* Device Bus, NOR 16MiB */>;
|
||||
+ ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xd0000000 0x100000>;
|
||||
|
||||
internal-regs {
|
||||
serial@12000 {
|
||||
--- a/arch/arm/boot/dts/armada-xp-openblocks-ax3-4.dts
|
||||
+++ b/arch/arm/boot/dts/armada-xp-openblocks-ax3-4.dts
|
||||
@@ -27,9 +27,7 @@
|
||||
};
|
||||
|
||||
soc {
|
||||
- ranges = <0 0 0xd0000000 0x100000 /* Internal registers 1MiB */
|
||||
- 0xe0000000 0 0xe0000000 0x8100000 /* PCIe */
|
||||
- 0xf0000000 0 0xf0000000 0x8000000 /* Device Bus, NOR 128MiB */>;
|
||||
+ ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xd0000000 0x100000>;
|
||||
|
||||
internal-regs {
|
||||
serial@12000 {
|
||||
--- a/arch/arm/boot/dts/armada-xp.dtsi
|
||||
+++ b/arch/arm/boot/dts/armada-xp.dtsi
|
||||
@@ -23,6 +23,8 @@
|
||||
compatible = "marvell,armadaxp", "marvell,armada-370-xp";
|
||||
|
||||
soc {
|
||||
+ compatible = "marvell,armadaxp-mbus", "simple-bus";
|
||||
+
|
||||
internal-regs {
|
||||
L2: l2-cache {
|
||||
compatible = "marvell,aurora-system-cache";
|
|
@ -1,123 +0,0 @@
|
|||
From 1028055490cf9d6e146f57d920e8cfff4eda37e2 Mon Sep 17 00:00:00 2001
|
||||
From: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Date: Fri, 14 Jun 2013 10:34:45 -0300
|
||||
Subject: [PATCH 057/203] ARM: mvebu: Add BootROM to Armada 370/XP device tree
|
||||
|
||||
In order to access the SoC BootROM, we need to declare a mapping
|
||||
(through a ranges property). The mbus driver will use this property
|
||||
to allocate a suitable address decoding window.
|
||||
|
||||
Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Tested-by: Andrew Lunn <andrew@lunn.ch>
|
||||
Tested-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/armada-370-db.dts | 3 ++-
|
||||
arch/arm/boot/dts/armada-370-mirabox.dts | 3 ++-
|
||||
arch/arm/boot/dts/armada-370-rd.dts | 3 ++-
|
||||
arch/arm/boot/dts/armada-370.dtsi | 5 +++++
|
||||
arch/arm/boot/dts/armada-xp-db.dts | 3 ++-
|
||||
arch/arm/boot/dts/armada-xp-gp.dts | 3 ++-
|
||||
arch/arm/boot/dts/armada-xp-openblocks-ax3-4.dts | 3 ++-
|
||||
arch/arm/boot/dts/armada-xp.dtsi | 5 +++++
|
||||
8 files changed, 22 insertions(+), 6 deletions(-)
|
||||
|
||||
--- a/arch/arm/boot/dts/armada-370-db.dts
|
||||
+++ b/arch/arm/boot/dts/armada-370-db.dts
|
||||
@@ -30,7 +30,8 @@
|
||||
};
|
||||
|
||||
soc {
|
||||
- ranges = <MBUS_ID(0xf0, 0x01) 0 0xd0000000 0x100000>;
|
||||
+ ranges = <MBUS_ID(0xf0, 0x01) 0 0xd0000000 0x100000
|
||||
+ MBUS_ID(0x01, 0xe0) 0 0xfff00000 0x100000>;
|
||||
|
||||
internal-regs {
|
||||
serial@12000 {
|
||||
--- a/arch/arm/boot/dts/armada-370-mirabox.dts
|
||||
+++ b/arch/arm/boot/dts/armada-370-mirabox.dts
|
||||
@@ -25,7 +25,8 @@
|
||||
};
|
||||
|
||||
soc {
|
||||
- ranges = <MBUS_ID(0xf0, 0x01) 0 0xd0000000 0x100000>;
|
||||
+ ranges = <MBUS_ID(0xf0, 0x01) 0 0xd0000000 0x100000
|
||||
+ MBUS_ID(0x01, 0xe0) 0 0xfff00000 0x100000>;
|
||||
|
||||
internal-regs {
|
||||
serial@12000 {
|
||||
--- a/arch/arm/boot/dts/armada-370-rd.dts
|
||||
+++ b/arch/arm/boot/dts/armada-370-rd.dts
|
||||
@@ -28,7 +28,8 @@
|
||||
};
|
||||
|
||||
soc {
|
||||
- ranges = <MBUS_ID(0xf0, 0x01) 0 0xd0000000 0x100000>;
|
||||
+ ranges = <MBUS_ID(0xf0, 0x01) 0 0xd0000000 0x100000
|
||||
+ MBUS_ID(0x01, 0xe0) 0 0xfff00000 0x100000>;
|
||||
|
||||
internal-regs {
|
||||
serial@12000 {
|
||||
--- a/arch/arm/boot/dts/armada-370.dtsi
|
||||
+++ b/arch/arm/boot/dts/armada-370.dtsi
|
||||
@@ -31,6 +31,11 @@
|
||||
soc {
|
||||
compatible = "marvell,armada370-mbus", "simple-bus";
|
||||
|
||||
+ bootrom {
|
||||
+ compatible = "marvell,bootrom";
|
||||
+ reg = <MBUS_ID(0x01, 0xe0) 0 0x100000>;
|
||||
+ };
|
||||
+
|
||||
internal-regs {
|
||||
system-controller@18200 {
|
||||
compatible = "marvell,armada-370-xp-system-controller";
|
||||
--- a/arch/arm/boot/dts/armada-xp-db.dts
|
||||
+++ b/arch/arm/boot/dts/armada-xp-db.dts
|
||||
@@ -30,7 +30,8 @@
|
||||
};
|
||||
|
||||
soc {
|
||||
- ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xd0000000 0x100000>;
|
||||
+ ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xd0000000 0x100000
|
||||
+ MBUS_ID(0x01, 0x1d) 0 0 0xfff00000 0x100000>;
|
||||
|
||||
internal-regs {
|
||||
serial@12000 {
|
||||
--- a/arch/arm/boot/dts/armada-xp-gp.dts
|
||||
+++ b/arch/arm/boot/dts/armada-xp-gp.dts
|
||||
@@ -39,7 +39,8 @@
|
||||
};
|
||||
|
||||
soc {
|
||||
- ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xd0000000 0x100000>;
|
||||
+ ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xd0000000 0x100000
|
||||
+ MBUS_ID(0x01, 0x1d) 0 0 0xfff00000 0x100000>;
|
||||
|
||||
internal-regs {
|
||||
serial@12000 {
|
||||
--- a/arch/arm/boot/dts/armada-xp-openblocks-ax3-4.dts
|
||||
+++ b/arch/arm/boot/dts/armada-xp-openblocks-ax3-4.dts
|
||||
@@ -27,7 +27,8 @@
|
||||
};
|
||||
|
||||
soc {
|
||||
- ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xd0000000 0x100000>;
|
||||
+ ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xd0000000 0x100000
|
||||
+ MBUS_ID(0x01, 0x1d) 0 0 0xfff00000 0x100000>;
|
||||
|
||||
internal-regs {
|
||||
serial@12000 {
|
||||
--- a/arch/arm/boot/dts/armada-xp.dtsi
|
||||
+++ b/arch/arm/boot/dts/armada-xp.dtsi
|
||||
@@ -25,6 +25,11 @@
|
||||
soc {
|
||||
compatible = "marvell,armadaxp-mbus", "simple-bus";
|
||||
|
||||
+ bootrom {
|
||||
+ compatible = "marvell,bootrom";
|
||||
+ reg = <MBUS_ID(0x01, 0x1d) 0 0x100000>;
|
||||
+ };
|
||||
+
|
||||
internal-regs {
|
||||
L2: l2-cache {
|
||||
compatible = "marvell,aurora-system-cache";
|
|
@ -1,357 +0,0 @@
|
|||
From bcb0e54d62804f1f986ad478a11235dadb1b61bb Mon Sep 17 00:00:00 2001
|
||||
From: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Date: Fri, 14 Jun 2013 10:44:57 -0300
|
||||
Subject: [PATCH 058/203] ARM: mvebu: Relocate Armada 370/XP DeviceBus device
|
||||
tree nodes
|
||||
|
||||
Now that mbus has been added to the device tree, it's possible to
|
||||
move the DeviceBus out of internal registers, placing it directly
|
||||
below the mbus. This is a more accurate representation of the hardware.
|
||||
|
||||
Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Tested-by: Andrew Lunn <andrew@lunn.ch>
|
||||
Tested-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/armada-370-xp.dtsi | 94 +++++++++++++-----------
|
||||
arch/arm/boot/dts/armada-xp-db.dts | 59 +++++++--------
|
||||
arch/arm/boot/dts/armada-xp-gp.dts | 60 +++++++--------
|
||||
arch/arm/boot/dts/armada-xp-openblocks-ax3-4.dts | 60 +++++++--------
|
||||
4 files changed, 140 insertions(+), 133 deletions(-)
|
||||
|
||||
--- a/arch/arm/boot/dts/armada-370-xp.dtsi
|
||||
+++ b/arch/arm/boot/dts/armada-370-xp.dtsi
|
||||
@@ -36,6 +36,56 @@
|
||||
controller = <&mbusc>;
|
||||
interrupt-parent = <&mpic>;
|
||||
|
||||
+ devbus-bootcs {
|
||||
+ compatible = "marvell,mvebu-devbus";
|
||||
+ reg = <MBUS_ID(0xf0, 0x01) 0x10400 0x8>;
|
||||
+ ranges = <0 MBUS_ID(0x01, 0x2f) 0 0xffffffff>;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+ clocks = <&coreclk 0>;
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ devbus-cs0 {
|
||||
+ compatible = "marvell,mvebu-devbus";
|
||||
+ reg = <MBUS_ID(0xf0, 0x01) 0x10408 0x8>;
|
||||
+ ranges = <0 MBUS_ID(0x01, 0x3e) 0 0xffffffff>;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+ clocks = <&coreclk 0>;
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ devbus-cs1 {
|
||||
+ compatible = "marvell,mvebu-devbus";
|
||||
+ reg = <MBUS_ID(0xf0, 0x01) 0x10410 0x8>;
|
||||
+ ranges = <0 MBUS_ID(0x01, 0x3d) 0 0xffffffff>;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+ clocks = <&coreclk 0>;
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ devbus-cs2 {
|
||||
+ compatible = "marvell,mvebu-devbus";
|
||||
+ reg = <MBUS_ID(0xf0, 0x01) 0x10418 0x8>;
|
||||
+ ranges = <0 MBUS_ID(0x01, 0x3b) 0 0xffffffff>;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+ clocks = <&coreclk 0>;
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ devbus-cs3 {
|
||||
+ compatible = "marvell,mvebu-devbus";
|
||||
+ reg = <MBUS_ID(0xf0, 0x01) 0x10420 0x8>;
|
||||
+ ranges = <0 MBUS_ID(0x01, 0x37) 0 0xffffffff>;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+ clocks = <&coreclk 0>;
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
internal-regs {
|
||||
compatible = "simple-bus";
|
||||
#address-cells = <1>;
|
||||
@@ -191,50 +241,6 @@
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
- devbus-bootcs@10400 {
|
||||
- compatible = "marvell,mvebu-devbus";
|
||||
- reg = <0x10400 0x8>;
|
||||
- #address-cells = <1>;
|
||||
- #size-cells = <1>;
|
||||
- clocks = <&coreclk 0>;
|
||||
- status = "disabled";
|
||||
- };
|
||||
-
|
||||
- devbus-cs0@10408 {
|
||||
- compatible = "marvell,mvebu-devbus";
|
||||
- reg = <0x10408 0x8>;
|
||||
- #address-cells = <1>;
|
||||
- #size-cells = <1>;
|
||||
- clocks = <&coreclk 0>;
|
||||
- status = "disabled";
|
||||
- };
|
||||
-
|
||||
- devbus-cs1@10410 {
|
||||
- compatible = "marvell,mvebu-devbus";
|
||||
- reg = <0x10410 0x8>;
|
||||
- #address-cells = <1>;
|
||||
- #size-cells = <1>;
|
||||
- clocks = <&coreclk 0>;
|
||||
- status = "disabled";
|
||||
- };
|
||||
-
|
||||
- devbus-cs2@10418 {
|
||||
- compatible = "marvell,mvebu-devbus";
|
||||
- reg = <0x10418 0x8>;
|
||||
- #address-cells = <1>;
|
||||
- #size-cells = <1>;
|
||||
- clocks = <&coreclk 0>;
|
||||
- status = "disabled";
|
||||
- };
|
||||
-
|
||||
- devbus-cs3@10420 {
|
||||
- compatible = "marvell,mvebu-devbus";
|
||||
- reg = <0x10420 0x8>;
|
||||
- #address-cells = <1>;
|
||||
- #size-cells = <1>;
|
||||
- clocks = <&coreclk 0>;
|
||||
- status = "disabled";
|
||||
- };
|
||||
};
|
||||
};
|
||||
};
|
||||
--- a/arch/arm/boot/dts/armada-xp-db.dts
|
||||
+++ b/arch/arm/boot/dts/armada-xp-db.dts
|
||||
@@ -31,7 +31,36 @@
|
||||
|
||||
soc {
|
||||
ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xd0000000 0x100000
|
||||
- MBUS_ID(0x01, 0x1d) 0 0 0xfff00000 0x100000>;
|
||||
+ MBUS_ID(0x01, 0x1d) 0 0 0xfff00000 0x100000
|
||||
+ MBUS_ID(0x01, 0x2f) 0 0 0xf0000000 0x1000000>;
|
||||
+
|
||||
+ devbus-bootcs {
|
||||
+ status = "okay";
|
||||
+
|
||||
+ /* Device Bus parameters are required */
|
||||
+
|
||||
+ /* Read parameters */
|
||||
+ devbus,bus-width = <8>;
|
||||
+ devbus,turn-off-ps = <60000>;
|
||||
+ devbus,badr-skew-ps = <0>;
|
||||
+ devbus,acc-first-ps = <124000>;
|
||||
+ devbus,acc-next-ps = <248000>;
|
||||
+ devbus,rd-setup-ps = <0>;
|
||||
+ devbus,rd-hold-ps = <0>;
|
||||
+
|
||||
+ /* Write parameters */
|
||||
+ devbus,sync-enable = <0>;
|
||||
+ devbus,wr-high-ps = <60000>;
|
||||
+ devbus,wr-low-ps = <60000>;
|
||||
+ devbus,ale-wr-ps = <60000>;
|
||||
+
|
||||
+ /* NOR 16 MiB */
|
||||
+ nor@0 {
|
||||
+ compatible = "cfi-flash";
|
||||
+ reg = <0 0x1000000>;
|
||||
+ bank-width = <2>;
|
||||
+ };
|
||||
+ };
|
||||
|
||||
internal-regs {
|
||||
serial@12000 {
|
||||
@@ -160,34 +189,6 @@
|
||||
};
|
||||
};
|
||||
|
||||
- devbus-bootcs@10400 {
|
||||
- status = "okay";
|
||||
- ranges = <0 0xf0000000 0x1000000>;
|
||||
-
|
||||
- /* Device Bus parameters are required */
|
||||
-
|
||||
- /* Read parameters */
|
||||
- devbus,bus-width = <8>;
|
||||
- devbus,turn-off-ps = <60000>;
|
||||
- devbus,badr-skew-ps = <0>;
|
||||
- devbus,acc-first-ps = <124000>;
|
||||
- devbus,acc-next-ps = <248000>;
|
||||
- devbus,rd-setup-ps = <0>;
|
||||
- devbus,rd-hold-ps = <0>;
|
||||
-
|
||||
- /* Write parameters */
|
||||
- devbus,sync-enable = <0>;
|
||||
- devbus,wr-high-ps = <60000>;
|
||||
- devbus,wr-low-ps = <60000>;
|
||||
- devbus,ale-wr-ps = <60000>;
|
||||
-
|
||||
- /* NOR 16 MiB */
|
||||
- nor@0 {
|
||||
- compatible = "cfi-flash";
|
||||
- reg = <0 0x1000000>;
|
||||
- bank-width = <2>;
|
||||
- };
|
||||
- };
|
||||
};
|
||||
};
|
||||
};
|
||||
--- a/arch/arm/boot/dts/armada-xp-gp.dts
|
||||
+++ b/arch/arm/boot/dts/armada-xp-gp.dts
|
||||
@@ -40,7 +40,36 @@
|
||||
|
||||
soc {
|
||||
ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xd0000000 0x100000
|
||||
- MBUS_ID(0x01, 0x1d) 0 0 0xfff00000 0x100000>;
|
||||
+ MBUS_ID(0x01, 0x1d) 0 0 0xfff00000 0x100000
|
||||
+ MBUS_ID(0x01, 0x2f) 0 0 0xf0000000 0x1000000>;
|
||||
+
|
||||
+ devbus-bootcs {
|
||||
+ status = "okay";
|
||||
+
|
||||
+ /* Device Bus parameters are required */
|
||||
+
|
||||
+ /* Read parameters */
|
||||
+ devbus,bus-width = <8>;
|
||||
+ devbus,turn-off-ps = <60000>;
|
||||
+ devbus,badr-skew-ps = <0>;
|
||||
+ devbus,acc-first-ps = <124000>;
|
||||
+ devbus,acc-next-ps = <248000>;
|
||||
+ devbus,rd-setup-ps = <0>;
|
||||
+ devbus,rd-hold-ps = <0>;
|
||||
+
|
||||
+ /* Write parameters */
|
||||
+ devbus,sync-enable = <0>;
|
||||
+ devbus,wr-high-ps = <60000>;
|
||||
+ devbus,wr-low-ps = <60000>;
|
||||
+ devbus,ale-wr-ps = <60000>;
|
||||
+
|
||||
+ /* NOR 16 MiB */
|
||||
+ nor@0 {
|
||||
+ compatible = "cfi-flash";
|
||||
+ reg = <0 0x1000000>;
|
||||
+ bank-width = <2>;
|
||||
+ };
|
||||
+ };
|
||||
|
||||
internal-regs {
|
||||
serial@12000 {
|
||||
@@ -126,35 +155,6 @@
|
||||
};
|
||||
};
|
||||
|
||||
- devbus-bootcs@10400 {
|
||||
- status = "okay";
|
||||
- ranges = <0 0xf0000000 0x1000000>; /* @addr 0xf000000, size 0x1000000 */
|
||||
-
|
||||
- /* Device Bus parameters are required */
|
||||
-
|
||||
- /* Read parameters */
|
||||
- devbus,bus-width = <8>;
|
||||
- devbus,turn-off-ps = <60000>;
|
||||
- devbus,badr-skew-ps = <0>;
|
||||
- devbus,acc-first-ps = <124000>;
|
||||
- devbus,acc-next-ps = <248000>;
|
||||
- devbus,rd-setup-ps = <0>;
|
||||
- devbus,rd-hold-ps = <0>;
|
||||
-
|
||||
- /* Write parameters */
|
||||
- devbus,sync-enable = <0>;
|
||||
- devbus,wr-high-ps = <60000>;
|
||||
- devbus,wr-low-ps = <60000>;
|
||||
- devbus,ale-wr-ps = <60000>;
|
||||
-
|
||||
- /* NOR 16 MiB */
|
||||
- nor@0 {
|
||||
- compatible = "cfi-flash";
|
||||
- reg = <0 0x1000000>;
|
||||
- bank-width = <2>;
|
||||
- };
|
||||
- };
|
||||
-
|
||||
pcie-controller {
|
||||
status = "okay";
|
||||
|
||||
--- a/arch/arm/boot/dts/armada-xp-openblocks-ax3-4.dts
|
||||
+++ b/arch/arm/boot/dts/armada-xp-openblocks-ax3-4.dts
|
||||
@@ -28,7 +28,36 @@
|
||||
|
||||
soc {
|
||||
ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xd0000000 0x100000
|
||||
- MBUS_ID(0x01, 0x1d) 0 0 0xfff00000 0x100000>;
|
||||
+ MBUS_ID(0x01, 0x1d) 0 0 0xfff00000 0x100000
|
||||
+ MBUS_ID(0x01, 0x2f) 0 0 0xf0000000 0x8000000>;
|
||||
+
|
||||
+ devbus-bootcs {
|
||||
+ status = "okay";
|
||||
+
|
||||
+ /* Device Bus parameters are required */
|
||||
+
|
||||
+ /* Read parameters */
|
||||
+ devbus,bus-width = <8>;
|
||||
+ devbus,turn-off-ps = <60000>;
|
||||
+ devbus,badr-skew-ps = <0>;
|
||||
+ devbus,acc-first-ps = <124000>;
|
||||
+ devbus,acc-next-ps = <248000>;
|
||||
+ devbus,rd-setup-ps = <0>;
|
||||
+ devbus,rd-hold-ps = <0>;
|
||||
+
|
||||
+ /* Write parameters */
|
||||
+ devbus,sync-enable = <0>;
|
||||
+ devbus,wr-high-ps = <60000>;
|
||||
+ devbus,wr-low-ps = <60000>;
|
||||
+ devbus,ale-wr-ps = <60000>;
|
||||
+
|
||||
+ /* NOR 128 MiB */
|
||||
+ nor@0 {
|
||||
+ compatible = "cfi-flash";
|
||||
+ reg = <0 0x8000000>;
|
||||
+ bank-width = <2>;
|
||||
+ };
|
||||
+ };
|
||||
|
||||
internal-regs {
|
||||
serial@12000 {
|
||||
@@ -144,35 +173,6 @@
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
- devbus-bootcs@10400 {
|
||||
- status = "okay";
|
||||
- ranges = <0 0xf0000000 0x8000000>; /* @addr 0xf000000, size 0x8000000 */
|
||||
-
|
||||
- /* Device Bus parameters are required */
|
||||
-
|
||||
- /* Read parameters */
|
||||
- devbus,bus-width = <8>;
|
||||
- devbus,turn-off-ps = <60000>;
|
||||
- devbus,badr-skew-ps = <0>;
|
||||
- devbus,acc-first-ps = <124000>;
|
||||
- devbus,acc-next-ps = <248000>;
|
||||
- devbus,rd-setup-ps = <0>;
|
||||
- devbus,rd-hold-ps = <0>;
|
||||
-
|
||||
- /* Write parameters */
|
||||
- devbus,sync-enable = <0>;
|
||||
- devbus,wr-high-ps = <60000>;
|
||||
- devbus,wr-low-ps = <60000>;
|
||||
- devbus,ale-wr-ps = <60000>;
|
||||
-
|
||||
- /* NOR 128 MiB */
|
||||
- nor@0 {
|
||||
- compatible = "cfi-flash";
|
||||
- reg = <0 0x8000000>;
|
||||
- bank-width = <2>;
|
||||
- };
|
||||
- };
|
||||
-
|
||||
pcie-controller {
|
||||
status = "okay";
|
||||
/* Internal mini-PCIe connector */
|
File diff suppressed because it is too large
Load diff
|
@ -1,52 +0,0 @@
|
|||
From d1989c73eb770891635cc644f091d7524bbfd696 Mon Sep 17 00:00:00 2001
|
||||
From: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Date: Tue, 23 Jul 2013 07:42:09 -0300
|
||||
Subject: [PATCH 060/203] ARM: kirkwood: Split DT and legacy MBus
|
||||
initialization
|
||||
|
||||
This commit replaces the legacy MBus initialization with the new
|
||||
DT-based in Kirkwood. For boards that are not yet converted to DT,
|
||||
we keep the legacy initialization.
|
||||
|
||||
Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Tested-by: Andrew Lunn <andrew@lunn.ch>
|
||||
Tested-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
|
||||
---
|
||||
arch/arm/mach-kirkwood/board-dt.c | 1 +
|
||||
arch/arm/mach-kirkwood/common.c | 8 ++++----
|
||||
2 files changed, 5 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/arch/arm/mach-kirkwood/board-dt.c
|
||||
+++ b/arch/arm/mach-kirkwood/board-dt.c
|
||||
@@ -93,6 +93,7 @@ static void __init kirkwood_dt_init(void
|
||||
*/
|
||||
writel(readl(CPU_CONFIG) & ~CPU_CONFIG_ERROR_PROP, CPU_CONFIG);
|
||||
|
||||
+ BUG_ON(mvebu_mbus_dt_init());
|
||||
kirkwood_setup_wins();
|
||||
|
||||
kirkwood_l2_init();
|
||||
--- a/arch/arm/mach-kirkwood/common.c
|
||||
+++ b/arch/arm/mach-kirkwood/common.c
|
||||
@@ -527,10 +527,6 @@ void __init kirkwood_cpuidle_init(void)
|
||||
void __init kirkwood_init_early(void)
|
||||
{
|
||||
orion_time_set_base(TIMER_VIRT_BASE);
|
||||
-
|
||||
- mvebu_mbus_init("marvell,kirkwood-mbus",
|
||||
- BRIDGE_WINS_BASE, BRIDGE_WINS_SZ,
|
||||
- DDR_WINDOW_CPU_BASE, DDR_WINDOW_CPU_SZ);
|
||||
}
|
||||
|
||||
int kirkwood_tclk;
|
||||
@@ -703,6 +699,10 @@ void __init kirkwood_init(void)
|
||||
*/
|
||||
writel(readl(CPU_CONFIG) & ~CPU_CONFIG_ERROR_PROP, CPU_CONFIG);
|
||||
|
||||
+ BUG_ON(mvebu_mbus_init("marvell,kirkwood-mbus",
|
||||
+ BRIDGE_WINS_BASE, BRIDGE_WINS_SZ,
|
||||
+ DDR_WINDOW_CPU_BASE, DDR_WINDOW_CPU_SZ));
|
||||
+
|
||||
kirkwood_setup_wins();
|
||||
|
||||
kirkwood_l2_init();
|
|
@ -1,485 +0,0 @@
|
|||
From 67bbed6edc12a5f239435c182d9c56ce2c930d87 Mon Sep 17 00:00:00 2001
|
||||
From: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Date: Tue, 23 Jul 2013 07:45:49 -0300
|
||||
Subject: [PATCH 061/203] ARM: kirkwood: Use the preprocessor on device tree
|
||||
files
|
||||
|
||||
Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Tested-by: Andrew Lunn <andrew@lunn.ch>
|
||||
Tested-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/kirkwood-cloudbox.dts | 4 +--
|
||||
arch/arm/boot/dts/kirkwood-dns320.dts | 2 +-
|
||||
arch/arm/boot/dts/kirkwood-dns325.dts | 2 +-
|
||||
arch/arm/boot/dts/kirkwood-dnskw.dtsi | 4 +--
|
||||
arch/arm/boot/dts/kirkwood-dockstar.dts | 4 +--
|
||||
arch/arm/boot/dts/kirkwood-dreamplug.dts | 4 +--
|
||||
arch/arm/boot/dts/kirkwood-goflexnet.dts | 4 +--
|
||||
.../arm/boot/dts/kirkwood-guruplug-server-plus.dts | 4 +--
|
||||
arch/arm/boot/dts/kirkwood-ib62x0.dts | 4 +--
|
||||
arch/arm/boot/dts/kirkwood-iconnect.dts | 4 +--
|
||||
arch/arm/boot/dts/kirkwood-iomega_ix2_200.dts | 4 +--
|
||||
arch/arm/boot/dts/kirkwood-is2.dts | 2 +-
|
||||
arch/arm/boot/dts/kirkwood-km_kirkwood.dts | 4 +--
|
||||
arch/arm/boot/dts/kirkwood-lschlv2.dts | 2 +-
|
||||
arch/arm/boot/dts/kirkwood-lsxhl.dts | 2 +-
|
||||
arch/arm/boot/dts/kirkwood-lsxl.dtsi | 4 +--
|
||||
arch/arm/boot/dts/kirkwood-mplcec4.dts | 4 +--
|
||||
.../boot/dts/kirkwood-netgear_readynas_duo_v2.dts | 4 +--
|
||||
arch/arm/boot/dts/kirkwood-ns2-common.dtsi | 4 +--
|
||||
arch/arm/boot/dts/kirkwood-ns2.dts | 2 +-
|
||||
arch/arm/boot/dts/kirkwood-ns2lite.dts | 2 +-
|
||||
arch/arm/boot/dts/kirkwood-ns2max.dts | 2 +-
|
||||
arch/arm/boot/dts/kirkwood-ns2mini.dts | 2 +-
|
||||
arch/arm/boot/dts/kirkwood-nsa310.dts | 40 +++++++++++++---------
|
||||
arch/arm/boot/dts/kirkwood-openblocks_a6.dts | 4 +--
|
||||
arch/arm/boot/dts/kirkwood-topkick.dts | 4 +--
|
||||
arch/arm/boot/dts/kirkwood-ts219-6281.dts | 13 +++----
|
||||
arch/arm/boot/dts/kirkwood-ts219-6282.dts | 21 ++++++++----
|
||||
28 files changed, 86 insertions(+), 70 deletions(-)
|
||||
|
||||
--- a/arch/arm/boot/dts/kirkwood-cloudbox.dts
|
||||
+++ b/arch/arm/boot/dts/kirkwood-cloudbox.dts
|
||||
@@ -1,7 +1,7 @@
|
||||
/dts-v1/;
|
||||
|
||||
-/include/ "kirkwood.dtsi"
|
||||
-/include/ "kirkwood-6281.dtsi"
|
||||
+#include "kirkwood.dtsi"
|
||||
+#include "kirkwood-6281.dtsi"
|
||||
|
||||
/ {
|
||||
model = "LaCie CloudBox";
|
||||
--- a/arch/arm/boot/dts/kirkwood-dns320.dts
|
||||
+++ b/arch/arm/boot/dts/kirkwood-dns320.dts
|
||||
@@ -1,6 +1,6 @@
|
||||
/dts-v1/;
|
||||
|
||||
-/include/ "kirkwood-dnskw.dtsi"
|
||||
+#include "kirkwood-dnskw.dtsi"
|
||||
|
||||
/ {
|
||||
model = "D-Link DNS-320 NAS (Rev A1)";
|
||||
--- a/arch/arm/boot/dts/kirkwood-dns325.dts
|
||||
+++ b/arch/arm/boot/dts/kirkwood-dns325.dts
|
||||
@@ -1,6 +1,6 @@
|
||||
/dts-v1/;
|
||||
|
||||
-/include/ "kirkwood-dnskw.dtsi"
|
||||
+#include "kirkwood-dnskw.dtsi"
|
||||
|
||||
/ {
|
||||
model = "D-Link DNS-325 NAS (Rev A1)";
|
||||
--- a/arch/arm/boot/dts/kirkwood-dnskw.dtsi
|
||||
+++ b/arch/arm/boot/dts/kirkwood-dnskw.dtsi
|
||||
@@ -1,5 +1,5 @@
|
||||
-/include/ "kirkwood.dtsi"
|
||||
-/include/ "kirkwood-6281.dtsi"
|
||||
+#include "kirkwood.dtsi"
|
||||
+#include "kirkwood-6281.dtsi"
|
||||
|
||||
/ {
|
||||
model = "D-Link DNS NASes (kirkwood-based)";
|
||||
--- a/arch/arm/boot/dts/kirkwood-dockstar.dts
|
||||
+++ b/arch/arm/boot/dts/kirkwood-dockstar.dts
|
||||
@@ -1,7 +1,7 @@
|
||||
/dts-v1/;
|
||||
|
||||
-/include/ "kirkwood.dtsi"
|
||||
-/include/ "kirkwood-6281.dtsi"
|
||||
+#include "kirkwood.dtsi"
|
||||
+#include "kirkwood-6281.dtsi"
|
||||
|
||||
/ {
|
||||
model = "Seagate FreeAgent Dockstar";
|
||||
--- a/arch/arm/boot/dts/kirkwood-dreamplug.dts
|
||||
+++ b/arch/arm/boot/dts/kirkwood-dreamplug.dts
|
||||
@@ -1,7 +1,7 @@
|
||||
/dts-v1/;
|
||||
|
||||
-/include/ "kirkwood.dtsi"
|
||||
-/include/ "kirkwood-6281.dtsi"
|
||||
+#include "kirkwood.dtsi"
|
||||
+#include "kirkwood-6281.dtsi"
|
||||
|
||||
/ {
|
||||
model = "Globalscale Technologies Dreamplug";
|
||||
--- a/arch/arm/boot/dts/kirkwood-goflexnet.dts
|
||||
+++ b/arch/arm/boot/dts/kirkwood-goflexnet.dts
|
||||
@@ -1,7 +1,7 @@
|
||||
/dts-v1/;
|
||||
|
||||
-/include/ "kirkwood.dtsi"
|
||||
-/include/ "kirkwood-6281.dtsi"
|
||||
+#include "kirkwood.dtsi"
|
||||
+#include "kirkwood-6281.dtsi"
|
||||
|
||||
/ {
|
||||
model = "Seagate GoFlex Net";
|
||||
--- a/arch/arm/boot/dts/kirkwood-guruplug-server-plus.dts
|
||||
+++ b/arch/arm/boot/dts/kirkwood-guruplug-server-plus.dts
|
||||
@@ -1,7 +1,7 @@
|
||||
/dts-v1/;
|
||||
|
||||
-/include/ "kirkwood.dtsi"
|
||||
-/include/ "kirkwood-6281.dtsi"
|
||||
+#include "kirkwood.dtsi"
|
||||
+#include "kirkwood-6281.dtsi"
|
||||
|
||||
/ {
|
||||
model = "Globalscale Technologies Guruplug Server Plus";
|
||||
--- a/arch/arm/boot/dts/kirkwood-ib62x0.dts
|
||||
+++ b/arch/arm/boot/dts/kirkwood-ib62x0.dts
|
||||
@@ -1,7 +1,7 @@
|
||||
/dts-v1/;
|
||||
|
||||
-/include/ "kirkwood.dtsi"
|
||||
-/include/ "kirkwood-6281.dtsi"
|
||||
+#include "kirkwood.dtsi"
|
||||
+#include "kirkwood-6281.dtsi"
|
||||
|
||||
/ {
|
||||
model = "RaidSonic ICY BOX IB-NAS62x0 (Rev B)";
|
||||
--- a/arch/arm/boot/dts/kirkwood-iconnect.dts
|
||||
+++ b/arch/arm/boot/dts/kirkwood-iconnect.dts
|
||||
@@ -1,7 +1,7 @@
|
||||
/dts-v1/;
|
||||
|
||||
-/include/ "kirkwood.dtsi"
|
||||
-/include/ "kirkwood-6281.dtsi"
|
||||
+#include "kirkwood.dtsi"
|
||||
+#include "kirkwood-6281.dtsi"
|
||||
|
||||
/ {
|
||||
model = "Iomega Iconnect";
|
||||
--- a/arch/arm/boot/dts/kirkwood-iomega_ix2_200.dts
|
||||
+++ b/arch/arm/boot/dts/kirkwood-iomega_ix2_200.dts
|
||||
@@ -1,7 +1,7 @@
|
||||
/dts-v1/;
|
||||
|
||||
-/include/ "kirkwood.dtsi"
|
||||
-/include/ "kirkwood-6281.dtsi"
|
||||
+#include "kirkwood.dtsi"
|
||||
+#include "kirkwood-6281.dtsi"
|
||||
|
||||
/ {
|
||||
model = "Iomega StorCenter ix2-200";
|
||||
--- a/arch/arm/boot/dts/kirkwood-is2.dts
|
||||
+++ b/arch/arm/boot/dts/kirkwood-is2.dts
|
||||
@@ -1,6 +1,6 @@
|
||||
/dts-v1/;
|
||||
|
||||
-/include/ "kirkwood-ns2-common.dtsi"
|
||||
+#include "kirkwood-ns2-common.dtsi"
|
||||
|
||||
/ {
|
||||
model = "LaCie Internet Space v2";
|
||||
--- a/arch/arm/boot/dts/kirkwood-km_kirkwood.dts
|
||||
+++ b/arch/arm/boot/dts/kirkwood-km_kirkwood.dts
|
||||
@@ -1,7 +1,7 @@
|
||||
/dts-v1/;
|
||||
|
||||
-/include/ "kirkwood.dtsi"
|
||||
-/include/ "kirkwood-98dx4122.dtsi"
|
||||
+#include "kirkwood.dtsi"
|
||||
+#include "kirkwood-98dx4122.dtsi"
|
||||
|
||||
/ {
|
||||
model = "Keymile Kirkwood Reference Design";
|
||||
--- a/arch/arm/boot/dts/kirkwood-lschlv2.dts
|
||||
+++ b/arch/arm/boot/dts/kirkwood-lschlv2.dts
|
||||
@@ -1,6 +1,6 @@
|
||||
/dts-v1/;
|
||||
|
||||
-/include/ "kirkwood-lsxl.dtsi"
|
||||
+#include "kirkwood-lsxl.dtsi"
|
||||
|
||||
/ {
|
||||
model = "Buffalo Linkstation LS-CHLv2";
|
||||
--- a/arch/arm/boot/dts/kirkwood-lsxhl.dts
|
||||
+++ b/arch/arm/boot/dts/kirkwood-lsxhl.dts
|
||||
@@ -1,6 +1,6 @@
|
||||
/dts-v1/;
|
||||
|
||||
-/include/ "kirkwood-lsxl.dtsi"
|
||||
+#include "kirkwood-lsxl.dtsi"
|
||||
|
||||
/ {
|
||||
model = "Buffalo Linkstation LS-XHL";
|
||||
--- a/arch/arm/boot/dts/kirkwood-lsxl.dtsi
|
||||
+++ b/arch/arm/boot/dts/kirkwood-lsxl.dtsi
|
||||
@@ -1,5 +1,5 @@
|
||||
-/include/ "kirkwood.dtsi"
|
||||
-/include/ "kirkwood-6281.dtsi"
|
||||
+#include "kirkwood.dtsi"
|
||||
+#include "kirkwood-6281.dtsi"
|
||||
|
||||
/ {
|
||||
chosen {
|
||||
--- a/arch/arm/boot/dts/kirkwood-mplcec4.dts
|
||||
+++ b/arch/arm/boot/dts/kirkwood-mplcec4.dts
|
||||
@@ -1,7 +1,7 @@
|
||||
/dts-v1/;
|
||||
|
||||
-/include/ "kirkwood.dtsi"
|
||||
-/include/ "kirkwood-6281.dtsi"
|
||||
+#include "kirkwood.dtsi"
|
||||
+#include "kirkwood-6281.dtsi"
|
||||
|
||||
/ {
|
||||
model = "MPL CEC4";
|
||||
--- a/arch/arm/boot/dts/kirkwood-netgear_readynas_duo_v2.dts
|
||||
+++ b/arch/arm/boot/dts/kirkwood-netgear_readynas_duo_v2.dts
|
||||
@@ -1,7 +1,7 @@
|
||||
/dts-v1/;
|
||||
|
||||
-/include/ "kirkwood.dtsi"
|
||||
-/include/ "kirkwood-6282.dtsi"
|
||||
+#include "kirkwood.dtsi"
|
||||
+#include "kirkwood-6282.dtsi"
|
||||
|
||||
/ {
|
||||
model = "NETGEAR ReadyNAS Duo v2";
|
||||
--- a/arch/arm/boot/dts/kirkwood-ns2-common.dtsi
|
||||
+++ b/arch/arm/boot/dts/kirkwood-ns2-common.dtsi
|
||||
@@ -1,5 +1,5 @@
|
||||
-/include/ "kirkwood.dtsi"
|
||||
-/include/ "kirkwood-6281.dtsi"
|
||||
+#include "kirkwood.dtsi"
|
||||
+#include "kirkwood-6281.dtsi"
|
||||
|
||||
/ {
|
||||
chosen {
|
||||
--- a/arch/arm/boot/dts/kirkwood-ns2.dts
|
||||
+++ b/arch/arm/boot/dts/kirkwood-ns2.dts
|
||||
@@ -1,6 +1,6 @@
|
||||
/dts-v1/;
|
||||
|
||||
-/include/ "kirkwood-ns2-common.dtsi"
|
||||
+#include "kirkwood-ns2-common.dtsi"
|
||||
|
||||
/ {
|
||||
model = "LaCie Network Space v2";
|
||||
--- a/arch/arm/boot/dts/kirkwood-ns2lite.dts
|
||||
+++ b/arch/arm/boot/dts/kirkwood-ns2lite.dts
|
||||
@@ -1,6 +1,6 @@
|
||||
/dts-v1/;
|
||||
|
||||
-/include/ "kirkwood-ns2-common.dtsi"
|
||||
+#include "kirkwood-ns2-common.dtsi"
|
||||
|
||||
/ {
|
||||
model = "LaCie Network Space Lite v2";
|
||||
--- a/arch/arm/boot/dts/kirkwood-ns2max.dts
|
||||
+++ b/arch/arm/boot/dts/kirkwood-ns2max.dts
|
||||
@@ -1,6 +1,6 @@
|
||||
/dts-v1/;
|
||||
|
||||
-/include/ "kirkwood-ns2-common.dtsi"
|
||||
+#include "kirkwood-ns2-common.dtsi"
|
||||
|
||||
/ {
|
||||
model = "LaCie Network Space Max v2";
|
||||
--- a/arch/arm/boot/dts/kirkwood-ns2mini.dts
|
||||
+++ b/arch/arm/boot/dts/kirkwood-ns2mini.dts
|
||||
@@ -1,6 +1,6 @@
|
||||
/dts-v1/;
|
||||
|
||||
-/include/ "kirkwood-ns2-common.dtsi"
|
||||
+#include "kirkwood-ns2-common.dtsi"
|
||||
|
||||
/ {
|
||||
/* This machine is embedded in the first LaCie CloudBox product. */
|
||||
--- a/arch/arm/boot/dts/kirkwood-nsa310.dts
|
||||
+++ b/arch/arm/boot/dts/kirkwood-nsa310.dts
|
||||
@@ -1,6 +1,7 @@
|
||||
/dts-v1/;
|
||||
|
||||
-/include/ "kirkwood.dtsi"
|
||||
+#include "kirkwood.dtsi"
|
||||
+#include "kirkwood-6281.dtsi"
|
||||
|
||||
/ {
|
||||
model = "ZyXEL NSA310";
|
||||
@@ -17,22 +18,7 @@
|
||||
|
||||
ocp@f1000000 {
|
||||
pinctrl: pinctrl@10000 {
|
||||
- pinctrl-0 = < &pmx_led_esata_green
|
||||
- &pmx_led_esata_red
|
||||
- &pmx_led_usb_green
|
||||
- &pmx_led_usb_red
|
||||
- &pmx_usb_power_off
|
||||
- &pmx_led_sys_green
|
||||
- &pmx_led_sys_red
|
||||
- &pmx_btn_reset
|
||||
- &pmx_btn_copy
|
||||
- &pmx_led_copy_green
|
||||
- &pmx_led_copy_red
|
||||
- &pmx_led_hdd_green
|
||||
- &pmx_led_hdd_red
|
||||
- &pmx_unknown
|
||||
- &pmx_btn_power
|
||||
- &pmx_pwr_off >;
|
||||
+ pinctrl-0 = <&pmx_unknown>;
|
||||
pinctrl-names = "default";
|
||||
|
||||
pmx_led_esata_green: pmx-led-esata-green {
|
||||
@@ -176,12 +162,22 @@
|
||||
reg = <0x5040000 0x2fc0000>;
|
||||
};
|
||||
};
|
||||
+
|
||||
+ pcie-controller {
|
||||
+ status = "okay";
|
||||
+
|
||||
+ pcie@1,0 {
|
||||
+ status = "okay";
|
||||
+ };
|
||||
+ };
|
||||
};
|
||||
|
||||
gpio_keys {
|
||||
compatible = "gpio-keys";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
+ pinctrl-0 = <&pmx_btn_reset &pmx_btn_copy &pmx_btn_power>;
|
||||
+ pinctrl-names = "default";
|
||||
|
||||
button@1 {
|
||||
label = "Power Button";
|
||||
@@ -202,6 +198,12 @@
|
||||
|
||||
gpio-leds {
|
||||
compatible = "gpio-leds";
|
||||
+ pinctrl-0 = <&pmx_led_esata_green &pmx_led_esata_red
|
||||
+ &pmx_led_usb_green &pmx_led_usb_red
|
||||
+ &pmx_led_sys_green &pmx_led_sys_red
|
||||
+ &pmx_led_copy_green &pmx_led_copy_red
|
||||
+ &pmx_led_hdd_green &pmx_led_hdd_red>;
|
||||
+ pinctrl-names = "default";
|
||||
|
||||
green-sys {
|
||||
label = "nsa310:green:sys";
|
||||
@@ -247,6 +249,8 @@
|
||||
|
||||
gpio_poweroff {
|
||||
compatible = "gpio-poweroff";
|
||||
+ pinctrl-0 = <&pmx_pwr_off>;
|
||||
+ pinctrl-names = "default";
|
||||
gpios = <&gpio1 16 0>;
|
||||
};
|
||||
|
||||
@@ -254,6 +258,8 @@
|
||||
compatible = "simple-bus";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
+ pinctrl-0 = <&pmx_usb_power_off>;
|
||||
+ pinctrl-names = "default";
|
||||
|
||||
usb0_power_off: regulator@1 {
|
||||
compatible = "regulator-fixed";
|
||||
--- a/arch/arm/boot/dts/kirkwood-openblocks_a6.dts
|
||||
+++ b/arch/arm/boot/dts/kirkwood-openblocks_a6.dts
|
||||
@@ -1,7 +1,7 @@
|
||||
/dts-v1/;
|
||||
|
||||
-/include/ "kirkwood.dtsi"
|
||||
-/include/ "kirkwood-6282.dtsi"
|
||||
+#include "kirkwood.dtsi"
|
||||
+#include "kirkwood-6282.dtsi"
|
||||
|
||||
/ {
|
||||
model = "Plat'Home OpenBlocksA6";
|
||||
--- a/arch/arm/boot/dts/kirkwood-topkick.dts
|
||||
+++ b/arch/arm/boot/dts/kirkwood-topkick.dts
|
||||
@@ -1,7 +1,7 @@
|
||||
/dts-v1/;
|
||||
|
||||
-/include/ "kirkwood.dtsi"
|
||||
-/include/ "kirkwood-6282.dtsi"
|
||||
+#include "kirkwood.dtsi"
|
||||
+#include "kirkwood-6282.dtsi"
|
||||
|
||||
/ {
|
||||
model = "Univeral Scientific Industrial Co. Topkick-1281P2";
|
||||
--- a/arch/arm/boot/dts/kirkwood-ts219-6281.dts
|
||||
+++ b/arch/arm/boot/dts/kirkwood-ts219-6281.dts
|
||||
@@ -1,16 +1,14 @@
|
||||
/dts-v1/;
|
||||
|
||||
-/include/ "kirkwood-ts219.dtsi"
|
||||
-/include/ "kirkwood-6281.dtsi"
|
||||
+#include "kirkwood.dtsi"
|
||||
+#include "kirkwood-6281.dtsi"
|
||||
+#include "kirkwood-ts219.dtsi"
|
||||
|
||||
/ {
|
||||
ocp@f1000000 {
|
||||
pinctrl: pinctrl@10000 {
|
||||
|
||||
- pinctrl-0 = < &pmx_uart0 &pmx_uart1 &pmx_spi
|
||||
- &pmx_twsi0 &pmx_sata0 &pmx_sata1
|
||||
- &pmx_ram_size &pmx_reset_button
|
||||
- &pmx_USB_copy_button &pmx_board_id>;
|
||||
+ pinctrl-0 = <&pmx_ram_size &pmx_board_id>;
|
||||
pinctrl-names = "default";
|
||||
|
||||
pmx_ram_size: pmx-ram-size {
|
||||
@@ -38,6 +36,9 @@
|
||||
compatible = "gpio-keys";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
+ pinctrl-0 = <&pmx_reset_button &pmx_USB_copy_button>;
|
||||
+ pinctrl-names = "default";
|
||||
+
|
||||
button@1 {
|
||||
label = "USB Copy";
|
||||
linux,code = <133>;
|
||||
--- a/arch/arm/boot/dts/kirkwood-ts219-6282.dts
|
||||
+++ b/arch/arm/boot/dts/kirkwood-ts219-6282.dts
|
||||
@@ -1,16 +1,14 @@
|
||||
/dts-v1/;
|
||||
|
||||
-/include/ "kirkwood-ts219.dtsi"
|
||||
-/include/ "kirkwood-6282.dtsi"
|
||||
+#include "kirkwood.dtsi"
|
||||
+#include "kirkwood-6282.dtsi"
|
||||
+#include "kirkwood-ts219.dtsi"
|
||||
|
||||
/ {
|
||||
ocp@f1000000 {
|
||||
pinctrl: pinctrl@10000 {
|
||||
|
||||
- pinctrl-0 = < &pmx_uart0 &pmx_uart1 &pmx_spi
|
||||
- &pmx_twsi0 &pmx_sata0 &pmx_sata1
|
||||
- &pmx_ram_size &pmx_reset_button
|
||||
- &pmx_USB_copy_button &pmx_board_id>;
|
||||
+ pinctrl-0 = <&pmx_ram_size &pmx_board_id>;
|
||||
pinctrl-names = "default";
|
||||
|
||||
pmx_ram_size: pmx-ram-size {
|
||||
@@ -32,12 +30,23 @@
|
||||
marvell,function = "gpio";
|
||||
};
|
||||
};
|
||||
+ pcie-controller {
|
||||
+ status = "okay";
|
||||
+
|
||||
+ pcie@2,0 {
|
||||
+ status = "okay";
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
};
|
||||
|
||||
gpio_keys {
|
||||
compatible = "gpio-keys";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
+ pinctrl-0 = <&pmx_reset_button &pmx_USB_copy_button>;
|
||||
+ pinctrl-names = "default";
|
||||
+
|
||||
button@1 {
|
||||
label = "USB Copy";
|
||||
linux,code = <133>;
|
|
@ -1,41 +0,0 @@
|
|||
From 9d4a304873c9f6a8bbf78cba329985768a1c6c93 Mon Sep 17 00:00:00 2001
|
||||
From: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Date: Tue, 23 Jul 2013 07:48:04 -0300
|
||||
Subject: [PATCH 062/203] ARM: kirkwood: Introduce MBus DT node
|
||||
|
||||
Add a minimal MBus node, just to allow the MBus driver to probe.
|
||||
Follow-up patches will migrate the rest of the nodes appropriately.
|
||||
|
||||
Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Tested-by: Andrew Lunn <andrew@lunn.ch>
|
||||
Tested-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/kirkwood.dtsi | 10 ++++++++++
|
||||
1 file changed, 10 insertions(+)
|
||||
|
||||
--- a/arch/arm/boot/dts/kirkwood.dtsi
|
||||
+++ b/arch/arm/boot/dts/kirkwood.dtsi
|
||||
@@ -16,6 +16,11 @@
|
||||
<0xf1020214 0x04>;
|
||||
};
|
||||
|
||||
+ mbus {
|
||||
+ compatible = "marvell,kirkwood-mbus", "simple-bus";
|
||||
+ controller = <&mbusc>;
|
||||
+ };
|
||||
+
|
||||
ocp@f1000000 {
|
||||
compatible = "simple-bus";
|
||||
ranges = <0x00000000 0xf1000000 0x4000000
|
||||
@@ -23,6 +28,11 @@
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
+ mbusc: mbus-controller@20000 {
|
||||
+ compatible = "marvell,mbus-controller";
|
||||
+ reg = <0x20000 0x80>, <0x1500 0x20>;
|
||||
+ };
|
||||
+
|
||||
core_clk: core-clocks@10030 {
|
||||
compatible = "marvell,kirkwood-core-clock";
|
||||
reg = <0x10030 0x4>;
|
|
@ -1,25 +0,0 @@
|
|||
From 32016796bb28ebf748851c166b03159600aa9a00 Mon Sep 17 00:00:00 2001
|
||||
From: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Date: Tue, 23 Jul 2013 08:33:39 -0300
|
||||
Subject: [PATCH 063/203] ARM: kirkwood: Introduce MBUS_ID
|
||||
|
||||
This macro is used to define window's target ID and attribute cells
|
||||
for the MBus ranges entries.
|
||||
|
||||
Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Tested-by: Andrew Lunn <andrew@lunn.ch>
|
||||
Tested-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/kirkwood.dtsi | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
--- a/arch/arm/boot/dts/kirkwood.dtsi
|
||||
+++ b/arch/arm/boot/dts/kirkwood.dtsi
|
||||
@@ -1,5 +1,7 @@
|
||||
/include/ "skeleton.dtsi"
|
||||
|
||||
+#define MBUS_ID(target,attributes) (((target) << 24) | ((attributes) << 16))
|
||||
+
|
||||
/ {
|
||||
compatible = "marvell,kirkwood";
|
||||
interrupt-parent = <&intc>;
|
|
@ -1,301 +0,0 @@
|
|||
From ae23894bcb163d1f91483b9566dc077f1e863af6 Mon Sep 17 00:00:00 2001
|
||||
From: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Date: Tue, 23 Jul 2013 08:44:00 -0300
|
||||
Subject: [PATCH 064/203] ARM: kirkwood: Relocate PCIe device tree nodes
|
||||
|
||||
Now that mbus has been added to the device tree, it's possible to
|
||||
move the PCIe nodes out of the ocp node, placing it directly
|
||||
below the mbus. This is a more accurate representation of the hardware.
|
||||
|
||||
Moving the PCIe nodes, we now need to introduce an extra cell to
|
||||
encode the window target ID and attribute. Since this depends on
|
||||
the PCIe port, we split the ranges translation entries, to
|
||||
correspond to each MBus window.
|
||||
|
||||
In addition, we encode the PCIe memory and I/O apertures in the MBus
|
||||
node, according to the MBus DT binding specification. The choice made
|
||||
is 0xe0000000-0xf0000000 for memory space, and 0xf200000-0xf2100000 for
|
||||
I/O space. These apertures can be changed in each per-board DT file.
|
||||
|
||||
Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Tested-by: Andrew Lunn <andrew@lunn.ch>
|
||||
Tested-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/kirkwood-6281.dtsi | 35 ++++++++++++++
|
||||
arch/arm/boot/dts/kirkwood-6282.dtsi | 55 ++++++++++++++++++++++
|
||||
arch/arm/boot/dts/kirkwood-iconnect.dts | 11 +++++
|
||||
arch/arm/boot/dts/kirkwood-mplcec4.dts | 11 +++++
|
||||
.../boot/dts/kirkwood-netgear_readynas_duo_v2.dts | 11 +++++
|
||||
arch/arm/boot/dts/kirkwood-nsa310.dts | 19 ++++----
|
||||
arch/arm/boot/dts/kirkwood-ts219-6282.dts | 19 ++++----
|
||||
arch/arm/boot/dts/kirkwood-ts219.dtsi | 10 ++++
|
||||
arch/arm/boot/dts/kirkwood.dtsi | 4 ++
|
||||
9 files changed, 159 insertions(+), 16 deletions(-)
|
||||
|
||||
--- a/arch/arm/boot/dts/kirkwood-6281.dtsi
|
||||
+++ b/arch/arm/boot/dts/kirkwood-6281.dtsi
|
||||
@@ -1,4 +1,39 @@
|
||||
/ {
|
||||
+ mbus {
|
||||
+ pcie-controller {
|
||||
+ compatible = "marvell,kirkwood-pcie";
|
||||
+ status = "disabled";
|
||||
+ device_type = "pci";
|
||||
+
|
||||
+ #address-cells = <3>;
|
||||
+ #size-cells = <2>;
|
||||
+
|
||||
+ bus-range = <0x00 0xff>;
|
||||
+
|
||||
+ ranges =
|
||||
+ <0x82000000 0 0x40000 MBUS_ID(0xf0, 0x01) 0x40000 0 0x00002000
|
||||
+ 0x82000000 0x1 0 MBUS_ID(0x04, 0xe8) 0 1 0 /* Port 0.0 MEM */
|
||||
+ 0x81000000 0x1 0 MBUS_ID(0x04, 0xe0) 0 1 0 /* Port 0.0 IO */>;
|
||||
+
|
||||
+ pcie@1,0 {
|
||||
+ device_type = "pci";
|
||||
+ assigned-addresses = <0x82000800 0 0x00040000 0 0x2000>;
|
||||
+ reg = <0x0800 0 0 0 0>;
|
||||
+ #address-cells = <3>;
|
||||
+ #size-cells = <2>;
|
||||
+ #interrupt-cells = <1>;
|
||||
+ ranges = <0x82000000 0 0 0x82000000 0x1 0 1 0
|
||||
+ 0x81000000 0 0 0x81000000 0x1 0 1 0>;
|
||||
+ interrupt-map-mask = <0 0 0 0>;
|
||||
+ interrupt-map = <0 0 0 0 &intc 9>;
|
||||
+ marvell,pcie-port = <0>;
|
||||
+ marvell,pcie-lane = <0>;
|
||||
+ clocks = <&gate_clk 2>;
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
ocp@f1000000 {
|
||||
pinctrl: pinctrl@10000 {
|
||||
compatible = "marvell,88f6281-pinctrl";
|
||||
--- a/arch/arm/boot/dts/kirkwood-6282.dtsi
|
||||
+++ b/arch/arm/boot/dts/kirkwood-6282.dtsi
|
||||
@@ -1,4 +1,59 @@
|
||||
/ {
|
||||
+ mbus {
|
||||
+ pcie-controller {
|
||||
+ compatible = "marvell,kirkwood-pcie";
|
||||
+ status = "disabled";
|
||||
+ device_type = "pci";
|
||||
+
|
||||
+ #address-cells = <3>;
|
||||
+ #size-cells = <2>;
|
||||
+
|
||||
+ bus-range = <0x00 0xff>;
|
||||
+
|
||||
+ ranges =
|
||||
+ <0x82000000 0 0x40000 MBUS_ID(0xf0, 0x01) 0x40000 0 0x00002000
|
||||
+ 0x82000000 0 0x44000 MBUS_ID(0xf0, 0x01) 0x44000 0 0x00002000
|
||||
+ 0x82000000 0 0x80000 MBUS_ID(0xf0, 0x01) 0x80000 0 0x00002000
|
||||
+ 0x82000000 0x1 0 MBUS_ID(0x04, 0xe8) 0 1 0 /* Port 0.0 MEM */
|
||||
+ 0x81000000 0x1 0 MBUS_ID(0x04, 0xe0) 0 1 0 /* Port 0.0 IO */
|
||||
+ 0x82000000 0x2 0 MBUS_ID(0x04, 0xd8) 0 1 0 /* Port 1.0 MEM */
|
||||
+ 0x81000000 0x2 0 MBUS_ID(0x04, 0xd0) 0 1 0 /* Port 1.0 IO */>;
|
||||
+
|
||||
+ pcie@1,0 {
|
||||
+ device_type = "pci";
|
||||
+ assigned-addresses = <0x82000800 0 0x00040000 0 0x2000>;
|
||||
+ reg = <0x0800 0 0 0 0>;
|
||||
+ #address-cells = <3>;
|
||||
+ #size-cells = <2>;
|
||||
+ #interrupt-cells = <1>;
|
||||
+ ranges = <0x82000000 0 0 0x82000000 0x1 0 1 0
|
||||
+ 0x81000000 0 0 0x81000000 0x1 0 1 0>;
|
||||
+ interrupt-map-mask = <0 0 0 0>;
|
||||
+ interrupt-map = <0 0 0 0 &intc 9>;
|
||||
+ marvell,pcie-port = <0>;
|
||||
+ marvell,pcie-lane = <0>;
|
||||
+ clocks = <&gate_clk 2>;
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ pcie@2,0 {
|
||||
+ device_type = "pci";
|
||||
+ assigned-addresses = <0x82001000 0 0x00044000 0 0x2000>;
|
||||
+ reg = <0x1000 0 0 0 0>;
|
||||
+ #address-cells = <3>;
|
||||
+ #size-cells = <2>;
|
||||
+ #interrupt-cells = <1>;
|
||||
+ ranges = <0x82000000 0 0 0x82000000 0x2 0 1 0
|
||||
+ 0x81000000 0 0 0x81000000 0x2 0 1 0>;
|
||||
+ interrupt-map-mask = <0 0 0 0>;
|
||||
+ interrupt-map = <0 0 0 0 &intc 10>;
|
||||
+ marvell,pcie-port = <1>;
|
||||
+ marvell,pcie-lane = <0>;
|
||||
+ clocks = <&gate_clk 18>;
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
ocp@f1000000 {
|
||||
|
||||
pinctrl: pinctrl@10000 {
|
||||
--- a/arch/arm/boot/dts/kirkwood-iconnect.dts
|
||||
+++ b/arch/arm/boot/dts/kirkwood-iconnect.dts
|
||||
@@ -18,6 +18,17 @@
|
||||
linux,initrd-end = <0x4800000>;
|
||||
};
|
||||
|
||||
+ mbus {
|
||||
+ ranges = <MBUS_ID(0xf0, 0x01) 0 0xf1000000 0x100000>;
|
||||
+ pcie-controller {
|
||||
+ status = "okay";
|
||||
+
|
||||
+ pcie@1,0 {
|
||||
+ status = "okay";
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
ocp@f1000000 {
|
||||
pinctrl: pinctrl@10000 {
|
||||
|
||||
--- a/arch/arm/boot/dts/kirkwood-mplcec4.dts
|
||||
+++ b/arch/arm/boot/dts/kirkwood-mplcec4.dts
|
||||
@@ -16,6 +16,17 @@
|
||||
bootargs = "console=ttyS0,115200n8 earlyprintk";
|
||||
};
|
||||
|
||||
+ mbus {
|
||||
+ ranges = <MBUS_ID(0xf0, 0x01) 0 0xf1000000 0x100000>;
|
||||
+ pcie-controller {
|
||||
+ status = "okay";
|
||||
+
|
||||
+ pcie@1,0 {
|
||||
+ status = "okay";
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
ocp@f1000000 {
|
||||
pinctrl: pinctrl@10000 {
|
||||
|
||||
--- a/arch/arm/boot/dts/kirkwood-netgear_readynas_duo_v2.dts
|
||||
+++ b/arch/arm/boot/dts/kirkwood-netgear_readynas_duo_v2.dts
|
||||
@@ -16,6 +16,17 @@
|
||||
bootargs = "console=ttyS0,115200n8 earlyprintk";
|
||||
};
|
||||
|
||||
+ mbus {
|
||||
+ ranges = <MBUS_ID(0xf0, 0x01) 0 0xf1000000 0x100000>;
|
||||
+ pcie-controller {
|
||||
+ status = "okay";
|
||||
+
|
||||
+ pcie@1,0 {
|
||||
+ status = "okay";
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
ocp@f1000000 {
|
||||
pinctrl: pinctrl@10000 {
|
||||
|
||||
--- a/arch/arm/boot/dts/kirkwood-nsa310.dts
|
||||
+++ b/arch/arm/boot/dts/kirkwood-nsa310.dts
|
||||
@@ -16,6 +16,17 @@
|
||||
bootargs = "console=ttyS0,115200";
|
||||
};
|
||||
|
||||
+ mbus {
|
||||
+ ranges = <MBUS_ID(0xf0, 0x01) 0 0xf1000000 0x100000>;
|
||||
+ pcie-controller {
|
||||
+ status = "okay";
|
||||
+
|
||||
+ pcie@1,0 {
|
||||
+ status = "okay";
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
ocp@f1000000 {
|
||||
pinctrl: pinctrl@10000 {
|
||||
pinctrl-0 = <&pmx_unknown>;
|
||||
@@ -162,14 +173,6 @@
|
||||
reg = <0x5040000 0x2fc0000>;
|
||||
};
|
||||
};
|
||||
-
|
||||
- pcie-controller {
|
||||
- status = "okay";
|
||||
-
|
||||
- pcie@1,0 {
|
||||
- status = "okay";
|
||||
- };
|
||||
- };
|
||||
};
|
||||
|
||||
gpio_keys {
|
||||
--- a/arch/arm/boot/dts/kirkwood-ts219-6282.dts
|
||||
+++ b/arch/arm/boot/dts/kirkwood-ts219-6282.dts
|
||||
@@ -5,6 +5,17 @@
|
||||
#include "kirkwood-ts219.dtsi"
|
||||
|
||||
/ {
|
||||
+ mbus {
|
||||
+ ranges = <MBUS_ID(0xf0, 0x01) 0 0xf1000000 0x100000>;
|
||||
+ pcie-controller {
|
||||
+ status = "okay";
|
||||
+
|
||||
+ pcie@2,0 {
|
||||
+ status = "okay";
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
ocp@f1000000 {
|
||||
pinctrl: pinctrl@10000 {
|
||||
|
||||
@@ -30,14 +41,6 @@
|
||||
marvell,function = "gpio";
|
||||
};
|
||||
};
|
||||
- pcie-controller {
|
||||
- status = "okay";
|
||||
-
|
||||
- pcie@2,0 {
|
||||
- status = "okay";
|
||||
- };
|
||||
- };
|
||||
-
|
||||
};
|
||||
|
||||
gpio_keys {
|
||||
--- a/arch/arm/boot/dts/kirkwood-ts219.dtsi
|
||||
+++ b/arch/arm/boot/dts/kirkwood-ts219.dtsi
|
||||
@@ -13,6 +13,16 @@
|
||||
bootargs = "console=ttyS0,115200n8";
|
||||
};
|
||||
|
||||
+ mbus {
|
||||
+ pcie-controller {
|
||||
+ status = "okay";
|
||||
+
|
||||
+ pcie@1,0 {
|
||||
+ status = "okay";
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
ocp@f1000000 {
|
||||
i2c@11000 {
|
||||
status = "okay";
|
||||
--- a/arch/arm/boot/dts/kirkwood.dtsi
|
||||
+++ b/arch/arm/boot/dts/kirkwood.dtsi
|
||||
@@ -20,7 +20,11 @@
|
||||
|
||||
mbus {
|
||||
compatible = "marvell,kirkwood-mbus", "simple-bus";
|
||||
+ #address-cells = <2>;
|
||||
+ #size-cells = <1>;
|
||||
controller = <&mbusc>;
|
||||
+ pcie-mem-aperture = <0xe0000000 0x10000000>; /* 256 MiB memory space */
|
||||
+ pcie-io-aperture = <0xf2000000 0x100000>; /* 1 MiB I/O space */
|
||||
};
|
||||
|
||||
ocp@f1000000 {
|
|
@ -1,303 +0,0 @@
|
|||
From 442681ff6aca5e839fe41378ff919df1c340dc62 Mon Sep 17 00:00:00 2001
|
||||
From: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Date: Tue, 28 May 2013 07:58:31 -0300
|
||||
Subject: [PATCH 065/203] bus: mvebu-mbus: Add devicetree binding
|
||||
|
||||
Introduce the devicetree binding for the mvebu MBus driver
|
||||
avaiable in the mvebu SoCs (Armada 370/XP, Kirkwood, Dove, ...).
|
||||
|
||||
This binding provides an accurate model of the SoC address space,
|
||||
and allows to declare the address and size of the decoding windows the MBus
|
||||
needs to access the peripherals, together with the target ID and attribute
|
||||
for those windows.
|
||||
|
||||
The binding is composed of two required nodes: one for the MBus bus
|
||||
and one for the MBus controller.
|
||||
|
||||
Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Tested-by: Andrew Lunn <andrew@lunn.ch>
|
||||
Tested-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
|
||||
---
|
||||
.../devicetree/bindings/bus/mvebu-mbus.txt | 276 +++++++++++++++++++++
|
||||
1 file changed, 276 insertions(+)
|
||||
create mode 100644 Documentation/devicetree/bindings/bus/mvebu-mbus.txt
|
||||
|
||||
--- /dev/null
|
||||
+++ b/Documentation/devicetree/bindings/bus/mvebu-mbus.txt
|
||||
@@ -0,0 +1,276 @@
|
||||
+
|
||||
+* Marvell MBus
|
||||
+
|
||||
+Required properties:
|
||||
+
|
||||
+- compatible: Should be set to one of the following:
|
||||
+ marvell,armada370-mbus
|
||||
+ marvell,armadaxp-mbus
|
||||
+ marvell,armada370-mbus
|
||||
+ marvell,armadaxp-mbus
|
||||
+ marvell,kirkwood-mbus
|
||||
+ marvell,dove-mbus
|
||||
+ marvell,orion5x-88f5281-mbus
|
||||
+ marvell,orion5x-88f5182-mbus
|
||||
+ marvell,orion5x-88f5181-mbus
|
||||
+ marvell,orion5x-88f6183-mbus
|
||||
+ marvell,mv78xx0-mbus
|
||||
+
|
||||
+- address-cells: Must be '2'. The first cell for the MBus ID encoding,
|
||||
+ the second cell for the address offset within the window.
|
||||
+
|
||||
+- size-cells: Must be '1'.
|
||||
+
|
||||
+- ranges: Must be set up to provide a proper translation for each child.
|
||||
+ See the examples below.
|
||||
+
|
||||
+- controller: Contains a single phandle referring to the MBus controller
|
||||
+ node. This allows to specify the node that contains the
|
||||
+ registers that control the MBus, which is typically contained
|
||||
+ within the internal register window (see below).
|
||||
+
|
||||
+Optional properties:
|
||||
+
|
||||
+- pcie-mem-aperture: This optional property contains the aperture for
|
||||
+ the memory region of the PCIe driver.
|
||||
+ If it's defined, it must encode the base address and
|
||||
+ size for the address decoding windows allocated for
|
||||
+ the PCIe memory region.
|
||||
+
|
||||
+- pcie-io-aperture: Just as explained for the above property, this
|
||||
+ optional property contains the aperture for the
|
||||
+ I/O region of the PCIe driver.
|
||||
+
|
||||
+* Marvell MBus controller
|
||||
+
|
||||
+Required properties:
|
||||
+
|
||||
+- compatible: Should be set to "marvell,mbus-controller".
|
||||
+
|
||||
+- reg: Device's register space.
|
||||
+ Two entries are expected (see the examples below):
|
||||
+ the first one controls the devices decoding window and
|
||||
+ the second one controls the SDRAM decoding window.
|
||||
+
|
||||
+Example:
|
||||
+
|
||||
+ soc {
|
||||
+ compatible = "marvell,armada370-mbus", "simple-bus";
|
||||
+ #address-cells = <2>;
|
||||
+ #size-cells = <1>;
|
||||
+ controller = <&mbusc>;
|
||||
+ pcie-mem-aperture = <0xe0000000 0x8000000>;
|
||||
+ pcie-io-aperture = <0xe8000000 0x100000>;
|
||||
+
|
||||
+ internal-regs {
|
||||
+ compatible = "simple-bus";
|
||||
+
|
||||
+ mbusc: mbus-controller@20000 {
|
||||
+ compatible = "marvell,mbus-controller";
|
||||
+ reg = <0x20000 0x100>, <0x20180 0x20>;
|
||||
+ };
|
||||
+
|
||||
+ /* more children ...*/
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+** MBus address decoding window specification
|
||||
+
|
||||
+The MBus children address space is comprised of two cells: the first one for
|
||||
+the window ID and the second one for the offset within the window.
|
||||
+In order to allow to describe valid and non-valid window entries, the
|
||||
+following encoding is used:
|
||||
+
|
||||
+ 0xSIAA0000 0x00oooooo
|
||||
+
|
||||
+Where:
|
||||
+
|
||||
+ S = 0x0 for a MBus valid window
|
||||
+ S = 0xf for a non-valid window (see below)
|
||||
+
|
||||
+If S = 0x0, then:
|
||||
+
|
||||
+ I = 4-bit window target ID
|
||||
+ AA = windpw attribute
|
||||
+
|
||||
+If S = 0xf, then:
|
||||
+
|
||||
+ I = don't care
|
||||
+ AA = 1 for internal register
|
||||
+
|
||||
+Following the above encoding, for each ranges entry for a MBus valid window
|
||||
+(S = 0x0), an address decoding window is allocated. On the other side,
|
||||
+entries for translation that do not correspond to valid windows (S = 0xf)
|
||||
+are skipped.
|
||||
+
|
||||
+ soc {
|
||||
+ compatible = "marvell,armada370-mbus", "simple-bus";
|
||||
+ #address-cells = <2>;
|
||||
+ #size-cells = <1>;
|
||||
+ controller = <&mbusc>;
|
||||
+
|
||||
+ ranges = <0xf0010000 0 0 0xd0000000 0x100000
|
||||
+ 0x01e00000 0 0 0xfff00000 0x100000>;
|
||||
+
|
||||
+ bootrom {
|
||||
+ compatible = "marvell,bootrom";
|
||||
+ reg = <0x01e00000 0 0x100000>;
|
||||
+ };
|
||||
+
|
||||
+ /* other children */
|
||||
+ ...
|
||||
+
|
||||
+ internal-regs {
|
||||
+ compatible = "simple-bus";
|
||||
+ ranges = <0 0xf0010000 0 0x100000>;
|
||||
+
|
||||
+ mbusc: mbus-controller@20000 {
|
||||
+ compatible = "marvell,mbus-controller";
|
||||
+ reg = <0x20000 0x100>, <0x20180 0x20>;
|
||||
+ };
|
||||
+
|
||||
+ /* more children ...*/
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+In the shown example, the translation entry in the 'ranges' property is what
|
||||
+makes the MBus driver create a static decoding window for the corresponding
|
||||
+given child device. Note that the binding does not require child nodes to be
|
||||
+present. Of course, child nodes are needed to probe the devices.
|
||||
+
|
||||
+Since each window is identified by its target ID and attribute ID there's
|
||||
+a special macro that can be use to simplify the translation entries:
|
||||
+
|
||||
+#define MBUS_ID(target,attributes) (((target) << 24) | ((attributes) << 16))
|
||||
+
|
||||
+Using this macro, the above example would be:
|
||||
+
|
||||
+ soc {
|
||||
+ compatible = "marvell,armada370-mbus", "simple-bus";
|
||||
+ #address-cells = <2>;
|
||||
+ #size-cells = <1>;
|
||||
+ controller = <&mbusc>;
|
||||
+
|
||||
+ ranges = < MBUS_ID(0xf0, 0x01) 0 0 0xd0000000 0x100000
|
||||
+ MBUS_ID(0x01, 0xe0) 0 0 0xfff00000 0x100000>;
|
||||
+
|
||||
+ bootrom {
|
||||
+ compatible = "marvell,bootrom";
|
||||
+ reg = <MBUS_ID(0x01, 0xe0) 0 0x100000>;
|
||||
+ };
|
||||
+
|
||||
+ /* other children */
|
||||
+ ...
|
||||
+
|
||||
+ internal-regs {
|
||||
+ compatible = "simple-bus";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+ ranges = <0 MBUS_ID(0xf0, 0x01) 0 0x100000>;
|
||||
+
|
||||
+ mbusc: mbus-controller@20000 {
|
||||
+ compatible = "marvell,mbus-controller";
|
||||
+ reg = <0x20000 0x100>, <0x20180 0x20>;
|
||||
+ };
|
||||
+
|
||||
+ /* other children */
|
||||
+ ...
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+
|
||||
+** About the window base address
|
||||
+
|
||||
+Remember the MBus controller allows a great deal of flexibility for choosing
|
||||
+the decoding window base address. When planning the device tree layout it's
|
||||
+possible to choose any address as the base address, provided of course there's
|
||||
+a region large enough available, and with the required alignment.
|
||||
+
|
||||
+Yet in other words: there's nothing preventing us from setting a base address
|
||||
+of 0xf0000000, or 0xd0000000 for the NOR device shown above, if such region is
|
||||
+unused.
|
||||
+
|
||||
+** Window allocation policy
|
||||
+
|
||||
+The mbus-node ranges property defines a set of mbus windows that are expected
|
||||
+to be set by the operating system and that are guaranteed to be free of overlaps
|
||||
+with one another or with the system memory ranges.
|
||||
+
|
||||
+Each entry in the property refers to exactly one window. If the operating system
|
||||
+choses to use a different set of mbus windows, it must ensure that any address
|
||||
+translations performed from downstream devices are adapted accordingly.
|
||||
+
|
||||
+The operating system may insert additional mbus windows that do not conflict
|
||||
+with the ones listed in the ranges, e.g. for mapping PCIe devices.
|
||||
+As a special case, the internal register window must be set up by the boot
|
||||
+loader at the address listed in the ranges property, since access to that region
|
||||
+is needed to set up the other windows.
|
||||
+
|
||||
+** Example
|
||||
+
|
||||
+See the example below, where a more complete device tree is shown:
|
||||
+
|
||||
+ soc {
|
||||
+ compatible = "marvell,armadaxp-mbus", "simple-bus";
|
||||
+ controller = <&mbusc>;
|
||||
+
|
||||
+ ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xd0000000 0x100000 /* internal-regs */
|
||||
+ MBUS_ID(0x01, 0x1d) 0 0 0xfff00000 0x100000
|
||||
+ MBUS_ID(0x01, 0x2f) 0 0 0xf0000000 0x8000000>;
|
||||
+
|
||||
+ bootrom {
|
||||
+ compatible = "marvell,bootrom";
|
||||
+ reg = <MBUS_ID(0x01, 0x1d) 0 0x100000>;
|
||||
+ };
|
||||
+
|
||||
+ devbus-bootcs {
|
||||
+ status = "okay";
|
||||
+ ranges = <0 MBUS_ID(0x01, 0x2f) 0 0x8000000>;
|
||||
+
|
||||
+ /* NOR */
|
||||
+ nor {
|
||||
+ compatible = "cfi-flash";
|
||||
+ reg = <0 0x8000000>;
|
||||
+ bank-width = <2>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ pcie-controller {
|
||||
+ compatible = "marvell,armada-xp-pcie";
|
||||
+ status = "okay";
|
||||
+ device_type = "pci";
|
||||
+
|
||||
+ #address-cells = <3>;
|
||||
+ #size-cells = <2>;
|
||||
+
|
||||
+ ranges =
|
||||
+ <0x82000000 0 0x40000 MBUS_ID(0xf0, 0x01) 0x40000 0 0x00002000 /* Port 0.0 registers */
|
||||
+ 0x82000000 0 0x42000 MBUS_ID(0xf0, 0x01) 0x42000 0 0x00002000 /* Port 2.0 registers */
|
||||
+ 0x82000000 0 0x44000 MBUS_ID(0xf0, 0x01) 0x44000 0 0x00002000 /* Port 0.1 registers */
|
||||
+ 0x82000000 0 0x48000 MBUS_ID(0xf0, 0x01) 0x48000 0 0x00002000 /* Port 0.2 registers */
|
||||
+ 0x82000000 0 0x4c000 MBUS_ID(0xf0, 0x01) 0x4c000 0 0x00002000 /* Port 0.3 registers */
|
||||
+ 0x82000800 0 0xe0000000 MBUS_ID(0x04, 0xe8) 0xe0000000 0 0x08000000 /* Port 0.0 MEM */
|
||||
+ 0x81000800 0 0 MBUS_ID(0x04, 0xe0) 0xe8000000 0 0x00100000 /* Port 0.0 IO */>;
|
||||
+
|
||||
+
|
||||
+ pcie@1,0 {
|
||||
+ /* Port 0, Lane 0 */
|
||||
+ status = "okay";
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ internal-regs {
|
||||
+ compatible = "simple-bus";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+ ranges = <0 MBUS_ID(0xf0, 0x01) 0 0x100000>;
|
||||
+
|
||||
+ mbusc: mbus-controller@20000 {
|
||||
+ reg = <0x20000 0x100>, <0x20180 0x20>;
|
||||
+ };
|
||||
+
|
||||
+ interrupt-controller@20000 {
|
||||
+ reg = <0x20a00 0x2d0>, <0x21070 0x58>;
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
|
@ -1,304 +0,0 @@
|
|||
From 60538f9841697cd4539d353afd8a7f51cd17e4af Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Date: Fri, 5 Jul 2013 14:54:17 +0200
|
||||
Subject: [PATCH 066/203] PCI: mvebu: Adapt to the new device tree layout
|
||||
|
||||
The new device tree layout encodes the window's target ID and attribute
|
||||
in the PCIe controller node's ranges property. This allows to parse
|
||||
such entries to obtain such information and use the recently introduced
|
||||
MBus API to create the windows, instead of using the current name based
|
||||
scheme.
|
||||
|
||||
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
|
||||
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Tested-by: Andrew Lunn <andrew@lunn.ch>
|
||||
Tested-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
|
||||
---
|
||||
.../devicetree/bindings/pci/mvebu-pci.txt | 145 ++++++++++++++++-----
|
||||
1 file changed, 109 insertions(+), 36 deletions(-)
|
||||
|
||||
--- a/Documentation/devicetree/bindings/pci/mvebu-pci.txt
|
||||
+++ b/Documentation/devicetree/bindings/pci/mvebu-pci.txt
|
||||
@@ -1,6 +1,7 @@
|
||||
* Marvell EBU PCIe interfaces
|
||||
|
||||
Mandatory properties:
|
||||
+
|
||||
- compatible: one of the following values:
|
||||
marvell,armada-370-pcie
|
||||
marvell,armada-xp-pcie
|
||||
@@ -9,11 +10,49 @@ Mandatory properties:
|
||||
- #interrupt-cells, set to <1>
|
||||
- bus-range: PCI bus numbers covered
|
||||
- device_type, set to "pci"
|
||||
-- ranges: ranges for the PCI memory and I/O regions, as well as the
|
||||
- MMIO registers to control the PCIe interfaces.
|
||||
+- ranges: ranges describing the MMIO registers to control the PCIe
|
||||
+ interfaces, and ranges describing the MBus windows needed to access
|
||||
+ the memory and I/O regions of each PCIe interface.
|
||||
+
|
||||
+The ranges describing the MMIO registers have the following layout:
|
||||
+
|
||||
+ 0x82000000 0 r MBUS_ID(0xf0, 0x01) r 0 s
|
||||
+
|
||||
+where:
|
||||
+
|
||||
+ * r is a 32-bits value that gives the offset of the MMIO
|
||||
+ registers of this PCIe interface, from the base of the internal
|
||||
+ registers.
|
||||
+
|
||||
+ * s is a 32-bits value that give the size of this MMIO
|
||||
+ registers area. This range entry translates the '0x82000000 0 r' PCI
|
||||
+ address into the 'MBUS_ID(0xf0, 0x01) r' CPU address, which is part
|
||||
+ of the internal register window (as identified by MBUS_ID(0xf0,
|
||||
+ 0x01)).
|
||||
+
|
||||
+The ranges describing the MBus windows have the following layout:
|
||||
+
|
||||
+ 0x8t000000 s 0 MBUS_ID(w, a) 0 1 0
|
||||
+
|
||||
+where:
|
||||
|
||||
-In addition, the Device Tree node must have sub-nodes describing each
|
||||
+ * t is the type of the MBus window (as defined by the standard PCI DT
|
||||
+ bindings), 1 for I/O and 2 for memory.
|
||||
+
|
||||
+ * s is the PCI slot that corresponds to this PCIe interface
|
||||
+
|
||||
+ * w is the 'target ID' value for the MBus window
|
||||
+
|
||||
+ * a the 'attribute' value for the MBus window.
|
||||
+
|
||||
+Since the location and size of the different MBus windows is not fixed in
|
||||
+hardware, and only determined in runtime, those ranges cover the full first
|
||||
+4 GB of the physical address space, and do not translate into a valid CPU
|
||||
+address.
|
||||
+
|
||||
+In addition, the device tree node must have sub-nodes describing each
|
||||
PCIe interface, having the following mandatory properties:
|
||||
+
|
||||
- reg: used only for interrupt mapping, so only the first four bytes
|
||||
are used to refer to the correct bus number and device number.
|
||||
- assigned-addresses: reference to the MMIO registers used to control
|
||||
@@ -25,7 +64,8 @@ PCIe interface, having the following man
|
||||
- #address-cells, set to <3>
|
||||
- #size-cells, set to <2>
|
||||
- #interrupt-cells, set to <1>
|
||||
-- ranges, empty property.
|
||||
+- ranges, translating the MBus windows ranges of the parent node into
|
||||
+ standard PCI addresses.
|
||||
- interrupt-map-mask and interrupt-map, standard PCI properties to
|
||||
define the mapping of the PCIe interface to interrupt numbers.
|
||||
|
||||
@@ -46,27 +86,50 @@ pcie-controller {
|
||||
|
||||
bus-range = <0x00 0xff>;
|
||||
|
||||
- ranges = <0x82000000 0 0xd0040000 0xd0040000 0 0x00002000 /* Port 0.0 registers */
|
||||
- 0x82000000 0 0xd0042000 0xd0042000 0 0x00002000 /* Port 2.0 registers */
|
||||
- 0x82000000 0 0xd0044000 0xd0044000 0 0x00002000 /* Port 0.1 registers */
|
||||
- 0x82000000 0 0xd0048000 0xd0048000 0 0x00002000 /* Port 0.2 registers */
|
||||
- 0x82000000 0 0xd004c000 0xd004c000 0 0x00002000 /* Port 0.3 registers */
|
||||
- 0x82000000 0 0xd0080000 0xd0080000 0 0x00002000 /* Port 1.0 registers */
|
||||
- 0x82000000 0 0xd0082000 0xd0082000 0 0x00002000 /* Port 3.0 registers */
|
||||
- 0x82000000 0 0xd0084000 0xd0084000 0 0x00002000 /* Port 1.1 registers */
|
||||
- 0x82000000 0 0xd0088000 0xd0088000 0 0x00002000 /* Port 1.2 registers */
|
||||
- 0x82000000 0 0xd008c000 0xd008c000 0 0x00002000 /* Port 1.3 registers */
|
||||
- 0x82000000 0 0xe0000000 0xe0000000 0 0x08000000 /* non-prefetchable memory */
|
||||
- 0x81000000 0 0 0xe8000000 0 0x00100000>; /* downstream I/O */
|
||||
+ ranges =
|
||||
+ <0x82000000 0 0x40000 MBUS_ID(0xf0, 0x01) 0x40000 0 0x00002000 /* Port 0.0 registers */
|
||||
+ 0x82000000 0 0x42000 MBUS_ID(0xf0, 0x01) 0x42000 0 0x00002000 /* Port 2.0 registers */
|
||||
+ 0x82000000 0 0x44000 MBUS_ID(0xf0, 0x01) 0x44000 0 0x00002000 /* Port 0.1 registers */
|
||||
+ 0x82000000 0 0x48000 MBUS_ID(0xf0, 0x01) 0x48000 0 0x00002000 /* Port 0.2 registers */
|
||||
+ 0x82000000 0 0x4c000 MBUS_ID(0xf0, 0x01) 0x4c000 0 0x00002000 /* Port 0.3 registers */
|
||||
+ 0x82000000 0 0x80000 MBUS_ID(0xf0, 0x01) 0x80000 0 0x00002000 /* Port 1.0 registers */
|
||||
+ 0x82000000 0 0x82000 MBUS_ID(0xf0, 0x01) 0x82000 0 0x00002000 /* Port 3.0 registers */
|
||||
+ 0x82000000 0 0x84000 MBUS_ID(0xf0, 0x01) 0x84000 0 0x00002000 /* Port 1.1 registers */
|
||||
+ 0x82000000 0 0x88000 MBUS_ID(0xf0, 0x01) 0x88000 0 0x00002000 /* Port 1.2 registers */
|
||||
+ 0x82000000 0 0x8c000 MBUS_ID(0xf0, 0x01) 0x8c000 0 0x00002000 /* Port 1.3 registers */
|
||||
+ 0x82000000 0x1 0 MBUS_ID(0x04, 0xe8) 0 1 0 /* Port 0.0 MEM */
|
||||
+ 0x81000000 0x1 0 MBUS_ID(0x04, 0xe0) 0 1 0 /* Port 0.0 IO */
|
||||
+ 0x82000000 0x2 0 MBUS_ID(0x04, 0xd8) 0 1 0 /* Port 0.1 MEM */
|
||||
+ 0x81000000 0x2 0 MBUS_ID(0x04, 0xd0) 0 1 0 /* Port 0.1 IO */
|
||||
+ 0x82000000 0x3 0 MBUS_ID(0x04, 0xb8) 0 1 0 /* Port 0.2 MEM */
|
||||
+ 0x81000000 0x3 0 MBUS_ID(0x04, 0xb0) 0 1 0 /* Port 0.2 IO */
|
||||
+ 0x82000000 0x4 0 MBUS_ID(0x04, 0x78) 0 1 0 /* Port 0.3 MEM */
|
||||
+ 0x81000000 0x4 0 MBUS_ID(0x04, 0x70) 0 1 0 /* Port 0.3 IO */
|
||||
+
|
||||
+ 0x82000000 0x5 0 MBUS_ID(0x08, 0xe8) 0 1 0 /* Port 1.0 MEM */
|
||||
+ 0x81000000 0x5 0 MBUS_ID(0x08, 0xe0) 0 1 0 /* Port 1.0 IO */
|
||||
+ 0x82000000 0x6 0 MBUS_ID(0x08, 0xd8) 0 1 0 /* Port 1.1 MEM */
|
||||
+ 0x81000000 0x6 0 MBUS_ID(0x08, 0xd0) 0 1 0 /* Port 1.1 IO */
|
||||
+ 0x82000000 0x7 0 MBUS_ID(0x08, 0xb8) 0 1 0 /* Port 1.2 MEM */
|
||||
+ 0x81000000 0x7 0 MBUS_ID(0x08, 0xb0) 0 1 0 /* Port 1.2 IO */
|
||||
+ 0x82000000 0x8 0 MBUS_ID(0x08, 0x78) 0 1 0 /* Port 1.3 MEM */
|
||||
+ 0x81000000 0x8 0 MBUS_ID(0x08, 0x70) 0 1 0 /* Port 1.3 IO */
|
||||
+
|
||||
+ 0x82000000 0x9 0 MBUS_ID(0x04, 0xf8) 0 1 0 /* Port 2.0 MEM */
|
||||
+ 0x81000000 0x9 0 MBUS_ID(0x04, 0xf0) 0 1 0 /* Port 2.0 IO */
|
||||
+
|
||||
+ 0x82000000 0xa 0 MBUS_ID(0x08, 0xf8) 0 1 0 /* Port 3.0 MEM */
|
||||
+ 0x81000000 0xa 0 MBUS_ID(0x08, 0xf0) 0 1 0 /* Port 3.0 IO */>;
|
||||
|
||||
pcie@1,0 {
|
||||
device_type = "pci";
|
||||
- assigned-addresses = <0x82000800 0 0xd0040000 0 0x2000>;
|
||||
+ assigned-addresses = <0x82000800 0 0x40000 0 0x2000>;
|
||||
reg = <0x0800 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
#interrupt-cells = <1>;
|
||||
- ranges;
|
||||
+ ranges = <0x82000000 0 0 0x82000000 0x1 0 1 0
|
||||
+ 0x81000000 0 0 0x81000000 0x1 0 1 0>;
|
||||
interrupt-map-mask = <0 0 0 0>;
|
||||
interrupt-map = <0 0 0 0 &mpic 58>;
|
||||
marvell,pcie-port = <0>;
|
||||
@@ -77,12 +140,13 @@ pcie-controller {
|
||||
|
||||
pcie@2,0 {
|
||||
device_type = "pci";
|
||||
- assigned-addresses = <0x82001000 0 0xd0044000 0 0x2000>;
|
||||
+ assigned-addresses = <0x82001000 0 0x44000 0 0x2000>;
|
||||
reg = <0x1000 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
#interrupt-cells = <1>;
|
||||
- ranges;
|
||||
+ ranges = <0x82000000 0 0 0x82000000 0x2 0 1 0
|
||||
+ 0x81000000 0 0 0x81000000 0x2 0 1 0>;
|
||||
interrupt-map-mask = <0 0 0 0>;
|
||||
interrupt-map = <0 0 0 0 &mpic 59>;
|
||||
marvell,pcie-port = <0>;
|
||||
@@ -93,12 +157,13 @@ pcie-controller {
|
||||
|
||||
pcie@3,0 {
|
||||
device_type = "pci";
|
||||
- assigned-addresses = <0x82001800 0 0xd0048000 0 0x2000>;
|
||||
+ assigned-addresses = <0x82001800 0 0x48000 0 0x2000>;
|
||||
reg = <0x1800 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
#interrupt-cells = <1>;
|
||||
- ranges;
|
||||
+ ranges = <0x82000000 0 0 0x82000000 0x3 0 1 0
|
||||
+ 0x81000000 0 0 0x81000000 0x3 0 1 0>;
|
||||
interrupt-map-mask = <0 0 0 0>;
|
||||
interrupt-map = <0 0 0 0 &mpic 60>;
|
||||
marvell,pcie-port = <0>;
|
||||
@@ -109,12 +174,13 @@ pcie-controller {
|
||||
|
||||
pcie@4,0 {
|
||||
device_type = "pci";
|
||||
- assigned-addresses = <0x82002000 0 0xd004c000 0 0x2000>;
|
||||
+ assigned-addresses = <0x82002000 0 0x4c000 0 0x2000>;
|
||||
reg = <0x2000 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
#interrupt-cells = <1>;
|
||||
- ranges;
|
||||
+ ranges = <0x82000000 0 0 0x82000000 0x4 0 1 0
|
||||
+ 0x81000000 0 0 0x81000000 0x4 0 1 0>;
|
||||
interrupt-map-mask = <0 0 0 0>;
|
||||
interrupt-map = <0 0 0 0 &mpic 61>;
|
||||
marvell,pcie-port = <0>;
|
||||
@@ -125,12 +191,13 @@ pcie-controller {
|
||||
|
||||
pcie@5,0 {
|
||||
device_type = "pci";
|
||||
- assigned-addresses = <0x82002800 0 0xd0080000 0 0x2000>;
|
||||
+ assigned-addresses = <0x82002800 0 0x80000 0 0x2000>;
|
||||
reg = <0x2800 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
#interrupt-cells = <1>;
|
||||
- ranges;
|
||||
+ ranges = <0x82000000 0 0 0x82000000 0x5 0 1 0
|
||||
+ 0x81000000 0 0 0x81000000 0x5 0 1 0>;
|
||||
interrupt-map-mask = <0 0 0 0>;
|
||||
interrupt-map = <0 0 0 0 &mpic 62>;
|
||||
marvell,pcie-port = <1>;
|
||||
@@ -141,12 +208,13 @@ pcie-controller {
|
||||
|
||||
pcie@6,0 {
|
||||
device_type = "pci";
|
||||
- assigned-addresses = <0x82003000 0 0xd0084000 0 0x2000>;
|
||||
+ assigned-addresses = <0x82003000 0 0x84000 0 0x2000>;
|
||||
reg = <0x3000 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
#interrupt-cells = <1>;
|
||||
- ranges;
|
||||
+ ranges = <0x82000000 0 0 0x82000000 0x6 0 1 0
|
||||
+ 0x81000000 0 0 0x81000000 0x6 0 1 0>;
|
||||
interrupt-map-mask = <0 0 0 0>;
|
||||
interrupt-map = <0 0 0 0 &mpic 63>;
|
||||
marvell,pcie-port = <1>;
|
||||
@@ -157,12 +225,13 @@ pcie-controller {
|
||||
|
||||
pcie@7,0 {
|
||||
device_type = "pci";
|
||||
- assigned-addresses = <0x82003800 0 0xd0088000 0 0x2000>;
|
||||
+ assigned-addresses = <0x82003800 0 0x88000 0 0x2000>;
|
||||
reg = <0x3800 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
#interrupt-cells = <1>;
|
||||
- ranges;
|
||||
+ ranges = <0x82000000 0 0 0x82000000 0x7 0 1 0
|
||||
+ 0x81000000 0 0 0x81000000 0x7 0 1 0>;
|
||||
interrupt-map-mask = <0 0 0 0>;
|
||||
interrupt-map = <0 0 0 0 &mpic 64>;
|
||||
marvell,pcie-port = <1>;
|
||||
@@ -173,12 +242,13 @@ pcie-controller {
|
||||
|
||||
pcie@8,0 {
|
||||
device_type = "pci";
|
||||
- assigned-addresses = <0x82004000 0 0xd008c000 0 0x2000>;
|
||||
+ assigned-addresses = <0x82004000 0 0x8c000 0 0x2000>;
|
||||
reg = <0x4000 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
#interrupt-cells = <1>;
|
||||
- ranges;
|
||||
+ ranges = <0x82000000 0 0 0x82000000 0x8 0 1 0
|
||||
+ 0x81000000 0 0 0x81000000 0x8 0 1 0>;
|
||||
interrupt-map-mask = <0 0 0 0>;
|
||||
interrupt-map = <0 0 0 0 &mpic 65>;
|
||||
marvell,pcie-port = <1>;
|
||||
@@ -186,14 +256,16 @@ pcie-controller {
|
||||
clocks = <&gateclk 12>;
|
||||
status = "disabled";
|
||||
};
|
||||
+
|
||||
pcie@9,0 {
|
||||
device_type = "pci";
|
||||
- assigned-addresses = <0x82004800 0 0xd0042000 0 0x2000>;
|
||||
+ assigned-addresses = <0x82004800 0 0x42000 0 0x2000>;
|
||||
reg = <0x4800 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
#interrupt-cells = <1>;
|
||||
- ranges;
|
||||
+ ranges = <0x82000000 0 0 0x82000000 0x9 0 1 0
|
||||
+ 0x81000000 0 0 0x81000000 0x9 0 1 0>;
|
||||
interrupt-map-mask = <0 0 0 0>;
|
||||
interrupt-map = <0 0 0 0 &mpic 99>;
|
||||
marvell,pcie-port = <2>;
|
||||
@@ -204,12 +276,13 @@ pcie-controller {
|
||||
|
||||
pcie@10,0 {
|
||||
device_type = "pci";
|
||||
- assigned-addresses = <0x82005000 0 0xd0082000 0 0x2000>;
|
||||
+ assigned-addresses = <0x82005000 0 0x82000 0 0x2000>;
|
||||
reg = <0x5000 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
#interrupt-cells = <1>;
|
||||
- ranges;
|
||||
+ ranges = <0x82000000 0 0 0x82000000 0xa 0 1 0
|
||||
+ 0x81000000 0 0 0x81000000 0xa 0 1 0>;
|
||||
interrupt-map-mask = <0 0 0 0>;
|
||||
interrupt-map = <0 0 0 0 &mpic 103>;
|
||||
marvell,pcie-port = <3>;
|
|
@ -1,90 +0,0 @@
|
|||
From cc4fb487fbf95c97b40e1e8e5b8b2ddabc8d124d Mon Sep 17 00:00:00 2001
|
||||
From: Willy Tarreau <w@1wt.eu>
|
||||
Date: Mon, 3 Jun 2013 18:47:36 +0200
|
||||
Subject: [PATCH 067/203] ARM: mvebu: set aliases for ethernet controllers
|
||||
|
||||
These aliases are used when feeding the DT from ATAGS to set the
|
||||
devices MAC addresses.
|
||||
|
||||
Signed-off-by: Willy Tarreau <w@1wt.eu>
|
||||
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Signed-off-by: Jason Cooper <jason@lakedaemon.net>
|
||||
---
|
||||
arch/arm/boot/dts/armada-370-xp.dtsi | 9 +++++++--
|
||||
arch/arm/boot/dts/armada-xp-mv78460.dtsi | 3 ++-
|
||||
arch/arm/boot/dts/armada-xp.dtsi | 6 +++++-
|
||||
3 files changed, 14 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/arch/arm/boot/dts/armada-370-xp.dtsi
|
||||
+++ b/arch/arm/boot/dts/armada-370-xp.dtsi
|
||||
@@ -24,6 +24,11 @@
|
||||
model = "Marvell Armada 370 and XP SoC";
|
||||
compatible = "marvell,armada-370-xp";
|
||||
|
||||
+ aliases {
|
||||
+ eth0 = ð0;
|
||||
+ eth1 = ð1;
|
||||
+ };
|
||||
+
|
||||
cpus {
|
||||
cpu@0 {
|
||||
compatible = "marvell,sheeva-v7";
|
||||
@@ -151,7 +156,7 @@
|
||||
reg = <0x72004 0x4>;
|
||||
};
|
||||
|
||||
- ethernet@70000 {
|
||||
+ eth0: ethernet@70000 {
|
||||
compatible = "marvell,armada-370-neta";
|
||||
reg = <0x70000 0x4000>;
|
||||
interrupts = <8>;
|
||||
@@ -159,7 +164,7 @@
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
- ethernet@74000 {
|
||||
+ eth1: ethernet@74000 {
|
||||
compatible = "marvell,armada-370-neta";
|
||||
reg = <0x74000 0x4000>;
|
||||
interrupts = <10>;
|
||||
--- a/arch/arm/boot/dts/armada-xp-mv78460.dtsi
|
||||
+++ b/arch/arm/boot/dts/armada-xp-mv78460.dtsi
|
||||
@@ -23,6 +23,7 @@
|
||||
gpio0 = &gpio0;
|
||||
gpio1 = &gpio1;
|
||||
gpio2 = &gpio2;
|
||||
+ eth3 = ð3;
|
||||
};
|
||||
|
||||
|
||||
@@ -326,7 +327,7 @@
|
||||
interrupts = <91>;
|
||||
};
|
||||
|
||||
- ethernet@34000 {
|
||||
+ eth3: ethernet@34000 {
|
||||
compatible = "marvell,armada-370-neta";
|
||||
reg = <0x34000 0x4000>;
|
||||
interrupts = <14>;
|
||||
--- a/arch/arm/boot/dts/armada-xp.dtsi
|
||||
+++ b/arch/arm/boot/dts/armada-xp.dtsi
|
||||
@@ -22,6 +22,10 @@
|
||||
model = "Marvell Armada XP family SoC";
|
||||
compatible = "marvell,armadaxp", "marvell,armada-370-xp";
|
||||
|
||||
+ aliases {
|
||||
+ eth2 = ð2;
|
||||
+ };
|
||||
+
|
||||
soc {
|
||||
compatible = "marvell,armadaxp-mbus", "simple-bus";
|
||||
|
||||
@@ -93,7 +97,7 @@
|
||||
reg = <0x18200 0x500>;
|
||||
};
|
||||
|
||||
- ethernet@30000 {
|
||||
+ eth2: ethernet@30000 {
|
||||
compatible = "marvell,armada-370-neta";
|
||||
reg = <0x30000 0x4000>;
|
||||
interrupts = <12>;
|
|
@ -1,127 +0,0 @@
|
|||
From d967b31469239f610ea84b0a54ce296c15d860e9 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Date: Tue, 30 Jul 2013 16:59:02 +0200
|
||||
Subject: [PATCH 068/203] ARM: mvebu: use correct #interrupt-cells instead of
|
||||
#interrupts-cells
|
||||
|
||||
The Device Tree information for the GPIO banks of the Armada 370 and
|
||||
Armada XP SOCs was incorrectly using #interrupts-cells instead of
|
||||
controller when using GPIO interrupts, since the GPIO bank DT node
|
||||
wasn't recognized as a valid interrupt controller by the OF code.
|
||||
|
||||
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Signed-off-by: Jason Cooper <jason@lakedaemon.net>
|
||||
---
|
||||
arch/arm/boot/dts/armada-370.dtsi | 6 +++---
|
||||
arch/arm/boot/dts/armada-xp-mv78230.dtsi | 4 ++--
|
||||
arch/arm/boot/dts/armada-xp-mv78260.dtsi | 6 +++---
|
||||
arch/arm/boot/dts/armada-xp-mv78460.dtsi | 6 +++---
|
||||
4 files changed, 11 insertions(+), 11 deletions(-)
|
||||
|
||||
--- a/arch/arm/boot/dts/armada-370.dtsi
|
||||
+++ b/arch/arm/boot/dts/armada-370.dtsi
|
||||
@@ -136,7 +136,7 @@
|
||||
gpio-controller;
|
||||
#gpio-cells = <2>;
|
||||
interrupt-controller;
|
||||
- #interrupts-cells = <2>;
|
||||
+ #interrupt-cells = <2>;
|
||||
interrupts = <82>, <83>, <84>, <85>;
|
||||
};
|
||||
|
||||
@@ -147,7 +147,7 @@
|
||||
gpio-controller;
|
||||
#gpio-cells = <2>;
|
||||
interrupt-controller;
|
||||
- #interrupts-cells = <2>;
|
||||
+ #interrupt-cells = <2>;
|
||||
interrupts = <87>, <88>, <89>, <90>;
|
||||
};
|
||||
|
||||
@@ -158,7 +158,7 @@
|
||||
gpio-controller;
|
||||
#gpio-cells = <2>;
|
||||
interrupt-controller;
|
||||
- #interrupts-cells = <2>;
|
||||
+ #interrupt-cells = <2>;
|
||||
interrupts = <91>;
|
||||
};
|
||||
|
||||
--- a/arch/arm/boot/dts/armada-xp-mv78230.dtsi
|
||||
+++ b/arch/arm/boot/dts/armada-xp-mv78230.dtsi
|
||||
@@ -181,7 +181,7 @@
|
||||
gpio-controller;
|
||||
#gpio-cells = <2>;
|
||||
interrupt-controller;
|
||||
- #interrupts-cells = <2>;
|
||||
+ #interrupt-cells = <2>;
|
||||
interrupts = <82>, <83>, <84>, <85>;
|
||||
};
|
||||
|
||||
@@ -192,7 +192,7 @@
|
||||
gpio-controller;
|
||||
#gpio-cells = <2>;
|
||||
interrupt-controller;
|
||||
- #interrupts-cells = <2>;
|
||||
+ #interrupt-cells = <2>;
|
||||
interrupts = <87>, <88>, <89>;
|
||||
};
|
||||
|
||||
--- a/arch/arm/boot/dts/armada-xp-mv78260.dtsi
|
||||
+++ b/arch/arm/boot/dts/armada-xp-mv78260.dtsi
|
||||
@@ -203,7 +203,7 @@
|
||||
gpio-controller;
|
||||
#gpio-cells = <2>;
|
||||
interrupt-controller;
|
||||
- #interrupts-cells = <2>;
|
||||
+ #interrupt-cells = <2>;
|
||||
interrupts = <82>, <83>, <84>, <85>;
|
||||
};
|
||||
|
||||
@@ -214,7 +214,7 @@
|
||||
gpio-controller;
|
||||
#gpio-cells = <2>;
|
||||
interrupt-controller;
|
||||
- #interrupts-cells = <2>;
|
||||
+ #interrupt-cells = <2>;
|
||||
interrupts = <87>, <88>, <89>, <90>;
|
||||
};
|
||||
|
||||
@@ -225,7 +225,7 @@
|
||||
gpio-controller;
|
||||
#gpio-cells = <2>;
|
||||
interrupt-controller;
|
||||
- #interrupts-cells = <2>;
|
||||
+ #interrupt-cells = <2>;
|
||||
interrupts = <91>;
|
||||
};
|
||||
|
||||
--- a/arch/arm/boot/dts/armada-xp-mv78460.dtsi
|
||||
+++ b/arch/arm/boot/dts/armada-xp-mv78460.dtsi
|
||||
@@ -301,7 +301,7 @@
|
||||
gpio-controller;
|
||||
#gpio-cells = <2>;
|
||||
interrupt-controller;
|
||||
- #interrupts-cells = <2>;
|
||||
+ #interrupt-cells = <2>;
|
||||
interrupts = <82>, <83>, <84>, <85>;
|
||||
};
|
||||
|
||||
@@ -312,7 +312,7 @@
|
||||
gpio-controller;
|
||||
#gpio-cells = <2>;
|
||||
interrupt-controller;
|
||||
- #interrupts-cells = <2>;
|
||||
+ #interrupt-cells = <2>;
|
||||
interrupts = <87>, <88>, <89>, <90>;
|
||||
};
|
||||
|
||||
@@ -323,7 +323,7 @@
|
||||
gpio-controller;
|
||||
#gpio-cells = <2>;
|
||||
interrupt-controller;
|
||||
- #interrupts-cells = <2>;
|
||||
+ #interrupt-cells = <2>;
|
||||
interrupts = <91>;
|
||||
};
|
||||
|
|
@ -1,21 +0,0 @@
|
|||
From 3953e4230483d6ce51b9f7e3b20db30e5ca6f4da Mon Sep 17 00:00:00 2001
|
||||
From: Jason Cooper <jason@lakedaemon.net>
|
||||
Date: Wed, 7 Aug 2013 20:04:21 +0000
|
||||
Subject: [PATCH 069/203] ARM: mvebu: use dts pre-processor for mv78230
|
||||
|
||||
Signed-off-by: Jason Cooper <jason@lakedaemon.net>
|
||||
---
|
||||
arch/arm/boot/dts/armada-xp-mv78230.dtsi | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/arch/arm/boot/dts/armada-xp-mv78230.dtsi
|
||||
+++ b/arch/arm/boot/dts/armada-xp-mv78230.dtsi
|
||||
@@ -13,7 +13,7 @@
|
||||
* common to all Armada XP SoCs.
|
||||
*/
|
||||
|
||||
-/include/ "armada-xp.dtsi"
|
||||
+#include "armada-xp.dtsi"
|
||||
|
||||
/ {
|
||||
model = "Marvell Armada XP MV78230 SoC";
|
|
@ -1,291 +0,0 @@
|
|||
From 4fb403ed86e78027a5b85333fa1491d5a0e68ae9 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Date: Wed, 19 Jun 2013 09:42:32 +0200
|
||||
Subject: [PATCH 070/203] PCI: use weak functions for MSI arch-specific
|
||||
functions
|
||||
|
||||
Until now, the MSI architecture-specific functions could be overloaded
|
||||
using a fairly complex set of #define and compile-time
|
||||
conditionals. In order to prepare for the introduction of the msi_chip
|
||||
infrastructure, it is desirable to switch all those functions to use
|
||||
the 'weak' mechanism. This commit converts all the architectures that
|
||||
were overidding those MSI functions to use the new strategy.
|
||||
|
||||
Note that we keep two separate, non-weak, functions
|
||||
default_teardown_msi_irqs() and default_restore_msi_irqs() for the
|
||||
default behavior of the arch_teardown_msi_irqs() and
|
||||
arch_restore_msi_irqs(), as the default behavior is needed by x86 PCI
|
||||
code.
|
||||
|
||||
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
|
||||
Acked-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
|
||||
Tested-by: Daniel Price <daniel.price@gmail.com>
|
||||
Tested-by: Thierry Reding <thierry.reding@gmail.com>
|
||||
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
|
||||
Cc: Paul Mackerras <paulus@samba.org>
|
||||
Cc: linuxppc-dev@lists.ozlabs.org
|
||||
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
|
||||
Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
|
||||
Cc: linux390@de.ibm.com
|
||||
Cc: linux-s390@vger.kernel.org
|
||||
Cc: Thomas Gleixner <tglx@linutronix.de>
|
||||
Cc: Ingo Molnar <mingo@redhat.com>
|
||||
Cc: H. Peter Anvin <hpa@zytor.com>
|
||||
Cc: x86@kernel.org
|
||||
Cc: Russell King <linux@arm.linux.org.uk>
|
||||
Cc: Tony Luck <tony.luck@intel.com>
|
||||
Cc: Fenghua Yu <fenghua.yu@intel.com>
|
||||
Cc: linux-ia64@vger.kernel.org
|
||||
Cc: Ralf Baechle <ralf@linux-mips.org>
|
||||
Cc: linux-mips@linux-mips.org
|
||||
Cc: David S. Miller <davem@davemloft.net>
|
||||
Cc: sparclinux@vger.kernel.org
|
||||
Cc: Chris Metcalf <cmetcalf@tilera.com>
|
||||
---
|
||||
arch/mips/include/asm/pci.h | 5 -----
|
||||
arch/powerpc/include/asm/pci.h | 5 -----
|
||||
arch/s390/include/asm/pci.h | 4 ----
|
||||
arch/x86/include/asm/pci.h | 30 --------------------------
|
||||
arch/x86/kernel/x86_init.c | 24 +++++++++++++++++++++
|
||||
drivers/pci/msi.c | 48 +++++++++++++++++++++---------------------
|
||||
include/linux/msi.h | 8 ++++++-
|
||||
7 files changed, 55 insertions(+), 69 deletions(-)
|
||||
|
||||
--- a/arch/mips/include/asm/pci.h
|
||||
+++ b/arch/mips/include/asm/pci.h
|
||||
@@ -137,11 +137,6 @@ static inline int pci_get_legacy_ide_irq
|
||||
return channel ? 15 : 14;
|
||||
}
|
||||
|
||||
-#ifdef CONFIG_CPU_CAVIUM_OCTEON
|
||||
-/* MSI arch hook for OCTEON */
|
||||
-#define arch_setup_msi_irqs arch_setup_msi_irqs
|
||||
-#endif
|
||||
-
|
||||
extern char * (*pcibios_plat_setup)(char *str);
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
--- a/arch/powerpc/include/asm/pci.h
|
||||
+++ b/arch/powerpc/include/asm/pci.h
|
||||
@@ -113,11 +113,6 @@ extern int pci_domain_nr(struct pci_bus
|
||||
/* Decide whether to display the domain number in /proc */
|
||||
extern int pci_proc_domain(struct pci_bus *bus);
|
||||
|
||||
-/* MSI arch hooks */
|
||||
-#define arch_setup_msi_irqs arch_setup_msi_irqs
|
||||
-#define arch_teardown_msi_irqs arch_teardown_msi_irqs
|
||||
-#define arch_msi_check_device arch_msi_check_device
|
||||
-
|
||||
struct vm_area_struct;
|
||||
/* Map a range of PCI memory or I/O space for a device into user space */
|
||||
int pci_mmap_page_range(struct pci_dev *pdev, struct vm_area_struct *vma,
|
||||
--- a/arch/s390/include/asm/pci.h
|
||||
+++ b/arch/s390/include/asm/pci.h
|
||||
@@ -21,10 +21,6 @@ void pci_iounmap(struct pci_dev *, void
|
||||
int pci_domain_nr(struct pci_bus *);
|
||||
int pci_proc_domain(struct pci_bus *);
|
||||
|
||||
-/* MSI arch hooks */
|
||||
-#define arch_setup_msi_irqs arch_setup_msi_irqs
|
||||
-#define arch_teardown_msi_irqs arch_teardown_msi_irqs
|
||||
-
|
||||
#define ZPCI_BUS_NR 0 /* default bus number */
|
||||
#define ZPCI_DEVFN 0 /* default device number */
|
||||
|
||||
--- a/arch/x86/include/asm/pci.h
|
||||
+++ b/arch/x86/include/asm/pci.h
|
||||
@@ -100,29 +100,6 @@ static inline void early_quirks(void) {
|
||||
extern void pci_iommu_alloc(void);
|
||||
|
||||
#ifdef CONFIG_PCI_MSI
|
||||
-/* MSI arch specific hooks */
|
||||
-static inline int x86_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
|
||||
-{
|
||||
- return x86_msi.setup_msi_irqs(dev, nvec, type);
|
||||
-}
|
||||
-
|
||||
-static inline void x86_teardown_msi_irqs(struct pci_dev *dev)
|
||||
-{
|
||||
- x86_msi.teardown_msi_irqs(dev);
|
||||
-}
|
||||
-
|
||||
-static inline void x86_teardown_msi_irq(unsigned int irq)
|
||||
-{
|
||||
- x86_msi.teardown_msi_irq(irq);
|
||||
-}
|
||||
-static inline void x86_restore_msi_irqs(struct pci_dev *dev, int irq)
|
||||
-{
|
||||
- x86_msi.restore_msi_irqs(dev, irq);
|
||||
-}
|
||||
-#define arch_setup_msi_irqs x86_setup_msi_irqs
|
||||
-#define arch_teardown_msi_irqs x86_teardown_msi_irqs
|
||||
-#define arch_teardown_msi_irq x86_teardown_msi_irq
|
||||
-#define arch_restore_msi_irqs x86_restore_msi_irqs
|
||||
/* implemented in arch/x86/kernel/apic/io_apic. */
|
||||
struct msi_desc;
|
||||
int native_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
|
||||
@@ -130,16 +107,9 @@ void native_teardown_msi_irq(unsigned in
|
||||
void native_restore_msi_irqs(struct pci_dev *dev, int irq);
|
||||
int setup_msi_irq(struct pci_dev *dev, struct msi_desc *msidesc,
|
||||
unsigned int irq_base, unsigned int irq_offset);
|
||||
-/* default to the implementation in drivers/lib/msi.c */
|
||||
-#define HAVE_DEFAULT_MSI_TEARDOWN_IRQS
|
||||
-#define HAVE_DEFAULT_MSI_RESTORE_IRQS
|
||||
-void default_teardown_msi_irqs(struct pci_dev *dev);
|
||||
-void default_restore_msi_irqs(struct pci_dev *dev, int irq);
|
||||
#else
|
||||
#define native_setup_msi_irqs NULL
|
||||
#define native_teardown_msi_irq NULL
|
||||
-#define default_teardown_msi_irqs NULL
|
||||
-#define default_restore_msi_irqs NULL
|
||||
#endif
|
||||
|
||||
#define PCI_DMA_BUS_IS_PHYS (dma_ops->is_phys)
|
||||
--- a/arch/x86/kernel/x86_init.c
|
||||
+++ b/arch/x86/kernel/x86_init.c
|
||||
@@ -107,6 +107,8 @@ struct x86_platform_ops x86_platform = {
|
||||
};
|
||||
|
||||
EXPORT_SYMBOL_GPL(x86_platform);
|
||||
+
|
||||
+#if defined(CONFIG_PCI_MSI)
|
||||
struct x86_msi_ops x86_msi = {
|
||||
.setup_msi_irqs = native_setup_msi_irqs,
|
||||
.compose_msi_msg = native_compose_msi_msg,
|
||||
@@ -116,6 +118,28 @@ struct x86_msi_ops x86_msi = {
|
||||
.setup_hpet_msi = default_setup_hpet_msi,
|
||||
};
|
||||
|
||||
+/* MSI arch specific hooks */
|
||||
+int arch_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
|
||||
+{
|
||||
+ return x86_msi.setup_msi_irqs(dev, nvec, type);
|
||||
+}
|
||||
+
|
||||
+void arch_teardown_msi_irqs(struct pci_dev *dev)
|
||||
+{
|
||||
+ x86_msi.teardown_msi_irqs(dev);
|
||||
+}
|
||||
+
|
||||
+void arch_teardown_msi_irq(unsigned int irq)
|
||||
+{
|
||||
+ x86_msi.teardown_msi_irq(irq);
|
||||
+}
|
||||
+
|
||||
+void arch_restore_msi_irqs(struct pci_dev *dev, int irq)
|
||||
+{
|
||||
+ x86_msi.restore_msi_irqs(dev, irq);
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
struct x86_io_apic_ops x86_io_apic_ops = {
|
||||
.init = native_io_apic_init_mappings,
|
||||
.read = native_io_apic_read,
|
||||
--- a/drivers/pci/msi.c
|
||||
+++ b/drivers/pci/msi.c
|
||||
@@ -30,20 +30,21 @@ static int pci_msi_enable = 1;
|
||||
|
||||
/* Arch hooks */
|
||||
|
||||
-#ifndef arch_msi_check_device
|
||||
-int arch_msi_check_device(struct pci_dev *dev, int nvec, int type)
|
||||
+int __weak arch_setup_msi_irq(struct pci_dev *dev, struct msi_desc *desc)
|
||||
+{
|
||||
+ return -EINVAL;
|
||||
+}
|
||||
+
|
||||
+void __weak arch_teardown_msi_irq(unsigned int irq)
|
||||
{
|
||||
- return 0;
|
||||
}
|
||||
-#endif
|
||||
|
||||
-#ifndef arch_setup_msi_irqs
|
||||
-# define arch_setup_msi_irqs default_setup_msi_irqs
|
||||
-# define HAVE_DEFAULT_MSI_SETUP_IRQS
|
||||
-#endif
|
||||
+int __weak arch_msi_check_device(struct pci_dev *dev, int nvec, int type)
|
||||
+{
|
||||
+ return 0;
|
||||
+}
|
||||
|
||||
-#ifdef HAVE_DEFAULT_MSI_SETUP_IRQS
|
||||
-int default_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
|
||||
+int __weak arch_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
|
||||
{
|
||||
struct msi_desc *entry;
|
||||
int ret;
|
||||
@@ -65,14 +66,11 @@ int default_setup_msi_irqs(struct pci_de
|
||||
|
||||
return 0;
|
||||
}
|
||||
-#endif
|
||||
|
||||
-#ifndef arch_teardown_msi_irqs
|
||||
-# define arch_teardown_msi_irqs default_teardown_msi_irqs
|
||||
-# define HAVE_DEFAULT_MSI_TEARDOWN_IRQS
|
||||
-#endif
|
||||
-
|
||||
-#ifdef HAVE_DEFAULT_MSI_TEARDOWN_IRQS
|
||||
+/*
|
||||
+ * We have a default implementation available as a separate non-weak
|
||||
+ * function, as it is used by the Xen x86 PCI code
|
||||
+ */
|
||||
void default_teardown_msi_irqs(struct pci_dev *dev)
|
||||
{
|
||||
struct msi_desc *entry;
|
||||
@@ -86,14 +84,12 @@ void default_teardown_msi_irqs(struct pc
|
||||
arch_teardown_msi_irq(entry->irq + i);
|
||||
}
|
||||
}
|
||||
-#endif
|
||||
|
||||
-#ifndef arch_restore_msi_irqs
|
||||
-# define arch_restore_msi_irqs default_restore_msi_irqs
|
||||
-# define HAVE_DEFAULT_MSI_RESTORE_IRQS
|
||||
-#endif
|
||||
+void __weak arch_teardown_msi_irqs(struct pci_dev *dev)
|
||||
+{
|
||||
+ return default_teardown_msi_irqs(dev);
|
||||
+}
|
||||
|
||||
-#ifdef HAVE_DEFAULT_MSI_RESTORE_IRQS
|
||||
void default_restore_msi_irqs(struct pci_dev *dev, int irq)
|
||||
{
|
||||
struct msi_desc *entry;
|
||||
@@ -111,7 +107,11 @@ void default_restore_msi_irqs(struct pci
|
||||
if (entry)
|
||||
write_msi_msg(irq, &entry->msg);
|
||||
}
|
||||
-#endif
|
||||
+
|
||||
+void __weak arch_restore_msi_irqs(struct pci_dev *dev, int irq)
|
||||
+{
|
||||
+ return default_restore_msi_irqs(dev, irq);
|
||||
+}
|
||||
|
||||
static void msi_set_enable(struct pci_dev *dev, int enable)
|
||||
{
|
||||
--- a/include/linux/msi.h
|
||||
+++ b/include/linux/msi.h
|
||||
@@ -50,12 +50,18 @@ struct msi_desc {
|
||||
};
|
||||
|
||||
/*
|
||||
- * The arch hook for setup up msi irqs
|
||||
+ * The arch hooks to setup up msi irqs. Those functions are
|
||||
+ * implemented as weak symbols so that they /can/ be overriden by
|
||||
+ * architecture specific code if needed.
|
||||
*/
|
||||
int arch_setup_msi_irq(struct pci_dev *dev, struct msi_desc *desc);
|
||||
void arch_teardown_msi_irq(unsigned int irq);
|
||||
int arch_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
|
||||
void arch_teardown_msi_irqs(struct pci_dev *dev);
|
||||
int arch_msi_check_device(struct pci_dev* dev, int nvec, int type);
|
||||
+void arch_restore_msi_irqs(struct pci_dev *dev, int irq);
|
||||
+
|
||||
+void default_teardown_msi_irqs(struct pci_dev *dev);
|
||||
+void default_restore_msi_irqs(struct pci_dev *dev, int irq);
|
||||
|
||||
#endif /* LINUX_MSI_H */
|
|
@ -1,152 +0,0 @@
|
|||
From c819a1b0907257d73de96af33d557668a5c0c895 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Date: Mon, 1 Jul 2013 14:26:57 +0200
|
||||
Subject: [PATCH 071/203] PCI: remove ARCH_SUPPORTS_MSI kconfig option
|
||||
|
||||
Now that we have weak versions for each of the PCI MSI architecture
|
||||
functions, we can actually build the MSI support for all platforms,
|
||||
regardless of whether they provide or not architecture-specific
|
||||
versions of those functions. For this reason, the ARCH_SUPPORTS_MSI
|
||||
hidden kconfig boolean becomes useless, and this patch gets rid of it.
|
||||
|
||||
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
|
||||
Acked-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
|
||||
Tested-by: Daniel Price <daniel.price@gmail.com>
|
||||
Tested-by: Thierry Reding <thierry.reding@gmail.com>
|
||||
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
|
||||
Cc: Paul Mackerras <paulus@samba.org>
|
||||
Cc: linuxppc-dev@lists.ozlabs.org
|
||||
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
|
||||
Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
|
||||
Cc: linux390@de.ibm.com
|
||||
Cc: linux-s390@vger.kernel.org
|
||||
Cc: Thomas Gleixner <tglx@linutronix.de>
|
||||
Cc: Ingo Molnar <mingo@redhat.com>
|
||||
Cc: H. Peter Anvin <hpa@zytor.com>
|
||||
Cc: x86@kernel.org
|
||||
Cc: Russell King <linux@arm.linux.org.uk>
|
||||
Cc: Tony Luck <tony.luck@intel.com>
|
||||
Cc: Fenghua Yu <fenghua.yu@intel.com>
|
||||
Cc: linux-ia64@vger.kernel.org
|
||||
Cc: Ralf Baechle <ralf@linux-mips.org>
|
||||
Cc: linux-mips@linux-mips.org
|
||||
Cc: David S. Miller <davem@davemloft.net>
|
||||
Cc: sparclinux@vger.kernel.org
|
||||
Cc: Chris Metcalf <cmetcalf@tilera.com>
|
||||
---
|
||||
arch/arm/Kconfig | 1 -
|
||||
arch/ia64/Kconfig | 1 -
|
||||
arch/mips/Kconfig | 2 --
|
||||
arch/powerpc/Kconfig | 1 -
|
||||
arch/s390/Kconfig | 1 -
|
||||
arch/sparc/Kconfig | 1 -
|
||||
arch/tile/Kconfig | 1 -
|
||||
arch/x86/Kconfig | 1 -
|
||||
drivers/pci/Kconfig | 4 ----
|
||||
9 files changed, 13 deletions(-)
|
||||
|
||||
--- a/arch/arm/Kconfig
|
||||
+++ b/arch/arm/Kconfig
|
||||
@@ -435,7 +435,6 @@ config ARCH_NETX
|
||||
config ARCH_IOP13XX
|
||||
bool "IOP13xx-based"
|
||||
depends on MMU
|
||||
- select ARCH_SUPPORTS_MSI
|
||||
select CPU_XSC3
|
||||
select NEED_MACH_MEMORY_H
|
||||
select NEED_RET_TO_USER
|
||||
--- a/arch/ia64/Kconfig
|
||||
+++ b/arch/ia64/Kconfig
|
||||
@@ -9,7 +9,6 @@ config IA64
|
||||
select PCI if (!IA64_HP_SIM)
|
||||
select ACPI if (!IA64_HP_SIM)
|
||||
select PM if (!IA64_HP_SIM)
|
||||
- select ARCH_SUPPORTS_MSI
|
||||
select HAVE_UNSTABLE_SCHED_CLOCK
|
||||
select HAVE_IDE
|
||||
select HAVE_OPROFILE
|
||||
--- a/arch/mips/Kconfig
|
||||
+++ b/arch/mips/Kconfig
|
||||
@@ -764,7 +764,6 @@ config CAVIUM_OCTEON_REFERENCE_BOARD
|
||||
select SYS_HAS_CPU_CAVIUM_OCTEON
|
||||
select SWAP_IO_SPACE
|
||||
select HW_HAS_PCI
|
||||
- select ARCH_SUPPORTS_MSI
|
||||
select ZONE_DMA32
|
||||
select USB_ARCH_HAS_OHCI
|
||||
select USB_ARCH_HAS_EHCI
|
||||
@@ -800,7 +799,6 @@ config NLM_XLR_BOARD
|
||||
select CEVT_R4K
|
||||
select CSRC_R4K
|
||||
select IRQ_CPU
|
||||
- select ARCH_SUPPORTS_MSI
|
||||
select ZONE_DMA32 if 64BIT
|
||||
select SYNC_R4K
|
||||
select SYS_HAS_EARLY_PRINTK
|
||||
--- a/arch/powerpc/Kconfig
|
||||
+++ b/arch/powerpc/Kconfig
|
||||
@@ -734,7 +734,6 @@ config PCI
|
||||
default y if !40x && !CPM2 && !8xx && !PPC_83xx \
|
||||
&& !PPC_85xx && !PPC_86xx && !GAMECUBE_COMMON
|
||||
default PCI_QSPAN if !4xx && !CPM2 && 8xx
|
||||
- select ARCH_SUPPORTS_MSI
|
||||
select GENERIC_PCI_IOMAP
|
||||
help
|
||||
Find out whether your system includes a PCI bus. PCI is the name of
|
||||
--- a/arch/s390/Kconfig
|
||||
+++ b/arch/s390/Kconfig
|
||||
@@ -430,7 +430,6 @@ menuconfig PCI
|
||||
bool "PCI support"
|
||||
default n
|
||||
depends on 64BIT
|
||||
- select ARCH_SUPPORTS_MSI
|
||||
select PCI_MSI
|
||||
help
|
||||
Enable PCI support.
|
||||
--- a/arch/sparc/Kconfig
|
||||
+++ b/arch/sparc/Kconfig
|
||||
@@ -52,7 +52,6 @@ config SPARC32
|
||||
|
||||
config SPARC64
|
||||
def_bool 64BIT
|
||||
- select ARCH_SUPPORTS_MSI
|
||||
select HAVE_FUNCTION_TRACER
|
||||
select HAVE_FUNCTION_GRAPH_TRACER
|
||||
select HAVE_FUNCTION_GRAPH_FP_TEST
|
||||
--- a/arch/tile/Kconfig
|
||||
+++ b/arch/tile/Kconfig
|
||||
@@ -379,7 +379,6 @@ config PCI
|
||||
select PCI_DOMAINS
|
||||
select GENERIC_PCI_IOMAP
|
||||
select TILE_GXIO_TRIO if TILEGX
|
||||
- select ARCH_SUPPORTS_MSI if TILEGX
|
||||
select PCI_MSI if TILEGX
|
||||
---help---
|
||||
Enable PCI root complex support, so PCIe endpoint devices can
|
||||
--- a/arch/x86/Kconfig
|
||||
+++ b/arch/x86/Kconfig
|
||||
@@ -1999,7 +1999,6 @@ menu "Bus options (PCI etc.)"
|
||||
config PCI
|
||||
bool "PCI support"
|
||||
default y
|
||||
- select ARCH_SUPPORTS_MSI if (X86_LOCAL_APIC && X86_IO_APIC)
|
||||
---help---
|
||||
Find out whether you have a PCI motherboard. PCI is the name of a
|
||||
bus system, i.e. the way the CPU talks to the other stuff inside
|
||||
--- a/drivers/pci/Kconfig
|
||||
+++ b/drivers/pci/Kconfig
|
||||
@@ -1,13 +1,9 @@
|
||||
#
|
||||
# PCI configuration
|
||||
#
|
||||
-config ARCH_SUPPORTS_MSI
|
||||
- bool
|
||||
-
|
||||
config PCI_MSI
|
||||
bool "Message Signaled Interrupts (MSI and MSI-X)"
|
||||
depends on PCI
|
||||
- depends on ARCH_SUPPORTS_MSI
|
||||
help
|
||||
This allows device drivers to enable MSI (Message Signaled
|
||||
Interrupts). Message Signaled Interrupts enable a device to
|
|
@ -1,108 +0,0 @@
|
|||
From 9c6ddccbbfaf789beccc6a1d87abe9bc60dc570f Mon Sep 17 00:00:00 2001
|
||||
From: Thierry Reding <thierry.reding@avionic-design.de>
|
||||
Date: Thu, 6 Jun 2013 18:20:29 +0200
|
||||
Subject: [PATCH 072/203] PCI: Introduce new MSI chip infrastructure
|
||||
|
||||
The new struct msi_chip is used to associated an MSI controller with a
|
||||
PCI bus. It is automatically handed down from the root to its children
|
||||
during bus enumeration.
|
||||
|
||||
This patch provides default (weak) implementations for the architecture-
|
||||
specific MSI functions (arch_setup_msi_irq(), arch_teardown_msi_irq()
|
||||
and arch_msi_check_device()) which check if a PCI device's bus has an
|
||||
attached MSI chip and forward the call appropriately.
|
||||
|
||||
Signed-off-by: Thierry Reding <thierry.reding@avionic-design.de>
|
||||
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
|
||||
Tested-by: Daniel Price <daniel.price@gmail.com>
|
||||
Tested-by: Thierry Reding <thierry.reding@gmail.com>
|
||||
---
|
||||
drivers/pci/msi.c | 27 +++++++++++++++++++++++++--
|
||||
drivers/pci/probe.c | 1 +
|
||||
include/linux/msi.h | 11 +++++++++++
|
||||
include/linux/pci.h | 1 +
|
||||
4 files changed, 38 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/pci/msi.c
|
||||
+++ b/drivers/pci/msi.c
|
||||
@@ -32,16 +32,39 @@ static int pci_msi_enable = 1;
|
||||
|
||||
int __weak arch_setup_msi_irq(struct pci_dev *dev, struct msi_desc *desc)
|
||||
{
|
||||
- return -EINVAL;
|
||||
+ struct msi_chip *chip = dev->bus->msi;
|
||||
+ int err;
|
||||
+
|
||||
+ if (!chip || !chip->setup_irq)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ err = chip->setup_irq(chip, dev, desc);
|
||||
+ if (err < 0)
|
||||
+ return err;
|
||||
+
|
||||
+ irq_set_chip_data(desc->irq, chip);
|
||||
+
|
||||
+ return 0;
|
||||
}
|
||||
|
||||
void __weak arch_teardown_msi_irq(unsigned int irq)
|
||||
{
|
||||
+ struct msi_chip *chip = irq_get_chip_data(irq);
|
||||
+
|
||||
+ if (!chip || !chip->teardown_irq)
|
||||
+ return;
|
||||
+
|
||||
+ chip->teardown_irq(chip, irq);
|
||||
}
|
||||
|
||||
int __weak arch_msi_check_device(struct pci_dev *dev, int nvec, int type)
|
||||
{
|
||||
- return 0;
|
||||
+ struct msi_chip *chip = dev->bus->msi;
|
||||
+
|
||||
+ if (!chip || !chip->check_device)
|
||||
+ return 0;
|
||||
+
|
||||
+ return chip->check_device(chip, dev, nvec, type);
|
||||
}
|
||||
|
||||
int __weak arch_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
|
||||
--- a/drivers/pci/probe.c
|
||||
+++ b/drivers/pci/probe.c
|
||||
@@ -634,6 +634,7 @@ static struct pci_bus *pci_alloc_child_b
|
||||
|
||||
child->parent = parent;
|
||||
child->ops = parent->ops;
|
||||
+ child->msi = parent->msi;
|
||||
child->sysdata = parent->sysdata;
|
||||
child->bus_flags = parent->bus_flags;
|
||||
|
||||
--- a/include/linux/msi.h
|
||||
+++ b/include/linux/msi.h
|
||||
@@ -64,4 +64,15 @@ void arch_restore_msi_irqs(struct pci_de
|
||||
void default_teardown_msi_irqs(struct pci_dev *dev);
|
||||
void default_restore_msi_irqs(struct pci_dev *dev, int irq);
|
||||
|
||||
+struct msi_chip {
|
||||
+ struct module *owner;
|
||||
+ struct device *dev;
|
||||
+
|
||||
+ int (*setup_irq)(struct msi_chip *chip, struct pci_dev *dev,
|
||||
+ struct msi_desc *desc);
|
||||
+ void (*teardown_irq)(struct msi_chip *chip, unsigned int irq);
|
||||
+ int (*check_device)(struct msi_chip *chip, struct pci_dev *dev,
|
||||
+ int nvec, int type);
|
||||
+};
|
||||
+
|
||||
#endif /* LINUX_MSI_H */
|
||||
--- a/include/linux/pci.h
|
||||
+++ b/include/linux/pci.h
|
||||
@@ -432,6 +432,7 @@ struct pci_bus {
|
||||
struct resource busn_res; /* bus numbers routed to this bus */
|
||||
|
||||
struct pci_ops *ops; /* configuration access functions */
|
||||
+ struct msi_chip *msi; /* MSI controller */
|
||||
void *sysdata; /* hook for sys-specific extension */
|
||||
struct proc_dir_entry *procdir; /* directory entry in /proc/bus/pci */
|
||||
|
|
@ -1,106 +0,0 @@
|
|||
From a05852e828063b6731fcac543b87367c137c16f8 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Date: Thu, 6 Jun 2013 18:21:18 +0200
|
||||
Subject: [PATCH 073/203] of: pci: add registry of MSI chips
|
||||
|
||||
This commit adds a very basic registry of msi_chip structures, so that
|
||||
an IRQ controller driver can register an msi_chip, and a PCIe host
|
||||
controller can find it, based on a 'struct device_node'.
|
||||
|
||||
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Acked-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
|
||||
Acked-by: Rob Herring <rob.herring@calxeda.com>
|
||||
---
|
||||
drivers/of/of_pci.c | 45 +++++++++++++++++++++++++++++++++++++++++++++
|
||||
include/linux/msi.h | 2 ++
|
||||
include/linux/of_pci.h | 12 ++++++++++++
|
||||
3 files changed, 59 insertions(+)
|
||||
|
||||
--- a/drivers/of/of_pci.c
|
||||
+++ b/drivers/of/of_pci.c
|
||||
@@ -89,3 +89,48 @@ int of_pci_parse_bus_range(struct device
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(of_pci_parse_bus_range);
|
||||
+
|
||||
+#ifdef CONFIG_PCI_MSI
|
||||
+
|
||||
+static LIST_HEAD(of_pci_msi_chip_list);
|
||||
+static DEFINE_MUTEX(of_pci_msi_chip_mutex);
|
||||
+
|
||||
+int of_pci_msi_chip_add(struct msi_chip *chip)
|
||||
+{
|
||||
+ if (!of_property_read_bool(chip->of_node, "msi-controller"))
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ mutex_lock(&of_pci_msi_chip_mutex);
|
||||
+ list_add(&chip->list, &of_pci_msi_chip_list);
|
||||
+ mutex_unlock(&of_pci_msi_chip_mutex);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(of_pci_msi_chip_add);
|
||||
+
|
||||
+void of_pci_msi_chip_remove(struct msi_chip *chip)
|
||||
+{
|
||||
+ mutex_lock(&of_pci_msi_chip_mutex);
|
||||
+ list_del(&chip->list);
|
||||
+ mutex_unlock(&of_pci_msi_chip_mutex);
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(of_pci_msi_chip_remove);
|
||||
+
|
||||
+struct msi_chip *of_pci_find_msi_chip_by_node(struct device_node *of_node)
|
||||
+{
|
||||
+ struct msi_chip *c;
|
||||
+
|
||||
+ mutex_lock(&of_pci_msi_chip_mutex);
|
||||
+ list_for_each_entry(c, &of_pci_msi_chip_list, list) {
|
||||
+ if (c->of_node == of_node) {
|
||||
+ mutex_unlock(&of_pci_msi_chip_mutex);
|
||||
+ return c;
|
||||
+ }
|
||||
+ }
|
||||
+ mutex_unlock(&of_pci_msi_chip_mutex);
|
||||
+
|
||||
+ return NULL;
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(of_pci_find_msi_chip_by_node);
|
||||
+
|
||||
+#endif /* CONFIG_PCI_MSI */
|
||||
--- a/include/linux/msi.h
|
||||
+++ b/include/linux/msi.h
|
||||
@@ -67,6 +67,8 @@ void default_restore_msi_irqs(struct pci
|
||||
struct msi_chip {
|
||||
struct module *owner;
|
||||
struct device *dev;
|
||||
+ struct device_node *of_node;
|
||||
+ struct list_head list;
|
||||
|
||||
int (*setup_irq)(struct msi_chip *chip, struct pci_dev *dev,
|
||||
struct msi_desc *desc);
|
||||
--- a/include/linux/of_pci.h
|
||||
+++ b/include/linux/of_pci.h
|
||||
@@ -2,6 +2,7 @@
|
||||
#define __OF_PCI_H
|
||||
|
||||
#include <linux/pci.h>
|
||||
+#include <linux/msi.h>
|
||||
|
||||
struct pci_dev;
|
||||
struct of_irq;
|
||||
@@ -13,4 +14,15 @@ struct device_node *of_pci_find_child_de
|
||||
int of_pci_get_devfn(struct device_node *np);
|
||||
int of_pci_parse_bus_range(struct device_node *node, struct resource *res);
|
||||
|
||||
+#if defined(CONFIG_OF) && defined(CONFIG_PCI_MSI)
|
||||
+int of_pci_msi_chip_add(struct msi_chip *chip);
|
||||
+void of_pci_msi_chip_remove(struct msi_chip *chip);
|
||||
+struct msi_chip *of_pci_find_msi_chip_by_node(struct device_node *of_node);
|
||||
+#else
|
||||
+static inline int of_pci_msi_chip_add(struct msi_chip *chip) { return -EINVAL; }
|
||||
+static inline void of_pci_msi_chip_remove(struct msi_chip *chip) { }
|
||||
+static inline struct msi_chip *
|
||||
+of_pci_find_msi_chip_by_node(struct device_node *of_node) { return NULL; }
|
||||
+#endif
|
||||
+
|
||||
#endif
|
|
@ -1,64 +0,0 @@
|
|||
From c8efa45217cbd780dafe12d87b61554c2e19a010 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Date: Thu, 6 Jun 2013 18:22:51 +0200
|
||||
Subject: [PATCH 074/203] irqchip: armada-370-xp: properly request resources
|
||||
|
||||
Instead of using of_iomap(), we now use of_address_to_resource(),
|
||||
request_mem_region() and ioremap(). This allows the corresponding I/O
|
||||
regions to be properly requested and visible in /proc/iomem.
|
||||
|
||||
The main motivation for this change is that the introduction of the
|
||||
MSI support requires us to get the physical address of the main
|
||||
interrupt controller registers, so we will need the corresponding
|
||||
'struct resource' anyway.
|
||||
|
||||
We also take this opportunity to change a panic() to BUG_ON(), in
|
||||
order to be consistent with the rest of the driver.
|
||||
|
||||
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Tested-by: Daniel Price <daniel.price@gmail.com>
|
||||
Acked-by: Gregory CLEMENT <gregory.clement@free-electrons.com>
|
||||
---
|
||||
drivers/irqchip/irq-armada-370-xp.c | 20 ++++++++++++++++----
|
||||
1 file changed, 16 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/drivers/irqchip/irq-armada-370-xp.c
|
||||
+++ b/drivers/irqchip/irq-armada-370-xp.c
|
||||
@@ -248,12 +248,25 @@ armada_370_xp_handle_irq(struct pt_regs
|
||||
static int __init armada_370_xp_mpic_of_init(struct device_node *node,
|
||||
struct device_node *parent)
|
||||
{
|
||||
+ struct resource main_int_res, per_cpu_int_res;
|
||||
u32 control;
|
||||
|
||||
- main_int_base = of_iomap(node, 0);
|
||||
- per_cpu_int_base = of_iomap(node, 1);
|
||||
+ BUG_ON(of_address_to_resource(node, 0, &main_int_res));
|
||||
+ BUG_ON(of_address_to_resource(node, 1, &per_cpu_int_res));
|
||||
|
||||
+ BUG_ON(!request_mem_region(main_int_res.start,
|
||||
+ resource_size(&main_int_res),
|
||||
+ node->full_name));
|
||||
+ BUG_ON(!request_mem_region(per_cpu_int_res.start,
|
||||
+ resource_size(&per_cpu_int_res),
|
||||
+ node->full_name));
|
||||
+
|
||||
+ main_int_base = ioremap(main_int_res.start,
|
||||
+ resource_size(&main_int_res));
|
||||
BUG_ON(!main_int_base);
|
||||
+
|
||||
+ per_cpu_int_base = ioremap(per_cpu_int_res.start,
|
||||
+ resource_size(&per_cpu_int_res));
|
||||
BUG_ON(!per_cpu_int_base);
|
||||
|
||||
control = readl(main_int_base + ARMADA_370_XP_INT_CONTROL);
|
||||
@@ -262,8 +275,7 @@ static int __init armada_370_xp_mpic_of_
|
||||
irq_domain_add_linear(node, (control >> 2) & 0x3ff,
|
||||
&armada_370_xp_mpic_irq_ops, NULL);
|
||||
|
||||
- if (!armada_370_xp_mpic_domain)
|
||||
- panic("Unable to add Armada_370_Xp MPIC irq domain (DT)\n");
|
||||
+ BUG_ON(!armada_370_xp_mpic_domain);
|
||||
|
||||
irq_set_default_host(armada_370_xp_mpic_domain);
|
||||
|
|
@ -1,270 +0,0 @@
|
|||
From eaa70d53f6b827f147d775a3de7ff3ef27d0fae6 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Date: Thu, 6 Jun 2013 18:25:16 +0200
|
||||
Subject: [PATCH 075/203] irqchip: armada-370-xp: implement MSI support
|
||||
|
||||
This commit introduces the support for the MSI interrupts in the
|
||||
armada-370-xp interrupt controller driver. It registers an MSI chip to
|
||||
the MSI chip registry, which will be used by the Marvell PCIe host
|
||||
controller driver.
|
||||
|
||||
The MSI interrupts use the 16 high doorbells, and are therefore
|
||||
notified using IRQ1 of the main interrupt controller.
|
||||
|
||||
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Acked-by: Gregory CLEMENT <gregory.clement@free-electrons.com>
|
||||
---
|
||||
.../devicetree/bindings/arm/armada-370-xp-mpic.txt | 3 +
|
||||
drivers/irqchip/irq-armada-370-xp.c | 182 ++++++++++++++++++++-
|
||||
2 files changed, 184 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/Documentation/devicetree/bindings/arm/armada-370-xp-mpic.txt
|
||||
+++ b/Documentation/devicetree/bindings/arm/armada-370-xp-mpic.txt
|
||||
@@ -4,6 +4,8 @@ Marvell Armada 370 and Armada XP Interru
|
||||
Required properties:
|
||||
- compatible: Should be "marvell,mpic"
|
||||
- interrupt-controller: Identifies the node as an interrupt controller.
|
||||
+- msi-controller: Identifies the node as an PCI Message Signaled
|
||||
+ Interrupt controller.
|
||||
- #interrupt-cells: The number of cells to define the interrupts. Should be 1.
|
||||
The cell is the IRQ number
|
||||
|
||||
@@ -24,6 +26,7 @@ Example:
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
interrupt-controller;
|
||||
+ msi-controller;
|
||||
reg = <0xd0020a00 0x1d0>,
|
||||
<0xd0021070 0x58>;
|
||||
};
|
||||
--- a/drivers/irqchip/irq-armada-370-xp.c
|
||||
+++ b/drivers/irqchip/irq-armada-370-xp.c
|
||||
@@ -21,7 +21,10 @@
|
||||
#include <linux/io.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of_irq.h>
|
||||
+#include <linux/of_pci.h>
|
||||
#include <linux/irqdomain.h>
|
||||
+#include <linux/slab.h>
|
||||
+#include <linux/msi.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/exception.h>
|
||||
#include <asm/smp_plat.h>
|
||||
@@ -51,12 +54,22 @@
|
||||
#define IPI_DOORBELL_START (0)
|
||||
#define IPI_DOORBELL_END (8)
|
||||
#define IPI_DOORBELL_MASK 0xFF
|
||||
+#define PCI_MSI_DOORBELL_START (16)
|
||||
+#define PCI_MSI_DOORBELL_NR (16)
|
||||
+#define PCI_MSI_DOORBELL_END (32)
|
||||
+#define PCI_MSI_DOORBELL_MASK 0xFFFF0000
|
||||
|
||||
static DEFINE_RAW_SPINLOCK(irq_controller_lock);
|
||||
|
||||
static void __iomem *per_cpu_int_base;
|
||||
static void __iomem *main_int_base;
|
||||
static struct irq_domain *armada_370_xp_mpic_domain;
|
||||
+#ifdef CONFIG_PCI_MSI
|
||||
+static struct irq_domain *armada_370_xp_msi_domain;
|
||||
+static DECLARE_BITMAP(msi_used, PCI_MSI_DOORBELL_NR);
|
||||
+static DEFINE_MUTEX(msi_used_lock);
|
||||
+static phys_addr_t msi_doorbell_addr;
|
||||
+#endif
|
||||
|
||||
/*
|
||||
* In SMP mode:
|
||||
@@ -87,6 +100,144 @@ static void armada_370_xp_irq_unmask(str
|
||||
ARMADA_370_XP_INT_CLEAR_MASK_OFFS);
|
||||
}
|
||||
|
||||
+#ifdef CONFIG_PCI_MSI
|
||||
+
|
||||
+static int armada_370_xp_alloc_msi(void)
|
||||
+{
|
||||
+ int hwirq;
|
||||
+
|
||||
+ mutex_lock(&msi_used_lock);
|
||||
+ hwirq = find_first_zero_bit(&msi_used, PCI_MSI_DOORBELL_NR);
|
||||
+ if (hwirq >= PCI_MSI_DOORBELL_NR)
|
||||
+ hwirq = -ENOSPC;
|
||||
+ else
|
||||
+ set_bit(hwirq, msi_used);
|
||||
+ mutex_unlock(&msi_used_lock);
|
||||
+
|
||||
+ return hwirq;
|
||||
+}
|
||||
+
|
||||
+static void armada_370_xp_free_msi(int hwirq)
|
||||
+{
|
||||
+ mutex_lock(&msi_used_lock);
|
||||
+ if (!test_bit(hwirq, msi_used))
|
||||
+ pr_err("trying to free unused MSI#%d\n", hwirq);
|
||||
+ else
|
||||
+ clear_bit(hwirq, msi_used);
|
||||
+ mutex_unlock(&msi_used_lock);
|
||||
+}
|
||||
+
|
||||
+static int armada_370_xp_setup_msi_irq(struct msi_chip *chip,
|
||||
+ struct pci_dev *pdev,
|
||||
+ struct msi_desc *desc)
|
||||
+{
|
||||
+ struct msi_msg msg;
|
||||
+ irq_hw_number_t hwirq;
|
||||
+ int virq;
|
||||
+
|
||||
+ hwirq = armada_370_xp_alloc_msi();
|
||||
+ if (hwirq < 0)
|
||||
+ return hwirq;
|
||||
+
|
||||
+ virq = irq_create_mapping(armada_370_xp_msi_domain, hwirq);
|
||||
+ if (!virq) {
|
||||
+ armada_370_xp_free_msi(hwirq);
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ irq_set_msi_desc(virq, desc);
|
||||
+
|
||||
+ msg.address_lo = msi_doorbell_addr;
|
||||
+ msg.address_hi = 0;
|
||||
+ msg.data = 0xf00 | (hwirq + 16);
|
||||
+
|
||||
+ write_msi_msg(virq, &msg);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static void armada_370_xp_teardown_msi_irq(struct msi_chip *chip,
|
||||
+ unsigned int irq)
|
||||
+{
|
||||
+ struct irq_data *d = irq_get_irq_data(irq);
|
||||
+ irq_dispose_mapping(irq);
|
||||
+ armada_370_xp_free_msi(d->hwirq);
|
||||
+}
|
||||
+
|
||||
+static struct irq_chip armada_370_xp_msi_irq_chip = {
|
||||
+ .name = "armada_370_xp_msi_irq",
|
||||
+ .irq_enable = unmask_msi_irq,
|
||||
+ .irq_disable = mask_msi_irq,
|
||||
+ .irq_mask = mask_msi_irq,
|
||||
+ .irq_unmask = unmask_msi_irq,
|
||||
+};
|
||||
+
|
||||
+static int armada_370_xp_msi_map(struct irq_domain *domain, unsigned int virq,
|
||||
+ irq_hw_number_t hw)
|
||||
+{
|
||||
+ irq_set_chip_and_handler(virq, &armada_370_xp_msi_irq_chip,
|
||||
+ handle_simple_irq);
|
||||
+ set_irq_flags(virq, IRQF_VALID);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static const struct irq_domain_ops armada_370_xp_msi_irq_ops = {
|
||||
+ .map = armada_370_xp_msi_map,
|
||||
+};
|
||||
+
|
||||
+static int armada_370_xp_msi_init(struct device_node *node,
|
||||
+ phys_addr_t main_int_phys_base)
|
||||
+{
|
||||
+ struct msi_chip *msi_chip;
|
||||
+ u32 reg;
|
||||
+ int ret;
|
||||
+
|
||||
+ msi_doorbell_addr = main_int_phys_base +
|
||||
+ ARMADA_370_XP_SW_TRIG_INT_OFFS;
|
||||
+
|
||||
+ msi_chip = kzalloc(sizeof(*msi_chip), GFP_KERNEL);
|
||||
+ if (!msi_chip)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ msi_chip->setup_irq = armada_370_xp_setup_msi_irq;
|
||||
+ msi_chip->teardown_irq = armada_370_xp_teardown_msi_irq;
|
||||
+ msi_chip->of_node = node;
|
||||
+
|
||||
+ armada_370_xp_msi_domain =
|
||||
+ irq_domain_add_linear(NULL, PCI_MSI_DOORBELL_NR,
|
||||
+ &armada_370_xp_msi_irq_ops,
|
||||
+ NULL);
|
||||
+ if (!armada_370_xp_msi_domain) {
|
||||
+ kfree(msi_chip);
|
||||
+ return -ENOMEM;
|
||||
+ }
|
||||
+
|
||||
+ ret = of_pci_msi_chip_add(msi_chip);
|
||||
+ if (ret < 0) {
|
||||
+ irq_domain_remove(armada_370_xp_msi_domain);
|
||||
+ kfree(msi_chip);
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ reg = readl(per_cpu_int_base + ARMADA_370_XP_IN_DRBEL_MSK_OFFS)
|
||||
+ | PCI_MSI_DOORBELL_MASK;
|
||||
+
|
||||
+ writel(reg, per_cpu_int_base +
|
||||
+ ARMADA_370_XP_IN_DRBEL_MSK_OFFS);
|
||||
+
|
||||
+ /* Unmask IPI interrupt */
|
||||
+ writel(1, per_cpu_int_base + ARMADA_370_XP_INT_CLEAR_MASK_OFFS);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+#else
|
||||
+static inline int armada_370_xp_msi_init(struct device_node *node,
|
||||
+ phys_addr_t main_int_phys_base)
|
||||
+{
|
||||
+ return 0;
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
#ifdef CONFIG_SMP
|
||||
static int armada_xp_set_affinity(struct irq_data *d,
|
||||
const struct cpumask *mask_val, bool force)
|
||||
@@ -214,12 +365,39 @@ armada_370_xp_handle_irq(struct pt_regs
|
||||
if (irqnr > 1022)
|
||||
break;
|
||||
|
||||
- if (irqnr > 0) {
|
||||
+ if (irqnr > 1) {
|
||||
irqnr = irq_find_mapping(armada_370_xp_mpic_domain,
|
||||
irqnr);
|
||||
handle_IRQ(irqnr, regs);
|
||||
continue;
|
||||
}
|
||||
+
|
||||
+#ifdef CONFIG_PCI_MSI
|
||||
+ /* MSI handling */
|
||||
+ if (irqnr == 1) {
|
||||
+ u32 msimask, msinr;
|
||||
+
|
||||
+ msimask = readl_relaxed(per_cpu_int_base +
|
||||
+ ARMADA_370_XP_IN_DRBEL_CAUSE_OFFS)
|
||||
+ & PCI_MSI_DOORBELL_MASK;
|
||||
+
|
||||
+ writel(~PCI_MSI_DOORBELL_MASK, per_cpu_int_base +
|
||||
+ ARMADA_370_XP_IN_DRBEL_CAUSE_OFFS);
|
||||
+
|
||||
+ for (msinr = PCI_MSI_DOORBELL_START;
|
||||
+ msinr < PCI_MSI_DOORBELL_END; msinr++) {
|
||||
+ int irq;
|
||||
+
|
||||
+ if (!(msimask & BIT(msinr)))
|
||||
+ continue;
|
||||
+
|
||||
+ irq = irq_find_mapping(armada_370_xp_msi_domain,
|
||||
+ msinr - 16);
|
||||
+ handle_IRQ(irq, regs);
|
||||
+ }
|
||||
+ }
|
||||
+#endif
|
||||
+
|
||||
#ifdef CONFIG_SMP
|
||||
/* IPI Handling */
|
||||
if (irqnr == 0) {
|
||||
@@ -292,6 +470,8 @@ static int __init armada_370_xp_mpic_of_
|
||||
|
||||
#endif
|
||||
|
||||
+ armada_370_xp_msi_init(node, main_int_res.start);
|
||||
+
|
||||
set_handle_irq(armada_370_xp_handle_irq);
|
||||
|
||||
return 0;
|
|
@ -1,80 +0,0 @@
|
|||
From ea6a42a34462ea382209ff4f083b8b17260eb409 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Date: Wed, 19 Jun 2013 18:27:20 +0200
|
||||
Subject: [PATCH 076/203] ARM: pci: add ->add_bus() and ->remove_bus() hooks to
|
||||
hw_pci
|
||||
|
||||
Some PCI drivers may need to adjust the pci_bus structure after it has
|
||||
been allocated by the Linux PCI core. The PCI core allows
|
||||
architectures to implement the pcibios_add_bus() and
|
||||
pcibios_remove_bus() for this purpose. This commit therefore extends
|
||||
the hw_pci and pci_sys_data structures of the ARM PCI core to allow
|
||||
PCI drivers to register ->add_bus() and ->remove_bus() in hw_pci,
|
||||
which will get called when a bus is added or removed from the system.
|
||||
|
||||
This will be used for example by the Marvell PCIe driver to connect a
|
||||
particular PCI bus with its corresponding MSI chip to handle Message
|
||||
Signaled Interrupts.
|
||||
|
||||
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Reviewed-by: Thierry Reding <thierry.reding@gmail.com>
|
||||
Acked-by: Russell King <rmk+kernel@arm.linux.org.uk>
|
||||
Tested-by: Daniel Price <daniel.price@gmail.com>
|
||||
Tested-by: Thierry Reding <thierry.reding@gmail.com>
|
||||
---
|
||||
arch/arm/include/asm/mach/pci.h | 4 ++++
|
||||
arch/arm/kernel/bios32.c | 16 ++++++++++++++++
|
||||
2 files changed, 20 insertions(+)
|
||||
|
||||
--- a/arch/arm/include/asm/mach/pci.h
|
||||
+++ b/arch/arm/include/asm/mach/pci.h
|
||||
@@ -35,6 +35,8 @@ struct hw_pci {
|
||||
resource_size_t start,
|
||||
resource_size_t size,
|
||||
resource_size_t align);
|
||||
+ void (*add_bus)(struct pci_bus *bus);
|
||||
+ void (*remove_bus)(struct pci_bus *bus);
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -62,6 +64,8 @@ struct pci_sys_data {
|
||||
resource_size_t start,
|
||||
resource_size_t size,
|
||||
resource_size_t align);
|
||||
+ void (*add_bus)(struct pci_bus *bus);
|
||||
+ void (*remove_bus)(struct pci_bus *bus);
|
||||
void *private_data; /* platform controller private data */
|
||||
};
|
||||
|
||||
--- a/arch/arm/kernel/bios32.c
|
||||
+++ b/arch/arm/kernel/bios32.c
|
||||
@@ -363,6 +363,20 @@ void pcibios_fixup_bus(struct pci_bus *b
|
||||
}
|
||||
EXPORT_SYMBOL(pcibios_fixup_bus);
|
||||
|
||||
+void pcibios_add_bus(struct pci_bus *bus)
|
||||
+{
|
||||
+ struct pci_sys_data *sys = bus->sysdata;
|
||||
+ if (sys->add_bus)
|
||||
+ sys->add_bus(bus);
|
||||
+}
|
||||
+
|
||||
+void pcibios_remove_bus(struct pci_bus *bus)
|
||||
+{
|
||||
+ struct pci_sys_data *sys = bus->sysdata;
|
||||
+ if (sys->remove_bus)
|
||||
+ sys->remove_bus(bus);
|
||||
+}
|
||||
+
|
||||
/*
|
||||
* Swizzle the device pin each time we cross a bridge. If a platform does
|
||||
* not provide a swizzle function, we perform the standard PCI swizzling.
|
||||
@@ -463,6 +477,8 @@ static void pcibios_init_hw(struct hw_pc
|
||||
sys->swizzle = hw->swizzle;
|
||||
sys->map_irq = hw->map_irq;
|
||||
sys->align_resource = hw->align_resource;
|
||||
+ sys->add_bus = hw->add_bus;
|
||||
+ sys->remove_bus = hw->remove_bus;
|
||||
INIT_LIST_HEAD(&sys->resources);
|
||||
|
||||
if (hw->private_data)
|
|
@ -1,28 +0,0 @@
|
|||
From 2ae5acab1c267ef1c5e61e5086b93fba8eb9752e Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Date: Thu, 6 Jun 2013 18:26:29 +0200
|
||||
Subject: [PATCH 077/203] ARM: mvebu: the MPIC now provides MSI controller
|
||||
features
|
||||
|
||||
Adds the 'msi-controller' property to the main interrupt controller
|
||||
Device Tree node, to indicate that it can now behave as a MSI
|
||||
controller.
|
||||
|
||||
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Reviewed-by: Thierry Reding <thierry.reding@gmail.com>
|
||||
Tested-by: Daniel Price <daniel.price@gmail.com>
|
||||
Acked-by: Gregory CLEMENT <gregory.clement@free-electrons.com>
|
||||
---
|
||||
arch/arm/boot/dts/armada-370-xp.dtsi | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/arch/arm/boot/dts/armada-370-xp.dtsi
|
||||
+++ b/arch/arm/boot/dts/armada-370-xp.dtsi
|
||||
@@ -109,6 +109,7 @@
|
||||
#interrupt-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
interrupt-controller;
|
||||
+ msi-controller;
|
||||
};
|
||||
|
||||
coherency-fabric@20200 {
|
|
@ -1,109 +0,0 @@
|
|||
From be448338edda73460dc3e8c005b17edddf1c1b4f Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Date: Thu, 6 Jun 2013 18:27:16 +0200
|
||||
Subject: [PATCH 078/203] PCI: mvebu: add support for MSI
|
||||
|
||||
This commit adds support for Message Signaled Interrupts in the
|
||||
Marvell PCIe host controller. The work is very simple: it simply gets
|
||||
a reference to the msi_chip associated to the PCIe controller thanks
|
||||
to the msi-parent DT property, and stores this reference in the
|
||||
pci_bus structure. This is enough to let the Linux PCI core use the
|
||||
functions of msi_chip to setup and teardown MSIs.
|
||||
|
||||
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Reviewed-by: Thierry Reding <thierry.reding@gmail.com>
|
||||
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
|
||||
---
|
||||
.../devicetree/bindings/pci/mvebu-pci.txt | 3 +++
|
||||
drivers/pci/host/pci-mvebu.c | 26 ++++++++++++++++++++++
|
||||
2 files changed, 29 insertions(+)
|
||||
|
||||
--- a/Documentation/devicetree/bindings/pci/mvebu-pci.txt
|
||||
+++ b/Documentation/devicetree/bindings/pci/mvebu-pci.txt
|
||||
@@ -14,6 +14,8 @@ Mandatory properties:
|
||||
interfaces, and ranges describing the MBus windows needed to access
|
||||
the memory and I/O regions of each PCIe interface.
|
||||
|
||||
+- msi-parent: Link to the hardware entity that serves as the Message
|
||||
+ Signaled Interrupt controller for this PCI controller.
|
||||
The ranges describing the MMIO registers have the following layout:
|
||||
|
||||
0x82000000 0 r MBUS_ID(0xf0, 0x01) r 0 s
|
||||
@@ -85,6 +87,7 @@ pcie-controller {
|
||||
#size-cells = <2>;
|
||||
|
||||
bus-range = <0x00 0xff>;
|
||||
+ msi-parent = <&mpic>;
|
||||
|
||||
ranges =
|
||||
<0x82000000 0 0x40000 MBUS_ID(0xf0, 0x01) 0x40000 0 0x00002000 /* Port 0.0 registers */
|
||||
--- a/drivers/pci/host/pci-mvebu.c
|
||||
+++ b/drivers/pci/host/pci-mvebu.c
|
||||
@@ -11,6 +11,7 @@
|
||||
#include <linux/clk.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/mbus.h>
|
||||
+#include <linux/msi.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/of_address.h>
|
||||
@@ -103,6 +104,7 @@ struct mvebu_pcie_port;
|
||||
struct mvebu_pcie {
|
||||
struct platform_device *pdev;
|
||||
struct mvebu_pcie_port *ports;
|
||||
+ struct msi_chip *msi;
|
||||
struct resource io;
|
||||
struct resource realio;
|
||||
struct resource mem;
|
||||
@@ -673,6 +675,12 @@ static struct pci_bus *mvebu_pcie_scan_b
|
||||
return bus;
|
||||
}
|
||||
|
||||
+void mvebu_pcie_add_bus(struct pci_bus *bus)
|
||||
+{
|
||||
+ struct mvebu_pcie *pcie = sys_to_pcie(bus->sysdata);
|
||||
+ bus->msi = pcie->msi;
|
||||
+}
|
||||
+
|
||||
resource_size_t mvebu_pcie_align_resource(struct pci_dev *dev,
|
||||
const struct resource *res,
|
||||
resource_size_t start,
|
||||
@@ -709,6 +717,7 @@ static void __init mvebu_pcie_enable(str
|
||||
hw.map_irq = mvebu_pcie_map_irq;
|
||||
hw.ops = &mvebu_pcie_ops;
|
||||
hw.align_resource = mvebu_pcie_align_resource;
|
||||
+ hw.add_bus = mvebu_pcie_add_bus;
|
||||
|
||||
pci_common_init(&hw);
|
||||
}
|
||||
@@ -733,6 +742,21 @@ mvebu_pcie_map_registers(struct platform
|
||||
return devm_request_and_ioremap(&pdev->dev, ®s);
|
||||
}
|
||||
|
||||
+static void __init mvebu_pcie_msi_enable(struct mvebu_pcie *pcie)
|
||||
+{
|
||||
+ struct device_node *msi_node;
|
||||
+
|
||||
+ msi_node = of_parse_phandle(pcie->pdev->dev.of_node,
|
||||
+ "msi-parent", 0);
|
||||
+ if (!msi_node)
|
||||
+ return;
|
||||
+
|
||||
+ pcie->msi = of_pci_find_msi_chip_by_node(msi_node);
|
||||
+
|
||||
+ if (pcie->msi)
|
||||
+ pcie->msi->dev = &pcie->pdev->dev;
|
||||
+}
|
||||
+
|
||||
#define DT_FLAGS_TO_TYPE(flags) (((flags) >> 24) & 0x03)
|
||||
#define DT_TYPE_IO 0x1
|
||||
#define DT_TYPE_MEM32 0x2
|
||||
@@ -911,6 +935,8 @@ static int __init mvebu_pcie_probe(struc
|
||||
i++;
|
||||
}
|
||||
|
||||
+ mvebu_pcie_msi_enable(pcie);
|
||||
+
|
||||
mvebu_pcie_enable(pcie);
|
||||
|
||||
return 0;
|
|
@ -1,60 +0,0 @@
|
|||
From 7171305e9caebac8cd12ef5a5ef3823f0fbe4a1c Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Date: Thu, 6 Jun 2013 18:30:19 +0200
|
||||
Subject: [PATCH 079/203] ARM: mvebu: link PCIe controllers to the MSI
|
||||
controller
|
||||
|
||||
This commit adjusts the Armada 370 and Armada XP PCIe controllers
|
||||
Device Tree informations to reference their MSI controller. In the
|
||||
case of this platform, the MSI controller is implemented by the MPIC.
|
||||
|
||||
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Tested-by: Daniel Price <daniel.price@gmail.com>
|
||||
Acked-by: Gregory CLEMENT <gregory.clement@free-electrons.com>
|
||||
---
|
||||
arch/arm/boot/dts/armada-370.dtsi | 1 +
|
||||
arch/arm/boot/dts/armada-xp-mv78230.dtsi | 1 +
|
||||
arch/arm/boot/dts/armada-xp-mv78260.dtsi | 1 +
|
||||
arch/arm/boot/dts/armada-xp-mv78460.dtsi | 1 +
|
||||
4 files changed, 4 insertions(+)
|
||||
|
||||
--- a/arch/arm/boot/dts/armada-370.dtsi
|
||||
+++ b/arch/arm/boot/dts/armada-370.dtsi
|
||||
@@ -44,6 +44,7 @@
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
|
||||
+ msi-parent = <&mpic>;
|
||||
bus-range = <0x00 0xff>;
|
||||
|
||||
ranges =
|
||||
--- a/arch/arm/boot/dts/armada-xp-mv78230.dtsi
|
||||
+++ b/arch/arm/boot/dts/armada-xp-mv78230.dtsi
|
||||
@@ -57,6 +57,7 @@
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
|
||||
+ msi-parent = <&mpic>;
|
||||
bus-range = <0x00 0xff>;
|
||||
|
||||
ranges =
|
||||
--- a/arch/arm/boot/dts/armada-xp-mv78260.dtsi
|
||||
+++ b/arch/arm/boot/dts/armada-xp-mv78260.dtsi
|
||||
@@ -58,6 +58,7 @@
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
|
||||
+ msi-parent = <&mpic>;
|
||||
bus-range = <0x00 0xff>;
|
||||
|
||||
ranges =
|
||||
--- a/arch/arm/boot/dts/armada-xp-mv78460.dtsi
|
||||
+++ b/arch/arm/boot/dts/armada-xp-mv78460.dtsi
|
||||
@@ -74,6 +74,7 @@
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
|
||||
+ msi-parent = <&mpic>;
|
||||
bus-range = <0x00 0xff>;
|
||||
|
||||
ranges =
|
|
@ -1,132 +0,0 @@
|
|||
From 5378928ebac13756fc13d0b2de8dd45ace8026aa Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Date: Mon, 15 Jul 2013 17:34:08 +0200
|
||||
Subject: [PATCH 080/203] of: provide a binding for the 'fixed-link' property
|
||||
|
||||
Some Ethernet MACs have a "fixed link", and are not connected to a
|
||||
normal MDIO-managed PHY device. For those situations, a Device Tree
|
||||
binding allows to describe a "fixed link", as a "fixed-link" property
|
||||
of the Ethernet device Device Tree node.
|
||||
|
||||
This patch adds:
|
||||
|
||||
* A documentation for the Device Tree property "fixed-link".
|
||||
|
||||
* A of_phy_register_fixed_link() OF helper, which provided an OF node
|
||||
that contains a "fixed-link" property, registers the corresponding
|
||||
fixed PHY.
|
||||
|
||||
* Removes the warning on the of_phy_connect_fixed_link() that says
|
||||
new drivers should not use it, since Grant Likely indicated that
|
||||
this "fixed-link" property is indeed the way to go.
|
||||
|
||||
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
---
|
||||
.../devicetree/bindings/net/fixed-link.txt | 26 ++++++++++++++++
|
||||
drivers/of/of_mdio.c | 36 +++++++++++++++++++---
|
||||
include/linux/of_mdio.h | 10 ++++++
|
||||
3 files changed, 68 insertions(+), 4 deletions(-)
|
||||
create mode 100644 Documentation/devicetree/bindings/net/fixed-link.txt
|
||||
|
||||
--- /dev/null
|
||||
+++ b/Documentation/devicetree/bindings/net/fixed-link.txt
|
||||
@@ -0,0 +1,26 @@
|
||||
+Fixed link Device Tree binding
|
||||
+------------------------------
|
||||
+
|
||||
+Some Ethernet MACs have a "fixed link", and are not connected to a
|
||||
+normal MDIO-managed PHY device. For those situations, a Device Tree
|
||||
+binding allows to describe a "fixed link".
|
||||
+
|
||||
+Such a fixed link situation is described within an Ethernet device
|
||||
+Device Tree node using a 'fixed-link' property, composed of 5
|
||||
+elements:
|
||||
+
|
||||
+ 1. A fake PHY ID, which must be unique accross all fixed-link PHYs in
|
||||
+ the system.
|
||||
+ 2. The duplex (1 for full-duplex, 0 for half-duplex)
|
||||
+ 3. The speed (10, 100, 1000)
|
||||
+ 4. The pause setting (1 for enabled, 0 for disabled)
|
||||
+ 5. The asym pause setting (1 for enabled, 0 for disabled)
|
||||
+
|
||||
+Example:
|
||||
+
|
||||
+ethernet@0 {
|
||||
+ ...
|
||||
+ fixed-link = <1 1 1000 0 0>;
|
||||
+ ...
|
||||
+};
|
||||
+
|
||||
--- a/drivers/of/of_mdio.c
|
||||
+++ b/drivers/of/of_mdio.c
|
||||
@@ -14,6 +14,7 @@
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/phy.h>
|
||||
+#include <linux/phy_fixed.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_irq.h>
|
||||
#include <linux/of_mdio.h>
|
||||
@@ -215,10 +216,6 @@ EXPORT_SYMBOL(of_phy_connect);
|
||||
* @dev: pointer to net_device claiming the phy
|
||||
* @hndlr: Link state callback for the network device
|
||||
* @iface: PHY data interface type
|
||||
- *
|
||||
- * This function is a temporary stop-gap and will be removed soon. It is
|
||||
- * only to support the fs_enet, ucc_geth and gianfar Ethernet drivers. Do
|
||||
- * not call this function from new drivers.
|
||||
*/
|
||||
struct phy_device *of_phy_connect_fixed_link(struct net_device *dev,
|
||||
void (*hndlr)(struct net_device *),
|
||||
@@ -247,3 +244,34 @@ struct phy_device *of_phy_connect_fixed_
|
||||
return IS_ERR(phy) ? NULL : phy;
|
||||
}
|
||||
EXPORT_SYMBOL(of_phy_connect_fixed_link);
|
||||
+
|
||||
+#if defined(CONFIG_FIXED_PHY)
|
||||
+/**
|
||||
+ * of_phy_register_fixed_link - Parse fixed-link property and register a dummy phy
|
||||
+ * @np: pointer to the OF device node that contains the "fixed-link"
|
||||
+ * property for which a dummy phy should be registered.
|
||||
+ */
|
||||
+#define FIXED_LINK_PROPERTIES_COUNT 5
|
||||
+int of_phy_register_fixed_link(struct device_node *np)
|
||||
+{
|
||||
+ struct fixed_phy_status status = {};
|
||||
+ u32 fixed_link_props[FIXED_LINK_PROPERTIES_COUNT];
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = of_property_read_u32_array(np, "fixed-link",
|
||||
+ fixed_link_props,
|
||||
+ FIXED_LINK_PROPERTIES_COUNT);
|
||||
+ if (ret < 0)
|
||||
+ return ret;
|
||||
+
|
||||
+ status.link = 1;
|
||||
+ status.duplex = fixed_link_props[1];
|
||||
+ status.speed = fixed_link_props[2];
|
||||
+ status.pause = fixed_link_props[3];
|
||||
+ status.asym_pause = fixed_link_props[4];
|
||||
+
|
||||
+ return fixed_phy_add(PHY_POLL, fixed_link_props[0],
|
||||
+ &status);
|
||||
+}
|
||||
+EXPORT_SYMBOL(of_phy_register_fixed_link);
|
||||
+#endif
|
||||
--- a/include/linux/of_mdio.h
|
||||
+++ b/include/linux/of_mdio.h
|
||||
@@ -57,4 +57,14 @@ static inline struct mii_bus *of_mdio_fi
|
||||
}
|
||||
#endif /* CONFIG_OF */
|
||||
|
||||
+#if defined(CONFIG_OF) && defined(CONFIG_FIXED_PHY)
|
||||
+extern int of_phy_register_fixed_link(struct device_node *np);
|
||||
+#else
|
||||
+static inline int of_phy_register_fixed_link(struct device_node *np)
|
||||
+{
|
||||
+ return -ENOSYS;
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
+
|
||||
#endif /* __LINUX_OF_MDIO_H */
|
|
@ -1,42 +0,0 @@
|
|||
From dce33dc5a6ba5f7fcbab4d7e92cc68c756a1f714 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Date: Mon, 15 Jul 2013 17:34:09 +0200
|
||||
Subject: [PATCH 081/203] net: phy: call mdiobus_scan() after adding a fixed
|
||||
PHY
|
||||
|
||||
The fixed_phy_add() function allows to register a fixed PHY. However,
|
||||
when this function gets called *after* fixed_mdio_bus_init() (which
|
||||
gets called at the module_init stage), then the fixed PHY is not
|
||||
registered into the phylib.
|
||||
|
||||
In order to address this, we add a call to mdiobus_scan() in
|
||||
fixed_phy_add() to ensure that the PHY indeed gets registered into the
|
||||
phylib, even if the fixed_phy_add() is called after
|
||||
fixed_mdio_bus_init().
|
||||
|
||||
This is needed because until now, the only code that was calling the
|
||||
fixed_add_phy() function was PowerPC-specific platform code, which
|
||||
could ensure that such fixed PHYs get registered before
|
||||
fixed_mdio_bus_init() is called.
|
||||
|
||||
However, with the new of_phy_register_fixed_link() function, device
|
||||
drivers can parse their 'fixed-link' property and register a fixed PHY
|
||||
at ->probe() time, which may happen after fixed_mdio_bus_init() is
|
||||
called.
|
||||
|
||||
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
---
|
||||
drivers/net/phy/fixed.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
--- a/drivers/net/phy/fixed.c
|
||||
+++ b/drivers/net/phy/fixed.c
|
||||
@@ -195,6 +195,8 @@ int fixed_phy_add(unsigned int irq, int
|
||||
|
||||
list_add_tail(&fp->node, &fmb->phys);
|
||||
|
||||
+ mdiobus_scan(fmb->mii_bus, phy_id);
|
||||
+
|
||||
return 0;
|
||||
|
||||
err_regs:
|
|
@ -1,90 +0,0 @@
|
|||
From 350a4e8e9d517d2d7c48bc915da5b1e30163add3 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Date: Mon, 15 Jul 2013 17:34:10 +0200
|
||||
Subject: [PATCH 082/203] net: mvneta: add support for fixed links
|
||||
|
||||
Following the introduction of of_phy_register_fixed_link(), this patch
|
||||
introduces fixed link support in the mvneta driver, for Marvell Armada
|
||||
370/XP SOCs.
|
||||
|
||||
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
---
|
||||
.../bindings/net/marvell-armada-370-neta.txt | 24 +++++++++++++++++++---
|
||||
drivers/net/ethernet/marvell/mvneta.c | 18 +++++++++++-----
|
||||
2 files changed, 34 insertions(+), 8 deletions(-)
|
||||
|
||||
--- a/Documentation/devicetree/bindings/net/marvell-armada-370-neta.txt
|
||||
+++ b/Documentation/devicetree/bindings/net/marvell-armada-370-neta.txt
|
||||
@@ -4,13 +4,21 @@ Required properties:
|
||||
- compatible: should be "marvell,armada-370-neta".
|
||||
- reg: address and length of the register set for the device.
|
||||
- interrupts: interrupt for the device
|
||||
-- phy: A phandle to a phy node defining the PHY address (as the reg
|
||||
- property, a single integer).
|
||||
- phy-mode: The interface between the SoC and the PHY (a string that
|
||||
of_get_phy_mode() can understand)
|
||||
- clocks: a pointer to the reference clock for this device.
|
||||
|
||||
-Example:
|
||||
+Optional properties:
|
||||
+
|
||||
+- phy: A phandle to a phy node defining the PHY address (as the reg
|
||||
+ property, a single integer). Note: if this property isn't present,
|
||||
+ then fixed link is assumed, and the 'fixed-link' property is
|
||||
+ mandatory.
|
||||
+- fixed-link: A 5 elements array that describe a fixed link, see
|
||||
+ fixed-link.txt for details. Note: if a 'phy' property is present,
|
||||
+ this 'fixed-link' property is ignored.
|
||||
+
|
||||
+Examples:
|
||||
|
||||
ethernet@d0070000 {
|
||||
compatible = "marvell,armada-370-neta";
|
||||
@@ -21,3 +29,13 @@ ethernet@d0070000 {
|
||||
phy = <&phy0>;
|
||||
phy-mode = "rgmii-id";
|
||||
};
|
||||
+
|
||||
+ethernet@d0070000 {
|
||||
+ compatible = "marvell,armada-370-neta";
|
||||
+ reg = <0xd0070000 0x2500>;
|
||||
+ interrupts = <8>;
|
||||
+ clocks = <&gate_clk 4>;
|
||||
+ status = "okay";
|
||||
+ fixed-link = <1 1 1000 0 0>;
|
||||
+ phy-mode = "rgmii-id";
|
||||
+};
|
||||
--- a/drivers/net/ethernet/marvell/mvneta.c
|
||||
+++ b/drivers/net/ethernet/marvell/mvneta.c
|
||||
@@ -2360,8 +2360,12 @@ static int mvneta_mdio_probe(struct mvne
|
||||
{
|
||||
struct phy_device *phy_dev;
|
||||
|
||||
- phy_dev = of_phy_connect(pp->dev, pp->phy_node, mvneta_adjust_link, 0,
|
||||
- pp->phy_interface);
|
||||
+ if (pp->phy_node)
|
||||
+ phy_dev = of_phy_connect(pp->dev, pp->phy_node, mvneta_adjust_link, 0,
|
||||
+ pp->phy_interface);
|
||||
+ else
|
||||
+ phy_dev = of_phy_connect_fixed_link(pp->dev, mvneta_adjust_link,
|
||||
+ pp->phy_interface);
|
||||
if (!phy_dev) {
|
||||
netdev_err(pp->dev, "could not find the PHY\n");
|
||||
return -ENODEV;
|
||||
@@ -2719,9 +2723,13 @@ static int mvneta_probe(struct platform_
|
||||
|
||||
phy_node = of_parse_phandle(dn, "phy", 0);
|
||||
if (!phy_node) {
|
||||
- dev_err(&pdev->dev, "no associated PHY\n");
|
||||
- err = -ENODEV;
|
||||
- goto err_free_irq;
|
||||
+ /* No 'phy' found, see if we have a 'fixed-link'
|
||||
+ * property */
|
||||
+ err = of_phy_register_fixed_link(dn);
|
||||
+ if (err < 0) {
|
||||
+ dev_err(&pdev->dev, "no 'phy' or 'fixed-link' properties\n");
|
||||
+ goto err_free_irq;
|
||||
+ }
|
||||
}
|
||||
|
||||
phy_mode = of_get_phy_mode(dn);
|
|
@ -1,84 +0,0 @@
|
|||
From 409885c9ec1b0dba5c8f393af6d481c69bfa9b0a Mon Sep 17 00:00:00 2001
|
||||
From: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Date: Tue, 13 Aug 2013 11:43:12 -0300
|
||||
Subject: [PATCH 083/203] clocksource: armada-370-xp: Use
|
||||
CLOCKSOURCE_OF_DECLARE
|
||||
|
||||
This is almost cosmetic: we achieve a bit of consistency with
|
||||
other clocksource drivers by using the CLOCKSOURCE_OF_DECLARE
|
||||
macro for the boilerplate code.
|
||||
|
||||
Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
|
||||
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
|
||||
---
|
||||
arch/arm/mach-mvebu/armada-370-xp.c | 4 ++--
|
||||
drivers/clocksource/time-armada-370-xp.c | 6 +++---
|
||||
include/linux/time-armada-370-xp.h | 18 ------------------
|
||||
3 files changed, 5 insertions(+), 23 deletions(-)
|
||||
delete mode 100644 include/linux/time-armada-370-xp.h
|
||||
|
||||
--- a/arch/arm/mach-mvebu/armada-370-xp.c
|
||||
+++ b/arch/arm/mach-mvebu/armada-370-xp.c
|
||||
@@ -17,7 +17,7 @@
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/io.h>
|
||||
-#include <linux/time-armada-370-xp.h>
|
||||
+#include <linux/clocksource.h>
|
||||
#include <linux/clk/mvebu.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/mbus.h>
|
||||
@@ -38,7 +38,7 @@ static void __init armada_370_xp_map_io(
|
||||
static void __init armada_370_xp_timer_and_clk_init(void)
|
||||
{
|
||||
mvebu_clocks_init();
|
||||
- armada_370_xp_timer_init();
|
||||
+ clocksource_of_init();
|
||||
coherency_init();
|
||||
BUG_ON(mvebu_mbus_dt_init());
|
||||
#ifdef CONFIG_CACHE_L2X0
|
||||
--- a/drivers/clocksource/time-armada-370-xp.c
|
||||
+++ b/drivers/clocksource/time-armada-370-xp.c
|
||||
@@ -210,13 +210,11 @@ static struct local_timer_ops armada_370
|
||||
.stop = armada_370_xp_timer_stop,
|
||||
};
|
||||
|
||||
-void __init armada_370_xp_timer_init(void)
|
||||
+static void __init armada_370_xp_timer_init(struct device_node *np)
|
||||
{
|
||||
u32 u;
|
||||
- struct device_node *np;
|
||||
int res;
|
||||
|
||||
- np = of_find_compatible_node(NULL, NULL, "marvell,armada-370-xp-timer");
|
||||
timer_base = of_iomap(np, 0);
|
||||
WARN_ON(!timer_base);
|
||||
local_base = of_iomap(np, 1);
|
||||
@@ -299,3 +297,5 @@ void __init armada_370_xp_timer_init(voi
|
||||
#endif
|
||||
}
|
||||
}
|
||||
+CLOCKSOURCE_OF_DECLARE(armada_370_xp, "marvell,armada-370-xp-timer",
|
||||
+ armada_370_xp_timer_init);
|
||||
--- a/include/linux/time-armada-370-xp.h
|
||||
+++ /dev/null
|
||||
@@ -1,18 +0,0 @@
|
||||
-/*
|
||||
- * Marvell Armada 370/XP SoC timer handling.
|
||||
- *
|
||||
- * Copyright (C) 2012 Marvell
|
||||
- *
|
||||
- * Lior Amsalem <alior@marvell.com>
|
||||
- * Gregory CLEMENT <gregory.clement@free-electrons.com>
|
||||
- * Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
- *
|
||||
- */
|
||||
-#ifndef __TIME_ARMADA_370_XPPRCMU_H
|
||||
-#define __TIME_ARMADA_370_XPPRCMU_H
|
||||
-
|
||||
-#include <linux/init.h>
|
||||
-
|
||||
-void __init armada_370_xp_timer_init(void);
|
||||
-
|
||||
-#endif
|
|
@ -1,33 +0,0 @@
|
|||
From 02b0213923da41034a766942508d882f9be51efd Mon Sep 17 00:00:00 2001
|
||||
From: Jean Pihet <jean.pihet@linaro.org>
|
||||
Date: Wed, 18 Sep 2013 20:55:09 +0200
|
||||
Subject: [PATCH 084/203] arm: clocksource: mvebu: Use the main timer as clock
|
||||
source from DT
|
||||
|
||||
This commit:
|
||||
573145f08c2b92c45498468afbbba909f6ce6135
|
||||
clocksource: armada-370-xp: Use CLOCKSOURCE_OF_DECLARE
|
||||
|
||||
replaced a call to the driver's timer initialization by a call to
|
||||
clocksource_of_init(). However, it failed to select CONFIG_CLKSRC_OF.
|
||||
|
||||
Fix this by selecting CONFIG_CLKSRC_OF for Armada370/XP machines.
|
||||
Without this change the kernel is stuck at: 'Calibrating delay loop...'.
|
||||
|
||||
Signed-off-by: Jean Pihet <jean.pihet@linaro.org>
|
||||
Acked-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
|
||||
---
|
||||
drivers/clocksource/Kconfig | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/drivers/clocksource/Kconfig
|
||||
+++ b/drivers/clocksource/Kconfig
|
||||
@@ -24,6 +24,7 @@ config DW_APB_TIMER_OF
|
||||
|
||||
config ARMADA_370_XP_TIMER
|
||||
bool
|
||||
+ select CLKSRC_OF
|
||||
|
||||
config SUN4I_TIMER
|
||||
bool
|
|
@ -1,44 +0,0 @@
|
|||
From ddda6fa410b6e50ee67d4a628187e76b4a6c9b28 Mon Sep 17 00:00:00 2001
|
||||
From: Lior Amsalem <alior@marvell.com>
|
||||
Date: Mon, 25 Nov 2013 17:26:45 +0100
|
||||
Subject: [PATCH 086/203] irqchip: armada-370-xp: fix MSI race condition
|
||||
|
||||
In the Armada 370/XP driver, when we receive an IRQ 1, we read the
|
||||
list of doorbells that caused the interrupt from register
|
||||
ARMADA_370_XP_IN_DRBEL_CAUSE_OFFS. This gives the list of MSIs that
|
||||
were generated. However, instead of acknowledging only the MSIs that
|
||||
were generated, we acknowledge *all* the MSIs, by writing
|
||||
~MSI_DOORBELL_MASK in the ARMADA_370_XP_IN_DRBEL_CAUSE_OFFS register.
|
||||
|
||||
This creates a race condition: if a new MSI that isn't part of the
|
||||
ones read into the temporary "msimask" variable is fired before we
|
||||
acknowledge all MSIs, then we will simply loose it.
|
||||
|
||||
It is important to mention that this ARMADA_370_XP_IN_DRBEL_CAUSE_OFFS
|
||||
register has the following behavior: "A CPU write of 0 clears the bits
|
||||
in this field. A CPU write of 1 has no effect". This is what allows us
|
||||
to simply write ~msimask to acknoledge the handled MSIs.
|
||||
|
||||
Notice that the same problem is present in the IPI implementation, but
|
||||
it is fixed as a separate patch, so that this IPI fix can be pushed to
|
||||
older stable versions as appropriate (all the way to 3.8), while the
|
||||
MSI code only appeared in 3.13.
|
||||
|
||||
Signed-off-by: Lior Amsalem <alior@marvell.com>
|
||||
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Cc: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
drivers/irqchip/irq-armada-370-xp.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/irqchip/irq-armada-370-xp.c
|
||||
+++ b/drivers/irqchip/irq-armada-370-xp.c
|
||||
@@ -381,7 +381,7 @@ armada_370_xp_handle_irq(struct pt_regs
|
||||
ARMADA_370_XP_IN_DRBEL_CAUSE_OFFS)
|
||||
& PCI_MSI_DOORBELL_MASK;
|
||||
|
||||
- writel(~PCI_MSI_DOORBELL_MASK, per_cpu_int_base +
|
||||
+ writel(~msimask, per_cpu_int_base +
|
||||
ARMADA_370_XP_IN_DRBEL_CAUSE_OFFS);
|
||||
|
||||
for (msinr = PCI_MSI_DOORBELL_START;
|
|
@ -1,60 +0,0 @@
|
|||
From 98e6b600e81f71f8621e316f5d46cf261a9f1da4 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Date: Mon, 25 Nov 2013 17:26:47 +0100
|
||||
Subject: [PATCH 088/203] ARM: mvebu: re-enable PCIe on Armada 370 DB
|
||||
|
||||
Commit 14fd8ed0a7fd19913 ("ARM: mvebu: Relocate Armada 370/XP PCIe
|
||||
device tree nodes") relocated the PCIe controller DT nodes one level
|
||||
up in the Device Tree, to reflect a more correct representation of the
|
||||
hardware introduced by the mvebu-mbus Device Tree binding.
|
||||
|
||||
However, while most of the boards were properly adjusted accordingly,
|
||||
the Armada 370 DB board was left unchanged, and therefore, PCIe is
|
||||
seen as not enabled on this board. This patch fixes that by moving the
|
||||
PCIe controller node one level-up in armada-370-db.dts.
|
||||
|
||||
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
Cc: stable@vger.kernel.org
|
||||
---
|
||||
arch/arm/boot/dts/armada-370-db.dts | 28 ++++++++++++++--------------
|
||||
1 file changed, 14 insertions(+), 14 deletions(-)
|
||||
|
||||
--- a/arch/arm/boot/dts/armada-370-db.dts
|
||||
+++ b/arch/arm/boot/dts/armada-370-db.dts
|
||||
@@ -99,22 +99,22 @@
|
||||
spi-max-frequency = <50000000>;
|
||||
};
|
||||
};
|
||||
+ };
|
||||
|
||||
- pcie-controller {
|
||||
+ pcie-controller {
|
||||
+ status = "okay";
|
||||
+ /*
|
||||
+ * The two PCIe units are accessible through
|
||||
+ * both standard PCIe slots and mini-PCIe
|
||||
+ * slots on the board.
|
||||
+ */
|
||||
+ pcie@1,0 {
|
||||
+ /* Port 0, Lane 0 */
|
||||
+ status = "okay";
|
||||
+ };
|
||||
+ pcie@2,0 {
|
||||
+ /* Port 1, Lane 0 */
|
||||
status = "okay";
|
||||
- /*
|
||||
- * The two PCIe units are accessible through
|
||||
- * both standard PCIe slots and mini-PCIe
|
||||
- * slots on the board.
|
||||
- */
|
||||
- pcie@1,0 {
|
||||
- /* Port 0, Lane 0 */
|
||||
- status = "okay";
|
||||
- };
|
||||
- pcie@2,0 {
|
||||
- /* Port 1, Lane 0 */
|
||||
- status = "okay";
|
||||
- };
|
||||
};
|
||||
};
|
||||
};
|
|
@ -1,43 +0,0 @@
|
|||
From 67f66e13d8a6da710d6df965021d92261083b584 Mon Sep 17 00:00:00 2001
|
||||
From: Gregory CLEMENT <gregory.clement@free-electrons.com>
|
||||
Date: Wed, 25 Sep 2013 13:24:18 +0200
|
||||
Subject: [PATCH 089/203] ARM: mvebu: fix gated clock documentation
|
||||
|
||||
The gated clock documentation referred only to the Orion SoC whereas
|
||||
it also applied for the Armada 370/XP SoC. This commit updates the
|
||||
introduction text and also the list of the compatible strings.
|
||||
|
||||
Signed-off-by: Gregory CLEMENT <gregory.clement@free-electrons.com>
|
||||
Signed-off-by: Jason Cooper <jason@lakedaemon.net>
|
||||
---
|
||||
.../devicetree/bindings/clock/mvebu-gated-clock.txt | 14 ++++++++------
|
||||
1 file changed, 8 insertions(+), 6 deletions(-)
|
||||
|
||||
--- a/Documentation/devicetree/bindings/clock/mvebu-gated-clock.txt
|
||||
+++ b/Documentation/devicetree/bindings/clock/mvebu-gated-clock.txt
|
||||
@@ -1,10 +1,10 @@
|
||||
-* Gated Clock bindings for Marvell Orion SoCs
|
||||
+* Gated Clock bindings for Marvell EBU SoCs
|
||||
|
||||
-Marvell Dove and Kirkwood allow some peripheral clocks to be gated to save
|
||||
-some power. The clock consumer should specify the desired clock by having
|
||||
-the clock ID in its "clocks" phandle cell. The clock ID is directly mapped to
|
||||
-the corresponding clock gating control bit in HW to ease manual clock lookup
|
||||
-in datasheet.
|
||||
+Marvell Armada 370/XP, Dove and Kirkwood allow some peripheral clocks to be
|
||||
+gated to save some power. The clock consumer should specify the desired clock
|
||||
+by having the clock ID in its "clocks" phandle cell. The clock ID is directly
|
||||
+mapped to the corresponding clock gating control bit in HW to ease manual clock
|
||||
+lookup in datasheet.
|
||||
|
||||
The following is a list of provided IDs for Armada 370:
|
||||
ID Clock Peripheral
|
||||
@@ -94,6 +94,8 @@ ID Clock Peripheral
|
||||
|
||||
Required properties:
|
||||
- compatible : shall be one of the following:
|
||||
+ "marvell,armada-370-gating-clock" - for Armada 370 SoC clock gating
|
||||
+ "marvell,armada-xp-gating-clock" - for Armada XP SoC clock gating
|
||||
"marvell,dove-gating-clock" - for Dove SoC clock gating
|
||||
"marvell,kirkwood-gating-clock" - for Kirkwood SoC clock gating
|
||||
- reg : shall be the register address of the Clock Gating Control register
|
|
@ -1,64 +0,0 @@
|
|||
From 4aa571afd29f88898ef2fb954effcf53fec3264e Mon Sep 17 00:00:00 2001
|
||||
From: Huang Shijie <b32955@freescale.com>
|
||||
Date: Fri, 17 May 2013 11:17:25 +0800
|
||||
Subject: [PATCH 090/203] mtd: add datasheet's ECC information to nand_chip{}
|
||||
|
||||
1.) Why add the ECC information to the nand_chip{} ?
|
||||
Each nand chip has its requirement for the ECC correctability, such as
|
||||
"4bit ECC for each 512Byte" or "40bit ECC for each 1024Byte".
|
||||
This ECC info is very important to the nand controller, such as gpmi.
|
||||
|
||||
Take the Micron MT29F64G08CBABA for example, its geometry is
|
||||
8KiB page size, 744 bytes oob size and it requires 40bit ECC per 1KiB.
|
||||
If we do not provide the ECC info to the gpmi nand driver, it has to
|
||||
calculate the ECC correctability itself. The gpmi driver will gets the 56bit
|
||||
ECC for per 1KiB which is beyond its BCH's 40bit ecc capibility.
|
||||
The gpmi will quits in this case. But in actually, the gpmi can supports
|
||||
this nand chip if it can get the right ECC info.
|
||||
|
||||
2.) about the new fields.
|
||||
The @ecc_strength_ds stands for the ecc bits needed within the @ecc_step_ds.
|
||||
The two fields should be set from the nand chip's datasheets.
|
||||
|
||||
For example:
|
||||
"4bit ECC for each 512Byte" could be:
|
||||
@ecc_strength_ds = 4, @ecc_step_ds = 512.
|
||||
"40bit ECC for each 1024Byte" could be:
|
||||
@ecc_strength_ds = 40, @ecc_step_ds = 1024.
|
||||
|
||||
3.) Why do not re-use the @strength and @size in the nand_ecc_ctrl{}?
|
||||
The @strength and @size in nand_ecc_ctrl{} is used by the nand controller
|
||||
driver, while the @ecc_strength_ds and @ecc_step_ds are get from the datasheet.
|
||||
|
||||
Signed-off-by: Huang Shijie <b32955@freescale.com>
|
||||
Reviewed-and-tested-by: Brian Norris <computersforpeace@gmail.com>
|
||||
Signed-off-by: Brian Norris <computersforpeace@gmail.com>
|
||||
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
|
||||
---
|
||||
include/linux/mtd/nand.h | 8 ++++++++
|
||||
1 file changed, 8 insertions(+)
|
||||
|
||||
--- a/include/linux/mtd/nand.h
|
||||
+++ b/include/linux/mtd/nand.h
|
||||
@@ -434,6 +434,12 @@ struct nand_buffers {
|
||||
* bad block marker position; i.e., BBM == 11110111b is
|
||||
* not bad when badblockbits == 7
|
||||
* @cellinfo: [INTERN] MLC/multichip data from chip ident
|
||||
+ * @ecc_strength_ds: [INTERN] ECC correctability from the datasheet.
|
||||
+ * Minimum amount of bit errors per @ecc_step_ds guaranteed
|
||||
+ * to be correctable. If unknown, set to zero.
|
||||
+ * @ecc_step_ds: [INTERN] ECC step required by the @ecc_strength_ds,
|
||||
+ * also from the datasheet. It is the recommended ECC step
|
||||
+ * size, if known; if unknown, set to zero.
|
||||
* @numchips: [INTERN] number of physical chips
|
||||
* @chipsize: [INTERN] the size of one chip for multichip arrays
|
||||
* @pagemask: [INTERN] page number mask = number of (pages / chip) - 1
|
||||
@@ -510,6 +516,8 @@ struct nand_chip {
|
||||
unsigned int pagebuf_bitflips;
|
||||
int subpagesize;
|
||||
uint8_t cellinfo;
|
||||
+ uint16_t ecc_strength_ds;
|
||||
+ uint16_t ecc_step_ds;
|
||||
int badblockpos;
|
||||
int badblockbits;
|
||||
|
|
@ -1,85 +0,0 @@
|
|||
From 50a7db84f71e7c4779596fb5f8efb579a5d29f97 Mon Sep 17 00:00:00 2001
|
||||
From: Huang Shijie <b32955@freescale.com>
|
||||
Date: Fri, 17 May 2013 11:17:27 +0800
|
||||
Subject: [PATCH 091/203] mtd: add data structures for Extended Parameter Page
|
||||
|
||||
Since the ONFI 2.1, the onfi spec adds the Extended Parameter Page
|
||||
to store the ECC info.
|
||||
|
||||
The onfi spec tells us that if the nand chip's recommended ECC codeword
|
||||
size is not 512 bytes, then the @ecc_bits is 0xff. The host _SHOULD_ then
|
||||
read the Extended ECC information that is part of the extended parameter
|
||||
page to retrieve the ECC requirements for this device.
|
||||
|
||||
This patch adds
|
||||
[1] the neccessary fields for nand_onfi_params{},
|
||||
[2] and adds the onfi_ext_ecc_info{} for Extended ECC information,
|
||||
[3] adds onfi_ext_section{} for extended sections,
|
||||
[4] and adds onfi_ext_param_page{} for the Extended Parameter Page.
|
||||
|
||||
Acked-by: Pekon Gupta <pekon@ti.com>
|
||||
Signed-off-by: Huang Shijie <b32955@freescale.com>
|
||||
Reviewed-and-tested-by: Brian Norris <computersforpeace@gmail.com>
|
||||
[Brian: amended for checkpatch.pl]
|
||||
Signed-off-by: Brian Norris <computersforpeace@gmail.com>
|
||||
|
||||
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
|
||||
---
|
||||
include/linux/mtd/nand.h | 39 ++++++++++++++++++++++++++++++++++++++-
|
||||
1 file changed, 38 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/include/linux/mtd/nand.h
|
||||
+++ b/include/linux/mtd/nand.h
|
||||
@@ -224,7 +224,10 @@ struct nand_onfi_params {
|
||||
__le16 revision;
|
||||
__le16 features;
|
||||
__le16 opt_cmd;
|
||||
- u8 reserved[22];
|
||||
+ u8 reserved0[2];
|
||||
+ __le16 ext_param_page_length; /* since ONFI 2.1 */
|
||||
+ u8 num_of_param_pages; /* since ONFI 2.1 */
|
||||
+ u8 reserved1[17];
|
||||
|
||||
/* manufacturer information block */
|
||||
char manufacturer[12];
|
||||
@@ -281,6 +284,40 @@ struct nand_onfi_params {
|
||||
|
||||
#define ONFI_CRC_BASE 0x4F4E
|
||||
|
||||
+/* Extended ECC information Block Definition (since ONFI 2.1) */
|
||||
+struct onfi_ext_ecc_info {
|
||||
+ u8 ecc_bits;
|
||||
+ u8 codeword_size;
|
||||
+ __le16 bb_per_lun;
|
||||
+ __le16 block_endurance;
|
||||
+ u8 reserved[2];
|
||||
+} __packed;
|
||||
+
|
||||
+#define ONFI_SECTION_TYPE_0 0 /* Unused section. */
|
||||
+#define ONFI_SECTION_TYPE_1 1 /* for additional sections. */
|
||||
+#define ONFI_SECTION_TYPE_2 2 /* for ECC information. */
|
||||
+struct onfi_ext_section {
|
||||
+ u8 type;
|
||||
+ u8 length;
|
||||
+} __packed;
|
||||
+
|
||||
+#define ONFI_EXT_SECTION_MAX 8
|
||||
+
|
||||
+/* Extended Parameter Page Definition (since ONFI 2.1) */
|
||||
+struct onfi_ext_param_page {
|
||||
+ __le16 crc;
|
||||
+ u8 sig[4]; /* 'E' 'P' 'P' 'S' */
|
||||
+ u8 reserved0[10];
|
||||
+ struct onfi_ext_section sections[ONFI_EXT_SECTION_MAX];
|
||||
+
|
||||
+ /*
|
||||
+ * The actual size of the Extended Parameter Page is in
|
||||
+ * @ext_param_page_length of nand_onfi_params{}.
|
||||
+ * The following are the variable length sections.
|
||||
+ * So we do not add any fields below. Please see the ONFI spec.
|
||||
+ */
|
||||
+} __packed;
|
||||
+
|
||||
/**
|
||||
* struct nand_hw_control - Control structure for hardware controller (e.g ECC generator) shared among independent devices
|
||||
* @lock: protection lock
|
|
@ -1,43 +0,0 @@
|
|||
From aeeb6ea6eb18c46f5776dd068989686686cda359 Mon Sep 17 00:00:00 2001
|
||||
From: Huang Shijie <shijie8@gmail.com>
|
||||
Date: Fri, 17 May 2013 11:17:28 +0800
|
||||
Subject: [PATCH 092/203] mtd: add a helper to get the supported features for
|
||||
ONFI nand
|
||||
|
||||
add a helper to get the supported features for ONFI nand.
|
||||
Also add the neccessary macros.
|
||||
|
||||
Signed-off-by: Huang Shijie <b32955@freescale.com>
|
||||
Reviewed-and-tested-by: Brian Norris <computersforpeace@gmail.com>
|
||||
Signed-off-by: Brian Norris <computersforpeace@gmail.com>
|
||||
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
|
||||
---
|
||||
include/linux/mtd/nand.h | 10 ++++++++++
|
||||
1 file changed, 10 insertions(+)
|
||||
|
||||
--- a/include/linux/mtd/nand.h
|
||||
+++ b/include/linux/mtd/nand.h
|
||||
@@ -202,6 +202,10 @@ typedef enum {
|
||||
/* Keep gcc happy */
|
||||
struct nand_chip;
|
||||
|
||||
+/* ONFI features */
|
||||
+#define ONFI_FEATURE_16_BIT_BUS (1 << 0)
|
||||
+#define ONFI_FEATURE_EXT_PARAM_PAGE (1 << 7)
|
||||
+
|
||||
/* ONFI timing mode, used in both asynchronous and synchronous mode */
|
||||
#define ONFI_TIMING_MODE_0 (1 << 0)
|
||||
#define ONFI_TIMING_MODE_1 (1 << 1)
|
||||
@@ -754,6 +758,12 @@ struct platform_nand_chip *get_platform_
|
||||
return chip->priv;
|
||||
}
|
||||
|
||||
+/* return the supported features. */
|
||||
+static inline int onfi_feature(struct nand_chip *chip)
|
||||
+{
|
||||
+ return chip->onfi_version ? le16_to_cpu(chip->onfi_params.features) : 0;
|
||||
+}
|
||||
+
|
||||
/* return the supported asynchronous timing mode. */
|
||||
static inline int onfi_get_async_timing_mode(struct nand_chip *chip)
|
||||
{
|
|
@ -1,31 +0,0 @@
|
|||
From ceef2075f3aa430da137e3629b0280a46d420ccd Mon Sep 17 00:00:00 2001
|
||||
From: Huang Shijie <b32955@freescale.com>
|
||||
Date: Fri, 17 May 2013 11:17:26 +0800
|
||||
Subject: [PATCH 093/203] mtd: get the ECC info from the parameter page for
|
||||
ONFI nand
|
||||
|
||||
From the ONFI spec, we can just get the ECC info from the @ecc_bits field of
|
||||
the parameter page.
|
||||
|
||||
Signed-off-by: Huang Shijie <b32955@freescale.com>
|
||||
Reviewed-and-tested-by: Brian Norris <computersforpeace@gmail.com>
|
||||
Signed-off-by: Brian Norris <computersforpeace@gmail.com>
|
||||
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
|
||||
---
|
||||
drivers/mtd/nand/nand_base.c | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
--- a/drivers/mtd/nand/nand_base.c
|
||||
+++ b/drivers/mtd/nand/nand_base.c
|
||||
@@ -2924,6 +2924,11 @@ static int nand_flash_detect_onfi(struct
|
||||
if (le16_to_cpu(p->features) & 1)
|
||||
*busw = NAND_BUSWIDTH_16;
|
||||
|
||||
+ if (p->ecc_bits != 0xff) {
|
||||
+ chip->ecc_strength_ds = p->ecc_bits;
|
||||
+ chip->ecc_step_ds = 512;
|
||||
+ }
|
||||
+
|
||||
pr_info("ONFI flash detected\n");
|
||||
return 1;
|
||||
}
|
|
@ -1,131 +0,0 @@
|
|||
From f617846b1e20a2ba59cdd9435715339eaed1e251 Mon Sep 17 00:00:00 2001
|
||||
From: Huang Shijie <b32955@freescale.com>
|
||||
Date: Wed, 22 May 2013 10:28:27 +0800
|
||||
Subject: [PATCH 094/203] mtd: get the ECC info from the Extended Parameter
|
||||
Page
|
||||
|
||||
Since the ONFI 2.1, the onfi spec adds the Extended Parameter Page
|
||||
to store the ECC info.
|
||||
|
||||
The onfi spec tells us that if the nand chip's recommended ECC codeword
|
||||
size is not 512 bytes, then the @ecc_bits is 0xff. The host _SHOULD_ then
|
||||
read the Extended ECC information that is part of the extended parameter
|
||||
page to retrieve the ECC requirements for this device.
|
||||
|
||||
This patch implement the reading of the Extended Parameter Page, and parses
|
||||
the sections for ECC type, and get the ECC info from the ECC section.
|
||||
|
||||
Tested this patch with Micron MT29F64G08CBABAWP.
|
||||
|
||||
Acked-by: Pekon Gupta <pekon@ti.com>
|
||||
Signed-off-by: Huang Shijie <b32955@freescale.com>
|
||||
Reviewed-and-tested-by: Brian Norris <computersforpeace@gmail.com>
|
||||
Signed-off-by: Brian Norris <computersforpeace@gmail.com>
|
||||
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
|
||||
---
|
||||
drivers/mtd/nand/nand_base.c | 87 ++++++++++++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 87 insertions(+)
|
||||
|
||||
--- a/drivers/mtd/nand/nand_base.c
|
||||
+++ b/drivers/mtd/nand/nand_base.c
|
||||
@@ -2848,6 +2848,78 @@ static u16 onfi_crc16(u16 crc, u8 const
|
||||
return crc;
|
||||
}
|
||||
|
||||
+/* Parse the Extended Parameter Page. */
|
||||
+static int nand_flash_detect_ext_param_page(struct mtd_info *mtd,
|
||||
+ struct nand_chip *chip, struct nand_onfi_params *p)
|
||||
+{
|
||||
+ struct onfi_ext_param_page *ep;
|
||||
+ struct onfi_ext_section *s;
|
||||
+ struct onfi_ext_ecc_info *ecc;
|
||||
+ uint8_t *cursor;
|
||||
+ int ret = -EINVAL;
|
||||
+ int len;
|
||||
+ int i;
|
||||
+
|
||||
+ len = le16_to_cpu(p->ext_param_page_length) * 16;
|
||||
+ ep = kmalloc(len, GFP_KERNEL);
|
||||
+ if (!ep) {
|
||||
+ ret = -ENOMEM;
|
||||
+ goto ext_out;
|
||||
+ }
|
||||
+
|
||||
+ /* Send our own NAND_CMD_PARAM. */
|
||||
+ chip->cmdfunc(mtd, NAND_CMD_PARAM, 0, -1);
|
||||
+
|
||||
+ /* Use the Change Read Column command to skip the ONFI param pages. */
|
||||
+ chip->cmdfunc(mtd, NAND_CMD_RNDOUT,
|
||||
+ sizeof(*p) * p->num_of_param_pages , -1);
|
||||
+
|
||||
+ /* Read out the Extended Parameter Page. */
|
||||
+ chip->read_buf(mtd, (uint8_t *)ep, len);
|
||||
+ if ((onfi_crc16(ONFI_CRC_BASE, ((uint8_t *)ep) + 2, len - 2)
|
||||
+ != le16_to_cpu(ep->crc))) {
|
||||
+ pr_debug("fail in the CRC.\n");
|
||||
+ goto ext_out;
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
+ * Check the signature.
|
||||
+ * Do not strictly follow the ONFI spec, maybe changed in future.
|
||||
+ */
|
||||
+ if (strncmp(ep->sig, "EPPS", 4)) {
|
||||
+ pr_debug("The signature is invalid.\n");
|
||||
+ goto ext_out;
|
||||
+ }
|
||||
+
|
||||
+ /* find the ECC section. */
|
||||
+ cursor = (uint8_t *)(ep + 1);
|
||||
+ for (i = 0; i < ONFI_EXT_SECTION_MAX; i++) {
|
||||
+ s = ep->sections + i;
|
||||
+ if (s->type == ONFI_SECTION_TYPE_2)
|
||||
+ break;
|
||||
+ cursor += s->length * 16;
|
||||
+ }
|
||||
+ if (i == ONFI_EXT_SECTION_MAX) {
|
||||
+ pr_debug("We can not find the ECC section.\n");
|
||||
+ goto ext_out;
|
||||
+ }
|
||||
+
|
||||
+ /* get the info we want. */
|
||||
+ ecc = (struct onfi_ext_ecc_info *)cursor;
|
||||
+
|
||||
+ if (ecc->codeword_size) {
|
||||
+ chip->ecc_strength_ds = ecc->ecc_bits;
|
||||
+ chip->ecc_step_ds = 1 << ecc->codeword_size;
|
||||
+ }
|
||||
+
|
||||
+ pr_info("ONFI extended param page detected.\n");
|
||||
+ return 0;
|
||||
+
|
||||
+ext_out:
|
||||
+ kfree(ep);
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
/*
|
||||
* Check if the NAND chip is ONFI compliant, returns 1 if it is, 0 otherwise.
|
||||
*/
|
||||
@@ -2927,6 +2999,21 @@ static int nand_flash_detect_onfi(struct
|
||||
if (p->ecc_bits != 0xff) {
|
||||
chip->ecc_strength_ds = p->ecc_bits;
|
||||
chip->ecc_step_ds = 512;
|
||||
+ } else if (chip->onfi_version >= 21 &&
|
||||
+ (onfi_feature(chip) & ONFI_FEATURE_EXT_PARAM_PAGE)) {
|
||||
+
|
||||
+ /*
|
||||
+ * The nand_flash_detect_ext_param_page() uses the
|
||||
+ * Change Read Column command which maybe not supported
|
||||
+ * by the chip->cmdfunc. So try to update the chip->cmdfunc
|
||||
+ * now. We do not replace user supplied command function.
|
||||
+ */
|
||||
+ if (mtd->writesize > 512 && chip->cmdfunc == nand_command)
|
||||
+ chip->cmdfunc = nand_command_lp;
|
||||
+
|
||||
+ /* The Extended Parameter Page is supported since ONFI 2.1. */
|
||||
+ if (nand_flash_detect_ext_param_page(mtd, chip, p))
|
||||
+ pr_info("Failed to detect the extended param page.\n");
|
||||
}
|
||||
|
||||
pr_info("ONFI flash detected\n");
|
|
@ -1,51 +0,0 @@
|
|||
From 5d15281ca712cb873835e301937f3a8342e88d4b Mon Sep 17 00:00:00 2001
|
||||
From: Brian Norris <computersforpeace@gmail.com>
|
||||
Date: Mon, 16 Sep 2013 17:59:20 -0700
|
||||
Subject: [PATCH 095/203] mtd: nand: fix memory leak in ONFI extended parameter
|
||||
page
|
||||
|
||||
This fixes a memory leak in the ONFI support code for detecting the
|
||||
required ECC levels from this commit:
|
||||
|
||||
commit 6dcbe0cdd83fb5f77be4f44c9e06c535281c375a
|
||||
Author: Huang Shijie <b32955@freescale.com>
|
||||
Date: Wed May 22 10:28:27 2013 +0800
|
||||
|
||||
mtd: get the ECC info from the Extended Parameter Page
|
||||
|
||||
In the success case, we never freed the 'ep' buffer.
|
||||
|
||||
Also, this fixes an oversight in the same commit where we (harmlessly)
|
||||
freed the NULL pointer.
|
||||
|
||||
Signed-off-by: Brian Norris <computersforpeace@gmail.com>
|
||||
Acked-by: Huang Shijie <b32955@freescale.com>
|
||||
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
|
||||
---
|
||||
drivers/mtd/nand/nand_base.c | 8 +++-----
|
||||
1 file changed, 3 insertions(+), 5 deletions(-)
|
||||
|
||||
--- a/drivers/mtd/nand/nand_base.c
|
||||
+++ b/drivers/mtd/nand/nand_base.c
|
||||
@@ -2862,10 +2862,8 @@ static int nand_flash_detect_ext_param_p
|
||||
|
||||
len = le16_to_cpu(p->ext_param_page_length) * 16;
|
||||
ep = kmalloc(len, GFP_KERNEL);
|
||||
- if (!ep) {
|
||||
- ret = -ENOMEM;
|
||||
- goto ext_out;
|
||||
- }
|
||||
+ if (!ep)
|
||||
+ return -ENOMEM;
|
||||
|
||||
/* Send our own NAND_CMD_PARAM. */
|
||||
chip->cmdfunc(mtd, NAND_CMD_PARAM, 0, -1);
|
||||
@@ -2913,7 +2911,7 @@ static int nand_flash_detect_ext_param_p
|
||||
}
|
||||
|
||||
pr_info("ONFI extended param page detected.\n");
|
||||
- return 0;
|
||||
+ ret = 0;
|
||||
|
||||
ext_out:
|
||||
kfree(ep);
|
|
@ -1,273 +0,0 @@
|
|||
From ac8294dfb4085f3193bec27673062e5ad63d770a Mon Sep 17 00:00:00 2001
|
||||
From: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Date: Thu, 26 Sep 2013 16:35:27 -0300
|
||||
Subject: [PATCH 096/203] clk: mvebu: Add Core Divider clock
|
||||
|
||||
This commit introduces a new group of clocks present in Armada 370/XP
|
||||
SoCs (called "Core Divider" clocks) and add a provider for them.
|
||||
The only clock supported for now is the NAND clock (ndclk), but the
|
||||
infrastructure to add the rest is already set.
|
||||
|
||||
Reviewed-by: Gregory CLEMENT <gregory.clement@free-electrons.com>
|
||||
Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Signed-off-by: Mike Turquette <mturquette@linaro.org>
|
||||
---
|
||||
arch/arm/mach-mvebu/Kconfig | 1 +
|
||||
drivers/clk/mvebu/Kconfig | 3 +
|
||||
drivers/clk/mvebu/Makefile | 1 +
|
||||
drivers/clk/mvebu/clk-corediv.c | 223 ++++++++++++++++++++++++++++++++++++++++
|
||||
4 files changed, 228 insertions(+)
|
||||
create mode 100644 drivers/clk/mvebu/clk-corediv.c
|
||||
|
||||
--- a/arch/arm/mach-mvebu/Kconfig
|
||||
+++ b/arch/arm/mach-mvebu/Kconfig
|
||||
@@ -13,6 +13,7 @@ config ARCH_MVEBU
|
||||
select MVEBU_CLK_CORE
|
||||
select MVEBU_CLK_CPU
|
||||
select MVEBU_CLK_GATING
|
||||
+ select MVEBU_CLK_COREDIV
|
||||
select MVEBU_MBUS
|
||||
select ZONE_DMA if ARM_LPAE
|
||||
select ARCH_REQUIRE_GPIOLIB
|
||||
--- a/drivers/clk/mvebu/Kconfig
|
||||
+++ b/drivers/clk/mvebu/Kconfig
|
||||
@@ -6,3 +6,6 @@ config MVEBU_CLK_CPU
|
||||
|
||||
config MVEBU_CLK_GATING
|
||||
bool
|
||||
+
|
||||
+config MVEBU_CLK_COREDIV
|
||||
+ bool
|
||||
--- a/drivers/clk/mvebu/Makefile
|
||||
+++ b/drivers/clk/mvebu/Makefile
|
||||
@@ -1,3 +1,4 @@
|
||||
obj-$(CONFIG_MVEBU_CLK_CORE) += clk.o clk-core.o
|
||||
obj-$(CONFIG_MVEBU_CLK_CPU) += clk-cpu.o
|
||||
obj-$(CONFIG_MVEBU_CLK_GATING) += clk-gating-ctrl.o
|
||||
+obj-$(CONFIG_MVEBU_CLK_COREDIV) += clk-corediv.o
|
||||
--- /dev/null
|
||||
+++ b/drivers/clk/mvebu/clk-corediv.c
|
||||
@@ -0,0 +1,223 @@
|
||||
+/*
|
||||
+ * MVEBU Core divider clock
|
||||
+ *
|
||||
+ * Copyright (C) 2013 Marvell
|
||||
+ *
|
||||
+ * Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
+ *
|
||||
+ * This file is licensed under the terms of the GNU General Public
|
||||
+ * License version 2. This program is licensed "as is" without any
|
||||
+ * warranty of any kind, whether express or implied.
|
||||
+ */
|
||||
+
|
||||
+#include <linux/kernel.h>
|
||||
+#include <linux/clk-provider.h>
|
||||
+#include <linux/of_address.h>
|
||||
+#include <linux/slab.h>
|
||||
+#include <linux/delay.h>
|
||||
+#include <asm/io.h>
|
||||
+
|
||||
+#define CORE_CLK_DIV_RATIO_MASK 0xff
|
||||
+#define CORE_CLK_DIV_RATIO_RELOAD BIT(8)
|
||||
+#define CORE_CLK_DIV_ENABLE_OFFSET 24
|
||||
+#define CORE_CLK_DIV_RATIO_OFFSET 0x8
|
||||
+
|
||||
+struct clk_corediv_desc {
|
||||
+ unsigned int mask;
|
||||
+ unsigned int offset;
|
||||
+ unsigned int fieldbit;
|
||||
+};
|
||||
+
|
||||
+struct clk_corediv {
|
||||
+ struct clk_hw hw;
|
||||
+ void __iomem *reg;
|
||||
+ struct clk_corediv_desc desc;
|
||||
+ spinlock_t lock;
|
||||
+};
|
||||
+
|
||||
+static struct clk_onecell_data clk_data;
|
||||
+
|
||||
+static const struct clk_corediv_desc mvebu_corediv_desc[] __initconst = {
|
||||
+ { .mask = 0x3f, .offset = 8, .fieldbit = 1 }, /* NAND clock */
|
||||
+};
|
||||
+
|
||||
+#define to_corediv_clk(p) container_of(p, struct clk_corediv, hw)
|
||||
+
|
||||
+static int clk_corediv_is_enabled(struct clk_hw *hwclk)
|
||||
+{
|
||||
+ struct clk_corediv *corediv = to_corediv_clk(hwclk);
|
||||
+ struct clk_corediv_desc *desc = &corediv->desc;
|
||||
+ u32 enable_mask = BIT(desc->fieldbit) << CORE_CLK_DIV_ENABLE_OFFSET;
|
||||
+
|
||||
+ return !!(readl(corediv->reg) & enable_mask);
|
||||
+}
|
||||
+
|
||||
+static int clk_corediv_enable(struct clk_hw *hwclk)
|
||||
+{
|
||||
+ struct clk_corediv *corediv = to_corediv_clk(hwclk);
|
||||
+ struct clk_corediv_desc *desc = &corediv->desc;
|
||||
+ unsigned long flags = 0;
|
||||
+ u32 reg;
|
||||
+
|
||||
+ spin_lock_irqsave(&corediv->lock, flags);
|
||||
+
|
||||
+ reg = readl(corediv->reg);
|
||||
+ reg |= (BIT(desc->fieldbit) << CORE_CLK_DIV_ENABLE_OFFSET);
|
||||
+ writel(reg, corediv->reg);
|
||||
+
|
||||
+ spin_unlock_irqrestore(&corediv->lock, flags);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static void clk_corediv_disable(struct clk_hw *hwclk)
|
||||
+{
|
||||
+ struct clk_corediv *corediv = to_corediv_clk(hwclk);
|
||||
+ struct clk_corediv_desc *desc = &corediv->desc;
|
||||
+ unsigned long flags = 0;
|
||||
+ u32 reg;
|
||||
+
|
||||
+ spin_lock_irqsave(&corediv->lock, flags);
|
||||
+
|
||||
+ reg = readl(corediv->reg);
|
||||
+ reg &= ~(BIT(desc->fieldbit) << CORE_CLK_DIV_ENABLE_OFFSET);
|
||||
+ writel(reg, corediv->reg);
|
||||
+
|
||||
+ spin_unlock_irqrestore(&corediv->lock, flags);
|
||||
+}
|
||||
+
|
||||
+static unsigned long clk_corediv_recalc_rate(struct clk_hw *hwclk,
|
||||
+ unsigned long parent_rate)
|
||||
+{
|
||||
+ struct clk_corediv *corediv = to_corediv_clk(hwclk);
|
||||
+ struct clk_corediv_desc *desc = &corediv->desc;
|
||||
+ u32 reg, div;
|
||||
+
|
||||
+ reg = readl(corediv->reg + CORE_CLK_DIV_RATIO_OFFSET);
|
||||
+ div = (reg >> desc->offset) & desc->mask;
|
||||
+ return parent_rate / div;
|
||||
+}
|
||||
+
|
||||
+static long clk_corediv_round_rate(struct clk_hw *hwclk, unsigned long rate,
|
||||
+ unsigned long *parent_rate)
|
||||
+{
|
||||
+ /* Valid ratio are 1:4, 1:5, 1:6 and 1:8 */
|
||||
+ u32 div;
|
||||
+
|
||||
+ div = *parent_rate / rate;
|
||||
+ if (div < 4)
|
||||
+ div = 4;
|
||||
+ else if (div > 6)
|
||||
+ div = 8;
|
||||
+
|
||||
+ return *parent_rate / div;
|
||||
+}
|
||||
+
|
||||
+static int clk_corediv_set_rate(struct clk_hw *hwclk, unsigned long rate,
|
||||
+ unsigned long parent_rate)
|
||||
+{
|
||||
+ struct clk_corediv *corediv = to_corediv_clk(hwclk);
|
||||
+ struct clk_corediv_desc *desc = &corediv->desc;
|
||||
+ unsigned long flags = 0;
|
||||
+ u32 reg, div;
|
||||
+
|
||||
+ div = parent_rate / rate;
|
||||
+
|
||||
+ spin_lock_irqsave(&corediv->lock, flags);
|
||||
+
|
||||
+ /* Write new divider to the divider ratio register */
|
||||
+ reg = readl(corediv->reg + CORE_CLK_DIV_RATIO_OFFSET);
|
||||
+ reg &= ~(desc->mask << desc->offset);
|
||||
+ reg |= (div & desc->mask) << desc->offset;
|
||||
+ writel(reg, corediv->reg + CORE_CLK_DIV_RATIO_OFFSET);
|
||||
+
|
||||
+ /* Set reload-force for this clock */
|
||||
+ reg = readl(corediv->reg) | BIT(desc->fieldbit);
|
||||
+ writel(reg, corediv->reg);
|
||||
+
|
||||
+ /* Now trigger the clock update */
|
||||
+ reg = readl(corediv->reg) | CORE_CLK_DIV_RATIO_RELOAD;
|
||||
+ writel(reg, corediv->reg);
|
||||
+
|
||||
+ /*
|
||||
+ * Wait for clocks to settle down, and then clear all the
|
||||
+ * ratios request and the reload request.
|
||||
+ */
|
||||
+ udelay(1000);
|
||||
+ reg &= ~(CORE_CLK_DIV_RATIO_MASK | CORE_CLK_DIV_RATIO_RELOAD);
|
||||
+ writel(reg, corediv->reg);
|
||||
+ udelay(1000);
|
||||
+
|
||||
+ spin_unlock_irqrestore(&corediv->lock, flags);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static const struct clk_ops corediv_ops = {
|
||||
+ .enable = clk_corediv_enable,
|
||||
+ .disable = clk_corediv_disable,
|
||||
+ .is_enabled = clk_corediv_is_enabled,
|
||||
+ .recalc_rate = clk_corediv_recalc_rate,
|
||||
+ .round_rate = clk_corediv_round_rate,
|
||||
+ .set_rate = clk_corediv_set_rate,
|
||||
+};
|
||||
+
|
||||
+static void __init mvebu_corediv_clk_init(struct device_node *node)
|
||||
+{
|
||||
+ struct clk_init_data init;
|
||||
+ struct clk_corediv *corediv;
|
||||
+ struct clk **clks;
|
||||
+ void __iomem *base;
|
||||
+ const char *parent_name;
|
||||
+ const char *clk_name;
|
||||
+ int i;
|
||||
+
|
||||
+ base = of_iomap(node, 0);
|
||||
+ if (WARN_ON(!base))
|
||||
+ return;
|
||||
+
|
||||
+ parent_name = of_clk_get_parent_name(node, 0);
|
||||
+
|
||||
+ clk_data.clk_num = ARRAY_SIZE(mvebu_corediv_desc);
|
||||
+
|
||||
+ /* clks holds the clock array */
|
||||
+ clks = kcalloc(clk_data.clk_num, sizeof(struct clk *),
|
||||
+ GFP_KERNEL);
|
||||
+ if (WARN_ON(!clks))
|
||||
+ goto err_unmap;
|
||||
+ /* corediv holds the clock specific array */
|
||||
+ corediv = kcalloc(clk_data.clk_num, sizeof(struct clk_corediv),
|
||||
+ GFP_KERNEL);
|
||||
+ if (WARN_ON(!corediv))
|
||||
+ goto err_free_clks;
|
||||
+
|
||||
+ spin_lock_init(&corediv->lock);
|
||||
+
|
||||
+ for (i = 0; i < clk_data.clk_num; i++) {
|
||||
+ of_property_read_string_index(node, "clock-output-names",
|
||||
+ i, &clk_name);
|
||||
+ init.num_parents = 1;
|
||||
+ init.parent_names = &parent_name;
|
||||
+ init.name = clk_name;
|
||||
+ init.ops = &corediv_ops;
|
||||
+ init.flags = 0;
|
||||
+
|
||||
+ corediv[i].desc = mvebu_corediv_desc[i];
|
||||
+ corediv[i].reg = base;
|
||||
+ corediv[i].hw.init = &init;
|
||||
+
|
||||
+ clks[i] = clk_register(NULL, &corediv[i].hw);
|
||||
+ WARN_ON(IS_ERR(clks[i]));
|
||||
+ }
|
||||
+
|
||||
+ clk_data.clks = clks;
|
||||
+ of_clk_add_provider(node, of_clk_src_onecell_get, &clk_data);
|
||||
+ return;
|
||||
+
|
||||
+err_free_clks:
|
||||
+ kfree(clks);
|
||||
+err_unmap:
|
||||
+ iounmap(base);
|
||||
+}
|
||||
+CLK_OF_DECLARE(mvebu_corediv_clk, "marvell,armada-370-corediv-clock",
|
||||
+ mvebu_corediv_clk_init);
|
|
@ -1,32 +0,0 @@
|
|||
From 455ad812cb2ec97339f780e2a79169620f1e7485 Mon Sep 17 00:00:00 2001
|
||||
From: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Date: Fri, 18 Oct 2013 20:02:30 -0300
|
||||
Subject: [PATCH 097/203] ARM: mvebu: Add a 2 GHz fixed-clock Armada 370/XP
|
||||
|
||||
Armada 370/XP SoCs have a 2 GHz fixed PLL that is used to feed
|
||||
other clocks. This commit adds a DT representation of this clock
|
||||
through a fixed-clock compatible node.
|
||||
|
||||
Reviewed-by: Gregory CLEMENT <gregory.clement@free-electrons.com>
|
||||
Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Signed-off-by: Jason Cooper <jason@lakedaemon.net>
|
||||
---
|
||||
arch/arm/boot/dts/armada-370-xp.dtsi | 9 +++++++++
|
||||
1 file changed, 9 insertions(+)
|
||||
|
||||
--- a/arch/arm/boot/dts/armada-370-xp.dtsi
|
||||
+++ b/arch/arm/boot/dts/armada-370-xp.dtsi
|
||||
@@ -251,4 +251,13 @@
|
||||
|
||||
};
|
||||
};
|
||||
+
|
||||
+ clocks {
|
||||
+ /* 2 GHz fixed main PLL */
|
||||
+ mainpll: mainpll {
|
||||
+ compatible = "fixed-clock";
|
||||
+ #clock-cells = <0>;
|
||||
+ clock-frequency = <2000000000>;
|
||||
+ };
|
||||
+ };
|
||||
};
|
|
@ -1,33 +0,0 @@
|
|||
From 408b807592d9cdbc1a69b119f4a862b2ab1e4d87 Mon Sep 17 00:00:00 2001
|
||||
From: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Date: Fri, 18 Oct 2013 20:02:31 -0300
|
||||
Subject: [PATCH 098/203] ARM: mvebu: Add the core-divider clock to Armada
|
||||
370/XP
|
||||
|
||||
The Armada 370/XP SoC has a clock provider called "Core Divider",
|
||||
that is derived from a fixed 2 GHz PLL clock.
|
||||
|
||||
Reviewed-by: Gregory CLEMENT <gregory.clement@free-electrons.com>
|
||||
Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Signed-off-by: Jason Cooper <jason@lakedaemon.net>
|
||||
---
|
||||
arch/arm/boot/dts/armada-370-xp.dtsi | 8 ++++++++
|
||||
1 file changed, 8 insertions(+)
|
||||
|
||||
--- a/arch/arm/boot/dts/armada-370-xp.dtsi
|
||||
+++ b/arch/arm/boot/dts/armada-370-xp.dtsi
|
||||
@@ -134,6 +134,14 @@
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
+ coredivclk: corediv-clock@18740 {
|
||||
+ compatible = "marvell,armada-370-corediv-clock";
|
||||
+ reg = <0x18740 0xc>;
|
||||
+ #clock-cells = <1>;
|
||||
+ clocks = <&mainpll>;
|
||||
+ clock-output-names = "nand";
|
||||
+ };
|
||||
+
|
||||
timer@20300 {
|
||||
compatible = "marvell,armada-370-xp-timer";
|
||||
reg = <0x20300 0x30>, <0x21040 0x30>;
|
|
@ -1,34 +0,0 @@
|
|||
From 64356fe97302ad842d9871a5a4411d8b41127f59 Mon Sep 17 00:00:00 2001
|
||||
From: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Date: Thu, 7 Nov 2013 12:17:33 -0300
|
||||
Subject: [PATCH 099/203] ARM: mvebu: Add support for NAND controller in Armada
|
||||
370/XP
|
||||
|
||||
The Armada 370 and Armada XP SoC have a NAND controller (aka NFCv2).
|
||||
This commit adds support for it in Armada 370 and Armada XP SoC
|
||||
common devicetree.
|
||||
|
||||
Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Signed-off-by: Jason Cooper <jason@lakedaemon.net>
|
||||
---
|
||||
arch/arm/boot/dts/armada-370-xp.dtsi | 9 +++++++++
|
||||
1 file changed, 9 insertions(+)
|
||||
|
||||
--- a/arch/arm/boot/dts/armada-370-xp.dtsi
|
||||
+++ b/arch/arm/boot/dts/armada-370-xp.dtsi
|
||||
@@ -257,6 +257,15 @@
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
+ nand@d0000 {
|
||||
+ compatible = "marvell,armada370-nand";
|
||||
+ reg = <0xd0000 0x54>;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+ interrupts = <113>;
|
||||
+ clocks = <&coredivclk 0>;
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
};
|
||||
};
|
||||
|
|
@ -1,36 +0,0 @@
|
|||
From 9226a0bb330bb83df9a465ba418efd3277cd00d3 Mon Sep 17 00:00:00 2001
|
||||
From: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Date: Thu, 7 Nov 2013 12:17:34 -0300
|
||||
Subject: [PATCH 100/203] ARM: mvebu: Enable NAND controller in Armada XP GP
|
||||
board
|
||||
|
||||
The Armada XP GP board has a NAND flash, so enable it in the devicetree.
|
||||
|
||||
In order to skip the driver's custom device detection and use only ONFI
|
||||
detection, the "marvell,keep-config" parameter is used.
|
||||
This is needed because we haven't support for setting the timings
|
||||
parameters yet and must rely in bootloader's.
|
||||
|
||||
Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Signed-off-by: Jason Cooper <jason@lakedaemon.net>
|
||||
---
|
||||
arch/arm/boot/dts/armada-xp-gp.dts | 8 ++++++++
|
||||
1 file changed, 8 insertions(+)
|
||||
|
||||
--- a/arch/arm/boot/dts/armada-xp-gp.dts
|
||||
+++ b/arch/arm/boot/dts/armada-xp-gp.dts
|
||||
@@ -175,6 +175,14 @@
|
||||
spi-max-frequency = <108000000>;
|
||||
};
|
||||
};
|
||||
+
|
||||
+ nand@d0000 {
|
||||
+ status = "okay";
|
||||
+ num-cs = <1>;
|
||||
+ marvell,nand-keep-config;
|
||||
+ marvell,nand-enable-arbiter;
|
||||
+ nand-on-flash-bbt;
|
||||
+ };
|
||||
};
|
||||
};
|
||||
};
|
|
@ -1,60 +0,0 @@
|
|||
From 271ef48cf11b86ab666582051fed3bdb13681e64 Mon Sep 17 00:00:00 2001
|
||||
From: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Date: Wed, 17 Apr 2013 13:38:09 -0300
|
||||
Subject: [PATCH 101/203] mtd: nand: pxa3xx: Use devm_kzalloc
|
||||
|
||||
Replace regular kzalloc with managed devm_kzalloc
|
||||
which simplifies the error path.
|
||||
|
||||
Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com>
|
||||
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
|
||||
---
|
||||
drivers/mtd/nand/pxa3xx_nand.c | 14 ++++----------
|
||||
1 file changed, 4 insertions(+), 10 deletions(-)
|
||||
|
||||
--- a/drivers/mtd/nand/pxa3xx_nand.c
|
||||
+++ b/drivers/mtd/nand/pxa3xx_nand.c
|
||||
@@ -1035,12 +1035,10 @@ static int alloc_nand_resource(struct pl
|
||||
int ret, irq, cs;
|
||||
|
||||
pdata = pdev->dev.platform_data;
|
||||
- info = kzalloc(sizeof(*info) + (sizeof(*mtd) +
|
||||
- sizeof(*host)) * pdata->num_cs, GFP_KERNEL);
|
||||
- if (!info) {
|
||||
- dev_err(&pdev->dev, "failed to allocate memory\n");
|
||||
+ info = devm_kzalloc(&pdev->dev, sizeof(*info) + (sizeof(*mtd) +
|
||||
+ sizeof(*host)) * pdata->num_cs, GFP_KERNEL);
|
||||
+ if (!info)
|
||||
return -ENOMEM;
|
||||
- }
|
||||
|
||||
info->pdev = pdev;
|
||||
for (cs = 0; cs < pdata->num_cs; cs++) {
|
||||
@@ -1072,8 +1070,7 @@ static int alloc_nand_resource(struct pl
|
||||
info->clk = clk_get(&pdev->dev, NULL);
|
||||
if (IS_ERR(info->clk)) {
|
||||
dev_err(&pdev->dev, "failed to get nand clock\n");
|
||||
- ret = PTR_ERR(info->clk);
|
||||
- goto fail_free_mtd;
|
||||
+ return PTR_ERR(info->clk);
|
||||
}
|
||||
clk_enable(info->clk);
|
||||
|
||||
@@ -1165,8 +1162,6 @@ fail_free_res:
|
||||
fail_put_clk:
|
||||
clk_disable(info->clk);
|
||||
clk_put(info->clk);
|
||||
-fail_free_mtd:
|
||||
- kfree(info);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -1202,7 +1197,6 @@ static int pxa3xx_nand_remove(struct pla
|
||||
|
||||
for (cs = 0; cs < pdata->num_cs; cs++)
|
||||
nand_release(info->host[cs]->mtd);
|
||||
- kfree(info);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1,82 +0,0 @@
|
|||
From 5c461327aca8975276d2480ddf02b6c7f0a29548 Mon Sep 17 00:00:00 2001
|
||||
From: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Date: Wed, 17 Apr 2013 13:38:10 -0300
|
||||
Subject: [PATCH 102/203] mtd: nand: pxa3xx: Use devm_ioremap_resource
|
||||
|
||||
Using the new devm_ioremap_resource() we can greatly
|
||||
simplify resource handling.
|
||||
|
||||
Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com>
|
||||
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
|
||||
---
|
||||
drivers/mtd/nand/pxa3xx_nand.c | 31 ++++---------------------------
|
||||
1 file changed, 4 insertions(+), 27 deletions(-)
|
||||
|
||||
--- a/drivers/mtd/nand/pxa3xx_nand.c
|
||||
+++ b/drivers/mtd/nand/pxa3xx_nand.c
|
||||
@@ -1108,30 +1108,16 @@ static int alloc_nand_resource(struct pl
|
||||
}
|
||||
|
||||
r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
- if (r == NULL) {
|
||||
- dev_err(&pdev->dev, "no IO memory resource defined\n");
|
||||
- ret = -ENODEV;
|
||||
+ info->mmio_base = devm_ioremap_resource(&pdev->dev, r);
|
||||
+ if (IS_ERR(info->mmio_base)) {
|
||||
+ ret = PTR_ERR(info->mmio_base);
|
||||
goto fail_put_clk;
|
||||
}
|
||||
-
|
||||
- r = request_mem_region(r->start, resource_size(r), pdev->name);
|
||||
- if (r == NULL) {
|
||||
- dev_err(&pdev->dev, "failed to request memory resource\n");
|
||||
- ret = -EBUSY;
|
||||
- goto fail_put_clk;
|
||||
- }
|
||||
-
|
||||
- info->mmio_base = ioremap(r->start, resource_size(r));
|
||||
- if (info->mmio_base == NULL) {
|
||||
- dev_err(&pdev->dev, "ioremap() failed\n");
|
||||
- ret = -ENODEV;
|
||||
- goto fail_free_res;
|
||||
- }
|
||||
info->mmio_phys = r->start;
|
||||
|
||||
ret = pxa3xx_nand_init_buff(info);
|
||||
if (ret)
|
||||
- goto fail_free_io;
|
||||
+ goto fail_put_clk;
|
||||
|
||||
/* initialize all interrupts to be disabled */
|
||||
disable_int(info, NDSR_MASK);
|
||||
@@ -1155,10 +1141,6 @@ fail_free_buf:
|
||||
info->data_buff, info->data_buff_phys);
|
||||
} else
|
||||
kfree(info->data_buff);
|
||||
-fail_free_io:
|
||||
- iounmap(info->mmio_base);
|
||||
-fail_free_res:
|
||||
- release_mem_region(r->start, resource_size(r));
|
||||
fail_put_clk:
|
||||
clk_disable(info->clk);
|
||||
clk_put(info->clk);
|
||||
@@ -1169,7 +1151,6 @@ static int pxa3xx_nand_remove(struct pla
|
||||
{
|
||||
struct pxa3xx_nand_info *info = platform_get_drvdata(pdev);
|
||||
struct pxa3xx_nand_platform_data *pdata;
|
||||
- struct resource *r;
|
||||
int irq, cs;
|
||||
|
||||
if (!info)
|
||||
@@ -1188,10 +1169,6 @@ static int pxa3xx_nand_remove(struct pla
|
||||
} else
|
||||
kfree(info->data_buff);
|
||||
|
||||
- iounmap(info->mmio_base);
|
||||
- r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
- release_mem_region(r->start, resource_size(r));
|
||||
-
|
||||
clk_disable(info->clk);
|
||||
clk_put(info->clk);
|
||||
|
|
@ -1,87 +0,0 @@
|
|||
From 4ff9eea8b6841bb8be7becba9713a0ce7c82da9d Mon Sep 17 00:00:00 2001
|
||||
From: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Date: Wed, 17 Apr 2013 13:38:11 -0300
|
||||
Subject: [PATCH 103/203] mtd: nand: pxa3xx: Use devm_clk_get
|
||||
|
||||
Replacing clk_get by managed devm_clk_get, the error path
|
||||
can be greatly simplified.
|
||||
|
||||
Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com>
|
||||
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
|
||||
---
|
||||
drivers/mtd/nand/pxa3xx_nand.c | 16 +++++++---------
|
||||
1 file changed, 7 insertions(+), 9 deletions(-)
|
||||
|
||||
--- a/drivers/mtd/nand/pxa3xx_nand.c
|
||||
+++ b/drivers/mtd/nand/pxa3xx_nand.c
|
||||
@@ -1067,7 +1067,7 @@ static int alloc_nand_resource(struct pl
|
||||
|
||||
spin_lock_init(&chip->controller->lock);
|
||||
init_waitqueue_head(&chip->controller->wq);
|
||||
- info->clk = clk_get(&pdev->dev, NULL);
|
||||
+ info->clk = devm_clk_get(&pdev->dev, NULL);
|
||||
if (IS_ERR(info->clk)) {
|
||||
dev_err(&pdev->dev, "failed to get nand clock\n");
|
||||
return PTR_ERR(info->clk);
|
||||
@@ -1087,7 +1087,7 @@ static int alloc_nand_resource(struct pl
|
||||
if (r == NULL) {
|
||||
dev_err(&pdev->dev, "no resource defined for data DMA\n");
|
||||
ret = -ENXIO;
|
||||
- goto fail_put_clk;
|
||||
+ goto fail_disable_clk;
|
||||
}
|
||||
info->drcmr_dat = r->start;
|
||||
|
||||
@@ -1095,7 +1095,7 @@ static int alloc_nand_resource(struct pl
|
||||
if (r == NULL) {
|
||||
dev_err(&pdev->dev, "no resource defined for command DMA\n");
|
||||
ret = -ENXIO;
|
||||
- goto fail_put_clk;
|
||||
+ goto fail_disable_clk;
|
||||
}
|
||||
info->drcmr_cmd = r->start;
|
||||
}
|
||||
@@ -1104,20 +1104,20 @@ static int alloc_nand_resource(struct pl
|
||||
if (irq < 0) {
|
||||
dev_err(&pdev->dev, "no IRQ resource defined\n");
|
||||
ret = -ENXIO;
|
||||
- goto fail_put_clk;
|
||||
+ goto fail_disable_clk;
|
||||
}
|
||||
|
||||
r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
info->mmio_base = devm_ioremap_resource(&pdev->dev, r);
|
||||
if (IS_ERR(info->mmio_base)) {
|
||||
ret = PTR_ERR(info->mmio_base);
|
||||
- goto fail_put_clk;
|
||||
+ goto fail_disable_clk;
|
||||
}
|
||||
info->mmio_phys = r->start;
|
||||
|
||||
ret = pxa3xx_nand_init_buff(info);
|
||||
if (ret)
|
||||
- goto fail_put_clk;
|
||||
+ goto fail_disable_clk;
|
||||
|
||||
/* initialize all interrupts to be disabled */
|
||||
disable_int(info, NDSR_MASK);
|
||||
@@ -1141,9 +1141,8 @@ fail_free_buf:
|
||||
info->data_buff, info->data_buff_phys);
|
||||
} else
|
||||
kfree(info->data_buff);
|
||||
-fail_put_clk:
|
||||
+fail_disable_clk:
|
||||
clk_disable(info->clk);
|
||||
- clk_put(info->clk);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -1170,7 +1169,6 @@ static int pxa3xx_nand_remove(struct pla
|
||||
kfree(info->data_buff);
|
||||
|
||||
clk_disable(info->clk);
|
||||
- clk_put(info->clk);
|
||||
|
||||
for (cs = 0; cs < pdata->num_cs; cs++)
|
||||
nand_release(info->host[cs]->mtd);
|
|
@ -1,45 +0,0 @@
|
|||
From e9274ba8dd0c93f12c0fd5896e11f754aa700baf Mon Sep 17 00:00:00 2001
|
||||
From: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Date: Wed, 17 Apr 2013 13:38:12 -0300
|
||||
Subject: [PATCH 104/203] mtd: nand: pxa3xx: Use clk_prepare_enable and
|
||||
clk_disable_unprepare
|
||||
|
||||
This patch converts the module to use clk_prepare_enable and
|
||||
clk_disable_unprepare variants as required by common clock framework.
|
||||
|
||||
Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com>
|
||||
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
|
||||
---
|
||||
drivers/mtd/nand/pxa3xx_nand.c | 6 +++---
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/mtd/nand/pxa3xx_nand.c
|
||||
+++ b/drivers/mtd/nand/pxa3xx_nand.c
|
||||
@@ -1072,7 +1072,7 @@ static int alloc_nand_resource(struct pl
|
||||
dev_err(&pdev->dev, "failed to get nand clock\n");
|
||||
return PTR_ERR(info->clk);
|
||||
}
|
||||
- clk_enable(info->clk);
|
||||
+ clk_prepare_enable(info->clk);
|
||||
|
||||
/*
|
||||
* This is a dirty hack to make this driver work from devicetree
|
||||
@@ -1142,7 +1142,7 @@ fail_free_buf:
|
||||
} else
|
||||
kfree(info->data_buff);
|
||||
fail_disable_clk:
|
||||
- clk_disable(info->clk);
|
||||
+ clk_disable_unprepare(info->clk);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -1168,7 +1168,7 @@ static int pxa3xx_nand_remove(struct pla
|
||||
} else
|
||||
kfree(info->data_buff);
|
||||
|
||||
- clk_disable(info->clk);
|
||||
+ clk_disable_unprepare(info->clk);
|
||||
|
||||
for (cs = 0; cs < pdata->num_cs; cs++)
|
||||
nand_release(info->host[cs]->mtd);
|
|
@ -1,29 +0,0 @@
|
|||
From 7e8fbc673938278ec7165b99b76227d7cc2ab012 Mon Sep 17 00:00:00 2001
|
||||
From: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Date: Wed, 17 Apr 2013 13:38:13 -0300
|
||||
Subject: [PATCH 105/203] mtd: nand: pxa3xx: Check for clk_prepare_enable()
|
||||
return value
|
||||
|
||||
clk_prepare_enable() can fail due to unknown reason.
|
||||
Add a check for this and return the error code if it fails.
|
||||
|
||||
Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com>
|
||||
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
|
||||
---
|
||||
drivers/mtd/nand/pxa3xx_nand.c | 4 +++-
|
||||
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/mtd/nand/pxa3xx_nand.c
|
||||
+++ b/drivers/mtd/nand/pxa3xx_nand.c
|
||||
@@ -1072,7 +1072,9 @@ static int alloc_nand_resource(struct pl
|
||||
dev_err(&pdev->dev, "failed to get nand clock\n");
|
||||
return PTR_ERR(info->clk);
|
||||
}
|
||||
- clk_prepare_enable(info->clk);
|
||||
+ ret = clk_prepare_enable(info->clk);
|
||||
+ if (ret < 0)
|
||||
+ return ret;
|
||||
|
||||
/*
|
||||
* This is a dirty hack to make this driver work from devicetree
|
|
@ -1,66 +0,0 @@
|
|||
From 49ff5bd7d4d51a8eb05796f130e9a1a96d18f522 Mon Sep 17 00:00:00 2001
|
||||
From: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Date: Wed, 17 Apr 2013 13:38:14 -0300
|
||||
Subject: [PATCH 106/203] mtd: nand: pxa3xx: Move buffer release code to its
|
||||
own function
|
||||
|
||||
Create a function to release the buffer and the dma channel, thus undoing
|
||||
what pxa3xx_nand_init_buff() did. This commit makes the code more readable
|
||||
and will allow to handle non-DMA capable platforms easier.
|
||||
|
||||
Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
||||
Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com>
|
||||
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
|
||||
---
|
||||
drivers/mtd/nand/pxa3xx_nand.c | 26 ++++++++++++++------------
|
||||
1 file changed, 14 insertions(+), 12 deletions(-)
|
||||
|
||||
--- a/drivers/mtd/nand/pxa3xx_nand.c
|
||||
+++ b/drivers/mtd/nand/pxa3xx_nand.c
|
||||
@@ -912,6 +912,18 @@ static int pxa3xx_nand_init_buff(struct
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static void pxa3xx_nand_free_buff(struct pxa3xx_nand_info *info)
|
||||
+{
|
||||
+ struct platform_device *pdev = info->pdev;
|
||||
+ if (use_dma) {
|
||||
+ pxa_free_dma(info->data_dma_ch);
|
||||
+ dma_free_coherent(&pdev->dev, MAX_BUFF_SIZE,
|
||||
+ info->data_buff, info->data_buff_phys);
|
||||
+ } else {
|
||||
+ kfree(info->data_buff);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static int pxa3xx_nand_sensing(struct pxa3xx_nand_info *info)
|
||||
{
|
||||
struct mtd_info *mtd;
|
||||
@@ -1137,12 +1149,7 @@ static int alloc_nand_resource(struct pl
|
||||
|
||||
fail_free_buf:
|
||||
free_irq(irq, info);
|
||||
- if (use_dma) {
|
||||
- pxa_free_dma(info->data_dma_ch);
|
||||
- dma_free_coherent(&pdev->dev, MAX_BUFF_SIZE,
|
||||
- info->data_buff, info->data_buff_phys);
|
||||
- } else
|
||||
- kfree(info->data_buff);
|
||||
+ pxa3xx_nand_free_buff(info);
|
||||
fail_disable_clk:
|
||||
clk_disable_unprepare(info->clk);
|
||||
return ret;
|
||||
@@ -1163,12 +1170,7 @@ static int pxa3xx_nand_remove(struct pla
|
||||
irq = platform_get_irq(pdev, 0);
|
||||
if (irq >= 0)
|
||||
free_irq(irq, info);
|
||||
- if (use_dma) {
|
||||
- pxa_free_dma(info->data_dma_ch);
|
||||
- dma_free_writecombine(&pdev->dev, MAX_BUFF_SIZE,
|
||||
- info->data_buff, info->data_buff_phys);
|
||||
- } else
|
||||
- kfree(info->data_buff);
|
||||
+ pxa3xx_nand_free_buff(info);
|
||||
|
||||
clk_disable_unprepare(info->clk);
|
||||
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue