Commit 4ff2ae3a authored by Stefan Binding's avatar Stefan Binding Committed by Takashi Iwai
Browse files

ALSA: hda/cs8409: Follow correct CS42L42 power down sequence for suspend

parent c8b4f086
Loading
Loading
Loading
Loading
+22 −1
Original line number Diff line number Diff line
@@ -11,6 +11,7 @@
#include <linux/module.h>
#include <sound/core.h>
#include <linux/mutex.h>
#include <linux/iopoll.h>

#include "patch_cs8409.h"

@@ -219,6 +220,7 @@ static int cs8409_i2c_read(struct sub_codec *scodec, unsigned int addr)
	read_data = cs8409_vendor_coef_get(codec, CS8409_I2C_QREAD);

	mutex_unlock(&spec->i2c_mux);

	return read_data & 0x0ff;

error:
@@ -675,9 +677,28 @@ static void cs42l42_suspend(struct sub_codec *cs42l42)
{
	struct hda_codec *codec = cs42l42->codec;
	unsigned int gpio_data;
	int reg_cdc_status = 0;
	const struct cs8409_i2c_param cs42l42_pwr_down_seq[] = {
		{ 0x2301, 0x3F },
		{ 0x2302, 0x3F },
		{ 0x2303, 0x3F },
		{ 0x2001, 0x0F },
		{ 0x2A01, 0x00 },
		{ 0x1207, 0x00 },
		{ 0x1101, 0xFE },
		{ 0x1102, 0x8C },
		{ 0x1101, 0xFF },
	};

	cs8409_i2c_bulk_write(cs42l42, cs42l42_pwr_down_seq, ARRAY_SIZE(cs42l42_pwr_down_seq));

	if (read_poll_timeout(cs8409_i2c_read, reg_cdc_status,
			(reg_cdc_status & 0x1), CS42L42_PDN_SLEEP_US, CS42L42_PDN_TIMEOUT_US,
			true, cs42l42, 0x1308) < 0)
		codec_warn(codec, "Timeout waiting for PDN_DONE for CS42L42\n");

	/* Power down CS42L42 ASP/EQ/MIX/HP */
	cs8409_i2c_write(cs42l42, 0x1101, 0xfe);
	cs8409_i2c_write(cs42l42, 0x1102, 0x9C);
	cs42l42->suspended = 1;
	cs42l42->last_page = 0;

+2 −0
Original line number Diff line number Diff line
@@ -233,6 +233,8 @@ enum cs8409_coefficient_index_registers {
#define CS42L42_JACK_REMOVED			(0x00)
#define CS42L42_I2C_TIMEOUT_US			(20000)
#define CS42L42_I2C_SLEEP_US			(2000)
#define CS42L42_PDN_TIMEOUT_US			(250000)
#define CS42L42_PDN_SLEEP_US			(2000)

/* Dell BULLSEYE / WARLOCK / CYBORG Specific Definitions */