public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
From: Jagan Teki <jagan@amarulasolutions.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH 23/34] spi: mpc8xxx: Convert to DM
Date: Tue, 20 Nov 2018 18:18:03 +0530	[thread overview]
Message-ID: <20181120124814.23293-24-jagan@amarulasolutions.com> (raw)
In-Reply-To: <20181120124814.23293-1-jagan@amarulasolutions.com>

From: Mario Six <mario.six@gdsys.cc>

Support DM in the MPC8xxx SPI driver, and remove the legacy SPI
interface.

Signed-off-by: Mario Six <mario.six@gdsys.cc>
[jagan: build for board which doesn't enable DM_SPI]
Signed-off-by: Jagan Teki <jagan@amarulasolutions.com>
---
 Makefile                  |   3 +-
 drivers/spi/Makefile      |   2 +-
 drivers/spi/mpc8xxx_spi.c | 144 ++++++++++++++++++++++++++++----------
 drivers/spi/spi.c         |   1 +
 4 files changed, 111 insertions(+), 39 deletions(-)

diff --git a/Makefile b/Makefile
index efa68e7343..7c1d934493 100644
--- a/Makefile
+++ b/Makefile
@@ -919,7 +919,8 @@ ifeq ($(CONFIG_DM_I2C_COMPAT)$(CONFIG_SANDBOX),y)
 	@echo "===================================================="
 endif
 ifeq ($(CONFIG_DM_SPI),)
-ifeq ($(filter $(CONFIG_DAVINCI_SPI) $(CONFIG_KIRKWOOD_SPI) $(CONFIG_TI_QSPI),y),y)
+ifeq ($(filter $(CONFIG_DAVINCI_SPI) $(CONFIG_KIRKWOOD_SPI) $(CONFIG_MPC8XXX_SPI) \
+	       $(CONFIG_TI_QSPI),y),y)
 	@echo "===================== WARNING ======================"
 	@echo "This board uses SPI driver from drivers/spi/ without"
 	@echo "enabling CONFIG_DM_SPI. Please enable CONFIG_DM_SPI"
diff --git a/drivers/spi/Makefile b/drivers/spi/Makefile
index 748d9a90ab..19aa95b2ca 100644
--- a/drivers/spi/Makefile
+++ b/drivers/spi/Makefile
@@ -8,6 +8,7 @@ ifdef CONFIG_DM_SPI
 obj-y += spi-uclass.o
 obj-$(CONFIG_DAVINCI_SPI) += davinci_spi.o
 obj-$(CONFIG_KIRKWOOD_SPI) += kirkwood_spi.o
+obj-$(CONFIG_MPC8XXX_SPI) += mpc8xxx_spi.o
 obj-$(CONFIG_SANDBOX) += spi-emul-uclass.o
 obj-$(CONFIG_SOFT_SPI) += soft_spi.o
 obj-$(CONFIG_SPI_MEM) += spi-mem.o
@@ -33,7 +34,6 @@ obj-$(CONFIG_FSL_QSPI) += fsl_qspi.o
 obj-$(CONFIG_ICH_SPI) +=  ich.o
 obj-$(CONFIG_LPC32XX_SSP) += lpc32xx_ssp.o
 obj-$(CONFIG_MPC8XX_SPI) += mpc8xx_spi.o
-obj-$(CONFIG_MPC8XXX_SPI) += mpc8xxx_spi.o
 obj-$(CONFIG_MT7621_SPI) += mt7621_spi.o
 obj-$(CONFIG_MVEBU_A3700_SPI) += mvebu_a3700_spi.o
 obj-$(CONFIG_MXC_SPI) += mxc_spi.o
diff --git a/drivers/spi/mpc8xxx_spi.c b/drivers/spi/mpc8xxx_spi.c
index 63e1a150f8..1c7bf10f91 100644
--- a/drivers/spi/mpc8xxx_spi.c
+++ b/drivers/spi/mpc8xxx_spi.c
@@ -5,10 +5,12 @@
  */
 
 #include <common.h>
-
+#include <dm.h>
+#include <errno.h>
 #include <malloc.h>
 #include <spi.h>
 #include <asm/mpc8xxx_spi.h>
+#include <asm-generic/gpio.h>
 
 enum {
 	SPI_EV_NE = BIT(31 - 22),	/* Receiver Not Empty */
@@ -30,6 +32,12 @@ enum {
 	SPI_COM_LST = BIT(31 - 9),
 };
 
+struct mpc8xxx_priv {
+	spi8xxx_t *spi;
+	struct gpio_desc gpios[16];
+	int max_cs;
+};
+
 static inline u32 to_prescale_mod(u32 val)
 {
 	return (min(val, (u32)15) << 16);
@@ -42,70 +50,90 @@ static void set_char_len(spi8xxx_t *spi, u32 val)
 
 #define SPI_TIMEOUT	1000
 
-struct spi_slave *spi_setup_slave(uint bus, uint cs, uint max_hz, uint mode)
+static int __spi_set_speed(spi8xxx_t *spi, uint speed)
 {
-	struct spi_slave *slave;
+	/* TODO(mario.six@gdsys.cc): This only ever sets one fixed speed */
 
-	if (!spi_cs_is_valid(bus, cs))
-		return NULL;
-
-	slave = spi_alloc_slave_base(bus, cs);
-	if (!slave)
-		return NULL;
-
-	/*
-	 * TODO: Some of the code in spi_init() should probably move
-	 * here, or into spi_claim_bus() below.
-	 */
+	/* Use SYSCLK / 8 (16.67MHz typ.) */
+	clrsetbits_be32(&spi->mode, SPI_MODE_PM_MASK, to_prescale_mod(1));
 
-	return slave;
+	return 0;
 }
 
-void spi_free_slave(struct spi_slave *slave)
+static int mpc8xxx_spi_ofdata_to_platdata(struct udevice *dev)
 {
-	free(slave);
+	struct mpc8xxx_priv *priv = dev_get_priv(dev);
+	int ret;
+
+	priv->spi = (spi8xxx_t *)dev_read_addr(dev);
+
+	/* TODO(mario.six at gdsys.cc): Read clock and save the value */
+
+	ret = gpio_request_list_by_name(dev, "gpios", priv->gpios,
+					ARRAY_SIZE(priv->gpios), GPIOD_IS_OUT | GPIOD_ACTIVE_LOW);
+	if (ret < 0)
+		return -EINVAL;
+
+	priv->max_cs = ret;
+
+	return 0;
 }
 
-void spi_init(void)
+static int mpc8xxx_spi_probe(struct udevice *dev)
 {
-	spi8xxx_t *spi = &((immap_t *)(CONFIG_SYS_IMMR))->spi;
+	struct mpc8xxx_priv *priv = dev_get_priv(dev);
 
 	/*
 	 * SPI pins on the MPC83xx are not muxed, so all we do is initialize
 	 * some registers
 	 */
-	out_be32(&spi->mode, SPI_MODE_REV | SPI_MODE_MS | SPI_MODE_EN);
-	/* Use SYSCLK / 8 (16.67MHz typ.) */
-	clrsetbits_be32(&spi->mode, SPI_MODE_PM_MASK, to_prescale_mod(1));
+	out_be32(&priv->spi->mode, SPI_MODE_REV | SPI_MODE_MS | SPI_MODE_EN);
+
+	__spi_set_speed(priv->spi, 16666667);
+
 	/* Clear all SPI events */
-	setbits_be32(&spi->event, 0xffffffff);
+	setbits_be32(&priv->spi->event, 0xffffffff);
 	/* Mask  all SPI interrupts */
-	clrbits_be32(&spi->mask, 0xffffffff);
+	clrbits_be32(&priv->spi->mask, 0xffffffff);
 	/* LST bit doesn't do anything, so disregard */
-	out_be32(&spi->com, 0);
+	out_be32(&priv->spi->com, 0);
+
+	return 0;
 }
 
-int spi_claim_bus(struct spi_slave *slave)
+static void mpc8xxx_spi_cs_activate(struct udevice *dev)
 {
-	return 0;
+	struct mpc8xxx_priv *priv = dev_get_priv(dev->parent);
+	struct dm_spi_slave_platdata *platdata = dev_get_parent_platdata(dev);
+
+	dm_gpio_set_dir_flags(&priv->gpios[platdata->cs], GPIOD_IS_OUT);
+	dm_gpio_set_value(&priv->gpios[platdata->cs], 0);
 }
 
-void spi_release_bus(struct spi_slave *slave)
+static void mpc8xxx_spi_cs_deactivate(struct udevice *dev)
 {
+	struct mpc8xxx_priv *priv = dev_get_priv(dev->parent);
+	struct dm_spi_slave_platdata *platdata = dev_get_parent_platdata(dev);
+
+	dm_gpio_set_dir_flags(&priv->gpios[platdata->cs], GPIOD_IS_OUT);
+	dm_gpio_set_value(&priv->gpios[platdata->cs], 1);
 }
 
-int spi_xfer(struct spi_slave *slave, uint bitlen, const void *dout, void *din,
-	     ulong flags)
+static int mpc8xxx_spi_xfer(struct udevice *dev, uint bitlen,
+			    const void *dout, void *din, ulong flags)
 {
-	spi8xxx_t *spi = &((immap_t *)(CONFIG_SYS_IMMR))->spi;
-	u32 tmpdin;
+	struct udevice *bus = dev->parent;
+	struct mpc8xxx_priv *priv = dev_get_priv(bus);
+	spi8xxx_t *spi = priv->spi;
+	struct dm_spi_slave_platdata *platdata = dev_get_parent_platdata(dev);
+	u32 tmpdin = 0;
 	int num_blks = DIV_ROUND_UP(bitlen, 32);
 
-	debug("%s: slave %u:%u dout %08X din %08X bitlen %u\n", __func__,
-	      slave->bus, slave->cs, *(uint *)dout, *(uint *)din, bitlen);
+	debug("%s: slave %s:%u dout %08X din %08X bitlen %u\n", __func__,
+	      bus->name, platdata->cs, *(uint *)dout, *(uint *)din, bitlen);
 
 	if (flags & SPI_XFER_BEGIN)
-		spi_cs_activate(slave);
+		mpc8xxx_spi_cs_activate(dev);
 
 	/* Clear all SPI events */
 	setbits_be32(&spi->event, 0xffffffff);
@@ -178,15 +206,57 @@ int spi_xfer(struct spi_slave *slave, uint bitlen, const void *dout, void *din,
 			mdelay(1);
 		} while (get_timer(start) < SPI_TIMEOUT);
 
-		if (get_timer(start) >= SPI_TIMEOUT)
+		if (get_timer(start) >= SPI_TIMEOUT) {
 			debug("*** %s: Time out during SPI transfer\n",
 			      __func__);
+			return -ETIMEDOUT;
+		}
 
 		debug("*** %s: transfer ended. Value=%08x\n", __func__, tmpdin);
 	}
 
 	if (flags & SPI_XFER_END)
-		spi_cs_deactivate(slave);
+		mpc8xxx_spi_cs_deactivate(dev);
+
+	return 0;
+}
+
+static int mpc8xxx_spi_set_speed(struct udevice *dev, uint speed)
+{
+	struct mpc8xxx_priv *priv = dev_get_priv(dev);
+
+	return __spi_set_speed(priv->spi, speed);
+}
 
+static int mpc8xxx_spi_set_mode(struct udevice *dev, uint mode)
+{
+	/* TODO(mario.six at gdsys.cc): Using SPI_CPHA (for clock phase) and
+	 * SPI_CPOL (for clock polarity) should work
+	 */
 	return 0;
 }
+
+static const struct dm_spi_ops mpc8xxx_spi_ops = {
+	.xfer		= mpc8xxx_spi_xfer,
+	.set_speed	= mpc8xxx_spi_set_speed,
+	.set_mode	= mpc8xxx_spi_set_mode,
+	/*
+	 * cs_info is not needed, since we require all chip selects to be
+	 * in the device tree explicitly
+	 */
+};
+
+static const struct udevice_id mpc8xxx_spi_ids[] = {
+	{ .compatible = "fsl,spi" },
+	{ }
+};
+
+U_BOOT_DRIVER(mpc8xxx_spi) = {
+	.name	= "mpc8xxx_spi",
+	.id	= UCLASS_SPI,
+	.of_match = mpc8xxx_spi_ids,
+	.ops	= &mpc8xxx_spi_ops,
+	.ofdata_to_platdata = mpc8xxx_spi_ofdata_to_platdata,
+	.probe	= mpc8xxx_spi_probe,
+	.priv_auto_alloc_size = sizeof(struct mpc8xxx_priv),
+};
diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
index 500853fc95..8116193d27 100644
--- a/drivers/spi/spi.c
+++ b/drivers/spi/spi.c
@@ -42,6 +42,7 @@ void *spi_do_alloc_slave(int offset, int size, unsigned int bus,
 #if !defined(CONFIG_DM_SPI) && \
 	defined(CONFIG_DAVINCI_SPI) || \
 	defined(CONFIG_KIRKWOOD_SPI) || \
+	defined(CONFIG_MPC8XXX_SPI) || \
 	defined(CONFIG_TI_QSPI)
 void spi_cs_activate(struct spi_slave *slave)
 {
-- 
2.18.0.321.gffc6fa0e3

  parent reply	other threads:[~2018-11-20 12:48 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-11-20 12:47 [U-Boot] [PATCH 00/34] spi: DM_SPI migration timeout! Jagan Teki
2018-11-20 12:47 ` [U-Boot] [PATCH 01/34] spi: Remove unused spi_init Jagan Teki
2018-11-20 12:47 ` [U-Boot] [PATCH 02/34] spi: Remove used spi_init Jagan Teki
2018-11-20 12:47 ` [U-Boot] [PATCH 03/34] spi: davinci: Full dm conversion Jagan Teki
2018-11-20 14:45   ` Adam Ford
2018-11-21  9:33   ` Chris Packham
2018-11-20 12:47 ` [U-Boot] [PATCH 04/34] spi: kirkwood: " Jagan Teki
2018-11-21  7:52   ` Chris Packham
2018-11-21  8:39     ` Jagan Teki
2018-11-21  8:59       ` Chris Packham
2018-11-21  9:04         ` Jagan Teki
2018-11-20 12:47 ` [U-Boot] [PATCH 05/34] spi: ti_qspi: " Jagan Teki
2018-11-20 12:47 ` [U-Boot] [PATCH 06/34] spi: mpc8xxx: Use short type names Jagan Teki
2018-11-20 12:47 ` [U-Boot] [PATCH 07/34] spi: mpc8xxx: Fix comments Jagan Teki
2018-11-20 12:47 ` [U-Boot] [PATCH 08/34] spi: mpc8xxx: Rename camel-case variables Jagan Teki
2018-11-20 12:47 ` [U-Boot] [PATCH 09/34] spi: mpc8xxx: Fix space after cast Jagan Teki
2018-11-20 12:47 ` [U-Boot] [PATCH 10/34] spi: mpc8xxx: Fix function names in strings Jagan Teki
2018-11-20 12:47 ` [U-Boot] [PATCH 11/34] spi: mpc8xxx: Replace defines with enums Jagan Teki
2018-11-20 12:47 ` [U-Boot] [PATCH 12/34] spi: mpc8xxx: Use IO accessors Jagan Teki
2018-11-20 12:47 ` [U-Boot] [PATCH 13/34] spi: mpc8xxx: Simplify if Jagan Teki
2018-11-20 12:47 ` [U-Boot] [PATCH 14/34] spi: mpc8xxx: Get rid of is_read Jagan Teki
2018-11-20 12:47 ` [U-Boot] [PATCH 15/34] spi: mpc8xxx: Simplify logic a bit Jagan Teki
2018-11-20 12:47 ` [U-Boot] [PATCH 16/34] spi: mpc8xxx: Reduce scope of loop variables Jagan Teki
2018-11-20 12:47 ` [U-Boot] [PATCH 17/34] spi: mpc8xxx: Make code more readable Jagan Teki
2018-11-20 12:47 ` [U-Boot] [PATCH 18/34] spi: mpc8xxx: Rename variable Jagan Teki
2018-11-20 12:47 ` [U-Boot] [PATCH 19/34] spi: mpc8xxx: Document LEN setting better Jagan Teki
2018-11-20 12:48 ` [U-Boot] [PATCH 20/34] spi: mpc8xxx: Re-order transfer setup Jagan Teki
2018-11-20 12:48 ` [U-Boot] [PATCH 21/34] spi: mpc8xxx: Fix if check Jagan Teki
2018-11-20 12:48 ` [U-Boot] [PATCH 22/34] spi: mpc8xxx: Use get_timer Jagan Teki
2018-11-20 12:48 ` Jagan Teki [this message]
2018-11-20 12:48 ` [U-Boot] [PATCH 24/34] spi: Zap cf_spi driver-related code Jagan Teki
2018-11-20 12:48 ` [U-Boot] [PATCH 25/34] spi: Zap lpc32xx_ssp " Jagan Teki
2018-11-20 12:48 ` [U-Boot] [PATCH 26/34] spi: Zap mxs_spi " Jagan Teki
2018-11-20 12:48 ` [U-Boot] [PATCH 27/34] spi: Zap sh_spi " Jagan Teki
2018-11-20 12:48 ` [U-Boot] [PATCH 28/34] spi: Zap soft_spi_legacy " Jagan Teki
2018-11-20 12:48 ` [U-Boot] [PATCH 29/34] spi: Zap mpc8xx_spi " Jagan Teki
2018-11-20 12:48 ` [U-Boot] [PATCH 30/34] spi: Zap mxc_spi " Jagan Teki
2018-11-20 12:48 ` [U-Boot] [PATCH 31/34] spi: Zap omap3_spi " Jagan Teki
2018-11-20 12:48 ` [U-Boot] [PATCH 32/34] spi: Zap atmel_spi " Jagan Teki
2018-11-20 12:48 ` [U-Boot] [PATCH 33/34] spi: fsl_dspi: Drop non-dm code Jagan Teki
2018-11-20 12:48 ` [U-Boot] [PATCH 34/34] dm: MIGRATION: spi: Update SPI driver status Jagan Teki

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20181120124814.23293-24-jagan@amarulasolutions.com \
    --to=jagan@amarulasolutions.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox