1f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart/* 2f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart * R-Car MSTP clocks 3f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart * 4f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart * Copyright (C) 2013 Ideas On Board SPRL 5f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart * 6f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart * Contact: Laurent Pinchart <laurent.pinchart@ideasonboard.com> 7f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart * 8f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart * This program is free software; you can redistribute it and/or modify 9f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart * it under the terms of the GNU General Public License as published by 10f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart * the Free Software Foundation; version 2 of the License. 11f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart */ 12f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart 13f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart#include <linux/clk-provider.h> 14f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart#include <linux/clkdev.h> 15f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart#include <linux/io.h> 16f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart#include <linux/of.h> 17f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart#include <linux/of_address.h> 18f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart#include <linux/spinlock.h> 19f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart 20f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart/* 21f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart * MSTP clocks. We can't use standard gate clocks as we need to poll on the 22f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart * status register when enabling the clock. 23f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart */ 24f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart 25f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart#define MSTP_MAX_CLOCKS 32 26f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart 27f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart/** 28f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart * struct mstp_clock_group - MSTP gating clocks group 29f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart * 30f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart * @data: clocks in this group 31f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart * @smstpcr: module stop control register 32f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart * @mstpsr: module stop status register (optional) 33f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart * @lock: protects writes to SMSTPCR 34f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart */ 35f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchartstruct mstp_clock_group { 36f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart struct clk_onecell_data data; 37f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart void __iomem *smstpcr; 38f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart void __iomem *mstpsr; 39f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart spinlock_t lock; 40f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart}; 41f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart 42f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart/** 43f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart * struct mstp_clock - MSTP gating clock 44f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart * @hw: handle between common and hardware-specific interfaces 45f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart * @bit_index: control bit index 46f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart * @group: MSTP clocks group 47f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart */ 48f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchartstruct mstp_clock { 49f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart struct clk_hw hw; 50f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart u32 bit_index; 51f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart struct mstp_clock_group *group; 52f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart}; 53f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart 54f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart#define to_mstp_clock(_hw) container_of(_hw, struct mstp_clock, hw) 55f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart 56f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchartstatic int cpg_mstp_clock_endisable(struct clk_hw *hw, bool enable) 57f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart{ 58f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart struct mstp_clock *clock = to_mstp_clock(hw); 59f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart struct mstp_clock_group *group = clock->group; 60f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart u32 bitmask = BIT(clock->bit_index); 61f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart unsigned long flags; 62f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart unsigned int i; 63f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart u32 value; 64f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart 65f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart spin_lock_irqsave(&group->lock, flags); 66f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart 67f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart value = clk_readl(group->smstpcr); 68f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart if (enable) 69f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart value &= ~bitmask; 70f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart else 71f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart value |= bitmask; 72f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart clk_writel(value, group->smstpcr); 73f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart 74f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart spin_unlock_irqrestore(&group->lock, flags); 75f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart 76f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart if (!enable || !group->mstpsr) 77f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart return 0; 78f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart 79f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart for (i = 1000; i > 0; --i) { 80f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart if (!(clk_readl(group->mstpsr) & bitmask)) 81f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart break; 82f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart cpu_relax(); 83f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart } 84f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart 85f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart if (!i) { 86f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart pr_err("%s: failed to enable %p[%d]\n", __func__, 87f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart group->smstpcr, clock->bit_index); 88f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart return -ETIMEDOUT; 89f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart } 90f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart 91f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart return 0; 92f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart} 93f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart 94f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchartstatic int cpg_mstp_clock_enable(struct clk_hw *hw) 95f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart{ 96f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart return cpg_mstp_clock_endisable(hw, true); 97f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart} 98f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart 99f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchartstatic void cpg_mstp_clock_disable(struct clk_hw *hw) 100f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart{ 101f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart cpg_mstp_clock_endisable(hw, false); 102f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart} 103f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart 104f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchartstatic int cpg_mstp_clock_is_enabled(struct clk_hw *hw) 105f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart{ 106f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart struct mstp_clock *clock = to_mstp_clock(hw); 107f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart struct mstp_clock_group *group = clock->group; 108f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart u32 value; 109f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart 110f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart if (group->mstpsr) 111f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart value = clk_readl(group->mstpsr); 112f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart else 113f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart value = clk_readl(group->smstpcr); 114f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart 115bb178da701382a230e26d90cf94e8a24b280e0d9Laurent Pinchart return !(value & BIT(clock->bit_index)); 116f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart} 117f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart 118f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchartstatic const struct clk_ops cpg_mstp_clock_ops = { 119f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart .enable = cpg_mstp_clock_enable, 120f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart .disable = cpg_mstp_clock_disable, 121f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart .is_enabled = cpg_mstp_clock_is_enabled, 122f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart}; 123f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart 124f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchartstatic struct clk * __init 125f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchartcpg_mstp_clock_register(const char *name, const char *parent_name, 126f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart unsigned int index, struct mstp_clock_group *group) 127f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart{ 128f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart struct clk_init_data init; 129f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart struct mstp_clock *clock; 130f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart struct clk *clk; 131f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart 132f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart clock = kzalloc(sizeof(*clock), GFP_KERNEL); 133f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart if (!clock) { 134f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart pr_err("%s: failed to allocate MSTP clock.\n", __func__); 135f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart return ERR_PTR(-ENOMEM); 136f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart } 137f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart 138f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart init.name = name; 139f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart init.ops = &cpg_mstp_clock_ops; 140e44df332f30bf3040c60c1ed6674d1431fdb48b9Ben Dooks init.flags = CLK_IS_BASIC | CLK_SET_RATE_PARENT; 141f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart init.parent_names = &parent_name; 142f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart init.num_parents = 1; 143f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart 144f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart clock->bit_index = index; 145f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart clock->group = group; 146f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart clock->hw.init = &init; 147f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart 148f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart clk = clk_register(NULL, &clock->hw); 149f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart 150f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart if (IS_ERR(clk)) 151f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart kfree(clock); 152f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart 153f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart return clk; 154f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart} 155f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart 156f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchartstatic void __init cpg_mstp_clocks_init(struct device_node *np) 157f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart{ 158f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart struct mstp_clock_group *group; 1598e33f91a0b84ae1964bef77cb92f5d41d97530c8Ben Dooks const char *idxname; 160f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart struct clk **clks; 161f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart unsigned int i; 162f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart 163f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart group = kzalloc(sizeof(*group), GFP_KERNEL); 164209f4fedcfdeeecfc9e87c045990230cc2162169Valentine Barshak clks = kmalloc(MSTP_MAX_CLOCKS * sizeof(*clks), GFP_KERNEL); 165f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart if (group == NULL || clks == NULL) { 166f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart kfree(group); 167f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart kfree(clks); 168f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart pr_err("%s: failed to allocate group\n", __func__); 169f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart return; 170f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart } 171f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart 172f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart spin_lock_init(&group->lock); 173f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart group->data.clks = clks; 174f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart 175f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart group->smstpcr = of_iomap(np, 0); 176f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart group->mstpsr = of_iomap(np, 1); 177f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart 178f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart if (group->smstpcr == NULL) { 179f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart pr_err("%s: failed to remap SMSTPCR\n", __func__); 180f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart kfree(group); 181f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart kfree(clks); 182f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart return; 183f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart } 184f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart 185209f4fedcfdeeecfc9e87c045990230cc2162169Valentine Barshak for (i = 0; i < MSTP_MAX_CLOCKS; ++i) 186209f4fedcfdeeecfc9e87c045990230cc2162169Valentine Barshak clks[i] = ERR_PTR(-ENOENT); 187209f4fedcfdeeecfc9e87c045990230cc2162169Valentine Barshak 1888e33f91a0b84ae1964bef77cb92f5d41d97530c8Ben Dooks if (of_find_property(np, "clock-indices", &i)) 1898e33f91a0b84ae1964bef77cb92f5d41d97530c8Ben Dooks idxname = "clock-indices"; 1908e33f91a0b84ae1964bef77cb92f5d41d97530c8Ben Dooks else 1918e33f91a0b84ae1964bef77cb92f5d41d97530c8Ben Dooks idxname = "renesas,clock-indices"; 1928e33f91a0b84ae1964bef77cb92f5d41d97530c8Ben Dooks 193f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart for (i = 0; i < MSTP_MAX_CLOCKS; ++i) { 194f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart const char *parent_name; 195f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart const char *name; 196f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart u32 clkidx; 197f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart int ret; 198f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart 199f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart /* Skip clocks with no name. */ 200f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart ret = of_property_read_string_index(np, "clock-output-names", 201f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart i, &name); 202f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart if (ret < 0 || strlen(name) == 0) 203f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart continue; 204f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart 205f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart parent_name = of_clk_get_parent_name(np, i); 2068e33f91a0b84ae1964bef77cb92f5d41d97530c8Ben Dooks ret = of_property_read_u32_index(np, idxname, i, &clkidx); 207f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart if (parent_name == NULL || ret < 0) 208f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart break; 209f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart 210f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart if (clkidx >= MSTP_MAX_CLOCKS) { 211f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart pr_err("%s: invalid clock %s %s index %u)\n", 212f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart __func__, np->name, name, clkidx); 213f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart continue; 214f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart } 215f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart 2166413b090dedd8da4753453d25668098e5bc1f4e4Valentine Barshak clks[clkidx] = cpg_mstp_clock_register(name, parent_name, 2176413b090dedd8da4753453d25668098e5bc1f4e4Valentine Barshak clkidx, group); 218f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart if (!IS_ERR(clks[clkidx])) { 219209f4fedcfdeeecfc9e87c045990230cc2162169Valentine Barshak group->data.clk_num = max(group->data.clk_num, 220209f4fedcfdeeecfc9e87c045990230cc2162169Valentine Barshak clkidx + 1); 221f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart /* 222f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart * Register a clkdev to let board code retrieve the 223f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart * clock by name and register aliases for non-DT 224f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart * devices. 225f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart * 226f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart * FIXME: Remove this when all devices that require a 227f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart * clock will be instantiated from DT. 228f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart */ 229f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart clk_register_clkdev(clks[clkidx], name, NULL); 230f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart } else { 231f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart pr_err("%s: failed to register %s %s clock (%ld)\n", 232f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart __func__, np->name, name, PTR_ERR(clks[clkidx])); 233f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart } 234f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart } 235f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart 236f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart of_clk_add_provider(np, of_clk_src_onecell_get, &group->data); 237f94859c215b6d977794108a1a9a101239e393c09Laurent Pinchart} 238f94859c215b6d977794108a1a9a101239e393c09Laurent PinchartCLK_OF_DECLARE(cpg_mstp_clks, "renesas,cpg-mstp-clocks", cpg_mstp_clocks_init); 239