LinuxQuestions.org

LinuxQuestions.org (/questions/)
-   Linux - Newbie (https://www.linuxquestions.org/questions/linux-newbie-8/)
-   -   Embedded MMC/SD card driver problems!!base on linux2.6.14.1 (https://www.linuxquestions.org/questions/linux-newbie-8/embedded-mmc-sd-card-driver-problems-base-on-linux2-6-14-1-a-659388/)

SharkCN 07-30-2008 09:39 PM

Embedded MMC/SD card driver problems!!base on linux2.6.14.1
 
the messages from booting system on s3c2410 embedded board!
mmci-s3c2410: s3c2410sdi_set_ios
mmci-s3c2410: S3C2410_SDICON :00000000
mmci-s3c2410: S3C2410_SDICON :00000000
mmci-s3c2410: S3C2410_SDICON :000000ff
mmci-s3c2410: s3c2410sdi_set_ios
mmci-s3c2410: S3C2410_SDICON :00000000
mmci-s3c2410: S3C2410_SDICON :00000001
mmci-s3c2410: S3C2410_SDICON :000000ff
mmci-s3c2410: s3c2410sdi_set_ios
mmci-s3c2410: S3C2410_SDICON :00000001
mmci-s3c2410: S3C2410_SDICON :00000001
mmci-s3c2410: S3C2410_SDICON :000000ff
<7>mmci-s3c2410: request: [CMD] opcode:0x00 arg:0x00000000 flags:0 retries:0
mmci-s3c2410: request : sd mode
mmci-s3c2410: IRQ csta=0x00000800 dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ transfer closed.
mmci-s3c2410: IRQ csta=0x00000800 dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
mmci-s3c2410: IRQ csta=0x00000800 dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
[CMD] request complete.
mmci-s3c2410: mrq->cmd->resp[0]: 0x00000000
mmci-s3c2410: mrq->cmd->resp[1]: 0x00000000
mmci-s3c2410: mrq->cmd->resp[2]: 0x00000000
mmci-s3c2410: mrq->cmd->resp[3]: 0x00000000
mmci-s3c2410: s3c2410sdi_set_ios
mmci-s3c2410: S3C2410_SDICON :00000001
mmci-s3c2410: S3C2410_SDICON :00000001
mmci-s3c2410: S3C2410_SDICON :000000ff
<7>mmci-s3c2410: request: [CMD] opcode:0x55 arg:0x00000000 flags:9 retries:0
mmci-s3c2410: request : sd mode
mmci-s3c2410: IRQ csta=0x00000a37 dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ transfer closed.
mmci-s3c2410: IRQ csta=0x00000237 dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
mmci-s3c2410: IRQ csta=0x00000237 dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
[CMD] request complete.
mmci-s3c2410: mrq->cmd->resp[0]: 0x00000120
mmci-s3c2410: mrq->cmd->resp[1]: 0x83000000
mmci-s3c2410: mrq->cmd->resp[2]: 0x00000000
mmci-s3c2410: mrq->cmd->resp[3]: 0x00000000
<7>mmci-s3c2410: request: [CMD] opcode:0x41 arg:0x00000000 flags:1 retries:0
mmci-s3c2410: request : sd mode
mmci-s3c2410: IRQ csta=0x00001a3f dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: COMMAND CRC FAILED 1a3f
mmci-s3c2410: IRQ transfer closed.
mmci-s3c2410: IRQ csta=0x0000023f dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
mmci-s3c2410: IRQ csta=0x0000023f dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
[CMD] request complete.
mmci-s3c2410: mrq->cmd->resp[0]: 0x00ff8000
mmci-s3c2410: mrq->cmd->resp[1]: 0xff000000
mmci-s3c2410: mrq->cmd->resp[2]: 0x00000000
mmci-s3c2410: mrq->cmd->resp[3]: 0x00000000
mmci-s3c2410: s3c2410sdi_set_ios
mmci-s3c2410: S3C2410_SDICON :00000001
mmci-s3c2410: S3C2410_SDICON :00000001
mmci-s3c2410: S3C2410_SDICON :000000ff
mmci-s3c2410: s3c2410sdi_set_ios
mmci-s3c2410: S3C2410_SDICON :00000001
mmci-s3c2410: S3C2410_SDICON :00000001
mmci-s3c2410: S3C2410_SDICON :000000ff
<7>mmci-s3c2410: request: [CMD] opcode:0x00 arg:0x00000000 flags:0 retries:0
mmci-s3c2410: request : sd mode
mmci-s3c2410: IRQ csta=0x0000083f dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ transfer closed.
mmci-s3c2410: IRQ csta=0x0000083f dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
mmci-s3c2410: IRQ csta=0x0000083f dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
[CMD] request complete.
mmci-s3c2410: mrq->cmd->resp[0]: 0x00ff8000
mmci-s3c2410: mrq->cmd->resp[1]: 0xff000000
mmci-s3c2410: mrq->cmd->resp[2]: 0x00000000
mmci-s3c2410: mrq->cmd->resp[3]: 0x00000000
mmci-s3c2410: s3c2410sdi_set_ios
mmci-s3c2410: S3C2410_SDICON :00000001
mmci-s3c2410: S3C2410_SDICON :00000001
mmci-s3c2410: S3C2410_SDICON :000000ff
<7>mmci-s3c2410: request: [CMD] opcode:0x55 arg:0x00000000 flags:9 retries:0
mmci-s3c2410: request : sd mode
mmci-s3c2410: IRQ csta=0x00000a37 dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ transfer closed.
mmci-s3c2410: IRQ csta=0x00000237 dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
mmci-s3c2410: IRQ csta=0x00000237 dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
[CMD] request complete.
mmci-s3c2410: mrq->cmd->resp[0]: 0x00000120
mmci-s3c2410: mrq->cmd->resp[1]: 0x83000000
mmci-s3c2410: mrq->cmd->resp[2]: 0x00000000
mmci-s3c2410: mrq->cmd->resp[3]: 0x00000000
<7>mmci-s3c2410: request: [CMD] opcode:0x41 arg:0x00300000 flags:1 retries:0
mmci-s3c2410: request : sd mode
mmci-s3c2410: IRQ csta=0x00001a3f dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: COMMAND CRC FAILED 1a3f
mmci-s3c2410: IRQ transfer closed.
mmci-s3c2410: IRQ csta=0x0000023f dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
mmci-s3c2410: IRQ csta=0x0000023f dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
[CMD] request complete.
mmci-s3c2410: mrq->cmd->resp[0]: 0x00ff8000
mmci-s3c2410: mrq->cmd->resp[1]: 0xff000000
mmci-s3c2410: mrq->cmd->resp[2]: 0x00000000
mmci-s3c2410: mrq->cmd->resp[3]: 0x00000000
<7>mmci-s3c2410: request: [CMD] opcode:0x55 arg:0x00000000 flags:9 retries:0
mmci-s3c2410: request : sd mode
mmci-s3c2410: IRQ csta=0x00000a37 dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ transfer closed.
mmci-s3c2410: IRQ csta=0x00000237 dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
mmci-s3c2410: IRQ csta=0x00000237 dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
[CMD] request complete.
mmci-s3c2410: mrq->cmd->resp[0]: 0x00000120
mmci-s3c2410: mrq->cmd->resp[1]: 0x83000000
mmci-s3c2410: mrq->cmd->resp[2]: 0x00000000
mmci-s3c2410: mrq->cmd->resp[3]: 0x00000000
<7>mmci-s3c2410: request: [CMD] opcode:0x41 arg:0x00300000 flags:1 retries:0
mmci-s3c2410: request : sd mode
mmci-s3c2410: IRQ csta=0x00001a3f dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: COMMAND CRC FAILED 1a3f
mmci-s3c2410: IRQ transfer closed.
mmci-s3c2410: IRQ csta=0x0000023f dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
mmci-s3c2410: IRQ csta=0x0000023f dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
[CMD] request complete.
mmci-s3c2410: mrq->cmd->resp[0]: 0x00ff8000
mmci-s3c2410: mrq->cmd->resp[1]: 0xff000000
mmci-s3c2410: mrq->cmd->resp[2]: 0x00000000
mmci-s3c2410: mrq->cmd->resp[3]: 0x00000000
<7>mmci-s3c2410: request: [CMD] opcode:0x55 arg:0x00000000 flags:9 retries:0
mmci-s3c2410: request : sd mode
mmci-s3c2410: IRQ csta=0x00000a37 dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ transfer closed.
mmci-s3c2410: IRQ csta=0x00000237 dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
mmci-s3c2410: IRQ csta=0x00000237 dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
[CMD] request complete.
mmci-s3c2410: mrq->cmd->resp[0]: 0x00000120
mmci-s3c2410: mrq->cmd->resp[1]: 0x83000000
mmci-s3c2410: mrq->cmd->resp[2]: 0x00000000
mmci-s3c2410: mrq->cmd->resp[3]: 0x00000000
<7>mmci-s3c2410: request: [CMD] opcode:0x41 arg:0x00300000 flags:1 retries:0
mmci-s3c2410: request : sd mode
mmci-s3c2410: IRQ csta=0x00001a3f dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: COMMAND CRC FAILED 1a3f
mmci-s3c2410: IRQ transfer closed.
mmci-s3c2410: IRQ csta=0x0000023f dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
mmci-s3c2410: IRQ csta=0x0000023f dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
[CMD] request complete.
mmci-s3c2410: mrq->cmd->resp[0]: 0x00ff8000
mmci-s3c2410: mrq->cmd->resp[1]: 0xff000000
mmci-s3c2410: mrq->cmd->resp[2]: 0x00000000
mmci-s3c2410: mrq->cmd->resp[3]: 0x00000000
<7>mmci-s3c2410: request: [CMD] opcode:0x55 arg:0x00000000 flags:9 retries:0
mmci-s3c2410: request : sd mode
mmci-s3c2410: IRQ csta=0x00000a37 dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ transfer closed.
mmci-s3c2410: IRQ csta=0x00000237 dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
mmci-s3c2410: IRQ csta=0x00000237 dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
[CMD] request complete.
mmci-s3c2410: mrq->cmd->resp[0]: 0x00000120
mmci-s3c2410: mrq->cmd->resp[1]: 0x83000000
mmci-s3c2410: mrq->cmd->resp[2]: 0x00000000
mmci-s3c2410: mrq->cmd->resp[3]: 0x00000000
<7>mmci-s3c2410: request: [CMD] opcode:0x41 arg:0x00300000 flags:1 retries:0
mmci-s3c2410: request : sd mode
mmci-s3c2410: IRQ csta=0x00001a3f dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: COMMAND CRC FAILED 1a3f
mmci-s3c2410: IRQ transfer closed.
mmci-s3c2410: IRQ csta=0x0000023f dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
mmci-s3c2410: IRQ csta=0x0000023f dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
[CMD] request complete.
mmci-s3c2410: mrq->cmd->resp[0]: 0x80ff8000
mmci-s3c2410: mrq->cmd->resp[1]: 0xff000000
mmci-s3c2410: mrq->cmd->resp[2]: 0x00000000
mmci-s3c2410: mrq->cmd->resp[3]: 0x00000000
<7>mmci-s3c2410: request: [CMD] opcode:0x02 arg:0x00000000 flags:a retries:3
mmci-s3c2410: request : sd mode
mmci-s3c2410: IRQ csta=0x00001a3f dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: s3c2410 fixup : ignore CRC fail with long rsp
mmci-s3c2410: IRQ transfer closed.
mmci-s3c2410: IRQ csta=0x0000023f dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
mmci-s3c2410: IRQ csta=0x0000023f dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
[CMD] request complete.
mmci-s3c2410: mrq->cmd->resp[0]: 0x02544d53
mmci-s3c2410: mrq->cmd->resp[1]: 0x44303247
mmci-s3c2410: mrq->cmd->resp[2]: 0x28a225fc
mmci-s3c2410: mrq->cmd->resp[3]: 0x1a007487
<7>mmci-s3c2410: request: [CMD] opcode:0x03 arg:0x00000000 flags:9 retries:3
mmci-s3c2410: request : sd mode
mmci-s3c2410: IRQ csta=0x00000a03 dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ transfer closed.
mmci-s3c2410: IRQ csta=0x00000203 dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
mmci-s3c2410: IRQ csta=0x00000203 dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
[CMD] request complete.
mmci-s3c2410: mrq->cmd->resp[0]: 0x7f520520
mmci-s3c2410: mrq->cmd->resp[1]: 0x45303247
mmci-s3c2410: mrq->cmd->resp[2]: 0x28a225fc
mmci-s3c2410: mrq->cmd->resp[3]: 0x1a007487
mmc0: host does not support reading read-only switch. assuming write-enable.
<7>mmci-s3c2410: request: [CMD] opcode:0x02 arg:0x00000000 flags:a retries:3
mmci-s3c2410: request : sd mode
mmci-s3c2410: IRQ csta=0x00000c03 dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ transfer closed.
mmci-s3c2410: IRQ csta=0x00000c03 dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
mmci-s3c2410: IRQ csta=0x00000c03 dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
[CMD] request complete.
mmci-s3c2410: mrq->cmd->resp[0]: 0x7f520520
mmci-s3c2410: mrq->cmd->resp[1]: 0x45303247
mmci-s3c2410: mrq->cmd->resp[2]: 0x28a225fc
mmci-s3c2410: mrq->cmd->resp[3]: 0x1a007487
mmci-s3c2410: s3c2410sdi_set_ios
mmci-s3c2410: S3C2410_SDICON :00000001
mmci-s3c2410: S3C2410_SDICON :00000001
mmci-s3c2410: S3C2410_SDICON :000000ff
<7>mmci-s3c2410: request: [CMD] opcode:0x09 arg:0x7f520000 flags:a retries:3
mmci-s3c2410: request : sd mode
mmci-s3c2410: IRQ csta=0x00001a3f dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: s3c2410 fixup : ignore CRC fail with long rsp
mmci-s3c2410: IRQ transfer closed.
mmci-s3c2410: IRQ csta=0x0000023f dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
mmci-s3c2410: IRQ csta=0x0000023f dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
[CMD] request complete.
mmci-s3c2410: mrq->cmd->resp[0]: 0x002d0032
mmci-s3c2410: mrq->cmd->resp[1]: 0x5b5a83d5
mmci-s3c2410: mrq->cmd->resp[2]: 0xfefbff80
mmci-s3c2410: mrq->cmd->resp[3]: 0x168000cf
<7>mmci-s3c2410: request: [CMD] opcode:0x07 arg:0x7f520000 flags:9 retries:3
mmci-s3c2410: request : sd mode
mmci-s3c2410: IRQ csta=0x00000a07 dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ transfer closed.
mmci-s3c2410: IRQ csta=0x00000207 dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
mmci-s3c2410: IRQ csta=0x00000207 dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
[CMD] request complete.
mmci-s3c2410: mrq->cmd->resp[0]: 0x00000700
mmci-s3c2410: mrq->cmd->resp[1]: 0x755a83d5
mmci-s3c2410: mrq->cmd->resp[2]: 0xfefbff80
mmci-s3c2410: mrq->cmd->resp[3]: 0x168000cf
mmci-s3c2410: s3c2410sdi_set_ios
mmci-s3c2410: S3C2410_SDICON :00000001
mmci-s3c2410: S3C2410_SDICON :00000001
mmci-s3c2410: S3C2410_SDICON :000000ff
<7>mmci-s3c2410: request: [CMD] opcode:0x55 arg:0x7f520000 flags:9 retries:0
mmci-s3c2410: request : sd mode
mmci-s3c2410: IRQ csta=0x00000a37 dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ transfer closed.
mmci-s3c2410: IRQ csta=0x00000237 dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
mmci-s3c2410: IRQ csta=0x00000237 dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
[CMD] request complete.
mmci-s3c2410: mrq->cmd->resp[0]: 0x00000920
mmci-s3c2410: mrq->cmd->resp[1]: 0x335a83d5
mmci-s3c2410: mrq->cmd->resp[2]: 0xfefbff80
mmci-s3c2410: mrq->cmd->resp[3]: 0x168000cf
<7>mmci-s3c2410: request: [CMD] opcode:0x51 arg:0x00000000 flags:9 retries:0
mmci-s3c2410: request : sd mode
mmci-s3c2410: request: [DAT] bsize:8 blocks:1 bytes:8
mmci-s3c2410: dma_len: 0x00000001
mmci-s3c2410: IRQ csta=0x00000937 dsta=0x00000001 dcnt:0x00001000
mmci-s3c2410: DMAD csta=0x00000a33 dsta=0x00000010 dcnt:0x00000000 result:0x00000000
mmci-s3c2410: IRQ transfer closed.
mmci-s3c2410: IRQ csta=0x00000033 dsta=0x00000010 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
mmci-s3c2410: IRQ csta=0x00000033 dsta=0x00000010 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
[CMD] request complete.
[DAT] DMA complete.
mmci-s3c2410: mrq->cmd->resp[0]: 0x00000920
mmci-s3c2410: mrq->cmd->resp[1]: 0x915a83d5
mmci-s3c2410: mrq->cmd->resp[2]: 0xfefbff80
mmci-s3c2410: mrq->cmd->resp[3]: 0x168000cf
<7>mmci-s3c2410: request: [CMD] opcode:0x07 arg:0x00000000 flags:0 retries:0
mmci-s3c2410: request : sd mode
mmci-s3c2410: IRQ csta=0x00000833 dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ transfer closed.
mmci-s3c2410: IRQ csta=0x00000833 dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
mmci-s3c2410: IRQ csta=0x00000833 dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
[CMD] request complete.
mmci-s3c2410: mrq->cmd->resp[0]: 0x00000920
mmci-s3c2410: mrq->cmd->resp[1]: 0x915a83d5
mmci-s3c2410: mrq->cmd->resp[2]: 0xfefbff80
mmci-s3c2410: mrq->cmd->resp[3]: 0x168000cf
mmci-s3c2410: s3c2410sdi_set_ios
mmci-s3c2410: S3C2410_SDICON :00000001
mmci-s3c2410: S3C2410_SDICON :00000001
mmci-s3c2410: S3C2410_SDICON :00000008
<7>mmci-s3c2410: request: [CMD] opcode:0x07 arg:0x7f520000 flags:9 retries:3
mmci-s3c2410: request : sd mode
mmci-s3c2410: IRQ csta=0x00000a07 dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ transfer closed.
mmci-s3c2410: IRQ csta=0x00000207 dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
mmci-s3c2410: IRQ csta=0x00000207 dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
[CMD] request complete.
mmci-s3c2410: mrq->cmd->resp[0]: 0x00000700
mmci-s3c2410: mrq->cmd->resp[1]: 0x755a83d5
mmci-s3c2410: mrq->cmd->resp[2]: 0xfefbff80
mmci-s3c2410: mrq->cmd->resp[3]: 0x168000cf
<7>mmci-s3c2410: request: [CMD] opcode:0x55 arg:0x7f520000 flags:9 retries:0
mmci-s3c2410: request : sd mode
mmci-s3c2410: IRQ csta=0x00000a37 dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ transfer closed.
mmci-s3c2410: IRQ csta=0x00000237 dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
mmci-s3c2410: IRQ csta=0x00000237 dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
[CMD] request complete.
mmci-s3c2410: mrq->cmd->resp[0]: 0x00000920
mmci-s3c2410: mrq->cmd->resp[1]: 0x335a83d5
mmci-s3c2410: mrq->cmd->resp[2]: 0xfefbff80
mmci-s3c2410: mrq->cmd->resp[3]: 0x168000cf
<7>mmci-s3c2410: request: [CMD] opcode:0x06 arg:0x00000002 flags:9 retries:0
mmci-s3c2410: request : sd mode
mmci-s3c2410: IRQ csta=0x00000a06 dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ transfer closed.
mmci-s3c2410: IRQ csta=0x00000206 dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
mmci-s3c2410: IRQ csta=0x00000206 dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
[CMD] request complete.
mmci-s3c2410: mrq->cmd->resp[0]: 0x00000920
mmci-s3c2410: mrq->cmd->resp[1]: 0xb95a83d5
mmci-s3c2410: mrq->cmd->resp[2]: 0xfefbff80
mmci-s3c2410: mrq->cmd->resp[3]: 0x168000cf
mmci-s3c2410: s3c2410sdi_set_ios
mmci-s3c2410: S3C2410_SDICON :00000001
mmci-s3c2410: S3C2410_SDICON :00000001
mmci-s3c2410: S3C2410_SDICON :00000008
<7>mmci-s3c2410: request: [CMD] opcode:0x16 arg:0x00000400 flags:9 retries:5
mmci-s3c2410: request : sd mode
mmci-s3c2410: IRQ csta=0x00000a10 dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ transfer closed.
mmci-s3c2410: IRQ csta=0x00000210 dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
mmci-s3c2410: IRQ csta=0x00000210 dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
[CMD] request complete.
mmci-s3c2410: mrq->cmd->resp[0]: 0x20000900
mmci-s3c2410: mrq->cmd->resp[1]: 0xcb5a83d5
mmci-s3c2410: mrq->cmd->resp[2]: 0xfefbff80
mmci-s3c2410: mrq->cmd->resp[3]: 0x168000cf
mmcblk0: mmc0:7f52 SD02G 2011136KiB
/dev/mmc/blk0:<7>MMC: starting cmd 12 arg 00000000 flags 00000009
<7>mmci-s3c2410: request: [CMD] opcode:0x18 arg:0x00000000 flags:9 retries:0
mmci-s3c2410: request : sd mode
mmci-s3c2410: request: [DAT] bsize:1024 blocks:4 bytes:4096
mmci-s3c2410: dma_len: 0x00000001
mmci-s3c2410: IRQ csta=0x00000a12 dsta=0x00000001 dcnt:0x00004000
mmci-s3c2410: DMAD csta=0x00000a12 dsta=0x00000050 dcnt:0x00000000 result:0x00000000
mmci-s3c2410: IRQ transfer closed.
mmci-s3c2410: IRQ csta=0x00000012 dsta=0x00000050 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
mmci-s3c2410: IRQ csta=0x00000012 dsta=0x00000050 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
[CMD] request complete.
[DAT] DMA complete.
mmci-s3c2410: mrq->cmd->resp[0]: 0x00000900
mmci-s3c2410: mrq->cmd->resp[1]: 0xd35a83d5
mmci-s3c2410: mrq->cmd->resp[2]: 0xfefbff80
mmci-s3c2410: mrq->cmd->resp[3]: 0x168000cf
mmci-s3c2410: flushing DMA.
<7>mmci-s3c2410: request: [CMD] opcode:0x12 arg:0x00000000 flags:19 retries:3
mmci-s3c2410: request : sd mode
mmci-s3c2410: IRQ csta=0x00000a0c dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ transfer closed.
mmci-s3c2410: IRQ csta=0x0000020c dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
mmci-s3c2410: IRQ csta=0x0000020c dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
[CMD] request complete.
mmci-s3c2410: mrq->cmd->resp[0]: 0x00000b00
mmci-s3c2410: mrq->cmd->resp[1]: 0x7f5a83d5
mmci-s3c2410: mrq->cmd->resp[2]: 0xfefbff80
mmci-s3c2410: mrq->cmd->resp[3]: 0x168000cf
mmcblk0: error 2 transferring data
end_request: I/O error, dev mmcblk0, sector 0
Buffer I/O error on device mmcblk0, logical block 0

<7>mmci-s3c2410: request: [CMD] opcode:0x18 arg:0x00000000 flags:9 retries:0
mmci-s3c2410: request : sd mode
mmci-s3c2410: request: [DAT] bsize:1024 blocks:4 bytes:4096
mmci-s3c2410: dma_len: 0x00000001
mmci-s3c2410: IRQ csta=0x00000a12 dsta=0x00000001 dcnt:0x00004000
mmci-s3c2410: DMAD csta=0x00000a12 dsta=0x00000050 dcnt:0x00000000 result:0x00000000
mmci-s3c2410: IRQ transfer closed.
mmci-s3c2410: IRQ csta=0x00000012 dsta=0x00000050 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
mmci-s3c2410: IRQ csta=0x00000012 dsta=0x00000050 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
[CMD] request complete.
[DAT] DMA complete.
mmci-s3c2410: mrq->cmd->resp[0]: 0x00000900
mmci-s3c2410: mrq->cmd->resp[1]: 0xd35a83d5
mmci-s3c2410: mrq->cmd->resp[2]: 0xfefbff80
mmci-s3c2410: mrq->cmd->resp[3]: 0x168000cf
mmci-s3c2410: flushing DMA.
<7>mmci-s3c2410: request: [CMD] opcode:0x12 arg:0x00000000 flags:19 retries:3
mmci-s3c2410: request : sd mode
mmci-s3c2410: IRQ csta=0x00000a0c dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ transfer closed.
mmci-s3c2410: IRQ csta=0x0000020c dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
mmci-s3c2410: IRQ csta=0x0000020c dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
[CMD] request complete.
mmci-s3c2410: mrq->cmd->resp[0]: 0x00000b00
mmci-s3c2410: mrq->cmd->resp[1]: 0x7f5a83d5
mmci-s3c2410: mrq->cmd->resp[2]: 0xfefbff80
mmci-s3c2410: mrq->cmd->resp[3]: 0x168000cf
mmcblk0: error 2 transferring data
end_request: I/O error, dev mmcblk0, sector 0
Buffer I/O error on device mmcblk0, logical block 0
ldm_validate_partition_table(): Disk read failed.

<7>mmci-s3c2410: request: [CMD] opcode:0x18 arg:0x00000000 flags:9 retries:0
mmci-s3c2410: request : sd mode
mmci-s3c2410: request: [DAT] bsize:1024 blocks:4 bytes:4096
mmci-s3c2410: dma_len: 0x00000001
mmci-s3c2410: IRQ csta=0x00000912 dsta=0x00000001 dcnt:0x00004000
mmci-s3c2410: DMAD csta=0x00000a12 dsta=0x00000050 dcnt:0x00000000 result:0x00000000
mmci-s3c2410: IRQ transfer closed.
mmci-s3c2410: IRQ csta=0x00000012 dsta=0x00000050 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
mmci-s3c2410: IRQ csta=0x00000012 dsta=0x00000050 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
[CMD] request complete.
[DAT] DMA complete.
mmci-s3c2410: mrq->cmd->resp[0]: 0x00000900
mmci-s3c2410: mrq->cmd->resp[1]: 0xd35a83d5
mmci-s3c2410: mrq->cmd->resp[2]: 0xfefbff80
mmci-s3c2410: mrq->cmd->resp[3]: 0x168000cf
mmci-s3c2410: flushing DMA.
<7>mmci-s3c2410: request: [CMD] opcode:0x12 arg:0x00000000 flags:19 retries:3
mmci-s3c2410: request : sd mode
mmci-s3c2410: IRQ csta=0x00000a0c dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ transfer closed.
mmci-s3c2410: IRQ csta=0x0000020c dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
mmci-s3c2410: IRQ csta=0x0000020c dsta=0x00000000 dcnt:0x00000000
mmci-s3c2410: IRQ clear imask.
[CMD] request complete.
mmci-s3c2410: mrq->cmd->resp[0]: 0x00000b00
mmci-s3c2410: mrq->cmd->resp[1]: 0x7f5a83d5
mmci-s3c2410: mrq->cmd->resp[2]: 0xfefbff80
mmci-s3c2410: mrq->cmd->resp[3]: 0x168000cf
mmcblk0: error 2 transferring data
end_request: I/O error, dev mmcblk0, sector 0
Buffer I/O error on device mmcblk0, logical block 0
unable to read partition table


the words in red color are some more useful informatiion i think.
Can someone help me to fix it up?

regards!!

SharkCN 07-30-2008 09:46 PM

the driver in my Kernel is following:

/*
* linux/drivers/mmc/s3c2410mci.h - Samsung S3C2410 SDI Interface driver
*
* Copyright (C) 2004 Thomas Kleffel, 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
* published by the Free Software Foundation.
*/
#include <linux/config.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/init.h>
#include <linux/ioport.h>
#include <linux/device.h>
#include <linux/interrupt.h>
#include <linux/blkdev.h>
#include <linux/delay.h>
#include <linux/err.h>
#include <linux/dma-mapping.h>
#include <linux/mmc/host.h>
#include <linux/mmc/protocol.h>
//#include <linux/clk.h>

#include <asm/dma.h>
#include <asm/dma-mapping.h>
#include <asm/arch/dma.h>

#include <asm/io.h>
#include <asm/irq.h>
#include <asm/hardware/clock.h>
#include <asm/mach/mmc.h>

#include <asm/arch/regs-sdi.h>
#include <asm/arch/regs-gpio.h>
#include <asm/arch/mmc.h>
#include <asm/arch/regs-clock.h>

//#define S3C2410SDI_DMA_BACKBUF

#ifdef CONFIG_MMC_DEBUG
#define DBG(x...) printk(KERN_INFO x)
#else
#define DBG(x...) do { } while (0)
#endif

#include "s3c2410mci.h"

#define DRIVER_NAME "mmci-s3c2410"
#define PFX DRIVER_NAME ": "

#define RESSIZE(ressource) (((ressource)->end - (ressource)->start)+1)


static struct s3c2410_dma_client s3c2410sdi_dma_client = {
.name = "s3c2410-sdi",
};



/*
* ISR for SDI Interface IRQ
* Communication between driver and ISR works as follows:
* host->mrq points to current request
* host->complete_what tells the ISR when the request is considered done
* COMPLETION_CMDSENT when the command was sent
* COMPLETION_RSPFIN when a response was received
* COMPLETION_XFERFINISH when the data transfer is finished
* COMPLETION_XFERFINISH_RSPFIN both of the above.
* host->complete_request is the completion-object the driver waits for
*
* 1) Driver sets up host->mrq and host->complete_what
* 2) Driver prepares the transfer
* 3) Driver enables interrupts
* 4) Driver starts transfer
* 5) Driver waits for host->complete_rquest
* 6) ISR checks for request status (errors and success)
* 6) ISR sets host->mrq->cmd->error and host->mrq->data->error
* 7) ISR completes host->complete_request
* 8) ISR disables interrupts
* 9) Driver wakes up and takes care of the request
*/

static irqreturn_t s3c2410sdi_irq(int irq, void *dev_id, struct pt_regs *regs)
{
struct s3c2410sdi_host *host;
u32 sdi_csta, sdi_dsta, sdi_dcnt;
u32 sdi_cclear, sdi_dclear;
unsigned long iflags;

host = (struct s3c2410sdi_host *)dev_id;

//Check for things not supposed to happen
if(!host) return IRQ_HANDLED;

sdi_csta = readl(host->base + S3C2410_SDICMDSTAT);
sdi_dsta = readl(host->base + S3C2410_SDIDSTA);
sdi_dcnt = readl(host->base + S3C2410_SDIDCNT);

DBG(PFX "IRQ csta=0x%08x dsta=0x%08x dcnt:0x%08x\n", sdi_csta, sdi_dsta, sdi_dcnt);

spin_lock_irqsave( &host->complete_lock, iflags);

if( host->complete_what==COMPLETION_NONE ) {
goto clear_imask;
}

if(!host->mrq) {
goto clear_imask;
}


sdi_csta = readl(host->base + S3C2410_SDICMDSTAT);
sdi_dsta = readl(host->base + S3C2410_SDIDSTA);
sdi_dcnt = readl(host->base + S3C2410_SDIDCNT);
sdi_cclear = 0;
sdi_dclear = 0;


if(sdi_csta & S3C2410_SDICMDSTAT_CMDTIMEOUT) {
host->mrq->cmd->error = MMC_ERR_TIMEOUT;
goto transfer_closed;
}

if(sdi_csta & S3C2410_SDICMDSTAT_CMDSENT) {
if(host->complete_what == COMPLETION_CMDSENT) {
host->mrq->cmd->error = MMC_ERR_NONE;
goto transfer_closed;
}

sdi_cclear |= S3C2410_SDICMDSTAT_CMDSENT;
}



if(sdi_csta & S3C2410_SDICMDSTAT_CRCFAIL) {
if (host->mrq->cmd->flags & MMC_RSP_LONG) {
DBG(PFX "s3c2410 fixup : ignore CRC fail with long rsp\n");
}
else {
DBG(PFX "COMMAND CRC FAILED %x\n", sdi_csta);
if(host->mrq->cmd->flags & MMC_RSP_CRC) {
host->mrq->cmd->error = MMC_ERR_BADCRC;
goto transfer_closed;
}
}
sdi_cclear |= S3C2410_SDICMDSTAT_CRCFAIL;
}

if(sdi_csta & S3C2410_SDICMDSTAT_RSPFIN) {
if(host->complete_what == COMPLETION_RSPFIN) {
host->mrq->cmd->error = MMC_ERR_NONE;
goto transfer_closed;
}

if(host->complete_what == COMPLETION_XFERFINISH_RSPFIN) {
host->mrq->cmd->error = MMC_ERR_NONE;
host->complete_what = COMPLETION_XFERFINISH;
}

sdi_cclear |= S3C2410_SDICMDSTAT_RSPFIN;
}

if(sdi_dsta & S3C2410_SDIDSTA_FIFOFAIL) {
host->mrq->cmd->error = MMC_ERR_NONE;
host->mrq->data->error = MMC_ERR_FIFO;
goto transfer_closed;
}

if(sdi_dsta & S3C2410_SDIDSTA_RXCRCFAIL) {
host->mrq->cmd->error = MMC_ERR_NONE;
host->mrq->data->error = MMC_ERR_BADCRC;
goto transfer_closed;
}

if(sdi_dsta & S3C2410_SDIDSTA_CRCFAIL) {
host->mrq->cmd->error = MMC_ERR_NONE;
host->mrq->data->error = MMC_ERR_BADCRC;
goto transfer_closed;
}

if(sdi_dsta & S3C2410_SDIDSTA_DATATIMEOUT) {
host->mrq->cmd->error = MMC_ERR_NONE;
host->mrq->data->error = MMC_ERR_TIMEOUT;
goto transfer_closed;
}

if(sdi_dsta & S3C2410_SDIDSTA_XFERFINISH) {
if(host->complete_what == COMPLETION_XFERFINISH) {
host->mrq->cmd->error = MMC_ERR_NONE;
host->mrq->data->error = MMC_ERR_NONE;
goto transfer_closed;
}

if(host->complete_what == COMPLETION_XFERFINISH_RSPFIN) {
host->mrq->data->error = MMC_ERR_NONE;
host->complete_what = COMPLETION_RSPFIN;
}

sdi_dclear |= S3C2410_SDIDSTA_XFERFINISH;
}

writel(sdi_cclear, host->base + S3C2410_SDICMDSTAT);
writel(sdi_dclear, host->base + S3C2410_SDIDSTA);

spin_unlock_irqrestore( &host->complete_lock, iflags);
DBG(PFX "IRQ still waiting.\n");
return IRQ_HANDLED;


transfer_closed:
writel(sdi_cclear, host->base + S3C2410_SDICMDSTAT);
writel(sdi_dclear, host->base + S3C2410_SDIDSTA);
host->complete_what = COMPLETION_NONE;
complete(&host->complete_request);
writel(0, host->base + S3C2410_SDIIMSK);
spin_unlock_irqrestore( &host->complete_lock, iflags);
DBG(PFX "IRQ transfer closed.\n");
return IRQ_HANDLED;

clear_imask:
writel(0, host->base + S3C2410_SDIIMSK);
spin_unlock_irqrestore( &host->complete_lock, iflags);
DBG(PFX "IRQ clear imask.\n");
return IRQ_HANDLED;

}


/*
* ISR for the CardDetect Pin
*/

static irqreturn_t s3c2410sdi_irq_cd(int irq, void *dev_id, struct pt_regs *regs)
{
struct s3c2410sdi_host *host = (struct s3c2410sdi_host *)dev_id;
//printk("s3c2410sdi_irq_cd\n");
mmc_detect_change(host->mmc, S3C2410SDI_CDLATENCY);


return IRQ_HANDLED;
}



void s3c2410sdi_dma_done_callback(s3c2410_dma_chan_t *dma_ch, void *buf_id,
int size, s3c2410_dma_buffresult_t result)
{ unsigned long iflags;
u32 sdi_csta, sdi_dsta,sdi_dcnt;
struct s3c2410sdi_host *host = (struct s3c2410sdi_host *)buf_id;

sdi_csta = readl(host->base + S3C2410_SDICMDSTAT);
sdi_dsta = readl(host->base + S3C2410_SDIDSTA);
sdi_dcnt = readl(host->base + S3C2410_SDIDCNT);

DBG(PFX "DMAD csta=0x%08x dsta=0x%08x dcnt:0x%08x result:0x%08x\n", sdi_csta, sdi_dsta, sdi_dcnt, result);

spin_lock_irqsave( &host->complete_lock, iflags);

if(!host->mrq) goto out;
if(!host->mrq->data) goto out;


sdi_csta = readl(host->base + S3C2410_SDICMDSTAT);
sdi_dsta = readl(host->base + S3C2410_SDIDSTA);
sdi_dcnt = readl(host->base + S3C2410_SDIDCNT);

if( result!=S3C2410_RES_OK ) {
goto fail_request;
}


if(host->mrq->data->flags & MMC_DATA_READ) {
if( sdi_dcnt>0 ) {
goto fail_request;
}
}

out:
complete(&host->complete_dma);
spin_unlock_irqrestore( &host->complete_lock, iflags);
return;


fail_request:
host->mrq->data->error = MMC_ERR_FAILED;
host->complete_what = COMPLETION_NONE;
complete(&host->complete_request);
writel(0, host->base + S3C2410_SDIIMSK);
goto out;

}


void s3c2410sdi_dma_setup(struct s3c2410sdi_host *host, s3c2410_dmasrc_t source) {

s3c2410_dma_devconfig(host->dma, source, 3, host->mem->start + S3C2410_SDIDATA);
s3c2410_dma_config(host->dma, 4, (1<<23) | (2<<24));
s3c2410_dma_set_buffdone_fn(host->dma, s3c2410sdi_dma_done_callback);
s3c2410_dma_setflags(host->dma, S3C2410_DMAF_AUTOSTART);
}

static void s3c2410sdi_request(struct mmc_host *mmc, struct mmc_request *mrq) {
struct s3c2410sdi_host *host = mmc_priv(mmc);
struct device *dev = mmc_dev(host->mmc);
struct platform_device *pdev = to_platform_device(dev);
u32 sdi_carg, sdi_ccon, sdi_timer;
u32 sdi_bsize, sdi_dcon, sdi_imsk;
int dma_len = 0;
//u32 sdi_con;

DBG(KERN_DEBUG PFX "request: [CMD] opcode:0x%02d arg:0x%08x flags:%x retries:%u\n",
mrq->cmd->opcode, mrq->cmd->arg, mrq->cmd->flags, mrq->cmd->retries);

DBG(PFX "request : %s mode\n",mmc->mode == MMC_MODE_MMC ? "mmc" : "sd");

sdi_ccon = mrq->cmd->opcode & S3C2410_SDICMDCON_INDEX;
sdi_ccon|= S3C2410_SDICMDCON_SENDERHOST;
sdi_ccon|= S3C2410_SDICMDCON_CMDSTART;

sdi_carg = mrq->cmd->arg;

//FIXME: Timer value ?!
sdi_timer= 0xF000;

sdi_bsize= 0;
sdi_dcon = 0;
sdi_imsk = 0;

//enable interrupts for transmission errors
sdi_imsk |= S3C2410_SDIIMSK_RESPONSEND;
sdi_imsk |= S3C2410_SDIIMSK_CRCSTATUS;


host->complete_what = COMPLETION_CMDSENT;

if (mrq->cmd->flags & MMC_RSP_MASK) {
host->complete_what = COMPLETION_RSPFIN;

sdi_ccon |= S3C2410_SDICMDCON_WAITRSP;
sdi_imsk |= S3C2410_SDIIMSK_CMDTIMEOUT;

} else {
//We need the CMDSENT-Interrupt only if we want are not waiting
//for a response
sdi_imsk |= S3C2410_SDIIMSK_CMDSENT;
}

if(mrq->cmd->flags & MMC_RSP_LONG) {
sdi_ccon|= S3C2410_SDICMDCON_LONGRSP;
}

if(mrq->cmd->flags & MMC_RSP_CRC) {
sdi_imsk |= S3C2410_SDIIMSK_RESPONSECRC;
}


if (mrq->data) {
host->complete_what = COMPLETION_XFERFINISH_RSPFIN;



sdi_bsize = (1 << mrq->data->blksz_bits);
//fifo reset
//sdi_con = readl(host->base + S3C2410_SDICON);
//sdi_con|= S3C2410_SDICON_FIFORESET;
//writel(sdi_con, host->base + S3C2410_SDICON);

sdi_dcon = (mrq->data->blocks & S3C2410_SDIDCON_BLKNUM_MASK);
sdi_dcon |= S3C2410_SDIDCON_DMAEN;

sdi_imsk |= S3C2410_SDIIMSK_FIFOFAIL;
sdi_imsk |= S3C2410_SDIIMSK_DATACRC;
sdi_imsk |= S3C2410_SDIIMSK_DATATIMEOUT;
sdi_imsk |= S3C2410_SDIIMSK_DATAFINISH;
sdi_imsk |= 0xFFFFFFE0;

DBG(PFX "request: [DAT] bsize:%u blocks:%u bytes:%u\n",
sdi_bsize, mrq->data->blocks, mrq->data->blocks * sdi_bsize);

if (host->bus_width == MMC_BUS_WIDTH_4) {
sdi_dcon |= S3C2410_SDIDCON_WIDEBUS;
}

if(!(mrq->data->flags & MMC_DATA_STREAM)) {
sdi_dcon |= S3C2410_SDIDCON_BLOCKMODE;
}

if(mrq->data->flags & MMC_DATA_WRITE) {
sdi_dcon |= S3C2410_SDIDCON_TXAFTERRESP;
sdi_dcon |= S3C2410_SDIDCON_XFER_TXSTART;
}

if(mrq->data->flags & MMC_DATA_READ) {
sdi_dcon |= S3C2410_SDIDCON_RXAFTERCMD;
sdi_dcon |= S3C2410_SDIDCON_XFER_RXSTART;
}

s3c2410sdi_dma_setup(host, mrq->data->flags & MMC_DATA_WRITE ? S3C2410_DMASRC_MEM : S3C2410_DMASRC_HW);

/* see DMA-API.txt */
dma_len = dma_map_sg(&pdev->dev, mrq->data->sg, \
mrq->data->sg_len, \
mrq->data->flags & MMC_DATA_READ ? DMA_FROM_DEVICE : DMA_TO_DEVICE);
DBG(PFX "dma_len: 0x%08x\n",dma_len);

/* start DMA */
s3c2410_dma_enqueue(host->dma, (void *) host,
sg_dma_address(&mrq->data->sg[0]),
(mrq->data->blocks << mrq->data->blksz_bits) );

}

host->mrq = mrq;

init_completion(&host->complete_request);
init_completion(&host->complete_dma);

//Clear command and data status registers
writel(0xFFFFFFFF, host->base + S3C2410_SDICMDSTAT);
writel(0xFFFFFFFF, host->base + S3C2410_SDIDSTA);

// Setup SDI controller
writel(sdi_bsize,host->base + S3C2410_SDIBSIZE);
writel(sdi_timer,host->base + S3C2410_SDITIMER);
writel(sdi_imsk,host->base + S3C2410_SDIIMSK);

// Setup SDI command argument and data control
writel(sdi_carg, host->base + S3C2410_SDICMDARG);
writel(sdi_dcon, host->base + S3C2410_SDIDCON);

// This initiates transfer
writel(sdi_ccon, host->base + S3C2410_SDICMDCON);

// Wait for transfer to complete

wait_for_completion(&host->complete_request);
DBG("[CMD] request complete.\n");
if(mrq->data) {
wait_for_completion(&host->complete_dma);
DBG("[DAT] DMA complete.\n");
}


//Cleanup controller
writel(0, host->base + S3C2410_SDICMDARG);
writel(0, host->base + S3C2410_SDIDCON);
writel(0, host->base + S3C2410_SDICMDCON);
writel(0, host->base + S3C2410_SDIIMSK);

// Read response
mrq->cmd->resp[0] = readl(host->base + S3C2410_SDIRSP0);
mrq->cmd->resp[1] = readl(host->base + S3C2410_SDIRSP1);
mrq->cmd->resp[2] = readl(host->base + S3C2410_SDIRSP2);
mrq->cmd->resp[3] = readl(host->base + S3C2410_SDIRSP3);

host->mrq = NULL;
DBG(PFX "mrq->cmd->resp[0]: 0x%08x\n",mrq->cmd->resp[0]);
DBG(PFX "mrq->cmd->resp[1]: 0x%08x\n",mrq->cmd->resp[1]);
DBG(PFX "mrq->cmd->resp[2]: 0x%08x\n",mrq->cmd->resp[2]);
DBG(PFX "mrq->cmd->resp[3]: 0x%08x\n",mrq->cmd->resp[3]);
// If we have no data transfer we are finished here
if (!mrq->data) goto request_done;

// Calulate the amout of bytes transfer, but only if there was
// no error

dma_unmap_sg(&pdev->dev,mrq->data->sg,dma_len,\
mrq->data->flags & MMC_DATA_READ ? DMA_FROM_DEVICE : DMA_TO_DEVICE);

if(mrq->data->error == MMC_ERR_NONE) {
mrq->data->bytes_xfered = (mrq->data->blocks << mrq->data->blksz_bits);
if(mrq->data->flags & MMC_DATA_READ);
} else {
mrq->data->bytes_xfered = 0;
}

// If we had an error while transfering data we flush the
// DMA channel to clear out any garbage
if(mrq->data->error != MMC_ERR_NONE) {
s3c2410_dma_ctrl(host->dma, S3C2410_DMAOP_FLUSH);
DBG(PFX "flushing DMA.\n");
}
// Issue stop command
if(mrq->data->stop) mmc_wait_for_cmd(mmc, mrq->data->stop, 3);


request_done:

mrq->done(mrq);
}

static void s3c2410sdi_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) {
struct s3c2410sdi_host *host = mmc_priv(mmc);
u32 sdi_psc, sdi_con;

//Set power
sdi_con = readl(host->base + S3C2410_SDICON);
DBG(PFX "s3c2410sdi_set_ios\n");
DBG(PFX "S3C2410_SDICON :%08x\n",sdi_con);

switch(ios->power_mode) {
case MMC_POWER_ON:
case MMC_POWER_UP:
//s3c2410_gpio_setpin(S3C2410_GPA17, 1); // card power on

s3c2410_gpio_cfgpin(S3C2410_GPE5, S3C2410_GPE5_SDCLK);
s3c2410_gpio_cfgpin(S3C2410_GPE6, S3C2410_GPE6_SDCMD);
s3c2410_gpio_cfgpin(S3C2410_GPE7, S3C2410_GPE7_SDDAT0);
s3c2410_gpio_cfgpin(S3C2410_GPE8, S3C2410_GPE8_SDDAT1);
s3c2410_gpio_cfgpin(S3C2410_GPE9, S3C2410_GPE9_SDDAT2);
s3c2410_gpio_cfgpin(S3C2410_GPE10, S3C2410_GPE10_SDDAT3);
if (host->pdata->set_power)
(host->pdata->set_power)(1);


sdi_con|= S3C2410_SDICON_FIFORESET;
break;

case MMC_POWER_OFF:
default:
if (host->pdata->set_power)
(host->pdata->set_power)(0);
break;
}

//Set clock
for(sdi_psc=0;sdi_psc<255;sdi_psc++) {
if( (clk_get_rate(host->clk) / (2*(sdi_psc+1))) <= ios->clock) break;
}

if(sdi_psc > 255) sdi_psc = 255;
//sdi_psc =1;
writel(sdi_psc, host->base + S3C2410_SDIPRE);

//Set CLOCK_ENABLE
if(ios->clock) sdi_con |= S3C2410_SDICON_CLOCKTYPE;
else sdi_con &=~S3C2410_SDICON_CLOCKTYPE;

writel(sdi_con, host->base + S3C2410_SDICON);
DBG(PFX "S3C2410_SDICON :%08x\n",readl(host->base + S3C2410_SDICON));
DBG(PFX "S3C2410_SDICON :%08x\n",readl(host->base + S3C2410_SDIPRE));

host->bus_width = ios->bus_width;

}

static struct mmc_host_ops s3c2410sdi_ops = {
.request = s3c2410sdi_request,
.set_ios = s3c2410sdi_set_ios,
};

static void s3c2410_mmc_def_setpower(unsigned int to)
{
//s3c2410_gpio_cfgpin(S3C2410_GPA17, S3C2410_GPA17_OUT);
//s3c2410_gpio_setpin(S3C2410_GPA17, to);
}

static struct s3c24xx_mmc_platdata s3c2410_mmc_defplat = {
.gpio_detect = S3C2410_GPG10,
.set_power = s3c2410_mmc_def_setpower,
.f_max = 3000000,
.ocr_avail = MMC_VDD_32_33,
};


static int s3c2410sdi_probe(struct device *dev)
{
struct platform_device *pdev = to_platform_device(dev);
struct mmc_host *mmc;
s3c24xx_mmc_pdata_t *pdata;

struct s3c2410sdi_host *host;

int ret;

mmc = mmc_alloc_host(sizeof(struct s3c2410sdi_host), dev);
if (!mmc) {
ret = -ENOMEM;
goto probe_out;
}

host = mmc_priv(mmc);

spin_lock_init( &host->complete_lock );
host->complete_what = COMPLETION_NONE;
host->mmc = mmc;
host->dma = S3C2410SDI_DMA;

pdata = dev->platform_data;
if (!pdata) {
dev->platform_data = &s3c2410_mmc_defplat;
pdata = &s3c2410_mmc_defplat;
}

host->pdata = pdata;
host->irq_cd = s3c2410_gpio_getirq(pdata->gpio_detect);
printk("host->irq_cd=%d\n",host->irq_cd);
s3c2410_gpio_cfgpin(pdata->gpio_detect, S3C2410_GPG10_EINT18);

host->mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!host->mem) {
printk(KERN_INFO PFX "failed to get io memory region resouce.\n");
ret = -ENOENT;
goto probe_free_host;
}

host->mem = request_mem_region(host->mem->start,
RESSIZE(host->mem), pdev->name);

if (!host->mem) {
printk(KERN_INFO PFX "failed to request io memory region.\n");
ret = -ENOENT;
goto probe_free_host;
}

host->base = ioremap(host->mem->start, RESSIZE(host->mem));
if (host->base == 0) {
printk(KERN_INFO PFX "failed to ioremap() io memory region.\n");
ret = -EINVAL;
goto probe_free_mem_region;
}

host->irq = platform_get_irq(pdev, 0);
if (host->irq == 0) {
printk(KERN_INFO PFX "failed to get interrupt resouce.\n");
ret = -EINVAL;
goto probe_iounmap;
}

if(request_irq(host->irq, s3c2410sdi_irq, 0, DRIVER_NAME, host)) {
printk(KERN_INFO PFX "failed to request sdi interrupt.\n");
ret = -ENOENT;
goto probe_iounmap;
}


//s3c2410_gpio_cfgpin(S3C2410_GPG10, S3C2410_GPG10_EINT18); //GPG10 for sd detect;
set_irq_type(host->irq_cd, IRQT_BOTHEDGE);

if(request_irq(host->irq_cd, s3c2410sdi_irq_cd, 0, DRIVER_NAME, host)) {
printk(KERN_WARNING PFX "failed to request card detect interrupt.\n" );
ret = -ENOENT;
goto probe_free_irq;
}
if(s3c2410_dma_request(S3C2410SDI_DMA, &s3c2410sdi_dma_client, NULL)) {
printk(KERN_WARNING PFX "unable to get DMA channel.\n" );
ret = -EBUSY;
goto probe_free_irq_cd;
}

host->clk = clk_get(dev, "sdi");
if (IS_ERR(host->clk)) {
printk(KERN_INFO PFX "failed to find clock source.\n");
ret = PTR_ERR(host->clk);
host->clk = NULL;
goto probe_free_host;
}

if((ret = clk_use(host->clk))) {
printk(KERN_INFO PFX "failed to use clock source.\n");
goto clk_unuse;
}

if((ret = clk_enable(host->clk))) {
printk(KERN_INFO PFX "failed to enable clock source.\n");
goto clk_free;
}


mmc->ops = &s3c2410sdi_ops;
mmc->ocr_avail = MMC_VDD_32_33;
mmc->f_min = clk_get_rate(host->clk) / 512;
mmc->f_max = clk_get_rate(host->clk) / 2;
mmc->caps = MMC_CAP_4_BIT_DATA;

//HACK: There seems to be a hardware bug in TomTom GO.
if(mmc->f_max>3000000) mmc->f_max=3000000;


/*
* 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;


printk(KERN_INFO PFX "probe: mapped sdi_base=%p irq=%u irq_cd=%u dma=%u.\n",
host->base, host->irq, host->irq_cd, host->dma);

// if (host->pdata && host->pdata->init)
// host->pdata->init(dev, s3c2410sdi_irq_cd, mmc);

if((ret = mmc_add_host(mmc))) {
printk(KERN_INFO PFX "failed to add mmc host.\n");
goto clk_disable;
}

dev_set_drvdata(dev, mmc);

printk(KERN_INFO PFX "initialisation done.\n");
return 0;



clk_disable:
clk_disable(host->clk);

clk_unuse:
clk_unuse(host->clk);

clk_free:
clk_put(host->clk);

probe_free_irq_cd:
free_irq(host->irq_cd, host);

probe_free_irq:
free_irq(host->irq, host);

probe_iounmap:
iounmap(host->base);

probe_free_mem_region:
release_mem_region(host->mem->start, RESSIZE(host->mem));

probe_free_host:
mmc_free_host(mmc);
probe_out:
return ret;
}

static int s3c2410sdi_remove(struct device *dev)
{
struct mmc_host *mmc = dev_get_drvdata(dev);
struct s3c2410sdi_host *host = mmc_priv(mmc);

mmc_remove_host(mmc);
clk_disable(host->clk);
clk_unuse(host->clk);
clk_put(host->clk);
free_irq(host->irq_cd, host);
free_irq(host->irq, host);
iounmap(host->base);
release_mem_region(host->mem->start, RESSIZE(host->mem));
mmc_free_host(mmc);

return 0;
}

static struct device_driver s3c2410sdi_driver =
{
.name = "s3c2410-sdi",
.bus = &platform_bus_type,
.probe = s3c2410sdi_probe,
.remove = s3c2410sdi_remove,
};

static int __init s3c2410sdi_init(void)
{
return driver_register(&s3c2410sdi_driver);
}

static void __exit s3c2410sdi_exit(void)
{
driver_unregister(&s3c2410sdi_driver);
}

module_init(s3c2410sdi_init);
module_exit(s3c2410sdi_exit);

MODULE_DESCRIPTION("Samsung S3C2410 Multimedia Card Interface driver");
MODULE_LICENSE("GPL");


All times are GMT -5. The time now is 07:26 AM.