Commit 87f0e46e authored by Dmitry Osipenko's avatar Dmitry Osipenko Committed by Takashi Iwai
Browse files

ALSA: hda/tegra: Reset hardware



Reset hardware on RPM-resume in order to bring it into a predictable
state.

Tested-by: Peter Geis <pgwipeout@gmail.com> # Ouya T30 audio works
Tested-by: Matt Merhar <mattmerhar@protonmail.com> # Ouya T30 boot-tested
Tested-by: Nicolas Chauvet <kwizart@gmail.com> # TK1 boot-tested
Signed-off-by: default avatarDmitry Osipenko <digetx@gmail.com>
Link: https://lore.kernel.org/r/20210120003154.26749-3-digetx@gmail.com


Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 3a465f02
Loading
Loading
Loading
Loading
+20 −0
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
#include <linux/moduleparam.h>
#include <linux/mutex.h>
#include <linux/of_device.h>
#include <linux/reset.h>
#include <linux/slab.h>
#include <linux/time.h>
#include <linux/string.h>
@@ -70,6 +71,7 @@
struct hda_tegra {
	struct azx chip;
	struct device *dev;
	struct reset_control *reset;
	struct clk_bulk_data clocks[3];
	unsigned int nclocks;
	void __iomem *regs;
@@ -167,6 +169,12 @@ static int __maybe_unused hda_tegra_runtime_resume(struct device *dev)
	struct hda_tegra *hda = container_of(chip, struct hda_tegra, chip);
	int rc;

	if (!chip->running) {
		rc = reset_control_assert(hda->reset);
		if (rc)
			return rc;
	}

	rc = clk_bulk_prepare_enable(hda->nclocks, hda->clocks);
	if (rc != 0)
		return rc;
@@ -176,6 +184,12 @@ static int __maybe_unused hda_tegra_runtime_resume(struct device *dev)
		/* disable controller wake up event*/
		azx_writew(chip, WAKEEN, azx_readw(chip, WAKEEN) &
			   ~STATESTS_INT_MASK);
	} else {
		usleep_range(10, 100);

		rc = reset_control_deassert(hda->reset);
		if (rc)
			return rc;
	}

	return 0;
@@ -441,6 +455,12 @@ static int hda_tegra_probe(struct platform_device *pdev)
		return err;
	}

	hda->reset = devm_reset_control_array_get_exclusive(&pdev->dev);
	if (IS_ERR(hda->reset)) {
		err = PTR_ERR(hda->reset);
		goto out_free;
	}

	hda->clocks[hda->nclocks++].id = "hda";
	hda->clocks[hda->nclocks++].id = "hda2hdmi";
	hda->clocks[hda->nclocks++].id = "hda2codec_2x";