|
@@ -84,9 +84,9 @@ static int s5p_sdhci_core_init(struct sdhci_host *host)
|
|
|
|
|
|
int s5p_sdhci_init(u32 regbase, int index, int bus_width)
|
|
|
{
|
|
|
- struct sdhci_host *host = malloc(sizeof(struct sdhci_host));
|
|
|
+ struct sdhci_host *host = calloc(1, sizeof(struct sdhci_host));
|
|
|
if (!host) {
|
|
|
- printf("sdhci__host malloc fail!\n");
|
|
|
+ printf("sdhci__host allocation fail!\n");
|
|
|
return 1;
|
|
|
}
|
|
|
host->ioaddr = (void *)regbase;
|
|
@@ -101,29 +101,31 @@ struct sdhci_host sdhci_host[SDHCI_MAX_HOSTS];
|
|
|
|
|
|
static int do_sdhci_init(struct sdhci_host *host)
|
|
|
{
|
|
|
- int dev_id, flag;
|
|
|
- int err = 0;
|
|
|
+ int dev_id, flag, ret;
|
|
|
|
|
|
flag = host->bus_width == 8 ? PINMUX_FLAG_8BIT_MODE : PINMUX_FLAG_NONE;
|
|
|
dev_id = host->index + PERIPH_ID_SDMMC0;
|
|
|
|
|
|
if (dm_gpio_is_valid(&host->pwr_gpio)) {
|
|
|
dm_gpio_set_value(&host->pwr_gpio, 1);
|
|
|
- err = exynos_pinmux_config(dev_id, flag);
|
|
|
- if (err) {
|
|
|
+ ret = exynos_pinmux_config(dev_id, flag);
|
|
|
+ if (ret) {
|
|
|
debug("MMC not configured\n");
|
|
|
- return err;
|
|
|
+ return ret;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (dm_gpio_is_valid(&host->cd_gpio)) {
|
|
|
- if (dm_gpio_get_value(&host->cd_gpio))
|
|
|
+ ret = dm_gpio_get_value(&host->cd_gpio);
|
|
|
+ if (ret) {
|
|
|
+ debug("no SD card detected (%d)\n", ret);
|
|
|
return -ENODEV;
|
|
|
+ }
|
|
|
|
|
|
- err = exynos_pinmux_config(dev_id, flag);
|
|
|
- if (err) {
|
|
|
+ ret = exynos_pinmux_config(dev_id, flag);
|
|
|
+ if (ret) {
|
|
|
printf("external SD not configured\n");
|
|
|
- return err;
|
|
|
+ return ret;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -170,7 +172,8 @@ static int sdhci_get_config(const void *blob, int node, struct sdhci_host *host)
|
|
|
static int process_nodes(const void *blob, int node_list[], int count)
|
|
|
{
|
|
|
struct sdhci_host *host;
|
|
|
- int i, node;
|
|
|
+ int i, node, ret;
|
|
|
+ int failed = 0;
|
|
|
|
|
|
debug("%s: count = %d\n", __func__, count);
|
|
|
|
|
@@ -182,13 +185,22 @@ static int process_nodes(const void *blob, int node_list[], int count)
|
|
|
|
|
|
host = &sdhci_host[i];
|
|
|
|
|
|
- if (sdhci_get_config(blob, node, host)) {
|
|
|
- printf("%s: failed to decode dev %d\n", __func__, i);
|
|
|
- return -1;
|
|
|
+ ret = sdhci_get_config(blob, node, host);
|
|
|
+ if (ret) {
|
|
|
+ printf("%s: failed to decode dev %d (%d)\n", __func__, i, ret);
|
|
|
+ failed++;
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ ret = do_sdhci_init(host);
|
|
|
+ if (ret) {
|
|
|
+ printf("%s: failed to initialize dev %d (%d)\n", __func__, i, ret);
|
|
|
+ failed++;
|
|
|
}
|
|
|
- do_sdhci_init(host);
|
|
|
}
|
|
|
- return 0;
|
|
|
+
|
|
|
+ /* we only consider it an error when all nodes fail */
|
|
|
+ return (failed == count ? -1 : 0);
|
|
|
}
|
|
|
|
|
|
int exynos_mmc_init(const void *blob)
|
|
@@ -200,8 +212,6 @@ int exynos_mmc_init(const void *blob)
|
|
|
COMPAT_SAMSUNG_EXYNOS_MMC, node_list,
|
|
|
SDHCI_MAX_HOSTS);
|
|
|
|
|
|
- process_nodes(blob, node_list, count);
|
|
|
-
|
|
|
- return 0;
|
|
|
+ return process_nodes(blob, node_list, count);
|
|
|
}
|
|
|
#endif
|