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