mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Hebbar Gururaja <gururaja.hebbar@ti.com>
To: <khilman@linaro.org>, <grant.likely@linaro.org>,
	<linus.walleij@linaro.org>, <rob.herring@calxeda.com>
Cc: <davinci-linux-open-source@linux.davincidsp.com>,
	<devicetree-discuss@lists.ozlabs.org>,
	<linux-arm-kernel@lists.infradead.org>, <linux@arm.linux.org.uk>,
	<linux-kernel@vger.kernel.org>, <vaibhav.bedia@ti.com>,
	<sudhakar.raj@ti.com>, <gururaja.hebbar@ti.com>,
	Thierry Reding <thierry.reding@avionic-design.de>,
	"Philip, Avinash" <avinashphilip@ti.com>
Subject: [PATCH 08/11] pwm: pwm-tiecap: enhance pinctrl support
Date: Fri, 31 May 2013 15:43:08 +0530	[thread overview]
Message-ID: <1369995191-20855-9-git-send-email-gururaja.hebbar@ti.com> (raw)
In-Reply-To: <1369995191-20855-1-git-send-email-gururaja.hebbar@ti.com>

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

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

By optionally putting the pins into sleep state in the suspend callback
we can accomplish two things.
- One is to minimize current leakage from pins and thus save power,
- second, we can prevent the IP from driving pins output in an
uncontrolled manner, which may happen if the power domain drops the
domain regulator.

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.

Todo:
        - if an idle state is available for pins, add support for it.

Signed-off-by: Hebbar Gururaja <gururaja.hebbar@ti.com>
Cc: Thierry Reding <thierry.reding@avionic-design.de>
Cc: Philip, Avinash <avinashphilip@ti.com>
---
:100644 100644 72ca42d... d02769d... M	drivers/pwm/pwm-tiecap.c
 drivers/pwm/pwm-tiecap.c |   48 +++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 43 insertions(+), 5 deletions(-)

diff --git a/drivers/pwm/pwm-tiecap.c b/drivers/pwm/pwm-tiecap.c
index 72ca42d..d02769d 100644
--- a/drivers/pwm/pwm-tiecap.c
+++ b/drivers/pwm/pwm-tiecap.c
@@ -52,6 +52,11 @@ struct ecap_pwm_chip {
 	unsigned int	clk_rate;
 	void __iomem	*mmio_base;
 	struct ecap_context ctx;
+
+	/* two pin states - default, sleep */
+	struct pinctrl			*pinctrl;
+	struct pinctrl_state		*pins_default;
+	struct pinctrl_state		*pins_sleep;
 };
 
 static inline struct ecap_pwm_chip *to_ecap_pwm_chip(struct pwm_chip *chip)
@@ -208,11 +213,6 @@ static int ecap_pwm_probe(struct platform_device *pdev)
 	struct clk *clk;
 	struct ecap_pwm_chip *pc;
 	u16 status;
-	struct pinctrl *pinctrl;
-
-	pinctrl = devm_pinctrl_get_select_default(&pdev->dev);
-	if (IS_ERR(pinctrl))
-		dev_warn(&pdev->dev, "unable to select pin group\n");
 
 	pc = devm_kzalloc(&pdev->dev, sizeof(*pc), GFP_KERNEL);
 	if (!pc) {
@@ -220,6 +220,34 @@ static int ecap_pwm_probe(struct platform_device *pdev)
 		return -ENOMEM;
 	}
 
