162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (c) 2013, Steffen Trumtrar <s.trumtrar@pengutronix.de> 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * based on drivers/clk/tegra/clk.h 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#ifndef __SOCFPGA_CLK_H 962306a36Sopenharmony_ci#define __SOCFPGA_CLK_H 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include <linux/clk-provider.h> 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci/* Clock Manager offsets */ 1462306a36Sopenharmony_ci#define CLKMGR_CTRL 0x0 1562306a36Sopenharmony_ci#define CLKMGR_BYPASS 0x4 1662306a36Sopenharmony_ci#define CLKMGR_DBCTRL 0x10 1762306a36Sopenharmony_ci#define CLKMGR_L4SRC 0x70 1862306a36Sopenharmony_ci#define CLKMGR_PERPLL_SRC 0xAC 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci#define SOCFPGA_MAX_PARENTS 5 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci#define streq(a, b) (strcmp((a), (b)) == 0) 2362306a36Sopenharmony_ci#define SYSMGR_SDMMC_CTRL_SET(smplsel, drvsel) \ 2462306a36Sopenharmony_ci ((((smplsel) & 0x7) << 3) | (((drvsel) & 0x7) << 0)) 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci#define SYSMGR_SDMMC_CTRL_SET_AS10(smplsel, drvsel) \ 2762306a36Sopenharmony_ci ((((smplsel) & 0x7) << 4) | (((drvsel) & 0x7) << 0)) 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ciextern void __iomem *clk_mgr_base_addr; 3062306a36Sopenharmony_ciextern void __iomem *clk_mgr_a10_base_addr; 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_civoid __init socfpga_pll_init(struct device_node *node); 3362306a36Sopenharmony_civoid __init socfpga_periph_init(struct device_node *node); 3462306a36Sopenharmony_civoid __init socfpga_gate_init(struct device_node *node); 3562306a36Sopenharmony_civoid socfpga_a10_pll_init(struct device_node *node); 3662306a36Sopenharmony_civoid socfpga_a10_periph_init(struct device_node *node); 3762306a36Sopenharmony_civoid socfpga_a10_gate_init(struct device_node *node); 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_cistruct socfpga_pll { 4062306a36Sopenharmony_ci struct clk_gate hw; 4162306a36Sopenharmony_ci}; 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_cistruct socfpga_gate_clk { 4462306a36Sopenharmony_ci struct clk_gate hw; 4562306a36Sopenharmony_ci char *parent_name; 4662306a36Sopenharmony_ci u32 fixed_div; 4762306a36Sopenharmony_ci void __iomem *div_reg; 4862306a36Sopenharmony_ci void __iomem *bypass_reg; 4962306a36Sopenharmony_ci struct regmap *sys_mgr_base_addr; 5062306a36Sopenharmony_ci u32 width; /* only valid if div_reg != 0 */ 5162306a36Sopenharmony_ci u32 shift; /* only valid if div_reg != 0 */ 5262306a36Sopenharmony_ci u32 bypass_shift; /* only valid if bypass_reg != 0 */ 5362306a36Sopenharmony_ci}; 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_cistruct socfpga_periph_clk { 5662306a36Sopenharmony_ci struct clk_gate hw; 5762306a36Sopenharmony_ci char *parent_name; 5862306a36Sopenharmony_ci u32 fixed_div; 5962306a36Sopenharmony_ci void __iomem *div_reg; 6062306a36Sopenharmony_ci void __iomem *bypass_reg; 6162306a36Sopenharmony_ci u32 width; /* only valid if div_reg != 0 */ 6262306a36Sopenharmony_ci u32 shift; /* only valid if div_reg != 0 */ 6362306a36Sopenharmony_ci u32 bypass_shift; /* only valid if bypass_reg != 0 */ 6462306a36Sopenharmony_ci}; 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci#endif /* SOCFPGA_CLK_H */ 67