Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
aa38bff8
cloud-kernel
项目概览
openanolis
/
cloud-kernel
1 年多 前同步成功
通知
160
Star
36
Fork
7
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
10
列表
看板
标记
里程碑
合并请求
2
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
cloud-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
10
Issue
10
列表
看板
标记
里程碑
合并请求
2
合并请求
2
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
aa38bff8
编写于
11月 10, 2017
作者:
M
Mark Brown
浏览文件
操作
浏览文件
下载
差异文件
Merge remote-tracking branch 'asoc/topic/core' into asoc-next
上级
73e13d0f
e07bd30b
变更
6
展开全部
隐藏空白更改
内联
并排
Showing
6 changed file
with
1090 addition
and
138 deletion
+1090
-138
include/sound/soc.h
include/sound/soc.h
+94
-0
sound/soc/soc-compress.c
sound/soc/soc-compress.c
+427
-34
sound/soc/soc-core.c
sound/soc/soc-core.c
+142
-50
sound/soc/soc-dapm.c
sound/soc/soc-dapm.c
+4
-4
sound/soc/soc-io.c
sound/soc/soc-io.c
+14
-0
sound/soc/soc-pcm.c
sound/soc/soc-pcm.c
+409
-50
未找到文件。
include/sound/soc.h
浏览文件 @
aa38bff8
...
...
@@ -480,6 +480,8 @@ int devm_snd_soc_register_component(struct device *dev,
const
struct
snd_soc_component_driver
*
component_driver
,
struct
snd_soc_dai_driver
*
dai_drv
,
int
num_dai
);
void
snd_soc_unregister_component
(
struct
device
*
dev
);
struct
snd_soc_component
*
snd_soc_lookup_component
(
struct
device
*
dev
,
const
char
*
driver_name
);
int
snd_soc_cache_init
(
struct
snd_soc_codec
*
codec
);
int
snd_soc_cache_exit
(
struct
snd_soc_codec
*
codec
);
...
...
@@ -800,6 +802,10 @@ struct snd_soc_component_driver {
int
(
*
suspend
)(
struct
snd_soc_component
*
);
int
(
*
resume
)(
struct
snd_soc_component
*
);
/* pcm creation and destruction */
int
(
*
pcm_new
)(
struct
snd_soc_pcm_runtime
*
);
void
(
*
pcm_free
)(
struct
snd_pcm
*
);
/* component wide operations */
int
(
*
set_sysclk
)(
struct
snd_soc_component
*
component
,
int
clk_id
,
int
source
,
unsigned
int
freq
,
int
dir
);
...
...
@@ -817,10 +823,22 @@ struct snd_soc_component_driver {
void
(
*
seq_notifier
)(
struct
snd_soc_component
*
,
enum
snd_soc_dapm_type
,
int
subseq
);
int
(
*
stream_event
)(
struct
snd_soc_component
*
,
int
event
);
int
(
*
set_bias_level
)(
struct
snd_soc_component
*
component
,
enum
snd_soc_bias_level
level
);
const
struct
snd_pcm_ops
*
ops
;
const
struct
snd_compr_ops
*
compr_ops
;
/* probe ordering - for components with runtime dependencies */
int
probe_order
;
int
remove_order
;
/* bits */
unsigned
int
idle_bias_on
:
1
;
unsigned
int
suspend_bias_off
:
1
;
unsigned
int
pmdown_time
:
1
;
/* care pmdown_time at stop */
unsigned
int
endianness
:
1
;
unsigned
int
non_legacy_dai_naming
:
1
;
};
struct
snd_soc_component
{
...
...
@@ -877,6 +895,8 @@ struct snd_soc_component {
void
(
*
remove
)(
struct
snd_soc_component
*
);
int
(
*
suspend
)(
struct
snd_soc_component
*
);
int
(
*
resume
)(
struct
snd_soc_component
*
);
int
(
*
pcm_new
)(
struct
snd_soc_component
*
,
struct
snd_soc_pcm_runtime
*
);
void
(
*
pcm_free
)(
struct
snd_soc_component
*
,
struct
snd_pcm
*
);
int
(
*
set_sysclk
)(
struct
snd_soc_component
*
component
,
int
clk_id
,
int
source
,
unsigned
int
freq
,
int
dir
);
...
...
@@ -884,6 +904,8 @@ struct snd_soc_component {
int
source
,
unsigned
int
freq_in
,
unsigned
int
freq_out
);
int
(
*
set_jack
)(
struct
snd_soc_component
*
component
,
struct
snd_soc_jack
*
jack
,
void
*
data
);
int
(
*
set_bias_level
)(
struct
snd_soc_component
*
component
,
enum
snd_soc_bias_level
level
);
/* machine specific init */
int
(
*
init
)(
struct
snd_soc_component
*
component
);
...
...
@@ -1417,6 +1439,21 @@ static inline void snd_soc_codec_init_bias_level(struct snd_soc_codec *codec,
snd_soc_dapm_init_bias_level
(
snd_soc_codec_get_dapm
(
codec
),
level
);
}
/**
* snd_soc_component_init_bias_level() - Initialize COMPONENT DAPM bias level
* @component: The COMPONENT for which to initialize the DAPM bias level
* @level: The DAPM level to initialize to
*
* Initializes the COMPONENT DAPM bias level. See snd_soc_dapm_init_bias_level().
*/
static
inline
void
snd_soc_component_init_bias_level
(
struct
snd_soc_component
*
component
,
enum
snd_soc_bias_level
level
)
{
snd_soc_dapm_init_bias_level
(
snd_soc_component_get_dapm
(
component
),
level
);
}
/**
* snd_soc_dapm_get_bias_level() - Get current CODEC DAPM bias level
* @codec: The CODEC for which to get the DAPM bias level
...
...
@@ -1429,6 +1466,19 @@ static inline enum snd_soc_bias_level snd_soc_codec_get_bias_level(
return
snd_soc_dapm_get_bias_level
(
snd_soc_codec_get_dapm
(
codec
));
}
/**
* snd_soc_component_get_bias_level() - Get current COMPONENT DAPM bias level
* @component: The COMPONENT for which to get the DAPM bias level
*
* Returns: The current DAPM bias level of the COMPONENT.
*/
static
inline
enum
snd_soc_bias_level
snd_soc_component_get_bias_level
(
struct
snd_soc_component
*
component
)
{
return
snd_soc_dapm_get_bias_level
(
snd_soc_component_get_dapm
(
component
));
}
/**
* snd_soc_codec_force_bias_level() - Set the CODEC DAPM bias level
* @codec: The CODEC for which to set the level
...
...
@@ -1444,6 +1494,23 @@ static inline int snd_soc_codec_force_bias_level(struct snd_soc_codec *codec,
level
);
}
/**
* snd_soc_component_force_bias_level() - Set the COMPONENT DAPM bias level
* @component: The COMPONENT for which to set the level
* @level: The level to set to
*
* Forces the COMPONENT bias level to a specific state. See
* snd_soc_dapm_force_bias_level().
*/
static
inline
int
snd_soc_component_force_bias_level
(
struct
snd_soc_component
*
component
,
enum
snd_soc_bias_level
level
)
{
return
snd_soc_dapm_force_bias_level
(
snd_soc_component_get_dapm
(
component
),
level
);
}
/**
* snd_soc_dapm_kcontrol_codec() - Returns the codec associated to a kcontrol
* @kcontrol: The kcontrol
...
...
@@ -1457,6 +1524,19 @@ static inline struct snd_soc_codec *snd_soc_dapm_kcontrol_codec(
return
snd_soc_dapm_to_codec
(
snd_soc_dapm_kcontrol_dapm
(
kcontrol
));
}
/**
* snd_soc_dapm_kcontrol_component() - Returns the component associated to a kcontrol
* @kcontrol: The kcontrol
*
* 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_kcontrol_component
(
struct
snd_kcontrol
*
kcontrol
)
{
return
snd_soc_dapm_to_component
(
snd_soc_dapm_kcontrol_dapm
(
kcontrol
));
}
/* codec IO */
unsigned
int
snd_soc_read
(
struct
snd_soc_codec
*
codec
,
unsigned
int
reg
);
int
snd_soc_write
(
struct
snd_soc_codec
*
codec
,
unsigned
int
reg
,
...
...
@@ -1473,9 +1553,23 @@ static inline int snd_soc_cache_sync(struct snd_soc_codec *codec)
return
regcache_sync
(
codec
->
component
.
regmap
);
}
/**
* snd_soc_component_cache_sync() - Sync the register cache with the hardware
* @component: COMPONENT to sync
*
* Note: This function will call regcache_sync()
*/
static
inline
int
snd_soc_component_cache_sync
(
struct
snd_soc_component
*
component
)
{
return
regcache_sync
(
component
->
regmap
);
}
/* component IO */
int
snd_soc_component_read
(
struct
snd_soc_component
*
component
,
unsigned
int
reg
,
unsigned
int
*
val
);
unsigned
int
snd_soc_component_read32
(
struct
snd_soc_component
*
component
,
unsigned
int
reg
);
int
snd_soc_component_write
(
struct
snd_soc_component
*
component
,
unsigned
int
reg
,
unsigned
int
val
);
int
snd_soc_component_update_bits
(
struct
snd_soc_component
*
component
,
...
...
sound/soc/soc-compress.c
浏览文件 @
aa38bff8
此差异已折叠。
点击以展开。
sound/soc/soc-core.c
浏览文件 @
aa38bff8
...
...
@@ -614,6 +614,8 @@ struct snd_pcm_substream *snd_soc_get_dai_substream(struct snd_soc_card *card,
}
EXPORT_SYMBOL_GPL
(
snd_soc_get_dai_substream
);
static
const
struct
snd_soc_ops
null_snd_soc_ops
;
static
struct
snd_soc_pcm_runtime
*
soc_new_pcm_runtime
(
struct
snd_soc_card
*
card
,
struct
snd_soc_dai_link
*
dai_link
)
{
...
...
@@ -626,6 +628,9 @@ static struct snd_soc_pcm_runtime *soc_new_pcm_runtime(
INIT_LIST_HEAD
(
&
rtd
->
component_list
);
rtd
->
card
=
card
;
rtd
->
dai_link
=
dai_link
;
if
(
!
rtd
->
dai_link
->
ops
)
rtd
->
dai_link
->
ops
=
&
null_snd_soc_ops
;
rtd
->
codec_dais
=
kzalloc
(
sizeof
(
struct
snd_soc_dai
*
)
*
dai_link
->
num_codecs
,
GFP_KERNEL
);
...
...
@@ -639,8 +644,7 @@ static struct snd_soc_pcm_runtime *soc_new_pcm_runtime(
static
void
soc_free_pcm_runtime
(
struct
snd_soc_pcm_runtime
*
rtd
)
{
if
(
rtd
&&
rtd
->
codec_dais
)
kfree
(
rtd
->
codec_dais
);
kfree
(
rtd
->
codec_dais
);
snd_soc_rtdcom_del_all
(
rtd
);
kfree
(
rtd
);
}
...
...
@@ -2632,7 +2636,7 @@ EXPORT_SYMBOL_GPL(snd_soc_add_dai_controls);
int
snd_soc_dai_set_sysclk
(
struct
snd_soc_dai
*
dai
,
int
clk_id
,
unsigned
int
freq
,
int
dir
)
{
if
(
dai
->
driver
&&
dai
->
driver
->
ops
->
set_sysclk
)
if
(
dai
->
driver
->
ops
->
set_sysclk
)
return
dai
->
driver
->
ops
->
set_sysclk
(
dai
,
clk_id
,
freq
,
dir
);
return
snd_soc_component_set_sysclk
(
dai
->
component
,
clk_id
,
0
,
...
...
@@ -2700,7 +2704,7 @@ EXPORT_SYMBOL_GPL(snd_soc_component_set_sysclk);
int
snd_soc_dai_set_clkdiv
(
struct
snd_soc_dai
*
dai
,
int
div_id
,
int
div
)
{
if
(
dai
->
driver
&&
dai
->
driver
->
ops
->
set_clkdiv
)
if
(
dai
->
driver
->
ops
->
set_clkdiv
)
return
dai
->
driver
->
ops
->
set_clkdiv
(
dai
,
div_id
,
div
);
else
return
-
EINVAL
;
...
...
@@ -2720,7 +2724,7 @@ EXPORT_SYMBOL_GPL(snd_soc_dai_set_clkdiv);
int
snd_soc_dai_set_pll
(
struct
snd_soc_dai
*
dai
,
int
pll_id
,
int
source
,
unsigned
int
freq_in
,
unsigned
int
freq_out
)
{
if
(
dai
->
driver
&&
dai
->
driver
->
ops
->
set_pll
)
if
(
dai
->
driver
->
ops
->
set_pll
)
return
dai
->
driver
->
ops
->
set_pll
(
dai
,
pll_id
,
source
,
freq_in
,
freq_out
);
...
...
@@ -2786,7 +2790,7 @@ EXPORT_SYMBOL_GPL(snd_soc_component_set_pll);
*/
int
snd_soc_dai_set_bclk_ratio
(
struct
snd_soc_dai
*
dai
,
unsigned
int
ratio
)
{
if
(
dai
->
driver
&&
dai
->
driver
->
ops
->
set_bclk_ratio
)
if
(
dai
->
driver
->
ops
->
set_bclk_ratio
)
return
dai
->
driver
->
ops
->
set_bclk_ratio
(
dai
,
ratio
);
else
return
-
EINVAL
;
...
...
@@ -2860,7 +2864,7 @@ static int snd_soc_xlate_tdm_slot_mask(unsigned int slots,
int
snd_soc_dai_set_tdm_slot
(
struct
snd_soc_dai
*
dai
,
unsigned
int
tx_mask
,
unsigned
int
rx_mask
,
int
slots
,
int
slot_width
)
{
if
(
dai
->
driver
&&
dai
->
driver
->
ops
->
xlate_tdm_slot_mask
)
if
(
dai
->
driver
->
ops
->
xlate_tdm_slot_mask
)
dai
->
driver
->
ops
->
xlate_tdm_slot_mask
(
slots
,
&
tx_mask
,
&
rx_mask
);
else
...
...
@@ -2869,7 +2873,7 @@ int snd_soc_dai_set_tdm_slot(struct snd_soc_dai *dai,
dai
->
tx_mask
=
tx_mask
;
dai
->
rx_mask
=
rx_mask
;
if
(
dai
->
driver
&&
dai
->
driver
->
ops
->
set_tdm_slot
)
if
(
dai
->
driver
->
ops
->
set_tdm_slot
)
return
dai
->
driver
->
ops
->
set_tdm_slot
(
dai
,
tx_mask
,
rx_mask
,
slots
,
slot_width
);
else
...
...
@@ -2893,7 +2897,7 @@ int snd_soc_dai_set_channel_map(struct snd_soc_dai *dai,
unsigned
int
tx_num
,
unsigned
int
*
tx_slot
,
unsigned
int
rx_num
,
unsigned
int
*
rx_slot
)
{
if
(
dai
->
driver
&&
dai
->
driver
->
ops
->
set_channel_map
)
if
(
dai
->
driver
->
ops
->
set_channel_map
)
return
dai
->
driver
->
ops
->
set_channel_map
(
dai
,
tx_num
,
tx_slot
,
rx_num
,
rx_slot
);
else
...
...
@@ -2910,7 +2914,7 @@ EXPORT_SYMBOL_GPL(snd_soc_dai_set_channel_map);
*/
int
snd_soc_dai_set_tristate
(
struct
snd_soc_dai
*
dai
,
int
tristate
)
{
if
(
dai
->
driver
&&
dai
->
driver
->
ops
->
set_tristate
)
if
(
dai
->
driver
->
ops
->
set_tristate
)
return
dai
->
driver
->
ops
->
set_tristate
(
dai
,
tristate
);
else
return
-
EINVAL
;
...
...
@@ -3250,6 +3254,30 @@ static int snd_soc_component_stream_event(struct snd_soc_dapm_context *dapm,
return
component
->
driver
->
stream_event
(
component
,
event
);
}
static
int
snd_soc_component_drv_pcm_new
(
struct
snd_soc_component
*
component
,
struct
snd_soc_pcm_runtime
*
rtd
)
{
if
(
component
->
driver
->
pcm_new
)
return
component
->
driver
->
pcm_new
(
rtd
);
return
0
;
}
static
void
snd_soc_component_drv_pcm_free
(
struct
snd_soc_component
*
component
,
struct
snd_pcm
*
pcm
)
{
if
(
component
->
driver
->
pcm_free
)
component
->
driver
->
pcm_free
(
pcm
);
}
static
int
snd_soc_component_set_bias_level
(
struct
snd_soc_dapm_context
*
dapm
,
enum
snd_soc_bias_level
level
)
{
struct
snd_soc_component
*
component
=
dapm
->
component
;
return
component
->
driver
->
set_bias_level
(
component
,
level
);
}
static
int
snd_soc_component_initialize
(
struct
snd_soc_component
*
component
,
const
struct
snd_soc_component_driver
*
driver
,
struct
device
*
dev
)
{
...
...
@@ -3270,16 +3298,21 @@ static int snd_soc_component_initialize(struct snd_soc_component *component,
component
->
set_sysclk
=
component
->
driver
->
set_sysclk
;
component
->
set_pll
=
component
->
driver
->
set_pll
;
component
->
set_jack
=
component
->
driver
->
set_jack
;
component
->
pcm_new
=
snd_soc_component_drv_pcm_new
;
component
->
pcm_free
=
snd_soc_component_drv_pcm_free
;
dapm
=
snd_soc_component_get_dapm
(
component
);
dapm
->
dev
=
dev
;
dapm
->
component
=
component
;
dapm
->
bias_level
=
SND_SOC_BIAS_OFF
;
dapm
->
idle_bias_off
=
true
;
dapm
->
idle_bias_off
=
!
driver
->
idle_bias_on
;
dapm
->
suspend_bias_off
=
driver
->
suspend_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
;
if
(
driver
->
set_bias_level
)
dapm
->
set_bias_level
=
snd_soc_component_set_bias_level
;
INIT_LIST_HEAD
(
&
component
->
dai_list
);
mutex_init
(
&
component
->
io_mutex
);
...
...
@@ -3371,6 +3404,41 @@ static void snd_soc_component_del_unlocked(struct snd_soc_component *component)
list_del
(
&
component
->
list
);
}
#define ENDIANNESS_MAP(name) \
(SNDRV_PCM_FMTBIT_##name##LE | SNDRV_PCM_FMTBIT_##name##BE)
static
u64
endianness_format_map
[]
=
{
ENDIANNESS_MAP
(
S16_
),
ENDIANNESS_MAP
(
U16_
),
ENDIANNESS_MAP
(
S24_
),
ENDIANNESS_MAP
(
U24_
),
ENDIANNESS_MAP
(
S32_
),
ENDIANNESS_MAP
(
U32_
),
ENDIANNESS_MAP
(
S24_3
),
ENDIANNESS_MAP
(
U24_3
),
ENDIANNESS_MAP
(
S20_3
),
ENDIANNESS_MAP
(
U20_3
),
ENDIANNESS_MAP
(
S18_3
),
ENDIANNESS_MAP
(
U18_3
),
ENDIANNESS_MAP
(
FLOAT_
),
ENDIANNESS_MAP
(
FLOAT64_
),
ENDIANNESS_MAP
(
IEC958_SUBFRAME_
),
};
/*
* Fix up the DAI formats for endianness: codecs don't actually see
* the endianness of the data but we're using the CPU format
* definitions which do need to include endianness so we ensure that
* codec DAIs always have both big and little endian variants set.
*/
static
void
convert_endianness_formats
(
struct
snd_soc_pcm_stream
*
stream
)
{
int
i
;
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
endianness_format_map
);
i
++
)
if
(
stream
->
formats
&
endianness_format_map
[
i
])
stream
->
formats
|=
endianness_format_map
[
i
];
}
int
snd_soc_add_component
(
struct
device
*
dev
,
struct
snd_soc_component
*
component
,
const
struct
snd_soc_component_driver
*
component_driver
,
...
...
@@ -3378,6 +3446,7 @@ int snd_soc_add_component(struct device *dev,
int
num_dai
)
{
int
ret
;
int
i
;
ret
=
snd_soc_component_initialize
(
component
,
component_driver
,
dev
);
if
(
ret
)
...
...
@@ -3386,7 +3455,15 @@ int snd_soc_add_component(struct device *dev,
component
->
ignore_pmdown_time
=
true
;
component
->
registered_as_component
=
true
;
ret
=
snd_soc_register_dais
(
component
,
dai_drv
,
num_dai
,
true
);
if
(
component_driver
->
endianness
)
{
for
(
i
=
0
;
i
<
num_dai
;
i
++
)
{
convert_endianness_formats
(
&
dai_drv
[
i
].
playback
);
convert_endianness_formats
(
&
dai_drv
[
i
].
capture
);
}
}
ret
=
snd_soc_register_dais
(
component
,
dai_drv
,
num_dai
,
!
component_driver
->
non_legacy_dai_naming
);
if
(
ret
<
0
)
{
dev_err
(
dev
,
"ASoC: Failed to register DAIs: %d
\n
"
,
ret
);
goto
err_cleanup
;
...
...
@@ -3412,10 +3489,8 @@ int snd_soc_register_component(struct device *dev,
struct
snd_soc_component
*
component
;
component
=
kzalloc
(
sizeof
(
*
component
),
GFP_KERNEL
);
if
(
!
component
)
{
dev_err
(
dev
,
"ASoC: Failed to allocate memory
\n
"
);
if
(
!
component
)
return
-
ENOMEM
;
}
return
snd_soc_add_component
(
dev
,
component
,
component_driver
,
dai_drv
,
num_dai
);
...
...
@@ -3460,6 +3535,32 @@ void snd_soc_unregister_component(struct device *dev)
}
EXPORT_SYMBOL_GPL
(
snd_soc_unregister_component
);
struct
snd_soc_component
*
snd_soc_lookup_component
(
struct
device
*
dev
,
const
char
*
driver_name
)
{
struct
snd_soc_component
*
component
;
struct
snd_soc_component
*
ret
;
ret
=
NULL
;
mutex_lock
(
&
client_mutex
);
list_for_each_entry
(
component
,
&
component_list
,
list
)
{
if
(
dev
!=
component
->
dev
)
continue
;
if
(
driver_name
&&
(
driver_name
!=
component
->
driver
->
name
)
&&
(
strcmp
(
component
->
driver
->
name
,
driver_name
)
!=
0
))
continue
;
ret
=
component
;
break
;
}
mutex_unlock
(
&
client_mutex
);
return
ret
;
}
EXPORT_SYMBOL_GPL
(
snd_soc_lookup_component
);
static
int
snd_soc_platform_drv_probe
(
struct
snd_soc_component
*
component
)
{
struct
snd_soc_platform
*
platform
=
snd_soc_component_to_platform
(
component
);
...
...
@@ -3474,6 +3575,26 @@ static void snd_soc_platform_drv_remove(struct snd_soc_component *component)
platform
->
driver
->
remove
(
platform
);
}
static
int
snd_soc_platform_drv_pcm_new
(
struct
snd_soc_component
*
component
,
struct
snd_soc_pcm_runtime
*
rtd
)
{
struct
snd_soc_platform
*
platform
=
snd_soc_component_to_platform
(
component
);
if
(
platform
->
driver
->
pcm_new
)
return
platform
->
driver
->
pcm_new
(
rtd
);
return
0
;
}
static
void
snd_soc_platform_drv_pcm_free
(
struct
snd_soc_component
*
component
,
struct
snd_pcm
*
pcm
)
{
struct
snd_soc_platform
*
platform
=
snd_soc_component_to_platform
(
component
);
if
(
platform
->
driver
->
pcm_free
)
platform
->
driver
->
pcm_free
(
pcm
);
}
/**
* snd_soc_add_platform - Add a platform to the ASoC core
* @dev: The parent device for the platform
...
...
@@ -3497,6 +3618,10 @@ int snd_soc_add_platform(struct device *dev, struct snd_soc_platform *platform,
platform
->
component
.
probe
=
snd_soc_platform_drv_probe
;
if
(
platform_drv
->
remove
)
platform
->
component
.
remove
=
snd_soc_platform_drv_remove
;
if
(
platform_drv
->
pcm_new
)
platform
->
component
.
pcm_new
=
snd_soc_platform_drv_pcm_new
;
if
(
platform_drv
->
pcm_free
)
platform
->
component
.
pcm_free
=
snd_soc_platform_drv_pcm_free
;
#ifdef CONFIG_DEBUG_FS
platform
->
component
.
debugfs_prefix
=
"platform"
;
...
...
@@ -3594,39 +3719,6 @@ void snd_soc_unregister_platform(struct device *dev)
}
EXPORT_SYMBOL_GPL
(
snd_soc_unregister_platform
);
static
u64
codec_format_map
[]
=
{
SNDRV_PCM_FMTBIT_S16_LE
|
SNDRV_PCM_FMTBIT_S16_BE
,
SNDRV_PCM_FMTBIT_U16_LE
|
SNDRV_PCM_FMTBIT_U16_BE
,
SNDRV_PCM_FMTBIT_S24_LE
|
SNDRV_PCM_FMTBIT_S24_BE
,
SNDRV_PCM_FMTBIT_U24_LE
|
SNDRV_PCM_FMTBIT_U24_BE
,
SNDRV_PCM_FMTBIT_S32_LE
|
SNDRV_PCM_FMTBIT_S32_BE
,
SNDRV_PCM_FMTBIT_U32_LE
|
SNDRV_PCM_FMTBIT_U32_BE
,
SNDRV_PCM_FMTBIT_S24_3LE
|
SNDRV_PCM_FMTBIT_U24_3BE
,
SNDRV_PCM_FMTBIT_U24_3LE
|
SNDRV_PCM_FMTBIT_U24_3BE
,
SNDRV_PCM_FMTBIT_S20_3LE
|
SNDRV_PCM_FMTBIT_S20_3BE
,
SNDRV_PCM_FMTBIT_U20_3LE
|
SNDRV_PCM_FMTBIT_U20_3BE
,
SNDRV_PCM_FMTBIT_S18_3LE
|
SNDRV_PCM_FMTBIT_S18_3BE
,
SNDRV_PCM_FMTBIT_U18_3LE
|
SNDRV_PCM_FMTBIT_U18_3BE
,
SNDRV_PCM_FMTBIT_FLOAT_LE
|
SNDRV_PCM_FMTBIT_FLOAT_BE
,
SNDRV_PCM_FMTBIT_FLOAT64_LE
|
SNDRV_PCM_FMTBIT_FLOAT64_BE
,
SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_LE
|
SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_BE
,
};
/* Fix up the DAI formats for endianness: codecs don't actually see
* the endianness of the data but we're using the CPU format
* definitions which do need to include endianness so we ensure that
* codec DAIs always have both big and little endian variants set.
*/
static
void
fixup_codec_formats
(
struct
snd_soc_pcm_stream
*
stream
)
{
int
i
;
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
codec_format_map
);
i
++
)
if
(
stream
->
formats
&
codec_format_map
[
i
])
stream
->
formats
|=
codec_format_map
[
i
];
}
static
int
snd_soc_codec_drv_probe
(
struct
snd_soc_component
*
component
)
{
struct
snd_soc_codec
*
codec
=
snd_soc_component_to_codec
(
component
);
...
...
@@ -3777,8 +3869,8 @@ int snd_soc_register_codec(struct device *dev,
codec
->
component
.
regmap
=
codec_drv
->
get_regmap
(
dev
);
for
(
i
=
0
;
i
<
num_dai
;
i
++
)
{
fixup_codec
_formats
(
&
dai_drv
[
i
].
playback
);
fixup_codec
_formats
(
&
dai_drv
[
i
].
capture
);
convert_endianness
_formats
(
&
dai_drv
[
i
].
playback
);
convert_endianness
_formats
(
&
dai_drv
[
i
].
capture
);
}
ret
=
snd_soc_register_dais
(
&
codec
->
component
,
dai_drv
,
num_dai
,
false
);
...
...
sound/soc/soc-dapm.c
浏览文件 @
aa38bff8
...
...
@@ -3681,7 +3681,7 @@ static int snd_soc_dai_link_event(struct snd_soc_dapm_widget *w,
switch
(
event
)
{
case
SND_SOC_DAPM_PRE_PMU
:
substream
.
stream
=
SNDRV_PCM_STREAM_CAPTURE
;
if
(
source
->
driver
->
ops
&&
source
->
driver
->
ops
->
startup
)
{
if
(
source
->
driver
->
ops
->
startup
)
{
ret
=
source
->
driver
->
ops
->
startup
(
&
substream
,
source
);
if
(
ret
<
0
)
{
dev_err
(
source
->
dev
,
...
...
@@ -3695,7 +3695,7 @@ static int snd_soc_dai_link_event(struct snd_soc_dapm_widget *w,
goto
out
;
substream
.
stream
=
SNDRV_PCM_STREAM_PLAYBACK
;
if
(
sink
->
driver
->
ops
&&
sink
->
driver
->
ops
->
startup
)
{
if
(
sink
->
driver
->
ops
->
startup
)
{
ret
=
sink
->
driver
->
ops
->
startup
(
&
substream
,
sink
);
if
(
ret
<
0
)
{
dev_err
(
sink
->
dev
,
...
...
@@ -3725,13 +3725,13 @@ static int snd_soc_dai_link_event(struct snd_soc_dapm_widget *w,
ret
=
0
;
source
->
active
--
;
if
(
source
->
driver
->
ops
&&
source
->
driver
->
ops
->
shutdown
)
{
if
(
source
->
driver
->
ops
->
shutdown
)
{
substream
.
stream
=
SNDRV_PCM_STREAM_CAPTURE
;
source
->
driver
->
ops
->
shutdown
(
&
substream
,
source
);
}
sink
->
active
--
;
if
(
sink
->
driver
->
ops
&&
sink
->
driver
->
ops
->
shutdown
)
{
if
(
sink
->
driver
->
ops
->
shutdown
)
{
substream
.
stream
=
SNDRV_PCM_STREAM_PLAYBACK
;
sink
->
driver
->
ops
->
shutdown
(
&
substream
,
sink
);
}
...
...
sound/soc/soc-io.c
浏览文件 @
aa38bff8
...
...
@@ -41,6 +41,20 @@ int snd_soc_component_read(struct snd_soc_component *component,
}
EXPORT_SYMBOL_GPL
(
snd_soc_component_read
);
unsigned
int
snd_soc_component_read32
(
struct
snd_soc_component
*
component
,
unsigned
int
reg
)
{
unsigned
int
val
;
int
ret
;
ret
=
snd_soc_component_read
(
component
,
reg
,
&
val
);
if
(
ret
<
0
)
return
-
1
;
return
val
;
}
EXPORT_SYMBOL_GPL
(
snd_soc_component_read32
);
/**
* snd_soc_component_write() - Write register value
* @component: Component to write to
...
...
sound/soc/soc-pcm.c
浏览文件 @
aa38bff8
此差异已折叠。
点击以展开。
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录