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
88e1f06c
Commit
88e1f06c
authored
Sep 07, 2004
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
bk://bk.arm.linux.org.uk/linux-2.6-mmc
into ppc970.osdl.org:/home/torvalds/v2.6/linux
parents
32f6e431
b0e7d727
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
236 additions
and
88 deletions
+236
-88
drivers/mmc/mmc.c
drivers/mmc/mmc.c
+17
-9
drivers/mmc/mmc_block.c
drivers/mmc/mmc_block.c
+9
-14
drivers/mmc/mmc_queue.c
drivers/mmc/mmc_queue.c
+7
-2
drivers/mmc/mmci.c
drivers/mmc/mmci.c
+175
-51
drivers/mmc/mmci.h
drivers/mmc/mmci.h
+6
-11
drivers/mmc/pxamci.c
drivers/mmc/pxamci.c
+5
-0
include/linux/mmc/host.h
include/linux/mmc/host.h
+7
-1
include/linux/mmc/mmc.h
include/linux/mmc/mmc.h
+10
-0
No files found.
drivers/mmc/mmc.c
View file @
88e1f06c
/*
* linux/drivers/mmc/mmc.c
*
* Copyright (C) 2003 Russell King, All Rights Reserved.
* Copyright (C) 2003
-2004
Russell King, All Rights Reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
...
...
@@ -14,6 +14,7 @@
#include <linux/completion.h>
#include <linux/device.h>
#include <linux/delay.h>
#include <linux/pagemap.h>
#include <linux/err.h>
#include <linux/mmc/card.h>
...
...
@@ -212,7 +213,7 @@ int __mmc_claim_host(struct mmc_host *host, struct mmc_card *card)
cmd
.
opcode
=
MMC_SELECT_CARD
;
cmd
.
arg
=
card
->
rca
<<
16
;
cmd
.
flags
=
MMC_RSP_
SHORT
|
MMC_RSP_CRC
;
cmd
.
flags
=
MMC_RSP_
R1
;
err
=
mmc_wait_for_cmd
(
host
,
&
cmd
,
CMD_RETRIES
);
}
...
...
@@ -430,7 +431,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_
SHORT
;
cmd
.
flags
=
MMC_RSP_
R3
;
for
(
i
=
100
;
i
;
i
--
)
{
err
=
mmc_wait_for_cmd
(
host
,
&
cmd
,
0
);
...
...
@@ -468,7 +469,7 @@ static void mmc_discover_cards(struct mmc_host *host)
cmd
.
opcode
=
MMC_ALL_SEND_CID
;
cmd
.
arg
=
0
;
cmd
.
flags
=
MMC_RSP_
LONG
|
MMC_RSP_CRC
;
cmd
.
flags
=
MMC_RSP_
R2
;
err
=
mmc_wait_for_cmd
(
host
,
&
cmd
,
CMD_RETRIES
);
if
(
err
==
MMC_ERR_TIMEOUT
)
{
...
...
@@ -497,7 +498,7 @@ static void mmc_discover_cards(struct mmc_host *host)
cmd
.
opcode
=
MMC_SET_RELATIVE_ADDR
;
cmd
.
arg
=
card
->
rca
<<
16
;
cmd
.
flags
=
MMC_RSP_
SHORT
|
MMC_RSP_CRC
;
cmd
.
flags
=
MMC_RSP_
R1
;
err
=
mmc_wait_for_cmd
(
host
,
&
cmd
,
CMD_RETRIES
);
if
(
err
!=
MMC_ERR_NONE
)
...
...
@@ -518,7 +519,7 @@ static void mmc_read_csds(struct mmc_host *host)
cmd
.
opcode
=
MMC_SEND_CSD
;
cmd
.
arg
=
card
->
rca
<<
16
;
cmd
.
flags
=
MMC_RSP_
LONG
|
MMC_RSP_CRC
;
cmd
.
flags
=
MMC_RSP_
R2
;
err
=
mmc_wait_for_cmd
(
host
,
&
cmd
,
CMD_RETRIES
);
if
(
err
!=
MMC_ERR_NONE
)
{
...
...
@@ -566,7 +567,7 @@ static void mmc_check_cards(struct mmc_host *host)
cmd
.
opcode
=
MMC_SEND_STATUS
;
cmd
.
arg
=
card
->
rca
<<
16
;
cmd
.
flags
=
MMC_RSP_
SHORT
|
MMC_RSP_CRC
;
cmd
.
flags
=
MMC_RSP_
R1
;
err
=
mmc_wait_for_cmd
(
host
,
&
cmd
,
CMD_RETRIES
);
if
(
err
==
MMC_ERR_NONE
)
...
...
@@ -715,14 +716,21 @@ struct mmc_host *mmc_alloc_host(int extra, struct device *dev)
if
(
host
)
{
memset
(
host
,
0
,
sizeof
(
struct
mmc_host
)
+
extra
);
host
->
priv
=
host
+
1
;
spin_lock_init
(
&
host
->
lock
);
init_waitqueue_head
(
&
host
->
wq
);
INIT_LIST_HEAD
(
&
host
->
cards
);
INIT_WORK
(
&
host
->
detect
,
mmc_rescan
,
host
);
host
->
dev
=
dev
;
/*
* By default, hosts do not support SGIO or large requests.
* They have to set these according to their abilities.
*/
host
->
max_hw_segs
=
1
;
host
->
max_phys_segs
=
1
;
host
->
max_sectors
=
1
<<
(
PAGE_CACHE_SHIFT
-
9
);
host
->
max_seg_size
=
PAGE_CACHE_SIZE
;
}
return
host
;
...
...
drivers/mmc/mmc_block.c
View file @
88e1f06c
...
...
@@ -43,7 +43,6 @@
#define MMC_SHIFT 3
static
int
mmc_major
;
static
int
maxsectors
=
8
;
/*
* There is one mmc_blk_data per slot.
...
...
@@ -180,22 +179,22 @@ 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_
SHORT
|
MMC_RSP_CRC
;
brq
.
cmd
.
flags
=
MMC_RSP_
R1
;
brq
.
data
.
req
=
req
;
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
->
current_
nr_sectors
>>
(
md
->
block_bits
-
9
);
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_
SHORT
|
MMC_RSP_CRC
|
MMC_RSP_BUSY
;
brq
.
stop
.
flags
=
MMC_RSP_
R1B
;
if
(
rq_data_dir
(
req
)
==
READ
)
{
brq
.
cmd
.
opcode
=
brq
.
data
.
blocks
>
1
?
MMC_READ_MULTIPLE_BLOCK
:
MMC_READ_SINGLE_BLOCK
;
brq
.
data
.
flags
|=
MMC_DATA_READ
;
}
else
{
brq
.
cmd
.
opcode
=
MMC_WRITE_BLOCK
;
brq
.
cmd
.
flags
|=
MMC_RSP_BUSY
;
brq
.
cmd
.
flags
=
MMC_RSP_R1B
;
brq
.
data
.
flags
|=
MMC_DATA_WRITE
;
brq
.
data
.
blocks
=
1
;
}
...
...
@@ -225,7 +224,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_
SHORT
|
MMC_RSP_CRC
;
cmd
.
flags
=
MMC_RSP_
R1
;
err
=
mmc_wait_for_cmd
(
card
->
host
,
&
cmd
,
5
);
if
(
err
)
{
printk
(
KERN_ERR
"%s: error %d requesting status
\n
"
,
...
...
@@ -334,11 +333,10 @@ static struct mmc_blk_data *mmc_blk_alloc(struct mmc_card *card)
sprintf
(
md
->
disk
->
disk_name
,
"mmcblk%d"
,
devidx
);
sprintf
(
md
->
disk
->
devfs_name
,
"mmc/blk%d"
,
devidx
);
md
->
block_bits
=
md
->
queue
.
card
->
csd
.
read_blkbits
;
md
->
block_bits
=
card
->
csd
.
read_blkbits
;
blk_queue_max_sectors
(
md
->
queue
.
queue
,
maxsectors
);
blk_queue_hardsect_size
(
md
->
queue
.
queue
,
1
<<
md
->
block_bits
);
set_capacity
(
md
->
disk
,
md
->
queue
.
card
->
csd
.
capacity
);
set_capacity
(
md
->
disk
,
card
->
csd
.
capacity
);
}
out:
return
md
;
...
...
@@ -353,7 +351,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
<<
card
->
csd
.
read_blkbits
;
cmd
.
flags
=
MMC_RSP_
SHORT
|
MMC_RSP_CRC
;
cmd
.
flags
=
MMC_RSP_
R1
;
err
=
mmc_wait_for_cmd
(
card
->
host
,
&
cmd
,
5
);
mmc_card_release_host
(
card
);
...
...
@@ -440,7 +438,7 @@ static int mmc_blk_resume(struct mmc_card *card)
struct
mmc_blk_data
*
md
=
mmc_get_drvdata
(
card
);
if
(
md
)
{
mmc_blk_set_blksize
(
md
,
md
->
queue
.
card
);
mmc_blk_set_blksize
(
md
,
card
);
blk_start_queue
(
md
->
queue
.
queue
);
}
return
0
;
...
...
@@ -489,9 +487,6 @@ static void __exit mmc_blk_exit(void)
module_init
(
mmc_blk_init
);
module_exit
(
mmc_blk_exit
);
module_param
(
maxsectors
,
int
,
0444
);
MODULE_PARM_DESC
(
maxsectors
,
"Maximum number of sectors for a single request"
);
MODULE_LICENSE
(
"GPL"
);
MODULE_DESCRIPTION
(
"Multimedia Card (MMC) block device driver"
);
drivers/mmc/mmc_queue.c
View file @
88e1f06c
...
...
@@ -124,11 +124,12 @@ static void mmc_request(request_queue_t *q)
*/
int
mmc_init_queue
(
struct
mmc_queue
*
mq
,
struct
mmc_card
*
card
,
spinlock_t
*
lock
)
{
struct
mmc_host
*
host
=
card
->
host
;
u64
limit
=
BLK_BOUNCE_HIGH
;
int
ret
;
if
(
card
->
host
->
dev
->
dma_mask
&&
*
card
->
host
->
dev
->
dma_mask
)
limit
=
*
card
->
host
->
dev
->
dma_mask
;
if
(
host
->
dev
->
dma_mask
&&
*
host
->
dev
->
dma_mask
)
limit
=
*
host
->
dev
->
dma_mask
;
mq
->
card
=
card
;
mq
->
queue
=
blk_init_queue
(
mmc_request
,
lock
);
...
...
@@ -137,6 +138,10 @@ int mmc_init_queue(struct mmc_queue *mq, struct mmc_card *card, spinlock_t *lock
blk_queue_prep_rq
(
mq
->
queue
,
mmc_prep_request
);
blk_queue_bounce_limit
(
mq
->
queue
,
limit
);
blk_queue_max_sectors
(
mq
->
queue
,
host
->
max_sectors
);
blk_queue_max_phys_segments
(
mq
->
queue
,
host
->
max_phys_segs
);
blk_queue_max_hw_segments
(
mq
->
queue
,
host
->
max_hw_segs
);
blk_queue_max_segment_size
(
mq
->
queue
,
host
->
max_seg_size
);
mq
->
queue
->
queuedata
=
mq
;
mq
->
req
=
NULL
;
...
...
drivers/mmc/mmci.c
View file @
88e1f06c
...
...
@@ -43,10 +43,9 @@ static void
mmci_request_end
(
struct
mmci_host
*
host
,
struct
mmc_request
*
mrq
)
{
writel
(
0
,
host
->
base
+
MMCICOMMAND
);
host
->
mrq
=
NULL
;
host
->
cmd
=
NULL
;
host
->
data
=
NULL
;
host
->
buffer
=
NULL
;
if
(
mrq
->
data
)
mrq
->
data
->
bytes_xfered
=
host
->
data_xfered
;
...
...
@@ -60,6 +59,13 @@ mmci_request_end(struct mmci_host *host, struct mmc_request *mrq)
spin_lock
(
&
host
->
lock
);
}
static
void
mmci_stop_data
(
struct
mmci_host
*
host
)
{
writel
(
0
,
host
->
base
+
MMCIDATACTRL
);
writel
(
0
,
host
->
base
+
MMCIMASK1
);
host
->
data
=
NULL
;
}
static
void
mmci_start_data
(
struct
mmci_host
*
host
,
struct
mmc_data
*
data
)
{
unsigned
int
datactrl
,
timeout
,
irqmask
;
...
...
@@ -69,7 +75,7 @@ static void mmci_start_data(struct mmci_host *host, struct mmc_data *data)
1
<<
data
->
blksz_bits
,
data
->
blocks
,
data
->
flags
);
host
->
data
=
data
;
host
->
buffer
=
data
->
req
->
buffer
;
host
->
offset
=
0
;
host
->
size
=
data
->
blocks
<<
data
->
blksz_bits
;
host
->
data_xfered
=
0
;
...
...
@@ -94,6 +100,7 @@ static void mmci_start_data(struct mmci_host *host, struct mmc_data *data)
}
writel
(
datactrl
,
base
+
MMCIDATACTRL
);
writel
(
readl
(
base
+
MMCIMASK0
)
&
~
MCI_DATAENDMASK
,
base
+
MMCIMASK0
);
writel
(
irqmask
,
base
+
MMCIMASK1
);
}
...
...
@@ -147,7 +154,8 @@ mmci_data_irq(struct mmci_host *host, struct mmc_data *data,
status
|=
MCI_DATAEND
;
}
if
(
status
&
MCI_DATAEND
)
{
host
->
data
=
NULL
;
mmci_stop_data
(
host
);
if
(
!
data
->
stop
)
{
mmci_request_end
(
host
,
data
->
mrq
);
}
else
{
...
...
@@ -182,72 +190,171 @@ mmci_cmd_irq(struct mmci_host *host, struct mmc_command *cmd,
}
}
/*
* PIO data transfer IRQ handler.
*/
static
irqreturn_t
mmci_pio_irq
(
int
irq
,
void
*
dev_id
,
struct
pt_regs
*
regs
)
static
int
mmci_pio_read
(
struct
mmci_host
*
host
,
struct
request
*
req
,
u32
status
)
{
struct
mmci_host
*
host
=
dev_id
;
void
*
base
=
host
->
base
;
u32
status
;
int
ret
=
0
;
do
{
status
=
readl
(
base
+
MMCISTATUS
);
unsigned
long
flags
;
unsigned
int
bio_remain
;
char
*
buffer
;
if
(
!
(
status
&
(
MCI_RXDATAAVLBL
|
MCI_RXFIFOHALFFULL
|
MCI_TXFIFOHALFEMPTY
)))
/*
* Check for data available.
*/
if
(
!
(
status
&
MCI_RXDATAAVLBL
))
break
;
DBG
(
host
,
"irq1 %08x
\n
"
,
status
);
/*
* Map the BIO buffer.
*/
buffer
=
bio_kmap_irq
(
req
->
cbio
,
&
flags
);
bio_remain
=
(
req
->
current_nr_sectors
<<
9
)
-
host
->
offset
;
do
{
int
count
=
host
->
size
-
(
readl
(
base
+
MMCIFIFOCNT
)
<<
2
);
if
(
count
>
bio_remain
)
count
=
bio_remain
;
if
(
status
&
(
MCI_RXDATAAVLBL
|
MCI_RXFIFOHALFFULL
))
{
unsigned
int
count
=
host
->
size
-
(
readl
(
base
+
MMCIFIFOCNT
)
<<
2
);
if
(
count
<
0
)
count
=
0
;
if
(
count
&&
host
->
buffer
)
{
readsl
(
base
+
MMCIFIFO
,
host
->
buffer
,
count
>>
2
);
host
->
buffer
+=
count
;
if
(
count
>
0
)
{
ret
=
1
;
readsl
(
base
+
MMCIFIFO
,
buffer
+
host
->
offset
,
count
>>
2
);
host
->
offset
+=
count
;
host
->
size
-=
count
;
if
(
host
->
size
==
0
)
host
->
buffer
=
NULL
;
}
else
{
static
int
first
=
1
;
if
(
first
)
{
first
=
0
;
printk
(
KERN_ERR
"MMCI: sinking excessive data
\n
"
);
}
readl
(
base
+
MMCIFIFO
);
bio_remain
-=
count
;
if
(
bio_remain
==
0
)
goto
next_bio
;
}
}
status
=
readl
(
base
+
MMCISTATUS
);
}
while
(
status
&
MCI_RXDATAAVLBL
);
bio_kunmap_irq
(
buffer
,
&
flags
);
break
;
next_bio:
bio_kunmap_irq
(
buffer
,
&
flags
);
/*
* Ok, we've completed that BIO, move on to next
* BIO in the chain. Note: this doesn't actually
* complete the BIO!
*/
if
(
!
process_that_request_first
(
req
,
req
->
current_nr_sectors
))
break
;
host
->
offset
=
0
;
status
=
readl
(
base
+
MMCISTATUS
);
}
while
(
1
);
/*
* If we're nearing the end of the read, switch to
* "any data available" mode.
*/
if
(
host
->
size
<
MCI_FIFOSIZE
)
writel
(
MCI_RXDATAAVLBLMASK
,
base
+
MMCIMASK1
);
return
ret
;
}
static
int
mmci_pio_write
(
struct
mmci_host
*
host
,
struct
request
*
req
,
u32
status
)
{
void
*
base
=
host
->
base
;
int
ret
=
0
;
do
{
unsigned
long
flags
;
unsigned
int
bio_remain
;
char
*
buffer
;
/*
* We only need to test the half-empty flag here - if
* the FIFO is completely empty, then by definition
* it is more than half empty.
*/
if
(
status
&
MCI_TXFIFOHALFEMPTY
)
{
unsigned
int
maxcnt
=
status
&
MCI_TXFIFOEMPTY
?
MCI_FIFOSIZE
:
MCI_FIFOHALFSIZE
;
unsigned
int
count
=
min
(
host
->
size
,
maxcnt
);
if
(
!
(
status
&
MCI_TXFIFOHALFEMPTY
))
break
;
writesl
(
base
+
MMCIFIFO
,
host
->
buffer
,
count
>>
2
);
/*
* Map the BIO buffer.
*/
buffer
=
bio_kmap_irq
(
req
->
cbio
,
&
flags
);
bio_remain
=
(
req
->
current_nr_sectors
<<
9
)
-
host
->
offset
;
host
->
buffer
+=
count
;
do
{
unsigned
int
count
,
maxcnt
;
maxcnt
=
status
&
MCI_TXFIFOEMPTY
?
MCI_FIFOSIZE
:
MCI_FIFOHALFSIZE
;
count
=
min
(
bio_remain
,
maxcnt
);
writesl
(
base
+
MMCIFIFO
,
buffer
+
host
->
offset
,
count
>>
2
);
host
->
offset
+=
count
;
host
->
size
-=
count
;
bio_remain
-=
count
;
/*
* If we run out of data, disable the data IRQs;
* this prevents a race where the FIFO becomes
* empty before the chip itself has disabled the
* data path.
*/
if
(
host
->
size
==
0
)
writel
(
0
,
base
+
MMCIMASK1
);
}
ret
=
1
;
ret
=
1
;
}
while
(
status
);
if
(
bio_remain
==
0
)
goto
next_bio
;
status
=
readl
(
base
+
MMCISTATUS
);
}
while
(
status
&
MCI_TXFIFOHALFEMPTY
);
bio_kunmap_irq
(
buffer
,
&
flags
);
break
;
next_bio:
bio_kunmap_irq
(
buffer
,
&
flags
);
/*
* Ok, we've completed that BIO, move on to next
* BIO in the chain. Note: this doesn't actually
* complete the BIO!
*/
if
(
!
process_that_request_first
(
req
,
req
->
current_nr_sectors
))
break
;
host
->
offset
=
0
;
status
=
readl
(
base
+
MMCISTATUS
);
}
while
(
1
);
return
ret
;
}
/*
* PIO data transfer IRQ handler.
*/
static
irqreturn_t
mmci_pio_irq
(
int
irq
,
void
*
dev_id
,
struct
pt_regs
*
regs
)
{
struct
mmci_host
*
host
=
dev_id
;
struct
request
*
req
;
void
*
base
=
host
->
base
;
u32
status
;
int
ret
=
0
;
status
=
readl
(
base
+
MMCISTATUS
);
DBG
(
host
,
"irq1 %08x
\n
"
,
status
);
req
=
host
->
data
->
req
;
if
(
status
&
MCI_RXACTIVE
)
ret
=
mmci_pio_read
(
host
,
req
,
status
);
else
if
(
status
&
MCI_TXACTIVE
)
ret
=
mmci_pio_write
(
host
,
req
,
status
);
/*
* If we run out of data, disable the data IRQs; this
* prevents a race where the FIFO becomes empty before
* the chip itself has disabled the data path, and
* stops us racing with our data end IRQ.
*/
if
(
host
->
size
==
0
)
{
writel
(
0
,
base
+
MMCIMASK1
);
writel
(
readl
(
base
+
MMCIMASK0
)
|
MCI_DATAENDMASK
,
base
+
MMCIMASK0
);
}
return
IRQ_RETVAL
(
ret
);
}
...
...
@@ -268,11 +375,9 @@ static irqreturn_t mmci_irq(int irq, void *dev_id, struct pt_regs *regs)
struct
mmc_data
*
data
;
status
=
readl
(
host
->
base
+
MMCISTATUS
);
status
&=
readl
(
host
->
base
+
MMCIMASK0
);
writel
(
status
,
host
->
base
+
MMCICLEAR
);
if
(
!
(
status
&
MCI_IRQMASK
))
break
;
DBG
(
host
,
"irq0 %08x
\n
"
,
status
);
data
=
host
->
data
;
...
...
@@ -427,6 +532,25 @@ static int mmci_probe(struct amba_device *dev, void *id)
mmc
->
f_max
=
min
(
host
->
mclk
,
fmax
);
mmc
->
ocr_avail
=
plat
->
ocr_mask
;
/*
* We can do SGIO
*/
mmc
->
max_hw_segs
=
16
;
mmc
->
max_phys_segs
=
16
;
/*
* Since we only have a 16-bit data length register, we must
* ensure that we don't exceed 2^16-1 bytes in a single request.
* Choose 64 (512-byte) sectors as the limit.
*/
mmc
->
max_sectors
=
64
;
/*
* Set the maximum segment size. Since we aren't doing DMA
* (yet) we are only limited by the data length register.
*/
mmc
->
max_seg_size
=
mmc
->
max_sectors
<<
9
;
spin_lock_init
(
&
host
->
lock
);
writel
(
0
,
host
->
base
+
MMCIMASK0
);
...
...
drivers/mmc/mmci.h
View file @
88e1f06c
...
...
@@ -103,18 +103,15 @@
#define MMCIFIFOCNT 0x048
#define MMCIFIFO 0x080
/* to 0x0bc */
#define MCI_IRQMASK \
(MCI_CMDCRCFAIL|MCI_DATACRCFAIL|MCI_CMDTIMEOUT|MCI_DATATIMEOUT| \
MCI_TXUNDERRUN|MCI_RXOVERRUN|MCI_CMDRESPEND|MCI_CMDSENT| \
MCI_DATAEND|MCI_DATABLOCKEND)
#define MCI_IRQENABLE \
(MCI_CMDCRCFAILMASK|MCI_DATACRCFAILMASK|MCI_CMDTIMEOUTMASK| \
MCI_DATATIMEOUTMASK|MCI_TXUNDERRUNMASK|MCI_RXOVERRUNMASK| \
MCI_CMDRESPENDMASK|MCI_CMDSENTMASK|MCI_DATAENDMASK| \
MCI_DATABLOCKENDMASK)
MCI_CMDRESPENDMASK|MCI_CMDSENTMASK|MCI_DATABLOCKENDMASK)
#define MCI_FIFOSIZE 16
/*
* The size of the FIFO in bytes.
*/
#define MCI_FIFOSIZE (16*4)
#define MCI_FIFOHALFSIZE (MCI_FIFOSIZE / 2)
...
...
@@ -141,8 +138,6 @@ struct mmci_host {
unsigned
int
oldstat
;
/* pio stuff */
void
*
buffer
;
unsigned
int
offset
;
unsigned
int
size
;
};
#define to_mmci_host(mmc) container_of(mmc, struct mmci_host, mmc)
drivers/mmc/pxamci.c
View file @
88e1f06c
...
...
@@ -530,6 +530,7 @@ static int pxamci_remove(struct device *dev)
return
0
;
}
#ifdef CONFIG_PM
static
int
pxamci_suspend
(
struct
device
*
dev
,
u32
state
,
u32
level
)
{
struct
mmc_host
*
mmc
=
dev_get_drvdata
(
dev
);
...
...
@@ -551,6 +552,10 @@ static int pxamci_resume(struct device *dev, u32 level)
return
ret
;
}
#else
#define pxamci_suspend NULL
#define pxamci_resume NULL
#endif
static
struct
device_driver
pxamci_driver
=
{
.
name
=
"pxa2xx-mci"
,
...
...
include/linux/mmc/host.h
View file @
88e1f06c
...
...
@@ -64,12 +64,18 @@ struct device;
struct
mmc_host
{
struct
device
*
dev
;
struct
mmc_host_ops
*
ops
;
void
*
priv
;
unsigned
int
f_min
;
unsigned
int
f_max
;
u32
ocr_avail
;
char
host_name
[
8
];
/* host specific block data */
unsigned
int
max_seg_size
;
/* see blk_queue_max_segment_size */
unsigned
short
max_hw_segs
;
/* see blk_queue_max_hw_segments */
unsigned
short
max_phys_segs
;
/* see blk_queue_max_phys_segments */
unsigned
short
max_sectors
;
/* see blk_queue_max_sectors */
unsigned
short
unused
;
/* private data */
struct
mmc_ios
ios
;
/* current io bus settings */
u32
ocr
;
/* the current OCR setting */
...
...
include/linux/mmc/mmc.h
View file @
88e1f06c
...
...
@@ -28,6 +28,16 @@ struct mmc_command {
#define MMC_RSP_CRC (1 << 3)
/* expect valid crc */
#define MMC_RSP_BUSY (1 << 4)
/* card may send busy */
/*
* 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)
#define MMC_RSP_R1B (MMC_RSP_SHORT|MMC_RSP_CRC|MMC_RSP_BUSY)
#define MMC_RSP_R2 (MMC_RSP_LONG|MMC_RSP_CRC)
#define MMC_RSP_R3 (MMC_RSP_SHORT)
unsigned
int
retries
;
/* max number of retries */
unsigned
int
error
;
/* command error */
...
...
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