Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'clk-fixes' into clk-next

+32 -34
+18 -17
drivers/clk/at91/clk-usb.c
··· 52 52 53 53 tmp = pmc_read(pmc, AT91_PMC_USB); 54 54 usbdiv = (tmp & AT91_PMC_OHCIUSBDIV) >> SAM9X5_USB_DIV_SHIFT; 55 - return parent_rate / (usbdiv + 1); 55 + 56 + return DIV_ROUND_CLOSEST(parent_rate, (usbdiv + 1)); 56 57 } 57 58 58 59 static long at91sam9x5_clk_usb_round_rate(struct clk_hw *hw, unsigned long rate, 59 60 unsigned long *parent_rate) 60 61 { 61 62 unsigned long div; 62 - unsigned long bestrate; 63 - unsigned long tmp; 63 + 64 + if (!rate) 65 + return -EINVAL; 64 66 65 67 if (rate >= *parent_rate) 66 68 return *parent_rate; 67 69 68 - div = *parent_rate / rate; 69 - if (div >= SAM9X5_USB_MAX_DIV) 70 - return *parent_rate / (SAM9X5_USB_MAX_DIV + 1); 70 + div = DIV_ROUND_CLOSEST(*parent_rate, rate); 71 + if (div > SAM9X5_USB_MAX_DIV + 1) 72 + div = SAM9X5_USB_MAX_DIV + 1; 71 73 72 - bestrate = *parent_rate / div; 73 - tmp = *parent_rate / (div + 1); 74 - if (bestrate - rate > rate - tmp) 75 - bestrate = tmp; 76 - 77 - return bestrate; 74 + return DIV_ROUND_CLOSEST(*parent_rate, div); 78 75 } 79 76 80 77 static int at91sam9x5_clk_usb_set_parent(struct clk_hw *hw, u8 index) ··· 103 106 u32 tmp; 104 107 struct at91sam9x5_clk_usb *usb = to_at91sam9x5_clk_usb(hw); 105 108 struct at91_pmc *pmc = usb->pmc; 106 - unsigned long div = parent_rate / rate; 109 + unsigned long div; 107 110 108 - if (parent_rate % rate || div < 1 || div >= SAM9X5_USB_MAX_DIV) 111 + if (!rate) 112 + return -EINVAL; 113 + 114 + div = DIV_ROUND_CLOSEST(parent_rate, rate); 115 + if (div > SAM9X5_USB_MAX_DIV + 1 || !div) 109 116 return -EINVAL; 110 117 111 118 tmp = pmc_read(pmc, AT91_PMC_USB) & ~AT91_PMC_OHCIUSBDIV; ··· 254 253 255 254 tmp_parent_rate = rate * usb->divisors[i]; 256 255 tmp_parent_rate = __clk_round_rate(parent, tmp_parent_rate); 257 - tmprate = tmp_parent_rate / usb->divisors[i]; 256 + tmprate = DIV_ROUND_CLOSEST(tmp_parent_rate, usb->divisors[i]); 258 257 if (tmprate < rate) 259 258 tmpdiff = rate - tmprate; 260 259 else ··· 282 281 struct at91_pmc *pmc = usb->pmc; 283 282 unsigned long div; 284 283 285 - if (!rate || parent_rate % rate) 284 + if (!rate) 286 285 return -EINVAL; 287 286 288 - div = parent_rate / rate; 287 + div = DIV_ROUND_CLOSEST(parent_rate, rate); 289 288 290 289 for (i = 0; i < RM9200_USB_DIV_TAB_SIZE; i++) { 291 290 if (usb->divisors[i] == div) {
+9 -9
drivers/clk/clk-divider.c
··· 263 263 if (!rate) 264 264 rate = 1; 265 265 266 + /* if read only, just return current value */ 267 + if (divider->flags & CLK_DIVIDER_READ_ONLY) { 268 + bestdiv = readl(divider->reg) >> divider->shift; 269 + bestdiv &= div_mask(divider); 270 + bestdiv = _get_div(divider, bestdiv); 271 + return bestdiv; 272 + } 273 + 266 274 maxdiv = _get_maxdiv(divider); 267 275 268 276 if (!(__clk_get_flags(hw->clk) & CLK_SET_RATE_PARENT)) { ··· 369 361 }; 370 362 EXPORT_SYMBOL_GPL(clk_divider_ops); 371 363 372 - const struct clk_ops clk_divider_ro_ops = { 373 - .recalc_rate = clk_divider_recalc_rate, 374 - }; 375 - EXPORT_SYMBOL_GPL(clk_divider_ro_ops); 376 - 377 364 static struct clk *_register_divider(struct device *dev, const char *name, 378 365 const char *parent_name, unsigned long flags, 379 366 void __iomem *reg, u8 shift, u8 width, ··· 394 391 } 395 392 396 393 init.name = name; 397 - if (clk_divider_flags & CLK_DIVIDER_READ_ONLY) 398 - init.ops = &clk_divider_ro_ops; 399 - else 400 - init.ops = &clk_divider_ops; 394 + init.ops = &clk_divider_ops; 401 395 init.flags = flags | CLK_IS_BASIC; 402 396 init.parent_names = (parent_name ? &parent_name: NULL); 403 397 init.num_parents = (parent_name ? 1 : 0);
+2 -2
drivers/clk/pxa/clk-pxa27x.c
··· 322 322 unsigned long ccsr = CCSR; 323 323 324 324 osc_forced = ccsr & (1 << CCCR_CPDIS_BIT); 325 - a = cccr & CCCR_A_BIT; 325 + a = cccr & (1 << CCCR_A_BIT); 326 326 l = ccsr & CCSR_L_MASK; 327 327 328 328 if (osc_forced || a) ··· 341 341 unsigned long ccsr = CCSR; 342 342 343 343 osc_forced = ccsr & (1 << CCCR_CPDIS_BIT); 344 - a = cccr & CCCR_A_BIT; 344 + a = cccr & (1 << CCCR_A_BIT); 345 345 if (osc_forced) 346 346 return PXA_MEM_13Mhz; 347 347 if (a)
+1 -1
drivers/clk/qcom/mmcc-apq8084.c
··· 3122 3122 [ESC1_CLK_SRC] = &esc1_clk_src.clkr, 3123 3123 [HDMI_CLK_SRC] = &hdmi_clk_src.clkr, 3124 3124 [VSYNC_CLK_SRC] = &vsync_clk_src.clkr, 3125 - [RBCPR_CLK_SRC] = &rbcpr_clk_src.clkr, 3125 + [MMSS_RBCPR_CLK_SRC] = &rbcpr_clk_src.clkr, 3126 3126 [RBBMTIMER_CLK_SRC] = &rbbmtimer_clk_src.clkr, 3127 3127 [MAPLE_CLK_SRC] = &maple_clk_src.clkr, 3128 3128 [VDP_CLK_SRC] = &vdp_clk_src.clkr,
+1 -3
drivers/clk/rockchip/clk.c
··· 90 90 div->width = div_width; 91 91 div->lock = lock; 92 92 div->table = div_table; 93 - div_ops = (div_flags & CLK_DIVIDER_READ_ONLY) 94 - ? &clk_divider_ro_ops 95 - : &clk_divider_ops; 93 + div_ops = &clk_divider_ops; 96 94 } 97 95 98 96 clk = clk_register_composite(NULL, name, parent_names, num_parents,
+1 -1
include/dt-bindings/clock/qcom,mmcc-apq8084.h
··· 60 60 #define ESC1_CLK_SRC 43 61 61 #define HDMI_CLK_SRC 44 62 62 #define VSYNC_CLK_SRC 45 63 - #define RBCPR_CLK_SRC 46 63 + #define MMSS_RBCPR_CLK_SRC 46 64 64 #define RBBMTIMER_CLK_SRC 47 65 65 #define MAPLE_CLK_SRC 48 66 66 #define VDP_CLK_SRC 49
-1
include/linux/clk-provider.h
··· 352 352 #define CLK_DIVIDER_READ_ONLY BIT(5) 353 353 354 354 extern const struct clk_ops clk_divider_ops; 355 - extern const struct clk_ops clk_divider_ro_ops; 356 355 struct clk *clk_register_divider(struct device *dev, const char *name, 357 356 const char *parent_name, unsigned long flags, 358 357 void __iomem *reg, u8 shift, u8 width,