diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/clk/renesas/clk-rcar-gen2.c | 58 | ||||
-rw-r--r-- | drivers/mmc/mmc.c | 20 | ||||
-rw-r--r-- | drivers/mmc/sh_mmcif.c | 2 | ||||
-rw-r--r-- | drivers/mmc/tmio-common.c | 5 | ||||
-rw-r--r-- | drivers/mtd/spi/Kconfig | 36 |
5 files changed, 103 insertions, 18 deletions
diff --git a/drivers/clk/renesas/clk-rcar-gen2.c b/drivers/clk/renesas/clk-rcar-gen2.c index 6dfd02f2eb5..13111b341af 100644 --- a/drivers/clk/renesas/clk-rcar-gen2.c +++ b/drivers/clk/renesas/clk-rcar-gen2.c @@ -44,13 +44,17 @@ static const struct clk_div_table cpg_sd01_div_table[] = { { 0, 0 }, }; -static u8 gen2_clk_get_sdh_div(const struct clk_div_table *table, u8 div) +static u8 gen2_clk_get_sdh_div(const struct clk_div_table *table, u8 val) { - while ((*table++).val) { - if ((*table).div == div) - return div; + for (;;) { + if (!(*table).div) + return 0xff; + + if ((*table).val == val) + return (*table).div; + + table++; } - return 0xff; } static int gen2_clk_enable(struct clk *clk) @@ -117,7 +121,7 @@ static ulong gen2_clk_get_rate(struct clk *clk) case CLK_TYPE_FF: rate = (gen2_clk_get_rate(&parent) * core->mult) / core->div; - debug("%s[%i] FIXED clk: parent=%i div=%i mul=%i => rate=%u\n", + debug("%s[%i] FIXED clk: parent=%i mul=%i div=%i => rate=%u\n", __func__, __LINE__, core->parent, core->mult, core->div, rate); return rate; @@ -202,8 +206,50 @@ static ulong gen2_clk_get_rate(struct clk *clk) return -ENOENT; } +static int gen2_clk_setup_mmcif_div(struct clk *clk, ulong rate) +{ + struct gen2_clk_priv *priv = dev_get_priv(clk->dev); + struct cpg_mssr_info *info = priv->info; + const struct cpg_core_clk *core; + struct clk parent, pparent; + u32 val; + int ret; + + ret = renesas_clk_get_parent(clk, info, &parent); + if (ret) { + debug("%s[%i] parent fail, ret=%i\n", __func__, __LINE__, ret); + return ret; + } + + if (renesas_clk_is_mod(&parent)) + return 0; + + ret = renesas_clk_get_core(&parent, info, &core); + if (ret) + return ret; + + if (strcmp(core->name, "mmc0") && strcmp(core->name, "mmc1")) + return 0; + + ret = renesas_clk_get_parent(&parent, info, &pparent); + if (ret) { + debug("%s[%i] parent fail, ret=%i\n", __func__, __LINE__, ret); + return ret; + } + + val = (gen2_clk_get_rate(&pparent) / rate) - 1; + + debug("%s[%i] MMCIF offset=%x\n", __func__, __LINE__, core->offset); + + writel(val, priv->base + core->offset); + + return 0; +} + static ulong gen2_clk_set_rate(struct clk *clk, ulong rate) { + /* Force correct MMC-IF divider configuration if applicable */ + gen2_clk_setup_mmcif_div(clk, rate); return gen2_clk_get_rate(clk); } diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c index 1c1527cc747..89b255daf48 100644 --- a/drivers/mmc/mmc.c +++ b/drivers/mmc/mmc.c @@ -67,7 +67,7 @@ __weak int board_mmc_getcd(struct mmc *mmc) void mmmc_trace_before_send(struct mmc *mmc, struct mmc_cmd *cmd) { printf("CMD_SEND:%d\n", cmd->cmdidx); - printf("\t\tARG\t\t\t 0x%08X\n", cmd->cmdarg); + printf("\t\tARG\t\t\t 0x%08x\n", cmd->cmdarg); } void mmmc_trace_after_send(struct mmc *mmc, struct mmc_cmd *cmd, int ret) @@ -83,21 +83,21 @@ void mmmc_trace_after_send(struct mmc *mmc, struct mmc_cmd *cmd, int ret) printf("\t\tMMC_RSP_NONE\n"); break; case MMC_RSP_R1: - printf("\t\tMMC_RSP_R1,5,6,7 \t 0x%08X \n", + printf("\t\tMMC_RSP_R1,5,6,7 \t 0x%08x \n", cmd->response[0]); break; case MMC_RSP_R1b: - printf("\t\tMMC_RSP_R1b\t\t 0x%08X \n", + printf("\t\tMMC_RSP_R1b\t\t 0x%08x \n", cmd->response[0]); break; case MMC_RSP_R2: - printf("\t\tMMC_RSP_R2\t\t 0x%08X \n", + printf("\t\tMMC_RSP_R2\t\t 0x%08x \n", cmd->response[0]); - printf("\t\t \t\t 0x%08X \n", + printf("\t\t \t\t 0x%08x \n", cmd->response[1]); - printf("\t\t \t\t 0x%08X \n", + printf("\t\t \t\t 0x%08x \n", cmd->response[2]); - printf("\t\t \t\t 0x%08X \n", + printf("\t\t \t\t 0x%08x \n", cmd->response[3]); printf("\n"); printf("\t\t\t\t\tDUMPING DATA\n"); @@ -107,12 +107,12 @@ void mmmc_trace_after_send(struct mmc *mmc, struct mmc_cmd *cmd, int ret) ptr = (u8 *)&cmd->response[i]; ptr += 3; for (j = 0; j < 4; j++) - printf("%02X ", *ptr--); + printf("%02x ", *ptr--); printf("\n"); } break; case MMC_RSP_R3: - printf("\t\tMMC_RSP_R3,4\t\t 0x%08X \n", + printf("\t\tMMC_RSP_R3,4\t\t 0x%08x \n", cmd->response[0]); break; default: @@ -226,7 +226,7 @@ int mmc_send_status(struct mmc *mmc, int timeout) if (cmd.response[0] & MMC_STATUS_MASK) { #if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT) - pr_err("Status Error: 0x%08X\n", + pr_err("Status Error: 0x%08x\n", cmd.response[0]); #endif return -ECOMM; diff --git a/drivers/mmc/sh_mmcif.c b/drivers/mmc/sh_mmcif.c index 306daf14155..c8875ce8f81 100644 --- a/drivers/mmc/sh_mmcif.c +++ b/drivers/mmc/sh_mmcif.c @@ -696,7 +696,7 @@ static int sh_mmcif_dm_probe(struct udevice *dev) return ret; } - host->clk = clk_get_rate(&sh_mmcif_clk); + host->clk = clk_set_rate(&sh_mmcif_clk, 97500000); plat->cfg.name = dev->name; plat->cfg.host_caps = MMC_MODE_HS_52MHz | MMC_MODE_HS; diff --git a/drivers/mmc/tmio-common.c b/drivers/mmc/tmio-common.c index 01d8c2b9254..812205a21f6 100644 --- a/drivers/mmc/tmio-common.c +++ b/drivers/mmc/tmio-common.c @@ -783,7 +783,10 @@ int tmio_sd_probe(struct udevice *dev, u32 quirks) plat->cfg.f_min = mclk / (priv->caps & TMIO_SD_CAP_DIV1024 ? 1024 : 512); plat->cfg.f_max = mclk; - plat->cfg.b_max = U32_MAX; /* max value of TMIO_SD_SECCNT */ + if (quirks & TMIO_SD_CAP_16BIT) + plat->cfg.b_max = U16_MAX; /* max value of TMIO_SD_SECCNT */ + else + plat->cfg.b_max = U32_MAX; /* max value of TMIO_SD_SECCNT */ upriv->mmc = &plat->mmc; diff --git a/drivers/mtd/spi/Kconfig b/drivers/mtd/spi/Kconfig index e3b40fc157d..5671bca24a0 100644 --- a/drivers/mtd/spi/Kconfig +++ b/drivers/mtd/spi/Kconfig @@ -36,6 +36,42 @@ config SPI_FLASH If unsure, say N +config SF_DEFAULT_BUS + int "SPI Flash default bus identifier" + depends on SPI_FLASH || DM_SPI_FLASH + default 0 + help + The default bus may be provided by the platform + to handle the common case when only a single serial + flash is present on the system. + +config SF_DEFAULT_CS + int "SPI Flash default Chip-select" + depends on SPI_FLASH || DM_SPI_FLASH + default 0 + help + The default chip select may be provided by the platform + to handle the common case when only a single serial + flash is present on the system. + +config SF_DEFAULT_MODE + hex "SPI Flash default mode (see include/spi.h)" + depends on SPI_FLASH || DM_SPI_FLASH + default 3 + help + The default mode may be provided by the platform + to handle the common case when only a single serial + flash is present on the system. + +config SF_DEFAULT_SPEED + int "SPI Flash default speed in Hz" + depends on SPI_FLASH || DM_SPI_FLASH + default 1000000 + help + The default speed may be provided by the platform + to handle the common case when only a single serial + flash is present on the system. + if SPI_FLASH config SPI_FLASH_SFDP_SUPPORT |