162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * TI Fixed Factor Clock 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2013 Texas Instruments, Inc. 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * Tero Kristo <t-kristo@ti.com> 862306a36Sopenharmony_ci */ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include <linux/clk-provider.h> 1162306a36Sopenharmony_ci#include <linux/slab.h> 1262306a36Sopenharmony_ci#include <linux/err.h> 1362306a36Sopenharmony_ci#include <linux/of.h> 1462306a36Sopenharmony_ci#include <linux/of_address.h> 1562306a36Sopenharmony_ci#include <linux/clk/ti.h> 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci#include "clock.h" 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci#undef pr_fmt 2062306a36Sopenharmony_ci#define pr_fmt(fmt) "%s: " fmt, __func__ 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci/** 2362306a36Sopenharmony_ci * of_ti_fixed_factor_clk_setup - Setup function for TI fixed factor clock 2462306a36Sopenharmony_ci * @node: device node for this clock 2562306a36Sopenharmony_ci * 2662306a36Sopenharmony_ci * Sets up a simple fixed factor clock based on device tree info. 2762306a36Sopenharmony_ci */ 2862306a36Sopenharmony_cistatic void __init of_ti_fixed_factor_clk_setup(struct device_node *node) 2962306a36Sopenharmony_ci{ 3062306a36Sopenharmony_ci struct clk *clk; 3162306a36Sopenharmony_ci const char *clk_name = ti_dt_clk_name(node); 3262306a36Sopenharmony_ci const char *parent_name; 3362306a36Sopenharmony_ci u32 div, mult; 3462306a36Sopenharmony_ci u32 flags = 0; 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci if (of_property_read_u32(node, "ti,clock-div", &div)) { 3762306a36Sopenharmony_ci pr_err("%pOFn must have a clock-div property\n", node); 3862306a36Sopenharmony_ci return; 3962306a36Sopenharmony_ci } 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci if (of_property_read_u32(node, "ti,clock-mult", &mult)) { 4262306a36Sopenharmony_ci pr_err("%pOFn must have a clock-mult property\n", node); 4362306a36Sopenharmony_ci return; 4462306a36Sopenharmony_ci } 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci if (of_property_read_bool(node, "ti,set-rate-parent")) 4762306a36Sopenharmony_ci flags |= CLK_SET_RATE_PARENT; 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci parent_name = of_clk_get_parent_name(node, 0); 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci clk = clk_register_fixed_factor(NULL, clk_name, parent_name, flags, 5262306a36Sopenharmony_ci mult, div); 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci if (!IS_ERR(clk)) { 5562306a36Sopenharmony_ci of_clk_add_provider(node, of_clk_src_simple_get, clk); 5662306a36Sopenharmony_ci of_ti_clk_autoidle_setup(node); 5762306a36Sopenharmony_ci ti_clk_add_alias(clk, clk_name); 5862306a36Sopenharmony_ci } 5962306a36Sopenharmony_ci} 6062306a36Sopenharmony_ciCLK_OF_DECLARE(ti_fixed_factor_clk, "ti,fixed-factor-clock", 6162306a36Sopenharmony_ci of_ti_fixed_factor_clk_setup); 62