[U-Boot] [PATCH v2 1/2] spl_spi: Read default speed and mode values from DT
Patrick DELAUNAY
patrick.delaunay at st.com
Thu Dec 13 16:04:34 UTC 2018
Hi Adam,
Thanks for the tests,
And sorry for the regression on your board.
> From: Adam Ford <aford173 at gmail.com>
> Sent: lundi 10 décembre 2018 23:48
>
> On Mon, Nov 19, 2018 at 11:55 AM Patrick Delaunay
> <patrick.delaunay at st.com> wrote:
> >
> > In case of DT boot, don't read default speed and mode for SPI from
> > CONFIG_*, instead read from DT node.
> >
> > Signed-off-by: Christophe Kerello <christophe.kerello at st.com>
> > Signed-off-by: Patrick Delaunay <patrick.delaunay at st.com>
> > ---
> >
> > Changes in v2:
> > - use variables to avoid duplicated code
> >
> > common/spl/spl_spi.c | 10 ++++++++--
> > 1 file changed, 8 insertions(+), 2 deletions(-)
> >
> > diff --git a/common/spl/spl_spi.c b/common/spl/spl_spi.c index
> > 8cd4830..b348b45 100644
> > --- a/common/spl/spl_spi.c
> > +++ b/common/spl/spl_spi.c
> > @@ -74,15 +74,21 @@ static int spl_spi_load_image(struct spl_image_info
> *spl_image,
> > unsigned payload_offs = CONFIG_SYS_SPI_U_BOOT_OFFS;
> > struct spi_flash *flash;
> > struct image_header *header;
> > + unsigned int max_hz = CONFIG_SF_DEFAULT_SPEED;
> > + unsigned int spi_mode = CONFIG_SF_DEFAULT_MODE;
> >
>
> Instead of
> > +#ifdef CONFIG_DM_SPI_FLASH
>
> What about using:
>
> #if CONFIG_IS_ENABLED(OF_CONTROL) &&
> !CONFIG_IS_ENABLED(OF_PLATDATA)
>
> > + /* In DM mode defaults will be taken from DT */
> > + max_hz = 0, spi_mode = 0;
> > +#endif
>
> This one-line change 'should' give you what you want, the settings of
> 0 for boards using the device tree. If board that uses OF_PLATDATA cannot load
> the device tree, it'll default back to the configs set above. You could probably
> combine all if statements into one, and I'd be fine with that too.
>
> This one-line change made my board boot with this series. I haven't applied the
> follow-up series yet but if a v3 was posted with this change, I'd mark it as
> 'tested-by.
>
> adam
I am not familiar with platdata (my platform use only device tree).
So I take some time to check and answer.
I clearly no anticipate the issue for OF_PLATDATA, mainly caused by code in drivers/spi/spi-uclass.c
In function spi_get_bus_and_cs
The parameter speed expect 0 to load parameter from device tree / with parent platdata
if (!speed) {
speed = plat->max_hz;
mode = plat->mode;
}
=> it should the default behavior when parent is correctly initialized for ALL the user (SPL/ENV/Commands).
But for some case, when driver is automatically created (no device tree node or platform data)
Speed is ALSO used as max_hz entry for platdata.
It is a bad idea when speed = 0
Simon already make a patch to avoid the issue
=> "dm: spi: prevent setting a speed of 0 Hz"
SHA1 = 12bfb2e05fc29bfbec7eb76ea8cc02e130268801
But in your case , it is not enough .....
I don't known why,
I try to understood how the platdata for parent (SPI_UCLASS) can be configurated...
I need to go deeper.
A solution can to change the code introduce by Simon :
+ if (speed) {
+ plat->max_hz = speed;
+ } else {
+ printf("Warning: SPI speed fallback to %u kHz\n",
+ SPI_DEFAULT_SPEED_HZ / 1000);
+ plat->max_hz = SPI_DEFAULT_SPEED_HZ;
+ }
some update can work in your case
if (speed) {
plat->max_hz = speed;
} else {
#ifdef CONFIG_SF_DEFAULT_SPEED
plat->max_hz = CONFIG_SF_DEFAULT_SPEED;
#else
printf("Warning: SPI speed fallback to %u kHz\n",
SPI_DEFAULT_SPEED_HZ / 1000);
plat->max_hz = SPI_DEFAULT_SPEED_HZ;
#endif
}
If (mode)
plat->mode = mode;
else
#ifdef CONFIG_SF_DEFAULT_MODE
plat->mode = CONFIG_SF_DEFAULT_MODE
#else
plat->mode = SPI_MODE_3
#endif
In thise case the CONFIG_DEFAULT value are defined, they are used....
So the 2 series are not enough mature today, we need some work.
But I start my holiday today, I will come back only in 3 weeks....
I will check this point when I will come back.
NB: for short term solution, for plaform with DT only flash descrition (as my platform), we can use
CONFIG_SF_DEFAULT_SPEED=0
CONFIG_SF_DEFAULT_MODE=0
That should be solved the current issue in my board without need to merge the 2 series (not yet tested).
> > /*
> > * Load U-Boot image from SPI flash into RAM
> > */
> >
> > flash = spi_flash_probe(CONFIG_SF_DEFAULT_BUS,
> > CONFIG_SF_DEFAULT_CS,
> > - CONFIG_SF_DEFAULT_SPEED,
> > - CONFIG_SF_DEFAULT_MODE);
> > + max_hz,
> > + spi_mode);
> > if (!flash) {
> > puts("SPI probe failed.\n");
> > return -ENODEV;
> > --
> > 2.7.4
> >
> > _______________________________________________
> > U-Boot mailing list
> > U-Boot at lists.denx.de
> > https://lists.denx.de/listinfo/u-boot
Regards
Patrick
More information about the U-Boot
mailing list