switch (wm8994->sysclk[aif]) {
        case WM8994_SYSCLK_MCLK1:
-               rate = wm8994->mclk[0];
+               rate = wm8994->mclk_rate[0];
                break;
 
        case WM8994_SYSCLK_MCLK2:
                reg1 |= 0x8;
-               rate = wm8994->mclk[1];
+               rate = wm8994->mclk_rate[1];
                break;
 
        case WM8994_SYSCLK_FLL1:
        return _wm8994_set_fll(dai->component, id, src, freq_in, freq_out);
 }
 
+static int wm8994_set_mclk_rate(struct wm8994_priv *wm8994, unsigned int id,
+                               unsigned int *freq)
+{
+       int ret;
+
+       if (!wm8994->mclk[id].clk || *freq == wm8994->mclk_rate[id])
+               return 0;
+
+       ret = clk_set_rate(wm8994->mclk[id].clk, *freq);
+       if (ret < 0)
+               return ret;
+
+       *freq = clk_get_rate(wm8994->mclk[id].clk);
+
+       return 0;
+}
+
 static int wm8994_set_dai_sysclk(struct snd_soc_dai *dai,
                int clk_id, unsigned int freq, int dir)
 {
        struct snd_soc_component *component = dai->component;
        struct wm8994_priv *wm8994 = snd_soc_component_get_drvdata(component);
-       int i;
+       int ret, i;
 
        switch (dai->id) {
        case 1:
        switch (clk_id) {
        case WM8994_SYSCLK_MCLK1:
                wm8994->sysclk[dai->id - 1] = WM8994_SYSCLK_MCLK1;
-               wm8994->mclk[0] = freq;
+
+               ret = wm8994_set_mclk_rate(wm8994, dai->id - 1, &freq);
+               if (ret < 0)
+                       return ret;
+
+               wm8994->mclk_rate[0] = freq;
                dev_dbg(dai->dev, "AIF%d using MCLK1 at %uHz\n",
                        dai->id, freq);
                break;
        case WM8994_SYSCLK_MCLK2:
                /* TODO: Set GPIO AF */
                wm8994->sysclk[dai->id - 1] = WM8994_SYSCLK_MCLK2;
-               wm8994->mclk[1] = freq;
+
+               ret = wm8994_set_mclk_rate(wm8994, dai->id - 1, &freq);
+               if (ret < 0)
+                       return ret;
+
+               wm8994->mclk_rate[1] = freq;
                dev_dbg(dai->dev, "AIF%d using MCLK2 at %uHz\n",
                        dai->id, freq);
                break;
 static int wm8994_probe(struct platform_device *pdev)
 {
        struct wm8994_priv *wm8994;
+       int ret;
 
        wm8994 = devm_kzalloc(&pdev->dev, sizeof(struct wm8994_priv),
                              GFP_KERNEL);
 
        wm8994->wm8994 = dev_get_drvdata(pdev->dev.parent);
 
+       wm8994->mclk[WM8994_MCLK1].id = "MCLK1";
+       wm8994->mclk[WM8994_MCLK2].id = "MCLK2";
+
+       ret = devm_clk_bulk_get_optional(pdev->dev.parent, ARRAY_SIZE(wm8994->mclk),
+                                        wm8994->mclk);
+       if (ret < 0) {
+               dev_err(&pdev->dev, "Failed to get clocks: %d\n", ret);
+               return ret;
+       }
+
        pm_runtime_enable(&pdev->dev);
        pm_runtime_idle(&pdev->dev);