[LEDE-DEV,v2] brcm63xx: Add Sercomm AD1018 support

Message ID 5462005.2d8tLKgp2k@tool
State New
Headers show
Series
  • [LEDE-DEV,v2] brcm63xx: Add Sercomm AD1018 support
Related show

Commit Message

Daniel Gonzalez Cabanelas Aug. 31, 2017, 8:22 p.m.
Add support for the Sercomm AD1018 router

This a BCM6328 based board, 128 MB RAM, 128 MiB NAND flash,
with an onboard BCM43217 wifi, 4 ethernet ports and 1 USB
host port (not soldered). The board also has an FXS chip (Si32177)
connected via SPI (SS2#), without support in LEDE.

Since NAND flash chips aren't still supported in brcm63xx, the
support is for now added to work only with SPI flash chips. Therefore
hardware modding, soldering a new SPI flash chip, is required
to make the board work with LEDE (tested and working OK).
The flash at dts is intentionally left without partitioning to let 
the user choose a NOR chip of any size (8, 16 or 32 MB).

Signed-off-by: Daniel Gonzalez Cabanelas <dgcbueu@gmail.com>
---
Change in v2:
- rename the board at dts for indicating this is a firmware for SPI NOR  
flash chips, and minor changes
- add USB LED
---
 .../linux/brcm63xx/base-files/etc/board.d/01_leds  |   3 +
 .../brcm63xx/base-files/etc/board.d/02_network     |   1 +
 target/linux/brcm63xx/base-files/etc/diag.sh       |   3 +
 target/linux/brcm63xx/base-files/lib/brcm63xx.sh   |   3 +
 target/linux/brcm63xx/dts/ad1018-nor.dts           | 136 +++++++++++++++++++++
 target/linux/brcm63xx/image/bcm63xx.mk             |  12 ++
 .../brcm63xx/patches-4.4/580-board_AD1018.patch    |  99 +++++++++++++++
 7 files changed, 257 insertions(+)
 create mode 100644 target/linux/brcm63xx/dts/ad1018-nor.dts
 create mode 100644 target/linux/brcm63xx/patches-4.4/580-board_AD1018.patch

Patch

diff --git a/target/linux/brcm63xx/base-files/etc/board.d/01_leds b/target/linux/brcm63xx/base-files/etc/board.d/01_leds
index ef70cde..5503328 100755
--- a/target/linux/brcm63xx/base-files/etc/board.d/01_leds
+++ b/target/linux/brcm63xx/base-files/etc/board.d/01_leds
@@ -15,6 +15,9 @@  a4001n1)
 a4001n)
 	ucidef_set_led_usbdev "usb" "USB" "A4001N:green:usb" "1-1"
 	;;
+ad1018)
+	ucidef_set_led_netdev "wlan0" "WLAN" "AD1018:green:wifi" "wlan0"
+	;;
 ar-5315u)
 	ucidef_set_led_usbdev "usb" "USB" "AR-5315u:green:usb" "1-1"
 	;;
diff --git a/target/linux/brcm63xx/base-files/etc/board.d/02_network b/target/linux/brcm63xx/base-files/etc/board.d/02_network
index 9addba6..826d271 100755
--- a/target/linux/brcm63xx/base-files/etc/board.d/02_network
+++ b/target/linux/brcm63xx/base-files/etc/board.d/02_network
@@ -98,6 +98,7 @@  vr-3026e)
 		"0:lan:1" "1:lan:2" "2:lan:3" "3:lan:4" "8t@eth0"
 	;;
 
+ad1018 |\
 ar-5315u |\
 vh4032n)
 	ucidef_add_switch "switch0" \
diff --git a/target/linux/brcm63xx/base-files/etc/diag.sh b/target/linux/brcm63xx/base-files/etc/diag.sh
index 700c9ea..2663a2c 100644
--- a/target/linux/brcm63xx/base-files/etc/diag.sh
+++ b/target/linux/brcm63xx/base-files/etc/diag.sh
@@ -12,6 +12,9 @@  set_state() {
 	a4001n)
 		status_led="A4001N:green:power"
 		;;
+	ad1018)
+		status_led="AD1018:green:power"
+		;;
 	ar-5315u)
 		status_led="AR-5315u:green:power"
 		;;
diff --git a/target/linux/brcm63xx/base-files/lib/brcm63xx.sh b/target/linux/brcm63xx/base-files/lib/brcm63xx.sh
index 3f46633..09a5550 100755
--- a/target/linux/brcm63xx/base-files/lib/brcm63xx.sh
+++ b/target/linux/brcm63xx/base-files/lib/brcm63xx.sh
@@ -228,6 +228,9 @@  brcm63xx_dt_detect() {
 	"Sagem F@ST2704V2")
 		board_name="fast2704v2"
 		;;
