Commit da618fe6 authored by Josua Mayer's avatar Josua Mayer

half-twins: connect sfp cages link status to LEDs

Directly connect the sfp drivers's (sfp.c) link up and down events to an
LED node in device-tree. This solution is a workaround to the
shortcomings of the generic led triggers framework in combination with
multiple dynamic network interfaces, hot-pluggable phys (inside sfp
modules) and the dpaa2 driver in particular.
Signed-off-by: default avatarJosua Mayer <josua@solid-run.com>
parent c0eea644
From c41f02f90056c820a5f407fc0aeaced0d68a922b Mon Sep 17 00:00:00 2001
From: Josua Mayer <josua@solid-run.com>
Date: Mon, 9 May 2022 12:43:35 +0300
Subject: [PATCH 14/18] arm64: dts: lx2160a-half-twins: fix swapped leds
Signed-off-by: Josua Mayer <josua@solid-run.com>
---
.../boot/dts/freescale/fsl-lx2160a-half-twins.dts | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/arch/arm64/boot/dts/freescale/fsl-lx2160a-half-twins.dts b/arch/arm64/boot/dts/freescale/fsl-lx2160a-half-twins.dts
index 55d4bbb6caa2..606f7f717622 100644
--- a/arch/arm64/boot/dts/freescale/fsl-lx2160a-half-twins.dts
+++ b/arch/arm64/boot/dts/freescale/fsl-lx2160a-half-twins.dts
@@ -264,12 +264,12 @@ led_c1_ab {
default-state = "off";
};
led_c1_bt {
- gpios = <&expander1 3 GPIO_ACTIVE_LOW>;
+ gpios = <&expander1 4 GPIO_ACTIVE_LOW>;
linux,default-trigger = "netdev";
default-state = "off";
};
led_c1_bb {
- gpios = <&expander1 4 GPIO_ACTIVE_LOW>;
+ gpios = <&expander1 3 GPIO_ACTIVE_LOW>;
linux,default-trigger = "netdev";
default-state = "off";
};
@@ -284,12 +284,12 @@ led_c2_ab {
default-state = "off";
};
led_c2_bt {
- gpios = <&expander1 9 GPIO_ACTIVE_LOW>;
+ gpios = <&expander1 10 GPIO_ACTIVE_LOW>;
linux,default-trigger = "netdev";
default-state = "off";
};
led_c2_bb {
- gpios = <&expander1 10 GPIO_ACTIVE_LOW>;
+ gpios = <&expander1 9 GPIO_ACTIVE_LOW>;
linux,default-trigger = "netdev";
default-state = "off";
};
@@ -304,12 +304,12 @@ led_c3_ab {
default-state = "off";
};
led_c3_bt {
- gpios = <&expander1 13 GPIO_ACTIVE_LOW>;
+ gpios = <&expander1 14 GPIO_ACTIVE_LOW>;
linux,default-trigger = "netdev";
default-state = "off";
};
led_c3_bb {
- gpios = <&expander1 14 GPIO_ACTIVE_LOW>;
+ gpios = <&expander1 13 GPIO_ACTIVE_LOW>;
linux,default-trigger = "netdev";
default-state = "off";
};
--
2.35.3
From bd4c1c7d26d81d66b667e46e4a0d3b64f43db01e Mon Sep 17 00:00:00 2001
From: Josua Mayer <josua@solid-run.com>
Date: Mon, 9 May 2022 11:05:55 +0300
Subject: [PATCH 15/18] arm64: dts: lx2160a-half-twins: extend led nodes with
handle and name
Add ": led-bla-blub" suffix to led nodes so that they can be referred to
by name.
Signed-off-by: Josua Mayer <josua@solid-run.com>
---
.../dts/freescale/fsl-lx2160a-half-twins.dts | 32 +++++++++----------
1 file changed, 16 insertions(+), 16 deletions(-)
diff --git a/arch/arm64/boot/dts/freescale/fsl-lx2160a-half-twins.dts b/arch/arm64/boot/dts/freescale/fsl-lx2160a-half-twins.dts
index 606f7f717622..e6c46ac4fc27 100644
--- a/arch/arm64/boot/dts/freescale/fsl-lx2160a-half-twins.dts
+++ b/arch/arm64/boot/dts/freescale/fsl-lx2160a-half-twins.dts
@@ -253,82 +253,82 @@ ht_c3_bb_sfp: ht-c3-bb-sfp {
};
leds {
compatible = "gpio-leds";
- led_c1_at {
+ led_c1_at: led-c1-at {
gpios = <&expander1 1 GPIO_ACTIVE_LOW>;
linux,default-trigger = "netdev";
default-state = "off";
};
- led_c1_ab {
+ led_c1_ab: led-c1-ab {
gpios = <&expander1 2 GPIO_ACTIVE_LOW>;
linux,default-trigger = "netdev";
default-state = "off";
};
- led_c1_bt {
+ led_c1_bt: led-c1-bt {
gpios = <&expander1 4 GPIO_ACTIVE_LOW>;
linux,default-trigger = "netdev";
default-state = "off";
};
- led_c1_bb {
+ led_c1_bb: led-c1-bb {
gpios = <&expander1 3 GPIO_ACTIVE_LOW>;
linux,default-trigger = "netdev";
default-state = "off";
};
- led_c2_at {
+ led_c2_at: led-c2-at {
gpios = <&expander1 5 GPIO_ACTIVE_LOW>;
linux,default-trigger = "netdev";
default-state = "off";
};
- led_c2_ab {
+ led_c2_ab: led-c2-ab {
gpios = <&expander1 6 GPIO_ACTIVE_LOW>;
linux,default-trigger = "netdev";
default-state = "off";
};
- led_c2_bt {
+ led_c2_bt: led-c2-bt {
gpios = <&expander1 10 GPIO_ACTIVE_LOW>;
linux,default-trigger = "netdev";
default-state = "off";
};
- led_c2_bb {
+ led_c2_bb: led-c2-bb {
gpios = <&expander1 9 GPIO_ACTIVE_LOW>;
linux,default-trigger = "netdev";
default-state = "off";
};
- led_c3_at {
+ led_c3_at: led-c3-at {
gpios = <&expander1 11 GPIO_ACTIVE_LOW>;
linux,default-trigger = "netdev";
default-state = "off";
};
- led_c3_ab {
+ led_c3_ab: led-c3-ab {
gpios = <&expander1 12 GPIO_ACTIVE_LOW>;
linux,default-trigger = "netdev";
default-state = "off";
};
- led_c3_bt {
+ led_c3_bt: led-c3-bt {
gpios = <&expander1 14 GPIO_ACTIVE_LOW>;
linux,default-trigger = "netdev";
default-state = "off";
};
- led_c3_bb {
+ led_c3_bb: led-c3-bb {
gpios = <&expander1 13 GPIO_ACTIVE_LOW>;
linux,default-trigger = "netdev";
default-state = "off";
};
- led_ht_c3_at {
+ led_ht_c3_at: led-ht-c3-at {
gpios = <&expander3 11 GPIO_ACTIVE_LOW>;
linux,default-trigger = "netdev";
default-state = "off";
};
- led_ht_c3_ab {
+ led_ht_c3_ab: led-ht-c3-ab {
gpios = <&expander3 12 GPIO_ACTIVE_LOW>;
linux,default-trigger = "netdev";
default-state = "off";
};
- led_ht_c3_bt {
+ led_ht_c3_bt: led-ht-c3-bt {
gpios = <&expander3 14 GPIO_ACTIVE_LOW>;
linux,default-trigger = "netdev";
default-state = "off";
};
- led_ht_c3_bb {
+ led_ht_c3_bb: led-ht-c3-bb {
gpios = <&expander3 13 GPIO_ACTIVE_LOW>;
linux,default-trigger = "netdev";
default-state = "off";
--
2.35.3
From 69294b9efe4bf2873c9f3eafcd0aae964e69a9c8 Mon Sep 17 00:00:00 2001
From: Josua Mayer <josua@solid-run.com>
Date: Mon, 9 May 2022 12:07:35 +0300
Subject: [PATCH 16/18] leds: core: add variant of of_led_get for using
directly a led device node
The existing of_led_get function expects a handle to a device-tree node,
containing an "leds" property.
However properties refering to LEDs can potentially have different
names.
Add a new of_led_get_hack function that can directly parse a given led node.
Signed-off-by: Josua Mayer <josua@solid-run.com>
---
drivers/leds/led-class.c | 25 +++++++++++++++++++++++++
include/linux/leds.h | 1 +
2 files changed, 26 insertions(+)
diff --git a/drivers/leds/led-class.c b/drivers/leds/led-class.c
index 131ca83f5fb3..3198ebb5cfaf 100644
--- a/drivers/leds/led-class.c
+++ b/drivers/leds/led-class.c
@@ -249,6 +249,31 @@ struct led_classdev *of_led_get(struct device_node *np, int index)
}
EXPORT_SYMBOL_GPL(of_led_get);
+/**
+ * of_led_get_hack() - request a LED device via the LED framework
+ * @led_node: device node of the LED device
+ *
+ * Returns the LED device parsed from the device tree node
+ * or a negative error-code on failure.
+ */
+struct led_classdev *of_led_get_hack(struct device_node *led_node)
+{
+ struct device *led_dev;
+ struct led_classdev *led_cdev;
+
+ led_dev = class_find_device_by_of_node(leds_class, led_node);
+ if (!led_dev)
+ return ERR_PTR(-EPROBE_DEFER);
+
+ led_cdev = dev_get_drvdata(led_dev);
+
+ if (!try_module_get(led_cdev->dev->parent->driver->owner))
+ return ERR_PTR(-ENODEV);
+
+ return led_cdev;
+}
+EXPORT_SYMBOL_GPL(of_led_get_hack);
+
/**
* led_put() - release a LED device
* @led_cdev: LED device
diff --git a/include/linux/leds.h b/include/linux/leds.h
index 6a8d6409c993..92bafe1f8e2d 100644
--- a/include/linux/leds.h
+++ b/include/linux/leds.h
@@ -206,6 +206,7 @@ void led_classdev_suspend(struct led_classdev *led_cdev);
void led_classdev_resume(struct led_classdev *led_cdev);
extern struct led_classdev *of_led_get(struct device_node *np, int index);
+extern struct led_classdev *of_led_get_hack(struct device_node *led_node);
extern void led_put(struct led_classdev *led_cdev);
struct led_classdev *__must_check devm_of_led_get(struct device *dev,
int index);
--
2.35.3
From 9be18c5767fa66213441095344afbc540e936157 Mon Sep 17 00:00:00 2001
From: Josua Mayer <josua@solid-run.com>
Date: Sun, 8 May 2022 16:36:14 +0300
Subject: [PATCH 17/18] net: sfp: support assigning status LEDs to SFP
connectors
Add support for turning on- and off an LED to indicate link status on
sfp ports. This is a necessary hack to work shortcomings of the generic
LED framework outlined below:
While it is generally suggested to use the generic led framework with
triggers such as netdev or phy, neither is currently useable when
combining imultiple dpaa2 network devices with sfp connectors and LEDs
controlled from GPIOs.
netdev triggers are insufficient for two reasons:
First because network devices are dynamically created and destroyed at
runtime, e.g. through NXPs restool, the names and numbering of interfaces
are never stable.
Secondly the mapping of one network interface to an led node appears to
be manual by writing the interface name - e.g. eth0 - to the sysfs entry
for a particular LED.
phy triggers are insufficient for two other reasons:
The real phy, the one inside an SFP module, is inserted at runtime,
arbitrarily by a an operator. It can exist at different i2c addresses -
or not at all e.g. for many fiber modules.
There can be a second "phy" though, on Layerscape platforms the serdes's
have are now described inside the dpmac nodes as phys, and they could
conceivably be equally aware of link status or negotiated speed.
However the phy led trigger driver is only registered from the
phy_connect or phy_attach functions when connecting an object of type
phy_device to a net_device. But the DPAA2 driver does not instantiate a
phy_device object in the first place.
Signed-off-by: Josua Mayer <josua@solid-run.com>
---
.../devicetree/bindings/net/sff,sfp.txt | 4 +++
drivers/net/phy/sfp.c | 36 +++++++++++++++++++
2 files changed, 40 insertions(+)
diff --git a/Documentation/devicetree/bindings/net/sff,sfp.txt b/Documentation/devicetree/bindings/net/sff,sfp.txt
index 832139919f20..d46df1300d28 100644
--- a/Documentation/devicetree/bindings/net/sff,sfp.txt
+++ b/Documentation/devicetree/bindings/net/sff,sfp.txt
@@ -37,6 +37,10 @@ Optional Properties:
Specifies the maximum power consumption allowable by a module in the
slot, in milli-Watts. Presently, modules can be up to 1W, 1.5W or 2W.
+- link-status-led:
+ description: An LED node for showing link status.
+ $ref: /schemas/types.yaml#/definitions/phandle
+
Example #1: Direct serdes to SFP connection
sfp_eth3: sfp-eth3 {
diff --git a/drivers/net/phy/sfp.c b/drivers/net/phy/sfp.c
index 2fff62695455..0f18e77b8b68 100644
--- a/drivers/net/phy/sfp.c
+++ b/drivers/net/phy/sfp.c
@@ -7,6 +7,7 @@
#include <linux/i2c.h>
#include <linux/interrupt.h>
#include <linux/jiffies.h>
+#include <linux/leds.h>
#include <linux/mdio/mdio-i2c.h>
#include <linux/module.h>
#include <linux/mutex.h>
@@ -258,6 +259,7 @@ struct sfp {
char *hwmon_name;
#endif
+ struct led_classdev *link_status_led;
};
static bool sff_module_supported(const struct sfp_eeprom_id *id)
@@ -1490,6 +1492,8 @@ static int sfp_sm_probe_phy(struct sfp *sfp, bool is_c45)
static void sfp_sm_link_up(struct sfp *sfp)
{
+ if (sfp->link_status_led)
+ led_set_brightness(sfp->link_status_led, sfp->link_status_led->max_brightness);
sfp_link_up(sfp->sfp_bus);
sfp_sm_next(sfp, SFP_S_LINK_UP, 0);
}
@@ -1497,6 +1501,8 @@ static void sfp_sm_link_up(struct sfp *sfp)
static void sfp_sm_link_down(struct sfp *sfp)
{
sfp_link_down(sfp->sfp_bus);
+ if (sfp->link_status_led)
+ led_set_brightness(sfp->link_status_led, LED_OFF);
}
static void sfp_sm_link_check_los(struct sfp *sfp)
@@ -2425,6 +2431,23 @@ static int sfp_probe(struct platform_device *pdev)
i2c = of_find_i2c_adapter_by_node(np);
of_node_put(np);
+
+ np = of_parse_phandle(node, "link-status-led", 0);
+ sfp->link_status_led = of_led_get_hack(np);
+ of_node_put(np);
+
+ if (IS_ERR(sfp->link_status_led)) {
+ switch (PTR_ERR(sfp->link_status_led)) {
+ case -ENODEV:
+ sfp->link_status_led = NULL;
+ break;
+ default:
+ dev_err(sfp->dev, "failed to get link-status led from 'link-status-led' property: %pe\n", sfp->link_status_led);
+ fallthrough;
+ case -EPROBE_DEFER:
+ return PTR_ERR(sfp->link_status_led);
+ };
+ }
} else if (has_acpi_companion(&pdev->dev)) {
struct acpi_device *adev = ACPI_COMPANION(&pdev->dev);
struct fwnode_handle *fw = acpi_fwnode_handle(adev);
@@ -2453,6 +2476,14 @@ static int sfp_probe(struct platform_device *pdev)
return err;
}
+ if (sfp->link_status_led) {
+ /* remove from sysfs to avoid userspce control */
+ led_sysfs_disable(sfp->link_status_led);
+
+ /* turn off initially */
+ led_set_brightness(sfp->link_status_led, LED_OFF);
+ }
+
for (i = 0; i < GPIO_MAX; i++)
if (sff->gpios & BIT(i)) {
sfp->gpio[i] = devm_gpiod_get_optional(sfp->dev,
@@ -2545,6 +2576,11 @@ static int sfp_remove(struct platform_device *pdev)
{
struct sfp *sfp = platform_get_drvdata(pdev);
+ if (sfp->link_status_led) {
+ /* re-enable sysfs interface */
+ led_sysfs_enable(sfp->link_status_led);
+ }
+
sfp_unregister_socket(sfp->sfp_bus);
rtnl_lock();
--
2.35.3
From c5d7beec4f28c3b9615bd7cd20a720fcb5f4580a Mon Sep 17 00:00:00 2001
From: Josua Mayer <josua@solid-run.com>
Date: Mon, 9 May 2022 10:55:53 +0300
Subject: [PATCH 18/18] arm64: dts: lx2160a-half-twins: link sfp cage leds to
sfp cages
This is a hack in that the led trigger framework is completely
sidestepped.
---
.../dts/freescale/fsl-lx2160a-half-twins.dts | 32 +++++++++----------
1 file changed, 16 insertions(+), 16 deletions(-)
diff --git a/arch/arm64/boot/dts/freescale/fsl-lx2160a-half-twins.dts b/arch/arm64/boot/dts/freescale/fsl-lx2160a-half-twins.dts
index e6c46ac4fc27..9cb554f55e77 100644
--- a/arch/arm64/boot/dts/freescale/fsl-lx2160a-half-twins.dts
+++ b/arch/arm64/boot/dts/freescale/fsl-lx2160a-half-twins.dts
@@ -160,177 +160,177 @@ c1_at_sfp: c1-at-sfp {
i2c-bus = <&twins_sfp_c1_at_i2c>;
mod-def0-gpio = <&expander0 1 GPIO_ACTIVE_LOW>;
maximum-power-milliwatt = <2000>;
+ link-status-led = <&led_c1_at>;
};
c1_ab_sfp: c1-ab-sfp {
compatible = "sff,sfp";
i2c-bus = <&twins_sfp_c1_ab_i2c>;
mod-def0-gpio = <&expander0 2 GPIO_ACTIVE_LOW>;
maximum-power-milliwatt = <2000>;
+ link-status-led = <&led_c1_ab>;
};
c1_bt_sfp: c1-bt-sfp {
compatible = "sff,sfp";
i2c-bus = <&twins_sfp_c1_bt_i2c>;
mod-def0-gpio = <&expander0 3 GPIO_ACTIVE_LOW>;
maximum-power-milliwatt = <2000>;
+ link-status-led = <&led_c1_bt>;
};
c1_bb_sfp: c1-bb-sfp {
compatible = "sff,sfp";
i2c-bus = <&twins_sfp_c1_bb_i2c>;
mod-def0-gpio = <&expander0 4 GPIO_ACTIVE_LOW>;
maximum-power-milliwatt = <2000>;
+ link-status-led = <&led_c1_bb>;
};
c2_at_sfp: c2-at-sfp {
compatible = "sff,sfp";
i2c-bus = <&twins_sfp_c2_at_i2c>;
mod-def0-gpio = <&expander0 5 GPIO_ACTIVE_LOW>;
maximum-power-milliwatt = <2000>;
+ link-status-led = <&led_c2_at>;
};
c2_ab_sfp: c2-ab-sfp {
compatible = "sff,sfp";
i2c-bus = <&twins_sfp_c2_ab_i2c>;
mod-def0-gpio = <&expander0 6 GPIO_ACTIVE_LOW>;
maximum-power-milliwatt = <2000>;
+ link-status-led = <&led_c2_ab>;
};
c2_bt_sfp: c2-bt-sfp {
compatible = "sff,sfp";
i2c-bus = <&twins_sfp_c2_bt_i2c>;
mod-def0-gpio = <&expander0 9 GPIO_ACTIVE_LOW>;
maximum-power-milliwatt = <2000>;
+ link-status-led = <&led_c2_bt>;
};
c2_bb_sfp: c2-bb-sfp {
compatible = "sff,sfp";
i2c-bus = <&twins_sfp_c2_bb_i2c>;
mod-def0-gpio = <&expander0 10 GPIO_ACTIVE_LOW>;
maximum-power-milliwatt = <2000>;
+ link-status-led = <&led_c2_bb>;
};
c3_at_sfp: c3-at-sfp {
compatible = "sff,sfp";
i2c-bus = <&twins_sfp_c3_at_i2c>;
mod-def0-gpio = <&expander0 11 GPIO_ACTIVE_LOW>;
maximum-power-milliwatt = <2000>;
+ link-status-led = <&led_c3_at>;
};
c3_ab_sfp: c3-ab-sfp {
compatible = "sff,sfp";
i2c-bus = <&twins_sfp_c3_ab_i2c>;
mod-def0-gpio = <&expander0 12 GPIO_ACTIVE_LOW>;
maximum-power-milliwatt = <2000>;
+ link-status-led = <&led_c3_ab>;
};
c3_bt_sfp: c3-bt-sfp {
compatible = "sff,sfp";
i2c-bus = <&twins_sfp_c3_bt_i2c>;
mod-def0-gpio = <&expander0 13 GPIO_ACTIVE_LOW>;
maximum-power-milliwatt = <2000>;
+ link-status-led = <&led_c3_bt>;
};
c3_bb_sfp: c3-bb-sfp {
compatible = "sff,sfp";
i2c-bus = <&twins_sfp_c3_bb_i2c>;
mod-def0-gpio = <&expander0 14 GPIO_ACTIVE_LOW>;
maximum-power-milliwatt = <2000>;
+ link-status-led = <&led_c3_bb>;
};
ht_c3_at_sfp: ht-c3-at-sfp {
compatible = "sff,sfp";
i2c-bus = <&htwins_sfp_c3_at_i2c>;
mod-def0-gpio = <&expander2 11 GPIO_ACTIVE_LOW>;
maximum-power-milliwatt = <2000>;
+ link-status-led = <&led_ht_c3_at>;
};
ht_c3_ab_sfp: ht-c3-ab-sfp {
compatible = "sff,sfp";
i2c-bus = <&htwins_sfp_c3_ab_i2c>;
mod-def0-gpio = <&expander2 12 GPIO_ACTIVE_LOW>;
maximum-power-milliwatt = <2000>;
+ link-status-led = <&led_ht_c3_ab>;
};
ht_c3_bt_sfp: ht-c3-bt-sfp {
compatible = "sff,sfp";
i2c-bus = <&htwins_sfp_c3_bt_i2c>;
mod-def0-gpio = <&expander2 13 GPIO_ACTIVE_LOW>;
maximum-power-milliwatt = <2000>;
+ link-status-led = <&led_ht_c3_bt>;
};
ht_c3_bb_sfp: ht-c3-bb-sfp {
compatible = "sff,sfp";
i2c-bus = <&htwins_sfp_c3_bb_i2c>;
mod-def0-gpio = <&expander2 14 GPIO_ACTIVE_LOW>;
maximum-power-milliwatt = <2000>;
+ link-status-led = <&led_ht_c3_bb>;
};
leds {
compatible = "gpio-leds";
led_c1_at: led-c1-at {
gpios = <&expander1 1 GPIO_ACTIVE_LOW>;
- linux,default-trigger = "netdev";
default-state = "off";
};
led_c1_ab: led-c1-ab {
gpios = <&expander1 2 GPIO_ACTIVE_LOW>;
- linux,default-trigger = "netdev";
default-state = "off";
};
led_c1_bt: led-c1-bt {
gpios = <&expander1 4 GPIO_ACTIVE_LOW>;
- linux,default-trigger = "netdev";
default-state = "off";
};
led_c1_bb: led-c1-bb {
gpios = <&expander1 3 GPIO_ACTIVE_LOW>;
- linux,default-trigger = "netdev";
default-state = "off";
};
led_c2_at: led-c2-at {
gpios = <&expander1 5 GPIO_ACTIVE_LOW>;
- linux,default-trigger = "netdev";
default-state = "off";
};
led_c2_ab: led-c2-ab {
gpios = <&expander1 6 GPIO_ACTIVE_LOW>;
- linux,default-trigger = "netdev";
default-state = "off";
};
led_c2_bt: led-c2-bt {
gpios = <&expander1 10 GPIO_ACTIVE_LOW>;
- linux,default-trigger = "netdev";
default-state = "off";
};
led_c2_bb: led-c2-bb {
gpios = <&expander1 9 GPIO_ACTIVE_LOW>;
- linux,default-trigger = "netdev";
default-state = "off";
};
led_c3_at: led-c3-at {
gpios = <&expander1 11 GPIO_ACTIVE_LOW>;
- linux,default-trigger = "netdev";
default-state = "off";
};
led_c3_ab: led-c3-ab {
gpios = <&expander1 12 GPIO_ACTIVE_LOW>;
- linux,default-trigger = "netdev";
default-state = "off";
};
led_c3_bt: led-c3-bt {
gpios = <&expander1 14 GPIO_ACTIVE_LOW>;
- linux,default-trigger = "netdev";
default-state = "off";
};
led_c3_bb: led-c3-bb {
gpios = <&expander1 13 GPIO_ACTIVE_LOW>;
- linux,default-trigger = "netdev";
default-state = "off";
};
led_ht_c3_at: led-ht-c3-at {
gpios = <&expander3 11 GPIO_ACTIVE_LOW>;
- linux,default-trigger = "netdev";
default-state = "off";
};
led_ht_c3_ab: led-ht-c3-ab {
gpios = <&expander3 12 GPIO_ACTIVE_LOW>;
- linux,default-trigger = "netdev";
default-state = "off";
};
led_ht_c3_bt: led-ht-c3-bt {
gpios = <&expander3 14 GPIO_ACTIVE_LOW>;
- linux,default-trigger = "netdev";
default-state = "off";
};
led_ht_c3_bb: led-ht-c3-bb {
gpios = <&expander3 13 GPIO_ACTIVE_LOW>;
- linux,default-trigger = "netdev";
default-state = "off";
};
};
--
2.35.3
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment