Commit 4aae44f6 authored by Vladimir Zapolskiy's avatar Vladimir Zapolskiy Committed by Thierry Reding

pwm: lpc32xx: Remove handling of PWM channels

Because LPC32xx PWM controllers have only a single output which is
registered as the only PWM device/channel per controller, it is known in
advance that pwm->hwpwm value is always 0. On basis of this fact
simplify the code by removing operations with pwm->hwpwm, there is no
controls which require channel number as input.

Even though I wasn't aware at the time when I forward ported that patch,
this fixes a null pointer dereference as lpc32xx->chip.pwms is NULL
before devm_pwmchip_add() is called.
Reported-by: default avatarDan Carpenter <dan.carpenter@linaro.org>
Signed-off-by: default avatarVladimir Zapolskiy <vz@mleia.com>
Signed-off-by: default avatarUwe Kleine-König <u.kleine-koenig@pengutronix.de>
Fixes: 3d2813fb ("pwm: lpc32xx: Don't modify HW state in .probe() after the PWM chip was registered")
Signed-off-by: default avatarThierry Reding <thierry.reding@gmail.com>
parent b22bb0d6
...@@ -51,10 +51,10 @@ static int lpc32xx_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm, ...@@ -51,10 +51,10 @@ static int lpc32xx_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,
if (duty_cycles > 255) if (duty_cycles > 255)
duty_cycles = 255; duty_cycles = 255;
val = readl(lpc32xx->base + (pwm->hwpwm << 2)); val = readl(lpc32xx->base);
val &= ~0xFFFF; val &= ~0xFFFF;
val |= (period_cycles << 8) | duty_cycles; val |= (period_cycles << 8) | duty_cycles;
writel(val, lpc32xx->base + (pwm->hwpwm << 2)); writel(val, lpc32xx->base);
return 0; return 0;
} }
...@@ -69,9 +69,9 @@ static int lpc32xx_pwm_enable(struct pwm_chip *chip, struct pwm_device *pwm) ...@@ -69,9 +69,9 @@ static int lpc32xx_pwm_enable(struct pwm_chip *chip, struct pwm_device *pwm)
if (ret) if (ret)
return ret; return ret;
val = readl(lpc32xx->base + (pwm->hwpwm << 2)); val = readl(lpc32xx->base);
val |= PWM_ENABLE; val |= PWM_ENABLE;
writel(val, lpc32xx->base + (pwm->hwpwm << 2)); writel(val, lpc32xx->base);
return 0; return 0;
} }
...@@ -81,9 +81,9 @@ static void lpc32xx_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm) ...@@ -81,9 +81,9 @@ static void lpc32xx_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm)
struct lpc32xx_pwm_chip *lpc32xx = to_lpc32xx_pwm_chip(chip); struct lpc32xx_pwm_chip *lpc32xx = to_lpc32xx_pwm_chip(chip);
u32 val; u32 val;
val = readl(lpc32xx->base + (pwm->hwpwm << 2)); val = readl(lpc32xx->base);
val &= ~PWM_ENABLE; val &= ~PWM_ENABLE;
writel(val, lpc32xx->base + (pwm->hwpwm << 2)); writel(val, lpc32xx->base);
clk_disable_unprepare(lpc32xx->clk); clk_disable_unprepare(lpc32xx->clk);
} }
...@@ -141,9 +141,9 @@ static int lpc32xx_pwm_probe(struct platform_device *pdev) ...@@ -141,9 +141,9 @@ static int lpc32xx_pwm_probe(struct platform_device *pdev)
lpc32xx->chip.npwm = 1; lpc32xx->chip.npwm = 1;
/* If PWM is disabled, configure the output to the default value */ /* If PWM is disabled, configure the output to the default value */
val = readl(lpc32xx->base + (lpc32xx->chip.pwms[0].hwpwm << 2)); val = readl(lpc32xx->base);
val &= ~PWM_PIN_LEVEL; val &= ~PWM_PIN_LEVEL;
writel(val, lpc32xx->base + (lpc32xx->chip.pwms[0].hwpwm << 2)); writel(val, lpc32xx->base);
ret = devm_pwmchip_add(&pdev->dev, &lpc32xx->chip); ret = devm_pwmchip_add(&pdev->dev, &lpc32xx->chip);
if (ret < 0) { if (ret < 0) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment