Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1313231 > unrolled thread

[PATCH v2] can: c_can: add xceiver enable/disable support

Started byMichael Grzeschik <m.grzeschik@pengutronix.de>
First post2016-01-20 14:50 +0100
Last post2016-01-20 17:50 +0100
Articles 7 — 6 participants

Back to article view | Back to linux.kernel


Contents

  [PATCH v2] can: c_can: add xceiver enable/disable support Michael Grzeschik <m.grzeschik@pengutronix.de> - 2016-01-20 14:50 +0100
    Re: [PATCH v2] can: c_can: add xceiver enable/disable support Markus Pargmann <mpa@pengutronix.de> - 2016-01-20 15:10 +0100
    Re: [PATCH v2] can: c_can: add xceiver enable/disable support Marc Kleine-Budde <mkl@pengutronix.de> - 2016-01-20 15:30 +0100
    Re: [PATCH v2] can: c_can: add xceiver enable/disable support Kurt Van Dijck <dev.kurt@vandijck-laurijssen.be> - 2016-01-20 15:40 +0100
      Re: [PATCH v2] can: c_can: add xceiver enable/disable support Markus Pargmann <mpa@pengutronix.de> - 2016-01-20 15:40 +0100
    Re: [PATCH v2] can: c_can: add xceiver enable/disable support Bjørn Mork <bjorn@mork.no> - 2016-01-20 17:20 +0100
      Re: [PATCH v2] can: c_can: add xceiver enable/disable support Michael Grzeschik <mgr@pengutronix.de> - 2016-01-20 17:50 +0100

#1313231 — [PATCH v2] can: c_can: add xceiver enable/disable support

FromMichael Grzeschik <m.grzeschik@pengutronix.de>
Date2016-01-20 14:50 +0100
Subject[PATCH v2] can: c_can: add xceiver enable/disable support
Message-ID<qT1j4-7c8-21@gated-at.bofh.it>
This patch adds support to enable and disable the xceiver
in case it's switchable by the regulator framework.

Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de>
---
v1 -> v2:
 - always returning PTR_ERR in case devm_regulator_get fails
 - removed inline wrapper functions with checks for xceiver == NULL

 drivers/net/can/c_can/c_can.c | 12 ++++++++++++
 drivers/net/can/c_can/c_can.h |  1 +
 2 files changed, 13 insertions(+)

diff --git a/drivers/net/can/c_can/c_can.c b/drivers/net/can/c_can/c_can.c
index f91b094..0723aeb 100644
--- a/drivers/net/can/c_can/c_can.c
+++ b/drivers/net/can/c_can/c_can.c
@@ -36,6 +36,7 @@
 #include <linux/io.h>
 #include <linux/pm_runtime.h>
 #include <linux/pinctrl/consumer.h>
+#include <linux/regulator/consumer.h>
 
 #include <linux/can.h>
 #include <linux/can/dev.h>
@@ -612,6 +613,10 @@ static int c_can_start(struct net_device *dev)
 	else
 		pinctrl_pm_select_default_state(priv->device);
 
+	err = regulator_enable(priv->reg_xceiver);
+	if (err)
+		return err;
+
 	return 0;
 }
 
@@ -626,6 +631,9 @@ static void c_can_stop(struct net_device *dev)
 
 	/* deactivate pins */
 	pinctrl_pm_select_sleep_state(dev->dev.parent);
+
+	regulator_disable(priv->reg_xceiver);
+
 	priv->can.state = CAN_STATE_STOPPED;
 }
 
@@ -1263,6 +1271,10 @@ int register_c_can_dev(struct net_device *dev)
 	 */
 	pinctrl_pm_select_sleep_state(dev->dev.parent);
 
+	priv->reg_xceiver = devm_regulator_get(priv->device, "xceiver");
+	if (IS_ERR(priv->reg_xceiver))
+		return PTR_ERR(priv->reg_xceiver);
+
 	c_can_pm_runtime_enable(priv);
 
 	dev->flags |= IFF_ECHO;	/* we support local echo */
diff --git a/drivers/net/can/c_can/c_can.h b/drivers/net/can/c_can/c_can.h
index 8acdc7f..59246e3 100644
--- a/drivers/net/can/c_can/c_can.h
+++ b/drivers/net/can/c_can/c_can.h
@@ -213,6 +213,7 @@ struct c_can_priv {
 	u32 comm_rcv_high;
 	u32 rxmasked;
 	u32 dlc[C_CAN_MSG_OBJ_TX_NUM];
+	struct regulator *reg_xceiver;
 };
 
 struct net_device *alloc_c_can_dev(void);
-- 
2.7.0.rc3

[toc] | [next] | [standalone]


#1313235

FromMarkus Pargmann <mpa@pengutronix.de>
Date2016-01-20 15:10 +0100
Message-ID<qT1Cq-7BQ-9@gated-at.bofh.it>
In reply to#1313231

[Multipart message — attachments visible in raw view] — view raw

Hi,

On Wednesday 20 January 2016 14:44:03 Michael Grzeschik wrote:
> This patch adds support to enable and disable the xceiver
> in case it's switchable by the regulator framework.
> 
> Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de>

Reviewed-by: Markus Pargmann <mpa@pengutronix.de>

> ---
> v1 -> v2:
>  - always returning PTR_ERR in case devm_regulator_get fails
>  - removed inline wrapper functions with checks for xceiver == NULL
> 
>  drivers/net/can/c_can/c_can.c | 12 ++++++++++++
>  drivers/net/can/c_can/c_can.h |  1 +
>  2 files changed, 13 insertions(+)
> 
> diff --git a/drivers/net/can/c_can/c_can.c b/drivers/net/can/c_can/c_can.c
> index f91b094..0723aeb 100644
> --- a/drivers/net/can/c_can/c_can.c
> +++ b/drivers/net/can/c_can/c_can.c
> @@ -36,6 +36,7 @@
>  #include <linux/io.h>
>  #include <linux/pm_runtime.h>
>  #include <linux/pinctrl/consumer.h>
> +#include <linux/regulator/consumer.h>
>  
>  #include <linux/can.h>
>  #include <linux/can/dev.h>
> @@ -612,6 +613,10 @@ static int c_can_start(struct net_device *dev)
>  	else
>  		pinctrl_pm_select_default_state(priv->device);
>  
> +	err = regulator_enable(priv->reg_xceiver);
> +	if (err)
> +		return err;
> +
>  	return 0;
>  }
>  
> @@ -626,6 +631,9 @@ static void c_can_stop(struct net_device *dev)
>  
>  	/* deactivate pins */
>  	pinctrl_pm_select_sleep_state(dev->dev.parent);
> +
> +	regulator_disable(priv->reg_xceiver);
> +
>  	priv->can.state = CAN_STATE_STOPPED;
>  }
>  
> @@ -1263,6 +1271,10 @@ int register_c_can_dev(struct net_device *dev)
>  	 */
>  	pinctrl_pm_select_sleep_state(dev->dev.parent);
>  
> +	priv->reg_xceiver = devm_regulator_get(priv->device, "xceiver");
> +	if (IS_ERR(priv->reg_xceiver))
> +		return PTR_ERR(priv->reg_xceiver);
> +
>  	c_can_pm_runtime_enable(priv);
>  
>  	dev->flags |= IFF_ECHO;	/* we support local echo */
> diff --git a/drivers/net/can/c_can/c_can.h b/drivers/net/can/c_can/c_can.h
> index 8acdc7f..59246e3 100644
> --- a/drivers/net/can/c_can/c_can.h
> +++ b/drivers/net/can/c_can/c_can.h
> @@ -213,6 +213,7 @@ struct c_can_priv {
>  	u32 comm_rcv_high;
>  	u32 rxmasked;
>  	u32 dlc[C_CAN_MSG_OBJ_TX_NUM];
> +	struct regulator *reg_xceiver;
>  };
>  
>  struct net_device *alloc_c_can_dev(void);
> 

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

[toc] | [prev] | [next] | [standalone]


#1313249

FromMarc Kleine-Budde <mkl@pengutronix.de>
Date2016-01-20 15:30 +0100
Message-ID<qT1VM-7Ky-17@gated-at.bofh.it>
In reply to#1313231

[Multipart message — attachments visible in raw view] — view raw

On 01/20/2016 03:11 PM, Kurt Van Dijck wrote:
> 
>> diff --git a/drivers/net/can/c_can/c_can.c b/drivers/net/can/c_can/c_can.c
>> index f91b094..0723aeb 100644
>> --- a/drivers/net/can/c_can/c_can.c
>> +++ b/drivers/net/can/c_can/c_can.c
>> @@ -1263,6 +1271,10 @@ int register_c_can_dev(struct net_device *dev)
>>  	 */
>>  	pinctrl_pm_select_sleep_state(dev->dev.parent);
>>  
>> +	priv->reg_xceiver = devm_regulator_get(priv->device, "xceiver");
> 
> I assume "xceiver" is the shorter name for "transceiver"?
> In that case, I suggest changing the devicetree label to "transceiver".
> It would become a mess if different drivers use different names.
> I see no real benefit for naming it "xceiver". "trx" is even shorter :-)
> See also http://www.acronymfinder.com/TRX.html
> 
> The internals, like variable names, do not really matter here.
> 
> I haven't looked at other driver, yet the argument still stands.

The transceiver is named xceiver in all drivers.

Marc

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

[toc] | [prev] | [next] | [standalone]


#1313257

FromKurt Van Dijck <dev.kurt@vandijck-laurijssen.be>
Date2016-01-20 15:40 +0100
Message-ID<qT1VN-7Ky-19@gated-at.bofh.it>
In reply to#1313231
> diff --git a/drivers/net/can/c_can/c_can.c b/drivers/net/can/c_can/c_can.c
> index f91b094..0723aeb 100644
> --- a/drivers/net/can/c_can/c_can.c
> +++ b/drivers/net/can/c_can/c_can.c
> @@ -1263,6 +1271,10 @@ int register_c_can_dev(struct net_device *dev)
>  	 */
>  	pinctrl_pm_select_sleep_state(dev->dev.parent);
>  
> +	priv->reg_xceiver = devm_regulator_get(priv->device, "xceiver");

I assume "xceiver" is the shorter name for "transceiver"?
In that case, I suggest changing the devicetree label to "transceiver".
It would become a mess if different drivers use different names.
I see no real benefit for naming it "xceiver". "trx" is even shorter :-)
See also http://www.acronymfinder.com/TRX.html

The internals, like variable names, do not really matter here.

I haven't looked at other driver, yet the argument still stands.

Kind regards,
Kurt

[toc] | [prev] | [next] | [standalone]


#1313258

FromMarkus Pargmann <mpa@pengutronix.de>
Date2016-01-20 15:40 +0100
Message-ID<qT25t-7Pe-31@gated-at.bofh.it>
In reply to#1313257

[Multipart message — attachments visible in raw view] — view raw

Hi,

On Wednesday 20 January 2016 15:11:51 Kurt Van Dijck wrote:
> 
> > diff --git a/drivers/net/can/c_can/c_can.c b/drivers/net/can/c_can/c_can.c
> > index f91b094..0723aeb 100644
> > --- a/drivers/net/can/c_can/c_can.c
> > +++ b/drivers/net/can/c_can/c_can.c
> > @@ -1263,6 +1271,10 @@ int register_c_can_dev(struct net_device *dev)
> >  	 */
> >  	pinctrl_pm_select_sleep_state(dev->dev.parent);
> >  
> > +	priv->reg_xceiver = devm_regulator_get(priv->device, "xceiver");
> 
> I assume "xceiver" is the shorter name for "transceiver"?
> In that case, I suggest changing the devicetree label to "transceiver".
> It would become a mess if different drivers use different names.
> I see no real benefit for naming it "xceiver". "trx" is even shorter :-)
> See also http://www.acronymfinder.com/TRX.html
> 
> The internals, like variable names, do not really matter here.
> 
> I haven't looked at other driver, yet the argument still stands.

Oh right and perhaps it is necessary to add some documentation for the
devicetree binding if it is not generic already? In that case the DT
mailing list is missing as well.

Best Regards,

Markus

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

[toc] | [prev] | [next] | [standalone]


#1313329

FromBjørn Mork <bjorn@mork.no>
Date2016-01-20 17:20 +0100
Message-ID<qT3Ee-yP-9@gated-at.bofh.it>
In reply to#1313231
Michael Grzeschik <m.grzeschik@pengutronix.de> writes:

> @@ -1263,6 +1271,10 @@ int register_c_can_dev(struct net_device *dev)
>  	 */
>  	pinctrl_pm_select_sleep_state(dev->dev.parent);
>  
> +	priv->reg_xceiver = devm_regulator_get(priv->device, "xceiver");
> +	if (IS_ERR(priv->reg_xceiver))
> +		return PTR_ERR(priv->reg_xceiver);
> +
>  	c_can_pm_runtime_enable(priv);
>  
>  	dev->flags |= IFF_ECHO;	/* we support local echo */

Do you really want to leave priv->reg_xceiver pointing to an ERR_PTR in
case of error?



Bjørn

[toc] | [prev] | [next] | [standalone]


#1313361

FromMichael Grzeschik <mgr@pengutronix.de>
Date2016-01-20 17:50 +0100
Message-ID<qT47h-Ma-29@gated-at.bofh.it>
In reply to#1313329
Hi,

On Wed, Jan 20, 2016 at 05:19:18PM +0100, Bjørn Mork wrote:
> Michael Grzeschik <m.grzeschik@pengutronix.de> writes:
> 
> > @@ -1263,6 +1271,10 @@ int register_c_can_dev(struct net_device *dev)
> >  	 */
> >  	pinctrl_pm_select_sleep_state(dev->dev.parent);
> >  
> > +	priv->reg_xceiver = devm_regulator_get(priv->device, "xceiver");
> > +	if (IS_ERR(priv->reg_xceiver))
> > +		return PTR_ERR(priv->reg_xceiver);
> > +
> >  	c_can_pm_runtime_enable(priv);
> >  
> >  	dev->flags |= IFF_ECHO;	/* we support local echo */
> 
> Do you really want to leave priv->reg_xceiver pointing to an ERR_PTR in
> case of error?

No, therefore the priv->reg_xceiver will be returned in case of error.
This codepath is called once on device registration.

Michael

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web