Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-davinci
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
linux
linux-davinci
Commits
b2bcc798
Commit
b2bcc798
authored
May 22, 2007
by
Pierre Ossman
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
mmc: implement SDIO IO_RW_DIRECT operation
Signed-off-by:
Pierre Ossman
<
drzeus@drzeus.cx
>
parent
5c4e6f13
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
74 additions
and
0 deletions
+74
-0
drivers/mmc/core/sdio_ops.c
drivers/mmc/core/sdio_ops.c
+37
-0
drivers/mmc/core/sdio_ops.h
drivers/mmc/core/sdio_ops.h
+2
-0
include/linux/mmc/core.h
include/linux/mmc/core.h
+1
-0
include/linux/mmc/sdio.h
include/linux/mmc/sdio.h
+34
-0
No files found.
drivers/mmc/core/sdio_ops.c
View file @
b2bcc798
...
...
@@ -10,6 +10,7 @@
*/
#include <linux/mmc/host.h>
#include <linux/mmc/card.h>
#include <linux/mmc/mmc.h>
#include <linux/mmc/sdio.h>
...
...
@@ -47,3 +48,39 @@ int mmc_send_io_op_cond(struct mmc_host *host, u32 ocr, u32 *rocr)
return
err
;
}
int
mmc_io_rw_direct
(
struct
mmc_card
*
card
,
int
write
,
unsigned
fn
,
unsigned
addr
,
u8
in
,
u8
*
out
)
{
struct
mmc_command
cmd
;
int
err
;
BUG_ON
(
!
card
);
BUG_ON
(
fn
>
7
);
memset
(
&
cmd
,
0
,
sizeof
(
struct
mmc_command
));
cmd
.
opcode
=
SD_IO_RW_DIRECT
;
cmd
.
arg
=
write
?
0x80000000
:
0x00000000
;
cmd
.
arg
|=
fn
<<
28
;
cmd
.
arg
|=
(
write
&&
out
)
?
0x08000000
:
0x00000000
;
cmd
.
arg
|=
addr
<<
9
;
cmd
.
arg
|=
in
;
cmd
.
flags
=
MMC_RSP_R5
|
MMC_CMD_AC
;
err
=
mmc_wait_for_cmd
(
card
->
host
,
&
cmd
,
0
);
if
(
err
)
return
err
;
if
(
cmd
.
resp
[
0
]
&
R5_ERROR
)
return
-
EIO
;
if
(
cmd
.
resp
[
0
]
&
R5_FUNCTION_NUMBER
)
return
-
EINVAL
;
if
(
cmd
.
resp
[
0
]
&
R5_OUT_OF_RANGE
)
return
-
ERANGE
;
if
(
out
)
*
out
=
cmd
.
resp
[
0
]
&
0xFF
;
return
0
;
}
drivers/mmc/core/sdio_ops.h
View file @
b2bcc798
...
...
@@ -13,6 +13,8 @@
#define _MMC_SDIO_OPS_H
int
mmc_send_io_op_cond
(
struct
mmc_host
*
host
,
u32
ocr
,
u32
*
rocr
);
int
mmc_io_rw_direct
(
struct
mmc_card
*
card
,
int
write
,
unsigned
fn
,
unsigned
addr
,
u8
in
,
u8
*
out
);
#endif
include/linux/mmc/core.h
View file @
b2bcc798
...
...
@@ -42,6 +42,7 @@ struct mmc_command {
#define MMC_RSP_R2 (MMC_RSP_PRESENT|MMC_RSP_136|MMC_RSP_CRC)
#define MMC_RSP_R3 (MMC_RSP_PRESENT)
#define MMC_RSP_R4 (MMC_RSP_PRESENT)
#define MMC_RSP_R5 (MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE)
#define MMC_RSP_R6 (MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE)
#define MMC_RSP_R7 (MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE)
...
...
include/linux/mmc/sdio.h
View file @
b2bcc798
...
...
@@ -14,6 +14,40 @@
/* SDIO commands type argument response */
#define SD_IO_SEND_OP_COND 5
/* bcr [23:0] OCR R4 */
#define SD_IO_RW_DIRECT 52
/* ac [31:0] See below R5 */
/*
* SD_IO_RW_DIRECT argument format:
*
* [31] R/W flag
* [30:28] Function number
* [27] RAW flag
* [25:9] Register address
* [7:0] Data
*/
/*
SDIO status in R5
Type
e : error bit
s : status bit
r : detected and set for the actual command response
x : detected and set during command execution. the host must poll
the card by sending status command in order to read these bits.
Clear condition
a : according to the card state
b : always related to the previous command. Reception of
a valid command will clear it (with a delay of one command)
c : clear by read
*/
#define R5_COM_CRC_ERROR (1 << 15)
/* er, b */
#define R5_ILLEGAL_COMMAND (1 << 14)
/* er, b */
#define R5_ERROR (1 << 11)
/* erx, c */
#define R5_FUNCTION_NUMBER (1 << 9)
/* er, c */
#define R5_OUT_OF_RANGE (1 << 8)
/* er, c */
#define R5_STATUS(x) (x & 0xCB00)
#define R5_IO_CURRENT_STATE(x) ((x & 0x3000) >> 12)
/* s, b */
#endif
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