Instead of writing to the timer controller registers by dereferencing a
pointer to the memory location, properly remap the memory region with a
call to ioremap_nocache() and access the registers using writel().

Signed-off-by: Thierry Reding <thierry.red...@avionic-design.de>
---
 arch/unicore32/kernel/pwm.c | 25 ++++++++++++++++++++++---
 1 file changed, 22 insertions(+), 3 deletions(-)

diff --git a/arch/unicore32/kernel/pwm.c b/arch/unicore32/kernel/pwm.c
index 4615d51..410b786 100644
--- a/arch/unicore32/kernel/pwm.c
+++ b/arch/unicore32/kernel/pwm.c
@@ -23,10 +23,16 @@
 #include <asm/div64.h>
 #include <mach/hardware.h>
 
+#define PWCR 0x00
+#define DCCR 0x04
+#define PCR  0x08
+
 struct pwm_device {
        struct list_head        node;
        struct platform_device *pdev;
 
+       void __iomem    *base;
+
        const char      *label;
        struct clk      *clk;
        int             clk_enabled;
@@ -69,9 +75,11 @@ int pwm_config(struct pwm_device *pwm, int duty_ns, int 
period_ns)
         * before writing to the registers
         */
        clk_enable(pwm->clk);
-       OST_PWMPWCR = prescale;
-       OST_PWMDCCR = pv - dc;
-       OST_PWMPCR  = pv;
+
+       writel(prescale, pwm->base + PWCR);
+       writel(pv - dc, pwm->base + DCCR);
+       writel(pv, pwm->base + PCR);
+
        clk_disable(pwm->clk);
 
        return 0;
@@ -190,10 +198,19 @@ static struct pwm_device *pwm_probe(struct 
platform_device *pdev,
                goto err_free_clk;
        }
 
+       pwm->base = ioremap_nocache(r->start, resource_size(r));
+       if (pwm->base == NULL) {
+               dev_err(&pdev->dev, "failed to remap memory resource\n");
+               ret = -EADDRNOTAVAIL;
+               goto err_release_mem;
+       }
+
        __add_pwm(pwm);
        platform_set_drvdata(pdev, pwm);
        return pwm;
 
+err_release_mem:
+       release_mem_region(r->start, resource_size(r));
 err_free_clk:
        clk_put(pwm->clk);
 err_free:
@@ -224,6 +241,8 @@ static int __devexit pwm_remove(struct platform_device 
*pdev)
        list_del(&pwm->node);
        mutex_unlock(&pwm_lock);
 
+       iounmap(pwm->base);
+
        r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        release_mem_region(r->start, resource_size(r));
 
-- 
1.7.12

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to