[PATCH] arm: kirkwood: add support for ZyXEL NSA310

Jason Cooper jason at lakedaemon.net
Thu Oct 25 14:13:26 EDT 2012


Hi Tero,

Thanks for the patch!

On Thu, Oct 25, 2012 at 06:01:00PM +0300, Tero Jaasko wrote:
> Hello,
> following patch adds support for the ZyXEL NSA310 NAS box. It has been
> tested and developed in a linux-stable/linux-3.6.y tree, up to 3.6.2.

hmmm, there probably won't be any conflicts when I go to apply this, but
in the future, please base against a tag in Linus' tree.  eg v3.6

> As mentioned in commit, the code is derived from the openwrt.org's 
> repository. I have only done the device tree conversion.
> I have tested and used it on my NAS without trouble for a while. 
> Testing of nand and adt7476 was limited to verifying that they are 
> probed as I have no use for them.
> 
> In order to use the kernel with stock uBoot, one needs to build with
> "make zImage modules dtbs",
> "cat arch/arm/boot/kirkwood-nsa310.dtb >> arch/arm/boot/zImage"
> "make uImage" 
> sequence.

The above comments are typically added after SoB,--- and before the
diffstat.

> ---
> From f31af66eadc0df17bb75c8e5607d56ce6e2ef899 Mon Sep 17 00:00:00 2001
> From: Tero Jaasko <tero.jaasko at mail.suomi.net>
> Date: Mon, 22 Oct 2012 22:43:37 +0300
> Subject: [PATCH] arm: kirkwood: add support for ZyXEL NSA310
> 
> Bring in the support for ZyXEL NSA310 NAS box. Code is mostly imported
> from the openwrt.org, (https://dev.openwrt.org/browser/trunk/target/
> linux/kirkwood/patches-3.3/202-zyxel-nsa-310.patch?rev=31673).
> 
> Original code is converted to use flattened device tree descriptions
> for the support for serial uart, sata, gpio keys and gpio leds.
> 
> Signed-off-by: Tero Jaasko <tero.jaasko at mail.suomi.net>
> ---
>  arch/arm/boot/dts/kirkwood-nsa310.dts |  96 ++++++++++++++++++++
>  arch/arm/mach-kirkwood/Kconfig        |   9 ++
>  arch/arm/mach-kirkwood/Makefile       |   1 +
>  arch/arm/mach-kirkwood/Makefile.boot  |   1 +
>  arch/arm/mach-kirkwood/board-dt.c     |   4 +
>  arch/arm/mach-kirkwood/board-nsa310.c | 166 ++++++++++++++++++++++++++++++++++
>  arch/arm/mach-kirkwood/common.h       |   6 ++
>  7 files changed, 283 insertions(+)
>  create mode 100644 arch/arm/boot/dts/kirkwood-nsa310.dts
>  create mode 100644 arch/arm/mach-kirkwood/board-nsa310.c
> 
> diff --git a/arch/arm/boot/dts/kirkwood-nsa310.dts b/arch/arm/boot/dts/kirkwood-nsa310.dts
> new file mode 100644
> index 0000000..554d81a
> --- /dev/null
> +++ b/arch/arm/boot/dts/kirkwood-nsa310.dts
> @@ -0,0 +1,96 @@
> +/dts-v1/;
> +
> +/include/ "kirkwood.dtsi"
> +
> +/ {
> +	model = "ZyXEL NSA310";
> +	compatible = "zyxel,nsa310", "marvell,kirkwood-88f6281", "marvell,kirkwood";

Is there only one variant of the nsa310?  eg did they change flash types
or ram size during a production run?  Whether they did or not, we prefer
to be as specific as possible here, eg "zyxel,nsa310-PRODNUM" If you can
locate a PRODNUM that will most likely change if they change the BOM,
etc.  Please add this string in addition to what you currently have.

> +
> +	memory {
> +		device_type = "memory";
> +		reg = <0x00000000 0x10000000>;
> +	};
> +
> +	chosen {
> +		bootargs = "console=ttyS0,115200";
> +	};
> +
> +	ocp at f1000000 {
> +		serial at 12000 {
> +			clock-frequency = <200000000>;
> +			status = "ok";
> +		};
> +
> +		sata at 80000 {
> +			status = "okay";
> +			nr-ports = <2>;
> +		};
> +	};
> +
> +	gpio_keys {
> +		compatible = "gpio-keys";
> +		#address-cells = <1>;
> +		#size-cells = <0>;
> +
> +		button at 1 {
> +			label = "Power Button";
> +			linux,code = <116>;
> +			gpios = <&gpio1 14 0>;
> +		};
> +		button at 2 {
> +			label = "Copy Button";
> +			linux,code = <133>;
> +			gpios = <&gpio1 5 1>;
> +		};
> +		button at 3 {
> +			label = "Reset Button";
> +			linux,code = <0x198>;
> +			gpios = <&gpio1 4 1>;
> +		};
> +	};
> +
> +	gpio-leds {
> +		compatible = "gpio-leds";
> +
> +		green-sys {
> +			label = "nsa310:green:sys";
> +			gpios = <&gpio0 28 0>;
> +		};
> +		red-sys {
> +			label = "nsa310:red:sys";
> +			gpios = <&gpio0 29 0>;
> +		};
> +		green-hdd {
> +			label = "nsa310:green:hdd";
> +			gpios = <&gpio1 9 0>;
> +		};
> +		red-hdd {
> +			label = "nsa310:red:hdd";
> +			gpios = <&gpio1 10 0>;
> +		};
> +		green-esata {
> +			label = "nsa310:green:esata";
> +			gpios = <&gpio0 12 0>;
> +		};
> +		red-esata {
> +			label = "nsa310:red:esata";
> +			gpios = <&gpio0 13 0>;
> +		};
> +		green-usb {
> +			label = "nsa310:green:usb";
> +			gpios = <&gpio0 15 0>;
> +		};
> +		red-usb {
> +			label = "nsa310:red:usb";
> +			gpios = <&gpio0 16 0>;
> +		};
> +		green-copy {
> +			label = "nsa310:green:copy";
> +			gpios = <&gpio1 7 0>;
> +		};
> +		red-copy {
> +			label = "nsa310:red:copy";
> +			gpios = <&gpio1 8 0>;
> +		};
> +	};
> +};
> diff --git a/arch/arm/mach-kirkwood/Kconfig b/arch/arm/mach-kirkwood/Kconfig
> index ca5c15a..1172a2a 100644
> --- a/arch/arm/mach-kirkwood/Kconfig
> +++ b/arch/arm/mach-kirkwood/Kconfig
> @@ -195,6 +195,15 @@ config MACH_T5325
>  	  Say 'Y' here if you want your kernel to support the
>  	  HP t5325 Thin Client.
>  
> +config MACH_NSA310_DT
> +	bool "ZyXEL NSA-310 (Flattened Device Tree)"
> +	select ARCH_KIRKWOOD_DT
> +	select ARM_APPENDED_DTB
> +	select ARM_ATAG_DTB_COMPAT

