*/
 
 #include <linux/bitops.h>
+#include <linux/clk.h>
 #include <linux/interrupt.h>
 #include <linux/fs.h>
 #include <linux/kfifo.h>
 struct aspeed_lpc_snoop {
        struct regmap           *regmap;
        int                     irq;
+       struct clk              *clk;
        struct aspeed_lpc_snoop_channel chan[NUM_SNOOP_CHANNELS];
 };
 
                return -ENODEV;
        }
 
+       lpc_snoop->clk = devm_clk_get(dev, NULL);
+       if (IS_ERR(lpc_snoop->clk)) {
+               rc = PTR_ERR(lpc_snoop->clk);
+               if (rc != -EPROBE_DEFER)
+                       dev_err(dev, "couldn't get clock\n");
+               return rc;
+       }
+       rc = clk_prepare_enable(lpc_snoop->clk);
+       if (rc) {
+               dev_err(dev, "couldn't enable clock\n");
+               return rc;
+       }
+
        rc = aspeed_lpc_snoop_config_irq(lpc_snoop, pdev);
        if (rc)
-               return rc;
+               goto err;
 
        rc = aspeed_lpc_enable_snoop(lpc_snoop, dev, 0, port);
        if (rc)
-               return rc;
+               goto err;
 
        /* Configuration of 2nd snoop channel port is optional */
        if (of_property_read_u32_index(dev->of_node, "snoop-ports",
                                       1, &port) == 0) {
                rc = aspeed_lpc_enable_snoop(lpc_snoop, dev, 1, port);
-               if (rc)
+               if (rc) {
                        aspeed_lpc_disable_snoop(lpc_snoop, 0);
+                       goto err;
+               }
        }
 
+       return 0;
+
+err:
+       clk_disable_unprepare(lpc_snoop->clk);
+
        return rc;
 }
 
        aspeed_lpc_disable_snoop(lpc_snoop, 0);
        aspeed_lpc_disable_snoop(lpc_snoop, 1);
 
+       clk_disable_unprepare(lpc_snoop->clk);
+
        return 0;
 }