Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
adam.huang
Arm Trusted Firmware
Commits
77913d44
Unverified
Commit
77913d44
authored
Mar 13, 2019
by
Soby Mathew
Committed by
GitHub
Mar 13, 2019
Browse files
Merge pull request #1858 from thloh85-intel/dwmmc_fixes
drivers: synopsys: Fix synopsys MMC driver
parents
eb9da9e1
3d0f30bb
Changes
2
Hide whitespace changes
Inline
Side-by-side
drivers/synopsys/emmc/dw_mmc.c
View file @
77913d44
...
@@ -243,6 +243,11 @@ static int dw_send_cmd(struct mmc_cmd *cmd)
...
@@ -243,6 +243,11 @@ static int dw_send_cmd(struct mmc_cmd *cmd)
op
=
CMD_WAIT_PRVDATA_COMPLETE
;
op
=
CMD_WAIT_PRVDATA_COMPLETE
;
break
;
break
;
case
8
:
case
8
:
if
(
dw_params
.
mmc_dev_type
==
MMC_IS_EMMC
)
op
=
CMD_DATA_TRANS_EXPECT
|
CMD_WAIT_PRVDATA_COMPLETE
;
else
op
=
CMD_WAIT_PRVDATA_COMPLETE
;
break
;
case
17
:
case
17
:
case
18
:
case
18
:
op
=
CMD_DATA_TRANS_EXPECT
|
CMD_WAIT_PRVDATA_COMPLETE
;
op
=
CMD_DATA_TRANS_EXPECT
|
CMD_WAIT_PRVDATA_COMPLETE
;
...
@@ -252,6 +257,9 @@ static int dw_send_cmd(struct mmc_cmd *cmd)
...
@@ -252,6 +257,9 @@ static int dw_send_cmd(struct mmc_cmd *cmd)
op
=
CMD_WRITE
|
CMD_DATA_TRANS_EXPECT
|
op
=
CMD_WRITE
|
CMD_DATA_TRANS_EXPECT
|
CMD_WAIT_PRVDATA_COMPLETE
;
CMD_WAIT_PRVDATA_COMPLETE
;
break
;
break
;
case
51
:
op
=
CMD_DATA_TRANS_EXPECT
;
break
;
default:
default:
op
=
0
;
op
=
0
;
break
;
break
;
...
@@ -337,7 +345,6 @@ static int dw_prepare(int lba, uintptr_t buf, size_t size)
...
@@ -337,7 +345,6 @@ static int dw_prepare(int lba, uintptr_t buf, size_t size)
uintptr_t
base
;
uintptr_t
base
;
assert
(((
buf
&
DWMMC_ADDRESS_MASK
)
==
0
)
&&
assert
(((
buf
&
DWMMC_ADDRESS_MASK
)
==
0
)
&&
((
size
%
MMC_BLOCK_SIZE
)
==
0
)
&&
(
dw_params
.
desc_size
>
0
)
&&
(
dw_params
.
desc_size
>
0
)
&&
((
dw_params
.
reg_base
&
MMC_BLOCK_MASK
)
==
0
)
&&
((
dw_params
.
reg_base
&
MMC_BLOCK_MASK
)
==
0
)
&&
((
dw_params
.
desc_base
&
MMC_BLOCK_MASK
)
==
0
)
&&
((
dw_params
.
desc_base
&
MMC_BLOCK_MASK
)
==
0
)
&&
...
@@ -352,6 +359,12 @@ static int dw_prepare(int lba, uintptr_t buf, size_t size)
...
@@ -352,6 +359,12 @@ static int dw_prepare(int lba, uintptr_t buf, size_t size)
base
=
dw_params
.
reg_base
;
base
=
dw_params
.
reg_base
;
desc
=
(
struct
dw_idmac_desc
*
)
dw_params
.
desc_base
;
desc
=
(
struct
dw_idmac_desc
*
)
dw_params
.
desc_base
;
mmio_write_32
(
base
+
DWMMC_BYTCNT
,
size
);
mmio_write_32
(
base
+
DWMMC_BYTCNT
,
size
);
if
(
size
<
MMC_BLOCK_SIZE
)
mmio_write_32
(
base
+
DWMMC_BLKSIZ
,
size
);
else
mmio_write_32
(
base
+
DWMMC_BLKSIZ
,
MMC_BLOCK_SIZE
);
mmio_write_32
(
base
+
DWMMC_RINTSTS
,
~
0
);
mmio_write_32
(
base
+
DWMMC_RINTSTS
,
~
0
);
for
(
i
=
0
;
i
<
desc_cnt
;
i
++
)
{
for
(
i
=
0
;
i
<
desc_cnt
;
i
++
)
{
desc
[
i
].
des0
=
IDMAC_DES0_OWN
|
IDMAC_DES0_CH
|
IDMAC_DES0_DIC
;
desc
[
i
].
des0
=
IDMAC_DES0_OWN
|
IDMAC_DES0_CH
|
IDMAC_DES0_DIC
;
...
@@ -375,11 +388,22 @@ static int dw_prepare(int lba, uintptr_t buf, size_t size)
...
@@ -375,11 +388,22 @@ static int dw_prepare(int lba, uintptr_t buf, size_t size)
flush_dcache_range
(
dw_params
.
desc_base
,
flush_dcache_range
(
dw_params
.
desc_base
,
desc_cnt
*
DWMMC_DMA_MAX_BUFFER_SIZE
);
desc_cnt
*
DWMMC_DMA_MAX_BUFFER_SIZE
);
return
0
;
return
0
;
}
}
static
int
dw_read
(
int
lba
,
uintptr_t
buf
,
size_t
size
)
static
int
dw_read
(
int
lba
,
uintptr_t
buf
,
size_t
size
)
{
{
uint32_t
data
=
0
;
int
timeout
=
TIMEOUT
;
do
{
data
=
mmio_read_32
(
dw_params
.
reg_base
+
DWMMC_RINTSTS
);
udelay
(
50
);
}
while
(
!
(
data
&
INT_DTO
)
&&
timeout
--
>
0
);
inv_dcache_range
(
buf
,
size
);
return
0
;
return
0
;
}
}
...
@@ -401,6 +425,9 @@ void dw_mmc_init(dw_mmc_params_t *params, struct mmc_device_info *info)
...
@@ -401,6 +425,9 @@ void dw_mmc_init(dw_mmc_params_t *params, struct mmc_device_info *info)
(
params
->
bus_width
==
MMC_BUS_WIDTH_8
)));
(
params
->
bus_width
==
MMC_BUS_WIDTH_8
)));
memcpy
(
&
dw_params
,
params
,
sizeof
(
dw_mmc_params_t
));
memcpy
(
&
dw_params
,
params
,
sizeof
(
dw_mmc_params_t
));
mmio_write_32
(
dw_params
.
reg_base
+
DWMMC_FIFOTH
,
0x103ff
);
mmc_init
(
&
dw_mmc_ops
,
params
->
clk_rate
,
params
->
bus_width
,
mmc_init
(
&
dw_mmc_ops
,
params
->
clk_rate
,
params
->
bus_width
,
params
->
flags
,
info
);
params
->
flags
,
info
);
dw_params
.
mmc_dev_type
=
info
->
mmc_dev_type
;
}
}
include/drivers/synopsys/dw_mmc.h
View file @
77913d44
...
@@ -16,6 +16,7 @@ typedef struct dw_mmc_params {
...
@@ -16,6 +16,7 @@ typedef struct dw_mmc_params {
int
clk_rate
;
int
clk_rate
;
int
bus_width
;
int
bus_width
;
unsigned
int
flags
;
unsigned
int
flags
;
enum
mmc_device_type
mmc_dev_type
;
}
dw_mmc_params_t
;
}
dw_mmc_params_t
;
void
dw_mmc_init
(
dw_mmc_params_t
*
params
,
struct
mmc_device_info
*
info
);
void
dw_mmc_init
(
dw_mmc_params_t
*
params
,
struct
mmc_device_info
*
info
);
...
...
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