Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

mmc: sdhci-esdhc-imx: add tuning-step setting support

tuning-step is the delay cell steps in tuning procedure. The default value
of tuning-step is 1. Some boards or cards need another value to pass the
tuning procedure. For example, imx7d-sdb board need the tuning-step value
as 2, otherwise it can't pass the tuning procedure.

So this patch add the tuning-step setting in driver, so that user can set
the tuning-step value in dts.

Signed-off-by: Haibo Chen <haibo.chen@freescale.com>
Acked-by: Dong Aisheng <aisheng.dong@freescale.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>

authored by

Haibo Chen and committed by
Ulf Hansson
d407e30b 28b07674

+10
+9
drivers/mmc/host/sdhci-esdhc-imx.c
··· 75 75 #define ESDHC_STD_TUNING_EN (1 << 24) 76 76 /* NOTE: the minimum valid tuning start tap for mx6sl is 1 */ 77 77 #define ESDHC_TUNING_START_TAP 0x1 78 + #define ESDHC_TUNING_STEP_SHIFT 16 78 79 79 80 /* pinctrl state */ 80 81 #define ESDHC_PINCTRL_STATE_100MHZ "state_100mhz" ··· 475 474 } else if (imx_data->socdata->flags & ESDHC_FLAG_STD_TUNING) { 476 475 u32 v = readl(host->ioaddr + SDHCI_ACMD12_ERR); 477 476 u32 m = readl(host->ioaddr + ESDHC_MIX_CTRL); 477 + u32 tuning_ctrl; 478 478 if (val & SDHCI_CTRL_TUNED_CLK) { 479 479 v |= ESDHC_MIX_CTRL_SMPCLK_SEL; 480 480 } else { ··· 486 484 if (val & SDHCI_CTRL_EXEC_TUNING) { 487 485 v |= ESDHC_MIX_CTRL_EXE_TUNE; 488 486 m |= ESDHC_MIX_CTRL_FBCLK_SEL; 487 + tuning_ctrl = readl(host->ioaddr + ESDHC_TUNING_CTRL); 488 + tuning_ctrl |= ESDHC_STD_TUNING_EN | ESDHC_TUNING_START_TAP; 489 + if (imx_data->boarddata.tuning_step) 490 + tuning_ctrl |= imx_data->boarddata.tuning_step << ESDHC_TUNING_STEP_SHIFT; 491 + writel(tuning_ctrl, host->ioaddr + ESDHC_TUNING_CTRL); 489 492 } else { 490 493 v &= ~ESDHC_MIX_CTRL_EXE_TUNE; 491 494 } ··· 969 962 boarddata->wp_gpio = of_get_named_gpio(np, "wp-gpios", 0); 970 963 if (gpio_is_valid(boarddata->wp_gpio)) 971 964 boarddata->wp_type = ESDHC_WP_GPIO; 965 + 966 + of_property_read_u32(np, "fsl,tuning-step", &boarddata->tuning_step); 972 967 973 968 if (of_find_property(np, "no-1-8-v", NULL)) 974 969 boarddata->support_vsel = false;
+1
include/linux/platform_data/mmc-esdhc-imx.h
··· 45 45 int max_bus_width; 46 46 bool support_vsel; 47 47 unsigned int delay_line; 48 + unsigned int tuning_step; /* The delay cell steps in tuning procedure */ 48 49 }; 49 50 #endif /* __ASM_ARCH_IMX_ESDHC_H */