#include <linux/delay.h>
 #include <linux/io.h>
 #include <linux/of.h>
+#include <linux/clk.h>
 
 #include "serial_flash_cmds.h"
 
        struct mtd_info         mtd;
        struct mutex            lock;
        struct flash_info       *info;
+       struct clk              *clk;
 
        uint32_t                configuration;
        uint32_t                fifo_dir_delay;
        uint32_t emi_freq;
        uint32_t clk_div;
 
-       /* TODO: Make this dynamic */
-       emi_freq = STFSM_DEFAULT_EMI_FREQ;
+       emi_freq = clk_get_rate(fsm->clk);
 
        /*
         * Calculate clk_div - values between 2 and 128
                return PTR_ERR(fsm->base);
        }
 
+       fsm->clk = devm_clk_get(&pdev->dev, NULL);
+       if (IS_ERR(fsm->clk)) {
+               dev_err(fsm->dev, "Couldn't find EMI clock.\n");
+               return PTR_ERR(fsm->clk);
+       }
+
+       ret = clk_prepare_enable(fsm->clk);
+       if (ret) {
+               dev_err(fsm->dev, "Failed to enable EMI clock.\n");
+               return ret;
+       }
+
        mutex_init(&fsm->lock);
 
        ret = stfsm_init(fsm);
        return mtd_device_unregister(&fsm->mtd);
 }
 
+#ifdef CONFIG_PM_SLEEP
+static int stfsmfsm_suspend(struct device *dev)
+{
+       struct stfsm *fsm = dev_get_drvdata(dev);
+
+       clk_disable_unprepare(fsm->clk);
+
+       return 0;
+}
+
+static int stfsmfsm_resume(struct device *dev)
+{
+       struct stfsm *fsm = dev_get_drvdata(dev);
+
+       clk_prepare_enable(fsm->clk);
+
+       return 0;
+}
+#endif
+
+static SIMPLE_DEV_PM_OPS(stfsm_pm_ops, stfsmfsm_suspend, stfsmfsm_resume);
+
 static const struct of_device_id stfsm_match[] = {
        { .compatible = "st,spi-fsm", },
        {},
        .driver         = {
                .name   = "st-spi-fsm",
                .of_match_table = stfsm_match,
+               .pm     = &stfsm_pm_ops,
        },
 };
 module_platform_driver(stfsm_driver);