summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorDavid Wu <david.wu@rock-chips.com>2018-02-25 16:58:56 +0800
committerTao Huang <huangtao@rock-chips.com>2018-03-19 16:30:38 +0800
commite38aa951c83b6746a263089614f43bc12c7d9fbe (patch)
treea005b30748acff6dacad8945c2a0b6fe13ff6b09 /drivers
parentf636c5450a21e184139100521dfdd52d07e8a5d4 (diff)
pwm: rockchip: Make pwm pinctrl setting after pwm enabled
If the PWM pinctrl uses default state, the iomux setting will be done at probe, the PWM may not be enabled at this moment. It will make PWM into an intermediate state, destroy the default hardware state, the PWM is not ready for work yet. So it is better for doing PWM pinctrl setting after PWM enabled. Change-Id: Iea34a7baf6a4d7df0c631f7f4fdab5b9d61bbd5f Signed-off-by: David Wu <david.wu@rock-chips.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/pwm/pwm-rockchip.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/drivers/pwm/pwm-rockchip.c b/drivers/pwm/pwm-rockchip.c
index 4889c5a0cbc2..954bbcffbf34 100644
--- a/drivers/pwm/pwm-rockchip.c
+++ b/drivers/pwm/pwm-rockchip.c
@@ -36,6 +36,8 @@ struct rockchip_pwm_chip {
struct pwm_chip chip;
struct clk *clk;
struct clk *pclk;
+ struct pinctrl *pinctrl;
+ struct pinctrl_state *active_state;
const struct rockchip_pwm_data *data;
void __iomem *base;
bool vop_pwm_en; /* indicate voppwm mirror register state */
@@ -233,6 +235,8 @@ static int rockchip_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm,
*/
rockchip_pwm_get_state(chip, pwm, state);
+ if (state->enabled)
+ ret = pinctrl_select_state(pc->pinctrl, pc->active_state);
out:
clk_disable(pc->pclk);
@@ -377,6 +381,18 @@ static int rockchip_pwm_probe(struct platform_device *pdev)
goto err_clk;
}
+ pc->pinctrl = devm_pinctrl_get(&pdev->dev);
+ if (IS_ERR(pc->pinctrl)) {
+ dev_err(&pdev->dev, "Get pinctrl failed!\n");
+ return PTR_ERR(pc->pinctrl);
+ }
+
+ pc->active_state = pinctrl_lookup_state(pc->pinctrl, "active");
+ if (IS_ERR(pc->active_state)) {
+ dev_err(&pdev->dev, "No active pinctrl state\n");
+ return PTR_ERR(pc->active_state);
+ }
+
platform_set_drvdata(pdev, pc);
pc->data = id->data;