*/
 
 #include <linux/clk.h>
+#include <linux/delay.h>
 #include <linux/device.h>
 #include <linux/io.h>
 #include <linux/module.h>
 #include <linux/platform_device.h>
 #include <linux/pm_runtime.h>
 #include <linux/regmap.h>
+#include <linux/reset.h>
 #include <linux/slab.h>
 #include <sound/core.h>
 #include <sound/pcm.h>
 {
        struct tegra20_spdif *spdif = dev_get_drvdata(dev);
 
+       regcache_cache_only(spdif->regmap, true);
+
        clk_disable_unprepare(spdif->clk_spdif_out);
 
        return 0;
        struct tegra20_spdif *spdif = dev_get_drvdata(dev);
        int ret;
 
+       ret = reset_control_assert(spdif->reset);
+       if (ret)
+               return ret;
+
        ret = clk_prepare_enable(spdif->clk_spdif_out);
        if (ret) {
                dev_err(dev, "clk_enable failed: %d\n", ret);
                return ret;
        }
 
+       usleep_range(10, 100);
+
+       ret = reset_control_deassert(spdif->reset);
+       if (ret)
+               goto disable_clocks;
+
+       regcache_cache_only(spdif->regmap, false);
+       regcache_mark_dirty(spdif->regmap);
+
+       ret = regcache_sync(spdif->regmap);
+       if (ret)
+               goto disable_clocks;
+
        return 0;
+
+disable_clocks:
+       clk_disable_unprepare(spdif->clk_spdif_out);
+
+       return ret;
 }
 
 static int tegra20_spdif_hw_params(struct snd_pcm_substream *substream,
 
        dev_set_drvdata(&pdev->dev, spdif);
 
+       spdif->reset = devm_reset_control_get_exclusive(&pdev->dev, NULL);
+       if (IS_ERR(spdif->reset)) {
+               dev_err(&pdev->dev, "Can't retrieve spdif reset\n");
+               return PTR_ERR(spdif->reset);
+       }
+
        spdif->clk_spdif_out = devm_clk_get(&pdev->dev, "out");
        if (IS_ERR(spdif->clk_spdif_out)) {
                dev_err(&pdev->dev, "Could not retrieve spdif clock\n");