1 /* 2 * Copyright (C) 2011 Sascha Hauer, Pengutronix <s.hauer@pengutronix.de> 3 * Copyright (C) 2011 Richard Zhao, Linaro <richard.zhao@linaro.org> 4 * Copyright (C) 2011-2012 Mike Turquette, Linaro Ltd <mturquette@linaro.org> 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License version 2 as 8 * published by the Free Software Foundation. 9 * 10 * Adjustable divider clock implementation 11 */ 12 13 #include <linux/clk-provider.h> 14 #include <linux/module.h> 15 #include <linux/slab.h> 16 #include <linux/io.h> 17 #include <linux/err.h> 18 #include <linux/string.h> 19 #include <linux/log2.h> 20 21 /* 22 * DOC: basic adjustable divider clock that cannot gate 23 * 24 * Traits of this clock: 25 * prepare - clk_prepare only ensures that parents are prepared 26 * enable - clk_enable only ensures that parents are enabled 27 * rate - rate is adjustable. clk->rate = ceiling(parent->rate / divisor) 28 * parent - fixed parent. No clk_set_parent support 29 */ 30 31 #define div_mask(width) ((1 << (width)) - 1) 32 33 static unsigned int _get_table_maxdiv(const struct clk_div_table *table, 34 u8 width) 35 { 36 unsigned int maxdiv = 0, mask = div_mask(width); 37 const struct clk_div_table *clkt; 38 39 for (clkt = table; clkt->div; clkt++) 40 if (clkt->div > maxdiv && clkt->val <= mask) 41 maxdiv = clkt->div; 42 return maxdiv; 43 } 44 45 static unsigned int _get_table_mindiv(const struct clk_div_table *table) 46 { 47 unsigned int mindiv = UINT_MAX; 48 const struct clk_div_table *clkt; 49 50 for (clkt = table; clkt->div; clkt++) 51 if (clkt->div < mindiv) 52 mindiv = clkt->div; 53 return mindiv; 54 } 55 56 static unsigned int _get_maxdiv(const struct clk_div_table *table, u8 width, 57 unsigned long flags) 58 { 59 if (flags & CLK_DIVIDER_ONE_BASED) 60 return div_mask(width); 61 if (flags & CLK_DIVIDER_POWER_OF_TWO) 62 return 1 << div_mask(width); 63 if (table) 64 return _get_table_maxdiv(table, width); 65 return div_mask(width) + 1; 66 } 67 68 static unsigned int _get_table_div(const struct clk_div_table *table, 69 unsigned int val) 70 { 71 const struct clk_div_table *clkt; 72 73 for (clkt = table; clkt->div; clkt++) 74 if (clkt->val == val) 75 return clkt->div; 76 return 0; 77 } 78 79 static unsigned int _get_div(const struct clk_div_table *table, 80 unsigned int val, unsigned long flags, u8 width) 81 { 82 if (flags & CLK_DIVIDER_ONE_BASED) 83 return val; 84 if (flags & CLK_DIVIDER_POWER_OF_TWO) 85 return 1 << val; 86 if (flags & CLK_DIVIDER_MAX_AT_ZERO) 87 return val ? val : div_mask(width) + 1; 88 if (table) 89 return _get_table_div(table, val); 90 return val + 1; 91 } 92 93 static unsigned int _get_table_val(const struct clk_div_table *table, 94 unsigned int div) 95 { 96 const struct clk_div_table *clkt; 97 98 for (clkt = table; clkt->div; clkt++) 99 if (clkt->div == div) 100 return clkt->val; 101 return 0; 102 } 103 104 static unsigned int _get_val(const struct clk_div_table *table, 105 unsigned int div, unsigned long flags, u8 width) 106 { 107 if (flags & CLK_DIVIDER_ONE_BASED) 108 return div; 109 if (flags & CLK_DIVIDER_POWER_OF_TWO) 110 return __ffs(div); 111 if (flags & CLK_DIVIDER_MAX_AT_ZERO) 112 return (div == div_mask(width) + 1) ? 0 : div; 113 if (table) 114 return _get_table_val(table, div); 115 return div - 1; 116 } 117 118 unsigned long divider_recalc_rate(struct clk_hw *hw, unsigned long parent_rate, 119 unsigned int val, 120 const struct clk_div_table *table, 121 unsigned long flags) 122 { 123 struct clk_divider *divider = to_clk_divider(hw); 124 unsigned int div; 125 126 div = _get_div(table, val, flags, divider->width); 127 if (!div) { 128 WARN(!(flags & CLK_DIVIDER_ALLOW_ZERO), 129 "%s: Zero divisor and CLK_DIVIDER_ALLOW_ZERO not set\n", 130 clk_hw_get_name(hw)); 131 return parent_rate; 132 } 133 134 return DIV_ROUND_UP_ULL((u64)parent_rate, div); 135 } 136 EXPORT_SYMBOL_GPL(divider_recalc_rate); 137 138 static unsigned long clk_divider_recalc_rate(struct clk_hw *hw, 139 unsigned long parent_rate) 140 { 141 struct clk_divider *divider = to_clk_divider(hw); 142 unsigned int val; 143 144 val = clk_readl(divider->reg) >> divider->shift; 145 val &= div_mask(divider->width); 146 147 return divider_recalc_rate(hw, parent_rate, val, divider->table, 148 divider->flags); 149 } 150 151 static bool _is_valid_table_div(const struct clk_div_table *table, 152 unsigned int div) 153 { 154 const struct clk_div_table *clkt; 155 156 for (clkt = table; clkt->div; clkt++) 157 if (clkt->div == div) 158 return true; 159 return false; 160 } 161 162 static bool _is_valid_div(const struct clk_div_table *table, unsigned int div, 163 unsigned long flags) 164 { 165 if (flags & CLK_DIVIDER_POWER_OF_TWO) 166 return is_power_of_2(div); 167 if (table) 168 return _is_valid_table_div(table, div); 169 return true; 170 } 171 172 static int _round_up_table(const struct clk_div_table *table, int div) 173 { 174 const struct clk_div_table *clkt; 175 int up = INT_MAX; 176 177 for (clkt = table; clkt->div; clkt++) { 178 if (clkt->div == div) 179 return clkt->div; 180 else if (clkt->div < div) 181 continue; 182 183 if ((clkt->div - div) < (up - div)) 184 up = clkt->div; 185 } 186 187 return up; 188 } 189 190 static int _round_down_table(const struct clk_div_table *table, int div) 191 { 192 const struct clk_div_table *clkt; 193 int down = _get_table_mindiv(table); 194 195 for (clkt = table; clkt->div; clkt++) { 196 if (clkt->div == div) 197 return clkt->div; 198 else if (clkt->div > div) 199 continue; 200 201 if ((div - clkt->div) < (div - down)) 202 down = clkt->div; 203 } 204 205 return down; 206 } 207 208 static int _div_round_up(const struct clk_div_table *table, 209 unsigned long parent_rate, unsigned long rate, 210 unsigned long flags) 211 { 212 int div = DIV_ROUND_UP_ULL((u64)parent_rate, rate); 213 214 if (flags & CLK_DIVIDER_POWER_OF_TWO) 215 div = __roundup_pow_of_two(div); 216 if (table) 217 div = _round_up_table(table, div); 218 219 return div; 220 } 221 222 static int _div_round_closest(const struct clk_div_table *table, 223 unsigned long parent_rate, unsigned long rate, 224 unsigned long flags) 225 { 226 int up, down; 227 unsigned long up_rate, down_rate; 228 229 up = DIV_ROUND_UP_ULL((u64)parent_rate, rate); 230 down = parent_rate / rate; 231 232 if (flags & CLK_DIVIDER_POWER_OF_TWO) { 233 up = __roundup_pow_of_two(up); 234 down = __rounddown_pow_of_two(down); 235 } else if (table) { 236 up = _round_up_table(table, up); 237 down = _round_down_table(table, down); 238 } 239 240 up_rate = DIV_ROUND_UP_ULL((u64)parent_rate, up); 241 down_rate = DIV_ROUND_UP_ULL((u64)parent_rate, down); 242 243 return (rate - up_rate) <= (down_rate - rate) ? up : down; 244 } 245 246 static int _div_round(const struct clk_div_table *table, 247 unsigned long parent_rate, unsigned long rate, 248 unsigned long flags) 249 { 250 if (flags & CLK_DIVIDER_ROUND_CLOSEST) 251 return _div_round_closest(table, parent_rate, rate, flags); 252 253 return _div_round_up(table, parent_rate, rate, flags); 254 } 255 256 static bool _is_best_div(unsigned long rate, unsigned long now, 257 unsigned long best, unsigned long flags) 258 { 259 if (flags & CLK_DIVIDER_ROUND_CLOSEST) 260 return abs(rate - now) < abs(rate - best); 261 262 return now <= rate && now > best; 263 } 264 265 static int _next_div(const struct clk_div_table *table, int div, 266 unsigned long flags) 267 { 268 div++; 269 270 if (flags & CLK_DIVIDER_POWER_OF_TWO) 271 return __roundup_pow_of_two(div); 272 if (table) 273 return _round_up_table(table, div); 274 275 return div; 276 } 277 278 static int clk_divider_bestdiv(struct clk_hw *hw, struct clk_hw *parent, 279 unsigned long rate, 280 unsigned long *best_parent_rate, 281 const struct clk_div_table *table, u8 width, 282 unsigned long flags) 283 { 284 int i, bestdiv = 0; 285 unsigned long parent_rate, best = 0, now, maxdiv; 286 unsigned long parent_rate_saved = *best_parent_rate; 287 288 if (!rate) 289 rate = 1; 290 291 maxdiv = _get_maxdiv(table, width, flags); 292 293 if (!(clk_hw_get_flags(hw) & CLK_SET_RATE_PARENT)) { 294 parent_rate = *best_parent_rate; 295 bestdiv = _div_round(table, parent_rate, rate, flags); 296 bestdiv = bestdiv == 0 ? 1 : bestdiv; 297 bestdiv = bestdiv > maxdiv ? maxdiv : bestdiv; 298 return bestdiv; 299 } 300 301 /* 302 * The maximum divider we can use without overflowing 303 * unsigned long in rate * i below 304 */ 305 maxdiv = min(ULONG_MAX / rate, maxdiv); 306 307 for (i = _next_div(table, 0, flags); i <= maxdiv; 308 i = _next_div(table, i, flags)) { 309 if (rate * i == parent_rate_saved) { 310 /* 311 * It's the most ideal case if the requested rate can be 312 * divided from parent clock without needing to change 313 * parent rate, so return the divider immediately. 314 */ 315 *best_parent_rate = parent_rate_saved; 316 return i; 317 } 318 parent_rate = clk_hw_round_rate(parent, rate * i); 319 now = DIV_ROUND_UP_ULL((u64)parent_rate, i); 320 if (_is_best_div(rate, now, best, flags)) { 321 bestdiv = i; 322 best = now; 323 *best_parent_rate = parent_rate; 324 } 325 } 326 327 if (!bestdiv) { 328 bestdiv = _get_maxdiv(table, width, flags); 329 *best_parent_rate = clk_hw_round_rate(parent, 1); 330 } 331 332 return bestdiv; 333 } 334 335 long divider_round_rate_parent(struct clk_hw *hw, struct clk_hw *parent, 336 unsigned long rate, unsigned long *prate, 337 const struct clk_div_table *table, 338 u8 width, unsigned long flags) 339 { 340 int div; 341 342 div = clk_divider_bestdiv(hw, parent, rate, prate, table, width, flags); 343 344 return DIV_ROUND_UP_ULL((u64)*prate, div); 345 } 346 EXPORT_SYMBOL_GPL(divider_round_rate_parent); 347 348 static long clk_divider_round_rate(struct clk_hw *hw, unsigned long rate, 349 unsigned long *prate) 350 { 351 struct clk_divider *divider = to_clk_divider(hw); 352 int bestdiv; 353 354 /* if read only, just return current value */ 355 if (divider->flags & CLK_DIVIDER_READ_ONLY) { 356 bestdiv = clk_readl(divider->reg) >> divider->shift; 357 bestdiv &= div_mask(divider->width); 358 bestdiv = _get_div(divider->table, bestdiv, divider->flags, 359 divider->width); 360 return DIV_ROUND_UP_ULL((u64)*prate, bestdiv); 361 } 362 363 return divider_round_rate(hw, rate, prate, divider->table, 364 divider->width, divider->flags); 365 } 366 367 int divider_get_val(unsigned long rate, unsigned long parent_rate, 368 const struct clk_div_table *table, u8 width, 369 unsigned long flags) 370 { 371 unsigned int div, value; 372 373 div = DIV_ROUND_UP_ULL((u64)parent_rate, rate); 374 375 if (!_is_valid_div(table, div, flags)) 376 return -EINVAL; 377 378 value = _get_val(table, div, flags, width); 379 380 return min_t(unsigned int, value, div_mask(width)); 381 } 382 EXPORT_SYMBOL_GPL(divider_get_val); 383 384 static int clk_divider_set_rate(struct clk_hw *hw, unsigned long rate, 385 unsigned long parent_rate) 386 { 387 struct clk_divider *divider = to_clk_divider(hw); 388 int value; 389 unsigned long flags = 0; 390 u32 val; 391 392 value = divider_get_val(rate, parent_rate, divider->table, 393 divider->width, divider->flags); 394 if (value < 0) 395 return value; 396 397 if (divider->lock) 398 spin_lock_irqsave(divider->lock, flags); 399 else 400 __acquire(divider->lock); 401 402 if (divider->flags & CLK_DIVIDER_HIWORD_MASK) { 403 val = div_mask(divider->width) << (divider->shift + 16); 404 } else { 405 val = clk_readl(divider->reg); 406 val &= ~(div_mask(divider->width) << divider->shift); 407 } 408 val |= (u32)value << divider->shift; 409 clk_writel(val, divider->reg); 410 411 if (divider->lock) 412 spin_unlock_irqrestore(divider->lock, flags); 413 else 414 __release(divider->lock); 415 416 return 0; 417 } 418 419 const struct clk_ops clk_divider_ops = { 420 .recalc_rate = clk_divider_recalc_rate, 421 .round_rate = clk_divider_round_rate, 422 .set_rate = clk_divider_set_rate, 423 }; 424 EXPORT_SYMBOL_GPL(clk_divider_ops); 425 426 const struct clk_ops clk_divider_ro_ops = { 427 .recalc_rate = clk_divider_recalc_rate, 428 .round_rate = clk_divider_round_rate, 429 }; 430 EXPORT_SYMBOL_GPL(clk_divider_ro_ops); 431 432 static struct clk_hw *_register_divider(struct device *dev, const char *name, 433 const char *parent_name, unsigned long flags, 434 void __iomem *reg, u8 shift, u8 width, 435 u8 clk_divider_flags, const struct clk_div_table *table, 436 spinlock_t *lock) 437 { 438 struct clk_divider *div; 439 struct clk_hw *hw; 440 struct clk_init_data init; 441 int ret; 442 443 if (clk_divider_flags & CLK_DIVIDER_HIWORD_MASK) { 444 if (width + shift > 16) { 445 pr_warn("divider value exceeds LOWORD field\n"); 446 return ERR_PTR(-EINVAL); 447 } 448 } 449 450 /* allocate the divider */ 451 div = kzalloc(sizeof(*div), GFP_KERNEL); 452 if (!div) 453 return ERR_PTR(-ENOMEM); 454 455 init.name = name; 456 if (clk_divider_flags & CLK_DIVIDER_READ_ONLY) 457 init.ops = &clk_divider_ro_ops; 458 else 459 init.ops = &clk_divider_ops; 460 init.flags = flags | CLK_IS_BASIC; 461 init.parent_names = (parent_name ? &parent_name: NULL); 462 init.num_parents = (parent_name ? 1 : 0); 463 464 /* struct clk_divider assignments */ 465 div->reg = reg; 466 div->shift = shift; 467 div->width = width; 468 div->flags = clk_divider_flags; 469 div->lock = lock; 470 div->hw.init = &init; 471 div->table = table; 472 473 /* register the clock */ 474 hw = &div->hw; 475 ret = clk_hw_register(dev, hw); 476 if (ret) { 477 kfree(div); 478 hw = ERR_PTR(ret); 479 } 480 481 return hw; 482 } 483 484 /** 485 * clk_register_divider - register a divider clock with the clock framework 486 * @dev: device registering this clock 487 * @name: name of this clock 488 * @parent_name: name of clock's parent 489 * @flags: framework-specific flags 490 * @reg: register address to adjust divider 491 * @shift: number of bits to shift the bitfield 492 * @width: width of the bitfield 493 * @clk_divider_flags: divider-specific flags for this clock 494 * @lock: shared register lock for this clock 495 */ 496 struct clk *clk_register_divider(struct device *dev, const char *name, 497 const char *parent_name, unsigned long flags, 498 void __iomem *reg, u8 shift, u8 width, 499 u8 clk_divider_flags, spinlock_t *lock) 500 { 501 struct clk_hw *hw; 502 503 hw = _register_divider(dev, name, parent_name, flags, reg, shift, 504 width, clk_divider_flags, NULL, lock); 505 if (IS_ERR(hw)) 506 return ERR_CAST(hw); 507 return hw->clk; 508 } 509 EXPORT_SYMBOL_GPL(clk_register_divider); 510 511 /** 512 * clk_hw_register_divider - register a divider clock with the clock framework 513 * @dev: device registering this clock 514 * @name: name of this clock 515 * @parent_name: name of clock's parent 516 * @flags: framework-specific flags 517 * @reg: register address to adjust divider 518 * @shift: number of bits to shift the bitfield 519 * @width: width of the bitfield 520 * @clk_divider_flags: divider-specific flags for this clock 521 * @lock: shared register lock for this clock 522 */ 523 struct clk_hw *clk_hw_register_divider(struct device *dev, const char *name, 524 const char *parent_name, unsigned long flags, 525 void __iomem *reg, u8 shift, u8 width, 526 u8 clk_divider_flags, spinlock_t *lock) 527 { 528 return _register_divider(dev, name, parent_name, flags, reg, shift, 529 width, clk_divider_flags, NULL, lock); 530 } 531 EXPORT_SYMBOL_GPL(clk_hw_register_divider); 532 533 /** 534 * clk_register_divider_table - register a table based divider clock with 535 * the clock framework 536 * @dev: device registering this clock 537 * @name: name of this clock 538 * @parent_name: name of clock's parent 539 * @flags: framework-specific flags 540 * @reg: register address to adjust divider 541 * @shift: number of bits to shift the bitfield 542 * @width: width of the bitfield 543 * @clk_divider_flags: divider-specific flags for this clock 544 * @table: array of divider/value pairs ending with a div set to 0 545 * @lock: shared register lock for this clock 546 */ 547 struct clk *clk_register_divider_table(struct device *dev, const char *name, 548 const char *parent_name, unsigned long flags, 549 void __iomem *reg, u8 shift, u8 width, 550 u8 clk_divider_flags, const struct clk_div_table *table, 551 spinlock_t *lock) 552 { 553 struct clk_hw *hw; 554 555 hw = _register_divider(dev, name, parent_name, flags, reg, shift, 556 width, clk_divider_flags, table, lock); 557 if (IS_ERR(hw)) 558 return ERR_CAST(hw); 559 return hw->clk; 560 } 561 EXPORT_SYMBOL_GPL(clk_register_divider_table); 562 563 /** 564 * clk_hw_register_divider_table - register a table based divider clock with 565 * the clock framework 566 * @dev: device registering this clock 567 * @name: name of this clock 568 * @parent_name: name of clock's parent 569 * @flags: framework-specific flags 570 * @reg: register address to adjust divider 571 * @shift: number of bits to shift the bitfield 572 * @width: width of the bitfield 573 * @clk_divider_flags: divider-specific flags for this clock 574 * @table: array of divider/value pairs ending with a div set to 0 575 * @lock: shared register lock for this clock 576 */ 577 struct clk_hw *clk_hw_register_divider_table(struct device *dev, 578 const char *name, const char *parent_name, unsigned long flags, 579 void __iomem *reg, u8 shift, u8 width, 580 u8 clk_divider_flags, const struct clk_div_table *table, 581 spinlock_t *lock) 582 { 583 return _register_divider(dev, name, parent_name, flags, reg, shift, 584 width, clk_divider_flags, table, lock); 585 } 586 EXPORT_SYMBOL_GPL(clk_hw_register_divider_table); 587 588 void clk_unregister_divider(struct clk *clk) 589 { 590 struct clk_divider *div; 591 struct clk_hw *hw; 592 593 hw = __clk_get_hw(clk); 594 if (!hw) 595 return; 596 597 div = to_clk_divider(hw); 598 599 clk_unregister(clk); 600 kfree(div); 601 } 602 EXPORT_SYMBOL_GPL(clk_unregister_divider); 603 604 /** 605 * clk_hw_unregister_divider - unregister a clk divider 606 * @hw: hardware-specific clock data to unregister 607 */ 608 void clk_hw_unregister_divider(struct clk_hw *hw) 609 { 610 struct clk_divider *div; 611 612 div = to_clk_divider(hw); 613 614 clk_hw_unregister(hw); 615 kfree(div); 616 } 617 EXPORT_SYMBOL_GPL(clk_hw_unregister_divider); 618