Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
185a6cdb
Commit
185a6cdb
authored
Apr 10, 2018
by
Vinod Koul
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'topic/qcom' into for-linus
parents
f18b4619
5b4a6895
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
49 additions
and
14 deletions
+49
-14
Documentation/devicetree/bindings/dma/qcom_bam_dma.txt
Documentation/devicetree/bindings/dma/qcom_bam_dma.txt
+4
-0
drivers/dma/qcom/bam_dma.c
drivers/dma/qcom/bam_dma.c
+45
-14
No files found.
Documentation/devicetree/bindings/dma/qcom_bam_dma.txt
View file @
185a6cdb
...
...
@@ -15,6 +15,10 @@ Required properties:
the secure world.
- qcom,controlled-remotely : optional, indicates that the bam is controlled by
remote proccessor i.e. execution environment.
- num-channels : optional, indicates supported number of DMA channels in a
remotely controlled bam.
- qcom,num-ees : optional, indicates supported number of Execution Environments
in a remotely controlled bam.
Example:
...
...
drivers/dma/qcom/bam_dma.c
View file @
185a6cdb
...
...
@@ -393,6 +393,7 @@ struct bam_device {
struct
device_dma_parameters
dma_parms
;
struct
bam_chan
*
channels
;
u32
num_channels
;
u32
num_ees
;
/* execution environment ID, from DT */
u32
ee
;
...
...
@@ -934,12 +935,15 @@ static void bam_apply_new_config(struct bam_chan *bchan,
struct
bam_device
*
bdev
=
bchan
->
bdev
;
u32
maxburst
;
if
(
dir
==
DMA_DEV_TO_MEM
)
maxburst
=
bchan
->
slave
.
src_maxburst
;
else
maxburst
=
bchan
->
slave
.
dst_maxburst
;
if
(
!
bdev
->
controlled_remotely
)
{
if
(
dir
==
DMA_DEV_TO_MEM
)
maxburst
=
bchan
->
slave
.
src_maxburst
;
else
maxburst
=
bchan
->
slave
.
dst_maxburst
;
writel_relaxed
(
maxburst
,
bam_addr
(
bdev
,
0
,
BAM_DESC_CNT_TRSHLD
));
writel_relaxed
(
maxburst
,
bam_addr
(
bdev
,
0
,
BAM_DESC_CNT_TRSHLD
));
}
bchan
->
reconfigure
=
0
;
}
...
...
@@ -1128,15 +1132,19 @@ static int bam_init(struct bam_device *bdev)
u32
val
;
/* read revision and configuration information */
val
=
readl_relaxed
(
bam_addr
(
bdev
,
0
,
BAM_REVISION
))
>>
NUM_EES_SHIFT
;
val
&=
NUM_EES_MASK
;
if
(
!
bdev
->
num_ees
)
{
val
=
readl_relaxed
(
bam_addr
(
bdev
,
0
,
BAM_REVISION
));
bdev
->
num_ees
=
(
val
>>
NUM_EES_SHIFT
)
&
NUM_EES_MASK
;
}
/* check that configured EE is within range */
if
(
bdev
->
ee
>=
val
)
if
(
bdev
->
ee
>=
bdev
->
num_ees
)
return
-
EINVAL
;
val
=
readl_relaxed
(
bam_addr
(
bdev
,
0
,
BAM_NUM_PIPES
));
bdev
->
num_channels
=
val
&
BAM_NUM_PIPES_MASK
;
if
(
!
bdev
->
num_channels
)
{
val
=
readl_relaxed
(
bam_addr
(
bdev
,
0
,
BAM_NUM_PIPES
));
bdev
->
num_channels
=
val
&
BAM_NUM_PIPES_MASK
;
}
if
(
bdev
->
controlled_remotely
)
return
0
;
...
...
@@ -1232,9 +1240,25 @@ static int bam_dma_probe(struct platform_device *pdev)
bdev
->
controlled_remotely
=
of_property_read_bool
(
pdev
->
dev
.
of_node
,
"qcom,controlled-remotely"
);
if
(
bdev
->
controlled_remotely
)
{
ret
=
of_property_read_u32
(
pdev
->
dev
.
of_node
,
"num-channels"
,
&
bdev
->
num_channels
);
if
(
ret
)
dev_err
(
bdev
->
dev
,
"num-channels unspecified in dt
\n
"
);
ret
=
of_property_read_u32
(
pdev
->
dev
.
of_node
,
"qcom,num-ees"
,
&
bdev
->
num_ees
);
if
(
ret
)
dev_err
(
bdev
->
dev
,
"num-ees unspecified in dt
\n
"
);
}
bdev
->
bamclk
=
devm_clk_get
(
bdev
->
dev
,
"bam_clk"
);
if
(
IS_ERR
(
bdev
->
bamclk
))
return
PTR_ERR
(
bdev
->
bamclk
);
if
(
IS_ERR
(
bdev
->
bamclk
))
{
if
(
!
bdev
->
controlled_remotely
)
return
PTR_ERR
(
bdev
->
bamclk
);
bdev
->
bamclk
=
NULL
;
}
ret
=
clk_prepare_enable
(
bdev
->
bamclk
);
if
(
ret
)
{
...
...
@@ -1309,6 +1333,11 @@ static int bam_dma_probe(struct platform_device *pdev)
if
(
ret
)
goto
err_unregister_dma
;
if
(
bdev
->
controlled_remotely
)
{
pm_runtime_disable
(
&
pdev
->
dev
);
return
0
;
}
pm_runtime_irq_safe
(
&
pdev
->
dev
);
pm_runtime_set_autosuspend_delay
(
&
pdev
->
dev
,
BAM_DMA_AUTOSUSPEND_DELAY
);
pm_runtime_use_autosuspend
(
&
pdev
->
dev
);
...
...
@@ -1392,7 +1421,8 @@ static int __maybe_unused bam_dma_suspend(struct device *dev)
{
struct
bam_device
*
bdev
=
dev_get_drvdata
(
dev
);
pm_runtime_force_suspend
(
dev
);
if
(
!
bdev
->
controlled_remotely
)
pm_runtime_force_suspend
(
dev
);
clk_unprepare
(
bdev
->
bamclk
);
...
...
@@ -1408,7 +1438,8 @@ static int __maybe_unused bam_dma_resume(struct device *dev)
if
(
ret
)
return
ret
;
pm_runtime_force_resume
(
dev
);
if
(
!
bdev
->
controlled_remotely
)
pm_runtime_force_resume
(
dev
);
return
0
;
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment