From: Shine Liu <shinel@foxmail.com>
To: alsa-devel@alsa-project.org
Subject: [PATCH] ASoC: UDA134X Codec: Fix mute/unmute code mistake and add ADC/DAC power control support
Date: Mon, 17 Aug 2009 16:36:56 +0800 [thread overview]
Message-ID: <1250498216.2764.1.camel@shinel> (raw)
There is a mistake in current uda134x_mute function: mute_reg has been
changed in line 162 or line 164, so uda134x_write should write
"mute_reg" but not "mute_reg & ~(1<<2)" to
UDA134X_DATA010.
Besides, because there is no DAPM configuration for uda134x, when system
starts up, snd_soc_int_card calls snd_soc_dapm_new_widgets, and
snd_soc_dapm_new_widgets calls dapm_power_widgets. In function
dapm_power_widgets, codec->dapm_widgets has no list entry, so sys_power
retains it's original value zero. Then
snd_soc_dapm_set_bias_level(socdev, SND_SOC_BIAS_PREPARE) and
snd_soc_dapm_set_bias_level(socdev, SND_SOC_BIAS_STANDBY) are called
sequentially. Finally, the uda134x codec goes to STANDBY mode, so the
ADC/DAC power control bits of UDA134X_STATUS1 register keeps the 0
value.
UDA134X has no trigger function currently, and the ADC/DAC power control
bits of UDA134X_STATUS1 register are not exported in
uda1341_snd_controls, so there's no way to enable the ADC/DAC power
control bits when you want to use the codec. When playing with aplay or
recording with arecord, there is no sound output or no wave input.
I have added the uda134x_trigger function, which turns on/off the
ADC/DAC power control bits according the substream type and the command.
I also exported the ADC/DAC power control bits to uda1341_snd_controls,
so we can also turn these bits on/off as we need via a mixer tool like
alsamixer.
The patch created against linux-2.6.31-rc3.
Tested on a s3c2440 development board with UDA1341TS codec.
Signed-off-by: Shine Liu <shinel@foxmail.com>
--- sound/soc/codecs/uda134x.c.orig 2009-07-14 09:18:52.000000000 +0800
+++ sound/soc/codecs/uda134x.c 2009-08-17 13:46:57.000000000 +0800
@@ -163,7 +163,7 @@
else
mute_reg &= ~(1<<2);
- uda134x_write(codec, UDA134X_DATA010, mute_reg & ~(1<<2));
+ uda134x_write(codec, UDA134X_DATA010, mute_reg);
return 0;
}
@@ -339,6 +339,38 @@
return 0;
}
+static int uda134x_trigger(struct snd_pcm_substream *substream,
+ int cmd, struct snd_soc_dai *dai)
+{
+ int stream = substream->stream;
+ struct snd_soc_codec *codec = dai->codec;
+ u8 power_ctrl_reg = uda134x_read_reg_cache(codec, UDA134X_STATUS1);
+
+ pr_debug("%s stream: %d, cmd: %d\n", __func__, stream, cmd);
+
+ switch (cmd) {
+ case SNDRV_PCM_TRIGGER_START:
+ if (stream == SNDRV_PCM_STREAM_PLAYBACK)
+ power_ctrl_reg |= (1<<0);
+ else
+ power_ctrl_reg |= (1<<1);
+ break;
+
+ case SNDRV_PCM_TRIGGER_STOP:
+ if (stream == SNDRV_PCM_STREAM_PLAYBACK)
+ power_ctrl_reg &= ~(1<<0);
+ else
+ power_ctrl_reg &= ~(1<<1);
+ break;
+
+ default:
+ return 0;
+ }
+
+ uda134x_write(codec, UDA134X_STATUS1, power_ctrl_reg);
+ return 0;
+}
+
static int uda134x_set_bias_level(struct snd_soc_codec *codec,
enum snd_soc_bias_level level)
{
@@ -416,6 +448,8 @@
SOC_SINGLE("ADC Polarity Switch", UDA134X_STATUS1, 4, 1, 0),
SOC_SINGLE("DAC Polarity Switch", UDA134X_STATUS1, 3, 1, 0),
SOC_SINGLE("Double Speed Playback Switch", UDA134X_STATUS1, 2, 1, 0),
+SOC_SINGLE("ADC Power Switch", UDA134X_STATUS1, 1, 1, 0),
+SOC_SINGLE("DAC Power Switch", UDA134X_STATUS1, 0, 1, 0),
SOC_SINGLE("DC Filter Enable Switch", UDA134X_STATUS0, 0, 1, 0),
};
@@ -438,6 +472,7 @@
.digital_mute = uda134x_mute,
.set_sysclk = uda134x_set_dai_sysclk,
.set_fmt = uda134x_set_dai_fmt,
+ .trigger = uda134x_trigger,
};
struct snd_soc_dai uda134x_dai = {
next reply other threads:[~2009-08-17 8:37 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-08-17 8:36 Shine Liu [this message]
2009-08-17 10:32 ` [PATCH] ASoC: UDA134X Codec: Fix mute/unmute code mistake and add ADC/DAC power control support Mark Brown
2009-08-17 10:52 ` [PATCH] ASoC: UDA134X: Fix mistaken mute/unmute code Shine Liu
2009-08-17 10:59 ` Mark Brown
2009-08-17 11:22 ` [PATCH] ASoC: UDA134X Codec: Fix mute/unmute code mistake and add ADC/DAC power control support Shine Liu
2009-08-17 11:27 ` Mark Brown
2009-08-17 11:53 ` Shine Liu
2009-08-17 11:56 ` Mark Brown
2009-08-17 11:43 ` [PATCH] ASoC: UDA134X: Fix mistaken mute/unmute code Shine Liu
-- strict thread matches above, loose matches on Subject: below --
2009-08-17 6:57 [PATCH] ASoC: UDA134X Codec: Fix mute/unmute code mistake and add ADC/DAC power control support Shine Liu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1250498216.2764.1.camel@shinel \
--to=shinel@foxmail.com \
--cc=alsa-devel@alsa-project.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.