xref: /openbmc/linux/drivers/clk/socfpga/clk.h (revision d0ce6aca)
12025cf9eSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
297259e99SSteffen Trumtrar /*
397259e99SSteffen Trumtrar  * Copyright (c) 2013, Steffen Trumtrar <s.trumtrar@pengutronix.de>
497259e99SSteffen Trumtrar  *
597259e99SSteffen Trumtrar  * based on drivers/clk/tegra/clk.h
697259e99SSteffen Trumtrar  */
797259e99SSteffen Trumtrar 
897259e99SSteffen Trumtrar #ifndef __SOCFPGA_CLK_H
997259e99SSteffen Trumtrar #define __SOCFPGA_CLK_H
1097259e99SSteffen Trumtrar 
1197259e99SSteffen Trumtrar #include <linux/clk-provider.h>
1297259e99SSteffen Trumtrar 
1397259e99SSteffen Trumtrar /* Clock Manager offsets */
1497259e99SSteffen Trumtrar #define CLKMGR_CTRL		0x0
1597259e99SSteffen Trumtrar #define CLKMGR_BYPASS		0x4
1634d5003bSDinh Nguyen #define CLKMGR_DBCTRL		0x10
1797259e99SSteffen Trumtrar #define CLKMGR_L4SRC		0x70
1897259e99SSteffen Trumtrar #define CLKMGR_PERPLL_SRC	0xAC
1997259e99SSteffen Trumtrar 
205611a5baSDinh Nguyen #define SOCFPGA_MAX_PARENTS		5
2197259e99SSteffen Trumtrar 
225611a5baSDinh Nguyen #define streq(a, b) (strcmp((a), (b)) == 0)
235611a5baSDinh Nguyen #define SYSMGR_SDMMC_CTRL_SET(smplsel, drvsel) \
245611a5baSDinh Nguyen 	((((smplsel) & 0x7) << 3) | (((drvsel) & 0x7) << 0))
255611a5baSDinh Nguyen 
26b7f8101dSDinh Nguyen #define SYSMGR_SDMMC_CTRL_SET_AS10(smplsel, drvsel) \
27b7f8101dSDinh Nguyen 	((((smplsel) & 0x7) << 4) | (((drvsel) & 0x7) << 0))
28b7f8101dSDinh Nguyen 
2997259e99SSteffen Trumtrar extern void __iomem *clk_mgr_base_addr;
305343325fSDinh Nguyen extern void __iomem *clk_mgr_a10_base_addr;
3197259e99SSteffen Trumtrar 
3297259e99SSteffen Trumtrar void __init socfpga_pll_init(struct device_node *node);
3397259e99SSteffen Trumtrar void __init socfpga_periph_init(struct device_node *node);
3497259e99SSteffen Trumtrar void __init socfpga_gate_init(struct device_node *node);
355343325fSDinh Nguyen void socfpga_a10_pll_init(struct device_node *node);
365343325fSDinh Nguyen void socfpga_a10_periph_init(struct device_node *node);
375343325fSDinh Nguyen void socfpga_a10_gate_init(struct device_node *node);
3897259e99SSteffen Trumtrar 
3997259e99SSteffen Trumtrar struct socfpga_pll {
4097259e99SSteffen Trumtrar 	struct clk_gate	hw;
4197259e99SSteffen Trumtrar };
4297259e99SSteffen Trumtrar 
4397259e99SSteffen Trumtrar struct socfpga_gate_clk {
4497259e99SSteffen Trumtrar 	struct clk_gate hw;
4597259e99SSteffen Trumtrar 	char *parent_name;
4697259e99SSteffen Trumtrar 	u32 fixed_div;
4797259e99SSteffen Trumtrar 	void __iomem *div_reg;
4807afb8dbSDinh Nguyen 	void __iomem *bypass_reg;
495343325fSDinh Nguyen 	struct regmap *sys_mgr_base_addr;
5097259e99SSteffen Trumtrar 	u32 width;	/* only valid if div_reg != 0 */
5197259e99SSteffen Trumtrar 	u32 shift;	/* only valid if div_reg != 0 */
5207afb8dbSDinh Nguyen 	u32 bypass_shift;      /* only valid if bypass_reg != 0 */
5397259e99SSteffen Trumtrar };
5497259e99SSteffen Trumtrar 
5597259e99SSteffen Trumtrar struct socfpga_periph_clk {
5697259e99SSteffen Trumtrar 	struct clk_gate hw;
5797259e99SSteffen Trumtrar 	char *parent_name;
5897259e99SSteffen Trumtrar 	u32 fixed_div;
590691bb1bSDinh Nguyen 	void __iomem *div_reg;
6007afb8dbSDinh Nguyen 	void __iomem *bypass_reg;
610691bb1bSDinh Nguyen 	u32 width;      /* only valid if div_reg != 0 */
620691bb1bSDinh Nguyen 	u32 shift;      /* only valid if div_reg != 0 */
6307afb8dbSDinh Nguyen 	u32 bypass_shift;      /* only valid if bypass_reg != 0 */
6497259e99SSteffen Trumtrar };
6597259e99SSteffen Trumtrar 
6697259e99SSteffen Trumtrar #endif /* SOCFPGA_CLK_H */
67