+	"Sercomm AD1018 (SPI flash mod)")
+		board_name="ad1018"
+		;;
 	"SFR Neuf Box 4"*)
 		board_name="neufbox4"
 		;;
diff --git a/target/linux/brcm63xx/dts/ad1018-nor.dts b/target/linux/brcm63xx/dts/ad1018-nor.dts
new file mode 100644
index 0000000..e2f7eed
--- /dev/null
+++ b/target/linux/brcm63xx/dts/ad1018-nor.dts
@@ -0,0 +1,136 @@ 
+/dts-v1/;
+
+#include "bcm6328.dtsi"
+
+#include <dt-bindings/input/input.h>
+
+/ {
+	model = "Sercomm AD1018 (SPI flash mod)";
+	compatible = "sercomm,ad1018", "brcm,bcm6328";
+
+	chosen {
+		bootargs = "root=/dev/mtdblock2 rootfstype=squashfs,jffs2 noinitrd console=ttyS0,115200";
+	};
+
+	gpio-keys-polled {
+		compatible = "gpio-keys-polled";
+		#address-cells = <1>;
+		#size-cells = <0>;
+		poll-interval = <20>;
+		debounce-interval = <60>;
+
+		wps {
+			label = "wps";
+			gpios = <&pinctrl 24 1>;
+			linux,code = <KEY_WPS_BUTTON>;
+		};
+		wifi {
+			label = "wifi";
+			gpios = <&pinctrl 25 1>;
+			linux,code = <KEY_WLAN>;
+		};
+		reset {
+			label = "reset";
+			gpios = <&pinctrl 31 1>;
+			linux,code = <KEY_RESTART>;
+		};
+	};
+
+};
+
+&pinctrl {
+	pinctrl_leds: leds {
+		function = "led";
+		pins = "gpio0", "gpio1";
+	};
+};
+
+&leds {
+	status = "ok";
+
+	pinctrl-names = "default";
+	pinctrl-0 = <&pinctrl_leds &pinctrl_serial_led
+		     &pinctrl_ephy0_spd_led &pinctrl_ephy1_act_led
+		     &pinctrl_ephy2_act_led &pinctrl_ephy3_act_led>;
+
+	brcm,serial-leds;
+	brcm,serial-shift-inv;
+	brcm,serial-dat-low;
+
+	inet_red@0 {
+		reg = <0>;
+		active-low;
+		label = "AD1018:red:internet";
+	};
+
+	inet_green@1 {
+		reg = <1>;
+		active-low;
+		label = "AD1018:green:internet";
+	};
+
+	power_green@8 {
+		reg = <8>;
+		active-low;
+		label = "AD1018:green:power";
+		default-state = "on";
+	};
+
+	adsl_green@10 {
+		reg = <10>;
+		active-low;
+		label = "AD1018:green:adsl";
+	};
+
+	adsl_red@11 {
+		reg = <11>;
+		active-low;
+		label = "AD1018:red:adsl";
+	};
+
+	phone_green@12 {
+		reg = <12>;
+		active-low;
+		label = "AD1018:green:phone";
+	};
+
+	wps_green@13 {
+		reg = <13>;
+		active-low;
+		label = "AD1018:green:wps";
+	};
+
+	wifi_green@14 {
+		reg = <14>;
+		active-low;
+		label = "AD1018:green:wifi";
+	};
+
+	usb_green@15 {
+		reg = <15>;
+		active-low;
+		label = "AD1018:green:usb";
+	};
+
+	ephy0_spd@17 {
+		reg = <17>;
+		brcm,hardware-controlled;
+	};
+};
+
+&hsspi {
+	status = "ok";
+
+	flash@0 {
+		compatible = "jedec,spi-nor";
+		spi-max-frequency = <16666667>;
+		spi-tx-bus-width = <2>;
+		spi-rx-bus-width = <2>;
+		reg = <0>;
+
+		#address-cells = <1>;
+		#size-cells = <1>;
+
+		linux,part-probe = "bcm63xxpart";
+	};
+};
diff --git a/target/linux/brcm63xx/image/bcm63xx.mk b/target/linux/brcm63xx/image/bcm63xx.mk
index 6ad15a2..0cadfba 100644
--- a/target/linux/brcm63xx/image/bcm63xx.mk
+++ b/target/linux/brcm63xx/image/bcm63xx.mk
@@ -971,6 +971,18 @@  define Device/FAST2704V2
 endef
 TARGET_DEVICES += FAST2704V2
 
