diff mbox series

[U-Boot] pico-imx6ul: Fix eMMC boot after DM_MMC conversion

Message ID 20190321135906.13704-1-festevam@gmail.com
State Accepted
Commit 9b8d9ec41a6f161d53d32bf71f79332236b44ba1
Delegated to: Stefano Babic
Headers show
Series [U-Boot] pico-imx6ul: Fix eMMC boot after DM_MMC conversion | expand

Commit Message

Fabio Estevam March 21, 2019, 1:59 p.m. UTC
After the DM_MMC conversion the following eMMC boot error is observed:

U-Boot SPL 2019.04-rc4 (Mar 20 2019 - 18:53:28 +0000)
Trying to boot from MMC1
MMC Device 0 not found
spl: could not find mmc device 0. error: -19
SPL: failed to boot from all boot devices
### ERROR ### Please RESET the board ###

This happens because the SPL code does not initialize the SDHC pins
and clock.

Fix it by moving the original eMMC initialization from U-Boot proper
to SPL.

Reported-by: Otavio Salvador <otavio@ossystems.com.br>
Signed-off-by: Fabio Estevam <festevam@gmail.com>
Tested-by: Fabio Berton <fabio.berton@ossystems.com.br>
Reviewed-by: Otavio Salvador <otavio@ossystems.com.br>
---
 board/technexion/pico-imx6ul/spl.c | 34 ++++++++++++++++++++++++++++++
 1 file changed, 34 insertions(+)

Comments

Lukasz Majewski March 27, 2019, 9:23 a.m. UTC | #1
Hi Fabio,

> After the DM_MMC conversion the following eMMC boot error is observed:
> 
> U-Boot SPL 2019.04-rc4 (Mar 20 2019 - 18:53:28 +0000)
> Trying to boot from MMC1
> MMC Device 0 not found
> spl: could not find mmc device 0. error: -19
> SPL: failed to boot from all boot devices
> ### ERROR ### Please RESET the board ###
> 
> This happens because the SPL code does not initialize the SDHC pins
> and clock.
> 
> Fix it by moving the original eMMC initialization from U-Boot proper
> to SPL.
> 
> Reported-by: Otavio Salvador <otavio@ossystems.com.br>
> Signed-off-by: Fabio Estevam <festevam@gmail.com>
> Tested-by: Fabio Berton <fabio.berton@ossystems.com.br>
> Reviewed-by: Otavio Salvador <otavio@ossystems.com.br>
> ---
>  board/technexion/pico-imx6ul/spl.c | 34
> ++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+)
> 
> diff --git a/board/technexion/pico-imx6ul/spl.c
> b/board/technexion/pico-imx6ul/spl.c index 6464a32d3b..f972cc9eaf
> 100644 --- a/board/technexion/pico-imx6ul/spl.c
> +++ b/board/technexion/pico-imx6ul/spl.c
> @@ -10,6 +10,7 @@
>  #include <asm/gpio.h>
>  #include <asm/mach-imx/iomux-v3.h>
>  #include <asm/mach-imx/boot_mode.h>
> +#include <fsl_esdhc.h>
>  #include <linux/libfdt.h>
>  #include <spl.h>
>  
> @@ -141,4 +142,37 @@ void board_init_f(ulong dummy)
>  void reset_cpu(ulong addr)
>  {
>  }
> +
> +#define USDHC_PAD_CTRL (PAD_CTL_PKE | PAD_CTL_PUE |		\
> +	PAD_CTL_PUS_22K_UP  | PAD_CTL_SPEED_LOW |		\
> +	PAD_CTL_DSE_80ohm   | PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
> +
> +static iomux_v3_cfg_t const usdhc1_pads[] = {
> +	MX6_PAD_SD1_CLK__USDHC1_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL),
> +	MX6_PAD_SD1_CMD__USDHC1_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL),
> +	MX6_PAD_SD1_DATA0__USDHC1_DATA0 |
> MUX_PAD_CTRL(USDHC_PAD_CTRL),
> +	MX6_PAD_SD1_DATA1__USDHC1_DATA1 |
> MUX_PAD_CTRL(USDHC_PAD_CTRL),
> +	MX6_PAD_SD1_DATA2__USDHC1_DATA2 |
> MUX_PAD_CTRL(USDHC_PAD_CTRL),
> +	MX6_PAD_SD1_DATA3__USDHC1_DATA3 |
> MUX_PAD_CTRL(USDHC_PAD_CTRL),
> +	MX6_PAD_NAND_READY_B__USDHC1_DATA4 |
> MUX_PAD_CTRL(USDHC_PAD_CTRL),
> +	MX6_PAD_NAND_CE0_B__USDHC1_DATA5 |
> MUX_PAD_CTRL(USDHC_PAD_CTRL),
> +	MX6_PAD_NAND_CE1_B__USDHC1_DATA6 |
> MUX_PAD_CTRL(USDHC_PAD_CTRL),
> +	MX6_PAD_NAND_CLE__USDHC1_DATA7 |
> MUX_PAD_CTRL(USDHC_PAD_CTRL), +};
> +
> +static struct fsl_esdhc_cfg usdhc_cfg[1] = {
> +	{USDHC1_BASE_ADDR},
> +};
> +
> +int board_mmc_getcd(struct mmc *mmc)
> +{
> +	return 1;
> +}
> +
> +int board_mmc_init(bd_t *bis)
> +{
> +	imx_iomux_v3_setup_multiple_pads(usdhc1_pads,
> ARRAY_SIZE(usdhc1_pads));
> +	usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC_CLK);
> +	return fsl_esdhc_initialize(bis, &usdhc_cfg[0]);
> +}
>  #endif

