18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * r8a7790 Common Clock Framework support 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (C) 2013 Renesas Solutions Corp. 68c2ecf20Sopenharmony_ci * 78c2ecf20Sopenharmony_ci * Contact: Laurent Pinchart <laurent.pinchart@ideasonboard.com> 88c2ecf20Sopenharmony_ci */ 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci#include <linux/clk-provider.h> 118c2ecf20Sopenharmony_ci#include <linux/init.h> 128c2ecf20Sopenharmony_ci#include <linux/io.h> 138c2ecf20Sopenharmony_ci#include <linux/kernel.h> 148c2ecf20Sopenharmony_ci#include <linux/notifier.h> 158c2ecf20Sopenharmony_ci#include <linux/of.h> 168c2ecf20Sopenharmony_ci#include <linux/of_address.h> 178c2ecf20Sopenharmony_ci#include <linux/pm.h> 188c2ecf20Sopenharmony_ci#include <linux/slab.h> 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_ci#include "clk-div6.h" 218c2ecf20Sopenharmony_ci 228c2ecf20Sopenharmony_ci#define CPG_DIV6_CKSTP BIT(8) 238c2ecf20Sopenharmony_ci#define CPG_DIV6_DIV(d) ((d) & 0x3f) 248c2ecf20Sopenharmony_ci#define CPG_DIV6_DIV_MASK 0x3f 258c2ecf20Sopenharmony_ci 268c2ecf20Sopenharmony_ci/** 278c2ecf20Sopenharmony_ci * struct div6_clock - CPG 6 bit divider clock 288c2ecf20Sopenharmony_ci * @hw: handle between common and hardware-specific interfaces 298c2ecf20Sopenharmony_ci * @reg: IO-remapped register 308c2ecf20Sopenharmony_ci * @div: divisor value (1-64) 318c2ecf20Sopenharmony_ci * @src_shift: Shift to access the register bits to select the parent clock 328c2ecf20Sopenharmony_ci * @src_width: Number of register bits to select the parent clock (may be 0) 338c2ecf20Sopenharmony_ci * @nb: Notifier block to save/restore clock state for system resume 348c2ecf20Sopenharmony_ci * @parents: Array to map from valid parent clocks indices to hardware indices 358c2ecf20Sopenharmony_ci */ 368c2ecf20Sopenharmony_cistruct div6_clock { 378c2ecf20Sopenharmony_ci struct clk_hw hw; 388c2ecf20Sopenharmony_ci void __iomem *reg; 398c2ecf20Sopenharmony_ci unsigned int div; 408c2ecf20Sopenharmony_ci u32 src_shift; 418c2ecf20Sopenharmony_ci u32 src_width; 428c2ecf20Sopenharmony_ci struct notifier_block nb; 438c2ecf20Sopenharmony_ci u8 parents[]; 448c2ecf20Sopenharmony_ci}; 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_ci#define to_div6_clock(_hw) container_of(_hw, struct div6_clock, hw) 478c2ecf20Sopenharmony_ci 488c2ecf20Sopenharmony_cistatic int cpg_div6_clock_enable(struct clk_hw *hw) 498c2ecf20Sopenharmony_ci{ 508c2ecf20Sopenharmony_ci struct div6_clock *clock = to_div6_clock(hw); 518c2ecf20Sopenharmony_ci u32 val; 528c2ecf20Sopenharmony_ci 538c2ecf20Sopenharmony_ci val = (readl(clock->reg) & ~(CPG_DIV6_DIV_MASK | CPG_DIV6_CKSTP)) 548c2ecf20Sopenharmony_ci | CPG_DIV6_DIV(clock->div - 1); 558c2ecf20Sopenharmony_ci writel(val, clock->reg); 568c2ecf20Sopenharmony_ci 578c2ecf20Sopenharmony_ci return 0; 588c2ecf20Sopenharmony_ci} 598c2ecf20Sopenharmony_ci 608c2ecf20Sopenharmony_cistatic void cpg_div6_clock_disable(struct clk_hw *hw) 618c2ecf20Sopenharmony_ci{ 628c2ecf20Sopenharmony_ci struct div6_clock *clock = to_div6_clock(hw); 638c2ecf20Sopenharmony_ci u32 val; 648c2ecf20Sopenharmony_ci 658c2ecf20Sopenharmony_ci val = readl(clock->reg); 668c2ecf20Sopenharmony_ci val |= CPG_DIV6_CKSTP; 678c2ecf20Sopenharmony_ci /* 688c2ecf20Sopenharmony_ci * DIV6 clocks require the divisor field to be non-zero when stopping 698c2ecf20Sopenharmony_ci * the clock. However, some clocks (e.g. ZB on sh73a0) fail to be 708c2ecf20Sopenharmony_ci * re-enabled later if the divisor field is changed when stopping the 718c2ecf20Sopenharmony_ci * clock 728c2ecf20Sopenharmony_ci */ 738c2ecf20Sopenharmony_ci if (!(val & CPG_DIV6_DIV_MASK)) 748c2ecf20Sopenharmony_ci val |= CPG_DIV6_DIV_MASK; 758c2ecf20Sopenharmony_ci writel(val, clock->reg); 768c2ecf20Sopenharmony_ci} 778c2ecf20Sopenharmony_ci 788c2ecf20Sopenharmony_cistatic int cpg_div6_clock_is_enabled(struct clk_hw *hw) 798c2ecf20Sopenharmony_ci{ 808c2ecf20Sopenharmony_ci struct div6_clock *clock = to_div6_clock(hw); 818c2ecf20Sopenharmony_ci 828c2ecf20Sopenharmony_ci return !(readl(clock->reg) & CPG_DIV6_CKSTP); 838c2ecf20Sopenharmony_ci} 848c2ecf20Sopenharmony_ci 858c2ecf20Sopenharmony_cistatic unsigned long cpg_div6_clock_recalc_rate(struct clk_hw *hw, 868c2ecf20Sopenharmony_ci unsigned long parent_rate) 878c2ecf20Sopenharmony_ci{ 888c2ecf20Sopenharmony_ci struct div6_clock *clock = to_div6_clock(hw); 898c2ecf20Sopenharmony_ci 908c2ecf20Sopenharmony_ci return parent_rate / clock->div; 918c2ecf20Sopenharmony_ci} 928c2ecf20Sopenharmony_ci 938c2ecf20Sopenharmony_cistatic unsigned int cpg_div6_clock_calc_div(unsigned long rate, 948c2ecf20Sopenharmony_ci unsigned long parent_rate) 958c2ecf20Sopenharmony_ci{ 968c2ecf20Sopenharmony_ci unsigned int div; 978c2ecf20Sopenharmony_ci 988c2ecf20Sopenharmony_ci if (!rate) 998c2ecf20Sopenharmony_ci rate = 1; 1008c2ecf20Sopenharmony_ci 1018c2ecf20Sopenharmony_ci div = DIV_ROUND_CLOSEST(parent_rate, rate); 1028c2ecf20Sopenharmony_ci return clamp_t(unsigned int, div, 1, 64); 1038c2ecf20Sopenharmony_ci} 1048c2ecf20Sopenharmony_ci 1058c2ecf20Sopenharmony_cistatic long cpg_div6_clock_round_rate(struct clk_hw *hw, unsigned long rate, 1068c2ecf20Sopenharmony_ci unsigned long *parent_rate) 1078c2ecf20Sopenharmony_ci{ 1088c2ecf20Sopenharmony_ci unsigned int div = cpg_div6_clock_calc_div(rate, *parent_rate); 1098c2ecf20Sopenharmony_ci 1108c2ecf20Sopenharmony_ci return *parent_rate / div; 1118c2ecf20Sopenharmony_ci} 1128c2ecf20Sopenharmony_ci 1138c2ecf20Sopenharmony_cistatic int cpg_div6_clock_set_rate(struct clk_hw *hw, unsigned long rate, 1148c2ecf20Sopenharmony_ci unsigned long parent_rate) 1158c2ecf20Sopenharmony_ci{ 1168c2ecf20Sopenharmony_ci struct div6_clock *clock = to_div6_clock(hw); 1178c2ecf20Sopenharmony_ci unsigned int div = cpg_div6_clock_calc_div(rate, parent_rate); 1188c2ecf20Sopenharmony_ci u32 val; 1198c2ecf20Sopenharmony_ci 1208c2ecf20Sopenharmony_ci clock->div = div; 1218c2ecf20Sopenharmony_ci 1228c2ecf20Sopenharmony_ci val = readl(clock->reg) & ~CPG_DIV6_DIV_MASK; 1238c2ecf20Sopenharmony_ci /* Only program the new divisor if the clock isn't stopped. */ 1248c2ecf20Sopenharmony_ci if (!(val & CPG_DIV6_CKSTP)) 1258c2ecf20Sopenharmony_ci writel(val | CPG_DIV6_DIV(clock->div - 1), clock->reg); 1268c2ecf20Sopenharmony_ci 1278c2ecf20Sopenharmony_ci return 0; 1288c2ecf20Sopenharmony_ci} 1298c2ecf20Sopenharmony_ci 1308c2ecf20Sopenharmony_cistatic u8 cpg_div6_clock_get_parent(struct clk_hw *hw) 1318c2ecf20Sopenharmony_ci{ 1328c2ecf20Sopenharmony_ci struct div6_clock *clock = to_div6_clock(hw); 1338c2ecf20Sopenharmony_ci unsigned int i; 1348c2ecf20Sopenharmony_ci u8 hw_index; 1358c2ecf20Sopenharmony_ci 1368c2ecf20Sopenharmony_ci if (clock->src_width == 0) 1378c2ecf20Sopenharmony_ci return 0; 1388c2ecf20Sopenharmony_ci 1398c2ecf20Sopenharmony_ci hw_index = (readl(clock->reg) >> clock->src_shift) & 1408c2ecf20Sopenharmony_ci (BIT(clock->src_width) - 1); 1418c2ecf20Sopenharmony_ci for (i = 0; i < clk_hw_get_num_parents(hw); i++) { 1428c2ecf20Sopenharmony_ci if (clock->parents[i] == hw_index) 1438c2ecf20Sopenharmony_ci return i; 1448c2ecf20Sopenharmony_ci } 1458c2ecf20Sopenharmony_ci 1468c2ecf20Sopenharmony_ci pr_err("%s: %s DIV6 clock set to invalid parent %u\n", 1478c2ecf20Sopenharmony_ci __func__, clk_hw_get_name(hw), hw_index); 1488c2ecf20Sopenharmony_ci return 0; 1498c2ecf20Sopenharmony_ci} 1508c2ecf20Sopenharmony_ci 1518c2ecf20Sopenharmony_cistatic int cpg_div6_clock_set_parent(struct clk_hw *hw, u8 index) 1528c2ecf20Sopenharmony_ci{ 1538c2ecf20Sopenharmony_ci struct div6_clock *clock = to_div6_clock(hw); 1548c2ecf20Sopenharmony_ci u8 hw_index; 1558c2ecf20Sopenharmony_ci u32 mask; 1568c2ecf20Sopenharmony_ci 1578c2ecf20Sopenharmony_ci if (index >= clk_hw_get_num_parents(hw)) 1588c2ecf20Sopenharmony_ci return -EINVAL; 1598c2ecf20Sopenharmony_ci 1608c2ecf20Sopenharmony_ci mask = ~((BIT(clock->src_width) - 1) << clock->src_shift); 1618c2ecf20Sopenharmony_ci hw_index = clock->parents[index]; 1628c2ecf20Sopenharmony_ci 1638c2ecf20Sopenharmony_ci writel((readl(clock->reg) & mask) | (hw_index << clock->src_shift), 1648c2ecf20Sopenharmony_ci clock->reg); 1658c2ecf20Sopenharmony_ci 1668c2ecf20Sopenharmony_ci return 0; 1678c2ecf20Sopenharmony_ci} 1688c2ecf20Sopenharmony_ci 1698c2ecf20Sopenharmony_cistatic const struct clk_ops cpg_div6_clock_ops = { 1708c2ecf20Sopenharmony_ci .enable = cpg_div6_clock_enable, 1718c2ecf20Sopenharmony_ci .disable = cpg_div6_clock_disable, 1728c2ecf20Sopenharmony_ci .is_enabled = cpg_div6_clock_is_enabled, 1738c2ecf20Sopenharmony_ci .get_parent = cpg_div6_clock_get_parent, 1748c2ecf20Sopenharmony_ci .set_parent = cpg_div6_clock_set_parent, 1758c2ecf20Sopenharmony_ci .recalc_rate = cpg_div6_clock_recalc_rate, 1768c2ecf20Sopenharmony_ci .round_rate = cpg_div6_clock_round_rate, 1778c2ecf20Sopenharmony_ci .set_rate = cpg_div6_clock_set_rate, 1788c2ecf20Sopenharmony_ci}; 1798c2ecf20Sopenharmony_ci 1808c2ecf20Sopenharmony_cistatic int cpg_div6_clock_notifier_call(struct notifier_block *nb, 1818c2ecf20Sopenharmony_ci unsigned long action, void *data) 1828c2ecf20Sopenharmony_ci{ 1838c2ecf20Sopenharmony_ci struct div6_clock *clock = container_of(nb, struct div6_clock, nb); 1848c2ecf20Sopenharmony_ci 1858c2ecf20Sopenharmony_ci switch (action) { 1868c2ecf20Sopenharmony_ci case PM_EVENT_RESUME: 1878c2ecf20Sopenharmony_ci /* 1888c2ecf20Sopenharmony_ci * TODO: This does not yet support DIV6 clocks with multiple 1898c2ecf20Sopenharmony_ci * parents, as the parent selection bits are not restored. 1908c2ecf20Sopenharmony_ci * Fortunately so far such DIV6 clocks are found only on 1918c2ecf20Sopenharmony_ci * R/SH-Mobile SoCs, while the resume functionality is only 1928c2ecf20Sopenharmony_ci * needed on R-Car Gen3. 1938c2ecf20Sopenharmony_ci */ 1948c2ecf20Sopenharmony_ci if (__clk_get_enable_count(clock->hw.clk)) 1958c2ecf20Sopenharmony_ci cpg_div6_clock_enable(&clock->hw); 1968c2ecf20Sopenharmony_ci else 1978c2ecf20Sopenharmony_ci cpg_div6_clock_disable(&clock->hw); 1988c2ecf20Sopenharmony_ci return NOTIFY_OK; 1998c2ecf20Sopenharmony_ci } 2008c2ecf20Sopenharmony_ci 2018c2ecf20Sopenharmony_ci return NOTIFY_DONE; 2028c2ecf20Sopenharmony_ci} 2038c2ecf20Sopenharmony_ci 2048c2ecf20Sopenharmony_ci/** 2058c2ecf20Sopenharmony_ci * cpg_div6_register - Register a DIV6 clock 2068c2ecf20Sopenharmony_ci * @name: Name of the DIV6 clock 2078c2ecf20Sopenharmony_ci * @num_parents: Number of parent clocks of the DIV6 clock (1, 4, or 8) 2088c2ecf20Sopenharmony_ci * @parent_names: Array containing the names of the parent clocks 2098c2ecf20Sopenharmony_ci * @reg: Mapped register used to control the DIV6 clock 2108c2ecf20Sopenharmony_ci * @notifiers: Optional notifier chain to save/restore state for system resume 2118c2ecf20Sopenharmony_ci */ 2128c2ecf20Sopenharmony_cistruct clk * __init cpg_div6_register(const char *name, 2138c2ecf20Sopenharmony_ci unsigned int num_parents, 2148c2ecf20Sopenharmony_ci const char **parent_names, 2158c2ecf20Sopenharmony_ci void __iomem *reg, 2168c2ecf20Sopenharmony_ci struct raw_notifier_head *notifiers) 2178c2ecf20Sopenharmony_ci{ 2188c2ecf20Sopenharmony_ci unsigned int valid_parents; 2198c2ecf20Sopenharmony_ci struct clk_init_data init; 2208c2ecf20Sopenharmony_ci struct div6_clock *clock; 2218c2ecf20Sopenharmony_ci struct clk *clk; 2228c2ecf20Sopenharmony_ci unsigned int i; 2238c2ecf20Sopenharmony_ci 2248c2ecf20Sopenharmony_ci clock = kzalloc(struct_size(clock, parents, num_parents), GFP_KERNEL); 2258c2ecf20Sopenharmony_ci if (!clock) 2268c2ecf20Sopenharmony_ci return ERR_PTR(-ENOMEM); 2278c2ecf20Sopenharmony_ci 2288c2ecf20Sopenharmony_ci clock->reg = reg; 2298c2ecf20Sopenharmony_ci 2308c2ecf20Sopenharmony_ci /* 2318c2ecf20Sopenharmony_ci * Read the divisor. Disabling the clock overwrites the divisor, so we 2328c2ecf20Sopenharmony_ci * need to cache its value for the enable operation. 2338c2ecf20Sopenharmony_ci */ 2348c2ecf20Sopenharmony_ci clock->div = (readl(clock->reg) & CPG_DIV6_DIV_MASK) + 1; 2358c2ecf20Sopenharmony_ci 2368c2ecf20Sopenharmony_ci switch (num_parents) { 2378c2ecf20Sopenharmony_ci case 1: 2388c2ecf20Sopenharmony_ci /* fixed parent clock */ 2398c2ecf20Sopenharmony_ci clock->src_shift = clock->src_width = 0; 2408c2ecf20Sopenharmony_ci break; 2418c2ecf20Sopenharmony_ci case 4: 2428c2ecf20Sopenharmony_ci /* clock with EXSRC bits 6-7 */ 2438c2ecf20Sopenharmony_ci clock->src_shift = 6; 2448c2ecf20Sopenharmony_ci clock->src_width = 2; 2458c2ecf20Sopenharmony_ci break; 2468c2ecf20Sopenharmony_ci case 8: 2478c2ecf20Sopenharmony_ci /* VCLK with EXSRC bits 12-14 */ 2488c2ecf20Sopenharmony_ci clock->src_shift = 12; 2498c2ecf20Sopenharmony_ci clock->src_width = 3; 2508c2ecf20Sopenharmony_ci break; 2518c2ecf20Sopenharmony_ci default: 2528c2ecf20Sopenharmony_ci pr_err("%s: invalid number of parents for DIV6 clock %s\n", 2538c2ecf20Sopenharmony_ci __func__, name); 2548c2ecf20Sopenharmony_ci clk = ERR_PTR(-EINVAL); 2558c2ecf20Sopenharmony_ci goto free_clock; 2568c2ecf20Sopenharmony_ci } 2578c2ecf20Sopenharmony_ci 2588c2ecf20Sopenharmony_ci /* Filter out invalid parents */ 2598c2ecf20Sopenharmony_ci for (i = 0, valid_parents = 0; i < num_parents; i++) { 2608c2ecf20Sopenharmony_ci if (parent_names[i]) { 2618c2ecf20Sopenharmony_ci parent_names[valid_parents] = parent_names[i]; 2628c2ecf20Sopenharmony_ci clock->parents[valid_parents] = i; 2638c2ecf20Sopenharmony_ci valid_parents++; 2648c2ecf20Sopenharmony_ci } 2658c2ecf20Sopenharmony_ci } 2668c2ecf20Sopenharmony_ci 2678c2ecf20Sopenharmony_ci /* Register the clock. */ 2688c2ecf20Sopenharmony_ci init.name = name; 2698c2ecf20Sopenharmony_ci init.ops = &cpg_div6_clock_ops; 2708c2ecf20Sopenharmony_ci init.flags = 0; 2718c2ecf20Sopenharmony_ci init.parent_names = parent_names; 2728c2ecf20Sopenharmony_ci init.num_parents = valid_parents; 2738c2ecf20Sopenharmony_ci 2748c2ecf20Sopenharmony_ci clock->hw.init = &init; 2758c2ecf20Sopenharmony_ci 2768c2ecf20Sopenharmony_ci clk = clk_register(NULL, &clock->hw); 2778c2ecf20Sopenharmony_ci if (IS_ERR(clk)) 2788c2ecf20Sopenharmony_ci goto free_clock; 2798c2ecf20Sopenharmony_ci 2808c2ecf20Sopenharmony_ci if (notifiers) { 2818c2ecf20Sopenharmony_ci clock->nb.notifier_call = cpg_div6_clock_notifier_call; 2828c2ecf20Sopenharmony_ci raw_notifier_chain_register(notifiers, &clock->nb); 2838c2ecf20Sopenharmony_ci } 2848c2ecf20Sopenharmony_ci 2858c2ecf20Sopenharmony_ci return clk; 2868c2ecf20Sopenharmony_ci 2878c2ecf20Sopenharmony_cifree_clock: 2888c2ecf20Sopenharmony_ci kfree(clock); 2898c2ecf20Sopenharmony_ci return clk; 2908c2ecf20Sopenharmony_ci} 2918c2ecf20Sopenharmony_ci 2928c2ecf20Sopenharmony_cistatic void __init cpg_div6_clock_init(struct device_node *np) 2938c2ecf20Sopenharmony_ci{ 2948c2ecf20Sopenharmony_ci unsigned int num_parents; 2958c2ecf20Sopenharmony_ci const char **parent_names; 2968c2ecf20Sopenharmony_ci const char *clk_name = np->name; 2978c2ecf20Sopenharmony_ci void __iomem *reg; 2988c2ecf20Sopenharmony_ci struct clk *clk; 2998c2ecf20Sopenharmony_ci unsigned int i; 3008c2ecf20Sopenharmony_ci 3018c2ecf20Sopenharmony_ci num_parents = of_clk_get_parent_count(np); 3028c2ecf20Sopenharmony_ci if (num_parents < 1) { 3038c2ecf20Sopenharmony_ci pr_err("%s: no parent found for %pOFn DIV6 clock\n", 3048c2ecf20Sopenharmony_ci __func__, np); 3058c2ecf20Sopenharmony_ci return; 3068c2ecf20Sopenharmony_ci } 3078c2ecf20Sopenharmony_ci 3088c2ecf20Sopenharmony_ci parent_names = kmalloc_array(num_parents, sizeof(*parent_names), 3098c2ecf20Sopenharmony_ci GFP_KERNEL); 3108c2ecf20Sopenharmony_ci if (!parent_names) 3118c2ecf20Sopenharmony_ci return; 3128c2ecf20Sopenharmony_ci 3138c2ecf20Sopenharmony_ci reg = of_iomap(np, 0); 3148c2ecf20Sopenharmony_ci if (reg == NULL) { 3158c2ecf20Sopenharmony_ci pr_err("%s: failed to map %pOFn DIV6 clock register\n", 3168c2ecf20Sopenharmony_ci __func__, np); 3178c2ecf20Sopenharmony_ci goto error; 3188c2ecf20Sopenharmony_ci } 3198c2ecf20Sopenharmony_ci 3208c2ecf20Sopenharmony_ci /* Parse the DT properties. */ 3218c2ecf20Sopenharmony_ci of_property_read_string(np, "clock-output-names", &clk_name); 3228c2ecf20Sopenharmony_ci 3238c2ecf20Sopenharmony_ci for (i = 0; i < num_parents; i++) 3248c2ecf20Sopenharmony_ci parent_names[i] = of_clk_get_parent_name(np, i); 3258c2ecf20Sopenharmony_ci 3268c2ecf20Sopenharmony_ci clk = cpg_div6_register(clk_name, num_parents, parent_names, reg, NULL); 3278c2ecf20Sopenharmony_ci if (IS_ERR(clk)) { 3288c2ecf20Sopenharmony_ci pr_err("%s: failed to register %pOFn DIV6 clock (%ld)\n", 3298c2ecf20Sopenharmony_ci __func__, np, PTR_ERR(clk)); 3308c2ecf20Sopenharmony_ci goto error; 3318c2ecf20Sopenharmony_ci } 3328c2ecf20Sopenharmony_ci 3338c2ecf20Sopenharmony_ci of_clk_add_provider(np, of_clk_src_simple_get, clk); 3348c2ecf20Sopenharmony_ci 3358c2ecf20Sopenharmony_ci kfree(parent_names); 3368c2ecf20Sopenharmony_ci return; 3378c2ecf20Sopenharmony_ci 3388c2ecf20Sopenharmony_cierror: 3398c2ecf20Sopenharmony_ci if (reg) 3408c2ecf20Sopenharmony_ci iounmap(reg); 3418c2ecf20Sopenharmony_ci kfree(parent_names); 3428c2ecf20Sopenharmony_ci} 3438c2ecf20Sopenharmony_ciCLK_OF_DECLARE(cpg_div6_clk, "renesas,cpg-div6-clock", cpg_div6_clock_init); 344