Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
kernel_linux
提交
34904623
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看板
提交
34904623
编写于
2月 19, 2017
作者:
M
Mark Brown
浏览文件
操作
浏览文件
下载
差异文件
Merge remote-tracking branch 'spi/topic/dma' into spi-next
上级
42af2f5c
1ce24864
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
37 addition
and
8 deletion
+37
-8
drivers/spi/spi-mt65xx.c
drivers/spi/spi-mt65xx.c
+33
-4
drivers/spi/spi.c
drivers/spi/spi.c
+4
-4
未找到文件。
drivers/spi/spi-mt65xx.c
浏览文件 @
34904623
...
@@ -73,7 +73,7 @@
...
@@ -73,7 +73,7 @@
#define MTK_SPI_IDLE 0
#define MTK_SPI_IDLE 0
#define MTK_SPI_PAUSED 1
#define MTK_SPI_PAUSED 1
#define MTK_SPI_MAX_FIFO_SIZE 32
#define MTK_SPI_MAX_FIFO_SIZE 32
U
#define MTK_SPI_PACKET_SIZE 1024
#define MTK_SPI_PACKET_SIZE 1024
struct
mtk_spi_compatible
{
struct
mtk_spi_compatible
{
...
@@ -333,7 +333,7 @@ static int mtk_spi_fifo_transfer(struct spi_master *master,
...
@@ -333,7 +333,7 @@ static int mtk_spi_fifo_transfer(struct spi_master *master,
struct
mtk_spi
*
mdata
=
spi_master_get_devdata
(
master
);
struct
mtk_spi
*
mdata
=
spi_master_get_devdata
(
master
);
mdata
->
cur_transfer
=
xfer
;
mdata
->
cur_transfer
=
xfer
;
mdata
->
xfer_len
=
xfer
->
len
;
mdata
->
xfer_len
=
min
(
MTK_SPI_MAX_FIFO_SIZE
,
xfer
->
len
)
;
mtk_spi_prepare_transfer
(
master
,
xfer
);
mtk_spi_prepare_transfer
(
master
,
xfer
);
mtk_spi_setup_packet
(
master
);
mtk_spi_setup_packet
(
master
);
...
@@ -410,7 +410,10 @@ static bool mtk_spi_can_dma(struct spi_master *master,
...
@@ -410,7 +410,10 @@ static bool mtk_spi_can_dma(struct spi_master *master,
struct
spi_device
*
spi
,
struct
spi_device
*
spi
,
struct
spi_transfer
*
xfer
)
struct
spi_transfer
*
xfer
)
{
{
return
xfer
->
len
>
MTK_SPI_MAX_FIFO_SIZE
;
/* Buffers for DMA transactions must be 4-byte aligned */
return
(
xfer
->
len
>
MTK_SPI_MAX_FIFO_SIZE
&&
(
unsigned
long
)
xfer
->
tx_buf
%
4
==
0
&&
(
unsigned
long
)
xfer
->
rx_buf
%
4
==
0
);
}
}
static
int
mtk_spi_setup
(
struct
spi_device
*
spi
)
static
int
mtk_spi_setup
(
struct
spi_device
*
spi
)
...
@@ -451,7 +454,33 @@ static irqreturn_t mtk_spi_interrupt(int irq, void *dev_id)
...
@@ -451,7 +454,33 @@ static irqreturn_t mtk_spi_interrupt(int irq, void *dev_id)
&
reg_val
,
remainder
);
&
reg_val
,
remainder
);
}
}
}
}
spi_finalize_current_transfer
(
master
);
trans
->
len
-=
mdata
->
xfer_len
;
if
(
!
trans
->
len
)
{
spi_finalize_current_transfer
(
master
);
return
IRQ_HANDLED
;
}
if
(
trans
->
tx_buf
)
trans
->
tx_buf
+=
mdata
->
xfer_len
;
if
(
trans
->
rx_buf
)
trans
->
rx_buf
+=
mdata
->
xfer_len
;
mdata
->
xfer_len
=
min
(
MTK_SPI_MAX_FIFO_SIZE
,
trans
->
len
);
mtk_spi_setup_packet
(
master
);
cnt
=
trans
->
len
/
4
;
iowrite32_rep
(
mdata
->
base
+
SPI_TX_DATA_REG
,
trans
->
tx_buf
,
cnt
);
remainder
=
trans
->
len
%
4
;
if
(
remainder
>
0
)
{
reg_val
=
0
;
memcpy
(
&
reg_val
,
trans
->
tx_buf
+
(
cnt
*
4
),
remainder
);
writel
(
reg_val
,
mdata
->
base
+
SPI_TX_DATA_REG
);
}
mtk_spi_enable_transfer
(
master
);
return
IRQ_HANDLED
;
return
IRQ_HANDLED
;
}
}
...
...
drivers/spi/spi.c
浏览文件 @
34904623
...
@@ -807,12 +807,12 @@ static int __spi_map_msg(struct spi_master *master, struct spi_message *msg)
...
@@ -807,12 +807,12 @@ static int __spi_map_msg(struct spi_master *master, struct spi_message *msg)
if
(
master
->
dma_tx
)
if
(
master
->
dma_tx
)
tx_dev
=
master
->
dma_tx
->
device
->
dev
;
tx_dev
=
master
->
dma_tx
->
device
->
dev
;
else
else
tx_dev
=
&
master
->
dev
;
tx_dev
=
master
->
dev
.
parent
;
if
(
master
->
dma_rx
)
if
(
master
->
dma_rx
)
rx_dev
=
master
->
dma_rx
->
device
->
dev
;
rx_dev
=
master
->
dma_rx
->
device
->
dev
;
else
else
rx_dev
=
&
master
->
dev
;
rx_dev
=
master
->
dev
.
parent
;
list_for_each_entry
(
xfer
,
&
msg
->
transfers
,
transfer_list
)
{
list_for_each_entry
(
xfer
,
&
msg
->
transfers
,
transfer_list
)
{
if
(
!
master
->
can_dma
(
master
,
msg
->
spi
,
xfer
))
if
(
!
master
->
can_dma
(
master
,
msg
->
spi
,
xfer
))
...
@@ -854,12 +854,12 @@ static int __spi_unmap_msg(struct spi_master *master, struct spi_message *msg)
...
@@ -854,12 +854,12 @@ static int __spi_unmap_msg(struct spi_master *master, struct spi_message *msg)
if
(
master
->
dma_tx
)
if
(
master
->
dma_tx
)
tx_dev
=
master
->
dma_tx
->
device
->
dev
;
tx_dev
=
master
->
dma_tx
->
device
->
dev
;
else
else
tx_dev
=
&
master
->
dev
;
tx_dev
=
master
->
dev
.
parent
;
if
(
master
->
dma_rx
)
if
(
master
->
dma_rx
)
rx_dev
=
master
->
dma_rx
->
device
->
dev
;
rx_dev
=
master
->
dma_rx
->
device
->
dev
;
else
else
rx_dev
=
&
master
->
dev
;
rx_dev
=
master
->
dev
.
parent
;
list_for_each_entry
(
xfer
,
&
msg
->
transfers
,
transfer_list
)
{
list_for_each_entry
(
xfer
,
&
msg
->
transfers
,
transfer_list
)
{
if
(
!
master
->
can_dma
(
master
,
msg
->
spi
,
xfer
))
if
(
!
master
->
can_dma
(
master
,
msg
->
spi
,
xfer
))
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录