From 81cabf127479e1bc8ce0cc294a19ce78d416c3ec Mon Sep 17 00:00:00 2001 From: Uwe Kleine-König Date: Tue, 4 Oct 2016 21:13:05 +0200 Subject: ARM: mvebu: add support for Netgear RN2120 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Uwe Kleine-König Signed-off-by: Sascha Hauer --- arch/arm/boards/Makefile | 1 + arch/arm/boards/netgear-rn2120/Makefile | 2 + arch/arm/boards/netgear-rn2120/board.c | 88 +++++++++++++++++++++++++++++ arch/arm/boards/netgear-rn2120/kwbimage.cfg | 7 +++ arch/arm/boards/netgear-rn2120/lowlevel.c | 41 ++++++++++++++ arch/arm/dts/Makefile | 1 + arch/arm/dts/armada-xp-rn2120-bb.dts | 11 ++++ arch/arm/mach-mvebu/Kconfig | 4 ++ images/Makefile.mvebu | 8 +++ 9 files changed, 163 insertions(+) create mode 100644 arch/arm/boards/netgear-rn2120/Makefile create mode 100644 arch/arm/boards/netgear-rn2120/board.c create mode 100644 arch/arm/boards/netgear-rn2120/kwbimage.cfg create mode 100644 arch/arm/boards/netgear-rn2120/lowlevel.c create mode 100644 arch/arm/dts/armada-xp-rn2120-bb.dts diff --git a/arch/arm/boards/Makefile b/arch/arm/boards/Makefile index 23a8dbd7d0..b911d0357b 100644 --- a/arch/arm/boards/Makefile +++ b/arch/arm/boards/Makefile @@ -72,6 +72,7 @@ obj-$(CONFIG_MACH_MX28EVK) += freescale-mx28-evk/ obj-$(CONFIG_MACH_MX31MOBOARD) += mx31moboard/ obj-$(CONFIG_MACH_NESO) += guf-neso/ obj-$(CONFIG_MACH_NETGEAR_RN104) += netgear-rn104/ +obj-$(CONFIG_MACH_NETGEAR_RN2120) += netgear-rn2120/ obj-$(CONFIG_MACH_NOMADIK_8815NHK) += nhk8815/ obj-$(CONFIG_MACH_NVIDIA_BEAVER) += nvidia-beaver/ obj-$(CONFIG_MACH_NVIDIA_JETSON) += nvidia-jetson-tk1/ diff --git a/arch/arm/boards/netgear-rn2120/Makefile b/arch/arm/boards/netgear-rn2120/Makefile new file mode 100644 index 0000000000..01c7a259e9 --- /dev/null +++ b/arch/arm/boards/netgear-rn2120/Makefile @@ -0,0 +1,2 @@ +obj-y += board.o +lwl-y += lowlevel.o diff --git a/arch/arm/boards/netgear-rn2120/board.c b/arch/arm/boards/netgear-rn2120/board.c new file mode 100644 index 0000000000..caf106af50 --- /dev/null +++ b/arch/arm/boards/netgear-rn2120/board.c @@ -0,0 +1,88 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +static int rn2120_init(void) +{ + /* + * This is the machine type that the kernel shipped by Netgear is using. + * It's wrong but a given fact. + */ + armlinux_set_architecture(MACH_TYPE_ARMADA_XP_DB); + + return 0; +} +device_initcall(rn2120_init); + +struct hdpower { + unsigned gpio_detect; + unsigned gpio_power; + unsigned gpio_led; +}; + +/* + * It would be nice to have this abstracted in the device tree, but currently + * this isn't the case. + */ +static struct hdpower rn2120_hdpower[] = { + { + /* sata 1 */ + .gpio_detect = 32, + .gpio_power = 24, + .gpio_led = 31, + }, { + /* sata 2 */ + .gpio_detect = 33, + .gpio_power = 25, + .gpio_led = 40, + }, { + /* sata 3 */ + .gpio_detect = 34, + .gpio_power = 26, + .gpio_led = 44, + }, { + /* sata 4 */ + .gpio_detect = 35, + .gpio_power = 28, + .gpio_led = 47, + }, +}; + +static int rn2120_hddetect(void) +{ + int i; + + if (!of_machine_is_compatible("netgear,readynas-2120")) + return 0; + + for (i = 0; i < ARRAY_SIZE(rn2120_hdpower); ++i) { + int ret; + ret = gpio_direction_input(rn2120_hdpower[i].gpio_detect); + if (ret) { + pr_err("Failure to detect hd%d (%d)\n", i, ret); + continue; + } + + ret = gpio_get_value(rn2120_hdpower[i].gpio_detect); + if (ret) { + /* no disk present */ + gpio_direction_output(rn2120_hdpower[i].gpio_power, 0); + } else { + pr_info("Detected presence of disk #%d\n", i + 1); + /* make a pause after powering up 2 disks */ + if (i && !(i & 1)) { + pr_info("Delay power up\n"); + mdelay(7000); + } + + gpio_direction_output(rn2120_hdpower[i].gpio_power, 1); + } + } + return 0; +} +device_initcall(rn2120_hddetect); diff --git a/arch/arm/boards/netgear-rn2120/kwbimage.cfg b/arch/arm/boards/netgear-rn2120/kwbimage.cfg new file mode 100644 index 0000000000..a6f0aa6d3d --- /dev/null +++ b/arch/arm/boards/netgear-rn2120/kwbimage.cfg @@ -0,0 +1,7 @@ +VERSION 1 +BOOT_FROM nand +DESTADDR 00000000 +EXECADDR 00000000 +NAND_BLKSZ 00020000 +NAND_BADBLK_LOCATION 01 +BINARY binary.0 0000005b 00000068 diff --git a/arch/arm/boards/netgear-rn2120/lowlevel.c b/arch/arm/boards/netgear-rn2120/lowlevel.c new file mode 100644 index 0000000000..29c8b43c44 --- /dev/null +++ b/arch/arm/boards/netgear-rn2120/lowlevel.c @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2015 Pengutronix, Uwe Kleine-König + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2, as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include +#include +#include + +extern char __dtb_armada_xp_rn2120_bb_start[]; + +ENTRY_FUNCTION(start_netgear_rn2120, r0, r1, r2) +{ + void *fdt; + + arm_cpu_lowlevel_init(); + + /* + * This is necessary to allow the machine to draw more power. Probably + * connected to a TI TPS65251. Without this resetting a phy makes the + * SoC reset. + * This is effectively gpio_direction_output(42, 1); + */ + writel((1 << 10) | readl((void *)0xd0018140), (void *)0xd0018140); + writel(~(1 << 10) & readl((void *)0xd0018144), (void *)0xd0018144); + + fdt = __dtb_armada_xp_rn2120_bb_start - + get_runtime_offset(); + + mvebu_barebox_entry(fdt); +} diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile index d1a3fe8ae8..77f20d60d9 100644 --- a/arch/arm/dts/Makefile +++ b/arch/arm/dts/Makefile @@ -29,6 +29,7 @@ pbl-dtb-$(CONFIG_MACH_GW_VENTANA) += imx6q-gw54xx.dtb.o pbl-dtb-$(CONFIG_MACH_LENOVO_IX4_300D) += armada-xp-lenovo-ix4-300d-bb.dtb.o pbl-dtb-$(CONFIG_MACH_MARVELL_ARMADA_XP_GP) += armada-xp-gp-bb.dtb.o pbl-dtb-$(CONFIG_MACH_NETGEAR_RN104) += armada-370-rn104-bb.dtb.o +pbl-dtb-$(CONFIG_MACH_NETGEAR_RN2120) += armada-xp-rn2120-bb.dtb.o pbl-dtb-$(CONFIG_MACH_NITROGEN6) += imx6q-nitrogen6x.dtb.o imx6dl-nitrogen6x.dtb.o imx6qp-nitrogen6_max.dtb.o pbl-dtb-$(CONFIG_MACH_NVIDIA_BEAVER) += tegra30-beaver.dtb.o pbl-dtb-$(CONFIG_MACH_NVIDIA_JETSON) += tegra124-jetson-tk1.dtb.o diff --git a/arch/arm/dts/armada-xp-rn2120-bb.dts b/arch/arm/dts/armada-xp-rn2120-bb.dts new file mode 100644 index 0000000000..969136b336 --- /dev/null +++ b/arch/arm/dts/armada-xp-rn2120-bb.dts @@ -0,0 +1,11 @@ +/* + * Barebox specific DT overlay for Netgear ReadyNAS 2120 + */ + +#include "arm/armada-xp-netgear-rn2120.dts" + +/ { + chosen { + stdout-path = "/soc/internal-regs/serial@12000"; + }; +}; diff --git a/arch/arm/mach-mvebu/Kconfig b/arch/arm/mach-mvebu/Kconfig index 79fcc8d3ac..148b4f6d4c 100644 --- a/arch/arm/mach-mvebu/Kconfig +++ b/arch/arm/mach-mvebu/Kconfig @@ -55,6 +55,10 @@ config MACH_MARVELL_ARMADA_XP_GP bool "Marvell Armada XP GP" select ARCH_ARMADA_XP +config MACH_NETGEAR_RN2120 + bool "Netgear ReadyNAS 2120" + select ARCH_ARMADA_XP + config MACH_PLATHOME_OPENBLOCKS_AX3 bool "PlatHome OpenBlocks AX3" select ARCH_ARMADA_XP diff --git a/images/Makefile.mvebu b/images/Makefile.mvebu index c925afd4a2..b57291cbaf 100644 --- a/images/Makefile.mvebu +++ b/images/Makefile.mvebu @@ -43,6 +43,14 @@ pblx-$(CONFIG_MACH_MARVELL_ARMADA_XP_GP) += start_marvell_armada_xp_gp image-$(CONFIG_MACH_MARVELL_ARMADA_XP_GP) += barebox-marvell-armada-xp-gp.img image-$(CONFIG_MACH_MARVELL_ARMADA_XP_GP) += barebox-marvell-armada-xp-gp-2nd.img +NETGEAR_RN2120_KWBOPTS = ${KWBOPTS} -i $(board)/netgear-rn2120/kwbimage.cfg +OPTS_start_netgear_rn2120.pblx.kwbimg = $(NETGEAR_RN2120_KWBOPTS) +FILE_barebox-netgear-rn2120.img = start_netgear_rn2120.pblx.kwbimg +FILE_barebox-netgear-rn2120-2nd.img = start_netgear_rn2120.pblx +pblx-$(CONFIG_MACH_NETGEAR_RN2120) += start_netgear_rn2120 +image-$(CONFIG_MACH_NETGEAR_RN2120) += barebox-netgear-rn2120.img +image-$(CONFIG_MACH_NETGEAR_RN2120) += barebox-netgear-rn2120-2nd.img + PLATHOME_OPENBLOCKS_AX3_KWBOPTS = ${KWBOPTS} -i $(board)/plathome-openblocks-ax3/kwbimage.cfg OPTS_start_plathome_openblocks_ax3.pblx.kwbimg = $(PLATHOME_OPENBLOCKS_AX3_KWBOPTS) FILE_barebox-plathome-openblocks-ax3.img = start_plathome_openblocks_ax3.pblx.kwbimg -- cgit v1.2.3