Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8736b927 authored by Ben Dooks's avatar Ben Dooks Committed by Linus Torvalds
Browse files

[PATCH] S3C24XX: fix passing spi chipselect to select routine



It turns out that the spi chipselect was not being passed to the set_cs
routine if one was specified in the platform data.

As part of the fix, change to using a set_cs field in the controller state,
and put a default gpio routine in if the data passed does not specify it.

Also remove the //#define DEBUG

Signed-off-by: default avatarBen Dooks <ben-linux@fluff.org>
Signed-off-by: default avatarDavid Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 46fe4ddd
Loading
Loading
Loading
Loading
+14 −14
Original line number Diff line number Diff line
@@ -10,9 +10,6 @@
 *
*/


//#define DEBUG

#include <linux/init.h>
#include <linux/spinlock.h>
#include <linux/workqueue.h>
@@ -44,6 +41,9 @@ struct s3c24xx_spi {
	int			 len;
	int			 count;

	int			(*set_cs)(struct s3c2410_spi_info *spi,
					  int cs, int pol);

	/* data buffers */
	const unsigned char	*tx;
	unsigned char		*rx;
@@ -64,6 +64,11 @@ static inline struct s3c24xx_spi *to_hw(struct spi_device *sdev)
	return spi_master_get_devdata(sdev->master);
}

static void s3c24xx_spi_gpiocs(struct s3c2410_spi_info *spi, int cs, int pol)
{
	s3c2410_gpio_setpin(spi->pin_cs, pol);
}

static void s3c24xx_spi_chipsel(struct spi_device *spi, int value)
{
	struct s3c24xx_spi *hw = to_hw(spi);
@@ -72,10 +77,7 @@ static void s3c24xx_spi_chipsel(struct spi_device *spi, int value)

	switch (value) {
	case BITBANG_CS_INACTIVE:
		if (hw->pdata->set_cs)
			hw->pdata->set_cs(hw->pdata, value, cspol);
		else
			s3c2410_gpio_setpin(hw->pdata->pin_cs, cspol ^ 1);
		hw->pdata->set_cs(hw->pdata, spi->chip_select, cspol^1);
		break;

	case BITBANG_CS_ACTIVE:
@@ -96,14 +98,9 @@ static void s3c24xx_spi_chipsel(struct spi_device *spi, int value)
		/* write new configration */

		writeb(spcon, hw->regs + S3C2410_SPCON);

		if (hw->pdata->set_cs)
			hw->pdata->set_cs(hw->pdata, value, cspol);
		else
			s3c2410_gpio_setpin(hw->pdata->pin_cs, cspol);
		hw->pdata->set_cs(hw->pdata, spi->chip_select, cspol);

		break;

	}
}

@@ -330,9 +327,12 @@ static int s3c24xx_spi_probe(struct platform_device *pdev)
	/* setup any gpio we can */

	if (!hw->pdata->set_cs) {
		hw->set_cs = s3c24xx_spi_gpiocs;

		s3c2410_gpio_setpin(hw->pdata->pin_cs, 1);
		s3c2410_gpio_cfgpin(hw->pdata->pin_cs, S3C2410_GPIO_OUTPUT);
	}
	} else
		hw->set_cs = hw->pdata->set_cs;

	/* register our spi controller */