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
06f1c663
Commit
06f1c663
authored
Dec 10, 2012
by
Mark Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'asoc/topic/wm8994' into asoc-next
parents
6f5716a2
98869f68
Changes
7
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
273 additions
and
208 deletions
+273
-208
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
+202
-141
sound/soc/codecs/wm8994.h
sound/soc/codecs/wm8994.h
+8
-5
sound/soc/samsung/littlemill.c
sound/soc/samsung/littlemill.c
+1
-1
No files found.
drivers/mfd/wm8994-core.c
View file @
06f1c663
...
...
@@ -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 @
06f1c663
...
...
@@ -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 @
06f1c663
...
...
@@ -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 @
06f1c663
...
...
@@ -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 @
06f1c663
This diff is collapsed.
Click to expand it.
sound/soc/codecs/wm8994.h
View file @
06f1c663
...
...
@@ -39,12 +39,14 @@ enum wm8994_vmid_mode {
WM8994_VMID_FORCE
,
};
typedef
void
(
*
wm8958_micdet_cb
)(
u16
status
,
void
*
data
);
typedef
void
(
*
wm1811_micdet_cb
)(
void
*
data
);
typedef
void
(
*
wm1811_mic_id_cb
)(
void
*
data
,
u16
status
);
int
wm8994_mic_detect
(
struct
snd_soc_codec
*
codec
,
struct
snd_soc_jack
*
jack
,
int
micbias
);
int
wm8958_mic_detect
(
struct
snd_soc_codec
*
codec
,
struct
snd_soc_jack
*
jack
,
wm8958_micdet_cb
cb
,
void
*
cb_data
);
wm1811_micdet_cb
cb
,
void
*
det_cb_data
,
wm1811_mic_id_cb
id_cb
,
void
*
id_cb_data
);
int
wm8994_vmid_mode
(
struct
snd_soc_codec
*
codec
,
enum
wm8994_vmid_mode
mode
);
...
...
@@ -138,12 +140,13 @@ struct wm8994_priv {
int
jackdet_mode
;
struct
delayed_work
jackdet_bootstrap
;
wm8958_micdet_cb
jack_cb
;
void
*
jack_cb_data
;
int
micdet_irq
;
wm1811_micdet_cb
micd_cb
;
void
*
micd_cb_data
;
wm1811_mic_id_cb
mic_id_cb
;
void
*
mic_id_cb_data
;
int
revision
;
struct
wm8994_pdata
*
pdata
;
unsigned
int
aif1clk_enable
:
1
;
unsigned
int
aif2clk_enable
:
1
;
...
...
sound/soc/samsung/littlemill.c
View file @
06f1c663
...
...
@@ -270,7 +270,7 @@ static int littlemill_late_probe(struct snd_soc_card *card)
return
ret
;
/* This will check device compatibility itself */
wm8958_mic_detect
(
codec
,
&
littlemill_headset
,
NULL
,
NULL
);
wm8958_mic_detect
(
codec
,
&
littlemill_headset
,
NULL
,
NULL
,
NULL
,
NULL
);
/* As will this */
wm8994_mic_detect
(
codec
,
&
littlemill_headset
,
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