[linux-yocto] [PATCH 14/87] arch/arm/mach-axxia/axxia.c: Chip select control for SPI devices.

Paul Butler butler.paul at gmail.com
Mon May 27 09:55:45 PDT 2013


Signed-off-by: Paul Butler <paul.butler at windriver.com>
---
 arch/arm/mach-axxia/axxia.c | 51 ++++++++++++++++++++++++++++++++++-----------
 1 file changed, 39 insertions(+), 12 deletions(-)

diff --git a/arch/arm/mach-axxia/axxia.c b/arch/arm/mach-axxia/axxia.c
index 623957e..777f998 100644
--- a/arch/arm/mach-axxia/axxia.c
+++ b/arch/arm/mach-axxia/axxia.c
@@ -48,6 +48,7 @@
 #include <mach/timers.h>
 #include "axxia.h"
 #include "pci.h"
+#include "i2c.h"
 
 static const char *axxia_dt_match[] __initconst = {
 	"lsi,axm5516",		/* AXM5516 */
@@ -157,19 +158,41 @@ static struct of_dev_auxdata axxia_auxdata_lookup[] __initdata = {
 	{}
 };
 
-struct pl022_config_chip spi_eeprom = {
-	.iface = SSP_INTERFACE_MOTOROLA_SPI,
-	.clk_freq = {
-		.cpsdvsr = 0,   /* value from 2 to 254 (even only!) */
-		.scr     = 0,	/* value from 0 to 255 */
-	},
-	.com_mode = POLLING_TRANSFER,
+static inline void
+spidev_chip_select(u32 control, unsigned n)
+{
+	if (control == SSP_CHIP_SELECT)
+		writel(~(1<<n) & 0x1F, ssp_base+0x30);
+	else
+		writel(0x1F, ssp_base+0x30);
+}
+
+static void spi_cs_eeprom0(u32 control) { spidev_chip_select(control, 0); }
+static void spi_cs_eeprom1(u32 control) { spidev_chip_select(control, 1); }
+static void spi_cs_eeprom2(u32 control) { spidev_chip_select(control, 2); }
+
+struct pl022_config_chip spi_eeprom0 = {
+	.iface      = SSP_INTERFACE_MOTOROLA_SPI,
+	.com_mode   = POLLING_TRANSFER,
+	.cs_control = spi_cs_eeprom0
+};
+
+struct pl022_config_chip spi_eeprom1 = {
+	.iface      = SSP_INTERFACE_MOTOROLA_SPI,
+	.com_mode   = POLLING_TRANSFER,
+	.cs_control = spi_cs_eeprom1
+};
+
+struct pl022_config_chip spi_eeprom2 = {
+	.iface      = SSP_INTERFACE_MOTOROLA_SPI,
+	.com_mode   = POLLING_TRANSFER,
+	.cs_control = spi_cs_eeprom2
 };
 
 static struct spi_board_info spi_devs[] __initdata = {
 	{
 		.modalias               = "spidev",
-		.controller_data        = &spi_eeprom,
+		.controller_data        = &spi_eeprom0,
 		.bus_num                = 0,
 		.chip_select            = 0,
 		.max_speed_hz           = 12000000,
@@ -177,7 +200,7 @@ static struct spi_board_info spi_devs[] __initdata = {
 	},
 	{
 		.modalias               = "spidev",
-		.controller_data        = &spi_eeprom,
+		.controller_data        = &spi_eeprom1,
 		.bus_num                = 0,
 		.chip_select            = 1,
 		.max_speed_hz           = 12000000,
@@ -185,7 +208,7 @@ static struct spi_board_info spi_devs[] __initdata = {
 	},
 	{
 		.modalias               = "spidev",
-		.controller_data        = &spi_eeprom,
+		.controller_data        = &spi_eeprom2,
 		.bus_num                = 0,
 		.chip_select            = 2,
 		.max_speed_hz           = 12000000,
@@ -208,11 +231,15 @@ void __init axxia_dt_init(void)
 	ssp_base =
 		of_iomap(of_find_compatible_node(NULL, NULL, "arm,pl022"), 0);
 	if (!WARN_ON(ssp_base == NULL)) {
-		printk(KERN_INFO "SSPCSR = %08x\n", readl(ssp_base+0x30));
-		writel((0x1F << 8) | (0<<5) | (0x1F<<0), ssp_base+0x30);
+		/* Use legacy mode, bits 0..4 control nCS[0..4] pins */
+		writel(0x1F, ssp_base+0x30);
 	}
 
 	axxia_pcie_init();
+
+#ifdef CONFIG_I2C
+	axxia_register_i2c_busses();
+#endif
 }
 
 static void axxia_restart(char str, const char *cmd)
-- 
1.8.3




More information about the linux-yocto mailing list