s3c-gpio-spi-allow-multi-cs.patch

From: warmcat <[EMAIL PROTECTED]>

- Allow multiple chip selects to really work with S3C bitbang

Signed-off-by: warmcat <[EMAIL PROTECTED]>
---

 arch/arm/mach-s3c2410/mach-gta01.c      |    2 +-
 arch/arm/mach-s3c2410/mach-qt2410.c     |    2 +-
 arch/arm/mach-s3c2440/mach-gta02.c      |    7 ++++---
 drivers/spi/spi_s3c24xx_gpio.c          |   11 +++++++----
 include/asm-arm/arch-s3c2410/spi-gpio.h |    2 +-
 5 files changed, 14 insertions(+), 10 deletions(-)


diff --git a/arch/arm/mach-s3c2410/mach-gta01.c b/arch/arm/mach-s3c2410/mach-gta01.c
index 1df5733..fa9ae48 100644
--- a/arch/arm/mach-s3c2410/mach-gta01.c
+++ b/arch/arm/mach-s3c2410/mach-gta01.c
@@ -521,7 +521,7 @@ static struct spi_board_info gta01_spi_board_info[] = {
 	},
 };
 
-static void spi_gpio_cs(struct s3c2410_spigpio_info *spi, int cs)
+static void spi_gpio_cs(struct s3c2410_spigpio_info *spi, int csidx, int cs)
 {
 	switch (cs) {
 	case BITBANG_CS_ACTIVE:
diff --git a/arch/arm/mach-s3c2410/mach-qt2410.c b/arch/arm/mach-s3c2410/mach-qt2410.c
index 27b094d..cfe00fa 100644
--- a/arch/arm/mach-s3c2410/mach-qt2410.c
+++ b/arch/arm/mach-s3c2410/mach-qt2410.c
@@ -217,7 +217,7 @@ static struct platform_device qt2410_led = {
 
 /* SPI */
 
-static void spi_gpio_cs(struct s3c2410_spigpio_info *spi, int cs)
+static void spi_gpio_cs(struct s3c2410_spigpio_info *spi, int csidx, int cs)
 {
 	switch (cs) {
 	case BITBANG_CS_ACTIVE:
diff --git a/arch/arm/mach-s3c2440/mach-gta02.c b/arch/arm/mach-s3c2440/mach-gta02.c
index d2b96db..aabb312 100644
--- a/arch/arm/mach-s3c2440/mach-gta02.c
+++ b/arch/arm/mach-s3c2440/mach-gta02.c
@@ -535,17 +535,18 @@ static struct spi_board_info gta02_spi_acc_bdinfo[] = {
 	},
 };
 
-static void spi_acc_cs(struct s3c2410_spigpio_info *spigpio_info, int cs)
+static void spi_acc_cs(struct s3c2410_spigpio_info *spigpio_info,
+		       int csid, int cs)
 {
 	struct lis302dl_platform_data * plat_data =
 				(struct lis302dl_platform_data *)spigpio_info->
 						     board_info->platform_data;
 	switch (cs) {
 	case BITBANG_CS_ACTIVE:
-		s3c2410_gpio_setpin(plat_data->pin_chip_select, 0);
+		s3c2410_gpio_setpin(plat_data[csid].pin_chip_select, 0);
 		break;
 	case BITBANG_CS_INACTIVE:
-		s3c2410_gpio_setpin(plat_data->pin_chip_select, 1);
+		s3c2410_gpio_setpin(plat_data[csid].pin_chip_select, 1);
 		break;
 	}
 }
diff --git a/drivers/spi/spi_s3c24xx_gpio.c b/drivers/spi/spi_s3c24xx_gpio.c
index 6ed6a3e..4dbdcaa 100644
--- a/drivers/spi/spi_s3c24xx_gpio.c
+++ b/drivers/spi/spi_s3c24xx_gpio.c
@@ -89,9 +89,8 @@ static u32 s3c2410_spigpio_txrx_mode3(struct spi_device *spi,
 static void s3c2410_spigpio_chipselect(struct spi_device *dev, int value)
 {
 	struct s3c2410_spigpio *sg = spidev_to_sg(dev);
-
 	if (sg->info && sg->info->chip_select)
-		(sg->info->chip_select)(sg->info, value);
+		(sg->info->chip_select)(sg->info, dev->chip_select, value);
 }
 
 static int s3c2410_spigpio_probe(struct platform_device *dev)
@@ -113,7 +112,7 @@ static int s3c2410_spigpio_probe(struct platform_device *dev)
 
 	platform_set_drvdata(dev, sp);
 
-	/* copy in the plkatform data */
+	/* copy in the platform data */
 	info = sp->info = dev->dev.platform_data;
 
 	master->num_chipselect = info->num_chipselect;
@@ -148,12 +147,16 @@ static int s3c2410_spigpio_probe(struct platform_device *dev)
 	/* register the chips to go with the board */
 
 	for (i = 0; i < sp->info->board_size; i++) {
+		struct spi_device * spidev;
 		dev_info(&dev->dev, "registering %p: %s\n",
 			 &sp->info->board_info[i],
 			 sp->info->board_info[i].modalias);
 
 		sp->info->board_info[i].controller_data = sp;
-		spi_new_device(master, sp->info->board_info + i);
+		spidev = spi_new_device(master, sp->info->board_info + i);
+		if (spidev)
+			spidev->max_speed_hz =
+					  sp->info->board_info[i].max_speed_hz;
 	}
 
 	return 0;
diff --git a/include/asm-arm/arch-s3c2410/spi-gpio.h b/include/asm-arm/arch-s3c2410/spi-gpio.h
index 42f0965..03dea09 100644
--- a/include/asm-arm/arch-s3c2410/spi-gpio.h
+++ b/include/asm-arm/arch-s3c2410/spi-gpio.h
@@ -27,7 +27,7 @@ struct s3c2410_spigpio_info {
 	unsigned long		 board_size;
 	struct spi_board_info	*board_info;
 
-	void (*chip_select)(struct s3c2410_spigpio_info *spi, int cs);
+	void (*chip_select)(struct s3c2410_spigpio_info *spi, int csid, int cs);
 };
 
 

Reply via email to