[{"id":3684861,"web_url":"http://patchwork.ozlabs.org/comment/3684861/","msgid":"<20260430172638.GA17167@localhost>","list_archive_url":null,"date":"2026-04-30T17:26:38","subject":"Re: [PATCH 1/4] mmc: exynos_dw_mmc: add proper init sequence for\n HS400 support","submitter":{"id":83221,"url":"http://patchwork.ozlabs.org/api/people/83221/","name":"Henrik Grimler","email":"henrik@grimler.se"},"content":"Hi Kaustabh,\n\nOn Mon, Apr 27, 2026 at 11:22:49AM +0530, Kaustabh Chakraborty wrote:\n> HS400 support was added, but configuration necessary for HS400 support\n> was left out. Add necessary changes, which includes:\n> - Device tree properties, such as \"samsung,dw-mshc-hs400-timing\" and\n>   \"samsung,read-strobe-delay\", which function as per dt-bindings.\n> - Registers related to HS400, which are necessary to enable HS400+ support.\n> - Appropriate timing tunings for the HS400 mode.\n> \n> Note that these changes are loosely based off of its Linux kernel\n> counterpart.\n> \n> Fixes: bbe3b9fa0922 (\"mmc: exynos_dw_mmc: add support for MMC HS200 and HS400 modes\")\n> Signed-off-by: Kaustabh Chakraborty <kauschluss@disroot.org>\n> ---\n>  arch/arm/mach-exynos/include/mach/dwmmc.h |  5 ++\n>  drivers/mmc/exynos_dw_mmc.c               | 80 +++++++++++++++++++++++++++++++\n>  2 files changed, 85 insertions(+)\n> \n> diff --git a/arch/arm/mach-exynos/include/mach/dwmmc.h b/arch/arm/mach-exynos/include/mach/dwmmc.h\n> index 4432deedef7..50081326c25 100644\n> --- a/arch/arm/mach-exynos/include/mach/dwmmc.h\n> +++ b/arch/arm/mach-exynos/include/mach/dwmmc.h\n> @@ -15,6 +15,11 @@\n>  #define DWMCI_SET_DRV_CLK(x)\t\t((x) << 16)\n>  #define DWMCI_SET_DIV_RATIO(x)\t\t((x) << 24)\n>  \n> +/* HS400 Related Registers */\n> +#define DWMCI_HS400_DQS_EN\t\t0x180\n> +#define DWMCI_HS400_ASYNC_FIFO_CTRL\t0x184\n> +#define DWMCI_HS400_DLINE_CTRL\t\t0x188\n> +\n>  /* Protector Register */\n>  #define DWMCI_EMMCP_BASE\t\t0x1000\n>  #define EMMCP_MPSECURITY\t\t(DWMCI_EMMCP_BASE + 0x0010)\n> diff --git a/drivers/mmc/exynos_dw_mmc.c b/drivers/mmc/exynos_dw_mmc.c\n> index 7ccd113bd79..d5e90a9bd5c 100644\n> --- a/drivers/mmc/exynos_dw_mmc.c\n> +++ b/drivers/mmc/exynos_dw_mmc.c\n> @@ -8,6 +8,7 @@\n>  #include <dwmmc.h>\n>  #include <asm/global_data.h>\n>  #include <malloc.h>\n> +#include <mmc.h>\n>  #include <errno.h>\n>  #include <asm/arch/dwmmc.h>\n>  #include <asm/arch/clk.h>\n> @@ -30,6 +31,14 @@\n>  #define CLKSEL_UP_SAMPLE(x, y)\t\t(((x) & ~CLKSEL_CCLK_SAMPLE(7)) | \\\n>  \t\t\t\t\t CLKSEL_CCLK_SAMPLE(y))\n>  \n> +/* RCLK_EN register defines */\n> +#define DATA_STROBE_EN\t\t\tBIT(0)\n> +#define AXI_NON_BLOCKING_WR\tBIT(7)\n> +\n> +/* DLINE_CTRL register defines */\n> +#define DQS_CTRL_RD_DELAY(x, y)\t\t(((x) & ~0x3FF) | ((y) & 0x3FF))\n> +#define DQS_CTRL_GET_RD_DELAY(x)\t((x) & 0x3FF)\n> +\n>  /**\n>   * DOC: Quirk flags for different Exynos DW MMC blocks\n>   *\n> @@ -71,6 +80,11 @@ struct dwmci_exynos_priv_data {\n>  \tstruct clk clk;\n>  \tu32 sdr_timing;\n>  \tu32 ddr_timing;\n> +\tu32 hs400_timing;\n> +\tu32 tuned_sample;\n> +\tu32 dqs_delay;\n> +\tu32 saved_dqs_en;\n> +\tu32 saved_strobe_ctrl;\n>  \tconst struct exynos_dwmmc_variant *chip;\n>  };\n>  \n> @@ -162,6 +176,27 @@ static u8 exynos_dwmmc_get_ciu_div(struct dwmci_host *host)\n>  \t\t\t\t& DWMCI_DIVRATIO_MASK) + 1;\n>  }\n>  \n> +static void exynos_config_hs400(struct dwmci_host *host, enum bus_mode mode)\n> +{\n> +\tstruct dwmci_exynos_priv_data *priv = exynos_dwmmc_get_priv(host);\n> +\tu32 dqs, strobe;\n> +\n> +\tdqs = priv->saved_dqs_en;\n> +\tstrobe = priv->saved_strobe_ctrl;\n> +\n> +\tswitch (mode) {\n> +\tcase MMC_HS_400:\n> +\t\tdqs |= DATA_STROBE_EN;\n> +\t\tstrobe = DQS_CTRL_RD_DELAY(strobe, priv->dqs_delay);\n> +\t\tbreak;\n> +\tdefault:\n> +\t\tdqs &= ~DATA_STROBE_EN;\n> +\t}\n> +\n> +\tdwmci_writel(host, DWMCI_HS400_DQS_EN, dqs);\n> +\tdwmci_writel(host, DWMCI_HS400_DLINE_CTRL, strobe);\n> +}\n> +\n>  /* Configure CLKSEL register with chosen timing values */\n>  static int exynos_dwmci_clksel(struct dwmci_host *host)\n>  {\n> @@ -170,6 +205,9 @@ static int exynos_dwmci_clksel(struct dwmci_host *host)\n>  \tu32 timing;\n>  \n>  \tswitch (host->mmc->selected_mode) {\n> +\tcase MMC_HS_400:\n> +\t\ttiming = CLKSEL_UP_SAMPLE(priv->hs400_timing, priv->tuned_sample);\n> +\t\tbreak;\n>  \tcase MMC_DDR_52:\n>  \t\ttiming = priv->ddr_timing;\n>  \t\tbreak;\n> @@ -186,6 +224,8 @@ static int exynos_dwmci_clksel(struct dwmci_host *host)\n>  \n>  \tdwmci_writel(host, priv->chip->clksel, timing);\n>  \n> +\texynos_config_hs400(host, host->mmc->selected_mode);\n> +\n\nThis breaks emmc in Linux for existing devices without hs400 support:\nexynos_config_hs400 is run no matter if the dt has the hs400\nparameters, meaning 0x0 is written to DWMCI_HS400_DQS_EN and\nDWMCI_HS400_DLINE_CTRL. U-boot does not seem to care, it loads the\nkernel and initramfs without issues, but Linux later gives errors:\n\n```\n[   20.741025] mmc_host mmc0: Bus speed (slot 0) = 50000000Hz (slot req 400000Hz, actual 396825HZ div = 63)\n[   20.886686] mmc_host mmc0: Bus speed (slot 0) = 50000000Hz (slot req 52000000Hz, actual 50000000HZ div = 0)\n[   20.895138] mmc_host mmc0: Bus speed (slot 0) = 200000000Hz (slot req 200000000Hz, actual 200000000HZ div = 0)\n[   20.905990] mmc_host mmc0: Bus speed (slot 0) = 50000000Hz (slot req 52000000Hz, actual 50000000HZ div = 0)\n[   20.914988] mmc_host mmc0: Bus speed (slot 0) = 400000000Hz (slot req 200000000Hz, actual 200000000HZ div = 1)\n[   21.099546] I/O error, dev mmcblk0, sector 1000001 op 0x1:(WRITE) flags 0x800 phys_seg 16 prio class 2\n[   21.099853] I/O error, dev mmcblk0, sector 1000825 op 0x1:(WRITE) flags 0x800 phys_seg 8 prio class 2\n[   21.107443] Buffer I/O error on dev mmcblk0p2, logical block 0, lost async page write\n[   21.107473] Buffer I/O error on dev mmcblk0p2, logical block 1, lost async page write\n[   21.116657] Buffer I/O error on dev mmcblk0p2, logical block 824, lost async page write\n[   21.124408] Buffer I/O error on dev mmcblk0p2, logical block 2, lost async page write\n[   21.132206] Buffer I/O error on dev mmcblk0p2, logical block 825, lost async page write\n[   21.140178] Buffer I/O error on dev mmcblk0p2, logical block 3, lost async page write\n[   21.147973] Buffer I/O error on dev mmcblk0p2, logical block 826, lost async page write\n[   21.155960] Buffer I/O error on dev mmcblk0p2, logical block 4, lost async page write\n[   21.163749] Buffer I/O error on dev mmcblk0p2, logical block 827, lost async page write\n[   21.171720] Buffer I/O error on dev mmcblk0p2, logical block 5, lost async page write\n[   21.200708] I/O error, dev mmcblk0, sector 1000873 op 0x1:(WRITE) flags 0x800 phys_seg 8 prio class 2\n[   21.201043] I/O error, dev mmcblk0, sector 1000929 op 0x1:(WRITE) flags 0x800 phys_seg 8 prio class 2\n[   21.218287] I/O error, dev mmcblk0, sector 1000945 op 0x1:(WRITE) flags 0x800 phys_seg 80 prio class 2\n[   21.218623] I/O error, dev mmcblk0, sector 1001033 op 0x1:(WRITE) flags 0x800 phys_seg 24 prio class 2\n[   21.236813] I/O error, dev mmcblk0, sector 1001097 op 0x1:(WRITE) flags 0x800 phys_seg 8 prio class 2\n[   21.237146] I/O error, dev mmcblk0, sector 1001121 op 0x1:(WRITE) flags 0x800 phys_seg 24 prio class 2\n[   21.255370] I/O error, dev mmcblk0, sector 1001161 op 0x1:(WRITE) flags 0x800 phys_seg 56 prio class 2\n[   21.256253] I/O error, dev mmcblk0, sector 1001249 op 0x1:(WRITE) flags 0x800 phys_seg 8 prio class 2\n```\n\nSpecifically it seems to be writing 0x0 to DWMCI_HS400_DQS_EN that is\nthe issue, if I comment out that line it works also for my odroid-xu4\nin non-hs400 mode.\n\nTested on odroid-xu4 with odroid-xu3_defconfig after applying the\nentire series, without any other changes.\n\nBest regards,\nHenrik Grimler","headers":{"Return-Path":"<u-boot-bounces@lists.denx.de>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming@legolas.ozlabs.org","Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (1024-bit key;\n secure) header.d=grimler.se header.i=@grimler.se header.a=rsa-sha256\n header.s=key1 header.b=iNOtzVSk;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de\n (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de;\n envelope-from=u-boot-bounces@lists.denx.de; receiver=patchwork.ozlabs.org)","phobos.denx.de;\n dmarc=pass (p=quarantine dis=none) header.from=grimler.se","phobos.denx.de;\n spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de","phobos.denx.de;\n\tdkim=pass (1024-bit key;\n secure) header.d=grimler.se header.i=@grimler.se header.b=\"iNOtzVSk\";\n\tdkim-atps=neutral","phobos.denx.de; dmarc=pass (p=quarantine dis=none)\n header.from=grimler.se","phobos.denx.de;\n spf=pass smtp.mailfrom=henrik@grimler.se"],"Received":["from phobos.denx.de (phobos.denx.de\n [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4g61Lt5t7Qz1yJr\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 01 May 2026 03:27:02 +1000 (AEST)","from h2850616.stratoserver.net (localhost [IPv6:::1])\n\tby phobos.denx.de (Postfix) with ESMTP id DE51B803C6;\n\tThu, 30 Apr 2026 19:26:53 +0200 (CEST)","by phobos.denx.de (Postfix, from userid 109)\n id AD12E80433; Thu, 30 Apr 2026 19:26:53 +0200 (CEST)","from out-177.mta0.migadu.com (out-177.mta0.migadu.com\n [IPv6:2001:41d0:1004:224b::b1])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits))\n (No client certificate requested)\n by phobos.denx.de (Postfix) with ESMTPS id 49D3680086\n for <u-boot@lists.denx.de>; Thu, 30 Apr 2026 19:26:50 +0200 (CEST)"],"X-Spam-Checker-Version":"SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de","X-Spam-Level":"","X-Spam-Status":"No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED,\n DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_BLOCKED,\n SPF_HELO_PASS,SPF_PASS autolearn=ham autolearn_force=no version=3.4.2","Date":"Thu, 30 Apr 2026 19:26:38 +0200","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=grimler.se; s=key1;\n t=1777570009;\n h=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n to:to:cc:cc:mime-version:mime-version:content-type:content-type:\n in-reply-to:in-reply-to:references:references;\n bh=6IqAZOjyNpHQ9weGtmta/kKo4bxsSZ8BGGB5ZRAqNW0=;\n b=iNOtzVSkDsztLsrrj4f560jFKgQ64FK0cfkNqrAxJu+pZy8IyFsnSLGnEPG/2NcLslW/8G\n bnfor3tlidWUJWFpvYyH75OvE1AXNcNNPqnDbLIPc7nqNeF+uSdAvPW1Wu+MK+jmEkPLNP\n YpbWIJOfs7FCZXpZUnbVN/luKGVbtfw=","X-Report-Abuse":"Please report any abuse attempt to abuse@migadu.com and\n include these headers.","From":"Henrik Grimler <henrik@grimler.se>","To":"Kaustabh Chakraborty <kauschluss@disroot.org>","Cc":"Peng Fan <peng.fan@nxp.com>, u-boot@lists.denx.de,\n Minkyu Kang <mk7.kang@samsung.com>, Tom Rini <trini@konsulko.com>,\n Jaehoon Chung <jh80.chung@samsung.com>, Anand Moon <linux.amoon@gmail.com>,\n Sam Protsenko <semen.protsenko@linaro.org>,\n Lukas Timmermann <uboot@timmermann.space>","Subject":"Re: [PATCH 1/4] mmc: exynos_dw_mmc: add proper init sequence for\n HS400 support","Message-ID":"<20260430172638.GA17167@localhost>","References":"<20260427-dwmmc-exynos-hs400-es-v1-0-3495df40a9ac@disroot.org>\n <20260427-dwmmc-exynos-hs400-es-v1-1-3495df40a9ac@disroot.org>","MIME-Version":"1.0","Content-Type":"text/plain; charset=us-ascii","Content-Disposition":"inline","In-Reply-To":"<20260427-dwmmc-exynos-hs400-es-v1-1-3495df40a9ac@disroot.org>","X-Migadu-Flow":"FLOW_OUT","X-BeenThere":"u-boot@lists.denx.de","X-Mailman-Version":"2.1.39","Precedence":"list","List-Id":"U-Boot discussion <u-boot.lists.denx.de>","List-Unsubscribe":"<https://lists.denx.de/options/u-boot>,\n <mailto:u-boot-request@lists.denx.de?subject=unsubscribe>","List-Archive":"<https://lists.denx.de/pipermail/u-boot/>","List-Post":"<mailto:u-boot@lists.denx.de>","List-Help":"<mailto:u-boot-request@lists.denx.de?subject=help>","List-Subscribe":"<https://lists.denx.de/listinfo/u-boot>,\n <mailto:u-boot-request@lists.denx.de?subject=subscribe>","Errors-To":"u-boot-bounces@lists.denx.de","Sender":"\"U-Boot\" <u-boot-bounces@lists.denx.de>","X-Virus-Scanned":"clamav-milter 0.103.8 at phobos.denx.de","X-Virus-Status":"Clean"}},{"id":3684923,"web_url":"http://patchwork.ozlabs.org/comment/3684923/","msgid":"<DI6QUD531HSA.2VQ3A6S1JC9BC@disroot.org>","list_archive_url":null,"date":"2026-04-30T19:41:29","subject":"Re: [PATCH 1/4] mmc: exynos_dw_mmc: add proper init sequence for\n HS400 support","submitter":{"id":88698,"url":"http://patchwork.ozlabs.org/api/people/88698/","name":"Kaustabh Chakraborty","email":"kauschluss@disroot.org"},"content":"On 2026-04-30 19:26 +02:00, Henrik Grimler wrote:\n> Hi Kaustabh,\n>\n> On Mon, Apr 27, 2026 at 11:22:49AM +0530, Kaustabh Chakraborty wrote:\n>> HS400 support was added, but configuration necessary for HS400 support\n>> was left out. Add necessary changes, which includes:\n>> - Device tree properties, such as \"samsung,dw-mshc-hs400-timing\" and\n>>   \"samsung,read-strobe-delay\", which function as per dt-bindings.\n>> - Registers related to HS400, which are necessary to enable HS400+ support.\n>> - Appropriate timing tunings for the HS400 mode.\n>> \n>> Note that these changes are loosely based off of its Linux kernel\n>> counterpart.\n>> \n>> Fixes: bbe3b9fa0922 (\"mmc: exynos_dw_mmc: add support for MMC HS200 and HS400 modes\")\n>> Signed-off-by: Kaustabh Chakraborty <kauschluss@disroot.org>\n>> ---\n>>  arch/arm/mach-exynos/include/mach/dwmmc.h |  5 ++\n>>  drivers/mmc/exynos_dw_mmc.c               | 80 +++++++++++++++++++++++++++++++\n>>  2 files changed, 85 insertions(+)\n>> \n>> diff --git a/arch/arm/mach-exynos/include/mach/dwmmc.h b/arch/arm/mach-exynos/include/mach/dwmmc.h\n>> index 4432deedef7..50081326c25 100644\n>> --- a/arch/arm/mach-exynos/include/mach/dwmmc.h\n>> +++ b/arch/arm/mach-exynos/include/mach/dwmmc.h\n>> @@ -15,6 +15,11 @@\n>>  #define DWMCI_SET_DRV_CLK(x)\t\t((x) << 16)\n>>  #define DWMCI_SET_DIV_RATIO(x)\t\t((x) << 24)\n>>  \n>> +/* HS400 Related Registers */\n>> +#define DWMCI_HS400_DQS_EN\t\t0x180\n>> +#define DWMCI_HS400_ASYNC_FIFO_CTRL\t0x184\n>> +#define DWMCI_HS400_DLINE_CTRL\t\t0x188\n>> +\n>>  /* Protector Register */\n>>  #define DWMCI_EMMCP_BASE\t\t0x1000\n>>  #define EMMCP_MPSECURITY\t\t(DWMCI_EMMCP_BASE + 0x0010)\n>> diff --git a/drivers/mmc/exynos_dw_mmc.c b/drivers/mmc/exynos_dw_mmc.c\n>> index 7ccd113bd79..d5e90a9bd5c 100644\n>> --- a/drivers/mmc/exynos_dw_mmc.c\n>> +++ b/drivers/mmc/exynos_dw_mmc.c\n>> @@ -8,6 +8,7 @@\n>>  #include <dwmmc.h>\n>>  #include <asm/global_data.h>\n>>  #include <malloc.h>\n>> +#include <mmc.h>\n>>  #include <errno.h>\n>>  #include <asm/arch/dwmmc.h>\n>>  #include <asm/arch/clk.h>\n>> @@ -30,6 +31,14 @@\n>>  #define CLKSEL_UP_SAMPLE(x, y)\t\t(((x) & ~CLKSEL_CCLK_SAMPLE(7)) | \\\n>>  \t\t\t\t\t CLKSEL_CCLK_SAMPLE(y))\n>>  \n>> +/* RCLK_EN register defines */\n>> +#define DATA_STROBE_EN\t\t\tBIT(0)\n>> +#define AXI_NON_BLOCKING_WR\tBIT(7)\n>> +\n>> +/* DLINE_CTRL register defines */\n>> +#define DQS_CTRL_RD_DELAY(x, y)\t\t(((x) & ~0x3FF) | ((y) & 0x3FF))\n>> +#define DQS_CTRL_GET_RD_DELAY(x)\t((x) & 0x3FF)\n>> +\n>>  /**\n>>   * DOC: Quirk flags for different Exynos DW MMC blocks\n>>   *\n>> @@ -71,6 +80,11 @@ struct dwmci_exynos_priv_data {\n>>  \tstruct clk clk;\n>>  \tu32 sdr_timing;\n>>  \tu32 ddr_timing;\n>> +\tu32 hs400_timing;\n>> +\tu32 tuned_sample;\n>> +\tu32 dqs_delay;\n>> +\tu32 saved_dqs_en;\n>> +\tu32 saved_strobe_ctrl;\n>>  \tconst struct exynos_dwmmc_variant *chip;\n>>  };\n>>  \n>> @@ -162,6 +176,27 @@ static u8 exynos_dwmmc_get_ciu_div(struct dwmci_host *host)\n>>  \t\t\t\t& DWMCI_DIVRATIO_MASK) + 1;\n>>  }\n>>  \n>> +static void exynos_config_hs400(struct dwmci_host *host, enum bus_mode mode)\n>> +{\n>> +\tstruct dwmci_exynos_priv_data *priv = exynos_dwmmc_get_priv(host);\n>> +\tu32 dqs, strobe;\n>> +\n>> +\tdqs = priv->saved_dqs_en;\n>> +\tstrobe = priv->saved_strobe_ctrl;\n>> +\n>> +\tswitch (mode) {\n>> +\tcase MMC_HS_400:\n>> +\t\tdqs |= DATA_STROBE_EN;\n>> +\t\tstrobe = DQS_CTRL_RD_DELAY(strobe, priv->dqs_delay);\n>> +\t\tbreak;\n>> +\tdefault:\n>> +\t\tdqs &= ~DATA_STROBE_EN;\n>> +\t}\n>> +\n>> +\tdwmci_writel(host, DWMCI_HS400_DQS_EN, dqs);\n>> +\tdwmci_writel(host, DWMCI_HS400_DLINE_CTRL, strobe);\n>> +}\n>> +\n>>  /* Configure CLKSEL register with chosen timing values */\n>>  static int exynos_dwmci_clksel(struct dwmci_host *host)\n>>  {\n>> @@ -170,6 +205,9 @@ static int exynos_dwmci_clksel(struct dwmci_host *host)\n>>  \tu32 timing;\n>>  \n>>  \tswitch (host->mmc->selected_mode) {\n>> +\tcase MMC_HS_400:\n>> +\t\ttiming = CLKSEL_UP_SAMPLE(priv->hs400_timing, priv->tuned_sample);\n>> +\t\tbreak;\n>>  \tcase MMC_DDR_52:\n>>  \t\ttiming = priv->ddr_timing;\n>>  \t\tbreak;\n>> @@ -186,6 +224,8 @@ static int exynos_dwmci_clksel(struct dwmci_host *host)\n>>  \n>>  \tdwmci_writel(host, priv->chip->clksel, timing);\n>>  \n>> +\texynos_config_hs400(host, host->mmc->selected_mode);\n>> +\n>\n> This breaks emmc in Linux for existing devices without hs400 support:\n> exynos_config_hs400 is run no matter if the dt has the hs400\n> parameters, meaning 0x0 is written to DWMCI_HS400_DQS_EN and\n> DWMCI_HS400_DLINE_CTRL. U-boot does not seem to care, it loads the\n> kernel and initramfs without issues, but Linux later gives errors:\n\nIs it that the same defconfig is used for two devices, one with and one\nwithout HS400 support? If that's the case, guarding the call with\nHS400_SUPPORT config options won't be a real fix.\n\nmmc_of_parse() in mmc-uclass.h seems promising, this needs to be\nintegrated with dwmci_setup_cfg() in dw_mmc.c, and this change _may_ be\nregressive in nature, so I may also need to add some safety guards for\nthis.\n\nI will thus add this patch in the next rev. Would you be up to test the patch\nfor the concerned devices too?\n\n>\n> ```\n> [   20.741025] mmc_host mmc0: Bus speed (slot 0) = 50000000Hz (slot req 400000Hz, actual 396825HZ div = 63)\n> [   20.886686] mmc_host mmc0: Bus speed (slot 0) = 50000000Hz (slot req 52000000Hz, actual 50000000HZ div = 0)\n> [   20.895138] mmc_host mmc0: Bus speed (slot 0) = 200000000Hz (slot req 200000000Hz, actual 200000000HZ div = 0)\n> [   20.905990] mmc_host mmc0: Bus speed (slot 0) = 50000000Hz (slot req 52000000Hz, actual 50000000HZ div = 0)\n> [   20.914988] mmc_host mmc0: Bus speed (slot 0) = 400000000Hz (slot req 200000000Hz, actual 200000000HZ div = 1)\n> [   21.099546] I/O error, dev mmcblk0, sector 1000001 op 0x1:(WRITE) flags 0x800 phys_seg 16 prio class 2\n> [   21.099853] I/O error, dev mmcblk0, sector 1000825 op 0x1:(WRITE) flags 0x800 phys_seg 8 prio class 2\n> [   21.107443] Buffer I/O error on dev mmcblk0p2, logical block 0, lost async page write\n> [   21.107473] Buffer I/O error on dev mmcblk0p2, logical block 1, lost async page write\n> [   21.116657] Buffer I/O error on dev mmcblk0p2, logical block 824, lost async page write\n> [   21.124408] Buffer I/O error on dev mmcblk0p2, logical block 2, lost async page write\n> [   21.132206] Buffer I/O error on dev mmcblk0p2, logical block 825, lost async page write\n> [   21.140178] Buffer I/O error on dev mmcblk0p2, logical block 3, lost async page write\n> [   21.147973] Buffer I/O error on dev mmcblk0p2, logical block 826, lost async page write\n> [   21.155960] Buffer I/O error on dev mmcblk0p2, logical block 4, lost async page write\n> [   21.163749] Buffer I/O error on dev mmcblk0p2, logical block 827, lost async page write\n> [   21.171720] Buffer I/O error on dev mmcblk0p2, logical block 5, lost async page write\n> [   21.200708] I/O error, dev mmcblk0, sector 1000873 op 0x1:(WRITE) flags 0x800 phys_seg 8 prio class 2\n> [   21.201043] I/O error, dev mmcblk0, sector 1000929 op 0x1:(WRITE) flags 0x800 phys_seg 8 prio class 2\n> [   21.218287] I/O error, dev mmcblk0, sector 1000945 op 0x1:(WRITE) flags 0x800 phys_seg 80 prio class 2\n> [   21.218623] I/O error, dev mmcblk0, sector 1001033 op 0x1:(WRITE) flags 0x800 phys_seg 24 prio class 2\n> [   21.236813] I/O error, dev mmcblk0, sector 1001097 op 0x1:(WRITE) flags 0x800 phys_seg 8 prio class 2\n> [   21.237146] I/O error, dev mmcblk0, sector 1001121 op 0x1:(WRITE) flags 0x800 phys_seg 24 prio class 2\n> [   21.255370] I/O error, dev mmcblk0, sector 1001161 op 0x1:(WRITE) flags 0x800 phys_seg 56 prio class 2\n> [   21.256253] I/O error, dev mmcblk0, sector 1001249 op 0x1:(WRITE) flags 0x800 phys_seg 8 prio class 2\n> ```\n>\n> Specifically it seems to be writing 0x0 to DWMCI_HS400_DQS_EN that is\n> the issue, if I comment out that line it works also for my odroid-xu4\n> in non-hs400 mode.\n>\n> Tested on odroid-xu4 with odroid-xu3_defconfig after applying the\n> entire series, without any other changes.\n>\n> Best regards,\n> Henrik Grimler","headers":{"Return-Path":"<u-boot-bounces@lists.denx.de>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming@legolas.ozlabs.org","Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n secure) header.d=disroot.org header.i=@disroot.org header.a=rsa-sha256\n header.s=mail header.b=TO/UQiYk;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de\n (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de;\n envelope-from=u-boot-bounces@lists.denx.de; receiver=patchwork.ozlabs.org)","phobos.denx.de;\n dmarc=pass (p=reject dis=none) header.from=disroot.org","phobos.denx.de;\n spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de","phobos.denx.de;\n\tdkim=pass (2048-bit key;\n secure) header.d=disroot.org header.i=@disroot.org header.b=\"TO/UQiYk\";\n\tdkim-atps=neutral","phobos.denx.de;\n dmarc=pass (p=reject dis=none) header.from=disroot.org","phobos.denx.de;\n spf=pass smtp.mailfrom=kauschluss@disroot.org"],"Received":["from phobos.denx.de (phobos.denx.de\n [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4g64fK0GfXz1yGq\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 01 May 2026 05:55:37 +1000 (AEST)","from h2850616.stratoserver.net (localhost [IPv6:::1])\n\tby phobos.denx.de (Postfix) with ESMTP id E5A278464D;\n\tThu, 30 Apr 2026 21:54:42 +0200 (CEST)","by phobos.denx.de (Postfix, from userid 109)\n id C95B680433; Thu, 30 Apr 2026 21:41:41 +0200 (CEST)","from layka.disroot.org (layka.disroot.org [178.21.23.139])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits))\n (No client certificate requested)\n by phobos.denx.de (Postfix) with ESMTPS id 366CD80086\n for <u-boot@lists.denx.de>; Thu, 30 Apr 2026 21:41:38 +0200 (CEST)","from mail01.disroot.lan (localhost [127.0.0.1])\n by disroot.org (Postfix) with ESMTP id BA40B27121;\n Thu, 30 Apr 2026 21:41:37 +0200 (CEST)","from layka.disroot.org ([127.0.0.1])\n by localhost (disroot.org [127.0.0.1]) (amavis, port 10024) with ESMTP\n id So8omeIaaGkS; Thu, 30 Apr 2026 21:41:37 +0200 (CEST)"],"X-Spam-Checker-Version":"SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de","X-Spam-Level":"","X-Spam-Status":"No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED,\n DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_BLOCKED,\n SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.2","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=disroot.org; s=mail;\n t=1777578097; bh=qawlnzyBSBMS2JuYctE7lJOpfCOFHtpFRKp0Y5brhe4=;\n h=Date:To:Cc:Subject:From:References:In-Reply-To;\n b=TO/UQiYkvDK74V2JcqdOOZQip1jZxJ2NifyWLOpdZZ68Hhl+XcWwCRTFj/iV2HSdU\n tBnozJnJpuSH5aWeZtS/FSWNypYSK2QRXfwlaZy8ncBaEKbSeDjTvjCOFO9Zvh/LTA\n PyjT1JrnzY+ZBaIVbfMiUJVj9U2r6U/qLN5AFemNK6rcY/Uk1axwD5kqrhIDbN47ht\n b49fnHhE48Lk853mig7Zxe/riNmsXDZKocnoY+Tu/+16jA/2pQ4y0va956K4FaQNpZ\n QF3TZZSaTpKUOOHj0KKsPEeVQaHxWTHwbIPqIkJnPog+n4Z1abC+LPjRBPJwOibjG7\n l770x6QV74GRw==","Mime-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","Content-Type":"text/plain; charset=UTF-8","Date":"Fri, 01 May 2026 01:11:29 +0530","Message-Id":"<DI6QUD531HSA.2VQ3A6S1JC9BC@disroot.org>","To":"\"Henrik Grimler\" <henrik@grimler.se>, \"Kaustabh Chakraborty\"\n <kauschluss@disroot.org>","Cc":"\"Peng Fan\" <peng.fan@nxp.com>, <u-boot@lists.denx.de>, \"Minkyu Kang\"\n <mk7.kang@samsung.com>, \"Tom Rini\" <trini@konsulko.com>, \"Jaehoon Chung\"\n <jh80.chung@samsung.com>, \"Anand Moon\" <linux.amoon@gmail.com>, \"Sam\n Protsenko\" <semen.protsenko@linaro.org>, \"Lukas Timmermann\"\n <uboot@timmermann.space>","Subject":"Re: [PATCH 1/4] mmc: exynos_dw_mmc: add proper init sequence for\n HS400 support","From":"\"Kaustabh Chakraborty\" <kauschluss@disroot.org>","References":"<20260427-dwmmc-exynos-hs400-es-v1-0-3495df40a9ac@disroot.org>\n <20260427-dwmmc-exynos-hs400-es-v1-1-3495df40a9ac@disroot.org>\n <20260430172638.GA17167@localhost>","In-Reply-To":"<20260430172638.GA17167@localhost>","X-Mailman-Approved-At":"Thu, 30 Apr 2026 21:54:39 +0200","X-BeenThere":"u-boot@lists.denx.de","X-Mailman-Version":"2.1.39","Precedence":"list","List-Id":"U-Boot discussion <u-boot.lists.denx.de>","List-Unsubscribe":"<https://lists.denx.de/options/u-boot>,\n <mailto:u-boot-request@lists.denx.de?subject=unsubscribe>","List-Archive":"<https://lists.denx.de/pipermail/u-boot/>","List-Post":"<mailto:u-boot@lists.denx.de>","List-Help":"<mailto:u-boot-request@lists.denx.de?subject=help>","List-Subscribe":"<https://lists.denx.de/listinfo/u-boot>,\n <mailto:u-boot-request@lists.denx.de?subject=subscribe>","Errors-To":"u-boot-bounces@lists.denx.de","Sender":"\"U-Boot\" <u-boot-bounces@lists.denx.de>","X-Virus-Scanned":"clamav-milter 0.103.8 at phobos.denx.de","X-Virus-Status":"Clean"}},{"id":3685036,"web_url":"http://patchwork.ozlabs.org/comment/3685036/","msgid":"<20260501065840.GA13244@grimfrac.localdomain>","list_archive_url":null,"date":"2026-05-01T06:58:40","subject":"Re: [PATCH 1/4] mmc: exynos_dw_mmc: add proper init sequence for\n HS400 support","submitter":{"id":83221,"url":"http://patchwork.ozlabs.org/api/people/83221/","name":"Henrik Grimler","email":"henrik@grimler.se"},"content":"Hi Kaustabh,\n\nOn Fri, May 01, 2026 at 01:11:29AM +0530, Kaustabh Chakraborty wrote:\n> On 2026-04-30 19:26 +02:00, Henrik Grimler wrote:\n> > Hi Kaustabh,\n> >\n> > On Mon, Apr 27, 2026 at 11:22:49AM +0530, Kaustabh Chakraborty wrote:\n> >> HS400 support was added, but configuration necessary for HS400 support\n> >> was left out. Add necessary changes, which includes:\n> >> - Device tree properties, such as \"samsung,dw-mshc-hs400-timing\" and\n> >>   \"samsung,read-strobe-delay\", which function as per dt-bindings.\n> >> - Registers related to HS400, which are necessary to enable HS400+ support.\n> >> - Appropriate timing tunings for the HS400 mode.\n> >> \n> >> Note that these changes are loosely based off of its Linux kernel\n> >> counterpart.\n> >> \n> >> Fixes: bbe3b9fa0922 (\"mmc: exynos_dw_mmc: add support for MMC HS200 and HS400 modes\")\n> >> Signed-off-by: Kaustabh Chakraborty <kauschluss@disroot.org>\n> >> ---\n> >>  arch/arm/mach-exynos/include/mach/dwmmc.h |  5 ++\n> >>  drivers/mmc/exynos_dw_mmc.c               | 80 +++++++++++++++++++++++++++++++\n> >>  2 files changed, 85 insertions(+)\n> >> \n> >> diff --git a/arch/arm/mach-exynos/include/mach/dwmmc.h b/arch/arm/mach-exynos/include/mach/dwmmc.h\n> >> index 4432deedef7..50081326c25 100644\n> >> --- a/arch/arm/mach-exynos/include/mach/dwmmc.h\n> >> +++ b/arch/arm/mach-exynos/include/mach/dwmmc.h\n> >> @@ -15,6 +15,11 @@\n> >>  #define DWMCI_SET_DRV_CLK(x)\t\t((x) << 16)\n> >>  #define DWMCI_SET_DIV_RATIO(x)\t\t((x) << 24)\n> >>  \n> >> +/* HS400 Related Registers */\n> >> +#define DWMCI_HS400_DQS_EN\t\t0x180\n> >> +#define DWMCI_HS400_ASYNC_FIFO_CTRL\t0x184\n> >> +#define DWMCI_HS400_DLINE_CTRL\t\t0x188\n> >> +\n> >>  /* Protector Register */\n> >>  #define DWMCI_EMMCP_BASE\t\t0x1000\n> >>  #define EMMCP_MPSECURITY\t\t(DWMCI_EMMCP_BASE + 0x0010)\n> >> diff --git a/drivers/mmc/exynos_dw_mmc.c b/drivers/mmc/exynos_dw_mmc.c\n> >> index 7ccd113bd79..d5e90a9bd5c 100644\n> >> --- a/drivers/mmc/exynos_dw_mmc.c\n> >> +++ b/drivers/mmc/exynos_dw_mmc.c\n> >> @@ -8,6 +8,7 @@\n> >>  #include <dwmmc.h>\n> >>  #include <asm/global_data.h>\n> >>  #include <malloc.h>\n> >> +#include <mmc.h>\n> >>  #include <errno.h>\n> >>  #include <asm/arch/dwmmc.h>\n> >>  #include <asm/arch/clk.h>\n> >> @@ -30,6 +31,14 @@\n> >>  #define CLKSEL_UP_SAMPLE(x, y)\t\t(((x) & ~CLKSEL_CCLK_SAMPLE(7)) | \\\n> >>  \t\t\t\t\t CLKSEL_CCLK_SAMPLE(y))\n> >>  \n> >> +/* RCLK_EN register defines */\n> >> +#define DATA_STROBE_EN\t\t\tBIT(0)\n> >> +#define AXI_NON_BLOCKING_WR\tBIT(7)\n> >> +\n> >> +/* DLINE_CTRL register defines */\n> >> +#define DQS_CTRL_RD_DELAY(x, y)\t\t(((x) & ~0x3FF) | ((y) & 0x3FF))\n> >> +#define DQS_CTRL_GET_RD_DELAY(x)\t((x) & 0x3FF)\n> >> +\n> >>  /**\n> >>   * DOC: Quirk flags for different Exynos DW MMC blocks\n> >>   *\n> >> @@ -71,6 +80,11 @@ struct dwmci_exynos_priv_data {\n> >>  \tstruct clk clk;\n> >>  \tu32 sdr_timing;\n> >>  \tu32 ddr_timing;\n> >> +\tu32 hs400_timing;\n> >> +\tu32 tuned_sample;\n> >> +\tu32 dqs_delay;\n> >> +\tu32 saved_dqs_en;\n> >> +\tu32 saved_strobe_ctrl;\n> >>  \tconst struct exynos_dwmmc_variant *chip;\n> >>  };\n> >>  \n> >> @@ -162,6 +176,27 @@ static u8 exynos_dwmmc_get_ciu_div(struct dwmci_host *host)\n> >>  \t\t\t\t& DWMCI_DIVRATIO_MASK) + 1;\n> >>  }\n> >>  \n> >> +static void exynos_config_hs400(struct dwmci_host *host, enum bus_mode mode)\n> >> +{\n> >> +\tstruct dwmci_exynos_priv_data *priv = exynos_dwmmc_get_priv(host);\n> >> +\tu32 dqs, strobe;\n> >> +\n> >> +\tdqs = priv->saved_dqs_en;\n> >> +\tstrobe = priv->saved_strobe_ctrl;\n> >> +\n> >> +\tswitch (mode) {\n> >> +\tcase MMC_HS_400:\n> >> +\t\tdqs |= DATA_STROBE_EN;\n> >> +\t\tstrobe = DQS_CTRL_RD_DELAY(strobe, priv->dqs_delay);\n> >> +\t\tbreak;\n> >> +\tdefault:\n> >> +\t\tdqs &= ~DATA_STROBE_EN;\n> >> +\t}\n> >> +\n> >> +\tdwmci_writel(host, DWMCI_HS400_DQS_EN, dqs);\n> >> +\tdwmci_writel(host, DWMCI_HS400_DLINE_CTRL, strobe);\n> >> +}\n> >> +\n> >>  /* Configure CLKSEL register with chosen timing values */\n> >>  static int exynos_dwmci_clksel(struct dwmci_host *host)\n> >>  {\n> >> @@ -170,6 +205,9 @@ static int exynos_dwmci_clksel(struct dwmci_host *host)\n> >>  \tu32 timing;\n> >>  \n> >>  \tswitch (host->mmc->selected_mode) {\n> >> +\tcase MMC_HS_400:\n> >> +\t\ttiming = CLKSEL_UP_SAMPLE(priv->hs400_timing, priv->tuned_sample);\n> >> +\t\tbreak;\n> >>  \tcase MMC_DDR_52:\n> >>  \t\ttiming = priv->ddr_timing;\n> >>  \t\tbreak;\n> >> @@ -186,6 +224,8 @@ static int exynos_dwmci_clksel(struct dwmci_host *host)\n> >>  \n> >>  \tdwmci_writel(host, priv->chip->clksel, timing);\n> >>  \n> >> +\texynos_config_hs400(host, host->mmc->selected_mode);\n> >> +\n> >\n> > This breaks emmc in Linux for existing devices without hs400 support:\n> > exynos_config_hs400 is run no matter if the dt has the hs400\n> > parameters, meaning 0x0 is written to DWMCI_HS400_DQS_EN and\n> > DWMCI_HS400_DLINE_CTRL. U-boot does not seem to care, it loads the\n> > kernel and initramfs without issues, but Linux later gives errors:\n> \n> Is it that the same defconfig is used for two devices, one with and one\n> without HS400 support? If that's the case, guarding the call with\n> HS400_SUPPORT config options won't be a real fix.\n\nA family of devices are using the same defconfig. I assume the\nhardware in all of them supports hs400, but at the moment only one\ndevice seems to be configured to use hs400 _in Linux_, and none in\nu-boot.\n\nAdding a config guard around exynos_config_hs400() would probably\nwork. I see Linux uses a check like\nif (priv->ctrl_type >= DW_MCI_TYPE_EXYNOS5420)\ninstead.\n\n> mmc_of_parse() in mmc-uclass.h seems promising, this needs to be\n> integrated with dwmci_setup_cfg() in dw_mmc.c, and this change _may_ be\n> regressive in nature, so I may also need to add some safety guards for\n> this.\n> \n> I will thus add this patch in the next rev. Would you be up to test the patch\n> for the concerned devices too?\n\nYeah I can test on these older devices.\n\nBest regards,\nHenrik Grimler\n\n> >\n> > ```\n> > [   20.741025] mmc_host mmc0: Bus speed (slot 0) = 50000000Hz (slot req 400000Hz, actual 396825HZ div = 63)\n> > [   20.886686] mmc_host mmc0: Bus speed (slot 0) = 50000000Hz (slot req 52000000Hz, actual 50000000HZ div = 0)\n> > [   20.895138] mmc_host mmc0: Bus speed (slot 0) = 200000000Hz (slot req 200000000Hz, actual 200000000HZ div = 0)\n> > [   20.905990] mmc_host mmc0: Bus speed (slot 0) = 50000000Hz (slot req 52000000Hz, actual 50000000HZ div = 0)\n> > [   20.914988] mmc_host mmc0: Bus speed (slot 0) = 400000000Hz (slot req 200000000Hz, actual 200000000HZ div = 1)\n> > [   21.099546] I/O error, dev mmcblk0, sector 1000001 op 0x1:(WRITE) flags 0x800 phys_seg 16 prio class 2\n> > [   21.099853] I/O error, dev mmcblk0, sector 1000825 op 0x1:(WRITE) flags 0x800 phys_seg 8 prio class 2\n> > [   21.107443] Buffer I/O error on dev mmcblk0p2, logical block 0, lost async page write\n> > [   21.107473] Buffer I/O error on dev mmcblk0p2, logical block 1, lost async page write\n> > [   21.116657] Buffer I/O error on dev mmcblk0p2, logical block 824, lost async page write\n> > [   21.124408] Buffer I/O error on dev mmcblk0p2, logical block 2, lost async page write\n> > [   21.132206] Buffer I/O error on dev mmcblk0p2, logical block 825, lost async page write\n> > [   21.140178] Buffer I/O error on dev mmcblk0p2, logical block 3, lost async page write\n> > [   21.147973] Buffer I/O error on dev mmcblk0p2, logical block 826, lost async page write\n> > [   21.155960] Buffer I/O error on dev mmcblk0p2, logical block 4, lost async page write\n> > [   21.163749] Buffer I/O error on dev mmcblk0p2, logical block 827, lost async page write\n> > [   21.171720] Buffer I/O error on dev mmcblk0p2, logical block 5, lost async page write\n> > [   21.200708] I/O error, dev mmcblk0, sector 1000873 op 0x1:(WRITE) flags 0x800 phys_seg 8 prio class 2\n> > [   21.201043] I/O error, dev mmcblk0, sector 1000929 op 0x1:(WRITE) flags 0x800 phys_seg 8 prio class 2\n> > [   21.218287] I/O error, dev mmcblk0, sector 1000945 op 0x1:(WRITE) flags 0x800 phys_seg 80 prio class 2\n> > [   21.218623] I/O error, dev mmcblk0, sector 1001033 op 0x1:(WRITE) flags 0x800 phys_seg 24 prio class 2\n> > [   21.236813] I/O error, dev mmcblk0, sector 1001097 op 0x1:(WRITE) flags 0x800 phys_seg 8 prio class 2\n> > [   21.237146] I/O error, dev mmcblk0, sector 1001121 op 0x1:(WRITE) flags 0x800 phys_seg 24 prio class 2\n> > [   21.255370] I/O error, dev mmcblk0, sector 1001161 op 0x1:(WRITE) flags 0x800 phys_seg 56 prio class 2\n> > [   21.256253] I/O error, dev mmcblk0, sector 1001249 op 0x1:(WRITE) flags 0x800 phys_seg 8 prio class 2\n> > ```\n> >\n> > Specifically it seems to be writing 0x0 to DWMCI_HS400_DQS_EN that is\n> > the issue, if I comment out that line it works also for my odroid-xu4\n> > in non-hs400 mode.\n> >\n> > Tested on odroid-xu4 with odroid-xu3_defconfig after applying the\n> > entire series, without any other changes.\n> >\n> > Best regards,\n> > Henrik Grimler\n>","headers":{"Return-Path":"<u-boot-bounces@lists.denx.de>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming@legolas.ozlabs.org","Authentication-Results":["legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de\n (client-ip=85.214.62.61; helo=phobos.denx.de;\n envelope-from=u-boot-bounces@lists.denx.de; receiver=patchwork.ozlabs.org)","phobos.denx.de;\n dmarc=pass (p=quarantine dis=none) header.from=grimler.se","phobos.denx.de;\n spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de","phobos.denx.de;\n\tdkim=pass (1024-bit key;\n secure) header.d=grimler.se header.i=@grimler.se header.b=\"c7IsXE5a\";\n\tdkim-atps=neutral","phobos.denx.de; dmarc=pass (p=quarantine dis=none)\n header.from=grimler.se","phobos.denx.de;\n spf=pass smtp.mailfrom=henrik@grimler.se"],"Received":["from phobos.denx.de (phobos.denx.de [85.214.62.61])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4g6MNG42Mbz1y04\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 01 May 2026 16:59:26 +1000 (AEST)","from h2850616.stratoserver.net (localhost [IPv6:::1])\n\tby phobos.denx.de (Postfix) with ESMTP id 727F784227;\n\tFri,  1 May 2026 08:59:24 +0200 (CEST)","by phobos.denx.de (Postfix, from userid 109)\n id 209FD841D7; Fri,  1 May 2026 08:59:23 +0200 (CEST)","from out-183.mta1.migadu.com (out-183.mta1.migadu.com\n [95.215.58.183])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits))\n (No client certificate requested)\n by phobos.denx.de (Postfix) with ESMTPS id 94F00803C6\n for <u-boot@lists.denx.de>; Fri,  1 May 2026 08:59:20 +0200 (CEST)"],"X-Spam-Checker-Version":"SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de","X-Spam-Level":"","X-Spam-Status":"No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED,\n DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_BLOCKED,\n SPF_HELO_PASS,SPF_PASS autolearn=ham autolearn_force=no version=3.4.2","Date":"Fri, 1 May 2026 08:58:40 +0200","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=grimler.se; s=key1;\n t=1777618760;\n h=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n to:to:cc:cc:mime-version:mime-version:content-type:content-type:\n in-reply-to:in-reply-to:references:references;\n bh=mNQngtuH8M7lh5jWtTuTLt+amxGOgNegZ0HcvThH7J4=;\n b=c7IsXE5adjEEeTwJ+oPJGFizLAxEpM3yuHRB89QdZocwaaLdjHgt8B+EvIrdRQ2+5z/+8G\n ITWlOfVmn6u/+wR+nmY227NG8ZPBKoHkR4zWtK31KSyBtGUYv35Ky1zleMg/AvgCMjh03N\n d7e9KR2xjBWSJCaC/Bc5jRRA5SY3/nM=","X-Report-Abuse":"Please report any abuse attempt to abuse@migadu.com and\n include these headers.","From":"Henrik Grimler <henrik@grimler.se>","To":"Kaustabh Chakraborty <kauschluss@disroot.org>","Cc":"Peng Fan <peng.fan@nxp.com>, u-boot@lists.denx.de,\n Minkyu Kang <mk7.kang@samsung.com>, Tom Rini <trini@konsulko.com>,\n Jaehoon Chung <jh80.chung@samsung.com>, Anand Moon <linux.amoon@gmail.com>,\n Sam Protsenko <semen.protsenko@linaro.org>,\n Lukas Timmermann <uboot@timmermann.space>","Subject":"Re: [PATCH 1/4] mmc: exynos_dw_mmc: add proper init sequence for\n HS400 support","Message-ID":"<20260501065840.GA13244@grimfrac.localdomain>","References":"<20260427-dwmmc-exynos-hs400-es-v1-0-3495df40a9ac@disroot.org>\n <20260427-dwmmc-exynos-hs400-es-v1-1-3495df40a9ac@disroot.org>\n <20260430172638.GA17167@localhost>\n <DI6QUD531HSA.2VQ3A6S1JC9BC@disroot.org>","MIME-Version":"1.0","Content-Type":"text/plain; charset=us-ascii","Content-Disposition":"inline","In-Reply-To":"<DI6QUD531HSA.2VQ3A6S1JC9BC@disroot.org>","X-Migadu-Flow":"FLOW_OUT","X-BeenThere":"u-boot@lists.denx.de","X-Mailman-Version":"2.1.39","Precedence":"list","List-Id":"U-Boot discussion <u-boot.lists.denx.de>","List-Unsubscribe":"<https://lists.denx.de/options/u-boot>,\n <mailto:u-boot-request@lists.denx.de?subject=unsubscribe>","List-Archive":"<https://lists.denx.de/pipermail/u-boot/>","List-Post":"<mailto:u-boot@lists.denx.de>","List-Help":"<mailto:u-boot-request@lists.denx.de?subject=help>","List-Subscribe":"<https://lists.denx.de/listinfo/u-boot>,\n <mailto:u-boot-request@lists.denx.de?subject=subscribe>","Errors-To":"u-boot-bounces@lists.denx.de","Sender":"\"U-Boot\" <u-boot-bounces@lists.denx.de>","X-Virus-Scanned":"clamav-milter 0.103.8 at phobos.denx.de","X-Virus-Status":"Clean"}},{"id":3685115,"web_url":"http://patchwork.ozlabs.org/comment/3685115/","msgid":"<DI77VWX0XZXF.2H0WQMKJ4UWKT@disroot.org>","list_archive_url":null,"date":"2026-05-01T09:02:50","subject":"Re: [PATCH 1/4] mmc: exynos_dw_mmc: add proper init sequence for\n HS400 support","submitter":{"id":88698,"url":"http://patchwork.ozlabs.org/api/people/88698/","name":"Kaustabh Chakraborty","email":"kauschluss@disroot.org"},"content":"On 2026-05-01 08:58 +02:00, Henrik Grimler wrote:\n> Hi Kaustabh,\n>\n> On Fri, May 01, 2026 at 01:11:29AM +0530, Kaustabh Chakraborty wrote:\n>> On 2026-04-30 19:26 +02:00, Henrik Grimler wrote:\n>> > Hi Kaustabh,\n>> >\n>> > On Mon, Apr 27, 2026 at 11:22:49AM +0530, Kaustabh Chakraborty wrote:\n>> >> HS400 support was added, but configuration necessary for HS400 support\n>> >> was left out. Add necessary changes, which includes:\n>> >> - Device tree properties, such as \"samsung,dw-mshc-hs400-timing\" and\n>> >>   \"samsung,read-strobe-delay\", which function as per dt-bindings.\n>> >> - Registers related to HS400, which are necessary to enable HS400+ support.\n>> >> - Appropriate timing tunings for the HS400 mode.\n>> >> \n>> >> Note that these changes are loosely based off of its Linux kernel\n>> >> counterpart.\n>> >> \n>> >> Fixes: bbe3b9fa0922 (\"mmc: exynos_dw_mmc: add support for MMC HS200 and HS400 modes\")\n>> >> Signed-off-by: Kaustabh Chakraborty <kauschluss@disroot.org>\n>> >> ---\n>> >>  arch/arm/mach-exynos/include/mach/dwmmc.h |  5 ++\n>> >>  drivers/mmc/exynos_dw_mmc.c               | 80 +++++++++++++++++++++++++++++++\n>> >>  2 files changed, 85 insertions(+)\n>> >> \n>> >> diff --git a/arch/arm/mach-exynos/include/mach/dwmmc.h b/arch/arm/mach-exynos/include/mach/dwmmc.h\n>> >> index 4432deedef7..50081326c25 100644\n>> >> --- a/arch/arm/mach-exynos/include/mach/dwmmc.h\n>> >> +++ b/arch/arm/mach-exynos/include/mach/dwmmc.h\n>> >> @@ -15,6 +15,11 @@\n>> >>  #define DWMCI_SET_DRV_CLK(x)\t\t((x) << 16)\n>> >>  #define DWMCI_SET_DIV_RATIO(x)\t\t((x) << 24)\n>> >>  \n>> >> +/* HS400 Related Registers */\n>> >> +#define DWMCI_HS400_DQS_EN\t\t0x180\n>> >> +#define DWMCI_HS400_ASYNC_FIFO_CTRL\t0x184\n>> >> +#define DWMCI_HS400_DLINE_CTRL\t\t0x188\n>> >> +\n>> >>  /* Protector Register */\n>> >>  #define DWMCI_EMMCP_BASE\t\t0x1000\n>> >>  #define EMMCP_MPSECURITY\t\t(DWMCI_EMMCP_BASE + 0x0010)\n>> >> diff --git a/drivers/mmc/exynos_dw_mmc.c b/drivers/mmc/exynos_dw_mmc.c\n>> >> index 7ccd113bd79..d5e90a9bd5c 100644\n>> >> --- a/drivers/mmc/exynos_dw_mmc.c\n>> >> +++ b/drivers/mmc/exynos_dw_mmc.c\n>> >> @@ -8,6 +8,7 @@\n>> >>  #include <dwmmc.h>\n>> >>  #include <asm/global_data.h>\n>> >>  #include <malloc.h>\n>> >> +#include <mmc.h>\n>> >>  #include <errno.h>\n>> >>  #include <asm/arch/dwmmc.h>\n>> >>  #include <asm/arch/clk.h>\n>> >> @@ -30,6 +31,14 @@\n>> >>  #define CLKSEL_UP_SAMPLE(x, y)\t\t(((x) & ~CLKSEL_CCLK_SAMPLE(7)) | \\\n>> >>  \t\t\t\t\t CLKSEL_CCLK_SAMPLE(y))\n>> >>  \n>> >> +/* RCLK_EN register defines */\n>> >> +#define DATA_STROBE_EN\t\t\tBIT(0)\n>> >> +#define AXI_NON_BLOCKING_WR\tBIT(7)\n>> >> +\n>> >> +/* DLINE_CTRL register defines */\n>> >> +#define DQS_CTRL_RD_DELAY(x, y)\t\t(((x) & ~0x3FF) | ((y) & 0x3FF))\n>> >> +#define DQS_CTRL_GET_RD_DELAY(x)\t((x) & 0x3FF)\n>> >> +\n>> >>  /**\n>> >>   * DOC: Quirk flags for different Exynos DW MMC blocks\n>> >>   *\n>> >> @@ -71,6 +80,11 @@ struct dwmci_exynos_priv_data {\n>> >>  \tstruct clk clk;\n>> >>  \tu32 sdr_timing;\n>> >>  \tu32 ddr_timing;\n>> >> +\tu32 hs400_timing;\n>> >> +\tu32 tuned_sample;\n>> >> +\tu32 dqs_delay;\n>> >> +\tu32 saved_dqs_en;\n>> >> +\tu32 saved_strobe_ctrl;\n>> >>  \tconst struct exynos_dwmmc_variant *chip;\n>> >>  };\n>> >>  \n>> >> @@ -162,6 +176,27 @@ static u8 exynos_dwmmc_get_ciu_div(struct dwmci_host *host)\n>> >>  \t\t\t\t& DWMCI_DIVRATIO_MASK) + 1;\n>> >>  }\n>> >>  \n>> >> +static void exynos_config_hs400(struct dwmci_host *host, enum bus_mode mode)\n>> >> +{\n>> >> +\tstruct dwmci_exynos_priv_data *priv = exynos_dwmmc_get_priv(host);\n>> >> +\tu32 dqs, strobe;\n>> >> +\n>> >> +\tdqs = priv->saved_dqs_en;\n>> >> +\tstrobe = priv->saved_strobe_ctrl;\n>> >> +\n>> >> +\tswitch (mode) {\n>> >> +\tcase MMC_HS_400:\n>> >> +\t\tdqs |= DATA_STROBE_EN;\n>> >> +\t\tstrobe = DQS_CTRL_RD_DELAY(strobe, priv->dqs_delay);\n>> >> +\t\tbreak;\n>> >> +\tdefault:\n>> >> +\t\tdqs &= ~DATA_STROBE_EN;\n>> >> +\t}\n>> >> +\n>> >> +\tdwmci_writel(host, DWMCI_HS400_DQS_EN, dqs);\n>> >> +\tdwmci_writel(host, DWMCI_HS400_DLINE_CTRL, strobe);\n>> >> +}\n>> >> +\n>> >>  /* Configure CLKSEL register with chosen timing values */\n>> >>  static int exynos_dwmci_clksel(struct dwmci_host *host)\n>> >>  {\n>> >> @@ -170,6 +205,9 @@ static int exynos_dwmci_clksel(struct dwmci_host *host)\n>> >>  \tu32 timing;\n>> >>  \n>> >>  \tswitch (host->mmc->selected_mode) {\n>> >> +\tcase MMC_HS_400:\n>> >> +\t\ttiming = CLKSEL_UP_SAMPLE(priv->hs400_timing, priv->tuned_sample);\n>> >> +\t\tbreak;\n>> >>  \tcase MMC_DDR_52:\n>> >>  \t\ttiming = priv->ddr_timing;\n>> >>  \t\tbreak;\n>> >> @@ -186,6 +224,8 @@ static int exynos_dwmci_clksel(struct dwmci_host *host)\n>> >>  \n>> >>  \tdwmci_writel(host, priv->chip->clksel, timing);\n>> >>  \n>> >> +\texynos_config_hs400(host, host->mmc->selected_mode);\n>> >> +\n>> >\n>> > This breaks emmc in Linux for existing devices without hs400 support:\n>> > exynos_config_hs400 is run no matter if the dt has the hs400\n>> > parameters, meaning 0x0 is written to DWMCI_HS400_DQS_EN and\n>> > DWMCI_HS400_DLINE_CTRL. U-boot does not seem to care, it loads the\n>> > kernel and initramfs without issues, but Linux later gives errors:\n>> \n>> Is it that the same defconfig is used for two devices, one with and one\n>> without HS400 support? If that's the case, guarding the call with\n>> HS400_SUPPORT config options won't be a real fix.\n>\n> A family of devices are using the same defconfig. I assume the\n> hardware in all of them supports hs400, but at the moment only one\n> device seems to be configured to use hs400 _in Linux_, and none in\n> u-boot.\n\nIt won't. If one of the devices supports HS400 and others don't (not\nspecifically in your case, but a general scenario), then the config\nwould have HS400 support enabled. As a result non-HS400 hardware would\nalso try to assume HS400.\n\n>\n> Adding a config guard around exynos_config_hs400() would probably\n> work. I see Linux uses a check like\n> if (priv->ctrl_type >= DW_MCI_TYPE_EXYNOS5420)\n> instead.\n>\n>> mmc_of_parse() in mmc-uclass.h seems promising, this needs to be\n>> integrated with dwmci_setup_cfg() in dw_mmc.c, and this change _may_ be\n>> regressive in nature, so I may also need to add some safety guards for\n>> this.\n>> \n>> I will thus add this patch in the next rev. Would you be up to test the patch\n>> for the concerned devices too?\n>\n> Yeah I can test on these older devices.\n>\n> Best regards,\n> Henrik Grimler\n>\n>> >\n>> > ```\n>> > [   20.741025] mmc_host mmc0: Bus speed (slot 0) = 50000000Hz (slot req 400000Hz, actual 396825HZ div = 63)\n>> > [   20.886686] mmc_host mmc0: Bus speed (slot 0) = 50000000Hz (slot req 52000000Hz, actual 50000000HZ div = 0)\n>> > [   20.895138] mmc_host mmc0: Bus speed (slot 0) = 200000000Hz (slot req 200000000Hz, actual 200000000HZ div = 0)\n>> > [   20.905990] mmc_host mmc0: Bus speed (slot 0) = 50000000Hz (slot req 52000000Hz, actual 50000000HZ div = 0)\n>> > [   20.914988] mmc_host mmc0: Bus speed (slot 0) = 400000000Hz (slot req 200000000Hz, actual 200000000HZ div = 1)\n>> > [   21.099546] I/O error, dev mmcblk0, sector 1000001 op 0x1:(WRITE) flags 0x800 phys_seg 16 prio class 2\n>> > [   21.099853] I/O error, dev mmcblk0, sector 1000825 op 0x1:(WRITE) flags 0x800 phys_seg 8 prio class 2\n>> > [   21.107443] Buffer I/O error on dev mmcblk0p2, logical block 0, lost async page write\n>> > [   21.107473] Buffer I/O error on dev mmcblk0p2, logical block 1, lost async page write\n>> > [   21.116657] Buffer I/O error on dev mmcblk0p2, logical block 824, lost async page write\n>> > [   21.124408] Buffer I/O error on dev mmcblk0p2, logical block 2, lost async page write\n>> > [   21.132206] Buffer I/O error on dev mmcblk0p2, logical block 825, lost async page write\n>> > [   21.140178] Buffer I/O error on dev mmcblk0p2, logical block 3, lost async page write\n>> > [   21.147973] Buffer I/O error on dev mmcblk0p2, logical block 826, lost async page write\n>> > [   21.155960] Buffer I/O error on dev mmcblk0p2, logical block 4, lost async page write\n>> > [   21.163749] Buffer I/O error on dev mmcblk0p2, logical block 827, lost async page write\n>> > [   21.171720] Buffer I/O error on dev mmcblk0p2, logical block 5, lost async page write\n>> > [   21.200708] I/O error, dev mmcblk0, sector 1000873 op 0x1:(WRITE) flags 0x800 phys_seg 8 prio class 2\n>> > [   21.201043] I/O error, dev mmcblk0, sector 1000929 op 0x1:(WRITE) flags 0x800 phys_seg 8 prio class 2\n>> > [   21.218287] I/O error, dev mmcblk0, sector 1000945 op 0x1:(WRITE) flags 0x800 phys_seg 80 prio class 2\n>> > [   21.218623] I/O error, dev mmcblk0, sector 1001033 op 0x1:(WRITE) flags 0x800 phys_seg 24 prio class 2\n>> > [   21.236813] I/O error, dev mmcblk0, sector 1001097 op 0x1:(WRITE) flags 0x800 phys_seg 8 prio class 2\n>> > [   21.237146] I/O error, dev mmcblk0, sector 1001121 op 0x1:(WRITE) flags 0x800 phys_seg 24 prio class 2\n>> > [   21.255370] I/O error, dev mmcblk0, sector 1001161 op 0x1:(WRITE) flags 0x800 phys_seg 56 prio class 2\n>> > [   21.256253] I/O error, dev mmcblk0, sector 1001249 op 0x1:(WRITE) flags 0x800 phys_seg 8 prio class 2\n>> > ```\n>> >\n>> > Specifically it seems to be writing 0x0 to DWMCI_HS400_DQS_EN that is\n>> > the issue, if I comment out that line it works also for my odroid-xu4\n>> > in non-hs400 mode.\n>> >\n>> > Tested on odroid-xu4 with odroid-xu3_defconfig after applying the\n>> > entire series, without any other changes.\n>> >\n>> > Best regards,\n>> > Henrik Grimler\n>>","headers":{"Return-Path":"<u-boot-bounces@lists.denx.de>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming@legolas.ozlabs.org","Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n secure) header.d=disroot.org header.i=@disroot.org header.a=rsa-sha256\n header.s=mail header.b=X+SLOhzM;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de\n (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de;\n envelope-from=u-boot-bounces@lists.denx.de; receiver=patchwork.ozlabs.org)","phobos.denx.de;\n dmarc=pass (p=reject dis=none) header.from=disroot.org","phobos.denx.de;\n spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de","phobos.denx.de;\n\tdkim=pass (2048-bit key;\n secure) header.d=disroot.org header.i=@disroot.org header.b=\"X+SLOhzM\";\n\tdkim-atps=neutral","phobos.denx.de;\n dmarc=pass (p=reject dis=none) header.from=disroot.org","phobos.denx.de;\n spf=pass smtp.mailfrom=kauschluss@disroot.org"],"Received":["from phobos.denx.de (phobos.denx.de\n [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4g6Vvm0D3cz1y04\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 01 May 2026 22:38:44 +1000 (AEST)","from h2850616.stratoserver.net (localhost [IPv6:::1])\n\tby phobos.denx.de (Postfix) with ESMTP id 0D717844CF;\n\tFri,  1 May 2026 14:38:19 +0200 (CEST)","by phobos.denx.de (Postfix, from userid 109)\n id D17E980F0E; Fri,  1 May 2026 11:03:01 +0200 (CEST)","from layka.disroot.org (layka.disroot.org [178.21.23.139])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits))\n (No client certificate requested)\n by phobos.denx.de (Postfix) with ESMTPS id 8502480086\n for <u-boot@lists.denx.de>; Fri,  1 May 2026 11:02:59 +0200 (CEST)","from mail01.disroot.lan (localhost [127.0.0.1])\n by disroot.org (Postfix) with ESMTP id 0E37726F41;\n Fri,  1 May 2026 11:02:59 +0200 (CEST)","from layka.disroot.org ([127.0.0.1])\n by localhost (disroot.org [127.0.0.1]) (amavis, port 10024) with ESMTP\n id leC32887GL_J; Fri,  1 May 2026 11:02:58 +0200 (CEST)"],"X-Spam-Checker-Version":"SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de","X-Spam-Level":"","X-Spam-Status":"No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED,\n DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_BLOCKED,\n SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.2","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=disroot.org; s=mail;\n t=1777626178; bh=Y2Hmj/CaXM9r1J/6oC1cxO5FrRgdUkXs4Sa5w6zbxFc=;\n h=Date:Cc:Subject:From:To:References:In-Reply-To;\n b=X+SLOhzMZnOaQk+DZe9OOkR5CenqrmHFH2Ar2GlnGJq3E6KJjsFxTq5bG0IsQWysZ\n Pk5j1SHE8H6/iLF0xYFvSYJGJaNlvmAzKaU4z17YGA3Ct89TDxnpOnkmsFuNN0BaL+\n qa6SfrjA2EH3mMm6SXFGTl70sX8dcdoe71HdoGmCeva9lT60NkNj+GkSzCBYpLLN4D\n FRexNlEnXaT9Welpvmja97nmY9fhxfJ7HiWU7sWZuYd4iTPtO4fkYB+r97oqcE89RH\n scshkFnTYqZRiY7/yA3QZZPeMR63CEHAurVPT6U/kPP94xXn6Nr4gKMZfadlpqrwWv\n UxEkG540a5TUQ==","Mime-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","Content-Type":"text/plain; charset=UTF-8","Date":"Fri, 01 May 2026 14:32:50 +0530","Message-Id":"<DI77VWX0XZXF.2H0WQMKJ4UWKT@disroot.org>","Cc":"\"Peng Fan\" <peng.fan@nxp.com>, <u-boot@lists.denx.de>, \"Minkyu Kang\"\n <mk7.kang@samsung.com>, \"Tom Rini\" <trini@konsulko.com>, \"Jaehoon Chung\"\n <jh80.chung@samsung.com>, \"Anand Moon\" <linux.amoon@gmail.com>, \"Sam\n Protsenko\" <semen.protsenko@linaro.org>, \"Lukas Timmermann\"\n <uboot@timmermann.space>","Subject":"Re: [PATCH 1/4] mmc: exynos_dw_mmc: add proper init sequence for\n HS400 support","From":"\"Kaustabh Chakraborty\" <kauschluss@disroot.org>","To":"\"Henrik Grimler\" <henrik@grimler.se>, \"Kaustabh Chakraborty\"\n <kauschluss@disroot.org>","References":"<20260427-dwmmc-exynos-hs400-es-v1-0-3495df40a9ac@disroot.org>\n <20260427-dwmmc-exynos-hs400-es-v1-1-3495df40a9ac@disroot.org>\n <20260430172638.GA17167@localhost> <DI6QUD531HSA.2VQ3A6S1JC9BC@disroot.org>\n <20260501065840.GA13244@grimfrac.localdomain>","In-Reply-To":"<20260501065840.GA13244@grimfrac.localdomain>","X-Mailman-Approved-At":"Fri, 01 May 2026 14:38:15 +0200","X-BeenThere":"u-boot@lists.denx.de","X-Mailman-Version":"2.1.39","Precedence":"list","List-Id":"U-Boot discussion <u-boot.lists.denx.de>","List-Unsubscribe":"<https://lists.denx.de/options/u-boot>,\n <mailto:u-boot-request@lists.denx.de?subject=unsubscribe>","List-Archive":"<https://lists.denx.de/pipermail/u-boot/>","List-Post":"<mailto:u-boot@lists.denx.de>","List-Help":"<mailto:u-boot-request@lists.denx.de?subject=help>","List-Subscribe":"<https://lists.denx.de/listinfo/u-boot>,\n <mailto:u-boot-request@lists.denx.de?subject=subscribe>","Errors-To":"u-boot-bounces@lists.denx.de","Sender":"\"U-Boot\" <u-boot-bounces@lists.denx.de>","X-Virus-Scanned":"clamav-milter 0.103.8 at phobos.denx.de","X-Virus-Status":"Clean"}}]