From d6f66dd88e5d833f88fa4b6e056499ec7644ff7c Mon Sep 17 00:00:00 2001
From: Daniele Castro <danielecastro@hotmail.it>
Date: Mon, 2 Dec 2019 16:13:44 +0100
Subject: [PATCH] brcm63xx: add support for ADB P.DG A4001N A-000-1A1-AX
MIME-Version: 1.0
Content-Type: text/plain; charset=utf8
Content-Transfer-Encoding: 8bit

ADB P.DG A4001N A-000-1A1-AX a.k.a. Telecom Italia ADSL2+ Wi-Fi N (AGPWI)
has the same PCB as the OpenWrt's ADB P.DG A4001N1 with LEDs connected
to different GPIO PINs in active low configuration.

OpenWrt's ADB P.DG A4001N image is made for the ADB P.DG A4001N A-000-1A1-AE.
It has different LEDs configuration and flash size/layout
w.r.t the ADB P.DG A4001N A-000-1A1-AX.

Hardware:
* Board ID: 96328avng
* SoC: Broadcom BCM6328
* RAM DDR2-800: 32 Mbyte - winbond W9725G6KB-25
* Serial flash: 16 Mbyte - MXIC MX25L 12845EMI-10G
* Ethernet: 4x Ethernet 10/100 baseT
* Wifi 2.4GHz: Broadcom Corporation BCM43224/5 Wireless Network Adapter (rev 01)
* LEDs: 2x Power, 2x ADSL, 2x Internet, 2x Wi-Fi, 2x Service
* Buttons: 1x Reset, 1x WPS (named WiFi/LED)
* UART: 1x TTL 115200n8, TX  NC  RX, on J5 connector (short R192 and R193)
                         NC  GND NC

Installation via CFE:
* Stock CFE has to be overwriten with one for 96328avng boards that can upload
  .bin images with no signature check (cfe-A4001N-V0000_96328avng.bin)
* connect a serial port to the board
* Stop the boot process after power on by pressing enter
* set static IP 192.168.1.2 and subnet mask 255.255.255.0
* navigate to http://192.168.1.1/
* upload the OpenWrt image file

Signed-off-by: Daniele Castro <danielecastro@hotmail.it>
Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
---
 .../bcm63xx/base-files/etc/board.d/01_leds    |   6 +
 .../bcm63xx/base-files/etc/board.d/02_network |   1 +
 .../base-files/etc/uci-defaults/09_fix_crc    |   1 +
 .../bcm6328-adb-pdg-a4001n-a-000-1a1-ax.dts   | 166 ++++++++++++++++++
 target/linux/bcm63xx/image/bcm63xx.mk         |  12 ++
 ...67-board-adb_pdg-a4001n-a-000-1a1-ax.patch |  68 +++++++
 6 files changed, 254 insertions(+)
 create mode 100644 target/linux/bcm63xx/dts/bcm6328-adb-pdg-a4001n-a-000-1a1-ax.dts
 create mode 100644 target/linux/bcm63xx/patches-5.4/567-board-adb_pdg-a4001n-a-000-1a1-ax.patch

diff --git a/target/linux/bcm63xx/base-files/etc/board.d/01_leds b/target/linux/bcm63xx/base-files/etc/board.d/01_leds
index 907a425d16..91d67f0c0b 100755
--- a/target/linux/bcm63xx/base-files/etc/board.d/01_leds
+++ b/target/linux/bcm63xx/base-files/etc/board.d/01_leds
@@ -21,6 +21,12 @@ adb,a4001n1)
 	ucidef_set_led_netdev "lan" "LAN" "A4001N1:green:eth" "eth0"
 	ucidef_set_led_usbdev "usb" "USB" "A4001N1:green:3g" "1-1"
 	;;
+adb,pdg-a4001n-a-000-1a1-ax)
+	ucidef_set_led_netdev "lan" "LAN" "$model:green:internet" "eth0.1"
+	ucidef_set_led_netdev "wan" "WAN" "$model:green:adsl" "eth0.2"
+	ucidef_set_led_netdev "wlan0" "WIFI" "$model:green:wifi" "wlan0"
+	ucidef_set_led_usbdev "usb" "USB" "$model:green:service" "1-1"
+	;;
 adb,av4202n)
 	ucidef_set_led_netdev "wlan0" "WLAN" "AV4202N:blue:wifi" "wlan0"
 	;;
diff --git a/target/linux/bcm63xx/base-files/etc/board.d/02_network b/target/linux/bcm63xx/base-files/etc/board.d/02_network
index a3788adac2..784af29cb4 100755
--- a/target/linux/bcm63xx/base-files/etc/board.d/02_network
+++ b/target/linux/bcm63xx/base-files/etc/board.d/02_network
@@ -20,6 +20,7 @@ t-com,speedport-w-500v)
 	;;
 adb,a4001n1|\
 adb,a4001n|\
