Lines Matching full:xpcs

4  * Synopsys DesignWare XPCS helpers
11 #include <linux/pcs/pcs-xpcs.h>
17 #include "pcs-xpcs.h"
114 int (*pma_config)(struct dw_xpcs *xpcs);
124 xpcs_find_compat(struct dw_xpcs *xpcs, phy_interface_t interface) in xpcs_find_compat() argument
128 for (compat = xpcs->desc->compat; compat->supported; compat++) in xpcs_find_compat()
135 struct phylink_pcs *xpcs_to_phylink_pcs(struct dw_xpcs *xpcs) in xpcs_to_phylink_pcs() argument
137 return &xpcs->pcs; in xpcs_to_phylink_pcs()
141 int xpcs_get_an_mode(struct dw_xpcs *xpcs, phy_interface_t interface) in xpcs_get_an_mode() argument
145 compat = xpcs_find_compat(xpcs, interface); in xpcs_get_an_mode()
168 int xpcs_read(struct dw_xpcs *xpcs, int dev, u32 reg) in xpcs_read() argument
170 return mdiodev_c45_read(xpcs->mdiodev, dev, reg); in xpcs_read()
173 int xpcs_write(struct dw_xpcs *xpcs, int dev, u32 reg, u16 val) in xpcs_write() argument
175 return mdiodev_c45_write(xpcs->mdiodev, dev, reg, val); in xpcs_write()
178 int xpcs_modify(struct dw_xpcs *xpcs, int dev, u32 reg, u16 mask, u16 set) in xpcs_modify() argument
180 return mdiodev_c45_modify(xpcs->mdiodev, dev, reg, mask, set); in xpcs_modify()
183 static int xpcs_modify_changed(struct dw_xpcs *xpcs, int dev, u32 reg, in xpcs_modify_changed() argument
186 return mdiodev_c45_modify_changed(xpcs->mdiodev, dev, reg, mask, set); in xpcs_modify_changed()
189 static int xpcs_read_vendor(struct dw_xpcs *xpcs, int dev, u32 reg) in xpcs_read_vendor() argument
191 return xpcs_read(xpcs, dev, DW_VENDOR | reg); in xpcs_read_vendor()
194 static int xpcs_write_vendor(struct dw_xpcs *xpcs, int dev, int reg, in xpcs_write_vendor() argument
197 return xpcs_write(xpcs, dev, DW_VENDOR | reg, val); in xpcs_write_vendor()
200 static int xpcs_modify_vendor(struct dw_xpcs *xpcs, int dev, int reg, u16 mask, in xpcs_modify_vendor() argument
203 return xpcs_modify(xpcs, dev, DW_VENDOR | reg, mask, set); in xpcs_modify_vendor()
206 int xpcs_read_vpcs(struct dw_xpcs *xpcs, int reg) in xpcs_read_vpcs() argument
208 return xpcs_read_vendor(xpcs, MDIO_MMD_PCS, reg); in xpcs_read_vpcs()
211 int xpcs_write_vpcs(struct dw_xpcs *xpcs, int reg, u16 val) in xpcs_write_vpcs() argument
213 return xpcs_write_vendor(xpcs, MDIO_MMD_PCS, reg, val); in xpcs_write_vpcs()
216 static int xpcs_modify_vpcs(struct dw_xpcs *xpcs, int reg, u16 mask, u16 val) in xpcs_modify_vpcs() argument
218 return xpcs_modify_vendor(xpcs, MDIO_MMD_PCS, reg, mask, val); in xpcs_modify_vpcs()
221 static int xpcs_poll_reset(struct dw_xpcs *xpcs, int dev) in xpcs_poll_reset() argument
227 50000, 600000, true, xpcs, dev, MII_BMCR); in xpcs_poll_reset()
234 static int xpcs_soft_reset(struct dw_xpcs *xpcs, in xpcs_soft_reset() argument
253 ret = xpcs_write(xpcs, dev, MII_BMCR, BMCR_RESET); in xpcs_soft_reset()
257 return xpcs_poll_reset(xpcs, dev); in xpcs_soft_reset()
266 static int xpcs_read_fault_c73(struct dw_xpcs *xpcs, in xpcs_read_fault_c73() argument
273 xpcs_warn(xpcs, state, "Link fault condition detected!\n"); in xpcs_read_fault_c73()
277 ret = xpcs_read(xpcs, MDIO_MMD_PCS, MDIO_STAT2); in xpcs_read_fault_c73()
282 xpcs_warn(xpcs, state, "Receiver fault detected!\n"); in xpcs_read_fault_c73()
284 xpcs_warn(xpcs, state, "Transmitter fault detected!\n"); in xpcs_read_fault_c73()
286 ret = xpcs_read_vendor(xpcs, MDIO_MMD_PCS, DW_VR_XS_PCS_DIG_STS); in xpcs_read_fault_c73()
291 xpcs_warn(xpcs, state, "FIFO fault condition detected!\n"); in xpcs_read_fault_c73()
295 ret = xpcs_read(xpcs, MDIO_MMD_PCS, MDIO_PCS_10GBRT_STAT1); in xpcs_read_fault_c73()
300 xpcs_warn(xpcs, state, "Link is not locked!\n"); in xpcs_read_fault_c73()
302 ret = xpcs_read(xpcs, MDIO_MMD_PCS, MDIO_PCS_10GBRT_STAT2); in xpcs_read_fault_c73()
307 xpcs_warn(xpcs, state, "Link has errors!\n"); in xpcs_read_fault_c73()
314 static void xpcs_link_up_usxgmii(struct dw_xpcs *xpcs, int speed) in xpcs_link_up_usxgmii() argument
342 ret = xpcs_modify_vpcs(xpcs, MDIO_CTRL1, DW_USXGMII_EN, DW_USXGMII_EN); in xpcs_link_up_usxgmii()
346 ret = xpcs_modify(xpcs, MDIO_MMD_VEND2, MII_BMCR, DW_USXGMII_SS_MASK, in xpcs_link_up_usxgmii()
351 ret = xpcs_modify_vpcs(xpcs, MDIO_CTRL1, DW_USXGMII_RST, in xpcs_link_up_usxgmii()
359 dev_err(&xpcs->mdiodev->dev, "%s: XPCS access returned %pe\n", in xpcs_link_up_usxgmii()
363 static int _xpcs_config_aneg_c73(struct dw_xpcs *xpcs, in _xpcs_config_aneg_c73() argument
368 /* By default, in USXGMII mode XPCS operates at 10G baud and in _xpcs_config_aneg_c73()
381 ret = xpcs_write(xpcs, MDIO_MMD_AN, DW_SR_AN_ADV3, adv); in _xpcs_config_aneg_c73()
394 ret = xpcs_write(xpcs, MDIO_MMD_AN, DW_SR_AN_ADV2, adv); in _xpcs_config_aneg_c73()
405 return xpcs_write(xpcs, MDIO_MMD_AN, DW_SR_AN_ADV1, adv); in _xpcs_config_aneg_c73()
408 static int xpcs_config_aneg_c73(struct dw_xpcs *xpcs, in xpcs_config_aneg_c73() argument
413 ret = _xpcs_config_aneg_c73(xpcs, compat); in xpcs_config_aneg_c73()
417 return xpcs_modify(xpcs, MDIO_MMD_AN, MDIO_CTRL1, in xpcs_config_aneg_c73()
422 static int xpcs_aneg_done_c73(struct dw_xpcs *xpcs, in xpcs_aneg_done_c73() argument
429 ret = xpcs_read(xpcs, MDIO_MMD_AN, MDIO_AN_LPA); in xpcs_aneg_done_c73()
435 xpcs_config_aneg_c73(xpcs, compat); in xpcs_aneg_done_c73()
445 static int xpcs_read_lpa_c73(struct dw_xpcs *xpcs, in xpcs_read_lpa_c73() argument
460 ret = xpcs_read(xpcs, MDIO_MMD_AN, MDIO_AN_LPA + i); in xpcs_read_lpa_c73()
472 static int xpcs_get_max_xlgmii_speed(struct dw_xpcs *xpcs, in xpcs_get_max_xlgmii_speed() argument
526 static void xpcs_resolve_pma(struct dw_xpcs *xpcs, in xpcs_resolve_pma() argument
537 state->speed = xpcs_get_max_xlgmii_speed(xpcs, state); in xpcs_resolve_pma()
550 struct dw_xpcs *xpcs; in xpcs_validate() local
553 xpcs = phylink_pcs_to_xpcs(pcs); in xpcs_validate()
554 compat = xpcs_find_compat(xpcs, state->interface); in xpcs_validate()
573 struct dw_xpcs *xpcs = phylink_pcs_to_xpcs(pcs); in xpcs_inband_caps() local
576 compat = xpcs_find_compat(xpcs, interface); in xpcs_inband_caps()
597 static void xpcs_get_interfaces(struct dw_xpcs *xpcs, unsigned long *interfaces) in xpcs_get_interfaces() argument
601 for (compat = xpcs->desc->compat; compat->supported; compat++) in xpcs_get_interfaces()
605 int xpcs_config_eee(struct dw_xpcs *xpcs, int mult_fact_100ns, int enable) in xpcs_config_eee() argument
624 ret = xpcs_modify(xpcs, MDIO_MMD_VEND2, DW_VR_MII_EEE_MCTRL0, mask, in xpcs_config_eee()
629 return xpcs_modify(xpcs, MDIO_MMD_VEND2, DW_VR_MII_EEE_MCTRL1, in xpcs_config_eee()
637 struct dw_xpcs *xpcs = phylink_pcs_to_xpcs(pcs); in xpcs_pre_config() local
641 if (!xpcs->need_reset) in xpcs_pre_config()
644 compat = xpcs_find_compat(xpcs, interface); in xpcs_pre_config()
646 dev_err(&xpcs->mdiodev->dev, "unsupported interface %s\n", in xpcs_pre_config()
651 ret = xpcs_soft_reset(xpcs, compat); in xpcs_pre_config()
653 dev_err(&xpcs->mdiodev->dev, "soft reset failed: %pe\n", in xpcs_pre_config()
656 xpcs->need_reset = false; in xpcs_pre_config()
659 static int xpcs_config_aneg_c37_sgmii(struct dw_xpcs *xpcs, in xpcs_config_aneg_c37_sgmii() argument
670 * DW xPCS used with DW EQoS MAC is always MAC side SGMII. in xpcs_config_aneg_c37_sgmii()
683 mdio_ctrl = xpcs_read(xpcs, MDIO_MMD_VEND2, MII_BMCR); in xpcs_config_aneg_c37_sgmii()
688 ret = xpcs_write(xpcs, MDIO_MMD_VEND2, MII_BMCR, in xpcs_config_aneg_c37_sgmii()
698 if (xpcs->info.pma == WX_TXGBE_XPCS_PMA_10G_ID) { in xpcs_config_aneg_c37_sgmii()
709 ret = xpcs_modify(xpcs, MDIO_MMD_VEND2, DW_VR_MII_AN_CTRL, mask, val); in xpcs_config_aneg_c37_sgmii()
719 if (xpcs->info.pma == WX_TXGBE_XPCS_PMA_10G_ID) { in xpcs_config_aneg_c37_sgmii()
724 ret = xpcs_modify(xpcs, MDIO_MMD_VEND2, DW_VR_MII_DIG_CTRL1, mask, val); in xpcs_config_aneg_c37_sgmii()
729 ret = xpcs_write(xpcs, MDIO_MMD_VEND2, MII_BMCR, in xpcs_config_aneg_c37_sgmii()
735 static int xpcs_config_aneg_c37_1000basex(struct dw_xpcs *xpcs, in xpcs_config_aneg_c37_1000basex() argument
751 mdio_ctrl = xpcs_read(xpcs, MDIO_MMD_VEND2, MII_BMCR); in xpcs_config_aneg_c37_1000basex()
756 ret = xpcs_write(xpcs, MDIO_MMD_VEND2, MII_BMCR, in xpcs_config_aneg_c37_1000basex()
766 if (!xpcs->pcs.poll) { in xpcs_config_aneg_c37_1000basex()
771 ret = xpcs_modify(xpcs, MDIO_MMD_VEND2, DW_VR_MII_AN_CTRL, mask, val); in xpcs_config_aneg_c37_1000basex()
781 ret = xpcs_modify_changed(xpcs, MDIO_MMD_VEND2, in xpcs_config_aneg_c37_1000basex()
790 ret = xpcs_write(xpcs, MDIO_MMD_VEND2, DW_VR_MII_AN_INTR_STS, 0); in xpcs_config_aneg_c37_1000basex()
795 ret = xpcs_write(xpcs, MDIO_MMD_VEND2, MII_BMCR, in xpcs_config_aneg_c37_1000basex()
804 static int xpcs_config_2500basex(struct dw_xpcs *xpcs) in xpcs_config_2500basex() argument
808 ret = xpcs_modify(xpcs, MDIO_MMD_VEND2, DW_VR_MII_DIG_CTRL1, in xpcs_config_2500basex()
815 return xpcs_modify(xpcs, MDIO_MMD_VEND2, MII_BMCR, in xpcs_config_2500basex()
820 static int xpcs_do_config(struct dw_xpcs *xpcs, phy_interface_t interface, in xpcs_do_config() argument
827 compat = xpcs_find_compat(xpcs, interface); in xpcs_do_config()
831 if (xpcs->info.pma == WX_TXGBE_XPCS_PMA_10G_ID) { in xpcs_do_config()
832 ret = txgbe_xpcs_switch_mode(xpcs, interface); in xpcs_do_config()
841 xpcs_write_vpcs(xpcs, DW_VR_XS_PCS_DIG_CTRL1, in xpcs_do_config()
850 ret = xpcs_config_aneg_c73(xpcs, compat); in xpcs_do_config()
856 ret = xpcs_config_aneg_c37_sgmii(xpcs, neg_mode); in xpcs_do_config()
861 ret = xpcs_config_aneg_c37_1000basex(xpcs, neg_mode, in xpcs_do_config()
867 ret = xpcs_config_2500basex(xpcs); in xpcs_do_config()
876 ret = compat->pma_config(xpcs); in xpcs_do_config()
889 struct dw_xpcs *xpcs = phylink_pcs_to_xpcs(pcs); in xpcs_config() local
891 return xpcs_do_config(xpcs, interface, advertising, neg_mode); in xpcs_config()
894 static int xpcs_get_state_c73(struct dw_xpcs *xpcs, in xpcs_get_state_c73() argument
907 pcs_stat1 = xpcs_read(xpcs, MDIO_MMD_PCS, MDIO_STAT1); in xpcs_get_state_c73()
917 ret = xpcs_read_fault_c73(xpcs, state, pcs_stat1); in xpcs_get_state_c73()
919 ret = xpcs_soft_reset(xpcs, compat); in xpcs_get_state_c73()
925 return xpcs_do_config(xpcs, state->interface, NULL, in xpcs_get_state_c73()
940 an_stat1 = xpcs_read(xpcs, MDIO_MMD_AN, MDIO_STAT1); in xpcs_get_state_c73()
946 state->an_complete = xpcs_aneg_done_c73(xpcs, state, compat, in xpcs_get_state_c73()
953 ret = xpcs_read_lpa_c73(xpcs, state, an_stat1); in xpcs_get_state_c73()
961 xpcs_resolve_pma(xpcs, state); in xpcs_get_state_c73()
967 static int xpcs_get_state_c37_sgmii(struct dw_xpcs *xpcs, in xpcs_get_state_c37_sgmii() argument
981 ret = xpcs_read(xpcs, MDIO_MMD_VEND2, DW_VR_MII_AN_INTR_STS); in xpcs_get_state_c37_sgmii()
1007 speed = xpcs_read(xpcs, MDIO_MMD_VEND2, MII_BMCR); in xpcs_get_state_c37_sgmii()
1019 duplex = xpcs_read(xpcs, MDIO_MMD_VEND2, MII_ADVERTISE); in xpcs_get_state_c37_sgmii()
1028 xpcs_write(xpcs, MDIO_MMD_VEND2, DW_VR_MII_AN_INTR_STS, 0); in xpcs_get_state_c37_sgmii()
1034 static int xpcs_get_state_c37_1000basex(struct dw_xpcs *xpcs, in xpcs_get_state_c37_1000basex() argument
1045 lpa = xpcs_read(xpcs, MDIO_MMD_VEND2, MII_LPA); in xpcs_get_state_c37_1000basex()
1049 bmsr = xpcs_read(xpcs, MDIO_MMD_VEND2, MII_BMSR); in xpcs_get_state_c37_1000basex()
1054 if (!xpcs->pcs.poll) { in xpcs_get_state_c37_1000basex()
1057 an_intr = xpcs_read(xpcs, MDIO_MMD_VEND2, DW_VR_MII_AN_INTR_STS); in xpcs_get_state_c37_1000basex()
1060 xpcs_write(xpcs, MDIO_MMD_VEND2, DW_VR_MII_AN_INTR_STS, an_intr); in xpcs_get_state_c37_1000basex()
1070 static int xpcs_get_state_2500basex(struct dw_xpcs *xpcs, in xpcs_get_state_2500basex() argument
1075 ret = xpcs_read(xpcs, MDIO_MMD_VEND2, MII_BMSR); in xpcs_get_state_2500basex()
1095 struct dw_xpcs *xpcs = phylink_pcs_to_xpcs(pcs); in xpcs_get_state() local
1099 compat = xpcs_find_compat(xpcs, state->interface); in xpcs_get_state()
1105 phylink_mii_c45_pcs_get_state(xpcs->mdiodev, state); in xpcs_get_state()
1108 ret = xpcs_get_state_c73(xpcs, state, compat); in xpcs_get_state()
1110 dev_err(&xpcs->mdiodev->dev, "%s returned %pe\n", in xpcs_get_state()
1114 ret = xpcs_get_state_c37_sgmii(xpcs, state); in xpcs_get_state()
1116 dev_err(&xpcs->mdiodev->dev, "%s returned %pe\n", in xpcs_get_state()
1120 ret = xpcs_get_state_c37_1000basex(xpcs, neg_mode, state); in xpcs_get_state()
1122 dev_err(&xpcs->mdiodev->dev, "%s returned %pe\n", in xpcs_get_state()
1126 ret = xpcs_get_state_2500basex(xpcs, state); in xpcs_get_state()
1128 dev_err(&xpcs->mdiodev->dev, "%s returned %pe\n", in xpcs_get_state()
1136 static void xpcs_link_up_sgmii_1000basex(struct dw_xpcs *xpcs, in xpcs_link_up_sgmii_1000basex() argument
1148 dev_err(&xpcs->mdiodev->dev, in xpcs_link_up_sgmii_1000basex()
1155 dev_err(&xpcs->mdiodev->dev, in xpcs_link_up_sgmii_1000basex()
1160 ret = xpcs_write(xpcs, MDIO_MMD_VEND2, MII_BMCR, in xpcs_link_up_sgmii_1000basex()
1163 dev_err(&xpcs->mdiodev->dev, "%s: xpcs_write returned %pe\n", in xpcs_link_up_sgmii_1000basex()
1170 struct dw_xpcs *xpcs = phylink_pcs_to_xpcs(pcs); in xpcs_link_up() local
1174 xpcs_link_up_usxgmii(xpcs, speed); in xpcs_link_up()
1179 xpcs_link_up_sgmii_1000basex(xpcs, neg_mode, interface, speed, in xpcs_link_up()
1190 struct dw_xpcs *xpcs = phylink_pcs_to_xpcs(pcs); in xpcs_an_restart() local
1192 xpcs_modify(xpcs, MDIO_MMD_VEND2, MII_BMCR, BMCR_ANRESTART, in xpcs_an_restart()
1196 static int xpcs_read_ids(struct dw_xpcs *xpcs) in xpcs_read_ids() argument
1204 ret = xpcs_read(xpcs, MDIO_MMD_PCS, MII_PHYSID1); in xpcs_read_ids()
1210 ret = xpcs_read(xpcs, MDIO_MMD_PCS, MII_PHYSID2); in xpcs_read_ids()
1221 ret = xpcs_read(xpcs, MDIO_MMD_VEND2, MII_PHYSID1); in xpcs_read_ids()
1227 ret = xpcs_read(xpcs, MDIO_MMD_VEND2, MII_PHYSID2); in xpcs_read_ids()
1235 if (xpcs->info.pcs == DW_XPCS_ID_NATIVE) in xpcs_read_ids()
1236 xpcs->info.pcs = id; in xpcs_read_ids()
1239 ret = xpcs_read(xpcs, MDIO_MMD_PMAPMD, MDIO_DEVID1); in xpcs_read_ids()
1245 ret = xpcs_read(xpcs, MDIO_MMD_PMAPMD, MDIO_DEVID2); in xpcs_read_ids()
1256 if (xpcs->info.pma == DW_XPCS_PMA_ID_NATIVE) in xpcs_read_ids()
1257 xpcs->info.pma = id; in xpcs_read_ids()
1346 static int xpcs_identify(struct dw_xpcs *xpcs) in xpcs_identify() argument
1350 ret = xpcs_read_ids(xpcs); in xpcs_identify()
1357 if ((xpcs->info.pcs & entry->mask) == entry->id) { in xpcs_identify()
1358 xpcs->desc = entry; in xpcs_identify()
1368 struct dw_xpcs *xpcs; in xpcs_create_data() local
1370 xpcs = kzalloc(sizeof(*xpcs), GFP_KERNEL); in xpcs_create_data()
1371 if (!xpcs) in xpcs_create_data()
1375 xpcs->mdiodev = mdiodev; in xpcs_create_data()
1376 xpcs->pcs.ops = &xpcs_phylink_ops; in xpcs_create_data()
1377 xpcs->pcs.neg_mode = true; in xpcs_create_data()
1378 xpcs->pcs.poll = true; in xpcs_create_data()
1380 return xpcs; in xpcs_create_data()
1383 static void xpcs_free_data(struct dw_xpcs *xpcs) in xpcs_free_data() argument
1385 mdio_device_put(xpcs->mdiodev); in xpcs_free_data()
1386 kfree(xpcs); in xpcs_free_data()
1389 static int xpcs_init_clks(struct dw_xpcs *xpcs) in xpcs_init_clks() argument
1395 struct device *dev = &xpcs->mdiodev->dev; in xpcs_init_clks()
1399 xpcs->clks[i].id = ids[i]; in xpcs_init_clks()
1401 ret = clk_bulk_get_optional(dev, DW_XPCS_NUM_CLKS, xpcs->clks); in xpcs_init_clks()
1405 ret = clk_bulk_prepare_enable(DW_XPCS_NUM_CLKS, xpcs->clks); in xpcs_init_clks()
1412 static void xpcs_clear_clks(struct dw_xpcs *xpcs) in xpcs_clear_clks() argument
1414 clk_bulk_disable_unprepare(DW_XPCS_NUM_CLKS, xpcs->clks); in xpcs_clear_clks()
1416 clk_bulk_put(DW_XPCS_NUM_CLKS, xpcs->clks); in xpcs_clear_clks()
1419 static int xpcs_init_id(struct dw_xpcs *xpcs) in xpcs_init_id() argument
1423 info = dev_get_platdata(&xpcs->mdiodev->dev); in xpcs_init_id()
1425 xpcs->info.pcs = DW_XPCS_ID_NATIVE; in xpcs_init_id()
1426 xpcs->info.pma = DW_XPCS_PMA_ID_NATIVE; in xpcs_init_id()
1428 xpcs->info = *info; in xpcs_init_id()
1431 return xpcs_identify(xpcs); in xpcs_init_id()
1436 struct dw_xpcs *xpcs; in xpcs_create() local
1439 xpcs = xpcs_create_data(mdiodev); in xpcs_create()
1440 if (IS_ERR(xpcs)) in xpcs_create()
1441 return xpcs; in xpcs_create()
1443 ret = xpcs_init_clks(xpcs); in xpcs_create()
1447 ret = xpcs_init_id(xpcs); in xpcs_create()
1451 xpcs_get_interfaces(xpcs, xpcs->pcs.supported_interfaces); in xpcs_create()
1453 if (xpcs->info.pma == WX_TXGBE_XPCS_PMA_10G_ID) in xpcs_create()
1454 xpcs->pcs.poll = false; in xpcs_create()
1456 xpcs->need_reset = true; in xpcs_create()
1458 return xpcs; in xpcs_create()
1461 xpcs_clear_clks(xpcs); in xpcs_create()
1464 xpcs_free_data(xpcs); in xpcs_create()
1470 * xpcs_create_mdiodev() - create a DW xPCS instance with the MDIO @addr
1474 * Return: a pointer to the DW XPCS handle if successful, otherwise -ENODEV if
1481 struct dw_xpcs *xpcs; in xpcs_create_mdiodev() local
1487 xpcs = xpcs_create(mdiodev); in xpcs_create_mdiodev()
1497 return xpcs; in xpcs_create_mdiodev()
1503 struct dw_xpcs *xpcs; in xpcs_create_pcs_mdiodev() local
1505 xpcs = xpcs_create_mdiodev(bus, addr); in xpcs_create_pcs_mdiodev()
1506 if (IS_ERR(xpcs)) in xpcs_create_pcs_mdiodev()
1507 return ERR_CAST(xpcs); in xpcs_create_pcs_mdiodev()
1509 return &xpcs->pcs; in xpcs_create_pcs_mdiodev()
1514 * xpcs_create_fwnode() - Create a DW xPCS instance from @fwnode
1515 * @fwnode: fwnode handle poining to the DW XPCS device
1517 * Return: a pointer to the DW XPCS handle if successful, otherwise -ENODEV if
1526 struct dw_xpcs *xpcs; in xpcs_create_fwnode() local
1535 xpcs = xpcs_create(mdiodev); in xpcs_create_fwnode()
1545 return xpcs; in xpcs_create_fwnode()
1549 void xpcs_destroy(struct dw_xpcs *xpcs) in xpcs_destroy() argument
1551 if (!xpcs) in xpcs_destroy()
1554 xpcs_clear_clks(xpcs); in xpcs_destroy()
1556 xpcs_free_data(xpcs); in xpcs_destroy()
1566 MODULE_DESCRIPTION("Synopsys DesignWare XPCS library");