18c2ecf20Sopenharmony_ci/* 28c2ecf20Sopenharmony_ci * OMAP DPLL clock support 38c2ecf20Sopenharmony_ci * 48c2ecf20Sopenharmony_ci * Copyright (C) 2013 Texas Instruments, Inc. 58c2ecf20Sopenharmony_ci * 68c2ecf20Sopenharmony_ci * Tero Kristo <t-kristo@ti.com> 78c2ecf20Sopenharmony_ci * 88c2ecf20Sopenharmony_ci * This program is free software; you can redistribute it and/or modify 98c2ecf20Sopenharmony_ci * it under the terms of the GNU General Public License version 2 as 108c2ecf20Sopenharmony_ci * published by the Free Software Foundation. 118c2ecf20Sopenharmony_ci * 128c2ecf20Sopenharmony_ci * This program is distributed "as is" WITHOUT ANY WARRANTY of any 138c2ecf20Sopenharmony_ci * kind, whether express or implied; without even the implied warranty 148c2ecf20Sopenharmony_ci * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 158c2ecf20Sopenharmony_ci * GNU General Public License for more details. 168c2ecf20Sopenharmony_ci */ 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_ci#include <linux/clk.h> 198c2ecf20Sopenharmony_ci#include <linux/clk-provider.h> 208c2ecf20Sopenharmony_ci#include <linux/slab.h> 218c2ecf20Sopenharmony_ci#include <linux/err.h> 228c2ecf20Sopenharmony_ci#include <linux/of.h> 238c2ecf20Sopenharmony_ci#include <linux/of_address.h> 248c2ecf20Sopenharmony_ci#include <linux/clk/ti.h> 258c2ecf20Sopenharmony_ci#include "clock.h" 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_ci#undef pr_fmt 288c2ecf20Sopenharmony_ci#define pr_fmt(fmt) "%s: " fmt, __func__ 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_ci#if defined(CONFIG_ARCH_OMAP4) || defined(CONFIG_SOC_OMAP5) || \ 318c2ecf20Sopenharmony_ci defined(CONFIG_SOC_DRA7XX) 328c2ecf20Sopenharmony_cistatic const struct clk_ops dpll_m4xen_ck_ops = { 338c2ecf20Sopenharmony_ci .enable = &omap3_noncore_dpll_enable, 348c2ecf20Sopenharmony_ci .disable = &omap3_noncore_dpll_disable, 358c2ecf20Sopenharmony_ci .recalc_rate = &omap4_dpll_regm4xen_recalc, 368c2ecf20Sopenharmony_ci .round_rate = &omap4_dpll_regm4xen_round_rate, 378c2ecf20Sopenharmony_ci .set_rate = &omap3_noncore_dpll_set_rate, 388c2ecf20Sopenharmony_ci .set_parent = &omap3_noncore_dpll_set_parent, 398c2ecf20Sopenharmony_ci .set_rate_and_parent = &omap3_noncore_dpll_set_rate_and_parent, 408c2ecf20Sopenharmony_ci .determine_rate = &omap4_dpll_regm4xen_determine_rate, 418c2ecf20Sopenharmony_ci .get_parent = &omap2_init_dpll_parent, 428c2ecf20Sopenharmony_ci .save_context = &omap3_core_dpll_save_context, 438c2ecf20Sopenharmony_ci .restore_context = &omap3_core_dpll_restore_context, 448c2ecf20Sopenharmony_ci}; 458c2ecf20Sopenharmony_ci#else 468c2ecf20Sopenharmony_cistatic const struct clk_ops dpll_m4xen_ck_ops = {}; 478c2ecf20Sopenharmony_ci#endif 488c2ecf20Sopenharmony_ci 498c2ecf20Sopenharmony_ci#if defined(CONFIG_ARCH_OMAP3) || defined(CONFIG_ARCH_OMAP4) || \ 508c2ecf20Sopenharmony_ci defined(CONFIG_SOC_OMAP5) || defined(CONFIG_SOC_DRA7XX) || \ 518c2ecf20Sopenharmony_ci defined(CONFIG_SOC_AM33XX) || defined(CONFIG_SOC_AM43XX) 528c2ecf20Sopenharmony_cistatic const struct clk_ops dpll_core_ck_ops = { 538c2ecf20Sopenharmony_ci .recalc_rate = &omap3_dpll_recalc, 548c2ecf20Sopenharmony_ci .get_parent = &omap2_init_dpll_parent, 558c2ecf20Sopenharmony_ci}; 568c2ecf20Sopenharmony_ci 578c2ecf20Sopenharmony_cistatic const struct clk_ops dpll_ck_ops = { 588c2ecf20Sopenharmony_ci .enable = &omap3_noncore_dpll_enable, 598c2ecf20Sopenharmony_ci .disable = &omap3_noncore_dpll_disable, 608c2ecf20Sopenharmony_ci .recalc_rate = &omap3_dpll_recalc, 618c2ecf20Sopenharmony_ci .round_rate = &omap2_dpll_round_rate, 628c2ecf20Sopenharmony_ci .set_rate = &omap3_noncore_dpll_set_rate, 638c2ecf20Sopenharmony_ci .set_parent = &omap3_noncore_dpll_set_parent, 648c2ecf20Sopenharmony_ci .set_rate_and_parent = &omap3_noncore_dpll_set_rate_and_parent, 658c2ecf20Sopenharmony_ci .determine_rate = &omap3_noncore_dpll_determine_rate, 668c2ecf20Sopenharmony_ci .get_parent = &omap2_init_dpll_parent, 678c2ecf20Sopenharmony_ci .save_context = &omap3_noncore_dpll_save_context, 688c2ecf20Sopenharmony_ci .restore_context = &omap3_noncore_dpll_restore_context, 698c2ecf20Sopenharmony_ci}; 708c2ecf20Sopenharmony_ci 718c2ecf20Sopenharmony_cistatic const struct clk_ops dpll_no_gate_ck_ops = { 728c2ecf20Sopenharmony_ci .recalc_rate = &omap3_dpll_recalc, 738c2ecf20Sopenharmony_ci .get_parent = &omap2_init_dpll_parent, 748c2ecf20Sopenharmony_ci .round_rate = &omap2_dpll_round_rate, 758c2ecf20Sopenharmony_ci .set_rate = &omap3_noncore_dpll_set_rate, 768c2ecf20Sopenharmony_ci .set_parent = &omap3_noncore_dpll_set_parent, 778c2ecf20Sopenharmony_ci .set_rate_and_parent = &omap3_noncore_dpll_set_rate_and_parent, 788c2ecf20Sopenharmony_ci .determine_rate = &omap3_noncore_dpll_determine_rate, 798c2ecf20Sopenharmony_ci .save_context = &omap3_noncore_dpll_save_context, 808c2ecf20Sopenharmony_ci .restore_context = &omap3_noncore_dpll_restore_context 818c2ecf20Sopenharmony_ci}; 828c2ecf20Sopenharmony_ci#else 838c2ecf20Sopenharmony_cistatic const struct clk_ops dpll_core_ck_ops = {}; 848c2ecf20Sopenharmony_cistatic const struct clk_ops dpll_ck_ops = {}; 858c2ecf20Sopenharmony_cistatic const struct clk_ops dpll_no_gate_ck_ops = {}; 868c2ecf20Sopenharmony_ciconst struct clk_hw_omap_ops clkhwops_omap3_dpll = {}; 878c2ecf20Sopenharmony_ci#endif 888c2ecf20Sopenharmony_ci 898c2ecf20Sopenharmony_ci#ifdef CONFIG_ARCH_OMAP2 908c2ecf20Sopenharmony_cistatic const struct clk_ops omap2_dpll_core_ck_ops = { 918c2ecf20Sopenharmony_ci .get_parent = &omap2_init_dpll_parent, 928c2ecf20Sopenharmony_ci .recalc_rate = &omap2_dpllcore_recalc, 938c2ecf20Sopenharmony_ci .round_rate = &omap2_dpll_round_rate, 948c2ecf20Sopenharmony_ci .set_rate = &omap2_reprogram_dpllcore, 958c2ecf20Sopenharmony_ci}; 968c2ecf20Sopenharmony_ci#else 978c2ecf20Sopenharmony_cistatic const struct clk_ops omap2_dpll_core_ck_ops = {}; 988c2ecf20Sopenharmony_ci#endif 998c2ecf20Sopenharmony_ci 1008c2ecf20Sopenharmony_ci#ifdef CONFIG_ARCH_OMAP3 1018c2ecf20Sopenharmony_cistatic const struct clk_ops omap3_dpll_core_ck_ops = { 1028c2ecf20Sopenharmony_ci .get_parent = &omap2_init_dpll_parent, 1038c2ecf20Sopenharmony_ci .recalc_rate = &omap3_dpll_recalc, 1048c2ecf20Sopenharmony_ci .round_rate = &omap2_dpll_round_rate, 1058c2ecf20Sopenharmony_ci}; 1068c2ecf20Sopenharmony_ci#else 1078c2ecf20Sopenharmony_cistatic const struct clk_ops omap3_dpll_core_ck_ops = {}; 1088c2ecf20Sopenharmony_ci#endif 1098c2ecf20Sopenharmony_ci 1108c2ecf20Sopenharmony_ci#ifdef CONFIG_ARCH_OMAP3 1118c2ecf20Sopenharmony_cistatic const struct clk_ops omap3_dpll_ck_ops = { 1128c2ecf20Sopenharmony_ci .enable = &omap3_noncore_dpll_enable, 1138c2ecf20Sopenharmony_ci .disable = &omap3_noncore_dpll_disable, 1148c2ecf20Sopenharmony_ci .get_parent = &omap2_init_dpll_parent, 1158c2ecf20Sopenharmony_ci .recalc_rate = &omap3_dpll_recalc, 1168c2ecf20Sopenharmony_ci .set_rate = &omap3_noncore_dpll_set_rate, 1178c2ecf20Sopenharmony_ci .set_parent = &omap3_noncore_dpll_set_parent, 1188c2ecf20Sopenharmony_ci .set_rate_and_parent = &omap3_noncore_dpll_set_rate_and_parent, 1198c2ecf20Sopenharmony_ci .determine_rate = &omap3_noncore_dpll_determine_rate, 1208c2ecf20Sopenharmony_ci .round_rate = &omap2_dpll_round_rate, 1218c2ecf20Sopenharmony_ci}; 1228c2ecf20Sopenharmony_ci 1238c2ecf20Sopenharmony_cistatic const struct clk_ops omap3_dpll5_ck_ops = { 1248c2ecf20Sopenharmony_ci .enable = &omap3_noncore_dpll_enable, 1258c2ecf20Sopenharmony_ci .disable = &omap3_noncore_dpll_disable, 1268c2ecf20Sopenharmony_ci .get_parent = &omap2_init_dpll_parent, 1278c2ecf20Sopenharmony_ci .recalc_rate = &omap3_dpll_recalc, 1288c2ecf20Sopenharmony_ci .set_rate = &omap3_dpll5_set_rate, 1298c2ecf20Sopenharmony_ci .set_parent = &omap3_noncore_dpll_set_parent, 1308c2ecf20Sopenharmony_ci .set_rate_and_parent = &omap3_noncore_dpll_set_rate_and_parent, 1318c2ecf20Sopenharmony_ci .determine_rate = &omap3_noncore_dpll_determine_rate, 1328c2ecf20Sopenharmony_ci .round_rate = &omap2_dpll_round_rate, 1338c2ecf20Sopenharmony_ci}; 1348c2ecf20Sopenharmony_ci 1358c2ecf20Sopenharmony_cistatic const struct clk_ops omap3_dpll_per_ck_ops = { 1368c2ecf20Sopenharmony_ci .enable = &omap3_noncore_dpll_enable, 1378c2ecf20Sopenharmony_ci .disable = &omap3_noncore_dpll_disable, 1388c2ecf20Sopenharmony_ci .get_parent = &omap2_init_dpll_parent, 1398c2ecf20Sopenharmony_ci .recalc_rate = &omap3_dpll_recalc, 1408c2ecf20Sopenharmony_ci .set_rate = &omap3_dpll4_set_rate, 1418c2ecf20Sopenharmony_ci .set_parent = &omap3_noncore_dpll_set_parent, 1428c2ecf20Sopenharmony_ci .set_rate_and_parent = &omap3_dpll4_set_rate_and_parent, 1438c2ecf20Sopenharmony_ci .determine_rate = &omap3_noncore_dpll_determine_rate, 1448c2ecf20Sopenharmony_ci .round_rate = &omap2_dpll_round_rate, 1458c2ecf20Sopenharmony_ci}; 1468c2ecf20Sopenharmony_ci#endif 1478c2ecf20Sopenharmony_ci 1488c2ecf20Sopenharmony_cistatic const struct clk_ops dpll_x2_ck_ops = { 1498c2ecf20Sopenharmony_ci .recalc_rate = &omap3_clkoutx2_recalc, 1508c2ecf20Sopenharmony_ci}; 1518c2ecf20Sopenharmony_ci 1528c2ecf20Sopenharmony_ci/** 1538c2ecf20Sopenharmony_ci * _register_dpll - low level registration of a DPLL clock 1548c2ecf20Sopenharmony_ci * @hw: hardware clock definition for the clock 1558c2ecf20Sopenharmony_ci * @node: device node for the clock 1568c2ecf20Sopenharmony_ci * 1578c2ecf20Sopenharmony_ci * Finalizes DPLL registration process. In case a failure (clk-ref or 1588c2ecf20Sopenharmony_ci * clk-bypass is missing), the clock is added to retry list and 1598c2ecf20Sopenharmony_ci * the initialization is retried on later stage. 1608c2ecf20Sopenharmony_ci */ 1618c2ecf20Sopenharmony_cistatic void __init _register_dpll(void *user, 1628c2ecf20Sopenharmony_ci struct device_node *node) 1638c2ecf20Sopenharmony_ci{ 1648c2ecf20Sopenharmony_ci struct clk_hw *hw = user; 1658c2ecf20Sopenharmony_ci struct clk_hw_omap *clk_hw = to_clk_hw_omap(hw); 1668c2ecf20Sopenharmony_ci struct dpll_data *dd = clk_hw->dpll_data; 1678c2ecf20Sopenharmony_ci const char *name; 1688c2ecf20Sopenharmony_ci struct clk *clk; 1698c2ecf20Sopenharmony_ci const struct clk_init_data *init = hw->init; 1708c2ecf20Sopenharmony_ci 1718c2ecf20Sopenharmony_ci clk = of_clk_get(node, 0); 1728c2ecf20Sopenharmony_ci if (IS_ERR(clk)) { 1738c2ecf20Sopenharmony_ci pr_debug("clk-ref missing for %pOFn, retry later\n", 1748c2ecf20Sopenharmony_ci node); 1758c2ecf20Sopenharmony_ci if (!ti_clk_retry_init(node, hw, _register_dpll)) 1768c2ecf20Sopenharmony_ci return; 1778c2ecf20Sopenharmony_ci 1788c2ecf20Sopenharmony_ci goto cleanup; 1798c2ecf20Sopenharmony_ci } 1808c2ecf20Sopenharmony_ci 1818c2ecf20Sopenharmony_ci dd->clk_ref = __clk_get_hw(clk); 1828c2ecf20Sopenharmony_ci 1838c2ecf20Sopenharmony_ci clk = of_clk_get(node, 1); 1848c2ecf20Sopenharmony_ci 1858c2ecf20Sopenharmony_ci if (IS_ERR(clk)) { 1868c2ecf20Sopenharmony_ci pr_debug("clk-bypass missing for %pOFn, retry later\n", 1878c2ecf20Sopenharmony_ci node); 1888c2ecf20Sopenharmony_ci if (!ti_clk_retry_init(node, hw, _register_dpll)) 1898c2ecf20Sopenharmony_ci return; 1908c2ecf20Sopenharmony_ci 1918c2ecf20Sopenharmony_ci goto cleanup; 1928c2ecf20Sopenharmony_ci } 1938c2ecf20Sopenharmony_ci 1948c2ecf20Sopenharmony_ci dd->clk_bypass = __clk_get_hw(clk); 1958c2ecf20Sopenharmony_ci 1968c2ecf20Sopenharmony_ci /* register the clock */ 1978c2ecf20Sopenharmony_ci name = ti_dt_clk_name(node); 1988c2ecf20Sopenharmony_ci clk = of_ti_clk_register_omap_hw(node, &clk_hw->hw, name); 1998c2ecf20Sopenharmony_ci 2008c2ecf20Sopenharmony_ci if (!IS_ERR(clk)) { 2018c2ecf20Sopenharmony_ci of_clk_add_provider(node, of_clk_src_simple_get, clk); 2028c2ecf20Sopenharmony_ci kfree(init->parent_names); 2038c2ecf20Sopenharmony_ci kfree(init); 2048c2ecf20Sopenharmony_ci return; 2058c2ecf20Sopenharmony_ci } 2068c2ecf20Sopenharmony_ci 2078c2ecf20Sopenharmony_cicleanup: 2088c2ecf20Sopenharmony_ci kfree(clk_hw->dpll_data); 2098c2ecf20Sopenharmony_ci kfree(init->parent_names); 2108c2ecf20Sopenharmony_ci kfree(init); 2118c2ecf20Sopenharmony_ci kfree(clk_hw); 2128c2ecf20Sopenharmony_ci} 2138c2ecf20Sopenharmony_ci 2148c2ecf20Sopenharmony_ci#if defined(CONFIG_ARCH_OMAP4) || defined(CONFIG_SOC_OMAP5) || \ 2158c2ecf20Sopenharmony_ci defined(CONFIG_SOC_DRA7XX) || defined(CONFIG_SOC_AM33XX) || \ 2168c2ecf20Sopenharmony_ci defined(CONFIG_SOC_AM43XX) 2178c2ecf20Sopenharmony_ci/** 2188c2ecf20Sopenharmony_ci * _register_dpll_x2 - Registers a DPLLx2 clock 2198c2ecf20Sopenharmony_ci * @node: device node for this clock 2208c2ecf20Sopenharmony_ci * @ops: clk_ops for this clock 2218c2ecf20Sopenharmony_ci * @hw_ops: clk_hw_ops for this clock 2228c2ecf20Sopenharmony_ci * 2238c2ecf20Sopenharmony_ci * Initializes a DPLL x 2 clock from device tree data. 2248c2ecf20Sopenharmony_ci */ 2258c2ecf20Sopenharmony_cistatic void _register_dpll_x2(struct device_node *node, 2268c2ecf20Sopenharmony_ci const struct clk_ops *ops, 2278c2ecf20Sopenharmony_ci const struct clk_hw_omap_ops *hw_ops) 2288c2ecf20Sopenharmony_ci{ 2298c2ecf20Sopenharmony_ci struct clk *clk; 2308c2ecf20Sopenharmony_ci struct clk_init_data init = { NULL }; 2318c2ecf20Sopenharmony_ci struct clk_hw_omap *clk_hw; 2328c2ecf20Sopenharmony_ci const char *name = ti_dt_clk_name(node); 2338c2ecf20Sopenharmony_ci const char *parent_name; 2348c2ecf20Sopenharmony_ci 2358c2ecf20Sopenharmony_ci parent_name = of_clk_get_parent_name(node, 0); 2368c2ecf20Sopenharmony_ci if (!parent_name) { 2378c2ecf20Sopenharmony_ci pr_err("%pOFn must have parent\n", node); 2388c2ecf20Sopenharmony_ci return; 2398c2ecf20Sopenharmony_ci } 2408c2ecf20Sopenharmony_ci 2418c2ecf20Sopenharmony_ci clk_hw = kzalloc(sizeof(*clk_hw), GFP_KERNEL); 2428c2ecf20Sopenharmony_ci if (!clk_hw) 2438c2ecf20Sopenharmony_ci return; 2448c2ecf20Sopenharmony_ci 2458c2ecf20Sopenharmony_ci clk_hw->ops = hw_ops; 2468c2ecf20Sopenharmony_ci clk_hw->hw.init = &init; 2478c2ecf20Sopenharmony_ci 2488c2ecf20Sopenharmony_ci init.name = name; 2498c2ecf20Sopenharmony_ci init.ops = ops; 2508c2ecf20Sopenharmony_ci init.parent_names = &parent_name; 2518c2ecf20Sopenharmony_ci init.num_parents = 1; 2528c2ecf20Sopenharmony_ci 2538c2ecf20Sopenharmony_ci#if defined(CONFIG_ARCH_OMAP4) || defined(CONFIG_SOC_OMAP5) || \ 2548c2ecf20Sopenharmony_ci defined(CONFIG_SOC_DRA7XX) 2558c2ecf20Sopenharmony_ci if (hw_ops == &clkhwops_omap4_dpllmx) { 2568c2ecf20Sopenharmony_ci int ret; 2578c2ecf20Sopenharmony_ci 2588c2ecf20Sopenharmony_ci /* Check if register defined, if not, drop hw-ops */ 2598c2ecf20Sopenharmony_ci ret = of_property_count_elems_of_size(node, "reg", 1); 2608c2ecf20Sopenharmony_ci if (ret <= 0) { 2618c2ecf20Sopenharmony_ci clk_hw->ops = NULL; 2628c2ecf20Sopenharmony_ci } else if (ti_clk_get_reg_addr(node, 0, &clk_hw->clksel_reg)) { 2638c2ecf20Sopenharmony_ci kfree(clk_hw); 2648c2ecf20Sopenharmony_ci return; 2658c2ecf20Sopenharmony_ci } 2668c2ecf20Sopenharmony_ci } 2678c2ecf20Sopenharmony_ci#endif 2688c2ecf20Sopenharmony_ci 2698c2ecf20Sopenharmony_ci /* register the clock */ 2708c2ecf20Sopenharmony_ci clk = of_ti_clk_register_omap_hw(node, &clk_hw->hw, name); 2718c2ecf20Sopenharmony_ci 2728c2ecf20Sopenharmony_ci if (IS_ERR(clk)) 2738c2ecf20Sopenharmony_ci kfree(clk_hw); 2748c2ecf20Sopenharmony_ci else 2758c2ecf20Sopenharmony_ci of_clk_add_provider(node, of_clk_src_simple_get, clk); 2768c2ecf20Sopenharmony_ci} 2778c2ecf20Sopenharmony_ci#endif 2788c2ecf20Sopenharmony_ci 2798c2ecf20Sopenharmony_ci/** 2808c2ecf20Sopenharmony_ci * of_ti_dpll_setup - Setup function for OMAP DPLL clocks 2818c2ecf20Sopenharmony_ci * @node: device node containing the DPLL info 2828c2ecf20Sopenharmony_ci * @ops: ops for the DPLL 2838c2ecf20Sopenharmony_ci * @ddt: DPLL data template to use 2848c2ecf20Sopenharmony_ci * 2858c2ecf20Sopenharmony_ci * Initializes a DPLL clock from device tree data. 2868c2ecf20Sopenharmony_ci */ 2878c2ecf20Sopenharmony_cistatic void __init of_ti_dpll_setup(struct device_node *node, 2888c2ecf20Sopenharmony_ci const struct clk_ops *ops, 2898c2ecf20Sopenharmony_ci const struct dpll_data *ddt) 2908c2ecf20Sopenharmony_ci{ 2918c2ecf20Sopenharmony_ci struct clk_hw_omap *clk_hw = NULL; 2928c2ecf20Sopenharmony_ci struct clk_init_data *init = NULL; 2938c2ecf20Sopenharmony_ci const char **parent_names = NULL; 2948c2ecf20Sopenharmony_ci struct dpll_data *dd = NULL; 2958c2ecf20Sopenharmony_ci u8 dpll_mode = 0; 2968c2ecf20Sopenharmony_ci 2978c2ecf20Sopenharmony_ci dd = kmemdup(ddt, sizeof(*dd), GFP_KERNEL); 2988c2ecf20Sopenharmony_ci clk_hw = kzalloc(sizeof(*clk_hw), GFP_KERNEL); 2998c2ecf20Sopenharmony_ci init = kzalloc(sizeof(*init), GFP_KERNEL); 3008c2ecf20Sopenharmony_ci if (!dd || !clk_hw || !init) 3018c2ecf20Sopenharmony_ci goto cleanup; 3028c2ecf20Sopenharmony_ci 3038c2ecf20Sopenharmony_ci clk_hw->dpll_data = dd; 3048c2ecf20Sopenharmony_ci clk_hw->ops = &clkhwops_omap3_dpll; 3058c2ecf20Sopenharmony_ci clk_hw->hw.init = init; 3068c2ecf20Sopenharmony_ci 3078c2ecf20Sopenharmony_ci init->name = ti_dt_clk_name(node); 3088c2ecf20Sopenharmony_ci init->ops = ops; 3098c2ecf20Sopenharmony_ci 3108c2ecf20Sopenharmony_ci init->num_parents = of_clk_get_parent_count(node); 3118c2ecf20Sopenharmony_ci if (!init->num_parents) { 3128c2ecf20Sopenharmony_ci pr_err("%pOFn must have parent(s)\n", node); 3138c2ecf20Sopenharmony_ci goto cleanup; 3148c2ecf20Sopenharmony_ci } 3158c2ecf20Sopenharmony_ci 3168c2ecf20Sopenharmony_ci parent_names = kcalloc(init->num_parents, sizeof(char *), GFP_KERNEL); 3178c2ecf20Sopenharmony_ci if (!parent_names) 3188c2ecf20Sopenharmony_ci goto cleanup; 3198c2ecf20Sopenharmony_ci 3208c2ecf20Sopenharmony_ci of_clk_parent_fill(node, parent_names, init->num_parents); 3218c2ecf20Sopenharmony_ci 3228c2ecf20Sopenharmony_ci init->parent_names = parent_names; 3238c2ecf20Sopenharmony_ci 3248c2ecf20Sopenharmony_ci if (ti_clk_get_reg_addr(node, 0, &dd->control_reg)) 3258c2ecf20Sopenharmony_ci goto cleanup; 3268c2ecf20Sopenharmony_ci 3278c2ecf20Sopenharmony_ci /* 3288c2ecf20Sopenharmony_ci * Special case for OMAP2 DPLL, register order is different due to 3298c2ecf20Sopenharmony_ci * missing idlest_reg, also clkhwops is different. Detected from 3308c2ecf20Sopenharmony_ci * missing idlest_mask. 3318c2ecf20Sopenharmony_ci */ 3328c2ecf20Sopenharmony_ci if (!dd->idlest_mask) { 3338c2ecf20Sopenharmony_ci if (ti_clk_get_reg_addr(node, 1, &dd->mult_div1_reg)) 3348c2ecf20Sopenharmony_ci goto cleanup; 3358c2ecf20Sopenharmony_ci#ifdef CONFIG_ARCH_OMAP2 3368c2ecf20Sopenharmony_ci clk_hw->ops = &clkhwops_omap2xxx_dpll; 3378c2ecf20Sopenharmony_ci omap2xxx_clkt_dpllcore_init(&clk_hw->hw); 3388c2ecf20Sopenharmony_ci#endif 3398c2ecf20Sopenharmony_ci } else { 3408c2ecf20Sopenharmony_ci if (ti_clk_get_reg_addr(node, 1, &dd->idlest_reg)) 3418c2ecf20Sopenharmony_ci goto cleanup; 3428c2ecf20Sopenharmony_ci 3438c2ecf20Sopenharmony_ci if (ti_clk_get_reg_addr(node, 2, &dd->mult_div1_reg)) 3448c2ecf20Sopenharmony_ci goto cleanup; 3458c2ecf20Sopenharmony_ci } 3468c2ecf20Sopenharmony_ci 3478c2ecf20Sopenharmony_ci if (dd->autoidle_mask) { 3488c2ecf20Sopenharmony_ci if (ti_clk_get_reg_addr(node, 3, &dd->autoidle_reg)) 3498c2ecf20Sopenharmony_ci goto cleanup; 3508c2ecf20Sopenharmony_ci } 3518c2ecf20Sopenharmony_ci 3528c2ecf20Sopenharmony_ci if (of_property_read_bool(node, "ti,low-power-stop")) 3538c2ecf20Sopenharmony_ci dpll_mode |= 1 << DPLL_LOW_POWER_STOP; 3548c2ecf20Sopenharmony_ci 3558c2ecf20Sopenharmony_ci if (of_property_read_bool(node, "ti,low-power-bypass")) 3568c2ecf20Sopenharmony_ci dpll_mode |= 1 << DPLL_LOW_POWER_BYPASS; 3578c2ecf20Sopenharmony_ci 3588c2ecf20Sopenharmony_ci if (of_property_read_bool(node, "ti,lock")) 3598c2ecf20Sopenharmony_ci dpll_mode |= 1 << DPLL_LOCKED; 3608c2ecf20Sopenharmony_ci 3618c2ecf20Sopenharmony_ci if (dpll_mode) 3628c2ecf20Sopenharmony_ci dd->modes = dpll_mode; 3638c2ecf20Sopenharmony_ci 3648c2ecf20Sopenharmony_ci _register_dpll(&clk_hw->hw, node); 3658c2ecf20Sopenharmony_ci return; 3668c2ecf20Sopenharmony_ci 3678c2ecf20Sopenharmony_cicleanup: 3688c2ecf20Sopenharmony_ci kfree(dd); 3698c2ecf20Sopenharmony_ci kfree(parent_names); 3708c2ecf20Sopenharmony_ci kfree(init); 3718c2ecf20Sopenharmony_ci kfree(clk_hw); 3728c2ecf20Sopenharmony_ci} 3738c2ecf20Sopenharmony_ci 3748c2ecf20Sopenharmony_ci#if defined(CONFIG_ARCH_OMAP4) || defined(CONFIG_SOC_OMAP5) || \ 3758c2ecf20Sopenharmony_ci defined(CONFIG_SOC_DRA7XX) 3768c2ecf20Sopenharmony_cistatic void __init of_ti_omap4_dpll_x2_setup(struct device_node *node) 3778c2ecf20Sopenharmony_ci{ 3788c2ecf20Sopenharmony_ci _register_dpll_x2(node, &dpll_x2_ck_ops, &clkhwops_omap4_dpllmx); 3798c2ecf20Sopenharmony_ci} 3808c2ecf20Sopenharmony_ciCLK_OF_DECLARE(ti_omap4_dpll_x2_clock, "ti,omap4-dpll-x2-clock", 3818c2ecf20Sopenharmony_ci of_ti_omap4_dpll_x2_setup); 3828c2ecf20Sopenharmony_ci#endif 3838c2ecf20Sopenharmony_ci 3848c2ecf20Sopenharmony_ci#if defined(CONFIG_SOC_AM33XX) || defined(CONFIG_SOC_AM43XX) 3858c2ecf20Sopenharmony_cistatic void __init of_ti_am3_dpll_x2_setup(struct device_node *node) 3868c2ecf20Sopenharmony_ci{ 3878c2ecf20Sopenharmony_ci _register_dpll_x2(node, &dpll_x2_ck_ops, NULL); 3888c2ecf20Sopenharmony_ci} 3898c2ecf20Sopenharmony_ciCLK_OF_DECLARE(ti_am3_dpll_x2_clock, "ti,am3-dpll-x2-clock", 3908c2ecf20Sopenharmony_ci of_ti_am3_dpll_x2_setup); 3918c2ecf20Sopenharmony_ci#endif 3928c2ecf20Sopenharmony_ci 3938c2ecf20Sopenharmony_ci#ifdef CONFIG_ARCH_OMAP3 3948c2ecf20Sopenharmony_cistatic void __init of_ti_omap3_dpll_setup(struct device_node *node) 3958c2ecf20Sopenharmony_ci{ 3968c2ecf20Sopenharmony_ci const struct dpll_data dd = { 3978c2ecf20Sopenharmony_ci .idlest_mask = 0x1, 3988c2ecf20Sopenharmony_ci .enable_mask = 0x7, 3998c2ecf20Sopenharmony_ci .autoidle_mask = 0x7, 4008c2ecf20Sopenharmony_ci .mult_mask = 0x7ff << 8, 4018c2ecf20Sopenharmony_ci .div1_mask = 0x7f, 4028c2ecf20Sopenharmony_ci .max_multiplier = 2047, 4038c2ecf20Sopenharmony_ci .max_divider = 128, 4048c2ecf20Sopenharmony_ci .min_divider = 1, 4058c2ecf20Sopenharmony_ci .freqsel_mask = 0xf0, 4068c2ecf20Sopenharmony_ci .modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED), 4078c2ecf20Sopenharmony_ci }; 4088c2ecf20Sopenharmony_ci 4098c2ecf20Sopenharmony_ci if ((of_machine_is_compatible("ti,omap3630") || 4108c2ecf20Sopenharmony_ci of_machine_is_compatible("ti,omap36xx")) && 4118c2ecf20Sopenharmony_ci of_node_name_eq(node, "dpll5_ck")) 4128c2ecf20Sopenharmony_ci of_ti_dpll_setup(node, &omap3_dpll5_ck_ops, &dd); 4138c2ecf20Sopenharmony_ci else 4148c2ecf20Sopenharmony_ci of_ti_dpll_setup(node, &omap3_dpll_ck_ops, &dd); 4158c2ecf20Sopenharmony_ci} 4168c2ecf20Sopenharmony_ciCLK_OF_DECLARE(ti_omap3_dpll_clock, "ti,omap3-dpll-clock", 4178c2ecf20Sopenharmony_ci of_ti_omap3_dpll_setup); 4188c2ecf20Sopenharmony_ci 4198c2ecf20Sopenharmony_cistatic void __init of_ti_omap3_core_dpll_setup(struct device_node *node) 4208c2ecf20Sopenharmony_ci{ 4218c2ecf20Sopenharmony_ci const struct dpll_data dd = { 4228c2ecf20Sopenharmony_ci .idlest_mask = 0x1, 4238c2ecf20Sopenharmony_ci .enable_mask = 0x7, 4248c2ecf20Sopenharmony_ci .autoidle_mask = 0x7, 4258c2ecf20Sopenharmony_ci .mult_mask = 0x7ff << 16, 4268c2ecf20Sopenharmony_ci .div1_mask = 0x7f << 8, 4278c2ecf20Sopenharmony_ci .max_multiplier = 2047, 4288c2ecf20Sopenharmony_ci .max_divider = 128, 4298c2ecf20Sopenharmony_ci .min_divider = 1, 4308c2ecf20Sopenharmony_ci .freqsel_mask = 0xf0, 4318c2ecf20Sopenharmony_ci }; 4328c2ecf20Sopenharmony_ci 4338c2ecf20Sopenharmony_ci of_ti_dpll_setup(node, &omap3_dpll_core_ck_ops, &dd); 4348c2ecf20Sopenharmony_ci} 4358c2ecf20Sopenharmony_ciCLK_OF_DECLARE(ti_omap3_core_dpll_clock, "ti,omap3-dpll-core-clock", 4368c2ecf20Sopenharmony_ci of_ti_omap3_core_dpll_setup); 4378c2ecf20Sopenharmony_ci 4388c2ecf20Sopenharmony_cistatic void __init of_ti_omap3_per_dpll_setup(struct device_node *node) 4398c2ecf20Sopenharmony_ci{ 4408c2ecf20Sopenharmony_ci const struct dpll_data dd = { 4418c2ecf20Sopenharmony_ci .idlest_mask = 0x1 << 1, 4428c2ecf20Sopenharmony_ci .enable_mask = 0x7 << 16, 4438c2ecf20Sopenharmony_ci .autoidle_mask = 0x7 << 3, 4448c2ecf20Sopenharmony_ci .mult_mask = 0x7ff << 8, 4458c2ecf20Sopenharmony_ci .div1_mask = 0x7f, 4468c2ecf20Sopenharmony_ci .max_multiplier = 2047, 4478c2ecf20Sopenharmony_ci .max_divider = 128, 4488c2ecf20Sopenharmony_ci .min_divider = 1, 4498c2ecf20Sopenharmony_ci .freqsel_mask = 0xf00000, 4508c2ecf20Sopenharmony_ci .modes = (1 << DPLL_LOW_POWER_STOP) | (1 << DPLL_LOCKED), 4518c2ecf20Sopenharmony_ci }; 4528c2ecf20Sopenharmony_ci 4538c2ecf20Sopenharmony_ci of_ti_dpll_setup(node, &omap3_dpll_per_ck_ops, &dd); 4548c2ecf20Sopenharmony_ci} 4558c2ecf20Sopenharmony_ciCLK_OF_DECLARE(ti_omap3_per_dpll_clock, "ti,omap3-dpll-per-clock", 4568c2ecf20Sopenharmony_ci of_ti_omap3_per_dpll_setup); 4578c2ecf20Sopenharmony_ci 4588c2ecf20Sopenharmony_cistatic void __init of_ti_omap3_per_jtype_dpll_setup(struct device_node *node) 4598c2ecf20Sopenharmony_ci{ 4608c2ecf20Sopenharmony_ci const struct dpll_data dd = { 4618c2ecf20Sopenharmony_ci .idlest_mask = 0x1 << 1, 4628c2ecf20Sopenharmony_ci .enable_mask = 0x7 << 16, 4638c2ecf20Sopenharmony_ci .autoidle_mask = 0x7 << 3, 4648c2ecf20Sopenharmony_ci .mult_mask = 0xfff << 8, 4658c2ecf20Sopenharmony_ci .div1_mask = 0x7f, 4668c2ecf20Sopenharmony_ci .max_multiplier = 4095, 4678c2ecf20Sopenharmony_ci .max_divider = 128, 4688c2ecf20Sopenharmony_ci .min_divider = 1, 4698c2ecf20Sopenharmony_ci .sddiv_mask = 0xff << 24, 4708c2ecf20Sopenharmony_ci .dco_mask = 0xe << 20, 4718c2ecf20Sopenharmony_ci .flags = DPLL_J_TYPE, 4728c2ecf20Sopenharmony_ci .modes = (1 << DPLL_LOW_POWER_STOP) | (1 << DPLL_LOCKED), 4738c2ecf20Sopenharmony_ci }; 4748c2ecf20Sopenharmony_ci 4758c2ecf20Sopenharmony_ci of_ti_dpll_setup(node, &omap3_dpll_per_ck_ops, &dd); 4768c2ecf20Sopenharmony_ci} 4778c2ecf20Sopenharmony_ciCLK_OF_DECLARE(ti_omap3_per_jtype_dpll_clock, "ti,omap3-dpll-per-j-type-clock", 4788c2ecf20Sopenharmony_ci of_ti_omap3_per_jtype_dpll_setup); 4798c2ecf20Sopenharmony_ci#endif 4808c2ecf20Sopenharmony_ci 4818c2ecf20Sopenharmony_cistatic void __init of_ti_omap4_dpll_setup(struct device_node *node) 4828c2ecf20Sopenharmony_ci{ 4838c2ecf20Sopenharmony_ci const struct dpll_data dd = { 4848c2ecf20Sopenharmony_ci .idlest_mask = 0x1, 4858c2ecf20Sopenharmony_ci .enable_mask = 0x7, 4868c2ecf20Sopenharmony_ci .autoidle_mask = 0x7, 4878c2ecf20Sopenharmony_ci .mult_mask = 0x7ff << 8, 4888c2ecf20Sopenharmony_ci .div1_mask = 0x7f, 4898c2ecf20Sopenharmony_ci .max_multiplier = 2047, 4908c2ecf20Sopenharmony_ci .max_divider = 128, 4918c2ecf20Sopenharmony_ci .min_divider = 1, 4928c2ecf20Sopenharmony_ci .modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED), 4938c2ecf20Sopenharmony_ci }; 4948c2ecf20Sopenharmony_ci 4958c2ecf20Sopenharmony_ci of_ti_dpll_setup(node, &dpll_ck_ops, &dd); 4968c2ecf20Sopenharmony_ci} 4978c2ecf20Sopenharmony_ciCLK_OF_DECLARE(ti_omap4_dpll_clock, "ti,omap4-dpll-clock", 4988c2ecf20Sopenharmony_ci of_ti_omap4_dpll_setup); 4998c2ecf20Sopenharmony_ci 5008c2ecf20Sopenharmony_cistatic void __init of_ti_omap5_mpu_dpll_setup(struct device_node *node) 5018c2ecf20Sopenharmony_ci{ 5028c2ecf20Sopenharmony_ci const struct dpll_data dd = { 5038c2ecf20Sopenharmony_ci .idlest_mask = 0x1, 5048c2ecf20Sopenharmony_ci .enable_mask = 0x7, 5058c2ecf20Sopenharmony_ci .autoidle_mask = 0x7, 5068c2ecf20Sopenharmony_ci .mult_mask = 0x7ff << 8, 5078c2ecf20Sopenharmony_ci .div1_mask = 0x7f, 5088c2ecf20Sopenharmony_ci .max_multiplier = 2047, 5098c2ecf20Sopenharmony_ci .max_divider = 128, 5108c2ecf20Sopenharmony_ci .dcc_mask = BIT(22), 5118c2ecf20Sopenharmony_ci .dcc_rate = 1400000000, /* DCC beyond 1.4GHz */ 5128c2ecf20Sopenharmony_ci .min_divider = 1, 5138c2ecf20Sopenharmony_ci .modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED), 5148c2ecf20Sopenharmony_ci }; 5158c2ecf20Sopenharmony_ci 5168c2ecf20Sopenharmony_ci of_ti_dpll_setup(node, &dpll_ck_ops, &dd); 5178c2ecf20Sopenharmony_ci} 5188c2ecf20Sopenharmony_ciCLK_OF_DECLARE(of_ti_omap5_mpu_dpll_clock, "ti,omap5-mpu-dpll-clock", 5198c2ecf20Sopenharmony_ci of_ti_omap5_mpu_dpll_setup); 5208c2ecf20Sopenharmony_ci 5218c2ecf20Sopenharmony_cistatic void __init of_ti_omap4_core_dpll_setup(struct device_node *node) 5228c2ecf20Sopenharmony_ci{ 5238c2ecf20Sopenharmony_ci const struct dpll_data dd = { 5248c2ecf20Sopenharmony_ci .idlest_mask = 0x1, 5258c2ecf20Sopenharmony_ci .enable_mask = 0x7, 5268c2ecf20Sopenharmony_ci .autoidle_mask = 0x7, 5278c2ecf20Sopenharmony_ci .mult_mask = 0x7ff << 8, 5288c2ecf20Sopenharmony_ci .div1_mask = 0x7f, 5298c2ecf20Sopenharmony_ci .max_multiplier = 2047, 5308c2ecf20Sopenharmony_ci .max_divider = 128, 5318c2ecf20Sopenharmony_ci .min_divider = 1, 5328c2ecf20Sopenharmony_ci .modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED), 5338c2ecf20Sopenharmony_ci }; 5348c2ecf20Sopenharmony_ci 5358c2ecf20Sopenharmony_ci of_ti_dpll_setup(node, &dpll_core_ck_ops, &dd); 5368c2ecf20Sopenharmony_ci} 5378c2ecf20Sopenharmony_ciCLK_OF_DECLARE(ti_omap4_core_dpll_clock, "ti,omap4-dpll-core-clock", 5388c2ecf20Sopenharmony_ci of_ti_omap4_core_dpll_setup); 5398c2ecf20Sopenharmony_ci 5408c2ecf20Sopenharmony_ci#if defined(CONFIG_ARCH_OMAP4) || defined(CONFIG_SOC_OMAP5) || \ 5418c2ecf20Sopenharmony_ci defined(CONFIG_SOC_DRA7XX) 5428c2ecf20Sopenharmony_cistatic void __init of_ti_omap4_m4xen_dpll_setup(struct device_node *node) 5438c2ecf20Sopenharmony_ci{ 5448c2ecf20Sopenharmony_ci const struct dpll_data dd = { 5458c2ecf20Sopenharmony_ci .idlest_mask = 0x1, 5468c2ecf20Sopenharmony_ci .enable_mask = 0x7, 5478c2ecf20Sopenharmony_ci .autoidle_mask = 0x7, 5488c2ecf20Sopenharmony_ci .mult_mask = 0x7ff << 8, 5498c2ecf20Sopenharmony_ci .div1_mask = 0x7f, 5508c2ecf20Sopenharmony_ci .max_multiplier = 2047, 5518c2ecf20Sopenharmony_ci .max_divider = 128, 5528c2ecf20Sopenharmony_ci .min_divider = 1, 5538c2ecf20Sopenharmony_ci .m4xen_mask = 0x800, 5548c2ecf20Sopenharmony_ci .lpmode_mask = 1 << 10, 5558c2ecf20Sopenharmony_ci .modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED), 5568c2ecf20Sopenharmony_ci }; 5578c2ecf20Sopenharmony_ci 5588c2ecf20Sopenharmony_ci of_ti_dpll_setup(node, &dpll_m4xen_ck_ops, &dd); 5598c2ecf20Sopenharmony_ci} 5608c2ecf20Sopenharmony_ciCLK_OF_DECLARE(ti_omap4_m4xen_dpll_clock, "ti,omap4-dpll-m4xen-clock", 5618c2ecf20Sopenharmony_ci of_ti_omap4_m4xen_dpll_setup); 5628c2ecf20Sopenharmony_ci 5638c2ecf20Sopenharmony_cistatic void __init of_ti_omap4_jtype_dpll_setup(struct device_node *node) 5648c2ecf20Sopenharmony_ci{ 5658c2ecf20Sopenharmony_ci const struct dpll_data dd = { 5668c2ecf20Sopenharmony_ci .idlest_mask = 0x1, 5678c2ecf20Sopenharmony_ci .enable_mask = 0x7, 5688c2ecf20Sopenharmony_ci .autoidle_mask = 0x7, 5698c2ecf20Sopenharmony_ci .mult_mask = 0xfff << 8, 5708c2ecf20Sopenharmony_ci .div1_mask = 0xff, 5718c2ecf20Sopenharmony_ci .max_multiplier = 4095, 5728c2ecf20Sopenharmony_ci .max_divider = 256, 5738c2ecf20Sopenharmony_ci .min_divider = 1, 5748c2ecf20Sopenharmony_ci .sddiv_mask = 0xff << 24, 5758c2ecf20Sopenharmony_ci .flags = DPLL_J_TYPE, 5768c2ecf20Sopenharmony_ci .modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED), 5778c2ecf20Sopenharmony_ci }; 5788c2ecf20Sopenharmony_ci 5798c2ecf20Sopenharmony_ci of_ti_dpll_setup(node, &dpll_m4xen_ck_ops, &dd); 5808c2ecf20Sopenharmony_ci} 5818c2ecf20Sopenharmony_ciCLK_OF_DECLARE(ti_omap4_jtype_dpll_clock, "ti,omap4-dpll-j-type-clock", 5828c2ecf20Sopenharmony_ci of_ti_omap4_jtype_dpll_setup); 5838c2ecf20Sopenharmony_ci#endif 5848c2ecf20Sopenharmony_ci 5858c2ecf20Sopenharmony_cistatic void __init of_ti_am3_no_gate_dpll_setup(struct device_node *node) 5868c2ecf20Sopenharmony_ci{ 5878c2ecf20Sopenharmony_ci const struct dpll_data dd = { 5888c2ecf20Sopenharmony_ci .idlest_mask = 0x1, 5898c2ecf20Sopenharmony_ci .enable_mask = 0x7, 5908c2ecf20Sopenharmony_ci .mult_mask = 0x7ff << 8, 5918c2ecf20Sopenharmony_ci .div1_mask = 0x7f, 5928c2ecf20Sopenharmony_ci .max_multiplier = 2047, 5938c2ecf20Sopenharmony_ci .max_divider = 128, 5948c2ecf20Sopenharmony_ci .min_divider = 1, 5958c2ecf20Sopenharmony_ci .max_rate = 1000000000, 5968c2ecf20Sopenharmony_ci .modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED), 5978c2ecf20Sopenharmony_ci }; 5988c2ecf20Sopenharmony_ci 5998c2ecf20Sopenharmony_ci of_ti_dpll_setup(node, &dpll_no_gate_ck_ops, &dd); 6008c2ecf20Sopenharmony_ci} 6018c2ecf20Sopenharmony_ciCLK_OF_DECLARE(ti_am3_no_gate_dpll_clock, "ti,am3-dpll-no-gate-clock", 6028c2ecf20Sopenharmony_ci of_ti_am3_no_gate_dpll_setup); 6038c2ecf20Sopenharmony_ci 6048c2ecf20Sopenharmony_cistatic void __init of_ti_am3_jtype_dpll_setup(struct device_node *node) 6058c2ecf20Sopenharmony_ci{ 6068c2ecf20Sopenharmony_ci const struct dpll_data dd = { 6078c2ecf20Sopenharmony_ci .idlest_mask = 0x1, 6088c2ecf20Sopenharmony_ci .enable_mask = 0x7, 6098c2ecf20Sopenharmony_ci .mult_mask = 0x7ff << 8, 6108c2ecf20Sopenharmony_ci .div1_mask = 0x7f, 6118c2ecf20Sopenharmony_ci .max_multiplier = 4095, 6128c2ecf20Sopenharmony_ci .max_divider = 256, 6138c2ecf20Sopenharmony_ci .min_divider = 2, 6148c2ecf20Sopenharmony_ci .flags = DPLL_J_TYPE, 6158c2ecf20Sopenharmony_ci .max_rate = 2000000000, 6168c2ecf20Sopenharmony_ci .modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED), 6178c2ecf20Sopenharmony_ci }; 6188c2ecf20Sopenharmony_ci 6198c2ecf20Sopenharmony_ci of_ti_dpll_setup(node, &dpll_ck_ops, &dd); 6208c2ecf20Sopenharmony_ci} 6218c2ecf20Sopenharmony_ciCLK_OF_DECLARE(ti_am3_jtype_dpll_clock, "ti,am3-dpll-j-type-clock", 6228c2ecf20Sopenharmony_ci of_ti_am3_jtype_dpll_setup); 6238c2ecf20Sopenharmony_ci 6248c2ecf20Sopenharmony_cistatic void __init of_ti_am3_no_gate_jtype_dpll_setup(struct device_node *node) 6258c2ecf20Sopenharmony_ci{ 6268c2ecf20Sopenharmony_ci const struct dpll_data dd = { 6278c2ecf20Sopenharmony_ci .idlest_mask = 0x1, 6288c2ecf20Sopenharmony_ci .enable_mask = 0x7, 6298c2ecf20Sopenharmony_ci .mult_mask = 0x7ff << 8, 6308c2ecf20Sopenharmony_ci .div1_mask = 0x7f, 6318c2ecf20Sopenharmony_ci .max_multiplier = 2047, 6328c2ecf20Sopenharmony_ci .max_divider = 128, 6338c2ecf20Sopenharmony_ci .min_divider = 1, 6348c2ecf20Sopenharmony_ci .max_rate = 2000000000, 6358c2ecf20Sopenharmony_ci .flags = DPLL_J_TYPE, 6368c2ecf20Sopenharmony_ci .modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED), 6378c2ecf20Sopenharmony_ci }; 6388c2ecf20Sopenharmony_ci 6398c2ecf20Sopenharmony_ci of_ti_dpll_setup(node, &dpll_no_gate_ck_ops, &dd); 6408c2ecf20Sopenharmony_ci} 6418c2ecf20Sopenharmony_ciCLK_OF_DECLARE(ti_am3_no_gate_jtype_dpll_clock, 6428c2ecf20Sopenharmony_ci "ti,am3-dpll-no-gate-j-type-clock", 6438c2ecf20Sopenharmony_ci of_ti_am3_no_gate_jtype_dpll_setup); 6448c2ecf20Sopenharmony_ci 6458c2ecf20Sopenharmony_cistatic void __init of_ti_am3_dpll_setup(struct device_node *node) 6468c2ecf20Sopenharmony_ci{ 6478c2ecf20Sopenharmony_ci const struct dpll_data dd = { 6488c2ecf20Sopenharmony_ci .idlest_mask = 0x1, 6498c2ecf20Sopenharmony_ci .enable_mask = 0x7, 6508c2ecf20Sopenharmony_ci .mult_mask = 0x7ff << 8, 6518c2ecf20Sopenharmony_ci .div1_mask = 0x7f, 6528c2ecf20Sopenharmony_ci .max_multiplier = 2047, 6538c2ecf20Sopenharmony_ci .max_divider = 128, 6548c2ecf20Sopenharmony_ci .min_divider = 1, 6558c2ecf20Sopenharmony_ci .max_rate = 1000000000, 6568c2ecf20Sopenharmony_ci .modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED), 6578c2ecf20Sopenharmony_ci }; 6588c2ecf20Sopenharmony_ci 6598c2ecf20Sopenharmony_ci of_ti_dpll_setup(node, &dpll_ck_ops, &dd); 6608c2ecf20Sopenharmony_ci} 6618c2ecf20Sopenharmony_ciCLK_OF_DECLARE(ti_am3_dpll_clock, "ti,am3-dpll-clock", of_ti_am3_dpll_setup); 6628c2ecf20Sopenharmony_ci 6638c2ecf20Sopenharmony_cistatic void __init of_ti_am3_core_dpll_setup(struct device_node *node) 6648c2ecf20Sopenharmony_ci{ 6658c2ecf20Sopenharmony_ci const struct dpll_data dd = { 6668c2ecf20Sopenharmony_ci .idlest_mask = 0x1, 6678c2ecf20Sopenharmony_ci .enable_mask = 0x7, 6688c2ecf20Sopenharmony_ci .mult_mask = 0x7ff << 8, 6698c2ecf20Sopenharmony_ci .div1_mask = 0x7f, 6708c2ecf20Sopenharmony_ci .max_multiplier = 2047, 6718c2ecf20Sopenharmony_ci .max_divider = 128, 6728c2ecf20Sopenharmony_ci .min_divider = 1, 6738c2ecf20Sopenharmony_ci .max_rate = 1000000000, 6748c2ecf20Sopenharmony_ci .modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED), 6758c2ecf20Sopenharmony_ci }; 6768c2ecf20Sopenharmony_ci 6778c2ecf20Sopenharmony_ci of_ti_dpll_setup(node, &dpll_core_ck_ops, &dd); 6788c2ecf20Sopenharmony_ci} 6798c2ecf20Sopenharmony_ciCLK_OF_DECLARE(ti_am3_core_dpll_clock, "ti,am3-dpll-core-clock", 6808c2ecf20Sopenharmony_ci of_ti_am3_core_dpll_setup); 6818c2ecf20Sopenharmony_ci 6828c2ecf20Sopenharmony_cistatic void __init of_ti_omap2_core_dpll_setup(struct device_node *node) 6838c2ecf20Sopenharmony_ci{ 6848c2ecf20Sopenharmony_ci const struct dpll_data dd = { 6858c2ecf20Sopenharmony_ci .enable_mask = 0x3, 6868c2ecf20Sopenharmony_ci .mult_mask = 0x3ff << 12, 6878c2ecf20Sopenharmony_ci .div1_mask = 0xf << 8, 6888c2ecf20Sopenharmony_ci .max_divider = 16, 6898c2ecf20Sopenharmony_ci .min_divider = 1, 6908c2ecf20Sopenharmony_ci }; 6918c2ecf20Sopenharmony_ci 6928c2ecf20Sopenharmony_ci of_ti_dpll_setup(node, &omap2_dpll_core_ck_ops, &dd); 6938c2ecf20Sopenharmony_ci} 6948c2ecf20Sopenharmony_ciCLK_OF_DECLARE(ti_omap2_core_dpll_clock, "ti,omap2-dpll-core-clock", 6958c2ecf20Sopenharmony_ci of_ti_omap2_core_dpll_setup); 696