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
Kirill Smelkov
linux
Commits
39e0a0ae
Commit
39e0a0ae
authored
Sep 01, 2017
by
Mark Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'asoc/topic/core' into asoc-next
parents
0314f694
88c27465
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
133 additions
and
74 deletions
+133
-74
include/sound/soc.h
include/sound/soc.h
+14
-7
sound/soc/codecs/max98927.c
sound/soc/codecs/max98927.c
+0
-1
sound/soc/soc-core.c
sound/soc/soc-core.c
+98
-44
sound/soc/soc-pcm.c
sound/soc/soc-pcm.c
+21
-22
No files found.
include/sound/soc.h
View file @
39e0a0ae
...
...
@@ -889,6 +889,18 @@ struct snd_soc_component {
#endif
};
struct
snd_soc_rtdcom_list
{
struct
snd_soc_component
*
component
;
struct
list_head
list
;
/* rtd::component_list */
};
struct
snd_soc_component
*
snd_soc_rtdcom_lookup
(
struct
snd_soc_pcm_runtime
*
rtd
,
const
char
*
driver_name
);
#define for_each_rtdcom(rtd, rtdcom) \
list_for_each_entry(rtdcom, &(rtd)->component_list, list)
#define for_each_rtdcom_safe(rtd, rtdcom1, rtdcom2) \
list_for_each_entry_safe(rtdcom1, rtdcom2, &(rtd)->component_list, list)
/* SoC Audio Codec device */
struct
snd_soc_codec
{
struct
device
*
dev
;
...
...
@@ -897,7 +909,6 @@ struct snd_soc_codec {
struct
list_head
list
;
/* runtime */
unsigned
int
cache_bypass
:
1
;
/* Suppress access to the cache */
unsigned
int
cache_init
:
1
;
/* codec cache has been initialized */
/* codec IO */
...
...
@@ -907,10 +918,6 @@ struct snd_soc_codec {
/* component */
struct
snd_soc_component
component
;
#ifdef CONFIG_DEBUG_FS
struct
dentry
*
debugfs_reg
;
#endif
};
/* codec driver */
...
...
@@ -1233,7 +1240,7 @@ struct snd_soc_pcm_runtime {
struct
snd_pcm
*
pcm
;
struct
snd_compr
*
compr
;
struct
snd_soc_codec
*
codec
;
struct
snd_soc_platform
*
platform
;
struct
snd_soc_platform
*
platform
;
/* will be removed */
struct
snd_soc_dai
*
codec_dai
;
struct
snd_soc_dai
*
cpu_dai
;
...
...
@@ -1243,11 +1250,11 @@ struct snd_soc_pcm_runtime {
struct
delayed_work
delayed_work
;
#ifdef CONFIG_DEBUG_FS
struct
dentry
*
debugfs_dpcm_root
;
struct
dentry
*
debugfs_dpcm_state
;
#endif
unsigned
int
num
;
/* 0-based and monotonic increasing */
struct
list_head
list
;
/* rtd list of the soc card */
struct
list_head
component_list
;
/* list of connected components */
/* bit field */
unsigned
int
dev_registered
:
1
;
...
...
sound/soc/codecs/max98927.c
View file @
39e0a0ae
...
...
@@ -577,7 +577,6 @@ static int max98927_probe(struct snd_soc_codec *codec)
max98927
->
codec
=
codec
;
codec
->
control_data
=
max98927
->
regmap
;
codec
->
cache_bypass
=
1
;
/* Software Reset */
regmap_write
(
max98927
->
regmap
,
...
...
sound/soc/soc-core.c
View file @
39e0a0ae
...
...
@@ -339,11 +339,12 @@ static void soc_cleanup_component_debugfs(struct snd_soc_component *component)
static
void
soc_init_codec_debugfs
(
struct
snd_soc_component
*
component
)
{
struct
snd_soc_codec
*
codec
=
snd_soc_component_to_codec
(
component
);
struct
dentry
*
debugfs_reg
;
codec
->
debugfs_reg
=
debugfs_create_file
(
"codec_reg"
,
0644
,
codec
->
component
.
debugfs_root
,
codec
,
&
codec_reg_fops
);
if
(
!
codec
->
debugfs_reg
)
debugfs_reg
=
debugfs_create_file
(
"codec_reg"
,
0644
,
codec
->
component
.
debugfs_root
,
codec
,
&
codec_reg_fops
);
if
(
!
debugfs_reg
)
dev_warn
(
codec
->
dev
,
"ASoC: Failed to create codec register debugfs file
\n
"
);
}
...
...
@@ -494,7 +495,7 @@ static void soc_cleanup_card_debugfs(struct snd_soc_card *card)
static
void
snd_soc_debugfs_init
(
void
)
{
snd_soc_debugfs_root
=
debugfs_create_dir
(
"asoc"
,
NULL
);
if
(
IS_ERR
(
snd_soc_debugfs_root
)
||
!
snd_soc_debugfs_root
)
{
if
(
IS_ERR
_OR_NULL
(
snd_soc_debugfs_root
)
)
{
pr_warn
(
"ASoC: Failed to create debugfs directory
\n
"
);
snd_soc_debugfs_root
=
NULL
;
return
;
...
...
@@ -550,6 +551,54 @@ static inline void snd_soc_debugfs_exit(void)
#endif
static
int
snd_soc_rtdcom_add
(
struct
snd_soc_pcm_runtime
*
rtd
,
struct
snd_soc_component
*
component
)
{
struct
snd_soc_rtdcom_list
*
rtdcom
;
struct
snd_soc_rtdcom_list
*
new_rtdcom
;
for_each_rtdcom
(
rtd
,
rtdcom
)
{
/* already connected */
if
(
rtdcom
->
component
==
component
)
return
0
;
}
new_rtdcom
=
kmalloc
(
sizeof
(
*
new_rtdcom
),
GFP_KERNEL
);
if
(
!
new_rtdcom
)
return
-
ENOMEM
;
new_rtdcom
->
component
=
component
;
INIT_LIST_HEAD
(
&
new_rtdcom
->
list
);
list_add_tail
(
&
new_rtdcom
->
list
,
&
rtd
->
component_list
);
return
0
;
}
static
void
snd_soc_rtdcom_del_all
(
struct
snd_soc_pcm_runtime
*
rtd
)
{
struct
snd_soc_rtdcom_list
*
rtdcom1
,
*
rtdcom2
;
for_each_rtdcom_safe
(
rtd
,
rtdcom1
,
rtdcom2
)
kfree
(
rtdcom1
);
INIT_LIST_HEAD
(
&
rtd
->
component_list
);
}
struct
snd_soc_component
*
snd_soc_rtdcom_lookup
(
struct
snd_soc_pcm_runtime
*
rtd
,
const
char
*
driver_name
)
{
struct
snd_soc_rtdcom_list
*
rtdcom
;
for_each_rtdcom
(
rtd
,
rtdcom
)
{
if
((
rtdcom
->
component
->
driver
->
name
==
driver_name
)
||
strcmp
(
rtdcom
->
component
->
driver
->
name
,
driver_name
)
==
0
)
return
rtdcom
->
component
;
}
return
NULL
;
}
struct
snd_pcm_substream
*
snd_soc_get_dai_substream
(
struct
snd_soc_card
*
card
,
const
char
*
dai_link
,
int
stream
)
{
...
...
@@ -574,6 +623,7 @@ static struct snd_soc_pcm_runtime *soc_new_pcm_runtime(
if
(
!
rtd
)
return
NULL
;
INIT_LIST_HEAD
(
&
rtd
->
component_list
);
rtd
->
card
=
card
;
rtd
->
dai_link
=
dai_link
;
rtd
->
codec_dais
=
kzalloc
(
sizeof
(
struct
snd_soc_dai
*
)
*
...
...
@@ -591,6 +641,7 @@ static void soc_free_pcm_runtime(struct snd_soc_pcm_runtime *rtd)
{
if
(
rtd
&&
rtd
->
codec_dais
)
kfree
(
rtd
->
codec_dais
);
snd_soc_rtdcom_del_all
(
rtd
);
kfree
(
rtd
);
}
...
...
@@ -949,7 +1000,7 @@ static struct snd_soc_component *soc_find_component(
/**
* snd_soc_find_dai - Find a registered DAI
*
* @dlc: name of the DAI and optional component info to match
* @dlc: name of the DAI
or the DAI driver
and optional component info to match
*
* This function will search all registered components and their DAIs to
* find the DAI of the same name. The component's of_node and name
...
...
@@ -977,7 +1028,9 @@ struct snd_soc_dai *snd_soc_find_dai(
if
(
dlc
->
name
&&
strcmp
(
component
->
name
,
dlc
->
name
))
continue
;
list_for_each_entry
(
dai
,
&
component
->
dai_list
,
list
)
{
if
(
dlc
->
dai_name
&&
strcmp
(
dai
->
name
,
dlc
->
dai_name
))
if
(
dlc
->
dai_name
&&
strcmp
(
dai
->
name
,
dlc
->
dai_name
)
&&
(
!
dai
->
driver
->
name
||
strcmp
(
dai
->
driver
->
name
,
dlc
->
dai_name
)))
continue
;
return
dai
;
...
...
@@ -1049,6 +1102,7 @@ static int soc_bind_dai_link(struct snd_soc_card *card,
struct
snd_soc_pcm_runtime
*
rtd
;
struct
snd_soc_dai_link_component
*
codecs
=
dai_link
->
codecs
;
struct
snd_soc_dai_link_component
cpu_dai_component
;
struct
snd_soc_component
*
component
;
struct
snd_soc_dai
**
codec_dais
;
struct
snd_soc_platform
*
platform
;
struct
device_node
*
platform_of_node
;
...
...
@@ -1076,6 +1130,7 @@ static int soc_bind_dai_link(struct snd_soc_card *card,
dai_link
->
cpu_dai_name
);
goto
_err_defer
;
}
snd_soc_rtdcom_add
(
rtd
,
rtd
->
cpu_dai
->
component
);
rtd
->
num_codecs
=
dai_link
->
num_codecs
;
...
...
@@ -1088,6 +1143,7 @@ static int soc_bind_dai_link(struct snd_soc_card *card,
codecs
[
i
].
dai_name
);
goto
_err_defer
;
}
snd_soc_rtdcom_add
(
rtd
,
codec_dais
[
i
]
->
component
);
}
/* Single codec links expect codec and codec_dai in runtime data */
...
...
@@ -1099,6 +1155,23 @@ static int soc_bind_dai_link(struct snd_soc_card *card,
if
(
!
platform_name
&&
!
dai_link
->
platform_of_node
)
platform_name
=
"snd-soc-dummy"
;
/* find one from the set of registered platforms */
list_for_each_entry
(
component
,
&
component_list
,
list
)
{
platform_of_node
=
component
->
dev
->
of_node
;
if
(
!
platform_of_node
&&
component
->
dev
->
parent
->
of_node
)
platform_of_node
=
component
->
dev
->
parent
->
of_node
;
if
(
dai_link
->
platform_of_node
)
{
if
(
platform_of_node
!=
dai_link
->
platform_of_node
)
continue
;
}
else
{
if
(
strcmp
(
component
->
name
,
platform_name
))
continue
;
}
snd_soc_rtdcom_add
(
rtd
,
component
);
}
/* find one from the set of registered platforms */
list_for_each_entry
(
platform
,
&
platform_list
,
list
)
{
platform_of_node
=
platform
->
dev
->
of_node
;
...
...
@@ -1184,27 +1257,15 @@ static void soc_remove_link_dais(struct snd_soc_card *card,
static
void
soc_remove_link_components
(
struct
snd_soc_card
*
card
,
struct
snd_soc_pcm_runtime
*
rtd
,
int
order
)
{
struct
snd_soc_dai
*
cpu_dai
=
rtd
->
cpu_dai
;
struct
snd_soc_platform
*
platform
=
rtd
->
platform
;
struct
snd_soc_component
*
component
;
int
i
;
struct
snd_soc_rtdcom_list
*
rtdcom
;
/* remove the platform */
if
(
platform
&&
platform
->
component
.
driver
->
remove_order
==
order
)
soc_remove_component
(
&
platform
->
component
);
for_each_rtdcom
(
rtd
,
rtdcom
)
{
component
=
rtdcom
->
component
;
/* remove the CODEC-side CODEC */
for
(
i
=
0
;
i
<
rtd
->
num_codecs
;
i
++
)
{
component
=
rtd
->
codec_dais
[
i
]
->
component
;
if
(
component
->
driver
->
remove_order
==
order
)
soc_remove_component
(
component
);
}
/* remove any CPU-side CODEC */
if
(
cpu_dai
)
{
if
(
cpu_dai
->
component
->
driver
->
remove_order
==
order
)
soc_remove_component
(
cpu_dai
->
component
);
}
}
static
void
soc_remove_dai_links
(
struct
snd_soc_card
*
card
)
...
...
@@ -1559,21 +1620,13 @@ static int soc_probe_link_components(struct snd_soc_card *card,
struct
snd_soc_pcm_runtime
*
rtd
,
int
order
)
{
struct
snd_soc_platform
*
platform
=
rtd
->
platform
;
struct
snd_soc_component
*
component
;
int
i
,
ret
;
struct
snd_soc_rtdcom_list
*
rtdcom
;
int
ret
;
/* probe the CPU-side component, if it is a CODEC */
component
=
rtd
->
cpu_dai
->
component
;
if
(
component
->
driver
->
probe_order
==
order
)
{
ret
=
soc_probe_component
(
card
,
component
);
if
(
ret
<
0
)
return
ret
;
}
for_each_rtdcom
(
rtd
,
rtdcom
)
{
component
=
rtdcom
->
component
;
/* probe the CODEC-side components */
for
(
i
=
0
;
i
<
rtd
->
num_codecs
;
i
++
)
{
component
=
rtd
->
codec_dais
[
i
]
->
component
;
if
(
component
->
driver
->
probe_order
==
order
)
{
ret
=
soc_probe_component
(
card
,
component
);
if
(
ret
<
0
)
...
...
@@ -1581,13 +1634,6 @@ static int soc_probe_link_components(struct snd_soc_card *card,
}
}
/* probe the platform */
if
(
platform
->
component
.
driver
->
probe_order
==
order
)
{
ret
=
soc_probe_component
(
card
,
&
platform
->
component
);
if
(
ret
<
0
)
return
ret
;
}
return
0
;
}
...
...
@@ -3227,7 +3273,7 @@ static int snd_soc_component_initialize(struct snd_soc_component *component,
component
->
set_pll
=
component
->
driver
->
set_pll
;
component
->
set_jack
=
component
->
driver
->
set_jack
;
dapm
=
&
component
->
dapm
;
dapm
=
snd_soc_component_get_dapm
(
component
)
;
dapm
->
dev
=
dev
;
dapm
->
component
=
component
;
dapm
->
bias_level
=
SND_SOC_BIAS_OFF
;
...
...
@@ -3367,11 +3413,12 @@ int snd_soc_register_component(struct device *dev,
EXPORT_SYMBOL_GPL
(
snd_soc_register_component
);
/**
* snd_soc_unregister_component - Unregister a component from the ASoC core
* snd_soc_unregister_component - Unregister all related component
* from the ASoC core
*
* @dev: The device to unregister
*/
void
snd_soc_unregister_component
(
struct
device
*
dev
)
static
int
__
snd_soc_unregister_component
(
struct
device
*
dev
)
{
struct
snd_soc_component
*
component
;
int
found
=
0
;
...
...
@@ -3393,6 +3440,13 @@ void snd_soc_unregister_component(struct device *dev)
snd_soc_component_cleanup
(
component
);
kfree
(
component
);
}
return
found
;
}
void
snd_soc_unregister_component
(
struct
device
*
dev
)
{
while
(
__snd_soc_unregister_component
(
dev
));
}
EXPORT_SYMBOL_GPL
(
snd_soc_unregister_component
);
...
...
sound/soc/soc-pcm.c
View file @
39e0a0ae
...
...
@@ -454,6 +454,8 @@ static int soc_pcm_open(struct snd_pcm_substream *substream)
struct
snd_soc_pcm_runtime
*
rtd
=
substream
->
private_data
;
struct
snd_pcm_runtime
*
runtime
=
substream
->
runtime
;
struct
snd_soc_platform
*
platform
=
rtd
->
platform
;
struct
snd_soc_component
*
component
;
struct
snd_soc_rtdcom_list
*
rtdcom
;
struct
snd_soc_dai
*
cpu_dai
=
rtd
->
cpu_dai
;
struct
snd_soc_dai
*
codec_dai
;
const
char
*
codec_dai_name
=
"multicodec"
;
...
...
@@ -462,10 +464,12 @@ static int soc_pcm_open(struct snd_pcm_substream *substream)
pinctrl_pm_select_default_state
(
cpu_dai
->
dev
);
for
(
i
=
0
;
i
<
rtd
->
num_codecs
;
i
++
)
pinctrl_pm_select_default_state
(
rtd
->
codec_dais
[
i
]
->
dev
);
pm_runtime_get_sync
(
cpu_dai
->
dev
);
for
(
i
=
0
;
i
<
rtd
->
num_codecs
;
i
++
)
pm_runtime_get_sync
(
rtd
->
codec_dais
[
i
]
->
dev
);
pm_runtime_get_sync
(
platform
->
dev
);
for_each_rtdcom
(
rtd
,
rtdcom
)
{
component
=
rtdcom
->
component
;
pm_runtime_get_sync
(
component
->
dev
);
}
mutex_lock_nested
(
&
rtd
->
pcm_mutex
,
rtd
->
pcm_subclass
);
...
...
@@ -603,15 +607,13 @@ static int soc_pcm_open(struct snd_pcm_substream *substream)
out:
mutex_unlock
(
&
rtd
->
pcm_mutex
);
pm_runtime_mark_last_busy
(
platform
->
dev
);
pm_runtime_put_autosuspend
(
platform
->
dev
)
;
for
(
i
=
0
;
i
<
rtd
->
num_codecs
;
i
++
)
{
pm_runtime_mark_last_busy
(
rtd
->
codec_dais
[
i
]
->
dev
);
pm_runtime_put_autosuspend
(
rtd
->
codec_dais
[
i
]
->
dev
);
for_each_rtdcom
(
rtd
,
rtdcom
)
{
component
=
rtdcom
->
component
;
pm_runtime_mark_last_busy
(
component
->
dev
);
pm_runtime_put_autosuspend
(
component
->
dev
);
}
pm_runtime_mark_last_busy
(
cpu_dai
->
dev
);
pm_runtime_put_autosuspend
(
cpu_dai
->
dev
);
for
(
i
=
0
;
i
<
rtd
->
num_codecs
;
i
++
)
{
if
(
!
rtd
->
codec_dais
[
i
]
->
active
)
pinctrl_pm_select_sleep_state
(
rtd
->
codec_dais
[
i
]
->
dev
);
...
...
@@ -659,6 +661,8 @@ static int soc_pcm_close(struct snd_pcm_substream *substream)
{
struct
snd_soc_pcm_runtime
*
rtd
=
substream
->
private_data
;
struct
snd_soc_platform
*
platform
=
rtd
->
platform
;
struct
snd_soc_component
*
component
;
struct
snd_soc_rtdcom_list
*
rtdcom
;
struct
snd_soc_dai
*
cpu_dai
=
rtd
->
cpu_dai
;
struct
snd_soc_dai
*
codec_dai
;
int
i
;
...
...
@@ -715,17 +719,13 @@ static int soc_pcm_close(struct snd_pcm_substream *substream)
mutex_unlock
(
&
rtd
->
pcm_mutex
);
pm_runtime_mark_last_busy
(
platform
->
dev
);
pm_runtime_put_autosuspend
(
platform
->
dev
)
;
for_each_rtdcom
(
rtd
,
rtdcom
)
{
component
=
rtdcom
->
component
;
for
(
i
=
0
;
i
<
rtd
->
num_codecs
;
i
++
)
{
pm_runtime_mark_last_busy
(
rtd
->
codec_dais
[
i
]
->
dev
);
pm_runtime_put_autosuspend
(
rtd
->
codec_dais
[
i
]
->
dev
);
pm_runtime_mark_last_busy
(
component
->
dev
);
pm_runtime_put_autosuspend
(
component
->
dev
);
}
pm_runtime_mark_last_busy
(
cpu_dai
->
dev
);
pm_runtime_put_autosuspend
(
cpu_dai
->
dev
);
for
(
i
=
0
;
i
<
rtd
->
num_codecs
;
i
++
)
{
if
(
!
rtd
->
codec_dais
[
i
]
->
active
)
pinctrl_pm_select_sleep_state
(
rtd
->
codec_dais
[
i
]
->
dev
);
...
...
@@ -3000,8 +3000,7 @@ void soc_dpcm_debugfs_add(struct snd_soc_pcm_runtime *rtd)
return
;
}
rtd
->
debugfs_dpcm_state
=
debugfs_create_file
(
"state"
,
0444
,
rtd
->
debugfs_dpcm_root
,
rtd
,
&
dpcm_state_fops
);
debugfs_create_file
(
"state"
,
0444
,
rtd
->
debugfs_dpcm_root
,
rtd
,
&
dpcm_state_fops
);
}
#endif
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