static int apq8016_lpass_init(struct platform_device *pdev)
 {
        struct lpass_data *drvdata = platform_get_drvdata(pdev);
+       struct lpass_variant *variant = drvdata->variant;
        struct device *dev = &pdev->dev;
-       int ret;
+       int ret, i;
 
-       drvdata->pcnoc_mport_clk = devm_clk_get(dev, "pcnoc-mport-clk");
-       if (IS_ERR(drvdata->pcnoc_mport_clk)) {
-               dev_err(dev, "error getting pcnoc-mport-clk: %ld\n",
-                       PTR_ERR(drvdata->pcnoc_mport_clk));
-               return PTR_ERR(drvdata->pcnoc_mport_clk);
-       }
 
-       ret = clk_prepare_enable(drvdata->pcnoc_mport_clk);
+       drvdata->clks = devm_kcalloc(dev, variant->num_clks,
+                                    sizeof(*drvdata->clks), GFP_KERNEL);
+       drvdata->num_clks = variant->num_clks;
+
+       for (i = 0; i < drvdata->num_clks; i++)
+               drvdata->clks[i].id = variant->clk_name[i];
+
+       ret = devm_clk_bulk_get(dev, drvdata->num_clks, drvdata->clks);
        if (ret) {
-               dev_err(dev, "Error enabling pcnoc-mport-clk: %d\n", ret);
+               dev_err(dev, "Failed to get clocks %d\n", ret);
                return ret;
        }
 
-       drvdata->pcnoc_sway_clk = devm_clk_get(dev, "pcnoc-sway-clk");
-       if (IS_ERR(drvdata->pcnoc_sway_clk)) {
-               dev_err(dev, "error getting pcnoc-sway-clk: %ld\n",
-                       PTR_ERR(drvdata->pcnoc_sway_clk));
-               return PTR_ERR(drvdata->pcnoc_sway_clk);
-       }
-
-       ret = clk_prepare_enable(drvdata->pcnoc_sway_clk);
+       ret = clk_bulk_prepare_enable(drvdata->num_clks, drvdata->clks);
        if (ret) {
-               dev_err(dev, "Error enabling pcnoc_sway_clk: %d\n", ret);
+               dev_err(dev, "apq8016 clk_enable failed\n");
                return ret;
        }
 
 {
        struct lpass_data *drvdata = platform_get_drvdata(pdev);
 
-       clk_disable_unprepare(drvdata->pcnoc_mport_clk);
-       clk_disable_unprepare(drvdata->pcnoc_sway_clk);
+       clk_bulk_disable_unprepare(drvdata->num_clks, drvdata->clks);
 
        return 0;
 }
        .wrdma_reg_stride       = 0x1000,
        .wrdma_channel_start    = 5,
        .wrdma_channels         = 2,
+       .clk_name               = (const char*[]) {
+                                  "pcnoc-mport-clk",
+                                  "pcnoc-sway-clk",
+                                 },
+       .num_clks               = 2,
        .dai_driver             = apq8016_lpass_cpu_dai_driver,
        .num_dai                = ARRAY_SIZE(apq8016_lpass_cpu_dai_driver),
        .dai_osr_clk_names      = (const char *[]) {
 
        /* used it for handling interrupt per dma channel */
        struct snd_pcm_substream *substream[LPASS_MAX_DMA_CHANNELS];
 
-       /* 8016 specific */
-       struct clk *pcnoc_mport_clk;
-       struct clk *pcnoc_sway_clk;
+       /* SOC specific clock list */
+       struct clk_bulk_data *clks;
+       int num_clks;
 
 };
 
        int num_dai;
        const char * const *dai_osr_clk_names;
        const char * const *dai_bit_clk_names;
+
+       /* SOC specific clocks configuration */
+       const char **clk_name;
+       int num_clks;
 };
 
 /* register the platform driver from the CPU DAI driver */