Merge tag 'mips_5.18' of git://git.kernel.org/pub/scm/linux/kernel/git/mips/linux
[linux-2.6-microblaze.git] / drivers / ptp / ptp_idt82p33.h
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 */