From: Siarhei Volkau <lis8...@gmail.com>

The patch replaces iomem register access routines to regmap
equivalents.

Signed-off-by: Siarhei Volkau <lis8...@gmail.com>
---
 drivers/pwm/Kconfig     |   2 +-
 drivers/pwm/pwm-sun4i.c | 143 ++++++++++++++++++++++++++++++++++++------------
 2 files changed, 110 insertions(+), 35 deletions(-)

diff --git a/drivers/pwm/Kconfig b/drivers/pwm/Kconfig
index 2d0cfaa..6b4dc1a 100644
--- a/drivers/pwm/Kconfig
+++ b/drivers/pwm/Kconfig
@@ -416,7 +416,7 @@ config PWM_STMPE
 config PWM_SUN4I
        tristate "Allwinner PWM support"
        depends on ARCH_SUNXI || COMPILE_TEST
-       depends on HAS_IOMEM && COMMON_CLK
+       depends on REGMAP_MMIO && COMMON_CLK
        help
          Generic PWM framework driver for Allwinner SoCs.
 
diff --git a/drivers/pwm/pwm-sun4i.c b/drivers/pwm/pwm-sun4i.c
index b0803f6..5565f03 100644
--- a/drivers/pwm/pwm-sun4i.c
+++ b/drivers/pwm/pwm-sun4i.c
@@ -9,7 +9,7 @@
 #include <linux/bitops.h>
 #include <linux/clk.h>
 #include <linux/err.h>
-#include <linux/io.h>
+#include <linux/regmap.h>
 #include <linux/module.h>
 #include <linux/of.h>
 #include <linux/of_device.h>
@@ -74,7 +74,7 @@ struct sun4i_pwm_data {
 struct sun4i_pwm_chip {
        struct pwm_chip chip;
        struct clk *clk;
-       void __iomem *base;
+       struct regmap *regmap;
        spinlock_t ctrl_lock;
        const struct sun4i_pwm_data *data;
 };
@@ -84,18 +84,6 @@ static inline struct sun4i_pwm_chip 
*to_sun4i_pwm_chip(struct pwm_chip *chip)
        return container_of(chip, struct sun4i_pwm_chip, chip);
 }
 
