| /* SPDX-License-Identifier: GPL-2.0 */ |
| /* |
| * Copyright (C) 2016-2018 Xilinx |
| */ |
| |
| #ifndef __LINUX_CLK_ZYNQMP_H_ |
| #define __LINUX_CLK_ZYNQMP_H_ |
| |
| #include <linux/spinlock.h> |
| |
| #include <linux/firmware/xlnx-zynqmp.h> |
| |
| /* Common Flags */ |
| /* must be gated across rate change */ |
| #define ZYNQMP_CLK_SET_RATE_GATE BIT(0) |
| /* must be gated across re-parent */ |
| #define ZYNQMP_CLK_SET_PARENT_GATE BIT(1) |
| /* propagate rate change up one level */ |
| #define ZYNQMP_CLK_SET_RATE_PARENT BIT(2) |
| /* do not gate even if unused */ |
| #define ZYNQMP_CLK_IGNORE_UNUSED BIT(3) |
| /* don't re-parent on rate change */ |
| #define ZYNQMP_CLK_SET_RATE_NO_REPARENT BIT(7) |
| /* do not gate, ever */ |
| #define ZYNQMP_CLK_IS_CRITICAL BIT(11) |
| |
| /* Type Flags for divider clock */ |
| #define ZYNQMP_CLK_DIVIDER_ONE_BASED BIT(0) |
| #define ZYNQMP_CLK_DIVIDER_POWER_OF_TWO BIT(1) |
| #define ZYNQMP_CLK_DIVIDER_ALLOW_ZERO BIT(2) |
| #define ZYNQMP_CLK_DIVIDER_HIWORD_MASK BIT(3) |
| #define ZYNQMP_CLK_DIVIDER_ROUND_CLOSEST BIT(4) |
| #define ZYNQMP_CLK_DIVIDER_READ_ONLY BIT(5) |
| #define ZYNQMP_CLK_DIVIDER_MAX_AT_ZERO BIT(6) |
| |
| /* Type Flags for mux clock */ |
| #define ZYNQMP_CLK_MUX_INDEX_ONE BIT(0) |
| #define ZYNQMP_CLK_MUX_INDEX_BIT BIT(1) |
| #define ZYNQMP_CLK_MUX_HIWORD_MASK BIT(2) |
| #define ZYNQMP_CLK_MUX_READ_ONLY BIT(3) |
| #define ZYNQMP_CLK_MUX_ROUND_CLOSEST BIT(4) |
| #define ZYNQMP_CLK_MUX_BIG_ENDIAN BIT(5) |
| |
| enum topology_type { |
| TYPE_INVALID, |
| TYPE_MUX, |
| TYPE_PLL, |
| TYPE_FIXEDFACTOR, |
| TYPE_DIV1, |
| TYPE_DIV2, |
| TYPE_GATE, |
| }; |
| |
| /** |
| * struct clock_topology - Clock topology |
| * @type: Type of topology |
| * @flag: Topology flags |
| * @type_flag: Topology type specific flag |
| * @custom_type_flag: Topology type specific custom flag |
| */ |
| struct clock_topology { |
| u32 type; |
| u32 flag; |
| u32 type_flag; |
| u8 custom_type_flag; |
| }; |
| |
| unsigned long zynqmp_clk_map_common_ccf_flags(const u32 zynqmp_flag); |
| |
| struct clk_hw *zynqmp_clk_register_pll(const char *name, u32 clk_id, |
| const char * const *parents, |
| u8 num_parents, |
| const struct clock_topology *nodes); |
| |
| struct clk_hw *zynqmp_clk_register_gate(const char *name, u32 clk_id, |
| const char * const *parents, |
| u8 num_parents, |
| const struct clock_topology *nodes); |
| |
| struct clk_hw *zynqmp_clk_register_divider(const char *name, |
| u32 clk_id, |
| const char * const *parents, |
| u8 num_parents, |
| const struct clock_topology *nodes); |
| |
| struct clk_hw *zynqmp_clk_register_mux(const char *name, u32 clk_id, |
| const char * const *parents, |
| u8 num_parents, |
| const struct clock_topology *nodes); |
| |
| struct clk_hw *zynqmp_clk_register_fixed_factor(const char *name, |
| u32 clk_id, |
| const char * const *parents, |
| u8 num_parents, |
| const struct clock_topology *nodes); |
| |
| #endif |