diff mbox

[U-Boot,v2,3/4] kw_spi: support spi_claim/release_bus functions

Message ID 1338392526-5754-4-git-send-email-valentin.longchamp@keymile.com
State Superseded
Headers show

Commit Message

Valentin Longchamp May 30, 2012, 3:42 p.m. UTC
These two function nows ensure that the MPP is configured correctly for
the SPI controller before any SPI access, and restore the initial
configuration when the access is over.

Since the used pins for the SPI controller can differ (2 possibilities
for each signal), the used pins are configured with CONFIG_SYS_KW_SPI_MPP.

Signed-off-by: Valentin Longchamp <valentin.longchamp@keymile.com>
cc: Holger Brunck <holger.brunck@keymile.com>
cc: Prafulla Wadaskar <prafulla@marvell.com>
---
 arch/arm/include/asm/arch-kirkwood/spi.h |   11 ++++++++
 drivers/spi/kirkwood_spi.c               |   38 ++++++++++++++++++++++++++++++
 2 files changed, 49 insertions(+), 0 deletions(-)

Comments

Prafulla Wadaskar May 31, 2012, 8:44 a.m. UTC | #1
> -----Original Message-----
> From: Valentin Longchamp [mailto:valentin.longchamp@keymile.com]
> Sent: 30 May 2012 21:12
> To: Prafulla Wadaskar
> Cc: Valentin Longchamp; holger.brunck@keymile.com; u-
> boot@lists.denx.de; Prafulla Wadaskar
> Subject: [PATCH v2 3/4] kw_spi: support spi_claim/release_bus
> functions
> 
> These two function nows ensure that the MPP is configured correctly
> for
> the SPI controller before any SPI access, and restore the initial
> configuration when the access is over.
> 
> Since the used pins for the SPI controller can differ (2 possibilities
> for each signal), the used pins are configured with
> CONFIG_SYS_KW_SPI_MPP.
> 
> Signed-off-by: Valentin Longchamp <valentin.longchamp@keymile.com>
> cc: Holger Brunck <holger.brunck@keymile.com>
> cc: Prafulla Wadaskar <prafulla@marvell.com>
> ---
>  arch/arm/include/asm/arch-kirkwood/spi.h |   11 ++++++++
>  drivers/spi/kirkwood_spi.c               |   38
> ++++++++++++++++++++++++++++++
>  2 files changed, 49 insertions(+), 0 deletions(-)
> 
> diff --git a/arch/arm/include/asm/arch-kirkwood/spi.h
> b/arch/arm/include/asm/arch-kirkwood/spi.h
> index 1d5043f..c79bed7 100644
> --- a/arch/arm/include/asm/arch-kirkwood/spi.h
> +++ b/arch/arm/include/asm/arch-kirkwood/spi.h
> @@ -37,6 +37,17 @@ struct kwspi_registers {
>  	u32 irq_mask;	/* 0x10614 */
>  };
> 
> +/* They are used to define CONFIG_SYS_KW_SPI_MPP
> + * each of the below #defines selects which mpp is
> + * configured for each SPI signal in spi_claim_bus
> + * bit 0: selects pin for MOSI (MPP1 if 0, MPP6 if 1)
> + * bit 1: selects pin for SCK (MPP2 if 0, MPP10 if 1)
> + * bit 2: selects pin for MISO (MPP3 if 0, MPP11 if 1)
> + */
> +#define MOSI_MPP6	(1 << 0)
> +#define SCK_MPP10	(1 << 1)
> +#define MISO_MPP11	(1 << 2)
> +
>  #define KWSPI_CLKPRESCL_MASK	0x1f
>  #define KWSPI_CSN_ACT		1 /* Activates serial memory interface
> */
>  #define KWSPI_SMEMRDY		(1 << 1) /* SerMem Data xfer ready */
> diff --git a/drivers/spi/kirkwood_spi.c b/drivers/spi/kirkwood_spi.c
> index 2fd89d2..a3e6b6e 100644
> --- a/drivers/spi/kirkwood_spi.c
> +++ b/drivers/spi/kirkwood_spi.c
> @@ -84,13 +84,51 @@ void spi_free_slave(struct spi_slave *slave)
>  	free(slave);
>  }
> 
> +#if defined(CONFIG_SYS_KW_SPI_MPP)
> +u32 spi_mpp_backup[4];
> +#endif
> +
>  int spi_claim_bus(struct spi_slave *slave)
>  {
> +#if defined(CONFIG_SYS_KW_SPI_MPP)
> +	u32 config;
> +	u32 spi_mpp_config[4];
> +
> +	config = CONFIG_SYS_KW_SPI_MPP;
> +
> +	if (config & MOSI_MPP6)
> +		spi_mpp_config[0] = MPP6_SPI_MOSI;
> +	else
> +		spi_mpp_config[0] = MPP1_SPI_MOSI;
> +
> +	if (config & SCK_MPP10)
> +		spi_mpp_config[1] = MPP10_SPI_SCK;
> +	else
> +		spi_mpp_config[1] = MPP2_SPI_SCK;
> +
> +	if (config & MISO_MPP11)
> +		spi_mpp_config[2] = MPP11_SPI_MISO;
> +	else
> +		spi_mpp_config[2] = MPP3_SPI_MISO;
> +
> +	spi_mpp_config[3] = 0;
> +	spi_mpp_backup[3] = 0;
> +
> +	/* save current mpp configuration */
> +	kirkwood_mpp_read(spi_mpp_config, spi_mpp_backup);
> +
> +	/* finally set chosen mpp spi configuration */
> +	kirkwood_mpp_conf(spi_mpp_config);
> +#endif
> +
>  	return 0;
>  }
> 
>  void spi_release_bus(struct spi_slave *slave)
>  {
> +#if defined(CONFIG_SYS_KW_SPI_MPP)
> +	kirkwood_mpp_conf(spi_mpp_backup);
> +#endif
>  }
> 

