// SPDX-License-Identifier: GPL-2.0+
#include <linux/bitfield.h>
#include <linux/bitmap.h>
#include <linux/mfd/syscon.h>
#include <linux/module.h>
#include <linux/nvmem-consumer.h>
#include <linux/pinctrl/consumer.h>
#include <linux/phy.h>
#include <linux/regmap.h>
#define MTK_GPHY_ID_MT7981 0x03a29461
#define MTK_GPHY_ID_MT7988 0x03a29481
#define MTK_EXT_PAGE_ACCESS 0x1f
#define MTK_PHY_PAGE_STANDARD 0x0000
#define MTK_PHY_PAGE_EXTENDED_3 0x0003
#define MTK_PHY_LPI_REG_14 0x14
#define MTK_PHY_LPI_WAKE_TIMER_1000_MASK GENMASK(8, 0)
#define MTK_PHY_LPI_REG_1c 0x1c
#define MTK_PHY_SMI_DET_ON_THRESH_MASK GENMASK(13, 8)
#define MTK_PHY_PAGE_EXTENDED_2A30 0x2a30
#define MTK_PHY_PAGE_EXTENDED_52B5 0x52b5
#define ANALOG_INTERNAL_OPERATION_MAX_US 20
#define TXRESERVE_MIN 0
#define TXRESERVE_MAX 7
#define MTK_PHY_ANARG_RG 0x10
#define MTK_PHY_TCLKOFFSET_MASK GENMASK(12, 8)
/* Registers on MDIO_MMD_VEND1 */
#define MTK_PHY_TXVLD_DA_RG 0x12
#define MTK_PHY_DA_TX_I2MPB_A_GBE_MASK GENMASK(15, 10)
#define MTK_PHY_DA_TX_I2MPB_A_TBT_MASK GENMASK(5, 0)
#define MTK_PHY_TX_I2MPB_TEST_MODE_A2 0x16
#define MTK_PHY_DA_TX_I2MPB_A_HBT_MASK GENMASK(15, 10)
#define MTK_PHY_DA_TX_I2MPB_A_TST_MASK GENMASK(5, 0)
#define MTK_PHY_TX_I2MPB_TEST_MODE_B1 0x17
#define MTK_PHY_DA_TX_I2MPB_B_GBE_MASK GENMASK(13, 8)
#define MTK_PHY_DA_TX_I2MPB_B_TBT_MASK GENMASK(5, 0)
#define MTK_PHY_TX_I2MPB_TEST_MODE_B2 0x18
#define MTK_PHY_DA_TX_I2MPB_B_HBT_MASK GENMASK(13, 8)
#define MTK_PHY_DA_TX_I2MPB_B_TST_MASK GENMASK(5, 0)
#define MTK_PHY_TX_I2MPB_TEST_MODE_C1 0x19
#define MTK_PHY_DA_TX_I2MPB_C_GBE_MASK GENMASK(13, 8)
#define MTK_PHY_DA_TX_I2MPB_C_TBT_MASK GENMASK(5, 0)
#define MTK_PHY_TX_I2MPB_TEST_MODE_C2 0x20
#define MTK_PHY_DA_TX_I2MPB_C_HBT_MASK GENMASK(13, 8)
#define MTK_PHY_DA_TX_I2MPB_C_TST_MASK GENMASK(5, 0)
#define MTK_PHY_TX_I2MPB_TEST_MODE_D1 0x21
#define MTK_PHY_DA_TX_I2MPB_D_GBE_MASK GENMASK(13, 8)
#define MTK_PHY_DA_TX_I2MPB_D_TBT_MASK GENMASK(5, 0)
#define MTK_PHY_TX_I2MPB_TEST_MODE_D2 0x22
#define MTK_PHY_DA_TX_I2MPB_D_HBT_MASK GENMASK(13, 8)
#define MTK_PHY_DA_TX_I2MPB_D_TST_MASK GENMASK(5, 0)
#define MTK_PHY_RXADC_CTRL_RG7 0xc6
#define MTK_PHY_DA_AD_BUF_BIAS_LP_MASK GENMASK(9, 8)
#define MTK_PHY_RXADC_CTRL_RG9 0xc8
#define MTK_PHY_DA_RX_PSBN_TBT_MASK GENMASK(14, 12)
#define MTK_PHY_DA_RX_PSBN_HBT_MASK GENMASK(10, 8)
#define MTK_PHY_DA_RX_PSBN_GBE_MASK GENMASK(6, 4)
#define MTK_PHY_DA_RX_PSBN_LP_MASK GENMASK(2, 0)
#define MTK_PHY_LDO_OUTPUT_V 0xd7
#define MTK_PHY_RG_ANA_CAL_RG0 0xdb
#define MTK_PHY_RG_CAL_CKINV BIT(12)
#define MTK_PHY_RG_ANA_CALEN BIT(8)
#define MTK_PHY_RG_ZCALEN_A BIT(0)
#define MTK_PHY_RG_ANA_CAL_RG1 0xdc
#define MTK_PHY_RG_ZCALEN_B BIT(12)
#define MTK_PHY_RG_ZCALEN_C BIT(8)
#define MTK_PHY_RG_ZCALEN_D BIT(4)
#define MTK_PHY_RG_TXVOS_CALEN BIT(0)
#define MTK_PHY_RG_ANA_CAL_RG5 0xe0
#define MTK_PHY_RG_REXT_TRIM_MASK GENMASK(13, 8)
#define MTK_PHY_RG_TX_FILTER 0xfe
#define MTK_PHY_RG_LPI_PCS_DSP_CTRL_REG120 0x120
#define MTK_PHY_LPI_SIG_EN_LO_THRESH1000_MASK GENMASK(12, 8)
#define MTK_PHY_LPI_SIG_EN_HI_THRESH1000_MASK GENMASK(4, 0)
#define MTK_PHY_RG_LPI_PCS_DSP_CTRL_REG122 0x122
#define MTK_PHY_LPI_NORM_MSE_HI_THRESH1000_MASK GENMASK(7, 0)
#define MTK_PHY_RG_TESTMUX_ADC_CTRL 0x144
#define MTK_PHY_RG_TXEN_DIG_MASK GENMASK(5, 5)
#define MTK_PHY_RG_CR_TX_AMP_OFFSET_A_B 0x172
#define MTK_PHY_CR_TX_AMP_OFFSET_A_MASK GENMASK(13, 8)
#define MTK_PHY_CR_TX_AMP_OFFSET_B_MASK GENMASK(6, 0)
#define MTK_PHY_RG_CR_TX_AMP_OFFSET_C_D 0x173
#define MTK_PHY_CR_TX_AMP_OFFSET_C_MASK GENMASK(13, 8)
#define MTK_PHY_CR_TX_AMP_OFFSET_D_MASK GENMASK(6, 0)
#define MTK_PHY_RG_AD_CAL_COMP 0x17a
#define MTK_PHY_AD_CAL_COMP_OUT_SHIFT (8)
#define MTK_PHY_RG_AD_CAL_CLK 0x17b
#define MTK_PHY_DA_CAL_CLK BIT(0)
#define MTK_PHY_RG_AD_CALIN 0x17c
#define MTK_PHY_DA_CALIN_FLAG BIT(0)
#define MTK_PHY_RG_DASN_DAC_IN0_A 0x17d
#define MTK_PHY_DASN_DAC_IN0_A_MASK GENMASK(9, 0)
#define MTK_PHY_RG_DASN_DAC_IN0_B 0x17e
#define MTK_PHY_DASN_DAC_IN0_B_MASK GENMASK(9, 0)
#define MTK_PHY_RG_DASN_DAC_IN0_C 0x17f
#define MTK_PHY_DASN_DAC_IN0_C_MASK GENMASK(9, 0)
#define MTK_PHY_RG_DASN_DAC_IN0_D 0x180
#define MTK_PHY_DASN_DAC_IN0_D_MASK GENMASK(9, 0)
#define MTK_PHY_RG_DASN_DAC_IN1_A 0x181
#define MTK_PHY_DASN_DAC_IN1_A_MASK GENMASK(9, 0)
#define MTK_PHY_RG_DASN_DAC_IN1_B 0x182
#define MTK_PHY_DASN_DAC_IN1_B_MASK GENMASK(9, 0)
#define MTK_PHY_RG_DASN_DAC_IN1_C 0x183
#define MTK_PHY_DASN_DAC_IN1_C_MASK GENMASK(9, 0)
#define MTK_PHY_RG_DASN_DAC_IN1_D 0x184
#define MTK_PHY_DASN_DAC_IN1_D_MASK GENMASK(9, 0)
#define MTK_PHY_RG_DEV1E_REG19b 0x19b
#define MTK_PHY_BYPASS_DSP_LPI_READY BIT(8)
#define MTK_PHY_RG_LP_IIR2_K1_L 0x22a
#define MTK_PHY_RG_LP_IIR2_K1_U 0x22b
#define MTK_PHY_RG_LP_IIR2_K2_L 0x22c
#define MTK_PHY_RG_LP_IIR2_K2_U 0x22d
#define MTK_PHY_RG_LP_IIR2_K3_L 0x22e
#define MTK_PHY_RG_LP_IIR2_K3_U 0x22f
#define MTK_PHY_RG_LP_IIR2_K4_L 0x230
#define MTK_PHY_RG_LP_IIR2_K4_U 0x231
#define MTK_PHY_RG_LP_IIR2_K5_L 0x232
#define MTK_PHY_RG_LP_IIR2_K5_U 0x233
#define MTK_PHY_RG_DEV1E_REG234 0x234
#define MTK_PHY_TR_OPEN_LOOP_EN_MASK GENMASK(0, 0)
#define MTK_PHY_LPF_X_AVERAGE_MASK GENMASK(7, 4)
#define MTK_PHY_TR_LP_IIR_EEE_EN BIT(12)
#define MTK_PHY_RG_LPF_CNT_VAL 0x235
#define MTK_PHY_RG_DEV1E_REG238 0x238
#define MTK_PHY_LPI_SLV_SEND_TX_TIMER_MASK GENMASK(8, 0)
#define MTK_PHY_LPI_SLV_SEND_TX_EN BIT(12)
#define MTK_PHY_RG_DEV1E_REG239 0x239
#define MTK_PHY_LPI_SEND_LOC_TIMER_MASK GENMASK(8, 0)
#define MTK_PHY_LPI_TXPCS_LOC_RCV BIT(12)
#define MTK_PHY_RG_DEV1E_REG27C 0x27c
#define MTK_PHY_VGASTATE_FFE_THR_ST1_MASK GENMASK(12, 8)
#define MTK_PHY_RG_DEV1E_REG27D 0x27d
#define MTK_PHY_VGASTATE_FFE_THR_ST2_MASK GENMASK(4, 0)
#define MTK_PHY_RG_DEV1E_REG2C7 0x2c7
#define MTK_PHY_MAX_GAIN_MASK GENMASK(4, 0)
#define MTK_PHY_MIN_GAIN_MASK GENMASK(12, 8)
#define MTK_PHY_RG_DEV1E_REG2D1 0x2d1
#define MTK_PHY_VCO_SLICER_THRESH_BITS_HIGH_EEE_MASK GENMASK(7, 0)
#define MTK_PHY_LPI_SKIP_SD_SLV_TR BIT(8)
#define MTK_PHY_LPI_TR_READY BIT(9)
#define MTK_PHY_LPI_VCO_EEE_STG0_EN BIT(10)
#define MTK_PHY_RG_DEV1E_REG323 0x323
#define MTK_PHY_EEE_WAKE_MAS_INT_DC BIT(0)
#define MTK_PHY_EEE_WAKE_SLV_INT_DC BIT(4)
#define MTK_PHY_RG_DEV1E_REG324 0x324
#define MTK_PHY_SMI_DETCNT_MAX_MASK GENMASK(5, 0)
#define MTK_PHY_SMI_DET_MAX_EN BIT(8)
#define MTK_PHY_RG_DEV1E_REG326 0x326
#define MTK_PHY_LPI_MODE_SD_ON BIT(0)
#define MTK_PHY_RESET_RANDUPD_CNT BIT(1)
#define MTK_PHY_TREC_UPDATE_ENAB_CLR BIT(
|