| // SPDX-License-Identifier: GPL-2.0 |
| #include <linux/clk.h> |
| #include <linux/compiler.h> |
| #include <linux/slab.h> |
| #include <linux/io.h> |
| #include <linux/clkdev.h> |
| #include <asm/clock.h> |
| |
| static struct clk master_clk = { |
| .flags = CLK_ENABLE_ON_INIT, |
| .rate = CONFIG_SH_PCLK_FREQ, |
| }; |
| |
| static struct clk peripheral_clk = { |
| .parent = &master_clk, |
| .flags = CLK_ENABLE_ON_INIT, |
| }; |
| |
| static struct clk bus_clk = { |
| .parent = &master_clk, |
| .flags = CLK_ENABLE_ON_INIT, |
| }; |
| |
| static struct clk cpu_clk = { |
| .parent = &master_clk, |
| .flags = CLK_ENABLE_ON_INIT, |
| }; |
| |
| /* |
| * The ordering of these clocks matters, do not change it. |
| */ |
| static struct clk *onchip_clocks[] = { |
| &master_clk, |
| &peripheral_clk, |
| &bus_clk, |
| &cpu_clk, |
| }; |
| |
| static struct clk_lookup lookups[] = { |
| /* main clocks */ |
| CLKDEV_CON_ID("master_clk", &master_clk), |
| CLKDEV_CON_ID("peripheral_clk", &peripheral_clk), |
| CLKDEV_CON_ID("bus_clk", &bus_clk), |
| CLKDEV_CON_ID("cpu_clk", &cpu_clk), |
| }; |
| |
| int __init __deprecated cpg_clk_init(void) |
| { |
| int i, ret = 0; |
| |
| for (i = 0; i < ARRAY_SIZE(onchip_clocks); i++) { |
| struct clk *clk = onchip_clocks[i]; |
| arch_init_clk_ops(&clk->ops, i); |
| if (clk->ops) |
| ret |= clk_register(clk); |
| } |
| |
| clkdev_add_table(lookups, ARRAY_SIZE(lookups)); |
| |
| clk_add_alias("fck", "sh-tmu-sh3.0", "peripheral_clk", NULL); |
| clk_add_alias("fck", "sh-tmu.0", "peripheral_clk", NULL); |
| clk_add_alias("fck", "sh-tmu.1", "peripheral_clk", NULL); |
| clk_add_alias("fck", "sh-tmu.2", "peripheral_clk", NULL); |
| clk_add_alias("fck", "sh-mtu2", "peripheral_clk", NULL); |
| clk_add_alias("fck", "sh-cmt-16.0", "peripheral_clk", NULL); |
| clk_add_alias("fck", "sh-cmt-32.0", "peripheral_clk", NULL); |
| |
| return ret; |
| } |
| |
| /* |
| * Placeholder for compatibility, until the lazy CPUs do this |
| * on their own. |
| */ |
| int __init __weak arch_clk_init(void) |
| { |
| return cpg_clk_init(); |
| } |