Message ID | 20200318104016.28049-4-stanley.chu@mediatek.com (mailing list archive) |
---|---|
State | Mainlined |
Commit | 5c955c10d0c26eb920f9cfad11adb58c93f666a0 |
Headers | show |
Series | scsi: ufs: some cleanups and make the delay for host enabling customizable | expand |
Hi, Stanley > > diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index > 314e808b0d4e..a42a84164dec 100644 > --- a/drivers/scsi/ufs/ufshcd.c > +++ b/drivers/scsi/ufs/ufshcd.c > @@ -597,6 +597,18 @@ static void ufshcd_print_pwr_info(struct ufs_hba *hba) > hba->pwr_info.hs_rate); > } > > +void ufshcd_delay_us(unsigned long us, unsigned long tolerance) { > + if (!us) > + return; > + > + if (us < 10) > + udelay(us); > + else > + usleep_range(us, us + tolerance); > +} > +EXPORT_SYMBOL_GPL(ufshcd_delay_us); > + In this way, the callers of ufshcd_delay_us(), can directly call udelay() or usleep_range(), what is exist meaning of ufshcd_delay_us()? //Bean
Hi Bean, On Wed, 2020-03-18 at 22:10 +0000, Bean Huo (beanhuo) wrote: > Hi, Stanley > > > > diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index > > 314e808b0d4e..a42a84164dec 100644 > > --- a/drivers/scsi/ufs/ufshcd.c > > +++ b/drivers/scsi/ufs/ufshcd.c > > @@ -597,6 +597,18 @@ static void ufshcd_print_pwr_info(struct ufs_hba *hba) > > hba->pwr_info.hs_rate); > > } > > > > +void ufshcd_delay_us(unsigned long us, unsigned long tolerance) { > > + if (!us) > > + return; > > + > > + if (us < 10) > > + udelay(us); > > + else > > + usleep_range(us, us + tolerance); > > +} > > +EXPORT_SYMBOL_GPL(ufshcd_delay_us); > > + > In this way, the callers of ufshcd_delay_us(), can directly call udelay() or usleep_range(), what is exist meaning of ufshcd_delay_us()? Sure, the callers always can directly call udelay() or usleep_range(). The customizable delay (either by hosts or devices) value in UFS driver is becoming more and more, like "reference clock gating delay" and introduced "hce_enable_delay". The customized delay time could be 0, < 10 us, or >= 10 us in real cases. Hence this function can help driver simplify the driver and user's decision of "just passed without any delay" or "choosing a suitable delay function according to the delay time". Thanks, Stanley Chu
diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index 314e808b0d4e..a42a84164dec 100644 --- a/drivers/scsi/ufs/ufshcd.c +++ b/drivers/scsi/ufs/ufshcd.c @@ -597,6 +597,18 @@ static void ufshcd_print_pwr_info(struct ufs_hba *hba) hba->pwr_info.hs_rate); } +void ufshcd_delay_us(unsigned long us, unsigned long tolerance) +{ + if (!us) + return; + + if (us < 10) + udelay(us); + else + usleep_range(us, us + tolerance); +} +EXPORT_SYMBOL_GPL(ufshcd_delay_us); + /* * ufshcd_wait_for_register - wait for register value to change * @hba - per-adapter interface diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h index 52425371082a..9a14ff3d5f8b 100644 --- a/drivers/scsi/ufs/ufshcd.h +++ b/drivers/scsi/ufs/ufshcd.h @@ -792,6 +792,7 @@ int ufshcd_init(struct ufs_hba * , void __iomem * , unsigned int); int ufshcd_make_hba_operational(struct ufs_hba *hba); void ufshcd_remove(struct ufs_hba *); int ufshcd_uic_hibern8_exit(struct ufs_hba *hba); +void ufshcd_delay_us(unsigned long us, unsigned long tolerance); int ufshcd_wait_for_register(struct ufs_hba *hba, u32 reg, u32 mask, u32 val, unsigned long interval_us, unsigned long timeout_ms, bool can_sleep);