Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
53a2c4db
Commit
53a2c4db
authored
Mar 12, 2014
by
Mark Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'asoc/topic/dapm' into asoc-next
parents
da8ab21c
f9fa2b18
Changes
16
Hide whitespace changes
Inline
Side-by-side
Showing
16 changed files
with
324 additions
and
184 deletions
+324
-184
include/sound/soc-dapm.h
include/sound/soc-dapm.h
+1
-1
include/sound/soc.h
include/sound/soc.h
+11
-0
sound/soc/codecs/adav80x.c
sound/soc/codecs/adav80x.c
+11
-6
sound/soc/codecs/wm5100.c
sound/soc/codecs/wm5100.c
+9
-3
sound/soc/codecs/wm8962.c
sound/soc/codecs/wm8962.c
+9
-4
sound/soc/codecs/wm8994.c
sound/soc/codecs/wm8994.c
+27
-18
sound/soc/codecs/wm8996.c
sound/soc/codecs/wm8996.c
+7
-2
sound/soc/intel/mfld_machine.c
sound/soc/intel/mfld_machine.c
+41
-24
sound/soc/omap/ams-delta.c
sound/soc/omap/ams-delta.c
+26
-19
sound/soc/omap/n810.c
sound/soc/omap/n810.c
+13
-9
sound/soc/omap/rx51.c
sound/soc/omap/rx51.c
+13
-9
sound/soc/pxa/corgi.c
sound/soc/pxa/corgi.c
+23
-19
sound/soc/pxa/magician.c
sound/soc/pxa/magician.c
+13
-9
sound/soc/pxa/spitz.c
sound/soc/pxa/spitz.c
+28
-23
sound/soc/pxa/tosa.c
sound/soc/pxa/tosa.c
+16
-12
sound/soc/soc-dapm.c
sound/soc/soc-dapm.c
+76
-26
No files found.
include/sound/soc-dapm.h
View file @
53a2c4db
...
...
@@ -461,6 +461,7 @@ int snd_soc_dapm_nc_pin_unlocked(struct snd_soc_dapm_context *dapm,
int
snd_soc_dapm_get_pin_status
(
struct
snd_soc_dapm_context
*
dapm
,
const
char
*
pin
);
int
snd_soc_dapm_sync
(
struct
snd_soc_dapm_context
*
dapm
);
int
snd_soc_dapm_sync_unlocked
(
struct
snd_soc_dapm_context
*
dapm
);
int
snd_soc_dapm_force_enable_pin
(
struct
snd_soc_dapm_context
*
dapm
,
const
char
*
pin
);
int
snd_soc_dapm_force_enable_pin_unlocked
(
struct
snd_soc_dapm_context
*
dapm
,
...
...
@@ -470,7 +471,6 @@ int snd_soc_dapm_ignore_suspend(struct snd_soc_dapm_context *dapm,
void
snd_soc_dapm_auto_nc_codec_pins
(
struct
snd_soc_codec
*
codec
);
/* Mostly internal - should not normally be used */
void
dapm_mark_dirty
(
struct
snd_soc_dapm_widget
*
w
,
const
char
*
reason
);
void
dapm_mark_io_dirty
(
struct
snd_soc_dapm_context
*
dapm
);
/* dapm path query */
...
...
include/sound/soc.h
View file @
53a2c4db
...
...
@@ -1208,4 +1208,15 @@ extern struct dentry *snd_soc_debugfs_root;
extern
const
struct
dev_pm_ops
snd_soc_pm_ops
;
/* Helper functions */
static
inline
void
snd_soc_dapm_mutex_lock
(
struct
snd_soc_dapm_context
*
dapm
)
{
mutex_lock
(
&
dapm
->
card
->
dapm_mutex
);
}
static
inline
void
snd_soc_dapm_mutex_unlock
(
struct
snd_soc_dapm_context
*
dapm
)
{
mutex_unlock
(
&
dapm
->
card
->
dapm_mutex
);
}
#endif
sound/soc/codecs/adav80x.c
View file @
53a2c4db
...
...
@@ -541,6 +541,7 @@ static int adav80x_set_sysclk(struct snd_soc_codec *codec,
unsigned
int
freq
,
int
dir
)
{
struct
adav80x
*
adav80x
=
snd_soc_codec_get_drvdata
(
codec
);
struct
snd_soc_dapm_context
*
dapm
=
&
codec
->
dapm
;
if
(
dir
==
SND_SOC_CLOCK_IN
)
{
switch
(
clk_id
)
{
...
...
@@ -573,7 +574,7 @@ static int adav80x_set_sysclk(struct snd_soc_codec *codec,
regmap_write
(
adav80x
->
regmap
,
ADAV80X_ICLK_CTRL2
,
iclk_ctrl2
);
snd_soc_dapm_sync
(
&
codec
->
dapm
);
snd_soc_dapm_sync
(
dapm
);
}
}
else
{
unsigned
int
mask
;
...
...
@@ -600,17 +601,21 @@ static int adav80x_set_sysclk(struct snd_soc_codec *codec,
adav80x
->
sysclk_pd
[
clk_id
]
=
false
;
}
snd_soc_dapm_mutex_lock
(
dapm
);
if
(
adav80x
->
sysclk_pd
[
0
])
snd_soc_dapm_disable_pin
(
&
codec
->
dapm
,
"PLL1"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"PLL1"
);
else
snd_soc_dapm_force_enable_pin
(
&
codec
->
dapm
,
"PLL1"
);
snd_soc_dapm_force_enable_pin
_unlocked
(
dapm
,
"PLL1"
);
if
(
adav80x
->
sysclk_pd
[
1
]
||
adav80x
->
sysclk_pd
[
2
])
snd_soc_dapm_disable_pin
(
&
codec
->
dapm
,
"PLL2"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"PLL2"
);
else
snd_soc_dapm_force_enable_pin
(
&
codec
->
dapm
,
"PLL2"
);
snd_soc_dapm_force_enable_pin
_unlocked
(
dapm
,
"PLL2"
);
snd_soc_dapm_sync
(
&
codec
->
dapm
);
snd_soc_dapm_sync_unlocked
(
dapm
);
snd_soc_dapm_mutex_unlock
(
dapm
);
}
return
0
;
...
...
sound/soc/codecs/wm5100.c
View file @
53a2c4db
...
...
@@ -2100,6 +2100,7 @@ static void wm5100_micd_irq(struct wm5100_priv *wm5100)
int
wm5100_detect
(
struct
snd_soc_codec
*
codec
,
struct
snd_soc_jack
*
jack
)
{
struct
wm5100_priv
*
wm5100
=
snd_soc_codec_get_drvdata
(
codec
);
struct
snd_soc_dapm_context
*
dapm
=
&
codec
->
dapm
;
if
(
jack
)
{
wm5100
->
jack
=
jack
;
...
...
@@ -2117,9 +2118,14 @@ int wm5100_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack)
WM5100_ACCDET_RATE_MASK
);
/* We need the charge pump to power MICBIAS */
snd_soc_dapm_force_enable_pin
(
&
codec
->
dapm
,
"CP2"
);
snd_soc_dapm_force_enable_pin
(
&
codec
->
dapm
,
"SYSCLK"
);
snd_soc_dapm_sync
(
&
codec
->
dapm
);
snd_soc_dapm_mutex_lock
(
dapm
);
snd_soc_dapm_force_enable_pin_unlocked
(
dapm
,
"CP2"
);
snd_soc_dapm_force_enable_pin_unlocked
(
dapm
,
"SYSCLK"
);
snd_soc_dapm_sync_unlocked
(
dapm
);
snd_soc_dapm_mutex_unlock
(
dapm
);
/* We start off just enabling microphone detection - even a
* plain headphone will trigger detection.
...
...
sound/soc/codecs/wm8962.c
View file @
53a2c4db
...
...
@@ -3089,6 +3089,7 @@ static irqreturn_t wm8962_irq(int irq, void *data)
int
wm8962_mic_detect
(
struct
snd_soc_codec
*
codec
,
struct
snd_soc_jack
*
jack
)
{
struct
wm8962_priv
*
wm8962
=
snd_soc_codec_get_drvdata
(
codec
);
struct
snd_soc_dapm_context
*
dapm
=
&
codec
->
dapm
;
int
irq_mask
,
enable
;
wm8962
->
jack
=
jack
;
...
...
@@ -3109,14 +3110,18 @@ int wm8962_mic_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack)
snd_soc_jack_report
(
wm8962
->
jack
,
0
,
SND_JACK_MICROPHONE
|
SND_JACK_BTN_0
);
snd_soc_dapm_mutex_lock
(
dapm
);
if
(
jack
)
{
snd_soc_dapm_force_enable_pin
(
&
codec
->
dapm
,
"SYSCLK"
);
snd_soc_dapm_force_enable_pin
(
&
codec
->
dapm
,
"MICBIAS"
);
snd_soc_dapm_force_enable_pin
_unlocked
(
dapm
,
"SYSCLK"
);
snd_soc_dapm_force_enable_pin
_unlocked
(
dapm
,
"MICBIAS"
);
}
else
{
snd_soc_dapm_disable_pin
(
&
codec
->
dapm
,
"SYSCLK"
);
snd_soc_dapm_disable_pin
(
&
codec
->
dapm
,
"MICBIAS"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"SYSCLK"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"MICBIAS"
);
}
snd_soc_dapm_mutex_unlock
(
dapm
);
return
0
;
}
EXPORT_SYMBOL_GPL
(
wm8962_mic_detect
);
...
...
sound/soc/codecs/wm8994.c
View file @
53a2c4db
...
...
@@ -2554,43 +2554,52 @@ static int wm8994_set_bias_level(struct snd_soc_codec *codec,
int
wm8994_vmid_mode
(
struct
snd_soc_codec
*
codec
,
enum
wm8994_vmid_mode
mode
)
{
struct
wm8994_priv
*
wm8994
=
snd_soc_codec_get_drvdata
(
codec
);
struct
snd_soc_dapm_context
*
dapm
=
&
codec
->
dapm
;
switch
(
mode
)
{
case
WM8994_VMID_NORMAL
:
snd_soc_dapm_mutex_lock
(
dapm
);
if
(
wm8994
->
hubs
.
lineout1_se
)
{
snd_soc_dapm_disable_pin
(
&
codec
->
dapm
,
"LINEOUT1N Driver"
);
snd_soc_dapm_disable_pin
(
&
codec
->
dapm
,
"LINEOUT1P Driver"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"LINEOUT1N Driver"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"LINEOUT1P Driver"
);
}
if
(
wm8994
->
hubs
.
lineout2_se
)
{
snd_soc_dapm_disable_pin
(
&
codec
->
dapm
,
"LINEOUT2N Driver"
);
snd_soc_dapm_disable_pin
(
&
codec
->
dapm
,
"LINEOUT2P Driver"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"LINEOUT2N Driver"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"LINEOUT2P Driver"
);
}
/* Do the sync with the old mode to allow it to clean up */
snd_soc_dapm_sync
(
&
codec
->
dapm
);
snd_soc_dapm_sync
_unlocked
(
dapm
);
wm8994
->
vmid_mode
=
mode
;
snd_soc_dapm_mutex_unlock
(
dapm
);
break
;
case
WM8994_VMID_FORCE
:
snd_soc_dapm_mutex_lock
(
dapm
);
if
(
wm8994
->
hubs
.
lineout1_se
)
{
snd_soc_dapm_force_enable_pin
(
&
codec
->
dapm
,
"LINEOUT1N Driver"
);
snd_soc_dapm_force_enable_pin
(
&
codec
->
dapm
,
"LINEOUT1P Driver"
);
snd_soc_dapm_force_enable_pin
_unlocked
(
dapm
,
"LINEOUT1N Driver"
);
snd_soc_dapm_force_enable_pin
_unlocked
(
dapm
,
"LINEOUT1P Driver"
);
}
if
(
wm8994
->
hubs
.
lineout2_se
)
{
snd_soc_dapm_force_enable_pin
(
&
codec
->
dapm
,
"LINEOUT2N Driver"
);
snd_soc_dapm_force_enable_pin
(
&
codec
->
dapm
,
"LINEOUT2P Driver"
);
snd_soc_dapm_force_enable_pin
_unlocked
(
dapm
,
"LINEOUT2N Driver"
);
snd_soc_dapm_force_enable_pin
_unlocked
(
dapm
,
"LINEOUT2P Driver"
);
}
wm8994
->
vmid_mode
=
mode
;
snd_soc_dapm_sync
(
&
codec
->
dapm
);
snd_soc_dapm_sync_unlocked
(
dapm
);
snd_soc_dapm_mutex_unlock
(
dapm
);
break
;
default:
...
...
sound/soc/codecs/wm8996.c
View file @
53a2c4db
...
...
@@ -2251,6 +2251,7 @@ int wm8996_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack,
wm8996_polarity_fn
polarity_cb
)
{
struct
wm8996_priv
*
wm8996
=
snd_soc_codec_get_drvdata
(
codec
);
struct
snd_soc_dapm_context
*
dapm
=
&
codec
->
dapm
;
wm8996
->
jack
=
jack
;
wm8996
->
detecting
=
true
;
...
...
@@ -2267,8 +2268,12 @@ int wm8996_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack,
WM8996_MICB2_DISCH
,
0
);
/* LDO2 powers the microphones, SYSCLK clocks detection */
snd_soc_dapm_force_enable_pin
(
&
codec
->
dapm
,
"LDO2"
);
snd_soc_dapm_force_enable_pin
(
&
codec
->
dapm
,
"SYSCLK"
);
snd_soc_dapm_mutex_lock
(
dapm
);
snd_soc_dapm_force_enable_pin_unlocked
(
dapm
,
"LDO2"
);
snd_soc_dapm_force_enable_pin_unlocked
(
dapm
,
"SYSCLK"
);
snd_soc_dapm_mutex_unlock
(
dapm
);
/* We start off just enabling microphone detection - even a
* plain headphone will trigger detection.
...
...
sound/soc/intel/mfld_machine.c
View file @
53a2c4db
...
...
@@ -101,20 +101,27 @@ static int headset_set_switch(struct snd_kcontrol *kcontrol,
struct
snd_ctl_elem_value
*
ucontrol
)
{
struct
snd_soc_codec
*
codec
=
snd_kcontrol_chip
(
kcontrol
);
struct
snd_soc_dapm_context
*
dapm
=
&
codec
->
dapm
;
if
(
ucontrol
->
value
.
integer
.
value
[
0
]
==
hs_switch
)
return
0
;
snd_soc_dapm_mutex_lock
(
dapm
);
if
(
ucontrol
->
value
.
integer
.
value
[
0
])
{
pr_debug
(
"hs_set HS path
\n
"
);
snd_soc_dapm_enable_pin
(
&
codec
->
dapm
,
"Headphones"
);
snd_soc_dapm_disable_pin
(
&
codec
->
dapm
,
"EPOUT"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"Headphones"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"EPOUT"
);
}
else
{
pr_debug
(
"hs_set EP path
\n
"
);
snd_soc_dapm_disable_pin
(
&
codec
->
dapm
,
"Headphones"
);
snd_soc_dapm_enable_pin
(
&
codec
->
dapm
,
"EPOUT"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Headphones"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"EPOUT"
);
}
snd_soc_dapm_sync
(
&
codec
->
dapm
);
snd_soc_dapm_sync_unlocked
(
dapm
);
snd_soc_dapm_mutex_unlock
(
dapm
);
hs_switch
=
ucontrol
->
value
.
integer
.
value
[
0
];
return
0
;
...
...
@@ -122,18 +129,20 @@ static int headset_set_switch(struct snd_kcontrol *kcontrol,
static
void
lo_enable_out_pins
(
struct
snd_soc_codec
*
codec
)
{
snd_soc_dapm_enable_pin
(
&
codec
->
dapm
,
"IHFOUTL"
);
snd_soc_dapm_enable_pin
(
&
codec
->
dapm
,
"IHFOUTR"
);
snd_soc_dapm_enable_pin
(
&
codec
->
dapm
,
"LINEOUTL"
);
snd_soc_dapm_enable_pin
(
&
codec
->
dapm
,
"LINEOUTR"
);
snd_soc_dapm_enable_pin
(
&
codec
->
dapm
,
"VIB1OUT"
);
snd_soc_dapm_enable_pin
(
&
codec
->
dapm
,
"VIB2OUT"
);
struct
snd_soc_dapm_context
*
dapm
=
&
codec
->
dapm
;
snd_soc_dapm_enable_pin_unlocked
(
dapm
,
"IHFOUTL"
);
snd_soc_dapm_enable_pin_unlocked
(
dapm
,
"IHFOUTR"
);
snd_soc_dapm_enable_pin_unlocked
(
dapm
,
"LINEOUTL"
);
snd_soc_dapm_enable_pin_unlocked
(
dapm
,
"LINEOUTR"
);
snd_soc_dapm_enable_pin_unlocked
(
dapm
,
"VIB1OUT"
);
snd_soc_dapm_enable_pin_unlocked
(
dapm
,
"VIB2OUT"
);
if
(
hs_switch
)
{
snd_soc_dapm_enable_pin
(
&
codec
->
dapm
,
"Headphones"
);
snd_soc_dapm_disable_pin
(
&
codec
->
dapm
,
"EPOUT"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"Headphones"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"EPOUT"
);
}
else
{
snd_soc_dapm_disable_pin
(
&
codec
->
dapm
,
"Headphones"
);
snd_soc_dapm_enable_pin
(
&
codec
->
dapm
,
"EPOUT"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Headphones"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"EPOUT"
);
}
}
...
...
@@ -148,44 +157,52 @@ static int lo_set_switch(struct snd_kcontrol *kcontrol,
struct
snd_ctl_elem_value
*
ucontrol
)
{
struct
snd_soc_codec
*
codec
=
snd_kcontrol_chip
(
kcontrol
);
struct
snd_soc_dapm_context
*
dapm
=
&
codec
->
dapm
;
if
(
ucontrol
->
value
.
integer
.
value
[
0
]
==
lo_dac
)
return
0
;
snd_soc_dapm_mutex_lock
(
dapm
);
/* we dont want to work with last state of lineout so just enable all
* pins and then disable pins not required
*/
lo_enable_out_pins
(
codec
);
switch
(
ucontrol
->
value
.
integer
.
value
[
0
])
{
case
0
:
pr_debug
(
"set vibra path
\n
"
);
snd_soc_dapm_disable_pin
(
&
codec
->
dapm
,
"VIB1OUT"
);
snd_soc_dapm_disable_pin
(
&
codec
->
dapm
,
"VIB2OUT"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"VIB1OUT"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"VIB2OUT"
);
snd_soc_update_bits
(
codec
,
SN95031_LOCTL
,
0x66
,
0
);
break
;
case
1
:
pr_debug
(
"set hs path
\n
"
);
snd_soc_dapm_disable_pin
(
&
codec
->
dapm
,
"Headphones"
);
snd_soc_dapm_disable_pin
(
&
codec
->
dapm
,
"EPOUT"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Headphones"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"EPOUT"
);
snd_soc_update_bits
(
codec
,
SN95031_LOCTL
,
0x66
,
0x22
);
break
;
case
2
:
pr_debug
(
"set spkr path
\n
"
);
snd_soc_dapm_disable_pin
(
&
codec
->
dapm
,
"IHFOUTL"
);
snd_soc_dapm_disable_pin
(
&
codec
->
dapm
,
"IHFOUTR"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"IHFOUTL"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"IHFOUTR"
);
snd_soc_update_bits
(
codec
,
SN95031_LOCTL
,
0x66
,
0x44
);
break
;
case
3
:
pr_debug
(
"set null path
\n
"
);
snd_soc_dapm_disable_pin
(
&
codec
->
dapm
,
"LINEOUTL"
);
snd_soc_dapm_disable_pin
(
&
codec
->
dapm
,
"LINEOUTR"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"LINEOUTL"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"LINEOUTR"
);
snd_soc_update_bits
(
codec
,
SN95031_LOCTL
,
0x66
,
0x66
);
break
;
}
snd_soc_dapm_sync
(
&
codec
->
dapm
);
snd_soc_dapm_sync_unlocked
(
dapm
);
snd_soc_dapm_mutex_unlock
(
dapm
);
lo_dac
=
ucontrol
->
value
.
integer
.
value
[
0
];
return
0
;
}
...
...
sound/soc/omap/ams-delta.c
View file @
53a2c4db
...
...
@@ -106,57 +106,59 @@ static int ams_delta_set_audio_mode(struct snd_kcontrol *kcontrol,
if
(
ucontrol
->
value
.
enumerated
.
item
[
0
]
>=
control
->
max
)
return
-
EINVAL
;
mutex_lock
(
&
codec
->
mutex
);
snd_soc_dapm_mutex_lock
(
dapm
);
/* Translate selection to bitmap */
pins
=
ams_delta_audio_mode_pins
[
ucontrol
->
value
.
enumerated
.
item
[
0
]];
/* Setup pins after corresponding bits if changed */
pin
=
!!
(
pins
&
(
1
<<
AMS_DELTA_MOUTHPIECE
));
if
(
pin
!=
snd_soc_dapm_get_pin_status
(
dapm
,
"Mouthpiece"
))
{
changed
=
1
;
if
(
pin
)
snd_soc_dapm_enable_pin
(
dapm
,
"Mouthpiece"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"Mouthpiece"
);
else
snd_soc_dapm_disable_pin
(
dapm
,
"Mouthpiece"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Mouthpiece"
);
}
pin
=
!!
(
pins
&
(
1
<<
AMS_DELTA_EARPIECE
));
if
(
pin
!=
snd_soc_dapm_get_pin_status
(
dapm
,
"Earpiece"
))
{
changed
=
1
;
if
(
pin
)
snd_soc_dapm_enable_pin
(
dapm
,
"Earpiece"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"Earpiece"
);
else
snd_soc_dapm_disable_pin
(
dapm
,
"Earpiece"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Earpiece"
);
}
pin
=
!!
(
pins
&
(
1
<<
AMS_DELTA_MICROPHONE
));
if
(
pin
!=
snd_soc_dapm_get_pin_status
(
dapm
,
"Microphone"
))
{
changed
=
1
;
if
(
pin
)
snd_soc_dapm_enable_pin
(
dapm
,
"Microphone"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"Microphone"
);
else
snd_soc_dapm_disable_pin
(
dapm
,
"Microphone"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Microphone"
);
}
pin
=
!!
(
pins
&
(
1
<<
AMS_DELTA_SPEAKER
));
if
(
pin
!=
snd_soc_dapm_get_pin_status
(
dapm
,
"Speaker"
))
{
changed
=
1
;
if
(
pin
)
snd_soc_dapm_enable_pin
(
dapm
,
"Speaker"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"Speaker"
);
else
snd_soc_dapm_disable_pin
(
dapm
,
"Speaker"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Speaker"
);
}
pin
=
!!
(
pins
&
(
1
<<
AMS_DELTA_AGC
));
if
(
pin
!=
ams_delta_audio_agc
)
{
ams_delta_audio_agc
=
pin
;
changed
=
1
;
if
(
pin
)
snd_soc_dapm_enable_pin
(
dapm
,
"AGCIN"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"AGCIN"
);
else
snd_soc_dapm_disable_pin
(
dapm
,
"AGCIN"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"AGCIN"
);
}
if
(
changed
)
snd_soc_dapm_sync
(
dapm
);
snd_soc_dapm_sync
_unlocked
(
dapm
);
mutex_unlock
(
&
codec
->
mutex
);
snd_soc_dapm_mutex_unlock
(
dapm
);
return
changed
;
}
...
...
@@ -315,12 +317,17 @@ static void cx81801_close(struct tty_struct *tty)
v253_ops
.
close
(
tty
);
/* Revert back to default audio input/output constellation */
snd_soc_dapm_disable_pin
(
dapm
,
"Mouthpiece"
);
snd_soc_dapm_enable_pin
(
dapm
,
"Earpiece"
);
snd_soc_dapm_enable_pin
(
dapm
,
"Microphone"
);
snd_soc_dapm_disable_pin
(
dapm
,
"Speaker"
);
snd_soc_dapm_disable_pin
(
dapm
,
"AGCIN"
);
snd_soc_dapm_sync
(
dapm
);
snd_soc_dapm_mutex_lock
(
dapm
);
snd_soc_dapm_disable_pin_unlocked
(
dapm
,
"Mouthpiece"
);
snd_soc_dapm_enable_pin_unlocked
(
dapm
,
"Earpiece"
);
snd_soc_dapm_enable_pin_unlocked
(
dapm
,
"Microphone"
);
snd_soc_dapm_disable_pin_unlocked
(
dapm
,
"Speaker"
);
snd_soc_dapm_disable_pin_unlocked
(
dapm
,
"AGCIN"
);
snd_soc_dapm_sync_unlocked
(
dapm
);
snd_soc_dapm_mutex_unlock
(
codec
);
}
/* Line discipline .hangup() */
...
...
sound/soc/omap/n810.c
View file @
53a2c4db
...
...
@@ -68,26 +68,30 @@ static void n810_ext_control(struct snd_soc_dapm_context *dapm)
break
;
}
snd_soc_dapm_mutex_lock
(
dapm
);
if
(
n810_spk_func
)
snd_soc_dapm_enable_pin
(
dapm
,
"Ext Spk"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"Ext Spk"
);
else
snd_soc_dapm_disable_pin
(
dapm
,
"Ext Spk"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Ext Spk"
);
if
(
hp
)
snd_soc_dapm_enable_pin
(
dapm
,
"Headphone Jack"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"Headphone Jack"
);
else
snd_soc_dapm_disable_pin
(
dapm
,
"Headphone Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Headphone Jack"
);
if
(
line1l
)
snd_soc_dapm_enable_pin
(
dapm
,
"LINE1L"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"LINE1L"
);
else
snd_soc_dapm_disable_pin
(
dapm
,
"LINE1L"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"LINE1L"
);
if
(
n810_dmic_func
)
snd_soc_dapm_enable_pin
(
dapm
,
"DMic"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"DMic"
);
else
snd_soc_dapm_disable_pin
(
dapm
,
"DMic"
);
snd_soc_dapm_disable_pin_unlocked
(
dapm
,
"DMic"
);
snd_soc_dapm_sync_unlocked
(
dapm
);
snd_soc_dapm_
sync
(
dapm
);
snd_soc_dapm_
mutex_unlock
(
dapm
);
}
static
int
n810_startup
(
struct
snd_pcm_substream
*
substream
)
...
...
sound/soc/omap/rx51.c
View file @
53a2c4db
...
...
@@ -74,26 +74,30 @@ static void rx51_ext_control(struct snd_soc_dapm_context *dapm)
break
;
}
snd_soc_dapm_mutex_lock
(
dapm
);
if
(
rx51_spk_func
)
snd_soc_dapm_enable_pin
(
dapm
,
"Ext Spk"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"Ext Spk"
);
else
snd_soc_dapm_disable_pin
(
dapm
,
"Ext Spk"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Ext Spk"
);
if
(
rx51_dmic_func
)
snd_soc_dapm_enable_pin
(
dapm
,
"DMic"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"DMic"
);
else
snd_soc_dapm_disable_pin
(
dapm
,
"DMic"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"DMic"
);
if
(
hp
)
snd_soc_dapm_enable_pin
(
dapm
,
"Headphone Jack"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"Headphone Jack"
);
else
snd_soc_dapm_disable_pin
(
dapm
,
"Headphone Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Headphone Jack"
);
if
(
hs
)
snd_soc_dapm_enable_pin
(
dapm
,
"HS Mic"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"HS Mic"
);
else
snd_soc_dapm_disable_pin
(
dapm
,
"HS Mic"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"HS Mic"
);
gpio_set_value
(
RX51_TVOUT_SEL_GPIO
,
tvout
);
snd_soc_dapm_sync
(
dapm
);
snd_soc_dapm_sync_unlocked
(
dapm
);
snd_soc_dapm_mutex_unlock
(
dapm
);
}
static
int
rx51_startup
(
struct
snd_pcm_substream
*
substream
)
...
...
sound/soc/pxa/corgi.c
View file @
53a2c4db
...
...
@@ -47,51 +47,55 @@ static int corgi_spk_func;
static
void
corgi_ext_control
(
struct
snd_soc_dapm_context
*
dapm
)
{
snd_soc_dapm_mutex_lock
(
dapm
);
/* set up jack connection */
switch
(
corgi_jack_func
)
{
case
CORGI_HP
:
/* set = unmute headphone */
gpio_set_value
(
CORGI_GPIO_MUTE_L
,
1
);
gpio_set_value
(
CORGI_GPIO_MUTE_R
,
1
);
snd_soc_dapm_disable_pin
(
dapm
,
"Mic Jack"
);
snd_soc_dapm_disable_pin
(
dapm
,
"Line Jack"
);
snd_soc_dapm_enable_pin
(
dapm
,
"Headphone Jack"
);
snd_soc_dapm_disable_pin
(
dapm
,
"Headset Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Mic Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Line Jack"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"Headphone Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Headset Jack"
);
break
;
case
CORGI_MIC
:
/* reset = mute headphone */
gpio_set_value
(
CORGI_GPIO_MUTE_L
,
0
);
gpio_set_value
(
CORGI_GPIO_MUTE_R
,
0
);
snd_soc_dapm_enable_pin
(
dapm
,
"Mic Jack"
);
snd_soc_dapm_disable_pin
(
dapm
,
"Line Jack"
);
snd_soc_dapm_disable_pin
(
dapm
,
"Headphone Jack"
);
snd_soc_dapm_disable_pin
(
dapm
,
"Headset Jack"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"Mic Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Line Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Headphone Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Headset Jack"
);
break
;
case
CORGI_LINE
:
gpio_set_value
(
CORGI_GPIO_MUTE_L
,
0
);
gpio_set_value
(
CORGI_GPIO_MUTE_R
,
0
);
snd_soc_dapm_disable_pin
(
dapm
,
"Mic Jack"
);
snd_soc_dapm_enable_pin
(
dapm
,
"Line Jack"
);
snd_soc_dapm_disable_pin
(
dapm
,
"Headphone Jack"
);
snd_soc_dapm_disable_pin
(
dapm
,
"Headset Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Mic Jack"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"Line Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Headphone Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Headset Jack"
);
break
;
case
CORGI_HEADSET
:
gpio_set_value
(
CORGI_GPIO_MUTE_L
,
0
);
gpio_set_value
(
CORGI_GPIO_MUTE_R
,
1
);
snd_soc_dapm_enable_pin
(
dapm
,
"Mic Jack"
);
snd_soc_dapm_disable_pin
(
dapm
,
"Line Jack"
);
snd_soc_dapm_disable_pin
(
dapm
,
"Headphone Jack"
);
snd_soc_dapm_enable_pin
(
dapm
,
"Headset Jack"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"Mic Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Line Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Headphone Jack"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"Headset Jack"
);
break
;
}
if
(
corgi_spk_func
==
CORGI_SPK_ON
)
snd_soc_dapm_enable_pin
(
dapm
,
"Ext Spk"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"Ext Spk"
);
else
snd_soc_dapm_disable_pin
(
dapm
,
"Ext Spk"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Ext Spk"
);
/* signal a DAPM event */
snd_soc_dapm_sync
(
dapm
);
snd_soc_dapm_sync_unlocked
(
dapm
);
snd_soc_dapm_mutex_unlock
(
dapm
);
}
static
int
corgi_startup
(
struct
snd_pcm_substream
*
substream
)
...
...
sound/soc/pxa/magician.c
View file @
53a2c4db
...
...
@@ -45,27 +45,31 @@ static void magician_ext_control(struct snd_soc_codec *codec)
{
struct
snd_soc_dapm_context
*
dapm
=
&
codec
->
dapm
;
snd_soc_dapm_mutex_lock
(
dapm
);
if
(
magician_spk_switch
)
snd_soc_dapm_enable_pin
(
dapm
,
"Speaker"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"Speaker"
);
else
snd_soc_dapm_disable_pin
(
dapm
,
"Speaker"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Speaker"
);
if
(
magician_hp_switch
)
snd_soc_dapm_enable_pin
(
dapm
,
"Headphone Jack"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"Headphone Jack"
);
else
snd_soc_dapm_disable_pin
(
dapm
,
"Headphone Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Headphone Jack"
);
switch
(
magician_in_sel
)
{
case
MAGICIAN_MIC
:
snd_soc_dapm_disable_pin
(
dapm
,
"Headset Mic"
);
snd_soc_dapm_enable_pin
(
dapm
,
"Call Mic"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Headset Mic"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"Call Mic"
);
break
;
case
MAGICIAN_MIC_EXT
:
snd_soc_dapm_disable_pin
(
dapm
,
"Call Mic"
);
snd_soc_dapm_enable_pin
(
dapm
,
"Headset Mic"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Call Mic"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"Headset Mic"
);
break
;
}
snd_soc_dapm_sync
(
dapm
);
snd_soc_dapm_sync_unlocked
(
dapm
);
snd_soc_dapm_mutex_unlock
(
dapm
);
}
static
int
magician_startup
(
struct
snd_pcm_substream
*
substream
)
...
...
sound/soc/pxa/spitz.c
View file @
53a2c4db
...
...
@@ -46,61 +46,66 @@ static int spitz_mic_gpio;
static
void
spitz_ext_control
(
struct
snd_soc_dapm_context
*
dapm
)
{
snd_soc_dapm_mutex_lock
(
dapm
);
if
(
spitz_spk_func
==
SPITZ_SPK_ON
)
snd_soc_dapm_enable_pin
(
dapm
,
"Ext Spk"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"Ext Spk"
);
else
snd_soc_dapm_disable_pin
(
dapm
,
"Ext Spk"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Ext Spk"
);
/* set up jack connection */
switch
(
spitz_jack_func
)
{
case
SPITZ_HP
:
/* enable and unmute hp jack, disable mic bias */
snd_soc_dapm_disable_pin
(
dapm
,
"Headset Jack"
);
snd_soc_dapm_disable_pin
(
dapm
,
"Mic Jack"
);
snd_soc_dapm_disable_pin
(
dapm
,
"Line Jack"
);
snd_soc_dapm_enable_pin
(
dapm
,
"Headphone Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Headset Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Mic Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Line Jack"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"Headphone Jack"
);
gpio_set_value
(
SPITZ_GPIO_MUTE_L
,
1
);
gpio_set_value
(
SPITZ_GPIO_MUTE_R
,
1
);
break
;
case
SPITZ_MIC
:
/* enable mic jack and bias, mute hp */
snd_soc_dapm_disable_pin
(
dapm
,
"Headphone Jack"
);
snd_soc_dapm_disable_pin
(
dapm
,
"Headset Jack"
);
snd_soc_dapm_disable_pin
(
dapm
,
"Line Jack"
);
snd_soc_dapm_enable_pin
(
dapm
,
"Mic Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Headphone Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Headset Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Line Jack"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"Mic Jack"
);
gpio_set_value
(
SPITZ_GPIO_MUTE_L
,
0
);
gpio_set_value
(
SPITZ_GPIO_MUTE_R
,
0
);
break
;
case
SPITZ_LINE
:
/* enable line jack, disable mic bias and mute hp */
snd_soc_dapm_disable_pin
(
dapm
,
"Headphone Jack"
);
snd_soc_dapm_disable_pin
(
dapm
,
"Headset Jack"
);
snd_soc_dapm_disable_pin
(
dapm
,
"Mic Jack"
);
snd_soc_dapm_enable_pin
(
dapm
,
"Line Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Headphone Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Headset Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Mic Jack"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"Line Jack"
);
gpio_set_value
(
SPITZ_GPIO_MUTE_L
,
0
);
gpio_set_value
(
SPITZ_GPIO_MUTE_R
,
0
);
break
;
case
SPITZ_HEADSET
:
/* enable and unmute headset jack enable mic bias, mute L hp */
snd_soc_dapm_disable_pin
(
dapm
,
"Headphone Jack"
);
snd_soc_dapm_enable_pin
(
dapm
,
"Mic Jack"
);
snd_soc_dapm_disable_pin
(
dapm
,
"Line Jack"
);
snd_soc_dapm_enable_pin
(
dapm
,
"Headset Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Headphone Jack"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"Mic Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Line Jack"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"Headset Jack"
);
gpio_set_value
(
SPITZ_GPIO_MUTE_L
,
0
);
gpio_set_value
(
SPITZ_GPIO_MUTE_R
,
1
);
break
;
case
SPITZ_HP_OFF
:
/* jack removed, everything off */
snd_soc_dapm_disable_pin
(
dapm
,
"Headphone Jack"
);
snd_soc_dapm_disable_pin
(
dapm
,
"Headset Jack"
);
snd_soc_dapm_disable_pin
(
dapm
,
"Mic Jack"
);
snd_soc_dapm_disable_pin
(
dapm
,
"Line Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Headphone Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Headset Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Mic Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Line Jack"
);
gpio_set_value
(
SPITZ_GPIO_MUTE_L
,
0
);
gpio_set_value
(
SPITZ_GPIO_MUTE_R
,
0
);
break
;
}
snd_soc_dapm_sync
(
dapm
);
snd_soc_dapm_sync_unlocked
(
dapm
);
snd_soc_dapm_mutex_unlock
(
dapm
);
}
static
int
spitz_startup
(
struct
snd_pcm_substream
*
substream
)
...
...
sound/soc/pxa/tosa.c
View file @
53a2c4db
...
...
@@ -48,31 +48,35 @@ static void tosa_ext_control(struct snd_soc_codec *codec)
{
struct
snd_soc_dapm_context
*
dapm
=
&
codec
->
dapm
;
snd_soc_dapm_mutex_lock
(
dapm
);
/* set up jack connection */
switch
(
tosa_jack_func
)
{
case
TOSA_HP
:
snd_soc_dapm_disable_pin
(
dapm
,
"Mic (Internal)"
);
snd_soc_dapm_enable_pin
(
dapm
,
"Headphone Jack"
);
snd_soc_dapm_disable_pin
(
dapm
,
"Headset Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Mic (Internal)"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"Headphone Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Headset Jack"
);
break
;
case
TOSA_MIC_INT
:
snd_soc_dapm_enable_pin
(
dapm
,
"Mic (Internal)"
);
snd_soc_dapm_disable_pin
(
dapm
,
"Headphone Jack"
);
snd_soc_dapm_disable_pin
(
dapm
,
"Headset Jack"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"Mic (Internal)"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Headphone Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Headset Jack"
);
break
;
case
TOSA_HEADSET
:
snd_soc_dapm_disable_pin
(
dapm
,
"Mic (Internal)"
);
snd_soc_dapm_disable_pin
(
dapm
,
"Headphone Jack"
);
snd_soc_dapm_enable_pin
(
dapm
,
"Headset Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Mic (Internal)"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Headphone Jack"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"Headset Jack"
);
break
;
}
if
(
tosa_spk_func
==
TOSA_SPK_ON
)
snd_soc_dapm_enable_pin
(
dapm
,
"Speaker"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"Speaker"
);
else
snd_soc_dapm_disable_pin
(
dapm
,
"Speaker"
);
snd_soc_dapm_disable_pin_unlocked
(
dapm
,
"Speaker"
);
snd_soc_dapm_sync_unlocked
(
dapm
);
snd_soc_dapm_
sync
(
dapm
);
snd_soc_dapm_
mutex_unlock
(
dapm
);
}
static
int
tosa_startup
(
struct
snd_pcm_substream
*
substream
)
...
...
sound/soc/soc-dapm.c
View file @
53a2c4db
...
...
@@ -115,6 +115,12 @@ static int dapm_down_seq[] = {
[
snd_soc_dapm_post
]
=
14
,
};
static
void
dapm_assert_locked
(
struct
snd_soc_dapm_context
*
dapm
)
{
if
(
dapm
->
card
&&
dapm
->
card
->
instantiated
)
lockdep_assert_held
(
&
dapm
->
card
->
dapm_mutex
);
}
static
void
pop_wait
(
u32
pop_time
)
{
if
(
pop_time
)
...
...
@@ -146,15 +152,16 @@ static bool dapm_dirty_widget(struct snd_soc_dapm_widget *w)
return
!
list_empty
(
&
w
->
dirty
);
}
void
dapm_mark_dirty
(
struct
snd_soc_dapm_widget
*
w
,
const
char
*
reason
)
static
void
dapm_mark_dirty
(
struct
snd_soc_dapm_widget
*
w
,
const
char
*
reason
)
{
dapm_assert_locked
(
w
->
dapm
);
if
(
!
dapm_dirty_widget
(
w
))
{
dev_vdbg
(
w
->
dapm
->
dev
,
"Marking %s dirty due to %s
\n
"
,
w
->
name
,
reason
);
list_add_tail
(
&
w
->
dirty
,
&
w
->
dapm
->
card
->
dapm_dirty
);
}
}
EXPORT_SYMBOL_GPL
(
dapm_mark_dirty
);
void
dapm_mark_io_dirty
(
struct
snd_soc_dapm_context
*
dapm
)
{
...
...
@@ -361,6 +368,8 @@ static void dapm_reset(struct snd_soc_card *card)
{
struct
snd_soc_dapm_widget
*
w
;
lockdep_assert_held
(
&
card
->
dapm_mutex
);
memset
(
&
card
->
dapm_stats
,
0
,
sizeof
(
card
->
dapm_stats
));
list_for_each_entry
(
w
,
&
card
->
widgets
,
list
)
{
...
...
@@ -386,7 +395,8 @@ static int soc_widget_read(struct snd_soc_dapm_widget *w, int reg,
return
-
1
;
}
static
int
soc_widget_write
(
struct
snd_soc_dapm_widget
*
w
,
int
reg
,
int
val
)
static
int
soc_widget_write
(
struct
snd_soc_dapm_widget
*
w
,
int
reg
,
unsigned
int
val
)
{
if
(
w
->
codec
)
return
snd_soc_write
(
w
->
codec
,
reg
,
val
);
...
...
@@ -506,7 +516,7 @@ static void dapm_set_path_status(struct snd_soc_dapm_widget *w,
case
snd_soc_dapm_switch
:
case
snd_soc_dapm_mixer
:
case
snd_soc_dapm_mixer_named_ctl
:
{
int
val
;
unsigned
int
val
;
struct
soc_mixer_control
*
mc
=
(
struct
soc_mixer_control
*
)
w
->
kcontrol_news
[
i
].
private_value
;
int
reg
=
mc
->
reg
;
...
...
@@ -530,7 +540,7 @@ static void dapm_set_path_status(struct snd_soc_dapm_widget *w,
case
snd_soc_dapm_mux
:
{
struct
soc_enum
*
e
=
(
struct
soc_enum
*
)
w
->
kcontrol_news
[
i
].
private_value
;
int
val
,
item
;
unsigned
int
val
,
item
;
soc_widget_read
(
w
,
e
->
reg
,
&
val
);
item
=
(
val
>>
e
->
shift_l
)
&
e
->
mask
;
...
...
@@ -559,7 +569,7 @@ static void dapm_set_path_status(struct snd_soc_dapm_widget *w,
case
snd_soc_dapm_value_mux
:
{
struct
soc_enum
*
e
=
(
struct
soc_enum
*
)
w
->
kcontrol_news
[
i
].
private_value
;
int
val
,
item
;
unsigned
int
val
,
item
;
soc_widget_read
(
w
,
e
->
reg
,
&
val
);
val
=
(
val
>>
e
->
shift_l
)
&
e
->
mask
;
...
...
@@ -1823,6 +1833,8 @@ static int dapm_power_widgets(struct snd_soc_card *card, int event)
ASYNC_DOMAIN_EXCLUSIVE
(
async_domain
);
enum
snd_soc_bias_level
bias
;
lockdep_assert_held
(
&
card
->
dapm_mutex
);
trace_snd_soc_dapm_start
(
card
);
list_for_each_entry
(
d
,
&
card
->
dapm_list
,
list
)
{
...
...
@@ -1897,10 +1909,14 @@ static int dapm_power_widgets(struct snd_soc_card *card, int event)
trace_snd_soc_dapm_walk_done
(
card
);
/* Run all the bias changes in parallel */
list_for_each_entry
(
d
,
&
card
->
dapm_list
,
list
)
async_schedule_domain
(
dapm_pre_sequence_async
,
d
,
&
async_domain
);
/* Run card bias changes at first */
dapm_pre_sequence_async
(
&
card
->
dapm
,
0
);
/* Run other bias changes in parallel */
list_for_each_entry
(
d
,
&
card
->
dapm_list
,
list
)
{
if
(
d
!=
&
card
->
dapm
)
async_schedule_domain
(
dapm_pre_sequence_async
,
d
,
&
async_domain
);
}
async_synchronize_full_domain
(
&
async_domain
);
list_for_each_entry
(
w
,
&
down_list
,
power_list
)
{
...
...
@@ -1920,10 +1936,14 @@ static int dapm_power_widgets(struct snd_soc_card *card, int event)
dapm_seq_run
(
card
,
&
up_list
,
event
,
true
);
/* Run all the bias changes in parallel */
list_for_each_entry
(
d
,
&
card
->
dapm_list
,
list
)
async_schedule_domain
(
dapm_post_sequence_async
,
d
,
&
async_domain
);
list_for_each_entry
(
d
,
&
card
->
dapm_list
,
list
)
{
if
(
d
!=
&
card
->
dapm
)
async_schedule_domain
(
dapm_post_sequence_async
,
d
,
&
async_domain
);
}
async_synchronize_full_domain
(
&
async_domain
);
/* Run card bias changes at last */
dapm_post_sequence_async
(
&
card
->
dapm
,
0
);
/* do we need to notify any clients that DAPM event is complete */
list_for_each_entry
(
d
,
&
card
->
dapm_list
,
list
)
{
...
...
@@ -2110,6 +2130,8 @@ static int soc_dapm_mux_update_power(struct snd_soc_card *card,
struct
snd_soc_dapm_path
*
path
;
int
found
=
0
;
lockdep_assert_held
(
&
card
->
dapm_mutex
);
/* find dapm widget path assoc with kcontrol */
dapm_kcontrol_for_each_path
(
path
,
kcontrol
)
{
if
(
!
path
->
name
||
!
e
->
texts
[
mux
])
...
...
@@ -2160,6 +2182,8 @@ static int soc_dapm_mixer_update_power(struct snd_soc_card *card,
struct
snd_soc_dapm_path
*
path
;
int
found
=
0
;
lockdep_assert_held
(
&
card
->
dapm_mutex
);
/* find dapm widget path assoc with kcontrol */
dapm_kcontrol_for_each_path
(
path
,
kcontrol
)
{
found
=
1
;
...
...
@@ -2325,6 +2349,8 @@ static int snd_soc_dapm_set_pin(struct snd_soc_dapm_context *dapm,
{
struct
snd_soc_dapm_widget
*
w
=
dapm_find_widget
(
dapm
,
pin
,
true
);
dapm_assert_locked
(
dapm
);
if
(
!
w
)
{
dev_err
(
dapm
->
dev
,
"ASoC: DAPM unknown pin %s
\n
"
,
pin
);
return
-
EINVAL
;
...
...
@@ -2341,18 +2367,18 @@ static int snd_soc_dapm_set_pin(struct snd_soc_dapm_context *dapm,
}
/**
* snd_soc_dapm_sync - scan and power dapm paths
* snd_soc_dapm_sync
_unlocked
- scan and power dapm paths
* @dapm: DAPM context
*
* Walks all dapm audio paths and powers widgets according to their
* stream or path usage.
*
* Requires external locking.
*
* Returns 0 for success.
*/
int
snd_soc_dapm_sync
(
struct
snd_soc_dapm_context
*
dapm
)
int
snd_soc_dapm_sync
_unlocked
(
struct
snd_soc_dapm_context
*
dapm
)
{
int
ret
;
/*
* Suppress early reports (eg, jacks syncing their state) to avoid
* silly DAPM runs during card startup.
...
...
@@ -2360,8 +2386,25 @@ int snd_soc_dapm_sync(struct snd_soc_dapm_context *dapm)
if
(
!
dapm
->
card
||
!
dapm
->
card
->
instantiated
)
return
0
;
return
dapm_power_widgets
(
dapm
->
card
,
SND_SOC_DAPM_STREAM_NOP
);
}
EXPORT_SYMBOL_GPL
(
snd_soc_dapm_sync_unlocked
);
/**
* snd_soc_dapm_sync - scan and power dapm paths
* @dapm: DAPM context
*
* Walks all dapm audio paths and powers widgets according to their
* stream or path usage.
*
* Returns 0 for success.
*/
int
snd_soc_dapm_sync
(
struct
snd_soc_dapm_context
*
dapm
)
{
int
ret
;
mutex_lock_nested
(
&
dapm
->
card
->
dapm_mutex
,
SND_SOC_DAPM_CLASS_RUNTIME
);
ret
=
dapm_power_widgets
(
dapm
->
card
,
SND_SOC_DAPM_STREAM_NOP
);
ret
=
snd_soc_dapm_sync_unlocked
(
dapm
);
mutex_unlock
(
&
dapm
->
card
->
dapm_mutex
);
return
ret
;
}
...
...
@@ -4098,7 +4141,7 @@ void snd_soc_dapm_free(struct snd_soc_dapm_context *dapm)
}
EXPORT_SYMBOL_GPL
(
snd_soc_dapm_free
);
static
void
soc_dapm_shutdown_
codec
(
struct
snd_soc_dapm_context
*
dapm
)
static
void
soc_dapm_shutdown_
dapm
(
struct
snd_soc_dapm_context
*
dapm
)
{
struct
snd_soc_card
*
card
=
dapm
->
card
;
struct
snd_soc_dapm_widget
*
w
;
...
...
@@ -4138,14 +4181,21 @@ static void soc_dapm_shutdown_codec(struct snd_soc_dapm_context *dapm)
*/
void
snd_soc_dapm_shutdown
(
struct
snd_soc_card
*
card
)
{
struct
snd_soc_codec
*
codec
;
list_for_each_entry
(
codec
,
&
card
->
codec_dev_list
,
card_list
)
{
soc_dapm_shutdown_codec
(
&
codec
->
dapm
);
if
(
codec
->
dapm
.
bias_level
==
SND_SOC_BIAS_STANDBY
)
snd_soc_dapm_set_bias_level
(
&
codec
->
dapm
,
SND_SOC_BIAS_OFF
);
struct
snd_soc_dapm_context
*
dapm
;
list_for_each_entry
(
dapm
,
&
card
->
dapm_list
,
list
)
{
if
(
dapm
!=
&
card
->
dapm
)
{
soc_dapm_shutdown_dapm
(
dapm
);
if
(
dapm
->
bias_level
==
SND_SOC_BIAS_STANDBY
)
snd_soc_dapm_set_bias_level
(
dapm
,
SND_SOC_BIAS_OFF
);
}
}
soc_dapm_shutdown_dapm
(
&
card
->
dapm
);
if
(
card
->
dapm
.
bias_level
==
SND_SOC_BIAS_STANDBY
)
snd_soc_dapm_set_bias_level
(
&
card
->
dapm
,
SND_SOC_BIAS_OFF
);
}
/* Module information */
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment