162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0+ */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * PTP hardware clock driver for the IDT 82P33XXX family of clocks.
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2019 Integrated Device Technology, Inc., a Renesas Company.
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci#ifndef PTP_IDT82P33_H
862306a36Sopenharmony_ci#define PTP_IDT82P33_H
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#include <linux/ktime.h>
1162306a36Sopenharmony_ci#include <linux/mfd/idt82p33_reg.h>
1262306a36Sopenharmony_ci#include <linux/regmap.h>
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#define FW_FILENAME	"idt82p33xxx.bin"
1562306a36Sopenharmony_ci#define MAX_PHC_PLL	(2)
1662306a36Sopenharmony_ci#define MAX_TRIG_CLK	(3)
1762306a36Sopenharmony_ci#define MAX_PER_OUT	(11)
1862306a36Sopenharmony_ci#define TOD_BYTE_COUNT	(10)
1962306a36Sopenharmony_ci#define DCO_MAX_PPB     (92000)
2062306a36Sopenharmony_ci#define MAX_MEASURMENT_COUNT	(5)
2162306a36Sopenharmony_ci#define SNAP_THRESHOLD_NS	(10000)
2262306a36Sopenharmony_ci#define IMMEDIATE_SNAP_THRESHOLD_NS (50000)
2362306a36Sopenharmony_ci#define DDCO_THRESHOLD_NS	(5)
2462306a36Sopenharmony_ci#define IDT82P33_MAX_WRITE_COUNT	(512)
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci#define PLLMASK_ADDR_HI	0xFF
2762306a36Sopenharmony_ci#define PLLMASK_ADDR_LO	0xA5
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci#define PLL0_OUTMASK_ADDR_HI	0xFF
3062306a36Sopenharmony_ci#define PLL0_OUTMASK_ADDR_LO	0xB0
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci#define PLL1_OUTMASK_ADDR_HI	0xFF
3362306a36Sopenharmony_ci#define PLL1_OUTMASK_ADDR_LO	0xB2
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci#define PLL2_OUTMASK_ADDR_HI	0xFF
3662306a36Sopenharmony_ci#define PLL2_OUTMASK_ADDR_LO	0xB4
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci#define PLL3_OUTMASK_ADDR_HI	0xFF
3962306a36Sopenharmony_ci#define PLL3_OUTMASK_ADDR_LO	0xB6
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci#define DEFAULT_PLL_MASK	(0x01)
4262306a36Sopenharmony_ci#define DEFAULT_OUTPUT_MASK_PLL0	(0xc0)
4362306a36Sopenharmony_ci#define DEFAULT_OUTPUT_MASK_PLL1	DEFAULT_OUTPUT_MASK_PLL0
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci/**
4662306a36Sopenharmony_ci * @brief Maximum absolute value for write phase offset in nanoseconds
4762306a36Sopenharmony_ci */
4862306a36Sopenharmony_ci#define WRITE_PHASE_OFFSET_LIMIT (20000l)
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci/** @brief Phase offset resolution
5162306a36Sopenharmony_ci *
5262306a36Sopenharmony_ci *  DPLL phase offset = 10^15 fs / ( System Clock  * 2^13)
5362306a36Sopenharmony_ci *                    = 10^15 fs / ( 1638400000 * 2^23)
5462306a36Sopenharmony_ci *                    = 74.5058059692382 fs
5562306a36Sopenharmony_ci */
5662306a36Sopenharmony_ci#define IDT_T0DPLL_PHASE_RESOL 74506
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci/* PTP Hardware Clock interface */
5962306a36Sopenharmony_cistruct idt82p33_channel {
6062306a36Sopenharmony_ci	struct ptp_clock_info	caps;
6162306a36Sopenharmony_ci	struct ptp_clock	*ptp_clock;
6262306a36Sopenharmony_ci	struct idt82p33		*idt82p33;
6362306a36Sopenharmony_ci	enum pll_mode		pll_mode;
6462306a36Sopenharmony_ci	/* Workaround for TOD-to-output alignment issue */
6562306a36Sopenharmony_ci	struct delayed_work	adjtime_work;
6662306a36Sopenharmony_ci	s32			current_freq;
6762306a36Sopenharmony_ci	/* double dco mode */
6862306a36Sopenharmony_ci	bool			ddco;
6962306a36Sopenharmony_ci	u8			output_mask;
7062306a36Sopenharmony_ci	/* last input trigger for extts */
7162306a36Sopenharmony_ci	u8			tod_trigger;
7262306a36Sopenharmony_ci	bool			discard_next_extts;
7362306a36Sopenharmony_ci	u8			plln;
7462306a36Sopenharmony_ci	/* remember last tod_sts for extts */
7562306a36Sopenharmony_ci	u8			extts_tod_sts[TOD_BYTE_COUNT];
7662306a36Sopenharmony_ci	u16			dpll_tod_cnfg;
7762306a36Sopenharmony_ci	u16			dpll_tod_trigger;
7862306a36Sopenharmony_ci	u16			dpll_tod_sts;
7962306a36Sopenharmony_ci	u16			dpll_mode_cnfg;
8062306a36Sopenharmony_ci	u16			dpll_freq_cnfg;
8162306a36Sopenharmony_ci	u16			dpll_phase_cnfg;
8262306a36Sopenharmony_ci	u16			dpll_sync_cnfg;
8362306a36Sopenharmony_ci	u16			dpll_input_mode_cnfg;
8462306a36Sopenharmony_ci};
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_cistruct idt82p33 {
8762306a36Sopenharmony_ci	struct idt82p33_channel	channel[MAX_PHC_PLL];
8862306a36Sopenharmony_ci	struct device		*dev;
8962306a36Sopenharmony_ci	u8			pll_mask;
9062306a36Sopenharmony_ci	/* Polls for external time stamps */
9162306a36Sopenharmony_ci	u8			extts_mask;
9262306a36Sopenharmony_ci	bool			extts_single_shot;
9362306a36Sopenharmony_ci	struct delayed_work	extts_work;
9462306a36Sopenharmony_ci	/* Remember the ptp channel to report extts */
9562306a36Sopenharmony_ci	struct idt82p33_channel	*event_channel[MAX_PHC_PLL];
9662306a36Sopenharmony_ci	/* Mutex to protect operations from being interrupted */
9762306a36Sopenharmony_ci	struct mutex		*lock;
9862306a36Sopenharmony_ci	struct regmap		*regmap;
9962306a36Sopenharmony_ci	struct device		*mfd;
10062306a36Sopenharmony_ci	/* Overhead calculation for adjtime */
10162306a36Sopenharmony_ci	ktime_t			start_time;
10262306a36Sopenharmony_ci	int			calculate_overhead_flag;
10362306a36Sopenharmony_ci	s64			tod_write_overhead_ns;
10462306a36Sopenharmony_ci};
10562306a36Sopenharmony_ci
10662306a36Sopenharmony_ci/* firmware interface */
10762306a36Sopenharmony_cistruct idt82p33_fwrc {
10862306a36Sopenharmony_ci	u8 hiaddr;
10962306a36Sopenharmony_ci	u8 loaddr;
11062306a36Sopenharmony_ci	u8 value;
11162306a36Sopenharmony_ci	u8 reserved;
11262306a36Sopenharmony_ci} __packed;
11362306a36Sopenharmony_ci
11462306a36Sopenharmony_ci#endif /* PTP_IDT82P33_H */
115