2021-04-15 15:47:45

by Aswath Govindraju

[permalink] [raw]
Subject: [PATCH v2 0/2] MCAN: Add support for implementing transceiver as a phy

The following series of patches add support for implementing the
transceiver as a phy of m_can_platform driver.

TCAN1042 has a standby signal that needs to be pulled high for
sending/receiving messages[1]. TCAN1043 has a enable signal along with
standby signal that needs to be pulled up for sending/receiving
messages[2], and other combinations of the two lines can be used to put the
transceiver in different states to reduce power consumption. On boards
like the AM654-idk and J721e-evm these signals are controlled using gpios.

These gpios are set in phy driver, and the transceiver can be put in
different states using phy API. The phy driver is added in the series [3].

This patch series is dependent on [4].

Changes since v1:
- Used the API devm_phy_get_optional() instead of
devm_of_phy_get_optional_by_index()

[1] - https://www.ti.com/lit/ds/symlink/tcan1042h.pdf
[2] - https://www.ti.com/lit/ds/symlink/tcan1043-q1.pdf
[3] - https://lore.kernel.org/patchwork/project/lkml/list/?series=495365
[4] - https://lore.kernel.org/patchwork/patch/1413286/

Faiz Abbas (2):
dt-bindings: net: can: Document transceiver implementation as phy
can: m_can: Add support for transceiver as phy

.../devicetree/bindings/net/can/bosch,m_can.yaml | 3 +++
drivers/net/can/m_can/m_can.c | 10 ++++++++++
drivers/net/can/m_can/m_can.h | 2 ++
drivers/net/can/m_can/m_can_platform.c | 13 +++++++++++++
4 files changed, 28 insertions(+)

--
2.17.1


2021-04-15 15:49:14

by Aswath Govindraju

[permalink] [raw]
Subject: [PATCH v2 2/2] can: m_can: Add support for transceiver as phy

From: Faiz Abbas <[email protected]>

Add support for implementing transceiver node as phy. The max_bitrate is
obtained by getting a phy attribute.

Signed-off-by: Faiz Abbas <[email protected]>
Signed-off-by: Aswath Govindraju <[email protected]>
---
drivers/net/can/m_can/m_can.c | 10 ++++++++++
drivers/net/can/m_can/m_can.h | 2 ++
drivers/net/can/m_can/m_can_platform.c | 13 +++++++++++++
3 files changed, 25 insertions(+)

diff --git a/drivers/net/can/m_can/m_can.c b/drivers/net/can/m_can/m_can.c
index 34073cd077e4..7d31250446c2 100644
--- a/drivers/net/can/m_can/m_can.c
+++ b/drivers/net/can/m_can/m_can.c
@@ -21,6 +21,7 @@
#include <linux/iopoll.h>
#include <linux/can/dev.h>
#include <linux/pinctrl/consumer.h>
+#include <linux/phy/phy.h>

#include "m_can.h"

@@ -1514,6 +1515,7 @@ static void m_can_stop(struct net_device *dev)
static int m_can_close(struct net_device *dev)
{
struct m_can_classdev *cdev = netdev_priv(dev);
+ int err;

netif_stop_queue(dev);

@@ -1536,6 +1538,10 @@ static int m_can_close(struct net_device *dev)
close_candev(dev);
can_led_event(dev, CAN_LED_EVENT_STOP);

+ err = phy_power_off(cdev->transceiver);
+ if (err)
+ return err;
+
return 0;
}

@@ -1720,6 +1726,10 @@ static int m_can_open(struct net_device *dev)
struct m_can_classdev *cdev = netdev_priv(dev);
int err;

+ err = phy_power_on(cdev->transceiver);
+ if (err)
+ return err;
+
err = m_can_clk_start(cdev);
if (err)
return err;
diff --git a/drivers/net/can/m_can/m_can.h b/drivers/net/can/m_can/m_can.h
index ace071c3e58c..38cad068abad 100644
--- a/drivers/net/can/m_can/m_can.h
+++ b/drivers/net/can/m_can/m_can.h
@@ -28,6 +28,7 @@
#include <linux/iopoll.h>
#include <linux/can/dev.h>
#include <linux/pinctrl/consumer.h>
+#include <linux/phy/phy.h>

/* m_can lec values */
enum m_can_lec_type {
@@ -82,6 +83,7 @@ struct m_can_classdev {
struct workqueue_struct *tx_wq;
struct work_struct tx_work;
struct sk_buff *tx_skb;
+ struct phy *transceiver;

struct can_bittiming_const *bit_timing;
struct can_bittiming_const *data_timing;
diff --git a/drivers/net/can/m_can/m_can_platform.c b/drivers/net/can/m_can/m_can_platform.c
index 599de0e08cd7..82d4f1a15dd7 100644
--- a/drivers/net/can/m_can/m_can_platform.c
+++ b/drivers/net/can/m_can/m_can_platform.c
@@ -6,6 +6,7 @@
// Copyright (C) 2018-19 Texas Instruments Incorporated - http://www.ti.com/

#include <linux/platform_device.h>
+#include <linux/phy/phy.h>

#include "m_can.h"

@@ -67,6 +68,7 @@ static int m_can_plat_probe(struct platform_device *pdev)
struct resource *res;
void __iomem *addr;
void __iomem *mram_addr;
+ struct phy *transceiver;
int irq, ret = 0;

mcan_class = m_can_class_allocate_dev(&pdev->dev,
@@ -101,6 +103,16 @@ static int m_can_plat_probe(struct platform_device *pdev)
goto probe_fail;
}

+ transceiver = devm_phy_optional_get(&pdev->dev, NULL);
+ if (IS_ERR(transceiver)) {
+ ret = PTR_ERR(transceiver);
+ dev_err(&pdev->dev, "error while getting phy, err=%d\n", ret);
+ return ret;
+ }
+
+ if (transceiver)
+ priv->cdev.can.bitrate_max = transceiver->attrs.max_link_rate;
+
priv->base = addr;
priv->mram_base = mram_addr;

@@ -108,6 +120,7 @@ static int m_can_plat_probe(struct platform_device *pdev)
mcan_class->pm_clock_support = 1;
mcan_class->can.clock.freq = clk_get_rate(mcan_class->cclk);
mcan_class->dev = &pdev->dev;
+ mcan_class->transceiver = transceiver;

mcan_class->ops = &m_can_plat_ops;

--
2.17.1

2021-04-15 15:49:20

by Aswath Govindraju

[permalink] [raw]
Subject: [PATCH v2 1/2] dt-bindings: net: can: Document transceiver implementation as phy

From: Faiz Abbas <[email protected]>

Some transceivers need a configuration step (for example, pulling the
standby or enable lines) for them to start sending messages. The
transceiver can be implemented as a phy with the configuration done in the
phy driver. The bit rate limitation can the be obtained by the driver using
the phy node.

Document the above implementation in the bosch mcan bindings

Signed-off-by: Faiz Abbas <[email protected]>
Signed-off-by: Aswath Govindraju <[email protected]>
---
Documentation/devicetree/bindings/net/can/bosch,m_can.yaml | 3 +++
1 file changed, 3 insertions(+)

diff --git a/Documentation/devicetree/bindings/net/can/bosch,m_can.yaml b/Documentation/devicetree/bindings/net/can/bosch,m_can.yaml
index 798fa5fb7bb2..25f74db46bae 100644
--- a/Documentation/devicetree/bindings/net/can/bosch,m_can.yaml
+++ b/Documentation/devicetree/bindings/net/can/bosch,m_can.yaml
@@ -109,6 +109,9 @@ properties:
can-transceiver:
$ref: can-transceiver.yaml#

+ phys:
+ maxItems: 1
+
required:
- compatible
- reg
--
2.17.1

2021-04-15 21:37:29

by Rob Herring (Arm)

[permalink] [raw]
Subject: Re: [PATCH v2 1/2] dt-bindings: net: can: Document transceiver implementation as phy

On Thu, 15 Apr 2021 21:16:34 +0530, Aswath Govindraju wrote:
> From: Faiz Abbas <[email protected]>
>
> Some transceivers need a configuration step (for example, pulling the
> standby or enable lines) for them to start sending messages. The
> transceiver can be implemented as a phy with the configuration done in the
> phy driver. The bit rate limitation can the be obtained by the driver using
> the phy node.
>
> Document the above implementation in the bosch mcan bindings
>
> Signed-off-by: Faiz Abbas <[email protected]>
> Signed-off-by: Aswath Govindraju <[email protected]>
> ---
> Documentation/devicetree/bindings/net/can/bosch,m_can.yaml | 3 +++
> 1 file changed, 3 insertions(+)
>

Acked-by: Rob Herring <[email protected]>

2021-04-16 07:06:19

by Marc Kleine-Budde

[permalink] [raw]
Subject: Re: [PATCH v2 2/2] can: m_can: Add support for transceiver as phy

On 4/15/21 5:46 PM, Aswath Govindraju wrote:
> From: Faiz Abbas <[email protected]>
>
> Add support for implementing transceiver node as phy. The max_bitrate is
> obtained by getting a phy attribute.
>
> Signed-off-by: Faiz Abbas <[email protected]>
> Signed-off-by: Aswath Govindraju <[email protected]>
> ---
> drivers/net/can/m_can/m_can.c | 10 ++++++++++
> drivers/net/can/m_can/m_can.h | 2 ++
> drivers/net/can/m_can/m_can_platform.c | 13 +++++++++++++
> 3 files changed, 25 insertions(+)
>
> diff --git a/drivers/net/can/m_can/m_can.c b/drivers/net/can/m_can/m_can.c
> index 34073cd077e4..7d31250446c2 100644
> --- a/drivers/net/can/m_can/m_can.c
> +++ b/drivers/net/can/m_can/m_can.c
> @@ -21,6 +21,7 @@
> #include <linux/iopoll.h>
> #include <linux/can/dev.h>
> #include <linux/pinctrl/consumer.h>
> +#include <linux/phy/phy.h>
>
> #include "m_can.h"
>
> @@ -1514,6 +1515,7 @@ static void m_can_stop(struct net_device *dev)
> static int m_can_close(struct net_device *dev)
> {
> struct m_can_classdev *cdev = netdev_priv(dev);
> + int err;
>
> netif_stop_queue(dev);
>
> @@ -1536,6 +1538,10 @@ static int m_can_close(struct net_device *dev)
> close_candev(dev);
> can_led_event(dev, CAN_LED_EVENT_STOP);
>
> + err = phy_power_off(cdev->transceiver);
> + if (err)
> + return err;
> +
> return 0;
> }
>
> @@ -1720,6 +1726,10 @@ static int m_can_open(struct net_device *dev)
> struct m_can_classdev *cdev = netdev_priv(dev);
> int err;
>
> + err = phy_power_on(cdev->transceiver);
> + if (err)
> + return err;
> +
> err = m_can_clk_start(cdev);
> if (err)
> return err;
> diff --git a/drivers/net/can/m_can/m_can.h b/drivers/net/can/m_can/m_can.h
> index ace071c3e58c..38cad068abad 100644
> --- a/drivers/net/can/m_can/m_can.h
> +++ b/drivers/net/can/m_can/m_can.h
> @@ -28,6 +28,7 @@
> #include <linux/iopoll.h>
> #include <linux/can/dev.h>
> #include <linux/pinctrl/consumer.h>
> +#include <linux/phy/phy.h>
>
> /* m_can lec values */
> enum m_can_lec_type {
> @@ -82,6 +83,7 @@ struct m_can_classdev {
> struct workqueue_struct *tx_wq;
> struct work_struct tx_work;
> struct sk_buff *tx_skb;
> + struct phy *transceiver;
>
> struct can_bittiming_const *bit_timing;
> struct can_bittiming_const *data_timing;
> diff --git a/drivers/net/can/m_can/m_can_platform.c b/drivers/net/can/m_can/m_can_platform.c
> index 599de0e08cd7..82d4f1a15dd7 100644
> --- a/drivers/net/can/m_can/m_can_platform.c
> +++ b/drivers/net/can/m_can/m_can_platform.c
> @@ -6,6 +6,7 @@
> // Copyright (C) 2018-19 Texas Instruments Incorporated - http://www.ti.com/
>
> #include <linux/platform_device.h>
> +#include <linux/phy/phy.h>
>
> #include "m_can.h"
>
> @@ -67,6 +68,7 @@ static int m_can_plat_probe(struct platform_device *pdev)
> struct resource *res;
> void __iomem *addr;
> void __iomem *mram_addr;
> + struct phy *transceiver;
> int irq, ret = 0;
>
> mcan_class = m_can_class_allocate_dev(&pdev->dev,
> @@ -101,6 +103,16 @@ static int m_can_plat_probe(struct platform_device *pdev)
> goto probe_fail;
> }
>
> + transceiver = devm_phy_optional_get(&pdev->dev, NULL);
> + if (IS_ERR(transceiver)) {
> + ret = PTR_ERR(transceiver);
> + dev_err(&pdev->dev, "error while getting phy, err=%d\n", ret);

please use dev_err_probe(), as the probing might be deferred and this is not an
error.

> + return ret;
> + }
> +
> + if (transceiver)
> + priv->cdev.can.bitrate_max = transceiver->attrs.max_link_rate;
> +
> priv->base = addr;
> priv->mram_base = mram_addr;
>
> @@ -108,6 +120,7 @@ static int m_can_plat_probe(struct platform_device *pdev)
> mcan_class->pm_clock_support = 1;
> mcan_class->can.clock.freq = clk_get_rate(mcan_class->cclk);
> mcan_class->dev = &pdev->dev;
> + mcan_class->transceiver = transceiver;
>
> mcan_class->ops = &m_can_plat_ops;
>
>

Marc

--
Pengutronix e.K. | Marc Kleine-Budde |
Embedded Linux | https://www.pengutronix.de |
Vertretung West/Dortmund | Phone: +49-231-2826-924 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |


Attachments:
signature.asc (499.00 B)
OpenPGP digital signature

2021-04-16 11:48:24

by Aswath Govindraju

[permalink] [raw]
Subject: Re: [PATCH v2 0/2] MCAN: Add support for implementing transceiver as a phy

Hi all,

On 15/04/21 9:16 pm, Aswath Govindraju wrote:
> The following series of patches add support for implementing the
> transceiver as a phy of m_can_platform driver.
>
> TCAN1042 has a standby signal that needs to be pulled high for
> sending/receiving messages[1]. TCAN1043 has a enable signal along with
> standby signal that needs to be pulled up for sending/receiving
> messages[2], and other combinations of the two lines can be used to put the
> transceiver in different states to reduce power consumption. On boards
> like the AM654-idk and J721e-evm these signals are controlled using gpios.
>
> These gpios are set in phy driver, and the transceiver can be put in
> different states using phy API. The phy driver is added in the series [3].
>
> This patch series is dependent on [4].
>
> Changes since v1:
> - Used the API devm_phy_get_optional() instead of
> devm_of_phy_get_optional_by_index()
>
> [1] - https://www.ti.com/lit/ds/symlink/tcan1042h.pdf
> [2] - https://www.ti.com/lit/ds/symlink/tcan1043-q1.pdf
> [3] - https://lore.kernel.org/patchwork/project/lkml/list/?series=495365
> [4] - https://lore.kernel.org/patchwork/patch/1413286/
>

Posted v3 for this series.

Thanks,
Aswath

> Faiz Abbas (2):
> dt-bindings: net: can: Document transceiver implementation as phy
> can: m_can: Add support for transceiver as phy
>
> .../devicetree/bindings/net/can/bosch,m_can.yaml | 3 +++
> drivers/net/can/m_can/m_can.c | 10 ++++++++++
> drivers/net/can/m_can/m_can.h | 2 ++
> drivers/net/can/m_can/m_can_platform.c | 13 +++++++++++++
> 4 files changed, 28 insertions(+)
>

2021-04-16 13:48:20

by Marc Kleine-Budde

[permalink] [raw]
Subject: Re: [PATCH v2 0/2] MCAN: Add support for implementing transceiver as a phy

On 15.04.2021 21:16:33, Aswath Govindraju wrote:
> The following series of patches add support for implementing the
> transceiver as a phy of m_can_platform driver.
>
> TCAN1042 has a standby signal that needs to be pulled high for
> sending/receiving messages[1]. TCAN1043 has a enable signal along with
> standby signal that needs to be pulled up for sending/receiving
> messages[2], and other combinations of the two lines can be used to put the
> transceiver in different states to reduce power consumption. On boards
> like the AM654-idk and J721e-evm these signals are controlled using gpios.
>
> These gpios are set in phy driver, and the transceiver can be put in
> different states using phy API. The phy driver is added in the series [3].
>
> This patch series is dependent on [4].

Looks good. Can you ping me after the next -rc1, when this patch hits
mainline. Then I'll merge this into linux-can-next.

regards,
Marc

--
Pengutronix e.K. | Marc Kleine-Budde |
Embedded Linux | https://www.pengutronix.de |
Vertretung West/Dortmund | Phone: +49-231-2826-924 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |


Attachments:
(No filename) (1.20 kB)
signature.asc (499.00 B)
Download all attachments