]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
wifi: wilc1000: let host->chip suspend/resume notifications manage chip wake/sleep
authorAlexis Lothoré <alexis.lothore@bootlin.com>
Thu, 13 Jun 2024 14:06:41 +0000 (16:06 +0200)
committerKalle Valo <kvalo@kernel.org>
Tue, 18 Jun 2024 10:23:15 +0000 (13:23 +0300)
host_wakeup_notify and host_sleep_notify are surrounded by chip_wakeup and
chip_allow_sleep calls, which theorically need to be protected with the
hif_cs lock. This lock protection is currently missing. Instead of adding
the lock where those two functions are called, move those in host->chip
suspend notifications to benefit from the lock already used there (in
bus_acquire/bus_release)

Signed-off-by: Alexis Lothoré <alexis.lothore@bootlin.com>
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Link: https://msgid.link/20240613-wilc_suspend-v1-2-c2f766d0988c@bootlin.com
drivers/net/wireless/microchip/wilc1000/sdio.c
drivers/net/wireless/microchip/wilc1000/wlan.c

index 6461a3ec0120e62b2c350544b9473830ca5c17e1..4e478a2cd4ccb9c0410802bccf7811155b71d5e4 100644 (file)
@@ -256,14 +256,12 @@ static int wilc_sdio_suspend(struct device *dev)
        int ret;
 
        dev_info(dev, "sdio suspend\n");
-       chip_wakeup(wilc);
 
        if (!IS_ERR(wilc->rtc_clk))
                clk_disable_unprepare(wilc->rtc_clk);
 
        if (wilc->suspend_event) {
                host_sleep_notify(wilc);
-               chip_allow_sleep(wilc);
        }
 
        ret = wilc_sdio_reset(wilc);
@@ -1003,14 +1001,11 @@ static int wilc_sdio_resume(struct device *dev)
 
        dev_info(dev, "sdio resume\n");
        sdio_release_host(func);
-       chip_wakeup(wilc);
        wilc_sdio_init(wilc, true);
 
        if (wilc->suspend_event)
                host_wakeup_notify(wilc);
 
-       chip_allow_sleep(wilc);
-
        return 0;
 }
 
index 41a5c0ed7480575e6a93cdda2dcb40488e28294d..533939e71534a026a18abd5eb88b371a7f5bebde 100644 (file)
@@ -678,17 +678,17 @@ EXPORT_SYMBOL_GPL(chip_wakeup);
 
 void host_wakeup_notify(struct wilc *wilc)
 {
-       acquire_bus(wilc, WILC_BUS_ACQUIRE_ONLY);
+       acquire_bus(wilc, WILC_BUS_ACQUIRE_AND_WAKEUP);
        wilc->hif_func->hif_write_reg(wilc, WILC_CORTUS_INTERRUPT_2, 1);
-       release_bus(wilc, WILC_BUS_RELEASE_ONLY);
+       release_bus(wilc, WILC_BUS_RELEASE_ALLOW_SLEEP);
 }
 EXPORT_SYMBOL_GPL(host_wakeup_notify);
 
 void host_sleep_notify(struct wilc *wilc)
 {
-       acquire_bus(wilc, WILC_BUS_ACQUIRE_ONLY);
+       acquire_bus(wilc, WILC_BUS_ACQUIRE_AND_WAKEUP);
        wilc->hif_func->hif_write_reg(wilc, WILC_CORTUS_INTERRUPT_1, 1);
-       release_bus(wilc, WILC_BUS_RELEASE_ONLY);
+       release_bus(wilc, WILC_BUS_RELEASE_ALLOW_SLEEP);
 }
 EXPORT_SYMBOL_GPL(host_sleep_notify);