Kirkwood audio fixes
cover Kirkwood audio fixes
Hi,
While working on the t5325 audio support, I found two small buglets in the kirkwood ASoC support.
The first one is aiming at fixing mono audio playback and should fix mono playback for all platforms.
The second is adding support for muting/unmuting kirkwood audio. It's mainly usefull for the t5325 which has a bootloader playing with this (hardware default is not muted).
Arnaud
PATCH 1/2 ASoC: Fix kirkwood i2s mono playback
Kirkwood controller needs to be informed if the audio stream is mono or not. Failing to do so will result in playing at the wrong speed.
sound/soc/kirkwood/kirkwood-i2s.c +9 -0
@@ -153,6 +153,15 @@default :return -EINVAL ; } + +if (substream->stream ==SNDRV_PCM_STREAM_PLAYBACK ) { + value &= ~KIRKWOOD_PLAYCTL_MONO_MASK ; +if (params_channels (params) ==1 ) + value |=KIRKWOOD_PLAYCTL_MONO_BOTH ; +else + value |=KIRKWOOD_PLAYCTL_MONO_OFF ; + } +writel (i2s_value, priv->io+i2s_reg);writel (value, priv->io+reg);
sound/soc/kirkwood/kirkwood.h +3 -0
@@ -49,6 +49,9 @@#define KIRKWOOD_PLAYCTL_BURST_32 (1<<11)#define KIRKWOOD_PLAYCTL_PAUSE (1<<9)#define KIRKWOOD_PLAYCTL_SPDIF_MUTE (1<<8) +#define KIRKWOOD_PLAYCTL_MONO_MASK (3<<5) +#define KIRKWOOD_PLAYCTL_MONO_BOTH (3<<5) +#define KIRKWOOD_PLAYCTL_MONO_OFF (0<<5)#define KIRKWOOD_PLAYCTL_I2S_MUTE (1<<7)#define KIRKWOOD_PLAYCTL_SPDIF_EN (1<<4)#define KIRKWOOD_PLAYCTL_I2S_EN (1<<3)
Mark Brown
AppliedRe: [patch 1/2] ASoC: Fix kirkwood i2s mono playback
Quoted 2 lines · On Sun, Jul 11, 2010 at 11:28:31PM +0200, [email protected] wrote:
Kirkwood controller needs to be informed if the audio stream is mono or not. Failing to do so will result in playing at the wrong speed.
Applied both, thanks.
PATCH 2/2 ASoC: kirkwood-i2s: Handle mute/unmute playback/record
In reply to [email protected]The controller has mute/unmute capability and some bootloader may mute them at boot. If it's not handled, all things will seem to be working but no sound will come out of the speaker/headphone.
sound/soc/kirkwood/kirkwood-i2s.c +10 -8
@@ -193,7 +193,8 @@/* configure audio & enable i2s playback */ value =readl (priv->io +KIRKWOOD_PLAYCTL ); value &= ~KIRKWOOD_PLAYCTL_BURST_MASK ; - value &= ~(KIRKWOOD_PLAYCTL_PAUSE |KIRKWOOD_PLAYCTL_SPDIF_EN ); + value &= ~(KIRKWOOD_PLAYCTL_PAUSE |KIRKWOOD_PLAYCTL_I2S_MUTE + |KIRKWOOD_PLAYCTL_SPDIF_EN );if (priv->burst ==32 ) value |=KIRKWOOD_PLAYCTL_BURST_32 ;
@@ -206,7 +207,7 @@case SNDRV_PCM_TRIGGER_STOP :/* stop audio, disable interrupts */ value =readl (priv->io +KIRKWOOD_PLAYCTL ); - value |=KIRKWOOD_PLAYCTL_PAUSE ; + value |=KIRKWOOD_PLAYCTL_PAUSE |KIRKWOOD_PLAYCTL_I2S_MUTE ;writel (value, priv->io +KIRKWOOD_PLAYCTL ); value =readl (priv->io +KIRKWOOD_INT_MASK );
@@ -222,14 +223,14 @@case SNDRV_PCM_TRIGGER_PAUSE_PUSH :case SNDRV_PCM_TRIGGER_SUSPEND : value =readl (priv->io +KIRKWOOD_PLAYCTL ); - value |=KIRKWOOD_PLAYCTL_PAUSE ; + value |=KIRKWOOD_PLAYCTL_PAUSE |KIRKWOOD_PLAYCTL_I2S_MUTE ;writel (value, priv->io +KIRKWOOD_PLAYCTL );break ;case SNDRV_PCM_TRIGGER_RESUME :case SNDRV_PCM_TRIGGER_PAUSE_RELEASE : value =readl (priv->io +KIRKWOOD_PLAYCTL ); - value &= ~KIRKWOOD_PLAYCTL_PAUSE ; + value &= ~(KIRKWOOD_PLAYCTL_PAUSE |KIRKWOOD_PLAYCTL_I2S_MUTE );writel (value, priv->io +KIRKWOOD_PLAYCTL );break ;
@@ -262,7 +263,8 @@ value =readl (priv->io +KIRKWOOD_RECCTL ); value &= ~KIRKWOOD_RECCTL_BURST_MASK ; value &= ~KIRKWOOD_RECCTL_MONO ; - value &= ~(KIRKWOOD_RECCTL_PAUSE |KIRKWOOD_RECCTL_SPDIF_EN ); + value &= ~(KIRKWOOD_RECCTL_PAUSE |KIRKWOOD_RECCTL_MUTE + |KIRKWOOD_RECCTL_SPDIF_EN );if (priv->burst ==32 ) value |=KIRKWOOD_RECCTL_BURST_32 ;
@@ -276,7 +278,7 @@case SNDRV_PCM_TRIGGER_STOP :/* stop audio, disable interrupts */ value =readl (priv->io +KIRKWOOD_RECCTL ); - value |=KIRKWOOD_RECCTL_PAUSE ; + value |=KIRKWOOD_RECCTL_PAUSE |KIRKWOOD_RECCTL_MUTE ;writel (value, priv->io +KIRKWOOD_RECCTL ); value =readl (priv->io +KIRKWOOD_INT_MASK );
@@ -292,14 +294,14 @@case SNDRV_PCM_TRIGGER_PAUSE_PUSH :case SNDRV_PCM_TRIGGER_SUSPEND : value =readl (priv->io +KIRKWOOD_RECCTL ); - value |=KIRKWOOD_RECCTL_PAUSE ; + value |=KIRKWOOD_RECCTL_PAUSE |KIRKWOOD_RECCTL_MUTE ;writel (value, priv->io +KIRKWOOD_RECCTL );break ;case SNDRV_PCM_TRIGGER_RESUME :case SNDRV_PCM_TRIGGER_PAUSE_RELEASE : value =readl (priv->io +KIRKWOOD_RECCTL ); - value &= ~KIRKWOOD_RECCTL_PAUSE ; + value &= ~(KIRKWOOD_RECCTL_PAUSE |KIRKWOOD_RECCTL_MUTE );writel (value, priv->io +KIRKWOOD_RECCTL );break ;
Quoted 13 lines · On Sun, 2010-07-11 at 23:28 +0200, [email protected] wrote:
Hi,
While working on the t5325 audio support, I found two small buglets in the kirkwood ASoC support.
The first one is aiming at fixing mono audio playback and should fix mono playback for all platforms.
The second is adding support for muting/unmuting kirkwood audio. It's mainly usefull for the t5325 which has a bootloader playing with this (hardware default is not muted).
All
Signature · 3 lines
Freelance Developer, SlimLogic Ltd ASoC and Voltage Regulator Maintainer. http://www.slimlogic.co.uk
Quoted 11 lines · On Sun, 2010-07-11 at 23:28 +0200, [email protected] wrote:
Hi,
While working on the t5325 audio support, I found two small buglets in the kirkwood ASoC support.
The first one is aiming at fixing mono audio playback and should fix mono playback for all platforms.
The second is adding support for muting/unmuting kirkwood audio. It's mainly usefull for the t5325 which has a bootloader playing with this (hardware default is not muted).
Signature · 3 lines
Freelance Developer, SlimLogic Ltd ASoC and Voltage Regulator Maintainer. http://www.slimlogic.co.uk