#ifndef __LINUX_CLK_ZYNQMP_H_
#define __LINUX_CLK_ZYNQMP_H_
#include <linux/spinlock.h>
#include <linux/firmware/xlnx-zynqmp.h>
#define ZYNQMP_CLK_SET_RATE_GATE BIT(0)
#define ZYNQMP_CLK_SET_PARENT_GATE BIT(1)
#define ZYNQMP_CLK_SET_RATE_PARENT BIT(2)
#define ZYNQMP_CLK_IGNORE_UNUSED BIT(3)
#define ZYNQMP_CLK_SET_RATE_NO_REPARENT BIT(7)
#define ZYNQMP_CLK_IS_CRITICAL BIT(11)
#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)
#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 {
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