12c81f335SRussell King (Oracle) // SPDX-License-Identifier: GPL-2.0-only 22c81f335SRussell King (Oracle) #include "stmmac.h" 32c81f335SRussell King (Oracle) #include "stmmac_pcs.h" 42c81f335SRussell King (Oracle) 5*eed68edaSRussell King (Oracle) static int dwmac_integrated_pcs_enable(struct phylink_pcs *pcs) 6*eed68edaSRussell King (Oracle) { 7*eed68edaSRussell King (Oracle) struct stmmac_pcs *spcs = phylink_pcs_to_stmmac_pcs(pcs); 8*eed68edaSRussell King (Oracle) 9*eed68edaSRussell King (Oracle) stmmac_mac_irq_modify(spcs->priv, 0, spcs->int_mask); 10*eed68edaSRussell King (Oracle) 11*eed68edaSRussell King (Oracle) return 0; 12*eed68edaSRussell King (Oracle) } 13*eed68edaSRussell King (Oracle) 14*eed68edaSRussell King (Oracle) static void dwmac_integrated_pcs_disable(struct phylink_pcs *pcs) 15*eed68edaSRussell King (Oracle) { 16*eed68edaSRussell King (Oracle) struct stmmac_pcs *spcs = phylink_pcs_to_stmmac_pcs(pcs); 17*eed68edaSRussell King (Oracle) 18*eed68edaSRussell King (Oracle) stmmac_mac_irq_modify(spcs->priv, spcs->int_mask, 0); 19*eed68edaSRussell King (Oracle) } 20*eed68edaSRussell King (Oracle) 212c81f335SRussell King (Oracle) static void dwmac_integrated_pcs_get_state(struct phylink_pcs *pcs, 222c81f335SRussell King (Oracle) unsigned int neg_mode, 232c81f335SRussell King (Oracle) struct phylink_link_state *state) 242c81f335SRussell King (Oracle) { 252c81f335SRussell King (Oracle) state->link = false; 262c81f335SRussell King (Oracle) } 272c81f335SRussell King (Oracle) 282c81f335SRussell King (Oracle) static int dwmac_integrated_pcs_config(struct phylink_pcs *pcs, 292c81f335SRussell King (Oracle) unsigned int neg_mode, 302c81f335SRussell King (Oracle) phy_interface_t interface, 312c81f335SRussell King (Oracle) const unsigned long *advertising, 322c81f335SRussell King (Oracle) bool permit_pause_to_mac) 332c81f335SRussell King (Oracle) { 342c81f335SRussell King (Oracle) struct stmmac_pcs *spcs = phylink_pcs_to_stmmac_pcs(pcs); 352c81f335SRussell King (Oracle) 362c81f335SRussell King (Oracle) dwmac_ctrl_ane(spcs->base, 0, 1, spcs->priv->hw->reverse_sgmii_enable); 372c81f335SRussell King (Oracle) 382c81f335SRussell King (Oracle) return 0; 392c81f335SRussell King (Oracle) } 402c81f335SRussell King (Oracle) 412c81f335SRussell King (Oracle) static const struct phylink_pcs_ops dwmac_integrated_pcs_ops = { 42*eed68edaSRussell King (Oracle) .pcs_enable = dwmac_integrated_pcs_enable, 43*eed68edaSRussell King (Oracle) .pcs_disable = dwmac_integrated_pcs_disable, 442c81f335SRussell King (Oracle) .pcs_get_state = dwmac_integrated_pcs_get_state, 452c81f335SRussell King (Oracle) .pcs_config = dwmac_integrated_pcs_config, 462c81f335SRussell King (Oracle) }; 472c81f335SRussell King (Oracle) 48*eed68edaSRussell King (Oracle) int stmmac_integrated_pcs_init(struct stmmac_priv *priv, unsigned int offset, 49*eed68edaSRussell King (Oracle) u32 int_mask) 502c81f335SRussell King (Oracle) { 512c81f335SRussell King (Oracle) struct stmmac_pcs *spcs; 522c81f335SRussell King (Oracle) 532c81f335SRussell King (Oracle) spcs = devm_kzalloc(priv->device, sizeof(*spcs), GFP_KERNEL); 542c81f335SRussell King (Oracle) if (!spcs) 552c81f335SRussell King (Oracle) return -ENOMEM; 562c81f335SRussell King (Oracle) 572c81f335SRussell King (Oracle) spcs->priv = priv; 582c81f335SRussell King (Oracle) spcs->base = priv->ioaddr + offset; 59*eed68edaSRussell King (Oracle) spcs->int_mask = int_mask; 602c81f335SRussell King (Oracle) spcs->pcs.ops = &dwmac_integrated_pcs_ops; 612c81f335SRussell King (Oracle) 622c81f335SRussell King (Oracle) __set_bit(PHY_INTERFACE_MODE_SGMII, spcs->pcs.supported_interfaces); 632c81f335SRussell King (Oracle) 642c81f335SRussell King (Oracle) priv->integrated_pcs = spcs; 652c81f335SRussell King (Oracle) 662c81f335SRussell King (Oracle) return 0; 672c81f335SRussell King (Oracle) } 68