-static inline u32 sun4i_pwm_readl(struct sun4i_pwm_chip *chip,
-                                 unsigned long offset)
-{
-       return readl(chip->base + offset);
-}
-
-static inline void sun4i_pwm_writel(struct sun4i_pwm_chip *chip,
-                                   u32 val, unsigned long offset)
-{
-       writel(val, chip->base + offset);
-}
-
 static int sun4i_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,
                            int duty_ns, int period_ns)
 {
@@ -152,7 +140,11 @@ static int sun4i_pwm_config(struct pwm_chip *chip, struct 
pwm_device *pwm,
        }
 
        spin_lock(&sun4i_pwm->ctrl_lock);
-       val = sun4i_pwm_readl(sun4i_pwm, PWM_CTRL_REG);
+       err = regmap_read(sun4i_pwm->regmap, PWM_CTRL_REG, &val);
+       if (err) {
+               dev_err(chip->dev, "failed to read from CTL register\n");
+               goto err_cleanup;
+       }
 
        if (sun4i_pwm->data->has_rdy && (val & PWM_RDY(pwm->hwpwm))) {
                spin_unlock(&sun4i_pwm->ctrl_lock);
@@ -163,27 +155,53 @@ static int sun4i_pwm_config(struct pwm_chip *chip, struct 
pwm_device *pwm,
        clk_gate = val & BIT_CH(PWM_CLK_GATING, pwm->hwpwm);
        if (clk_gate) {
                val &= ~BIT_CH(PWM_CLK_GATING, pwm->hwpwm);
-               sun4i_pwm_writel(sun4i_pwm, val, PWM_CTRL_REG);
+               err = regmap_write(sun4i_pwm->regmap, PWM_CTRL_REG, val);
+               if (err) {
+                       dev_err(chip->dev, "failed to write to CTL register\n");
+                       goto err_cleanup;
+               }
        }
 
-       val = sun4i_pwm_readl(sun4i_pwm, PWM_CTRL_REG);
+       err = regmap_read(sun4i_pwm->regmap, PWM_CTRL_REG, &val);
+       if (err) {
+               dev_err(chip->dev, "failed to read from CTL register\n");
+               goto err_cleanup;
+       }
        val &= ~BIT_CH(PWM_PRESCAL_MASK, pwm->hwpwm);
        val |= BIT_CH(prescaler, pwm->hwpwm);
-       sun4i_pwm_writel(sun4i_pwm, val, PWM_CTRL_REG);
+       err = regmap_write(sun4i_pwm->regmap, PWM_CTRL_REG, val);
+       if (err) {
+               dev_err(chip->dev, "failed to write to CTL register\n");
+               goto err_cleanup;
+       }
 
        val = (dty & PWM_DTY_MASK) | PWM_PRD(prd);
-       sun4i_pwm_writel(sun4i_pwm, val, PWM_CH_PRD(pwm->hwpwm));
+       err = regmap_write(sun4i_pwm->regmap, PWM_CH_PRD(pwm->hwpwm), val);
+       if (err) {
+               dev_err(chip->dev, "failed to write to PRD register\n");
+               goto err_cleanup;
+       }
 
        if (clk_gate) {
-               val = sun4i_pwm_readl(sun4i_pwm, PWM_CTRL_REG);
+               err = regmap_read(sun4i_pwm->regmap, PWM_CTRL_REG, &val);
+               if (err) {
+                       dev_err(chip->dev,
+                               "failed to read from CTL register\n");
+                       goto err_cleanup;
+               }
                val |= clk_gate;
-               sun4i_pwm_writel(sun4i_pwm, val, PWM_CTRL_REG);
+               err = regmap_write(sun4i_pwm->regmap, PWM_CTRL_REG, val);
+               if (err) {
+                       dev_err(chip->dev, "failed to write to CTL register\n");
+                       goto err_cleanup;
+               }
        }
 
+err_cleanup:
        spin_unlock(&sun4i_pwm->ctrl_lock);
        clk_disable_unprepare(sun4i_pwm->clk);
 
-       return 0;
+       return err;
 }
 
 static int sun4i_pwm_set_polarity(struct pwm_chip *chip, struct pwm_device 
*pwm,
@@ -200,19 +218,29 @@ static int sun4i_pwm_set_polarity(struct pwm_chip *chip, 
struct pwm_device *pwm,
        }
 
        spin_lock(&sun4i_pwm->ctrl_lock);
-       val = sun4i_pwm_readl(sun4i_pwm, PWM_CTRL_REG);
+       ret = regmap_read(sun4i_pwm->regmap, PWM_CTRL_REG, &val);
+       if (ret) {
+               dev_err(chip->dev,
+                       "failed to read from CTL register\n");
+               goto err_cleanup;
+       }
 
        if (polarity != PWM_POLARITY_NORMAL)
                val &= ~BIT_CH(PWM_ACT_STATE, pwm->hwpwm);
        else
                val |= BIT_CH(PWM_ACT_STATE, pwm->hwpwm);
 
-       sun4i_pwm_writel(sun4i_pwm, val, PWM_CTRL_REG);
+       ret = regmap_write(sun4i_pwm->regmap, PWM_CTRL_REG, val);
+       if (ret) {
+               dev_err(chip->dev, "failed to write to CTL register\n");
+               goto err_cleanup;
+       }
 
+err_cleanup:
        spin_unlock(&sun4i_pwm->ctrl_lock);
        clk_disable_unprepare(sun4i_pwm->clk);
 
-       return 0;
+       return ret;
 }
 
 static int sun4i_pwm_enable(struct pwm_chip *chip, struct pwm_device *pwm)
@@ -228,25 +256,53 @@ static int sun4i_pwm_enable(struct pwm_chip *chip, struct 
pwm_device *pwm)
        }
 
        spin_lock(&sun4i_pwm->ctrl_lock);
-       val = sun4i_pwm_readl(sun4i_pwm, PWM_CTRL_REG);
+       ret = regmap_read(sun4i_pwm->regmap, PWM_CTRL_REG, &val);
+       if (ret) {
+               dev_err(chip->dev,
+                       "failed to read from CTL register\n");
+               goto err_cleanup;
+       }
        val |= BIT_CH(PWM_EN, pwm->hwpwm);
        val |= BIT_CH(PWM_CLK_GATING, pwm->hwpwm);
-       sun4i_pwm_writel(sun4i_pwm, val, PWM_CTRL_REG);
+       ret = regmap_write(sun4i_pwm->regmap, PWM_CTRL_REG, val);
+       if (ret) {
+               dev_err(chip->dev, "failed to write to CTL register\n");
+               goto err_cleanup;
+       }
+
        spin_unlock(&sun4i_pwm->ctrl_lock);
+       return ret;
 
-       return 0;
+err_cleanup:
+       spin_unlock(&sun4i_pwm->ctrl_lock);
+       if (ret)
+               clk_disable_unprepare(sun4i_pwm->clk);
+
+       return ret;
 }
 
 static void sun4i_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm)
 {
        struct sun4i_pwm_chip *sun4i_pwm = to_sun4i_pwm_chip(chip);
        u32 val;
+       int err;
 
        spin_lock(&sun4i_pwm->ctrl_lock);
-       val = sun4i_pwm_readl(sun4i_pwm, PWM_CTRL_REG);
+       err = regmap_read(sun4i_pwm->regmap, PWM_CTRL_REG, &val);
+       if (err) {
+               dev_err(chip->dev,
+                       "failed to read from CTL register\n");
+               goto err_cleanup;
+       }
        val &= ~BIT_CH(PWM_EN, pwm->hwpwm);
        val &= ~BIT_CH(PWM_CLK_GATING, pwm->hwpwm);
-       sun4i_pwm_writel(sun4i_pwm, val, PWM_CTRL_REG);
+       err = regmap_write(sun4i_pwm->regmap, PWM_CTRL_REG, val);
+       if (err) {
+               dev_err(chip->dev, "failed to write to CTL register\n");
+               goto err_cleanup;
+       }
+
+err_cleanup:
        spin_unlock(&sun4i_pwm->ctrl_lock);
 
        clk_disable_unprepare(sun4i_pwm->clk);
@@ -312,10 +368,17 @@ static const struct of_device_id sun4i_pwm_dt_ids[] = {
 };
 MODULE_DEVICE_TABLE(of, sun4i_pwm_dt_ids);
 
+static const struct regmap_config sunxi_pwm_regmap_config = {
+       .reg_bits = 32,
+       .val_bits = 32,
+       .reg_stride = 4,
+};
+
 static int sun4i_pwm_probe(struct platform_device *pdev)
 {
        struct sun4i_pwm_chip *pwm;
        struct resource *res;
+       void __iomem *base;
        u32 val;
        int i, ret;
        const struct of_device_id *match;
@@ -327,9 +390,14 @@ static int sun4i_pwm_probe(struct platform_device *pdev)
                return -ENOMEM;
 
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       pwm->base = devm_ioremap_resource(&pdev->dev, res);
-       if (IS_ERR(pwm->base))
-               return PTR_ERR(pwm->base);
+       base = devm_ioremap_resource(&pdev->dev, res);
+       if (IS_ERR(base))
+               return PTR_ERR(base);
+
+       pwm->regmap = devm_regmap_init_mmio(&pdev->dev, base,
+                                           &sunxi_pwm_regmap_config);
+       if (IS_ERR(pwm->regmap))
+               return PTR_ERR(pwm->regmap);
 
        pwm->clk = devm_clk_get(&pdev->dev, NULL);
        if (IS_ERR(pwm->clk))
@@ -360,7 +428,11 @@ static int sun4i_pwm_probe(struct platform_device *pdev)
                goto clk_error;
        }
 
-       val = sun4i_pwm_readl(pwm, PWM_CTRL_REG);
+       ret = regmap_read(pwm->regmap, PWM_CTRL_REG, &val);
+       if (ret) {
+               dev_err(&pdev->dev, "failed to read from CTL register\n");
+               goto read_error;
+       }
        for (i = 0; i < pwm->chip.npwm; i++)
                if (!(val & BIT_CH(PWM_ACT_STATE, i)))
                        pwm_set_polarity(&pwm->chip.pwms[i],
@@ -369,6 +441,9 @@ static int sun4i_pwm_probe(struct platform_device *pdev)
 
        return 0;
 
+read_error:
+       clk_disable_unprepare(pwm->clk);
+
 clk_error:
        pwmchip_remove(&pwm->chip);
        return ret;
-- 
2.4.11

-- 
You received this message because you are subscribed to the Google Groups 
"linux-sunxi" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to linux-sunxi+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to