Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
c203f677
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看板
提交
c203f677
编写于
1月 31, 2018
作者:
V
Vinod Koul
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'topic/qcom' into for-linus
上级
c4cc2c3a
b5419adc
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
27 addition
and
27 deletion
+27
-27
Documentation/devicetree/bindings/dma/qcom_hidma_mgmt.txt
Documentation/devicetree/bindings/dma/qcom_hidma_mgmt.txt
+2
-2
drivers/dma/qcom/hidma.c
drivers/dma/qcom/hidma.c
+19
-22
drivers/dma/qcom/hidma_ll.c
drivers/dma/qcom/hidma_ll.c
+6
-3
未找到文件。
Documentation/devicetree/bindings/dma/qcom_hidma_mgmt.txt
浏览文件 @
c203f677
...
...
@@ -47,8 +47,8 @@ When the OS is not in control of the management interface (i.e. it's a guest),
the channel nodes appear on their own, not under a management node.
Required properties:
- compatible: must contain "qcom,hidma-1.0" for initial HW or
"qcom,hidma-1.1"
for MSI capable HW.
- compatible: must contain "qcom,hidma-1.0" for initial HW or
"qcom,hidma-1.1"/"qcom,hidma-1.2"
for MSI capable HW.
- reg: Addresses for the transfer and event channel
- interrupts: Should contain the event interrupt
- desc-count: Number of asynchronous requests this channel can handle
...
...
drivers/dma/qcom/hidma.c
浏览文件 @
c203f677
...
...
@@ -50,6 +50,7 @@
#include <linux/slab.h>
#include <linux/spinlock.h>
#include <linux/of_dma.h>
#include <linux/of_device.h>
#include <linux/property.h>
#include <linux/delay.h>
#include <linux/acpi.h>
...
...
@@ -104,6 +105,10 @@ static unsigned int nr_desc_prm;
module_param
(
nr_desc_prm
,
uint
,
0644
);
MODULE_PARM_DESC
(
nr_desc_prm
,
"number of descriptors (default: 0)"
);
enum
hidma_cap
{
HIDMA_MSI_CAP
=
1
,
HIDMA_IDENTITY_CAP
,
};
/* process completed descriptors */
static
void
hidma_process_completed
(
struct
hidma_chan
*
mchan
)
...
...
@@ -736,25 +741,12 @@ static int hidma_request_msi(struct hidma_dev *dmadev,
#endif
}
static
bool
hidma_
msi_capable
(
struct
device
*
dev
)
static
bool
hidma_
test_capability
(
struct
device
*
dev
,
enum
hidma_cap
test_cap
)
{
struct
acpi_device
*
adev
=
ACPI_COMPANION
(
dev
);
const
char
*
of_compat
;
int
ret
=
-
EINVAL
;
if
(
!
adev
||
acpi_disabled
)
{
ret
=
device_property_read_string
(
dev
,
"compatible"
,
&
of_compat
);
if
(
ret
)
return
false
;
enum
hidma_cap
cap
;
ret
=
strcmp
(
of_compat
,
"qcom,hidma-1.1"
);
}
else
{
#ifdef CONFIG_ACPI
ret
=
strcmp
(
acpi_device_hid
(
adev
),
"QCOM8062"
);
#endif
}
return
ret
==
0
;
cap
=
(
enum
hidma_cap
)
device_get_match_data
(
dev
);
return
cap
?
((
cap
&
test_cap
)
>
0
)
:
0
;
}
static
int
hidma_probe
(
struct
platform_device
*
pdev
)
...
...
@@ -834,8 +826,7 @@ static int hidma_probe(struct platform_device *pdev)
* Determine the MSI capability of the platform. Old HW doesn't
* support MSI.
*/
msi
=
hidma_msi_capable
(
&
pdev
->
dev
);
msi
=
hidma_test_capability
(
&
pdev
->
dev
,
HIDMA_MSI_CAP
);
device_property_read_u32
(
&
pdev
->
dev
,
"desc-count"
,
&
dmadev
->
nr_descriptors
);
...
...
@@ -848,7 +839,10 @@ static int hidma_probe(struct platform_device *pdev)
if
(
!
dmadev
->
nr_descriptors
)
dmadev
->
nr_descriptors
=
HIDMA_NR_DEFAULT_DESC
;
dmadev
->
chidx
=
readl
(
dmadev
->
dev_trca
+
0x28
);
if
(
hidma_test_capability
(
&
pdev
->
dev
,
HIDMA_IDENTITY_CAP
))
dmadev
->
chidx
=
readl
(
dmadev
->
dev_trca
+
0x40
);
else
dmadev
->
chidx
=
readl
(
dmadev
->
dev_trca
+
0x28
);
/* Set DMA mask to 64 bits. */
rc
=
dma_set_mask_and_coherent
(
&
pdev
->
dev
,
DMA_BIT_MASK
(
64
));
...
...
@@ -953,7 +947,8 @@ static int hidma_remove(struct platform_device *pdev)
#if IS_ENABLED(CONFIG_ACPI)
static
const
struct
acpi_device_id
hidma_acpi_ids
[]
=
{
{
"QCOM8061"
},
{
"QCOM8062"
},
{
"QCOM8062"
,
HIDMA_MSI_CAP
},
{
"QCOM8063"
,
(
HIDMA_MSI_CAP
|
HIDMA_IDENTITY_CAP
)},
{},
};
MODULE_DEVICE_TABLE
(
acpi
,
hidma_acpi_ids
);
...
...
@@ -961,7 +956,9 @@ MODULE_DEVICE_TABLE(acpi, hidma_acpi_ids);
static
const
struct
of_device_id
hidma_match
[]
=
{
{.
compatible
=
"qcom,hidma-1.0"
,},
{.
compatible
=
"qcom,hidma-1.1"
,},
{.
compatible
=
"qcom,hidma-1.1"
,
.
data
=
(
void
*
)(
HIDMA_MSI_CAP
),},
{.
compatible
=
"qcom,hidma-1.2"
,
.
data
=
(
void
*
)(
HIDMA_MSI_CAP
|
HIDMA_IDENTITY_CAP
),},
{},
};
MODULE_DEVICE_TABLE
(
of
,
hidma_match
);
...
...
drivers/dma/qcom/hidma_ll.c
浏览文件 @
c203f677
...
...
@@ -393,6 +393,8 @@ static int hidma_ll_reset(struct hidma_lldev *lldev)
*/
static
void
hidma_ll_int_handler_internal
(
struct
hidma_lldev
*
lldev
,
int
cause
)
{
unsigned
long
irqflags
;
if
(
cause
&
HIDMA_ERR_INT_MASK
)
{
dev_err
(
lldev
->
dev
,
"error 0x%x, disabling...
\n
"
,
cause
);
...
...
@@ -410,6 +412,10 @@ static void hidma_ll_int_handler_internal(struct hidma_lldev *lldev, int cause)
return
;
}
spin_lock_irqsave
(
&
lldev
->
lock
,
irqflags
);
writel_relaxed
(
cause
,
lldev
->
evca
+
HIDMA_EVCA_IRQ_CLR_REG
);
spin_unlock_irqrestore
(
&
lldev
->
lock
,
irqflags
);
/*
* Fine tuned for this HW...
*
...
...
@@ -421,9 +427,6 @@ static void hidma_ll_int_handler_internal(struct hidma_lldev *lldev, int cause)
* Try to consume as many EVREs as possible.
*/
hidma_handle_tre_completion
(
lldev
);
/* We consumed TREs or there are pending TREs or EVREs. */
writel_relaxed
(
cause
,
lldev
->
evca
+
HIDMA_EVCA_IRQ_CLR_REG
);
}
irqreturn_t
hidma_ll_inthandler
(
int
chirq
,
void
*
arg
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录