Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
bf102621
cloud-kernel
项目概览
openanolis
/
cloud-kernel
1 年多 前同步成功
通知
161
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看板
提交
bf102621
编写于
5月 13, 2016
作者:
M
Mark Brown
浏览文件
操作
浏览文件
下载
差异文件
Merge remote-tracking branch 'asoc/topic/dmaengine' into asoc-next
上级
f84025ba
73fe01cf
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
55 addition
and
25 deletion
+55
-25
include/sound/dmaengine_pcm.h
include/sound/dmaengine_pcm.h
+12
-0
sound/core/pcm_dmaengine.c
sound/core/pcm_dmaengine.c
+9
-2
sound/soc/soc-generic-dmaengine-pcm.c
sound/soc/soc-generic-dmaengine-pcm.c
+34
-23
未找到文件。
include/sound/dmaengine_pcm.h
浏览文件 @
bf102621
...
...
@@ -51,6 +51,16 @@ struct dma_chan *snd_dmaengine_pcm_request_channel(dma_filter_fn filter_fn,
void
*
filter_data
);
struct
dma_chan
*
snd_dmaengine_pcm_get_chan
(
struct
snd_pcm_substream
*
substream
);
/*
* The DAI supports packed transfers, eg 2 16-bit samples in a 32-bit word.
* If this flag is set the dmaengine driver won't put any restriction on
* the supported sample formats and set the DMA transfer size to undefined.
* The DAI driver is responsible to disable any unsupported formats in it's
* configuration and catch corner cases that are not already handled in
* the ALSA core.
*/
#define SND_DMAENGINE_PCM_DAI_FLAG_PACK BIT(0)
/**
* struct snd_dmaengine_dai_dma_data - DAI DMA configuration data
* @addr: Address of the DAI data source or destination register.
...
...
@@ -63,6 +73,7 @@ struct dma_chan *snd_dmaengine_pcm_get_chan(struct snd_pcm_substream *substream)
* requesting the DMA channel.
* @chan_name: Custom channel name to use when requesting DMA channel.
* @fifo_size: FIFO size of the DAI controller in bytes
* @flags: PCM_DAI flags, only SND_DMAENGINE_PCM_DAI_FLAG_PACK for now
*/
struct
snd_dmaengine_dai_dma_data
{
dma_addr_t
addr
;
...
...
@@ -72,6 +83,7 @@ struct snd_dmaengine_dai_dma_data {
void
*
filter_data
;
const
char
*
chan_name
;
unsigned
int
fifo_size
;
unsigned
int
flags
;
};
void
snd_dmaengine_pcm_set_config_from_dai_data
(
...
...
sound/core/pcm_dmaengine.c
浏览文件 @
bf102621
...
...
@@ -106,8 +106,9 @@ EXPORT_SYMBOL_GPL(snd_hwparams_to_dma_slave_config);
* direction of the substream. If the substream is a playback stream the dst
* fields will be initialized, if it is a capture stream the src fields will be
* initialized. The {dst,src}_addr_width field will only be initialized if the
* addr_width field of the DAI DMA data struct is not equal to
* DMA_SLAVE_BUSWIDTH_UNDEFINED.
* SND_DMAENGINE_PCM_DAI_FLAG_PACK flag is set or if the addr_width field of
* the DAI DMA data struct is not equal to DMA_SLAVE_BUSWIDTH_UNDEFINED. If
* both conditions are met the latter takes priority.
*/
void
snd_dmaengine_pcm_set_config_from_dai_data
(
const
struct
snd_pcm_substream
*
substream
,
...
...
@@ -117,11 +118,17 @@ void snd_dmaengine_pcm_set_config_from_dai_data(
if
(
substream
->
stream
==
SNDRV_PCM_STREAM_PLAYBACK
)
{
slave_config
->
dst_addr
=
dma_data
->
addr
;
slave_config
->
dst_maxburst
=
dma_data
->
maxburst
;
if
(
dma_data
->
flags
&
SND_DMAENGINE_PCM_DAI_FLAG_PACK
)
slave_config
->
dst_addr_width
=
DMA_SLAVE_BUSWIDTH_UNDEFINED
;
if
(
dma_data
->
addr_width
!=
DMA_SLAVE_BUSWIDTH_UNDEFINED
)
slave_config
->
dst_addr_width
=
dma_data
->
addr_width
;
}
else
{
slave_config
->
src_addr
=
dma_data
->
addr
;
slave_config
->
src_maxburst
=
dma_data
->
maxburst
;
if
(
dma_data
->
flags
&
SND_DMAENGINE_PCM_DAI_FLAG_PACK
)
slave_config
->
src_addr_width
=
DMA_SLAVE_BUSWIDTH_UNDEFINED
;
if
(
dma_data
->
addr_width
!=
DMA_SLAVE_BUSWIDTH_UNDEFINED
)
slave_config
->
src_addr_width
=
dma_data
->
addr_width
;
}
...
...
sound/soc/soc-generic-dmaengine-pcm.c
浏览文件 @
bf102621
...
...
@@ -163,31 +163,42 @@ static int dmaengine_pcm_set_runtime_hwparams(struct snd_pcm_substream *substrea
}
/*
* Prepare formats mask for valid/allowed sample types. If the dma does
* not have support for the given physical word size, it needs to be
* masked out so user space can not use the format which produces
* corrupted audio.
* In case the dma driver does not implement the slave_caps the default
* assumption is that it supports 1, 2 and 4 bytes widths.
* If SND_DMAENGINE_PCM_DAI_FLAG_PACK is set keep
* hw.formats set to 0, meaning no restrictions are in place.
* In this case it's the responsibility of the DAI driver to
* provide the supported format information.
*/
for
(
i
=
0
;
i
<=
SNDRV_PCM_FORMAT_LAST
;
i
++
)
{
int
bits
=
snd_pcm_format_physical_width
(
i
);
/* Enable only samples with DMA supported physical widths */
switch
(
bits
)
{
case
8
:
case
16
:
case
24
:
case
32
:
case
64
:
if
(
addr_widths
&
(
1
<<
(
bits
/
8
)))
hw
.
formats
|=
(
1LL
<<
i
);
break
;
default:
/* Unsupported types */
break
;
if
(
!
(
dma_data
->
flags
&
SND_DMAENGINE_PCM_DAI_FLAG_PACK
))
/*
* Prepare formats mask for valid/allowed sample types. If the
* dma does not have support for the given physical word size,
* it needs to be masked out so user space can not use the
* format which produces corrupted audio.
* In case the dma driver does not implement the slave_caps the
* default assumption is that it supports 1, 2 and 4 bytes
* widths.
*/
for
(
i
=
0
;
i
<=
SNDRV_PCM_FORMAT_LAST
;
i
++
)
{
int
bits
=
snd_pcm_format_physical_width
(
i
);
/*
* Enable only samples with DMA supported physical
* widths
*/
switch
(
bits
)
{
case
8
:
case
16
:
case
24
:
case
32
:
case
64
:
if
(
addr_widths
&
(
1
<<
(
bits
/
8
)))
hw
.
formats
|=
(
1LL
<<
i
);
break
;
default:
/* Unsupported types */
break
;
}
}
}
return
snd_soc_set_runtime_hwparams
(
substream
,
&
hw
);
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录