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