Merge changes from topic "LEDs"

* changes:
  clearfog: Update U-Boot
  clearfog: blink the white LED slower once we've settled on a slot
  clearfog: fast-blink the white LED early on
  clearfog: setup LEDs for SFP and LINE/EXPRESS indication
diff --git a/board/czechlight/clearfog/boot.scr.txt b/board/czechlight/clearfog/boot.scr.txt
index efca0b6..5a12f39 100644
--- a/board/czechlight/clearfog/boot.scr.txt
+++ b/board/czechlight/clearfog/boot.scr.txt
@@ -1,3 +1,12 @@
+# status LED blinking: white, 50% duty cycle, rather fast, but not the fastet blinking
+i2c dev 1
+i2c mw 0x60 0x16 0x00
+i2c mw 0x60 0x12 0x80
+i2c mw 0x60 0x13 0x06
+i2c mw 0x60 0x16 0x3f
+i2c mw 0x60 0x0a 0x80
+i2c mw 0x60 0x0b 0x80
+i2c mw 0x60 0x0c 0x80
 setenv bootargs root=/dev/mmcblk0p${rauc_part} rauc.slot=${rauc_slot} czechlight=${czechlight} systemd.machine_id=${machineid} panic=10 oops=panic
 setenv bootargs ${bootargs} spidev.bufsiz=65535
 if test -n ${czechlight} && load mmc 0:${rauc_part} ${fdt_addr_r} /boot/${czechlight}-clearfog.dtb; then
diff --git a/board/czechlight/clearfog/patches/u-boot/boot.patch b/board/czechlight/clearfog/patches/u-boot/boot.patch
index 104e986..fe3182b 100644
--- a/board/czechlight/clearfog/patches/u-boot/boot.patch
+++ b/board/czechlight/clearfog/patches/u-boot/boot.patch
@@ -1,99 +1,5 @@
-diff --git a/arch/arm/dts/armada-388-clearfog.dts b/arch/arm/dts/armada-388-clearfog.dts
-index bc52bc0167..177cb4cd25 100644
---- a/arch/arm/dts/armada-388-clearfog.dts
-+++ b/arch/arm/dts/armada-388-clearfog.dts
-@@ -90,13 +90,10 @@
- 		internal-regs {
- 			ethernet@30000 {
- 				mac-address = [00 50 43 02 02 02];
-+				managed = "in-band-status";
-+				phy = <&phy1>;
- 				phy-mode = "sgmii";
- 				status = "okay";
--
--				fixed-link {
--					speed = <1000>;
--					full-duplex;
--				};
- 			};
- 
- 			ethernet@34000 {
-@@ -228,6 +225,10 @@
- 				pinctrl-0 = <&mdio_pins>;
- 				pinctrl-names = "default";
- 
-+				phy1: ethernet-phy@1 { /* Marvell 88E1512 */
-+					reg = <1>;
-+				};
-+
- 				phy_dedicated: ethernet-phy@0 {
- 					/*
- 					 * Annoyingly, the marvell phy driver
-@@ -384,62 +385,6 @@
- 		tx-fault-gpio = <&expander0 13 GPIO_ACTIVE_HIGH>;
- 	};
- 
--	dsa@0 {
--		compatible = "marvell,dsa";
--		dsa,ethernet = <&eth1>;
--		dsa,mii-bus = <&mdio>;
--		pinctrl-0 = <&clearfog_dsa0_clk_pins &clearfog_dsa0_pins>;
--		pinctrl-names = "default";
--		#address-cells = <2>;
--		#size-cells = <0>;
--
--		switch@0 {
--			#address-cells = <1>;
--			#size-cells = <0>;
--			reg = <4 0>;
--
--			port@0 {
--				reg = <0>;
--				label = "lan1";
--			};
--
--			port@1 {
--				reg = <1>;
--				label = "lan2";
--			};
--
--			port@2 {
--				reg = <2>;
--				label = "lan3";
--			};
--
--			port@3 {
--				reg = <3>;
--				label = "lan4";
--			};
--
--			port@4 {
--				reg = <4>;
--				label = "lan5";
--			};
--
--			port@5 {
--				reg = <5>;
--				label = "cpu";
--			};
--
--			port@6 {
--				/* 88E1512 external phy */
--				reg = <6>;
--				label = "lan6";
--				fixed-link {
--					speed = <1000>;
--					full-duplex;
--				};
--			};
--		};
--	};
--
- 	gpio-keys {
- 		compatible = "gpio-keys";
- 		pinctrl-0 = <&rear_button_pins>;
 diff --git a/board/solidrun/clearfog/clearfog.c b/board/solidrun/clearfog/clearfog.c
-index ede303d4eb..e5abda6f76 100644
+index 4e1386c8a2..be54ae0b78 100644
 --- a/board/solidrun/clearfog/clearfog.c
 +++ b/board/solidrun/clearfog/clearfog.c
 @@ -10,10 +10,15 @@
@@ -112,7 +18,7 @@
  DECLARE_GLOBAL_DATA_PTR;
  
  #define ETH_PHY_CTRL_REG		0
-@@ -124,6 +129,10 @@ int board_early_init_f(void)
+@@ -108,11 +113,95 @@ int board_early_init_f(void)
  	return 0;
  }
  
