diff mbox

[U-Boot,v3,3/3] armv8: ls1012a: define esdhc_status_fixup for RDB board

Message ID 1481168538-29963-3-git-send-email-yangbo.lu@nxp.com
State Superseded
Delegated to: York Sun
Headers show

Commit Message

Yangbo Lu Dec. 8, 2016, 3:42 a.m. UTC
On LS1012ARDB board, three dual 1:4 mux/demux devices drive the SDHC2
signals to eMMC, SDIO wifi, SPI and Ardiuno shield. Only when we select
eMMC and SDIO wifi, the SDHC2 could be used. Otherwise, the command
inhibit bits of eSDHC2_PRSSTAT register will never release. This would
cause below continious error messages in linux since it uses polling
mode to detect card.
"mmc1: Controller never released inhibit bit(s)."
"mmc1: Controller never released inhibit bit(s)."
"mmc1: Controller never released inhibit bit(s)."
This patch is to define esdhc_status_fixup function for RDB to disable
SDHC2 status if no SDIO wifi or eMMC is selected.

Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
---
Changes for v2:
	- Added this patch
Changes for v3:
	- Fixed checkpatch issue
---
 board/freescale/ls1012ardb/ls1012ardb.c | 39 +++++++++++++++++++++++++++++++++
 1 file changed, 39 insertions(+)

Comments

York Sun Jan. 12, 2017, 5:08 p.m. UTC | #1
On 12/07/2016 07:42 PM, Yangbo Lu wrote:
> On LS1012ARDB board, three dual 1:4 mux/demux devices drive the SDHC2
> signals to eMMC, SDIO wifi, SPI and Ardiuno shield. Only when we select
> eMMC and SDIO wifi, the SDHC2 could be used. Otherwise, the command
> inhibit bits of eSDHC2_PRSSTAT register will never release. This would
> cause below continious error messages in linux since it uses polling
> mode to detect card.
> "mmc1: Controller never released inhibit bit(s)."
> "mmc1: Controller never released inhibit bit(s)."
> "mmc1: Controller never released inhibit bit(s)."
> This patch is to define esdhc_status_fixup function for RDB to disable
> SDHC2 status if no SDIO wifi or eMMC is selected.
>
> Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
> ---
> Changes for v2:
> 	- Added this patch
> Changes for v3:
> 	- Fixed checkpatch issue
> ---
>  board/freescale/ls1012ardb/ls1012ardb.c | 39 +++++++++++++++++++++++++++++++++
>  1 file changed, 39 insertions(+)
>
> diff --git a/board/freescale/ls1012ardb/ls1012ardb.c b/board/freescale/ls1012ardb/ls1012ardb.c
> index 778434d..708e0a1 100644
> --- a/board/freescale/ls1012ardb/ls1012ardb.c
> +++ b/board/freescale/ls1012ardb/ls1012ardb.c
> @@ -113,6 +113,45 @@ int board_init(void)
>  	return 0;
>  }
>
> +int esdhc_status_fixup(void *blob, const char *compat)
> +{
> +	char esdhc0_path[] = "/soc/esdhc@1560000";
> +	char esdhc1_path[] = "/soc/esdhc@1580000";
> +	u8 io = 0;
> +	u8 mux_sdhc2;
> +
> +	do_fixup_by_path(blob, esdhc0_path, "status", "okay",
> +			 sizeof("okay"), 1);
> +
> +	/* Initialize i2c early for serial flash bank information */
> +	i2c_set_bus_num(0);

What do you mean "early" in the comment? This function is called after 
I2C is initialized.

> +
> +	/*
> +	 * The I2C IO-expander for mux select is used to control the muxing
> +	 * of various onboard interfaces.
> +	 *
> +	 * IO1[3:2] indicates SDHC2 interface demultiplexer select lines.
> +	 *	00 - SDIO wifi
> +	 *	01 - GPIO (to Arduino)
> +	 *	10 - eMMC Memory
> +	 *	11 - SPI
> +	 */
> +	if (i2c_read(I2C_MUX_IO1_ADDR, 0, 1, &io, 1) < 0) {
> +		printf("Error reading i2c boot information!\n");
> +		return 0; /* Don't want to hang() on this error */

In case of this error, do you want to "disable" esdhc1?

> +	}
> +
> +	mux_sdhc2 = (io & 0x0c) >> 2;
> +	/* Enable SDHC2 only when use SDIO wifi and eMMC */
> +	if (mux_sdhc2 == 2 || mux_sdhc2 == 0)
> +		do_fixup_by_path(blob, esdhc1_path, "status", "okay",
> +				 sizeof("okay"), 1);
> +	else
> +		do_fixup_by_path(blob, esdhc1_path, "status", "disabled",
> +				 sizeof("disabled"), 1);
> +	return 0;
> +}
> +
>  int ft_board_setup(void *blob, bd_t *bd)
>  {
>  	arch_fixup_fdt(blob);
>

York
Yangbo Lu Jan. 13, 2017, 3:18 a.m. UTC | #2
> -----Original Message-----
> From: york sun
> Sent: Friday, January 13, 2017 1:09 AM
> To: Y.B. Lu; u-boot@lists.denx.de
> Subject: Re: [U-Boot, v3, 3/3] armv8: ls1012a: define esdhc_status_fixup
> for RDB board
> 
> On 12/07/2016 07:42 PM, Yangbo Lu wrote:
> > On LS1012ARDB board, three dual 1:4 mux/demux devices drive the SDHC2
> > signals to eMMC, SDIO wifi, SPI and Ardiuno shield. Only when we
> > select eMMC and SDIO wifi, the SDHC2 could be used. Otherwise, the
> > command inhibit bits of eSDHC2_PRSSTAT register will never release.
> > This would cause below continious error messages in linux since it
> > uses polling mode to detect card.
> > "mmc1: Controller never released inhibit bit(s)."
> > "mmc1: Controller never released inhibit bit(s)."
> > "mmc1: Controller never released inhibit bit(s)."
> > This patch is to define esdhc_status_fixup function for RDB to disable
> > SDHC2 status if no SDIO wifi or eMMC is selected.
> >
> > Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
> > ---
> > Changes for v2:
> > 	- Added this patch
> > Changes for v3:
> > 	- Fixed checkpatch issue
> > ---
> >  board/freescale/ls1012ardb/ls1012ardb.c | 39
> > +++++++++++++++++++++++++++++++++
> >  1 file changed, 39 insertions(+)
> >
> > diff --git a/board/freescale/ls1012ardb/ls1012ardb.c
> > b/board/freescale/ls1012ardb/ls1012ardb.c
> > index 778434d..708e0a1 100644
> > --- a/board/freescale/ls1012ardb/ls1012ardb.c
> > +++ b/board/freescale/ls1012ardb/ls1012ardb.c
> > @@ -113,6 +113,45 @@ int board_init(void)
> >  	return 0;
> >  }
> >
> > +int esdhc_status_fixup(void *blob, const char *compat) {
> > +	char esdhc0_path[] = "/soc/esdhc@1560000";
> > +	char esdhc1_path[] = "/soc/esdhc@1580000";
> > +	u8 io = 0;
> > +	u8 mux_sdhc2;
> > +
> > +	do_fixup_by_path(blob, esdhc0_path, "status", "okay",
> > +			 sizeof("okay"), 1);
> > +
> > +	/* Initialize i2c early for serial flash bank information */
> > +	i2c_set_bus_num(0);
> 
> What do you mean "early" in the comment? This function is called after
> I2C is initialized.
> 

[Lu Yangbo-B47093] Sorry, it's really confusing comment. I will remove it.

> > +
> > +	/*
> > +	 * The I2C IO-expander for mux select is used to control the muxing
> > +	 * of various onboard interfaces.
> > +	 *
> > +	 * IO1[3:2] indicates SDHC2 interface demultiplexer select lines.
> > +	 *	00 - SDIO wifi
> > +	 *	01 - GPIO (to Arduino)
> > +	 *	10 - eMMC Memory
> > +	 *	11 - SPI
> > +	 */
> > +	if (i2c_read(I2C_MUX_IO1_ADDR, 0, 1, &io, 1) < 0) {
> > +		printf("Error reading i2c boot information!\n");
> > +		return 0; /* Don't want to hang() on this error */
> 
> In case of this error, do you want to "disable" esdhc1?

[Lu Yangbo-B47093] If error occurs here, I just used return to let kernel dts decide to use it or not.

> 
> > +	}
> > +
> > +	mux_sdhc2 = (io & 0x0c) >> 2;
> > +	/* Enable SDHC2 only when use SDIO wifi and eMMC */
> > +	if (mux_sdhc2 == 2 || mux_sdhc2 == 0)
> > +		do_fixup_by_path(blob, esdhc1_path, "status", "okay",
> > +				 sizeof("okay"), 1);
> > +	else
> > +		do_fixup_by_path(blob, esdhc1_path, "status", "disabled",
> > +				 sizeof("disabled"), 1);
> > +	return 0;
> > +}
> > +
> >  int ft_board_setup(void *blob, bd_t *bd)  {
> >  	arch_fixup_fdt(blob);
> >
> 
> York
diff mbox

Patch

diff --git a/board/freescale/ls1012ardb/ls1012ardb.c b/board/freescale/ls1012ardb/ls1012ardb.c
index 778434d..708e0a1 100644
--- a/board/freescale/ls1012ardb/ls1012ardb.c
+++ b/board/freescale/ls1012ardb/ls1012ardb.c
@@ -113,6 +113,45 @@  int board_init(void)
 	return 0;
 }
 
