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
95baa281
Commit
95baa281
authored
Jun 22, 2015
by
Mark Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branches 'asoc/topic/adsp' and 'asoc/topic/atmel' into asoc-next
parents
f79a9db8
f9f55e31
061981ff
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
275 additions
and
38 deletions
+275
-38
sound/soc/atmel/Kconfig
sound/soc/atmel/Kconfig
+17
-8
sound/soc/atmel/Makefile
sound/soc/atmel/Makefile
+5
-3
sound/soc/codecs/wm5102.c
sound/soc/codecs/wm5102.c
+4
-2
sound/soc/codecs/wm5110.c
sound/soc/codecs/wm5110.c
+10
-4
sound/soc/codecs/wm_adsp.c
sound/soc/codecs/wm_adsp.c
+227
-19
sound/soc/codecs/wm_adsp.h
sound/soc/codecs/wm_adsp.h
+12
-2
No files found.
sound/soc/atmel/Kconfig
View file @
95baa281
...
@@ -9,21 +9,32 @@ config SND_ATMEL_SOC
...
@@ -9,21 +9,32 @@ config SND_ATMEL_SOC
if SND_ATMEL_SOC
if SND_ATMEL_SOC
config SND_ATMEL_SOC_PDC
config SND_ATMEL_SOC_PDC
bool
tristate
default m if SND_ATMEL_SOC_SSC_PDC=m && SND_ATMEL_SOC_SSC=m
default y if SND_ATMEL_SOC_SSC_PDC=y || (SND_ATMEL_SOC_SSC_PDC=m && SND_ATMEL_SOC_SSC=y)
config SND_ATMEL_SOC_SSC_PDC
tristate
config SND_ATMEL_SOC_DMA
config SND_ATMEL_SOC_DMA
bool
tristate
select SND_SOC_GENERIC_DMAENGINE_PCM
select SND_SOC_GENERIC_DMAENGINE_PCM
default m if SND_ATMEL_SOC_SSC_DMA=m && SND_ATMEL_SOC_SSC=m
default y if SND_ATMEL_SOC_SSC_DMA=y || (SND_ATMEL_SOC_SSC_DMA=m && SND_ATMEL_SOC_SSC=y)
config SND_ATMEL_SOC_SSC_DMA
tristate
config SND_ATMEL_SOC_SSC
config SND_ATMEL_SOC_SSC
tristate
tristate
default y if SND_ATMEL_SOC_SSC_DMA=y || SND_ATMEL_SOC_SSC_PDC=y
default m if SND_ATMEL_SOC_SSC_DMA=m || SND_ATMEL_SOC_SSC_PDC=m
config SND_AT91_SOC_SAM9G20_WM8731
config SND_AT91_SOC_SAM9G20_WM8731
tristate "SoC Audio support for WM8731-based At91sam9g20 evaluation board"
tristate "SoC Audio support for WM8731-based At91sam9g20 evaluation board"
depends on ARCH_AT91 || COMPILE_TEST
depends on ARCH_AT91 || COMPILE_TEST
depends on ATMEL_SSC && SND_SOC_I2C_AND_SPI
depends on ATMEL_SSC && SND_SOC_I2C_AND_SPI
select SND_ATMEL_SOC_PDC
select SND_ATMEL_SOC_SSC_PDC
select SND_ATMEL_SOC_SSC
select SND_SOC_WM8731
select SND_SOC_WM8731
help
help
Say Y if you want to add support for SoC audio on WM8731-based
Say Y if you want to add support for SoC audio on WM8731-based
...
@@ -33,8 +44,7 @@ config SND_ATMEL_SOC_WM8904
...
@@ -33,8 +44,7 @@ config SND_ATMEL_SOC_WM8904
tristate "Atmel ASoC driver for boards using WM8904 codec"
tristate "Atmel ASoC driver for boards using WM8904 codec"
depends on ARCH_AT91 || COMPILE_TEST
depends on ARCH_AT91 || COMPILE_TEST
depends on ATMEL_SSC && I2C
depends on ATMEL_SSC && I2C
select SND_ATMEL_SOC_SSC
select SND_ATMEL_SOC_SSC_DMA
select SND_ATMEL_SOC_DMA
select SND_SOC_WM8904
select SND_SOC_WM8904
help
help
Say Y if you want to add support for Atmel ASoC driver for boards using
Say Y if you want to add support for Atmel ASoC driver for boards using
...
@@ -44,8 +54,7 @@ config SND_AT91_SOC_SAM9X5_WM8731
...
@@ -44,8 +54,7 @@ config SND_AT91_SOC_SAM9X5_WM8731
tristate "SoC Audio support for WM8731-based at91sam9x5 board"
tristate "SoC Audio support for WM8731-based at91sam9x5 board"
depends on ARCH_AT91 || COMPILE_TEST
depends on ARCH_AT91 || COMPILE_TEST
depends on ATMEL_SSC && SND_SOC_I2C_AND_SPI
depends on ATMEL_SSC && SND_SOC_I2C_AND_SPI
select SND_ATMEL_SOC_SSC
select SND_ATMEL_SOC_SSC_DMA
select SND_ATMEL_SOC_DMA
select SND_SOC_WM8731
select SND_SOC_WM8731
help
help
Say Y if you want to add support for audio SoC on an
Say Y if you want to add support for audio SoC on an
...
...
sound/soc/atmel/Makefile
View file @
95baa281
# AT91 Platform Support
# AT91 Platform Support
snd-soc-atmel-pcm-
$(CONFIG_SND_ATMEL_SOC_PDC)
:=
atmel-pcm-pdc.o
snd-soc-atmel-pcm-
pdc-objs
:=
atmel-pcm-pdc.o
snd-soc-atmel-pcm-
$(CONFIG_SND_ATMEL_SOC_DMA)
+
=
atmel-pcm-dma.o
snd-soc-atmel-pcm-
dma-objs
:
=
atmel-pcm-dma.o
snd-soc-atmel_ssc_dai-objs
:=
atmel_ssc_dai.o
$
(
snd-soc-atmel-pcm-y
)
snd-soc-atmel_ssc_dai-objs
:=
atmel_ssc_dai.o
obj-$(CONFIG_SND_ATMEL_SOC_PDC)
+=
snd-soc-atmel-pcm-pdc.o
obj-$(CONFIG_SND_ATMEL_SOC_DMA)
+=
snd-soc-atmel-pcm-dma.o
obj-$(CONFIG_SND_ATMEL_SOC_SSC)
+=
snd-soc-atmel_ssc_dai.o
obj-$(CONFIG_SND_ATMEL_SOC_SSC)
+=
snd-soc-atmel_ssc_dai.o
# AT91 Machine Support
# AT91 Machine Support
...
...
sound/soc/codecs/wm5102.c
View file @
95baa281
...
@@ -1876,8 +1876,8 @@ static int wm5102_codec_probe(struct snd_soc_codec *codec)
...
@@ -1876,8 +1876,8 @@ static int wm5102_codec_probe(struct snd_soc_codec *codec)
struct
wm5102_priv
*
priv
=
snd_soc_codec_get_drvdata
(
codec
);
struct
wm5102_priv
*
priv
=
snd_soc_codec_get_drvdata
(
codec
);
int
ret
;
int
ret
;
ret
=
snd_soc_add_codec_controls
(
codec
,
wm_adsp2_fw_controls
,
2
);
ret
=
wm_adsp2_codec_probe
(
&
priv
->
core
.
adsp
[
0
],
codec
);
if
(
ret
!=
0
)
if
(
ret
)
return
ret
;
return
ret
;
arizona_init_spk
(
codec
);
arizona_init_spk
(
codec
);
...
@@ -1894,6 +1894,8 @@ static int wm5102_codec_remove(struct snd_soc_codec *codec)
...
@@ -1894,6 +1894,8 @@ static int wm5102_codec_remove(struct snd_soc_codec *codec)
{
{
struct
wm5102_priv
*
priv
=
snd_soc_codec_get_drvdata
(
codec
);
struct
wm5102_priv
*
priv
=
snd_soc_codec_get_drvdata
(
codec
);
wm_adsp2_codec_remove
(
&
priv
->
core
.
adsp
[
0
],
codec
);
priv
->
core
.
arizona
->
dapm
=
NULL
;
priv
->
core
.
arizona
->
dapm
=
NULL
;
return
0
;
return
0
;
...
...
sound/soc/codecs/wm5110.c
View file @
95baa281
...
@@ -1600,7 +1600,7 @@ static int wm5110_codec_probe(struct snd_soc_codec *codec)
...
@@ -1600,7 +1600,7 @@ static int wm5110_codec_probe(struct snd_soc_codec *codec)
{
{
struct
snd_soc_dapm_context
*
dapm
=
snd_soc_codec_get_dapm
(
codec
);
struct
snd_soc_dapm_context
*
dapm
=
snd_soc_codec_get_dapm
(
codec
);
struct
wm5110_priv
*
priv
=
snd_soc_codec_get_drvdata
(
codec
);
struct
wm5110_priv
*
priv
=
snd_soc_codec_get_drvdata
(
codec
);
int
ret
;
int
i
,
ret
;
priv
->
core
.
arizona
->
dapm
=
dapm
;
priv
->
core
.
arizona
->
dapm
=
dapm
;
...
@@ -1608,9 +1608,11 @@ static int wm5110_codec_probe(struct snd_soc_codec *codec)
...
@@ -1608,9 +1608,11 @@ static int wm5110_codec_probe(struct snd_soc_codec *codec)
arizona_init_gpio
(
codec
);
arizona_init_gpio
(
codec
);
arizona_init_mono
(
codec
);
arizona_init_mono
(
codec
);
ret
=
snd_soc_add_codec_controls
(
codec
,
wm_adsp2_fw_controls
,
8
);
for
(
i
=
0
;
i
<
WM5110_NUM_ADSP
;
++
i
)
{
if
(
ret
!=
0
)
ret
=
wm_adsp2_codec_probe
(
&
priv
->
core
.
adsp
[
i
],
codec
);
return
ret
;
if
(
ret
)
return
ret
;
}
snd_soc_dapm_disable_pin
(
dapm
,
"HAPTICS"
);
snd_soc_dapm_disable_pin
(
dapm
,
"HAPTICS"
);
...
@@ -1620,6 +1622,10 @@ static int wm5110_codec_probe(struct snd_soc_codec *codec)
...
@@ -1620,6 +1622,10 @@ static int wm5110_codec_probe(struct snd_soc_codec *codec)
static
int
wm5110_codec_remove
(
struct
snd_soc_codec
*
codec
)
static
int
wm5110_codec_remove
(
struct
snd_soc_codec
*
codec
)
{
{
struct
wm5110_priv
*
priv
=
snd_soc_codec_get_drvdata
(
codec
);
struct
wm5110_priv
*
priv
=
snd_soc_codec_get_drvdata
(
codec
);
int
i
;
for
(
i
=
0
;
i
<
WM5110_NUM_ADSP
;
++
i
)
wm_adsp2_codec_remove
(
&
priv
->
core
.
adsp
[
i
],
codec
);
priv
->
core
.
arizona
->
dapm
=
NULL
;
priv
->
core
.
arizona
->
dapm
=
NULL
;
...
...
sound/soc/codecs/wm_adsp.c
View file @
95baa281
...
@@ -23,6 +23,7 @@
...
@@ -23,6 +23,7 @@
#include <linux/slab.h>
#include <linux/slab.h>
#include <linux/vmalloc.h>
#include <linux/vmalloc.h>
#include <linux/workqueue.h>
#include <linux/workqueue.h>
#include <linux/debugfs.h>
#include <sound/core.h>
#include <sound/core.h>
#include <sound/pcm.h>
#include <sound/pcm.h>
#include <sound/pcm_params.h>
#include <sound/pcm_params.h>
...
@@ -248,6 +249,175 @@ struct wm_coeff_ctl {
...
@@ -248,6 +249,175 @@ struct wm_coeff_ctl {
unsigned
int
flags
;
unsigned
int
flags
;
};
};
#ifdef CONFIG_DEBUG_FS
static
void
wm_adsp_debugfs_save_wmfwname
(
struct
wm_adsp
*
dsp
,
const
char
*
s
)
{
char
*
tmp
=
kasprintf
(
GFP_KERNEL
,
"%s
\n
"
,
s
);
mutex_lock
(
&
dsp
->
debugfs_lock
);
kfree
(
dsp
->
wmfw_file_name
);
dsp
->
wmfw_file_name
=
tmp
;
mutex_unlock
(
&
dsp
->
debugfs_lock
);
}
static
void
wm_adsp_debugfs_save_binname
(
struct
wm_adsp
*
dsp
,
const
char
*
s
)
{
char
*
tmp
=
kasprintf
(
GFP_KERNEL
,
"%s
\n
"
,
s
);
mutex_lock
(
&
dsp
->
debugfs_lock
);
kfree
(
dsp
->
bin_file_name
);
dsp
->
bin_file_name
=
tmp
;
mutex_unlock
(
&
dsp
->
debugfs_lock
);
}
static
void
wm_adsp_debugfs_clear
(
struct
wm_adsp
*
dsp
)
{
mutex_lock
(
&
dsp
->
debugfs_lock
);
kfree
(
dsp
->
wmfw_file_name
);
kfree
(
dsp
->
bin_file_name
);
dsp
->
wmfw_file_name
=
NULL
;
dsp
->
bin_file_name
=
NULL
;
mutex_unlock
(
&
dsp
->
debugfs_lock
);
}
static
ssize_t
wm_adsp_debugfs_wmfw_read
(
struct
file
*
file
,
char
__user
*
user_buf
,
size_t
count
,
loff_t
*
ppos
)
{
struct
wm_adsp
*
dsp
=
file
->
private_data
;
ssize_t
ret
;
mutex_lock
(
&
dsp
->
debugfs_lock
);
if
(
!
dsp
->
wmfw_file_name
||
!
dsp
->
running
)
ret
=
0
;
else
ret
=
simple_read_from_buffer
(
user_buf
,
count
,
ppos
,
dsp
->
wmfw_file_name
,
strlen
(
dsp
->
wmfw_file_name
));
mutex_unlock
(
&
dsp
->
debugfs_lock
);
return
ret
;
}
static
ssize_t
wm_adsp_debugfs_bin_read
(
struct
file
*
file
,
char
__user
*
user_buf
,
size_t
count
,
loff_t
*
ppos
)
{
struct
wm_adsp
*
dsp
=
file
->
private_data
;
ssize_t
ret
;
mutex_lock
(
&
dsp
->
debugfs_lock
);
if
(
!
dsp
->
bin_file_name
||
!
dsp
->
running
)
ret
=
0
;
else
ret
=
simple_read_from_buffer
(
user_buf
,
count
,
ppos
,
dsp
->
bin_file_name
,
strlen
(
dsp
->
bin_file_name
));
mutex_unlock
(
&
dsp
->
debugfs_lock
);
return
ret
;
}
static
const
struct
{
const
char
*
name
;
const
struct
file_operations
fops
;
}
wm_adsp_debugfs_fops
[]
=
{
{
.
name
=
"wmfw_file_name"
,
.
fops
=
{
.
open
=
simple_open
,
.
read
=
wm_adsp_debugfs_wmfw_read
,
},
},
{
.
name
=
"bin_file_name"
,
.
fops
=
{
.
open
=
simple_open
,
.
read
=
wm_adsp_debugfs_bin_read
,
},
},
};
static
void
wm_adsp2_init_debugfs
(
struct
wm_adsp
*
dsp
,
struct
snd_soc_codec
*
codec
)
{
struct
dentry
*
root
=
NULL
;
char
*
root_name
;
int
i
;
if
(
!
codec
->
component
.
debugfs_root
)
{
adsp_err
(
dsp
,
"No codec debugfs root
\n
"
);
goto
err
;
}
root_name
=
kmalloc
(
PAGE_SIZE
,
GFP_KERNEL
);
if
(
!
root_name
)
goto
err
;
snprintf
(
root_name
,
PAGE_SIZE
,
"dsp%d"
,
dsp
->
num
);
root
=
debugfs_create_dir
(
root_name
,
codec
->
component
.
debugfs_root
);
kfree
(
root_name
);
if
(
!
root
)
goto
err
;
if
(
!
debugfs_create_bool
(
"running"
,
S_IRUGO
,
root
,
&
dsp
->
running
))
goto
err
;
if
(
!
debugfs_create_x32
(
"fw_id"
,
S_IRUGO
,
root
,
&
dsp
->
fw_id
))
goto
err
;
if
(
!
debugfs_create_x32
(
"fw_version"
,
S_IRUGO
,
root
,
&
dsp
->
fw_id_version
))
goto
err
;
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
wm_adsp_debugfs_fops
);
++
i
)
{
if
(
!
debugfs_create_file
(
wm_adsp_debugfs_fops
[
i
].
name
,
S_IRUGO
,
root
,
dsp
,
&
wm_adsp_debugfs_fops
[
i
].
fops
))
goto
err
;
}
dsp
->
debugfs_root
=
root
;
return
;
err:
debugfs_remove_recursive
(
root
);
adsp_err
(
dsp
,
"Failed to create debugfs
\n
"
);
}
static
void
wm_adsp2_cleanup_debugfs
(
struct
wm_adsp
*
dsp
)
{
wm_adsp_debugfs_clear
(
dsp
);
debugfs_remove_recursive
(
dsp
->
debugfs_root
);
}
#else
static
inline
void
wm_adsp2_init_debugfs
(
struct
wm_adsp
*
dsp
,
struct
snd_soc_codec
*
codec
)
{
}
static
inline
void
wm_adsp2_cleanup_debugfs
(
struct
wm_adsp
*
dsp
)
{
}
static
inline
void
wm_adsp_debugfs_save_wmfwname
(
struct
wm_adsp
*
dsp
,
const
char
*
s
)
{
}
static
inline
void
wm_adsp_debugfs_save_binname
(
struct
wm_adsp
*
dsp
,
const
char
*
s
)
{
}
static
inline
void
wm_adsp_debugfs_clear
(
struct
wm_adsp
*
dsp
)
{
}
#endif
static
int
wm_adsp_fw_get
(
struct
snd_kcontrol
*
kcontrol
,
static
int
wm_adsp_fw_get
(
struct
snd_kcontrol
*
kcontrol
,
struct
snd_ctl_elem_value
*
ucontrol
)
struct
snd_ctl_elem_value
*
ucontrol
)
{
{
...
@@ -298,7 +468,6 @@ const struct snd_kcontrol_new wm_adsp1_fw_controls[] = {
...
@@ -298,7 +468,6 @@ const struct snd_kcontrol_new wm_adsp1_fw_controls[] = {
};
};
EXPORT_SYMBOL_GPL
(
wm_adsp1_fw_controls
);
EXPORT_SYMBOL_GPL
(
wm_adsp1_fw_controls
);
#if IS_ENABLED(CONFIG_SND_SOC_ARIZONA)
static
const
struct
soc_enum
wm_adsp2_rate_enum
[]
=
{
static
const
struct
soc_enum
wm_adsp2_rate_enum
[]
=
{
SOC_VALUE_ENUM_SINGLE
(
ARIZONA_DSP1_CONTROL_1
,
SOC_VALUE_ENUM_SINGLE
(
ARIZONA_DSP1_CONTROL_1
,
ARIZONA_DSP1_RATE_SHIFT
,
0xf
,
ARIZONA_DSP1_RATE_SHIFT
,
0xf
,
...
@@ -318,22 +487,28 @@ static const struct soc_enum wm_adsp2_rate_enum[] = {
...
@@ -318,22 +487,28 @@ static const struct soc_enum wm_adsp2_rate_enum[] = {
arizona_rate_text
,
arizona_rate_val
),
arizona_rate_text
,
arizona_rate_val
),
};
};
const
struct
snd_kcontrol_new
wm_adsp2_fw_controls
[]
=
{
static
const
struct
snd_kcontrol_new
wm_adsp2_fw_controls
[
4
][
2
]
=
{
SOC_ENUM_EXT
(
"DSP1 Firmware"
,
wm_adsp_fw_enum
[
0
],
{
wm_adsp_fw_get
,
wm_adsp_fw_put
),
SOC_ENUM_EXT
(
"DSP1 Firmware"
,
wm_adsp_fw_enum
[
0
],
SOC_ENUM
(
"DSP1 Rate"
,
wm_adsp2_rate_enum
[
0
]),
wm_adsp_fw_get
,
wm_adsp_fw_put
),
SOC_ENUM_EXT
(
"DSP2 Firmware"
,
wm_adsp_fw_enum
[
1
],
SOC_ENUM
(
"DSP1 Rate"
,
wm_adsp2_rate_enum
[
0
]),
wm_adsp_fw_get
,
wm_adsp_fw_put
),
},
SOC_ENUM
(
"DSP2 Rate"
,
wm_adsp2_rate_enum
[
1
]),
{
SOC_ENUM_EXT
(
"DSP3 Firmware"
,
wm_adsp_fw_enum
[
2
],
SOC_ENUM_EXT
(
"DSP2 Firmware"
,
wm_adsp_fw_enum
[
1
],
wm_adsp_fw_get
,
wm_adsp_fw_put
),
wm_adsp_fw_get
,
wm_adsp_fw_put
),
SOC_ENUM
(
"DSP3 Rate"
,
wm_adsp2_rate_enum
[
2
]),
SOC_ENUM
(
"DSP2 Rate"
,
wm_adsp2_rate_enum
[
1
]),
SOC_ENUM_EXT
(
"DSP4 Firmware"
,
wm_adsp_fw_enum
[
3
],
},
wm_adsp_fw_get
,
wm_adsp_fw_put
),
{
SOC_ENUM
(
"DSP4 Rate"
,
wm_adsp2_rate_enum
[
3
]),
SOC_ENUM_EXT
(
"DSP3 Firmware"
,
wm_adsp_fw_enum
[
2
],
wm_adsp_fw_get
,
wm_adsp_fw_put
),
SOC_ENUM
(
"DSP3 Rate"
,
wm_adsp2_rate_enum
[
2
]),
},
{
SOC_ENUM_EXT
(
"DSP4 Firmware"
,
wm_adsp_fw_enum
[
3
],
wm_adsp_fw_get
,
wm_adsp_fw_put
),
SOC_ENUM
(
"DSP4 Rate"
,
wm_adsp2_rate_enum
[
3
]),
},
};
};
EXPORT_SYMBOL_GPL
(
wm_adsp2_fw_controls
);
#endif
static
struct
wm_adsp_region
const
*
wm_adsp_find_region
(
struct
wm_adsp
*
dsp
,
static
struct
wm_adsp_region
const
*
wm_adsp_find_region
(
struct
wm_adsp
*
dsp
,
int
type
)
int
type
)
...
@@ -1128,6 +1303,8 @@ static int wm_adsp_load(struct wm_adsp *dsp)
...
@@ -1128,6 +1303,8 @@ static int wm_adsp_load(struct wm_adsp *dsp)
adsp_warn
(
dsp
,
"%s.%d: %zu bytes at end of file
\n
"
,
adsp_warn
(
dsp
,
"%s.%d: %zu bytes at end of file
\n
"
,
file
,
regions
,
pos
-
firmware
->
size
);
file
,
regions
,
pos
-
firmware
->
size
);
wm_adsp_debugfs_save_wmfwname
(
dsp
,
file
);
out_fw:
out_fw:
regmap_async_complete
(
regmap
);
regmap_async_complete
(
regmap
);
wm_adsp_buf_free
(
&
buf_list
);
wm_adsp_buf_free
(
&
buf_list
);
...
@@ -1345,11 +1522,12 @@ static int wm_adsp2_setup_algs(struct wm_adsp *dsp)
...
@@ -1345,11 +1522,12 @@ static int wm_adsp2_setup_algs(struct wm_adsp *dsp)
n_algs
=
be32_to_cpu
(
adsp2_id
.
n_algs
);
n_algs
=
be32_to_cpu
(
adsp2_id
.
n_algs
);
dsp
->
fw_id
=
be32_to_cpu
(
adsp2_id
.
fw
.
id
);
dsp
->
fw_id
=
be32_to_cpu
(
adsp2_id
.
fw
.
id
);
dsp
->
fw_id_version
=
be32_to_cpu
(
adsp2_id
.
fw
.
ver
);
adsp_info
(
dsp
,
"Firmware: %x v%d.%d.%d, %zu algorithms
\n
"
,
adsp_info
(
dsp
,
"Firmware: %x v%d.%d.%d, %zu algorithms
\n
"
,
dsp
->
fw_id
,
dsp
->
fw_id
,
(
be32_to_cpu
(
adsp2_id
.
fw
.
ver
)
&
0xff0000
)
>>
16
,
(
dsp
->
fw_id_version
&
0xff0000
)
>>
16
,
(
be32_to_cpu
(
adsp2_id
.
fw
.
ver
)
&
0xff00
)
>>
8
,
(
dsp
->
fw_id_version
&
0xff00
)
>>
8
,
be32_to_cpu
(
adsp2_id
.
fw
.
ver
)
&
0xff
,
dsp
->
fw_id_version
&
0xff
,
n_algs
);
n_algs
);
alg_region
=
wm_adsp_create_region
(
dsp
,
WMFW_ADSP2_XM
,
alg_region
=
wm_adsp_create_region
(
dsp
,
WMFW_ADSP2_XM
,
...
@@ -1625,6 +1803,8 @@ static int wm_adsp_load_coeff(struct wm_adsp *dsp)
...
@@ -1625,6 +1803,8 @@ static int wm_adsp_load_coeff(struct wm_adsp *dsp)
adsp_warn
(
dsp
,
"%s.%d: %zu bytes at end of file
\n
"
,
adsp_warn
(
dsp
,
"%s.%d: %zu bytes at end of file
\n
"
,
file
,
blocks
,
pos
-
firmware
->
size
);
file
,
blocks
,
pos
-
firmware
->
size
);
wm_adsp_debugfs_save_binname
(
dsp
,
file
);
out_fw:
out_fw:
regmap_async_complete
(
regmap
);
regmap_async_complete
(
regmap
);
release_firmware
(
firmware
);
release_firmware
(
firmware
);
...
@@ -1638,6 +1818,9 @@ int wm_adsp1_init(struct wm_adsp *dsp)
...
@@ -1638,6 +1818,9 @@ int wm_adsp1_init(struct wm_adsp *dsp)
{
{
INIT_LIST_HEAD
(
&
dsp
->
alg_regions
);
INIT_LIST_HEAD
(
&
dsp
->
alg_regions
);
#ifdef CONFIG_DEBUG_FS
mutex_init
(
&
dsp
->
debugfs_lock
);
#endif
return
0
;
return
0
;
}
}
EXPORT_SYMBOL_GPL
(
wm_adsp1_init
);
EXPORT_SYMBOL_GPL
(
wm_adsp1_init
);
...
@@ -1896,6 +2079,10 @@ int wm_adsp2_event(struct snd_soc_dapm_widget *w,
...
@@ -1896,6 +2079,10 @@ int wm_adsp2_event(struct snd_soc_dapm_widget *w,
/* Log firmware state, it can be useful for analysis */
/* Log firmware state, it can be useful for analysis */
wm_adsp2_show_fw_status
(
dsp
);
wm_adsp2_show_fw_status
(
dsp
);
wm_adsp_debugfs_clear
(
dsp
);
dsp
->
fw_id
=
0
;
dsp
->
fw_id_version
=
0
;
dsp
->
running
=
false
;
dsp
->
running
=
false
;
regmap_update_bits
(
dsp
->
regmap
,
dsp
->
base
+
ADSP2_CONTROL
,
regmap_update_bits
(
dsp
->
regmap
,
dsp
->
base
+
ADSP2_CONTROL
,
...
@@ -1933,6 +2120,24 @@ int wm_adsp2_event(struct snd_soc_dapm_widget *w,
...
@@ -1933,6 +2120,24 @@ int wm_adsp2_event(struct snd_soc_dapm_widget *w,
}
}
EXPORT_SYMBOL_GPL
(
wm_adsp2_event
);
EXPORT_SYMBOL_GPL
(
wm_adsp2_event
);
int
wm_adsp2_codec_probe
(
struct
wm_adsp
*
dsp
,
struct
snd_soc_codec
*
codec
)
{
wm_adsp2_init_debugfs
(
dsp
,
codec
);
return
snd_soc_add_codec_controls
(
codec
,
wm_adsp2_fw_controls
[
dsp
->
num
-
1
],
ARRAY_SIZE
(
wm_adsp2_fw_controls
[
0
]));
}
EXPORT_SYMBOL_GPL
(
wm_adsp2_codec_probe
);
int
wm_adsp2_codec_remove
(
struct
wm_adsp
*
dsp
,
struct
snd_soc_codec
*
codec
)
{
wm_adsp2_cleanup_debugfs
(
dsp
);
return
0
;
}
EXPORT_SYMBOL_GPL
(
wm_adsp2_codec_remove
);
int
wm_adsp2_init
(
struct
wm_adsp
*
dsp
)
int
wm_adsp2_init
(
struct
wm_adsp
*
dsp
)
{
{
int
ret
;
int
ret
;
...
@@ -1952,6 +2157,9 @@ int wm_adsp2_init(struct wm_adsp *dsp)
...
@@ -1952,6 +2157,9 @@ int wm_adsp2_init(struct wm_adsp *dsp)
INIT_LIST_HEAD
(
&
dsp
->
ctl_list
);
INIT_LIST_HEAD
(
&
dsp
->
ctl_list
);
INIT_WORK
(
&
dsp
->
boot_work
,
wm_adsp2_boot_work
);
INIT_WORK
(
&
dsp
->
boot_work
,
wm_adsp2_boot_work
);
#ifdef CONFIG_DEBUG_FS
mutex_init
(
&
dsp
->
debugfs_lock
);
#endif
return
0
;
return
0
;
}
}
EXPORT_SYMBOL_GPL
(
wm_adsp2_init
);
EXPORT_SYMBOL_GPL
(
wm_adsp2_init
);
...
...
sound/soc/codecs/wm_adsp.h
View file @
95baa281
...
@@ -46,17 +46,26 @@ struct wm_adsp {
...
@@ -46,17 +46,26 @@ struct wm_adsp {
struct
list_head
alg_regions
;
struct
list_head
alg_regions
;
int
fw_id
;
int
fw_id
;
int
fw_id_version
;
const
struct
wm_adsp_region
*
mem
;
const
struct
wm_adsp_region
*
mem
;
int
num_mems
;
int
num_mems
;
int
fw
;
int
fw
;
int
fw_ver
;
int
fw_ver
;
bool
running
;
u32
running
;
struct
list_head
ctl_list
;
struct
list_head
ctl_list
;
struct
work_struct
boot_work
;
struct
work_struct
boot_work
;
#ifdef CONFIG_DEBUG_FS
struct
dentry
*
debugfs_root
;
struct
mutex
debugfs_lock
;
char
*
wmfw_file_name
;
char
*
bin_file_name
;
#endif
};
};
#define WM_ADSP1(wname, num) \
#define WM_ADSP1(wname, num) \
...
@@ -75,10 +84,11 @@ struct wm_adsp {
...
@@ -75,10 +84,11 @@ struct wm_adsp {
WM_ADSP2_E(wname, num, wm_adsp2_early_event)
WM_ADSP2_E(wname, num, wm_adsp2_early_event)
extern
const
struct
snd_kcontrol_new
wm_adsp1_fw_controls
[];
extern
const
struct
snd_kcontrol_new
wm_adsp1_fw_controls
[];
extern
const
struct
snd_kcontrol_new
wm_adsp2_fw_controls
[];
int
wm_adsp1_init
(
struct
wm_adsp
*
dsp
);
int
wm_adsp1_init
(
struct
wm_adsp
*
dsp
);
int
wm_adsp2_init
(
struct
wm_adsp
*
dsp
);
int
wm_adsp2_init
(
struct
wm_adsp
*
dsp
);
int
wm_adsp2_codec_probe
(
struct
wm_adsp
*
dsp
,
struct
snd_soc_codec
*
codec
);
int
wm_adsp2_codec_remove
(
struct
wm_adsp
*
dsp
,
struct
snd_soc_codec
*
codec
);
int
wm_adsp1_event
(
struct
snd_soc_dapm_widget
*
w
,
int
wm_adsp1_event
(
struct
snd_soc_dapm_widget
*
w
,
struct
snd_kcontrol
*
kcontrol
,
int
event
);
struct
snd_kcontrol
*
kcontrol
,
int
event
);
int
wm_adsp2_early_event
(
struct
snd_soc_dapm_widget
*
w
,
int
wm_adsp2_early_event
(
struct
snd_soc_dapm_widget
*
w
,
...
...
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