Merge tag 'fs_for_v6.6-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/jack...
[platform/kernel/linux-starfive.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 MAX_TRIG_CLK    (3)
17 #define MAX_PER_OUT     (11)
18 #define TOD_BYTE_COUNT  (10)
19 #define DCO_MAX_PPB     (92000)
20 #define MAX_MEASURMENT_COUNT    (5)
21 #define SNAP_THRESHOLD_NS       (10000)
22 #define IMMEDIATE_SNAP_THRESHOLD_NS (50000)
23 #define DDCO_THRESHOLD_NS       (5)
24 #define IDT82P33_MAX_WRITE_COUNT        (512)
25
26 #define PLLMASK_ADDR_HI 0xFF
27 #define PLLMASK_ADDR_LO 0xA5
28
29 #define PLL0_OUTMASK_ADDR_HI    0xFF
30 #define PLL0_OUTMASK_ADDR_LO    0xB0
31
32 #define PLL1_OUTMASK_ADDR_HI    0xFF
33 #define PLL1_OUTMASK_ADDR_LO    0xB2
34
35 #define PLL2_OUTMASK_ADDR_HI    0xFF
36 #define PLL2_OUTMASK_ADDR_LO    0xB4
37
38 #define PLL3_OUTMASK_ADDR_HI    0xFF
39 #define PLL3_OUTMASK_ADDR_LO    0xB6
40
41 #define DEFAULT_PLL_MASK        (0x01)
42 #define DEFAULT_OUTPUT_MASK_PLL0        (0xc0)
43 #define DEFAULT_OUTPUT_MASK_PLL1        DEFAULT_OUTPUT_MASK_PLL0
44
45 /**
46  * @brief Maximum absolute value for write phase offset in nanoseconds
47  */
48 #define WRITE_PHASE_OFFSET_LIMIT (20000l)
49
50 /** @brief Phase offset resolution
51  *
52  *  DPLL phase offset = 10^15 fs / ( System Clock  * 2^13)
53  *                    = 10^15 fs / ( 1638400000 * 2^23)
54  *                    = 74.5058059692382 fs
55  */
56 #define IDT_T0DPLL_PHASE_RESOL 74506
57
58 /* PTP Hardware Clock interface */
59 struct idt82p33_channel {
60         struct ptp_clock_info   caps;
61         struct ptp_clock        *ptp_clock;
62         struct idt82p33         *idt82p33;
63         enum pll_mode           pll_mode;
64         /* Workaround for TOD-to-output alignment issue */
65         struct delayed_work     adjtime_work;
66         s32                     current_freq;
67         /* double dco mode */
68         bool                    ddco;
69         u8                      output_mask;
70         /* last input trigger for extts */
71         u8                      tod_trigger;
72         bool                    discard_next_extts;
73         u8                      plln;
74         /* remember last tod_sts for extts */
75         u8                      extts_tod_sts[TOD_BYTE_COUNT];
76         u16                     dpll_tod_cnfg;
77         u16                     dpll_tod_trigger;
78         u16                     dpll_tod_sts;
79         u16                     dpll_mode_cnfg;
80         u16                     dpll_freq_cnfg;
81         u16                     dpll_phase_cnfg;
82         u16                     dpll_sync_cnfg;
83         u16                     dpll_input_mode_cnfg;
84 };
85
86 struct idt82p33 {
87         struct idt82p33_channel channel[MAX_PHC_PLL];
88         struct device           *dev;
89         u8                      pll_mask;
90         /* Polls for external time stamps */
91         u8                      extts_mask;
92         bool                    extts_single_shot;
93         struct delayed_work     extts_work;
94         /* Remember the ptp channel to report extts */
95         struct idt82p33_channel *event_channel[MAX_PHC_PLL];
96         /* Mutex to protect operations from being interrupted */
97         struct mutex            *lock;
98         struct regmap           *regmap;
99         struct device           *mfd;
100         /* Overhead calculation for adjtime */
101         ktime_t                 start_time;
102         int                     calculate_overhead_flag;
103         s64                     tod_write_overhead_ns;
104 };
105
106 /* firmware interface */
107 struct idt82p33_fwrc {
108         u8 hiaddr;
109         u8 loaddr;
110         u8 value;
111         u8 reserved;
112 } __packed;
113
114 #endif /* PTP_IDT82P33_H */