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
f3e39e67
Commit
f3e39e67
authored
Feb 03, 2006
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge master.kernel.org:/home/rmk/linux-2.6-mmc
parents
1a56f54c
e9225176
Changes
8
Show whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
84 additions
and
76 deletions
+84
-76
drivers/mmc/au1xmmc.c
drivers/mmc/au1xmmc.c
+30
-29
drivers/mmc/mmc.c
drivers/mmc/mmc.c
+14
-14
drivers/mmc/mmc_block.c
drivers/mmc/mmc_block.c
+4
-4
drivers/mmc/mmci.c
drivers/mmc/mmci.c
+3
-8
drivers/mmc/pxamci.c
drivers/mmc/pxamci.c
+5
-4
drivers/mmc/wbsd.c
drivers/mmc/wbsd.c
+4
-4
include/linux/mmc/mmc.h
include/linux/mmc/mmc.h
+23
-12
include/linux/mmc/protocol.h
include/linux/mmc/protocol.h
+1
-1
No files found.
drivers/mmc/au1xmmc.c
View file @
f3e39e67
...
...
@@ -194,7 +194,7 @@ static int au1xmmc_send_command(struct au1xmmc_host *host, int wait,
u32
mmccmd
=
(
cmd
->
opcode
<<
SD_CMD_CI_SHIFT
);
switch
(
cmd
->
flags
)
{
switch
(
mmc_rsp_type
(
cmd
->
flags
)
)
{
case
MMC_RSP_R1
:
mmccmd
|=
SD_CMD_RT_1
;
break
;
...
...
@@ -483,18 +483,8 @@ static void au1xmmc_cmd_complete(struct au1xmmc_host *host, u32 status)
cmd
=
mrq
->
cmd
;
cmd
->
error
=
MMC_ERR_NONE
;
if
((
cmd
->
flags
&
MMC_RSP_MASK
)
==
MMC_RSP_SHORT
)
{
/* Techincally, we should be getting all 48 bits of the response
* (SD_RESP1 + SD_RESP2), but because our response omits the CRC,
* our data ends up being shifted 8 bits to the right. In this case,
* that means that the OSR data starts at bit 31, so we can just
* read RESP0 and return that
*/
cmd
->
resp
[
0
]
=
au_readl
(
host
->
iobase
+
SD_RESP0
);
}
else
if
((
cmd
->
flags
&
MMC_RSP_MASK
)
==
MMC_RSP_LONG
)
{
if
(
cmd
->
flags
&
MMC_RSP_PRESENT
)
{
if
(
cmd
->
flags
&
MMC_RSP_136
)
{
u32
r
[
4
];
int
i
;
...
...
@@ -503,14 +493,25 @@ static void au1xmmc_cmd_complete(struct au1xmmc_host *host, u32 status)
r
[
2
]
=
au_readl
(
host
->
iobase
+
SD_RESP1
);
r
[
3
]
=
au_readl
(
host
->
iobase
+
SD_RESP0
);
/* The CRC is omitted from the response, so really we only got
* 120 bytes, but the engine expects 128 bits, so we have to shift
*
things up
/* The CRC is omitted from the response, so really
* we only got 120 bytes, but the engine expects
* 128 bits, so we have to shift
things up
*/
for
(
i
=
0
;
i
<
4
;
i
++
)
{
cmd
->
resp
[
i
]
=
(
r
[
i
]
&
0x00FFFFFF
)
<<
8
;
if
(
i
!=
3
)
cmd
->
resp
[
i
]
|=
(
r
[
i
+
1
]
&
0xFF000000
)
>>
24
;
if
(
i
!=
3
)
cmd
->
resp
[
i
]
|=
(
r
[
i
+
1
]
&
0xFF000000
)
>>
24
;
}
}
else
{
/* Techincally, we should be getting all 48 bits of
* the response (SD_RESP1 + SD_RESP2), but because
* our response omits the CRC, our data ends up
* being shifted 8 bits to the right. In this case,
* that means that the OSR data starts at bit 31,
* so we can just read RESP0 and return that
*/
cmd
->
resp
[
0
]
=
au_readl
(
host
->
iobase
+
SD_RESP0
);
}
}
...
...
drivers/mmc/mmc.c
View file @
f3e39e67
...
...
@@ -211,7 +211,7 @@ int mmc_wait_for_app_cmd(struct mmc_host *host, unsigned int rca,
appcmd
.
opcode
=
MMC_APP_CMD
;
appcmd
.
arg
=
rca
<<
16
;
appcmd
.
flags
=
MMC_RSP_R1
;
appcmd
.
flags
=
MMC_RSP_R1
|
MMC_CMD_AC
;
appcmd
.
retries
=
0
;
memset
(
appcmd
.
resp
,
0
,
sizeof
(
appcmd
.
resp
));
appcmd
.
data
=
NULL
;
...
...
@@ -331,7 +331,7 @@ static int mmc_select_card(struct mmc_host *host, struct mmc_card *card)
cmd
.
opcode
=
MMC_SELECT_CARD
;
cmd
.
arg
=
card
->
rca
<<
16
;
cmd
.
flags
=
MMC_RSP_R1
;
cmd
.
flags
=
MMC_RSP_R1
|
MMC_CMD_AC
;
err
=
mmc_wait_for_cmd
(
host
,
&
cmd
,
CMD_RETRIES
);
if
(
err
!=
MMC_ERR_NONE
)
...
...
@@ -358,7 +358,7 @@ static int mmc_select_card(struct mmc_host *host, struct mmc_card *card)
struct
mmc_command
cmd
;
cmd
.
opcode
=
SD_APP_SET_BUS_WIDTH
;
cmd
.
arg
=
SD_BUS_WIDTH_4
;
cmd
.
flags
=
MMC_RSP_R1
;
cmd
.
flags
=
MMC_RSP_R1
|
MMC_CMD_AC
;
err
=
mmc_wait_for_app_cmd
(
host
,
card
->
rca
,
&
cmd
,
CMD_RETRIES
);
...
...
@@ -386,7 +386,7 @@ static void mmc_deselect_cards(struct mmc_host *host)
cmd
.
opcode
=
MMC_SELECT_CARD
;
cmd
.
arg
=
0
;
cmd
.
flags
=
MMC_RSP_NONE
;
cmd
.
flags
=
MMC_RSP_NONE
|
MMC_CMD_AC
;
mmc_wait_for_cmd
(
host
,
&
cmd
,
0
);
}
...
...
@@ -677,7 +677,7 @@ static void mmc_idle_cards(struct mmc_host *host)
cmd
.
opcode
=
MMC_GO_IDLE_STATE
;
cmd
.
arg
=
0
;
cmd
.
flags
=
MMC_RSP_NONE
;
cmd
.
flags
=
MMC_RSP_NONE
|
MMC_CMD_BC
;
mmc_wait_for_cmd
(
host
,
&
cmd
,
0
);
...
...
@@ -738,7 +738,7 @@ static int mmc_send_op_cond(struct mmc_host *host, u32 ocr, u32 *rocr)
cmd
.
opcode
=
MMC_SEND_OP_COND
;
cmd
.
arg
=
ocr
;
cmd
.
flags
=
MMC_RSP_R3
;
cmd
.
flags
=
MMC_RSP_R3
|
MMC_CMD_BCR
;
for
(
i
=
100
;
i
;
i
--
)
{
err
=
mmc_wait_for_cmd
(
host
,
&
cmd
,
0
);
...
...
@@ -766,7 +766,7 @@ static int mmc_send_app_op_cond(struct mmc_host *host, u32 ocr, u32 *rocr)
cmd
.
opcode
=
SD_APP_OP_COND
;
cmd
.
arg
=
ocr
;
cmd
.
flags
=
MMC_RSP_R3
;
cmd
.
flags
=
MMC_RSP_R3
|
MMC_CMD_BCR
;
for
(
i
=
100
;
i
;
i
--
)
{
err
=
mmc_wait_for_app_cmd
(
host
,
0
,
&
cmd
,
CMD_RETRIES
);
...
...
@@ -805,7 +805,7 @@ static void mmc_discover_cards(struct mmc_host *host)
cmd
.
opcode
=
MMC_ALL_SEND_CID
;
cmd
.
arg
=
0
;
cmd
.
flags
=
MMC_RSP_R2
;
cmd
.
flags
=
MMC_RSP_R2
|
MMC_CMD_BCR
;
err
=
mmc_wait_for_cmd
(
host
,
&
cmd
,
CMD_RETRIES
);
if
(
err
==
MMC_ERR_TIMEOUT
)
{
...
...
@@ -835,7 +835,7 @@ static void mmc_discover_cards(struct mmc_host *host)
cmd
.
opcode
=
SD_SEND_RELATIVE_ADDR
;
cmd
.
arg
=
0
;
cmd
.
flags
=
MMC_RSP_R6
;
cmd
.
flags
=
MMC_RSP_R6
|
MMC_CMD_BCR
;
err
=
mmc_wait_for_cmd
(
host
,
&
cmd
,
CMD_RETRIES
);
if
(
err
!=
MMC_ERR_NONE
)
...
...
@@ -856,7 +856,7 @@ static void mmc_discover_cards(struct mmc_host *host)
}
else
{
cmd
.
opcode
=
MMC_SET_RELATIVE_ADDR
;
cmd
.
arg
=
card
->
rca
<<
16
;
cmd
.
flags
=
MMC_RSP_R1
;
cmd
.
flags
=
MMC_RSP_R1
|
MMC_CMD_AC
;
err
=
mmc_wait_for_cmd
(
host
,
&
cmd
,
CMD_RETRIES
);
if
(
err
!=
MMC_ERR_NONE
)
...
...
@@ -878,7 +878,7 @@ static void mmc_read_csds(struct mmc_host *host)
cmd
.
opcode
=
MMC_SEND_CSD
;
cmd
.
arg
=
card
->
rca
<<
16
;
cmd
.
flags
=
MMC_RSP_R2
;
cmd
.
flags
=
MMC_RSP_R2
|
MMC_CMD_AC
;
err
=
mmc_wait_for_cmd
(
host
,
&
cmd
,
CMD_RETRIES
);
if
(
err
!=
MMC_ERR_NONE
)
{
...
...
@@ -920,7 +920,7 @@ static void mmc_read_scrs(struct mmc_host *host)
cmd
.
opcode
=
MMC_APP_CMD
;
cmd
.
arg
=
card
->
rca
<<
16
;
cmd
.
flags
=
MMC_RSP_R1
;
cmd
.
flags
=
MMC_RSP_R1
|
MMC_CMD_AC
;
err
=
mmc_wait_for_cmd
(
host
,
&
cmd
,
0
);
if
((
err
!=
MMC_ERR_NONE
)
||
!
(
cmd
.
resp
[
0
]
&
R1_APP_CMD
))
{
...
...
@@ -932,7 +932,7 @@ static void mmc_read_scrs(struct mmc_host *host)
cmd
.
opcode
=
SD_APP_SEND_SCR
;
cmd
.
arg
=
0
;
cmd
.
flags
=
MMC_RSP_R1
;
cmd
.
flags
=
MMC_RSP_R1
|
MMC_CMD_ADTC
;
memset
(
&
data
,
0
,
sizeof
(
struct
mmc_data
));
...
...
@@ -1003,7 +1003,7 @@ static void mmc_check_cards(struct mmc_host *host)
cmd
.
opcode
=
MMC_SEND_STATUS
;
cmd
.
arg
=
card
->
rca
<<
16
;
cmd
.
flags
=
MMC_RSP_R1
;
cmd
.
flags
=
MMC_RSP_R1
|
MMC_CMD_AC
;
err
=
mmc_wait_for_cmd
(
host
,
&
cmd
,
CMD_RETRIES
);
if
(
err
==
MMC_ERR_NONE
)
...
...
drivers/mmc/mmc_block.c
View file @
f3e39e67
...
...
@@ -171,14 +171,14 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req)
brq
.
mrq
.
data
=
&
brq
.
data
;
brq
.
cmd
.
arg
=
req
->
sector
<<
9
;
brq
.
cmd
.
flags
=
MMC_RSP_R1
;
brq
.
cmd
.
flags
=
MMC_RSP_R1
|
MMC_CMD_ADTC
;
brq
.
data
.
timeout_ns
=
card
->
csd
.
tacc_ns
*
10
;
brq
.
data
.
timeout_clks
=
card
->
csd
.
tacc_clks
*
10
;
brq
.
data
.
blksz_bits
=
md
->
block_bits
;
brq
.
data
.
blocks
=
req
->
nr_sectors
>>
(
md
->
block_bits
-
9
);
brq
.
stop
.
opcode
=
MMC_STOP_TRANSMISSION
;
brq
.
stop
.
arg
=
0
;
brq
.
stop
.
flags
=
MMC_RSP_R1B
;
brq
.
stop
.
flags
=
MMC_RSP_R1B
|
MMC_CMD_AC
;
if
(
rq_data_dir
(
req
)
==
READ
)
{
brq
.
cmd
.
opcode
=
brq
.
data
.
blocks
>
1
?
MMC_READ_MULTIPLE_BLOCK
:
MMC_READ_SINGLE_BLOCK
;
...
...
@@ -223,7 +223,7 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req)
cmd
.
opcode
=
MMC_SEND_STATUS
;
cmd
.
arg
=
card
->
rca
<<
16
;
cmd
.
flags
=
MMC_RSP_R1
;
cmd
.
flags
=
MMC_RSP_R1
|
MMC_CMD_AC
;
err
=
mmc_wait_for_cmd
(
card
->
host
,
&
cmd
,
5
);
if
(
err
)
{
printk
(
KERN_ERR
"%s: error %d requesting status
\n
"
,
...
...
@@ -430,7 +430,7 @@ mmc_blk_set_blksize(struct mmc_blk_data *md, struct mmc_card *card)
mmc_card_claim_host
(
card
);
cmd
.
opcode
=
MMC_SET_BLOCKLEN
;
cmd
.
arg
=
1
<<
md
->
block_bits
;
cmd
.
flags
=
MMC_RSP_R1
;
cmd
.
flags
=
MMC_RSP_R1
|
MMC_CMD_AC
;
err
=
mmc_wait_for_cmd
(
card
->
host
,
&
cmd
,
5
);
mmc_card_release_host
(
card
);
...
...
drivers/mmc/mmci.c
View file @
f3e39e67
...
...
@@ -124,15 +124,10 @@ mmci_start_command(struct mmci_host *host, struct mmc_command *cmd, u32 c)
}
c
|=
cmd
->
opcode
|
MCI_CPSM_ENABLE
;
switch
(
cmd
->
flags
&
MMC_RSP_MASK
)
{
case
MMC_RSP_NONE
:
default:
break
;
case
MMC_RSP_LONG
:
if
(
cmd
->
flags
&
MMC_RSP_PRESENT
)
{
if
(
cmd
->
flags
&
MMC_RSP_136
)
c
|=
MCI_CPSM_LONGRSP
;
case
MMC_RSP_SHORT
:
c
|=
MCI_CPSM_RESPONSE
;
break
;
}
if
(
/*interrupt*/
0
)
c
|=
MCI_CPSM_INTERRUPT
;
...
...
drivers/mmc/pxamci.c
View file @
f3e39e67
...
...
@@ -178,14 +178,15 @@ static void pxamci_start_cmd(struct pxamci_host *host, struct mmc_command *cmd,
if
(
cmd
->
flags
&
MMC_RSP_BUSY
)
cmdat
|=
CMDAT_BUSY
;
switch
(
cmd
->
flags
&
(
MMC_RSP_MASK
|
MMC_RSP_CRC
))
{
case
MMC_RSP_SHORT
|
MMC_RSP_CRC
:
#define RSP_TYPE(x) ((x) & ~(MMC_RSP_BUSY|MMC_RSP_OPCODE))
switch
(
RSP_TYPE
(
mmc_resp_type
(
cmd
)))
{
case
RSP_TYPE
(
MMC_RSP_R1
):
/* r1, r1b, r6 */
cmdat
|=
CMDAT_RESP_SHORT
;
break
;
case
MMC_RSP_SHORT
:
case
RSP_TYPE
(
MMC_RSP_R3
)
:
cmdat
|=
CMDAT_RESP_R3
;
break
;
case
MMC_RSP_LONG
|
MMC_RSP_CRC
:
case
RSP_TYPE
(
MMC_RSP_R2
)
:
cmdat
|=
CMDAT_RESP_R2
;
break
;
default:
...
...
drivers/mmc/wbsd.c
View file @
f3e39e67
...
...
@@ -459,7 +459,7 @@ static void wbsd_send_command(struct wbsd_host *host, struct mmc_command *cmd)
/*
* Do we expect a reply?
*/
if
(
(
cmd
->
flags
&
MMC_RSP_MASK
)
!=
MMC_RSP_NONE
)
{
if
(
cmd
->
flags
&
MMC_RSP_PRESENT
)
{
/*
* Read back status.
*/
...
...
@@ -476,10 +476,10 @@ static void wbsd_send_command(struct wbsd_host *host, struct mmc_command *cmd)
cmd
->
error
=
MMC_ERR_BADCRC
;
/* All ok */
else
{
if
((
cmd
->
flags
&
MMC_RSP_MASK
)
==
MMC_RSP_SHORT
)
wbsd_get_short_reply
(
host
,
cmd
);
else
if
(
cmd
->
flags
&
MMC_RSP_136
)
wbsd_get_long_reply
(
host
,
cmd
);
else
wbsd_get_short_reply
(
host
,
cmd
);
}
}
...
...
include/linux/mmc/mmc.h
View file @
f3e39e67
...
...
@@ -21,24 +21,35 @@ struct mmc_command {
u32
arg
;
u32
resp
[
4
];
unsigned
int
flags
;
/* expected response type */
#define MMC_RSP_NONE (0 << 0)
#define MMC_RSP_SHORT (1 << 0)
#define MMC_RSP_LONG (2 << 0)
#define MMC_RSP_MASK (3 << 0)
#define MMC_RSP_CRC (1 << 3)
/* expect valid crc */
#define MMC_RSP_BUSY (1 << 4)
/* card may send busy */
#define MMC_RSP_OPCODE (1 << 5)
/* response contains opcode */
#define MMC_RSP_PRESENT (1 << 0)
#define MMC_RSP_136 (1 << 1)
/* 136 bit response */
#define MMC_RSP_CRC (1 << 2)
/* expect valid crc */
#define MMC_RSP_BUSY (1 << 3)
/* card may send busy */
#define MMC_RSP_OPCODE (1 << 4)
/* response contains opcode */
#define MMC_CMD_MASK (3 << 5)
/* command type */
#define MMC_CMD_AC (0 << 5)
#define MMC_CMD_ADTC (1 << 5)
#define MMC_CMD_BC (2 << 5)
#define MMC_CMD_BCR (3 << 5)
/*
* These are the response types, and correspond to valid bit
* patterns of the above flags. One additional valid pattern
* is all zeros, which means we don't expect a response.
*/
#define MMC_RSP_R1 (MMC_RSP_SHORT|MMC_RSP_CRC|MMC_RSP_OPCODE)
#define MMC_RSP_R1B (MMC_RSP_SHORT|MMC_RSP_CRC|MMC_RSP_OPCODE|MMC_RSP_BUSY)
#define MMC_RSP_R2 (MMC_RSP_LONG|MMC_RSP_CRC)
#define MMC_RSP_R3 (MMC_RSP_SHORT)
#define MMC_RSP_R6 (MMC_RSP_SHORT|MMC_RSP_CRC)
#define MMC_RSP_NONE (0)
#define MMC_RSP_R1 (MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE)
#define MMC_RSP_R1B (MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE|MMC_RSP_BUSY)
#define MMC_RSP_R2 (MMC_RSP_PRESENT|MMC_RSP_136|MMC_RSP_CRC)
#define MMC_RSP_R3 (MMC_RSP_PRESENT)
#define MMC_RSP_R6 (MMC_RSP_PRESENT|MMC_RSP_CRC)
#define mmc_resp_type(cmd) ((cmd)->flags & (MMC_RSP_PRESENT|MMC_RSP_136|MMC_RSP_CRC|MMC_RSP_BUSY|MMC_RSP_OPCODE))
/*
* These are the command types.
*/
#define mmc_cmd_type(cmd) ((cmd)->flags & MMC_CMD_TYPE)
unsigned
int
retries
;
/* max number of retries */
unsigned
int
error
;
/* command error */
...
...
include/linux/mmc/protocol.h
View file @
f3e39e67
...
...
@@ -79,7 +79,7 @@
/* SD commands type argument response */
/* class 8 */
/* This is basically the same command as for MMC with some quirks. */
#define SD_SEND_RELATIVE_ADDR 3
/*
ac
R6 */
#define SD_SEND_RELATIVE_ADDR 3
/*
bcr
R6 */
/* Application commands */
#define SD_APP_SET_BUS_WIDTH 6
/* ac [1:0] bus width R1 */
...
...
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