[U-Boot] [PATCH] spi: omap3: fix claim/release bus within DM

Jagan Teki jagannadh.teki at gmail.com
Wed Jun 27 11:53:54 UTC 2018


On Tue, Jun 26, 2018 at 7:38 PM, Hannes Schmelzer <oe5hpm at oevsv.at> wrote:
> The claim/release bus function must not reset the whole SPI core because
> settings regarding wordlen, clock-frequency and so on made by
> set_wordlen, set_mode, set_speed get lost with this action. Resulting in
> a non-functional SPI.
>
> Without DM the failure didn't came up since after the spi_reset within
> claim bus all the setup (wordlen, mode, ...) was called, in DM they are
> called by the spi uclass.
>
> We change now the things as following for having a working SPI instance
> in DM:
>
> - move the spi_reset(...) to the probe call in DM for having a known
> hardware state after probe. Without DM we don't have a probe call, so we
> issue the reset as before during the claim_bus call.
>
> - in release bus we just reset the modulctrl to the reset-value (spi-
> slave)
>
> Signed-off-by: Hannes Schmelzer <oe5hpm at oevsv.at>
>
> ---
>
>  drivers/spi/omap3_spi.c | 14 +++++++-------
>  1 file changed, 7 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/spi/omap3_spi.c b/drivers/spi/omap3_spi.c
> index 4169abd..41bdab7 100644
> --- a/drivers/spi/omap3_spi.c
> +++ b/drivers/spi/omap3_spi.c
> @@ -443,9 +443,6 @@ static void spi_reset(struct mcspi *regs)
>  static void _omap3_spi_claim_bus(struct omap3_spi_priv *priv)
>  {
>         unsigned int conf;
> -
> -       spi_reset(priv->regs);
> -
>         /*
>          * setup when switching from (reset default) slave mode
>          * to single-channel master mode
> @@ -480,6 +477,8 @@ int spi_claim_bus(struct spi_slave *slave)
>  {
>         struct omap3_spi_priv *priv = to_omap3_spi(slave);
>
> +       spi_reset(priv->regs);
> +
>         _omap3_spi_claim_bus(priv);
>         _omap3_spi_set_wordlen(priv);
>         _omap3_spi_set_mode(priv);
> @@ -492,8 +491,7 @@ void spi_release_bus(struct spi_slave *slave)
>  {
>         struct omap3_spi_priv *priv = to_omap3_spi(slave);
>
> -       /* Reset the SPI hardware */
> -       spi_reset(priv->regs);
> +       writel(OMAP3_MCSPI_MODULCTRL_MS, &priv->regs->modulctrl);
>  }
>
>  struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
> @@ -600,8 +598,7 @@ static int omap3_spi_release_bus(struct udevice *dev)
>         struct udevice *bus = dev->parent;
>         struct omap3_spi_priv *priv = dev_get_priv(bus);
>
> -       /* Reset the SPI hardware */
> -       spi_reset(priv->regs);
> +       writel(OMAP3_MCSPI_MODULCTRL_MS, &priv->regs->modulctrl);

This change look compared to what patch is trying to fix. so release
doen't require reset?  are you sure we need to write only this bit
release the bus or do we need to clear?


More information about the U-Boot mailing list