S3C24XX SPI updates for 2.6.27 (correct set)
Subsystems (4)
cover S3C24XX SPI updates for 2.6.27 (correct set)
The correct set of S3C24XX SPI driver updates.
Signature · 9 lines
Ben ([email protected], http://www.fluff.org/) 'a smiley only costs 4 bytes' ------------------------------------------------------------------------- This SF.Net email is sponsored by the Moblin Your Move Developer's challenge Build the coolest Linux based applications with Moblin SDK & win great prizes Grand prize is a trip for two to an Open Source event anywhere in the world http://moblin-contest.org/redirect.php?banner_id=100&url=/
PATCH 1/4 SPI: Add pin configuration callback
Add a gpio configuration callback for the s3c24xx SPI driver, as there are several options depending on the channel and the chip in use.
This is needed as the controller may not have been setup by the initial bootloader and the fact that the SPI controller gets reset over suspend/resume into slave mode but the GPIO function registers do not.
drivers/spi/spi_s3c24xx.c +6 -0
@@ -247,6 +247,9 @@ static void s3c24xx_spi_initialsetup(strwriteb (0xff , hw->regs +S3C2410_SPPRE );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 ); }static int __init s3c24xx_spi_probe (struct platform_device *pdev)
@@ -412,6 +415,9 @@ static int s3c24xx_spi_suspend(struct pl {struct s3c24xx_spi *hw =platform_get_drvdata (pdev); +if (hw->pdata && hw->pdata->gpio_setup) + hw->pdata->gpio_setup (hw->pdata,0 ); +clk_disable (hw->clk);return 0 ; }
arch/arm/mach-s3c2410/include/mach/spi.h +1 -0
@@ -18,6 +18,7 @@ struct s3c2410_spi_info {unsigned int num_cs;/* total chipselects */ int bus_num;/* bus number to use. */ +void (*gpio_setup)(struct s3c2410_spi_info *spi,int enable);void (*set_cs)(struct s3c2410_spi_info *spi,int cs,int pol); };
Signature · 9 lines
Ben ([email protected], http://www.fluff.org/) 'a smiley only costs 4 bytes' ------------------------------------------------------------------------- This SF.Net email is sponsored by the Moblin Your Move Developer's challenge Build the coolest Linux based applications with Moblin SDK & win great prizes Grand prize is a trip for two to an Open Source event anywhere in the world http://moblin-contest.org/redirect.php?banner_id=100&url=/
PATCH 2/4 spi_s3c24xx_gpio: fix spi-device to our private data lookup
In reply to Ben DooksThe spidev_to_sg() call in spi_s3c24xx_gpio.c was using the wrong method to convert the spi device into the private data for the driver. Fix this by using spi_master_get_devdata.
drivers/spi/spi_s3c24xx_gpio.c +1 -1
@@ -34,7 +34,7 @@ struct s3c2410_spigpio {static inline struct s3c2410_spigpio *spidev_to_sg (struct spi_device *spi) { -return spi->controller_data; +return spi_master_get_devdata (spi->master); }static inline void setsck (struct spi_device *dev,int on)
Signature · 9 lines
Ben ([email protected], http://www.fluff.org/) 'a smiley only costs 4 bytes' ------------------------------------------------------------------------- This SF.Net email is sponsored by the Moblin Your Move Developer's challenge Build the coolest Linux based applications with Moblin SDK & win great prizes Grand prize is a trip for two to an Open Source event anywhere in the world http://moblin-contest.org/redirect.php?banner_id=100&url=/
PATCH 3/4 spi_s3c24xx_gpio: fix setting of num_chipselect.
In reply to Ben DooksThe spi master driver must have num_chipselect set to allow the bus to initialise. Pass this through the platform data.
arch/arm/mach-s3c2410/include/mach/spi-gpio.h +1 -0
@@ -18,6 +18,7 @@ struct s3c2410_spigpio_info {unsigned long pin_mosi;unsigned long pin_miso; +int num_chipselect;int bus_num;void (*chip_select)(struct s3c2410_spigpio_info *spi,int cs);
drivers/spi/spi_s3c24xx_gpio.c +1 -0
@@ -118,6 +118,7 @@ static int s3c2410_spigpio_probe(struct/* setup spi bitbang adaptor */ sp->bitbang.master =spi_master_get (master); sp->bitbang.master->bus_num = info->bus_num; + sp->bitbang.master->num_chipselect = info->num_chipselect; sp->bitbang.chipselect = s3c2410_spigpio_chipselect; sp->bitbang.txrx_word[SPI_MODE_0 ] = s3c2410_spigpio_txrx_mode0;
Signature · 9 lines
Ben ([email protected], http://www.fluff.org/) 'a smiley only costs 4 bytes' ------------------------------------------------------------------------- This SF.Net email is sponsored by the Moblin Your Move Developer's challenge Build the coolest Linux based applications with Moblin SDK & win great prizes Grand prize is a trip for two to an Open Source event anywhere in the world http://moblin-contest.org/redirect.php?banner_id=100&url=/
PATCH 4/4 spi_s3c2410: use generic gpio calls instead of arch specific ones
In reply to Ben DooksChange the spi_s3c2410 driver to use the generic gpio calls that are now available.
drivers/spi/spi_s3c24xx.c +29 -9
@@ -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>
@@ -27,7 +28,6 @@#include <asm/dma.h> #include <mach/hardware.h> -#include <mach/regs-gpio.h> #include <asm/plat-s3c24xx/regs-spi.h> #include <mach/spi.h>
@@ -66,7 +66,7 @@ static inline struct s3c24xx_spi *to_hw(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)
@@ -248,8 +248,13 @@ static void s3c24xx_spi_initialsetup(strwriteb (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,1 ); + +if (hw->pdata->gpio_setup) + hw->pdata->gpio_setup (hw->pdata,1 ); + } }static int __init s3c24xx_spi_probe (struct platform_device *pdev)
@@ -343,18 +348,27 @@ static int __init s3c24xx_spi_probe(stru 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; + } + + 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; + } -s3c2410_gpio_setpin (pdata->pin_cs,1 ); -s3c2410_gpio_cfgpin (pdata->pin_cs,S3C2410_GPIO_OUTPUT ); + 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);
@@ -366,6 +380,9 @@ static int __init s3c24xx_spi_probe(strureturn 0 ; err_register: +if (hw->set_cs == s3c24xx_spi_gpiocs) +gpio_free (pdata->pin_cs); +clk_disable (hw->clk);clk_put (hw->clk);
@@ -401,6 +418,9 @@ static int __exit s3c24xx_spi_remove(strfree_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);
arch/arm/mach-s3c2410/include/mach/spi.h +1 -1
@@ -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. */
Signature · 9 lines
Ben ([email protected], http://www.fluff.org/) 'a smiley only costs 4 bytes' ------------------------------------------------------------------------- This SF.Net email is sponsored by the Moblin Your Move Developer's challenge Build the coolest Linux based applications with Moblin SDK & win great prizes Grand prize is a trip for two to an Open Source event anywhere in the world http://moblin-contest.org/redirect.php?banner_id=100&url=/