All of lore.kernel.org
 help / color / mirror / Atom feed
* - spi-freescale-imx-spi-controller-driver-v5.patch removed from -mm tree
@ 2007-02-12  7:22 akpm
  0 siblings, 0 replies; only message in thread
From: akpm @ 2007-02-12  7:22 UTC (permalink / raw)
  To: a.paterniani, david-b, mm-commits


The patch titled
     spi: freescale iMX SPI controller driver (v5)
has been removed from the -mm tree.  Its filename was
     spi-freescale-imx-spi-controller-driver-v5.patch

This patch was dropped because it was folded into spi-freescale-imx-spi-controller-driver-bis.patch

------------------------------------------------------
Subject: spi: freescale iMX SPI controller driver (v5)
From: "Andrea Paterniani" <a.paterniani@swapp-eng.it>

- Dummy char for read-only transfer is now 0 (as suggested by D. Brownell).

- Solved a pio mode read only transfer bug.

- Added 2 new fields inside struct spi_imx_chip to manage bit clock wait
  and /SS pulse between spi burst.

Signed-off-by: Andrea Paterniani <a.paterniani@swapp-eng.it>
Cc: David Brownell <david-b@pacbell.net>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
---

 drivers/spi/Kconfig                |   12 +++---
 drivers/spi/spi_imx.c              |   53 ++++++++++++++++++++-------
 include/asm-arm/arch-imx/spi_imx.h |    7 +--
 3 files changed, 51 insertions(+), 21 deletions(-)

diff -puN drivers/spi/Kconfig~spi-freescale-imx-spi-controller-driver-v5 drivers/spi/Kconfig
--- a/drivers/spi/Kconfig~spi-freescale-imx-spi-controller-driver-v5
+++ a/drivers/spi/Kconfig
@@ -75,6 +75,13 @@ config SPI_BUTTERFLY
 	  inexpensive battery powered microcontroller evaluation board.
 	  This same cable can be used to flash new firmware.
 
+config SPI_IMX
+	tristate "Freescale iMX SPI controller"
+	depends on SPI_MASTER && ARCH_IMX && EXPERIMENTAL
+	help
+	  This enables using the Freescale iMX SPI controller in master
+	  mode.
+
 config SPI_MPC83xx
 	tristate "Freescale MPC83xx SPI controller"
 	depends on SPI_MASTER && PPC_83xx && EXPERIMENTAL
@@ -94,11 +101,6 @@ config SPI_OMAP_UWIRE
 	help
 	  This hooks up to the MicroWire controller on OMAP1 chips.
 
-config SPI_IMX
-	tristate "iMX SPI controller driver"
-	depends on SPI_MASTER && ARCH_IMX && EXPERIMENTAL
-	help
-	  This is the iMX SPI controller driver.
 
 config SPI_PXA2XX
 	tristate "PXA2xx SSP SPI master"
diff -puN drivers/spi/spi_imx.c~spi-freescale-imx-spi-controller-driver-v5 drivers/spi/spi_imx.c
--- a/drivers/spi/spi_imx.c~spi-freescale-imx-spi-controller-driver-v5
+++ a/drivers/spi/spi_imx.c
@@ -140,13 +140,14 @@
 	SPI_CONTROL_POL_ACT_HIGH |	\
 	SPI_CONTROL_PHA_0 |		\
 	SPI_CONTROL_SPIEN |		\
-	SPI_CONTROL_SSCTL_0 |		\
+	SPI_CONTROL_SSCTL_1 |		\
 	SPI_CONTROL_MODE_MASTER |	\
 	SPI_CONTROL_DRCTL_0 |		\
 	SPI_CONTROL_DATARATE_MIN	\
 )
 #define SPI_DEFAULT_ENABLE_LOOPBACK	(0)
 #define SPI_DEFAULT_ENABLE_DMA		(0)
+#define SPI_DEFAULT_PERIOD_WAIT		(8)
 /*-------------------------------------------------------------------------*/
 
 