I would prefer not to enable APPENDED_DTB by default.

> +	help
> +	  Say 'Y' here if you want your kernel to support the
> +	  ZyXEL NSA-310 board (Flattened Device Tree).
> +
>  endmenu
>  
>  endif
> diff --git a/arch/arm/mach-kirkwood/Makefile b/arch/arm/mach-kirkwood/Makefile
> index 055c85a..b2663e2 100644
> --- a/arch/arm/mach-kirkwood/Makefile
> +++ b/arch/arm/mach-kirkwood/Makefile
> @@ -28,3 +28,4 @@ obj-$(CONFIG_MACH_IB62X0_DT)		+= board-ib62x0.o
>  obj-$(CONFIG_MACH_TS219_DT)		+= board-ts219.o tsx1x-common.o
>  obj-$(CONFIG_MACH_GOFLEXNET_DT)		+= board-goflexnet.o
>  obj-$(CONFIG_MACH_LSXL_DT)		+= board-lsxl.o
> +obj-$(CONFIG_MACH_NSA310_DT)		+= board-nsa310.o
> diff --git a/arch/arm/mach-kirkwood/Makefile.boot b/arch/arm/mach-kirkwood/Makefile.boot
> index a13299d..67d8666 100644
> --- a/arch/arm/mach-kirkwood/Makefile.boot
> +++ b/arch/arm/mach-kirkwood/Makefile.boot
> @@ -12,3 +12,4 @@ dtb-$(CONFIG_MACH_TS219_DT)	+= kirkwood-ts219-6282.dtb
>  dtb-$(CONFIG_MACH_GOFLEXNET_DT) += kirkwood-goflexnet.dtb
>  dtb-$(CONFIG_MACH_LSXL_DT) += kirkwood-lschlv2.dtb
>  dtb-$(CONFIG_MACH_LSXL_DT) += kirkwood-lsxhl.dtb
> +dtb-$(CONFIG_MACH_NSA310_DT) += kirkwood-nsa310.dtb
> diff --git a/arch/arm/mach-kirkwood/board-dt.c b/arch/arm/mach-kirkwood/board-dt.c
> index e4eb450..2a005a7 100644
> --- a/arch/arm/mach-kirkwood/board-dt.c
> +++ b/arch/arm/mach-kirkwood/board-dt.c
> @@ -87,6 +87,9 @@ static void __init kirkwood_dt_init(void)
>  	if (of_machine_is_compatible("buffalo,lsxl"))
>  		lsxl_init();
>  
> +	if (of_machine_is_compatible("zyxel,nsa310"))
> +		nsa310_init();
> +
>  	of_platform_populate(NULL, kirkwood_dt_match_table,
>  			     kirkwood_auxdata_lookup, NULL);
>  }
> @@ -100,6 +103,7 @@ static const char *kirkwood_dt_board_compat[] = {
>  	"qnap,ts219",
>  	"seagate,goflexnet",
>  	"buffalo,lsxl",
> +	"zyxel,nsa310",
>  	NULL
>  };
>  
> diff --git a/arch/arm/mach-kirkwood/board-nsa310.c b/arch/arm/mach-kirkwood/board-nsa310.c
> new file mode 100644
> index 0000000..4d20841
> --- /dev/null
> +++ b/arch/arm/mach-kirkwood/board-nsa310.c
> @@ -0,0 +1,166 @@
> +/*
> + * arch/arm/mach-kirkwood/board-nsa310.c
> + *
> + * ZyXEL NSA-310 Setup

Copyright?

> + *
> + * 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/init.h>
> +#include <linux/i2c.h>
> +#include <linux/mtd/mtd.h>
> +#include <linux/mtd/partitions.h>
> +#include <linux/gpio.h>
> +
> +#include <asm/mach-types.h>
> +#include <asm/mach/arch.h>
> +#include <mach/kirkwood.h>
> +#include "common.h"
> +#include "mpp.h"
> +
> +#define NSA310_GPIO_LED_ESATA_GREEN	12
> +#define NSA310_GPIO_LED_ESATA_RED	13
> +#define NSA310_GPIO_LED_USB_GREEN	15
> +#define NSA310_GPIO_LED_USB_RED		16
> +#define NSA310_GPIO_USB_POWER_OFF	21
> +#define NSA310_GPIO_LED_SYS_GREEN	28
> +#define NSA310_GPIO_LED_SYS_RED		29
> +#define NSA310_GPIO_KEY_RESTART		36
> +#define NSA310_GPIO_KEY_COPY		37
> +#define NSA310_GPIO_LED_COPY_GREEN	39
> +#define NSA310_GPIO_LED_COPY_RED	40
> +#define NSA310_GPIO_LED_HDD_GREEN	41
> +#define NSA310_GPIO_LED_HDD_RED		42
> +#define NSA310_GPIO_BUZZER		44
> +#define NSA310_GPIO_KEY_POWER		46
> +#define NSA310_GPIO_POWER_OFF		48

Please remove any of the above #define's that aren't used.

> +
> +
> +static unsigned int nsa310_mpp_config[] __initdata = {
> +	MPP12_GPIO, /* led esata green */
> +	MPP13_GPIO, /* led esata red */
> +	MPP15_GPIO, /* led usb green */
> +	MPP16_GPIO, /* led usb red */
> +	MPP21_GPIO, /* control usb power off */
> +	MPP28_GPIO, /* led sys green */
> +	MPP29_GPIO, /* led sys red */
> +	MPP36_GPIO, /* key reset */
> +	MPP37_GPIO, /* key copy */
> +	MPP39_GPIO, /* led copy green */
> +	MPP40_GPIO, /* led copy red */
> +	MPP41_GPIO, /* led hdd green */
> +	MPP42_GPIO, /* led hdd red */
> +	MPP44_GPIO, /* ?? */
> +	MPP46_GPIO, /* key power */
> +	MPP48_GPIO, /* control power off */
> +	0
> +};

