diff mbox

[net-next,resend,1/6] net: cpsw: enhance pinctrl support

Message ID 1369130103-743-2-git-send-email-mugunthanvnm@ti.com (mailing list archive)
State New, archived
Headers show

Commit Message

Mugunthan V N May 21, 2013, 9:54 a.m. UTC
From: Hebbar Gururaja <gururaja.hebbar@ti.com>

Amend cpsw controller to optionally take a pin control handle and set
the state of the pins to:

- "default" on boot, resume
- "sleep" on suspend()

This should make it possible to optimize energy usage for the pins
for the suspend/resume cycle.

If any of the above pin states are missing in dt, a warning message
about the missing state is displayed.
If certain pin-states are not available, to remove this warning message
pass respective state name with null phandler.

Signed-off-by: Hebbar Gururaja <gururaja.hebbar@ti.com>
Signed-off-by: Mugunthan V N <mugunthanvnm@ti.com>
---
 drivers/net/ethernet/ti/cpsw.c |   49 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 49 insertions(+)

Comments

David Miller May 23, 2013, 6:57 a.m. UTC | #1
From: Mugunthan V N <mugunthanvnm@ti.com>
Date: Tue, 21 May 2013 15:24:58 +0530

> +		priv->pins_default = pinctrl_lookup_state(priv->pinctrl,
> +						PINCTRL_STATE_DEFAULT);

This is not indented correctly.

Argument on the second, and subsequent, lines of a function call
must start at the first column after the openning parenthesis of
the function call itself.

Please audit for this problem in your entire patch series, fix
it up, and resubmit the full set of patches.

Thanks.
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Mugunthan V N May 23, 2013, 9:14 a.m. UTC | #2
On 5/23/2013 12:27 PM, David Miller wrote:
> From: Mugunthan V N <mugunthanvnm@ti.com>
> Date: Tue, 21 May 2013 15:24:58 +0530
>
>> +		priv->pins_default = pinctrl_lookup_state(priv->pinctrl,
>> +						PINCTRL_STATE_DEFAULT);
> This is not indented correctly.
>
> Argument on the second, and subsequent, lines of a function call
> must start at the first column after the openning parenthesis of
> the function call itself.
>
> Please audit for this problem in your entire patch series, fix
> it up, and resubmit the full set of patches.
>
> Thanks.
Will fix it and submit the patch.

Regards
Mugunthan V N
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Hebbar, Gururaja May 23, 2013, 11:28 a.m. UTC | #3
On Thu, May 23, 2013 at 12:27:41, David Miller wrote:
> From: Mugunthan V N <mugunthanvnm@ti.com>
> Date: Tue, 21 May 2013 15:24:58 +0530
> 
> > +		priv->pins_default = pinctrl_lookup_state(priv->pinctrl,
> > +						PINCTRL_STATE_DEFAULT);
> 
> This is not indented correctly.
> 
> Argument on the second, and subsequent, lines of a function call
> must start at the first column after the openning parenthesis of
> the function call itself.

Well, if I am correct, doing so will make the line cross 80 character limit.
If you could (please I ask), can you let me know how it can be handled in 
above situation. I will make the changes/corrections and re-send it.

Thanks a lot in advance.

> 
> Please audit for this problem in your entire patch series, fix
> it up, and resubmit the full set of patches.
> 
> Thanks.
> 


Regards, 
Gururaja
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
David Miller May 23, 2013, 7:10 p.m. UTC | #4
From: "Hebbar, Gururaja" <gururaja.hebbar@ti.com>
Date: Thu, 23 May 2013 11:28:38 +0000

> On Thu, May 23, 2013 at 12:27:41, David Miller wrote:
>> From: Mugunthan V N <mugunthanvnm@ti.com>
>> Date: Tue, 21 May 2013 15:24:58 +0530
>> 
>> > +		priv->pins_default = pinctrl_lookup_state(priv->pinctrl,
>> > +						PINCTRL_STATE_DEFAULT);
>> 
>> This is not indented correctly.
>> 
>> Argument on the second, and subsequent, lines of a function call
>> must start at the first column after the openning parenthesis of
>> the function call itself.
> 
> Well, if I am correct, doing so will make the line cross 80 character limit.
> If you could (please I ask), can you let me know how it can be handled in 
> above situation. I will make the changes/corrections and re-send it.
> 
> Thanks a lot in advance.