@@ -254,6 +255,7 @@ struct driver_data {
 /* Runtime state */
 struct chip_data {
 	u32 control;
+	u32 period;
 	u32 test;
 
 	u8 enable_dma:1;
@@ -296,7 +298,7 @@ static void restore_state(struct driver_
 		chip->test,
 		chip->control);
 	writel(chip->test, regs + SPI_TEST);
-	writel(0, regs + SPI_PERIOD);
+	writel(chip->period, regs + SPI_PERIOD);
 	writel(0, regs + SPI_INT_STATUS);
 	writel(chip->control, regs + SPI_CONTROL);
 }
@@ -348,9 +350,9 @@ static int write(struct driver_data *drv
 	if (n > 0) {
 		/* Fill SPI TXFIFO */
 		if (drv_data->rd_only) {
+			tx += n * n_bytes;
 			while (n--)
 				writel(SPI_DUMMY_u16, regs + SPI_TXDATA);
-			tx += n * n_bytes;
 		} else {
 			if (n_bytes == 1) {
 				while (n--) {
@@ -1203,20 +1205,43 @@ static int setup(struct spi_device *spi)
 			chip_info->enable_loopback =
 						SPI_DEFAULT_ENABLE_LOOPBACK;
 			chip_info->enable_dma = SPI_DEFAULT_ENABLE_DMA;
+			chip_info->ins_ss_pulse = 1;
+			chip_info->bclk_wait = SPI_DEFAULT_PERIOD_WAIT;
 			chip_info->cs_control = null_cs_control;
 		}
 	}
 
 	/* Now set controller state based on controller data */
 
-	/* SPI loopback */
-	if (chip_info->enable_loopback)
-		chip->test = SPI_TEST_LBC;
-	else
-		chip->test = 0;
+	if (first_setup) {
+		/* SPI loopback */
+		if (chip_info->enable_loopback)
+			chip->test = SPI_TEST_LBC;
+		else
+			chip->test = 0;
 
-	/* SPI dma driven */
-	chip->enable_dma = chip_info->enable_dma;
+		/* SPI dma driven */
+		chip->enable_dma = chip_info->enable_dma;
+
+		/* SPI /SS pulse between spi burst */
+		if (chip_info->ins_ss_pulse)
+			u32_EDIT(chip->control,
+				SPI_CONTROL_SSCTL, SPI_CONTROL_SSCTL_1);
+		else
+			u32_EDIT(chip->control,
+				SPI_CONTROL_SSCTL, SPI_CONTROL_SSCTL_0);
+
+		/* SPI bclk waits between each bits_per_word spi burst */
+		if (chip_info->bclk_wait > SPI_PERIOD_MAX_WAIT) {
+			dev_err(&spi->dev,
+				"setup - "
+				"bclk_wait exceeds max allowed (%d)\n",
+				SPI_PERIOD_MAX_WAIT);
+			goto err_first_setup;
+		}
+		chip->period = SPI_PERIOD_CSRC_BCLK |
+				(chip_info->bclk_wait & SPI_PERIOD_WAIT);
+	}
 
 	/* SPI mode */
 	tmp = spi->mode;
@@ -1316,17 +1341,20 @@ static int setup(struct spi_device *spi)
 		"setup succeded\n"
 		"    loopback enable   = %s\n"
 		"    dma enable        = %s\n"
+		"    insert /ss pulse  = %s\n"
+		"    period wait       = %d\n"
 		"    mode              = %d\n"
 		"    bits per word     = %d\n"
 		"    min speed         = %d Hz\n"
 		"    rounded max speed = %d Hz\n",
 		chip->test & SPI_TEST_LBC ? "Yes" : "No",
 		chip->enable_dma ? "Yes" : "No",
+		chip->control & SPI_CONTROL_SSCTL ? "Yes" : "No",
+		chip->period & SPI_PERIOD_WAIT,
 		spi->mode,
 		spi->bits_per_word,
 		spi_speed_hz(SPI_CONTROL_DATARATE_MIN),
 		spi->max_speed_hz);
-	return status;
 
 err_first_setup:
 	kfree(chip);
@@ -1416,7 +1444,8 @@ static int destroy_queue(struct driver_d
 	if (status != 0)
 		return status;
 
-	destroy_workqueue(drv_data->workqueue);
+	if (drv_data->workqueue)
+		destroy_workqueue(drv_data->workqueue);
 
 	return 0;
 }
diff -puN include/asm-arm/arch-imx/spi_imx.h~spi-freescale-imx-spi-controller-driver-v5 include/asm-arm/arch-imx/spi_imx.h
--- a/include/asm-arm/arch-imx/spi_imx.h~spi-freescale-imx-spi-controller-driver-v5
+++ a/include/asm-arm/arch-imx/spi_imx.h
@@ -50,17 +50,16 @@ struct spi_imx_master {
  *	sections.
  * @enable_dma : enables dma transfer (provided that controller driver has
  *	dma enabled too).
- * @mode : defines clock phase and polarity (SPI_MODE_0..SPI_MODE_3).
- * @bits_per_word : data transfer word size (1..16).
  * @ins_ss_pulse : enable /SS pulse insertion between SPI burst.
- * @period_bclk : used to define wait time (number of bit clock) between data
- *	transactions (0..32767).
+ * @bclk_wait : number of bclk waits between each bits_per_word SPI burst.
  * @cs_control : function pointer to board-specific function to assert/deassert
  *	I/O port to control HW generation of devices chip-select.
 */
 struct spi_imx_chip {
 	u8	enable_loopback:1;
 	u8	enable_dma:1;
+	u8	ins_ss_pulse:1;
+	u16	bclk_wait:15;
 	void (*cs_control)(u32 control);
 };
 
_

Patches currently in -mm which might be from a.paterniani@swapp-eng.it are

spi-freescale-imx-spi-controller-driver-bis.patch
spi-freescale-imx-spi-controller-driver-v5.patch

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2007-02-12  7:22 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-02-12  7:22 - spi-freescale-imx-spi-controller-driver-v5.patch removed from -mm tree akpm

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.