Re: [spi-devel-general] [PATCH -mm v4][POWERPC] mpc8xxx : allow SPI without cs.

2009-07-02 Thread David Brownell
On Friday 19 June 2009, Rini van Zetten wrote:
> This patch adds the possibility to have a spi device without a cs.

Note that there's now the SPI_NO_CS bit in spi_device.mode
to describe this situation ... so no "-EEXIST" hackery should
ever tempt anyone again.




___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: [PATCH -mm v4][POWERPC] mpc8xxx : allow SPI without cs.

2009-06-19 Thread Rini van Zetten

This patch adds the possibility to have a spi device without a cs.

For example, the dts file should look something like this:

spi-controller {
   gpios = <&pio1 1 0  /* cs0 */
0  /* cs1, no GPIO */
&pio2 2 0>;/* cs2 */

This feature is needed on our home made board to program an onboard fpga.
The fpga needs some special pin toggling to put it in programming mode.
That's why we want to skip the usual gpio cs and do the pin toggling
in our driver

Signed-off-by: Rini van Zetten 
Acked-by: Anton Vorontsov 
---
Changes :
patch against 2.6.30-rc8-mm1
style updates
compiler warning fix
v4 :
missing space in error text added
splitted lines combined

diff --git a/drivers/spi/spi_mpc8xxx.c b/drivers/spi/spi_mpc8xxx.c
index 0fd0ec4..de95790 100644
--- a/drivers/spi/spi_mpc8xxx.c
+++ b/drivers/spi/spi_mpc8xxx.c
@@ -666,9 +666,12 @@ static void mpc8xxx_spi_cs_control(struct spi_device *spi, 
bool on)
struct mpc8xxx_spi_probe_info *pinfo = to_of_pinfo(dev->platform_data);
u16 cs = spi->chip_select;
int gpio = pinfo->gpios[cs];
-   bool alow = pinfo->alow_flags[cs];

-   gpio_set_value(gpio, on ^ alow);
+   if (gpio != -EEXIST) {
+   bool alow = pinfo->alow_flags[cs];
+
+   gpio_set_value(gpio, on ^ alow);
+   }
 }

 static int of_mpc8xxx_spi_get_chipselects(struct device *dev)
@@ -678,7 +681,7 @@ static int of_mpc8xxx_spi_get_chipselects(struct device 
*dev)
struct mpc8xxx_spi_probe_info *pinfo = to_of_pinfo(pdata);
unsigned int ngpios;
int i = 0;
-   int ret;
+   int ret = 0;

ngpios = of_gpio_count(np);
if (!ngpios) {
@@ -707,27 +710,30 @@ static int of_mpc8xxx_spi_get_chipselects(struct device 
*dev)
enum of_gpio_flags flags;

gpio = of_get_gpio_flags(np, i, &flags);
-   if (!gpio_is_valid(gpio)) {
+   if (gpio_is_valid(gpio)) {
+   ret = gpio_request(gpio, dev_name(dev));
+   if (ret) {
+   dev_err(dev, "can't request gpio #%d: %d\n",
+i, ret);
+   goto err_loop;
+   }
+
+   pinfo->gpios[i] = gpio;
+   pinfo->alow_flags[i] = flags & OF_GPIO_ACTIVE_LOW;
+
+   ret = gpio_direction_output(pinfo->gpios[i],
+   pinfo->alow_flags[i]);
+   if (ret) {
+   dev_err(dev, "can't set output direction for "
+   "gpio #%d: %d\n", i, ret);
+   goto err_loop;
+   }
+   } else if (gpio == -EEXIST) {
+   pinfo->gpios[i] = -EEXIST;
+   } else {
dev_err(dev, "invalid gpio #%d: %d\n", i, gpio);
goto err_loop;
}
-
-   ret = gpio_request(gpio, dev_name(dev));
-   if (ret) {
-   dev_err(dev, "can't request gpio #%d: %d\n", i, ret);
-   goto err_loop;
-   }
-
-   pinfo->gpios[i] = gpio;
-   pinfo->alow_flags[i] = flags & OF_GPIO_ACTIVE_LOW;
-
-   ret = gpio_direction_output(pinfo->gpios[i],
-   pinfo->alow_flags[i]);
-   if (ret) {
-   dev_err(dev, "can't set output direction for gpio "
-   "#%d: %d\n", i, ret);
-   goto err_loop;
-   }
}

pdata->max_chipselect = ngpios;
___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev