staging: wilc1000: look for rtc_clk clock
authorEugen Hristev <eugen.hristev@microchip.com>
Mon, 9 Sep 2019 14:12:29 +0000 (14:12 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 12 Sep 2019 09:35:51 +0000 (10:35 +0100)
If rtc_clk is provided from DT, use it and enable it.
This is optional.
The signal may be hardcoded and no need to be requested,
but if DT provides it, use it.

Signed-off-by: Eugen Hristev <eugen.hristev@microchip.com>
Acked-by: Ajay Singh <ajay.kathat@microchip.com>
Link: https://lore.kernel.org/r/1568037993-4646-2-git-send-email-eugen.hristev@microchip.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/wilc1000/wilc_sdio.c
drivers/staging/wilc1000/wilc_wfi_netdevice.h

index 2f9aa36e011406917131d0416eac9e41944dd2f3..c787c5da8f2bef9372f5fd4d4c70f016a5501eb6 100644 (file)
@@ -4,6 +4,7 @@
  * All rights reserved.
  */
 
+#include <linux/clk.h>
 #include <linux/mmc/sdio_func.h>
 #include <linux/mmc/host.h>
 
@@ -151,6 +152,12 @@ static int wilc_sdio_probe(struct sdio_func *func,
        wilc->dev = &func->dev;
        wilc->gpio_irq = gpio;
 
+       wilc->rtc_clk = devm_clk_get(&func->card->dev, "rtc_clk");
+       if (PTR_ERR_OR_ZERO(wilc->rtc_clk) == -EPROBE_DEFER)
+               return -EPROBE_DEFER;
+       else if (!IS_ERR(wilc->rtc_clk))
+               clk_prepare_enable(wilc->rtc_clk);
+
        dev_info(&func->dev, "Driver Initializing success\n");
        return 0;
 }
@@ -162,6 +169,10 @@ static void wilc_sdio_remove(struct sdio_func *func)
        /* free the GPIO in module remove */
        if (wilc->gpio_irq)
                gpiod_put(wilc->gpio_irq);
+
+       if (!IS_ERR(wilc->rtc_clk))
+               clk_disable_unprepare(wilc->rtc_clk);
+
        wilc_netdev_cleanup(wilc);
 }
 
@@ -193,6 +204,9 @@ static int wilc_sdio_suspend(struct device *dev)
        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);
index 7e7ce9471f672096b14d17f04e84c4deda9158a2..978a8bdbfc403cfe5a91f781351bc6b5cc1cd68b 100644 (file)
@@ -216,6 +216,7 @@ struct wilc {
        int io_type;
        s8 mac_status;
        struct gpio_desc *gpio_irq;
+       struct clk *rtc_clk;
        bool initialized;
        int dev_irq_num;
        int close;