Acked-By: Prafulla Wadaskar <Prafulla@marvell.com>
One more comment: do you think we should safeguard spi_claim_bus for repeatative calls, for ex. once bus is claimed, it should be reclaimed until we release it?

Regards...
Prafulla . . .

>  #ifndef CONFIG_SPI_CS_IS_VALID
> --
> 1.7.1
diff mbox

Patch

diff --git a/arch/arm/include/asm/arch-kirkwood/spi.h b/arch/arm/include/asm/arch-kirkwood/spi.h
index 1d5043f..c79bed7 100644
--- a/arch/arm/include/asm/arch-kirkwood/spi.h
+++ b/arch/arm/include/asm/arch-kirkwood/spi.h
@@ -37,6 +37,17 @@  struct kwspi_registers {
 	u32 irq_mask;	/* 0x10614 */
 };
 
+/* They are used to define CONFIG_SYS_KW_SPI_MPP
+ * each of the below #defines selects which mpp is
+ * configured for each SPI signal in spi_claim_bus
+ * bit 0: selects pin for MOSI (MPP1 if 0, MPP6 if 1)
+ * bit 1: selects pin for SCK (MPP2 if 0, MPP10 if 1)
+ * bit 2: selects pin for MISO (MPP3 if 0, MPP11 if 1)
+ */
+#define MOSI_MPP6	(1 << 0)
+#define SCK_MPP10	(1 << 1)
+#define MISO_MPP11	(1 << 2)
+
 #define KWSPI_CLKPRESCL_MASK	0x1f
 #define KWSPI_CSN_ACT		1 /* Activates serial memory interface */
 #define KWSPI_SMEMRDY		(1 << 1) /* SerMem Data xfer ready */
diff --git a/drivers/spi/kirkwood_spi.c b/drivers/spi/kirkwood_spi.c
index 2fd89d2..a3e6b6e 100644
--- a/drivers/spi/kirkwood_spi.c
+++ b/drivers/spi/kirkwood_spi.c
@@ -84,13 +84,51 @@  void spi_free_slave(struct spi_slave *slave)
 	free(slave);
 }
 
+#if defined(CONFIG_SYS_KW_SPI_MPP)
+u32 spi_mpp_backup[4];
+#endif
+
 int spi_claim_bus(struct spi_slave *slave)
 {
+#if defined(CONFIG_SYS_KW_SPI_MPP)
+	u32 config;
+	u32 spi_mpp_config[4];
+
+	config = CONFIG_SYS_KW_SPI_MPP;
+
+	if (config & MOSI_MPP6)
+		spi_mpp_config[0] = MPP6_SPI_MOSI;
+	else
+		spi_mpp_config[0] = MPP1_SPI_MOSI;
+
+	if (config & SCK_MPP10)
+		spi_mpp_config[1] = MPP10_SPI_SCK;
+	else
+		spi_mpp_config[1] = MPP2_SPI_SCK;
+
+	if (config & MISO_MPP11)
+		spi_mpp_config[2] = MPP11_SPI_MISO;
+	else
+		spi_mpp_config[2] = MPP3_SPI_MISO;
+
+	spi_mpp_config[3] = 0;
+	spi_mpp_backup[3] = 0;
+
+	/* save current mpp configuration */
+	kirkwood_mpp_read(spi_mpp_config, spi_mpp_backup);
+
+	/* finally set chosen mpp spi configuration */
+	kirkwood_mpp_conf(spi_mpp_config);
+#endif
+
 	return 0;
 }
 
 void spi_release_bus(struct spi_slave *slave)
 {
+#if defined(CONFIG_SYS_KW_SPI_MPP)
+	kirkwood_mpp_conf(spi_mpp_backup);
+#endif
 }
 
 #ifndef CONFIG_SPI_CS_IS_VALID