Message ID | 20220125055010.1866563-3-kai.heng.feng@canonical.com (mailing list archive) |
---|---|
State | Handled Elsewhere, archived |
Headers | show |
Series | [v6,1/4] mmc: rtsx: Use pm_runtime_{get,put}() to handle runtime PM | expand |
> -----Original Message----- > From: Kai-Heng Feng <kai.heng.feng@canonical.com> > Sent: Tuesday, January 25, 2022 1:50 PM > To: arnd@arndb.de; gregkh@linuxfoundation.org; ulf.hansson@linaro.org > Cc: linux-pm@vger.kernel.org; Kai-Heng Feng <kai.heng.feng@canonical.com>; > Ricky WU <ricky_wu@realtek.com>; Christophe JAILLET > <christophe.jaillet@wanadoo.fr>; Yang Li <yang.lee@linux.alibaba.com>; > linux-kernel@vger.kernel.org > Subject: [PATCH v6 3/4] misc: rtsx: Cleanup power management ops > > - Use cancel_delayed_work_sync to ensure there's no race with > carddet_work. > > - Remove device_wakeup_disable to save some CPU cycles. If the device > really has ACPI _DSW then the wakeup should be disabled in probe > routine. > > - Remove fetch_vendor_settings from runtime resume routine, since they > are already saved in "struct rtsx_pcr". > > - Move variable assignments to the top of the functions. > > Cc: Ricky WU <ricky_wu@realtek.com> Tested-by: Ricky WU <ricky_wu@realtek.com> > Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com> > --- > v6: > v5: > - No change. > > v4: > - Move variable assignments to the top of the functions. > > v3: > v2: > - No change. > > drivers/misc/cardreader/rtsx_pcr.c | 34 ++++++++---------------------- > 1 file changed, 9 insertions(+), 25 deletions(-) > > diff --git a/drivers/misc/cardreader/rtsx_pcr.c > b/drivers/misc/cardreader/rtsx_pcr.c > index 8aba47a7d9736..3c97d3b50456e 100644 > --- a/drivers/misc/cardreader/rtsx_pcr.c > +++ b/drivers/misc/cardreader/rtsx_pcr.c > @@ -1660,22 +1660,17 @@ static void rtsx_pci_remove(struct pci_dev > *pcidev) static int __maybe_unused rtsx_pci_suspend(struct device *dev_d) > { > struct pci_dev *pcidev = to_pci_dev(dev_d); > - struct pcr_handle *handle; > - struct rtsx_pcr *pcr; > + struct pcr_handle *handle = pci_get_drvdata(pcidev); > + struct rtsx_pcr *pcr = handle->pcr; > > dev_dbg(&(pcidev->dev), "--> %s\n", __func__); > > - handle = pci_get_drvdata(pcidev); > - pcr = handle->pcr; > - > - cancel_delayed_work(&pcr->carddet_work); > + cancel_delayed_work_sync(&pcr->carddet_work); > > mutex_lock(&pcr->pcr_mutex); > > rtsx_pci_power_off(pcr, HOST_ENTER_S3); > > - device_wakeup_disable(dev_d); > - > mutex_unlock(&pcr->pcr_mutex); > return 0; > } > @@ -1683,15 +1678,12 @@ static int __maybe_unused > rtsx_pci_suspend(struct device *dev_d) static int __maybe_unused > rtsx_pci_resume(struct device *dev_d) { > struct pci_dev *pcidev = to_pci_dev(dev_d); > - struct pcr_handle *handle; > - struct rtsx_pcr *pcr; > + struct pcr_handle *handle = pci_get_drvdata(pcidev); > + struct rtsx_pcr *pcr = handle->pcr; > int ret = 0; > > dev_dbg(&(pcidev->dev), "--> %s\n", __func__); > > - handle = pci_get_drvdata(pcidev); > - pcr = handle->pcr; > - > mutex_lock(&pcr->pcr_mutex); > > ret = rtsx_pci_write_register(pcr, HOST_SLEEP_STATE, 0x03, 0x00); @@ > -1711,13 +1703,11 @@ static int __maybe_unused rtsx_pci_resume(struct > device *dev_d) > > static void rtsx_pci_shutdown(struct pci_dev *pcidev) { > - struct pcr_handle *handle; > - struct rtsx_pcr *pcr; > + struct pcr_handle *handle = pci_get_drvdata(pcidev); > + struct rtsx_pcr *pcr = handle->pcr; > > dev_dbg(&(pcidev->dev), "--> %s\n", __func__); > > - handle = pci_get_drvdata(pcidev); > - pcr = handle->pcr; > rtsx_pci_power_off(pcr, HOST_ENTER_S1); > > pci_disable_device(pcidev); > @@ -1756,11 +1746,8 @@ static int rtsx_pci_runtime_idle(struct device > *device) static int rtsx_pci_runtime_suspend(struct device *device) { > struct pci_dev *pcidev = to_pci_dev(device); > - struct pcr_handle *handle; > - struct rtsx_pcr *pcr; > - > - handle = pci_get_drvdata(pcidev); > - pcr = handle->pcr; > + struct pcr_handle *handle = pci_get_drvdata(pcidev); > + struct rtsx_pcr *pcr = handle->pcr; > > dev_dbg(device, "--> %s\n", __func__); > > @@ -1786,9 +1773,6 @@ static int rtsx_pci_runtime_resume(struct device > *device) > > rtsx_pci_write_register(pcr, HOST_SLEEP_STATE, 0x03, 0x00); > > - if (pcr->ops->fetch_vendor_settings) > - pcr->ops->fetch_vendor_settings(pcr); > - > rtsx_pci_init_hw(pcr); > > if (pcr->slots[RTSX_SD_CARD].p_dev != NULL) { > -- > 2.33.1
diff --git a/drivers/misc/cardreader/rtsx_pcr.c b/drivers/misc/cardreader/rtsx_pcr.c index 8aba47a7d9736..3c97d3b50456e 100644 --- a/drivers/misc/cardreader/rtsx_pcr.c +++ b/drivers/misc/cardreader/rtsx_pcr.c @@ -1660,22 +1660,17 @@ static void rtsx_pci_remove(struct pci_dev *pcidev) static int __maybe_unused rtsx_pci_suspend(struct device *dev_d) { struct pci_dev *pcidev = to_pci_dev(dev_d); - struct pcr_handle *handle; - struct rtsx_pcr *pcr; + struct pcr_handle *handle = pci_get_drvdata(pcidev); + struct rtsx_pcr *pcr = handle->pcr; dev_dbg(&(pcidev->dev), "--> %s\n", __func__); - handle = pci_get_drvdata(pcidev); - pcr = handle->pcr; - - cancel_delayed_work(&pcr->carddet_work); + cancel_delayed_work_sync(&pcr->carddet_work); mutex_lock(&pcr->pcr_mutex); rtsx_pci_power_off(pcr, HOST_ENTER_S3); - device_wakeup_disable(dev_d); - mutex_unlock(&pcr->pcr_mutex); return 0; } @@ -1683,15 +1678,12 @@ static int __maybe_unused rtsx_pci_suspend(struct device *dev_d) static int __maybe_unused rtsx_pci_resume(struct device *dev_d) { struct pci_dev *pcidev = to_pci_dev(dev_d); - struct pcr_handle *handle; - struct rtsx_pcr *pcr; + struct pcr_handle *handle = pci_get_drvdata(pcidev); + struct rtsx_pcr *pcr = handle->pcr; int ret = 0; dev_dbg(&(pcidev->dev), "--> %s\n", __func__); - handle = pci_get_drvdata(pcidev); - pcr = handle->pcr; - mutex_lock(&pcr->pcr_mutex); ret = rtsx_pci_write_register(pcr, HOST_SLEEP_STATE, 0x03, 0x00); @@ -1711,13 +1703,11 @@ static int __maybe_unused rtsx_pci_resume(struct device *dev_d) static void rtsx_pci_shutdown(struct pci_dev *pcidev) { - struct pcr_handle *handle; - struct rtsx_pcr *pcr; + struct pcr_handle *handle = pci_get_drvdata(pcidev); + struct rtsx_pcr *pcr = handle->pcr; dev_dbg(&(pcidev->dev), "--> %s\n", __func__); - handle = pci_get_drvdata(pcidev); - pcr = handle->pcr; rtsx_pci_power_off(pcr, HOST_ENTER_S1); pci_disable_device(pcidev); @@ -1756,11 +1746,8 @@ static int rtsx_pci_runtime_idle(struct device *device) static int rtsx_pci_runtime_suspend(struct device *device) { struct pci_dev *pcidev = to_pci_dev(device); - struct pcr_handle *handle; - struct rtsx_pcr *pcr; - - handle = pci_get_drvdata(pcidev); - pcr = handle->pcr; + struct pcr_handle *handle = pci_get_drvdata(pcidev); + struct rtsx_pcr *pcr = handle->pcr; dev_dbg(device, "--> %s\n", __func__); @@ -1786,9 +1773,6 @@ static int rtsx_pci_runtime_resume(struct device *device) rtsx_pci_write_register(pcr, HOST_SLEEP_STATE, 0x03, 0x00); - if (pcr->ops->fetch_vendor_settings) - pcr->ops->fetch_vendor_settings(pcr); - rtsx_pci_init_hw(pcr); if (pcr->slots[RTSX_SD_CARD].p_dev != NULL) {
- Use cancel_delayed_work_sync to ensure there's no race with carddet_work. - Remove device_wakeup_disable to save some CPU cycles. If the device really has ACPI _DSW then the wakeup should be disabled in probe routine. - Remove fetch_vendor_settings from runtime resume routine, since they are already saved in "struct rtsx_pcr". - Move variable assignments to the top of the functions. Cc: Ricky WU <ricky_wu@realtek.com> Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com> --- v6: v5: - No change. v4: - Move variable assignments to the top of the functions. v3: v2: - No change. drivers/misc/cardreader/rtsx_pcr.c | 34 ++++++++---------------------- 1 file changed, 9 insertions(+), 25 deletions(-)