mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-24 13:43:28 +00:00
mmc: Implement card detection.
Check for card detect each time an MMC/SD device is initialized. If card detection is not implemented, this code behaves as before and continues assuming a card is present. If no card is detected, has_init is reset for the MMC/SD device (to force initialization next time) and an error is returned. Signed-off-by: Thierry Reding <thierry.reding@avionic-design.de> Tested-by: Jason Liu <jason.hui@linaro.org>
This commit is contained in:
parent
314284b156
commit
48972d907a
15 changed files with 33 additions and 0 deletions
|
@ -385,6 +385,7 @@ static int arm_pl180_mmci_host_init(struct mmc *dev)
|
|||
dev->send_cmd = host_request;
|
||||
dev->set_ios = host_set_ios;
|
||||
dev->init = mmc_host_reset;
|
||||
dev->getcd = NULL;
|
||||
dev->host_caps = 0;
|
||||
dev->voltages = VOLTAGE_WINDOW_MMC;
|
||||
dev->f_min = dev->clock;
|
||||
|
|
|
@ -250,6 +250,7 @@ int bfin_mmc_init(bd_t *bis)
|
|||
mmc->send_cmd = bfin_sdh_request;
|
||||
mmc->set_ios = bfin_sdh_set_ios;
|
||||
mmc->init = bfin_sdh_init;
|
||||
mmc->getcd = NULL;
|
||||
mmc->host_caps = MMC_MODE_4BIT;
|
||||
|
||||
mmc->voltages = MMC_VDD_32_33 | MMC_VDD_33_34;
|
||||
|
|
|
@ -387,6 +387,7 @@ int davinci_mmc_init(bd_t *bis, struct davinci_mmc *host)
|
|||
mmc->send_cmd = dmmc_send_cmd;
|
||||
mmc->set_ios = dmmc_set_ios;
|
||||
mmc->init = dmmc_init;
|
||||
mmc->getcd = NULL;
|
||||
|
||||
mmc->f_min = 200000;
|
||||
mmc->f_max = 25000000;
|
||||
|
|
|
@ -665,6 +665,7 @@ int ftsdc010_mmc_init(int dev_index)
|
|||
mmc->send_cmd = ftsdc010_request;
|
||||
mmc->set_ios = ftsdc010_set_ios;
|
||||
mmc->init = ftsdc010_core_init;
|
||||
mmc->getcd = NULL;
|
||||
|
||||
mmc->voltages = MMC_VDD_32_33 | MMC_VDD_33_34;
|
||||
|
||||
|
|
|
@ -337,6 +337,7 @@ int atmel_mci_init(void *regs)
|
|||
mmc->send_cmd = mci_send_cmd;
|
||||
mmc->set_ios = mci_set_ios;
|
||||
mmc->init = mci_init;
|
||||
mmc->getcd = NULL;
|
||||
|
||||
/* need to be able to pass these in on a board by board basis */
|
||||
mmc->voltages = MMC_VDD_32_33 | MMC_VDD_33_34;
|
||||
|
|
|
@ -674,6 +674,18 @@ int mmc_switch_part(int dev_num, unsigned int part_num)
|
|||
| (part_num & PART_ACCESS_MASK));
|
||||
}
|
||||
|
||||
int mmc_getcd(struct mmc *mmc)
|
||||
{
|
||||
int cd;
|
||||
|
||||
cd = board_mmc_getcd(mmc);
|
||||
|
||||
if ((cd < 0) && mmc->getcd)
|
||||
cd = mmc->getcd(mmc);
|
||||
|
||||
return cd;
|
||||
}
|
||||
|
||||
int sd_switch(struct mmc *mmc, int mode, int group, u8 value, u8 *resp)
|
||||
{
|
||||
struct mmc_cmd cmd;
|
||||
|
@ -1202,6 +1214,12 @@ int mmc_init(struct mmc *mmc)
|
|||
{
|
||||
int err;
|
||||
|
||||
if (mmc_getcd(mmc) == 0) {
|
||||
mmc->has_init = 0;
|
||||
printf("MMC: no card present\n");
|
||||
return NO_CARD_ERR;
|
||||
}
|
||||
|
||||
if (mmc->has_init)
|
||||
return 0;
|
||||
|
||||
|
|
|
@ -272,6 +272,7 @@ struct mmc *mmc_spi_init(uint bus, uint cs, uint speed, uint mode)
|
|||
mmc->send_cmd = mmc_spi_request;
|
||||
mmc->set_ios = mmc_spi_set_ios;
|
||||
mmc->init = mmc_spi_init_p;
|
||||
mmc->getcd = NULL;
|
||||
mmc->host_caps = MMC_MODE_SPI;
|
||||
|
||||
mmc->voltages = MMC_SPI_VOLTAGE;
|
||||
|
|
|
@ -500,6 +500,7 @@ static int mxcmci_initialize(bd_t *bis)
|
|||
mmc->send_cmd = mxcmci_request;
|
||||
mmc->set_ios = mxcmci_set_ios;
|
||||
mmc->init = mxcmci_init;
|
||||
mmc->getcd = NULL;
|
||||
mmc->host_caps = MMC_MODE_4BIT;
|
||||
|
||||
host->base = (struct mxcmci_regs *)CONFIG_MXC_MCI_REGS_BASE;
|
||||
|
|
|
@ -329,6 +329,7 @@ int mxsmmc_initialize(bd_t *bis, int id, int (*wp)(int))
|
|||
mmc->send_cmd = mxsmmc_send_cmd;
|
||||
mmc->set_ios = mxsmmc_set_ios;
|
||||
mmc->init = mxsmmc_init;
|
||||
mmc->getcd = NULL;
|
||||
mmc->priv = priv;
|
||||
|
||||
mmc->voltages = MMC_VDD_32_33 | MMC_VDD_33_34;
|
||||
|
|
|
@ -472,6 +472,7 @@ int omap_mmc_init(int dev_index)
|
|||
mmc->send_cmd = mmc_send_cmd;
|
||||
mmc->set_ios = mmc_set_ios;
|
||||
mmc->init = mmc_init_setup;
|
||||
mmc->getcd = NULL;
|
||||
|
||||
switch (dev_index) {
|
||||
case 0:
|
||||
|
|
|
@ -411,6 +411,7 @@ int pxa_mmc_register(int card_index)
|
|||
mmc->send_cmd = pxa_mmc_request;
|
||||
mmc->set_ios = pxa_mmc_set_ios;
|
||||
mmc->init = pxa_mmc_init;
|
||||
mmc->getcd = NULL;
|
||||
|
||||
mmc->voltages = MMC_VDD_32_33 | MMC_VDD_33_34;
|
||||
mmc->f_max = PXAMMC_MAX_SPEED;
|
||||
|
|
|
@ -463,6 +463,7 @@ static int s5p_mmc_initialize(int dev_index, int bus_width)
|
|||
mmc->send_cmd = mmc_send_cmd;
|
||||
mmc->set_ios = mmc_set_ios;
|
||||
mmc->init = mmc_core_init;
|
||||
mmc->getcd = NULL;
|
||||
|
||||
mmc->voltages = MMC_VDD_32_33 | MMC_VDD_33_34 | MMC_VDD_165_195;
|
||||
if (bus_width == 8)
|
||||
|
|
|
@ -390,6 +390,7 @@ int add_sdhci(struct sdhci_host *host, u32 max_clk, u32 min_clk)
|
|||
mmc->send_cmd = sdhci_send_command;
|
||||
mmc->set_ios = sdhci_set_ios;
|
||||
mmc->init = sdhci_init;
|
||||
mmc->getcd = NULL;
|
||||
|
||||
caps = sdhci_readl(host, SDHCI_CAPABILITIES);
|
||||
#ifdef CONFIG_MMC_SDMA
|
||||
|
|
|
@ -598,6 +598,7 @@ int mmcif_mmc_init(void)
|
|||
mmc->send_cmd = sh_mmcif_request;
|
||||
mmc->set_ios = sh_mmcif_set_ios;
|
||||
mmc->init = sh_mmcif_init;
|
||||
mmc->getcd = NULL;
|
||||
host->regs = (struct sh_mmcif_regs *)CONFIG_SH_MMCIF_ADDR;
|
||||
host->clk = CONFIG_SH_MMCIF_CLK;
|
||||
mmc->priv = host;
|
||||
|
|
|
@ -302,6 +302,7 @@ struct mmc {
|
|||
struct mmc_cmd *cmd, struct mmc_data *data);
|
||||
void (*set_ios)(struct mmc *mmc);
|
||||
int (*init)(struct mmc *mmc);
|
||||
int (*getcd)(struct mmc *mmc);
|
||||
uint b_max;
|
||||
};
|
||||
|
||||
|
@ -316,6 +317,7 @@ void print_mmc_devices(char separator);
|
|||
int get_mmc_num(void);
|
||||
int board_mmc_getcd(struct mmc *mmc);
|
||||
int mmc_switch_part(int dev_num, unsigned int part_num);
|
||||
int mmc_getcd(struct mmc *mmc);
|
||||
|
||||
#ifdef CONFIG_GENERIC_MMC
|
||||
int atmel_mci_init(void *regs);
|
||||
|
|
Loading…
Reference in a new issue