X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=drivers%2Fspi%2Fomap3_spi.c;h=ff4c700645c3c81b3dbb9a4d482f4cc62bbf2712;hb=0c9cc5155cb5027ae17ace986f349e2f0d1fb9a3;hp=053a67bbe0f2d2a470a6916950c75f746bae8171;hpb=b2b41d27775823b8e19f6816aa08ffca0e234ade;p=oweals%2Fu-boot.git diff --git a/drivers/spi/omap3_spi.c b/drivers/spi/omap3_spi.c index 053a67bbe0..ff4c700645 100644 --- a/drivers/spi/omap3_spi.c +++ b/drivers/spi/omap3_spi.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0+ /* * Copyright (C) 2016 Jagan Teki * Christophe Ricard @@ -13,8 +14,6 @@ * Copyright (C) 2005, 2006 Nokia Corporation * * Modified by Ruslan Araslanov - * - * SPDX-License-Identifier: GPL-2.0+ */ #include @@ -416,7 +415,7 @@ static void _omap3_spi_set_wordlen(struct omap3_spi_priv *priv) unsigned int confr; /* McSPI individual channel configuration */ - confr = readl(&priv->regs->channel[priv->wordlen].chconf); + confr = readl(&priv->regs->channel[priv->cs].chconf); /* wordlength */ confr &= ~OMAP3_MCSPI_CHCONF_WL_MASK; @@ -444,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 @@ -465,11 +461,6 @@ static inline struct omap3_spi_priv *to_omap3_spi(struct spi_slave *slave) return container_of(slave, struct omap3_spi_priv, slave); } -void spi_init(void) -{ - /* do nothing */ -} - void spi_free_slave(struct spi_slave *slave) { struct omap3_spi_priv *priv = to_omap3_spi(slave); @@ -481,6 +472,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); @@ -493,8 +486,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, @@ -591,6 +583,8 @@ static int omap3_spi_claim_bus(struct udevice *dev) struct dm_spi_slave_platdata *slave_plat = dev_get_parent_platdata(dev); priv->cs = slave_plat->cs; + priv->freq = slave_plat->max_hz; + _omap3_spi_claim_bus(priv); return 0; @@ -601,8 +595,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); return 0; } @@ -630,9 +623,14 @@ static int omap3_spi_probe(struct udevice *dev) (struct omap2_mcspi_platform_config*)dev_get_driver_data(dev); priv->regs = (struct mcspi *)(devfdt_get_addr(dev) + data->regs_offset); - priv->pin_dir = fdtdec_get_uint(blob, node, "ti,pindir-d0-out-d1-in", - MCSPI_PINDIR_D0_IN_D1_OUT); + if (fdtdec_get_bool(blob, node, "ti,pindir-d0-out-d1-in")) + priv->pin_dir = MCSPI_PINDIR_D0_OUT_D1_IN; + else + priv->pin_dir = MCSPI_PINDIR_D0_IN_D1_OUT; priv->wordlen = SPI_DEFAULT_WORDLEN; + + spi_reset(priv->regs); + return 0; } @@ -647,12 +645,10 @@ static int omap3_spi_xfer(struct udevice *dev, unsigned int bitlen, static int omap3_spi_set_speed(struct udevice *dev, unsigned int speed) { - struct udevice *bus = dev->parent; - struct omap3_spi_priv *priv = dev_get_priv(bus); - struct dm_spi_slave_platdata *slave_plat = dev_get_parent_platdata(dev); - priv->cs = slave_plat->cs; - priv->freq = slave_plat->max_hz; + struct omap3_spi_priv *priv = dev_get_priv(dev); + + priv->freq = speed; _omap3_spi_set_speed(priv); return 0; @@ -660,12 +656,10 @@ static int omap3_spi_set_speed(struct udevice *dev, unsigned int speed) static int omap3_spi_set_mode(struct udevice *dev, uint mode) { - struct udevice *bus = dev->parent; - struct omap3_spi_priv *priv = dev_get_priv(bus); - struct dm_spi_slave_platdata *slave_plat = dev_get_parent_platdata(dev); + struct omap3_spi_priv *priv = dev_get_priv(dev); + + priv->mode = mode; - priv->cs = slave_plat->cs; - priv->mode = slave_plat->mode; _omap3_spi_set_mode(priv); return 0;