1f38b0dd6STero Kristo /* 2f38b0dd6STero Kristo * OMAP DPLL clock support 3f38b0dd6STero Kristo * 4f38b0dd6STero Kristo * Copyright (C) 2013 Texas Instruments, Inc. 5f38b0dd6STero Kristo * 6f38b0dd6STero Kristo * Tero Kristo <t-kristo@ti.com> 7f38b0dd6STero Kristo * 8f38b0dd6STero Kristo * This program is free software; you can redistribute it and/or modify 9f38b0dd6STero Kristo * it under the terms of the GNU General Public License version 2 as 10f38b0dd6STero Kristo * published by the Free Software Foundation. 11f38b0dd6STero Kristo * 12f38b0dd6STero Kristo * This program is distributed "as is" WITHOUT ANY WARRANTY of any 13f38b0dd6STero Kristo * kind, whether express or implied; without even the implied warranty 14f38b0dd6STero Kristo * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15f38b0dd6STero Kristo * GNU General Public License for more details. 16f38b0dd6STero Kristo */ 17f38b0dd6STero Kristo 18f38b0dd6STero Kristo #include <linux/clk-provider.h> 19f38b0dd6STero Kristo #include <linux/slab.h> 20f38b0dd6STero Kristo #include <linux/err.h> 21f38b0dd6STero Kristo #include <linux/of.h> 22f38b0dd6STero Kristo #include <linux/of_address.h> 23f38b0dd6STero Kristo #include <linux/clk/ti.h> 24f38b0dd6STero Kristo 25f38b0dd6STero Kristo #undef pr_fmt 26f38b0dd6STero Kristo #define pr_fmt(fmt) "%s: " fmt, __func__ 27f38b0dd6STero Kristo 28f38b0dd6STero Kristo #if defined(CONFIG_ARCH_OMAP4) || defined(CONFIG_SOC_OMAP5) || \ 29f38b0dd6STero Kristo defined(CONFIG_SOC_DRA7XX) 30f38b0dd6STero Kristo static const struct clk_ops dpll_m4xen_ck_ops = { 31f38b0dd6STero Kristo .enable = &omap3_noncore_dpll_enable, 32f38b0dd6STero Kristo .disable = &omap3_noncore_dpll_disable, 33f38b0dd6STero Kristo .recalc_rate = &omap4_dpll_regm4xen_recalc, 34f38b0dd6STero Kristo .round_rate = &omap4_dpll_regm4xen_round_rate, 35f38b0dd6STero Kristo .set_rate = &omap3_noncore_dpll_set_rate, 36f38b0dd6STero Kristo .get_parent = &omap2_init_dpll_parent, 37f38b0dd6STero Kristo }; 38f38b0dd6STero Kristo #endif 39f38b0dd6STero Kristo 40f38b0dd6STero Kristo static const struct clk_ops dpll_core_ck_ops = { 41f38b0dd6STero Kristo .recalc_rate = &omap3_dpll_recalc, 42f38b0dd6STero Kristo .get_parent = &omap2_init_dpll_parent, 43f38b0dd6STero Kristo }; 44f38b0dd6STero Kristo 45f38b0dd6STero Kristo #ifdef CONFIG_ARCH_OMAP3 46f38b0dd6STero Kristo static const struct clk_ops omap3_dpll_core_ck_ops = { 47f38b0dd6STero Kristo .get_parent = &omap2_init_dpll_parent, 48f38b0dd6STero Kristo .recalc_rate = &omap3_dpll_recalc, 49f38b0dd6STero Kristo .round_rate = &omap2_dpll_round_rate, 50f38b0dd6STero Kristo }; 51f38b0dd6STero Kristo #endif 52f38b0dd6STero Kristo 53f38b0dd6STero Kristo static const struct clk_ops dpll_ck_ops = { 54f38b0dd6STero Kristo .enable = &omap3_noncore_dpll_enable, 55f38b0dd6STero Kristo .disable = &omap3_noncore_dpll_disable, 56f38b0dd6STero Kristo .recalc_rate = &omap3_dpll_recalc, 57f38b0dd6STero Kristo .round_rate = &omap2_dpll_round_rate, 58f38b0dd6STero Kristo .set_rate = &omap3_noncore_dpll_set_rate, 59f38b0dd6STero Kristo .get_parent = &omap2_init_dpll_parent, 60f38b0dd6STero Kristo }; 61f38b0dd6STero Kristo 62f38b0dd6STero Kristo static const struct clk_ops dpll_no_gate_ck_ops = { 63f38b0dd6STero Kristo .recalc_rate = &omap3_dpll_recalc, 64f38b0dd6STero Kristo .get_parent = &omap2_init_dpll_parent, 65f38b0dd6STero Kristo .round_rate = &omap2_dpll_round_rate, 66f38b0dd6STero Kristo .set_rate = &omap3_noncore_dpll_set_rate, 67f38b0dd6STero Kristo }; 68f38b0dd6STero Kristo 69f38b0dd6STero Kristo #ifdef CONFIG_ARCH_OMAP3 70f38b0dd6STero Kristo static const struct clk_ops omap3_dpll_ck_ops = { 71f38b0dd6STero Kristo .enable = &omap3_noncore_dpll_enable, 72f38b0dd6STero Kristo .disable = &omap3_noncore_dpll_disable, 73f38b0dd6STero Kristo .get_parent = &omap2_init_dpll_parent, 74f38b0dd6STero Kristo .recalc_rate = &omap3_dpll_recalc, 75f38b0dd6STero Kristo .set_rate = &omap3_noncore_dpll_set_rate, 76f38b0dd6STero Kristo .round_rate = &omap2_dpll_round_rate, 77f38b0dd6STero Kristo }; 78f38b0dd6STero Kristo 79f38b0dd6STero Kristo static const struct clk_ops omap3_dpll_per_ck_ops = { 80f38b0dd6STero Kristo .enable = &omap3_noncore_dpll_enable, 81f38b0dd6STero Kristo .disable = &omap3_noncore_dpll_disable, 82f38b0dd6STero Kristo .get_parent = &omap2_init_dpll_parent, 83f38b0dd6STero Kristo .recalc_rate = &omap3_dpll_recalc, 84f38b0dd6STero Kristo .set_rate = &omap3_dpll4_set_rate, 85f38b0dd6STero Kristo .round_rate = &omap2_dpll_round_rate, 86f38b0dd6STero Kristo }; 87f38b0dd6STero Kristo #endif 88f38b0dd6STero Kristo 89f38b0dd6STero Kristo static const struct clk_ops dpll_x2_ck_ops = { 90f38b0dd6STero Kristo .recalc_rate = &omap3_clkoutx2_recalc, 91f38b0dd6STero Kristo }; 92f38b0dd6STero Kristo 93f38b0dd6STero Kristo /** 94f38b0dd6STero Kristo * ti_clk_register_dpll - low level registration of a DPLL clock 95f38b0dd6STero Kristo * @hw: hardware clock definition for the clock 96f38b0dd6STero Kristo * @node: device node for the clock 97f38b0dd6STero Kristo * 98f38b0dd6STero Kristo * Finalizes DPLL registration process. In case a failure (clk-ref or 99f38b0dd6STero Kristo * clk-bypass is missing), the clock is added to retry list and 100f38b0dd6STero Kristo * the initialization is retried on later stage. 101f38b0dd6STero Kristo */ 102f38b0dd6STero Kristo static void __init ti_clk_register_dpll(struct clk_hw *hw, 103f38b0dd6STero Kristo struct device_node *node) 104f38b0dd6STero Kristo { 105f38b0dd6STero Kristo struct clk_hw_omap *clk_hw = to_clk_hw_omap(hw); 106f38b0dd6STero Kristo struct dpll_data *dd = clk_hw->dpll_data; 107f38b0dd6STero Kristo struct clk *clk; 108f38b0dd6STero Kristo 109f38b0dd6STero Kristo dd->clk_ref = of_clk_get(node, 0); 110f38b0dd6STero Kristo dd->clk_bypass = of_clk_get(node, 1); 111f38b0dd6STero Kristo 112f38b0dd6STero Kristo if (IS_ERR(dd->clk_ref) || IS_ERR(dd->clk_bypass)) { 113f38b0dd6STero Kristo pr_debug("clk-ref or clk-bypass missing for %s, retry later\n", 114f38b0dd6STero Kristo node->name); 115f38b0dd6STero Kristo if (!ti_clk_retry_init(node, hw, ti_clk_register_dpll)) 116f38b0dd6STero Kristo return; 117f38b0dd6STero Kristo 118f38b0dd6STero Kristo goto cleanup; 119f38b0dd6STero Kristo } 120f38b0dd6STero Kristo 121f38b0dd6STero Kristo /* register the clock */ 122f38b0dd6STero Kristo clk = clk_register(NULL, &clk_hw->hw); 123f38b0dd6STero Kristo 124f38b0dd6STero Kristo if (!IS_ERR(clk)) { 125f38b0dd6STero Kristo omap2_init_clk_hw_omap_clocks(clk); 126f38b0dd6STero Kristo of_clk_add_provider(node, of_clk_src_simple_get, clk); 127f38b0dd6STero Kristo kfree(clk_hw->hw.init->parent_names); 128f38b0dd6STero Kristo kfree(clk_hw->hw.init); 129f38b0dd6STero Kristo return; 130f38b0dd6STero Kristo } 131f38b0dd6STero Kristo 132f38b0dd6STero Kristo cleanup: 133f38b0dd6STero Kristo kfree(clk_hw->dpll_data); 134f38b0dd6STero Kristo kfree(clk_hw->hw.init->parent_names); 135f38b0dd6STero Kristo kfree(clk_hw->hw.init); 136f38b0dd6STero Kristo kfree(clk_hw); 137f38b0dd6STero Kristo } 138f38b0dd6STero Kristo 139f38b0dd6STero Kristo #if defined(CONFIG_ARCH_OMAP4) || defined(CONFIG_SOC_OMAP5) || \ 140f38b0dd6STero Kristo defined(CONFIG_SOC_DRA7XX) || defined(CONFIG_SOC_AM33XX) 141f38b0dd6STero Kristo /** 142f38b0dd6STero Kristo * ti_clk_register_dpll_x2 - Registers a DPLLx2 clock 143f38b0dd6STero Kristo * @node: device node for this clock 144f38b0dd6STero Kristo * @ops: clk_ops for this clock 145f38b0dd6STero Kristo * @hw_ops: clk_hw_ops for this clock 146f38b0dd6STero Kristo * 147f38b0dd6STero Kristo * Initializes a DPLL x 2 clock from device tree data. 148f38b0dd6STero Kristo */ 149f38b0dd6STero Kristo static void ti_clk_register_dpll_x2(struct device_node *node, 150f38b0dd6STero Kristo const struct clk_ops *ops, 151f38b0dd6STero Kristo const struct clk_hw_omap_ops *hw_ops) 152f38b0dd6STero Kristo { 153f38b0dd6STero Kristo struct clk *clk; 154f38b0dd6STero Kristo struct clk_init_data init = { NULL }; 155f38b0dd6STero Kristo struct clk_hw_omap *clk_hw; 156f38b0dd6STero Kristo const char *name = node->name; 157f38b0dd6STero Kristo const char *parent_name; 158f38b0dd6STero Kristo 159f38b0dd6STero Kristo parent_name = of_clk_get_parent_name(node, 0); 160f38b0dd6STero Kristo if (!parent_name) { 161f38b0dd6STero Kristo pr_err("%s must have parent\n", node->name); 162f38b0dd6STero Kristo return; 163f38b0dd6STero Kristo } 164f38b0dd6STero Kristo 165f38b0dd6STero Kristo clk_hw = kzalloc(sizeof(*clk_hw), GFP_KERNEL); 166f38b0dd6STero Kristo if (!clk_hw) 167f38b0dd6STero Kristo return; 168f38b0dd6STero Kristo 169f38b0dd6STero Kristo clk_hw->ops = hw_ops; 170f38b0dd6STero Kristo clk_hw->hw.init = &init; 171f38b0dd6STero Kristo 172f38b0dd6STero Kristo init.name = name; 173f38b0dd6STero Kristo init.ops = ops; 174f38b0dd6STero Kristo init.parent_names = &parent_name; 175f38b0dd6STero Kristo init.num_parents = 1; 176f38b0dd6STero Kristo 177f38b0dd6STero Kristo /* register the clock */ 178f38b0dd6STero Kristo clk = clk_register(NULL, &clk_hw->hw); 179f38b0dd6STero Kristo 180f38b0dd6STero Kristo if (IS_ERR(clk)) { 181f38b0dd6STero Kristo kfree(clk_hw); 182f38b0dd6STero Kristo } else { 183f38b0dd6STero Kristo omap2_init_clk_hw_omap_clocks(clk); 184f38b0dd6STero Kristo of_clk_add_provider(node, of_clk_src_simple_get, clk); 185f38b0dd6STero Kristo } 186f38b0dd6STero Kristo } 187f38b0dd6STero Kristo #endif 188f38b0dd6STero Kristo 189f38b0dd6STero Kristo /** 190f38b0dd6STero Kristo * of_ti_dpll_setup - Setup function for OMAP DPLL clocks 191f38b0dd6STero Kristo * @node: device node containing the DPLL info 192f38b0dd6STero Kristo * @ops: ops for the DPLL 193f38b0dd6STero Kristo * @ddt: DPLL data template to use 194f38b0dd6STero Kristo * 195f38b0dd6STero Kristo * Initializes a DPLL clock from device tree data. 196f38b0dd6STero Kristo */ 197f38b0dd6STero Kristo static void __init of_ti_dpll_setup(struct device_node *node, 198f38b0dd6STero Kristo const struct clk_ops *ops, 199*a6fe3771STero Kristo const struct dpll_data *ddt) 200f38b0dd6STero Kristo { 201f38b0dd6STero Kristo struct clk_hw_omap *clk_hw = NULL; 202f38b0dd6STero Kristo struct clk_init_data *init = NULL; 203f38b0dd6STero Kristo const char **parent_names = NULL; 204f38b0dd6STero Kristo struct dpll_data *dd = NULL; 205f38b0dd6STero Kristo int i; 206f38b0dd6STero Kristo u8 dpll_mode = 0; 207f38b0dd6STero Kristo 208f38b0dd6STero Kristo dd = kzalloc(sizeof(*dd), GFP_KERNEL); 209f38b0dd6STero Kristo clk_hw = kzalloc(sizeof(*clk_hw), GFP_KERNEL); 210f38b0dd6STero Kristo init = kzalloc(sizeof(*init), GFP_KERNEL); 211f38b0dd6STero Kristo if (!dd || !clk_hw || !init) 212f38b0dd6STero Kristo goto cleanup; 213f38b0dd6STero Kristo 214f38b0dd6STero Kristo memcpy(dd, ddt, sizeof(*dd)); 215f38b0dd6STero Kristo 216f38b0dd6STero Kristo clk_hw->dpll_data = dd; 217f38b0dd6STero Kristo clk_hw->ops = &clkhwops_omap3_dpll; 218f38b0dd6STero Kristo clk_hw->hw.init = init; 219f38b0dd6STero Kristo clk_hw->flags = MEMMAP_ADDRESSING; 220f38b0dd6STero Kristo 221f38b0dd6STero Kristo init->name = node->name; 222f38b0dd6STero Kristo init->ops = ops; 223f38b0dd6STero Kristo 224f38b0dd6STero Kristo init->num_parents = of_clk_get_parent_count(node); 225f38b0dd6STero Kristo if (init->num_parents < 1) { 226f38b0dd6STero Kristo pr_err("%s must have parent(s)\n", node->name); 227f38b0dd6STero Kristo goto cleanup; 228f38b0dd6STero Kristo } 229f38b0dd6STero Kristo 230f38b0dd6STero Kristo parent_names = kzalloc(sizeof(char *) * init->num_parents, GFP_KERNEL); 231f38b0dd6STero Kristo if (!parent_names) 232f38b0dd6STero Kristo goto cleanup; 233f38b0dd6STero Kristo 234f38b0dd6STero Kristo for (i = 0; i < init->num_parents; i++) 235f38b0dd6STero Kristo parent_names[i] = of_clk_get_parent_name(node, i); 236f38b0dd6STero Kristo 237f38b0dd6STero Kristo init->parent_names = parent_names; 238f38b0dd6STero Kristo 239f38b0dd6STero Kristo dd->control_reg = ti_clk_get_reg_addr(node, 0); 240f38b0dd6STero Kristo dd->idlest_reg = ti_clk_get_reg_addr(node, 1); 241f38b0dd6STero Kristo dd->mult_div1_reg = ti_clk_get_reg_addr(node, 2); 242f38b0dd6STero Kristo 243f38b0dd6STero Kristo if (!dd->control_reg || !dd->idlest_reg || !dd->mult_div1_reg) 244f38b0dd6STero Kristo goto cleanup; 245f38b0dd6STero Kristo 246*a6fe3771STero Kristo if (dd->autoidle_mask) { 247f38b0dd6STero Kristo dd->autoidle_reg = ti_clk_get_reg_addr(node, 3); 248f38b0dd6STero Kristo if (!dd->autoidle_reg) 249f38b0dd6STero Kristo goto cleanup; 250f38b0dd6STero Kristo } 251f38b0dd6STero Kristo 252f38b0dd6STero Kristo if (of_property_read_bool(node, "ti,low-power-stop")) 253f38b0dd6STero Kristo dpll_mode |= 1 << DPLL_LOW_POWER_STOP; 254f38b0dd6STero Kristo 255f38b0dd6STero Kristo if (of_property_read_bool(node, "ti,low-power-bypass")) 256f38b0dd6STero Kristo dpll_mode |= 1 << DPLL_LOW_POWER_BYPASS; 257f38b0dd6STero Kristo 258f38b0dd6STero Kristo if (of_property_read_bool(node, "ti,lock")) 259f38b0dd6STero Kristo dpll_mode |= 1 << DPLL_LOCKED; 260f38b0dd6STero Kristo 261f38b0dd6STero Kristo if (dpll_mode) 262f38b0dd6STero Kristo dd->modes = dpll_mode; 263f38b0dd6STero Kristo 264f38b0dd6STero Kristo ti_clk_register_dpll(&clk_hw->hw, node); 265f38b0dd6STero Kristo return; 266f38b0dd6STero Kristo 267f38b0dd6STero Kristo cleanup: 268f38b0dd6STero Kristo kfree(dd); 269f38b0dd6STero Kristo kfree(parent_names); 270f38b0dd6STero Kristo kfree(init); 271f38b0dd6STero Kristo kfree(clk_hw); 272f38b0dd6STero Kristo } 273f38b0dd6STero Kristo 274f38b0dd6STero Kristo #if defined(CONFIG_ARCH_OMAP4) || defined(CONFIG_SOC_OMAP5) || \ 275f38b0dd6STero Kristo defined(CONFIG_SOC_DRA7XX) 276f38b0dd6STero Kristo static void __init of_ti_omap4_dpll_x2_setup(struct device_node *node) 277f38b0dd6STero Kristo { 278f38b0dd6STero Kristo ti_clk_register_dpll_x2(node, &dpll_x2_ck_ops, &clkhwops_omap4_dpllmx); 279f38b0dd6STero Kristo } 280f38b0dd6STero Kristo CLK_OF_DECLARE(ti_omap4_dpll_x2_clock, "ti,omap4-dpll-x2-clock", 281f38b0dd6STero Kristo of_ti_omap4_dpll_x2_setup); 282f38b0dd6STero Kristo #endif 283f38b0dd6STero Kristo 284f38b0dd6STero Kristo #ifdef CONFIG_SOC_AM33XX 285f38b0dd6STero Kristo static void __init of_ti_am3_dpll_x2_setup(struct device_node *node) 286f38b0dd6STero Kristo { 287f38b0dd6STero Kristo ti_clk_register_dpll_x2(node, &dpll_x2_ck_ops, NULL); 288f38b0dd6STero Kristo } 289f38b0dd6STero Kristo CLK_OF_DECLARE(ti_am3_dpll_x2_clock, "ti,am3-dpll-x2-clock", 290f38b0dd6STero Kristo of_ti_am3_dpll_x2_setup); 291f38b0dd6STero Kristo #endif 292f38b0dd6STero Kristo 293f38b0dd6STero Kristo #ifdef CONFIG_ARCH_OMAP3 294f38b0dd6STero Kristo static void __init of_ti_omap3_dpll_setup(struct device_node *node) 295f38b0dd6STero Kristo { 296f38b0dd6STero Kristo const struct dpll_data dd = { 297f38b0dd6STero Kristo .idlest_mask = 0x1, 298f38b0dd6STero Kristo .enable_mask = 0x7, 299f38b0dd6STero Kristo .autoidle_mask = 0x7, 300f38b0dd6STero Kristo .mult_mask = 0x7ff << 8, 301f38b0dd6STero Kristo .div1_mask = 0x7f, 302f38b0dd6STero Kristo .max_multiplier = 2047, 303f38b0dd6STero Kristo .max_divider = 128, 304f38b0dd6STero Kristo .min_divider = 1, 305f38b0dd6STero Kristo .freqsel_mask = 0xf0, 306f38b0dd6STero Kristo .modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED), 307f38b0dd6STero Kristo }; 308f38b0dd6STero Kristo 309*a6fe3771STero Kristo of_ti_dpll_setup(node, &omap3_dpll_ck_ops, &dd); 310f38b0dd6STero Kristo } 311f38b0dd6STero Kristo CLK_OF_DECLARE(ti_omap3_dpll_clock, "ti,omap3-dpll-clock", 312f38b0dd6STero Kristo of_ti_omap3_dpll_setup); 313f38b0dd6STero Kristo 314f38b0dd6STero Kristo static void __init of_ti_omap3_core_dpll_setup(struct device_node *node) 315f38b0dd6STero Kristo { 316f38b0dd6STero Kristo const struct dpll_data dd = { 317f38b0dd6STero Kristo .idlest_mask = 0x1, 318f38b0dd6STero Kristo .enable_mask = 0x7, 319f38b0dd6STero Kristo .autoidle_mask = 0x7, 320f38b0dd6STero Kristo .mult_mask = 0x7ff << 16, 321f38b0dd6STero Kristo .div1_mask = 0x7f << 8, 322f38b0dd6STero Kristo .max_multiplier = 2047, 323f38b0dd6STero Kristo .max_divider = 128, 324f38b0dd6STero Kristo .min_divider = 1, 325f38b0dd6STero Kristo .freqsel_mask = 0xf0, 326f38b0dd6STero Kristo }; 327f38b0dd6STero Kristo 328*a6fe3771STero Kristo of_ti_dpll_setup(node, &omap3_dpll_core_ck_ops, &dd); 329f38b0dd6STero Kristo } 330f38b0dd6STero Kristo CLK_OF_DECLARE(ti_omap3_core_dpll_clock, "ti,omap3-dpll-core-clock", 331f38b0dd6STero Kristo of_ti_omap3_core_dpll_setup); 332f38b0dd6STero Kristo 333f38b0dd6STero Kristo static void __init of_ti_omap3_per_dpll_setup(struct device_node *node) 334f38b0dd6STero Kristo { 335f38b0dd6STero Kristo const struct dpll_data dd = { 336f38b0dd6STero Kristo .idlest_mask = 0x1 << 1, 337f38b0dd6STero Kristo .enable_mask = 0x7 << 16, 338f38b0dd6STero Kristo .autoidle_mask = 0x7 << 3, 339f38b0dd6STero Kristo .mult_mask = 0x7ff << 8, 340f38b0dd6STero Kristo .div1_mask = 0x7f, 341f38b0dd6STero Kristo .max_multiplier = 2047, 342f38b0dd6STero Kristo .max_divider = 128, 343f38b0dd6STero Kristo .min_divider = 1, 344f38b0dd6STero Kristo .freqsel_mask = 0xf00000, 345f38b0dd6STero Kristo .modes = (1 << DPLL_LOW_POWER_STOP) | (1 << DPLL_LOCKED), 346f38b0dd6STero Kristo }; 347f38b0dd6STero Kristo 348*a6fe3771STero Kristo of_ti_dpll_setup(node, &omap3_dpll_per_ck_ops, &dd); 349f38b0dd6STero Kristo } 350f38b0dd6STero Kristo CLK_OF_DECLARE(ti_omap3_per_dpll_clock, "ti,omap3-dpll-per-clock", 351f38b0dd6STero Kristo of_ti_omap3_per_dpll_setup); 352f38b0dd6STero Kristo 353f38b0dd6STero Kristo static void __init of_ti_omap3_per_jtype_dpll_setup(struct device_node *node) 354f38b0dd6STero Kristo { 355f38b0dd6STero Kristo const struct dpll_data dd = { 356f38b0dd6STero Kristo .idlest_mask = 0x1 << 1, 357f38b0dd6STero Kristo .enable_mask = 0x7 << 16, 358f38b0dd6STero Kristo .autoidle_mask = 0x7 << 3, 359f38b0dd6STero Kristo .mult_mask = 0xfff << 8, 360f38b0dd6STero Kristo .div1_mask = 0x7f, 361f38b0dd6STero Kristo .max_multiplier = 4095, 362f38b0dd6STero Kristo .max_divider = 128, 363f38b0dd6STero Kristo .min_divider = 1, 364f38b0dd6STero Kristo .sddiv_mask = 0xff << 24, 365f38b0dd6STero Kristo .dco_mask = 0xe << 20, 366f38b0dd6STero Kristo .flags = DPLL_J_TYPE, 367f38b0dd6STero Kristo .modes = (1 << DPLL_LOW_POWER_STOP) | (1 << DPLL_LOCKED), 368f38b0dd6STero Kristo }; 369f38b0dd6STero Kristo 370*a6fe3771STero Kristo of_ti_dpll_setup(node, &omap3_dpll_per_ck_ops, &dd); 371f38b0dd6STero Kristo } 372f38b0dd6STero Kristo CLK_OF_DECLARE(ti_omap3_per_jtype_dpll_clock, "ti,omap3-dpll-per-j-type-clock", 373f38b0dd6STero Kristo of_ti_omap3_per_jtype_dpll_setup); 374f38b0dd6STero Kristo #endif 375f38b0dd6STero Kristo 376f38b0dd6STero Kristo static void __init of_ti_omap4_dpll_setup(struct device_node *node) 377f38b0dd6STero Kristo { 378f38b0dd6STero Kristo const struct dpll_data dd = { 379f38b0dd6STero Kristo .idlest_mask = 0x1, 380f38b0dd6STero Kristo .enable_mask = 0x7, 381f38b0dd6STero Kristo .autoidle_mask = 0x7, 382f38b0dd6STero Kristo .mult_mask = 0x7ff << 8, 383f38b0dd6STero Kristo .div1_mask = 0x7f, 384f38b0dd6STero Kristo .max_multiplier = 2047, 385f38b0dd6STero Kristo .max_divider = 128, 386f38b0dd6STero Kristo .min_divider = 1, 387f38b0dd6STero Kristo .modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED), 388f38b0dd6STero Kristo }; 389f38b0dd6STero Kristo 390*a6fe3771STero Kristo of_ti_dpll_setup(node, &dpll_ck_ops, &dd); 391f38b0dd6STero Kristo } 392f38b0dd6STero Kristo CLK_OF_DECLARE(ti_omap4_dpll_clock, "ti,omap4-dpll-clock", 393f38b0dd6STero Kristo of_ti_omap4_dpll_setup); 394f38b0dd6STero Kristo 395f38b0dd6STero Kristo static void __init of_ti_omap4_core_dpll_setup(struct device_node *node) 396f38b0dd6STero Kristo { 397f38b0dd6STero Kristo const struct dpll_data dd = { 398f38b0dd6STero Kristo .idlest_mask = 0x1, 399f38b0dd6STero Kristo .enable_mask = 0x7, 400f38b0dd6STero Kristo .autoidle_mask = 0x7, 401f38b0dd6STero Kristo .mult_mask = 0x7ff << 8, 402f38b0dd6STero Kristo .div1_mask = 0x7f, 403f38b0dd6STero Kristo .max_multiplier = 2047, 404f38b0dd6STero Kristo .max_divider = 128, 405f38b0dd6STero Kristo .min_divider = 1, 406f38b0dd6STero Kristo .modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED), 407f38b0dd6STero Kristo }; 408f38b0dd6STero Kristo 409*a6fe3771STero Kristo of_ti_dpll_setup(node, &dpll_core_ck_ops, &dd); 410f38b0dd6STero Kristo } 411f38b0dd6STero Kristo CLK_OF_DECLARE(ti_omap4_core_dpll_clock, "ti,omap4-dpll-core-clock", 412f38b0dd6STero Kristo of_ti_omap4_core_dpll_setup); 413f38b0dd6STero Kristo 414f38b0dd6STero Kristo #if defined(CONFIG_ARCH_OMAP4) || defined(CONFIG_SOC_OMAP5) || \ 415f38b0dd6STero Kristo defined(CONFIG_SOC_DRA7XX) 416f38b0dd6STero Kristo static void __init of_ti_omap4_m4xen_dpll_setup(struct device_node *node) 417f38b0dd6STero Kristo { 418f38b0dd6STero Kristo const struct dpll_data dd = { 419f38b0dd6STero Kristo .idlest_mask = 0x1, 420f38b0dd6STero Kristo .enable_mask = 0x7, 421f38b0dd6STero Kristo .autoidle_mask = 0x7, 422f38b0dd6STero Kristo .mult_mask = 0x7ff << 8, 423f38b0dd6STero Kristo .div1_mask = 0x7f, 424f38b0dd6STero Kristo .max_multiplier = 2047, 425f38b0dd6STero Kristo .max_divider = 128, 426f38b0dd6STero Kristo .min_divider = 1, 427f38b0dd6STero Kristo .m4xen_mask = 0x800, 428f38b0dd6STero Kristo .lpmode_mask = 1 << 10, 429f38b0dd6STero Kristo .modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED), 430f38b0dd6STero Kristo }; 431f38b0dd6STero Kristo 432*a6fe3771STero Kristo of_ti_dpll_setup(node, &dpll_m4xen_ck_ops, &dd); 433f38b0dd6STero Kristo } 434f38b0dd6STero Kristo CLK_OF_DECLARE(ti_omap4_m4xen_dpll_clock, "ti,omap4-dpll-m4xen-clock", 435f38b0dd6STero Kristo of_ti_omap4_m4xen_dpll_setup); 436f38b0dd6STero Kristo 437f38b0dd6STero Kristo static void __init of_ti_omap4_jtype_dpll_setup(struct device_node *node) 438f38b0dd6STero Kristo { 439f38b0dd6STero Kristo const struct dpll_data dd = { 440f38b0dd6STero Kristo .idlest_mask = 0x1, 441f38b0dd6STero Kristo .enable_mask = 0x7, 442f38b0dd6STero Kristo .autoidle_mask = 0x7, 443f38b0dd6STero Kristo .mult_mask = 0xfff << 8, 444f38b0dd6STero Kristo .div1_mask = 0xff, 445f38b0dd6STero Kristo .max_multiplier = 4095, 446f38b0dd6STero Kristo .max_divider = 256, 447f38b0dd6STero Kristo .min_divider = 1, 448f38b0dd6STero Kristo .sddiv_mask = 0xff << 24, 449f38b0dd6STero Kristo .flags = DPLL_J_TYPE, 450f38b0dd6STero Kristo .modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED), 451f38b0dd6STero Kristo }; 452f38b0dd6STero Kristo 453*a6fe3771STero Kristo of_ti_dpll_setup(node, &dpll_m4xen_ck_ops, &dd); 454f38b0dd6STero Kristo } 455f38b0dd6STero Kristo CLK_OF_DECLARE(ti_omap4_jtype_dpll_clock, "ti,omap4-dpll-j-type-clock", 456f38b0dd6STero Kristo of_ti_omap4_jtype_dpll_setup); 457f38b0dd6STero Kristo #endif 458f38b0dd6STero Kristo 459f38b0dd6STero Kristo static void __init of_ti_am3_no_gate_dpll_setup(struct device_node *node) 460f38b0dd6STero Kristo { 461f38b0dd6STero Kristo const struct dpll_data dd = { 462f38b0dd6STero Kristo .idlest_mask = 0x1, 463f38b0dd6STero Kristo .enable_mask = 0x7, 464f38b0dd6STero Kristo .mult_mask = 0x7ff << 8, 465f38b0dd6STero Kristo .div1_mask = 0x7f, 466f38b0dd6STero Kristo .max_multiplier = 2047, 467f38b0dd6STero Kristo .max_divider = 128, 468f38b0dd6STero Kristo .min_divider = 1, 469f38b0dd6STero Kristo .modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED), 470f38b0dd6STero Kristo }; 471f38b0dd6STero Kristo 472*a6fe3771STero Kristo of_ti_dpll_setup(node, &dpll_no_gate_ck_ops, &dd); 473f38b0dd6STero Kristo } 474f38b0dd6STero Kristo CLK_OF_DECLARE(ti_am3_no_gate_dpll_clock, "ti,am3-dpll-no-gate-clock", 475f38b0dd6STero Kristo of_ti_am3_no_gate_dpll_setup); 476f38b0dd6STero Kristo 477f38b0dd6STero Kristo static void __init of_ti_am3_jtype_dpll_setup(struct device_node *node) 478f38b0dd6STero Kristo { 479f38b0dd6STero Kristo const struct dpll_data dd = { 480f38b0dd6STero Kristo .idlest_mask = 0x1, 481f38b0dd6STero Kristo .enable_mask = 0x7, 482f38b0dd6STero Kristo .mult_mask = 0x7ff << 8, 483f38b0dd6STero Kristo .div1_mask = 0x7f, 484f38b0dd6STero Kristo .max_multiplier = 4095, 485f38b0dd6STero Kristo .max_divider = 256, 486f38b0dd6STero Kristo .min_divider = 2, 487f38b0dd6STero Kristo .flags = DPLL_J_TYPE, 488f38b0dd6STero Kristo .modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED), 489f38b0dd6STero Kristo }; 490f38b0dd6STero Kristo 491*a6fe3771STero Kristo of_ti_dpll_setup(node, &dpll_ck_ops, &dd); 492f38b0dd6STero Kristo } 493f38b0dd6STero Kristo CLK_OF_DECLARE(ti_am3_jtype_dpll_clock, "ti,am3-dpll-j-type-clock", 494f38b0dd6STero Kristo of_ti_am3_jtype_dpll_setup); 495f38b0dd6STero Kristo 496f38b0dd6STero Kristo static void __init of_ti_am3_no_gate_jtype_dpll_setup(struct device_node *node) 497f38b0dd6STero Kristo { 498f38b0dd6STero Kristo const struct dpll_data dd = { 499f38b0dd6STero Kristo .idlest_mask = 0x1, 500f38b0dd6STero Kristo .enable_mask = 0x7, 501f38b0dd6STero Kristo .mult_mask = 0x7ff << 8, 502f38b0dd6STero Kristo .div1_mask = 0x7f, 503f38b0dd6STero Kristo .max_multiplier = 2047, 504f38b0dd6STero Kristo .max_divider = 128, 505f38b0dd6STero Kristo .min_divider = 1, 506f38b0dd6STero Kristo .flags = DPLL_J_TYPE, 507f38b0dd6STero Kristo .modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED), 508f38b0dd6STero Kristo }; 509f38b0dd6STero Kristo 510*a6fe3771STero Kristo of_ti_dpll_setup(node, &dpll_no_gate_ck_ops, &dd); 511f38b0dd6STero Kristo } 512f38b0dd6STero Kristo CLK_OF_DECLARE(ti_am3_no_gate_jtype_dpll_clock, 513f38b0dd6STero Kristo "ti,am3-dpll-no-gate-j-type-clock", 514f38b0dd6STero Kristo of_ti_am3_no_gate_jtype_dpll_setup); 515f38b0dd6STero Kristo 516f38b0dd6STero Kristo static void __init of_ti_am3_dpll_setup(struct device_node *node) 517f38b0dd6STero Kristo { 518f38b0dd6STero Kristo const struct dpll_data dd = { 519f38b0dd6STero Kristo .idlest_mask = 0x1, 520f38b0dd6STero Kristo .enable_mask = 0x7, 521f38b0dd6STero Kristo .mult_mask = 0x7ff << 8, 522f38b0dd6STero Kristo .div1_mask = 0x7f, 523f38b0dd6STero Kristo .max_multiplier = 2047, 524f38b0dd6STero Kristo .max_divider = 128, 525f38b0dd6STero Kristo .min_divider = 1, 526f38b0dd6STero Kristo .modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED), 527f38b0dd6STero Kristo }; 528f38b0dd6STero Kristo 529*a6fe3771STero Kristo of_ti_dpll_setup(node, &dpll_ck_ops, &dd); 530f38b0dd6STero Kristo } 531f38b0dd6STero Kristo CLK_OF_DECLARE(ti_am3_dpll_clock, "ti,am3-dpll-clock", of_ti_am3_dpll_setup); 532f38b0dd6STero Kristo 533f38b0dd6STero Kristo static void __init of_ti_am3_core_dpll_setup(struct device_node *node) 534f38b0dd6STero Kristo { 535f38b0dd6STero Kristo const struct dpll_data dd = { 536f38b0dd6STero Kristo .idlest_mask = 0x1, 537f38b0dd6STero Kristo .enable_mask = 0x7, 538f38b0dd6STero Kristo .mult_mask = 0x7ff << 8, 539f38b0dd6STero Kristo .div1_mask = 0x7f, 540f38b0dd6STero Kristo .max_multiplier = 2047, 541f38b0dd6STero Kristo .max_divider = 128, 542f38b0dd6STero Kristo .min_divider = 1, 543f38b0dd6STero Kristo .modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED), 544f38b0dd6STero Kristo }; 545f38b0dd6STero Kristo 546*a6fe3771STero Kristo of_ti_dpll_setup(node, &dpll_core_ck_ops, &dd); 547f38b0dd6STero Kristo } 548f38b0dd6STero Kristo CLK_OF_DECLARE(ti_am3_core_dpll_clock, "ti,am3-dpll-core-clock", 549f38b0dd6STero Kristo of_ti_am3_core_dpll_setup); 550