diff options
| author | Mike Turquette <mturquette@linaro.org> | 2014-09-30 02:38:59 -0400 |
|---|---|---|
| committer | Mike Turquette <mturquette@linaro.org> | 2014-09-30 02:38:59 -0400 |
| commit | 82de1bc86c493ad832db270635fbf4e8c237f02f (patch) | |
| tree | f70562cf3ae0a777ff55da734466627e2ab2478c | |
| parent | 6e18ff26c2b529de06207caa2be9e5f1cf520972 (diff) | |
| parent | 04ed831f224d4553682f48e1b4a6b68f2622b68e (diff) | |
Merge branch 'for-v3.18/ti-clk-driver' of github.com:t-kristo/linux-pm into clk-next
| -rw-r--r-- | arch/arm/mach-omap2/io.c | 12 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/prm_common.c | 2 | ||||
| -rw-r--r-- | drivers/clk/ti/clk-dra7-atl.c | 2 | ||||
| -rw-r--r-- | drivers/clk/ti/clk.c | 68 | ||||
| -rw-r--r-- | drivers/clk/ti/clockdomain.c | 5 | ||||
| -rw-r--r-- | drivers/clk/ti/divider.c | 4 | ||||
| -rw-r--r-- | include/linux/clk/ti.h | 1 |
7 files changed, 63 insertions, 31 deletions
diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c index 5d0667c119f6..a1b82a994842 100644 --- a/arch/arm/mach-omap2/io.c +++ b/arch/arm/mach-omap2/io.c | |||
| @@ -734,8 +734,16 @@ int __init omap_clk_init(void) | |||
| 734 | ti_clk_init_features(); | 734 | ti_clk_init_features(); |
| 735 | 735 | ||
| 736 | ret = of_prcm_init(); | 736 | ret = of_prcm_init(); |
| 737 | if (!ret) | 737 | if (ret) |
| 738 | ret = omap_clk_soc_init(); | 738 | return ret; |
| 739 | |||
| 740 | of_clk_init(NULL); | ||
| 741 | |||
| 742 | ti_dt_clk_init_retry_clks(); | ||
| 743 | |||
| 744 | ti_dt_clockdomains_setup(); | ||
| 745 | |||
| 746 | ret = omap_clk_soc_init(); | ||
| 739 | 747 | ||
| 740 | return ret; | 748 | return ret; |
| 741 | } | 749 | } |
diff --git a/arch/arm/mach-omap2/prm_common.c b/arch/arm/mach-omap2/prm_common.c index 76ca320f007c..3b890807f5e6 100644 --- a/arch/arm/mach-omap2/prm_common.c +++ b/arch/arm/mach-omap2/prm_common.c | |||
| @@ -525,8 +525,6 @@ int __init of_prcm_init(void) | |||
| 525 | memmap_index++; | 525 | memmap_index++; |
| 526 | } | 526 | } |
| 527 | 527 | ||
| 528 | ti_dt_clockdomains_setup(); | ||
| 529 | |||
| 530 | return 0; | 528 | return 0; |
| 531 | } | 529 | } |
| 532 | 530 | ||
diff --git a/drivers/clk/ti/clk-dra7-atl.c b/drivers/clk/ti/clk-dra7-atl.c index 990e1d9edc01..59bb4b39d12e 100644 --- a/drivers/clk/ti/clk-dra7-atl.c +++ b/drivers/clk/ti/clk-dra7-atl.c | |||
| @@ -203,6 +203,7 @@ static void __init of_dra7_atl_clock_setup(struct device_node *node) | |||
| 203 | 203 | ||
| 204 | if (!IS_ERR(clk)) { | 204 | if (!IS_ERR(clk)) { |
| 205 | of_clk_add_provider(node, of_clk_src_simple_get, clk); | 205 | of_clk_add_provider(node, of_clk_src_simple_get, clk); |
| 206 | kfree(parent_names); | ||
| 206 | return; | 207 | return; |
| 207 | } | 208 | } |
| 208 | cleanup: | 209 | cleanup: |
| @@ -228,6 +229,7 @@ static int of_dra7_atl_clk_probe(struct platform_device *pdev) | |||
| 228 | cinfo->iobase = of_iomap(node, 0); | 229 | cinfo->iobase = of_iomap(node, 0); |
| 229 | cinfo->dev = &pdev->dev; | 230 | cinfo->dev = &pdev->dev; |
| 230 | pm_runtime_enable(cinfo->dev); | 231 | pm_runtime_enable(cinfo->dev); |
| 232 | pm_runtime_irq_safe(cinfo->dev); | ||
| 231 | 233 | ||
| 232 | pm_runtime_get_sync(cinfo->dev); | 234 | pm_runtime_get_sync(cinfo->dev); |
| 233 | atl_write(cinfo, DRA7_ATL_PCLKMUX_REG(0), DRA7_ATL_PCLKMUX); | 235 | atl_write(cinfo, DRA7_ATL_PCLKMUX_REG(0), DRA7_ATL_PCLKMUX); |
diff --git a/drivers/clk/ti/clk.c b/drivers/clk/ti/clk.c index b1a6f7144f3f..337abe5909e1 100644 --- a/drivers/clk/ti/clk.c +++ b/drivers/clk/ti/clk.c | |||
| @@ -25,8 +25,8 @@ | |||
| 25 | #undef pr_fmt | 25 | #undef pr_fmt |
| 26 | #define pr_fmt(fmt) "%s: " fmt, __func__ | 26 | #define pr_fmt(fmt) "%s: " fmt, __func__ |
| 27 | 27 | ||
| 28 | static int ti_dt_clk_memmap_index; | ||
| 29 | struct ti_clk_ll_ops *ti_clk_ll_ops; | 28 | struct ti_clk_ll_ops *ti_clk_ll_ops; |
| 29 | static struct device_node *clocks_node_ptr[CLK_MAX_MEMMAPS]; | ||
| 30 | 30 | ||
| 31 | /** | 31 | /** |
| 32 | * ti_dt_clocks_register - register DT alias clocks during boot | 32 | * ti_dt_clocks_register - register DT alias clocks during boot |
| @@ -108,9 +108,21 @@ void __iomem *ti_clk_get_reg_addr(struct device_node *node, int index) | |||
| 108 | struct clk_omap_reg *reg; | 108 | struct clk_omap_reg *reg; |
| 109 | u32 val; | 109 | u32 val; |
| 110 | u32 tmp; | 110 | u32 tmp; |
| 111 | int i; | ||
| 111 | 112 | ||
| 112 | reg = (struct clk_omap_reg *)&tmp; | 113 | reg = (struct clk_omap_reg *)&tmp; |
| 113 | reg->index = ti_dt_clk_memmap_index; | 114 | |
| 115 | for (i = 0; i < CLK_MAX_MEMMAPS; i++) { | ||
| 116 | if (clocks_node_ptr[i] == node->parent) | ||
| 117 | break; | ||
| 118 | } | ||
| 119 | |||
| 120 | if (i == CLK_MAX_MEMMAPS) { | ||
| 121 | pr_err("clk-provider not found for %s!\n", node->name); | ||
| 122 | return NULL; | ||
| 123 | } | ||
| 124 | |||
| 125 | reg->index = i; | ||
| 114 | 126 | ||
| 115 | if (of_property_read_u32_index(node, "reg", index, &val)) { | 127 | if (of_property_read_u32_index(node, "reg", index, &val)) { |
| 116 | pr_err("%s must have reg[%d]!\n", node->name, index); | 128 | pr_err("%s must have reg[%d]!\n", node->name, index); |
| @@ -127,20 +139,14 @@ void __iomem *ti_clk_get_reg_addr(struct device_node *node, int index) | |||
| 127 | * @parent: master node | 139 | * @parent: master node |
| 128 | * @index: internal index for clk_reg_ops | 140 | * @index: internal index for clk_reg_ops |
| 129 | * | 141 | * |
| 130 | * Initializes a master clock IP block and its child clock nodes. | 142 | * Initializes a master clock IP block. This basically sets up the |
| 131 | * Regmap is provided for accessing the register space for the | 143 | * mapping from clocks node to the memory map index. All the clocks |
| 132 | * IP block and all the clocks under it. | 144 | * are then initialized through the common of_clk_init call, and the |
| 145 | * clocks will access their memory maps based on the node layout. | ||
| 133 | */ | 146 | */ |
| 134 | void ti_dt_clk_init_provider(struct device_node *parent, int index) | 147 | void ti_dt_clk_init_provider(struct device_node *parent, int index) |
| 135 | { | 148 | { |
| 136 | const struct of_device_id *match; | ||
| 137 | struct device_node *np; | ||
| 138 | struct device_node *clocks; | 149 | struct device_node *clocks; |
| 139 | of_clk_init_cb_t clk_init_cb; | ||
| 140 | struct clk_init_item *retry; | ||
| 141 | struct clk_init_item *tmp; | ||
| 142 | |||
| 143 | ti_dt_clk_memmap_index = index; | ||
| 144 | 150 | ||
| 145 | /* get clocks for this parent */ | 151 | /* get clocks for this parent */ |
| 146 | clocks = of_get_child_by_name(parent, "clocks"); | 152 | clocks = of_get_child_by_name(parent, "clocks"); |
| @@ -149,19 +155,31 @@ void ti_dt_clk_init_provider(struct device_node *parent, int index) | |||
| 149 | return; | 155 | return; |
| 150 | } | 156 | } |
| 151 | 157 | ||
| 152 | for_each_child_of_node(clocks, np) { | 158 | /* add clocks node info */ |
| 153 | match = of_match_node(&__clk_of_table, np); | 159 | clocks_node_ptr[index] = clocks; |
| 154 | if (!match) | 160 | } |
| 155 | continue; | ||
| 156 | clk_init_cb = (of_clk_init_cb_t)match->data; | ||
| 157 | pr_debug("%s: initializing: %s\n", __func__, np->name); | ||
| 158 | clk_init_cb(np); | ||
| 159 | } | ||
| 160 | 161 | ||
| 161 | list_for_each_entry_safe(retry, tmp, &retry_list, link) { | 162 | /** |
| 162 | pr_debug("retry-init: %s\n", retry->node->name); | 163 | * ti_dt_clk_init_retry_clks - init clocks from the retry list |
| 163 | retry->func(retry->hw, retry->node); | 164 | * |
| 164 | list_del(&retry->link); | 165 | * Initializes any clocks that have failed to initialize before, |
| 165 | kfree(retry); | 166 | * reasons being missing parent node(s) during earlier init. This |
| 167 | * typically happens only for DPLLs which need to have both of their | ||
| 168 | * parent clocks ready during init. | ||
| 169 | */ | ||
| 170 | void ti_dt_clk_init_retry_clks(void) | ||
| 171 | { | ||
| 172 | struct clk_init_item *retry; | ||
| 173 | struct clk_init_item *tmp; | ||
| 174 | int retries = 5; | ||
| 175 | |||
| 176 | while (!list_empty(&retry_list) && retries) { | ||
| 177 | list_for_each_entry_safe(retry, tmp, &retry_list, link) { | ||
| 178 | pr_debug("retry-init: %s\n", retry->node->name); | ||
| 179 | retry->func(retry->hw, retry->node); | ||
| 180 | list_del(&retry->link); | ||
| 181 | kfree(retry); | ||
| 182 | } | ||
| 183 | retries--; | ||
| 166 | } | 184 | } |
| 167 | } | 185 | } |
diff --git a/drivers/clk/ti/clockdomain.c b/drivers/clk/ti/clockdomain.c index f1e0038d76ac..b4c5faccaece 100644 --- a/drivers/clk/ti/clockdomain.c +++ b/drivers/clk/ti/clockdomain.c | |||
| @@ -36,6 +36,11 @@ static void __init of_ti_clockdomain_setup(struct device_node *node) | |||
| 36 | 36 | ||
| 37 | for (i = 0; i < num_clks; i++) { | 37 | for (i = 0; i < num_clks; i++) { |
| 38 | clk = of_clk_get(node, i); | 38 | clk = of_clk_get(node, i); |
| 39 | if (IS_ERR(clk)) { | ||
| 40 | pr_err("%s: Failed get %s' clock nr %d (%ld)\n", | ||
| 41 | __func__, node->full_name, i, PTR_ERR(clk)); | ||
| 42 | continue; | ||
| 43 | } | ||
| 39 | if (__clk_get_flags(clk) & CLK_IS_BASIC) { | 44 | if (__clk_get_flags(clk) & CLK_IS_BASIC) { |
| 40 | pr_warn("can't setup clkdm for basic clk %s\n", | 45 | pr_warn("can't setup clkdm for basic clk %s\n", |
