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