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
nexedi
linux
Commits
faa9c2a7
Commit
faa9c2a7
authored
Dec 02, 2012
by
Mark Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'asoc/topic/wm8994' into asoc-next
parents
e041e469
72222be3
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
174 additions
and
134 deletions
+174
-134
drivers/mfd/wm8994-core.c
drivers/mfd/wm8994-core.c
+19
-16
include/linux/mfd/wm8994/core.h
include/linux/mfd/wm8994/core.h
+4
-0
include/linux/mfd/wm8994/pdata.h
include/linux/mfd/wm8994/pdata.h
+5
-0
sound/soc/codecs/wm8958-dsp2.c
sound/soc/codecs/wm8958-dsp2.c
+34
-45
sound/soc/codecs/wm8994.c
sound/soc/codecs/wm8994.c
+112
-72
sound/soc/codecs/wm8994.h
sound/soc/codecs/wm8994.h
+0
-1
No files found.
drivers/mfd/wm8994-core.c
View file @
faa9c2a7
...
...
@@ -401,13 +401,19 @@ static const __devinitconst struct reg_default wm1811_reva_patch[] = {
*/
static
__devinit
int
wm8994_device_init
(
struct
wm8994
*
wm8994
,
int
irq
)
{
struct
wm8994_pdata
*
pdata
=
wm8994
->
dev
->
platform_data
;
struct
wm8994_pdata
*
pdata
;
struct
regmap_config
*
regmap_config
;
const
struct
reg_default
*
regmap_patch
=
NULL
;
const
char
*
devname
;
int
ret
,
i
,
patch_regs
;
int
pulls
=
0
;
if
(
dev_get_platdata
(
wm8994
->
dev
))
{
pdata
=
dev_get_platdata
(
wm8994
->
dev
);
wm8994
->
pdata
=
*
pdata
;
}
pdata
=
&
wm8994
->
pdata
;
dev_set_drvdata
(
wm8994
->
dev
,
wm8994
);
/* Add the on-chip regulators first for bootstrapping */
...
...
@@ -604,24 +610,21 @@ static __devinit int wm8994_device_init(struct wm8994 *wm8994, int irq)
}
}
if
(
pdata
)
{
wm8994
->
irq_base
=
pdata
->
irq_base
;
wm8994
->
gpio_base
=
pdata
->
gpio_base
;
/* GPIO configuration is only applied if it's non-zero */
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
pdata
->
gpio_defaults
);
i
++
)
{
if
(
pdata
->
gpio_defaults
[
i
])
{
wm8994_set_bits
(
wm8994
,
WM8994_GPIO_1
+
i
,
0xffff
,
pdata
->
gpio_defaults
[
i
]);
}
wm8994
->
irq_base
=
pdata
->
irq_base
;
wm8994
->
gpio_base
=
pdata
->
gpio_base
;
/* GPIO configuration is only applied if it's non-zero */
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
pdata
->
gpio_defaults
);
i
++
)
{
if
(
pdata
->
gpio_defaults
[
i
])
{
wm8994_set_bits
(
wm8994
,
WM8994_GPIO_1
+
i
,
0xffff
,
pdata
->
gpio_defaults
[
i
]);
}
}
wm8994
->
ldo_ena_always_driven
=
pdata
->
ldo_ena_always_driven
;
wm8994
->
ldo_ena_always_driven
=
pdata
->
ldo_ena_always_driven
;
if
(
pdata
->
spkmode_pu
)
pulls
|=
WM8994_SPKMODE_PU
;
}
if
(
pdata
->
spkmode_pu
)
pulls
|=
WM8994_SPKMODE_PU
;
/* Disable unneeded pulls */
wm8994_set_bits
(
wm8994
,
WM8994_PULL_CONTROL_2
,
...
...
include/linux/mfd/wm8994/core.h
View file @
faa9c2a7
...
...
@@ -19,6 +19,8 @@
#include <linux/interrupt.h>
#include <linux/regmap.h>
#include <linux/mfd/wm8994/pdata.h>
enum
wm8994_type
{
WM8994
=
0
,
WM8958
=
1
,
...
...
@@ -55,6 +57,8 @@ struct regulator_bulk_data;
struct
wm8994
{
struct
mutex
irq_lock
;
struct
wm8994_pdata
pdata
;
enum
wm8994_type
type
;
int
revision
;
int
cust_id
;
...
...
include/linux/mfd/wm8994/pdata.h
View file @
faa9c2a7
...
...
@@ -176,6 +176,11 @@ struct wm8994_pdata {
unsigned
int
lineout1fb
:
1
;
unsigned
int
lineout2fb
:
1
;
/* Delay between detecting a jack and starting microphone
* detect (specified in ms)
*/
int
micdet_delay
;
/* IRQ for microphone detection if brought out directly as a
* signal.
*/
...
...
sound/soc/codecs/wm8958-dsp2.c
View file @
faa9c2a7
...
...
@@ -195,7 +195,7 @@ static int wm8958_dsp2_fw(struct snd_soc_codec *codec, const char *name,
static
void
wm8958_dsp_start_mbc
(
struct
snd_soc_codec
*
codec
,
int
path
)
{
struct
wm8994_priv
*
wm8994
=
snd_soc_codec_get_drvdata
(
codec
);
struct
wm8994
_pdata
*
pdata
=
wm8994
->
pdata
;
struct
wm8994
*
control
=
wm8994
->
wm8994
;
int
i
;
/* If the DSP is already running then noop */
...
...
@@ -210,9 +210,9 @@ static void wm8958_dsp_start_mbc(struct snd_soc_codec *codec, int path)
WM8958_DSP2_ENA
,
WM8958_DSP2_ENA
);
/* If we've got user supplied MBC settings use them */
if
(
pdata
&&
pdata
->
num_mbc_cfgs
)
{
if
(
control
->
pdata
.
num_mbc_cfgs
)
{
struct
wm8958_mbc_cfg
*
cfg
=
&
pdata
->
mbc_cfgs
[
wm8994
->
mbc_cfg
];
=
&
control
->
pdata
.
mbc_cfgs
[
wm8994
->
mbc_cfg
];
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
cfg
->
coeff_regs
);
i
++
)
snd_soc_write
(
codec
,
i
+
WM8958_MBC_BAND_1_K_1
,
...
...
@@ -239,7 +239,7 @@ static void wm8958_dsp_start_mbc(struct snd_soc_codec *codec, int path)
static
void
wm8958_dsp_start_vss
(
struct
snd_soc_codec
*
codec
,
int
path
)
{
struct
wm8994_priv
*
wm8994
=
snd_soc_codec_get_drvdata
(
codec
);
struct
wm8994
_pdata
*
pdata
=
wm8994
->
pdata
;
struct
wm8994
*
control
=
wm8994
->
wm8994
;
int
i
,
ena
;
if
(
wm8994
->
mbc_vss
)
...
...
@@ -249,26 +249,26 @@ static void wm8958_dsp_start_vss(struct snd_soc_codec *codec, int path)
WM8958_DSP2_ENA
,
WM8958_DSP2_ENA
);
/* If we've got user supplied settings use them */
if
(
pdata
&&
pdata
->
num_mbc_cfgs
)
{
if
(
control
->
pdata
.
num_mbc_cfgs
)
{
struct
wm8958_mbc_cfg
*
cfg
=
&
pdata
->
mbc_cfgs
[
wm8994
->
mbc_cfg
];
=
&
control
->
pdata
.
mbc_cfgs
[
wm8994
->
mbc_cfg
];
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
cfg
->
combined_regs
);
i
++
)
snd_soc_write
(
codec
,
i
+
0x2800
,
cfg
->
combined_regs
[
i
]);
}
if
(
pdata
&&
pdata
->
num_vss_cfgs
)
{
if
(
control
->
pdata
.
num_vss_cfgs
)
{
struct
wm8958_vss_cfg
*
cfg
=
&
pdata
->
vss_cfgs
[
wm8994
->
vss_cfg
];
=
&
control
->
pdata
.
vss_cfgs
[
wm8994
->
vss_cfg
];
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
cfg
->
regs
);
i
++
)
snd_soc_write
(
codec
,
i
+
0x2600
,
cfg
->
regs
[
i
]);
}
if
(
pdata
&&
pdata
->
num_vss_hpf_cfgs
)
{
if
(
control
->
pdata
.
num_vss_hpf_cfgs
)
{
struct
wm8958_vss_hpf_cfg
*
cfg
=
&
pdata
->
vss_hpf_cfgs
[
wm8994
->
vss_hpf_cfg
];
=
&
control
->
pdata
.
vss_hpf_cfgs
[
wm8994
->
vss_hpf_cfg
];
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
cfg
->
regs
);
i
++
)
snd_soc_write
(
codec
,
i
+
0x2400
,
cfg
->
regs
[
i
]);
...
...
@@ -300,7 +300,7 @@ static void wm8958_dsp_start_vss(struct snd_soc_codec *codec, int path)
static
void
wm8958_dsp_start_enh_eq
(
struct
snd_soc_codec
*
codec
,
int
path
)
{
struct
wm8994_priv
*
wm8994
=
snd_soc_codec_get_drvdata
(
codec
);
struct
wm8994
_pdata
*
pdata
=
wm8994
->
pdata
;
struct
wm8994
*
control
=
wm8994
->
wm8994
;
int
i
;
wm8958_dsp2_fw
(
codec
,
"ENH_EQ"
,
wm8994
->
enh_eq
,
false
);
...
...
@@ -309,9 +309,9 @@ static void wm8958_dsp_start_enh_eq(struct snd_soc_codec *codec, int path)
WM8958_DSP2_ENA
,
WM8958_DSP2_ENA
);
/* If we've got user supplied settings use them */
if
(
pdata
&&
pdata
->
num_enh_eq_cfgs
)
{
if
(
control
->
pdata
.
num_enh_eq_cfgs
)
{
struct
wm8958_enh_eq_cfg
*
cfg
=
&
pdata
->
enh_eq_cfgs
[
wm8994
->
enh_eq_cfg
];
=
&
control
->
pdata
.
enh_eq_cfgs
[
wm8994
->
enh_eq_cfg
];
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
cfg
->
regs
);
i
++
)
snd_soc_write
(
codec
,
i
+
0x2200
,
...
...
@@ -458,7 +458,7 @@ static int wm8958_put_mbc_enum(struct snd_kcontrol *kcontrol,
{
struct
snd_soc_codec
*
codec
=
snd_kcontrol_chip
(
kcontrol
);
struct
wm8994_priv
*
wm8994
=
snd_soc_codec_get_drvdata
(
codec
);
struct
wm8994
_pdata
*
pdata
=
wm8994
->
pdata
;
struct
wm8994
*
control
=
wm8994
->
wm8994
;
int
value
=
ucontrol
->
value
.
integer
.
value
[
0
];
int
reg
;
...
...
@@ -467,7 +467,7 @@ static int wm8958_put_mbc_enum(struct snd_kcontrol *kcontrol,
if
(
reg
<
0
||
reg
&
WM8958_DSP2CLK_ENA
)
return
-
EBUSY
;
if
(
value
>=
pdata
->
num_mbc_cfgs
)
if
(
value
>=
control
->
pdata
.
num_mbc_cfgs
)
return
-
EINVAL
;
wm8994
->
mbc_cfg
=
value
;
...
...
@@ -548,7 +548,7 @@ static int wm8958_put_vss_enum(struct snd_kcontrol *kcontrol,
{
struct
snd_soc_codec
*
codec
=
snd_kcontrol_chip
(
kcontrol
);
struct
wm8994_priv
*
wm8994
=
snd_soc_codec_get_drvdata
(
codec
);
struct
wm8994
_pdata
*
pdata
=
wm8994
->
pdata
;
struct
wm8994
*
control
=
wm8994
->
wm8994
;
int
value
=
ucontrol
->
value
.
integer
.
value
[
0
];
int
reg
;
...
...
@@ -557,7 +557,7 @@ static int wm8958_put_vss_enum(struct snd_kcontrol *kcontrol,
if
(
reg
<
0
||
reg
&
WM8958_DSP2CLK_ENA
)
return
-
EBUSY
;
if
(
value
>=
pdata
->
num_vss_cfgs
)
if
(
value
>=
control
->
pdata
.
num_vss_cfgs
)
return
-
EINVAL
;
wm8994
->
vss_cfg
=
value
;
...
...
@@ -581,7 +581,7 @@ static int wm8958_put_vss_hpf_enum(struct snd_kcontrol *kcontrol,
{
struct
snd_soc_codec
*
codec
=
snd_kcontrol_chip
(
kcontrol
);
struct
wm8994_priv
*
wm8994
=
snd_soc_codec_get_drvdata
(
codec
);
struct
wm8994
_pdata
*
pdata
=
wm8994
->
pdata
;
struct
wm8994
*
control
=
wm8994
->
wm8994
;
int
value
=
ucontrol
->
value
.
integer
.
value
[
0
];
int
reg
;
...
...
@@ -590,7 +590,7 @@ static int wm8958_put_vss_hpf_enum(struct snd_kcontrol *kcontrol,
if
(
reg
<
0
||
reg
&
WM8958_DSP2CLK_ENA
)
return
-
EBUSY
;
if
(
value
>=
pdata
->
num_vss_hpf_cfgs
)
if
(
value
>=
control
->
pdata
.
num_vss_hpf_cfgs
)
return
-
EINVAL
;
wm8994
->
vss_hpf_cfg
=
value
;
...
...
@@ -748,7 +748,7 @@ static int wm8958_put_enh_eq_enum(struct snd_kcontrol *kcontrol,
{
struct
snd_soc_codec
*
codec
=
snd_kcontrol_chip
(
kcontrol
);
struct
wm8994_priv
*
wm8994
=
snd_soc_codec_get_drvdata
(
codec
);
struct
wm8994
_pdata
*
pdata
=
wm8994
->
pdata
;
struct
wm8994
*
control
=
wm8994
->
wm8994
;
int
value
=
ucontrol
->
value
.
integer
.
value
[
0
];
int
reg
;
...
...
@@ -757,7 +757,7 @@ static int wm8958_put_enh_eq_enum(struct snd_kcontrol *kcontrol,
if
(
reg
<
0
||
reg
&
WM8958_DSP2CLK_ENA
)
return
-
EBUSY
;
if
(
value
>=
pdata
->
num_enh_eq_cfgs
)
if
(
value
>=
control
->
pdata
.
num_enh_eq_cfgs
)
return
-
EINVAL
;
wm8994
->
enh_eq_cfg
=
value
;
...
...
@@ -883,13 +883,6 @@ static void wm8958_mbc_vss_loaded(const struct firmware *fw, void *context)
wm8994
->
mbc_vss
=
fw
;
mutex_unlock
(
&
codec
->
mutex
);
}
/* We can't have more than one request outstanding at once so
* we daisy chain.
*/
request_firmware_nowait
(
THIS_MODULE
,
FW_ACTION_HOTPLUG
,
"wm8958_enh_eq.wfw"
,
codec
->
dev
,
GFP_KERNEL
,
codec
,
wm8958_enh_eq_loaded
);
}
static
void
wm8958_mbc_loaded
(
const
struct
firmware
*
fw
,
void
*
context
)
...
...
@@ -897,25 +890,18 @@ static void wm8958_mbc_loaded(const struct firmware *fw, void *context)
struct
snd_soc_codec
*
codec
=
context
;
struct
wm8994_priv
*
wm8994
=
snd_soc_codec_get_drvdata
(
codec
);
if
(
wm8958_dsp2_fw
(
codec
,
"MBC"
,
fw
,
true
)
!=
0
)
return
;
mutex_lock
(
&
codec
->
mutex
);
wm8994
->
mbc
=
fw
;
mutex_unlock
(
&
codec
->
mutex
);
/* We can't have more than one request outstanding at once so
* we daisy chain.
*/
request_firmware_nowait
(
THIS_MODULE
,
FW_ACTION_HOTPLUG
,
"wm8958_mbc_vss.wfw"
,
codec
->
dev
,
GFP_KERNEL
,
codec
,
wm8958_mbc_vss_loaded
);
if
(
fw
&&
(
wm8958_dsp2_fw
(
codec
,
"MBC"
,
fw
,
true
)
==
0
))
{
mutex_lock
(
&
codec
->
mutex
);
wm8994
->
mbc
=
fw
;
mutex_unlock
(
&
codec
->
mutex
);
}
}
void
wm8958_dsp2_init
(
struct
snd_soc_codec
*
codec
)
{
struct
wm8994_priv
*
wm8994
=
snd_soc_codec_get_drvdata
(
codec
);
struct
wm8994_pdata
*
pdata
=
wm8994
->
pdata
;
struct
wm8994
*
control
=
wm8994
->
wm8994
;
struct
wm8994_pdata
*
pdata
=
&
control
->
pdata
;
int
ret
,
i
;
wm8994
->
dsp_active
=
-
1
;
...
...
@@ -932,9 +918,12 @@ void wm8958_dsp2_init(struct snd_soc_codec *codec)
request_firmware_nowait
(
THIS_MODULE
,
FW_ACTION_HOTPLUG
,
"wm8958_mbc.wfw"
,
codec
->
dev
,
GFP_KERNEL
,
codec
,
wm8958_mbc_loaded
);
if
(
!
pdata
)
return
;
request_firmware_nowait
(
THIS_MODULE
,
FW_ACTION_HOTPLUG
,
"wm8958_mbc_vss.wfw"
,
codec
->
dev
,
GFP_KERNEL
,
codec
,
wm8958_mbc_vss_loaded
);
request_firmware_nowait
(
THIS_MODULE
,
FW_ACTION_HOTPLUG
,
"wm8958_enh_eq.wfw"
,
codec
->
dev
,
GFP_KERNEL
,
codec
,
wm8958_enh_eq_loaded
);
if
(
pdata
->
num_mbc_cfgs
)
{
struct
snd_kcontrol_new
control
[]
=
{
...
...
sound/soc/codecs/wm8994.c
View file @
faa9c2a7
...
...
@@ -110,13 +110,13 @@ static const struct wm8958_micd_rate jackdet_rates[] = {
static
void
wm8958_micd_set_rate
(
struct
snd_soc_codec
*
codec
)
{
struct
wm8994_priv
*
wm8994
=
snd_soc_codec_get_drvdata
(
codec
);
struct
wm8994
*
control
=
wm8994
->
wm8994
;
int
best
,
i
,
sysclk
,
val
;
bool
idle
;
const
struct
wm8958_micd_rate
*
rates
;
int
num_rates
;
if
(
!
(
wm8994
->
pdata
&&
wm8994
->
pdata
->
micd_rates
)
&&
wm8994
->
jack_cb
!=
wm8958_default_micdet
)
if
(
wm8994
->
jack_cb
!=
wm8958_default_micdet
)
return
;
idle
=
!
wm8994
->
jack_mic
;
...
...
@@ -127,9 +127,9 @@ static void wm8958_micd_set_rate(struct snd_soc_codec *codec)
else
sysclk
=
wm8994
->
aifclk
[
0
];
if
(
wm8994
->
pdata
&&
wm8994
->
pdata
->
micd_rates
)
{
rates
=
wm8994
->
pdata
->
micd_rates
;
num_rates
=
wm8994
->
pdata
->
num_micd_rates
;
if
(
control
->
pdata
.
micd_rates
)
{
rates
=
control
->
pdata
.
micd_rates
;
num_rates
=
control
->
pdata
.
num_micd_rates
;
}
else
if
(
wm8994
->
jackdet
)
{
rates
=
jackdet_rates
;
num_rates
=
ARRAY_SIZE
(
jackdet_rates
);
...
...
@@ -326,7 +326,8 @@ static int wm8994_put_drc_sw(struct snd_kcontrol *kcontrol,
static
void
wm8994_set_drc
(
struct
snd_soc_codec
*
codec
,
int
drc
)
{
struct
wm8994_priv
*
wm8994
=
snd_soc_codec_get_drvdata
(
codec
);
struct
wm8994_pdata
*
pdata
=
wm8994
->
pdata
;
struct
wm8994
*
control
=
wm8994
->
wm8994
;
struct
wm8994_pdata
*
pdata
=
&
control
->
pdata
;
int
base
=
wm8994_drc_base
[
drc
];
int
cfg
=
wm8994
->
drc_cfg
[
drc
];
int
save
,
i
;
...
...
@@ -362,7 +363,8 @@ static int wm8994_put_drc_enum(struct snd_kcontrol *kcontrol,
{
struct
snd_soc_codec
*
codec
=
snd_kcontrol_chip
(
kcontrol
);
struct
wm8994_priv
*
wm8994
=
snd_soc_codec_get_drvdata
(
codec
);
struct
wm8994_pdata
*
pdata
=
wm8994
->
pdata
;
struct
wm8994
*
control
=
wm8994
->
wm8994
;
struct
wm8994_pdata
*
pdata
=
&
control
->
pdata
;
int
drc
=
wm8994_get_drc
(
kcontrol
->
id
.
name
);
int
value
=
ucontrol
->
value
.
integer
.
value
[
0
];
...
...
@@ -394,7 +396,8 @@ static int wm8994_get_drc_enum(struct snd_kcontrol *kcontrol,
static
void
wm8994_set_retune_mobile
(
struct
snd_soc_codec
*
codec
,
int
block
)
{
struct
wm8994_priv
*
wm8994
=
snd_soc_codec_get_drvdata
(
codec
);
struct
wm8994_pdata
*
pdata
=
wm8994
->
pdata
;
struct
wm8994
*
control
=
wm8994
->
wm8994
;
struct
wm8994_pdata
*
pdata
=
&
control
->
pdata
;
int
base
=
wm8994_retune_mobile_base
[
block
];
int
iface
,
best
,
best_val
,
save
,
i
,
cfg
;
...
...
@@ -465,7 +468,8 @@ static int wm8994_put_retune_mobile_enum(struct snd_kcontrol *kcontrol,
{
struct
snd_soc_codec
*
codec
=
snd_kcontrol_chip
(
kcontrol
);
struct
wm8994_priv
*
wm8994
=
snd_soc_codec_get_drvdata
(
codec
);
struct
wm8994_pdata
*
pdata
=
wm8994
->
pdata
;
struct
wm8994
*
control
=
wm8994
->
wm8994
;
struct
wm8994_pdata
*
pdata
=
&
control
->
pdata
;
int
block
=
wm8994_get_retune_mobile_block
(
kcontrol
->
id
.
name
);
int
value
=
ucontrol
->
value
.
integer
.
value
[
0
];
...
...
@@ -862,7 +866,7 @@ static void vmid_reference(struct snd_soc_codec *codec)
WM8994_BIAS_SRC
|
WM8994_STARTUP_BIAS_ENA
|
WM8994_VMID_BUF_ENA
|
(
0x
3
<<
WM8994_VMID_RAMP_SHIFT
));
(
0x
2
<<
WM8994_VMID_RAMP_SHIFT
));
/* Main bias enable, VMID=2x40k */
snd_soc_update_bits
(
codec
,
WM8994_POWER_MANAGEMENT_1
,
...
...
@@ -870,7 +874,7 @@ static void vmid_reference(struct snd_soc_codec *codec)
WM8994_VMID_SEL_MASK
,
WM8994_BIAS_ENA
|
0x2
);
msleep
(
5
0
);
msleep
(
30
0
);
snd_soc_update_bits
(
codec
,
WM8994_ANTIPOP_2
,
WM8994_VMID_RAMP_MASK
|
...
...
@@ -939,16 +943,10 @@ static void vmid_dereference(struct snd_soc_codec *codec)
WM8994_BIAS_SRC
|
WM8994_VMID_DISCH
);
switch
(
wm8994
->
vmid_mode
)
{
case
WM8994_VMID_FORCE
:
msleep
(
350
);
break
;
default:
break
;
}
snd_soc_update_bits
(
codec
,
WM8994_POWER_MANAGEMENT_1
,
WM8994_VMID_SEL_MASK
,
0
);
snd_soc_update_bits
(
codec
,
WM8994_ADDITIONAL_CONTROL
,
WM8994_VROI
,
WM8994_VROI
);
msleep
(
400
);
/* Active discharge */
snd_soc_update_bits
(
codec
,
WM8994_ANTIPOP_1
,
...
...
@@ -957,17 +955,12 @@ static void vmid_dereference(struct snd_soc_codec *codec)
WM8994_LINEOUT1_DISCH
|
WM8994_LINEOUT2_DISCH
);
msleep
(
150
);
snd_soc_update_bits
(
codec
,
WM8994_POWER_MANAGEMENT_3
,
WM8994_LINEOUT1N_ENA
|
WM8994_LINEOUT1P_ENA
|
WM8994_LINEOUT2N_ENA
|
WM8994_LINEOUT2P_ENA
,
0
);
snd_soc_update_bits
(
codec
,
WM8994_ADDITIONAL_CONTROL
,
WM8994_VROI
,
0
);
/* Switch off startup biases */
snd_soc_update_bits
(
codec
,
WM8994_ANTIPOP_2
,
WM8994_BIAS_SRC
|
...
...
@@ -976,10 +969,7 @@ static void vmid_dereference(struct snd_soc_codec *codec)
WM8994_VMID_RAMP_MASK
,
0
);
snd_soc_update_bits
(
codec
,
WM8994_POWER_MANAGEMENT_1
,
WM8994_BIAS_ENA
|
WM8994_VMID_SEL_MASK
,
0
);
snd_soc_update_bits
(
codec
,
WM8994_ANTIPOP_2
,
WM8994_VMID_RAMP_MASK
,
0
);
WM8994_VMID_SEL_MASK
,
0
);
}
pm_runtime_put
(
codec
->
dev
);
...
...
@@ -2277,6 +2267,18 @@ static int _wm8994_set_fll(struct snd_soc_codec *codec, int id, int src,
configure_clock
(
codec
);
/*
* If SYSCLK will be less than 50kHz adjust AIFnCLK dividers
* for detection.
*/
if
(
max
(
wm8994
->
aifclk
[
0
],
wm8994
->
aifclk
[
1
])
<
50000
)
{
dev_dbg
(
codec
->
dev
,
"Configuring AIFs for 128fs
\n
"
);
snd_soc_update_bits
(
codec
,
WM8994_AIF1_RATE
,
WM8994_AIF1CLK_RATE_MASK
,
0x1
);
snd_soc_update_bits
(
codec
,
WM8994_AIF2_RATE
,
WM8994_AIF2CLK_RATE_MASK
,
0x1
);
}
return
0
;
}
...
...
@@ -2365,6 +2367,18 @@ static int wm8994_set_dai_sysclk(struct snd_soc_dai *dai,
configure_clock
(
codec
);
/*
* If SYSCLK will be less than 50kHz adjust AIFnCLK dividers
* for detection.
*/
if
(
max
(
wm8994
->
aifclk
[
0
],
wm8994
->
aifclk
[
1
])
<
50000
)
{
dev_dbg
(
codec
->
dev
,
"Configuring AIFs for 128fs
\n
"
);
snd_soc_update_bits
(
codec
,
WM8994_AIF1_RATE
,
WM8994_AIF1CLK_RATE_MASK
,
0x1
);
snd_soc_update_bits
(
codec
,
WM8994_AIF2_RATE
,
WM8994_AIF2CLK_RATE_MASK
,
0x1
);
}
return
0
;
}
...
...
@@ -3082,7 +3096,8 @@ static int wm8994_codec_resume(struct snd_soc_codec *codec)
static
void
wm8994_handle_retune_mobile_pdata
(
struct
wm8994_priv
*
wm8994
)
{
struct
snd_soc_codec
*
codec
=
wm8994
->
hubs
.
codec
;
struct
wm8994_pdata
*
pdata
=
wm8994
->
pdata
;
struct
wm8994
*
control
=
wm8994
->
wm8994
;
struct
wm8994_pdata
*
pdata
=
&
control
->
pdata
;
struct
snd_kcontrol_new
controls
[]
=
{
SOC_ENUM_EXT
(
"AIF1.1 EQ Mode"
,
wm8994
->
retune_mobile_enum
,
...
...
@@ -3149,7 +3164,8 @@ static void wm8994_handle_retune_mobile_pdata(struct wm8994_priv *wm8994)
static
void
wm8994_handle_pdata
(
struct
wm8994_priv
*
wm8994
)
{
struct
snd_soc_codec
*
codec
=
wm8994
->
hubs
.
codec
;
struct
wm8994_pdata
*
pdata
=
wm8994
->
pdata
;
struct
wm8994
*
control
=
wm8994
->
wm8994
;
struct
wm8994_pdata
*
pdata
=
&
control
->
pdata
;
int
ret
,
i
;
if
(
!
pdata
)
...
...
@@ -3451,7 +3467,7 @@ static void wm8958_default_micdet(u16 status, void *data)
mutex_unlock
(
&
wm8994
->
accdet_lock
);
if
(
wm8994
->
pdata
->
jd_ext_cap
)
if
(
wm8994
->
wm8994
->
pdata
.
jd_ext_cap
)
snd_soc_dapm_disable_pin
(
&
codec
->
dapm
,
"MICBIAS2"
);
}
...
...
@@ -3486,11 +3502,48 @@ static void wm8958_default_micdet(u16 status, void *data)
}
}
/* Deferred mic detection to allow for extra settling time */
static
void
wm1811_mic_work
(
struct
work_struct
*
work
)
{
struct
wm8994_priv
*
wm8994
=
container_of
(
work
,
struct
wm8994_priv
,
mic_work
.
work
);
struct
wm8994
*
control
=
wm8994
->
wm8994
;
struct
snd_soc_codec
*
codec
=
wm8994
->
hubs
.
codec
;
pm_runtime_get_sync
(
codec
->
dev
);
/* If required for an external cap force MICBIAS on */
if
(
control
->
pdata
.
jd_ext_cap
)
{
snd_soc_dapm_force_enable_pin
(
&
codec
->
dapm
,
"MICBIAS2"
);
snd_soc_dapm_sync
(
&
codec
->
dapm
);
}
mutex_lock
(
&
wm8994
->
accdet_lock
);
dev_dbg
(
codec
->
dev
,
"Starting mic detection
\n
"
);
/*
* Start off measument of microphone impedence to find out
* what's actually there.
*/
wm8994
->
mic_detecting
=
true
;
wm1811_jackdet_set_mode
(
codec
,
WM1811_JACKDET_MODE_MIC
);
snd_soc_update_bits
(
codec
,
WM8958_MIC_DETECT_1
,
WM8958_MICD_ENA
,
WM8958_MICD_ENA
);
mutex_unlock
(
&
wm8994
->
accdet_lock
);
pm_runtime_put
(
codec
->
dev
);
}
static
irqreturn_t
wm1811_jackdet_irq
(
int
irq
,
void
*
data
)
{
struct
wm8994_priv
*
wm8994
=
data
;
struct
wm8994
*
control
=
wm8994
->
wm8994
;
struct
snd_soc_codec
*
codec
=
wm8994
->
hubs
.
codec
;
int
reg
;
int
reg
,
delay
;
bool
present
;
pm_runtime_get_sync
(
codec
->
dev
);
...
...
@@ -3521,18 +3574,14 @@ static irqreturn_t wm1811_jackdet_irq(int irq, void *data)
snd_soc_update_bits
(
codec
,
WM1811_JACKDET_CTRL
,
WM1811_JACKDET_DB
,
0
);
/*
* Start off measument of microphone impedence to find
* out what's actually there.
*/
wm8994
->
mic_detecting
=
true
;
wm1811_jackdet_set_mode
(
codec
,
WM1811_JACKDET_MODE_MIC
);
snd_soc_update_bits
(
codec
,
WM8958_MIC_DETECT_1
,
WM8958_MICD_ENA
,
WM8958_MICD_ENA
);
delay
=
control
->
pdata
.
micdet_delay
;
schedule_delayed_work
(
&
wm8994
->
mic_work
,
msecs_to_jiffies
(
delay
));
}
else
{
dev_dbg
(
codec
->
dev
,
"Jack not detected
\n
"
);
cancel_delayed_work_sync
(
&
wm8994
->
mic_work
);
snd_soc_update_bits
(
codec
,
WM8958_MICBIAS2
,
WM8958_MICB2_DISCH
,
WM8958_MICB2_DISCH
);
...
...
@@ -3549,14 +3598,9 @@ static irqreturn_t wm1811_jackdet_irq(int irq, void *data)
mutex_unlock
(
&
wm8994
->
accdet_lock
);
/* If required for an external cap force MICBIAS on */
if
(
wm8994
->
pdata
->
jd_ext_cap
)
{
if
(
present
)
snd_soc_dapm_force_enable_pin
(
&
codec
->
dapm
,
"MICBIAS2"
);
else
snd_soc_dapm_disable_pin
(
&
codec
->
dapm
,
"MICBIAS2"
);
}
/* Turn off MICBIAS if it was on for an external cap */
if
(
control
->
pdata
.
jd_ext_cap
&&
!
present
)
snd_soc_dapm_disable_pin
(
&
codec
->
dapm
,
"MICBIAS2"
);
if
(
present
)
snd_soc_jack_report
(
wm8994
->
micdet
[
0
].
jack
,
...
...
@@ -3633,8 +3677,8 @@ int wm8958_mic_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack,
wm8958_micd_set_rate
(
codec
);
/* Detect microphones and short circuits by default */
if
(
wm8994
->
pdata
->
micd_lvl_sel
)
micd_lvl_sel
=
wm8994
->
pdata
->
micd_lvl_sel
;
if
(
control
->
pdata
.
micd_lvl_sel
)
micd_lvl_sel
=
control
->
pdata
.
micd_lvl_sel
;
else
micd_lvl_sel
=
0x41
;
...
...
@@ -3779,15 +3823,24 @@ static int wm8994_codec_probe(struct snd_soc_codec *codec)
snd_soc_codec_set_cache_io
(
codec
,
16
,
16
,
SND_SOC_REGMAP
);
mutex_init
(
&
wm8994
->
accdet_lock
);
INIT_DELAYED_WORK
(
&
wm8994
->
mic_work
,
wm8994_mic_work
);
INIT_DELAYED_WORK
(
&
wm8994
->
jackdet_bootstrap
,
wm1811_jackdet_bootstrap
);
switch
(
control
->
type
)
{
case
WM8994
:
INIT_DELAYED_WORK
(
&
wm8994
->
mic_work
,
wm8994_mic_work
);
break
;
case
WM1811
:
INIT_DELAYED_WORK
(
&
wm8994
->
mic_work
,
wm1811_mic_work
);
break
;
default:
break
;
}
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
wm8994
->
fll_locked
);
i
++
)
init_completion
(
&
wm8994
->
fll_locked
[
i
]);
if
(
wm8994
->
pdata
&&
wm8994
->
pdata
->
micdet_irq
)
wm8994
->
micdet_irq
=
wm8994
->
pdata
->
micdet_irq
;
wm8994
->
micdet_irq
=
control
->
pdata
.
micdet_irq
;
pm_runtime_enable
(
codec
->
dev
);
pm_runtime_idle
(
codec
->
dev
);
...
...
@@ -3800,8 +3853,8 @@ static int wm8994_codec_probe(struct snd_soc_codec *codec)
switch
(
control
->
type
)
{
case
WM8994
:
/* Single ended line outputs should have VMID on. */
if
(
!
wm8994
->
pdata
->
lineout1_diff
||
!
wm8994
->
pdata
->
lineout2_diff
)
if
(
!
control
->
pdata
.
lineout1_diff
||
!
control
->
pdata
.
lineout2_diff
)
codec
->
dapm
.
idle_bias_off
=
0
;
switch
(
wm8994
->
revision
)
{
...
...
@@ -3839,20 +3892,8 @@ static int wm8994_codec_probe(struct snd_soc_codec *codec)
wm8994
->
hubs
.
no_cache_dac_hp_direct
=
true
;
wm8994
->
fll_byp
=
true
;
switch
(
control
->
cust_id
)
{
case
0
:
case
2
:
wm8994
->
hubs
.
dcs_codes_l
=
-
9
;
wm8994
->
hubs
.
dcs_codes_r
=
-
7
;
break
;
case
1
:
case
3
:
wm8994
->
hubs
.
dcs_codes_l
=
-
8
;
wm8994
->
hubs
.
dcs_codes_r
=
-
7
;
break
;
default:
break
;
}
wm8994
->
hubs
.
dcs_codes_l
=
-
9
;
wm8994
->
hubs
.
dcs_codes_r
=
-
7
;
snd_soc_update_bits
(
codec
,
WM8994_ANALOGUE_HP_1
,
WM1811_HPOUT1_ATTN
,
WM1811_HPOUT1_ATTN
);
...
...
@@ -4236,7 +4277,6 @@ static int __devinit wm8994_probe(struct platform_device *pdev)
platform_set_drvdata
(
pdev
,
wm8994
);
wm8994
->
wm8994
=
dev_get_drvdata
(
pdev
->
dev
.
parent
);
wm8994
->
pdata
=
dev_get_platdata
(
pdev
->
dev
.
parent
);
return
snd_soc_register_codec
(
&
pdev
->
dev
,
&
soc_codec_dev_wm8994
,
wm8994_dai
,
ARRAY_SIZE
(
wm8994_dai
));
...
...
sound/soc/codecs/wm8994.h
View file @
faa9c2a7
...
...
@@ -143,7 +143,6 @@ struct wm8994_priv {
int
micdet_irq
;
int
revision
;
struct
wm8994_pdata
*
pdata
;
unsigned
int
aif1clk_enable
:
1
;
unsigned
int
aif2clk_enable
:
1
;
...
...
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