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,
...
@@ -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
,
int
snd_soc_dapm_get_pin_status
(
struct
snd_soc_dapm_context
*
dapm
,
const
char
*
pin
);
const
char
*
pin
);
int
snd_soc_dapm_sync
(
struct
snd_soc_dapm_context
*
dapm
);
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
,
int
snd_soc_dapm_force_enable_pin
(
struct
snd_soc_dapm_context
*
dapm
,
const
char
*
pin
);
const
char
*
pin
);
int
snd_soc_dapm_force_enable_pin_unlocked
(
struct
snd_soc_dapm_context
*
dapm
,
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,
...
@@ -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
);
void
snd_soc_dapm_auto_nc_codec_pins
(
struct
snd_soc_codec
*
codec
);
/* Mostly internal - should not normally be used */
/* 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
);
void
dapm_mark_io_dirty
(
struct
snd_soc_dapm_context
*
dapm
);
/* dapm path query */
/* dapm path query */
...
...
include/sound/soc.h
View file @
53a2c4db
...
@@ -1208,4 +1208,15 @@ extern struct dentry *snd_soc_debugfs_root;
...
@@ -1208,4 +1208,15 @@ extern struct dentry *snd_soc_debugfs_root;
extern
const
struct
dev_pm_ops
snd_soc_pm_ops
;
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
#endif
sound/soc/codecs/adav80x.c
View file @
53a2c4db
...
@@ -541,6 +541,7 @@ static int adav80x_set_sysclk(struct snd_soc_codec *codec,
...
@@ -541,6 +541,7 @@ static int adav80x_set_sysclk(struct snd_soc_codec *codec,
unsigned
int
freq
,
int
dir
)
unsigned
int
freq
,
int
dir
)
{
{
struct
adav80x
*
adav80x
=
snd_soc_codec_get_drvdata
(
codec
);
struct
adav80x
*
adav80x
=
snd_soc_codec_get_drvdata
(
codec
);
struct
snd_soc_dapm_context
*
dapm
=
&
codec
->
dapm
;
if
(
dir
==
SND_SOC_CLOCK_IN
)
{
if
(
dir
==
SND_SOC_CLOCK_IN
)
{
switch
(
clk_id
)
{
switch
(
clk_id
)
{
...
@@ -573,7 +574,7 @@ static int adav80x_set_sysclk(struct snd_soc_codec *codec,
...
@@ -573,7 +574,7 @@ static int adav80x_set_sysclk(struct snd_soc_codec *codec,
regmap_write
(
adav80x
->
regmap
,
ADAV80X_ICLK_CTRL2
,
regmap_write
(
adav80x
->
regmap
,
ADAV80X_ICLK_CTRL2
,
iclk_ctrl2
);
iclk_ctrl2
);
snd_soc_dapm_sync
(
&
codec
->
dapm
);
snd_soc_dapm_sync
(
dapm
);
}
}
}
else
{
}
else
{
unsigned
int
mask
;
unsigned
int
mask
;
...
@@ -600,17 +601,21 @@ static int adav80x_set_sysclk(struct snd_soc_codec *codec,
...
@@ -600,17 +601,21 @@ static int adav80x_set_sysclk(struct snd_soc_codec *codec,
adav80x
->
sysclk_pd
[
clk_id
]
=
false
;
adav80x
->
sysclk_pd
[
clk_id
]
=
false
;
}
}
snd_soc_dapm_mutex_lock
(
dapm
);
if
(
adav80x
->
sysclk_pd
[
0
])
if
(
adav80x
->
sysclk_pd
[
0
])
snd_soc_dapm_disable_pin
(
&
codec
->
dapm
,
"PLL1"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"PLL1"
);
else
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
])
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
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
;
return
0
;
...
...
sound/soc/codecs/wm5100.c
View file @
53a2c4db
...
@@ -2100,6 +2100,7 @@ static void wm5100_micd_irq(struct wm5100_priv *wm5100)
...
@@ -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
)
int
wm5100_detect
(
struct
snd_soc_codec
*
codec
,
struct
snd_soc_jack
*
jack
)
{
{
struct
wm5100_priv
*
wm5100
=
snd_soc_codec_get_drvdata
(
codec
);
struct
wm5100_priv
*
wm5100
=
snd_soc_codec_get_drvdata
(
codec
);
struct
snd_soc_dapm_context
*
dapm
=
&
codec
->
dapm
;
if
(
jack
)
{
if
(
jack
)
{
wm5100
->
jack
=
jack
;
wm5100
->
jack
=
jack
;
...
@@ -2117,9 +2118,14 @@ int wm5100_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack)
...
@@ -2117,9 +2118,14 @@ int wm5100_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack)
WM5100_ACCDET_RATE_MASK
);
WM5100_ACCDET_RATE_MASK
);
/* We need the charge pump to power MICBIAS */
/* We need the charge pump to power MICBIAS */
snd_soc_dapm_force_enable_pin
(
&
codec
->
dapm
,
"CP2"
);
snd_soc_dapm_mutex_lock
(
dapm
);
snd_soc_dapm_force_enable_pin
(
&
codec
->
dapm
,
"SYSCLK"
);
snd_soc_dapm_sync
(
&
codec
->
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
/* We start off just enabling microphone detection - even a
* plain headphone will trigger detection.
* 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)
...
@@ -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
)
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
wm8962_priv
*
wm8962
=
snd_soc_codec_get_drvdata
(
codec
);
struct
snd_soc_dapm_context
*
dapm
=
&
codec
->
dapm
;
int
irq_mask
,
enable
;
int
irq_mask
,
enable
;
wm8962
->
jack
=
jack
;
wm8962
->
jack
=
jack
;
...
@@ -3109,14 +3110,18 @@ int wm8962_mic_detect(struct snd_soc_codec *codec, struct snd_soc_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_soc_jack_report
(
wm8962
->
jack
,
0
,
SND_JACK_MICROPHONE
|
SND_JACK_BTN_0
);
SND_JACK_MICROPHONE
|
SND_JACK_BTN_0
);
snd_soc_dapm_mutex_lock
(
dapm
);
if
(
jack
)
{
if
(
jack
)
{
snd_soc_dapm_force_enable_pin
(
&
codec
->
dapm
,
"SYSCLK"
);
snd_soc_dapm_force_enable_pin
_unlocked
(
dapm
,
"SYSCLK"
);
snd_soc_dapm_force_enable_pin
(
&
codec
->
dapm
,
"MICBIAS"
);
snd_soc_dapm_force_enable_pin
_unlocked
(
dapm
,
"MICBIAS"
);
}
else
{
}
else
{
snd_soc_dapm_disable_pin
(
&
codec
->
dapm
,
"SYSCLK"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"SYSCLK"
);
snd_soc_dapm_disable_pin
(
&
codec
->
dapm
,
"MICBIAS"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"MICBIAS"
);
}
}
snd_soc_dapm_mutex_unlock
(
dapm
);
return
0
;
return
0
;
}
}
EXPORT_SYMBOL_GPL
(
wm8962_mic_detect
);
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,
...
@@ -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
)
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
wm8994_priv
*
wm8994
=
snd_soc_codec_get_drvdata
(
codec
);
struct
snd_soc_dapm_context
*
dapm
=
&
codec
->
dapm
;
switch
(
mode
)
{
switch
(
mode
)
{
case
WM8994_VMID_NORMAL
:
case
WM8994_VMID_NORMAL
:
snd_soc_dapm_mutex_lock
(
dapm
);
if
(
wm8994
->
hubs
.
lineout1_se
)
{
if
(
wm8994
->
hubs
.
lineout1_se
)
{
snd_soc_dapm_disable_pin
(
&
codec
->
dapm
,
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"LINEOUT1N Driver"
);
"LINEOUT1N Driver"
);
snd_soc_dapm_disable_pin
(
&
codec
->
dapm
,
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"LINEOUT1P Driver"
);
"LINEOUT1P Driver"
);
}
}
if
(
wm8994
->
hubs
.
lineout2_se
)
{
if
(
wm8994
->
hubs
.
lineout2_se
)
{
snd_soc_dapm_disable_pin
(
&
codec
->
dapm
,
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"LINEOUT2N Driver"
);
"LINEOUT2N Driver"
);
snd_soc_dapm_disable_pin
(
&
codec
->
dapm
,
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"LINEOUT2P Driver"
);
"LINEOUT2P Driver"
);
}
}
/* Do the sync with the old mode to allow it to clean up */
/* 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
;
wm8994
->
vmid_mode
=
mode
;
snd_soc_dapm_mutex_unlock
(
dapm
);
break
;
break
;
case
WM8994_VMID_FORCE
:
case
WM8994_VMID_FORCE
:
snd_soc_dapm_mutex_lock
(
dapm
);
if
(
wm8994
->
hubs
.
lineout1_se
)
{
if
(
wm8994
->
hubs
.
lineout1_se
)
{
snd_soc_dapm_force_enable_pin
(
&
codec
->
dapm
,
snd_soc_dapm_force_enable_pin
_unlocked
(
dapm
,
"LINEOUT1N Driver"
);
"LINEOUT1N Driver"
);
snd_soc_dapm_force_enable_pin
(
&
codec
->
dapm
,
snd_soc_dapm_force_enable_pin
_unlocked
(
dapm
,
"LINEOUT1P Driver"
);
"LINEOUT1P Driver"
);
}
}
if
(
wm8994
->
hubs
.
lineout2_se
)
{
if
(
wm8994
->
hubs
.
lineout2_se
)
{
snd_soc_dapm_force_enable_pin
(
&
codec
->
dapm
,
snd_soc_dapm_force_enable_pin
_unlocked
(
dapm
,
"LINEOUT2N Driver"
);
"LINEOUT2N Driver"
);
snd_soc_dapm_force_enable_pin
(
&
codec
->
dapm
,
snd_soc_dapm_force_enable_pin
_unlocked
(
dapm
,
"LINEOUT2P Driver"
);
"LINEOUT2P Driver"
);
}
}
wm8994
->
vmid_mode
=
mode
;
wm8994
->
vmid_mode
=
mode
;
snd_soc_dapm_sync
(
&
codec
->
dapm
);
snd_soc_dapm_sync_unlocked
(
dapm
);
snd_soc_dapm_mutex_unlock
(
dapm
);
break
;
break
;
default:
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,
...
@@ -2251,6 +2251,7 @@ int wm8996_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack,
wm8996_polarity_fn
polarity_cb
)
wm8996_polarity_fn
polarity_cb
)
{
{
struct
wm8996_priv
*
wm8996
=
snd_soc_codec_get_drvdata
(
codec
);
struct
wm8996_priv
*
wm8996
=
snd_soc_codec_get_drvdata
(
codec
);
struct
snd_soc_dapm_context
*
dapm
=
&
codec
->
dapm
;
wm8996
->
jack
=
jack
;
wm8996
->
jack
=
jack
;
wm8996
->
detecting
=
true
;
wm8996
->
detecting
=
true
;
...
@@ -2267,8 +2268,12 @@ int wm8996_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack,
...
@@ -2267,8 +2268,12 @@ int wm8996_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack,
WM8996_MICB2_DISCH
,
0
);
WM8996_MICB2_DISCH
,
0
);
/* LDO2 powers the microphones, SYSCLK clocks detection */
/* LDO2 powers the microphones, SYSCLK clocks detection */
snd_soc_dapm_force_enable_pin
(
&
codec
->
dapm
,
"LDO2"
);
snd_soc_dapm_mutex_lock
(
dapm
);
snd_soc_dapm_force_enable_pin
(
&
codec
->
dapm
,
"SYSCLK"
);
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
/* We start off just enabling microphone detection - even a
* plain headphone will trigger detection.
* 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,
...
@@ -101,20 +101,27 @@ static int headset_set_switch(struct snd_kcontrol *kcontrol,
struct
snd_ctl_elem_value
*
ucontrol
)
struct
snd_ctl_elem_value
*
ucontrol
)
{
{
struct
snd_soc_codec
*
codec
=
snd_kcontrol_chip
(
kcontrol
);
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
)
if
(
ucontrol
->
value
.
integer
.
value
[
0
]
==
hs_switch
)
return
0
;
return
0
;
snd_soc_dapm_mutex_lock
(
dapm
);
if
(
ucontrol
->
value
.
integer
.
value
[
0
])
{
if
(
ucontrol
->
value
.
integer
.
value
[
0
])
{
pr_debug
(
"hs_set HS path
\n
"
);
pr_debug
(
"hs_set HS path
\n
"
);
snd_soc_dapm_enable_pin
(
&
codec
->
dapm
,
"Headphones"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"Headphones"
);
snd_soc_dapm_disable_pin
(
&
codec
->
dapm
,
"EPOUT"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"EPOUT"
);
}
else
{
}
else
{
pr_debug
(
"hs_set EP path
\n
"
);
pr_debug
(
"hs_set EP path
\n
"
);
snd_soc_dapm_disable_pin
(
&
codec
->
dapm
,
"Headphones"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Headphones"
);
snd_soc_dapm_enable_pin
(
&
codec
->
dapm
,
"EPOUT"
);
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
];
hs_switch
=
ucontrol
->
value
.
integer
.
value
[
0
];
return
0
;
return
0
;
...
@@ -122,18 +129,20 @@ static int headset_set_switch(struct snd_kcontrol *kcontrol,
...
@@ -122,18 +129,20 @@ static int headset_set_switch(struct snd_kcontrol *kcontrol,
static
void
lo_enable_out_pins
(
struct
snd_soc_codec
*
codec
)
static
void
lo_enable_out_pins
(
struct
snd_soc_codec
*
codec
)
{
{
snd_soc_dapm_enable_pin
(
&
codec
->
dapm
,
"IHFOUTL"
);
struct
snd_soc_dapm_context
*
dapm
=
&
codec
->
dapm
;
snd_soc_dapm_enable_pin
(
&
codec
->
dapm
,
"IHFOUTR"
);
snd_soc_dapm_enable_pin
(
&
codec
->
dapm
,
"LINEOUTL"
);
snd_soc_dapm_enable_pin_unlocked
(
dapm
,
"IHFOUTL"
);
snd_soc_dapm_enable_pin
(
&
codec
->
dapm
,
"LINEOUTR"
);
snd_soc_dapm_enable_pin_unlocked
(
dapm
,
"IHFOUTR"
);
snd_soc_dapm_enable_pin
(
&
codec
->
dapm
,
"VIB1OUT"
);
snd_soc_dapm_enable_pin_unlocked
(
dapm
,
"LINEOUTL"
);
snd_soc_dapm_enable_pin
(
&
codec
->
dapm
,
"VIB2OUT"
);
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
)
{
if
(
hs_switch
)
{
snd_soc_dapm_enable_pin
(
&
codec
->
dapm
,
"Headphones"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"Headphones"
);
snd_soc_dapm_disable_pin
(
&
codec
->
dapm
,
"EPOUT"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"EPOUT"
);
}
else
{
}
else
{
snd_soc_dapm_disable_pin
(
&
codec
->
dapm
,
"Headphones"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Headphones"
);
snd_soc_dapm_enable_pin
(
&
codec
->
dapm
,
"EPOUT"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"EPOUT"
);
}
}
}
}
...
@@ -148,44 +157,52 @@ static int lo_set_switch(struct snd_kcontrol *kcontrol,
...
@@ -148,44 +157,52 @@ static int lo_set_switch(struct snd_kcontrol *kcontrol,
struct
snd_ctl_elem_value
*
ucontrol
)
struct
snd_ctl_elem_value
*
ucontrol
)
{
{
struct
snd_soc_codec
*
codec
=
snd_kcontrol_chip
(
kcontrol
);
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
)
if
(
ucontrol
->
value
.
integer
.
value
[
0
]
==
lo_dac
)
return
0
;
return
0
;
snd_soc_dapm_mutex_lock
(
dapm
);
/* we dont want to work with last state of lineout so just enable all
/* we dont want to work with last state of lineout so just enable all
* pins and then disable pins not required
* pins and then disable pins not required
*/
*/
lo_enable_out_pins
(
codec
);
lo_enable_out_pins
(
codec
);
switch
(
ucontrol
->
value
.
integer
.
value
[
0
])
{
switch
(
ucontrol
->
value
.
integer
.
value
[
0
])
{
case
0
:
case
0
:
pr_debug
(
"set vibra path
\n
"
);
pr_debug
(
"set vibra path
\n
"
);
snd_soc_dapm_disable_pin
(
&
codec
->
dapm
,
"VIB1OUT"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"VIB1OUT"
);
snd_soc_dapm_disable_pin
(
&
codec
->
dapm
,
"VIB2OUT"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"VIB2OUT"
);
snd_soc_update_bits
(
codec
,
SN95031_LOCTL
,
0x66
,
0
);
snd_soc_update_bits
(
codec
,
SN95031_LOCTL
,
0x66
,
0
);
break
;
break
;
case
1
:
case
1
:
pr_debug
(
"set hs path
\n
"
);
pr_debug
(
"set hs path
\n
"
);
snd_soc_dapm_disable_pin
(
&
codec
->
dapm
,
"Headphones"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Headphones"
);
snd_soc_dapm_disable_pin
(
&
codec
->
dapm
,
"EPOUT"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"EPOUT"
);
snd_soc_update_bits
(
codec
,
SN95031_LOCTL
,
0x66
,
0x22
);
snd_soc_update_bits
(
codec
,
SN95031_LOCTL
,
0x66
,
0x22
);
break
;
break
;
case
2
:
case
2
:
pr_debug
(
"set spkr path
\n
"
);
pr_debug
(
"set spkr path
\n
"
);
snd_soc_dapm_disable_pin
(
&
codec
->
dapm
,
"IHFOUTL"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"IHFOUTL"
);
snd_soc_dapm_disable_pin
(
&
codec
->
dapm
,
"IHFOUTR"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"IHFOUTR"
);
snd_soc_update_bits
(
codec
,
SN95031_LOCTL
,
0x66
,
0x44
);
snd_soc_update_bits
(
codec
,
SN95031_LOCTL
,
0x66
,
0x44
);
break
;
break
;
case
3
:
case
3
:
pr_debug
(
"set null path
\n
"
);
pr_debug
(
"set null path
\n
"
);
snd_soc_dapm_disable_pin
(
&
codec
->
dapm
,
"LINEOUTL"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"LINEOUTL"
);
snd_soc_dapm_disable_pin
(
&
codec
->
dapm
,
"LINEOUTR"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"LINEOUTR"
);
snd_soc_update_bits
(
codec
,
SN95031_LOCTL
,
0x66
,
0x66
);
snd_soc_update_bits
(
codec
,
SN95031_LOCTL
,
0x66
,
0x66
);
break
;
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
];
lo_dac
=
ucontrol
->
value
.
integer
.
value
[
0
];
return
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,
...
@@ -106,57 +106,59 @@ static int ams_delta_set_audio_mode(struct snd_kcontrol *kcontrol,
if
(
ucontrol
->
value
.
enumerated
.
item
[
0
]
>=
control
->
max
)
if
(
ucontrol
->
value
.
enumerated
.
item
[
0
]
>=
control
->
max
)
return
-
EINVAL
;
return
-
EINVAL
;
mutex_lock
(
&
codec
->
mutex
);
snd_soc_dapm_mutex_lock
(
dapm
);
/* Translate selection to bitmap */
/* Translate selection to bitmap */
pins
=
ams_delta_audio_mode_pins
[
ucontrol
->
value
.
enumerated
.
item
[
0
]];
pins
=
ams_delta_audio_mode_pins
[
ucontrol
->
value
.
enumerated
.
item
[
0
]];
/* Setup pins after corresponding bits if changed */
/* Setup pins after corresponding bits if changed */
pin
=
!!
(
pins
&
(
1
<<
AMS_DELTA_MOUTHPIECE
));
pin
=
!!
(
pins
&
(
1
<<
AMS_DELTA_MOUTHPIECE
));
if
(
pin
!=
snd_soc_dapm_get_pin_status
(
dapm
,
"Mouthpiece"
))
{
if
(
pin
!=
snd_soc_dapm_get_pin_status
(
dapm
,
"Mouthpiece"
))
{
changed
=
1
;
changed
=
1
;
if
(
pin
)
if
(
pin
)
snd_soc_dapm_enable_pin
(
dapm
,
"Mouthpiece"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"Mouthpiece"
);
else
else
snd_soc_dapm_disable_pin
(
dapm
,
"Mouthpiece"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Mouthpiece"
);
}
}
pin
=
!!
(
pins
&
(
1
<<
AMS_DELTA_EARPIECE
));
pin
=
!!
(
pins
&
(
1
<<
AMS_DELTA_EARPIECE
));
if
(
pin
!=
snd_soc_dapm_get_pin_status
(
dapm
,
"Earpiece"
))
{
if
(
pin
!=
snd_soc_dapm_get_pin_status
(
dapm
,
"Earpiece"
))
{
changed
=
1
;
changed
=
1
;
if
(
pin
)
if
(
pin
)
snd_soc_dapm_enable_pin
(
dapm
,
"Earpiece"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"Earpiece"
);
else
else
snd_soc_dapm_disable_pin
(
dapm
,
"Earpiece"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Earpiece"
);
}
}
pin
=
!!
(
pins
&
(
1
<<
AMS_DELTA_MICROPHONE
));
pin
=
!!
(
pins
&
(
1
<<
AMS_DELTA_MICROPHONE
));
if
(
pin
!=
snd_soc_dapm_get_pin_status
(
dapm
,
"Microphone"
))
{
if
(
pin
!=
snd_soc_dapm_get_pin_status
(
dapm
,
"Microphone"
))
{
changed
=
1
;
changed
=
1
;
if
(
pin
)
if
(
pin
)
snd_soc_dapm_enable_pin
(
dapm
,
"Microphone"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"Microphone"
);
else
else
snd_soc_dapm_disable_pin
(
dapm
,
"Microphone"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Microphone"
);
}
}
pin
=
!!
(
pins
&
(
1
<<
AMS_DELTA_SPEAKER
));
pin
=
!!
(
pins
&
(
1
<<
AMS_DELTA_SPEAKER
));
if
(
pin
!=
snd_soc_dapm_get_pin_status
(
dapm
,
"Speaker"
))
{
if
(
pin
!=
snd_soc_dapm_get_pin_status
(
dapm
,
"Speaker"
))
{
changed
=
1
;
changed
=
1
;
if
(
pin
)
if
(
pin
)
snd_soc_dapm_enable_pin
(
dapm
,
"Speaker"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"Speaker"
);
else
else
snd_soc_dapm_disable_pin
(
dapm
,
"Speaker"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Speaker"
);
}
}
pin
=
!!
(
pins
&
(
1
<<
AMS_DELTA_AGC
));
pin
=
!!
(
pins
&
(
1
<<
AMS_DELTA_AGC
));
if
(
pin
!=
ams_delta_audio_agc
)
{
if
(
pin
!=
ams_delta_audio_agc
)
{
ams_delta_audio_agc
=
pin
;
ams_delta_audio_agc
=
pin
;
changed
=
1
;
changed
=
1
;
if
(
pin
)
if
(
pin
)
snd_soc_dapm_enable_pin
(
dapm
,
"AGCIN"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"AGCIN"
);
else
else
snd_soc_dapm_disable_pin
(
dapm
,
"AGCIN"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"AGCIN"
);
}
}
if
(
changed
)
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
;
return
changed
;
}
}
...
@@ -315,12 +317,17 @@ static void cx81801_close(struct tty_struct *tty)
...
@@ -315,12 +317,17 @@ static void cx81801_close(struct tty_struct *tty)
v253_ops
.
close
(
tty
);
v253_ops
.
close
(
tty
);
/* Revert back to default audio input/output constellation */
/* Revert back to default audio input/output constellation */
snd_soc_dapm_disable_pin
(
dapm
,
"Mouthpiece"
);
snd_soc_dapm_mutex_lock
(
dapm
);
snd_soc_dapm_enable_pin
(
dapm
,
"Earpiece"
);
snd_soc_dapm_enable_pin
(
dapm
,
"Microphone"
);
snd_soc_dapm_disable_pin_unlocked
(
dapm
,
"Mouthpiece"
);
snd_soc_dapm_disable_pin
(
dapm
,
"Speaker"
);
snd_soc_dapm_enable_pin_unlocked
(
dapm
,
"Earpiece"
);
snd_soc_dapm_disable_pin
(
dapm
,
"AGCIN"
);
snd_soc_dapm_enable_pin_unlocked
(
dapm
,
"Microphone"
);
snd_soc_dapm_sync
(
dapm
);
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() */
/* 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)
...
@@ -68,26 +68,30 @@ static void n810_ext_control(struct snd_soc_dapm_context *dapm)
break
;
break
;
}
}
snd_soc_dapm_mutex_lock
(
dapm
);
if
(
n810_spk_func
)
if
(
n810_spk_func
)
snd_soc_dapm_enable_pin
(
dapm
,
"Ext Spk"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"Ext Spk"
);
else
else
snd_soc_dapm_disable_pin
(
dapm
,
"Ext Spk"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Ext Spk"
);
if
(
hp
)
if
(
hp
)
snd_soc_dapm_enable_pin
(
dapm
,
"Headphone Jack"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"Headphone Jack"
);
else
else
snd_soc_dapm_disable_pin
(
dapm
,
"Headphone Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Headphone Jack"
);
if
(
line1l
)
if
(
line1l
)
snd_soc_dapm_enable_pin
(
dapm
,
"LINE1L"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"LINE1L"
);
else
else
snd_soc_dapm_disable_pin
(
dapm
,
"LINE1L"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"LINE1L"
);
if
(
n810_dmic_func
)
if
(
n810_dmic_func
)
snd_soc_dapm_enable_pin
(
dapm
,
"DMic"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"DMic"
);
else
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
)
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)
...
@@ -74,26 +74,30 @@ static void rx51_ext_control(struct snd_soc_dapm_context *dapm)
break
;
break
;
}
}
snd_soc_dapm_mutex_lock
(
dapm
);
if
(
rx51_spk_func
)
if
(
rx51_spk_func
)
snd_soc_dapm_enable_pin
(
dapm
,
"Ext Spk"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"Ext Spk"
);
else
else
snd_soc_dapm_disable_pin
(
dapm
,
"Ext Spk"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Ext Spk"
);
if
(
rx51_dmic_func
)
if
(
rx51_dmic_func
)
snd_soc_dapm_enable_pin
(
dapm
,
"DMic"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"DMic"
);
else
else
snd_soc_dapm_disable_pin
(
dapm
,
"DMic"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"DMic"
);
if
(
hp
)
if
(
hp
)
snd_soc_dapm_enable_pin
(
dapm
,
"Headphone Jack"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"Headphone Jack"
);
else
else
snd_soc_dapm_disable_pin
(
dapm
,
"Headphone Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Headphone Jack"
);
if
(
hs
)
if
(
hs
)
snd_soc_dapm_enable_pin
(
dapm
,
"HS Mic"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"HS Mic"
);
else
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
);
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
)
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;
...
@@ -47,51 +47,55 @@ static int corgi_spk_func;
static
void
corgi_ext_control
(
struct
snd_soc_dapm_context
*
dapm
)
static
void
corgi_ext_control
(
struct
snd_soc_dapm_context
*
dapm
)
{
{
snd_soc_dapm_mutex_lock
(
dapm
);
/* set up jack connection */
/* set up jack connection */
switch
(
corgi_jack_func
)
{
switch
(
corgi_jack_func
)
{
case
CORGI_HP
:
case
CORGI_HP
:
/* set = unmute headphone */
/* set = unmute headphone */
gpio_set_value
(
CORGI_GPIO_MUTE_L
,
1
);
gpio_set_value
(
CORGI_GPIO_MUTE_L
,
1
);
gpio_set_value
(
CORGI_GPIO_MUTE_R
,
1
);
gpio_set_value
(
CORGI_GPIO_MUTE_R
,
1
);
snd_soc_dapm_disable_pin
(
dapm
,
"Mic Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Mic Jack"
);
snd_soc_dapm_disable_pin
(
dapm
,
"Line Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Line Jack"
);
snd_soc_dapm_enable_pin
(
dapm
,
"Headphone Jack"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"Headphone Jack"
);
snd_soc_dapm_disable_pin
(
dapm
,
"Headset Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Headset Jack"
);
break
;
break
;
case
CORGI_MIC
:
case
CORGI_MIC
:
/* reset = mute headphone */
/* reset = mute headphone */
gpio_set_value
(
CORGI_GPIO_MUTE_L
,
0
);
gpio_set_value
(
CORGI_GPIO_MUTE_L
,
0
);
gpio_set_value
(
CORGI_GPIO_MUTE_R
,
0
);
gpio_set_value
(
CORGI_GPIO_MUTE_R
,
0
);
snd_soc_dapm_enable_pin
(
dapm
,
"Mic Jack"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"Mic Jack"
);
snd_soc_dapm_disable_pin
(
dapm
,
"Line Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Line Jack"
);
snd_soc_dapm_disable_pin
(
dapm
,
"Headphone Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Headphone Jack"
);
snd_soc_dapm_disable_pin
(
dapm
,
"Headset Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Headset Jack"
);
break
;
break
;
case
CORGI_LINE
:
case
CORGI_LINE
:
gpio_set_value
(
CORGI_GPIO_MUTE_L
,
0
);
gpio_set_value
(
CORGI_GPIO_MUTE_L
,
0
);
gpio_set_value
(
CORGI_GPIO_MUTE_R
,
0
);
gpio_set_value
(
CORGI_GPIO_MUTE_R
,
0
);
snd_soc_dapm_disable_pin
(
dapm
,
"Mic Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Mic Jack"
);
snd_soc_dapm_enable_pin
(
dapm
,
"Line Jack"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"Line Jack"
);
snd_soc_dapm_disable_pin
(
dapm
,
"Headphone Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Headphone Jack"
);
snd_soc_dapm_disable_pin
(
dapm
,
"Headset Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Headset Jack"
);
break
;
break
;
case
CORGI_HEADSET
:
case
CORGI_HEADSET
:
gpio_set_value
(
CORGI_GPIO_MUTE_L
,
0
);
gpio_set_value
(
CORGI_GPIO_MUTE_L
,
0
);
gpio_set_value
(
CORGI_GPIO_MUTE_R
,
1
);
gpio_set_value
(
CORGI_GPIO_MUTE_R
,
1
);
snd_soc_dapm_enable_pin
(
dapm
,
"Mic Jack"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"Mic Jack"
);
snd_soc_dapm_disable_pin
(
dapm
,
"Line Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Line Jack"
);
snd_soc_dapm_disable_pin
(
dapm
,
"Headphone Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Headphone Jack"
);
snd_soc_dapm_enable_pin
(
dapm
,
"Headset Jack"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"Headset Jack"
);
break
;
break
;
}
}
if
(
corgi_spk_func
==
CORGI_SPK_ON
)
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
else
snd_soc_dapm_disable_pin
(
dapm
,
"Ext Spk"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Ext Spk"
);
/* signal a DAPM event */
/* 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
)
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)
...
@@ -45,27 +45,31 @@ static void magician_ext_control(struct snd_soc_codec *codec)
{
{
struct
snd_soc_dapm_context
*
dapm
=
&
codec
->
dapm
;
struct
snd_soc_dapm_context
*
dapm
=
&
codec
->
dapm
;
snd_soc_dapm_mutex_lock
(
dapm
);
if
(
magician_spk_switch
)
if
(
magician_spk_switch
)
snd_soc_dapm_enable_pin
(
dapm
,
"Speaker"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"Speaker"
);
else
else
snd_soc_dapm_disable_pin
(
dapm
,
"Speaker"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Speaker"
);
if
(
magician_hp_switch
)
if
(
magician_hp_switch
)
snd_soc_dapm_enable_pin
(
dapm
,
"Headphone Jack"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"Headphone Jack"
);
else
else
snd_soc_dapm_disable_pin
(
dapm
,
"Headphone Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Headphone Jack"
);
switch
(
magician_in_sel
)
{
switch
(
magician_in_sel
)
{
case
MAGICIAN_MIC
:
case
MAGICIAN_MIC
:
snd_soc_dapm_disable_pin
(
dapm
,
"Headset Mic"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Headset Mic"
);
snd_soc_dapm_enable_pin
(
dapm
,
"Call Mic"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"Call Mic"
);
break
;
break
;
case
MAGICIAN_MIC_EXT
:
case
MAGICIAN_MIC_EXT
:
snd_soc_dapm_disable_pin
(
dapm
,
"Call Mic"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Call Mic"
);
snd_soc_dapm_enable_pin
(
dapm
,
"Headset Mic"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"Headset Mic"
);
break
;
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
)
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;
...
@@ -46,61 +46,66 @@ static int spitz_mic_gpio;
static
void
spitz_ext_control
(
struct
snd_soc_dapm_context
*
dapm
)
static
void
spitz_ext_control
(
struct
snd_soc_dapm_context
*
dapm
)
{
{
snd_soc_dapm_mutex_lock
(
dapm
);
if
(
spitz_spk_func
==
SPITZ_SPK_ON
)
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
else
snd_soc_dapm_disable_pin
(
dapm
,
"Ext Spk"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Ext Spk"
);
/* set up jack connection */
/* set up jack connection */
switch
(
spitz_jack_func
)
{
switch
(
spitz_jack_func
)
{
case
SPITZ_HP
:
case
SPITZ_HP
:
/* enable and unmute hp jack, disable mic bias */
/* enable and unmute hp jack, disable mic bias */
snd_soc_dapm_disable_pin
(
dapm
,
"Headset Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Headset Jack"
);
snd_soc_dapm_disable_pin
(
dapm
,
"Mic Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Mic Jack"
);
snd_soc_dapm_disable_pin
(
dapm
,
"Line Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Line Jack"
);
snd_soc_dapm_enable_pin
(
dapm
,
"Headphone Jack"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"Headphone Jack"
);
gpio_set_value
(
SPITZ_GPIO_MUTE_L
,
1
);
gpio_set_value
(
SPITZ_GPIO_MUTE_L
,
1
);
gpio_set_value
(
SPITZ_GPIO_MUTE_R
,
1
);
gpio_set_value
(
SPITZ_GPIO_MUTE_R
,
1
);
break
;
break
;
case
SPITZ_MIC
:
case
SPITZ_MIC
:
/* enable mic jack and bias, mute hp */
/* enable mic jack and bias, mute hp */
snd_soc_dapm_disable_pin
(
dapm
,
"Headphone Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Headphone Jack"
);
snd_soc_dapm_disable_pin
(
dapm
,
"Headset Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Headset Jack"
);
snd_soc_dapm_disable_pin
(
dapm
,
"Line Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Line Jack"
);
snd_soc_dapm_enable_pin
(
dapm
,
"Mic Jack"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"Mic Jack"
);
gpio_set_value
(
SPITZ_GPIO_MUTE_L
,
0
);
gpio_set_value
(
SPITZ_GPIO_MUTE_L
,
0
);
gpio_set_value
(
SPITZ_GPIO_MUTE_R
,
0
);
gpio_set_value
(
SPITZ_GPIO_MUTE_R
,
0
);
break
;
break
;
case
SPITZ_LINE
:
case
SPITZ_LINE
:
/* enable line jack, disable mic bias and mute hp */
/* enable line jack, disable mic bias and mute hp */
snd_soc_dapm_disable_pin
(
dapm
,
"Headphone Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Headphone Jack"
);
snd_soc_dapm_disable_pin
(
dapm
,
"Headset Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Headset Jack"
);
snd_soc_dapm_disable_pin
(
dapm
,
"Mic Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Mic Jack"
);
snd_soc_dapm_enable_pin
(
dapm
,
"Line Jack"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"Line Jack"
);
gpio_set_value
(
SPITZ_GPIO_MUTE_L
,
0
);
gpio_set_value
(
SPITZ_GPIO_MUTE_L
,
0
);
gpio_set_value
(
SPITZ_GPIO_MUTE_R
,
0
);
gpio_set_value
(
SPITZ_GPIO_MUTE_R
,
0
);
break
;
break
;
case
SPITZ_HEADSET
:
case
SPITZ_HEADSET
:
/* enable and unmute headset jack enable mic bias, mute L hp */
/* enable and unmute headset jack enable mic bias, mute L hp */
snd_soc_dapm_disable_pin
(
dapm
,
"Headphone Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Headphone Jack"
);
snd_soc_dapm_enable_pin
(
dapm
,
"Mic Jack"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"Mic Jack"
);
snd_soc_dapm_disable_pin
(
dapm
,
"Line Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Line Jack"
);
snd_soc_dapm_enable_pin
(
dapm
,
"Headset Jack"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"Headset Jack"
);
gpio_set_value
(
SPITZ_GPIO_MUTE_L
,
0
);
gpio_set_value
(
SPITZ_GPIO_MUTE_L
,
0
);
gpio_set_value
(
SPITZ_GPIO_MUTE_R
,
1
);
gpio_set_value
(
SPITZ_GPIO_MUTE_R
,
1
);
break
;
break
;
case
SPITZ_HP_OFF
:
case
SPITZ_HP_OFF
:
/* jack removed, everything off */
/* jack removed, everything off */
snd_soc_dapm_disable_pin
(
dapm
,
"Headphone Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Headphone Jack"
);
snd_soc_dapm_disable_pin
(
dapm
,
"Headset Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Headset Jack"
);
snd_soc_dapm_disable_pin
(
dapm
,
"Mic Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Mic Jack"
);
snd_soc_dapm_disable_pin
(
dapm
,
"Line Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Line Jack"
);
gpio_set_value
(
SPITZ_GPIO_MUTE_L
,
0
);
gpio_set_value
(
SPITZ_GPIO_MUTE_L
,
0
);
gpio_set_value
(
SPITZ_GPIO_MUTE_R
,
0
);
gpio_set_value
(
SPITZ_GPIO_MUTE_R
,
0
);
break
;
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
)
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)
...
@@ -48,31 +48,35 @@ static void tosa_ext_control(struct snd_soc_codec *codec)
{
{
struct
snd_soc_dapm_context
*
dapm
=
&
codec
->
dapm
;
struct
snd_soc_dapm_context
*
dapm
=
&
codec
->
dapm
;
snd_soc_dapm_mutex_lock
(
dapm
);
/* set up jack connection */
/* set up jack connection */
switch
(
tosa_jack_func
)
{
switch
(
tosa_jack_func
)
{
case
TOSA_HP
:
case
TOSA_HP
:
snd_soc_dapm_disable_pin
(
dapm
,
"Mic (Internal)"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Mic (Internal)"
);
snd_soc_dapm_enable_pin
(
dapm
,
"Headphone Jack"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"Headphone Jack"
);
snd_soc_dapm_disable_pin
(
dapm
,
"Headset Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Headset Jack"
);
break
;
break
;
case
TOSA_MIC_INT
:
case
TOSA_MIC_INT
:
snd_soc_dapm_enable_pin
(
dapm
,
"Mic (Internal)"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"Mic (Internal)"
);
snd_soc_dapm_disable_pin
(
dapm
,
"Headphone Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Headphone Jack"
);
snd_soc_dapm_disable_pin
(
dapm
,
"Headset Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Headset Jack"
);
break
;
break
;
case
TOSA_HEADSET
:
case
TOSA_HEADSET
:
snd_soc_dapm_disable_pin
(
dapm
,
"Mic (Internal)"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Mic (Internal)"
);
snd_soc_dapm_disable_pin
(
dapm
,
"Headphone Jack"
);
snd_soc_dapm_disable_pin
_unlocked
(
dapm
,
"Headphone Jack"
);
snd_soc_dapm_enable_pin
(
dapm
,
"Headset Jack"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"Headset Jack"
);
break
;
break
;
}
}
if
(
tosa_spk_func
==
TOSA_SPK_ON
)
if
(
tosa_spk_func
==
TOSA_SPK_ON
)
snd_soc_dapm_enable_pin
(
dapm
,
"Speaker"
);
snd_soc_dapm_enable_pin
_unlocked
(
dapm
,
"Speaker"
);
else
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
)
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[] = {
...
@@ -115,6 +115,12 @@ static int dapm_down_seq[] = {
[
snd_soc_dapm_post
]
=
14
,
[
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
)
static
void
pop_wait
(
u32
pop_time
)
{
{
if
(
pop_time
)
if
(
pop_time
)
...
@@ -146,15 +152,16 @@ static bool dapm_dirty_widget(struct snd_soc_dapm_widget *w)
...
@@ -146,15 +152,16 @@ static bool dapm_dirty_widget(struct snd_soc_dapm_widget *w)
return
!
list_empty
(
&
w
->
dirty
);
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
))
{
if
(
!
dapm_dirty_widget
(
w
))
{
dev_vdbg
(
w
->
dapm
->
dev
,
"Marking %s dirty due to %s
\n
"
,
dev_vdbg
(
w
->
dapm
->
dev
,
"Marking %s dirty due to %s
\n
"
,
w
->
name
,
reason
);
w
->
name
,
reason
);
list_add_tail
(
&
w
->
dirty
,
&
w
->
dapm
->
card
->
dapm_dirty
);
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
)
void
dapm_mark_io_dirty
(
struct
snd_soc_dapm_context
*
dapm
)
{
{
...
@@ -361,6 +368,8 @@ static void dapm_reset(struct snd_soc_card *card)
...
@@ -361,6 +368,8 @@ static void dapm_reset(struct snd_soc_card *card)
{
{
struct
snd_soc_dapm_widget
*
w
;
struct
snd_soc_dapm_widget
*
w
;
lockdep_assert_held
(
&
card
->
dapm_mutex
);
memset
(
&
card
->
dapm_stats
,
0
,
sizeof
(
card
->
dapm_stats
));
memset
(
&
card
->
dapm_stats
,
0
,
sizeof
(
card
->
dapm_stats
));
list_for_each_entry
(
w
,
&
card
->
widgets
,
list
)
{
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,
...
@@ -386,7 +395,8 @@ static int soc_widget_read(struct snd_soc_dapm_widget *w, int reg,
return
-
1
;
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
)
if
(
w
->
codec
)
return
snd_soc_write
(
w
->
codec
,
reg
,
val
);
return
snd_soc_write
(
w
->
codec
,
reg
,
val
);
...
@@ -506,7 +516,7 @@ static void dapm_set_path_status(struct snd_soc_dapm_widget *w,
...
@@ -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_switch
:
case
snd_soc_dapm_mixer
:
case
snd_soc_dapm_mixer
:
case
snd_soc_dapm_mixer_named_ctl
:
{
case
snd_soc_dapm_mixer_named_ctl
:
{
int
val
;
unsigned
int
val
;
struct
soc_mixer_control
*
mc
=
(
struct
soc_mixer_control
*
)
struct
soc_mixer_control
*
mc
=
(
struct
soc_mixer_control
*
)
w
->
kcontrol_news
[
i
].
private_value
;
w
->
kcontrol_news
[
i
].
private_value
;
int
reg
=
mc
->
reg
;
int
reg
=
mc
->
reg
;
...
@@ -530,7 +540,7 @@ static void dapm_set_path_status(struct snd_soc_dapm_widget *w,
...
@@ -530,7 +540,7 @@ static void dapm_set_path_status(struct snd_soc_dapm_widget *w,
case
snd_soc_dapm_mux
:
{
case
snd_soc_dapm_mux
:
{
struct
soc_enum
*
e
=
(
struct
soc_enum
*
)
struct
soc_enum
*
e
=
(
struct
soc_enum
*
)
w
->
kcontrol_news
[
i
].
private_value
;
w
->
kcontrol_news
[
i
].
private_value
;
int
val
,
item
;
unsigned
int
val
,
item
;
soc_widget_read
(
w
,
e
->
reg
,
&
val
);
soc_widget_read
(
w
,
e
->
reg
,
&
val
);
item
=
(
val
>>
e
->
shift_l
)
&
e
->
mask
;
item
=
(
val
>>
e
->
shift_l
)
&
e
->
mask
;
...
@@ -559,7 +569,7 @@ static void dapm_set_path_status(struct snd_soc_dapm_widget *w,
...
@@ -559,7 +569,7 @@ static void dapm_set_path_status(struct snd_soc_dapm_widget *w,
case
snd_soc_dapm_value_mux
:
{
case
snd_soc_dapm_value_mux
:
{
struct
soc_enum
*
e
=
(
struct
soc_enum
*
)
struct
soc_enum
*
e
=
(
struct
soc_enum
*
)
w
->
kcontrol_news
[
i
].
private_value
;
w
->
kcontrol_news
[
i
].
private_value
;
int
val
,
item
;
unsigned
int
val
,
item
;
soc_widget_read
(
w
,
e
->
reg
,
&
val
);
soc_widget_read
(
w
,
e
->
reg
,
&
val
);
val
=
(
val
>>
e
->
shift_l
)
&
e
->
mask
;
val
=
(
val
>>
e
->
shift_l
)
&
e
->
mask
;
...
@@ -1823,6 +1833,8 @@ static int dapm_power_widgets(struct snd_soc_card *card, int event)
...
@@ -1823,6 +1833,8 @@ static int dapm_power_widgets(struct snd_soc_card *card, int event)
ASYNC_DOMAIN_EXCLUSIVE
(
async_domain
);
ASYNC_DOMAIN_EXCLUSIVE
(
async_domain
);
enum
snd_soc_bias_level
bias
;
enum
snd_soc_bias_level
bias
;
lockdep_assert_held
(
&
card
->
dapm_mutex
);
trace_snd_soc_dapm_start
(
card
);
trace_snd_soc_dapm_start
(
card
);
list_for_each_entry
(
d
,
&
card
->
dapm_list
,
list
)
{
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)
...
@@ -1897,10 +1909,14 @@ static int dapm_power_widgets(struct snd_soc_card *card, int event)
trace_snd_soc_dapm_walk_done
(
card
);
trace_snd_soc_dapm_walk_done
(
card
);
/* Run all the bias changes in parallel */
/* Run card bias changes at first */
list_for_each_entry
(
d
,
&
card
->
dapm_list
,
list
)
dapm_pre_sequence_async
(
&
card
->
dapm
,
0
);
async_schedule_domain
(
dapm_pre_sequence_async
,
d
,
/* Run other bias changes in parallel */
&
async_domain
);
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
);
async_synchronize_full_domain
(
&
async_domain
);
list_for_each_entry
(
w
,
&
down_list
,
power_list
)
{
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)
...
@@ -1920,10 +1936,14 @@ static int dapm_power_widgets(struct snd_soc_card *card, int event)
dapm_seq_run
(
card
,
&
up_list
,
event
,
true
);
dapm_seq_run
(
card
,
&
up_list
,
event
,
true
);
/* Run all the bias changes in parallel */
/* Run all the bias changes in parallel */
list_for_each_entry
(
d
,
&
card
->
dapm_list
,
list
)
list_for_each_entry
(
d
,
&
card
->
dapm_list
,
list
)
{
async_schedule_domain
(
dapm_post_sequence_async
,
d
,
if
(
d
!=
&
card
->
dapm
)
&
async_domain
);
async_schedule_domain
(
dapm_post_sequence_async
,
d
,
&
async_domain
);
}
async_synchronize_full_domain
(
&
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 */
/* do we need to notify any clients that DAPM event is complete */
list_for_each_entry
(
d
,
&
card
->
dapm_list
,
list
)
{
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,
...
@@ -2110,6 +2130,8 @@ static int soc_dapm_mux_update_power(struct snd_soc_card *card,
struct
snd_soc_dapm_path
*
path
;
struct
snd_soc_dapm_path
*
path
;
int
found
=
0
;
int
found
=
0
;
lockdep_assert_held
(
&
card
->
dapm_mutex
);
/* find dapm widget path assoc with kcontrol */
/* find dapm widget path assoc with kcontrol */
dapm_kcontrol_for_each_path
(
path
,
kcontrol
)
{
dapm_kcontrol_for_each_path
(
path
,
kcontrol
)
{
if
(
!
path
->
name
||
!
e
->
texts
[
mux
])
if
(
!
path
->
name
||
!
e
->
texts
[
mux
])
...
@@ -2160,6 +2182,8 @@ static int soc_dapm_mixer_update_power(struct snd_soc_card *card,
...
@@ -2160,6 +2182,8 @@ static int soc_dapm_mixer_update_power(struct snd_soc_card *card,
struct
snd_soc_dapm_path
*
path
;
struct
snd_soc_dapm_path
*
path
;
int
found
=
0
;
int
found
=
0
;
lockdep_assert_held
(
&
card
->
dapm_mutex
);
/* find dapm widget path assoc with kcontrol */
/* find dapm widget path assoc with kcontrol */
dapm_kcontrol_for_each_path
(
path
,
kcontrol
)
{
dapm_kcontrol_for_each_path
(
path
,
kcontrol
)
{
found
=
1
;
found
=
1
;
...
@@ -2325,6 +2349,8 @@ static int snd_soc_dapm_set_pin(struct snd_soc_dapm_context *dapm,
...
@@ -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
);
struct
snd_soc_dapm_widget
*
w
=
dapm_find_widget
(
dapm
,
pin
,
true
);
dapm_assert_locked
(
dapm
);
if
(
!
w
)
{
if
(
!
w
)
{
dev_err
(
dapm
->
dev
,
"ASoC: DAPM unknown pin %s
\n
"
,
pin
);
dev_err
(
dapm
->
dev
,
"ASoC: DAPM unknown pin %s
\n
"
,
pin
);
return
-
EINVAL
;
return
-
EINVAL
;
...
@@ -2341,18 +2367,18 @@ static int snd_soc_dapm_set_pin(struct snd_soc_dapm_context *dapm,
...
@@ -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
* @dapm: DAPM context
*
*
* Walks all dapm audio paths and powers widgets according to their
* Walks all dapm audio paths and powers widgets according to their
* stream or path usage.
* stream or path usage.
*
*
* Requires external locking.
*
* Returns 0 for success.
* 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
* Suppress early reports (eg, jacks syncing their state) to avoid
* silly DAPM runs during card startup.
* silly DAPM runs during card startup.
...
@@ -2360,8 +2386,25 @@ int snd_soc_dapm_sync(struct snd_soc_dapm_context *dapm)
...
@@ -2360,8 +2386,25 @@ int snd_soc_dapm_sync(struct snd_soc_dapm_context *dapm)
if
(
!
dapm
->
card
||
!
dapm
->
card
->
instantiated
)
if
(
!
dapm
->
card
||
!
dapm
->
card
->
instantiated
)
return
0
;
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
);
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
);
mutex_unlock
(
&
dapm
->
card
->
dapm_mutex
);
return
ret
;
return
ret
;
}
}
...
@@ -4098,7 +4141,7 @@ void snd_soc_dapm_free(struct snd_soc_dapm_context *dapm)
...
@@ -4098,7 +4141,7 @@ void snd_soc_dapm_free(struct snd_soc_dapm_context *dapm)
}
}
EXPORT_SYMBOL_GPL
(
snd_soc_dapm_free
);
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_card
*
card
=
dapm
->
card
;
struct
snd_soc_dapm_widget
*
w
;
struct
snd_soc_dapm_widget
*
w
;
...
@@ -4138,14 +4181,21 @@ static void soc_dapm_shutdown_codec(struct snd_soc_dapm_context *dapm)
...
@@ -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
)
void
snd_soc_dapm_shutdown
(
struct
snd_soc_card
*
card
)
{
{
struct
snd_soc_codec
*
codec
;
struct
snd_soc_dapm_context
*
dapm
;
list_for_each_entry
(
codec
,
&
card
->
codec_dev_list
,
card_list
)
{
list_for_each_entry
(
dapm
,
&
card
->
dapm_list
,
list
)
{
soc_dapm_shutdown_codec
(
&
codec
->
dapm
);
if
(
dapm
!=
&
card
->
dapm
)
{
if
(
codec
->
dapm
.
bias_level
==
SND_SOC_BIAS_STANDBY
)
soc_dapm_shutdown_dapm
(
dapm
);
snd_soc_dapm_set_bias_level
(
&
codec
->
dapm
,
if
(
dapm
->
bias_level
==
SND_SOC_BIAS_STANDBY
)
SND_SOC_BIAS_OFF
);
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 */
/* 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