Skip to contentSkip to conversation

dt-bindings: can: fsl,flexcan.yaml: introduce the stb-gpios property

PATCH In review Fabio Estevam 2 participants 3 messages Jan 7, 2021 – Jan 13, 2021

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/2 dt-bindings: can: fsl,flexcan.yaml: introduce the stb-gpios property

It is very common to have an STB pin in CAN transceivers, which allows putting the transceiver in standby or normal operation mode.

Add a new optional 'stb-gpios' property to describe this.

---
 Documentation/devicetree/bindings/net/can/fsl,flexcan.yaml | 3 +++
 1 file changed, 3 insertions(+)
Documentation/devicetree/bindings/net/can/fsl,flexcan.yaml +3 -0
index 0d2df30f19db..64f904c4b3d5 100644
@@ -66,6 +66,9 @@ properties:
   xceiver-supply:
     description: Regulator that powers the CAN transceiver.
 
+  stb-gpios:
+    description: GPIO that controls the STB CAN transceiver pin.
+
   big-endian:
     $ref: /schemas/types.yaml#/definitions/flag
     description: |
Signature · 1 line
2.17.1
#1 lore raw

PATCH 2/2 can: flexcan: allow the control of the STB CAN transceiver pin

It is very common to have an STB pin in CAN transceivers, which allows putting the transceiver in standby or normal operation mode.

Add support for handling the STB pin.

---
 drivers/net/can/flexcan.c | 11 +++++++++++
 1 file changed, 11 insertions(+)
drivers/net/can/flexcan.c +11 -0
index 038fe1036df2..094050b4b461 100644
@@ -17,6 +17,7 @@
 #include <linux/can/rx-offload.h>
 #include <linux/clk.h>
 #include <linux/delay.h>
+#include <linux/gpio/consumer.h>
 #include <linux/interrupt.h>
 #include <linux/io.h>
 #include <linux/mfd/syscon.h>
@@ -358,6 +359,8 @@ struct flexcan_priv {
 	struct regulator *reg_xceiver;
 	struct flexcan_stop_mode stm;
 
+	struct gpio_desc *stb;
+
 	/* Read and Write APIs */
 	u32 (*read)(void __iomem *addr);
 	void (*write)(u32 val, void __iomem *addr);
@@ -617,6 +620,8 @@ static void flexcan_clks_disable(const struct flexcan_priv *priv)
 
 static inline int flexcan_transceiver_enable(const struct flexcan_priv *priv)
 {
+	gpiod_set_value_cansleep(priv->stb, 0);
+
 	if (!priv->reg_xceiver)
 		return 0;
 
@@ -625,6 +630,8 @@ static inline int flexcan_transceiver_enable(const struct flexcan_priv *priv)
 
 static inline int flexcan_transceiver_disable(const struct flexcan_priv *priv)
 {
+	gpiod_set_value_cansleep(priv->stb, 1);
+
 	if (!priv->reg_xceiver)
 		return 0;
 
@@ -2044,6 +2051,10 @@ static int flexcan_probe(struct platform_device *pdev)
 		priv->can.bittiming_const = &flexcan_bittiming_const;
 	}
 
+	priv->stb = devm_gpiod_get_optional(&pdev->dev, "stb", GPIOD_OUT_HIGH);
+	if (IS_ERR(priv->stb))
+		return PTR_ERR(priv->stb);
+
 	pm_runtime_get_noresume(&pdev->dev);
 	pm_runtime_set_active(&pdev->dev);
 	pm_runtime_enable(&pdev->dev);
Signature · 1 line
2.17.1
maintainer
#2 lore raw
In reply to Fabio Estevam
Quoted 15 lines · Fabio Estevam

It is very common to have an STB pin in CAN transceivers, which allows putting the transceiver in standby or normal operation mode.

Add a new optional 'stb-gpios' property to describe this.

---
 Documentation/devicetree/bindings/net/can/fsl,flexcan.yaml | 3 +++
 1 file changed, 3 insertions(+)
Documentation/devicetree/bindings/net/can/fsl,flexcan.yaml +0 -0
index 0d2df30f19db..64f904c4b3d5 100644

Documentation/devicetree/bindings/net/can/fsl,flexcan.yaml properties: · line 70

Quoted 5 lines
Documentation/devicetree/bindings/net/can/fsl,flexcan.yaml +2 -0
@@ -66,6 +66,9 @@ properties:
   xceiver-supply:
     description: Regulator that powers the CAN transceiver.
 
+  stb-gpios:
+    description: GPIO that controls the STB CAN transceiver pin.

maxItems: 1

Quoted 7 lines
Documentation/devicetree/bindings/net/can/fsl,flexcan.yaml +1 -0
+
   big-endian:
     $ref: /schemas/types.yaml#/definitions/flag
     description: |
Signature · 1 line
2.17.1