diff mbox

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

Message ID 1453297443-23279-1-git-send-email-m.grzeschik@pengutronix.de
State Awaiting Upstream, archived
Delegated to: David Miller
Headers show

Commit Message

Michael Grzeschik Jan. 20, 2016, 1:44 p.m. UTC
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(+)

Comments

Markus Pargmann Jan. 20, 2016, 2:01 p.m. UTC | #1
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);
>
Kurt Van Dijck Jan. 20, 2016, 2:11 p.m. UTC | #2
> 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
Marc Kleine-Budde Jan. 20, 2016, 2:29 p.m. UTC | #3
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
Markus Pargmann Jan. 20, 2016, 2:29 p.m. UTC | #4
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
Bjørn Mork Jan. 20, 2016, 4:19 p.m. UTC | #5
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
Michael Grzeschik Jan. 20, 2016, 4:46 p.m. UTC | #6
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
diff mbox

Patch

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);