Since, (3146bee spi: s3c64xx: Added provision for dedicated cs pin)

spi-s3c64xx.c driver expects
1. chip select gpios from "cs-gpio"(singular) under the
   "controller-data" node of the client/slave device of the SPI.

2. "cs-gpio"(singular) entry to be present in the SPI device node.

Eg of current broken usage:
&spi_1 {
        cs-gpio <>;     /* this entry is checked during probe */
        ...
        slave_node {
                controller-data {
                        cs-gpio <&gpioa2 5 0>;
                        /* This field is parsed during .setup() */
                }
        };
};

The following dts files which were using this driver. But,
din't have the "cs-gpio" entry under SPI node.
-- arch/arm/boot/dts/exynos4210-smdkv310.dts
-- arch/arm/boot/dts/exynos4412-trats2.dts
-- arch/arm/boot/dts/exynos5250-smdk5250.dts

Also, the SPI core and many drivers moved on to using "cs-gpios"
from SPI node and removed the gpio handling code from drivers
(including spi-s3c64xx.c).

Hence, spi-s3c64xx.c is broken since "Jun 21 11:26:12 2013" and
considering the time with no compliants about the breakage.

We are assuming it is safe to remove the "cs-gpio"(singular) usage
from device tree binding of spi-samsung.txt and makes appropriate
changes in the driver to use "cs-gpios"(plural) from
SPI device node.

Signed-off-by: Naveen Krishna Chatradhi <ch.nav...@samsung.com>
Acked-by: Rob Herring <r...@kernel.org>
Cc: Javier Martinez Canillas <javier.marti...@collabora.co.uk>
Cc: Doug Anderson <diand...@chromium.org>
Cc: Tomasz Figa <t.f...@samsung.com>
---
 .../devicetree/bindings/spi/spi-samsung.txt        |    8 ++--
 drivers/spi/spi-s3c64xx.c                          |   41 ++++++++------------
 2 files changed, 20 insertions(+), 29 deletions(-)

diff --git a/Documentation/devicetree/bindings/spi/spi-samsung.txt 
b/Documentation/devicetree/bindings/spi/spi-samsung.txt
index 86aa061..2d29dac 100644
--- a/Documentation/devicetree/bindings/spi/spi-samsung.txt
+++ b/Documentation/devicetree/bindings/spi/spi-samsung.txt
@@ -42,15 +42,13 @@ Optional Board Specific Properties:
 - num-cs: Specifies the number of chip select lines supported. If
   not specified, the default number of chip select lines is set to 1.
 
+- cs-gpios: should specify GPIOs used for chipselects (see spi-bus.txt)
+
 SPI Controller specific data in SPI slave nodes:
 
 - The spi slave nodes should provide the following information which is 
required
   by the spi controller.
 
-  - cs-gpio: A gpio specifier that specifies the gpio line used as
-    the slave select line by the spi controller. The format of the gpio
-    specifier depends on the gpio controller.
-
   - samsung,spi-feedback-delay: The sampling phase shift to be applied on the
     miso line (to account for any lag in the miso line). The following are the
     valid values.
@@ -85,6 +83,7 @@ Example:
                #size-cells = <0>;
                pinctrl-names = "default";
                pinctrl-0 = <&spi0_bus>;