There is a patch series to convert all kirkwood DT boards over to DT
init of MPP is under review currently.  If things go well, I'd like to
see this use it as well.

> +
> +static struct mtd_partition nsa310_mtd_parts[] = {
> +	{
> +		.name	= "uboot",
> +		.offset	= 0,
> +		.size	= 0x100000,
> +		.mask_flags = MTD_WRITEABLE,
> +	}, {
> +		.name	= "uboot_env",
> +		.offset	= MTDPART_OFS_NXTBLK,
> +		.size	= 0x80000,
> +	}, {
> +		.name	= "key_store",
> +		.offset	= MTDPART_OFS_NXTBLK,
> +		.size	= 0x80000,
> +	}, {
> +		.name	= "info",
> +		.offset	= MTDPART_OFS_NXTBLK,
> +		.size	= 0x80000,
> +	}, {
> +		.name	= "etc",
> +		.offset	= MTDPART_OFS_NXTBLK,
> +		.size	= 0xa00000,
> +	}, {
> +		.name	= "kernel_1",
> +		.offset	= MTDPART_OFS_NXTBLK,
> +		.size	= 0xa00000,
> +	}, {
> +		.name	= "rootfs1",
> +		.offset	= MTDPART_OFS_NXTBLK,
> +		.size	= 0x2fc0000,
> +	}, {
> +		.name	= "kernel_2",
> +		.offset	= MTDPART_OFS_NXTBLK,
> +		.size	= 0xa00000,
> +	}, {
> +		.name	= "rootfs2",
> +		.offset	= MTDPART_OFS_NXTBLK,
> +		.size	= 0x2fc0000,
> +	},
> +};

