aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/clk/bcm/clk-iproc-pll.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/clk/bcm/clk-iproc-pll.c')
-rw-r--r--drivers/clk/bcm/clk-iproc-pll.c32
1 files changed, 16 insertions, 16 deletions
diff --git a/drivers/clk/bcm/clk-iproc-pll.c b/drivers/clk/bcm/clk-iproc-pll.c
index fd492a5dad12..e04634c46395 100644
--- a/drivers/clk/bcm/clk-iproc-pll.c
+++ b/drivers/clk/bcm/clk-iproc-pll.c
@@ -89,7 +89,7 @@ struct iproc_pll {
89 const struct iproc_pll_vco_param *vco_param; 89 const struct iproc_pll_vco_param *vco_param;
90 unsigned int num_vco_entries; 90 unsigned int num_vco_entries;
91 91
92 struct clk_onecell_data clk_data; 92 struct clk_hw_onecell_data *clk_data;
93 struct iproc_clk *clks; 93 struct iproc_clk *clks;
94}; 94};
95 95
@@ -625,7 +625,6 @@ void __init iproc_pll_clk_setup(struct device_node *node,
625 unsigned int num_clks) 625 unsigned int num_clks)
626{ 626{
627 int i, ret; 627 int i, ret;
628 struct clk *clk;
629 struct iproc_pll *pll; 628 struct iproc_pll *pll;
630 struct iproc_clk *iclk; 629 struct iproc_clk *iclk;
631 struct clk_init_data init; 630 struct clk_init_data init;
@@ -638,11 +637,11 @@ void __init iproc_pll_clk_setup(struct device_node *node,
638 if (WARN_ON(!pll)) 637 if (WARN_ON(!pll))
639 return; 638 return;
640 639
641 pll->clk_data.clk_num = num_clks; 640 pll->clk_data = kzalloc(sizeof(*pll->clk_data->hws) * num_clks +
642 pll->clk_data.clks = kcalloc(num_clks, sizeof(*pll->clk_data.clks), 641 sizeof(*pll->clk_data), GFP_KERNEL);
643 GFP_KERNEL); 642 if (WARN_ON(!pll->clk_data))
644 if (WARN_ON(!pll->clk_data.clks))
645 goto err_clk_data; 643 goto err_clk_data;
644 pll->clk_data->num = num_clks;
646 645
647 pll->clks = kcalloc(num_clks, sizeof(*pll->clks), GFP_KERNEL); 646 pll->clks = kcalloc(num_clks, sizeof(*pll->clks), GFP_KERNEL);
648 if (WARN_ON(!pll->clks)) 647 if (WARN_ON(!pll->clks))
@@ -694,11 +693,11 @@ void __init iproc_pll_clk_setup(struct device_node *node,
694 693
695 iproc_pll_sw_cfg(pll); 694 iproc_pll_sw_cfg(pll);
696 695
697 clk = clk_register(NULL, &iclk->hw); 696 ret = clk_hw_register(NULL, &iclk->hw);
698 if (WARN_ON(IS_ERR(clk))) 697 if (WARN_ON(ret))
699 goto err_pll_register; 698 goto err_pll_register;
700 699
701 pll->clk_data.clks[0] = clk; 700 pll->clk_data->hws[0] = &iclk->hw;
702 701
703 /* now initialize and register all leaf clocks */ 702 /* now initialize and register all leaf clocks */
704 for (i = 1; i < num_clks; i++) { 703 for (i = 1; i < num_clks; i++) {
@@ -724,22 +723,23 @@ void __init iproc_pll_clk_setup(struct device_node *node,
724 init.num_parents = (parent_name ? 1 : 0); 723 init.num_parents = (parent_name ? 1 : 0);
725 iclk->hw.init = &init; 724 iclk->hw.init = &init;
726 725
727 clk = clk_register(NULL, &iclk->hw); 726 ret = clk_hw_register(NULL, &iclk->hw);
728 if (WARN_ON(IS_ERR(clk))) 727 if (WARN_ON(ret))
729 goto err_clk_register; 728 goto err_clk_register;
730 729
731 pll->clk_data.clks[i] = clk; 730 pll->clk_data->hws[i] = &iclk->hw;
732 } 731 }
733 732
734 ret = of_clk_add_provider(node, of_clk_src_onecell_get, &pll->clk_data); 733 ret = of_clk_add_hw_provider(node, of_clk_hw_onecell_get,
734 pll->clk_data);
735 if (WARN_ON(ret)) 735 if (WARN_ON(ret))
736 goto err_clk_register; 736 goto err_clk_register;
737 737
738 return; 738 return;
739 739
740err_clk_register: 740err_clk_register:
741 for (i = 0; i < num_clks; i++) 741 while (--i >= 0)
742 clk_unregister(pll->clk_data.clks[i]); 742 clk_hw_unregister(pll->clk_data->hws[i]);
743 743
744err_pll_register: 744err_pll_register:
745 if (pll->status_base != pll->control_base) 745 if (pll->status_base != pll->control_base)
@@ -759,7 +759,7 @@ err_pll_iomap:
759 kfree(pll->clks); 759 kfree(pll->clks);
760 760
761err_clks: 761err_clks:
762 kfree(pll->clk_data.clks); 762 kfree(pll->clk_data);
763 763
764err_clk_data: 764err_clk_data:
765 kfree(pll); 765 kfree(pll);