#include <linux/clk.h>
 #include <linux/io.h>
 #include <linux/platform_device.h>
+#include <linux/pm_runtime.h>
 #include <linux/regmap.h>
 #include <sound/soc.h>
 #include <sound/soc-dapm.h>
        unsigned long active_ch_cnt[TX_MACRO_MAX_DAIS];
        unsigned long active_decimator[TX_MACRO_MAX_DAIS];
        struct regmap *regmap;
-       struct clk_bulk_data clks[TX_NUM_CLKS_MAX];
+       struct clk *mclk;
+       struct clk *npl;
+       struct clk *macro;
+       struct clk *dcodec;
+       struct clk *fsgen;
        struct clk_hw hw;
        bool dec_active[NUM_DECIMATORS];
        bool reset_swr;
        struct clk_init_data init;
        int ret;
 
-       parent_clk_name = __clk_get_name(tx->clks[2].clk);
+       parent_clk_name = __clk_get_name(tx->mclk);
 
        init.name = clk_name;
        init.ops = &swclk_gate_ops;
        if (!tx)
                return -ENOMEM;
 
-       tx->clks[0].id = "macro";
-       tx->clks[1].id = "dcodec";
-       tx->clks[2].id = "mclk";
-       tx->clks[3].id = "npl";
-       tx->clks[4].id = "fsgen";
+       tx->macro = devm_clk_get_optional(dev, "macro");
+       if (IS_ERR(tx->macro))
+               return PTR_ERR(tx->macro);
 
-       ret = devm_clk_bulk_get_optional(dev, TX_NUM_CLKS_MAX, tx->clks);
-       if (ret) {
-               dev_err(dev, "Error getting RX Clocks (%d)\n", ret);
-               return ret;
-       }
+       tx->dcodec = devm_clk_get_optional(dev, "dcodec");
+       if (IS_ERR(tx->dcodec))
+               return PTR_ERR(tx->dcodec);
+
+       tx->mclk = devm_clk_get(dev, "mclk");
+       if (IS_ERR(tx->mclk))
+               return PTR_ERR(tx->mclk);
+
+       tx->npl = devm_clk_get(dev, "npl");
+       if (IS_ERR(tx->npl))
+               return PTR_ERR(tx->npl);
+
+       tx->fsgen = devm_clk_get(dev, "fsgen");
+       if (IS_ERR(tx->fsgen))
+               return PTR_ERR(tx->fsgen);
 
        base = devm_platform_ioremap_resource(pdev, 0);
        if (IS_ERR(base))
        tx->dev = dev;
 
        /* set MCLK and NPL rates */
-       clk_set_rate(tx->clks[2].clk, MCLK_FREQ);
-       clk_set_rate(tx->clks[3].clk, 2 * MCLK_FREQ);
+       clk_set_rate(tx->mclk, MCLK_FREQ);
+       clk_set_rate(tx->npl, 2 * MCLK_FREQ);
 
-       ret = clk_bulk_prepare_enable(TX_NUM_CLKS_MAX, tx->clks);
+       ret = clk_prepare_enable(tx->macro);
        if (ret)
-               return ret;
+               goto err;
+
+       ret = clk_prepare_enable(tx->dcodec);
+       if (ret)
+               goto err_dcodec;
+
+       ret = clk_prepare_enable(tx->mclk);
+       if (ret)
+               goto err_mclk;
+
+       ret = clk_prepare_enable(tx->npl);
+       if (ret)
+               goto err_npl;
+
+       ret = clk_prepare_enable(tx->fsgen);
+       if (ret)
+               goto err_fsgen;
 
        ret = tx_macro_register_mclk_output(tx);
        if (ret)
-               goto err;
+               goto err_clkout;
 
        ret = devm_snd_soc_register_component(dev, &tx_macro_component_drv,
                                              tx_macro_dai,
                                              ARRAY_SIZE(tx_macro_dai));
        if (ret)
-               goto err;
-       return ret;
-err:
-       clk_bulk_disable_unprepare(TX_NUM_CLKS_MAX, tx->clks);
+               goto err_clkout;
 
+       return 0;
+
+err_clkout:
+       clk_disable_unprepare(tx->fsgen);
+err_fsgen:
+       clk_disable_unprepare(tx->npl);
+err_npl:
+       clk_disable_unprepare(tx->mclk);
+err_mclk:
+       clk_disable_unprepare(tx->dcodec);
+err_dcodec:
+       clk_disable_unprepare(tx->macro);
+err:
        return ret;
 }
 
 {
        struct tx_macro *tx = dev_get_drvdata(&pdev->dev);
 
-       clk_bulk_disable_unprepare(TX_NUM_CLKS_MAX, tx->clks);
+       clk_disable_unprepare(tx->macro);
+       clk_disable_unprepare(tx->dcodec);
+       clk_disable_unprepare(tx->mclk);
+       clk_disable_unprepare(tx->npl);
+       clk_disable_unprepare(tx->fsgen);
 
        return 0;
 }