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