data->set_mclk = 0;
 
        clk_disable_unprepare(data->clk_cdev1);
-       clk_disable_unprepare(data->clk_pll_a_out0);
-       clk_disable_unprepare(data->clk_pll_a);
 
        err = clk_set_rate(data->clk_pll_a, new_baseclock);
        if (err) {
 
        /* Don't set cdev1/extern1 rate; it's locked to pll_a_out0 */
 
-       err = clk_prepare_enable(data->clk_pll_a);
-       if (err) {
-               dev_err(data->dev, "Can't enable pll_a: %d\n", err);
-               return err;
-       }
-
-       err = clk_prepare_enable(data->clk_pll_a_out0);
-       if (err) {
-               dev_err(data->dev, "Can't enable pll_a_out0: %d\n", err);
-               return err;
-       }
-
        err = clk_prepare_enable(data->clk_cdev1);
        if (err) {
                dev_err(data->dev, "Can't enable cdev1: %d\n", err);
        int err;
 
        clk_disable_unprepare(data->clk_cdev1);
-       clk_disable_unprepare(data->clk_pll_a_out0);
-       clk_disable_unprepare(data->clk_pll_a);
 
        /*
         * AC97 rate is fixed at 24.576MHz and is used for both the host
 
        /* Don't set cdev1/extern1 rate; it's locked to pll_a_out0 */
 
-       err = clk_prepare_enable(data->clk_pll_a);
-       if (err) {
-               dev_err(data->dev, "Can't enable pll_a: %d\n", err);
-               return err;
-       }
-
-       err = clk_prepare_enable(data->clk_pll_a_out0);
-       if (err) {
-               dev_err(data->dev, "Can't enable pll_a_out0: %d\n", err);
-               return err;
-       }
-
        err = clk_prepare_enable(data->clk_cdev1);
        if (err) {
                dev_err(data->dev, "Can't enable cdev1: %d\n", err);
 int tegra_asoc_utils_init(struct tegra_asoc_utils_data *data,
                          struct device *dev)
 {
+       struct clk *clk_out_1, *clk_extern1;
        int ret;
 
        data->dev = dev;
                return PTR_ERR(data->clk_cdev1);
        }
 
+       /*
+        * If clock parents are not set in DT, configure here to use clk_out_1
+        * as mclk and extern1 as parent for Tegra30 and higher.
+        */
+       if (!of_find_property(dev->of_node, "assigned-clock-parents", NULL) &&
+           data->soc > TEGRA_ASOC_UTILS_SOC_TEGRA20) {
+               dev_warn(data->dev,
+                        "Configuring clocks for a legacy device-tree\n");
+               dev_warn(data->dev,
+                        "Please update DT to use assigned-clock-parents\n");
+               clk_extern1 = devm_clk_get(dev, "extern1");
+               if (IS_ERR(clk_extern1)) {
+                       dev_err(data->dev, "Can't retrieve clk extern1\n");
+                       return PTR_ERR(clk_extern1);
+               }
+
+               ret = clk_set_parent(clk_extern1, data->clk_pll_a_out0);
+               if (ret < 0) {
+                       dev_err(data->dev,
+                               "Set parent failed for clk extern1\n");
+                       return ret;
+               }
+
+               clk_out_1 = devm_clk_get(dev, "pmc_clk_out_1");
+               if (IS_ERR(clk_out_1)) {
+                       dev_err(data->dev, "Can't retrieve pmc_clk_out_1\n");
+                       return PTR_ERR(clk_out_1);
+               }
+
+               ret = clk_set_parent(clk_out_1, clk_extern1);
+               if (ret < 0) {
+                       dev_err(data->dev,
+                               "Set parent failed for pmc_clk_out_1\n");
+                       return ret;
+               }
+
+               data->clk_cdev1 = clk_out_1;
+       }
+
        ret = tegra_asoc_utils_set_rate(data, 44100, 256 * 44100);
        if (ret)
                return ret;