Skip to content
Snippets Groups Projects
Commit ac486e3b authored by Valentin Longchamp's avatar Valentin Longchamp Committed by Albert ARIBAUD
Browse files

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: default avatarValentin Longchamp <valentin.longchamp@keymile.com>
cc: Holger Brunck <holger.brunck@keymile.com>
cc: Prafulla Wadaskar <prafulla@marvell.com>
parent ca880679
No related branches found
No related tags found
No related merge requests found
...@@ -37,6 +37,17 @@ struct kwspi_registers { ...@@ -37,6 +37,17 @@ struct kwspi_registers {
u32 irq_mask; /* 0x10614 */ 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_CLKPRESCL_MASK 0x1f
#define KWSPI_CSN_ACT 1 /* Activates serial memory interface */ #define KWSPI_CSN_ACT 1 /* Activates serial memory interface */
#define KWSPI_SMEMRDY (1 << 1) /* SerMem Data xfer ready */ #define KWSPI_SMEMRDY (1 << 1) /* SerMem Data xfer ready */
......
...@@ -83,13 +83,49 @@ void spi_free_slave(struct spi_slave *slave) ...@@ -83,13 +83,49 @@ void spi_free_slave(struct spi_slave *slave)
free(slave); free(slave);
} }
#if defined(CONFIG_SYS_KW_SPI_MPP)
u32 spi_mpp_backup[4];
#endif
int spi_claim_bus(struct spi_slave *slave) 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;
/* set new spi mpp and save current mpp config */
kirkwood_mpp_conf(spi_mpp_config, spi_mpp_backup);
#endif
return 0; return 0;
} }
void spi_release_bus(struct spi_slave *slave) void spi_release_bus(struct spi_slave *slave)
{ {
#if defined(CONFIG_SYS_KW_SPI_MPP)
kirkwood_mpp_conf(spi_mpp_backup, NULL);
#endif
} }
#ifndef CONFIG_SPI_CS_IS_VALID #ifndef CONFIG_SPI_CS_IS_VALID
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment