Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
R
reform-boundary-uboot
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Container Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Service Desk
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Jack Humbert
reform-boundary-uboot
Commits
6e5fb4ee
Commit
6e5fb4ee
authored
14 years ago
by
Wolfgang Denk
Browse files
Options
Downloads
Plain Diff
Merge branch 'master' of
git://git.denx.de/u-boot-mmc
parents
a77034a8
77c1458d
No related branches found
No related tags found
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
drivers/mmc/fsl_esdhc.c
+85
-2
85 additions, 2 deletions
drivers/mmc/fsl_esdhc.c
include/fsl_esdhc.h
+2
-0
2 additions, 0 deletions
include/fsl_esdhc.h
with
87 additions
and
2 deletions
drivers/mmc/fsl_esdhc.c
+
85
−
2
View file @
6e5fb4ee
...
@@ -72,8 +72,10 @@ uint esdhc_xfertyp(struct mmc_cmd *cmd, struct mmc_data *data)
...
@@ -72,8 +72,10 @@ uint esdhc_xfertyp(struct mmc_cmd *cmd, struct mmc_data *data)
uint
xfertyp
=
0
;
uint
xfertyp
=
0
;
if
(
data
)
{
if
(
data
)
{
xfertyp
|=
XFERTYP_DPSEL
|
XFERTYP_DMAEN
;
xfertyp
|=
XFERTYP_DPSEL
;
#ifndef CONFIG_SYS_FSL_ESDHC_USE_PIO
xfertyp
|=
XFERTYP_DMAEN
;
#endif
if
(
data
->
blocks
>
1
)
{
if
(
data
->
blocks
>
1
)
{
xfertyp
|=
XFERTYP_MSBSEL
;
xfertyp
|=
XFERTYP_MSBSEL
;
xfertyp
|=
XFERTYP_BCEN
;
xfertyp
|=
XFERTYP_BCEN
;
...
@@ -97,6 +99,71 @@ uint esdhc_xfertyp(struct mmc_cmd *cmd, struct mmc_data *data)
...
@@ -97,6 +99,71 @@ uint esdhc_xfertyp(struct mmc_cmd *cmd, struct mmc_data *data)
return
XFERTYP_CMD
(
cmd
->
cmdidx
)
|
xfertyp
;
return
XFERTYP_CMD
(
cmd
->
cmdidx
)
|
xfertyp
;
}
}
#ifdef CONFIG_SYS_FSL_ESDHC_USE_PIO
/*
* PIO Read/Write Mode reduce the performace as DMA is not used in this mode.
*/
static
int
esdhc_pio_read_write
(
struct
mmc
*
mmc
,
struct
mmc_data
*
data
)
{
struct
fsl_esdhc
*
regs
=
mmc
->
priv
;
uint
blocks
;
char
*
buffer
;
uint
databuf
;
uint
size
;
uint
irqstat
;
uint
timeout
;
if
(
data
->
flags
&
MMC_DATA_READ
)
{
blocks
=
data
->
blocks
;
buffer
=
data
->
dest
;
while
(
blocks
)
{
timeout
=
PIO_TIMEOUT
;
size
=
data
->
blocksize
;
irqstat
=
esdhc_read32
(
&
regs
->
irqstat
);
while
(
!
(
esdhc_read32
(
&
regs
->
prsstat
)
&
PRSSTAT_BREN
)
&&
--
timeout
);
if
(
timeout
<=
0
)
{
printf
(
"
\n
Data Read Failed in PIO Mode."
);
return
timeout
;
}
while
(
size
&&
(
!
(
irqstat
&
IRQSTAT_TC
)))
{
udelay
(
100
);
/* Wait before last byte transfer complete */
irqstat
=
esdhc_read32
(
&
regs
->
irqstat
);
databuf
=
in_le32
(
&
regs
->
datport
);
*
((
uint
*
)
buffer
)
=
databuf
;
buffer
+=
4
;
size
-=
4
;
}
blocks
--
;
}
}
else
{
blocks
=
data
->
blocks
;
buffer
=
data
->
src
;
while
(
blocks
)
{
timeout
=
PIO_TIMEOUT
;
size
=
data
->
blocksize
;
irqstat
=
esdhc_read32
(
&
regs
->
irqstat
);
while
(
!
(
esdhc_read32
(
&
regs
->
prsstat
)
&
PRSSTAT_BWEN
)
&&
--
timeout
);
if
(
timeout
<=
0
)
{
printf
(
"
\n
Data Write Failed in PIO Mode."
);
return
timeout
;
}
while
(
size
&&
(
!
(
irqstat
&
IRQSTAT_TC
)))
{
udelay
(
100
);
/* Wait before last byte transfer complete */
databuf
=
*
((
uint
*
)
buffer
);
buffer
+=
4
;
size
-=
4
;
irqstat
=
esdhc_read32
(
&
regs
->
irqstat
);
out_le32
(
&
regs
->
datport
,
databuf
);
}
blocks
--
;
}
}
}
#endif
static
int
esdhc_setup_data
(
struct
mmc
*
mmc
,
struct
mmc_data
*
data
)
static
int
esdhc_setup_data
(
struct
mmc
*
mmc
,
struct
mmc_data
*
data
)
{
{
uint
wml_value
;
uint
wml_value
;
...
@@ -104,6 +171,17 @@ static int esdhc_setup_data(struct mmc *mmc, struct mmc_data *data)
...
@@ -104,6 +171,17 @@ static int esdhc_setup_data(struct mmc *mmc, struct mmc_data *data)
struct
fsl_esdhc_cfg
*
cfg
=
(
struct
fsl_esdhc_cfg
*
)
mmc
->
priv
;
struct
fsl_esdhc_cfg
*
cfg
=
(
struct
fsl_esdhc_cfg
*
)
mmc
->
priv
;
struct
fsl_esdhc
*
regs
=
(
struct
fsl_esdhc
*
)
cfg
->
esdhc_base
;
struct
fsl_esdhc
*
regs
=
(
struct
fsl_esdhc
*
)
cfg
->
esdhc_base
;
#ifdef CONFIG_SYS_FSL_ESDHC_USE_PIO
if
(
!
(
data
->
flags
&
MMC_DATA_READ
))
{
if
((
esdhc_read32
(
&
regs
->
prsstat
)
&
PRSSTAT_WPSPL
)
==
0
)
{
printf
(
"
\n
The SD card is locked. "
"Can not write to a locked card.
\n\n
"
);
return
TIMEOUT
;
}
esdhc_write32
(
&
regs
->
dsaddr
,
(
u32
)
data
->
src
);
}
else
esdhc_write32
(
&
regs
->
dsaddr
,
(
u32
)
data
->
dest
);
#else
wml_value
=
data
->
blocksize
/
4
;
wml_value
=
data
->
blocksize
/
4
;
if
(
data
->
flags
&
MMC_DATA_READ
)
{
if
(
data
->
flags
&
MMC_DATA_READ
)
{
...
@@ -124,6 +202,7 @@ static int esdhc_setup_data(struct mmc *mmc, struct mmc_data *data)
...
@@ -124,6 +202,7 @@ static int esdhc_setup_data(struct mmc *mmc, struct mmc_data *data)
wml_value
<<
16
);
wml_value
<<
16
);
esdhc_write32
(
&
regs
->
dsaddr
,
(
u32
)
data
->
src
);
esdhc_write32
(
&
regs
->
dsaddr
,
(
u32
)
data
->
src
);
}
}
#endif
esdhc_write32
(
&
regs
->
blkattr
,
data
->
blocks
<<
16
|
data
->
blocksize
);
esdhc_write32
(
&
regs
->
blkattr
,
data
->
blocks
<<
16
|
data
->
blocksize
);
...
@@ -220,6 +299,9 @@ esdhc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
...
@@ -220,6 +299,9 @@ esdhc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
/* Wait until all of the blocks are transferred */
/* Wait until all of the blocks are transferred */
if
(
data
)
{
if
(
data
)
{
#ifdef CONFIG_SYS_FSL_ESDHC_USE_PIO
esdhc_pio_read_write
(
mmc
,
data
);
#else
do
{
do
{
irqstat
=
esdhc_read32
(
&
regs
->
irqstat
);
irqstat
=
esdhc_read32
(
&
regs
->
irqstat
);
...
@@ -230,6 +312,7 @@ esdhc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
...
@@ -230,6 +312,7 @@ esdhc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
return
TIMEOUT
;
return
TIMEOUT
;
}
while
(
!
(
irqstat
&
IRQSTAT_TC
)
&&
}
while
(
!
(
irqstat
&
IRQSTAT_TC
)
&&
(
esdhc_read32
(
&
regs
->
prsstat
)
&
PRSSTAT_DLA
));
(
esdhc_read32
(
&
regs
->
prsstat
)
&
PRSSTAT_DLA
));
#endif
}
}
esdhc_write32
(
&
regs
->
irqstat
,
-
1
);
esdhc_write32
(
&
regs
->
irqstat
,
-
1
);
...
...
This diff is collapsed.
Click to expand it.
include/fsl_esdhc.h
+
2
−
0
View file @
6e5fb4ee
...
@@ -90,6 +90,7 @@
...
@@ -90,6 +90,7 @@
#define PRSSTAT_CDPL (0x00040000)
#define PRSSTAT_CDPL (0x00040000)
#define PRSSTAT_CINS (0x00010000)
#define PRSSTAT_CINS (0x00010000)
#define PRSSTAT_BREN (0x00000800)
#define PRSSTAT_BREN (0x00000800)
#define PRSSTAT_BWEN (0x00000400)
#define PRSSTAT_DLA (0x00000004)
#define PRSSTAT_DLA (0x00000004)
#define PRSSTAT_CICHB (0x00000002)
#define PRSSTAT_CICHB (0x00000002)
#define PRSSTAT_CIDHB (0x00000001)
#define PRSSTAT_CIDHB (0x00000001)
...
@@ -121,6 +122,7 @@
...
@@ -121,6 +122,7 @@
#define XFERTYP_DMAEN 0x00000001
#define XFERTYP_DMAEN 0x00000001
#define CINS_TIMEOUT 1000
#define CINS_TIMEOUT 1000
#define PIO_TIMEOUT 100000
#define DSADDR 0x2e004
#define DSADDR 0x2e004
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment