xref: /openbmc/linux/drivers/ptp/ptp_idt82p33.h (revision 2612e3bbc0386368a850140a6c9b990cd496a5ec)
157a10d8cSMin Li /* SPDX-License-Identifier: GPL-2.0+ */
257a10d8cSMin Li /*
357a10d8cSMin Li  * PTP hardware clock driver for the IDT 82P33XXX family of clocks.
457a10d8cSMin Li  *
557a10d8cSMin Li  * Copyright (C) 2019 Integrated Device Technology, Inc., a Renesas Company.
657a10d8cSMin Li  */
757a10d8cSMin Li #ifndef PTP_IDT82P33_H
857a10d8cSMin Li #define PTP_IDT82P33_H
957a10d8cSMin Li 
1057a10d8cSMin Li #include <linux/ktime.h>
11013a3e7cSMin Li #include <linux/mfd/idt82p33_reg.h>
12013a3e7cSMin Li #include <linux/regmap.h>
1357a10d8cSMin Li 
1457a10d8cSMin Li #define FW_FILENAME	"idt82p33xxx.bin"
1557a10d8cSMin Li #define MAX_PHC_PLL	(2)
16ad3cc776SMin Li #define MAX_TRIG_CLK	(3)
17ad3cc776SMin Li #define MAX_PER_OUT	(11)
1857a10d8cSMin Li #define TOD_BYTE_COUNT	(10)
19013a3e7cSMin Li #define DCO_MAX_PPB     (92000)
2057a10d8cSMin Li #define MAX_MEASURMENT_COUNT	(5)
21013a3e7cSMin Li #define SNAP_THRESHOLD_NS	(10000)
22013a3e7cSMin Li #define IMMEDIATE_SNAP_THRESHOLD_NS (50000)
23013a3e7cSMin Li #define DDCO_THRESHOLD_NS	(5)
24e4c6eb68SMin Li #define IDT82P33_MAX_WRITE_COUNT	(512)
2557a10d8cSMin Li 
2657a10d8cSMin Li #define PLLMASK_ADDR_HI	0xFF
2757a10d8cSMin Li #define PLLMASK_ADDR_LO	0xA5
2857a10d8cSMin Li 
2957a10d8cSMin Li #define PLL0_OUTMASK_ADDR_HI	0xFF
3057a10d8cSMin Li #define PLL0_OUTMASK_ADDR_LO	0xB0
3157a10d8cSMin Li 
3257a10d8cSMin Li #define PLL1_OUTMASK_ADDR_HI	0xFF
3357a10d8cSMin Li #define PLL1_OUTMASK_ADDR_LO	0xB2
3457a10d8cSMin Li 
3557a10d8cSMin Li #define PLL2_OUTMASK_ADDR_HI	0xFF
3657a10d8cSMin Li #define PLL2_OUTMASK_ADDR_LO	0xB4
3757a10d8cSMin Li 
3857a10d8cSMin Li #define PLL3_OUTMASK_ADDR_HI	0xFF
3957a10d8cSMin Li #define PLL3_OUTMASK_ADDR_LO	0xB6
4057a10d8cSMin Li 
4157a10d8cSMin Li #define DEFAULT_PLL_MASK	(0x01)
4257a10d8cSMin Li #define DEFAULT_OUTPUT_MASK_PLL0	(0xc0)
4357a10d8cSMin Li #define DEFAULT_OUTPUT_MASK_PLL1	DEFAULT_OUTPUT_MASK_PLL0
4457a10d8cSMin Li 
45013a3e7cSMin Li /**
46*e156e4d2SRahul Rameshbabu  * @brief Maximum absolute value for write phase offset in nanoseconds
47013a3e7cSMin Li  */
48*e156e4d2SRahul Rameshbabu #define WRITE_PHASE_OFFSET_LIMIT (20000l)
49013a3e7cSMin Li 
50013a3e7cSMin Li /** @brief Phase offset resolution
51013a3e7cSMin Li  *
52013a3e7cSMin Li  *  DPLL phase offset = 10^15 fs / ( System Clock  * 2^13)
53013a3e7cSMin Li  *                    = 10^15 fs / ( 1638400000 * 2^23)
54013a3e7cSMin Li  *                    = 74.5058059692382 fs
55013a3e7cSMin Li  */
56013a3e7cSMin Li #define IDT_T0DPLL_PHASE_RESOL 74506
57013a3e7cSMin Li 
5857a10d8cSMin Li /* PTP Hardware Clock interface */
5957a10d8cSMin Li struct idt82p33_channel {
6057a10d8cSMin Li 	struct ptp_clock_info	caps;
6157a10d8cSMin Li 	struct ptp_clock	*ptp_clock;
6257a10d8cSMin Li 	struct idt82p33		*idt82p33;
6357a10d8cSMin Li 	enum pll_mode		pll_mode;
64ad3cc776SMin Li 	/* Workaround for TOD-to-output alignment issue */
65ad3cc776SMin Li 	struct delayed_work	adjtime_work;
66ad3cc776SMin Li 	s32			current_freq;
67ad3cc776SMin Li 	/* double dco mode */
68ad3cc776SMin Li 	bool			ddco;
6957a10d8cSMin Li 	u8			output_mask;
70ad3cc776SMin Li 	/* last input trigger for extts */
71ad3cc776SMin Li 	u8			tod_trigger;
72ad3cc776SMin Li 	bool			discard_next_extts;
73ad3cc776SMin Li 	u8			plln;
74ad3cc776SMin Li 	/* remember last tod_sts for extts */
75ad3cc776SMin Li 	u8			extts_tod_sts[TOD_BYTE_COUNT];
7657a10d8cSMin Li 	u16			dpll_tod_cnfg;
7757a10d8cSMin Li 	u16			dpll_tod_trigger;
7857a10d8cSMin Li 	u16			dpll_tod_sts;
7957a10d8cSMin Li 	u16			dpll_mode_cnfg;
8057a10d8cSMin Li 	u16			dpll_freq_cnfg;
8157a10d8cSMin Li 	u16			dpll_phase_cnfg;
8257a10d8cSMin Li 	u16			dpll_sync_cnfg;
8357a10d8cSMin Li 	u16			dpll_input_mode_cnfg;
8457a10d8cSMin Li };
8557a10d8cSMin Li 
8657a10d8cSMin Li struct idt82p33 {
8757a10d8cSMin Li 	struct idt82p33_channel	channel[MAX_PHC_PLL];
88013a3e7cSMin Li 	struct device		*dev;
8957a10d8cSMin Li 	u8			pll_mask;
90ad3cc776SMin Li 	/* Polls for external time stamps */
91ad3cc776SMin Li 	u8			extts_mask;
92ad3cc776SMin Li 	bool			extts_single_shot;
93ad3cc776SMin Li 	struct delayed_work	extts_work;
94ad3cc776SMin Li 	/* Remember the ptp channel to report extts */
95ad3cc776SMin Li 	struct idt82p33_channel	*event_channel[MAX_PHC_PLL];
96013a3e7cSMin Li 	/* Mutex to protect operations from being interrupted */
97013a3e7cSMin Li 	struct mutex		*lock;
98013a3e7cSMin Li 	struct regmap		*regmap;
99013a3e7cSMin Li 	struct device		*mfd;
100013a3e7cSMin Li 	/* Overhead calculation for adjtime */
10157a10d8cSMin Li 	ktime_t			start_time;
10257a10d8cSMin Li 	int			calculate_overhead_flag;
10357a10d8cSMin Li 	s64			tod_write_overhead_ns;
10457a10d8cSMin Li };
10557a10d8cSMin Li 
10657a10d8cSMin Li /* firmware interface */
10757a10d8cSMin Li struct idt82p33_fwrc {
10857a10d8cSMin Li 	u8 hiaddr;
10957a10d8cSMin Li 	u8 loaddr;
11057a10d8cSMin Li 	u8 value;
11157a10d8cSMin Li 	u8 reserved;
11257a10d8cSMin Li } __packed;
11357a10d8cSMin Li 
11457a10d8cSMin Li #endif /* PTP_IDT82P33_H */
115