Merge tag 'lsk-v3.10-android-14.12'
[firefly-linux-kernel-4.4.55.git] / drivers / clk / clk-divider.c
index a885284ead4d2c05d94b44d01a4769bd6af89105..6769f509fd2bc187ce0f333836e4d368bf50f95f 100644 (file)
@@ -317,8 +317,12 @@ static int clk_divider_set_rate(struct clk_hw *hw, unsigned long rate,
        if (divider->lock)
                spin_lock_irqsave(divider->lock, flags);
 
-       val = readl(divider->reg);
-       val &= ~(div_mask(divider) << divider->shift);
+       if (divider->flags & CLK_DIVIDER_HIWORD_MASK) {
+               val = div_mask(divider) << (divider->shift + 16);
+       } else {
+               val = readl(divider->reg);
+               val &= ~(div_mask(divider) << divider->shift);
+       }
        val |= value << divider->shift;
        writel(val, divider->reg);
 
@@ -345,6 +349,13 @@ static struct clk *_register_divider(struct device *dev, const char *name,
        struct clk *clk;
        struct clk_init_data init;
 
+       if (clk_divider_flags & CLK_DIVIDER_HIWORD_MASK) {
+               if (width + shift > 16) {
+                       pr_warn("divider value exceeds LOWORD field\n");
+                       return ERR_PTR(-EINVAL);
+               }
+       }
+
        /* allocate the divider */
        div = kzalloc(sizeof(struct clk_divider), GFP_KERNEL);
        if (!div) {