]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - drivers/clk/clk-fractional-divider.c
zram: fix race between backing_dev_show and backing_dev_store
[linux.git] / drivers / clk / clk-fractional-divider.c
index fdfe2e423d1506e96a059cdb054796dd9c955bd6..b1e556f20911f408875fbf7decfbb7131d2fba9e 100644 (file)
@@ -8,11 +8,28 @@
  */
 
 #include <linux/clk-provider.h>
+#include <linux/io.h>
 #include <linux/module.h>
 #include <linux/device.h>
 #include <linux/slab.h>
 #include <linux/rational.h>
 
+static inline u32 clk_fd_readl(struct clk_fractional_divider *fd)
+{
+       if (fd->flags & CLK_FRAC_DIVIDER_BIG_ENDIAN)
+               return ioread32be(fd->reg);
+
+       return readl(fd->reg);
+}
+
+static inline void clk_fd_writel(struct clk_fractional_divider *fd, u32 val)
+{
+       if (fd->flags & CLK_FRAC_DIVIDER_BIG_ENDIAN)
+               iowrite32be(val, fd->reg);
+       else
+               writel(val, fd->reg);
+}
+
 static unsigned long clk_fd_recalc_rate(struct clk_hw *hw,
                                        unsigned long parent_rate)
 {
@@ -27,7 +44,7 @@ static unsigned long clk_fd_recalc_rate(struct clk_hw *hw,
        else
                __acquire(fd->lock);
 
-       val = clk_readl(fd->reg);
+       val = clk_fd_readl(fd);
 
        if (fd->lock)
                spin_unlock_irqrestore(fd->lock, flags);
@@ -115,10 +132,10 @@ static int clk_fd_set_rate(struct clk_hw *hw, unsigned long rate,
        else
                __acquire(fd->lock);
 
-       val = clk_readl(fd->reg);
+       val = clk_fd_readl(fd);
        val &= ~(fd->mmask | fd->nmask);
        val |= (m << fd->mshift) | (n << fd->nshift);
-       clk_writel(val, fd->reg);
+       clk_fd_writel(fd, val);
 
        if (fd->lock)
                spin_unlock_irqrestore(fd->lock, flags);
@@ -151,7 +168,7 @@ struct clk_hw *clk_hw_register_fractional_divider(struct device *dev,
 
        init.name = name;
        init.ops = &clk_fractional_divider_ops;
-       init.flags = flags | CLK_IS_BASIC;
+       init.flags = flags;
        init.parent_names = parent_name ? &parent_name : NULL;
        init.num_parents = parent_name ? 1 : 0;