@@ -120,10 +26,76 @@
 +static struct udevice *watchdog_dev = NULL;
 +#endif
 +
++#define TLC59XXX_REG_MODE1 0x00
++#define TLC59XXX_REG_MODE2 0x01
++#define TLC59XXX_REG_PWM(LED) (LED + 0x02)
++#define TLC59XXX_REG_GRPPWM 0x12
++#define TLC59XXX_REG_GRPFREQ 0x13
++#define TLC59XXX_REG_LEDOUT0 0x14
++#define TLC59XXX_REG_LEDOUT1 0x15
++#define TLC59XXX_REG_LEDOUT2 0x16
++#define TLC59XXX_REG_LEDOUT3 0x17
++#define TLC59XXX_CHIP_RESET_ADDR 0x6b
++#define TLC59XXX_RESET_BYTE_0 0xa5
++#define TLC59XXX_RESET_BYTE_1 0x5a
++#define CLA_LED_CHIP_ADDR 0x60
++#define CLA_LED_STATUS_RED 8
++#define CLA_LED_STATUS_GREEN 9
++#define CLA_LED_STATUS_BLUE 10
++
++struct cla_led_config {
++	u8 reg;
++	u8 val;
++};
++
++static struct cla_led_config led_reset_config[] = {
++	{ TLC59XXX_RESET_BYTE_0, TLC59XXX_RESET_BYTE_1 },
++};
++
++static struct cla_led_config led_config[] = {
++	{ TLC59XXX_REG_MODE1, 0x01 }, /* enable oscillator */
++	{ TLC59XXX_REG_MODE2, 0x20 }, /* DMBLINK */
++	{ TLC59XXX_REG_GRPPWM, 0x40 }, /* 25% duty cycle */
++	{ TLC59XXX_REG_GRPFREQ, 0x03 }, /* very fast blinking */
++	{ TLC59XXX_REG_PWM(CLA_LED_STATUS_RED), 0x80 }, /* 50% brightness */
++	{ TLC59XXX_REG_PWM(CLA_LED_STATUS_GREEN), 0x80 }, /* 50% brightness */
++	{ TLC59XXX_REG_PWM(CLA_LED_STATUS_BLUE), 0x80 }, /* 50% brightness */
++	{ TLC59XXX_REG_LEDOUT2, 0x3f }, /* LEDs #8, 9, 10: mode 0b11 -> group blinking */
++};
++
++int cla_setup_leds(void)
++{
++	struct udevice *bus, *dev;
++
++	if (uclass_get_device_by_seq(UCLASS_I2C, 1, &bus)) {
++		puts("Cannot find I2C bus for LEDs\n");
++		return 1;
++	}
++
++	if (i2c_get_chip(bus, TLC59XXX_CHIP_RESET_ADDR, 1, &dev)) {
++		puts("Cannot request I2C chip for SWRST\n");
++		return 1;
++	}
++	if (dm_i2c_write(dev, led_reset_config[0].reg, &led_reset_config[0].val, 1)) {
++		puts("LED reset failed\n");
++		return 1;
++	}
++
++	if (i2c_get_chip(bus, CLA_LED_CHIP_ADDR, 1, &dev)) {
++		puts("Cannot request I2C chip for LEDs\n");
++		return 1;
++	}
++	for (int i = 0; i < ARRAY_SIZE(led_config); i++) {
++		if (dm_i2c_write(dev, led_config[i].reg, &led_config[i].val, 1)) {
++			printf("LED config operation #%d failed\n", i);
++			return 1;
++		}
++	}
++	return 0;
++}
++
  int board_init(void)
  {
- 	int i;
-@@ -131,6 +140,18 @@ int board_init(void)
  	/* Address of boot parameters */
  	gd->bd->bi_boot_params = mvebu_sdram_bar(0) + 0x100;
  
@@ -142,7 +114,12 @@
  	/* Toggle GPIO41 to reset onboard switch and phy */
  	clrbits_le32(MVEBU_GPIO1_BASE + 0x0, BIT(9));
  	clrbits_le32(MVEBU_GPIO1_BASE + 0x4, BIT(9));
-@@ -149,6 +170,28 @@ int board_init(void)
+@@ -124,9 +213,33 @@ int board_init(void)
+ 	setbits_le32(MVEBU_GPIO0_BASE + 0x0, BIT(19));
+ 	mdelay(10);
+ 
++	cla_setup_leds();
++
  	return 0;
  }
  
@@ -172,36 +149,35 @@
  {
  	puts("Board: SolidRun ClearFog\n");
 diff --git a/configs/clearfog_defconfig b/configs/clearfog_defconfig
-index 5e1733e11b..4af2d1e902 100644
+index 53dbd9fb81..784f56c76e 100644
 --- a/configs/clearfog_defconfig
 +++ b/configs/clearfog_defconfig
-@@ -53,3 +53,5 @@ CONFIG_USB=y
+@@ -63,3 +63,5 @@ CONFIG_USB=y
  CONFIG_DM_USB=y
  CONFIG_USB_XHCI_HCD=y
  CONFIG_USB_STORAGE=y
 +CONFIG_WDT=y
 +CONFIG_WDT_ORION=y
 diff --git a/include/configs/clearfog.h b/include/configs/clearfog.h
-index f57f9b21ab..870bac78f4 100644
+index 7d56dfd86e..e92b07871d 100644
 --- a/include/configs/clearfog.h
 +++ b/include/configs/clearfog.h
-@@ -25,9 +25,15 @@
- #define CONFIG_SYS_I2C
- #define CONFIG_SYS_I2C_MVTWSI
- #define CONFIG_I2C_MVTWSI_BASE0		MVEBU_TWSI_BASE
-+#define CONFIG_I2C_MVTWSI_BASE1		MVEBU_TWSI1_BASE
- #define CONFIG_SYS_I2C_SLAVE		0x0
- #define CONFIG_SYS_I2C_SPEED		100000
+@@ -21,6 +21,14 @@
+  * Commands configuration
+  */
  
 +/* Watchdog */
 +#if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_WDT_ORION)
 +# define CONFIG_WATCHDOG
 +#endif
 +
++/* CzechLight: we have a 128kB EEPROM */
++#define CONFIG_SYS_EEPROM_SIZE		(128 * 1024)
++
  /* SPI NOR flash default params, used by sf commands */
  #define CONFIG_SF_DEFAULT_BUS		1
  
-@@ -54,6 +60,9 @@
+@@ -47,6 +55,9 @@
  #define CONFIG_ENV_OFFSET		0xf0000
  #define CONFIG_ENV_ADDR			CONFIG_ENV_OFFSET
  
@@ -211,7 +187,7 @@
  #define PHY_ANEG_TIMEOUT	8000	/* PHY needs a longer aneg time */
  
  /* PCIe support */
-@@ -149,14 +158,45 @@
+@@ -139,14 +150,45 @@
  	"scriptaddr=" SCRIPT_ADDR_R "\0" \
  	"pxefile_addr_r=" PXEFILE_ADDR_R "\0"
  
diff --git a/configs/czechlight_clearfog_defconfig b/configs/czechlight_clearfog_defconfig
index 7dfe952..50150a8 100644
--- a/configs/czechlight_clearfog_defconfig
+++ b/configs/czechlight_clearfog_defconfig
@@ -57,7 +57,7 @@
 BR2_TARGET_UBOOT_BUILD_SYSTEM_KCONFIG=y
 BR2_TARGET_UBOOT_CUSTOM_GIT=y
 BR2_TARGET_UBOOT_CUSTOM_REPO_URL="https://gerrit.cesnet.cz/github/trini/u-boot"
-BR2_TARGET_UBOOT_CUSTOM_REPO_VERSION="233719cc40"
+BR2_TARGET_UBOOT_CUSTOM_REPO_VERSION="4aee624c92"
 BR2_TARGET_UBOOT_PATCH="$(BR2_EXTERNAL_CZECHLIGHT_PATH)/board/czechlight/clearfog/patches/u-boot/boot.patch"
 BR2_TARGET_UBOOT_BOARD_DEFCONFIG="clearfog"
 BR2_TARGET_UBOOT_CONFIG_FRAGMENT_FILES="$(BR2_EXTERNAL_CZECHLIGHT_PATH)/board/czechlight/clearfog/uboot.fragment"
@@ -75,7 +75,8 @@
 CZECHLIGHT_CFG_FS_SIZE="256M"
 CZECHLIGHT_CFG_FS_PERSIST_SYSREPO=y
 CZECHLIGHT_CFG_FS_PERSIST_KEYS=y
-BR2_PACKAGE_CZECHLIGHT_CLEARFOG_LEDS_BOOT=y
+BR2_PACKAGE_CZECHLIGHT_CLEARFOG_LEDS=y
+CZECHLIGHT_CLEARFOG_LEDS_BOOT=y
 CZECHLIGHT_RAUC_ROOTFS=y
 CZECHLIGHT_RAUC_COMPATIBLE="czechlight-clearfog"
 CZECHLIGHT_RAUC_SLOT_A_ROOTFS_DEV="/dev/mmcblk0p1"
diff --git a/package/Config.in b/package/Config.in
index cc97cbe..88752cc 100644
--- a/package/Config.in
+++ b/package/Config.in
@@ -1,6 +1,6 @@
 source "$BR2_EXTERNAL_CZECHLIGHT_PATH/package/cla-sysrepo/Config.in"
 source "$BR2_EXTERNAL_CZECHLIGHT_PATH/package/czechlight-cfg-fs/Config.in"
-source "$BR2_EXTERNAL_CZECHLIGHT_PATH/package/czechlight-clearfog-leds-boot/Config.in"
+source "$BR2_EXTERNAL_CZECHLIGHT_PATH/package/czechlight-clearfog-leds/Config.in"
 source "$BR2_EXTERNAL_CZECHLIGHT_PATH/package/czechlight-rauc/Config.in"
 source "$BR2_EXTERNAL_CZECHLIGHT_PATH/package/czechlight-separate-boot/Config.in"
 source "$BR2_EXTERNAL_CZECHLIGHT_PATH/package/grub2-tools/Config.in"
diff --git a/package/czechlight-clearfog-leds-boot/Config.in b/package/czechlight-clearfog-leds-boot/Config.in
deleted file mode 100644
index 88e47ff..0000000
--- a/package/czechlight-clearfog-leds-boot/Config.in
+++ /dev/null
@@ -1,4 +0,0 @@
-config BR2_PACKAGE_CZECHLIGHT_CLEARFOG_LEDS_BOOT
-	bool "Indicate a successful boot via LEDs"
-	depends on CZECHLIGHT_RAUC_ROOTFS
-	depends on BR2_INIT_SYSTEMD
diff --git a/package/czechlight-clearfog-leds-boot/czechlight-clearfog-leds-boot.mk b/package/czechlight-clearfog-leds-boot/czechlight-clearfog-leds-boot.mk
deleted file mode 100644
index 8d0896a..0000000
--- a/package/czechlight-clearfog-leds-boot/czechlight-clearfog-leds-boot.mk
+++ /dev/null
@@ -1,9 +0,0 @@
-define CZECHLIGHT_CLEARFOG_LEDS_BOOT_INSTALL_TARGET_CMDS
-	mkdir -p $(TARGET_DIR)/usr/lib/systemd/system/multi-user.target.wants/
-	$(INSTALL) -D -m 0644 \
-		$(BR2_EXTERNAL_CZECHLIGHT_PATH)/package/czechlight-clearfog-leds-boot/czechlight-clearfog-leds.service \
-		$(TARGET_DIR)/usr/lib/systemd/system/
-	ln -sf ../czechlight-clearfog-leds.service $(TARGET_DIR)/usr/lib/systemd/system/multi-user.target.wants/
-endef
-
-$(eval $(generic-package))
diff --git a/package/czechlight-clearfog-leds/Config.in b/package/czechlight-clearfog-leds/Config.in
new file mode 100644
index 0000000..5072348
--- /dev/null
+++ b/package/czechlight-clearfog-leds/Config.in
@@ -0,0 +1,14 @@
+config BR2_PACKAGE_CZECHLIGHT_CLEARFOG_LEDS
+	bool "LED functions for Clearfog-based CzechLight devices"
+	depends on BR2_INIT_SYSTEMD
+	help
+	  Userspace configuration of LEDs for indicating various states.
+
+if BR2_PACKAGE_CZECHLIGHT_CLEARFOG_LEDS
+
+config CZECHLIGHT_CLEARFOG_LEDS_BOOT
+	bool "Indicate a successful boot via LEDs"
+	depends on CZECHLIGHT_RAUC_ROOTFS
+	default Y
+
+endif # BR2_PACKAGE_CZECHLIGHT_CLEARFOG_LEDS
diff --git a/package/czechlight-clearfog-leds-boot/czechlight-clearfog-leds.service b/package/czechlight-clearfog-leds/czechlight-clearfog-leds-boot.service
similarity index 100%
rename from package/czechlight-clearfog-leds-boot/czechlight-clearfog-leds.service
rename to package/czechlight-clearfog-leds/czechlight-clearfog-leds-boot.service
diff --git a/package/czechlight-clearfog-leds/czechlight-clearfog-leds.mk b/package/czechlight-clearfog-leds/czechlight-clearfog-leds.mk
new file mode 100644
index 0000000..8af2f9b
--- /dev/null
+++ b/package/czechlight-clearfog-leds/czechlight-clearfog-leds.mk
@@ -0,0 +1,19 @@
+ifdef CZECHLIGHT_CLEARFOG_LEDS_BOOT
+define CZECHLIGHT_CLEARFOG_LEDS_BOOT_INSTALL_TARGET_CMDS
+        $(INSTALL) -D -m 0644 \
+                $(BR2_EXTERNAL_CZECHLIGHT_PATH)/package/czechlight-clearfog-leds/czechlight-clearfog-leds-boot.service \
+                $(TARGET_DIR)/usr/lib/systemd/system/
+        ln -sf ../czechlight-clearfog-leds-boot.service $(TARGET_DIR)/usr/lib/systemd/system/multi-user.target.wants/
+endef
+endif
+
+define CZECHLIGHT_CLEARFOG_LEDS_INSTALL_TARGET_CMDS
+        mkdir -p $(TARGET_DIR)/usr/lib/systemd/system/multi-user.target.wants/
+        $(INSTALL) -D -m 0644 \
+                $(BR2_EXTERNAL_CZECHLIGHT_PATH)/package/czechlight-clearfog-leds/czechlight-clearfog-leds.service \
+                $(TARGET_DIR)/usr/lib/systemd/system/
+        ln -sf ../czechlight-clearfog-leds.service $(TARGET_DIR)/usr/lib/systemd/system/multi-user.target.wants/
+	$(CZECHLIGHT_CLEARFOG_LEDS_BOOT_INSTALL_TARGET_CMDS)
+endef
+
+$(eval $(generic-package))
diff --git a/package/czechlight-clearfog-leds/czechlight-clearfog-leds.service b/package/czechlight-clearfog-leds/czechlight-clearfog-leds.service
new file mode 100644
index 0000000..72f0202
--- /dev/null
+++ b/package/czechlight-clearfog-leds/czechlight-clearfog-leds.service
@@ -0,0 +1,15 @@
+[Unit]
+Description=Indication of component state via LEDs on Clearfog
+
+[Service]
+Type=oneshot
+# SFP: green lit for "link"
+# SFP: green blinking for activity
+ExecStart=/bin/sh -c 'echo netdev > /sys/class/leds/sfp:green/trigger'
+ExecStart=/bin/sh -c 'echo eth2 > /sys/class/leds/sfp:green/device_name'
+ExecStart=/bin/sh -c 'echo 1 > /sys/class/leds/sfp:green/link'
+ExecStart=/bin/sh -c 'echo 1 > /sys/class/leds/sfp:green/rx'
+ExecStart=/bin/sh -c 'echo 1 > /sys/class/leds/sfp:green/tx'
+# LINE/EXPRESS: green for "we're getting some signal"
+ExecStart=/bin/sh -c 'echo gpio > /sys/class/leds/line:green/trigger'
+ExecStart=/bin/sh -c "sed -En 's/.*gpio-(.*) \\(EDFA1_ST1_IN_LOS_A .*/\\1/p' /sys/kernel/debug/gpio > /sys/class/leds/line:green/gpio"