On 04-05-20, 16:26, Dilip Kota wrote: > > On 5/4/2020 3:29 PM, Vinod Koul wrote: > > On 30-04-20, 15:15, Dilip Kota wrote: > > > > > +enum { > > > + PHY_0, > > > + PHY_1, > > > + PHY_MAX_NUM > > PHY_MAX_NUM = PHY_1? > Driver is using it for no. of PHYs/maximum PHY id. Ok > > > +static inline void combo_phy_w32_off_mask(void __iomem *base, unsigned int reg, > > > + u32 mask, u32 val) > > > +{ > > > + u32 reg_val; > > > + > > > + reg_val = readl(base + reg); > > > + reg_val &= ~mask; > > > + reg_val |= FIELD_PREP(mask, val); > > > + writel(reg_val, base + reg); > > bypassing regmap here... why? > It is not regmap address, one of the below two addresses are passed to this > function. okay, perhaps add a comment somewhere that regmap is not used for this base? > struct intel_combo_phy { > ... > void __iomem *app_base; > void __iomem *cr_base; > ... > } > > > +static int intel_cbphy_calibrate(struct phy *phy) > > > +{ > > > + struct intel_cbphy_iphy *iphy = phy_get_drvdata(phy); > > > + struct intel_combo_phy *cbphy = iphy->parent; > > > + void __iomem *cr_base = cbphy->cr_base; > > > + int val, ret, id; > > > + > > > + if (cbphy->phy_mode != PHY_XPCS_MODE) > > > + return 0; > > > + > > > + id = PHY_ID(iphy); > > > + > > > + /* trigger auto RX adaptation */ > > > + combo_phy_w32_off_mask(cr_base, CR_ADDR(PCS_XF_ATE_OVRD_IN_2, id), > > > + ADAPT_REQ_MSK, 3); > > > + /* Wait RX adaptation to finish */ > > > + ret = readl_poll_timeout(cr_base + CR_ADDR(PCS_XF_RX_ADAPT_ACK, id), > > > + val, val & RX_ADAPT_ACK_BIT, 10, 5000); > > > + if (ret) > > > + dev_err(cbphy->dev, "RX Adaptation failed!\n"); > > you want to continue her and not return error? > > Next step is stopping the Adaptation, it should be done in both error and > success case. Again documenting this helps, pls add some comments on this behaviour -- ~Vinod