aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/clk/clk-divider.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2016-05-20 23:18:12 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2016-05-20 23:18:12 -0400
commit0eff4589c36edd03d50b835d0768b2c2ef3f20bd (patch)
treef0a08e7ed4dac042d89d24bb4c79f66df70085ff /drivers/clk/clk-divider.c
parent087afe8aaf562dc7a53f2577049830d6a3245742 (diff)
parentef56b79b66faeeb0dc14213d3cc9e0534a960dee (diff)
Merge tag 'clk-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/clk/linux
Pull clk updates from Stephen Boyd: "It's the usual big pile of driver updates and additions, but we do have a couple core changes in here as well. Core: - CLK_IS_CRITICAL support has been added. This should allow drivers to properly express that a certain clk should stay on even if their prepare/enable count drops to 0 (and in turn the parents of these clks should stay enabled). - A clk registration API has been added, clk_hw_register(), and an OF clk provider API has been added, of_clk_add_hw_provider(). These APIs have been put in place to further split clk providers from clk consumers, with the goal being to have clk providers never deal with struct clk pointers at all. Conversion of provider drivers is on going. clkdev has also gained support for registering clk_hw pointers directly so we can convert drivers that don't use devicetree. New Drivers: - Marvell ap806 and cp110 system controllers (with clks inside!) - Hisilicon Hi3519 clock and reset controller - Axis ARTPEC-6 clock controllers - Oxford Semiconductor OXNAS clock controllers - AXS10X I2S PLL - Rockchip RK3399 clock and reset controller Updates: - MMC2 and UART2 clks on Samsung Exynos 3250, ACLK on Samsung Exynos 542x SoCs, and some more clk ID exporting for bus frequency scaling - Proper BCM2835 PCM clk support and various other clks - i.MX clk updates for i.MX6SX, i.MX7, and VF610 - Renesas updates for R-Car H3 - Tegra210 got updates for DisplayPort and HDMI 2.0 - Rockchip driver refactorings and fixes due to adding RK3399 support" * tag 'clk-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/clk/linux: (139 commits) clk: fix critical clock locking clk: qcom: mmcc-8996: Remove clocks that should be controlled by RPM clk: ingenic: Allow divider value to be divided clk: sunxi: Add display and TCON0 clocks driver clk: rockchip: drop old_rate calculation on pll rate changes clk: rockchip: simplify GRF handling in pll clocks clk: rockchip: lookup General Register Files in rockchip_clk_init clk: rockchip: fix the rk3399 sdmmc sample / drv name clk: mvebu: new driver for Armada CP110 system controller dt-bindings: arm: add DT binding for Marvell CP110 system controller clk: mvebu: new driver for Armada AP806 system controller clk: hisilicon: add CRG driver for hi3519 soc clk: hisilicon: export some hisilicon APIs to modules reset: hisilicon: add reset controller driver for hisilicon SOCs clk: bcm/kona: Do not use sizeof on pointer type clk: qcom: msm8916: Fix crypto clock flags clk: nxp: lpc18xx: Initialize clk_init_data::flags to 0 clk/axs10x: Add I2S PLL clock driver clk: imx7d: fix ahb clock mux 1 clk: fix comment of devm_clk_hw_register() ...
Diffstat (limited to 'drivers/clk/clk-divider.c')
-rw-r--r--drivers/clk/clk-divider.c91
1 files changed, 83 insertions, 8 deletions
diff --git a/drivers/clk/clk-divider.c b/drivers/clk/clk-divider.c
index 00e035b51c69..a0f55bc1ad3d 100644
--- a/drivers/clk/clk-divider.c
+++ b/drivers/clk/clk-divider.c
@@ -426,15 +426,16 @@ const struct clk_ops clk_divider_ro_ops = {
426}; 426};
427EXPORT_SYMBOL_GPL(clk_divider_ro_ops); 427EXPORT_SYMBOL_GPL(clk_divider_ro_ops);
428 428
429static struct clk *_register_divider(struct device *dev, const char *name, 429static struct clk_hw *_register_divider(struct device *dev, const char *name,
430 const char *parent_name, unsigned long flags, 430 const char *parent_name, unsigned long flags,
431 void __iomem *reg, u8 shift, u8 width, 431 void __iomem *reg, u8 shift, u8 width,
432 u8 clk_divider_flags, const struct clk_div_table *table, 432 u8 clk_divider_flags, const struct clk_div_table *table,
433 spinlock_t *lock) 433 spinlock_t *lock)
434{ 434{
435 struct clk_divider *div; 435 struct clk_divider *div;
436 struct clk *clk; 436 struct clk_hw *hw;
437 struct clk_init_data init; 437 struct clk_init_data init;
438 int ret;
438 439
439 if (clk_divider_flags & CLK_DIVIDER_HIWORD_MASK) { 440 if (clk_divider_flags & CLK_DIVIDER_HIWORD_MASK) {
440 if (width + shift > 16) { 441 if (width + shift > 16) {
@@ -467,12 +468,14 @@ static struct clk *_register_divider(struct device *dev, const char *name,
467 div->table = table; 468 div->table = table;
468 469
469 /* register the clock */ 470 /* register the clock */
470 clk = clk_register(dev, &div->hw); 471 hw = &div->hw;
471 472 ret = clk_hw_register(dev, hw);
472 if (IS_ERR(clk)) 473 if (ret) {
473 kfree(div); 474 kfree(div);
475 hw = ERR_PTR(ret);
476 }
474 477
475 return clk; 478 return hw;
476} 479}
477 480
478/** 481/**
@@ -492,12 +495,39 @@ struct clk *clk_register_divider(struct device *dev, const char *name,
492 void __iomem *reg, u8 shift, u8 width, 495 void __iomem *reg, u8 shift, u8 width,
493 u8 clk_divider_flags, spinlock_t *lock) 496 u8 clk_divider_flags, spinlock_t *lock)
494{ 497{
495 return _register_divider(dev, name, parent_name, flags, reg, shift, 498 struct clk_hw *hw;
499
500 hw = _register_divider(dev, name, parent_name, flags, reg, shift,
496 width, clk_divider_flags, NULL, lock); 501 width, clk_divider_flags, NULL, lock);
502 if (IS_ERR(hw))
503 return ERR_CAST(hw);
504 return hw->clk;
497} 505}
498EXPORT_SYMBOL_GPL(clk_register_divider); 506EXPORT_SYMBOL_GPL(clk_register_divider);
499 507
500/** 508/**
509 * clk_hw_register_divider - register a divider clock with the clock framework
510 * @dev: device registering this clock
511 * @name: name of this clock
512 * @parent_name: name of clock's parent
513 * @flags: framework-specific flags
514 * @reg: register address to adjust divider
515 * @shift: number of bits to shift the bitfield
516 * @width: width of the bitfield
517 * @clk_divider_flags: divider-specific flags for this clock
518 * @lock: shared register lock for this clock
519 */
520struct clk_hw *clk_hw_register_divider(struct device *dev, const char *name,
521 const char *parent_name, unsigned long flags,
522 void __iomem *reg, u8 shift, u8 width,
523 u8 clk_divider_flags, spinlock_t *lock)
524{
525 return _register_divider(dev, name, parent_name, flags, reg, shift,
526 width, clk_divider_flags, NULL, lock);
527}
528EXPORT_SYMBOL_GPL(clk_hw_register_divider);
529
530/**
501 * clk_register_divider_table - register a table based divider clock with 531 * clk_register_divider_table - register a table based divider clock with
502 * the clock framework 532 * the clock framework
503 * @dev: device registering this clock 533 * @dev: device registering this clock
@@ -517,11 +547,41 @@ struct clk *clk_register_divider_table(struct device *dev, const char *name,
517 u8 clk_divider_flags, const struct clk_div_table *table, 547 u8 clk_divider_flags, const struct clk_div_table *table,
518 spinlock_t *lock) 548 spinlock_t *lock)
519{ 549{
520 return _register_divider(dev, name, parent_name, flags, reg, shift, 550 struct clk_hw *hw;
551
552 hw = _register_divider(dev, name, parent_name, flags, reg, shift,
521 width, clk_divider_flags, table, lock); 553 width, clk_divider_flags, table, lock);
554 if (IS_ERR(hw))
555 return ERR_CAST(hw);
556 return hw->clk;
522} 557}
523EXPORT_SYMBOL_GPL(clk_register_divider_table); 558EXPORT_SYMBOL_GPL(clk_register_divider_table);
524 559
560/**
561 * clk_hw_register_divider_table - register a table based divider clock with
562 * the clock framework
563 * @dev: device registering this clock
564 * @name: name of this clock
565 * @parent_name: name of clock's parent
566 * @flags: framework-specific flags
567 * @reg: register address to adjust divider
568 * @shift: number of bits to shift the bitfield
569 * @width: width of the bitfield
570 * @clk_divider_flags: divider-specific flags for this clock
571 * @table: array of divider/value pairs ending with a div set to 0
572 * @lock: shared register lock for this clock
573 */
574struct clk_hw *clk_hw_register_divider_table(struct device *dev,
575 const char *name, const char *parent_name, unsigned long flags,
576 void __iomem *reg, u8 shift, u8 width,
577 u8 clk_divider_flags, const struct clk_div_table *table,
578 spinlock_t *lock)
579{
580 return _register_divider(dev, name, parent_name, flags, reg, shift,
581 width, clk_divider_flags, table, lock);
582}
583EXPORT_SYMBOL_GPL(clk_hw_register_divider_table);
584
525void clk_unregister_divider(struct clk *clk) 585void clk_unregister_divider(struct clk *clk)
526{ 586{
527 struct clk_divider *div; 587 struct clk_divider *div;
@@ -537,3 +597,18 @@ void clk_unregister_divider(struct clk *clk)
537 kfree(div); 597 kfree(div);
538} 598}
539EXPORT_SYMBOL_GPL(clk_unregister_divider); 599EXPORT_SYMBOL_GPL(clk_unregister_divider);
600
601/**
602 * clk_hw_unregister_divider - unregister a clk divider
603 * @hw: hardware-specific clock data to unregister
604 */
605void clk_hw_unregister_divider(struct clk_hw *hw)
606{
607 struct clk_divider *div;
608
609 div = to_clk_divider(hw);
610
611 clk_hw_unregister(hw);
612 kfree(div);
613}
614EXPORT_SYMBOL_GPL(clk_hw_unregister_divider);