This seems like a temporary solution - the u-boot proper is converted
to use DM_MMC, but the pinmux setup code is moved to SPL instead.

The proper solution would be to add support for pinmux in SPL and
setup those pins there.

Something similar to:
http://patchwork.ozlabs.org/cover/1019842/

But this patch series shall not be regarded as a template for the
conversion as some of those patches have been superseded (like clock
with CCF clock, FEC setup).

However, the pinctrl/eMMC shall be a good example.

The other question is if imx6ul has enough resources to use such
feature-rich SPL.


Best regards,

Lukasz Majewski

--

DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-59 Fax: (+49)-8142-66989-80 Email: lukma@denx.de
Fabio Estevam March 27, 2019, 12:44 p.m. UTC | #2
Hi Lukasz,

On Wed, Mar 27, 2019 at 6:23 AM Lukasz Majewski <lukma@denx.de> wrote:

> This seems like a temporary solution - the u-boot proper is converted
> to use DM_MMC, but the pinmux setup code is moved to SPL instead.
>
> The proper solution would be to add support for pinmux in SPL and
> setup those pins there.

Thanks for the suggestion.

The problem is that we are too close of 2019.04 and pico-mx6ul is
currently broken.

This is the least invasive fix we can have to avoid breakage at the moment.

Can we go with this patch for 2019.04 and then revisit the pinctrl
setting in SPL afterwards?

Thanks
Lukasz Majewski March 27, 2019, 1:20 p.m. UTC | #3
Hi Fabio,

> Hi Lukasz,
> 
> On Wed, Mar 27, 2019 at 6:23 AM Lukasz Majewski <lukma@denx.de> wrote:
> 
> > This seems like a temporary solution - the u-boot proper is
> > converted to use DM_MMC, but the pinmux setup code is moved to SPL
> > instead.
> >
> > The proper solution would be to add support for pinmux in SPL and
> > setup those pins there.  
> 
> Thanks for the suggestion.
> 
> The problem is that we are too close of 2019.04 and pico-mx6ul is
> currently broken.
> 
> This is the least invasive fix we can have to avoid breakage at the
> moment.

I see. Let's fix the board first before release.

> 
> Can we go with this patch for 2019.04 and then revisit the pinctrl
> setting in SPL afterwards?

Yes, no problem. I just wanted to show that a similar work has been
done previously.

> 
> Thanks




Best regards,

Lukasz Majewski

--

DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-59 Fax: (+49)-8142-66989-80 Email: lukma@denx.de
Fabio Estevam March 30, 2019, 8:59 p.m. UTC | #4
Hi Stefano,

On Thu, Mar 21, 2019 at 10:59 AM Fabio Estevam <festevam@gmail.com> wrote:
>
> After the DM_MMC conversion the following eMMC boot error is observed:
>
> U-Boot SPL 2019.04-rc4 (Mar 20 2019 - 18:53:28 +0000)
> Trying to boot from MMC1
> MMC Device 0 not found
> spl: could not find mmc device 0. error: -19
> SPL: failed to boot from all boot devices
> ### ERROR ### Please RESET the board ###
>
> This happens because the SPL code does not initialize the SDHC pins
> and clock.
>
> Fix it by moving the original eMMC initialization from U-Boot proper
> to SPL.
>
> Reported-by: Otavio Salvador <otavio@ossystems.com.br>
> Signed-off-by: Fabio Estevam <festevam@gmail.com>
> Tested-by: Fabio Berton <fabio.berton@ossystems.com.br>
> Reviewed-by: Otavio Salvador <otavio@ossystems.com.br>

Could you please consider this one for 2019.04?

It is needed to fix a boot regression after DM conversion.

Thanks
Stefano Babic March 31, 2019, 6:23 p.m. UTC | #5
Hi Fabio,

On 30/03/19 21:59, Fabio Estevam wrote:
> Hi Stefano,
> 
> On Thu, Mar 21, 2019 at 10:59 AM Fabio Estevam <festevam@gmail.com> wrote:
>>
>> After the DM_MMC conversion the following eMMC boot error is observed:
>>
>> U-Boot SPL 2019.04-rc4 (Mar 20 2019 - 18:53:28 +0000)
>> Trying to boot from MMC1
>> MMC Device 0 not found
>> spl: could not find mmc device 0. error: -19
>> SPL: failed to boot from all boot devices
>> ### ERROR ### Please RESET the board ###
>>
>> This happens because the SPL code does not initialize the SDHC pins
>> and clock.
>>
>> Fix it by moving the original eMMC initialization from U-Boot proper
>> to SPL.
>>
>> Reported-by: Otavio Salvador <otavio@ossystems.com.br>
>> Signed-off-by: Fabio Estevam <festevam@gmail.com>
>> Tested-by: Fabio Berton <fabio.berton@ossystems.com.br>
>> Reviewed-by: Otavio Salvador <otavio@ossystems.com.br>
> 
> Could you please consider this one for 2019.04?
> 
> It is needed to fix a boot regression after DM conversion.
> 
> Thanks
> 

I picked up this and other fixes for the release - when Travis has
finished, I will send PR to Tom.

Regards,
Stefano
diff mbox series

Patch

diff --git a/board/technexion/pico-imx6ul/spl.c b/board/technexion/pico-imx6ul/spl.c
index 6464a32d3b..f972cc9eaf 100644
--- a/board/technexion/pico-imx6ul/spl.c
+++ b/board/technexion/pico-imx6ul/spl.c
@@ -10,6 +10,7 @@ 
 #include <asm/gpio.h>
 #include <asm/mach-imx/iomux-v3.h>
 #include <asm/mach-imx/boot_mode.h>
+#include <fsl_esdhc.h>
 #include <linux/libfdt.h>
 #include <spl.h>
 
@@ -141,4 +142,37 @@  void board_init_f(ulong dummy)
 void reset_cpu(ulong addr)
 {
 }
+
+#define USDHC_PAD_CTRL (PAD_CTL_PKE | PAD_CTL_PUE |		\
+	PAD_CTL_PUS_22K_UP  | PAD_CTL_SPEED_LOW |		\
+	PAD_CTL_DSE_80ohm   | PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
+
+static iomux_v3_cfg_t const usdhc1_pads[] = {
+	MX6_PAD_SD1_CLK__USDHC1_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+	MX6_PAD_SD1_CMD__USDHC1_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+	MX6_PAD_SD1_DATA0__USDHC1_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+	MX6_PAD_SD1_DATA1__USDHC1_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+	MX6_PAD_SD1_DATA2__USDHC1_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+	MX6_PAD_SD1_DATA3__USDHC1_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+	MX6_PAD_NAND_READY_B__USDHC1_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+	MX6_PAD_NAND_CE0_B__USDHC1_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+	MX6_PAD_NAND_CE1_B__USDHC1_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+	MX6_PAD_NAND_CLE__USDHC1_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+};
+
+static struct fsl_esdhc_cfg usdhc_cfg[1] = {
+	{USDHC1_BASE_ADDR},
+};
+
+int board_mmc_getcd(struct mmc *mmc)
+{
+	return 1;
+}
+
+int board_mmc_init(bd_t *bis)
+{
+	imx_iomux_v3_setup_multiple_pads(usdhc1_pads, ARRAY_SIZE(usdhc1_pads));
+	usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC_CLK);
+	return fsl_esdhc_initialize(bis, &usdhc_cfg[0]);
+}
 #endif