xref: /openbmc/linux/drivers/ptp/ptp_idt82p33.h (revision 8dd3cdea)
1 /* SPDX-License-Identifier: GPL-2.0+ */
2 /*
3  * PTP hardware clock driver for the IDT 82P33XXX family of clocks.
4  *
5  * Copyright (C) 2019 Integrated Device Technology, Inc., a Renesas Company.
6  */
7 #ifndef PTP_IDT82P33_H
8 #define PTP_IDT82P33_H
9 
10 #include <linux/ktime.h>
11 #include <linux/mfd/idt82p33_reg.h>
12 #include <linux/regmap.h>
13 
14 #define FW_FILENAME	"idt82p33xxx.bin"
15 #define MAX_PHC_PLL	(2)
16 #define TOD_BYTE_COUNT	(10)
17 #define DCO_MAX_PPB     (92000)
18 #define MAX_MEASURMENT_COUNT	(5)
19 #define SNAP_THRESHOLD_NS	(10000)
20 #define IMMEDIATE_SNAP_THRESHOLD_NS (50000)
21 #define DDCO_THRESHOLD_NS	(5)
22 #define IDT82P33_MAX_WRITE_COUNT	(512)
23 #define PEROUT_ENABLE_OUTPUT_MASK	(0xdeadbeef)
24 
25 #define PLLMASK_ADDR_HI	0xFF
26 #define PLLMASK_ADDR_LO	0xA5
27 
28 #define PLL0_OUTMASK_ADDR_HI	0xFF
29 #define PLL0_OUTMASK_ADDR_LO	0xB0
30 
31 #define PLL1_OUTMASK_ADDR_HI	0xFF
32 #define PLL1_OUTMASK_ADDR_LO	0xB2
33 
34 #define PLL2_OUTMASK_ADDR_HI	0xFF
35 #define PLL2_OUTMASK_ADDR_LO	0xB4
36 
37 #define PLL3_OUTMASK_ADDR_HI	0xFF
38 #define PLL3_OUTMASK_ADDR_LO	0xB6
39 
40 #define DEFAULT_PLL_MASK	(0x01)
41 #define DEFAULT_OUTPUT_MASK_PLL0	(0xc0)
42 #define DEFAULT_OUTPUT_MASK_PLL1	DEFAULT_OUTPUT_MASK_PLL0
43 
44 /**
45  * @brief Maximum absolute value for write phase offset in femtoseconds
46  */
47 #define WRITE_PHASE_OFFSET_LIMIT (20000052084ll)
48 
49 /** @brief Phase offset resolution
50  *
51  *  DPLL phase offset = 10^15 fs / ( System Clock  * 2^13)
52  *                    = 10^15 fs / ( 1638400000 * 2^23)
53  *                    = 74.5058059692382 fs
54  */
55 #define IDT_T0DPLL_PHASE_RESOL 74506
56 
57 /* PTP Hardware Clock interface */
58 struct idt82p33_channel {
59 	struct ptp_clock_info	caps;
60 	struct ptp_clock	*ptp_clock;
61 	struct idt82p33		*idt82p33;
62 	enum pll_mode		pll_mode;
63 	s32			current_freq_ppb;
64 	u8			output_mask;
65 	u16			dpll_tod_cnfg;
66 	u16			dpll_tod_trigger;
67 	u16			dpll_tod_sts;
68 	u16			dpll_mode_cnfg;
69 	u16			dpll_freq_cnfg;
70 	u16			dpll_phase_cnfg;
71 	u16			dpll_sync_cnfg;
72 	u16			dpll_input_mode_cnfg;
73 };
74 
75 struct idt82p33 {
76 	struct idt82p33_channel	channel[MAX_PHC_PLL];
77 	struct device		*dev;
78 	u8			pll_mask;
79 	/* Mutex to protect operations from being interrupted */
80 	struct mutex		*lock;
81 	struct regmap		*regmap;
82 	struct device		*mfd;
83 	/* Overhead calculation for adjtime */
84 	ktime_t			start_time;
85 	int			calculate_overhead_flag;
86 	s64			tod_write_overhead_ns;
87 };
88 
89 /* firmware interface */
90 struct idt82p33_fwrc {
91 	u8 hiaddr;
92 	u8 loaddr;
93 	u8 value;
94 	u8 reserved;
95 } __packed;
96 
97 #endif /* PTP_IDT82P33_H */
98