162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) 2015 Broadcom Corporation 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#ifndef _LINUX_BCM_PHY_LIB_H 762306a36Sopenharmony_ci#define _LINUX_BCM_PHY_LIB_H 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <linux/brcmphy.h> 1062306a36Sopenharmony_ci#include <linux/phy.h> 1162306a36Sopenharmony_ci#include <linux/interrupt.h> 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_cistruct ethtool_wolinfo; 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci/* 28nm only register definitions */ 1662306a36Sopenharmony_ci#define MISC_ADDR(base, channel) base, channel 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#define DSP_TAP10 MISC_ADDR(0x0a, 0) 1962306a36Sopenharmony_ci#define PLL_PLLCTRL_1 MISC_ADDR(0x32, 1) 2062306a36Sopenharmony_ci#define PLL_PLLCTRL_2 MISC_ADDR(0x32, 2) 2162306a36Sopenharmony_ci#define PLL_PLLCTRL_4 MISC_ADDR(0x33, 0) 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci#define AFE_RXCONFIG_0 MISC_ADDR(0x38, 0) 2462306a36Sopenharmony_ci#define AFE_RXCONFIG_1 MISC_ADDR(0x38, 1) 2562306a36Sopenharmony_ci#define AFE_RXCONFIG_2 MISC_ADDR(0x38, 2) 2662306a36Sopenharmony_ci#define AFE_RX_LP_COUNTER MISC_ADDR(0x38, 3) 2762306a36Sopenharmony_ci#define AFE_TX_CONFIG MISC_ADDR(0x39, 0) 2862306a36Sopenharmony_ci#define AFE_VDCA_ICTRL_0 MISC_ADDR(0x39, 1) 2962306a36Sopenharmony_ci#define AFE_VDAC_OTHERS_0 MISC_ADDR(0x39, 3) 3062306a36Sopenharmony_ci#define AFE_HPF_TRIM_OTHERS MISC_ADDR(0x3a, 0) 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ciint __bcm_phy_write_exp(struct phy_device *phydev, u16 reg, u16 val); 3462306a36Sopenharmony_ciint __bcm_phy_read_exp(struct phy_device *phydev, u16 reg); 3562306a36Sopenharmony_ciint __bcm_phy_modify_exp(struct phy_device *phydev, u16 reg, u16 mask, u16 set); 3662306a36Sopenharmony_ciint bcm_phy_write_exp(struct phy_device *phydev, u16 reg, u16 val); 3762306a36Sopenharmony_ciint bcm_phy_read_exp(struct phy_device *phydev, u16 reg); 3862306a36Sopenharmony_ciint bcm_phy_modify_exp(struct phy_device *phydev, u16 reg, u16 mask, u16 set); 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_cistatic inline int bcm_phy_write_exp_sel(struct phy_device *phydev, 4162306a36Sopenharmony_ci u16 reg, u16 val) 4262306a36Sopenharmony_ci{ 4362306a36Sopenharmony_ci return bcm_phy_write_exp(phydev, reg | MII_BCM54XX_EXP_SEL_ER, val); 4462306a36Sopenharmony_ci} 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_cistatic inline int bcm_phy_read_exp_sel(struct phy_device *phydev, u16 reg) 4762306a36Sopenharmony_ci{ 4862306a36Sopenharmony_ci return bcm_phy_read_exp(phydev, reg | MII_BCM54XX_EXP_SEL_ER); 4962306a36Sopenharmony_ci} 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ciint bcm54xx_auxctl_write(struct phy_device *phydev, u16 regnum, u16 val); 5262306a36Sopenharmony_ciint bcm54xx_auxctl_read(struct phy_device *phydev, u16 regnum); 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ciint bcm_phy_write_misc(struct phy_device *phydev, 5562306a36Sopenharmony_ci u16 reg, u16 chl, u16 value); 5662306a36Sopenharmony_ciint bcm_phy_read_misc(struct phy_device *phydev, 5762306a36Sopenharmony_ci u16 reg, u16 chl); 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ciint bcm_phy_write_shadow(struct phy_device *phydev, u16 shadow, 6062306a36Sopenharmony_ci u16 val); 6162306a36Sopenharmony_ciint bcm_phy_read_shadow(struct phy_device *phydev, u16 shadow); 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ciint __bcm_phy_write_rdb(struct phy_device *phydev, u16 rdb, u16 val); 6462306a36Sopenharmony_ciint bcm_phy_write_rdb(struct phy_device *phydev, u16 rdb, u16 val); 6562306a36Sopenharmony_ciint __bcm_phy_read_rdb(struct phy_device *phydev, u16 rdb); 6662306a36Sopenharmony_ciint bcm_phy_read_rdb(struct phy_device *phydev, u16 rdb); 6762306a36Sopenharmony_ciint __bcm_phy_modify_rdb(struct phy_device *phydev, u16 rdb, u16 mask, 6862306a36Sopenharmony_ci u16 set); 6962306a36Sopenharmony_ciint bcm_phy_modify_rdb(struct phy_device *phydev, u16 rdb, u16 mask, 7062306a36Sopenharmony_ci u16 set); 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ciint bcm_phy_ack_intr(struct phy_device *phydev); 7362306a36Sopenharmony_ciint bcm_phy_config_intr(struct phy_device *phydev); 7462306a36Sopenharmony_ciirqreturn_t bcm_phy_handle_interrupt(struct phy_device *phydev); 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ciint bcm_phy_enable_apd(struct phy_device *phydev, bool dll_pwr_down); 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ciint bcm_phy_set_eee(struct phy_device *phydev, bool enable); 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ciint bcm_phy_downshift_get(struct phy_device *phydev, u8 *count); 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ciint bcm_phy_downshift_set(struct phy_device *phydev, u8 count); 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ciint bcm_phy_get_sset_count(struct phy_device *phydev); 8562306a36Sopenharmony_civoid bcm_phy_get_strings(struct phy_device *phydev, u8 *data); 8662306a36Sopenharmony_civoid bcm_phy_get_stats(struct phy_device *phydev, u64 *shadow, 8762306a36Sopenharmony_ci struct ethtool_stats *stats, u64 *data); 8862306a36Sopenharmony_civoid bcm_phy_r_rc_cal_reset(struct phy_device *phydev); 8962306a36Sopenharmony_ciint bcm_phy_28nm_a0b0_afe_config_init(struct phy_device *phydev); 9062306a36Sopenharmony_ciint bcm_phy_enable_jumbo(struct phy_device *phydev); 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ciint bcm_phy_cable_test_get_status_rdb(struct phy_device *phydev, 9362306a36Sopenharmony_ci bool *finished); 9462306a36Sopenharmony_ciint bcm_phy_cable_test_start_rdb(struct phy_device *phydev); 9562306a36Sopenharmony_ciint bcm_phy_cable_test_start(struct phy_device *phydev); 9662306a36Sopenharmony_ciint bcm_phy_cable_test_get_status(struct phy_device *phydev, bool *finished); 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ci#if IS_ENABLED(CONFIG_BCM_NET_PHYPTP) 9962306a36Sopenharmony_cistruct bcm_ptp_private *bcm_ptp_probe(struct phy_device *phydev); 10062306a36Sopenharmony_civoid bcm_ptp_config_init(struct phy_device *phydev); 10162306a36Sopenharmony_civoid bcm_ptp_stop(struct bcm_ptp_private *priv); 10262306a36Sopenharmony_ci#else 10362306a36Sopenharmony_cistatic inline struct bcm_ptp_private *bcm_ptp_probe(struct phy_device *phydev) 10462306a36Sopenharmony_ci{ 10562306a36Sopenharmony_ci return NULL; 10662306a36Sopenharmony_ci} 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_cistatic inline void bcm_ptp_config_init(struct phy_device *phydev) 10962306a36Sopenharmony_ci{ 11062306a36Sopenharmony_ci} 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_cistatic inline void bcm_ptp_stop(struct bcm_ptp_private *priv) 11362306a36Sopenharmony_ci{ 11462306a36Sopenharmony_ci} 11562306a36Sopenharmony_ci#endif 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_ciint bcm_phy_set_wol(struct phy_device *phydev, struct ethtool_wolinfo *wol); 11862306a36Sopenharmony_civoid bcm_phy_get_wol(struct phy_device *phydev, struct ethtool_wolinfo *wol); 11962306a36Sopenharmony_ciirqreturn_t bcm_phy_wol_isr(int irq, void *dev_id); 12062306a36Sopenharmony_ci 12162306a36Sopenharmony_ciint bcm_phy_led_brightness_set(struct phy_device *phydev, 12262306a36Sopenharmony_ci u8 index, enum led_brightness value); 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_ci#endif /* _LINUX_BCM_PHY_LIB_H */ 125