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
6234eabf
Commit
6234eabf
authored
Aug 22, 2013
by
Mark Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'asoc/topic/adsp' into asoc-next
parents
ece59528
92bb4c32
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
62 additions
and
83 deletions
+62
-83
include/sound/soc.h
include/sound/soc.h
+2
-0
sound/soc/codecs/wm_adsp.c
sound/soc/codecs/wm_adsp.c
+42
-82
sound/soc/codecs/wm_adsp.h
sound/soc/codecs/wm_adsp.h
+2
-1
sound/soc/soc-core.c
sound/soc/soc-core.c
+16
-0
No files found.
include/sound/soc.h
View file @
6234eabf
...
...
@@ -477,6 +477,8 @@ int snd_soc_set_ac97_ops_of_reset(struct snd_ac97_bus_ops *ops,
struct
snd_kcontrol
*
snd_soc_cnew
(
const
struct
snd_kcontrol_new
*
_template
,
void
*
data
,
const
char
*
long_name
,
const
char
*
prefix
);
struct
snd_kcontrol
*
snd_soc_card_get_kcontrol
(
struct
snd_soc_card
*
soc_card
,
const
char
*
name
);
int
snd_soc_add_codec_controls
(
struct
snd_soc_codec
*
codec
,
const
struct
snd_kcontrol_new
*
controls
,
int
num_controls
);
int
snd_soc_add_platform_controls
(
struct
snd_soc_platform
*
platform
,
...
...
sound/soc/codecs/wm_adsp.c
View file @
6234eabf
...
...
@@ -225,15 +225,8 @@ struct wm_coeff_ctl_ops {
struct
snd_ctl_elem_info
*
uinfo
);
};
struct
wm_coeff
{
struct
device
*
dev
;
struct
list_head
ctl_list
;
struct
regmap
*
regmap
;
};
struct
wm_coeff_ctl
{
const
char
*
name
;
struct
snd_card
*
card
;
struct
wm_adsp_alg_region
region
;
struct
wm_coeff_ctl_ops
ops
;
struct
wm_adsp
*
adsp
;
...
...
@@ -378,7 +371,6 @@ static int wm_coeff_info(struct snd_kcontrol *kcontrol,
static
int
wm_coeff_write_control
(
struct
snd_kcontrol
*
kcontrol
,
const
void
*
buf
,
size_t
len
)
{
struct
wm_coeff
*
wm_coeff
=
snd_kcontrol_chip
(
kcontrol
);
struct
wm_coeff_ctl
*
ctl
=
(
struct
wm_coeff_ctl
*
)
kcontrol
->
private_value
;
struct
wm_adsp_alg_region
*
region
=
&
ctl
->
region
;
const
struct
wm_adsp_region
*
mem
;
...
...
@@ -401,7 +393,7 @@ static int wm_coeff_write_control(struct snd_kcontrol *kcontrol,
if
(
!
scratch
)
return
-
ENOMEM
;
ret
=
regmap_raw_write
(
wm_coeff
->
regmap
,
reg
,
scratch
,
ret
=
regmap_raw_write
(
adsp
->
regmap
,
reg
,
scratch
,
ctl
->
len
);
if
(
ret
)
{
adsp_err
(
adsp
,
"Failed to write %zu bytes to %x
\n
"
,
...
...
@@ -434,7 +426,6 @@ static int wm_coeff_put(struct snd_kcontrol *kcontrol,
static
int
wm_coeff_read_control
(
struct
snd_kcontrol
*
kcontrol
,
void
*
buf
,
size_t
len
)
{
struct
wm_coeff
*
wm_coeff
=
snd_kcontrol_chip
(
kcontrol
);
struct
wm_coeff_ctl
*
ctl
=
(
struct
wm_coeff_ctl
*
)
kcontrol
->
private_value
;
struct
wm_adsp_alg_region
*
region
=
&
ctl
->
region
;
const
struct
wm_adsp_region
*
mem
;
...
...
@@ -457,7 +448,7 @@ static int wm_coeff_read_control(struct snd_kcontrol *kcontrol,
if
(
!
scratch
)
return
-
ENOMEM
;
ret
=
regmap_raw_read
(
wm_coeff
->
regmap
,
reg
,
scratch
,
ctl
->
len
);
ret
=
regmap_raw_read
(
adsp
->
regmap
,
reg
,
scratch
,
ctl
->
len
);
if
(
ret
)
{
adsp_err
(
adsp
,
"Failed to read %zu bytes from %x
\n
"
,
ctl
->
len
,
reg
);
...
...
@@ -481,37 +472,18 @@ static int wm_coeff_get(struct snd_kcontrol *kcontrol,
return
0
;
}
static
int
wm_coeff_add_kcontrol
(
struct
wm_coeff
*
wm_coeff
,
struct
wm_coeff_ctl
*
ctl
,
const
struct
snd_kcontrol_new
*
kctl
)
{
int
ret
;
struct
snd_kcontrol
*
kcontrol
;
kcontrol
=
snd_ctl_new1
(
kctl
,
wm_coeff
);
ret
=
snd_ctl_add
(
ctl
->
card
,
kcontrol
);
if
(
ret
<
0
)
{
dev_err
(
wm_coeff
->
dev
,
"Failed to add %s: %d
\n
"
,
kctl
->
name
,
ret
);
return
ret
;
}
ctl
->
kcontrol
=
kcontrol
;
return
0
;
}
struct
wmfw_ctl_work
{
struct
wm_
coeff
*
wm_coeff
;
struct
wm_
adsp
*
adsp
;
struct
wm_coeff_ctl
*
ctl
;
struct
work_struct
work
;
};
static
int
wmfw_add_ctl
(
struct
wm_coeff
*
wm_coeff
,
struct
wm_coeff_ctl
*
ctl
)
static
int
wmfw_add_ctl
(
struct
wm_adsp
*
adsp
,
struct
wm_coeff_ctl
*
ctl
)
{
struct
snd_kcontrol_new
*
kcontrol
;
int
ret
;
if
(
!
wm_coeff
||
!
ctl
||
!
ctl
->
name
||
!
ctl
->
card
)
if
(
!
ctl
||
!
ctl
->
name
)
return
-
EINVAL
;
kcontrol
=
kzalloc
(
sizeof
(
*
kcontrol
),
GFP_KERNEL
);
...
...
@@ -525,14 +497,17 @@ static int wmfw_add_ctl(struct wm_coeff *wm_coeff,
kcontrol
->
put
=
wm_coeff_put
;
kcontrol
->
private_value
=
(
unsigned
long
)
ctl
;
ret
=
wm_coeff_add_kcontrol
(
wm_coeff
,
ctl
,
kcontrol
);
ret
=
snd_soc_add_card_controls
(
adsp
->
card
,
kcontrol
,
1
);
if
(
ret
<
0
)
goto
err_kcontrol
;
kfree
(
kcontrol
);
list_add
(
&
ctl
->
list
,
&
wm_coeff
->
ctl_list
);
ctl
->
kcontrol
=
snd_soc_card_get_kcontrol
(
adsp
->
card
,
ctl
->
name
);
list_add
(
&
ctl
->
list
,
&
adsp
->
ctl_list
);
return
0
;
err_kcontrol:
...
...
@@ -753,13 +728,12 @@ static int wm_adsp_load(struct wm_adsp *dsp)
return
ret
;
}
static
int
wm_coeff_init_control_caches
(
struct
wm_
coeff
*
wm_coeff
)
static
int
wm_coeff_init_control_caches
(
struct
wm_
adsp
*
adsp
)
{
struct
wm_coeff_ctl
*
ctl
;
int
ret
;
list_for_each_entry
(
ctl
,
&
wm_coeff
->
ctl_list
,
list
)
{
list_for_each_entry
(
ctl
,
&
adsp
->
ctl_list
,
list
)
{
if
(
!
ctl
->
enabled
||
ctl
->
set
)
continue
;
ret
=
wm_coeff_read_control
(
ctl
->
kcontrol
,
...
...
@@ -772,13 +746,12 @@ static int wm_coeff_init_control_caches(struct wm_coeff *wm_coeff)
return
0
;
}
static
int
wm_coeff_sync_controls
(
struct
wm_
coeff
*
wm_coeff
)
static
int
wm_coeff_sync_controls
(
struct
wm_
adsp
*
adsp
)
{
struct
wm_coeff_ctl
*
ctl
;
int
ret
;
list_for_each_entry
(
ctl
,
&
wm_coeff
->
ctl_list
,
list
)
{
list_for_each_entry
(
ctl
,
&
adsp
->
ctl_list
,
list
)
{
if
(
!
ctl
->
enabled
)
continue
;
if
(
ctl
->
set
)
{
...
...
@@ -799,15 +772,14 @@ static void wm_adsp_ctl_work(struct work_struct *work)
struct
wmfw_ctl_work
,
work
);
wmfw_add_ctl
(
ctl_work
->
wm_coeff
,
ctl_work
->
ctl
);
wmfw_add_ctl
(
ctl_work
->
adsp
,
ctl_work
->
ctl
);
kfree
(
ctl_work
);
}
static
int
wm_adsp_create_control
(
struct
snd_soc_codec
*
codec
,
static
int
wm_adsp_create_control
(
struct
wm_adsp
*
dsp
,
const
struct
wm_adsp_alg_region
*
region
)
{
struct
wm_adsp
*
dsp
=
snd_soc_codec_get_drvdata
(
codec
);
struct
wm_coeff_ctl
*
ctl
;
struct
wmfw_ctl_work
*
ctl_work
;
char
*
name
;
...
...
@@ -842,7 +814,7 @@ static int wm_adsp_create_control(struct snd_soc_codec *codec,
snprintf
(
name
,
PAGE_SIZE
,
"DSP%d %s %x"
,
dsp
->
num
,
region_name
,
region
->
alg
);
list_for_each_entry
(
ctl
,
&
dsp
->
wm_coeff
->
ctl_list
,
list_for_each_entry
(
ctl
,
&
dsp
->
ctl_list
,
list
)
{
if
(
!
strcmp
(
ctl
->
name
,
name
))
{
if
(
!
ctl
->
enabled
)
...
...
@@ -866,7 +838,6 @@ static int wm_adsp_create_control(struct snd_soc_codec *codec,
ctl
->
set
=
0
;
ctl
->
ops
.
xget
=
wm_coeff_get
;
ctl
->
ops
.
xput
=
wm_coeff_put
;
ctl
->
card
=
codec
->
card
->
snd_card
;
ctl
->
adsp
=
dsp
;
ctl
->
len
=
region
->
len
;
...
...
@@ -882,7 +853,7 @@ static int wm_adsp_create_control(struct snd_soc_codec *codec,
goto
err_ctl_cache
;
}
ctl_work
->
wm_coeff
=
dsp
->
wm_coeff
;
ctl_work
->
adsp
=
dsp
;
ctl_work
->
ctl
=
ctl
;
INIT_WORK
(
&
ctl_work
->
work
,
wm_adsp_ctl_work
);
schedule_work
(
&
ctl_work
->
work
);
...
...
@@ -903,7 +874,7 @@ static int wm_adsp_create_control(struct snd_soc_codec *codec,
return
ret
;
}
static
int
wm_adsp_setup_algs
(
struct
wm_adsp
*
dsp
,
struct
snd_soc_codec
*
codec
)
static
int
wm_adsp_setup_algs
(
struct
wm_adsp
*
dsp
)
{
struct
regmap
*
regmap
=
dsp
->
regmap
;
struct
wmfw_adsp1_id_hdr
adsp1_id
;
...
...
@@ -1091,7 +1062,7 @@ static int wm_adsp_setup_algs(struct wm_adsp *dsp, struct snd_soc_codec *codec)
if
(
i
+
1
<
algs
)
{
region
->
len
=
be32_to_cpu
(
adsp1_alg
[
i
+
1
].
dm
);
region
->
len
-=
be32_to_cpu
(
adsp1_alg
[
i
].
dm
);
wm_adsp_create_control
(
codec
,
region
);
wm_adsp_create_control
(
dsp
,
region
);
}
else
{
adsp_warn
(
dsp
,
"Missing length info for region DM with ID %x
\n
"
,
be32_to_cpu
(
adsp1_alg
[
i
].
alg
.
id
));
...
...
@@ -1108,7 +1079,7 @@ static int wm_adsp_setup_algs(struct wm_adsp *dsp, struct snd_soc_codec *codec)
if
(
i
+
1
<
algs
)
{
region
->
len
=
be32_to_cpu
(
adsp1_alg
[
i
+
1
].
zm
);
region
->
len
-=
be32_to_cpu
(
adsp1_alg
[
i
].
zm
);
wm_adsp_create_control
(
codec
,
region
);
wm_adsp_create_control
(
dsp
,
region
);
}
else
{
adsp_warn
(
dsp
,
"Missing length info for region ZM with ID %x
\n
"
,
be32_to_cpu
(
adsp1_alg
[
i
].
alg
.
id
));
...
...
@@ -1137,7 +1108,7 @@ static int wm_adsp_setup_algs(struct wm_adsp *dsp, struct snd_soc_codec *codec)
if
(
i
+
1
<
algs
)
{
region
->
len
=
be32_to_cpu
(
adsp2_alg
[
i
+
1
].
xm
);
region
->
len
-=
be32_to_cpu
(
adsp2_alg
[
i
].
xm
);
wm_adsp_create_control
(
codec
,
region
);
wm_adsp_create_control
(
dsp
,
region
);
}
else
{
adsp_warn
(
dsp
,
"Missing length info for region XM with ID %x
\n
"
,
be32_to_cpu
(
adsp2_alg
[
i
].
alg
.
id
));
...
...
@@ -1154,7 +1125,7 @@ static int wm_adsp_setup_algs(struct wm_adsp *dsp, struct snd_soc_codec *codec)
if
(
i
+
1
<
algs
)
{
region
->
len
=
be32_to_cpu
(
adsp2_alg
[
i
+
1
].
ym
);
region
->
len
-=
be32_to_cpu
(
adsp2_alg
[
i
].
ym
);
wm_adsp_create_control
(
codec
,
region
);
wm_adsp_create_control
(
dsp
,
region
);
}
else
{
adsp_warn
(
dsp
,
"Missing length info for region YM with ID %x
\n
"
,
be32_to_cpu
(
adsp2_alg
[
i
].
alg
.
id
));
...
...
@@ -1171,7 +1142,7 @@ static int wm_adsp_setup_algs(struct wm_adsp *dsp, struct snd_soc_codec *codec)
if
(
i
+
1
<
algs
)
{
region
->
len
=
be32_to_cpu
(
adsp2_alg
[
i
+
1
].
zm
);
region
->
len
-=
be32_to_cpu
(
adsp2_alg
[
i
].
zm
);
wm_adsp_create_control
(
codec
,
region
);
wm_adsp_create_control
(
dsp
,
region
);
}
else
{
adsp_warn
(
dsp
,
"Missing length info for region ZM with ID %x
\n
"
,
be32_to_cpu
(
adsp2_alg
[
i
].
alg
.
id
));
...
...
@@ -1391,6 +1362,8 @@ int wm_adsp1_event(struct snd_soc_dapm_widget *w,
int
ret
;
int
val
;
dsp
->
card
=
codec
->
card
;
switch
(
event
)
{
case
SND_SOC_DAPM_POST_PMU
:
regmap_update_bits
(
dsp
->
regmap
,
dsp
->
base
+
ADSP1_CONTROL_30
,
...
...
@@ -1425,7 +1398,7 @@ int wm_adsp1_event(struct snd_soc_dapm_widget *w,
if
(
ret
!=
0
)
goto
err
;
ret
=
wm_adsp_setup_algs
(
dsp
,
codec
);
ret
=
wm_adsp_setup_algs
(
dsp
);
if
(
ret
!=
0
)
goto
err
;
...
...
@@ -1434,12 +1407,12 @@ int wm_adsp1_event(struct snd_soc_dapm_widget *w,
goto
err
;
/* Initialize caches for enabled and unset controls */
ret
=
wm_coeff_init_control_caches
(
dsp
->
wm_coeff
);
ret
=
wm_coeff_init_control_caches
(
dsp
);
if
(
ret
!=
0
)
goto
err
;
/* Sync set controls */
ret
=
wm_coeff_sync_controls
(
dsp
->
wm_coeff
);
ret
=
wm_coeff_sync_controls
(
dsp
);
if
(
ret
!=
0
)
goto
err
;
...
...
@@ -1460,10 +1433,8 @@ int wm_adsp1_event(struct snd_soc_dapm_widget *w,
regmap_update_bits
(
dsp
->
regmap
,
dsp
->
base
+
ADSP1_CONTROL_30
,
ADSP1_SYS_ENA
,
0
);
list_for_each_entry
(
ctl
,
&
dsp
->
wm_coeff
->
ctl_list
,
list
)
{
list_for_each_entry
(
ctl
,
&
dsp
->
ctl_list
,
list
)
ctl
->
enabled
=
0
;
}
break
;
default:
...
...
@@ -1520,6 +1491,8 @@ int wm_adsp2_event(struct snd_soc_dapm_widget *w,
unsigned
int
val
;
int
ret
;
dsp
->
card
=
codec
->
card
;
switch
(
event
)
{
case
SND_SOC_DAPM_POST_PMU
:
/*
...
...
@@ -1582,7 +1555,7 @@ int wm_adsp2_event(struct snd_soc_dapm_widget *w,
if
(
ret
!=
0
)
goto
err
;
ret
=
wm_adsp_setup_algs
(
dsp
,
codec
);
ret
=
wm_adsp_setup_algs
(
dsp
);
if
(
ret
!=
0
)
goto
err
;
...
...
@@ -1591,12 +1564,12 @@ int wm_adsp2_event(struct snd_soc_dapm_widget *w,
goto
err
;
/* Initialize caches for enabled and unset controls */
ret
=
wm_coeff_init_control_caches
(
dsp
->
wm_coeff
);
ret
=
wm_coeff_init_control_caches
(
dsp
);
if
(
ret
!=
0
)
goto
err
;
/* Sync set controls */
ret
=
wm_coeff_sync_controls
(
dsp
->
wm_coeff
);
ret
=
wm_coeff_sync_controls
(
dsp
);
if
(
ret
!=
0
)
goto
err
;
...
...
@@ -1637,10 +1610,8 @@ int wm_adsp2_event(struct snd_soc_dapm_widget *w,
ret
);
}
list_for_each_entry
(
ctl
,
&
dsp
->
wm_coeff
->
ctl_list
,
list
)
{
list_for_each_entry
(
ctl
,
&
dsp
->
ctl_list
,
list
)
ctl
->
enabled
=
0
;
}
while
(
!
list_empty
(
&
dsp
->
alg_regions
))
{
alg_region
=
list_first_entry
(
&
dsp
->
alg_regions
,
...
...
@@ -1679,49 +1650,38 @@ int wm_adsp2_init(struct wm_adsp *adsp, bool dvfs)
}
INIT_LIST_HEAD
(
&
adsp
->
alg_regions
);
adsp
->
wm_coeff
=
kzalloc
(
sizeof
(
*
adsp
->
wm_coeff
),
GFP_KERNEL
);
if
(
!
adsp
->
wm_coeff
)
return
-
ENOMEM
;
adsp
->
wm_coeff
->
regmap
=
adsp
->
regmap
;
adsp
->
wm_coeff
->
dev
=
adsp
->
dev
;
INIT_LIST_HEAD
(
&
adsp
->
wm_coeff
->
ctl_list
);
INIT_LIST_HEAD
(
&
adsp
->
ctl_list
);
if
(
dvfs
)
{
adsp
->
dvfs
=
devm_regulator_get
(
adsp
->
dev
,
"DCVDD"
);
if
(
IS_ERR
(
adsp
->
dvfs
))
{
ret
=
PTR_ERR
(
adsp
->
dvfs
);
dev_err
(
adsp
->
dev
,
"Failed to get DCVDD: %d
\n
"
,
ret
);
goto
out_coeff
;
return
ret
;
}
ret
=
regulator_enable
(
adsp
->
dvfs
);
if
(
ret
!=
0
)
{
dev_err
(
adsp
->
dev
,
"Failed to enable DCVDD: %d
\n
"
,
ret
);
goto
out_coeff
;
return
ret
;
}
ret
=
regulator_set_voltage
(
adsp
->
dvfs
,
1200000
,
1800000
);
if
(
ret
!=
0
)
{
dev_err
(
adsp
->
dev
,
"Failed to initialise DVFS: %d
\n
"
,
ret
);
goto
out_coeff
;
return
ret
;
}
ret
=
regulator_disable
(
adsp
->
dvfs
);
if
(
ret
!=
0
)
{
dev_err
(
adsp
->
dev
,
"Failed to disable DCVDD: %d
\n
"
,
ret
);
goto
out_coeff
;
return
ret
;
}
}
return
0
;
out_coeff:
kfree
(
adsp
->
wm_coeff
);
return
ret
;
}
EXPORT_SYMBOL_GPL
(
wm_adsp2_init
);
sound/soc/codecs/wm_adsp.h
View file @
6234eabf
...
...
@@ -39,6 +39,7 @@ struct wm_adsp {
int
type
;
struct
device
*
dev
;
struct
regmap
*
regmap
;
struct
snd_soc_card
*
card
;
int
base
;
int
sysclk_reg
;
...
...
@@ -57,7 +58,7 @@ struct wm_adsp {
struct
regulator
*
dvfs
;
struct
wm_coeff
*
wm_coeff
;
struct
list_head
ctl_list
;
};
#define WM_ADSP1(wname, num) \
...
...
sound/soc/soc-core.c
View file @
6234eabf
...
...
@@ -2452,6 +2452,22 @@ static int snd_soc_add_controls(struct snd_card *card, struct device *dev,
return
0
;
}
struct
snd_kcontrol
*
snd_soc_card_get_kcontrol
(
struct
snd_soc_card
*
soc_card
,
const
char
*
name
)
{
struct
snd_card
*
card
=
soc_card
->
snd_card
;
struct
snd_kcontrol
*
kctl
;
if
(
unlikely
(
!
name
))
return
NULL
;
list_for_each_entry
(
kctl
,
&
card
->
controls
,
list
)
if
(
!
strncmp
(
kctl
->
id
.
name
,
name
,
sizeof
(
kctl
->
id
.
name
)))
return
kctl
;
return
NULL
;
}
EXPORT_SYMBOL_GPL
(
snd_soc_card_get_kcontrol
);
/**
* snd_soc_add_codec_controls - add an array of controls to a codec.
* Convenience function to add a list of controls. Many codecs were
...
...
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