18c2ecf20Sopenharmony_ci/*
28c2ecf20Sopenharmony_ci * This program is free software; you can redistribute it and/or
38c2ecf20Sopenharmony_ci * modify it under the terms of the GNU General Public License as
48c2ecf20Sopenharmony_ci * published by the Free Software Foundation version 2.
58c2ecf20Sopenharmony_ci *
68c2ecf20Sopenharmony_ci * This program is distributed "as is" WITHOUT ANY WARRANTY of any
78c2ecf20Sopenharmony_ci * kind, whether express or implied; without even the implied warranty
88c2ecf20Sopenharmony_ci * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
98c2ecf20Sopenharmony_ci * GNU General Public License for more details.
108c2ecf20Sopenharmony_ci */
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ci#include <linux/kernel.h>
138c2ecf20Sopenharmony_ci#include <linux/list.h>
148c2ecf20Sopenharmony_ci#include <linux/clk-provider.h>
158c2ecf20Sopenharmony_ci#include <linux/clk/ti.h>
168c2ecf20Sopenharmony_ci#include <dt-bindings/clock/dm816.h>
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_ci#include "clock.h"
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_cistatic const struct omap_clkctrl_reg_data dm816_default_clkctrl_regs[] __initconst = {
218c2ecf20Sopenharmony_ci	{ DM816_USB_OTG_HS_CLKCTRL, NULL, CLKF_SW_SUP, "sysclk6_ck" },
228c2ecf20Sopenharmony_ci	{ 0 },
238c2ecf20Sopenharmony_ci};
248c2ecf20Sopenharmony_ci
258c2ecf20Sopenharmony_cistatic const struct omap_clkctrl_reg_data dm816_alwon_clkctrl_regs[] __initconst = {
268c2ecf20Sopenharmony_ci	{ DM816_UART1_CLKCTRL, NULL, CLKF_SW_SUP, "sysclk10_ck" },
278c2ecf20Sopenharmony_ci	{ DM816_UART2_CLKCTRL, NULL, CLKF_SW_SUP, "sysclk10_ck" },
288c2ecf20Sopenharmony_ci	{ DM816_UART3_CLKCTRL, NULL, CLKF_SW_SUP, "sysclk10_ck" },
298c2ecf20Sopenharmony_ci	{ DM816_GPIO1_CLKCTRL, NULL, CLKF_SW_SUP, "sysclk6_ck" },
308c2ecf20Sopenharmony_ci	{ DM816_GPIO2_CLKCTRL, NULL, CLKF_SW_SUP, "sysclk6_ck" },
318c2ecf20Sopenharmony_ci	{ DM816_I2C1_CLKCTRL, NULL, CLKF_SW_SUP, "sysclk10_ck" },
328c2ecf20Sopenharmony_ci	{ DM816_I2C2_CLKCTRL, NULL, CLKF_SW_SUP, "sysclk10_ck" },
338c2ecf20Sopenharmony_ci	{ DM816_TIMER1_CLKCTRL, NULL, CLKF_SW_SUP, "timer1_fck" },
348c2ecf20Sopenharmony_ci	{ DM816_TIMER2_CLKCTRL, NULL, CLKF_SW_SUP, "timer2_fck" },
358c2ecf20Sopenharmony_ci	{ DM816_TIMER3_CLKCTRL, NULL, CLKF_SW_SUP, "timer3_fck" },
368c2ecf20Sopenharmony_ci	{ DM816_TIMER4_CLKCTRL, NULL, CLKF_SW_SUP, "timer4_fck" },
378c2ecf20Sopenharmony_ci	{ DM816_TIMER5_CLKCTRL, NULL, CLKF_SW_SUP, "timer5_fck" },
388c2ecf20Sopenharmony_ci	{ DM816_TIMER6_CLKCTRL, NULL, CLKF_SW_SUP, "timer6_fck" },
398c2ecf20Sopenharmony_ci	{ DM816_TIMER7_CLKCTRL, NULL, CLKF_SW_SUP, "timer7_fck" },
408c2ecf20Sopenharmony_ci	{ DM816_WD_TIMER_CLKCTRL, NULL, CLKF_SW_SUP | CLKF_NO_IDLEST, "sysclk18_ck" },
418c2ecf20Sopenharmony_ci	{ DM816_MCSPI1_CLKCTRL, NULL, CLKF_SW_SUP, "sysclk10_ck" },
428c2ecf20Sopenharmony_ci	{ DM816_MAILBOX_CLKCTRL, NULL, CLKF_SW_SUP, "sysclk6_ck" },
438c2ecf20Sopenharmony_ci	{ DM816_SPINBOX_CLKCTRL, NULL, CLKF_SW_SUP, "sysclk6_ck" },
448c2ecf20Sopenharmony_ci	{ DM816_MMC1_CLKCTRL, NULL, CLKF_SW_SUP, "sysclk10_ck" },
458c2ecf20Sopenharmony_ci	{ DM816_GPMC_CLKCTRL, NULL, CLKF_SW_SUP, "sysclk6_ck" },
468c2ecf20Sopenharmony_ci	{ DM816_DAVINCI_MDIO_CLKCTRL, NULL, CLKF_SW_SUP | CLKF_NO_IDLEST, "sysclk24_ck" },
478c2ecf20Sopenharmony_ci	{ DM816_EMAC1_CLKCTRL, NULL, CLKF_SW_SUP | CLKF_NO_IDLEST, "sysclk24_ck" },
488c2ecf20Sopenharmony_ci	{ DM816_MPU_CLKCTRL, NULL, CLKF_SW_SUP, "sysclk2_ck" },
498c2ecf20Sopenharmony_ci	{ DM816_RTC_CLKCTRL, NULL, CLKF_SW_SUP | CLKF_NO_IDLEST, "sysclk18_ck" },
508c2ecf20Sopenharmony_ci	{ DM816_TPCC_CLKCTRL, NULL, CLKF_SW_SUP, "sysclk4_ck" },
518c2ecf20Sopenharmony_ci	{ DM816_TPTC0_CLKCTRL, NULL, CLKF_SW_SUP, "sysclk4_ck" },
528c2ecf20Sopenharmony_ci	{ DM816_TPTC1_CLKCTRL, NULL, CLKF_SW_SUP, "sysclk4_ck" },
538c2ecf20Sopenharmony_ci	{ DM816_TPTC2_CLKCTRL, NULL, CLKF_SW_SUP, "sysclk4_ck" },
548c2ecf20Sopenharmony_ci	{ DM816_TPTC3_CLKCTRL, NULL, CLKF_SW_SUP, "sysclk4_ck" },
558c2ecf20Sopenharmony_ci	{ 0 },
568c2ecf20Sopenharmony_ci};
578c2ecf20Sopenharmony_ci
588c2ecf20Sopenharmony_ciconst struct omap_clkctrl_data dm816_clkctrl_data[] __initconst = {
598c2ecf20Sopenharmony_ci	{ 0x48180500, dm816_default_clkctrl_regs },
608c2ecf20Sopenharmony_ci	{ 0x48181400, dm816_alwon_clkctrl_regs },
618c2ecf20Sopenharmony_ci	{ 0 },
628c2ecf20Sopenharmony_ci};
638c2ecf20Sopenharmony_ci
648c2ecf20Sopenharmony_cistatic struct ti_dt_clk dm816x_clks[] = {
658c2ecf20Sopenharmony_ci	DT_CLK(NULL, "sys_clkin", "sys_clkin_ck"),
668c2ecf20Sopenharmony_ci	DT_CLK(NULL, "timer_sys_ck", "sys_clkin_ck"),
678c2ecf20Sopenharmony_ci	DT_CLK(NULL, "timer_32k_ck", "sysclk18_ck"),
688c2ecf20Sopenharmony_ci	DT_CLK(NULL, "timer_ext_ck", "tclkin_ck"),
698c2ecf20Sopenharmony_ci	{ .node_name = NULL },
708c2ecf20Sopenharmony_ci};
718c2ecf20Sopenharmony_ci
728c2ecf20Sopenharmony_cistatic const char *enable_init_clks[] = {
738c2ecf20Sopenharmony_ci	"ddr_pll_clk1",
748c2ecf20Sopenharmony_ci	"ddr_pll_clk2",
758c2ecf20Sopenharmony_ci	"ddr_pll_clk3",
768c2ecf20Sopenharmony_ci	"sysclk6_ck",
778c2ecf20Sopenharmony_ci};
788c2ecf20Sopenharmony_ci
798c2ecf20Sopenharmony_ciint __init dm816x_dt_clk_init(void)
808c2ecf20Sopenharmony_ci{
818c2ecf20Sopenharmony_ci	ti_dt_clocks_register(dm816x_clks);
828c2ecf20Sopenharmony_ci	omap2_clk_disable_autoidle_all();
838c2ecf20Sopenharmony_ci	ti_clk_add_aliases();
848c2ecf20Sopenharmony_ci	omap2_clk_enable_init_clocks(enable_init_clks,
858c2ecf20Sopenharmony_ci				     ARRAY_SIZE(enable_init_clks));
868c2ecf20Sopenharmony_ci
878c2ecf20Sopenharmony_ci	return 0;
888c2ecf20Sopenharmony_ci}
89