Lines Matching refs:gtr_dev
255 static inline u32 xpsgtr_read(struct xpsgtr_dev *gtr_dev, u32 reg) in xpsgtr_read() argument
257 return readl(gtr_dev->serdes + reg); in xpsgtr_read()
260 static inline void xpsgtr_write(struct xpsgtr_dev *gtr_dev, u32 reg, u32 value) in xpsgtr_write() argument
262 writel(value, gtr_dev->serdes + reg); in xpsgtr_write()
265 static inline void xpsgtr_clr_set(struct xpsgtr_dev *gtr_dev, u32 reg, in xpsgtr_clr_set() argument
268 u32 value = xpsgtr_read(gtr_dev, reg); in xpsgtr_clr_set()
272 xpsgtr_write(gtr_dev, reg, value); in xpsgtr_clr_set()
309 struct xpsgtr_dev *gtr_dev = gtr_phy->dev; in xpsgtr_wait_pll_lock() local
313 dev_dbg(gtr_dev->dev, "Waiting for PLL lock\n"); in xpsgtr_wait_pll_lock()
332 dev_err(gtr_dev->dev, in xpsgtr_wait_pll_lock()
391 struct xpsgtr_dev *gtr_dev = gtr_phy->dev; in xpsgtr_lane_set_protocol() local
396 xpsgtr_clr_set(gtr_dev, ICM_CFG0, ICM_CFG0_L0_MASK, protocol); in xpsgtr_lane_set_protocol()
399 xpsgtr_clr_set(gtr_dev, ICM_CFG0, ICM_CFG0_L1_MASK, in xpsgtr_lane_set_protocol()
403 xpsgtr_clr_set(gtr_dev, ICM_CFG1, ICM_CFG0_L0_MASK, protocol); in xpsgtr_lane_set_protocol()
406 xpsgtr_clr_set(gtr_dev, ICM_CFG1, ICM_CFG0_L1_MASK, in xpsgtr_lane_set_protocol()
438 struct xpsgtr_dev *gtr_dev = gtr_phy->dev; in xpsgtr_phy_init_sata() local
442 writel(gtr_phy->lane, gtr_dev->siou + SATA_CONTROL_OFFSET); in xpsgtr_phy_init_sata()
448 struct xpsgtr_dev *gtr_dev = gtr_phy->dev; in xpsgtr_phy_init_sgmii() local
453 xpsgtr_clr_set(gtr_dev, TX_PROT_BUS_WIDTH, mask, val); in xpsgtr_phy_init_sgmii()
454 xpsgtr_clr_set(gtr_dev, RX_PROT_BUS_WIDTH, mask, val); in xpsgtr_phy_init_sgmii()
506 struct xpsgtr_dev *gtr_dev = gtr_phy->dev; in xpsgtr_phy_tx_term_fix() local
511 xpsgtr_clr_set(gtr_dev, TM_CMN_RST, TM_CMN_RST_MASK, TM_CMN_RST_SET); in xpsgtr_phy_tx_term_fix()
514 xpsgtr_clr_set(gtr_dev, TM_CMN_RST, TM_CMN_RST_MASK, TM_CMN_RST_EN); in xpsgtr_phy_tx_term_fix()
516 xpsgtr_write(gtr_dev, L3_TM_CALIB_DIG18, 0x00); in xpsgtr_phy_tx_term_fix()
517 xpsgtr_write(gtr_dev, L3_TM_CALIB_DIG19, L3_TM_OVERRIDE_NSW_CODE); in xpsgtr_phy_tx_term_fix()
527 xpsgtr_clr_set(gtr_dev, TM_CMN_RST, TM_CMN_RST_MASK, TM_CMN_RST_SET); in xpsgtr_phy_tx_term_fix()
529 dev_dbg(gtr_dev->dev, "calibrating...\n"); in xpsgtr_phy_tx_term_fix()
532 u32 reg = xpsgtr_read(gtr_dev, L3_CALIB_DONE_STATUS); in xpsgtr_phy_tx_term_fix()
538 dev_err(gtr_dev->dev, "calibration time out\n"); in xpsgtr_phy_tx_term_fix()
545 dev_dbg(gtr_dev->dev, "calibration done\n"); in xpsgtr_phy_tx_term_fix()
548 nsw = xpsgtr_read(gtr_dev, L0_TXPMA_ST_3) & L0_DN_CALIB_CODE; in xpsgtr_phy_tx_term_fix()
551 xpsgtr_clr_set(gtr_dev, TM_CMN_RST, TM_CMN_RST_MASK, TM_CMN_RST_EN); in xpsgtr_phy_tx_term_fix()
554 xpsgtr_write(gtr_dev, L3_TM_CALIB_DIG19, nsw >> L3_NSW_CALIB_SHIFT); in xpsgtr_phy_tx_term_fix()
557 xpsgtr_write(gtr_dev, L3_TM_CALIB_DIG18, in xpsgtr_phy_tx_term_fix()
562 xpsgtr_clr_set(gtr_dev, TM_CMN_RST, TM_CMN_RST_MASK, TM_CMN_RST_SET); in xpsgtr_phy_tx_term_fix()
570 struct xpsgtr_dev *gtr_dev = gtr_phy->dev; in xpsgtr_phy_init() local
573 mutex_lock(>r_dev->gtr_mutex); in xpsgtr_phy_init()
576 if (clk_prepare_enable(gtr_dev->clk[gtr_phy->lane])) in xpsgtr_phy_init()
583 if (gtr_dev->tx_term_fix) { in xpsgtr_phy_init()
588 gtr_dev->tx_term_fix = false; in xpsgtr_phy_init()
616 mutex_unlock(>r_dev->gtr_mutex); in xpsgtr_phy_init()
623 struct xpsgtr_dev *gtr_dev = gtr_phy->dev; in xpsgtr_phy_exit() local
628 clk_disable_unprepare(gtr_dev->clk[gtr_phy->lane]); in xpsgtr_phy_exit()
773 struct xpsgtr_dev *gtr_dev = dev_get_drvdata(dev); in xpsgtr_xlate() local
792 if (phy_lane >= ARRAY_SIZE(gtr_dev->phys)) { in xpsgtr_xlate()
797 gtr_phy = >r_dev->phys[phy_lane]; in xpsgtr_xlate()
803 dev_err(gtr_dev->dev, "Invalid PHY type and/or instance\n"); in xpsgtr_xlate()
808 if (refclk >= ARRAY_SIZE(gtr_dev->refclk_sscs) || in xpsgtr_xlate()
809 !gtr_dev->refclk_sscs[refclk]) { in xpsgtr_xlate()
834 struct xpsgtr_dev *gtr_dev = dev_get_drvdata(dev); in xpsgtr_runtime_suspend() local
837 gtr_dev->saved_icm_cfg0 = xpsgtr_read(gtr_dev, ICM_CFG0); in xpsgtr_runtime_suspend()
838 gtr_dev->saved_icm_cfg1 = xpsgtr_read(gtr_dev, ICM_CFG1); in xpsgtr_runtime_suspend()
845 struct xpsgtr_dev *gtr_dev = dev_get_drvdata(dev); in xpsgtr_runtime_resume() local
850 icm_cfg0 = xpsgtr_read(gtr_dev, ICM_CFG0); in xpsgtr_runtime_resume()
851 icm_cfg1 = xpsgtr_read(gtr_dev, ICM_CFG1); in xpsgtr_runtime_resume()
854 if (!gtr_dev->saved_icm_cfg0 && !gtr_dev->saved_icm_cfg1) in xpsgtr_runtime_resume()
858 if (icm_cfg0 == gtr_dev->saved_icm_cfg0 && in xpsgtr_runtime_resume()
859 icm_cfg1 == gtr_dev->saved_icm_cfg1) in xpsgtr_runtime_resume()
865 for (i = 0; i < ARRAY_SIZE(gtr_dev->phys); i++) in xpsgtr_runtime_resume()
866 gtr_dev->phys[i].skip_phy_init = skip_phy_init; in xpsgtr_runtime_resume()
877 static int xpsgtr_get_ref_clocks(struct xpsgtr_dev *gtr_dev) in xpsgtr_get_ref_clocks() argument
881 for (refclk = 0; refclk < ARRAY_SIZE(gtr_dev->refclk_sscs); ++refclk) { in xpsgtr_get_ref_clocks()
888 clk = devm_clk_get_optional(gtr_dev->dev, name); in xpsgtr_get_ref_clocks()
890 return dev_err_probe(gtr_dev->dev, PTR_ERR(clk), in xpsgtr_get_ref_clocks()
898 gtr_dev->clk[refclk] = clk; in xpsgtr_get_ref_clocks()
911 gtr_dev->refclk_sscs[refclk] = &ssc_lookup[i]; in xpsgtr_get_ref_clocks()
917 dev_err(gtr_dev->dev, in xpsgtr_get_ref_clocks()
930 struct xpsgtr_dev *gtr_dev; in xpsgtr_probe() local
935 gtr_dev = devm_kzalloc(&pdev->dev, sizeof(*gtr_dev), GFP_KERNEL); in xpsgtr_probe()
936 if (!gtr_dev) in xpsgtr_probe()
939 gtr_dev->dev = &pdev->dev; in xpsgtr_probe()
940 platform_set_drvdata(pdev, gtr_dev); in xpsgtr_probe()
942 mutex_init(>r_dev->gtr_mutex); in xpsgtr_probe()
945 gtr_dev->tx_term_fix = in xpsgtr_probe()
949 gtr_dev->serdes = devm_platform_ioremap_resource_byname(pdev, "serdes"); in xpsgtr_probe()
950 if (IS_ERR(gtr_dev->serdes)) in xpsgtr_probe()
951 return PTR_ERR(gtr_dev->serdes); in xpsgtr_probe()
953 gtr_dev->siou = devm_platform_ioremap_resource_byname(pdev, "siou"); in xpsgtr_probe()
954 if (IS_ERR(gtr_dev->siou)) in xpsgtr_probe()
955 return PTR_ERR(gtr_dev->siou); in xpsgtr_probe()
957 ret = xpsgtr_get_ref_clocks(gtr_dev); in xpsgtr_probe()
962 for (port = 0; port < ARRAY_SIZE(gtr_dev->phys); ++port) { in xpsgtr_probe()
963 struct xpsgtr_phy *gtr_phy = >r_dev->phys[port]; in xpsgtr_probe()
967 gtr_phy->dev = gtr_dev; in xpsgtr_probe()
986 pm_runtime_set_active(gtr_dev->dev); in xpsgtr_probe()
987 pm_runtime_enable(gtr_dev->dev); in xpsgtr_probe()
989 ret = pm_runtime_resume_and_get(gtr_dev->dev); in xpsgtr_probe()
991 pm_runtime_disable(gtr_dev->dev); in xpsgtr_probe()
1000 struct xpsgtr_dev *gtr_dev = platform_get_drvdata(pdev); in xpsgtr_remove() local
1002 pm_runtime_disable(gtr_dev->dev); in xpsgtr_remove()
1003 pm_runtime_put_noidle(gtr_dev->dev); in xpsgtr_remove()
1004 pm_runtime_set_suspended(gtr_dev->dev); in xpsgtr_remove()