Avoid the deep indentation by coding the basic block into a helper
function.
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c
index 21a5b29..4a6f94b 100644
--- a/drivers/net/ethernet/ti/cpsw.c
+++ b/drivers/net/ethernet/ti/cpsw.c
@@ -35,6 +35,7 @@ 
 #include <linux/if_vlan.h>
 
 #include <linux/platform_data/cpsw.h>
+#include <linux/pinctrl/consumer.h>
 
 #include "cpsw_ale.h"
 #include "cpts.h"
@@ -351,6 +352,11 @@  struct cpsw_priv {
 	bool irq_enabled;
 	struct cpts *cpts;
 	u32 emac_port;
+
+	/* Two optional pin states - default & sleep */
+	struct pinctrl		*pinctrl;
+	struct pinctrl_state	*pins_default;
+	struct pinctrl_state	*pins_sleep;
 };
 
 #define napi_to_priv(napi)	container_of(napi, struct cpsw_priv, napi)
@@ -1689,6 +1695,36 @@  static int cpsw_probe(struct platform_device *pdev)
 	 */
 	pm_runtime_enable(&pdev->dev);
 
+	priv->pinctrl = devm_pinctrl_get(&pdev->dev);
+	if (!IS_ERR(priv->pinctrl)) {
+		priv->pins_default = pinctrl_lookup_state(priv->pinctrl,
+						PINCTRL_STATE_DEFAULT);
+		/* enable pins to be muxed in and configured */
+		if (IS_ERR(priv->pins_default))
+			dev_warn(&pdev->dev, "could not get default pinstate\n");
+		else
+			if (pinctrl_select_state(priv->pinctrl,
+						 priv->pins_default))
+				dev_err(&pdev->dev,
+					"could not set default pins\n");
+
+		priv->pins_sleep = pinctrl_lookup_state(priv->pinctrl,
+						PINCTRL_STATE_SLEEP);
+		if (IS_ERR(priv->pins_sleep))
+			dev_warn(&pdev->dev, "could not get sleep pinstate\n");
+	} else {
+		/*
+		* Since we continue even when pinctrl node is not found,
+		* Invalidate pins as not available. This is to make sure that
+		* IS_ERR(pins_xxx) results in failure when used.
+		*/
+		priv->pins_default = ERR_PTR(-ENODATA);
+		priv->pins_sleep = ERR_PTR(-ENODATA);
+
+		dev_warn(&pdev->dev,
+			 "pins are not configured from the driver\n");
+	}
+
 	if (cpsw_probe_dt(&priv->data, pdev)) {
 		pr_err("cpsw: platform data missing\n");
 		ret = -ENODEV;
@@ -1973,11 +2009,17 @@  static int cpsw_suspend(struct device *dev)
 {
 	struct platform_device	*pdev = to_platform_device(dev);
 	struct net_device	*ndev = platform_get_drvdata(pdev);
+	struct cpsw_priv	*priv = netdev_priv(ndev);
 
 	if (netif_running(ndev))
 		cpsw_ndo_stop(ndev);
 	pm_runtime_put_sync(&pdev->dev);
 
+	/* Optionally let pins go into sleep states */
+	if (!IS_ERR(priv->pins_sleep))
+		if (pinctrl_select_state(priv->pinctrl, priv->pins_sleep))
+			dev_err(dev, "could not set pins to sleep state\n");
+
 	return 0;
 }
 
@@ -1985,8 +2027,15 @@  static int cpsw_resume(struct device *dev)
 {
 	struct platform_device	*pdev = to_platform_device(dev);
 	struct net_device	*ndev = platform_get_drvdata(pdev);
+	struct cpsw_priv	*priv = netdev_priv(ndev);
 
 	pm_runtime_get_sync(&pdev->dev);
+
+	/* Optionaly enable pins to be muxed in and configured */
+	if (!IS_ERR(priv->pins_default))
+		if (pinctrl_select_state(priv->pinctrl, priv->pins_default))
+			dev_err(dev, "could not set default pins\n");
+
 	if (netif_running(ndev))
 		cpsw_ndo_open(ndev);
 	return 0;