+### Sercomm ###
+define Device/AD1018-SPI_flash
+  $(Device/bcm63xx)
+  DEVICE_TITLE := Sercomm AD1018 (SPI flash mod)
+  DEVICE_DTS := ad1018-nor
+  CFE_BOARD_ID := 96328avngr
+  CFE_CHIP_ID := 6328
+  DEVICE_PACKAGES := \
+    $(B43_PACKAGES) $(USB2_PACKAGES)
+endef
+TARGET_DEVICES += AD1018-SPI_flash
+
 ### SFR ###
 define Device/NEUFBOX4-SER
   $(Device/bcm63xx)
diff --git a/target/linux/brcm63xx/patches-4.4/580-board_AD1018.patch b/target/linux/brcm63xx/patches-4.4/580-board_AD1018.patch
new file mode 100644
index 0000000..49a6bfe
--- /dev/null
+++ b/target/linux/brcm63xx/patches-4.4/580-board_AD1018.patch
@@ -0,0 +1,99 @@ 
+--- a/arch/mips/bcm63xx/boards/board_bcm963xx.c
++++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c
+@@ -365,8 +365,76 @@
+ 		},
+ 	},
+ };
+ 
++static struct sprom_fixup __initdata ad1018_fixups[] = {
++	{ .offset = 6, .value = 0x1c00 },
++	{ .offset = 65, .value = 0x1256 },
++	{ .offset = 96, .value = 0x2046 },
++	{ .offset = 97, .value = 0xfe69 },
++	{ .offset = 98, .value = 0x1726 },
++	{ .offset = 99, .value = 0xfa5c },
++	{ .offset = 112, .value = 0x2046 },
++	{ .offset = 113, .value = 0xfea8 },
++	{ .offset = 114, .value = 0x1978 },
++	{ .offset = 115, .value = 0xfa26 },
++	{ .offset = 161, .value = 0x2222 },
++	{ .offset = 169, .value = 0x2222 },
++	{ .offset = 171, .value = 0x2222 },
++	{ .offset = 173, .value = 0x2222 },
++	{ .offset = 174, .value = 0x4444 },
++	{ .offset = 175, .value = 0x2222 },
++	{ .offset = 176, .value = 0x4444 },
++};
++
++static struct board_info __initdata board_AD1018 = {
++	.name					= "96328avngr",
++	.expected_cpu_id			= 0x6328,
++
++	.has_uart0				= 1,
++	.has_pci				= 1,
++	.use_fallback_sprom			= 1,
++
++	.has_ohci0				= 1,
++	.has_ehci0				= 1,
++	.num_usbh_ports				= 1,
++
++	.has_enetsw				= 1,
++
++	.enetsw = {
++		.used_ports = {
++			[0] = {
++				.used		= 1,
++				.phy_id		= 1,
++				.name		= "FIBRE",
++			},
++			[1] = {
++				.used		= 1,
++				.phy_id		= 2,
++				.name		= "LAN3",
++			},
++			[2] = {
++				.used		= 1,
++				.phy_id		= 3,
++				.name		= "LAN2",
++			},
++			[3] = {
++				.used		= 1,
++				.phy_id		= 4,
++				.name		= "LAN1",
++			},
++		},
++	},
++
++	.fallback_sprom = {
++		.type 				= SPROM_BCM43217,
++		.pci_bus			= 1,
++		.pci_dev			= 0,
++		.board_fixups			= ad1018_fixups,
++		.num_board_fixups		= ARRAY_SIZE(ad1018_fixups),
++	},
++};
++
+ static struct sprom_fixup __initdata ar5381u_fixups[] = {
+ 	{ .offset = 97, .value = 0xfee5 },
+ 	{ .offset = 98, .value = 0x157c },
+ 	{ .offset = 99, .value = 0xfae7 },
+@@ -2683,8 +2751,9 @@
+ 	&board_FAST2704N,
+ #endif
+ #ifdef CONFIG_BCM63XX_CPU_6328
+ 	&board_96328avng,
++	&board_AD1018,
+ 	&board_AR5381u,
+ 	&board_AR5387un,
+ 	&board_963281TAN,
+ 	&board_A4001N,
+@@ -2797,8 +2866,9 @@
+ 	{ .compatible = "comtrend,ar-5387un", .data = &board_AR5387un, },
+ 	{ .compatible = "d-link,dsl-274xb-f", .data = &board_dsl_274xb_f1, },
+ 	{ .compatible = "nucom,r5010unv2", .data = &board_R5010UNV2, },
+ 	{ .compatible = "sagem,f@st2704v2", .data = &board_FAST2704V2, },
++	{ .compatible = "sercomm,ad1018", .data = &board_AD1018, },
+ #endif
+ #ifdef CONFIG_BCM63XX_CPU_6338
+ 	{ .compatible = "brcm,bcm96338gw", .data = &board_96338gw, },
+ 	{ .compatible = "brcm,bcm96338w", .data = &board_96338w, },