+               cs-gpios = <&gpa2 5 0>;
 
                w25q80bw@0 {
                        #address-cells = <1>;
@@ -94,7 +93,6 @@ Example:
                        spi-max-frequency = <10000>;
 
                        controller-data {
-                               cs-gpio = <&gpa2 5 1 0 3>;
                                samsung,spi-feedback-delay = <0>;
                        };
 
diff --git a/drivers/spi/spi-s3c64xx.c b/drivers/spi/spi-s3c64xx.c
index 75a5696..b888c66 100644
--- a/drivers/spi/spi-s3c64xx.c
+++ b/drivers/spi/spi-s3c64xx.c
@@ -197,7 +197,6 @@ struct s3c64xx_spi_driver_data {
        struct s3c64xx_spi_dma_data     tx_dma;
        struct s3c64xx_spi_port_config  *port_conf;
        unsigned int                    port_id;
-       bool                            cs_gpio;
 };
 
 static void flush_fifo(struct s3c64xx_spi_driver_data *sdd)
@@ -776,17 +775,6 @@ static struct s3c64xx_spi_csinfo 
*s3c64xx_get_slave_ctrldata(
                return ERR_PTR(-ENOMEM);
        }
 
-       /* The CS line is asserted/deasserted by the gpio pin */
-       if (sdd->cs_gpio)
-               cs->line = of_get_named_gpio(data_np, "cs-gpio", 0);
-
-       if (!gpio_is_valid(cs->line)) {
-               dev_err(&spi->dev, "chip select gpio is not specified or 
invalid\n");
-               kfree(cs);
-               of_node_put(data_np);
-               return ERR_PTR(-EINVAL);
-       }
-
        of_property_read_u32(data_np, "samsung,spi-feedback-delay", &fb_delay);
        cs->fb_delay = fb_delay;
        of_node_put(data_np);
@@ -812,6 +800,10 @@ static int s3c64xx_spi_setup(struct spi_device *spi)
                spi->controller_data = cs;
        }
 
+       /* For the non-DT platforms derive chip selects from controller data */
+       if (!spi->dev.of_node)
+               spi->cs_gpio = cs->line;
+
        if (IS_ERR_OR_NULL(cs)) {
                dev_err(&spi->dev, "No CS for SPI(%d)\n", spi->chip_select);
                return -ENODEV;
@@ -819,17 +811,19 @@ static int s3c64xx_spi_setup(struct spi_device *spi)
 
        if (!spi_get_ctldata(spi)) {
                /* Request gpio only if cs line is asserted by gpio pins */
-               if (sdd->cs_gpio) {
-                       err = gpio_request_one(cs->line, GPIOF_OUT_INIT_HIGH,
-                                       dev_name(&spi->dev));
+               if (gpio_is_valid(spi->cs_gpio)) {
+                       err = gpio_request_one(spi->cs_gpio,
+                                               GPIOF_OUT_INIT_HIGH,
+                                               dev_name(&spi->dev));
                        if (err) {
                                dev_err(&spi->dev,
                                        "Failed to get /CS gpio [%d]: %d\n",
-                                       cs->line, err);
+                                       spi->cs_gpio, err);
                                goto err_gpio_req;
                        }
-
-                       spi->cs_gpio = cs->line;
+               } else {
+                       dev_err(&spi->dev, "chip select gpio is invalid\n");
+                       return -EINVAL;
                }
 
                spi_set_ctldata(spi, cs);
@@ -884,7 +878,8 @@ setup_exit:
        /* setup() returns with device de-selected */
        writel(S3C64XX_SPI_SLAVE_SIG_INACT, sdd->regs + S3C64XX_SPI_SLAVE_SEL);
 
-       gpio_free(cs->line);
+       if (gpio_is_valid(spi->cs_gpio))
+               gpio_free(spi->cs_gpio);
        spi_set_ctldata(spi, NULL);
 
 err_gpio_req:
@@ -900,10 +895,12 @@ static void s3c64xx_spi_cleanup(struct spi_device *spi)
        struct s3c64xx_spi_driver_data *sdd;
 
        sdd = spi_master_get_devdata(spi->master);
-       if (spi->cs_gpio) {
+       if (gpio_is_valid(spi->cs_gpio)) {
                gpio_free(spi->cs_gpio);
                if (spi->dev.of_node)
                        kfree(cs);
+               else
+                       spi->cs_gpio = -ENOENT;
        }
        spi_set_ctldata(spi, NULL);
 }
@@ -1075,11 +1072,7 @@ static int s3c64xx_spi_probe(struct platform_device 
*pdev)
        sdd->cntrlr_info = sci;
        sdd->pdev = pdev;
        sdd->sfr_start = mem_res->start;
-       sdd->cs_gpio = true;
        if (pdev->dev.of_node) {
-               if (!of_find_property(pdev->dev.of_node, "cs-gpio", NULL))
-                       sdd->cs_gpio = false;
-
                ret = of_alias_get_id(pdev->dev.of_node, "spi");
                if (ret < 0) {
                        dev_err(&pdev->dev, "failed to get alias id, errno 
%d\n",
-- 
1.7.9.5


------------------------------------------------------------------------------
HPCC Systems Open Source Big Data Platform from LexisNexis Risk Solutions
Find What Matters Most in Your Big Data with HPCC Systems
Open Source. Fast. Scalable. Simple. Ideal for Dirty Data.
Leverages Graph Analysis for Fast Processing & Easy Data Exploration
http://p.sf.net/sfu/hpccsystems
_______________________________________________
spi-devel-general mailing list
spi-devel-general@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/spi-devel-general

Reply via email to