Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2e2aef7d authored by Hans Verkuil's avatar Hans Verkuil Committed by Mauro Carvalho Chehab
Browse files

V4L/DVB (4008): Audio soft reset improvements



The soft reset (de)assert commands where not at the right place.

Signed-off-by: default avatarHans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@infradead.org>
parent c0c044a7
Loading
Loading
Loading
Loading
+12 −8
Original line number Diff line number Diff line
@@ -30,10 +30,6 @@ static int set_audclk_freq(struct i2c_client *client, u32 freq)
	if (freq != 32000 && freq != 44100 && freq != 48000)
		return -EINVAL;

	/* assert soft reset */
	if (!state->is_cx25836)
		cx25840_and_or(client, 0x810, ~0x1, 0x01);

	/* common for all inputs and rates */
	/* SA_MCLK_SEL=1, SA_MCLK_DIV=0x10 */
	cx25840_write(client, 0x127, 0x50);
@@ -152,10 +148,6 @@ static int set_audclk_freq(struct i2c_client *client, u32 freq)
		}
	}

	/* deassert soft reset */
	if (!state->is_cx25836)
		cx25840_and_or(client, 0x810, ~0x1, 0x00);

	state->audclk_freq = freq;

	return 0;
@@ -168,6 +160,10 @@ void cx25840_audio_set_path(struct i2c_client *client)
	/* stop microcontroller */
	cx25840_and_or(client, 0x803, ~0x10, 0);

	/* assert soft reset */
	if (!state->is_cx25836)
		cx25840_and_or(client, 0x810, ~0x1, 0x01);

	/* Mute everything to prevent the PFFT! */
	cx25840_write(client, 0x8d3, 0x1f);

@@ -185,6 +181,10 @@ void cx25840_audio_set_path(struct i2c_client *client)

	set_audclk_freq(client, state->audclk_freq);

	/* deassert soft reset */
	if (!state->is_cx25836)
		cx25840_and_or(client, 0x810, ~0x1, 0x00);

	if (state->aud_input != CX25840_AUDIO_SERIAL) {
		/* When the microcontroller detects the
		 * audio format, it will unmute the lines */
@@ -323,7 +323,11 @@ int cx25840_audio(struct i2c_client *client, unsigned int cmd, void *arg)
			cx25840_and_or(client, 0x803, ~0x10, 0);
			cx25840_write(client, 0x8d3, 0x1f);
		}
		if (!state->is_cx25836)
			cx25840_and_or(client, 0x810, ~0x1, 1);
		retval = set_audclk_freq(client, *(u32 *)arg);
		if (!state->is_cx25836)
			cx25840_and_or(client, 0x810, ~0x1, 0);
		if (state->aud_input != CX25840_AUDIO_SERIAL) {
			cx25840_and_or(client, 0x803, ~0x10, 0x10);
		}