[PATCH v2 2/3] mmc: meson-gx: change clock phase value on SM1 SoCs
Anand Moon
linux.amoon at gmail.com
Thu Nov 12 09:40:13 CET 2020
Hi Jaehoon,
On Wed, 11 Nov 2020 at 04:52, Jaehoon Chung <jh80.chung at samsung.com> wrote:
>
> From: Neil Armstrong <narmstrong at baylibre.com>
>
> Amlogic SM1 SoCs doesn't work over 50MHz. When phase sets to 270', it's
> working fine over 50MHz on Amlogic SM1 SoCs.
> Since Other Amlogic SoCs doens't report an issue, phase value is using
> to 180' by default.
>
> To distinguish which value is used adds an u-boot only sm1 compatible.
>
> In future, it needs to find what value is a proper about each SoCs.
>
> Signed-off-by: Neil Armstrong <narmstrong at baylibre.com>
> Signed-off-by: Jaehoon Chung <jh80.chung at samsung.com>
> ---
Thanks for this patch series.
I have tested this on Odroid N2 and c4 eMMC module
so Please add my for this series,
Tested-by: Anand Moon <linux.amoon at gmail.com>
> drivers/mmc/meson_gx_mmc.c | 27 +++++++++++++++++++++++----
> drivers/mmc/meson_gx_mmc.h | 5 +++++
> 2 files changed, 28 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/mmc/meson_gx_mmc.c b/drivers/mmc/meson_gx_mmc.c
> index eedebb317b5f..a5e9ac5637b9 100644
> --- a/drivers/mmc/meson_gx_mmc.c
> +++ b/drivers/mmc/meson_gx_mmc.c
> @@ -17,6 +17,14 @@
> #include <linux/log2.h>
> #include "meson_gx_mmc.h"
>
> +bool meson_gx_mmc_is_compatible(struct udevice *dev,
> + enum meson_gx_mmc_compatible family)
> +{
> + enum meson_gx_mmc_compatible compat = dev_get_driver_data(dev);
> +
> + return compat == family;
> +}
> +
> static inline void *get_regbase(const struct mmc *mmc)
> {
> struct meson_mmc_platdata *pdata = mmc->priv;
> @@ -42,6 +50,8 @@ static void meson_mmc_config_clock(struct mmc *mmc)
> if (!mmc->clock)
> return;
>
> + /* TOFIX This should use the proper clock taken from DT */
> +
> /* 1GHz / CLK_MAX_DIV = 15,9 MHz */
> if (mmc->clock > 16000000) {
> clk = SD_EMMC_CLKSRC_DIV2;
> @@ -52,8 +62,16 @@ static void meson_mmc_config_clock(struct mmc *mmc)
> }
> clk_div = DIV_ROUND_UP(clk, mmc->clock);
>
> - /* 180 phase core clock */
> - meson_mmc_clk |= CLK_CO_PHASE_180;
> + /*
> + * SM1 SoCs doesn't work fine over 50MHz with CLK_CO_PHASE_180
> + * If CLK_CO_PHASE_270 is used, it's more stable than other.
> + * Other SoCs use CLK_CO_PHASE_180 by default.
> + * It needs to find what is a proper value about each SoCs.
> + */
> + if (meson_gx_mmc_is_compatible(mmc->dev, MMC_COMPATIBLE_SM1))
> + meson_mmc_clk |= CLK_CO_PHASE_270;
> + else
> + meson_mmc_clk |= CLK_CO_PHASE_180;
>
> /* 180 phase tx clock */
> meson_mmc_clk |= CLK_TX_PHASE_000;
> @@ -308,8 +326,9 @@ int meson_mmc_bind(struct udevice *dev)
> }
>
> static const struct udevice_id meson_mmc_match[] = {
> - { .compatible = "amlogic,meson-gx-mmc" },
> - { .compatible = "amlogic,meson-axg-mmc" },
> + { .compatible = "amlogic,meson-gx-mmc", .data = MMC_COMPATIBLE_GX },
> + { .compatible = "amlogic,meson-axg-mmc", .data = MMC_COMPATIBLE_GX },
> + { .compatible = "amlogic,meson-sm1-mmc", .data = MMC_COMPATIBLE_SM1 },
> { /* sentinel */ }
> };
>
> diff --git a/drivers/mmc/meson_gx_mmc.h b/drivers/mmc/meson_gx_mmc.h
> index b4544b55628f..92aec5329f6e 100644
> --- a/drivers/mmc/meson_gx_mmc.h
> +++ b/drivers/mmc/meson_gx_mmc.h
> @@ -9,6 +9,11 @@
> #include <mmc.h>
> #include <linux/bitops.h>
>
> +enum meson_gx_mmc_compatible {
> + MMC_COMPATIBLE_GX,
> + MMC_COMPATIBLE_SM1,
> +};
> +
> #define SDIO_PORT_A 0
> #define SDIO_PORT_B 1
> #define SDIO_PORT_C 2
> --
> 2.29.0
>
More information about the U-Boot
mailing list