+	pc->pinctrl = devm_pinctrl_get(&pdev->dev);
+	if (!IS_ERR(pc->pinctrl)) {
+		pc->pins_default = pinctrl_lookup_state(pc->pinctrl,
+							 PINCTRL_STATE_DEFAULT);
+		if (IS_ERR(pc->pins_default))
+			dev_dbg(&pdev->dev, "could not get default pinstate\n");
+		else
+			if (pinctrl_select_state(pc->pinctrl, pc->pins_default))
+				dev_err(&pdev->dev,
+					"could not set default pinstate\n");
+
+		pc->pins_sleep = pinctrl_lookup_state(pc->pinctrl,
+						       PINCTRL_STATE_SLEEP);
+		if (IS_ERR(pc->pins_sleep))
+			dev_dbg(&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.
+		*/
+		pc->pins_default = ERR_PTR(-ENODATA);
+		pc->pins_sleep = ERR_PTR(-ENODATA);
+
+		dev_dbg(&pdev->dev, "did not get pins for i2c error: %li\n",
+			PTR_ERR(pc->pinctrl));
+	}
+
 	clk = devm_clk_get(&pdev->dev, "fck");
 	if (IS_ERR(clk)) {
 		dev_err(&pdev->dev, "failed to get clock\n");
@@ -318,6 +346,11 @@ static int ecap_pwm_suspend(struct device *dev)
 	if (test_bit(PWMF_ENABLED, &pwm->flags))
 		pm_runtime_put_sync(dev);
 
+	/* Optionally let pins go into sleep states */
+	if (!IS_ERR(pc->pins_sleep))
+		if (pinctrl_select_state(pc->pinctrl, pc->pins_sleep))
+			dev_err(dev, "could not set pins to sleep state\n");
+
 	return 0;
 }
 
@@ -326,6 +359,11 @@ static int ecap_pwm_resume(struct device *dev)
 	struct ecap_pwm_chip *pc = dev_get_drvdata(dev);
 	struct pwm_device *pwm = pc->chip.pwms;
 
+	/* Optionaly enable pins to be muxed in and configured */
+	if (!IS_ERR(pc->pins_default))
+		if (pinctrl_select_state(pc->pinctrl, pc->pins_default))
+			dev_err(dev, "could not set default pins\n");
+
 	/* Enable explicitly if PWM was running */
 	if (test_bit(PWMF_ENABLED, &pwm->flags))
 		pm_runtime_get_sync(dev);
-- 
1.7.9.5


  parent reply	other threads:[~2013-05-31 10:12 UTC|newest]

Thread overview: 38+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-05-31 10:13 [PATCH 00/11] drivers: Add Pinctrl PM support Hebbar Gururaja
2013-05-31 10:13 ` [PATCH 01/11] pinctrl: single: adopt pinctrl sleep mode management Hebbar Gururaja
2013-06-17 11:32   ` Linus Walleij
2013-06-17 12:03     ` Tony Lindgren
2013-06-17 16:08       ` Linus Walleij
2013-06-17 17:27         ` Tony Lindgren
2013-05-31 10:13 ` [PATCH 02/11] leds: leds-gpio: Enhance pinctrl support Hebbar Gururaja
2013-06-04  7:18   ` Linus Walleij
2013-05-31 10:13 ` [PATCH 03/11] Input: gpio_keys: Adopt " Hebbar Gururaja
2013-05-31 10:13 ` [PATCH 04/11] Input: matrix-keypad: " Hebbar Gururaja
2013-05-31 10:13 ` [PATCH 05/11] spi: omap2-mcspi: enhance " Hebbar Gururaja
2013-06-01 19:27   ` Mark Brown
2013-06-04  9:53     ` Hebbar, Gururaja
2013-05-31 10:13 ` [PATCH 06/11] usb: musb: dsps: Adopt " Hebbar Gururaja
2013-05-31 10:13 ` [PATCH 07/11] pwm: pwm-tiehrpwm: enhance " Hebbar Gururaja
2013-05-31 10:13 ` Hebbar Gururaja [this message]
2013-05-31 10:13 ` [PATCH 09/11] mmc: omap_hsmmc: " Hebbar Gururaja
2013-06-04  7:11   ` Linus Walleij
2013-06-04  7:19     ` Linus Walleij
2013-06-04  9:52       ` Hebbar, Gururaja
2013-06-04 14:46   ` Tony Lindgren
2013-06-07 13:36     ` Balaji T K
2013-06-07 21:01       ` Tony Lindgren
2013-05-31 10:13 ` [PATCH 10/11] video: da8xx-fb: adopt " Hebbar Gururaja
2013-05-31 10:13 ` [PATCH 11/11] i2c: omap: enhance " Hebbar Gururaja
2013-05-31 14:55   ` Grygorii Strashko
2013-06-05  9:04     ` Hebbar, Gururaja
2013-05-31 17:34   ` Kevin Hilman
2013-06-04 11:39     ` Grygorii Strashko
2013-06-05  9:05     ` Hebbar, Gururaja
     [not found]   ` <87bo7r10s9.fsf@linaro.org>
2013-06-04  7:23     ` Linus Walleij
2013-06-04  9:50     ` Hebbar, Gururaja
2013-05-31 17:04 ` [PATCH 00/11] drivers: Add Pinctrl PM support Dmitry Torokhov
2013-05-31 18:08   ` Kevin Hilman
2013-06-04  7:25   ` Linus Walleij
2013-06-04 18:15     ` Kevin Hilman
2013-06-04 18:37       ` Mark Brown
2013-06-05 12:41       ` Linus Walleij

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1369995191-20855-9-git-send-email-gururaja.hebbar@ti.com \
    --to=gururaja.hebbar@ti.com \
    --cc=avinashphilip@ti.com \
    --cc=davinci-linux-open-source@linux.davincidsp.com \
    --cc=devicetree-discuss@lists.ozlabs.org \
    --cc=grant.likely@linaro.org \
    --cc=khilman@linaro.org \
    --cc=linus.walleij@linaro.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux@arm.linux.org.uk \
    --cc=rob.herring@calxeda.com \
    --cc=sudhakar.raj@ti.com \
    --cc=thierry.reding@avionic-design.de \
    --cc=vaibhav.bedia@ti.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®