sdmmc cleanup in preparation for merge

This commit is contained in:
bushing 2009-05-05 20:43:34 -07:00
parent 46f8c41f71
commit 81cef8b120

63
sdmmc.c
View File

@ -32,7 +32,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#include "utils.h" #include "utils.h"
#include "memory.h" #include "memory.h"
//#define SDMMC_DEBUG 1 #define SDMMC_DEBUG 1
#ifdef SDMMC_DEBUG #ifdef SDMMC_DEBUG
static int sdmmcdebug = 0; static int sdmmcdebug = 0;
@ -44,20 +44,25 @@ static int sdmmcdebug = 0;
struct sdmmc_card { struct sdmmc_card {
struct sdmmc_chip_functions *functions; struct sdmmc_chip_functions *functions;
sdmmc_chipset_handle_t handle; sdmmc_chipset_handle_t handle;
char name[255]; char name[30];
int no; int no;
int inserted; int inserted;
int sdhc_blockmode; int sdhc_blockmode;
int selected; int selected;
int new_card; // set to 1 everytime a new card is inserted int new_card; // set to 1 everytime a new card is inserted
u32 timeout;
int num_sectors; u32 num_sectors;
u32 cid; u32 cid;
u16 rca; u16 rca;
}; };
#ifdef LOADER
static struct sdmmc_card cards[SDHC_MAX_HOSTS];
#else
static struct sdmmc_card cards[SDHC_MAX_HOSTS] MEM2_BSS; static struct sdmmc_card cards[SDHC_MAX_HOSTS] MEM2_BSS;
#endif
static int n_cards = 0; static int n_cards = 0;
static inline int sdmmc_host_reset(struct sdmmc_card *card) static inline int sdmmc_host_reset(struct sdmmc_card *card)
@ -125,6 +130,17 @@ struct device *sdmmc_attach(struct sdmmc_chip_functions *functions,
return (struct device *)(n_cards-1); return (struct device *)(n_cards-1);
} }
void sdmmc_abort(void) {
struct sdmmc_command cmd;
gecko_printf("abortion kthx\n");
memset(&cmd, 0, sizeof(cmd));
cmd.c_opcode = MMC_STOP_TRANSMISSION;
cmd.c_arg = 0;
cmd.c_flags = SCF_RSP_R1B;
sdmmc_host_exec_command(&cards[0], &cmd);
}
void sdmmc_needs_discover(struct device *dev) void sdmmc_needs_discover(struct device *dev)
{ {
int no = (int)dev; int no = (int)dev;
@ -221,6 +237,7 @@ void sdmmc_needs_discover(struct device *dev)
c->sdhc_blockmode = 0; c->sdhc_blockmode = 0;
DPRINTF(2, ("sdmmc: SDHC: %d\n", c->sdhc_blockmode)); DPRINTF(2, ("sdmmc: SDHC: %d\n", c->sdhc_blockmode));
u8 *resp;
DPRINTF(2, ("sdmmc: MMC_ALL_SEND_CID\n")); DPRINTF(2, ("sdmmc: MMC_ALL_SEND_CID\n"));
memset(&cmd, 0, sizeof(cmd)); memset(&cmd, 0, sizeof(cmd));
cmd.c_opcode = MMC_ALL_SEND_CID; cmd.c_opcode = MMC_ALL_SEND_CID;
@ -234,6 +251,10 @@ void sdmmc_needs_discover(struct device *dev)
} }
c->cid = MMC_R1(cmd.c_resp); c->cid = MMC_R1(cmd.c_resp);
resp = (u8 *)cmd.c_resp;
gecko_printf("CID: mid=%02x name='%c%c%c%c%c%c%c' prv=%d.%d psn=%02x%02x%02x%02x mdt=%d/%d\n", resp[14],
resp[13],resp[12],resp[11],resp[10],resp[9],resp[8],resp[7], resp[6], resp[5] >> 4, resp[5] & 0xf,
resp[4], resp[3], resp[2], resp[0] & 0xf, 2000 + (resp[0] >> 4));
DPRINTF(2, ("sdmmc: SD_SEND_RELATIVE_ADDRESS\n")); DPRINTF(2, ("sdmmc: SD_SEND_RELATIVE_ADDRESS\n"));
memset(&cmd, 0, sizeof(cmd)); memset(&cmd, 0, sizeof(cmd));
@ -253,7 +274,6 @@ void sdmmc_needs_discover(struct device *dev)
c->selected = 0; c->selected = 0;
c->inserted = 1; c->inserted = 1;
u8 *resp;
memset(&cmd, 0, sizeof(cmd)); memset(&cmd, 0, sizeof(cmd));
cmd.c_opcode = MMC_SEND_CSD; cmd.c_opcode = MMC_SEND_CSD;
cmd.c_arg = ((u32)c->rca)<<16; cmd.c_arg = ((u32)c->rca)<<16;
@ -261,16 +281,21 @@ void sdmmc_needs_discover(struct device *dev)
sdmmc_host_exec_command(c, &cmd); sdmmc_host_exec_command(c, &cmd);
if (cmd.c_error) { if (cmd.c_error) {
gecko_printf("sdmmc: MMC_SEND_CSD failed for " gecko_printf("sdmmc: MMC_SEND_CSD failed for "
"card %d with %d", no, cmd.c_error); "card %d with %d\n", no, cmd.c_error);
goto out_power; goto out_power;
} }
resp = (u8 *)cmd.c_resp; resp = (u8 *)cmd.c_resp;
int i;
gecko_printf("csd: ");
for(i=15; i>=0; i--) gecko_printf("%02x ", (u32) resp[i]);
gecko_printf("\n");
if (resp[13] == 0xe) { // sdhc if (resp[13] == 0xe) { // sdhc
unsigned int c_size = resp[7] << 16 | resp[6] << 8 | resp[5]; unsigned int c_size = resp[7] << 16 | resp[6] << 8 | resp[5];
// sdhc_error(sdhci->reg_base, "sdhc mode, c_size=%u, card size = %uk", c_size, (c_size + 1)* 512); gecko_printf("sdmmc: sdhc mode, c_size=%u, card size = %uk\n", c_size, (c_size + 1)* 512);
// sdhci->timeout = 250 * 1000000; // spec says read timeout is 100ms and write/erase timeout is 250ms c->timeout = 250 * 1000000; // spec says read timeout is 100ms and write/erase timeout is 250ms
c->num_sectors = (c_size + 1) * 1024; // number of 512-byte sectors c->num_sectors = (c_size + 1) * 1024; // number of 512-byte sectors
} }
else { else {
@ -284,16 +309,15 @@ void sdmmc_needs_discover(struct device *dev)
c_size |= (resp[6] >> 6); c_size |= (resp[6] >> 6);
c_size_mult = (resp[5] & 3) << 1; c_size_mult = (resp[5] & 3) << 1;
c_size_mult |= resp[4] >> 7; c_size_mult |= resp[4] >> 7;
// sdhc_error(sdhci->reg_base, "taac=%u nsac=%u read_bl_len=%u c_size=%u c_size_mult=%u card size=%u bytes", gecko_printf("taac=%u nsac=%u read_bl_len=%u c_size=%u c_size_mult=%u card size=%u bytes\n",
// taac, nsac, read_bl_len, c_size, c_size_mult, (c_size + 1) * (4 << c_size_mult) * (1 << read_bl_len)); taac, nsac, read_bl_len, c_size, c_size_mult, (c_size + 1) * (4 << c_size_mult) * (1 << read_bl_len));
// static const unsigned int time_unit[] = {1, 10, 100, 1000, 10000, 100000, 1000000, 10000000}; static const unsigned int time_unit[] = {1, 10, 100, 1000, 10000, 100000, 1000000, 10000000};
// static const unsigned int time_value[] = {1, 10, 12, 13, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 70, 80}; // must div by 10 static const unsigned int time_value[] = {1, 10, 12, 13, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 70, 80}; // must div by 10
// sdhci->timeout = time_unit[taac & 7] * time_value[(taac >> 3) & 0xf] / 10; c->timeout = time_unit[taac & 7] * time_value[(taac >> 3) & 0xf] / 10;
// sdhc_error(sdhci->reg_base, "calculated timeout = %uns", sdhci->timeout); gecko_printf("calculated timeout = %uns\n", c->timeout);
c->num_sectors = (c_size + 1) * (4 << c_size_mult) * (1 << read_bl_len) / 512; c->num_sectors = (c_size + 1) * (4 << c_size_mult) * (1 << read_bl_len) / 512;
} }
sdmmc_select(dev); sdmmc_select(dev);
DPRINTF(2, ("sdmmc: MMC_SET_BLOCKLEN\n")); DPRINTF(2, ("sdmmc: MMC_SET_BLOCKLEN\n"));
memset(&cmd, 0, sizeof(cmd)); memset(&cmd, 0, sizeof(cmd));
@ -433,7 +457,7 @@ int sdmmc_read(struct device *dev, u32 blk_start, u32 blk_count, void *data)
if (cmd.c_error) { if (cmd.c_error) {
gecko_printf("sdmmc: MMC_READ_BLOCK_MULTIPLE failed for " gecko_printf("sdmmc: MMC_READ_BLOCK_MULTIPLE failed for "
"card %d with %d", no, cmd.c_error); "card %d with %d\n", no, cmd.c_error);
return -1; return -1;
} }
DPRINTF(2, ("sdmmc: MMC_READ_BLOCK_MULTIPLE done\n")); DPRINTF(2, ("sdmmc: MMC_READ_BLOCK_MULTIPLE done\n"));
@ -441,6 +465,7 @@ int sdmmc_read(struct device *dev, u32 blk_start, u32 blk_count, void *data)
return 0; return 0;
} }
#ifndef LOADER
int sdmmc_write(struct device *dev, u32 blk_start, u32 blk_count, void *data) int sdmmc_write(struct device *dev, u32 blk_start, u32 blk_count, void *data)
{ {
int no = (int)dev; int no = (int)dev;
@ -479,7 +504,7 @@ int sdmmc_write(struct device *dev, u32 blk_start, u32 blk_count, void *data)
if (cmd.c_error) { if (cmd.c_error) {
gecko_printf("sdmmc: MMC_READ_BLOCK_MULTIPLE failed for " gecko_printf("sdmmc: MMC_READ_BLOCK_MULTIPLE failed for "
"card %d with %d", no, cmd.c_error); "card %d with %d\n", no, cmd.c_error);
return -1; return -1;
} }
DPRINTF(2, ("sdmmc: MMC_WRITE_BLOCK_MULTIPLE done\n")); DPRINTF(2, ("sdmmc: MMC_WRITE_BLOCK_MULTIPLE done\n"));
@ -506,7 +531,9 @@ int sdmmc_get_sectors(struct device *dev)
return c->num_sectors; return c->num_sectors;
} }
#endif
#ifdef CAN_HAZ_IPC
void sdmmc_ipc(volatile ipc_request *req) void sdmmc_ipc(volatile ipc_request *req)
{ {
int ret; int ret;
@ -539,4 +566,4 @@ void sdmmc_ipc(volatile ipc_request *req)
break; break;
} }
} }
#endif