Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 126335
b: refs/heads/master
c: ee9c1fb
h: refs/heads/master
i:
  126333: 168469c
  126331: 0451985
  126327: d95e3c5
  126319: 08515a6
  126303: ae2d64d
  126271: 7491989
  126207: 430159b
v: v3
  • Loading branch information
Ben Dooks authored and Linus Torvalds committed Jan 6, 2009
1 parent aff57a4 commit 7c9003f
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 11 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 5ee36c989831ab720eee282521462cce0a3c4900
refs/heads/master: ee9c1fbfe130a20e0f23d1693d6427dac97239bc
2 changes: 1 addition & 1 deletion trunk/arch/arm/mach-s3c2410/include/mach/spi.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
#define __ASM_ARCH_SPI_H __FILE__

struct s3c2410_spi_info {
unsigned long pin_cs; /* simple gpio cs */
int pin_cs; /* simple gpio cs */
unsigned int num_cs; /* total chipselects */
int bus_num; /* bus number to use. */

Expand Down
38 changes: 29 additions & 9 deletions trunk/drivers/spi/spi_s3c24xx.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
#include <linux/err.h>
#include <linux/clk.h>
#include <linux/platform_device.h>
#include <linux/gpio.h>

#include <linux/spi/spi.h>
#include <linux/spi/spi_bitbang.h>
Expand All @@ -27,7 +28,6 @@
#include <asm/dma.h>
#include <mach/hardware.h>

#include <mach/regs-gpio.h>
#include <plat/regs-spi.h>
#include <mach/spi.h>

Expand Down Expand Up @@ -66,7 +66,7 @@ static inline struct s3c24xx_spi *to_hw(struct spi_device *sdev)

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

static void s3c24xx_spi_chipsel(struct spi_device *spi, int value)
Expand Down Expand Up @@ -248,8 +248,13 @@ static void s3c24xx_spi_initialsetup(struct s3c24xx_spi *hw)
writeb(SPPIN_DEFAULT, hw->regs + S3C2410_SPPIN);
writeb(SPCON_DEFAULT, hw->regs + S3C2410_SPCON);

if (hw->pdata && hw->pdata->gpio_setup)
hw->pdata->gpio_setup(hw->pdata, 1);
if (hw->pdata) {
if (hw->set_cs == s3c24xx_spi_gpiocs)
gpio_direction_output(hw->pdata->pin_cs, 1);

if (hw->pdata->gpio_setup)
hw->pdata->gpio_setup(hw->pdata, 1);
}
}

static int __init s3c24xx_spi_probe(struct platform_device *pdev)
Expand Down Expand Up @@ -343,18 +348,27 @@ static int __init s3c24xx_spi_probe(struct platform_device *pdev)
goto err_no_clk;
}

s3c24xx_spi_initialsetup(hw);

/* setup any gpio we can */

if (!pdata->set_cs) {
hw->set_cs = s3c24xx_spi_gpiocs;
if (pdata->pin_cs < 0) {
dev_err(&pdev->dev, "No chipselect pin\n");
goto err_register;
}

s3c2410_gpio_setpin(pdata->pin_cs, 1);
s3c2410_gpio_cfgpin(pdata->pin_cs, S3C2410_GPIO_OUTPUT);
err = gpio_request(pdata->pin_cs, dev_name(&pdev->dev));
if (err) {
dev_err(&pdev->dev, "Failed to get gpio for cs\n");
goto err_register;
}

hw->set_cs = s3c24xx_spi_gpiocs;
gpio_direction_output(pdata->pin_cs, 1);
} else
hw->set_cs = pdata->set_cs;

s3c24xx_spi_initialsetup(hw);

/* register our spi controller */

err = spi_bitbang_start(&hw->bitbang);
Expand All @@ -366,6 +380,9 @@ static int __init s3c24xx_spi_probe(struct platform_device *pdev)
return 0;

err_register:
if (hw->set_cs == s3c24xx_spi_gpiocs)
gpio_free(pdata->pin_cs);

clk_disable(hw->clk);
clk_put(hw->clk);

Expand Down Expand Up @@ -401,6 +418,9 @@ static int __exit s3c24xx_spi_remove(struct platform_device *dev)
free_irq(hw->irq, hw);
iounmap(hw->regs);

if (hw->set_cs == s3c24xx_spi_gpiocs)
gpio_free(hw->pdata->pin_cs);

release_resource(hw->ioarea);
kfree(hw->ioarea);

Expand Down

0 comments on commit 7c9003f

Please sign in to comment.