> 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 I think old register names could be used here by some small modifications. Please see arch/unicore32/include/mach/regs-ost.h We can avoid ioremap and use writel/readl directly on these registers.
Guan > + > 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/