* tegra_asoc_utils.c - Harmony machine ASoC driver
  *
  * Author: Stephen Warren <swarren@nvidia.com>
- * Copyright (C) 2010 - NVIDIA, Inc.
+ * Copyright (C) 2010,2012 - NVIDIA, Inc.
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
 #include <linux/err.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
+#include <linux/of.h>
 
 #include "tegra_asoc_utils.h"
 
        case 22050:
        case 44100:
        case 88200:
-               new_baseclock = 56448000;
+               if (data->soc == TEGRA_ASOC_UTILS_SOC_TEGRA20)
+                       new_baseclock = 56448000;
+               else
+                       new_baseclock = 564480000;
                break;
        case 8000:
        case 16000:
        case 48000:
        case 64000:
        case 96000:
-               new_baseclock = 73728000;
+               if (data->soc == TEGRA_ASOC_UTILS_SOC_TEGRA20)
+                       new_baseclock = 73728000;
+               else
+                       new_baseclock = 552960000;
                break;
        default:
                return -EINVAL;
                return err;
        }
 
-       /* Don't set cdev1 rate; its locked to pll_a_out0 */
+       /* Don't set cdev1/extern1 rate; it's locked to pll_a_out0 */
 
        err = clk_enable(data->clk_pll_a);
        if (err) {
 
        data->dev = dev;
 
+       if (!of_have_populated_dt())
+               data->soc = TEGRA_ASOC_UTILS_SOC_TEGRA20;
+       else if (of_machine_is_compatible("nvidia,tegra20"))
+               data->soc = TEGRA_ASOC_UTILS_SOC_TEGRA20;
+       else if (of_machine_is_compatible("nvidia,tegra30"))
+               data->soc = TEGRA_ASOC_UTILS_SOC_TEGRA30;
+       else
+               return -EINVAL;
+
        data->clk_pll_a = clk_get_sys(NULL, "pll_a");
        if (IS_ERR(data->clk_pll_a)) {
                dev_err(data->dev, "Can't retrieve clk pll_a\n");
                goto err_put_pll_a;
        }
 
-       data->clk_cdev1 = clk_get_sys(NULL, "cdev1");
+       if (data->soc == TEGRA_ASOC_UTILS_SOC_TEGRA20)
+               data->clk_cdev1 = clk_get_sys(NULL, "cdev1");
+       else
+               data->clk_cdev1 = clk_get_sys("extern1", NULL);
        if (IS_ERR(data->clk_cdev1)) {
                dev_err(data->dev, "Can't retrieve clk cdev1\n");
                ret = PTR_ERR(data->clk_cdev1);
 
  * tegra_asoc_utils.h - Definitions for Tegra DAS driver
  *
  * Author: Stephen Warren <swarren@nvidia.com>
- * Copyright (C) 2010 - NVIDIA, Inc.
+ * Copyright (C) 2010,2012 - NVIDIA, Inc.
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
 struct clk;
 struct device;
 
+enum tegra_asoc_utils_soc {
+       TEGRA_ASOC_UTILS_SOC_TEGRA20,
+       TEGRA_ASOC_UTILS_SOC_TEGRA30,
+};
+
 struct tegra_asoc_utils_data {
        struct device *dev;
+       enum tegra_asoc_utils_soc soc;
        struct clk *clk_pll_a;
        struct clk *clk_pll_a_out0;
        struct clk *clk_cdev1;
 void tegra_asoc_utils_fini(struct tegra_asoc_utils_data *data);
 
 #endif
-