#ifndef __STMMAC_PCS_H__
#define __STMMAC_PCS_H__
#include <linux/phylink.h>
#include <linux/slab.h>
#include <linux/io.h>
#include "common.h"
#define GMAC_AN_CTRL(x) (x)
#define GMAC_AN_CTRL_RAN BIT_U32(9)
#define GMAC_AN_CTRL_ANE BIT_U32(12)
#define GMAC_AN_CTRL_ELE BIT_U32(14)
#define GMAC_AN_CTRL_ECD BIT_U32(16)
#define GMAC_AN_CTRL_LR BIT_U32(17)
#define GMAC_AN_CTRL_SGMRAL BIT_U32(18)
struct stmmac_priv;
struct stmmac_pcs_info {
unsigned int pcs_offset;
unsigned int rgsmii_offset;
u32 rgsmii_status_mask;
u32 int_mask;
};
struct stmmac_pcs {
struct stmmac_priv *priv;
void __iomem *base;
void __iomem *rgsmii;
u32 rgsmii_status_mask;
u32 int_mask;
struct phylink_pcs pcs;
bool support_tbi_rtbi;
};
static inline struct stmmac_pcs *
phylink_pcs_to_stmmac_pcs(struct phylink_pcs *pcs)
{
return container_of(pcs, struct stmmac_pcs, pcs);
}
void stmmac_integrated_pcs_irq(struct stmmac_priv *priv, u32 status,
struct stmmac_extra_stats *x);
int stmmac_integrated_pcs_get_phy_intf_sel(struct phylink_pcs *pcs,
phy_interface_t interface);
int stmmac_integrated_pcs_init(struct stmmac_priv *priv,
const struct stmmac_pcs_info *pcs_info);
static inline void dwmac_ctrl_ane(void __iomem *ioaddr, u32 reg, bool ane,
bool srgmi_ral)
{
u32 value = readl(ioaddr + GMAC_AN_CTRL(reg));
if (ane)
value |= GMAC_AN_CTRL_ANE | GMAC_AN_CTRL_RAN;
else
value &= ~GMAC_AN_CTRL_ANE;
if (srgmi_ral)
value |= GMAC_AN_CTRL_SGMRAL;
writel(value, ioaddr + GMAC_AN_CTRL(reg));
}
#endif