Please move the above partition definitions into the dts file, you can
then remove all of the nand init and relevant includes.

> +
> +static struct i2c_board_info __initdata nsa310_i2c_info[] = {
> +	{ I2C_BOARD_INFO("adt7476", 0x2e) },
> +};

how far off from the adt7461 (lm90) is this?  If similar, please
consider extending lm90's compatibility list and describing this in the
dts instead.

> +
> +static void nsa310_power_off(void)
> +{
> +	gpio_set_value(NSA310_GPIO_POWER_OFF, 1);
> +}
> +
> +static int __init nsa310_gpio_request(unsigned int gpio, unsigned long flags,
> +				       const char *label)
> +{
> +	int err;
> +
> +	err = gpio_request_one(gpio, flags, label);
> +	if (err)
> +		pr_err("NSA-310: can't setup GPIO%u (%s), err=%d\n",
> +			gpio, label, err);
> +
> +	return err;
> +}
> +
> +static void __init nsa310_gpio_init(void)
> +{
> +	int err;
> +
> +	err = nsa310_gpio_request(NSA310_GPIO_POWER_OFF, GPIOF_OUT_INIT_LOW,
> +				  "Power Off");
> +	if (!err)
> +		pm_power_off = nsa310_power_off;

This doesn't smell right.

> +
> +	nsa310_gpio_request(NSA310_GPIO_USB_POWER_OFF, GPIOF_OUT_INIT_LOW,
> +			    "USB Power Off");
> +}
> +
> +void __init nsa310_init(void)
> +{
> +	u32 dev, rev;
> +
> +	kirkwood_mpp_conf(nsa310_mpp_config);
> +
> +	nsa310_gpio_init();
> +
> +	kirkwood_nand_init(ARRAY_AND_SIZE(nsa310_mtd_parts), 35);
> +
> +	/* this can be removed once the mainline kirkwood.dtsi gets
> +	 * the ehci configuration by default */
> +	kirkwood_ehci_init();
> +
> +	kirkwood_pcie_id(&dev, &rev);

Does this board actually use pcie?  If so, we've been looking for one to
test on.  Just an fyi, we'll probably be hitting you up later for pcie
DT binding testing. ;-)

thx,

Jason.


> +
> +	i2c_register_board_info(0, ARRAY_AND_SIZE(nsa310_i2c_info));
> +	kirkwood_i2c_init();
> +}
> +
> +static int __init nsa310_pci_init(void)
> +{
> +	if (of_machine_is_compatible("zyxel,nsa310"))
> +		kirkwood_pcie_init(KW_PCIE0);
> +
> +	return 0;
> +}
> +
> +subsys_initcall(nsa310_pci_init);
> diff --git a/arch/arm/mach-kirkwood/common.h b/arch/arm/mach-kirkwood/common.h
> index 304dd1a..a9256d7 100644
> --- a/arch/arm/mach-kirkwood/common.h
> +++ b/arch/arm/mach-kirkwood/common.h
> @@ -94,6 +94,12 @@ void lsxl_init(void);
>  static inline void lsxl_init(void) {};
>  #endif
>  
> +#ifdef CONFIG_MACH_NSA310_DT
> +void nsa310_init(void);
> +#else
> +static inline void nsa310_init(void) {};
> +#endif
> +
>  /* early init functions not converted to fdt yet */
>  char *kirkwood_id(void);
>  void kirkwood_l2_init(void);
> -- 
> 1.7.12.3
> 



More information about the linux-arm-kernel mailing list