Message ID | 20240404122559.898930-11-peter.griffin@linaro.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | HSI2, UFS & UFS phy support for Tensor GS101 | expand |
On 04/04/2024 14:25, Peter Griffin wrote: > Some SoCs like gs101 don't fit in well with the existing pll lock and > clock data recovery (CDR) callback used by existing exynos platforms. > > Allow SoCs to specifify and implement their own calibration and CDR > functions that can be called by the generic samsung phy code. > > Signed-off-by: Peter Griffin <peter.griffin@linaro.org> > --- Acked-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org> Best regards, Krzysztof
On Thu, Apr 04, 2024 at 01:25:52PM +0100, Peter Griffin wrote: > diff --git a/drivers/phy/samsung/phy-samsung-ufs.c b/drivers/phy/samsung/phy-samsung-ufs.c > index c567efafc30f..f57a2f2a415d 100644 > --- a/drivers/phy/samsung/phy-samsung-ufs.c > +++ b/drivers/phy/samsung/phy-samsung-ufs.c > @@ -46,7 +46,7 @@ static void samsung_ufs_phy_config(struct samsung_ufs_phy *phy, > } > } > > -static int samsung_ufs_phy_wait_for_lock_acq(struct phy *phy) > +int samsung_ufs_phy_wait_for_lock_acq(struct phy *phy, u8 lane) > { > struct samsung_ufs_phy *ufs_phy = get_samsung_ufs_phy(phy); > const unsigned int timeout_us = 100000; > @@ -98,8 +98,15 @@ static int samsung_ufs_phy_calibrate(struct phy *phy) > } > } > > - if (ufs_phy->ufs_phy_state == CFG_POST_PWR_HS) > - err = samsung_ufs_phy_wait_for_lock_acq(phy); > + for_each_phy_lane(ufs_phy, i) { > + if (ufs_phy->ufs_phy_state == CFG_PRE_INIT && > + ufs_phy->drvdata->wait_for_cal) > + err = ufs_phy->drvdata->wait_for_cal(phy, i); > + > + if (ufs_phy->ufs_phy_state == CFG_POST_PWR_HS && > + ufs_phy->drvdata->wait_for_cdr) > + err = ufs_phy->drvdata->wait_for_cdr(phy, i); The "err" value is only preserved from the last iteration in this loop. regards, dan carpenter > + } > > /** > * In Samsung ufshci, PHY need to be calibrated at different
Hi Dan, Thanks for the review. On Wed, 17 Apr 2024 at 10:52, Dan Carpenter <dan.carpenter@linaro.org> wrote: > > On Thu, Apr 04, 2024 at 01:25:52PM +0100, Peter Griffin wrote: > > diff --git a/drivers/phy/samsung/phy-samsung-ufs.c b/drivers/phy/samsung/phy-samsung-ufs.c > > index c567efafc30f..f57a2f2a415d 100644 > > --- a/drivers/phy/samsung/phy-samsung-ufs.c > > +++ b/drivers/phy/samsung/phy-samsung-ufs.c > > @@ -46,7 +46,7 @@ static void samsung_ufs_phy_config(struct samsung_ufs_phy *phy, > > } > > } > > > > -static int samsung_ufs_phy_wait_for_lock_acq(struct phy *phy) > > +int samsung_ufs_phy_wait_for_lock_acq(struct phy *phy, u8 lane) > > { > > struct samsung_ufs_phy *ufs_phy = get_samsung_ufs_phy(phy); > > const unsigned int timeout_us = 100000; > > @@ -98,8 +98,15 @@ static int samsung_ufs_phy_calibrate(struct phy *phy) > > } > > } > > > > - if (ufs_phy->ufs_phy_state == CFG_POST_PWR_HS) > > - err = samsung_ufs_phy_wait_for_lock_acq(phy); > > + for_each_phy_lane(ufs_phy, i) { > > + if (ufs_phy->ufs_phy_state == CFG_PRE_INIT && > > + ufs_phy->drvdata->wait_for_cal) > > + err = ufs_phy->drvdata->wait_for_cal(phy, i); > > + > > + if (ufs_phy->ufs_phy_state == CFG_POST_PWR_HS && > > + ufs_phy->drvdata->wait_for_cdr) > > + err = ufs_phy->drvdata->wait_for_cdr(phy, i); > > The "err" value is only preserved from the last iteration in this loop. I'll send a follow up patch for this as it's already applied. Thanks, Peter
diff --git a/drivers/phy/samsung/phy-exynos7-ufs.c b/drivers/phy/samsung/phy-exynos7-ufs.c index a982e7c128c5..15eec1d9e0e0 100644 --- a/drivers/phy/samsung/phy-exynos7-ufs.c +++ b/drivers/phy/samsung/phy-exynos7-ufs.c @@ -82,4 +82,5 @@ const struct samsung_ufs_phy_drvdata exynos7_ufs_phy = { .clk_list = exynos7_ufs_phy_clks, .num_clks = ARRAY_SIZE(exynos7_ufs_phy_clks), .cdr_lock_status_offset = EXYNOS7_EMBEDDED_COMBO_PHY_CDR_LOCK_STATUS, + .wait_for_cdr = samsung_ufs_phy_wait_for_lock_acq, }; diff --git a/drivers/phy/samsung/phy-exynosautov9-ufs.c b/drivers/phy/samsung/phy-exynosautov9-ufs.c index 49e2bcbef0b4..9c3e030f07ba 100644 --- a/drivers/phy/samsung/phy-exynosautov9-ufs.c +++ b/drivers/phy/samsung/phy-exynosautov9-ufs.c @@ -71,4 +71,5 @@ const struct samsung_ufs_phy_drvdata exynosautov9_ufs_phy = { .clk_list = exynosautov9_ufs_phy_clks, .num_clks = ARRAY_SIZE(exynosautov9_ufs_phy_clks), .cdr_lock_status_offset = EXYNOSAUTOV9_EMBEDDED_COMBO_PHY_CDR_LOCK_STATUS, + .wait_for_cdr = samsung_ufs_phy_wait_for_lock_acq, }; diff --git a/drivers/phy/samsung/phy-fsd-ufs.c b/drivers/phy/samsung/phy-fsd-ufs.c index d36cabd53434..f2361746db0e 100644 --- a/drivers/phy/samsung/phy-fsd-ufs.c +++ b/drivers/phy/samsung/phy-fsd-ufs.c @@ -60,4 +60,5 @@ const struct samsung_ufs_phy_drvdata fsd_ufs_phy = { .clk_list = fsd_ufs_phy_clks, .num_clks = ARRAY_SIZE(fsd_ufs_phy_clks), .cdr_lock_status_offset = FSD_EMBEDDED_COMBO_PHY_CDR_LOCK_STATUS, + .wait_for_cdr = samsung_ufs_phy_wait_for_lock_acq, }; diff --git a/drivers/phy/samsung/phy-samsung-ufs.c b/drivers/phy/samsung/phy-samsung-ufs.c index c567efafc30f..f57a2f2a415d 100644 --- a/drivers/phy/samsung/phy-samsung-ufs.c +++ b/drivers/phy/samsung/phy-samsung-ufs.c @@ -46,7 +46,7 @@ static void samsung_ufs_phy_config(struct samsung_ufs_phy *phy, } } -static int samsung_ufs_phy_wait_for_lock_acq(struct phy *phy) +int samsung_ufs_phy_wait_for_lock_acq(struct phy *phy, u8 lane) { struct samsung_ufs_phy *ufs_phy = get_samsung_ufs_phy(phy); const unsigned int timeout_us = 100000; @@ -98,8 +98,15 @@ static int samsung_ufs_phy_calibrate(struct phy *phy) } } - if (ufs_phy->ufs_phy_state == CFG_POST_PWR_HS) - err = samsung_ufs_phy_wait_for_lock_acq(phy); + for_each_phy_lane(ufs_phy, i) { + if (ufs_phy->ufs_phy_state == CFG_PRE_INIT && + ufs_phy->drvdata->wait_for_cal) + err = ufs_phy->drvdata->wait_for_cal(phy, i); + + if (ufs_phy->ufs_phy_state == CFG_POST_PWR_HS && + ufs_phy->drvdata->wait_for_cdr) + err = ufs_phy->drvdata->wait_for_cdr(phy, i); + } /** * In Samsung ufshci, PHY need to be calibrated at different diff --git a/drivers/phy/samsung/phy-samsung-ufs.h b/drivers/phy/samsung/phy-samsung-ufs.h index e122960cfee8..7de6b574b94d 100644 --- a/drivers/phy/samsung/phy-samsung-ufs.h +++ b/drivers/phy/samsung/phy-samsung-ufs.h @@ -112,6 +112,9 @@ struct samsung_ufs_phy_drvdata { const char * const *clk_list; int num_clks; u32 cdr_lock_status_offset; + /* SoC's specific operations */ + int (*wait_for_cal)(struct phy *phy, u8 lane); + int (*wait_for_cdr)(struct phy *phy, u8 lane); }; struct samsung_ufs_phy { @@ -139,6 +142,8 @@ static inline void samsung_ufs_phy_ctrl_isol( phy->isol.mask, isol ? 0 : phy->isol.en); } +int samsung_ufs_phy_wait_for_lock_acq(struct phy *phy, u8 lane); + extern const struct samsung_ufs_phy_drvdata exynos7_ufs_phy; extern const struct samsung_ufs_phy_drvdata exynosautov9_ufs_phy; extern const struct samsung_ufs_phy_drvdata fsd_ufs_phy;
Some SoCs like gs101 don't fit in well with the existing pll lock and clock data recovery (CDR) callback used by existing exynos platforms. Allow SoCs to specifify and implement their own calibration and CDR functions that can be called by the generic samsung phy code. Signed-off-by: Peter Griffin <peter.griffin@linaro.org> --- drivers/phy/samsung/phy-exynos7-ufs.c | 1 + drivers/phy/samsung/phy-exynosautov9-ufs.c | 1 + drivers/phy/samsung/phy-fsd-ufs.c | 1 + drivers/phy/samsung/phy-samsung-ufs.c | 13 ++++++++++--- drivers/phy/samsung/phy-samsung-ufs.h | 5 +++++ 5 files changed, 18 insertions(+), 3 deletions(-)