Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
kernel_linux
提交
f7acb369
K
kernel_linux
项目概览
OpenHarmony
/
kernel_linux
上一次同步 4 年多
通知
15
Star
8
Fork
2
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
kernel_linux
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
f7acb369
编写于
7月 16, 2014
作者:
M
Mark Brown
浏览文件
操作
浏览文件
下载
差异文件
Merge remote-tracking branch 'asoc/topic/component' into asoc-multi
上级
c8dd1fec
5f3484ac
变更
10
隐藏空白更改
内联
并排
Showing
10 changed file
with
424 addition
and
402 deletion
+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
未找到文件。
include/sound/soc-dai.h
浏览文件 @
f7acb369
...
@@ -257,7 +257,6 @@ struct snd_soc_dai {
...
@@ -257,7 +257,6 @@ struct snd_soc_dai {
struct
snd_soc_dapm_widget
*
playback_widget
;
struct
snd_soc_dapm_widget
*
playback_widget
;
struct
snd_soc_dapm_widget
*
capture_widget
;
struct
snd_soc_dapm_widget
*
capture_widget
;
struct
snd_soc_dapm_context
dapm
;
/* DAI DMA data */
/* DAI DMA data */
void
*
playback_dma_data
;
void
*
playback_dma_data
;
...
...
include/sound/soc-dapm.h
浏览文件 @
f7acb369
...
@@ -431,7 +431,7 @@ int snd_soc_dapm_force_enable_pin_unlocked(struct snd_soc_dapm_context *dapm,
...
@@ -431,7 +431,7 @@ int snd_soc_dapm_force_enable_pin_unlocked(struct snd_soc_dapm_context *dapm,
const
char
*
pin
);
const
char
*
pin
);
int
snd_soc_dapm_ignore_suspend
(
struct
snd_soc_dapm_context
*
dapm
,
int
snd_soc_dapm_ignore_suspend
(
struct
snd_soc_dapm_context
*
dapm
,
const
char
*
pin
);
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 */
/* Mostly internal - should not normally be used */
void
dapm_mark_io_dirty
(
struct
snd_soc_dapm_context
*
dapm
);
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,
...
@@ -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_dapm_widget_list
**
list
);
struct
snd_soc_codec
*
snd_soc_dapm_kcontrol_codec
(
struct
snd_kcontrol
*
kcontrol
);
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 */
/* dapm widget types */
enum
snd_soc_dapm_type
{
enum
snd_soc_dapm_type
{
...
@@ -524,7 +526,6 @@ struct snd_soc_dapm_widget {
...
@@ -524,7 +526,6 @@ struct snd_soc_dapm_widget {
const
char
*
name
;
/* widget name */
const
char
*
name
;
/* widget name */
const
char
*
sname
;
/* stream name */
const
char
*
sname
;
/* stream name */
struct
snd_soc_codec
*
codec
;
struct
snd_soc_codec
*
codec
;
struct
snd_soc_platform
*
platform
;
struct
list_head
list
;
struct
list_head
list
;
struct
snd_soc_dapm_context
*
dapm
;
struct
snd_soc_dapm_context
*
dapm
;
...
@@ -593,7 +594,6 @@ struct snd_soc_dapm_context {
...
@@ -593,7 +594,6 @@ struct snd_soc_dapm_context {
struct
device
*
dev
;
/* from parent - for debug */
struct
device
*
dev
;
/* from parent - for debug */
struct
snd_soc_component
*
component
;
/* parent component */
struct
snd_soc_component
*
component
;
/* parent component */
struct
snd_soc_codec
*
codec
;
/* parent codec */
struct
snd_soc_codec
*
codec
;
/* parent codec */
struct
snd_soc_platform
*
platform
;
/* parent platform */
struct
snd_soc_card
*
card
;
/* parent card */
struct
snd_soc_card
*
card
;
/* parent card */
/* used during DAPM updates */
/* used during DAPM updates */
...
@@ -601,6 +601,8 @@ struct snd_soc_dapm_context {
...
@@ -601,6 +601,8 @@ struct snd_soc_dapm_context {
struct
list_head
list
;
struct
list_head
list
;
int
(
*
stream_event
)(
struct
snd_soc_dapm_context
*
dapm
,
int
event
);
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
#ifdef CONFIG_DEBUG_FS
struct
dentry
*
debugfs_dapm
;
struct
dentry
*
debugfs_dapm
;
...
...
include/sound/soc.h
浏览文件 @
f7acb369
...
@@ -677,11 +677,15 @@ struct snd_soc_component_driver {
...
@@ -677,11 +677,15 @@ struct snd_soc_component_driver {
int
(
*
of_xlate_dai_name
)(
struct
snd_soc_component
*
component
,
int
(
*
of_xlate_dai_name
)(
struct
snd_soc_component
*
component
,
struct
of_phandle_args
*
args
,
struct
of_phandle_args
*
args
,
const
char
**
dai_name
);
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
{
struct
snd_soc_component
{
const
char
*
name
;
const
char
*
name
;
int
id
;
int
id
;
const
char
*
name_prefix
;
struct
device
*
dev
;
struct
device
*
dev
;
unsigned
int
active
;
unsigned
int
active
;
...
@@ -705,13 +709,14 @@ struct snd_soc_component {
...
@@ -705,13 +709,14 @@ struct snd_soc_component {
int
val_bytes
;
int
val_bytes
;
struct
mutex
io_mutex
;
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 */
/* SoC Audio Codec device */
struct
snd_soc_codec
{
struct
snd_soc_codec
{
const
char
*
name
;
const
char
*
name_prefix
;
int
id
;
struct
device
*
dev
;
struct
device
*
dev
;
const
struct
snd_soc_codec_driver
*
driver
;
const
struct
snd_soc_codec_driver
*
driver
;
...
@@ -790,9 +795,6 @@ struct snd_soc_codec_driver {
...
@@ -790,9 +795,6 @@ struct snd_soc_codec_driver {
void
(
*
seq_notifier
)(
struct
snd_soc_dapm_context
*
,
void
(
*
seq_notifier
)(
struct
snd_soc_dapm_context
*
,
enum
snd_soc_dapm_type
,
int
);
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 */
bool
ignore_pmdown_time
;
/* Doesn't benefit from pmdown delay */
/* probe ordering - for components with runtime dependencies */
/* probe ordering - for components with runtime dependencies */
...
@@ -834,9 +836,6 @@ struct snd_soc_platform_driver {
...
@@ -834,9 +836,6 @@ struct snd_soc_platform_driver {
/* platform stream compress ops */
/* platform stream compress ops */
const
struct
snd_compr_ops
*
compr_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 */
/* probe ordering - for components with runtime dependencies */
int
probe_order
;
int
probe_order
;
int
remove_order
;
int
remove_order
;
...
@@ -848,8 +847,6 @@ struct snd_soc_platform_driver {
...
@@ -848,8 +847,6 @@ struct snd_soc_platform_driver {
};
};
struct
snd_soc_platform
{
struct
snd_soc_platform
{
const
char
*
name
;
int
id
;
struct
device
*
dev
;
struct
device
*
dev
;
const
struct
snd_soc_platform_driver
*
driver
;
const
struct
snd_soc_platform_driver
*
driver
;
...
@@ -862,8 +859,6 @@ struct snd_soc_platform {
...
@@ -862,8 +859,6 @@ struct snd_soc_platform {
struct
snd_soc_component
component
;
struct
snd_soc_component
component
;
struct
snd_soc_dapm_context
dapm
;
#ifdef CONFIG_DEBUG_FS
#ifdef CONFIG_DEBUG_FS
struct
dentry
*
debugfs_platform_root
;
struct
dentry
*
debugfs_platform_root
;
#endif
#endif
...
@@ -1164,6 +1159,21 @@ static inline struct snd_soc_platform *snd_soc_component_to_platform(
...
@@ -1164,6 +1159,21 @@ static inline struct snd_soc_platform *snd_soc_component_to_platform(
return
container_of
(
component
,
struct
snd_soc_platform
,
component
);
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
* 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
* @dapm: The DAPM context to cast to the CODEC
...
@@ -1188,7 +1198,18 @@ static inline struct snd_soc_codec *snd_soc_dapm_to_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
(
static
inline
struct
snd_soc_platform
*
snd_soc_dapm_to_platform
(
struct
snd_soc_dapm_context
*
dapm
)
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 */
/* codec IO */
...
...
include/trace/events/asoc.h
浏览文件 @
f7acb369
...
@@ -296,17 +296,17 @@ TRACE_EVENT(snd_soc_cache_sync,
...
@@ -296,17 +296,17 @@ TRACE_EVENT(snd_soc_cache_sync,
TP_ARGS
(
codec
,
type
,
status
),
TP_ARGS
(
codec
,
type
,
status
),
TP_STRUCT__entry
(
TP_STRUCT__entry
(
__string
(
name
,
codec
->
name
)
__string
(
name
,
codec
->
component
.
name
)
__string
(
status
,
status
)
__string
(
status
,
status
)
__string
(
type
,
type
)
__string
(
type
,
type
)
__field
(
int
,
id
)
__field
(
int
,
id
)
),
),
TP_fast_assign
(
TP_fast_assign
(
__assign_str
(
name
,
codec
->
name
);
__assign_str
(
name
,
codec
->
component
.
name
);
__assign_str
(
status
,
status
);
__assign_str
(
status
,
status
);
__assign_str
(
type
,
type
);
__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
),
TP_printk
(
"codec=%s.%d type=%s status=%s"
,
__get_str
(
name
),
...
...
sound/soc/codecs/tlv320dac33.c
浏览文件 @
f7acb369
...
@@ -1404,7 +1404,7 @@ static int dac33_soc_probe(struct snd_soc_codec *codec)
...
@@ -1404,7 +1404,7 @@ static int dac33_soc_probe(struct snd_soc_codec *codec)
if
(
dac33
->
irq
>=
0
)
{
if
(
dac33
->
irq
>=
0
)
{
ret
=
request_irq
(
dac33
->
irq
,
dac33_interrupt_handler
,
ret
=
request_irq
(
dac33
->
irq
,
dac33_interrupt_handler
,
IRQF_TRIGGER_RISING
,
IRQF_TRIGGER_RISING
,
codec
->
name
,
codec
);
codec
->
component
.
name
,
codec
);
if
(
ret
<
0
)
{
if
(
ret
<
0
)
{
dev_err
(
codec
->
dev
,
"Could not request IRQ%d (%d)
\n
"
,
dev_err
(
codec
->
dev
,
"Could not request IRQ%d (%d)
\n
"
,
dac33
->
irq
,
ret
);
dac33
->
irq
,
ret
);
...
...
sound/soc/soc-cache.c
浏览文件 @
f7acb369
...
@@ -78,7 +78,7 @@ int snd_soc_cache_init(struct snd_soc_codec *codec)
...
@@ -78,7 +78,7 @@ int snd_soc_cache_init(struct snd_soc_codec *codec)
mutex_init
(
&
codec
->
cache_rw_mutex
);
mutex_init
(
&
codec
->
cache_rw_mutex
);
dev_dbg
(
codec
->
dev
,
"ASoC: Initializing cache for %s codec
\n
"
,
dev_dbg
(
codec
->
dev
,
"ASoC: Initializing cache for %s codec
\n
"
,
codec
->
name
);
codec
->
component
.
name
);
if
(
codec_drv
->
reg_cache_default
)
if
(
codec_drv
->
reg_cache_default
)
codec
->
reg_cache
=
kmemdup
(
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)
...
@@ -98,8 +98,7 @@ int snd_soc_cache_init(struct snd_soc_codec *codec)
int
snd_soc_cache_exit
(
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
"
,
dev_dbg
(
codec
->
dev
,
"ASoC: Destroying cache for %s codec
\n
"
,
codec
->
name
);
codec
->
component
.
name
);
kfree
(
codec
->
reg_cache
);
kfree
(
codec
->
reg_cache
);
codec
->
reg_cache
=
NULL
;
codec
->
reg_cache
=
NULL
;
return
0
;
return
0
;
...
@@ -192,7 +191,7 @@ int snd_soc_cache_sync(struct snd_soc_codec *codec)
...
@@ -192,7 +191,7 @@ int snd_soc_cache_sync(struct snd_soc_codec *codec)
return
0
;
return
0
;
dev_dbg
(
codec
->
dev
,
"ASoC: Syncing cache for %s codec
\n
"
,
dev_dbg
(
codec
->
dev
,
"ASoC: Syncing cache for %s codec
\n
"
,
codec
->
name
);
codec
->
component
.
name
);
trace_snd_soc_cache_sync
(
codec
,
name
,
"start"
);
trace_snd_soc_cache_sync
(
codec
,
name
,
"start"
);
ret
=
snd_soc_flat_cache_sync
(
codec
);
ret
=
snd_soc_flat_cache_sync
(
codec
);
if
(
!
ret
)
if
(
!
ret
)
...
...
sound/soc/soc-compress.c
浏览文件 @
f7acb369
...
@@ -37,7 +37,8 @@ static int soc_compr_open(struct snd_compr_stream *cstream)
...
@@ -37,7 +37,8 @@ static int soc_compr_open(struct snd_compr_stream *cstream)
if
(
platform
->
driver
->
compr_ops
&&
platform
->
driver
->
compr_ops
->
open
)
{
if
(
platform
->
driver
->
compr_ops
&&
platform
->
driver
->
compr_ops
->
open
)
{
ret
=
platform
->
driver
->
compr_ops
->
open
(
cstream
);
ret
=
platform
->
driver
->
compr_ops
->
open
(
cstream
);
if
(
ret
<
0
)
{
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
;
goto
out
;
}
}
}
}
...
@@ -84,7 +85,8 @@ static int soc_compr_open_fe(struct snd_compr_stream *cstream)
...
@@ -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
)
{
if
(
platform
->
driver
->
compr_ops
&&
platform
->
driver
->
compr_ops
->
open
)
{
ret
=
platform
->
driver
->
compr_ops
->
open
(
cstream
);
ret
=
platform
->
driver
->
compr_ops
->
open
(
cstream
);
if
(
ret
<
0
)
{
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
;
goto
out
;
}
}
}
}
...
@@ -680,7 +682,7 @@ int soc_new_compress(struct snd_soc_pcm_runtime *rtd, int num)
...
@@ -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
);
ret
=
snd_compress_new
(
rtd
->
card
->
snd_card
,
num
,
direction
,
compr
);
if
(
ret
<
0
)
{
if
(
ret
<
0
)
{
pr_err
(
"compress asoc: can't create compress for codec %s
\n
"
,
pr_err
(
"compress asoc: can't create compress for codec %s
\n
"
,
codec
->
name
);
codec
->
component
.
name
);
goto
compr_err
;
goto
compr_err
;
}
}
...
...
sound/soc/soc-core.c
浏览文件 @
f7acb369
...
@@ -270,12 +270,33 @@ static const struct file_operations codec_reg_fops = {
...
@@ -270,12 +270,33 @@ static const struct file_operations codec_reg_fops = {
.
llseek
=
default_llseek
,
.
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
)
static
void
soc_init_codec_debugfs
(
struct
snd_soc_codec
*
codec
)
{
{
struct
dentry
*
debugfs_card_root
=
codec
->
card
->
debugfs_card_root
;
struct
dentry
*
debugfs_card_root
=
codec
->
card
->
debugfs_card_root
;
codec
->
debugfs_codec_root
=
debugfs_create_dir
(
codec
->
name
,
codec
->
debugfs_codec_root
=
soc_debugfs_create_dir
(
debugfs_card_root
,
debugfs_card_root
);
"codec:%s"
,
codec
->
component
.
name
);
if
(
!
codec
->
debugfs_codec_root
)
{
if
(
!
codec
->
debugfs_codec_root
)
{
dev_warn
(
codec
->
dev
,
dev_warn
(
codec
->
dev
,
"ASoC: Failed to create codec debugfs directory
\n
"
);
"ASoC: Failed to create codec debugfs directory
\n
"
);
...
@@ -306,15 +327,16 @@ static void soc_init_platform_debugfs(struct snd_soc_platform *platform)
...
@@ -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
;
struct
dentry
*
debugfs_card_root
=
platform
->
card
->
debugfs_card_root
;
platform
->
debugfs_platform_root
=
debugfs_create_dir
(
platform
->
name
,
platform
->
debugfs_platform_root
=
soc_debugfs_create_dir
(
debugfs_card_root
,
debugfs_card_root
);
"platform:%s"
,
platform
->
component
.
name
);
if
(
!
platform
->
debugfs_platform_root
)
{
if
(
!
platform
->
debugfs_platform_root
)
{
dev_warn
(
platform
->
dev
,
dev_warn
(
platform
->
dev
,
"ASoC: Failed to create platform debugfs directory
\n
"
);
"ASoC: Failed to create platform debugfs directory
\n
"
);
return
;
return
;
}
}
snd_soc_dapm_debugfs_init
(
&
platform
->
dapm
,
snd_soc_dapm_debugfs_init
(
&
platform
->
component
.
dapm
,
platform
->
debugfs_platform_root
);
platform
->
debugfs_platform_root
);
}
}
...
@@ -335,7 +357,7 @@ static ssize_t codec_list_read_file(struct file *file, char __user *user_buf,
...
@@ -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
)
{
list_for_each_entry
(
codec
,
&
codec_list
,
list
)
{
len
=
snprintf
(
buf
+
ret
,
PAGE_SIZE
-
ret
,
"%s
\n
"
,
len
=
snprintf
(
buf
+
ret
,
PAGE_SIZE
-
ret
,
"%s
\n
"
,
codec
->
name
);
codec
->
component
.
name
);
if
(
len
>=
0
)
if
(
len
>=
0
)
ret
+=
len
;
ret
+=
len
;
if
(
ret
>
PAGE_SIZE
)
{
if
(
ret
>
PAGE_SIZE
)
{
...
@@ -406,7 +428,7 @@ static ssize_t platform_list_read_file(struct file *file,
...
@@ -406,7 +428,7 @@ static ssize_t platform_list_read_file(struct file *file,
list_for_each_entry
(
platform
,
&
platform_list
,
list
)
{
list_for_each_entry
(
platform
,
&
platform_list
,
list
)
{
len
=
snprintf
(
buf
+
ret
,
PAGE_SIZE
-
ret
,
"%s
\n
"
,
len
=
snprintf
(
buf
+
ret
,
PAGE_SIZE
-
ret
,
"%s
\n
"
,
platform
->
name
);
platform
->
component
.
name
);
if
(
len
>=
0
)
if
(
len
>=
0
)
ret
+=
len
;
ret
+=
len
;
if
(
ret
>
PAGE_SIZE
)
{
if
(
ret
>
PAGE_SIZE
)
{
...
@@ -528,7 +550,7 @@ static int soc_ac97_dev_register(struct snd_soc_codec *codec)
...
@@ -528,7 +550,7 @@ static int soc_ac97_dev_register(struct snd_soc_codec *codec)
codec
->
ac97
->
dev
.
release
=
soc_ac97_device_release
;
codec
->
ac97
->
dev
.
release
=
soc_ac97_device_release
;
dev_set_name
(
&
codec
->
ac97
->
dev
,
"%d-%d:%s"
,
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
);
err
=
device_register
(
&
codec
->
ac97
->
dev
);
if
(
err
<
0
)
{
if
(
err
<
0
)
{
dev_err
(
codec
->
dev
,
"ASoC: Can't register ac97 bus
\n
"
);
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
...
@@ -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
)
if
(
codec
->
dev
->
of_node
!=
codec_of_node
)
continue
;
continue
;
}
else
{
}
else
{
if
(
strcmp
(
codec
->
name
,
codec_name
))
if
(
strcmp
(
codec
->
component
.
name
,
codec_name
))
continue
;
continue
;
}
}
...
@@ -945,7 +967,7 @@ static int soc_bind_dai_link(struct snd_soc_card *card, int num)
...
@@ -945,7 +967,7 @@ static int soc_bind_dai_link(struct snd_soc_card *card, int num)
dai_link
->
platform_of_node
)
dai_link
->
platform_of_node
)
continue
;
continue
;
}
else
{
}
else
{
if
(
strcmp
(
platform
->
name
,
platform_name
))
if
(
strcmp
(
platform
->
component
.
name
,
platform_name
))
continue
;
continue
;
}
}
...
@@ -974,7 +996,7 @@ static int soc_remove_platform(struct snd_soc_platform *platform)
...
@@ -974,7 +996,7 @@ static int soc_remove_platform(struct snd_soc_platform *platform)
}
}
/* Make sure all DAPM widgets are freed */
/* 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
);
soc_cleanup_platform_debugfs
(
platform
);
platform
->
probed
=
0
;
platform
->
probed
=
0
;
...
@@ -1048,11 +1070,8 @@ static void soc_remove_link_dais(struct snd_soc_card *card, int num, int order)
...
@@ -1048,11 +1070,8 @@ static void soc_remove_link_dais(struct snd_soc_card *card, int num, int order)
cpu_dai
->
name
,
err
);
cpu_dai
->
name
,
err
);
}
}
cpu_dai
->
probed
=
0
;
cpu_dai
->
probed
=
0
;
if
(
!
cpu_dai
->
codec
)
if
(
!
cpu_dai
->
codec
)
{
snd_soc_dapm_free
(
&
cpu_dai
->
dapm
);
module_put
(
cpu_dai
->
dev
->
driver
->
owner
);
module_put
(
cpu_dai
->
dev
->
driver
->
owner
);
}
}
}
}
}
...
@@ -1108,7 +1127,7 @@ static void soc_remove_dai_links(struct snd_soc_card *card)
...
@@ -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
,
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
;
int
i
;
...
@@ -1117,11 +1136,11 @@ static void soc_set_name_prefix(struct snd_soc_card *card,
...
@@ -1117,11 +1136,11 @@ static void soc_set_name_prefix(struct snd_soc_card *card,
for
(
i
=
0
;
i
<
card
->
num_configs
;
i
++
)
{
for
(
i
=
0
;
i
<
card
->
num_configs
;
i
++
)
{
struct
snd_soc_codec_conf
*
map
=
&
card
->
codec_conf
[
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
;
continue
;
if
(
map
->
dev_name
&&
strcmp
(
co
dec
->
name
,
map
->
dev_name
))
if
(
map
->
dev_name
&&
strcmp
(
co
mponent
->
name
,
map
->
dev_name
))
continue
;
continue
;
co
dec
->
name_prefix
=
map
->
name_prefix
;
co
mponent
->
name_prefix
=
map
->
name_prefix
;
break
;
break
;
}
}
}
}
...
@@ -1135,7 +1154,7 @@ static int soc_probe_codec(struct snd_soc_card *card,
...
@@ -1135,7 +1154,7 @@ static int soc_probe_codec(struct snd_soc_card *card,
codec
->
card
=
card
;
codec
->
card
=
card
;
codec
->
dapm
.
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
))
if
(
!
try_module_get
(
codec
->
dev
->
driver
->
owner
))
return
-
ENODEV
;
return
-
ENODEV
;
...
@@ -1177,7 +1196,7 @@ static int soc_probe_codec(struct snd_soc_card *card,
...
@@ -1177,7 +1196,7 @@ static int soc_probe_codec(struct snd_soc_card *card,
WARN
(
codec
->
dapm
.
idle_bias_off
&&
WARN
(
codec
->
dapm
.
idle_bias_off
&&
codec
->
dapm
.
bias_level
!=
SND_SOC_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 %s can not start from non-off bias with idle_bias_off==1
\n
"
,
codec
->
name
);
codec
->
component
.
name
);
}
}
if
(
driver
->
controls
)
if
(
driver
->
controls
)
...
@@ -1210,7 +1229,7 @@ static int soc_probe_platform(struct snd_soc_card *card,
...
@@ -1210,7 +1229,7 @@ static int soc_probe_platform(struct snd_soc_card *card,
struct
snd_soc_dai
*
dai
;
struct
snd_soc_dai
*
dai
;
platform
->
card
=
card
;
platform
->
card
=
card
;
platform
->
dapm
.
card
=
card
;
platform
->
component
.
dapm
.
card
=
card
;
if
(
!
try_module_get
(
platform
->
dev
->
driver
->
owner
))
if
(
!
try_module_get
(
platform
->
dev
->
driver
->
owner
))
return
-
ENODEV
;
return
-
ENODEV
;
...
@@ -1218,7 +1237,7 @@ static int soc_probe_platform(struct snd_soc_card *card,
...
@@ -1218,7 +1237,7 @@ static int soc_probe_platform(struct snd_soc_card *card,
soc_init_platform_debugfs
(
platform
);
soc_init_platform_debugfs
(
platform
);
if
(
driver
->
dapm_widgets
)
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
);
driver
->
dapm_widgets
,
driver
->
num_dapm_widgets
);
/* Create DAPM widgets for each DAI stream */
/* Create DAPM widgets for each DAI stream */
...
@@ -1226,10 +1245,11 @@ static int soc_probe_platform(struct snd_soc_card *card,
...
@@ -1226,10 +1245,11 @@ static int soc_probe_platform(struct snd_soc_card *card,
if
(
component
->
dev
!=
platform
->
dev
)
if
(
component
->
dev
!=
platform
->
dev
)
continue
;
continue
;
list_for_each_entry
(
dai
,
&
component
->
dai_list
,
list
)
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
)
{
if
(
driver
->
probe
)
{
ret
=
driver
->
probe
(
platform
);
ret
=
driver
->
probe
(
platform
);
...
@@ -1244,13 +1264,13 @@ static int soc_probe_platform(struct snd_soc_card *card,
...
@@ -1244,13 +1264,13 @@ static int soc_probe_platform(struct snd_soc_card *card,
snd_soc_add_platform_controls
(
platform
,
driver
->
controls
,
snd_soc_add_platform_controls
(
platform
,
driver
->
controls
,
driver
->
num_controls
);
driver
->
num_controls
);
if
(
driver
->
dapm_routes
)
if
(
driver
->
dapm_routes
)
snd_soc_dapm_add_routes
(
&
platform
->
dapm
,
driver
->
dapm_routes
,
snd_soc_dapm_add_routes
(
&
platform
->
component
.
dapm
,
driver
->
num_dapm_routes
);
driver
->
dapm_routes
,
driver
->
num_dapm_routes
);
/* mark platform as probed and add to card platform list */
/* mark platform as probed and add to card platform list */
platform
->
probed
=
1
;
platform
->
probed
=
1
;
list_add
(
&
platform
->
card_list
,
&
card
->
platform_dev_list
);
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
;
return
0
;
...
@@ -1266,83 +1286,17 @@ static void rtd_release(struct device *dev)
...
@@ -1266,83 +1286,17 @@ static void rtd_release(struct device *dev)
kfree
(
dev
);
kfree
(
dev
);
}
}
static
int
soc_aux_dev_init
(
struct
snd_soc_card
*
card
,
static
int
soc_post_component_init
(
struct
snd_soc_pcm_runtime
*
rtd
,
struct
snd_soc_codec
*
codec
,
const
char
*
name
)
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
)
{
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
;
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 */
/* register the rtd device */
rtd
->
dev
=
kzalloc
(
sizeof
(
struct
device
),
GFP_KERNEL
);
rtd
->
dev
=
kzalloc
(
sizeof
(
struct
device
),
GFP_KERNEL
);
if
(
!
rtd
->
dev
)
if
(
!
rtd
->
dev
)
return
-
ENOMEM
;
return
-
ENOMEM
;
device_initialize
(
rtd
->
dev
);
device_initialize
(
rtd
->
dev
);
rtd
->
dev
->
parent
=
card
->
dev
;
rtd
->
dev
->
parent
=
rtd
->
card
->
dev
;
rtd
->
dev
->
release
=
rtd_release
;
rtd
->
dev
->
release
=
rtd_release
;
rtd
->
dev
->
init_name
=
name
;
rtd
->
dev
->
init_name
=
name
;
dev_set_drvdata
(
rtd
->
dev
,
rtd
);
dev_set_drvdata
(
rtd
->
dev
,
rtd
);
...
@@ -1355,7 +1309,7 @@ static int soc_post_component_init(struct snd_soc_card *card,
...
@@ -1355,7 +1309,7 @@ static int soc_post_component_init(struct snd_soc_card *card,
if
(
ret
<
0
)
{
if
(
ret
<
0
)
{
/* calling put_device() here to free the rtd->dev */
/* calling put_device() here to free the rtd->dev */
put_device
(
rtd
->
dev
);
put_device
(
rtd
->
dev
);
dev_err
(
card
->
dev
,
dev_err
(
rtd
->
card
->
dev
,
"ASoC: failed to register runtime device: %d
\n
"
,
ret
);
"ASoC: failed to register runtime device: %d
\n
"
,
ret
);
return
ret
;
return
ret
;
}
}
...
@@ -1364,26 +1318,15 @@ static int soc_post_component_init(struct snd_soc_card *card,
...
@@ -1364,26 +1318,15 @@ static int soc_post_component_init(struct snd_soc_card *card,
/* add DAPM sysfs entries for this codec */
/* add DAPM sysfs entries for this codec */
ret
=
snd_soc_dapm_sys_add
(
rtd
->
dev
);
ret
=
snd_soc_dapm_sys_add
(
rtd
->
dev
);
if
(
ret
<
0
)
if
(
ret
<
0
)
dev_err
(
codec
->
dev
,
dev_err
(
rtd
->
dev
,
"ASoC: failed to add codec dapm sysfs entries: %d
\n
"
,
ret
);
"ASoC: failed to add codec dapm sysfs entries: %d
\n
"
,
ret
);
/* add codec sysfs entries */
/* add codec sysfs entries */
ret
=
device_create_file
(
rtd
->
dev
,
&
dev_attr_codec_reg
);
ret
=
device_create_file
(
rtd
->
dev
,
&
dev_attr_codec_reg
);
if
(
ret
<
0
)
if
(
ret
<
0
)
dev_err
(
codec
->
dev
,
dev_err
(
rtd
->
dev
,
"ASoC: failed to add codec sysfs files: %d
\n
"
,
ret
);
"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
;
return
0
;
}
}
...
@@ -1510,11 +1453,8 @@ static int soc_probe_link_dais(struct snd_soc_card *card, int num, int order)
...
@@ -1510,11 +1453,8 @@ static int soc_probe_link_dais(struct snd_soc_card *card, int num, int order)
if
(
!
cpu_dai
->
probed
&&
if
(
!
cpu_dai
->
probed
&&
cpu_dai
->
driver
->
probe_order
==
order
)
{
cpu_dai
->
driver
->
probe_order
==
order
)
{
if
(
!
cpu_dai
->
codec
)
{
if
(
!
cpu_dai
->
codec
)
{
cpu_dai
->
dapm
.
card
=
card
;
if
(
!
try_module_get
(
cpu_dai
->
dev
->
driver
->
owner
))
if
(
!
try_module_get
(
cpu_dai
->
dev
->
driver
->
owner
))
return
-
ENODEV
;
return
-
ENODEV
;
list_add
(
&
cpu_dai
->
dapm
.
list
,
&
card
->
dapm_list
);
}
}
if
(
cpu_dai
->
driver
->
probe
)
{
if
(
cpu_dai
->
driver
->
probe
)
{
...
@@ -1539,10 +1479,33 @@ static int soc_probe_link_dais(struct snd_soc_card *card, int num, int order)
...
@@ -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
)
if
(
order
!=
SND_SOC_COMP_ORDER_LAST
)
return
0
;
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
)
if
(
ret
)
return
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
);
ret
=
device_create_file
(
rtd
->
dev
,
&
dev_attr_pmdown_time
);
if
(
ret
<
0
)
if
(
ret
<
0
)
dev_warn
(
rtd
->
dev
,
"ASoC: failed to add pmdown_time sysfs: %d
\n
"
,
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)
...
@@ -1636,68 +1599,50 @@ static void soc_unregister_ac97_dai_link(struct snd_soc_pcm_runtime *rtd)
}
}
#endif
#endif
static
struct
snd_soc_codec
*
soc_find_matching_codec
(
struct
snd_soc_card
*
card
,
static
int
soc_bind_aux_dev
(
struct
snd_soc_card
*
card
,
int
num
)
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
)
{
{
struct
snd_soc_pcm_runtime
*
rtd
=
&
card
->
rtd_aux
[
num
];
struct
snd_soc_aux_dev
*
aux_dev
=
&
card
->
aux_dev
[
num
];
struct
snd_soc_aux_dev
*
aux_dev
=
&
card
->
aux_dev
[
num
];
const
char
*
codecname
=
aux_dev
->
codec_name
;
const
char
*
codecname
=
aux_dev
->
codec_name
;
struct
snd_soc_codec
*
codec
=
soc_find_matching_codec
(
card
,
num
);
if
(
codec
)
rtd
->
codec
=
soc_find_codec
(
aux_dev
->
codec_of_node
,
codecname
);
return
0
;
if
(
!
rtd
->
codec
)
{
if
(
aux_dev
->
codec_of_node
)
if
(
aux_dev
->
codec_of_node
)
codecname
=
of_node_full_name
(
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
;
}
dev_err
(
card
->
dev
,
"ASoC: %s not registered
\n
"
,
codecname
);
return
0
;
return
-
EPROBE_DEFER
;
}
}
static
int
soc_probe_aux_dev
(
struct
snd_soc_card
*
card
,
int
num
)
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
];
struct
snd_soc_aux_dev
*
aux_dev
=
&
card
->
aux_dev
[
num
];
const
char
*
codecname
=
aux_dev
->
codec_name
;
int
ret
;
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
;
}
if
(
codec
->
probed
)
{
if
(
rtd
->
codec
->
probed
)
{
dev_err
(
codec
->
dev
,
"ASoC: codec already probed
"
);
dev_err
(
rtd
->
codec
->
dev
,
"ASoC: codec already probed
\n
"
);
return
-
EBUSY
;
return
-
EBUSY
;
}
}
ret
=
soc_probe_codec
(
card
,
codec
);
ret
=
soc_probe_codec
(
card
,
rtd
->
codec
);
if
(
ret
<
0
)
if
(
ret
<
0
)
return
ret
;
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
ret
;
return
soc_post_component_init
(
rtd
,
aux_dev
->
name
)
;
}
}
static
void
soc_remove_aux_dev
(
struct
snd_soc_card
*
card
,
int
num
)
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)
...
@@ -1749,9 +1694,9 @@ static int snd_soc_instantiate_card(struct snd_soc_card *card)
goto
base_error
;
goto
base_error
;
}
}
/*
check
aux_devs too */
/*
bind
aux_devs too */
for
(
i
=
0
;
i
<
card
->
num_aux_devs
;
i
++
)
{
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
)
if
(
ret
!=
0
)
goto
base_error
;
goto
base_error
;
}
}
...
@@ -1927,8 +1872,7 @@ static int snd_soc_instantiate_card(struct snd_soc_card *card)
...
@@ -1927,8 +1872,7 @@ static int snd_soc_instantiate_card(struct snd_soc_card *card)
}
}
if
(
card
->
fully_routed
)
if
(
card
->
fully_routed
)
list_for_each_entry
(
codec
,
&
card
->
codec_dev_list
,
card_list
)
snd_soc_dapm_auto_nc_pins
(
card
);
snd_soc_dapm_auto_nc_codec_pins
(
codec
);
snd_soc_dapm_new_widgets
(
card
);
snd_soc_dapm_new_widgets
(
card
);
...
@@ -2403,7 +2347,7 @@ int snd_soc_add_codec_controls(struct snd_soc_codec *codec,
...
@@ -2403,7 +2347,7 @@ int snd_soc_add_codec_controls(struct snd_soc_codec *codec,
struct
snd_card
*
card
=
codec
->
card
->
snd_card
;
struct
snd_card
*
card
=
codec
->
card
->
snd_card
;
return
snd_soc_add_controls
(
card
,
codec
->
dev
,
controls
,
num_controls
,
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
);
EXPORT_SYMBOL_GPL
(
snd_soc_add_codec_controls
);
...
@@ -3797,8 +3741,13 @@ int snd_soc_register_card(struct snd_soc_card *card)
...
@@ -3797,8 +3741,13 @@ int snd_soc_register_card(struct snd_soc_card *card)
card
->
num_rtd
=
0
;
card
->
num_rtd
=
0
;
card
->
rtd_aux
=
&
card
->
rtd
[
card
->
num_links
];
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
];
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
);
INIT_LIST_HEAD
(
&
card
->
dapm_dirty
);
card
->
instantiated
=
0
;
card
->
instantiated
=
0
;
...
@@ -3921,16 +3870,14 @@ static void snd_soc_unregister_dais(struct snd_soc_component *component)
...
@@ -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
* snd_soc_register_dais - Register a DAI with the ASoC core
*
*
* @component: The component the DAIs are registered for
* @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
* @dai_drv: DAI driver to use for the DAIs
* @count: Number of DAIs
* @count: Number of DAIs
* @legacy_dai_naming: Use the legacy naming scheme and let the DAI inherit the
* @legacy_dai_naming: Use the legacy naming scheme and let the DAI inherit the
* parent's name.
* parent's name.
*/
*/
static
int
snd_soc_register_dais
(
struct
snd_soc_component
*
component
,
static
int
snd_soc_register_dais
(
struct
snd_soc_component
*
component
,
struct
snd_soc_
codec
*
codec
,
struct
snd_soc_dai_driver
*
dai_drv
,
struct
snd_soc_
dai_driver
*
dai_drv
,
size_t
count
,
size_t
count
,
bool
legacy_dai_naming
)
bool
legacy_dai_naming
)
{
{
struct
device
*
dev
=
component
->
dev
;
struct
device
*
dev
=
component
->
dev
;
struct
snd_soc_dai
*
dai
;
struct
snd_soc_dai
*
dai
;
...
@@ -3939,6 +3886,9 @@ static int snd_soc_register_dais(struct snd_soc_component *component,
...
@@ -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
);
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
++
)
{
for
(
i
=
0
;
i
<
count
;
i
++
)
{
dai
=
kzalloc
(
sizeof
(
struct
snd_soc_dai
),
GFP_KERNEL
);
dai
=
kzalloc
(
sizeof
(
struct
snd_soc_dai
),
GFP_KERNEL
);
...
@@ -3971,16 +3921,11 @@ static int snd_soc_register_dais(struct snd_soc_component *component,
...
@@ -3971,16 +3921,11 @@ static int snd_soc_register_dais(struct snd_soc_component *component,
}
}
dai
->
component
=
component
;
dai
->
component
=
component
;
dai
->
codec
=
codec
;
dai
->
dev
=
dev
;
dai
->
dev
=
dev
;
dai
->
driver
=
&
dai_drv
[
i
];
dai
->
driver
=
&
dai_drv
[
i
];
dai
->
dapm
.
dev
=
dev
;
if
(
!
dai
->
driver
->
ops
)
if
(
!
dai
->
driver
->
ops
)
dai
->
driver
->
ops
=
&
null_dai_ops
;
dai
->
driver
->
ops
=
&
null_dai_ops
;
if
(
!
dai
->
codec
)
dai
->
dapm
.
idle_bias_off
=
1
;
list_add
(
&
dai
->
list
,
&
component
->
dai_list
);
list_add
(
&
dai
->
list
,
&
component
->
dai_list
);
dev_dbg
(
dev
,
"ASoC: Registered DAI '%s'
\n
"
,
dai
->
name
);
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,
...
@@ -3994,60 +3939,82 @@ static int snd_soc_register_dais(struct snd_soc_component *component,
return
ret
;
return
ret
;
}
}
/**
static
void
snd_soc_component_seq_notifier
(
struct
snd_soc_dapm_context
*
dapm
,
* snd_soc_register_component - Register a component with the ASoC core
enum
snd_soc_dapm_type
type
,
int
subseq
)
*
*/
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
)
{
{
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
)
{
static
int
snd_soc_component_stream_event
(
struct
snd_soc_dapm_context
*
dapm
,
dev_err
(
dev
,
"ASoC: Failed to connecting component
\n
"
);
int
event
)
return
-
ENOMEM
;
{
}
struct
snd_soc_component
*
component
=
dapm
->
component
;
mutex_init
(
&
cmpnt
->
io_mutex
);
return
component
->
driver
->
stream_event
(
component
,
event
);
}
cmpnt
->
name
=
fmt_single_name
(
dev
,
&
cmpnt
->
id
);
static
int
snd_soc_component_initialize
(
struct
snd_soc_component
*
component
,
if
(
!
cmpnt
->
name
)
{
const
struct
snd_soc_component_driver
*
driver
,
struct
device
*
dev
)
dev_err
(
dev
,
"ASoC: Failed to simplifying name
\n
"
);
{
struct
snd_soc_dapm_context
*
dapm
;
component
->
name
=
fmt_single_name
(
dev
,
&
component
->
id
);
if
(
!
component
->
name
)
{
dev_err
(
dev
,
"ASoC: Failed to allocate name
\n
"
);
return
-
ENOMEM
;
return
-
ENOMEM
;
}
}
cmpnt
->
dev
=
dev
;
component
->
dev
=
dev
;
cmpnt
->
driver
=
cmpnt_drv
;
component
->
driver
=
driver
;
cmpnt
->
dai_drv
=
dai_drv
;
cmpnt
->
num_dai
=
num_dai
;
INIT_LIST_HEAD
(
&
cmpnt
->
dai_list
);
ret
=
snd_soc_register_dais
(
cmpnt
,
codec
,
dai_drv
,
num_dai
,
if
(
!
component
->
dapm_ptr
)
allow_single_dai
);
component
->
dapm_ptr
=
&
component
->
dapm
;
if
(
ret
<
0
)
{
dev_err
(
dev
,
"ASoC: Failed to regster DAIs: %d
\n
"
,
ret
);
dapm
=
component
->
dapm_ptr
;
goto
error_component_name
;
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
);
mutex_lock
(
&
client_mutex
);
list_add
(
&
cmpnt
->
list
,
&
component_lis
t
);
snd_soc_component_add_unlocked
(
componen
t
);
mutex_unlock
(
&
client_mutex
);
mutex_unlock
(
&
client_mutex
);
}
dev_dbg
(
cmpnt
->
dev
,
"ASoC: Registered component '%s'
\n
"
,
cmpnt
->
name
);
static
void
snd_soc_component_cleanup
(
struct
snd_soc_component
*
component
)
{
return
ret
;
snd_soc_unregister_dais
(
component
);
kfree
(
component
->
name
);
}
error_component_name:
static
void
snd_soc_component_del_unlocked
(
struct
snd_soc_component
*
component
)
kfree
(
cmpnt
->
name
);
{
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
,
int
snd_soc_register_component
(
struct
device
*
dev
,
...
@@ -4056,32 +4023,38 @@ int snd_soc_register_component(struct device *dev,
...
@@ -4056,32 +4023,38 @@ int snd_soc_register_component(struct device *dev,
int
num_dai
)
int
num_dai
)
{
{
struct
snd_soc_component
*
cmpnt
;
struct
snd_soc_component
*
cmpnt
;
int
ret
;
cmpnt
=
devm_kzalloc
(
dev
,
sizeof
(
*
cmpnt
),
GFP_KERNEL
);
cmpnt
=
kzalloc
(
sizeof
(
*
cmpnt
),
GFP_KERNEL
);
if
(
!
cmpnt
)
{
if
(
!
cmpnt
)
{
dev_err
(
dev
,
"ASoC: Failed to allocate memory
\n
"
);
dev_err
(
dev
,
"ASoC: Failed to allocate memory
\n
"
);
return
-
ENOMEM
;
return
-
ENOMEM
;
}
}
ret
=
snd_soc_component_initialize
(
cmpnt
,
cmpnt_drv
,
dev
);
if
(
ret
)
goto
err_free
;
cmpnt
->
ignore_pmdown_time
=
true
;
cmpnt
->
ignore_pmdown_time
=
true
;
cmpnt
->
registered_as_component
=
true
;
cmpnt
->
registered_as_component
=
true
;
return
__snd_soc_register_component
(
dev
,
cmpnt
,
cmpnt_drv
,
NULL
,
ret
=
snd_soc_register_dais
(
cmpnt
,
dai_drv
,
num_dai
,
true
);
dai_drv
,
num_dai
,
true
);
if
(
ret
<
0
)
{
}
dev_err
(
dev
,
"ASoC: Failed to regster DAIs: %d
\n
"
,
ret
);
EXPORT_SYMBOL_GPL
(
snd_soc_register_component
);
goto
err_cleanup
;
}
static
void
__snd_soc_unregister_component
(
struct
snd_soc_component
*
cmpnt
)
snd_soc_component_add
(
cmpnt
);
{
snd_soc_unregister_dais
(
cmpnt
);
mutex_lock
(
&
client_mutex
);
return
0
;
list_del
(
&
cmpnt
->
list
);
mutex_unlock
(
&
client_mutex
);
dev_dbg
(
cmpnt
->
dev
,
"ASoC: Unregistered component '%s'
\n
"
,
cmpnt
->
name
);
err_cleanup:
kfree
(
cmpnt
->
name
);
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
* snd_soc_unregister_component - Unregister a component from the ASoC core
...
@@ -4098,7 +4071,9 @@ void snd_soc_unregister_component(struct device *dev)
...
@@ -4098,7 +4071,9 @@ void snd_soc_unregister_component(struct device *dev)
return
;
return
;
found:
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
);
EXPORT_SYMBOL_GPL
(
snd_soc_unregister_component
);
...
@@ -4131,37 +4106,25 @@ int snd_soc_add_platform(struct device *dev, struct snd_soc_platform *platform,
...
@@ -4131,37 +4106,25 @@ int snd_soc_add_platform(struct device *dev, struct snd_soc_platform *platform,
{
{
int
ret
;
int
ret
;
/* create platform component name */
ret
=
snd_soc_component_initialize
(
&
platform
->
component
,
platform
->
name
=
fmt_single_name
(
dev
,
&
platform
->
id
);
&
platform_drv
->
component_driver
,
dev
);
if
(
platform
->
name
==
NULL
)
if
(
ret
)
return
-
ENOMEM
;
return
ret
;
platform
->
dev
=
dev
;
platform
->
dev
=
dev
;
platform
->
driver
=
platform_drv
;
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
)
if
(
platform_drv
->
write
)
platform
->
component
.
write
=
snd_soc_platform_drv_write
;
platform
->
component
.
write
=
snd_soc_platform_drv_write
;
if
(
platform_drv
->
read
)
if
(
platform_drv
->
read
)
platform
->
component
.
read
=
snd_soc_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
);
mutex_lock
(
&
client_mutex
);
snd_soc_component_add_unlocked
(
&
platform
->
component
);
list_add
(
&
platform
->
list
,
&
platform_list
);
list_add
(
&
platform
->
list
,
&
platform_list
);
mutex_unlock
(
&
client_mutex
);
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
;
return
0
;
}
}
...
@@ -4198,15 +4161,16 @@ EXPORT_SYMBOL_GPL(snd_soc_register_platform);
...
@@ -4198,15 +4161,16 @@ EXPORT_SYMBOL_GPL(snd_soc_register_platform);
*/
*/
void
snd_soc_remove_platform
(
struct
snd_soc_platform
*
platform
)
void
snd_soc_remove_platform
(
struct
snd_soc_platform
*
platform
)
{
{
__snd_soc_unregister_component
(
&
platform
->
component
);
mutex_lock
(
&
client_mutex
);
mutex_lock
(
&
client_mutex
);
list_del
(
&
platform
->
list
);
list_del
(
&
platform
->
list
);
snd_soc_component_del_unlocked
(
&
platform
->
component
);
mutex_unlock
(
&
client_mutex
);
mutex_unlock
(
&
client_mutex
);
snd_soc_component_cleanup
(
&
platform
->
component
);
dev_dbg
(
platform
->
dev
,
"ASoC: Unregistered platform '%s'
\n
"
,
dev_dbg
(
platform
->
dev
,
"ASoC: Unregistered platform '%s'
\n
"
,
platform
->
name
);
platform
->
component
.
name
);
kfree
(
platform
->
name
);
}
}
EXPORT_SYMBOL_GPL
(
snd_soc_remove_platform
);
EXPORT_SYMBOL_GPL
(
snd_soc_remove_platform
);
...
@@ -4292,6 +4256,14 @@ static int snd_soc_codec_drv_read(struct snd_soc_component *component,
...
@@ -4292,6 +4256,14 @@ static int snd_soc_codec_drv_read(struct snd_soc_component *component,
return
0
;
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
* snd_soc_register_codec - Register a codec with the ASoC core
*
*
...
@@ -4303,6 +4275,7 @@ int snd_soc_register_codec(struct device *dev,
...
@@ -4303,6 +4275,7 @@ int snd_soc_register_codec(struct device *dev,
int
num_dai
)
int
num_dai
)
{
{
struct
snd_soc_codec
*
codec
;
struct
snd_soc_codec
*
codec
;
struct
snd_soc_dai
*
dai
;
struct
regmap
*
regmap
;
struct
regmap
*
regmap
;
int
ret
,
i
;
int
ret
,
i
;
...
@@ -4312,24 +4285,23 @@ int snd_soc_register_codec(struct device *dev,
...
@@ -4312,24 +4285,23 @@ int snd_soc_register_codec(struct device *dev,
if
(
codec
==
NULL
)
if
(
codec
==
NULL
)
return
-
ENOMEM
;
return
-
ENOMEM
;
/* create CODEC component name */
codec
->
component
.
dapm_ptr
=
&
codec
->
dapm
;
codec
->
name
=
fmt_single_name
(
dev
,
&
codec
->
id
);
if
(
codec
->
name
==
NULL
)
{
ret
=
snd_soc_component_initialize
(
&
codec
->
component
,
ret
=
-
ENOMEM
;
&
codec_drv
->
component_driver
,
dev
)
;
goto
fail_codec
;
if
(
ret
)
}
goto
err_free
;
if
(
codec_drv
->
write
)
if
(
codec_drv
->
write
)
codec
->
component
.
write
=
snd_soc_codec_drv_write
;
codec
->
component
.
write
=
snd_soc_codec_drv_write
;
if
(
codec_drv
->
read
)
if
(
codec_drv
->
read
)
codec
->
component
.
read
=
snd_soc_codec_drv_read
;
codec
->
component
.
read
=
snd_soc_codec_drv_read
;
codec
->
component
.
ignore_pmdown_time
=
codec_drv
->
ignore_pmdown_time
;
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
.
codec
=
codec
;
codec
->
dapm
.
component
=
&
codec
->
component
;
if
(
codec_drv
->
seq_notifier
)
codec
->
dapm
.
seq_notifier
=
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
->
dev
=
dev
;
codec
->
driver
=
codec_drv
;
codec
->
driver
=
codec_drv
;
codec
->
component
.
val_bytes
=
codec_drv
->
reg_word_size
;
codec
->
component
.
val_bytes
=
codec_drv
->
reg_word_size
;
...
@@ -4348,7 +4320,7 @@ int snd_soc_register_codec(struct device *dev,
...
@@ -4348,7 +4320,7 @@ int snd_soc_register_codec(struct device *dev,
dev_err
(
codec
->
dev
,
dev_err
(
codec
->
dev
,
"Failed to set cache I/O:%d
\n
"
,
"Failed to set cache I/O:%d
\n
"
,
ret
);
ret
);
return
ret
;
goto
err_cleanup
;
}
}
}
}
}
}
...
@@ -4358,29 +4330,27 @@ int snd_soc_register_codec(struct device *dev,
...
@@ -4358,29 +4330,27 @@ int snd_soc_register_codec(struct device *dev,
fixup_codec_formats
(
&
dai_drv
[
i
].
capture
);
fixup_codec_formats
(
&
dai_drv
[
i
].
capture
);
}
}
mutex_lock
(
&
client_mutex
);
ret
=
snd_soc_register_dais
(
&
codec
->
component
,
dai_drv
,
num_dai
,
false
);
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
);
if
(
ret
<
0
)
{
if
(
ret
<
0
)
{
dev_err
(
codec
->
dev
,
"ASoC: Failed to regster component
: %d
\n
"
,
ret
);
dev_err
(
dev
,
"ASoC: Failed to regster DAIs
: %d
\n
"
,
ret
);
goto
fail_codec_name
;
goto
err_cleanup
;
}
}
dev_dbg
(
codec
->
dev
,
"ASoC: Registered codec '%s'
\n
"
,
codec
->
name
);
list_for_each_entry
(
dai
,
&
codec
->
component
.
dai_list
,
list
)
return
0
;
dai
->
codec
=
codec
;
fail_codec_name:
mutex_lock
(
&
client_mutex
);
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
);
mutex_unlock
(
&
client_mutex
);
kfree
(
codec
->
name
);
dev_dbg
(
codec
->
dev
,
"ASoC: Registered codec '%s'
\n
"
,
fail_codec:
codec
->
component
.
name
);
return
0
;
err_cleanup:
snd_soc_component_cleanup
(
&
codec
->
component
);
err_free:
kfree
(
codec
);
kfree
(
codec
);
return
ret
;
return
ret
;
}
}
...
@@ -4402,16 +4372,17 @@ void snd_soc_unregister_codec(struct device *dev)
...
@@ -4402,16 +4372,17 @@ void snd_soc_unregister_codec(struct device *dev)
return
;
return
;
found:
found:
__snd_soc_unregister_component
(
&
codec
->
component
);
mutex_lock
(
&
client_mutex
);
mutex_lock
(
&
client_mutex
);
list_del
(
&
codec
->
list
);
list_del
(
&
codec
->
list
);
snd_soc_component_del_unlocked
(
&
codec
->
component
);
mutex_unlock
(
&
client_mutex
);
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
);
snd_soc_cache_exit
(
codec
);
kfree
(
codec
->
name
);
kfree
(
codec
);
kfree
(
codec
);
}
}
EXPORT_SYMBOL_GPL
(
snd_soc_unregister_codec
);
EXPORT_SYMBOL_GPL
(
snd_soc_unregister_codec
);
...
...
sound/soc/soc-dapm.c
浏览文件 @
f7acb369
...
@@ -349,13 +349,28 @@ static bool dapm_kcontrol_set_value(const struct snd_kcontrol *kcontrol,
...
@@ -349,13 +349,28 @@ static bool dapm_kcontrol_set_value(const struct snd_kcontrol *kcontrol,
return
true
;
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
* snd_soc_dapm_kcontrol_codec() - Returns the codec associated to a kcontrol
* @kcontrol: The kcontrol
* @kcontrol: The kcontrol
*/
*/
struct
snd_soc_codec
*
snd_soc_dapm_kcontrol_codec
(
struct
snd_kcontrol
*
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
);
EXPORT_SYMBOL_GPL
(
snd_soc_dapm_kcontrol_codec
);
...
@@ -375,23 +390,38 @@ static void dapm_reset(struct snd_soc_card *card)
...
@@ -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
)
unsigned
int
*
value
)
{
{
if
(
!
w
->
dapm
->
component
)
if
(
!
dapm
->
component
)
return
-
EIO
;
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
)
int
reg
,
unsigned
int
mask
,
unsigned
int
value
)
{
{
if
(
!
w
->
dapm
->
component
)
if
(
!
dapm
->
component
)
return
-
EIO
;
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
);
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
)
static
void
soc_dapm_async_complete
(
struct
snd_soc_dapm_context
*
dapm
)
{
{
if
(
dapm
->
component
)
if
(
dapm
->
component
)
...
@@ -420,15 +450,10 @@ static int snd_soc_dapm_set_bias_level(struct snd_soc_dapm_context *dapm,
...
@@ -420,15 +450,10 @@ static int snd_soc_dapm_set_bias_level(struct snd_soc_dapm_context *dapm,
if
(
ret
!=
0
)
if
(
ret
!=
0
)
goto
out
;
goto
out
;
if
(
dapm
->
codec
)
{
if
(
dapm
->
set_bias_level
)
if
(
dapm
->
codec
->
driver
->
set_bias_level
)
ret
=
dapm
->
set_bias_level
(
dapm
,
level
);
ret
=
dapm
->
codec
->
driver
->
set_bias_level
(
dapm
->
codec
,
else
if
(
!
card
||
dapm
!=
&
card
->
dapm
)
level
);
else
dapm
->
bias_level
=
level
;
}
else
if
(
!
card
||
dapm
!=
&
card
->
dapm
)
{
dapm
->
bias_level
=
level
;
dapm
->
bias_level
=
level
;
}
if
(
ret
!=
0
)
if
(
ret
!=
0
)
goto
out
;
goto
out
;
...
@@ -452,7 +477,7 @@ static int dapm_connect_mux(struct snd_soc_dapm_context *dapm,
...
@@ -452,7 +477,7 @@ static int dapm_connect_mux(struct snd_soc_dapm_context *dapm,
int
i
;
int
i
;
if
(
e
->
reg
!=
SND_SOC_NOPM
)
{
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
;
val
=
(
val
>>
e
->
shift_l
)
&
e
->
mask
;
item
=
snd_soc_enum_val_to_item
(
e
,
val
);
item
=
snd_soc_enum_val_to_item
(
e
,
val
);
}
else
{
}
else
{
...
@@ -496,7 +521,7 @@ static void dapm_set_mixer_path_status(struct snd_soc_dapm_widget *w,
...
@@ -496,7 +521,7 @@ static void dapm_set_mixer_path_status(struct snd_soc_dapm_widget *w,
unsigned
int
val
;
unsigned
int
val
;
if
(
reg
!=
SND_SOC_NOPM
)
{
if
(
reg
!=
SND_SOC_NOPM
)
{
soc_
widget_read
(
w
,
reg
,
&
val
);
soc_
dapm_read
(
w
->
dapm
,
reg
,
&
val
);
val
=
(
val
>>
shift
)
&
mask
;
val
=
(
val
>>
shift
)
&
mask
;
if
(
invert
)
if
(
invert
)
val
=
max
-
val
;
val
=
max
-
val
;
...
@@ -570,11 +595,7 @@ static int dapm_create_or_share_mixmux_kcontrol(struct snd_soc_dapm_widget *w,
...
@@ -570,11 +595,7 @@ static int dapm_create_or_share_mixmux_kcontrol(struct snd_soc_dapm_widget *w,
const
char
*
name
;
const
char
*
name
;
int
ret
;
int
ret
;
if
(
dapm
->
codec
)
prefix
=
soc_dapm_prefix
(
dapm
);
prefix
=
dapm
->
codec
->
name_prefix
;
else
prefix
=
NULL
;
if
(
prefix
)
if
(
prefix
)
prefix_len
=
strlen
(
prefix
)
+
1
;
prefix_len
=
strlen
(
prefix
)
+
1
;
else
else
...
@@ -1308,16 +1329,18 @@ static void dapm_seq_check_event(struct snd_soc_card *card,
...
@@ -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
,
static
void
dapm_seq_run_coalesced
(
struct
snd_soc_card
*
card
,
struct
list_head
*
pending
)
struct
list_head
*
pending
)
{
{
struct
snd_soc_dapm_context
*
dapm
;
struct
snd_soc_dapm_widget
*
w
;
struct
snd_soc_dapm_widget
*
w
;
int
reg
;
int
reg
;
unsigned
int
value
=
0
;
unsigned
int
value
=
0
;
unsigned
int
mask
=
0
;
unsigned
int
mask
=
0
;
reg
=
list_first_entry
(
pending
,
struct
snd_soc_dapm_widget
,
w
=
list_first_entry
(
pending
,
struct
snd_soc_dapm_widget
,
power_list
);
power_list
)
->
reg
;
reg
=
w
->
reg
;
dapm
=
w
->
dapm
;
list_for_each_entry
(
w
,
pending
,
power_list
)
{
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
;
w
->
power
=
w
->
new_power
;
mask
|=
w
->
mask
<<
w
->
shift
;
mask
|=
w
->
mask
<<
w
->
shift
;
...
@@ -1326,7 +1349,7 @@ static void dapm_seq_run_coalesced(struct snd_soc_card *card,
...
@@ -1326,7 +1349,7 @@ static void dapm_seq_run_coalesced(struct snd_soc_card *card,
else
else
value
|=
w
->
off_val
<<
w
->
shift
;
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
"
,
"pop test : Queue %s: reg=0x%x, 0x%x/0x%x
\n
"
,
w
->
name
,
reg
,
value
,
mask
);
w
->
name
,
reg
,
value
,
mask
);
...
@@ -1339,14 +1362,12 @@ static void dapm_seq_run_coalesced(struct snd_soc_card *card,
...
@@ -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
/* Any widget will do, they should all be updating the
* same register.
* 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
"
,
"pop test : Applying 0x%x/0x%x to %x in %dms
\n
"
,
value
,
mask
,
reg
,
card
->
pop_time
);
value
,
mask
,
reg
,
card
->
pop_time
);
pop_wait
(
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
)
{
list_for_each_entry
(
w
,
pending
,
power_list
)
{
...
@@ -1492,7 +1513,8 @@ static void dapm_widget_update(struct snd_soc_card *card)
...
@@ -1492,7 +1513,8 @@ static void dapm_widget_update(struct snd_soc_card *card)
if
(
!
w
)
if
(
!
w
)
return
;
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
)
if
(
ret
<
0
)
dev_err
(
w
->
dapm
->
dev
,
"ASoC: %s DAPM update failed: %d
\n
"
,
dev_err
(
w
->
dapm
->
dev
,
"ASoC: %s DAPM update failed: %d
\n
"
,
w
->
name
,
ret
);
w
->
name
,
ret
);
...
@@ -2371,14 +2393,16 @@ static int snd_soc_dapm_add_route(struct snd_soc_dapm_context *dapm,
...
@@ -2371,14 +2393,16 @@ static int snd_soc_dapm_add_route(struct snd_soc_dapm_context *dapm,
const
char
*
source
;
const
char
*
source
;
char
prefixed_sink
[
80
];
char
prefixed_sink
[
80
];
char
prefixed_source
[
80
];
char
prefixed_source
[
80
];
const
char
*
prefix
;
int
ret
;
int
ret
;
if
(
dapm
->
codec
&&
dapm
->
codec
->
name_prefix
)
{
prefix
=
soc_dapm_prefix
(
dapm
);
if
(
prefix
)
{
snprintf
(
prefixed_sink
,
sizeof
(
prefixed_sink
),
"%s %s"
,
snprintf
(
prefixed_sink
,
sizeof
(
prefixed_sink
),
"%s %s"
,
dapm
->
codec
->
name_
prefix
,
route
->
sink
);
prefix
,
route
->
sink
);
sink
=
prefixed_sink
;
sink
=
prefixed_sink
;
snprintf
(
prefixed_source
,
sizeof
(
prefixed_source
),
"%s %s"
,
snprintf
(
prefixed_source
,
sizeof
(
prefixed_source
),
"%s %s"
,
dapm
->
codec
->
name_
prefix
,
route
->
source
);
prefix
,
route
->
source
);
source
=
prefixed_source
;
source
=
prefixed_source
;
}
else
{
}
else
{
sink
=
route
->
sink
;
sink
=
route
->
sink
;
...
@@ -2439,6 +2463,7 @@ static int snd_soc_dapm_del_route(struct snd_soc_dapm_context *dapm,
...
@@ -2439,6 +2463,7 @@ static int snd_soc_dapm_del_route(struct snd_soc_dapm_context *dapm,
const
char
*
source
;
const
char
*
source
;
char
prefixed_sink
[
80
];
char
prefixed_sink
[
80
];
char
prefixed_source
[
80
];
char
prefixed_source
[
80
];
const
char
*
prefix
;
if
(
route
->
control
)
{
if
(
route
->
control
)
{
dev_err
(
dapm
->
dev
,
dev_err
(
dapm
->
dev
,
...
@@ -2446,12 +2471,13 @@ static int snd_soc_dapm_del_route(struct snd_soc_dapm_context *dapm,
...
@@ -2446,12 +2471,13 @@ static int snd_soc_dapm_del_route(struct snd_soc_dapm_context *dapm,
return
-
EINVAL
;
return
-
EINVAL
;
}
}
if
(
dapm
->
codec
&&
dapm
->
codec
->
name_prefix
)
{
prefix
=
soc_dapm_prefix
(
dapm
);
if
(
prefix
)
{
snprintf
(
prefixed_sink
,
sizeof
(
prefixed_sink
),
"%s %s"
,
snprintf
(
prefixed_sink
,
sizeof
(
prefixed_sink
),
"%s %s"
,
dapm
->
codec
->
name_
prefix
,
route
->
sink
);
prefix
,
route
->
sink
);
sink
=
prefixed_sink
;
sink
=
prefixed_sink
;
snprintf
(
prefixed_source
,
sizeof
(
prefixed_source
),
"%s %s"
,
snprintf
(
prefixed_source
,
sizeof
(
prefixed_source
),
"%s %s"
,
dapm
->
codec
->
name_
prefix
,
route
->
source
);
prefix
,
route
->
source
);
source
=
prefixed_source
;
source
=
prefixed_source
;
}
else
{
}
else
{
sink
=
route
->
sink
;
sink
=
route
->
sink
;
...
@@ -2670,7 +2696,7 @@ int snd_soc_dapm_new_widgets(struct snd_soc_card *card)
...
@@ -2670,7 +2696,7 @@ int snd_soc_dapm_new_widgets(struct snd_soc_card *card)
/* Read the initial power state from the device */
/* Read the initial power state from the device */
if
(
w
->
reg
>=
0
)
{
if
(
w
->
reg
>=
0
)
{
soc_
widget_read
(
w
,
w
->
reg
,
&
val
);
soc_
dapm_read
(
w
->
dapm
,
w
->
reg
,
&
val
);
val
=
val
>>
w
->
shift
;
val
=
val
>>
w
->
shift
;
val
&=
w
->
mask
;
val
&=
w
->
mask
;
if
(
val
==
w
->
on_val
)
if
(
val
==
w
->
on_val
)
...
@@ -2701,8 +2727,8 @@ EXPORT_SYMBOL_GPL(snd_soc_dapm_new_widgets);
...
@@ -2701,8 +2727,8 @@ EXPORT_SYMBOL_GPL(snd_soc_dapm_new_widgets);
int
snd_soc_dapm_get_volsw
(
struct
snd_kcontrol
*
kcontrol
,
int
snd_soc_dapm_get_volsw
(
struct
snd_kcontrol
*
kcontrol
,
struct
snd_ctl_elem_value
*
ucontrol
)
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
snd_soc_card
*
card
=
codec
->
card
;
struct
snd_soc_card
*
card
=
dapm
->
card
;
struct
soc_mixer_control
*
mc
=
struct
soc_mixer_control
*
mc
=
(
struct
soc_mixer_control
*
)
kcontrol
->
private_value
;
(
struct
soc_mixer_control
*
)
kcontrol
->
private_value
;
int
reg
=
mc
->
reg
;
int
reg
=
mc
->
reg
;
...
@@ -2711,17 +2737,20 @@ int snd_soc_dapm_get_volsw(struct snd_kcontrol *kcontrol,
...
@@ -2711,17 +2737,20 @@ int snd_soc_dapm_get_volsw(struct snd_kcontrol *kcontrol,
unsigned
int
mask
=
(
1
<<
fls
(
max
))
-
1
;
unsigned
int
mask
=
(
1
<<
fls
(
max
))
-
1
;
unsigned
int
invert
=
mc
->
invert
;
unsigned
int
invert
=
mc
->
invert
;
unsigned
int
val
;
unsigned
int
val
;
int
ret
=
0
;
if
(
snd_soc_volsw_is_stereo
(
mc
))
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
"
,
"ASoC: Control '%s' is stereo, which is not supported
\n
"
,
kcontrol
->
id
.
name
);
kcontrol
->
id
.
name
);
mutex_lock_nested
(
&
card
->
dapm_mutex
,
SND_SOC_DAPM_CLASS_RUNTIME
);
mutex_lock_nested
(
&
card
->
dapm_mutex
,
SND_SOC_DAPM_CLASS_RUNTIME
);
if
(
dapm_kcontrol_is_powered
(
kcontrol
)
&&
reg
!=
SND_SOC_NOPM
)
if
(
dapm_kcontrol_is_powered
(
kcontrol
)
&&
reg
!=
SND_SOC_NOPM
)
{
val
=
(
snd_soc_read
(
codec
,
reg
)
>>
shift
)
&
mask
;
ret
=
soc_dapm_read
(
dapm
,
reg
,
&
val
);
else
val
=
(
val
>>
shift
)
&
mask
;
}
else
{
val
=
dapm_kcontrol_get_value
(
kcontrol
);
val
=
dapm_kcontrol_get_value
(
kcontrol
);
}
mutex_unlock
(
&
card
->
dapm_mutex
);
mutex_unlock
(
&
card
->
dapm_mutex
);
if
(
invert
)
if
(
invert
)
...
@@ -2729,7 +2758,7 @@ int snd_soc_dapm_get_volsw(struct snd_kcontrol *kcontrol,
...
@@ -2729,7 +2758,7 @@ int snd_soc_dapm_get_volsw(struct snd_kcontrol *kcontrol,
else
else
ucontrol
->
value
.
integer
.
value
[
0
]
=
val
;
ucontrol
->
value
.
integer
.
value
[
0
]
=
val
;
return
0
;
return
ret
;
}
}
EXPORT_SYMBOL_GPL
(
snd_soc_dapm_get_volsw
);
EXPORT_SYMBOL_GPL
(
snd_soc_dapm_get_volsw
);
...
@@ -2745,8 +2774,8 @@ 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
,
int
snd_soc_dapm_put_volsw
(
struct
snd_kcontrol
*
kcontrol
,
struct
snd_ctl_elem_value
*
ucontrol
)
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
snd_soc_card
*
card
=
codec
->
card
;
struct
snd_soc_card
*
card
=
dapm
->
card
;
struct
soc_mixer_control
*
mc
=
struct
soc_mixer_control
*
mc
=
(
struct
soc_mixer_control
*
)
kcontrol
->
private_value
;
(
struct
soc_mixer_control
*
)
kcontrol
->
private_value
;
int
reg
=
mc
->
reg
;
int
reg
=
mc
->
reg
;
...
@@ -2755,12 +2784,12 @@ int snd_soc_dapm_put_volsw(struct snd_kcontrol *kcontrol,
...
@@ -2755,12 +2784,12 @@ int snd_soc_dapm_put_volsw(struct snd_kcontrol *kcontrol,
unsigned
int
mask
=
(
1
<<
fls
(
max
))
-
1
;
unsigned
int
mask
=
(
1
<<
fls
(
max
))
-
1
;
unsigned
int
invert
=
mc
->
invert
;
unsigned
int
invert
=
mc
->
invert
;
unsigned
int
val
;
unsigned
int
val
;
int
connect
,
change
;
int
connect
,
change
,
reg_change
=
0
;
struct
snd_soc_dapm_update
update
;
struct
snd_soc_dapm_update
update
;
int
ret
=
0
;
int
ret
=
0
;
if
(
snd_soc_volsw_is_stereo
(
mc
))
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
"
,
"ASoC: Control '%s' is stereo, which is not supported
\n
"
,
kcontrol
->
id
.
name
);
kcontrol
->
id
.
name
);
...
@@ -2773,20 +2802,23 @@ int snd_soc_dapm_put_volsw(struct snd_kcontrol *kcontrol,
...
@@ -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
);
mutex_lock_nested
(
&
card
->
dapm_mutex
,
SND_SOC_DAPM_CLASS_RUNTIME
);
change
=
dapm_kcontrol_set_value
(
kcontrol
,
val
);
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
))
{
update
.
kcontrol
=
kcontrol
;
update
.
reg
=
reg
;
update
.
mask
=
mask
;
update
.
val
=
val
;
card
->
update
=
&
update
;
}
if
(
reg
!=
SND_SOC_NOPM
)
{
mask
=
mask
<<
shift
;
val
=
val
<<
shift
;
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
);
ret
=
soc_dapm_mixer_update_power
(
card
,
kcontrol
,
connect
);
...
@@ -2814,12 +2846,13 @@ EXPORT_SYMBOL_GPL(snd_soc_dapm_put_volsw);
...
@@ -2814,12 +2846,13 @@ EXPORT_SYMBOL_GPL(snd_soc_dapm_put_volsw);
int
snd_soc_dapm_get_enum_double
(
struct
snd_kcontrol
*
kcontrol
,
int
snd_soc_dapm_get_enum_double
(
struct
snd_kcontrol
*
kcontrol
,
struct
snd_ctl_elem_value
*
ucontrol
)
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
;
struct
soc_enum
*
e
=
(
struct
soc_enum
*
)
kcontrol
->
private_value
;
unsigned
int
reg_val
,
val
;
unsigned
int
reg_val
,
val
;
int
ret
=
0
;
if
(
e
->
reg
!=
SND_SOC_NOPM
)
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
else
reg_val
=
dapm_kcontrol_get_value
(
kcontrol
);
reg_val
=
dapm_kcontrol_get_value
(
kcontrol
);
...
@@ -2831,7 +2864,7 @@ int snd_soc_dapm_get_enum_double(struct snd_kcontrol *kcontrol,
...
@@ -2831,7 +2864,7 @@ int snd_soc_dapm_get_enum_double(struct snd_kcontrol *kcontrol,
ucontrol
->
value
.
enumerated
.
item
[
1
]
=
val
;
ucontrol
->
value
.
enumerated
.
item
[
1
]
=
val
;
}
}
return
0
;
return
ret
;
}
}
EXPORT_SYMBOL_GPL
(
snd_soc_dapm_get_enum_double
);
EXPORT_SYMBOL_GPL
(
snd_soc_dapm_get_enum_double
);
...
@@ -2847,8 +2880,8 @@ 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
,
int
snd_soc_dapm_put_enum_double
(
struct
snd_kcontrol
*
kcontrol
,
struct
snd_ctl_elem_value
*
ucontrol
)
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
snd_soc_card
*
card
=
codec
->
card
;
struct
snd_soc_card
*
card
=
dapm
->
card
;
struct
soc_enum
*
e
=
(
struct
soc_enum
*
)
kcontrol
->
private_value
;
struct
soc_enum
*
e
=
(
struct
soc_enum
*
)
kcontrol
->
private_value
;
unsigned
int
*
item
=
ucontrol
->
value
.
enumerated
.
item
;
unsigned
int
*
item
=
ucontrol
->
value
.
enumerated
.
item
;
unsigned
int
val
,
change
;
unsigned
int
val
,
change
;
...
@@ -2871,7 +2904,7 @@ int snd_soc_dapm_put_enum_double(struct snd_kcontrol *kcontrol,
...
@@ -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
);
mutex_lock_nested
(
&
card
->
dapm_mutex
,
SND_SOC_DAPM_CLASS_RUNTIME
);
if
(
e
->
reg
!=
SND_SOC_NOPM
)
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
else
change
=
dapm_kcontrol_set_value
(
kcontrol
,
val
);
change
=
dapm_kcontrol_set_value
(
kcontrol
,
val
);
...
@@ -2968,6 +3001,7 @@ snd_soc_dapm_new_control(struct snd_soc_dapm_context *dapm,
...
@@ -2968,6 +3001,7 @@ snd_soc_dapm_new_control(struct snd_soc_dapm_context *dapm,
const
struct
snd_soc_dapm_widget
*
widget
)
const
struct
snd_soc_dapm_widget
*
widget
)
{
{
struct
snd_soc_dapm_widget
*
w
;
struct
snd_soc_dapm_widget
*
w
;
const
char
*
prefix
;
int
ret
;
int
ret
;
if
((
w
=
dapm_cnew_widget
(
widget
))
==
NULL
)
if
((
w
=
dapm_cnew_widget
(
widget
))
==
NULL
)
...
@@ -3008,9 +3042,9 @@ snd_soc_dapm_new_control(struct snd_soc_dapm_context *dapm,
...
@@ -3008,9 +3042,9 @@ snd_soc_dapm_new_control(struct snd_soc_dapm_context *dapm,
break
;
break
;
}
}
if
(
dapm
->
codec
&&
dapm
->
codec
->
name_prefix
)
prefix
=
soc_dapm_prefix
(
dapm
);
w
->
name
=
kasprintf
(
GFP_KERNEL
,
"%s %s"
,
if
(
prefix
)
dapm
->
codec
->
name_
prefix
,
widget
->
name
);
w
->
name
=
kasprintf
(
GFP_KERNEL
,
"%s %s"
,
prefix
,
widget
->
name
);
else
else
w
->
name
=
kasprintf
(
GFP_KERNEL
,
"%s"
,
widget
->
name
);
w
->
name
=
kasprintf
(
GFP_KERNEL
,
"%s"
,
widget
->
name
);
...
@@ -3063,7 +3097,6 @@ snd_soc_dapm_new_control(struct snd_soc_dapm_context *dapm,
...
@@ -3063,7 +3097,6 @@ snd_soc_dapm_new_control(struct snd_soc_dapm_context *dapm,
w
->
dapm
=
dapm
;
w
->
dapm
=
dapm
;
w
->
codec
=
dapm
->
codec
;
w
->
codec
=
dapm
->
codec
;
w
->
platform
=
dapm
->
platform
;
INIT_LIST_HEAD
(
&
w
->
sources
);
INIT_LIST_HEAD
(
&
w
->
sources
);
INIT_LIST_HEAD
(
&
w
->
sinks
);
INIT_LIST_HEAD
(
&
w
->
sinks
);
INIT_LIST_HEAD
(
&
w
->
list
);
INIT_LIST_HEAD
(
&
w
->
list
);
...
@@ -3392,8 +3425,8 @@ void snd_soc_dapm_connect_dai_link_widgets(struct snd_soc_card *card)
...
@@ -3392,8 +3425,8 @@ void snd_soc_dapm_connect_dai_link_widgets(struct snd_soc_card *card)
source
=
cpu_dai
->
playback_widget
;
source
=
cpu_dai
->
playback_widget
;
sink
=
codec_dai
->
playback_widget
;
sink
=
codec_dai
->
playback_widget
;
dev_dbg
(
rtd
->
dev
,
"connected DAI link %s:%s -> %s:%s
\n
"
,
dev_dbg
(
rtd
->
dev
,
"connected DAI link %s:%s -> %s:%s
\n
"
,
cpu_dai
->
co
dec
->
name
,
source
->
name
,
cpu_dai
->
co
mponent
->
name
,
source
->
name
,
codec_dai
->
platform
->
name
,
sink
->
name
);
codec_dai
->
component
->
name
,
sink
->
name
);
snd_soc_dapm_add_path
(
&
card
->
dapm
,
source
,
sink
,
snd_soc_dapm_add_path
(
&
card
->
dapm
,
source
,
sink
,
NULL
,
NULL
);
NULL
,
NULL
);
...
@@ -3404,8 +3437,8 @@ void snd_soc_dapm_connect_dai_link_widgets(struct snd_soc_card *card)
...
@@ -3404,8 +3437,8 @@ void snd_soc_dapm_connect_dai_link_widgets(struct snd_soc_card *card)
source
=
codec_dai
->
capture_widget
;
source
=
codec_dai
->
capture_widget
;
sink
=
cpu_dai
->
capture_widget
;
sink
=
cpu_dai
->
capture_widget
;
dev_dbg
(
rtd
->
dev
,
"connected DAI link %s:%s -> %s:%s
\n
"
,
dev_dbg
(
rtd
->
dev
,
"connected DAI link %s:%s -> %s:%s
\n
"
,
codec_dai
->
co
dec
->
name
,
source
->
name
,
codec_dai
->
co
mponent
->
name
,
source
->
name
,
cpu_dai
->
platform
->
name
,
sink
->
name
);
cpu_dai
->
component
->
name
,
sink
->
name
);
snd_soc_dapm_add_path
(
&
card
->
dapm
,
source
,
sink
,
snd_soc_dapm_add_path
(
&
card
->
dapm
,
source
,
sink
,
NULL
,
NULL
);
NULL
,
NULL
);
...
@@ -3755,36 +3788,31 @@ static bool snd_soc_dapm_widget_in_card_paths(struct snd_soc_card *card,
...
@@ -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
* snd_soc_dapm_auto_nc_pins - call snd_soc_dapm_nc_pin for unused pins
* @c
odec: The codec
whose pins should be processed
* @c
ard: The card
whose pins should be processed
*
*
* Automatically call snd_soc_dapm_nc_pin() for any external pins in the c
odec
* 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
the
* which are unused. Pins are used if they are connected externally to
a
* co
dec
, whether that be to some other device, or a loop-back connection to
* co
mponent
, whether that be to some other device, or a loop-back connection to
* the co
dec
itself.
* 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
;
struct
snd_soc_dapm_widget
*
w
;
dev_dbg
(
codec
->
dev
,
"ASoC: Auto NC: DAPMs: card:%p codec:%p
\n
"
,
dev_dbg
(
card
->
dev
,
"ASoC: Auto NC: DAPMs: card:%p
\n
"
,
&
card
->
dapm
);
&
card
->
dapm
,
&
codec
->
dapm
);
list_for_each_entry
(
w
,
&
card
->
widgets
,
list
)
{
list_for_each_entry
(
w
,
&
card
->
widgets
,
list
)
{
if
(
w
->
dapm
!=
dapm
)
continue
;
switch
(
w
->
id
)
{
switch
(
w
->
id
)
{
case
snd_soc_dapm_input
:
case
snd_soc_dapm_input
:
case
snd_soc_dapm_output
:
case
snd_soc_dapm_output
:
case
snd_soc_dapm_micbias
:
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
);
w
->
name
);
if
(
!
snd_soc_dapm_widget_in_card_paths
(
card
,
w
))
{
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
"
);
"... Not in map; disabling
\n
"
);
snd_soc_dapm_nc_pin
(
dapm
,
w
->
name
);
snd_soc_dapm_nc_pin
(
w
->
dapm
,
w
->
name
);
}
}
break
;
break
;
default:
default:
...
...
sound/soc/soc-pcm.c
浏览文件 @
f7acb369
...
@@ -390,7 +390,7 @@ static int soc_pcm_open(struct snd_pcm_substream *substream)
...
@@ -390,7 +390,7 @@ static int soc_pcm_open(struct snd_pcm_substream *substream)
ret
=
platform
->
driver
->
ops
->
open
(
substream
);
ret
=
platform
->
driver
->
ops
->
open
(
substream
);
if
(
ret
<
0
)
{
if
(
ret
<
0
)
{
dev_err
(
platform
->
dev
,
"ASoC: can't open platform"
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
;
goto
platform_err
;
}
}
}
}
...
@@ -720,7 +720,7 @@ static int soc_pcm_hw_params(struct snd_pcm_substream *substream,
...
@@ -720,7 +720,7 @@ static int soc_pcm_hw_params(struct snd_pcm_substream *substream,
ret
=
platform
->
driver
->
ops
->
hw_params
(
substream
,
params
);
ret
=
platform
->
driver
->
ops
->
hw_params
(
substream
,
params
);
if
(
ret
<
0
)
{
if
(
ret
<
0
)
{
dev_err
(
platform
->
dev
,
"ASoC: %s hw params failed: %d
\n
"
,
dev_err
(
platform
->
dev
,
"ASoC: %s hw params failed: %d
\n
"
,
platform
->
name
,
ret
);
platform
->
component
.
name
,
ret
);
goto
platform_err
;
goto
platform_err
;
}
}
}
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录