aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/clk/si5324drv.h
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/clk/si5324drv.h')
-rw-r--r--drivers/clk/si5324drv.h100
1 files changed, 100 insertions, 0 deletions
diff --git a/drivers/clk/si5324drv.h b/drivers/clk/si5324drv.h
new file mode 100644
index 000000000000..28ea3050d5fb
--- /dev/null
+++ b/drivers/clk/si5324drv.h
@@ -0,0 +1,100 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Si5324 clock driver
+ *
+ * Copyright (C) 2017-2018 Xilinx, Inc.
+ */
+
+#ifndef SI5324DRV_H_
+#define SI5324DRV_H_
+
+#include <linux/types.h>
+
+/******************************************************************************
+ * User settable defines that depend on the specific board design.
+ * The defaults are for the Xilinx KC705 board.
+ *****************************************************************************/
+
+#define SI5324_XTAL_FREQ 114285000UL
+
+/******************************************************************************
+ * Defines independent on the specific board design. Should not be changed.
+ *****************************************************************************/
+
+#define SI5324_SUCCESS 0 /*< Operation was successful */
+#define SI5324_ERR_IIC -1 /*< IIC error occurred */
+#define SI5324_ERR_FREQ -2 /*< Could not calculate frequency setting */
+#define SI5324_ERR_PARM -3 /*< Invalid parameter */
+
+#define SI5324_CLKSRC_CLK1 1 /*< Use clock input 1 */
+#define SI5324_CLKSRC_CLK2 2 /*< Use clock input 2 */
+#define SI5324_CLKSRC_XTAL 3 /*< Use crystal (free running mode) */
+
+#define SI5324_FOSC_MIN 4850000000UL /*< Min oscillator frequency */
+#define SI5324_FOSC_MAX 5670000000UL /*< Max oscillator frequency */
+#define SI5324_F3_MIN 10000 /*< Min phase detector frequency */
+#define SI5324_F3_MAX 2000000 /*< Max phase detector frequency */
+#define SI5324_FIN_MIN 2000 /*< Min input frequency */
+#define SI5324_FIN_MAX 710000000UL /*< Max input frequency */
+#define SI5324_FOUT_MIN 2000 /*< Min output frequency */
+#define SI5324_FOUT_MAX 945000000UL /*< Max output frequency */
+
+#define SI5324_N1_HS_MIN 6
+#define SI5324_N1_HS_MAX 11
+#define SI5324_NC_LS_MIN 1
+#define SI5324_NC_LS_MAX 0x100000
+#define SI5324_N2_HS_MIN 4
+#define SI5324_N2_HS_MAX 11
+#define SI5324_N2_LS_MIN 2 /* even values only */
+#define SI5324_N2_LS_MAX 0x100000
+#define SI5324_N3_MIN 1
+#define SI5324_N3_MAX 0x080000
+#define SI5324_FIN_FOUT_SHIFT 28
+
+struct si5324_settingst {
+ /* high-speed output divider */
+ u32 n1_hs_min;
+ u32 n1_hs_max;
+ u32 n1_hs;
+
+ /* low-speed output divider for clkout1 */
+ u32 nc1_ls_min;
+ u32 nc1_ls_max;
+ u32 nc1_ls;
+
+ /* low-speed output divider for clkout2 */
+ u32 nc2_ls_min;
+ u32 nc2_ls_max;
+ u32 nc2_ls;
+
+ /* high-speed feedback divider (PLL multiplier) */
+ u32 n2_hs;
+ /* low-speed feedback divider (PLL multiplier) */
+ u32 n2_ls_min;
+ u32 n2_ls_max;
+ u32 n2_ls;
+
+ /* input divider for clk1 */
+ u32 n31_min;
+ u32 n31_max;
+ u32 n31;
+
+ u64 fin;
+ u64 fout;
+ u64 fosc;
+ u64 best_delta_fout;
+ u64 best_fout;
+ u32 best_n1_hs;
+ u32 best_nc1_ls;
+ u32 best_n2_hs;
+ u32 best_n2_ls;
+ u32 best_n3;
+};
+
+int si5324_calcfreqsettings(u32 clkinfreq, u32 clkoutfreq, u32 *clkactual,
+ u8 *n1_hs, u32 *ncn_ls, u8 *n2_hs,
+ u32 *n2_ls, u32 *n3n, u8 *bwsel);
+void si5324_rate_approx(u64 f, u64 md, u32 *num, u32 *denom);
+int si5324_calc_ncls_limits(struct si5324_settingst *settings);
+
+#endif /* SI5324DRV_H_ */