int softclip_clk_users;
 
        struct regmap *regmap;
-       struct clk_bulk_data clks[RX_NUM_CLKS_MAX];
+       struct clk *mclk;
+       struct clk *npl;
+       struct clk *macro;
+       struct clk *dcodec;
+       struct clk *fsgen;
        struct clk_hw hw;
 };
 #define to_rx_macro(_hw) container_of(_hw, struct rx_macro, hw)
        struct clk_init_data init;
        int ret;
 
-       parent_clk_name = __clk_get_name(rx->clks[2].clk);
+       parent_clk_name = __clk_get_name(rx->mclk);
 
        init.name = clk_name;
        init.ops = &swclk_gate_ops;
        if (!rx)
                return -ENOMEM;
 
-       rx->clks[0].id = "macro";
-       rx->clks[1].id = "dcodec";
-       rx->clks[2].id = "mclk";
-       rx->clks[3].id = "npl";
-       rx->clks[4].id = "fsgen";
+       rx->macro = devm_clk_get_optional(dev, "macro");
+       if (IS_ERR(rx->macro))
+               return PTR_ERR(rx->macro);
 
-       ret = devm_clk_bulk_get_optional(dev, RX_NUM_CLKS_MAX, rx->clks);
-       if (ret) {
-               dev_err(dev, "Error getting RX Clocks (%d)\n", ret);
-               return ret;
-       }
+       rx->dcodec = devm_clk_get_optional(dev, "dcodec");
+       if (IS_ERR(rx->dcodec))
+               return PTR_ERR(rx->dcodec);
+
+       rx->mclk = devm_clk_get(dev, "mclk");
+       if (IS_ERR(rx->mclk))
+               return PTR_ERR(rx->mclk);
+
+       rx->npl = devm_clk_get(dev, "npl");
+       if (IS_ERR(rx->npl))
+               return PTR_ERR(rx->npl);
+
+       rx->fsgen = devm_clk_get(dev, "fsgen");
+       if (IS_ERR(rx->fsgen))
+               return PTR_ERR(rx->fsgen);
 
        base = devm_platform_ioremap_resource(pdev, 0);
        if (IS_ERR(base))
        rx->dev = dev;
 
        /* set MCLK and NPL rates */
-       clk_set_rate(rx->clks[2].clk, MCLK_FREQ);
-       clk_set_rate(rx->clks[3].clk, 2 * MCLK_FREQ);
+       clk_set_rate(rx->mclk, MCLK_FREQ);
+       clk_set_rate(rx->npl, 2 * MCLK_FREQ);
 
-       ret = clk_bulk_prepare_enable(RX_NUM_CLKS_MAX, rx->clks);
+       ret = clk_prepare_enable(rx->macro);
        if (ret)
-               return ret;
+               goto err;
+
+       ret = clk_prepare_enable(rx->dcodec);
+       if (ret)
+               goto err_dcodec;
+
+       ret = clk_prepare_enable(rx->mclk);
+       if (ret)
+               goto err_mclk;
+
+       ret = clk_prepare_enable(rx->npl);
+       if (ret)
+               goto err_npl;
+
+       ret = clk_prepare_enable(rx->fsgen);
+       if (ret)
+               goto err_fsgen;
 
        ret = rx_macro_register_mclk_output(rx);
        if (ret)
-               goto err;
+               goto err_clkout;
 
        ret = devm_snd_soc_register_component(dev, &rx_macro_component_drv,
                                              rx_macro_dai,
                                              ARRAY_SIZE(rx_macro_dai));
        if (ret)
-               goto err;
+               goto err_clkout;
 
-       return ret;
+       return 0;
+
+err_clkout:
+       clk_disable_unprepare(rx->fsgen);
+err_fsgen:
+       clk_disable_unprepare(rx->npl);
+err_npl:
+       clk_disable_unprepare(rx->mclk);
+err_mclk:
+       clk_disable_unprepare(rx->dcodec);
+err_dcodec:
+       clk_disable_unprepare(rx->macro);
 err:
-       clk_bulk_disable_unprepare(RX_NUM_CLKS_MAX, rx->clks);
        return ret;
 }
 
 {
        struct rx_macro *rx = dev_get_drvdata(&pdev->dev);
 
-       clk_bulk_disable_unprepare(RX_NUM_CLKS_MAX, rx->clks);
+       clk_disable_unprepare(rx->mclk);
+       clk_disable_unprepare(rx->npl);
+       clk_disable_unprepare(rx->fsgen);
+       clk_disable_unprepare(rx->macro);
+       clk_disable_unprepare(rx->dcodec);
+
        return 0;
 }