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
0bebd2f1
Commit
0bebd2f1
authored
Oct 26, 2017
by
Mark Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branches 'asoc/fix/topology' and 'asoc/fix/wm8998' into asoc-linus
parents
b64395f1
f3ee9096
d24e95f8
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
23 additions
and
66 deletions
+23
-66
sound/soc/codecs/wm8998.c
sound/soc/codecs/wm8998.c
+19
-65
sound/soc/soc-topology.c
sound/soc/soc-topology.c
+4
-1
No files found.
sound/soc/codecs/wm8998.c
View file @
0bebd2f1
...
...
@@ -101,7 +101,7 @@ static int wm8998_asrc_ev(struct snd_soc_dapm_widget *w,
return
0
;
}
static
int
wm8998_in
1
mux_put
(
struct
snd_kcontrol
*
kcontrol
,
static
int
wm8998_inmux_put
(
struct
snd_kcontrol
*
kcontrol
,
struct
snd_ctl_elem_value
*
ucontrol
)
{
struct
snd_soc_codec
*
codec
=
snd_soc_dapm_kcontrol_codec
(
kcontrol
);
...
...
@@ -109,84 +109,38 @@ static int wm8998_in1mux_put(struct snd_kcontrol *kcontrol,
struct
wm8998_priv
*
wm8998
=
snd_soc_codec_get_drvdata
(
codec
);
struct
arizona
*
arizona
=
wm8998
->
core
.
arizona
;
struct
soc_enum
*
e
=
(
struct
soc_enum
*
)
kcontrol
->
private_value
;
unsigned
int
m
ux
,
inmode
;
unsigned
int
m
ode_val
,
src
_val
;
unsigned
int
m
ode_reg
,
mode_index
;
unsigned
int
m
ux
,
inmode
,
src_val
,
mode
_val
;
mux
=
ucontrol
->
value
.
enumerated
.
item
[
0
];
if
(
mux
>
1
)
return
-
EINVAL
;
/* L and R registers have same shift and mask */
inmode
=
arizona
->
pdata
.
inmode
[
2
*
mux
];
src_val
=
mux
<<
ARIZONA_IN1L_SRC_SHIFT
;
if
(
inmode
&
ARIZONA_INMODE_SE
)
src_val
|=
1
<<
ARIZONA_IN1L_SRC_SE_SHIFT
;
switch
(
arizona
->
pdata
.
inmode
[
0
])
{
case
ARIZONA_INMODE_DMIC
:
if
(
mux
)
mode_val
=
0
;
/* B always analogue */
else
mode_val
=
1
<<
ARIZONA_IN1_MODE_SHIFT
;
snd_soc_update_bits
(
codec
,
ARIZONA_IN1L_CONTROL
,
ARIZONA_IN1_MODE_MASK
,
mode_val
);
/* IN1A is digital so L and R must change together */
/* src_val setting same for both registers */
snd_soc_update_bits
(
codec
,
ARIZONA_ADC_DIGITAL_VOLUME_1L
,
ARIZONA_IN1L_SRC_MASK
|
ARIZONA_IN1L_SRC_SE_MASK
,
src_val
);
snd_soc_update_bits
(
codec
,
ARIZONA_ADC_DIGITAL_VOLUME_1R
,
ARIZONA_IN1R_SRC_MASK
|
ARIZONA_IN1R_SRC_SE_MASK
,
src_val
);
switch
(
e
->
reg
)
{
case
ARIZONA_ADC_DIGITAL_VOLUME_2L
:
mode_reg
=
ARIZONA_IN2L_CONTROL
;
mode_index
=
1
+
(
2
*
mux
);
break
;
default:
/* both analogue */
snd_soc_update_bits
(
codec
,
e
->
reg
,
ARIZONA_IN1L_SRC_MASK
|
ARIZONA_IN1L_SRC_SE_MASK
,
src_val
);
mode_reg
=
ARIZONA_IN1L_CONTROL
;
mode_index
=
(
2
*
mux
);
break
;
}
return
snd_soc_dapm_mux_update_power
(
dapm
,
kcontrol
,
ucontrol
->
value
.
enumerated
.
item
[
0
],
e
,
NULL
);
}
static
int
wm8998_in2mux_put
(
struct
snd_kcontrol
*
kcontrol
,
struct
snd_ctl_elem_value
*
ucontrol
)
{
struct
snd_soc_codec
*
codec
=
snd_soc_dapm_kcontrol_codec
(
kcontrol
);
struct
snd_soc_dapm_context
*
dapm
=
snd_soc_codec_get_dapm
(
codec
);
struct
wm8998_priv
*
wm8998
=
snd_soc_codec_get_drvdata
(
codec
);
struct
arizona
*
arizona
=
wm8998
->
core
.
arizona
;
struct
soc_enum
*
e
=
(
struct
soc_enum
*
)
kcontrol
->
private_value
;
unsigned
int
mux
,
inmode
,
src_val
,
mode_val
;
mux
=
ucontrol
->
value
.
enumerated
.
item
[
0
];
if
(
mux
>
1
)
return
-
EINVAL
;
inmode
=
arizona
->
pdata
.
inmode
[
1
+
(
2
*
mux
)];
inmode
=
arizona
->
pdata
.
inmode
[
mode_index
];
if
(
inmode
&
ARIZONA_INMODE_DMIC
)
mode_val
=
1
<<
ARIZONA_IN
2
_MODE_SHIFT
;
mode_val
=
1
<<
ARIZONA_IN
1
_MODE_SHIFT
;
else
mode_val
=
0
;
src_val
=
mux
<<
ARIZONA_IN
2
L_SRC_SHIFT
;
src_val
=
mux
<<
ARIZONA_IN
1
L_SRC_SHIFT
;
if
(
inmode
&
ARIZONA_INMODE_SE
)
src_val
|=
1
<<
ARIZONA_IN
2
L_SRC_SE_SHIFT
;
src_val
|=
1
<<
ARIZONA_IN
1
L_SRC_SE_SHIFT
;
snd_soc_update_bits
(
codec
,
ARIZONA_IN2L_CONTROL
,
ARIZONA_IN2_MODE_MASK
,
mode_val
);
snd_soc_update_bits
(
codec
,
mode_reg
,
ARIZONA_IN1_MODE_MASK
,
mode_val
);
snd_soc_update_bits
(
codec
,
ARIZONA_ADC_DIGITAL_VOLUME_2L
,
ARIZONA_IN
2L_SRC_MASK
|
ARIZONA_IN2
L_SRC_SE_MASK
,
snd_soc_update_bits
(
codec
,
e
->
reg
,
ARIZONA_IN
1L_SRC_MASK
|
ARIZONA_IN1
L_SRC_SE_MASK
,
src_val
);
return
snd_soc_dapm_mux_update_power
(
dapm
,
kcontrol
,
...
...
@@ -216,14 +170,14 @@ static SOC_ENUM_SINGLE_DECL(wm8998_in2mux_enum,
static
const
struct
snd_kcontrol_new
wm8998_in1mux
[
2
]
=
{
SOC_DAPM_ENUM_EXT
(
"IN1L Mux"
,
wm8998_in1muxl_enum
,
snd_soc_dapm_get_enum_double
,
wm8998_in
1
mux_put
),
snd_soc_dapm_get_enum_double
,
wm8998_inmux_put
),
SOC_DAPM_ENUM_EXT
(
"IN1R Mux"
,
wm8998_in1muxr_enum
,
snd_soc_dapm_get_enum_double
,
wm8998_in
1
mux_put
),
snd_soc_dapm_get_enum_double
,
wm8998_inmux_put
),
};
static
const
struct
snd_kcontrol_new
wm8998_in2mux
=
SOC_DAPM_ENUM_EXT
(
"IN2 Mux"
,
wm8998_in2mux_enum
,
snd_soc_dapm_get_enum_double
,
wm8998_in
2
mux_put
);
snd_soc_dapm_get_enum_double
,
wm8998_inmux_put
);
static
DECLARE_TLV_DB_SCALE
(
ana_tlv
,
0
,
100
,
0
);
static
DECLARE_TLV_DB_SCALE
(
eq_tlv
,
-
1200
,
100
,
0
);
...
...
sound/soc/soc-topology.c
View file @
0bebd2f1
...
...
@@ -1301,7 +1301,7 @@ static struct snd_kcontrol_new *soc_tplg_dapm_widget_denum_create(
/* validate kcontrol */
if
(
strnlen
(
ec
->
hdr
.
name
,
SNDRV_CTL_ELEM_ID_NAME_MAXLEN
)
==
SNDRV_CTL_ELEM_ID_NAME_MAXLEN
)
return
NULL
;
goto
err
;
se
=
kzalloc
(
sizeof
(
*
se
),
GFP_KERNEL
);
if
(
se
==
NULL
)
...
...
@@ -1378,6 +1378,9 @@ static struct snd_kcontrol_new *soc_tplg_dapm_widget_denum_create(
for
(;
i
>=
0
;
i
--
)
{
/* free values and texts */
se
=
(
struct
soc_enum
*
)
kc
[
i
].
private_value
;
if
(
!
se
)
continue
;
kfree
(
se
->
dobj
.
control
.
dvalues
);
for
(
j
=
0
;
j
<
ec
->
items
;
j
++
)
kfree
(
se
->
dobj
.
control
.
dtexts
[
j
]);
...
...
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