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
Kirill Smelkov
linux
Commits
2c49912f
Commit
2c49912f
authored
Jun 15, 2021
by
Ulf Hansson
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'fixes' into next
parents
d1c777ee
103a5348
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
45 additions
and
5 deletions
+45
-5
drivers/mmc/host/meson-gx-mmc.c
drivers/mmc/host/meson-gx-mmc.c
+45
-5
No files found.
drivers/mmc/host/meson-gx-mmc.c
View file @
2c49912f
...
...
@@ -165,6 +165,7 @@ struct meson_host {
unsigned
int
bounce_buf_size
;
void
*
bounce_buf
;
void
__iomem
*
bounce_iomem_buf
;
dma_addr_t
bounce_dma_addr
;
struct
sd_emmc_desc
*
descs
;
dma_addr_t
descs_dma_addr
;
...
...
@@ -745,6 +746,47 @@ static void meson_mmc_desc_chain_transfer(struct mmc_host *mmc, u32 cmd_cfg)
writel
(
start
,
host
->
regs
+
SD_EMMC_START
);
}
/* local sg copy to buffer version with _to/fromio usage for dram_access_quirk */
static
void
meson_mmc_copy_buffer
(
struct
meson_host
*
host
,
struct
mmc_data
*
data
,
size_t
buflen
,
bool
to_buffer
)
{
unsigned
int
sg_flags
=
SG_MITER_ATOMIC
;
struct
scatterlist
*
sgl
=
data
->
sg
;
unsigned
int
nents
=
data
->
sg_len
;
struct
sg_mapping_iter
miter
;
unsigned
int
offset
=
0
;
if
(
to_buffer
)
sg_flags
|=
SG_MITER_FROM_SG
;
else
sg_flags
|=
SG_MITER_TO_SG
;
sg_miter_start
(
&
miter
,
sgl
,
nents
,
sg_flags
);
while
((
offset
<
buflen
)
&&
sg_miter_next
(
&
miter
))
{
unsigned
int
len
;
len
=
min
(
miter
.
length
,
buflen
-
offset
);
/* When dram_access_quirk, the bounce buffer is a iomem mapping */
if
(
host
->
dram_access_quirk
)
{
if
(
to_buffer
)
memcpy_toio
(
host
->
bounce_iomem_buf
+
offset
,
miter
.
addr
,
len
);
else
memcpy_fromio
(
miter
.
addr
,
host
->
bounce_iomem_buf
+
offset
,
len
);
}
else
{
if
(
to_buffer
)
memcpy
(
host
->
bounce_buf
+
offset
,
miter
.
addr
,
len
);
else
memcpy
(
miter
.
addr
,
host
->
bounce_buf
+
offset
,
len
);
}
offset
+=
len
;
}
sg_miter_stop
(
&
miter
);
}
static
void
meson_mmc_start_cmd
(
struct
mmc_host
*
mmc
,
struct
mmc_command
*
cmd
)
{
struct
meson_host
*
host
=
mmc_priv
(
mmc
);
...
...
@@ -788,8 +830,7 @@ static void meson_mmc_start_cmd(struct mmc_host *mmc, struct mmc_command *cmd)
if
(
data
->
flags
&
MMC_DATA_WRITE
)
{
cmd_cfg
|=
CMD_CFG_DATA_WR
;
WARN_ON
(
xfer_bytes
>
host
->
bounce_buf_size
);
sg_copy_to_buffer
(
data
->
sg
,
data
->
sg_len
,
host
->
bounce_buf
,
xfer_bytes
);
meson_mmc_copy_buffer
(
host
,
data
,
xfer_bytes
,
true
);
dma_wmb
();
}
...
...
@@ -958,8 +999,7 @@ static irqreturn_t meson_mmc_irq_thread(int irq, void *dev_id)
if
(
meson_mmc_bounce_buf_read
(
data
))
{
xfer_bytes
=
data
->
blksz
*
data
->
blocks
;
WARN_ON
(
xfer_bytes
>
host
->
bounce_buf_size
);
sg_copy_from_buffer
(
data
->
sg
,
data
->
sg_len
,
host
->
bounce_buf
,
xfer_bytes
);
meson_mmc_copy_buffer
(
host
,
data
,
xfer_bytes
,
false
);
}
next_cmd
=
meson_mmc_get_next_command
(
cmd
);
...
...
@@ -1179,7 +1219,7 @@ static int meson_mmc_probe(struct platform_device *pdev)
* instead of the DDR memory
*/
host
->
bounce_buf_size
=
SD_EMMC_SRAM_DATA_BUF_LEN
;
host
->
bounce_buf
=
host
->
regs
+
SD_EMMC_SRAM_DATA_BUF_OFF
;
host
->
bounce_
iomem_
buf
=
host
->
regs
+
SD_EMMC_SRAM_DATA_BUF_OFF
;
host
->
bounce_dma_addr
=
res
->
start
+
SD_EMMC_SRAM_DATA_BUF_OFF
;
}
else
{
/* data bounce buffer */
...
...
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