+int esdhc_status_fixup(void *blob, const char *compat)
+{
+	char esdhc0_path[] = "/soc/esdhc@1560000";
+	char esdhc1_path[] = "/soc/esdhc@1580000";
+	u8 io = 0;
+	u8 mux_sdhc2;
+
+	do_fixup_by_path(blob, esdhc0_path, "status", "okay",
+			 sizeof("okay"), 1);
+
+	/* Initialize i2c early for serial flash bank information */
+	i2c_set_bus_num(0);
+
+	/*
+	 * The I2C IO-expander for mux select is used to control the muxing
+	 * of various onboard interfaces.
+	 *
+	 * IO1[3:2] indicates SDHC2 interface demultiplexer select lines.
+	 *	00 - SDIO wifi
+	 *	01 - GPIO (to Arduino)
+	 *	10 - eMMC Memory
+	 *	11 - SPI
+	 */
+	if (i2c_read(I2C_MUX_IO1_ADDR, 0, 1, &io, 1) < 0) {
+		printf("Error reading i2c boot information!\n");
+		return 0; /* Don't want to hang() on this error */
+	}
+
+	mux_sdhc2 = (io & 0x0c) >> 2;
+	/* Enable SDHC2 only when use SDIO wifi and eMMC */
+	if (mux_sdhc2 == 2 || mux_sdhc2 == 0)
+		do_fixup_by_path(blob, esdhc1_path, "status", "okay",
+				 sizeof("okay"), 1);
+	else
+		do_fixup_by_path(blob, esdhc1_path, "status", "disabled",
+				 sizeof("disabled"), 1);
+	return 0;
+}
+
 int ft_board_setup(void *blob, bd_t *bd)
 {
 	arch_fixup_fdt(blob);