18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Copyright (C) 2015 Broadcom Corporation
48c2ecf20Sopenharmony_ci */
58c2ecf20Sopenharmony_ci
68c2ecf20Sopenharmony_ci#ifndef _LINUX_BCM_PHY_LIB_H
78c2ecf20Sopenharmony_ci#define _LINUX_BCM_PHY_LIB_H
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ci#include <linux/brcmphy.h>
108c2ecf20Sopenharmony_ci#include <linux/phy.h>
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ci/* 28nm only register definitions */
138c2ecf20Sopenharmony_ci#define MISC_ADDR(base, channel)	base, channel
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_ci#define DSP_TAP10			MISC_ADDR(0x0a, 0)
168c2ecf20Sopenharmony_ci#define PLL_PLLCTRL_1			MISC_ADDR(0x32, 1)
178c2ecf20Sopenharmony_ci#define PLL_PLLCTRL_2			MISC_ADDR(0x32, 2)
188c2ecf20Sopenharmony_ci#define PLL_PLLCTRL_4			MISC_ADDR(0x33, 0)
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_ci#define AFE_RXCONFIG_0			MISC_ADDR(0x38, 0)
218c2ecf20Sopenharmony_ci#define AFE_RXCONFIG_1			MISC_ADDR(0x38, 1)
228c2ecf20Sopenharmony_ci#define AFE_RXCONFIG_2			MISC_ADDR(0x38, 2)
238c2ecf20Sopenharmony_ci#define AFE_RX_LP_COUNTER		MISC_ADDR(0x38, 3)
248c2ecf20Sopenharmony_ci#define AFE_TX_CONFIG			MISC_ADDR(0x39, 0)
258c2ecf20Sopenharmony_ci#define AFE_VDCA_ICTRL_0		MISC_ADDR(0x39, 1)
268c2ecf20Sopenharmony_ci#define AFE_VDAC_OTHERS_0		MISC_ADDR(0x39, 3)
278c2ecf20Sopenharmony_ci#define AFE_HPF_TRIM_OTHERS		MISC_ADDR(0x3a, 0)
288c2ecf20Sopenharmony_ci
298c2ecf20Sopenharmony_ci
308c2ecf20Sopenharmony_ciint __bcm_phy_write_exp(struct phy_device *phydev, u16 reg, u16 val);
318c2ecf20Sopenharmony_ciint __bcm_phy_read_exp(struct phy_device *phydev, u16 reg);
328c2ecf20Sopenharmony_ciint __bcm_phy_modify_exp(struct phy_device *phydev, u16 reg, u16 mask, u16 set);
338c2ecf20Sopenharmony_ciint bcm_phy_write_exp(struct phy_device *phydev, u16 reg, u16 val);
348c2ecf20Sopenharmony_ciint bcm_phy_read_exp(struct phy_device *phydev, u16 reg);
358c2ecf20Sopenharmony_ciint bcm_phy_modify_exp(struct phy_device *phydev, u16 reg, u16 mask, u16 set);
368c2ecf20Sopenharmony_ci
378c2ecf20Sopenharmony_cistatic inline int bcm_phy_write_exp_sel(struct phy_device *phydev,
388c2ecf20Sopenharmony_ci					u16 reg, u16 val)
398c2ecf20Sopenharmony_ci{
408c2ecf20Sopenharmony_ci	return bcm_phy_write_exp(phydev, reg | MII_BCM54XX_EXP_SEL_ER, val);
418c2ecf20Sopenharmony_ci}
428c2ecf20Sopenharmony_ci
438c2ecf20Sopenharmony_ciint bcm54xx_auxctl_write(struct phy_device *phydev, u16 regnum, u16 val);
448c2ecf20Sopenharmony_ciint bcm54xx_auxctl_read(struct phy_device *phydev, u16 regnum);
458c2ecf20Sopenharmony_ci
468c2ecf20Sopenharmony_ciint bcm_phy_write_misc(struct phy_device *phydev,
478c2ecf20Sopenharmony_ci		       u16 reg, u16 chl, u16 value);
488c2ecf20Sopenharmony_ciint bcm_phy_read_misc(struct phy_device *phydev,
498c2ecf20Sopenharmony_ci		      u16 reg, u16 chl);
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_ciint bcm_phy_write_shadow(struct phy_device *phydev, u16 shadow,
528c2ecf20Sopenharmony_ci			 u16 val);
538c2ecf20Sopenharmony_ciint bcm_phy_read_shadow(struct phy_device *phydev, u16 shadow);
548c2ecf20Sopenharmony_ci
558c2ecf20Sopenharmony_ciint __bcm_phy_write_rdb(struct phy_device *phydev, u16 rdb, u16 val);
568c2ecf20Sopenharmony_ciint bcm_phy_write_rdb(struct phy_device *phydev, u16 rdb, u16 val);
578c2ecf20Sopenharmony_ciint __bcm_phy_read_rdb(struct phy_device *phydev, u16 rdb);
588c2ecf20Sopenharmony_ciint bcm_phy_read_rdb(struct phy_device *phydev, u16 rdb);
598c2ecf20Sopenharmony_ciint __bcm_phy_modify_rdb(struct phy_device *phydev, u16 rdb, u16 mask,
608c2ecf20Sopenharmony_ci			 u16 set);
618c2ecf20Sopenharmony_ciint bcm_phy_modify_rdb(struct phy_device *phydev, u16 rdb, u16 mask,
628c2ecf20Sopenharmony_ci		       u16 set);
638c2ecf20Sopenharmony_ci
648c2ecf20Sopenharmony_ciint bcm_phy_ack_intr(struct phy_device *phydev);
658c2ecf20Sopenharmony_ciint bcm_phy_config_intr(struct phy_device *phydev);
668c2ecf20Sopenharmony_ci
678c2ecf20Sopenharmony_ciint bcm_phy_enable_apd(struct phy_device *phydev, bool dll_pwr_down);
688c2ecf20Sopenharmony_ci
698c2ecf20Sopenharmony_ciint bcm_phy_set_eee(struct phy_device *phydev, bool enable);
708c2ecf20Sopenharmony_ci
718c2ecf20Sopenharmony_ciint bcm_phy_downshift_get(struct phy_device *phydev, u8 *count);
728c2ecf20Sopenharmony_ci
738c2ecf20Sopenharmony_ciint bcm_phy_downshift_set(struct phy_device *phydev, u8 count);
748c2ecf20Sopenharmony_ci
758c2ecf20Sopenharmony_ciint bcm_phy_get_sset_count(struct phy_device *phydev);
768c2ecf20Sopenharmony_civoid bcm_phy_get_strings(struct phy_device *phydev, u8 *data);
778c2ecf20Sopenharmony_civoid bcm_phy_get_stats(struct phy_device *phydev, u64 *shadow,
788c2ecf20Sopenharmony_ci		       struct ethtool_stats *stats, u64 *data);
798c2ecf20Sopenharmony_civoid bcm_phy_r_rc_cal_reset(struct phy_device *phydev);
808c2ecf20Sopenharmony_ciint bcm_phy_28nm_a0b0_afe_config_init(struct phy_device *phydev);
818c2ecf20Sopenharmony_ciint bcm_phy_enable_jumbo(struct phy_device *phydev);
828c2ecf20Sopenharmony_ci
838c2ecf20Sopenharmony_ciint bcm_phy_cable_test_get_status_rdb(struct phy_device *phydev,
848c2ecf20Sopenharmony_ci				      bool *finished);
858c2ecf20Sopenharmony_ciint bcm_phy_cable_test_start_rdb(struct phy_device *phydev);
868c2ecf20Sopenharmony_ciint bcm_phy_cable_test_start(struct phy_device *phydev);
878c2ecf20Sopenharmony_ciint bcm_phy_cable_test_get_status(struct phy_device *phydev, bool *finished);
888c2ecf20Sopenharmony_ci
898c2ecf20Sopenharmony_ci#endif /* _LINUX_BCM_PHY_LIB_H */
90