xref: /kernel/linux/linux-6.6/drivers/clk/ti/clk-816x.c (revision 62306a36)
162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci
362306a36Sopenharmony_ci#include <linux/kernel.h>
462306a36Sopenharmony_ci#include <linux/list.h>
562306a36Sopenharmony_ci#include <linux/clk-provider.h>
662306a36Sopenharmony_ci#include <linux/clk/ti.h>
762306a36Sopenharmony_ci#include <dt-bindings/clock/dm816.h>
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include "clock.h"
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_cistatic const struct omap_clkctrl_reg_data dm816_default_clkctrl_regs[] __initconst = {
1262306a36Sopenharmony_ci	{ DM816_USB_OTG_HS_CLKCTRL, NULL, CLKF_SW_SUP, "sysclk6_ck" },
1362306a36Sopenharmony_ci	{ 0 },
1462306a36Sopenharmony_ci};
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_cistatic const struct omap_clkctrl_reg_data dm816_alwon_clkctrl_regs[] __initconst = {
1762306a36Sopenharmony_ci	{ DM816_UART1_CLKCTRL, NULL, CLKF_SW_SUP, "sysclk10_ck" },
1862306a36Sopenharmony_ci	{ DM816_UART2_CLKCTRL, NULL, CLKF_SW_SUP, "sysclk10_ck" },
1962306a36Sopenharmony_ci	{ DM816_UART3_CLKCTRL, NULL, CLKF_SW_SUP, "sysclk10_ck" },
2062306a36Sopenharmony_ci	{ DM816_GPIO1_CLKCTRL, NULL, CLKF_SW_SUP, "sysclk6_ck" },
2162306a36Sopenharmony_ci	{ DM816_GPIO2_CLKCTRL, NULL, CLKF_SW_SUP, "sysclk6_ck" },
2262306a36Sopenharmony_ci	{ DM816_I2C1_CLKCTRL, NULL, CLKF_SW_SUP, "sysclk10_ck" },
2362306a36Sopenharmony_ci	{ DM816_I2C2_CLKCTRL, NULL, CLKF_SW_SUP, "sysclk10_ck" },
2462306a36Sopenharmony_ci	{ DM816_TIMER1_CLKCTRL, NULL, CLKF_SW_SUP, "timer1_fck" },
2562306a36Sopenharmony_ci	{ DM816_TIMER2_CLKCTRL, NULL, CLKF_SW_SUP, "timer2_fck" },
2662306a36Sopenharmony_ci	{ DM816_TIMER3_CLKCTRL, NULL, CLKF_SW_SUP, "timer3_fck" },
2762306a36Sopenharmony_ci	{ DM816_TIMER4_CLKCTRL, NULL, CLKF_SW_SUP, "timer4_fck" },
2862306a36Sopenharmony_ci	{ DM816_TIMER5_CLKCTRL, NULL, CLKF_SW_SUP, "timer5_fck" },
2962306a36Sopenharmony_ci	{ DM816_TIMER6_CLKCTRL, NULL, CLKF_SW_SUP, "timer6_fck" },
3062306a36Sopenharmony_ci	{ DM816_TIMER7_CLKCTRL, NULL, CLKF_SW_SUP, "timer7_fck" },
3162306a36Sopenharmony_ci	{ DM816_WD_TIMER_CLKCTRL, NULL, CLKF_SW_SUP | CLKF_NO_IDLEST, "sysclk18_ck" },
3262306a36Sopenharmony_ci	{ DM816_MCSPI1_CLKCTRL, NULL, CLKF_SW_SUP, "sysclk10_ck" },
3362306a36Sopenharmony_ci	{ DM816_MAILBOX_CLKCTRL, NULL, CLKF_SW_SUP, "sysclk6_ck" },
3462306a36Sopenharmony_ci	{ DM816_SPINBOX_CLKCTRL, NULL, CLKF_SW_SUP, "sysclk6_ck" },
3562306a36Sopenharmony_ci	{ DM816_MMC1_CLKCTRL, NULL, CLKF_SW_SUP, "sysclk10_ck" },
3662306a36Sopenharmony_ci	{ DM816_GPMC_CLKCTRL, NULL, CLKF_SW_SUP, "sysclk6_ck" },
3762306a36Sopenharmony_ci	{ DM816_DAVINCI_MDIO_CLKCTRL, NULL, CLKF_SW_SUP | CLKF_NO_IDLEST, "sysclk24_ck" },
3862306a36Sopenharmony_ci	{ DM816_EMAC1_CLKCTRL, NULL, CLKF_SW_SUP | CLKF_NO_IDLEST, "sysclk24_ck" },
3962306a36Sopenharmony_ci	{ DM816_MPU_CLKCTRL, NULL, CLKF_SW_SUP, "sysclk2_ck" },
4062306a36Sopenharmony_ci	{ DM816_RTC_CLKCTRL, NULL, CLKF_SW_SUP | CLKF_NO_IDLEST, "sysclk18_ck" },
4162306a36Sopenharmony_ci	{ DM816_TPCC_CLKCTRL, NULL, CLKF_SW_SUP, "sysclk4_ck" },
4262306a36Sopenharmony_ci	{ DM816_TPTC0_CLKCTRL, NULL, CLKF_SW_SUP, "sysclk4_ck" },
4362306a36Sopenharmony_ci	{ DM816_TPTC1_CLKCTRL, NULL, CLKF_SW_SUP, "sysclk4_ck" },
4462306a36Sopenharmony_ci	{ DM816_TPTC2_CLKCTRL, NULL, CLKF_SW_SUP, "sysclk4_ck" },
4562306a36Sopenharmony_ci	{ DM816_TPTC3_CLKCTRL, NULL, CLKF_SW_SUP, "sysclk4_ck" },
4662306a36Sopenharmony_ci	{ 0 },
4762306a36Sopenharmony_ci};
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ciconst struct omap_clkctrl_data dm816_clkctrl_data[] __initconst = {
5062306a36Sopenharmony_ci	{ 0x48180500, dm816_default_clkctrl_regs },
5162306a36Sopenharmony_ci	{ 0x48181400, dm816_alwon_clkctrl_regs },
5262306a36Sopenharmony_ci	{ 0 },
5362306a36Sopenharmony_ci};
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_cistatic struct ti_dt_clk dm816x_clks[] = {
5662306a36Sopenharmony_ci	DT_CLK(NULL, "sys_clkin", "sys_clkin_ck"),
5762306a36Sopenharmony_ci	DT_CLK(NULL, "timer_sys_ck", "sys_clkin_ck"),
5862306a36Sopenharmony_ci	DT_CLK(NULL, "timer_32k_ck", "sysclk18_ck"),
5962306a36Sopenharmony_ci	DT_CLK(NULL, "timer_ext_ck", "tclkin_ck"),
6062306a36Sopenharmony_ci	{ .node_name = NULL },
6162306a36Sopenharmony_ci};
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_cistatic const char *enable_init_clks[] = {
6462306a36Sopenharmony_ci	"ddr_pll_clk1",
6562306a36Sopenharmony_ci	"ddr_pll_clk2",
6662306a36Sopenharmony_ci	"ddr_pll_clk3",
6762306a36Sopenharmony_ci	"sysclk6_ck",
6862306a36Sopenharmony_ci};
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ciint __init dm816x_dt_clk_init(void)
7162306a36Sopenharmony_ci{
7262306a36Sopenharmony_ci	ti_dt_clocks_register(dm816x_clks);
7362306a36Sopenharmony_ci	omap2_clk_disable_autoidle_all();
7462306a36Sopenharmony_ci	ti_clk_add_aliases();
7562306a36Sopenharmony_ci	omap2_clk_enable_init_clocks(enable_init_clks,
7662306a36Sopenharmony_ci				     ARRAY_SIZE(enable_init_clks));
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_ci	return 0;
7962306a36Sopenharmony_ci}
80