[U-Boot] [v3] armv8: ls1012a: enable/disable eSDHC1 through hwconfig for new RDB

Y.b. Lu yangbo.lu at nxp.com
Thu Dec 7 08:10:06 UTC 2017


Hi York,

> -----Original Message-----
> From: York Sun
> Sent: 2017年12月7日 3:08
> To: Y.b. Lu <yangbo.lu at nxp.com>; u-boot at lists.denx.de
> Subject: Re: [v3] armv8: ls1012a: enable/disable eSDHC1 through hwconfig for
> new RDB
> 
> On 12/06/2017 02:19 AM, Yangbo Lu wrote:
> > For LS1012ARDB RevD and later versions, the I2C reading for DIP switch
> > setting had been no longer reliable since the board was reworked. This
> > patch is to add hwconfig support to enable/disable
> 
> I think this message is not accurate. How about saying "I2C reading for DIP
> switch setting is not reliable for LS1012ARDB rev D and later revisions."?
> 

[Y.b. Lu] Thanks. This is better.

> > eSDHC1 manually for these boards. Also let kernel decide status of
> > esdhc0.
> 
> I see you dropped fixing up esdhc0. What do you mean "let kernel decide"?
> How?

[Y.b. Lu] I mean unless to avoid some issue, we don’t need to do any fix-up for 'status'.
Let me rephrase it as "Also drop 'status' fix-up for esdhc0 and leave it as it is. It shouldn’t be always fixed up with 'okay'. ".


> 
> >
> > Signed-off-by: Yangbo Lu <yangbo.lu at nxp.com>
> > ---
> > Changes for v2:
> > 	- Just used hwconfig() instead of getenv() and hwconfig_f().
> > Changes for v3:
> > 	- only applied hwconfig support for RevD and later versions.
> > ---
> >  board/freescale/ls1012ardb/ls1012ardb.c | 51
> +++++++++++++++++++++------------
> >  include/configs/ls1012ardb.h            |  4 +++
> >  2 files changed, 36 insertions(+), 19 deletions(-)
> >
> > diff --git a/board/freescale/ls1012ardb/ls1012ardb.c
> > b/board/freescale/ls1012ardb/ls1012ardb.c
> > index c6c1c71202..b73c7d6639 100644
> > --- a/board/freescale/ls1012ardb/ls1012ardb.c
> > +++ b/board/freescale/ls1012ardb/ls1012ardb.c
> > @@ -132,39 +132,52 @@ int board_init(void)
> >
> >  int esdhc_status_fixup(void *blob, const char *compat)  {
> > -	char esdhc0_path[] = "/soc/esdhc at 1560000";
> >  	char esdhc1_path[] = "/soc/esdhc at 1580000";
> > +	u8 in1;
> 
> I think you can reuse "io". Not a big deal though.

[Y.b. Lu] Ok. Will do that.

> 
> >  	u8 io = 0;
> >  	u8 mux_sdhc2;
> > -
> > -	do_fixup_by_path(blob, esdhc0_path, "status", "okay",
> > -			 sizeof("okay"), 1);
> > +	bool sdhc2_en = false;
> >
> >  	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) {
> > +	if (i2c_read(I2C_MUX_IO1_ADDR, 1, 1, &in1, 1) < 0) {
> 
> It would be helpful to use a named macro instead of "1" here as the register
> address. It is not obvious that you are reading a revision number. You can also
> put a comment.

[Y.b. Lu] Let me put a comment here for this patch. I think it's proper to replace all the numbers with macro in this file in another patch.

> 
> You said I2C reading the DIP is not reliable. Is this reading reliable?

[Y.b. Lu] This is a question... Although I had verified this patch on RevE(the value read is correct), let me confirm with Kinjalk before sending new version patch.

> 
> >  		printf("Error reading i2c boot information!\n");
> > -		return 0; /* Don't want to hang() on this error */
> > +		return 0;
> 
> What does I2C failure mean here? Returning 0 will cause the code keep going in
> fdt_fixup_esdhc().

[Y.b. Lu] I don’t know the possibility of I2C failure. If the failure happens, just print error message, leave 'status' as it is, and return 0 because the other fix-ups in fdt_fixup_esdhc() are still needed like clock-frequency.

> 
> > +	}
> > +
> > +	if ((in1 & (~__SW_REV_MASK)) <= __SW_REV_D) {
> > +		if (hwconfig("esdhc1"))
> 
> Please double check. I remember in the past if hwconfig is not enabled, any
> check returns true.

[Y.b. Lu] You're right. It's -ENOSYS. But what should I do here ?

> 
> > +			sdhc2_en = true;
> > +	} else {
> > +		/*
> > +		 * 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)
> > +			sdhc2_en = true;
> >  	}
> >
> > -	mux_sdhc2 = (io & 0x0c) >> 2;
> > -	/* Enable SDHC2 only when use SDIO wifi and eMMC */
> > -	if (mux_sdhc2 == 2 || mux_sdhc2 == 0)
> > +	if (sdhc2_en)
> >  		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;
> >  }
> >
> > diff --git a/include/configs/ls1012ardb.h
> > b/include/configs/ls1012ardb.h index 794117062f..d5384e6027 100644
> > --- a/include/configs/ls1012ardb.h
> > +++ b/include/configs/ls1012ardb.h
> > @@ -32,6 +32,10 @@
> >  #define __SW_REV_MASK		0x07
> >  #define __SW_REV_A		0xF8
> >  #define __SW_REV_B		0xF0
> > +#define __SW_REV_C		0xE8
> > +#define __SW_REV_C1		0xE0
> > +#define __SW_REV_C2		0xD8
> > +#define __SW_REV_D		0xD0
> 
> I don't have strong opinion about these macros. I would not use underscore
> myself. I guess I missed them at the first place.

[Y.b. Lu] It's confusing why define macro like this...
And the __SW_BOOT_EMU is wrong, it should be 0x02, not 0x10.
> 
> York


More information about the U-Boot mailing list