
-----Original Message----- From: Valentin Longchamp [mailto:valentin.longchamp@keymile.com] Sent: 16 May 2012 16:24 To: Prafulla Wadaskar; holger.brunck@keymile.com Cc: Valentin Longchamp; u-boot@lists.denx.de; Holger Brunck; Prafulla Wadaskar Subject: [PATCH 2/3] spi/kirkwood: 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 | 9 ++++++++ drivers/spi/kirkwood_spi.c | 34 ++++++++++++++++++++++++++++++ 2 files changed, 43 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..305c573 100644 --- a/arch/arm/include/asm/arch-kirkwood/spi.h +++ b/arch/arm/include/asm/arch-kirkwood/spi.h @@ -37,6 +37,15 @@ struct kwspi_registers { u32 irq_mask; /* 0x10614 */ };
+#define CSn_MPP7 0x1 +#define MOSI_MPP6 0x2 +#define SCK_MPP10 0x4 +#define MISO_MPP11 0x8
Let's define above as (1 << x) to make it more readable.
+#ifndef CONFIG_SYS_KW_SPI_MPP +#define CONFIG_SYS_KW_SPI_MPP 0x0
Some more documentation is needed, you need to explain how each bit we are using to configure the SPI-MPPs
+#endif
#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 db8ba8b..0877915 100644 --- a/drivers/spi/kirkwood_spi.c +++ b/drivers/spi/kirkwood_spi.c @@ -88,11 +88,45 @@ void spi_free_slave(struct spi_slave *slave)
int spi_claim_bus(struct spi_slave *slave) {
Instead define here #ifdef CONFIG_SYS_KW_SPI_MPP, otherwise build with default.
- u32 config;
- u32 spi_mpp_config[5];
- config = CONFIG_SYS_KW_SPI_MPP;
- if (config & CSn_MPP7)
spi_mpp_config[0] = MPP7_SPI_SCn;
- else
spi_mpp_config[0] = MPP0_SPI_SCn;
- if (config & MOSI_MPP6)
spi_mpp_config[1] = MPP6_SPI_MOSI;
- else
spi_mpp_config[1] = MPP1_SPI_MOSI;
- if (config & SCK_MPP10)
spi_mpp_config[2] = MPP10_SPI_SCK;
- else
spi_mpp_config[2] = MPP2_SPI_SCK;
- if (config & MISO_MPP11)
spi_mpp_config[3] = MPP11_SPI_MISO;
- else
spi_mpp_config[3] = MPP3_SPI_MISO;
- spi_mpp_config[4] = 0;
- /* save current mpp configuration */
- kirkwood_mpp_save();
- /* finally set chosen mpp spi configuration */
- kirkwood_mpp_conf(spi_mpp_config);
- return 0;
}
void spi_release_bus(struct spi_slave *slave) {
- kirkwood_mpp_restore();
}
#ifndef CONFIG_SPI_CS_IS_VALID
Regards.. Prafulla . . .
1.7.1