+adb,pdg-a4001n-a-000-1a1-ax|\
 adb,av4202n|\
 brcm,bcm963281tan|\
 brcm,bcm96328avng|\
diff --git a/target/linux/bcm63xx/base-files/etc/uci-defaults/09_fix_crc b/target/linux/bcm63xx/base-files/etc/uci-defaults/09_fix_crc
index 813b51fb52..3fcf40434f 100644
--- a/target/linux/bcm63xx/base-files/etc/uci-defaults/09_fix_crc
+++ b/target/linux/bcm63xx/base-files/etc/uci-defaults/09_fix_crc
@@ -14,6 +14,7 @@ case "$(board_name)" in
 	actiontec,r1000h|\
 	adb,a4001n|\
 	adb,a4001n1|\
+	adb,pdg-a4001n-a-000-1a1-ax|\
 	brcm,bcm96328avng|\
 	brcm,bcm963281tan|\
 	bt,voyager-2110|\
diff --git a/target/linux/bcm63xx/dts/bcm6328-adb-pdg-a4001n-a-000-1a1-ax.dts b/target/linux/bcm63xx/dts/bcm6328-adb-pdg-a4001n-a-000-1a1-ax.dts
new file mode 100644
index 0000000000..8a6a8b58a2
--- /dev/null
+++ b/target/linux/bcm63xx/dts/bcm6328-adb-pdg-a4001n-a-000-1a1-ax.dts
@@ -0,0 +1,166 @@
+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
+
+/dts-v1/;
+
+#include "bcm6328.dtsi"
+
+#include <dt-bindings/input/input.h>
+
+/ {
+	model = "ADB P.DG A4001N A-000-1A1-AX";
+	compatible = "adb,pdg-a4001n-a-000-1a1-ax", "brcm,bcm6328";
+
+	aliases {
+		led-boot = &led_power_green;
+		led-failsafe = &led_power_green;
+		led-running = &led_power_green;
+		led-upgrade = &led_power_green;
+	};
+
+	chosen {
+		bootargs = "rootfstype=squashfs,jffs2 noinitrd console=ttyS0,115200";
+		stdout-path = "serial0:115200n8";
+	};
+
+	keys {
+		compatible = "gpio-keys-polled";
+		#address-cells = <1>;
+		#size-cells = <0>;
+		poll-interval = <20>;
+
+		reset {
+			label = "reset";
+			gpios = <&pinctrl 23 1>;
+			linux,code = <KEY_RESTART>;
+			debounce-interval = <60>;
+		};
+
+		wps {
+			label = "wifi-led";
+			gpios = <&pinctrl 24 1>;
+			linux,code = <KEY_WPS_BUTTON>;
+			debounce-interval = <60>;
+		};
+	};
+};
+
+&leds {
+	status = "okay";
+
+	pinctrl-names = "default";
+	pinctrl-0 = <&pinctrl_leds>;
+
+	led@2 {
+		reg = <2>;
+		active-low;
+		label = "pdg-a4001n-a-000-1a1-ax:red:internet";
+	};
+
+	led@3 {
+		reg = <3>;
+		active-low;
+		label = "pdg-a4001n-a-000-1a1-ax:green:adsl";
+	};
+
+	led@5 {
+		reg = <5>;
+		active-low;
+		label = "pdg-a4001n-a-000-1a1-ax:red:adsl";
+	};
+
+	led@6 {
+		reg = <6>;
+		active-low;
+		label = "pdg-a4001n-a-000-1a1-ax:green:service";
+	};
+
+	led@7 {
+		reg = <7>;
+		active-low;
+		label = "pdg-a4001n-a-000-1a1-ax:red:service";
+	};
+
+	led@8 {
+		reg = <8>;
+		active-low;
+		label = "pdg-a4001n-a-000-1a1-ax:red:power";
+	};
+
+	led@9 {
+		reg = <9>;
+		active-low;
+		label = "pdg-a4001n-a-000-1a1-ax:green:wifi";
+	};
+
+	led@10 {
+		reg = <10>;
+		active-low;
+		label = "pdg-a4001n-a-000-1a1-ax:red:wifi";
+	};
+
+	led@11 {
+		reg = <11>;
+		active-low;
+		label = "pdg-a4001n-a-000-1a1-ax:green:internet";
+	};
+
+	led_power_green: led@12 {
+		reg = <12>;
+		active-low;
+		label = "pdg-a4001n-a-000-1a1-ax:green:power";
+		default-state = "on";
+	};
+};
+
+&hsspi {
+	status = "okay";
+
+	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>;
+
+		partitions {
+			compatible = "fixed-partitions";
+			#address-cells = <1>;
+			#size-cells = <1>;
+
+			partition@0 {
+				reg = <0x000000 0x010000>;
+				label = "cfe";
+				read-only;
+			};
+
+			partition@10000 {
+				reg = <0x010000 0xfe0000>;
+				label = "linux";
+				compatible = "brcm,bcm963xx-imagetag";
+			};
+
+			partition@ff0000 {
+				reg = <0xff0000 0x010000>;
+				label = "nvram";
+			};
+		};
+	};
+};
+
+&pinctrl {
+	pinctrl_leds: leds {
+		function = "led";
+		pins = "gpio2", "gpio3",
+		       "gpio5", "gpio6",
+		       "gpio7", "gpio8",
+		       "gpio9", "gpio10",
+		       "gpio11", "gpio12";
+	};
+};
+
+&uart0 {
+	status = "okay";
+};
diff --git a/target/linux/bcm63xx/image/bcm63xx.mk b/target/linux/bcm63xx/image/bcm63xx.mk
index 219eff5183..2627cbb509 100644
--- a/target/linux/bcm63xx/image/bcm63xx.mk
+++ b/target/linux/bcm63xx/image/bcm63xx.mk
@@ -220,6 +220,18 @@ define Device/adb_a4001n1
 endef
 TARGET_DEVICES += adb_a4001n1
 
+define Device/adb_pdg-a4001n-a-000-1a1-ax
+  $(Device/bcm63xx)
+  DEVICE_VENDOR := ADB
+  DEVICE_MODEL := P.DG A4001N A-000-1A1-AX
+  IMAGES += sysupgrade.bin
+  CFE_BOARD_ID := 96328avng
+  CHIP_ID := 6328
+  FLASH_MB := 16
+  DEVICE_PACKAGES := $(USB2_PACKAGES) $(B43_PACKAGES)
+endef
+TARGET_DEVICES += adb_pdg-a4001n-a-000-1a1-ax
+
 define Device/adb_av4202n
   $(Device/bcm63xx)
   DEVICE_VENDOR := ADB
diff --git a/target/linux/bcm63xx/patches-5.4/567-board-adb_pdg-a4001n-a-000-1a1-ax.patch b/target/linux/bcm63xx/patches-5.4/567-board-adb_pdg-a4001n-a-000-1a1-ax.patch
new file mode 100644
index 0000000000..3976527b37
--- /dev/null
+++ b/target/linux/bcm63xx/patches-5.4/567-board-adb_pdg-a4001n-a-000-1a1-ax.patch
@@ -0,0 +1,68 @@
+--- a/arch/mips/bcm63xx/boards/board_bcm963xx.c
++++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c
+@@ -627,6 +627,49 @@ static struct board_info __initdata boar
+ 	},
+ };
+ 
++static struct board_info __initdata board_PDG_A4001N_A_000_1A1_AX = {
++	.name					= "96328avng",
++	.expected_cpu_id			= 0x6328,
++
++	.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		= "Port 1",
++			},
++			[1] = {
++				.used		= 1,
++				.phy_id		= 2,
++				.name		= "Port 2",
++			},
++			[2] = {
++				.used		= 1,
++				.phy_id		= 3,
++				.name		= "Port 3",
++			},
++			[3] = {
++				.used		= 1,
++				.phy_id		= 4,
++				.name		= "Port 4",
++			},
++		},
++	},
++
++	.fallback_sprom = {
++		.type 				= SPROM_BCM43225,
++		.pci_bus			= 1,
++		.pci_dev			= 0,
++	},
++};
++
+ static struct board_info __initdata board_A4001N1 = {
+ 	.name					= "963281T_TEF",
+ 	.expected_cpu_id			= 0x6328,
+@@ -2849,6 +2892,7 @@ static const struct board_info __initcon
+ 	&board_AR5387un,
+ 	&board_963281TAN,
+ 	&board_A4001N,
++	&board_PDG_A4001N_A_000_1A1_AX,
+ 	&board_A4001N1,
+ 	&board_dsl_274xb_f1,
+ 	&board_FAST2704V2,
+@@ -2957,6 +3001,7 @@ static struct of_device_id const bcm963x
+ #ifdef CONFIG_BCM63XX_CPU_6328
+ 	{ .compatible = "adb,a4001n", .data = &board_A4001N, },
+ 	{ .compatible = "adb,a4001n1", .data = &board_A4001N1, },
++	{ .compatible = "adb,pdg-a4001n-a-000-1a1-ax", .data = &board_PDG_A4001N_A_000_1A1_AX, },
+ 	{ .compatible = "brcm,bcm963281tan", .data = &board_963281TAN, },
+ 	{ .compatible = "brcm,bcm96328avng", .data = &board_96328avng, },
+ 	{ .compatible = "comtrend,ar-5381u", .data = &board_AR5381u, },
-- 
2.30.2