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
f7acb369
Commit
f7acb369
authored
Jul 16, 2014
by
Mark Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'asoc/topic/component' into asoc-multi
parents
c8dd1fec
5f3484ac
Changes
10
Show whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
424 additions
and
402 deletions
+424
-402
include/sound/soc-dai.h
include/sound/soc-dai.h
+0
-1
include/sound/soc-dapm.h
include/sound/soc-dapm.h
+5
-3
include/sound/soc.h
include/sound/soc.h
+35
-14
include/trace/events/asoc.h
include/trace/events/asoc.h
+3
-3
sound/soc/codecs/tlv320dac33.c
sound/soc/codecs/tlv320dac33.c
+1
-1
sound/soc/soc-cache.c
sound/soc/soc-cache.c
+3
-4
sound/soc/soc-compress.c
sound/soc/soc-compress.c
+5
-3
sound/soc/soc-core.c
sound/soc/soc-core.c
+251
-280
sound/soc/soc-dapm.c
sound/soc/soc-dapm.c
+119
-91
sound/soc/soc-pcm.c
sound/soc/soc-pcm.c
+2
-2
No files found.
include/sound/soc-dai.h
View file @
f7acb369
...
...
@@ -257,7 +257,6 @@ struct snd_soc_dai {
struct
snd_soc_dapm_widget
*
playback_widget
;
struct
snd_soc_dapm_widget
*
capture_widget
;
struct
snd_soc_dapm_context
dapm
;
/* DAI DMA data */
void
*
playback_dma_data
;
...
...
include/sound/soc-dapm.h
View file @
f7acb369
...
...
@@ -431,7 +431,7 @@ int snd_soc_dapm_force_enable_pin_unlocked(struct snd_soc_dapm_context *dapm,
const
char
*
pin
);
int
snd_soc_dapm_ignore_suspend
(
struct
snd_soc_dapm_context
*
dapm
,
const
char
*
pin
);
void
snd_soc_dapm_auto_nc_
codec_pins
(
struct
snd_soc_codec
*
codec
);
void
snd_soc_dapm_auto_nc_
pins
(
struct
snd_soc_card
*
card
);
/* Mostly internal - should not normally be used */
void
dapm_mark_io_dirty
(
struct
snd_soc_dapm_context
*
dapm
);
...
...
@@ -441,6 +441,8 @@ int snd_soc_dapm_dai_get_connected_widgets(struct snd_soc_dai *dai, int stream,
struct
snd_soc_dapm_widget_list
**
list
);
struct
snd_soc_codec
*
snd_soc_dapm_kcontrol_codec
(
struct
snd_kcontrol
*
kcontrol
);
struct
snd_soc_dapm_context
*
snd_soc_dapm_kcontrol_dapm
(
struct
snd_kcontrol
*
kcontrol
);
/* dapm widget types */
enum
snd_soc_dapm_type
{
...
...
@@ -524,7 +526,6 @@ struct snd_soc_dapm_widget {
const
char
*
name
;
/* widget name */
const
char
*
sname
;
/* stream name */
struct
snd_soc_codec
*
codec
;
struct
snd_soc_platform
*
platform
;
struct
list_head
list
;
struct
snd_soc_dapm_context
*
dapm
;
...
...
@@ -593,7 +594,6 @@ struct snd_soc_dapm_context {
struct
device
*
dev
;
/* from parent - for debug */
struct
snd_soc_component
*
component
;
/* parent component */
struct
snd_soc_codec
*
codec
;
/* parent codec */
struct
snd_soc_platform
*
platform
;
/* parent platform */
struct
snd_soc_card
*
card
;
/* parent card */
/* used during DAPM updates */
...
...
@@ -601,6 +601,8 @@ struct snd_soc_dapm_context {
struct
list_head
list
;
int
(
*
stream_event
)(
struct
snd_soc_dapm_context
*
dapm
,
int
event
);
int
(
*
set_bias_level
)(
struct
snd_soc_dapm_context
*
dapm
,
enum
snd_soc_bias_level
level
);
#ifdef CONFIG_DEBUG_FS
struct
dentry
*
debugfs_dapm
;
...
...
include/sound/soc.h
View file @
f7acb369
...
...
@@ -677,11 +677,15 @@ struct snd_soc_component_driver {
int
(
*
of_xlate_dai_name
)(
struct
snd_soc_component
*
component
,
struct
of_phandle_args
*
args
,
const
char
**
dai_name
);
void
(
*
seq_notifier
)(
struct
snd_soc_component
*
,
enum
snd_soc_dapm_type
,
int
subseq
);
int
(
*
stream_event
)(
struct
snd_soc_component
*
,
int
event
);
};
struct
snd_soc_component
{
const
char
*
name
;
int
id
;
const
char
*
name_prefix
;
struct
device
*
dev
;
unsigned
int
active
;
...
...
@@ -705,13 +709,14 @@ struct snd_soc_component {
int
val_bytes
;
struct
mutex
io_mutex
;
/* Don't use these, use snd_soc_component_get_dapm() */
struct
snd_soc_dapm_context
dapm
;
struct
snd_soc_dapm_context
*
dapm_ptr
;
};
/* SoC Audio Codec device */
struct
snd_soc_codec
{
const
char
*
name
;
const
char
*
name_prefix
;
int
id
;
struct
device
*
dev
;
const
struct
snd_soc_codec_driver
*
driver
;
...
...
@@ -790,9 +795,6 @@ struct snd_soc_codec_driver {
void
(
*
seq_notifier
)(
struct
snd_soc_dapm_context
*
,
enum
snd_soc_dapm_type
,
int
);
/* codec stream completion event */
int
(
*
stream_event
)(
struct
snd_soc_dapm_context
*
dapm
,
int
event
);
bool
ignore_pmdown_time
;
/* Doesn't benefit from pmdown delay */
/* probe ordering - for components with runtime dependencies */
...
...
@@ -834,9 +836,6 @@ struct snd_soc_platform_driver {
/* platform stream compress ops */
const
struct
snd_compr_ops
*
compr_ops
;
/* platform stream completion event */
int
(
*
stream_event
)(
struct
snd_soc_dapm_context
*
dapm
,
int
event
);
/* probe ordering - for components with runtime dependencies */
int
probe_order
;
int
remove_order
;
...
...
@@ -848,8 +847,6 @@ struct snd_soc_platform_driver {
};
struct
snd_soc_platform
{
const
char
*
name
;
int
id
;
struct
device
*
dev
;
const
struct
snd_soc_platform_driver
*
driver
;
...
...
@@ -862,8 +859,6 @@ struct snd_soc_platform {
struct
snd_soc_component
component
;
struct
snd_soc_dapm_context
dapm
;
#ifdef CONFIG_DEBUG_FS
struct
dentry
*
debugfs_platform_root
;
#endif
...
...
@@ -1164,6 +1159,21 @@ static inline struct snd_soc_platform *snd_soc_component_to_platform(
return
container_of
(
component
,
struct
snd_soc_platform
,
component
);
}
/**
* snd_soc_dapm_to_component() - Casts a DAPM context to the component it is
* embedded in
* @dapm: The DAPM context to cast to the component
*
* This function must only be used on DAPM contexts that are known to be part of
* a component (e.g. in a component driver). Otherwise the behavior is
* undefined.
*/
static
inline
struct
snd_soc_component
*
snd_soc_dapm_to_component
(
struct
snd_soc_dapm_context
*
dapm
)
{
return
container_of
(
dapm
,
struct
snd_soc_component
,
dapm
);
}
/**
* snd_soc_dapm_to_codec() - Casts a DAPM context to the CODEC it is embedded in
* @dapm: The DAPM context to cast to the CODEC
...
...
@@ -1188,7 +1198,18 @@ static inline struct snd_soc_codec *snd_soc_dapm_to_codec(
static
inline
struct
snd_soc_platform
*
snd_soc_dapm_to_platform
(
struct
snd_soc_dapm_context
*
dapm
)
{
return
container_of
(
dapm
,
struct
snd_soc_platform
,
dapm
);
return
snd_soc_component_to_platform
(
snd_soc_dapm_to_component
(
dapm
));
}
/**
* snd_soc_component_get_dapm() - Returns the DAPM context associated with a
* component
* @component: The component for which to get the DAPM context
*/
static
inline
struct
snd_soc_dapm_context
*
snd_soc_component_get_dapm
(
struct
snd_soc_component
*
component
)
{
return
component
->
dapm_ptr
;
}
/* codec IO */
...
...
include/trace/events/asoc.h
View file @
f7acb369
...
...
@@ -296,17 +296,17 @@ TRACE_EVENT(snd_soc_cache_sync,
TP_ARGS
(
codec
,
type
,
status
),
TP_STRUCT__entry
(
__string
(
name
,
codec
->
name
)
__string
(
name
,
codec
->
component
.
name
)
__string
(
status
,
status
)
__string
(
type
,
type
)
__field
(
int
,
id
)
),
TP_fast_assign
(
__assign_str
(
name
,
codec
->
name
);
__assign_str
(
name
,
codec
->
component
.
name
);
__assign_str
(
status
,
status
);
__assign_str
(
type
,
type
);
__entry
->
id
=
codec
->
id
;
__entry
->
id
=
codec
->
component
.
id
;
),
TP_printk
(
"codec=%s.%d type=%s status=%s"
,
__get_str
(
name
),
...
...
sound/soc/codecs/tlv320dac33.c
View file @
f7acb369
...
...
@@ -1404,7 +1404,7 @@ static int dac33_soc_probe(struct snd_soc_codec *codec)
if
(
dac33
->
irq
>=
0
)
{
ret
=
request_irq
(
dac33
->
irq
,
dac33_interrupt_handler
,
IRQF_TRIGGER_RISING
,
codec
->
name
,
codec
);
codec
->
component
.
name
,
codec
);
if
(
ret
<
0
)
{
dev_err
(
codec
->
dev
,
"Could not request IRQ%d (%d)
\n
"
,
dac33
->
irq
,
ret
);
...
...
sound/soc/soc-cache.c
View file @
f7acb369
...
...
@@ -78,7 +78,7 @@ int snd_soc_cache_init(struct snd_soc_codec *codec)
mutex_init
(
&
codec
->
cache_rw_mutex
);
dev_dbg
(
codec
->
dev
,
"ASoC: Initializing cache for %s codec
\n
"
,
codec
->
name
);
codec
->
component
.
name
);
if
(
codec_drv
->
reg_cache_default
)
codec
->
reg_cache
=
kmemdup
(
codec_drv
->
reg_cache_default
,
...
...
@@ -98,8 +98,7 @@ int snd_soc_cache_init(struct snd_soc_codec *codec)
int
snd_soc_cache_exit
(
struct
snd_soc_codec
*
codec
)
{
dev_dbg
(
codec
->
dev
,
"ASoC: Destroying cache for %s codec
\n
"
,
codec
->
name
);
codec
->
component
.
name
);
kfree
(
codec
->
reg_cache
);
codec
->
reg_cache
=
NULL
;
return
0
;
...
...
@@ -192,7 +191,7 @@ int snd_soc_cache_sync(struct snd_soc_codec *codec)
return
0
;
dev_dbg
(
codec
->
dev
,
"ASoC: Syncing cache for %s codec
\n
"
,
codec
->
name
);
codec
->
component
.
name
);
trace_snd_soc_cache_sync
(
codec
,
name
,
"start"
);
ret
=
snd_soc_flat_cache_sync
(
codec
);
if
(
!
ret
)
...
...
sound/soc/soc-compress.c
View file @
f7acb369
...
...
@@ -37,7 +37,8 @@ static int soc_compr_open(struct snd_compr_stream *cstream)
if
(
platform
->
driver
->
compr_ops
&&
platform
->
driver
->
compr_ops
->
open
)
{
ret
=
platform
->
driver
->
compr_ops
->
open
(
cstream
);
if
(
ret
<
0
)
{
pr_err
(
"compress asoc: can't open platform %s
\n
"
,
platform
->
name
);
pr_err
(
"compress asoc: can't open platform %s
\n
"
,
platform
->
component
.
name
);
goto
out
;
}
}
...
...
@@ -84,7 +85,8 @@ static int soc_compr_open_fe(struct snd_compr_stream *cstream)
if
(
platform
->
driver
->
compr_ops
&&
platform
->
driver
->
compr_ops
->
open
)
{
ret
=
platform
->
driver
->
compr_ops
->
open
(
cstream
);
if
(
ret
<
0
)
{
pr_err
(
"compress asoc: can't open platform %s
\n
"
,
platform
->
name
);
pr_err
(
"compress asoc: can't open platform %s
\n
"
,
platform
->
component
.
name
);
goto
out
;
}
}
...
...
@@ -680,7 +682,7 @@ int soc_new_compress(struct snd_soc_pcm_runtime *rtd, int num)
ret
=
snd_compress_new
(
rtd
->
card
->
snd_card
,
num
,
direction
,
compr
);
if
(
ret
<
0
)
{
pr_err
(
"compress asoc: can't create compress for codec %s
\n
"
,
codec
->
name
);
codec
->
component
.
name
);
goto
compr_err
;
}
...
...
sound/soc/soc-core.c
View file @
f7acb369
...
...
@@ -270,12 +270,33 @@ static const struct file_operations codec_reg_fops = {
.
llseek
=
default_llseek
,
};
static
struct
dentry
*
soc_debugfs_create_dir
(
struct
dentry
*
parent
,
const
char
*
fmt
,
...)
{
struct
dentry
*
de
;
va_list
ap
;
char
*
s
;
va_start
(
ap
,
fmt
);
s
=
kvasprintf
(
GFP_KERNEL
,
fmt
,
ap
);
va_end
(
ap
);
if
(
!
s
)
return
NULL
;
de
=
debugfs_create_dir
(
s
,
parent
);
kfree
(
s
);
return
de
;
}
static
void
soc_init_codec_debugfs
(
struct
snd_soc_codec
*
codec
)
{
struct
dentry
*
debugfs_card_root
=
codec
->
card
->
debugfs_card_root
;
codec
->
debugfs_codec_root
=
debugfs_create_dir
(
codec
->
name
,
debugfs_card_root
);
codec
->
debugfs_codec_root
=
soc_debugfs_create_dir
(
debugfs_card_root
,
"codec:%s"
,
codec
->
component
.
name
);
if
(
!
codec
->
debugfs_codec_root
)
{
dev_warn
(
codec
->
dev
,
"ASoC: Failed to create codec debugfs directory
\n
"
);
...
...
@@ -306,15 +327,16 @@ static void soc_init_platform_debugfs(struct snd_soc_platform *platform)
{
struct
dentry
*
debugfs_card_root
=
platform
->
card
->
debugfs_card_root
;
platform
->
debugfs_platform_root
=
debugfs_create_dir
(
platform
->
name
,
debugfs_card_root
);
platform
->
debugfs_platform_root
=
soc_debugfs_create_dir
(
debugfs_card_root
,
"platform:%s"
,
platform
->
component
.
name
);
if
(
!
platform
->
debugfs_platform_root
)
{
dev_warn
(
platform
->
dev
,
"ASoC: Failed to create platform debugfs directory
\n
"
);
return
;
}
snd_soc_dapm_debugfs_init
(
&
platform
->
dapm
,
snd_soc_dapm_debugfs_init
(
&
platform
->
component
.
dapm
,
platform
->
debugfs_platform_root
);
}
...
...
@@ -335,7 +357,7 @@ static ssize_t codec_list_read_file(struct file *file, char __user *user_buf,
list_for_each_entry
(
codec
,
&
codec_list
,
list
)
{
len
=
snprintf
(
buf
+
ret
,
PAGE_SIZE
-
ret
,
"%s
\n
"
,
codec
->
name
);
codec
->
component
.
name
);
if
(
len
>=
0
)
ret
+=
len
;
if
(
ret
>
PAGE_SIZE
)
{
...
...
@@ -406,7 +428,7 @@ static ssize_t platform_list_read_file(struct file *file,
list_for_each_entry
(
platform
,
&
platform_list
,
list
)
{
len
=
snprintf
(
buf
+
ret
,
PAGE_SIZE
-
ret
,
"%s
\n
"
,
platform
->
name
);
platform
->
component
.
name
);
if
(
len
>=
0
)
ret
+=
len
;
if
(
ret
>
PAGE_SIZE
)
{
...
...
@@ -528,7 +550,7 @@ static int soc_ac97_dev_register(struct snd_soc_codec *codec)
codec
->
ac97
->
dev
.
release
=
soc_ac97_device_release
;
dev_set_name
(
&
codec
->
ac97
->
dev
,
"%d-%d:%s"
,
codec
->
card
->
snd_card
->
number
,
0
,
codec
->
name
);
codec
->
card
->
snd_card
->
number
,
0
,
codec
->
component
.
name
);
err
=
device_register
(
&
codec
->
ac97
->
dev
);
if
(
err
<
0
)
{
dev_err
(
codec
->
dev
,
"ASoC: Can't register ac97 bus
\n
"
);
...
...
@@ -857,7 +879,7 @@ static struct snd_soc_codec *soc_find_codec(const struct device_node *codec_of_n
if
(
codec
->
dev
->
of_node
!=
codec_of_node
)
continue
;
}
else
{
if
(
strcmp
(
codec
->
name
,
codec_name
))
if
(
strcmp
(
codec
->
component
.
name
,
codec_name
))
continue
;
}
...
...
@@ -945,7 +967,7 @@ static int soc_bind_dai_link(struct snd_soc_card *card, int num)
dai_link
->
platform_of_node
)
continue
;
}
else
{
if
(
strcmp
(
platform
->
name
,
platform_name
))
if
(
strcmp
(
platform
->
component
.
name
,
platform_name
))
continue
;
}
...
...
@@ -974,7 +996,7 @@ static int soc_remove_platform(struct snd_soc_platform *platform)
}
/* Make sure all DAPM widgets are freed */
snd_soc_dapm_free
(
&
platform
->
dapm
);
snd_soc_dapm_free
(
&
platform
->
component
.
dapm
);
soc_cleanup_platform_debugfs
(
platform
);
platform
->
probed
=
0
;
...
...
@@ -1048,12 +1070,9 @@ static void soc_remove_link_dais(struct snd_soc_card *card, int num, int order)
cpu_dai
->
name
,
err
);
}
cpu_dai
->
probed
=
0
;
if
(
!
cpu_dai
->
codec
)
{
snd_soc_dapm_free
(
&
cpu_dai
->
dapm
);
if
(
!
cpu_dai
->
codec
)
module_put
(
cpu_dai
->
dev
->
driver
->
owner
);
}
}
}
static
void
soc_remove_link_components
(
struct
snd_soc_card
*
card
,
int
num
,
...
...
@@ -1108,7 +1127,7 @@ static void soc_remove_dai_links(struct snd_soc_card *card)
}
static
void
soc_set_name_prefix
(
struct
snd_soc_card
*
card
,
struct
snd_soc_co
dec
*
codec
)
struct
snd_soc_co
mponent
*
component
)
{
int
i
;
...
...
@@ -1117,11 +1136,11 @@ static void soc_set_name_prefix(struct snd_soc_card *card,
for
(
i
=
0
;
i
<
card
->
num_configs
;
i
++
)
{
struct
snd_soc_codec_conf
*
map
=
&
card
->
codec_conf
[
i
];
if
(
map
->
of_node
&&
co
dec
->
dev
->
of_node
!=
map
->
of_node
)
if
(
map
->
of_node
&&
co
mponent
->
dev
->
of_node
!=
map
->
of_node
)
continue
;
if
(
map
->
dev_name
&&
strcmp
(
co
dec
->
name
,
map
->
dev_name
))
if
(
map
->
dev_name
&&
strcmp
(
co
mponent
->
name
,
map
->
dev_name
))
continue
;
co
dec
->
name_prefix
=
map
->
name_prefix
;
co
mponent
->
name_prefix
=
map
->
name_prefix
;
break
;
}
}
...
...
@@ -1135,7 +1154,7 @@ static int soc_probe_codec(struct snd_soc_card *card,
codec
->
card
=
card
;
codec
->
dapm
.
card
=
card
;
soc_set_name_prefix
(
card
,
codec
);
soc_set_name_prefix
(
card
,
&
codec
->
component
);
if
(
!
try_module_get
(
codec
->
dev
->
driver
->
owner
))
return
-
ENODEV
;
...
...
@@ -1177,7 +1196,7 @@ static int soc_probe_codec(struct snd_soc_card *card,
WARN
(
codec
->
dapm
.
idle_bias_off
&&
codec
->
dapm
.
bias_level
!=
SND_SOC_BIAS_OFF
,
"codec %s can not start from non-off bias with idle_bias_off==1
\n
"
,
codec
->
name
);
codec
->
component
.
name
);
}
if
(
driver
->
controls
)
...
...
@@ -1210,7 +1229,7 @@ static int soc_probe_platform(struct snd_soc_card *card,
struct
snd_soc_dai
*
dai
;
platform
->
card
=
card
;
platform
->
dapm
.
card
=
card
;
platform
->
component
.
dapm
.
card
=
card
;
if
(
!
try_module_get
(
platform
->
dev
->
driver
->
owner
))
return
-
ENODEV
;
...
...
@@ -1218,7 +1237,7 @@ static int soc_probe_platform(struct snd_soc_card *card,
soc_init_platform_debugfs
(
platform
);
if
(
driver
->
dapm_widgets
)
snd_soc_dapm_new_controls
(
&
platform
->
dapm
,
snd_soc_dapm_new_controls
(
&
platform
->
component
.
dapm
,
driver
->
dapm_widgets
,
driver
->
num_dapm_widgets
);
/* Create DAPM widgets for each DAI stream */
...
...
@@ -1226,10 +1245,11 @@ static int soc_probe_platform(struct snd_soc_card *card,
if
(
component
->
dev
!=
platform
->
dev
)
continue
;
list_for_each_entry
(
dai
,
&
component
->
dai_list
,
list
)
snd_soc_dapm_new_dai_widgets
(
&
platform
->
dapm
,
dai
);
snd_soc_dapm_new_dai_widgets
(
&
platform
->
component
.
dapm
,
dai
);
}
platform
->
dapm
.
idle_bias_off
=
1
;
platform
->
component
.
dapm
.
idle_bias_off
=
1
;
if
(
driver
->
probe
)
{
ret
=
driver
->
probe
(
platform
);
...
...
@@ -1244,13 +1264,13 @@ static int soc_probe_platform(struct snd_soc_card *card,
snd_soc_add_platform_controls
(
platform
,
driver
->
controls
,
driver
->
num_controls
);
if
(
driver
->
dapm_routes
)
snd_soc_dapm_add_routes
(
&
platform
->
dapm
,
driver
->
dapm_routes
,
driver
->
num_dapm_routes
);
snd_soc_dapm_add_routes
(
&
platform
->
component
.
dapm
,
driver
->
dapm_routes
,
driver
->
num_dapm_routes
);
/* mark platform as probed and add to card platform list */
platform
->
probed
=
1
;
list_add
(
&
platform
->
card_list
,
&
card
->
platform_dev_list
);
list_add
(
&
platform
->
dapm
.
list
,
&
card
->
dapm_list
);
list_add
(
&
platform
->
component
.
dapm
.
list
,
&
card
->
dapm_list
);
return
0
;
...
...
@@ -1266,83 +1286,17 @@ static void rtd_release(struct device *dev)
kfree
(
dev
);
}
static
int
soc_aux_dev_init
(
struct
snd_soc_card
*
card
,
struct
snd_soc_codec
*
codec
,
int
num
)
{
struct
snd_soc_aux_dev
*
aux_dev
=
&
card
->
aux_dev
[
num
];
struct
snd_soc_pcm_runtime
*
rtd
=
&
card
->
rtd_aux
[
num
];
int
ret
;
rtd
->
card
=
card
;
/* do machine specific initialization */
if
(
aux_dev
->
init
)
{
ret
=
aux_dev
->
init
(
&
codec
->
dapm
);
if
(
ret
<
0
)
return
ret
;
}
rtd
->
codec
=
codec
;
return
0
;
}
static
int
soc_dai_link_init
(
struct
snd_soc_card
*
card
,
struct
snd_soc_codec
*
codec
,
int
num
)
{
struct
snd_soc_dai_link
*
dai_link
=
&
card
->
dai_link
[
num
];
struct
snd_soc_pcm_runtime
*
rtd
=
&
card
->
rtd
[
num
];
int
ret
;
rtd
->
card
=
card
;
/* do machine specific initialization */
if
(
dai_link
->
init
)
{
ret
=
dai_link
->
init
(
rtd
);
if
(
ret
<
0
)
return
ret
;
}
rtd
->
codec
=
codec
;
return
0
;
}
static
int
soc_post_component_init
(
struct
snd_soc_card
*
card
,
struct
snd_soc_codec
*
codec
,
int
num
,
int
dailess
)
static
int
soc_post_component_init
(
struct
snd_soc_pcm_runtime
*
rtd
,
const
char
*
name
)
{
struct
snd_soc_dai_link
*
dai_link
=
NULL
;
struct
snd_soc_aux_dev
*
aux_dev
=
NULL
;
struct
snd_soc_pcm_runtime
*
rtd
;
const
char
*
name
;
int
ret
=
0
;
if
(
!
dailess
)
{
dai_link
=
&
card
->
dai_link
[
num
];
rtd
=
&
card
->
rtd
[
num
];
name
=
dai_link
->
name
;
ret
=
soc_dai_link_init
(
card
,
codec
,
num
);
}
else
{
aux_dev
=
&
card
->
aux_dev
[
num
];
rtd
=
&
card
->
rtd_aux
[
num
];
name
=
aux_dev
->
name
;
ret
=
soc_aux_dev_init
(
card
,
codec
,
num
);
}
if
(
ret
<
0
)
{
dev_err
(
card
->
dev
,
"ASoC: failed to init %s: %d
\n
"
,
name
,
ret
);
return
ret
;
}
/* register the rtd device */
rtd
->
dev
=
kzalloc
(
sizeof
(
struct
device
),
GFP_KERNEL
);
if
(
!
rtd
->
dev
)
return
-
ENOMEM
;
device_initialize
(
rtd
->
dev
);
rtd
->
dev
->
parent
=
card
->
dev
;
rtd
->
dev
->
parent
=
rtd
->
card
->
dev
;
rtd
->
dev
->
release
=
rtd_release
;
rtd
->
dev
->
init_name
=
name
;
dev_set_drvdata
(
rtd
->
dev
,
rtd
);
...
...
@@ -1355,7 +1309,7 @@ static int soc_post_component_init(struct snd_soc_card *card,
if
(
ret
<
0
)
{
/* calling put_device() here to free the rtd->dev */
put_device
(
rtd
->
dev
);
dev_err
(
card
->
dev
,
dev_err
(
rtd
->
card
->
dev
,
"ASoC: failed to register runtime device: %d
\n
"
,
ret
);
return
ret
;
}
...
...
@@ -1364,26 +1318,15 @@ static int soc_post_component_init(struct snd_soc_card *card,
/* add DAPM sysfs entries for this codec */
ret
=
snd_soc_dapm_sys_add
(
rtd
->
dev
);
if
(
ret
<
0
)
dev_err
(
codec
->
dev
,
dev_err
(
rtd
->
dev
,
"ASoC: failed to add codec dapm sysfs entries: %d
\n
"
,
ret
);
/* add codec sysfs entries */
ret
=
device_create_file
(
rtd
->
dev
,
&
dev_attr_codec_reg
);
if
(
ret
<
0
)
dev_err
(
codec
->
dev
,
dev_err
(
rtd
->
dev
,
"ASoC: failed to add codec sysfs files: %d
\n
"
,
ret
);
#ifdef CONFIG_DEBUG_FS
/* add DPCM sysfs entries */
if
(
!
dailess
&&
!
dai_link
->
dynamic
)
goto
out
;
ret
=
soc_dpcm_debugfs_add
(
rtd
);
if
(
ret
<
0
)
dev_err
(
rtd
->
dev
,
"ASoC: failed to add dpcm sysfs entries: %d
\n
"
,
ret
);
out:
#endif
return
0
;
}
...
...
@@ -1510,11 +1453,8 @@ static int soc_probe_link_dais(struct snd_soc_card *card, int num, int order)
if
(
!
cpu_dai
->
probed
&&
cpu_dai
->
driver
->
probe_order
==
order
)
{
if
(
!
cpu_dai
->
codec
)
{
cpu_dai
->
dapm
.
card
=
card
;
if
(
!
try_module_get
(
cpu_dai
->
dev
->
driver
->
owner
))
return
-
ENODEV
;
list_add
(
&
cpu_dai
->
dapm
.
list
,
&
card
->
dapm_list
);
}
if
(
cpu_dai
->
driver
->
probe
)
{
...
...
@@ -1539,10 +1479,33 @@ static int soc_probe_link_dais(struct snd_soc_card *card, int num, int order)
if
(
order
!=
SND_SOC_COMP_ORDER_LAST
)
return
0
;
ret
=
soc_post_component_init
(
card
,
codec
,
num
,
0
);
/* do machine specific initialization */
if
(
dai_link
->
init
)
{
ret
=
dai_link
->
init
(
rtd
);
if
(
ret
<
0
)
{
dev_err
(
card
->
dev
,
"ASoC: failed to init %s: %d
\n
"
,
dai_link
->
name
,
ret
);
return
ret
;
}
}
ret
=
soc_post_component_init
(
rtd
,
dai_link
->
name
);
if
(
ret
)
return
ret
;
#ifdef CONFIG_DEBUG_FS
/* add DPCM sysfs entries */
if
(
dai_link
->
dynamic
)
{
ret
=
soc_dpcm_debugfs_add
(
rtd
);
if
(
ret
<
0
)
{
dev_err
(
rtd
->
dev
,
"ASoC: failed to add dpcm sysfs entries: %d
\n
"
,
ret
);
return
ret
;
}
}
#endif
ret
=
device_create_file
(
rtd
->
dev
,
&
dev_attr_pmdown_time
);
if
(
ret
<
0
)
dev_warn
(
rtd
->
dev
,
"ASoC: failed to add pmdown_time sysfs: %d
\n
"
,
...
...
@@ -1636,68 +1599,50 @@ static void soc_unregister_ac97_dai_link(struct snd_soc_pcm_runtime *rtd)
}
#endif
static
struct
snd_soc_codec
*
soc_find_matching_codec
(
struct
snd_soc_card
*
card
,
int
num
)
{
struct
snd_soc_aux_dev
*
aux_dev
=
&
card
->
aux_dev
[
num
];
struct
snd_soc_codec
*
codec
;
/* find CODEC from registered CODECs */
list_for_each_entry
(
codec
,
&
codec_list
,
list
)
{
if
(
aux_dev
->
codec_of_node
&&
(
codec
->
dev
->
of_node
!=
aux_dev
->
codec_of_node
))
continue
;
if
(
aux_dev
->
codec_name
&&
strcmp
(
codec
->
name
,
aux_dev
->
codec_name
))
continue
;
return
codec
;
}
return
NULL
;
}
static
int
soc_check_aux_dev
(
struct
snd_soc_card
*
card
,
int
num
)
static
int
soc_bind_aux_dev
(
struct
snd_soc_card
*
card
,
int
num
)
{
struct
snd_soc_pcm_runtime
*
rtd
=
&
card
->
rtd_aux
[
num
];
struct
snd_soc_aux_dev
*
aux_dev
=
&
card
->
aux_dev
[
num
];
const
char
*
codecname
=
aux_dev
->
codec_name
;
struct
snd_soc_codec
*
codec
=
soc_find_matching_codec
(
card
,
num
);
if
(
codec
)
return
0
;
rtd
->
codec
=
soc_find_codec
(
aux_dev
->
codec_of_node
,
codecname
);
if
(
!
rtd
->
codec
)
{
if
(
aux_dev
->
codec_of_node
)
codecname
=
of_node_full_name
(
aux_dev
->
codec_of_node
);
dev_err
(
card
->
dev
,
"ASoC: %s not registered
\n
"
,
codecname
);
return
-
EPROBE_DEFER
;
}
return
0
;
}
static
int
soc_probe_aux_dev
(
struct
snd_soc_card
*
card
,
int
num
)
{
struct
snd_soc_pcm_runtime
*
rtd
=
&
card
->
rtd_aux
[
num
];
struct
snd_soc_aux_dev
*
aux_dev
=
&
card
->
aux_dev
[
num
];
const
char
*
codecname
=
aux_dev
->
codec_name
;
int
ret
=
-
ENODEV
;
struct
snd_soc_codec
*
codec
=
soc_find_matching_codec
(
card
,
num
);
if
(
!
codec
)
{
if
(
aux_dev
->
codec_of_node
)
codecname
=
of_node_full_name
(
aux_dev
->
codec_of_node
);
/* codec not found */
dev_err
(
card
->
dev
,
"ASoC: codec %s not found"
,
codecname
);
return
-
EPROBE_DEFER
;
}
int
ret
;
if
(
codec
->
probed
)
{
dev_err
(
codec
->
dev
,
"ASoC: codec already probed
"
);
if
(
rtd
->
codec
->
probed
)
{
dev_err
(
rtd
->
codec
->
dev
,
"ASoC: codec already probed
\n
"
);
return
-
EBUSY
;
}
ret
=
soc_probe_codec
(
card
,
codec
);
ret
=
soc_probe_codec
(
card
,
rtd
->
codec
);
if
(
ret
<
0
)
return
ret
;
ret
=
soc_post_component_init
(
card
,
codec
,
num
,
1
);
/* do machine specific initialization */
if
(
aux_dev
->
init
)
{
ret
=
aux_dev
->
init
(
&
rtd
->
codec
->
dapm
);
if
(
ret
<
0
)
{
dev_err
(
card
->
dev
,
"ASoC: failed to init %s: %d
\n
"
,
aux_dev
->
name
,
ret
);
return
ret
;
}
}
return
soc_post_component_init
(
rtd
,
aux_dev
->
name
);
}
static
void
soc_remove_aux_dev
(
struct
snd_soc_card
*
card
,
int
num
)
...
...
@@ -1749,9 +1694,9 @@ static int snd_soc_instantiate_card(struct snd_soc_card *card)
goto
base_error
;
}
/*
check
aux_devs too */
/*
bind
aux_devs too */
for
(
i
=
0
;
i
<
card
->
num_aux_devs
;
i
++
)
{
ret
=
soc_
check
_aux_dev
(
card
,
i
);
ret
=
soc_
bind
_aux_dev
(
card
,
i
);
if
(
ret
!=
0
)
goto
base_error
;
}
...
...
@@ -1927,8 +1872,7 @@ static int snd_soc_instantiate_card(struct snd_soc_card *card)
}
if
(
card
->
fully_routed
)
list_for_each_entry
(
codec
,
&
card
->
codec_dev_list
,
card_list
)
snd_soc_dapm_auto_nc_codec_pins
(
codec
);
snd_soc_dapm_auto_nc_pins
(
card
);
snd_soc_dapm_new_widgets
(
card
);
...
...
@@ -2403,7 +2347,7 @@ int snd_soc_add_codec_controls(struct snd_soc_codec *codec,
struct
snd_card
*
card
=
codec
->
card
->
snd_card
;
return
snd_soc_add_controls
(
card
,
codec
->
dev
,
controls
,
num_controls
,
codec
->
name_prefix
,
&
codec
->
component
);
codec
->
component
.
name_prefix
,
&
codec
->
component
);
}
EXPORT_SYMBOL_GPL
(
snd_soc_add_codec_controls
);
...
...
@@ -3797,8 +3741,13 @@ int snd_soc_register_card(struct snd_soc_card *card)
card
->
num_rtd
=
0
;
card
->
rtd_aux
=
&
card
->
rtd
[
card
->
num_links
];
for
(
i
=
0
;
i
<
card
->
num_links
;
i
++
)
for
(
i
=
0
;
i
<
card
->
num_links
;
i
++
)
{
card
->
rtd
[
i
].
card
=
card
;
card
->
rtd
[
i
].
dai_link
=
&
card
->
dai_link
[
i
];
}
for
(
i
=
0
;
i
<
card
->
num_aux_devs
;
i
++
)
card
->
rtd_aux
[
i
].
card
=
card
;
INIT_LIST_HEAD
(
&
card
->
dapm_dirty
);
card
->
instantiated
=
0
;
...
...
@@ -3921,16 +3870,14 @@ static void snd_soc_unregister_dais(struct snd_soc_component *component)
* snd_soc_register_dais - Register a DAI with the ASoC core
*
* @component: The component the DAIs are registered for
* @codec: The CODEC that the DAIs are registered for, NULL if the component is
* not a CODEC.
* @dai_drv: DAI driver to use for the DAIs
* @count: Number of DAIs
* @legacy_dai_naming: Use the legacy naming scheme and let the DAI inherit the
* parent's name.
*/
static
int
snd_soc_register_dais
(
struct
snd_soc_component
*
component
,
struct
snd_soc_
codec
*
codec
,
struct
snd_soc_dai_driver
*
dai_drv
,
size_t
count
,
bool
legacy_dai_naming
)
struct
snd_soc_
dai_driver
*
dai_drv
,
size_t
count
,
bool
legacy_dai_naming
)
{
struct
device
*
dev
=
component
->
dev
;
struct
snd_soc_dai
*
dai
;
...
...
@@ -3939,6 +3886,9 @@ static int snd_soc_register_dais(struct snd_soc_component *component,
dev_dbg
(
dev
,
"ASoC: dai register %s #%Zu
\n
"
,
dev_name
(
dev
),
count
);
component
->
dai_drv
=
dai_drv
;
component
->
num_dai
=
count
;
for
(
i
=
0
;
i
<
count
;
i
++
)
{
dai
=
kzalloc
(
sizeof
(
struct
snd_soc_dai
),
GFP_KERNEL
);
...
...
@@ -3971,16 +3921,11 @@ static int snd_soc_register_dais(struct snd_soc_component *component,
}
dai
->
component
=
component
;
dai
->
codec
=
codec
;
dai
->
dev
=
dev
;
dai
->
driver
=
&
dai_drv
[
i
];
dai
->
dapm
.
dev
=
dev
;
if
(
!
dai
->
driver
->
ops
)
dai
->
driver
->
ops
=
&
null_dai_ops
;
if
(
!
dai
->
codec
)
dai
->
dapm
.
idle_bias_off
=
1
;
list_add
(
&
dai
->
list
,
&
component
->
dai_list
);
dev_dbg
(
dev
,
"ASoC: Registered DAI '%s'
\n
"
,
dai
->
name
);
...
...
@@ -3994,60 +3939,82 @@ static int snd_soc_register_dais(struct snd_soc_component *component,
return
ret
;
}
/**
* snd_soc_register_component - Register a component with the ASoC core
*
*/
static
int
__snd_soc_register_component
(
struct
device
*
dev
,
struct
snd_soc_component
*
cmpnt
,
const
struct
snd_soc_component_driver
*
cmpnt_drv
,
struct
snd_soc_codec
*
codec
,
struct
snd_soc_dai_driver
*
dai_drv
,
int
num_dai
,
bool
allow_single_dai
)
static
void
snd_soc_component_seq_notifier
(
struct
snd_soc_dapm_context
*
dapm
,
enum
snd_soc_dapm_type
type
,
int
subseq
)
{
int
re
t
;
struct
snd_soc_component
*
component
=
dapm
->
componen
t
;
dev_dbg
(
dev
,
"component register %s
\n
"
,
dev_name
(
dev
));
component
->
driver
->
seq_notifier
(
component
,
type
,
subseq
);
}
if
(
!
cmpnt
)
{
dev_err
(
dev
,
"ASoC: Failed to connecting component
\n
"
);
return
-
ENOMEM
;
}
static
int
snd_soc_component_stream_event
(
struct
snd_soc_dapm_context
*
dapm
,
int
event
)
{
struct
snd_soc_component
*
component
=
dapm
->
component
;
return
component
->
driver
->
stream_event
(
component
,
event
);
}
mutex_init
(
&
cmpnt
->
io_mutex
);
static
int
snd_soc_component_initialize
(
struct
snd_soc_component
*
component
,
const
struct
snd_soc_component_driver
*
driver
,
struct
device
*
dev
)
{
struct
snd_soc_dapm_context
*
dapm
;
c
mpnt
->
name
=
fmt_single_name
(
dev
,
&
cmp
nt
->
id
);
if
(
!
c
mp
nt
->
name
)
{
dev_err
(
dev
,
"ASoC: Failed to
simplifying
name
\n
"
);
c
omponent
->
name
=
fmt_single_name
(
dev
,
&
compone
nt
->
id
);
if
(
!
c
ompone
nt
->
name
)
{
dev_err
(
dev
,
"ASoC: Failed to
allocate
name
\n
"
);
return
-
ENOMEM
;
}
cmpnt
->
dev
=
dev
;
cmpnt
->
driver
=
cmpnt_drv
;
cmpnt
->
dai_drv
=
dai_drv
;
cmpnt
->
num_dai
=
num_dai
;
INIT_LIST_HEAD
(
&
cmpnt
->
dai_list
);
component
->
dev
=
dev
;
component
->
driver
=
driver
;
ret
=
snd_soc_register_dais
(
cmpnt
,
codec
,
dai_drv
,
num_dai
,
allow_single_dai
);
if
(
ret
<
0
)
{
dev_err
(
dev
,
"ASoC: Failed to regster DAIs: %d
\n
"
,
ret
);
goto
error_component_name
;
}
if
(
!
component
->
dapm_ptr
)
component
->
dapm_ptr
=
&
component
->
dapm
;
dapm
=
component
->
dapm_ptr
;
dapm
->
dev
=
dev
;
dapm
->
component
=
component
;
dapm
->
bias_level
=
SND_SOC_BIAS_OFF
;
if
(
driver
->
seq_notifier
)
dapm
->
seq_notifier
=
snd_soc_component_seq_notifier
;
if
(
driver
->
stream_event
)
dapm
->
stream_event
=
snd_soc_component_stream_event
;
INIT_LIST_HEAD
(
&
component
->
dai_list
);
mutex_init
(
&
component
->
io_mutex
);
return
0
;
}
static
void
snd_soc_component_add_unlocked
(
struct
snd_soc_component
*
component
)
{
list_add
(
&
component
->
list
,
&
component_list
);
}
static
void
snd_soc_component_add
(
struct
snd_soc_component
*
component
)
{
mutex_lock
(
&
client_mutex
);
list_add
(
&
cmpnt
->
list
,
&
component_lis
t
);
snd_soc_component_add_unlocked
(
componen
t
);
mutex_unlock
(
&
client_mutex
);
}
dev_dbg
(
cmpnt
->
dev
,
"ASoC: Registered component '%s'
\n
"
,
cmpnt
->
name
);
return
ret
;
static
void
snd_soc_component_cleanup
(
struct
snd_soc_component
*
component
)
{
snd_soc_unregister_dais
(
component
);
kfree
(
component
->
name
);
}
error_component_name:
kfree
(
cmpnt
->
name
);
static
void
snd_soc_component_del_unlocked
(
struct
snd_soc_component
*
component
)
{
list_del
(
&
component
->
list
);
}
return
ret
;
static
void
snd_soc_component_del
(
struct
snd_soc_component
*
component
)
{
mutex_lock
(
&
client_mutex
);
snd_soc_component_del_unlocked
(
component
);
mutex_unlock
(
&
client_mutex
);
}
int
snd_soc_register_component
(
struct
device
*
dev
,
...
...
@@ -4056,32 +4023,38 @@ int snd_soc_register_component(struct device *dev,
int
num_dai
)
{
struct
snd_soc_component
*
cmpnt
;
int
ret
;
cmpnt
=
devm_kzalloc
(
dev
,
sizeof
(
*
cmpnt
),
GFP_KERNEL
);
cmpnt
=
kzalloc
(
sizeof
(
*
cmpnt
),
GFP_KERNEL
);
if
(
!
cmpnt
)
{
dev_err
(
dev
,
"ASoC: Failed to allocate memory
\n
"
);
return
-
ENOMEM
;
}
ret
=
snd_soc_component_initialize
(
cmpnt
,
cmpnt_drv
,
dev
);
if
(
ret
)
goto
err_free
;
cmpnt
->
ignore_pmdown_time
=
true
;
cmpnt
->
registered_as_component
=
true
;
return
__snd_soc_register_component
(
dev
,
cmpnt
,
cmpnt_drv
,
NULL
,
dai_drv
,
num_dai
,
true
);
}
EXPORT_SYMBOL_GPL
(
snd_soc_register_component
);
ret
=
snd_soc_register_dais
(
cmpnt
,
dai_drv
,
num_dai
,
true
);
if
(
ret
<
0
)
{
dev_err
(
dev
,
"ASoC: Failed to regster DAIs: %d
\n
"
,
ret
);
goto
err_cleanup
;
}
static
void
__snd_soc_unregister_component
(
struct
snd_soc_component
*
cmpnt
)
{
snd_soc_unregister_dais
(
cmpnt
);
snd_soc_component_add
(
cmpnt
);
mutex_lock
(
&
client_mutex
);
list_del
(
&
cmpnt
->
list
);
mutex_unlock
(
&
client_mutex
);
return
0
;
dev_dbg
(
cmpnt
->
dev
,
"ASoC: Unregistered component '%s'
\n
"
,
cmpnt
->
name
);
kfree
(
cmpnt
->
name
);
err_cleanup:
snd_soc_component_cleanup
(
cmpnt
);
err_free:
kfree
(
cmpnt
);
return
ret
;
}
EXPORT_SYMBOL_GPL
(
snd_soc_register_component
);
/**
* snd_soc_unregister_component - Unregister a component from the ASoC core
...
...
@@ -4098,7 +4071,9 @@ void snd_soc_unregister_component(struct device *dev)
return
;
found:
__snd_soc_unregister_component
(
cmpnt
);
snd_soc_component_del
(
cmpnt
);
snd_soc_component_cleanup
(
cmpnt
);
kfree
(
cmpnt
);
}
EXPORT_SYMBOL_GPL
(
snd_soc_unregister_component
);
...
...
@@ -4131,37 +4106,25 @@ int snd_soc_add_platform(struct device *dev, struct snd_soc_platform *platform,
{
int
ret
;
/* create platform component name */
platform
->
name
=
fmt_single_name
(
dev
,
&
platform
->
id
);
if
(
platform
->
name
==
NULL
)
return
-
ENOMEM
;
ret
=
snd_soc_component_initialize
(
&
platform
->
component
,
&
platform_drv
->
component_driver
,
dev
);
if
(
ret
)
return
ret
;
platform
->
dev
=
dev
;
platform
->
driver
=
platform_drv
;
platform
->
dapm
.
dev
=
dev
;
platform
->
dapm
.
platform
=
platform
;
platform
->
dapm
.
component
=
&
platform
->
component
;
platform
->
dapm
.
stream_event
=
platform_drv
->
stream_event
;
if
(
platform_drv
->
write
)
platform
->
component
.
write
=
snd_soc_platform_drv_write
;
if
(
platform_drv
->
read
)
platform
->
component
.
read
=
snd_soc_platform_drv_read
;
/* register component */
ret
=
__snd_soc_register_component
(
dev
,
&
platform
->
component
,
&
platform_drv
->
component_driver
,
NULL
,
NULL
,
0
,
false
);
if
(
ret
<
0
)
{
dev_err
(
platform
->
component
.
dev
,
"ASoC: Failed to register component: %d
\n
"
,
ret
);
return
ret
;
}
mutex_lock
(
&
client_mutex
);
snd_soc_component_add_unlocked
(
&
platform
->
component
);
list_add
(
&
platform
->
list
,
&
platform_list
);
mutex_unlock
(
&
client_mutex
);
dev_dbg
(
dev
,
"ASoC: Registered platform '%s'
\n
"
,
platform
->
name
);
dev_dbg
(
dev
,
"ASoC: Registered platform '%s'
\n
"
,
platform
->
component
.
name
);
return
0
;
}
...
...
@@ -4198,15 +4161,16 @@ EXPORT_SYMBOL_GPL(snd_soc_register_platform);
*/
void
snd_soc_remove_platform
(
struct
snd_soc_platform
*
platform
)
{
__snd_soc_unregister_component
(
&
platform
->
component
);
mutex_lock
(
&
client_mutex
);
list_del
(
&
platform
->
list
);
snd_soc_component_del_unlocked
(
&
platform
->
component
);
mutex_unlock
(
&
client_mutex
);
snd_soc_component_cleanup
(
&
platform
->
component
);
dev_dbg
(
platform
->
dev
,
"ASoC: Unregistered platform '%s'
\n
"
,
platform
->
name
);
kfree
(
platform
->
name
);
platform
->
component
.
name
);
}
EXPORT_SYMBOL_GPL
(
snd_soc_remove_platform
);
...
...
@@ -4292,6 +4256,14 @@ static int snd_soc_codec_drv_read(struct snd_soc_component *component,
return
0
;
}
static
int
snd_soc_codec_set_bias_level
(
struct
snd_soc_dapm_context
*
dapm
,
enum
snd_soc_bias_level
level
)
{
struct
snd_soc_codec
*
codec
=
snd_soc_dapm_to_codec
(
dapm
);
return
codec
->
driver
->
set_bias_level
(
codec
,
level
);
}
/**
* snd_soc_register_codec - Register a codec with the ASoC core
*
...
...
@@ -4303,6 +4275,7 @@ int snd_soc_register_codec(struct device *dev,
int
num_dai
)
{
struct
snd_soc_codec
*
codec
;
struct
snd_soc_dai
*
dai
;
struct
regmap
*
regmap
;
int
ret
,
i
;
...
...
@@ -4312,24 +4285,23 @@ int snd_soc_register_codec(struct device *dev,
if
(
codec
==
NULL
)
return
-
ENOMEM
;
/* create CODEC component name */
codec
->
name
=
fmt_single_name
(
dev
,
&
codec
->
id
);
if
(
codec
->
name
==
NULL
)
{
ret
=
-
ENOMEM
;
goto
fail_codec
;
}
codec
->
component
.
dapm_ptr
=
&
codec
->
dapm
;
ret
=
snd_soc_component_initialize
(
&
codec
->
component
,
&
codec_drv
->
component_driver
,
dev
)
;
if
(
ret
)
goto
err_free
;
if
(
codec_drv
->
write
)
codec
->
component
.
write
=
snd_soc_codec_drv_write
;
if
(
codec_drv
->
read
)
codec
->
component
.
read
=
snd_soc_codec_drv_read
;
codec
->
component
.
ignore_pmdown_time
=
codec_drv
->
ignore_pmdown_time
;
codec
->
dapm
.
bias_level
=
SND_SOC_BIAS_OFF
;
codec
->
dapm
.
dev
=
dev
;
codec
->
dapm
.
codec
=
codec
;
codec
->
dapm
.
component
=
&
codec
->
component
;
if
(
codec_drv
->
seq_notifier
)
codec
->
dapm
.
seq_notifier
=
codec_drv
->
seq_notifier
;
codec
->
dapm
.
stream_event
=
codec_drv
->
stream_event
;
if
(
codec_drv
->
set_bias_level
)
codec
->
dapm
.
set_bias_level
=
snd_soc_codec_set_bias_level
;
codec
->
dev
=
dev
;
codec
->
driver
=
codec_drv
;
codec
->
component
.
val_bytes
=
codec_drv
->
reg_word_size
;
...
...
@@ -4348,7 +4320,7 @@ int snd_soc_register_codec(struct device *dev,
dev_err
(
codec
->
dev
,
"Failed to set cache I/O:%d
\n
"
,
ret
);
return
ret
;
goto
err_cleanup
;
}
}
}
...
...
@@ -4358,29 +4330,27 @@ int snd_soc_register_codec(struct device *dev,
fixup_codec_formats
(
&
dai_drv
[
i
].
capture
);
}
mutex_lock
(
&
client_mutex
);
list_add
(
&
codec
->
list
,
&
codec_list
);
mutex_unlock
(
&
client_mutex
);
/* register component */
ret
=
__snd_soc_register_component
(
dev
,
&
codec
->
component
,
&
codec_drv
->
component_driver
,
codec
,
dai_drv
,
num_dai
,
false
);
ret
=
snd_soc_register_dais
(
&
codec
->
component
,
dai_drv
,
num_dai
,
false
);
if
(
ret
<
0
)
{
dev_err
(
codec
->
dev
,
"ASoC: Failed to regster component
: %d
\n
"
,
ret
);
goto
fail_codec_name
;
dev_err
(
dev
,
"ASoC: Failed to regster DAIs
: %d
\n
"
,
ret
);
goto
err_cleanup
;
}
dev_dbg
(
codec
->
dev
,
"ASoC: Registered codec '%s'
\n
"
,
codec
->
name
);
return
0
;
list_for_each_entry
(
dai
,
&
codec
->
component
.
dai_list
,
list
)
dai
->
codec
=
codec
;
fail_codec_name:
mutex_lock
(
&
client_mutex
);
list_del
(
&
codec
->
list
);
snd_soc_component_add_unlocked
(
&
codec
->
component
);
list_add
(
&
codec
->
list
,
&
codec_list
);
mutex_unlock
(
&
client_mutex
);
kfree
(
codec
->
name
);
fail_codec:
dev_dbg
(
codec
->
dev
,
"ASoC: Registered codec '%s'
\n
"
,
codec
->
component
.
name
);
return
0
;
err_cleanup:
snd_soc_component_cleanup
(
&
codec
->
component
);
err_free:
kfree
(
codec
);
return
ret
;
}
...
...
@@ -4402,16 +4372,17 @@ void snd_soc_unregister_codec(struct device *dev)
return
;
found:
__snd_soc_unregister_component
(
&
codec
->
component
);
mutex_lock
(
&
client_mutex
);
list_del
(
&
codec
->
list
);
snd_soc_component_del_unlocked
(
&
codec
->
component
);
mutex_unlock
(
&
client_mutex
);
dev_dbg
(
codec
->
dev
,
"ASoC: Unregistered codec '%s'
\n
"
,
codec
->
name
);
dev_dbg
(
codec
->
dev
,
"ASoC: Unregistered codec '%s'
\n
"
,
codec
->
component
.
name
);
snd_soc_component_cleanup
(
&
codec
->
component
);
snd_soc_cache_exit
(
codec
);
kfree
(
codec
->
name
);
kfree
(
codec
);
}
EXPORT_SYMBOL_GPL
(
snd_soc_unregister_codec
);
...
...
sound/soc/soc-dapm.c
View file @
f7acb369
...
...
@@ -349,13 +349,28 @@ static bool dapm_kcontrol_set_value(const struct snd_kcontrol *kcontrol,
return
true
;
}
/**
* snd_soc_dapm_kcontrol_dapm() - Returns the dapm context associated to a
* kcontrol
* @kcontrol: The kcontrol
*
* Note: This function must only be used on kcontrols that are known to have
* been registered for a CODEC. Otherwise the behaviour is undefined.
*/
struct
snd_soc_dapm_context
*
snd_soc_dapm_kcontrol_dapm
(
struct
snd_kcontrol
*
kcontrol
)
{
return
dapm_kcontrol_get_wlist
(
kcontrol
)
->
widgets
[
0
]
->
dapm
;
}
EXPORT_SYMBOL_GPL
(
snd_soc_dapm_kcontrol_dapm
);
/**
* snd_soc_dapm_kcontrol_codec() - Returns the codec associated to a kcontrol
* @kcontrol: The kcontrol
*/
struct
snd_soc_codec
*
snd_soc_dapm_kcontrol_codec
(
struct
snd_kcontrol
*
kcontrol
)
{
return
dapm_kcontrol_get_wlist
(
kcontrol
)
->
widgets
[
0
]
->
codec
;
return
snd_soc_dapm_to_codec
(
snd_soc_dapm_kcontrol_dapm
(
kcontrol
))
;
}
EXPORT_SYMBOL_GPL
(
snd_soc_dapm_kcontrol_codec
);
...
...
@@ -375,23 +390,38 @@ static void dapm_reset(struct snd_soc_card *card)
}
}
static
int
soc_widget_read
(
struct
snd_soc_dapm_widget
*
w
,
int
reg
,
static
const
char
*
soc_dapm_prefix
(
struct
snd_soc_dapm_context
*
dapm
)
{
if
(
!
dapm
->
component
)
return
NULL
;
return
dapm
->
component
->
name_prefix
;
}
static
int
soc_dapm_read
(
struct
snd_soc_dapm_context
*
dapm
,
int
reg
,
unsigned
int
*
value
)
{
if
(
!
w
->
dapm
->
component
)
if
(
!
dapm
->
component
)
return
-
EIO
;
return
snd_soc_component_read
(
w
->
dapm
->
component
,
reg
,
value
);
return
snd_soc_component_read
(
dapm
->
component
,
reg
,
value
);
}
static
int
soc_
widget_update_bits
(
struct
snd_soc_dapm_widget
*
w
,
static
int
soc_
dapm_update_bits
(
struct
snd_soc_dapm_context
*
dapm
,
int
reg
,
unsigned
int
mask
,
unsigned
int
value
)
{
if
(
!
w
->
dapm
->
component
)
if
(
!
dapm
->
component
)
return
-
EIO
;
return
snd_soc_component_update_bits_async
(
w
->
dapm
->
component
,
reg
,
return
snd_soc_component_update_bits_async
(
dapm
->
component
,
reg
,
mask
,
value
);
}
static
int
soc_dapm_test_bits
(
struct
snd_soc_dapm_context
*
dapm
,
int
reg
,
unsigned
int
mask
,
unsigned
int
value
)
{
if
(
!
dapm
->
component
)
return
-
EIO
;
return
snd_soc_component_test_bits
(
dapm
->
component
,
reg
,
mask
,
value
);
}
static
void
soc_dapm_async_complete
(
struct
snd_soc_dapm_context
*
dapm
)
{
if
(
dapm
->
component
)
...
...
@@ -420,15 +450,10 @@ static int snd_soc_dapm_set_bias_level(struct snd_soc_dapm_context *dapm,
if
(
ret
!=
0
)
goto
out
;
if
(
dapm
->
codec
)
{
if
(
dapm
->
codec
->
driver
->
set_bias_level
)
ret
=
dapm
->
codec
->
driver
->
set_bias_level
(
dapm
->
codec
,
level
);
else
dapm
->
bias_level
=
level
;
}
else
if
(
!
card
||
dapm
!=
&
card
->
dapm
)
{
if
(
dapm
->
set_bias_level
)
ret
=
dapm
->
set_bias_level
(
dapm
,
level
);
else
if
(
!
card
||
dapm
!=
&
card
->
dapm
)
dapm
->
bias_level
=
level
;
}
if
(
ret
!=
0
)
goto
out
;
...
...
@@ -452,7 +477,7 @@ static int dapm_connect_mux(struct snd_soc_dapm_context *dapm,
int
i
;
if
(
e
->
reg
!=
SND_SOC_NOPM
)
{
soc_
widget_read
(
dest
,
e
->
reg
,
&
val
);
soc_
dapm_read
(
dapm
,
e
->
reg
,
&
val
);
val
=
(
val
>>
e
->
shift_l
)
&
e
->
mask
;
item
=
snd_soc_enum_val_to_item
(
e
,
val
);
}
else
{
...
...
@@ -496,7 +521,7 @@ static void dapm_set_mixer_path_status(struct snd_soc_dapm_widget *w,
unsigned
int
val
;
if
(
reg
!=
SND_SOC_NOPM
)
{
soc_
widget_read
(
w
,
reg
,
&
val
);
soc_
dapm_read
(
w
->
dapm
,
reg
,
&
val
);
val
=
(
val
>>
shift
)
&
mask
;
if
(
invert
)
val
=
max
-
val
;
...
...
@@ -570,11 +595,7 @@ static int dapm_create_or_share_mixmux_kcontrol(struct snd_soc_dapm_widget *w,
const
char
*
name
;
int
ret
;
if
(
dapm
->
codec
)
prefix
=
dapm
->
codec
->
name_prefix
;
else
prefix
=
NULL
;
prefix
=
soc_dapm_prefix
(
dapm
);
if
(
prefix
)
prefix_len
=
strlen
(
prefix
)
+
1
;
else
...
...
@@ -1308,16 +1329,18 @@ static void dapm_seq_check_event(struct snd_soc_card *card,
static
void
dapm_seq_run_coalesced
(
struct
snd_soc_card
*
card
,
struct
list_head
*
pending
)
{
struct
snd_soc_dapm_context
*
dapm
;
struct
snd_soc_dapm_widget
*
w
;
int
reg
;
unsigned
int
value
=
0
;
unsigned
int
mask
=
0
;
reg
=
list_first_entry
(
pending
,
struct
snd_soc_dapm_widget
,
power_list
)
->
reg
;
w
=
list_first_entry
(
pending
,
struct
snd_soc_dapm_widget
,
power_list
);
reg
=
w
->
reg
;
dapm
=
w
->
dapm
;
list_for_each_entry
(
w
,
pending
,
power_list
)
{
WARN_ON
(
reg
!=
w
->
reg
);
WARN_ON
(
reg
!=
w
->
reg
||
dapm
!=
w
->
dapm
);
w
->
power
=
w
->
new_power
;
mask
|=
w
->
mask
<<
w
->
shift
;
...
...
@@ -1326,7 +1349,7 @@ static void dapm_seq_run_coalesced(struct snd_soc_card *card,
else
value
|=
w
->
off_val
<<
w
->
shift
;
pop_dbg
(
w
->
dapm
->
dev
,
card
->
pop_time
,
pop_dbg
(
dapm
->
dev
,
card
->
pop_time
,
"pop test : Queue %s: reg=0x%x, 0x%x/0x%x
\n
"
,
w
->
name
,
reg
,
value
,
mask
);
...
...
@@ -1339,14 +1362,12 @@ static void dapm_seq_run_coalesced(struct snd_soc_card *card,
/* Any widget will do, they should all be updating the
* same register.
*/
w
=
list_first_entry
(
pending
,
struct
snd_soc_dapm_widget
,
power_list
);
pop_dbg
(
w
->
dapm
->
dev
,
card
->
pop_time
,
pop_dbg
(
dapm
->
dev
,
card
->
pop_time
,
"pop test : Applying 0x%x/0x%x to %x in %dms
\n
"
,
value
,
mask
,
reg
,
card
->
pop_time
);
pop_wait
(
card
->
pop_time
);
soc_
widget_update_bits
(
w
,
reg
,
mask
,
value
);
soc_
dapm_update_bits
(
dapm
,
reg
,
mask
,
value
);
}
list_for_each_entry
(
w
,
pending
,
power_list
)
{
...
...
@@ -1492,7 +1513,8 @@ static void dapm_widget_update(struct snd_soc_card *card)
if
(
!
w
)
return
;
ret
=
soc_widget_update_bits
(
w
,
update
->
reg
,
update
->
mask
,
update
->
val
);
ret
=
soc_dapm_update_bits
(
w
->
dapm
,
update
->
reg
,
update
->
mask
,
update
->
val
);
if
(
ret
<
0
)
dev_err
(
w
->
dapm
->
dev
,
"ASoC: %s DAPM update failed: %d
\n
"
,
w
->
name
,
ret
);
...
...
@@ -2371,14 +2393,16 @@ static int snd_soc_dapm_add_route(struct snd_soc_dapm_context *dapm,
const
char
*
source
;
char
prefixed_sink
[
80
];
char
prefixed_source
[
80
];
const
char
*
prefix
;
int
ret
;
if
(
dapm
->
codec
&&
dapm
->
codec
->
name_prefix
)
{
prefix
=
soc_dapm_prefix
(
dapm
);
if
(
prefix
)
{
snprintf
(
prefixed_sink
,
sizeof
(
prefixed_sink
),
"%s %s"
,
dapm
->
codec
->
name_
prefix
,
route
->
sink
);
prefix
,
route
->
sink
);
sink
=
prefixed_sink
;
snprintf
(
prefixed_source
,
sizeof
(
prefixed_source
),
"%s %s"
,
dapm
->
codec
->
name_
prefix
,
route
->
source
);
prefix
,
route
->
source
);
source
=
prefixed_source
;
}
else
{
sink
=
route
->
sink
;
...
...
@@ -2439,6 +2463,7 @@ static int snd_soc_dapm_del_route(struct snd_soc_dapm_context *dapm,
const
char
*
source
;
char
prefixed_sink
[
80
];
char
prefixed_source
[
80
];
const
char
*
prefix
;
if
(
route
->
control
)
{
dev_err
(
dapm
->
dev
,
...
...
@@ -2446,12 +2471,13 @@ static int snd_soc_dapm_del_route(struct snd_soc_dapm_context *dapm,
return
-
EINVAL
;
}
if
(
dapm
->
codec
&&
dapm
->
codec
->
name_prefix
)
{
prefix
=
soc_dapm_prefix
(
dapm
);
if
(
prefix
)
{
snprintf
(
prefixed_sink
,
sizeof
(
prefixed_sink
),
"%s %s"
,
dapm
->
codec
->
name_
prefix
,
route
->
sink
);
prefix
,
route
->
sink
);
sink
=
prefixed_sink
;
snprintf
(
prefixed_source
,
sizeof
(
prefixed_source
),
"%s %s"
,
dapm
->
codec
->
name_
prefix
,
route
->
source
);
prefix
,
route
->
source
);
source
=
prefixed_source
;
}
else
{
sink
=
route
->
sink
;
...
...
@@ -2670,7 +2696,7 @@ int snd_soc_dapm_new_widgets(struct snd_soc_card *card)
/* Read the initial power state from the device */
if
(
w
->
reg
>=
0
)
{
soc_
widget_read
(
w
,
w
->
reg
,
&
val
);
soc_
dapm_read
(
w
->
dapm
,
w
->
reg
,
&
val
);
val
=
val
>>
w
->
shift
;
val
&=
w
->
mask
;
if
(
val
==
w
->
on_val
)
...
...
@@ -2701,8 +2727,8 @@ EXPORT_SYMBOL_GPL(snd_soc_dapm_new_widgets);
int
snd_soc_dapm_get_volsw
(
struct
snd_kcontrol
*
kcontrol
,
struct
snd_ctl_elem_value
*
ucontrol
)
{
struct
snd_soc_
codec
*
codec
=
snd_soc_dapm_kcontrol_codec
(
kcontrol
);
struct
snd_soc_card
*
card
=
codec
->
card
;
struct
snd_soc_
dapm_context
*
dapm
=
snd_soc_dapm_kcontrol_dapm
(
kcontrol
);
struct
snd_soc_card
*
card
=
dapm
->
card
;
struct
soc_mixer_control
*
mc
=
(
struct
soc_mixer_control
*
)
kcontrol
->
private_value
;
int
reg
=
mc
->
reg
;
...
...
@@ -2711,17 +2737,20 @@ int snd_soc_dapm_get_volsw(struct snd_kcontrol *kcontrol,
unsigned
int
mask
=
(
1
<<
fls
(
max
))
-
1
;
unsigned
int
invert
=
mc
->
invert
;
unsigned
int
val
;
int
ret
=
0
;
if
(
snd_soc_volsw_is_stereo
(
mc
))
dev_warn
(
codec
->
dapm
.
dev
,
dev_warn
(
dapm
->
dev
,
"ASoC: Control '%s' is stereo, which is not supported
\n
"
,
kcontrol
->
id
.
name
);
mutex_lock_nested
(
&
card
->
dapm_mutex
,
SND_SOC_DAPM_CLASS_RUNTIME
);
if
(
dapm_kcontrol_is_powered
(
kcontrol
)
&&
reg
!=
SND_SOC_NOPM
)
val
=
(
snd_soc_read
(
codec
,
reg
)
>>
shift
)
&
mask
;
else
if
(
dapm_kcontrol_is_powered
(
kcontrol
)
&&
reg
!=
SND_SOC_NOPM
)
{
ret
=
soc_dapm_read
(
dapm
,
reg
,
&
val
);
val
=
(
val
>>
shift
)
&
mask
;
}
else
{
val
=
dapm_kcontrol_get_value
(
kcontrol
);
}
mutex_unlock
(
&
card
->
dapm_mutex
);
if
(
invert
)
...
...
@@ -2729,7 +2758,7 @@ int snd_soc_dapm_get_volsw(struct snd_kcontrol *kcontrol,
else
ucontrol
->
value
.
integer
.
value
[
0
]
=
val
;
return
0
;
return
ret
;
}
EXPORT_SYMBOL_GPL
(
snd_soc_dapm_get_volsw
);
...
...
@@ -2745,8 +2774,8 @@ EXPORT_SYMBOL_GPL(snd_soc_dapm_get_volsw);
int
snd_soc_dapm_put_volsw
(
struct
snd_kcontrol
*
kcontrol
,
struct
snd_ctl_elem_value
*
ucontrol
)
{
struct
snd_soc_
codec
*
codec
=
snd_soc_dapm_kcontrol_codec
(
kcontrol
);
struct
snd_soc_card
*
card
=
codec
->
card
;
struct
snd_soc_
dapm_context
*
dapm
=
snd_soc_dapm_kcontrol_dapm
(
kcontrol
);
struct
snd_soc_card
*
card
=
dapm
->
card
;
struct
soc_mixer_control
*
mc
=
(
struct
soc_mixer_control
*
)
kcontrol
->
private_value
;
int
reg
=
mc
->
reg
;
...
...
@@ -2755,12 +2784,12 @@ int snd_soc_dapm_put_volsw(struct snd_kcontrol *kcontrol,
unsigned
int
mask
=
(
1
<<
fls
(
max
))
-
1
;
unsigned
int
invert
=
mc
->
invert
;
unsigned
int
val
;
int
connect
,
change
;
int
connect
,
change
,
reg_change
=
0
;
struct
snd_soc_dapm_update
update
;
int
ret
=
0
;
if
(
snd_soc_volsw_is_stereo
(
mc
))
dev_warn
(
codec
->
dapm
.
dev
,
dev_warn
(
dapm
->
dev
,
"ASoC: Control '%s' is stereo, which is not supported
\n
"
,
kcontrol
->
id
.
name
);
...
...
@@ -2773,20 +2802,23 @@ int snd_soc_dapm_put_volsw(struct snd_kcontrol *kcontrol,
mutex_lock_nested
(
&
card
->
dapm_mutex
,
SND_SOC_DAPM_CLASS_RUNTIME
);
change
=
dapm_kcontrol_set_value
(
kcontrol
,
val
);
if
(
change
)
{
if
(
reg
!=
SND_SOC_NOPM
)
{
mask
=
mask
<<
shift
;
val
=
val
<<
shift
;
if
(
snd_soc_test_bits
(
codec
,
reg
,
mask
,
val
))
{
reg_change
=
soc_dapm_test_bits
(
dapm
,
reg
,
mask
,
val
);
}
if
(
change
||
reg_change
)
{
if
(
reg_change
)
{
update
.
kcontrol
=
kcontrol
;
update
.
reg
=
reg
;
update
.
mask
=
mask
;
update
.
val
=
val
;
card
->
update
=
&
update
;
}
}
change
|=
reg_change
;
ret
=
soc_dapm_mixer_update_power
(
card
,
kcontrol
,
connect
);
...
...
@@ -2814,12 +2846,13 @@ EXPORT_SYMBOL_GPL(snd_soc_dapm_put_volsw);
int
snd_soc_dapm_get_enum_double
(
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_dapm_kcontrol_dapm
(
kcontrol
);
struct
soc_enum
*
e
=
(
struct
soc_enum
*
)
kcontrol
->
private_value
;
unsigned
int
reg_val
,
val
;
int
ret
=
0
;
if
(
e
->
reg
!=
SND_SOC_NOPM
)
re
g_val
=
snd_soc_read
(
codec
,
e
->
reg
);
re
t
=
soc_dapm_read
(
dapm
,
e
->
reg
,
&
reg_val
);
else
reg_val
=
dapm_kcontrol_get_value
(
kcontrol
);
...
...
@@ -2831,7 +2864,7 @@ int snd_soc_dapm_get_enum_double(struct snd_kcontrol *kcontrol,
ucontrol
->
value
.
enumerated
.
item
[
1
]
=
val
;
}
return
0
;
return
ret
;
}
EXPORT_SYMBOL_GPL
(
snd_soc_dapm_get_enum_double
);
...
...
@@ -2847,8 +2880,8 @@ EXPORT_SYMBOL_GPL(snd_soc_dapm_get_enum_double);
int
snd_soc_dapm_put_enum_double
(
struct
snd_kcontrol
*
kcontrol
,
struct
snd_ctl_elem_value
*
ucontrol
)
{
struct
snd_soc_
codec
*
codec
=
snd_soc_dapm_kcontrol_codec
(
kcontrol
);
struct
snd_soc_card
*
card
=
codec
->
card
;
struct
snd_soc_
dapm_context
*
dapm
=
snd_soc_dapm_kcontrol_dapm
(
kcontrol
);
struct
snd_soc_card
*
card
=
dapm
->
card
;
struct
soc_enum
*
e
=
(
struct
soc_enum
*
)
kcontrol
->
private_value
;
unsigned
int
*
item
=
ucontrol
->
value
.
enumerated
.
item
;
unsigned
int
val
,
change
;
...
...
@@ -2871,7 +2904,7 @@ int snd_soc_dapm_put_enum_double(struct snd_kcontrol *kcontrol,
mutex_lock_nested
(
&
card
->
dapm_mutex
,
SND_SOC_DAPM_CLASS_RUNTIME
);
if
(
e
->
reg
!=
SND_SOC_NOPM
)
change
=
s
nd_soc_test_bits
(
codec
,
e
->
reg
,
mask
,
val
);
change
=
s
oc_dapm_test_bits
(
dapm
,
e
->
reg
,
mask
,
val
);
else
change
=
dapm_kcontrol_set_value
(
kcontrol
,
val
);
...
...
@@ -2968,6 +3001,7 @@ snd_soc_dapm_new_control(struct snd_soc_dapm_context *dapm,
const
struct
snd_soc_dapm_widget
*
widget
)
{
struct
snd_soc_dapm_widget
*
w
;
const
char
*
prefix
;
int
ret
;
if
((
w
=
dapm_cnew_widget
(
widget
))
==
NULL
)
...
...
@@ -3008,9 +3042,9 @@ snd_soc_dapm_new_control(struct snd_soc_dapm_context *dapm,
break
;
}
if
(
dapm
->
codec
&&
dapm
->
codec
->
name_prefix
)
w
->
name
=
kasprintf
(
GFP_KERNEL
,
"%s %s"
,
dapm
->
codec
->
name_
prefix
,
widget
->
name
);
prefix
=
soc_dapm_prefix
(
dapm
);
if
(
prefix
)
w
->
name
=
kasprintf
(
GFP_KERNEL
,
"%s %s"
,
prefix
,
widget
->
name
);
else
w
->
name
=
kasprintf
(
GFP_KERNEL
,
"%s"
,
widget
->
name
);
...
...
@@ -3063,7 +3097,6 @@ snd_soc_dapm_new_control(struct snd_soc_dapm_context *dapm,
w
->
dapm
=
dapm
;
w
->
codec
=
dapm
->
codec
;
w
->
platform
=
dapm
->
platform
;
INIT_LIST_HEAD
(
&
w
->
sources
);
INIT_LIST_HEAD
(
&
w
->
sinks
);
INIT_LIST_HEAD
(
&
w
->
list
);
...
...
@@ -3392,8 +3425,8 @@ void snd_soc_dapm_connect_dai_link_widgets(struct snd_soc_card *card)
source
=
cpu_dai
->
playback_widget
;
sink
=
codec_dai
->
playback_widget
;
dev_dbg
(
rtd
->
dev
,
"connected DAI link %s:%s -> %s:%s
\n
"
,
cpu_dai
->
co
dec
->
name
,
source
->
name
,
codec_dai
->
platform
->
name
,
sink
->
name
);
cpu_dai
->
co
mponent
->
name
,
source
->
name
,
codec_dai
->
component
->
name
,
sink
->
name
);
snd_soc_dapm_add_path
(
&
card
->
dapm
,
source
,
sink
,
NULL
,
NULL
);
...
...
@@ -3404,8 +3437,8 @@ void snd_soc_dapm_connect_dai_link_widgets(struct snd_soc_card *card)
source
=
codec_dai
->
capture_widget
;
sink
=
cpu_dai
->
capture_widget
;
dev_dbg
(
rtd
->
dev
,
"connected DAI link %s:%s -> %s:%s
\n
"
,
codec_dai
->
co
dec
->
name
,
source
->
name
,
cpu_dai
->
platform
->
name
,
sink
->
name
);
codec_dai
->
co
mponent
->
name
,
source
->
name
,
cpu_dai
->
component
->
name
,
sink
->
name
);
snd_soc_dapm_add_path
(
&
card
->
dapm
,
source
,
sink
,
NULL
,
NULL
);
...
...
@@ -3755,36 +3788,31 @@ static bool snd_soc_dapm_widget_in_card_paths(struct snd_soc_card *card,
}
/**
* snd_soc_dapm_auto_nc_
codec_
pins - call snd_soc_dapm_nc_pin for unused pins
* @c
odec: The codec
whose pins should be processed
* snd_soc_dapm_auto_nc_pins - call snd_soc_dapm_nc_pin for unused pins
* @c
ard: The card
whose pins should be processed
*
* Automatically call snd_soc_dapm_nc_pin() for any external pins in the c
odec
* which are unused. Pins are used if they are connected externally to
the
* co
dec
, whether that be to some other device, or a loop-back connection to
* the co
dec
itself.
* Automatically call snd_soc_dapm_nc_pin() for any external pins in the c
ard
* which are unused. Pins are used if they are connected externally to
a
* co
mponent
, whether that be to some other device, or a loop-back connection to
* the co
mponent
itself.
*/
void
snd_soc_dapm_auto_nc_
codec_pins
(
struct
snd_soc_codec
*
codec
)
void
snd_soc_dapm_auto_nc_
pins
(
struct
snd_soc_card
*
card
)
{
struct
snd_soc_card
*
card
=
codec
->
card
;
struct
snd_soc_dapm_context
*
dapm
=
&
codec
->
dapm
;
struct
snd_soc_dapm_widget
*
w
;
dev_dbg
(
codec
->
dev
,
"ASoC: Auto NC: DAPMs: card:%p codec:%p
\n
"
,
&
card
->
dapm
,
&
codec
->
dapm
);
dev_dbg
(
card
->
dev
,
"ASoC: Auto NC: DAPMs: card:%p
\n
"
,
&
card
->
dapm
);
list_for_each_entry
(
w
,
&
card
->
widgets
,
list
)
{
if
(
w
->
dapm
!=
dapm
)
continue
;
switch
(
w
->
id
)
{
case
snd_soc_dapm_input
:
case
snd_soc_dapm_output
:
case
snd_soc_dapm_micbias
:
dev_dbg
(
c
odec
->
dev
,
"ASoC: Auto NC: Checking widget %s
\n
"
,
dev_dbg
(
c
ard
->
dev
,
"ASoC: Auto NC: Checking widget %s
\n
"
,
w
->
name
);
if
(
!
snd_soc_dapm_widget_in_card_paths
(
card
,
w
))
{
dev_dbg
(
c
odec
->
dev
,
dev_dbg
(
c
ard
->
dev
,
"... Not in map; disabling
\n
"
);
snd_soc_dapm_nc_pin
(
dapm
,
w
->
name
);
snd_soc_dapm_nc_pin
(
w
->
dapm
,
w
->
name
);
}
break
;
default:
...
...
sound/soc/soc-pcm.c
View file @
f7acb369
...
...
@@ -390,7 +390,7 @@ static int soc_pcm_open(struct snd_pcm_substream *substream)
ret
=
platform
->
driver
->
ops
->
open
(
substream
);
if
(
ret
<
0
)
{
dev_err
(
platform
->
dev
,
"ASoC: can't open platform"
" %s: %d
\n
"
,
platform
->
name
,
ret
);
" %s: %d
\n
"
,
platform
->
component
.
name
,
ret
);
goto
platform_err
;
}
}
...
...
@@ -720,7 +720,7 @@ static int soc_pcm_hw_params(struct snd_pcm_substream *substream,
ret
=
platform
->
driver
->
ops
->
hw_params
(
substream
,
params
);
if
(
ret
<
0
)
{
dev_err
(
platform
->
dev
,
"ASoC: %s hw params failed: %d
\n
"
,
platform
->
name
,
ret
);
platform
->
component
.
name
,
ret
);
goto
platform_err
;
}
}
...
...
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