* [PATCH 1/3] spi: move master of_node init to spi_alloc_master
@ 2012-02-09 16:14 ` Jean-Christophe PLAGNIOL-VILLARD
0 siblings, 0 replies; 15+ messages in thread
From: Jean-Christophe PLAGNIOL-VILLARD @ 2012-02-09 16:14 UTC (permalink / raw)
To: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r
Cc: spi-devel-general-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f,
devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ
Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj-sclMFOaUSTBWk0Htik3J/w@public.gmane.org>
Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org
Cc: spi-devel-general-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
---
drivers/spi/spi-altera.c | 3 ---
drivers/spi/spi-fsl-lib.c | 1 -
drivers/spi/spi-imx.c | 1 -
drivers/spi/spi-mpc512x-psc.c | 1 -
drivers/spi/spi-mpc52xx-psc.c | 1 -
drivers/spi/spi-mpc52xx.c | 1 -
drivers/spi/spi-oc-tiny.c | 1 -
drivers/spi/spi-ppc4xx.c | 1 -
drivers/spi/spi-pxa2xx-pci.c | 1 -
drivers/spi/spi-pxa2xx.c | 1 -
drivers/spi/spi-tegra.c | 1 -
drivers/spi/spi-xilinx.c | 1 -
drivers/spi/spi.c | 1 +
13 files changed, 1 insertions(+), 14 deletions(-)
diff --git a/drivers/spi/spi-altera.c b/drivers/spi/spi-altera.c
index c00d00e..ac6badc 100644
--- a/drivers/spi/spi-altera.c
+++ b/drivers/spi/spi-altera.c
@@ -270,9 +270,6 @@ static int __devinit altera_spi_probe(struct platform_device *pdev)
if (err)
goto exit;
}
- /* find platform data */
- if (!platp)
- hw->bitbang.master->dev.of_node = pdev->dev.of_node;
/* register our spi controller */
err = spi_bitbang_start(&hw->bitbang);
diff --git a/drivers/spi/spi-fsl-lib.c b/drivers/spi/spi-fsl-lib.c
index 2674fad..810aa01 100644
--- a/drivers/spi/spi-fsl-lib.c
+++ b/drivers/spi/spi-fsl-lib.c
@@ -133,7 +133,6 @@ int mpc8xxx_spi_probe(struct device *dev, struct resource *mem,
master->transfer = mpc8xxx_spi_transfer;
master->cleanup = mpc8xxx_spi_cleanup;
- master->dev.of_node = dev->of_node;
mpc8xxx_spi = spi_master_get_devdata(master);
mpc8xxx_spi->dev = dev;
diff --git a/drivers/spi/spi-imx.c b/drivers/spi/spi-imx.c
index c6e697f..bebcd01 100644
--- a/drivers/spi/spi-imx.c
+++ b/drivers/spi/spi-imx.c
@@ -860,7 +860,6 @@ static int __devinit spi_imx_probe(struct platform_device *pdev)
spi_imx->devtype_data->intctrl(spi_imx, 0);
- master->dev.of_node = pdev->dev.of_node;
ret = spi_bitbang_start(&spi_imx->bitbang);
if (ret) {
dev_err(&pdev->dev, "bitbang start failed with %d\n", ret);
diff --git a/drivers/spi/spi-mpc512x-psc.c b/drivers/spi/spi-mpc512x-psc.c
index 4c63f77..583d0c5 100644
--- a/drivers/spi/spi-mpc512x-psc.c
+++ b/drivers/spi/spi-mpc512x-psc.c
@@ -441,7 +441,6 @@ static int __devinit mpc512x_psc_spi_do_probe(struct device *dev, u32 regaddr,
master->setup = mpc512x_psc_spi_setup;
master->transfer = mpc512x_psc_spi_transfer;
master->cleanup = mpc512x_psc_spi_cleanup;
- master->dev.of_node = dev->of_node;
tempp = ioremap(regaddr, size);
if (!tempp) {
diff --git a/drivers/spi/spi-mpc52xx-psc.c b/drivers/spi/spi-mpc52xx-psc.c
index 6604715..502c953 100644
--- a/drivers/spi/spi-mpc52xx-psc.c
+++ b/drivers/spi/spi-mpc52xx-psc.c
@@ -398,7 +398,6 @@ static int __devinit mpc52xx_psc_spi_do_probe(struct device *dev, u32 regaddr,
master->setup = mpc52xx_psc_spi_setup;
master->transfer = mpc52xx_psc_spi_transfer;
master->cleanup = mpc52xx_psc_spi_cleanup;
- master->dev.of_node = dev->of_node;
mps->psc = ioremap(regaddr, size);
if (!mps->psc) {
diff --git a/drivers/spi/spi-mpc52xx.c b/drivers/spi/spi-mpc52xx.c
index 57633d9..1a099f8 100644
--- a/drivers/spi/spi-mpc52xx.c
+++ b/drivers/spi/spi-mpc52xx.c
@@ -437,7 +437,6 @@ static int __devinit mpc52xx_spi_probe(struct platform_device *op)
master->setup = mpc52xx_spi_setup;
master->transfer = mpc52xx_spi_transfer;
master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_LSB_FIRST;
- master->dev.of_node = op->dev.of_node;
dev_set_drvdata(&op->dev, master);
diff --git a/drivers/spi/spi-oc-tiny.c b/drivers/spi/spi-oc-tiny.c
index 698018f..d030857 100644
--- a/drivers/spi/spi-oc-tiny.c
+++ b/drivers/spi/spi-oc-tiny.c
@@ -266,7 +266,6 @@ static int __devinit tiny_spi_of_probe(struct platform_device *pdev)
if (hw->gpio_cs[i] < 0)
return -ENODEV;
}
- hw->bitbang.master->dev.of_node = pdev->dev.of_node;
val = of_get_property(pdev->dev.of_node,
"clock-frequency", &len);
if (val && len >= sizeof(__be32))
diff --git a/drivers/spi/spi-ppc4xx.c b/drivers/spi/spi-ppc4xx.c
index 98ec532..1aa8b33 100644
--- a/drivers/spi/spi-ppc4xx.c
+++ b/drivers/spi/spi-ppc4xx.c
@@ -406,7 +406,6 @@ static int __init spi_ppc4xx_of_probe(struct platform_device *op)
master = spi_alloc_master(dev, sizeof *hw);
if (master == NULL)
return -ENOMEM;
- master->dev.of_node = np;
dev_set_drvdata(dev, master);
hw = spi_master_get_devdata(master);
hw->master = spi_master_get(master);
diff --git a/drivers/spi/spi-pxa2xx-pci.c b/drivers/spi/spi-pxa2xx-pci.c
index 8caa07d..5012979 100644
--- a/drivers/spi/spi-pxa2xx-pci.c
+++ b/drivers/spi/spi-pxa2xx-pci.c
@@ -90,7 +90,6 @@ static int __devinit ce4100_spi_probe(struct pci_dev *dev,
goto err_nomem;
pdev->dev.parent = &dev->dev;
- pdev->dev.of_node = dev->dev.of_node;
ssp = &spi_info->ssp;
ssp->phys_base = pci_resource_start(dev, 0);
ssp->mmio_base = ioremap(phys_beg, phys_len);
diff --git a/drivers/spi/spi-pxa2xx.c b/drivers/spi/spi-pxa2xx.c
index dc25bee..7546f49 100644
--- a/drivers/spi/spi-pxa2xx.c
+++ b/drivers/spi/spi-pxa2xx.c
@@ -1557,7 +1557,6 @@ static int __devinit pxa2xx_spi_probe(struct platform_device *pdev)
drv_data->ssp = ssp;
master->dev.parent = &pdev->dev;
- master->dev.of_node = pdev->dev.of_node;
/* the spi->mode bits understood by this driver: */
master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH;
diff --git a/drivers/spi/spi-tegra.c b/drivers/spi/spi-tegra.c
index ae6d78a..65561be 100644
--- a/drivers/spi/spi-tegra.c
+++ b/drivers/spi/spi-tegra.c
@@ -547,7 +547,6 @@ static int __devinit spi_tegra_probe(struct platform_device *pdev)
tspi->rx_dma_req.req_sel = spi_tegra_req_sels[pdev->id];
tspi->rx_dma_req.dev = tspi;
- master->dev.of_node = pdev->dev.of_node;
ret = spi_register_master(master);
if (ret < 0)
diff --git a/drivers/spi/spi-xilinx.c b/drivers/spi/spi-xilinx.c
index 4c5a663..a7ce78f 100644
--- a/drivers/spi/spi-xilinx.c
+++ b/drivers/spi/spi-xilinx.c
@@ -392,7 +392,6 @@ struct spi_master *xilinx_spi_init(struct device *dev, struct resource *mem,
master->bus_num = bus_num;
master->num_chipselect = num_cs;
- master->dev.of_node = dev->of_node;
xspi->mem = *mem;
xspi->irq = irq;
diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
index b2ccdea..e2f4ca0 100644
--- a/drivers/spi/spi.c
+++ b/drivers/spi/spi.c
@@ -556,6 +556,7 @@ struct spi_master *spi_alloc_master(struct device *dev, unsigned size)
master->dev.class = &spi_master_class;
master->dev.parent = get_device(dev);
spi_master_set_devdata(master, &master[1]);
+ master->dev.of_node = dev->of_node;
return master;
}
--
1.7.7
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 1/3] spi: move master of_node init to spi_alloc_master
@ 2012-02-09 16:14 ` Jean-Christophe PLAGNIOL-VILLARD
0 siblings, 0 replies; 15+ messages in thread
From: Jean-Christophe PLAGNIOL-VILLARD @ 2012-02-09 16:14 UTC (permalink / raw)
To: linux-arm-kernel
Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
Cc: devicetree-discuss at lists.ozlabs.org
Cc: spi-devel-general at lists.sourceforge.net
---
drivers/spi/spi-altera.c | 3 ---
drivers/spi/spi-fsl-lib.c | 1 -
drivers/spi/spi-imx.c | 1 -
drivers/spi/spi-mpc512x-psc.c | 1 -
drivers/spi/spi-mpc52xx-psc.c | 1 -
drivers/spi/spi-mpc52xx.c | 1 -
drivers/spi/spi-oc-tiny.c | 1 -
drivers/spi/spi-ppc4xx.c | 1 -
drivers/spi/spi-pxa2xx-pci.c | 1 -
drivers/spi/spi-pxa2xx.c | 1 -
drivers/spi/spi-tegra.c | 1 -
drivers/spi/spi-xilinx.c | 1 -
drivers/spi/spi.c | 1 +
13 files changed, 1 insertions(+), 14 deletions(-)
diff --git a/drivers/spi/spi-altera.c b/drivers/spi/spi-altera.c
index c00d00e..ac6badc 100644
--- a/drivers/spi/spi-altera.c
+++ b/drivers/spi/spi-altera.c
@@ -270,9 +270,6 @@ static int __devinit altera_spi_probe(struct platform_device *pdev)
if (err)
goto exit;
}
- /* find platform data */
- if (!platp)
- hw->bitbang.master->dev.of_node = pdev->dev.of_node;
/* register our spi controller */
err = spi_bitbang_start(&hw->bitbang);
diff --git a/drivers/spi/spi-fsl-lib.c b/drivers/spi/spi-fsl-lib.c
index 2674fad..810aa01 100644
--- a/drivers/spi/spi-fsl-lib.c
+++ b/drivers/spi/spi-fsl-lib.c
@@ -133,7 +133,6 @@ int mpc8xxx_spi_probe(struct device *dev, struct resource *mem,
master->transfer = mpc8xxx_spi_transfer;
master->cleanup = mpc8xxx_spi_cleanup;
- master->dev.of_node = dev->of_node;
mpc8xxx_spi = spi_master_get_devdata(master);
mpc8xxx_spi->dev = dev;
diff --git a/drivers/spi/spi-imx.c b/drivers/spi/spi-imx.c
index c6e697f..bebcd01 100644
--- a/drivers/spi/spi-imx.c
+++ b/drivers/spi/spi-imx.c
@@ -860,7 +860,6 @@ static int __devinit spi_imx_probe(struct platform_device *pdev)
spi_imx->devtype_data->intctrl(spi_imx, 0);
- master->dev.of_node = pdev->dev.of_node;
ret = spi_bitbang_start(&spi_imx->bitbang);
if (ret) {
dev_err(&pdev->dev, "bitbang start failed with %d\n", ret);
diff --git a/drivers/spi/spi-mpc512x-psc.c b/drivers/spi/spi-mpc512x-psc.c
index 4c63f77..583d0c5 100644
--- a/drivers/spi/spi-mpc512x-psc.c
+++ b/drivers/spi/spi-mpc512x-psc.c
@@ -441,7 +441,6 @@ static int __devinit mpc512x_psc_spi_do_probe(struct device *dev, u32 regaddr,
master->setup = mpc512x_psc_spi_setup;
master->transfer = mpc512x_psc_spi_transfer;
master->cleanup = mpc512x_psc_spi_cleanup;
- master->dev.of_node = dev->of_node;
tempp = ioremap(regaddr, size);
if (!tempp) {
diff --git a/drivers/spi/spi-mpc52xx-psc.c b/drivers/spi/spi-mpc52xx-psc.c
index 6604715..502c953 100644
--- a/drivers/spi/spi-mpc52xx-psc.c
+++ b/drivers/spi/spi-mpc52xx-psc.c
@@ -398,7 +398,6 @@ static int __devinit mpc52xx_psc_spi_do_probe(struct device *dev, u32 regaddr,
master->setup = mpc52xx_psc_spi_setup;
master->transfer = mpc52xx_psc_spi_transfer;
master->cleanup = mpc52xx_psc_spi_cleanup;
- master->dev.of_node = dev->of_node;
mps->psc = ioremap(regaddr, size);
if (!mps->psc) {
diff --git a/drivers/spi/spi-mpc52xx.c b/drivers/spi/spi-mpc52xx.c
index 57633d9..1a099f8 100644
--- a/drivers/spi/spi-mpc52xx.c
+++ b/drivers/spi/spi-mpc52xx.c
@@ -437,7 +437,6 @@ static int __devinit mpc52xx_spi_probe(struct platform_device *op)
master->setup = mpc52xx_spi_setup;
master->transfer = mpc52xx_spi_transfer;
master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_LSB_FIRST;
- master->dev.of_node = op->dev.of_node;
dev_set_drvdata(&op->dev, master);
diff --git a/drivers/spi/spi-oc-tiny.c b/drivers/spi/spi-oc-tiny.c
index 698018f..d030857 100644
--- a/drivers/spi/spi-oc-tiny.c
+++ b/drivers/spi/spi-oc-tiny.c
@@ -266,7 +266,6 @@ static int __devinit tiny_spi_of_probe(struct platform_device *pdev)
if (hw->gpio_cs[i] < 0)
return -ENODEV;
}
- hw->bitbang.master->dev.of_node = pdev->dev.of_node;
val = of_get_property(pdev->dev.of_node,
"clock-frequency", &len);
if (val && len >= sizeof(__be32))
diff --git a/drivers/spi/spi-ppc4xx.c b/drivers/spi/spi-ppc4xx.c
index 98ec532..1aa8b33 100644
--- a/drivers/spi/spi-ppc4xx.c
+++ b/drivers/spi/spi-ppc4xx.c
@@ -406,7 +406,6 @@ static int __init spi_ppc4xx_of_probe(struct platform_device *op)
master = spi_alloc_master(dev, sizeof *hw);
if (master == NULL)
return -ENOMEM;
- master->dev.of_node = np;
dev_set_drvdata(dev, master);
hw = spi_master_get_devdata(master);
hw->master = spi_master_get(master);
diff --git a/drivers/spi/spi-pxa2xx-pci.c b/drivers/spi/spi-pxa2xx-pci.c
index 8caa07d..5012979 100644
--- a/drivers/spi/spi-pxa2xx-pci.c
+++ b/drivers/spi/spi-pxa2xx-pci.c
@@ -90,7 +90,6 @@ static int __devinit ce4100_spi_probe(struct pci_dev *dev,
goto err_nomem;
pdev->dev.parent = &dev->dev;
- pdev->dev.of_node = dev->dev.of_node;
ssp = &spi_info->ssp;
ssp->phys_base = pci_resource_start(dev, 0);
ssp->mmio_base = ioremap(phys_beg, phys_len);
diff --git a/drivers/spi/spi-pxa2xx.c b/drivers/spi/spi-pxa2xx.c
index dc25bee..7546f49 100644
--- a/drivers/spi/spi-pxa2xx.c
+++ b/drivers/spi/spi-pxa2xx.c
@@ -1557,7 +1557,6 @@ static int __devinit pxa2xx_spi_probe(struct platform_device *pdev)
drv_data->ssp = ssp;
master->dev.parent = &pdev->dev;
- master->dev.of_node = pdev->dev.of_node;
/* the spi->mode bits understood by this driver: */
master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH;
diff --git a/drivers/spi/spi-tegra.c b/drivers/spi/spi-tegra.c
index ae6d78a..65561be 100644
--- a/drivers/spi/spi-tegra.c
+++ b/drivers/spi/spi-tegra.c
@@ -547,7 +547,6 @@ static int __devinit spi_tegra_probe(struct platform_device *pdev)
tspi->rx_dma_req.req_sel = spi_tegra_req_sels[pdev->id];
tspi->rx_dma_req.dev = tspi;
- master->dev.of_node = pdev->dev.of_node;
ret = spi_register_master(master);
if (ret < 0)
diff --git a/drivers/spi/spi-xilinx.c b/drivers/spi/spi-xilinx.c
index 4c5a663..a7ce78f 100644
--- a/drivers/spi/spi-xilinx.c
+++ b/drivers/spi/spi-xilinx.c
@@ -392,7 +392,6 @@ struct spi_master *xilinx_spi_init(struct device *dev, struct resource *mem,
master->bus_num = bus_num;
master->num_chipselect = num_cs;
- master->dev.of_node = dev->of_node;
xspi->mem = *mem;
xspi->irq = irq;
diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
index b2ccdea..e2f4ca0 100644
--- a/drivers/spi/spi.c
+++ b/drivers/spi/spi.c
@@ -556,6 +556,7 @@ struct spi_master *spi_alloc_master(struct device *dev, unsigned size)
master->dev.class = &spi_master_class;
master->dev.parent = get_device(dev);
spi_master_set_devdata(master, &master[1]);
+ master->dev.of_node = dev->of_node;
return master;
}
--
1.7.7
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 2/3] of_spi: add generic binding support to specify ncs gpio
2012-02-09 16:14 ` Jean-Christophe PLAGNIOL-VILLARD
@ 2012-02-09 16:14 ` Jean-Christophe PLAGNIOL-VILLARD
-1 siblings, 0 replies; 15+ messages in thread
From: Jean-Christophe PLAGNIOL-VILLARD @ 2012-02-09 16:14 UTC (permalink / raw)
To: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r
Cc: spi-devel-general-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f,
devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ
This will allow to use gpio for chip select with no modification in the
driver binding
When use the ncs-gpios, the gpio number will be passed via the controller_data
and the number of chip select will automatically increased.
Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj-sclMFOaUSTBWk0Htik3J/w@public.gmane.org>
Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org
Cc: spi-devel-general-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
---
Documentation/devicetree/bindings/spi/spi-bus.txt | 6 +++
drivers/of/of_spi.c | 27 ++++++++---
drivers/spi/spi.c | 51 +++++++++++++++++++-
include/linux/spi/spi.h | 5 ++
4 files changed, 78 insertions(+), 11 deletions(-)
diff --git a/Documentation/devicetree/bindings/spi/spi-bus.txt b/Documentation/devicetree/bindings/spi/spi-bus.txt
index e782add..5a24729 100644
--- a/Documentation/devicetree/bindings/spi/spi-bus.txt
+++ b/Documentation/devicetree/bindings/spi/spi-bus.txt
@@ -12,6 +12,7 @@ The SPI master node requires the following properties:
- #size-cells - should be zero.
- compatible - name of SPI bus controller following generic names
recommended practice.
+- ncs-gpios - (optional) gpios chip select.
No other properties are required in the SPI bus node. It is assumed
that a driver for an SPI bus device will understand that it is an SPI bus.
However, the binding does not attempt to define the specific method for
@@ -21,6 +22,8 @@ assumption that board specific platform code will be used to manage
chip selects. Individual drivers can define additional properties to
support describing the chip select layout.
+If ncs-gpios is used the number of chip select will automatically increased.
+
SPI slave nodes must be children of the SPI master node and can
contain the following properties.
- reg - (required) chip select address of device.
@@ -34,6 +37,9 @@ contain the following properties.
- spi-cs-high - (optional) Empty property indicating device requires
chip select active high
+If a gpio chipselect is used for the SPI slave the gpio number will be passed
+via the controller_data
+
SPI example for an MPC5200 SPI bus:
spi@f00 {
#address-cells = <1>;
diff --git a/drivers/of/of_spi.c b/drivers/of/of_spi.c
index 6dbc074..0d41407 100644
--- a/drivers/of/of_spi.c
+++ b/drivers/of/of_spi.c
@@ -12,6 +12,7 @@
#include <linux/spi/spi.h>
#include <linux/of_irq.h>
#include <linux/of_spi.h>
+#include <linux/of_gpio.h>
/**
* of_register_spi_devices - Register child devices onto the SPI bus
@@ -27,6 +28,7 @@ void of_register_spi_devices(struct spi_master *master)
const __be32 *prop;
int rc;
int len;
+ int ncs_pin;
if (!master->dev.of_node)
return;
@@ -50,15 +52,24 @@ void of_register_spi_devices(struct spi_master *master)
continue;
}
- /* Device address */
- prop = of_get_property(nc, "reg", &len);
- if (!prop || len < sizeof(*prop)) {
- dev_err(&master->dev, "%s has no 'reg' property\n",
- nc->full_name);
- spi_dev_put(spi);
- continue;
+ /* ncs gpio */
+ ncs_pin = of_get_named_gpio(nc, "ncs-gpio", 0);
+
+ if (gpio_is_valid(ncs_pin)) {
+ spi->controller_data = (void *)ncs_pin;
+ spi->chip_select = master->num_chipselect;
+ master->num_chipselect++;
+ } else {
+ /* Device address */
+ prop = of_get_property(nc, "reg", &len);
+ if (!prop || len < sizeof(*prop)) {
+ dev_err(&master->dev, "%s has no 'reg' property\n",
+ nc->full_name);
+ spi_dev_put(spi);
+ continue;
+ }
+ spi->chip_select = be32_to_cpup(prop);
}
- spi->chip_select = be32_to_cpup(prop);
/* Mode (clock phase/polarity/etc.) */
if (of_find_property(nc, "spi-cpha", NULL))
diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
index e2f4ca0..1f5ffa6 100644
--- a/drivers/spi/spi.c
+++ b/drivers/spi/spi.c
@@ -28,6 +28,7 @@
#include <linux/mod_devicetable.h>
#include <linux/spi/spi.h>
#include <linux/of_spi.h>
+#include <linux/of_gpio.h>
#include <linux/pm_runtime.h>
#include <linux/export.h>
@@ -339,15 +340,16 @@ EXPORT_SYMBOL_GPL(spi_alloc_device);
int spi_add_device(struct spi_device *spi)
{
static DEFINE_MUTEX(spi_add_lock);
- struct device *dev = spi->master->dev.parent;
+ struct spi_master *master = spi->master;
+ struct device *dev = master->dev.parent;
struct device *d;
int status;
/* Chipselects are numbered 0..max; validate. */
- if (spi->chip_select >= spi->master->num_chipselect) {
+ if (spi->chip_select >= master->num_chipselect) {
dev_err(dev, "cs%d >= max %d\n",
spi->chip_select,
- spi->master->num_chipselect);
+ master->num_chipselect);
return -EINVAL;
}
@@ -371,6 +373,13 @@ int spi_add_device(struct spi_device *spi)
goto done;
}
+ if (master->num_gpio_chipselect &&
+ spi->chip_select >= master->first_gpio_chipselect) {
+ int num = spi->chip_select = master->first_gpio_chipselect;
+
+ spi->controller_data = (void*)master->chipselect_gpios[num];
+ }
+
/* Drivers may modify this initial i/o setup, but will
* normally rely on the device being setup. Devices
* using SPI_CS_HIGH can't coexist well otherwise...
@@ -562,6 +571,38 @@ struct spi_master *spi_alloc_master(struct device *dev, unsigned size)
}
EXPORT_SYMBOL_GPL(spi_alloc_master);
+static int of_spi_register_master(struct spi_master *master)
+{
+ int nb, i;
+ int *cs;
+ struct device_node *np = master->dev.of_node;
+
+ if (!np)
+ return 0;
+
+ nb = of_gpio_named_count(np, "ncs-gpios");
+
+ if (nb < 1)
+ return 0;
+
+ master->chipselect_gpios = kzalloc(sizeof(int) * nb, GFP_KERNEL);
+
+ if (!master->chipselect_gpios)
+ return -ENOMEM;
+
+ master->first_gpio_chipselect = master->num_chipselect;
+ master->num_chipselect += nb;
+ master->num_gpio_chipselect = nb;
+
+ for (i = 0; i < nb; i++) {
+ cs = &master->chipselect_gpios[i];
+
+ *cs = of_get_named_gpio(np, "ncs-gpios", i);
+ }
+
+ return 0;
+}
+
/**
* spi_register_master - register SPI master controller
* @master: initialized master, originally from spi_alloc_master()
@@ -593,6 +634,10 @@ int spi_register_master(struct spi_master *master)
if (!dev)
return -ENODEV;
+ status = of_spi_register_master(master);
+ if (status)
+ return status;
+
/* even if it's just one always-selected device, there must
* be at least one chipselect
*/
diff --git a/include/linux/spi/spi.h b/include/linux/spi/spi.h
index 176fce9..d21c267 100644
--- a/include/linux/spi/spi.h
+++ b/include/linux/spi/spi.h
@@ -318,6 +318,11 @@ struct spi_master {
/* called on release() to free memory provided by spi_master */
void (*cleanup)(struct spi_device *spi);
+
+ /* gpio chip select */
+ int *chipselect_gpios;
+ int first_gpio_chipselect;
+ int num_gpio_chipselect;
};
static inline void *spi_master_get_devdata(struct spi_master *master)
--
1.7.7
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 2/3] of_spi: add generic binding support to specify ncs gpio
@ 2012-02-09 16:14 ` Jean-Christophe PLAGNIOL-VILLARD
0 siblings, 0 replies; 15+ messages in thread
From: Jean-Christophe PLAGNIOL-VILLARD @ 2012-02-09 16:14 UTC (permalink / raw)
To: linux-arm-kernel
This will allow to use gpio for chip select with no modification in the
driver binding
When use the ncs-gpios, the gpio number will be passed via the controller_data
and the number of chip select will automatically increased.
Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
Cc: devicetree-discuss at lists.ozlabs.org
Cc: spi-devel-general at lists.sourceforge.net
---
Documentation/devicetree/bindings/spi/spi-bus.txt | 6 +++
drivers/of/of_spi.c | 27 ++++++++---
drivers/spi/spi.c | 51 +++++++++++++++++++-
include/linux/spi/spi.h | 5 ++
4 files changed, 78 insertions(+), 11 deletions(-)
diff --git a/Documentation/devicetree/bindings/spi/spi-bus.txt b/Documentation/devicetree/bindings/spi/spi-bus.txt
index e782add..5a24729 100644
--- a/Documentation/devicetree/bindings/spi/spi-bus.txt
+++ b/Documentation/devicetree/bindings/spi/spi-bus.txt
@@ -12,6 +12,7 @@ The SPI master node requires the following properties:
- #size-cells - should be zero.
- compatible - name of SPI bus controller following generic names
recommended practice.
+- ncs-gpios - (optional) gpios chip select.
No other properties are required in the SPI bus node. It is assumed
that a driver for an SPI bus device will understand that it is an SPI bus.
However, the binding does not attempt to define the specific method for
@@ -21,6 +22,8 @@ assumption that board specific platform code will be used to manage
chip selects. Individual drivers can define additional properties to
support describing the chip select layout.
+If ncs-gpios is used the number of chip select will automatically increased.
+
SPI slave nodes must be children of the SPI master node and can
contain the following properties.
- reg - (required) chip select address of device.
@@ -34,6 +37,9 @@ contain the following properties.
- spi-cs-high - (optional) Empty property indicating device requires
chip select active high
+If a gpio chipselect is used for the SPI slave the gpio number will be passed
+via the controller_data
+
SPI example for an MPC5200 SPI bus:
spi at f00 {
#address-cells = <1>;
diff --git a/drivers/of/of_spi.c b/drivers/of/of_spi.c
index 6dbc074..0d41407 100644
--- a/drivers/of/of_spi.c
+++ b/drivers/of/of_spi.c
@@ -12,6 +12,7 @@
#include <linux/spi/spi.h>
#include <linux/of_irq.h>
#include <linux/of_spi.h>
+#include <linux/of_gpio.h>
/**
* of_register_spi_devices - Register child devices onto the SPI bus
@@ -27,6 +28,7 @@ void of_register_spi_devices(struct spi_master *master)
const __be32 *prop;
int rc;
int len;
+ int ncs_pin;
if (!master->dev.of_node)
return;
@@ -50,15 +52,24 @@ void of_register_spi_devices(struct spi_master *master)
continue;
}
- /* Device address */
- prop = of_get_property(nc, "reg", &len);
- if (!prop || len < sizeof(*prop)) {
- dev_err(&master->dev, "%s has no 'reg' property\n",
- nc->full_name);
- spi_dev_put(spi);
- continue;
+ /* ncs gpio */
+ ncs_pin = of_get_named_gpio(nc, "ncs-gpio", 0);
+
+ if (gpio_is_valid(ncs_pin)) {
+ spi->controller_data = (void *)ncs_pin;
+ spi->chip_select = master->num_chipselect;
+ master->num_chipselect++;
+ } else {
+ /* Device address */
+ prop = of_get_property(nc, "reg", &len);
+ if (!prop || len < sizeof(*prop)) {
+ dev_err(&master->dev, "%s has no 'reg' property\n",
+ nc->full_name);
+ spi_dev_put(spi);
+ continue;
+ }
+ spi->chip_select = be32_to_cpup(prop);
}
- spi->chip_select = be32_to_cpup(prop);
/* Mode (clock phase/polarity/etc.) */
if (of_find_property(nc, "spi-cpha", NULL))
diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
index e2f4ca0..1f5ffa6 100644
--- a/drivers/spi/spi.c
+++ b/drivers/spi/spi.c
@@ -28,6 +28,7 @@
#include <linux/mod_devicetable.h>
#include <linux/spi/spi.h>
#include <linux/of_spi.h>
+#include <linux/of_gpio.h>
#include <linux/pm_runtime.h>
#include <linux/export.h>
@@ -339,15 +340,16 @@ EXPORT_SYMBOL_GPL(spi_alloc_device);
int spi_add_device(struct spi_device *spi)
{
static DEFINE_MUTEX(spi_add_lock);
- struct device *dev = spi->master->dev.parent;
+ struct spi_master *master = spi->master;
+ struct device *dev = master->dev.parent;
struct device *d;
int status;
/* Chipselects are numbered 0..max; validate. */
- if (spi->chip_select >= spi->master->num_chipselect) {
+ if (spi->chip_select >= master->num_chipselect) {
dev_err(dev, "cs%d >= max %d\n",
spi->chip_select,
- spi->master->num_chipselect);
+ master->num_chipselect);
return -EINVAL;
}
@@ -371,6 +373,13 @@ int spi_add_device(struct spi_device *spi)
goto done;
}
+ if (master->num_gpio_chipselect &&
+ spi->chip_select >= master->first_gpio_chipselect) {
+ int num = spi->chip_select = master->first_gpio_chipselect;
+
+ spi->controller_data = (void*)master->chipselect_gpios[num];
+ }
+
/* Drivers may modify this initial i/o setup, but will
* normally rely on the device being setup. Devices
* using SPI_CS_HIGH can't coexist well otherwise...
@@ -562,6 +571,38 @@ struct spi_master *spi_alloc_master(struct device *dev, unsigned size)
}
EXPORT_SYMBOL_GPL(spi_alloc_master);
+static int of_spi_register_master(struct spi_master *master)
+{
+ int nb, i;
+ int *cs;
+ struct device_node *np = master->dev.of_node;
+
+ if (!np)
+ return 0;
+
+ nb = of_gpio_named_count(np, "ncs-gpios");
+
+ if (nb < 1)
+ return 0;
+
+ master->chipselect_gpios = kzalloc(sizeof(int) * nb, GFP_KERNEL);
+
+ if (!master->chipselect_gpios)
+ return -ENOMEM;
+
+ master->first_gpio_chipselect = master->num_chipselect;
+ master->num_chipselect += nb;
+ master->num_gpio_chipselect = nb;
+
+ for (i = 0; i < nb; i++) {
+ cs = &master->chipselect_gpios[i];
+
+ *cs = of_get_named_gpio(np, "ncs-gpios", i);
+ }
+
+ return 0;
+}
+
/**
* spi_register_master - register SPI master controller
* @master: initialized master, originally from spi_alloc_master()
@@ -593,6 +634,10 @@ int spi_register_master(struct spi_master *master)
if (!dev)
return -ENODEV;
+ status = of_spi_register_master(master);
+ if (status)
+ return status;
+
/* even if it's just one always-selected device, there must
* be at least one chipselect
*/
diff --git a/include/linux/spi/spi.h b/include/linux/spi/spi.h
index 176fce9..d21c267 100644
--- a/include/linux/spi/spi.h
+++ b/include/linux/spi/spi.h
@@ -318,6 +318,11 @@ struct spi_master {
/* called on release() to free memory provided by spi_master */
void (*cleanup)(struct spi_device *spi);
+
+ /* gpio chip select */
+ int *chipselect_gpios;
+ int first_gpio_chipselect;
+ int num_gpio_chipselect;
};
static inline void *spi_master_get_devdata(struct spi_master *master)
--
1.7.7
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 3/3] spi/atmel: add DT support
2012-02-09 16:14 ` Jean-Christophe PLAGNIOL-VILLARD
@ 2012-02-09 16:14 ` Jean-Christophe PLAGNIOL-VILLARD
-1 siblings, 0 replies; 15+ messages in thread
From: Jean-Christophe PLAGNIOL-VILLARD @ 2012-02-09 16:14 UTC (permalink / raw)
To: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r
Cc: spi-devel-general-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f,
devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ,
Jean-Christophe PLAGNIOL-VILLARD
the atmel_spi use only gpio for chip select
Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj-sclMFOaUSTBWk0Htik3J/w@public.gmane.org>
Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org
Cc: spi-devel-general-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
---
.../devicetree/bindings/spi/spi_atmel.txt | 6 ++++++
drivers/spi/spi-atmel.c | 12 +++++++++++-
2 files changed, 17 insertions(+), 1 deletions(-)
create mode 100644 Documentation/devicetree/bindings/spi/spi_atmel.txt
diff --git a/Documentation/devicetree/bindings/spi/spi_atmel.txt b/Documentation/devicetree/bindings/spi/spi_atmel.txt
new file mode 100644
index 0000000..7ec3d8d
--- /dev/null
+++ b/Documentation/devicetree/bindings/spi/spi_atmel.txt
@@ -0,0 +1,6 @@
+Atmel SPI device
+
+Required properties:
+- compatible : should be "atmel,at91rm9200-spi".
+- reg: Address and length of the register set for the device
+- interrupts: Should contain macb interrupt
diff --git a/drivers/spi/spi-atmel.c b/drivers/spi/spi-atmel.c
index 16d6a83..7bcd11f 100644
--- a/drivers/spi/spi-atmel.c
+++ b/drivers/spi/spi-atmel.c
@@ -19,6 +19,7 @@
#include <linux/interrupt.h>
#include <linux/spi/spi.h>
#include <linux/slab.h>
+#include <linux/of.h>
#include <asm/io.h>
#include <mach/board.h>
@@ -938,7 +939,7 @@ static int __devinit atmel_spi_probe(struct platform_device *pdev)
master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH;
master->bus_num = pdev->id;
- master->num_chipselect = 4;
+ master->num_chipselect = master->dev.of_node ? 0 : 4;
master->setup = atmel_spi_setup;
master->transfer = atmel_spi_transfer;
master->cleanup = atmel_spi_cleanup;
@@ -1064,11 +1065,20 @@ static int atmel_spi_resume(struct platform_device *pdev)
#define atmel_spi_resume NULL
#endif
+#if defined(CONFIG_OF)
+static const struct of_device_id atmel_spi_dt_ids[] = {
+ { .compatible = "atmel,at91rm9200-spi" },
+ { /* sentinel */ }
+};
+
+MODULE_DEVICE_TABLE(of, atmel_spi_dt_ids);
+#endif
static struct platform_driver atmel_spi_driver = {
.driver = {
.name = "atmel_spi",
.owner = THIS_MODULE,
+ .of_match_table = of_match_ptr(atmel_spi_dt_ids),
},
.suspend = atmel_spi_suspend,
.resume = atmel_spi_resume,
--
1.7.7
------------------------------------------------------------------------------
Virtualization & Cloud Management Using Capacity Planning
Cloud computing makes use of virtualization - but cloud computing
also focuses on allowing computing to be delivered as a service.
http://www.accelacomm.com/jaw/sfnl/114/51521223/
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 3/3] spi/atmel: add DT support
@ 2012-02-09 16:14 ` Jean-Christophe PLAGNIOL-VILLARD
0 siblings, 0 replies; 15+ messages in thread
From: Jean-Christophe PLAGNIOL-VILLARD @ 2012-02-09 16:14 UTC (permalink / raw)
To: linux-arm-kernel
the atmel_spi use only gpio for chip select
Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
Cc: devicetree-discuss at lists.ozlabs.org
Cc: spi-devel-general at lists.sourceforge.net
---
.../devicetree/bindings/spi/spi_atmel.txt | 6 ++++++
drivers/spi/spi-atmel.c | 12 +++++++++++-
2 files changed, 17 insertions(+), 1 deletions(-)
create mode 100644 Documentation/devicetree/bindings/spi/spi_atmel.txt
diff --git a/Documentation/devicetree/bindings/spi/spi_atmel.txt b/Documentation/devicetree/bindings/spi/spi_atmel.txt
new file mode 100644
index 0000000..7ec3d8d
--- /dev/null
+++ b/Documentation/devicetree/bindings/spi/spi_atmel.txt
@@ -0,0 +1,6 @@
+Atmel SPI device
+
+Required properties:
+- compatible : should be "atmel,at91rm9200-spi".
+- reg: Address and length of the register set for the device
+- interrupts: Should contain macb interrupt
diff --git a/drivers/spi/spi-atmel.c b/drivers/spi/spi-atmel.c
index 16d6a83..7bcd11f 100644
--- a/drivers/spi/spi-atmel.c
+++ b/drivers/spi/spi-atmel.c
@@ -19,6 +19,7 @@
#include <linux/interrupt.h>
#include <linux/spi/spi.h>
#include <linux/slab.h>
+#include <linux/of.h>
#include <asm/io.h>
#include <mach/board.h>
@@ -938,7 +939,7 @@ static int __devinit atmel_spi_probe(struct platform_device *pdev)
master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH;
master->bus_num = pdev->id;
- master->num_chipselect = 4;
+ master->num_chipselect = master->dev.of_node ? 0 : 4;
master->setup = atmel_spi_setup;
master->transfer = atmel_spi_transfer;
master->cleanup = atmel_spi_cleanup;
@@ -1064,11 +1065,20 @@ static int atmel_spi_resume(struct platform_device *pdev)
#define atmel_spi_resume NULL
#endif
+#if defined(CONFIG_OF)
+static const struct of_device_id atmel_spi_dt_ids[] = {
+ { .compatible = "atmel,at91rm9200-spi" },
+ { /* sentinel */ }
+};
+
+MODULE_DEVICE_TABLE(of, atmel_spi_dt_ids);
+#endif
static struct platform_driver atmel_spi_driver = {
.driver = {
.name = "atmel_spi",
.owner = THIS_MODULE,
+ .of_match_table = of_match_ptr(atmel_spi_dt_ids),
},
.suspend = atmel_spi_suspend,
.resume = atmel_spi_resume,
--
1.7.7
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH 2/3] of_spi: add generic binding support to specify ncs gpio
2012-02-09 16:14 ` Jean-Christophe PLAGNIOL-VILLARD
@ 2012-02-14 4:24 ` Jean-Christophe PLAGNIOL-VILLARD
-1 siblings, 0 replies; 15+ messages in thread
From: Jean-Christophe PLAGNIOL-VILLARD @ 2012-02-14 4:24 UTC (permalink / raw)
To: linux-arm-kernel; +Cc: spi-devel-general, devicetree-discuss
Hi Grant,
ping
Best Regards,
J.
On 17:14 Thu 09 Feb , Jean-Christophe PLAGNIOL-VILLARD wrote:
> This will allow to use gpio for chip select with no modification in the
> driver binding
>
> When use the ncs-gpios, the gpio number will be passed via the controller_data
> and the number of chip select will automatically increased.
>
> Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
> Cc: devicetree-discuss@lists.ozlabs.org
> Cc: spi-devel-general@lists.sourceforge.net
> ---
> Documentation/devicetree/bindings/spi/spi-bus.txt | 6 +++
> drivers/of/of_spi.c | 27 ++++++++---
> drivers/spi/spi.c | 51 +++++++++++++++++++-
> include/linux/spi/spi.h | 5 ++
> 4 files changed, 78 insertions(+), 11 deletions(-)
>
> diff --git a/Documentation/devicetree/bindings/spi/spi-bus.txt b/Documentation/devicetree/bindings/spi/spi-bus.txt
> index e782add..5a24729 100644
> --- a/Documentation/devicetree/bindings/spi/spi-bus.txt
> +++ b/Documentation/devicetree/bindings/spi/spi-bus.txt
> @@ -12,6 +12,7 @@ The SPI master node requires the following properties:
> - #size-cells - should be zero.
> - compatible - name of SPI bus controller following generic names
> recommended practice.
> +- ncs-gpios - (optional) gpios chip select.
> No other properties are required in the SPI bus node. It is assumed
> that a driver for an SPI bus device will understand that it is an SPI bus.
> However, the binding does not attempt to define the specific method for
> @@ -21,6 +22,8 @@ assumption that board specific platform code will be used to manage
> chip selects. Individual drivers can define additional properties to
> support describing the chip select layout.
>
> +If ncs-gpios is used the number of chip select will automatically increased.
> +
> SPI slave nodes must be children of the SPI master node and can
> contain the following properties.
> - reg - (required) chip select address of device.
> @@ -34,6 +37,9 @@ contain the following properties.
> - spi-cs-high - (optional) Empty property indicating device requires
> chip select active high
>
> +If a gpio chipselect is used for the SPI slave the gpio number will be passed
> +via the controller_data
> +
> SPI example for an MPC5200 SPI bus:
> spi@f00 {
> #address-cells = <1>;
> diff --git a/drivers/of/of_spi.c b/drivers/of/of_spi.c
> index 6dbc074..0d41407 100644
> --- a/drivers/of/of_spi.c
> +++ b/drivers/of/of_spi.c
> @@ -12,6 +12,7 @@
> #include <linux/spi/spi.h>
> #include <linux/of_irq.h>
> #include <linux/of_spi.h>
> +#include <linux/of_gpio.h>
>
> /**
> * of_register_spi_devices - Register child devices onto the SPI bus
> @@ -27,6 +28,7 @@ void of_register_spi_devices(struct spi_master *master)
> const __be32 *prop;
> int rc;
> int len;
> + int ncs_pin;
>
> if (!master->dev.of_node)
> return;
> @@ -50,15 +52,24 @@ void of_register_spi_devices(struct spi_master *master)
> continue;
> }
>
> - /* Device address */
> - prop = of_get_property(nc, "reg", &len);
> - if (!prop || len < sizeof(*prop)) {
> - dev_err(&master->dev, "%s has no 'reg' property\n",
> - nc->full_name);
> - spi_dev_put(spi);
> - continue;
> + /* ncs gpio */
> + ncs_pin = of_get_named_gpio(nc, "ncs-gpio", 0);
> +
> + if (gpio_is_valid(ncs_pin)) {
> + spi->controller_data = (void *)ncs_pin;
> + spi->chip_select = master->num_chipselect;
> + master->num_chipselect++;
> + } else {
> + /* Device address */
> + prop = of_get_property(nc, "reg", &len);
> + if (!prop || len < sizeof(*prop)) {
> + dev_err(&master->dev, "%s has no 'reg' property\n",
> + nc->full_name);
> + spi_dev_put(spi);
> + continue;
> + }
> + spi->chip_select = be32_to_cpup(prop);
> }
> - spi->chip_select = be32_to_cpup(prop);
>
> /* Mode (clock phase/polarity/etc.) */
> if (of_find_property(nc, "spi-cpha", NULL))
> diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
> index e2f4ca0..1f5ffa6 100644
> --- a/drivers/spi/spi.c
> +++ b/drivers/spi/spi.c
> @@ -28,6 +28,7 @@
> #include <linux/mod_devicetable.h>
> #include <linux/spi/spi.h>
> #include <linux/of_spi.h>
> +#include <linux/of_gpio.h>
> #include <linux/pm_runtime.h>
> #include <linux/export.h>
>
> @@ -339,15 +340,16 @@ EXPORT_SYMBOL_GPL(spi_alloc_device);
> int spi_add_device(struct spi_device *spi)
> {
> static DEFINE_MUTEX(spi_add_lock);
> - struct device *dev = spi->master->dev.parent;
> + struct spi_master *master = spi->master;
> + struct device *dev = master->dev.parent;
> struct device *d;
> int status;
>
> /* Chipselects are numbered 0..max; validate. */
> - if (spi->chip_select >= spi->master->num_chipselect) {
> + if (spi->chip_select >= master->num_chipselect) {
> dev_err(dev, "cs%d >= max %d\n",
> spi->chip_select,
> - spi->master->num_chipselect);
> + master->num_chipselect);
> return -EINVAL;
> }
>
> @@ -371,6 +373,13 @@ int spi_add_device(struct spi_device *spi)
> goto done;
> }
>
> + if (master->num_gpio_chipselect &&
> + spi->chip_select >= master->first_gpio_chipselect) {
> + int num = spi->chip_select = master->first_gpio_chipselect;
> +
> + spi->controller_data = (void*)master->chipselect_gpios[num];
> + }
> +
> /* Drivers may modify this initial i/o setup, but will
> * normally rely on the device being setup. Devices
> * using SPI_CS_HIGH can't coexist well otherwise...
> @@ -562,6 +571,38 @@ struct spi_master *spi_alloc_master(struct device *dev, unsigned size)
> }
> EXPORT_SYMBOL_GPL(spi_alloc_master);
>
> +static int of_spi_register_master(struct spi_master *master)
> +{
> + int nb, i;
> + int *cs;
> + struct device_node *np = master->dev.of_node;
> +
> + if (!np)
> + return 0;
> +
> + nb = of_gpio_named_count(np, "ncs-gpios");
> +
> + if (nb < 1)
> + return 0;
> +
> + master->chipselect_gpios = kzalloc(sizeof(int) * nb, GFP_KERNEL);
> +
> + if (!master->chipselect_gpios)
> + return -ENOMEM;
> +
> + master->first_gpio_chipselect = master->num_chipselect;
> + master->num_chipselect += nb;
> + master->num_gpio_chipselect = nb;
> +
> + for (i = 0; i < nb; i++) {
> + cs = &master->chipselect_gpios[i];
> +
> + *cs = of_get_named_gpio(np, "ncs-gpios", i);
> + }
> +
> + return 0;
> +}
> +
> /**
> * spi_register_master - register SPI master controller
> * @master: initialized master, originally from spi_alloc_master()
> @@ -593,6 +634,10 @@ int spi_register_master(struct spi_master *master)
> if (!dev)
> return -ENODEV;
>
> + status = of_spi_register_master(master);
> + if (status)
> + return status;
> +
> /* even if it's just one always-selected device, there must
> * be at least one chipselect
> */
> diff --git a/include/linux/spi/spi.h b/include/linux/spi/spi.h
> index 176fce9..d21c267 100644
> --- a/include/linux/spi/spi.h
> +++ b/include/linux/spi/spi.h
> @@ -318,6 +318,11 @@ struct spi_master {
>
> /* called on release() to free memory provided by spi_master */
> void (*cleanup)(struct spi_device *spi);
> +
> + /* gpio chip select */
> + int *chipselect_gpios;
> + int first_gpio_chipselect;
> + int num_gpio_chipselect;
> };
>
> static inline void *spi_master_get_devdata(struct spi_master *master)
> --
> 1.7.7
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH 2/3] of_spi: add generic binding support to specify ncs gpio
@ 2012-02-14 4:24 ` Jean-Christophe PLAGNIOL-VILLARD
0 siblings, 0 replies; 15+ messages in thread
From: Jean-Christophe PLAGNIOL-VILLARD @ 2012-02-14 4:24 UTC (permalink / raw)
To: linux-arm-kernel
Hi Grant,
ping
Best Regards,
J.
On 17:14 Thu 09 Feb , Jean-Christophe PLAGNIOL-VILLARD wrote:
> This will allow to use gpio for chip select with no modification in the
> driver binding
>
> When use the ncs-gpios, the gpio number will be passed via the controller_data
> and the number of chip select will automatically increased.
>
> Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
> Cc: devicetree-discuss at lists.ozlabs.org
> Cc: spi-devel-general at lists.sourceforge.net
> ---
> Documentation/devicetree/bindings/spi/spi-bus.txt | 6 +++
> drivers/of/of_spi.c | 27 ++++++++---
> drivers/spi/spi.c | 51 +++++++++++++++++++-
> include/linux/spi/spi.h | 5 ++
> 4 files changed, 78 insertions(+), 11 deletions(-)
>
> diff --git a/Documentation/devicetree/bindings/spi/spi-bus.txt b/Documentation/devicetree/bindings/spi/spi-bus.txt
> index e782add..5a24729 100644
> --- a/Documentation/devicetree/bindings/spi/spi-bus.txt
> +++ b/Documentation/devicetree/bindings/spi/spi-bus.txt
> @@ -12,6 +12,7 @@ The SPI master node requires the following properties:
> - #size-cells - should be zero.
> - compatible - name of SPI bus controller following generic names
> recommended practice.
> +- ncs-gpios - (optional) gpios chip select.
> No other properties are required in the SPI bus node. It is assumed
> that a driver for an SPI bus device will understand that it is an SPI bus.
> However, the binding does not attempt to define the specific method for
> @@ -21,6 +22,8 @@ assumption that board specific platform code will be used to manage
> chip selects. Individual drivers can define additional properties to
> support describing the chip select layout.
>
> +If ncs-gpios is used the number of chip select will automatically increased.
> +
> SPI slave nodes must be children of the SPI master node and can
> contain the following properties.
> - reg - (required) chip select address of device.
> @@ -34,6 +37,9 @@ contain the following properties.
> - spi-cs-high - (optional) Empty property indicating device requires
> chip select active high
>
> +If a gpio chipselect is used for the SPI slave the gpio number will be passed
> +via the controller_data
> +
> SPI example for an MPC5200 SPI bus:
> spi at f00 {
> #address-cells = <1>;
> diff --git a/drivers/of/of_spi.c b/drivers/of/of_spi.c
> index 6dbc074..0d41407 100644
> --- a/drivers/of/of_spi.c
> +++ b/drivers/of/of_spi.c
> @@ -12,6 +12,7 @@
> #include <linux/spi/spi.h>
> #include <linux/of_irq.h>
> #include <linux/of_spi.h>
> +#include <linux/of_gpio.h>
>
> /**
> * of_register_spi_devices - Register child devices onto the SPI bus
> @@ -27,6 +28,7 @@ void of_register_spi_devices(struct spi_master *master)
> const __be32 *prop;
> int rc;
> int len;
> + int ncs_pin;
>
> if (!master->dev.of_node)
> return;
> @@ -50,15 +52,24 @@ void of_register_spi_devices(struct spi_master *master)
> continue;
> }
>
> - /* Device address */
> - prop = of_get_property(nc, "reg", &len);
> - if (!prop || len < sizeof(*prop)) {
> - dev_err(&master->dev, "%s has no 'reg' property\n",
> - nc->full_name);
> - spi_dev_put(spi);
> - continue;
> + /* ncs gpio */
> + ncs_pin = of_get_named_gpio(nc, "ncs-gpio", 0);
> +
> + if (gpio_is_valid(ncs_pin)) {
> + spi->controller_data = (void *)ncs_pin;
> + spi->chip_select = master->num_chipselect;
> + master->num_chipselect++;
> + } else {
> + /* Device address */
> + prop = of_get_property(nc, "reg", &len);
> + if (!prop || len < sizeof(*prop)) {
> + dev_err(&master->dev, "%s has no 'reg' property\n",
> + nc->full_name);
> + spi_dev_put(spi);
> + continue;
> + }
> + spi->chip_select = be32_to_cpup(prop);
> }
> - spi->chip_select = be32_to_cpup(prop);
>
> /* Mode (clock phase/polarity/etc.) */
> if (of_find_property(nc, "spi-cpha", NULL))
> diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
> index e2f4ca0..1f5ffa6 100644
> --- a/drivers/spi/spi.c
> +++ b/drivers/spi/spi.c
> @@ -28,6 +28,7 @@
> #include <linux/mod_devicetable.h>
> #include <linux/spi/spi.h>
> #include <linux/of_spi.h>
> +#include <linux/of_gpio.h>
> #include <linux/pm_runtime.h>
> #include <linux/export.h>
>
> @@ -339,15 +340,16 @@ EXPORT_SYMBOL_GPL(spi_alloc_device);
> int spi_add_device(struct spi_device *spi)
> {
> static DEFINE_MUTEX(spi_add_lock);
> - struct device *dev = spi->master->dev.parent;
> + struct spi_master *master = spi->master;
> + struct device *dev = master->dev.parent;
> struct device *d;
> int status;
>
> /* Chipselects are numbered 0..max; validate. */
> - if (spi->chip_select >= spi->master->num_chipselect) {
> + if (spi->chip_select >= master->num_chipselect) {
> dev_err(dev, "cs%d >= max %d\n",
> spi->chip_select,
> - spi->master->num_chipselect);
> + master->num_chipselect);
> return -EINVAL;
> }
>
> @@ -371,6 +373,13 @@ int spi_add_device(struct spi_device *spi)
> goto done;
> }
>
> + if (master->num_gpio_chipselect &&
> + spi->chip_select >= master->first_gpio_chipselect) {
> + int num = spi->chip_select = master->first_gpio_chipselect;
> +
> + spi->controller_data = (void*)master->chipselect_gpios[num];
> + }
> +
> /* Drivers may modify this initial i/o setup, but will
> * normally rely on the device being setup. Devices
> * using SPI_CS_HIGH can't coexist well otherwise...
> @@ -562,6 +571,38 @@ struct spi_master *spi_alloc_master(struct device *dev, unsigned size)
> }
> EXPORT_SYMBOL_GPL(spi_alloc_master);
>
> +static int of_spi_register_master(struct spi_master *master)
> +{
> + int nb, i;
> + int *cs;
> + struct device_node *np = master->dev.of_node;
> +
> + if (!np)
> + return 0;
> +
> + nb = of_gpio_named_count(np, "ncs-gpios");
> +
> + if (nb < 1)
> + return 0;
> +
> + master->chipselect_gpios = kzalloc(sizeof(int) * nb, GFP_KERNEL);
> +
> + if (!master->chipselect_gpios)
> + return -ENOMEM;
> +
> + master->first_gpio_chipselect = master->num_chipselect;
> + master->num_chipselect += nb;
> + master->num_gpio_chipselect = nb;
> +
> + for (i = 0; i < nb; i++) {
> + cs = &master->chipselect_gpios[i];
> +
> + *cs = of_get_named_gpio(np, "ncs-gpios", i);
> + }
> +
> + return 0;
> +}
> +
> /**
> * spi_register_master - register SPI master controller
> * @master: initialized master, originally from spi_alloc_master()
> @@ -593,6 +634,10 @@ int spi_register_master(struct spi_master *master)
> if (!dev)
> return -ENODEV;
>
> + status = of_spi_register_master(master);
> + if (status)
> + return status;
> +
> /* even if it's just one always-selected device, there must
> * be at least one chipselect
> */
> diff --git a/include/linux/spi/spi.h b/include/linux/spi/spi.h
> index 176fce9..d21c267 100644
> --- a/include/linux/spi/spi.h
> +++ b/include/linux/spi/spi.h
> @@ -318,6 +318,11 @@ struct spi_master {
>
> /* called on release() to free memory provided by spi_master */
> void (*cleanup)(struct spi_device *spi);
> +
> + /* gpio chip select */
> + int *chipselect_gpios;
> + int first_gpio_chipselect;
> + int num_gpio_chipselect;
> };
>
> static inline void *spi_master_get_devdata(struct spi_master *master)
> --
> 1.7.7
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 2/3] of_spi: add generic binding support to specify ncs gpio
2012-02-14 4:24 ` Jean-Christophe PLAGNIOL-VILLARD
@ 2012-02-20 9:56 ` Jean-Christophe PLAGNIOL-VILLARD
-1 siblings, 0 replies; 15+ messages in thread
From: Jean-Christophe PLAGNIOL-VILLARD @ 2012-02-20 9:56 UTC (permalink / raw)
To: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, Grant Likely
Cc: spi-devel-general-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f,
devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ
Hi Grant,
can I have a feedback
the Atmel SPI depend on it
Best Regards,
J.
On 05:24 Tue 14 Feb , Jean-Christophe PLAGNIOL-VILLARD wrote:
> Hi Grant,
>
> ping
>
> Best Regards,
> J.
> On 17:14 Thu 09 Feb , Jean-Christophe PLAGNIOL-VILLARD wrote:
> > This will allow to use gpio for chip select with no modification in the
> > driver binding
> >
> > When use the ncs-gpios, the gpio number will be passed via the controller_data
> > and the number of chip select will automatically increased.
> >
> > Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj-sclMFOaUSTBWk0Htik3J/w@public.gmane.org>
> > Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org
> > Cc: spi-devel-general-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
> > ---
> > Documentation/devicetree/bindings/spi/spi-bus.txt | 6 +++
> > drivers/of/of_spi.c | 27 ++++++++---
> > drivers/spi/spi.c | 51 +++++++++++++++++++-
> > include/linux/spi/spi.h | 5 ++
> > 4 files changed, 78 insertions(+), 11 deletions(-)
> >
> > diff --git a/Documentation/devicetree/bindings/spi/spi-bus.txt b/Documentation/devicetree/bindings/spi/spi-bus.txt
> > index e782add..5a24729 100644
> > --- a/Documentation/devicetree/bindings/spi/spi-bus.txt
> > +++ b/Documentation/devicetree/bindings/spi/spi-bus.txt
> > @@ -12,6 +12,7 @@ The SPI master node requires the following properties:
> > - #size-cells - should be zero.
> > - compatible - name of SPI bus controller following generic names
> > recommended practice.
> > +- ncs-gpios - (optional) gpios chip select.
> > No other properties are required in the SPI bus node. It is assumed
> > that a driver for an SPI bus device will understand that it is an SPI bus.
> > However, the binding does not attempt to define the specific method for
> > @@ -21,6 +22,8 @@ assumption that board specific platform code will be used to manage
> > chip selects. Individual drivers can define additional properties to
> > support describing the chip select layout.
> >
> > +If ncs-gpios is used the number of chip select will automatically increased.
> > +
> > SPI slave nodes must be children of the SPI master node and can
> > contain the following properties.
> > - reg - (required) chip select address of device.
> > @@ -34,6 +37,9 @@ contain the following properties.
> > - spi-cs-high - (optional) Empty property indicating device requires
> > chip select active high
> >
> > +If a gpio chipselect is used for the SPI slave the gpio number will be passed
> > +via the controller_data
> > +
> > SPI example for an MPC5200 SPI bus:
> > spi@f00 {
> > #address-cells = <1>;
> > diff --git a/drivers/of/of_spi.c b/drivers/of/of_spi.c
> > index 6dbc074..0d41407 100644
> > --- a/drivers/of/of_spi.c
> > +++ b/drivers/of/of_spi.c
> > @@ -12,6 +12,7 @@
> > #include <linux/spi/spi.h>
> > #include <linux/of_irq.h>
> > #include <linux/of_spi.h>
> > +#include <linux/of_gpio.h>
> >
> > /**
> > * of_register_spi_devices - Register child devices onto the SPI bus
> > @@ -27,6 +28,7 @@ void of_register_spi_devices(struct spi_master *master)
> > const __be32 *prop;
> > int rc;
> > int len;
> > + int ncs_pin;
> >
> > if (!master->dev.of_node)
> > return;
> > @@ -50,15 +52,24 @@ void of_register_spi_devices(struct spi_master *master)
> > continue;
> > }
> >
> > - /* Device address */
> > - prop = of_get_property(nc, "reg", &len);
> > - if (!prop || len < sizeof(*prop)) {
> > - dev_err(&master->dev, "%s has no 'reg' property\n",
> > - nc->full_name);
> > - spi_dev_put(spi);
> > - continue;
> > + /* ncs gpio */
> > + ncs_pin = of_get_named_gpio(nc, "ncs-gpio", 0);
> > +
> > + if (gpio_is_valid(ncs_pin)) {
> > + spi->controller_data = (void *)ncs_pin;
> > + spi->chip_select = master->num_chipselect;
> > + master->num_chipselect++;
> > + } else {
> > + /* Device address */
> > + prop = of_get_property(nc, "reg", &len);
> > + if (!prop || len < sizeof(*prop)) {
> > + dev_err(&master->dev, "%s has no 'reg' property\n",
> > + nc->full_name);
> > + spi_dev_put(spi);
> > + continue;
> > + }
> > + spi->chip_select = be32_to_cpup(prop);
> > }
> > - spi->chip_select = be32_to_cpup(prop);
> >
> > /* Mode (clock phase/polarity/etc.) */
> > if (of_find_property(nc, "spi-cpha", NULL))
> > diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
> > index e2f4ca0..1f5ffa6 100644
> > --- a/drivers/spi/spi.c
> > +++ b/drivers/spi/spi.c
> > @@ -28,6 +28,7 @@
> > #include <linux/mod_devicetable.h>
> > #include <linux/spi/spi.h>
> > #include <linux/of_spi.h>
> > +#include <linux/of_gpio.h>
> > #include <linux/pm_runtime.h>
> > #include <linux/export.h>
> >
> > @@ -339,15 +340,16 @@ EXPORT_SYMBOL_GPL(spi_alloc_device);
> > int spi_add_device(struct spi_device *spi)
> > {
> > static DEFINE_MUTEX(spi_add_lock);
> > - struct device *dev = spi->master->dev.parent;
> > + struct spi_master *master = spi->master;
> > + struct device *dev = master->dev.parent;
> > struct device *d;
> > int status;
> >
> > /* Chipselects are numbered 0..max; validate. */
> > - if (spi->chip_select >= spi->master->num_chipselect) {
> > + if (spi->chip_select >= master->num_chipselect) {
> > dev_err(dev, "cs%d >= max %d\n",
> > spi->chip_select,
> > - spi->master->num_chipselect);
> > + master->num_chipselect);
> > return -EINVAL;
> > }
> >
> > @@ -371,6 +373,13 @@ int spi_add_device(struct spi_device *spi)
> > goto done;
> > }
> >
> > + if (master->num_gpio_chipselect &&
> > + spi->chip_select >= master->first_gpio_chipselect) {
> > + int num = spi->chip_select = master->first_gpio_chipselect;
> > +
> > + spi->controller_data = (void*)master->chipselect_gpios[num];
> > + }
> > +
> > /* Drivers may modify this initial i/o setup, but will
> > * normally rely on the device being setup. Devices
> > * using SPI_CS_HIGH can't coexist well otherwise...
> > @@ -562,6 +571,38 @@ struct spi_master *spi_alloc_master(struct device *dev, unsigned size)
> > }
> > EXPORT_SYMBOL_GPL(spi_alloc_master);
> >
> > +static int of_spi_register_master(struct spi_master *master)
> > +{
> > + int nb, i;
> > + int *cs;
> > + struct device_node *np = master->dev.of_node;
> > +
> > + if (!np)
> > + return 0;
> > +
> > + nb = of_gpio_named_count(np, "ncs-gpios");
> > +
> > + if (nb < 1)
> > + return 0;
> > +
> > + master->chipselect_gpios = kzalloc(sizeof(int) * nb, GFP_KERNEL);
> > +
> > + if (!master->chipselect_gpios)
> > + return -ENOMEM;
> > +
> > + master->first_gpio_chipselect = master->num_chipselect;
> > + master->num_chipselect += nb;
> > + master->num_gpio_chipselect = nb;
> > +
> > + for (i = 0; i < nb; i++) {
> > + cs = &master->chipselect_gpios[i];
> > +
> > + *cs = of_get_named_gpio(np, "ncs-gpios", i);
> > + }
> > +
> > + return 0;
> > +}
> > +
> > /**
> > * spi_register_master - register SPI master controller
> > * @master: initialized master, originally from spi_alloc_master()
> > @@ -593,6 +634,10 @@ int spi_register_master(struct spi_master *master)
> > if (!dev)
> > return -ENODEV;
> >
> > + status = of_spi_register_master(master);
> > + if (status)
> > + return status;
> > +
> > /* even if it's just one always-selected device, there must
> > * be at least one chipselect
> > */
> > diff --git a/include/linux/spi/spi.h b/include/linux/spi/spi.h
> > index 176fce9..d21c267 100644
> > --- a/include/linux/spi/spi.h
> > +++ b/include/linux/spi/spi.h
> > @@ -318,6 +318,11 @@ struct spi_master {
> >
> > /* called on release() to free memory provided by spi_master */
> > void (*cleanup)(struct spi_device *spi);
> > +
> > + /* gpio chip select */
> > + int *chipselect_gpios;
> > + int first_gpio_chipselect;
> > + int num_gpio_chipselect;
> > };
> >
> > static inline void *spi_master_get_devdata(struct spi_master *master)
> > --
> > 1.7.7
>
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH 2/3] of_spi: add generic binding support to specify ncs gpio
@ 2012-02-20 9:56 ` Jean-Christophe PLAGNIOL-VILLARD
0 siblings, 0 replies; 15+ messages in thread
From: Jean-Christophe PLAGNIOL-VILLARD @ 2012-02-20 9:56 UTC (permalink / raw)
To: linux-arm-kernel
Hi Grant,
can I have a feedback
the Atmel SPI depend on it
Best Regards,
J.
On 05:24 Tue 14 Feb , Jean-Christophe PLAGNIOL-VILLARD wrote:
> Hi Grant,
>
> ping
>
> Best Regards,
> J.
> On 17:14 Thu 09 Feb , Jean-Christophe PLAGNIOL-VILLARD wrote:
> > This will allow to use gpio for chip select with no modification in the
> > driver binding
> >
> > When use the ncs-gpios, the gpio number will be passed via the controller_data
> > and the number of chip select will automatically increased.
> >
> > Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
> > Cc: devicetree-discuss at lists.ozlabs.org
> > Cc: spi-devel-general at lists.sourceforge.net
> > ---
> > Documentation/devicetree/bindings/spi/spi-bus.txt | 6 +++
> > drivers/of/of_spi.c | 27 ++++++++---
> > drivers/spi/spi.c | 51 +++++++++++++++++++-
> > include/linux/spi/spi.h | 5 ++
> > 4 files changed, 78 insertions(+), 11 deletions(-)
> >
> > diff --git a/Documentation/devicetree/bindings/spi/spi-bus.txt b/Documentation/devicetree/bindings/spi/spi-bus.txt
> > index e782add..5a24729 100644
> > --- a/Documentation/devicetree/bindings/spi/spi-bus.txt
> > +++ b/Documentation/devicetree/bindings/spi/spi-bus.txt
> > @@ -12,6 +12,7 @@ The SPI master node requires the following properties:
> > - #size-cells - should be zero.
> > - compatible - name of SPI bus controller following generic names
> > recommended practice.
> > +- ncs-gpios - (optional) gpios chip select.
> > No other properties are required in the SPI bus node. It is assumed
> > that a driver for an SPI bus device will understand that it is an SPI bus.
> > However, the binding does not attempt to define the specific method for
> > @@ -21,6 +22,8 @@ assumption that board specific platform code will be used to manage
> > chip selects. Individual drivers can define additional properties to
> > support describing the chip select layout.
> >
> > +If ncs-gpios is used the number of chip select will automatically increased.
> > +
> > SPI slave nodes must be children of the SPI master node and can
> > contain the following properties.
> > - reg - (required) chip select address of device.
> > @@ -34,6 +37,9 @@ contain the following properties.
> > - spi-cs-high - (optional) Empty property indicating device requires
> > chip select active high
> >
> > +If a gpio chipselect is used for the SPI slave the gpio number will be passed
> > +via the controller_data
> > +
> > SPI example for an MPC5200 SPI bus:
> > spi at f00 {
> > #address-cells = <1>;
> > diff --git a/drivers/of/of_spi.c b/drivers/of/of_spi.c
> > index 6dbc074..0d41407 100644
> > --- a/drivers/of/of_spi.c
> > +++ b/drivers/of/of_spi.c
> > @@ -12,6 +12,7 @@
> > #include <linux/spi/spi.h>
> > #include <linux/of_irq.h>
> > #include <linux/of_spi.h>
> > +#include <linux/of_gpio.h>
> >
> > /**
> > * of_register_spi_devices - Register child devices onto the SPI bus
> > @@ -27,6 +28,7 @@ void of_register_spi_devices(struct spi_master *master)
> > const __be32 *prop;
> > int rc;
> > int len;
> > + int ncs_pin;
> >
> > if (!master->dev.of_node)
> > return;
> > @@ -50,15 +52,24 @@ void of_register_spi_devices(struct spi_master *master)
> > continue;
> > }
> >
> > - /* Device address */
> > - prop = of_get_property(nc, "reg", &len);
> > - if (!prop || len < sizeof(*prop)) {
> > - dev_err(&master->dev, "%s has no 'reg' property\n",
> > - nc->full_name);
> > - spi_dev_put(spi);
> > - continue;
> > + /* ncs gpio */
> > + ncs_pin = of_get_named_gpio(nc, "ncs-gpio", 0);
> > +
> > + if (gpio_is_valid(ncs_pin)) {
> > + spi->controller_data = (void *)ncs_pin;
> > + spi->chip_select = master->num_chipselect;
> > + master->num_chipselect++;
> > + } else {
> > + /* Device address */
> > + prop = of_get_property(nc, "reg", &len);
> > + if (!prop || len < sizeof(*prop)) {
> > + dev_err(&master->dev, "%s has no 'reg' property\n",
> > + nc->full_name);
> > + spi_dev_put(spi);
> > + continue;
> > + }
> > + spi->chip_select = be32_to_cpup(prop);
> > }
> > - spi->chip_select = be32_to_cpup(prop);
> >
> > /* Mode (clock phase/polarity/etc.) */
> > if (of_find_property(nc, "spi-cpha", NULL))
> > diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
> > index e2f4ca0..1f5ffa6 100644
> > --- a/drivers/spi/spi.c
> > +++ b/drivers/spi/spi.c
> > @@ -28,6 +28,7 @@
> > #include <linux/mod_devicetable.h>
> > #include <linux/spi/spi.h>
> > #include <linux/of_spi.h>
> > +#include <linux/of_gpio.h>
> > #include <linux/pm_runtime.h>
> > #include <linux/export.h>
> >
> > @@ -339,15 +340,16 @@ EXPORT_SYMBOL_GPL(spi_alloc_device);
> > int spi_add_device(struct spi_device *spi)
> > {
> > static DEFINE_MUTEX(spi_add_lock);
> > - struct device *dev = spi->master->dev.parent;
> > + struct spi_master *master = spi->master;
> > + struct device *dev = master->dev.parent;
> > struct device *d;
> > int status;
> >
> > /* Chipselects are numbered 0..max; validate. */
> > - if (spi->chip_select >= spi->master->num_chipselect) {
> > + if (spi->chip_select >= master->num_chipselect) {
> > dev_err(dev, "cs%d >= max %d\n",
> > spi->chip_select,
> > - spi->master->num_chipselect);
> > + master->num_chipselect);
> > return -EINVAL;
> > }
> >
> > @@ -371,6 +373,13 @@ int spi_add_device(struct spi_device *spi)
> > goto done;
> > }
> >
> > + if (master->num_gpio_chipselect &&
> > + spi->chip_select >= master->first_gpio_chipselect) {
> > + int num = spi->chip_select = master->first_gpio_chipselect;
> > +
> > + spi->controller_data = (void*)master->chipselect_gpios[num];
> > + }
> > +
> > /* Drivers may modify this initial i/o setup, but will
> > * normally rely on the device being setup. Devices
> > * using SPI_CS_HIGH can't coexist well otherwise...
> > @@ -562,6 +571,38 @@ struct spi_master *spi_alloc_master(struct device *dev, unsigned size)
> > }
> > EXPORT_SYMBOL_GPL(spi_alloc_master);
> >
> > +static int of_spi_register_master(struct spi_master *master)
> > +{
> > + int nb, i;
> > + int *cs;
> > + struct device_node *np = master->dev.of_node;
> > +
> > + if (!np)
> > + return 0;
> > +
> > + nb = of_gpio_named_count(np, "ncs-gpios");
> > +
> > + if (nb < 1)
> > + return 0;
> > +
> > + master->chipselect_gpios = kzalloc(sizeof(int) * nb, GFP_KERNEL);
> > +
> > + if (!master->chipselect_gpios)
> > + return -ENOMEM;
> > +
> > + master->first_gpio_chipselect = master->num_chipselect;
> > + master->num_chipselect += nb;
> > + master->num_gpio_chipselect = nb;
> > +
> > + for (i = 0; i < nb; i++) {
> > + cs = &master->chipselect_gpios[i];
> > +
> > + *cs = of_get_named_gpio(np, "ncs-gpios", i);
> > + }
> > +
> > + return 0;
> > +}
> > +
> > /**
> > * spi_register_master - register SPI master controller
> > * @master: initialized master, originally from spi_alloc_master()
> > @@ -593,6 +634,10 @@ int spi_register_master(struct spi_master *master)
> > if (!dev)
> > return -ENODEV;
> >
> > + status = of_spi_register_master(master);
> > + if (status)
> > + return status;
> > +
> > /* even if it's just one always-selected device, there must
> > * be at least one chipselect
> > */
> > diff --git a/include/linux/spi/spi.h b/include/linux/spi/spi.h
> > index 176fce9..d21c267 100644
> > --- a/include/linux/spi/spi.h
> > +++ b/include/linux/spi/spi.h
> > @@ -318,6 +318,11 @@ struct spi_master {
> >
> > /* called on release() to free memory provided by spi_master */
> > void (*cleanup)(struct spi_device *spi);
> > +
> > + /* gpio chip select */
> > + int *chipselect_gpios;
> > + int first_gpio_chipselect;
> > + int num_gpio_chipselect;
> > };
> >
> > static inline void *spi_master_get_devdata(struct spi_master *master)
> > --
> > 1.7.7
>
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 3/3] spi/atmel: add DT support
[not found] ` <1328804077-6121-3-git-send-email-plagnioj-sclMFOaUSTBWk0Htik3J/w@public.gmane.org>
2012-03-03 2:39 ` Grant Likely
@ 2012-03-03 2:39 ` Grant Likely
0 siblings, 0 replies; 15+ messages in thread
From: Grant Likely @ 2012-03-03 2:39 UTC (permalink / raw)
To: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r
Cc: spi-devel-general-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f,
devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ,
Jean-Christophe PLAGNIOL-VILLARD
On Thu, 9 Feb 2012 17:14:37 +0100, Jean-Christophe PLAGNIOL-VILLARD <plagnioj-sclMFOaUSTBWk0Htik3J/w@public.gmane.org> wrote:
> the atmel_spi use only gpio for chip select
>
> Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj-sclMFOaUSTBWk0Htik3J/w@public.gmane.org>
> Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org
> Cc: spi-devel-general-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
Looks good to me; applied.
g.
> ---
> .../devicetree/bindings/spi/spi_atmel.txt | 6 ++++++
> drivers/spi/spi-atmel.c | 12 +++++++++++-
> 2 files changed, 17 insertions(+), 1 deletions(-)
> create mode 100644 Documentation/devicetree/bindings/spi/spi_atmel.txt
>
> diff --git a/Documentation/devicetree/bindings/spi/spi_atmel.txt b/Documentation/devicetree/bindings/spi/spi_atmel.txt
> new file mode 100644
> index 0000000..7ec3d8d
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/spi/spi_atmel.txt
> @@ -0,0 +1,6 @@
> +Atmel SPI device
> +
> +Required properties:
> +- compatible : should be "atmel,at91rm9200-spi".
> +- reg: Address and length of the register set for the device
> +- interrupts: Should contain macb interrupt
> diff --git a/drivers/spi/spi-atmel.c b/drivers/spi/spi-atmel.c
> index 16d6a83..7bcd11f 100644
> --- a/drivers/spi/spi-atmel.c
> +++ b/drivers/spi/spi-atmel.c
> @@ -19,6 +19,7 @@
> #include <linux/interrupt.h>
> #include <linux/spi/spi.h>
> #include <linux/slab.h>
> +#include <linux/of.h>
>
> #include <asm/io.h>
> #include <mach/board.h>
> @@ -938,7 +939,7 @@ static int __devinit atmel_spi_probe(struct platform_device *pdev)
> master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH;
>
> master->bus_num = pdev->id;
> - master->num_chipselect = 4;
> + master->num_chipselect = master->dev.of_node ? 0 : 4;
> master->setup = atmel_spi_setup;
> master->transfer = atmel_spi_transfer;
> master->cleanup = atmel_spi_cleanup;
> @@ -1064,11 +1065,20 @@ static int atmel_spi_resume(struct platform_device *pdev)
> #define atmel_spi_resume NULL
> #endif
>
> +#if defined(CONFIG_OF)
> +static const struct of_device_id atmel_spi_dt_ids[] = {
> + { .compatible = "atmel,at91rm9200-spi" },
> + { /* sentinel */ }
> +};
> +
> +MODULE_DEVICE_TABLE(of, atmel_spi_dt_ids);
> +#endif
>
> static struct platform_driver atmel_spi_driver = {
> .driver = {
> .name = "atmel_spi",
> .owner = THIS_MODULE,
> + .of_match_table = of_match_ptr(atmel_spi_dt_ids),
> },
> .suspend = atmel_spi_suspend,
> .resume = atmel_spi_resume,
> --
> 1.7.7
>
>
> ------------------------------------------------------------------------------
> Virtualization & Cloud Management Using Capacity Planning
> Cloud computing makes use of virtualization - but cloud computing
> also focuses on allowing computing to be delivered as a service.
> http://www.accelacomm.com/jaw/sfnl/114/51521223/
> _______________________________________________
> spi-devel-general mailing list
> spi-devel-general-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
> https://lists.sourceforge.net/lists/listinfo/spi-devel-general
--
email sent from notmuch.vim plugin
------------------------------------------------------------------------------
Virtualization & Cloud Management Using Capacity Planning
Cloud computing makes use of virtualization - but cloud computing
also focuses on allowing computing to be delivered as a service.
http://www.accelacomm.com/jaw/sfnl/114/51521223/
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 3/3] spi/atmel: add DT support
@ 2012-03-03 2:39 ` Grant Likely
0 siblings, 0 replies; 15+ messages in thread
From: Grant Likely @ 2012-03-03 2:39 UTC (permalink / raw)
To: Jean-Christophe PLAGNIOL-VILLARD,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r
Cc: spi-devel-general-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f,
devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ,
Jean-Christophe PLAGNIOL-VILLARD
On Thu, 9 Feb 2012 17:14:37 +0100, Jean-Christophe PLAGNIOL-VILLARD <plagnioj-sclMFOaUSTBWk0Htik3J/w@public.gmane.org> wrote:
> the atmel_spi use only gpio for chip select
>
> Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj-sclMFOaUSTBWk0Htik3J/w@public.gmane.org>
> Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org
> Cc: spi-devel-general-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
Looks good to me; applied.
g.
> ---
> .../devicetree/bindings/spi/spi_atmel.txt | 6 ++++++
> drivers/spi/spi-atmel.c | 12 +++++++++++-
> 2 files changed, 17 insertions(+), 1 deletions(-)
> create mode 100644 Documentation/devicetree/bindings/spi/spi_atmel.txt
>
> diff --git a/Documentation/devicetree/bindings/spi/spi_atmel.txt b/Documentation/devicetree/bindings/spi/spi_atmel.txt
> new file mode 100644
> index 0000000..7ec3d8d
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/spi/spi_atmel.txt
> @@ -0,0 +1,6 @@
> +Atmel SPI device
> +
> +Required properties:
> +- compatible : should be "atmel,at91rm9200-spi".
> +- reg: Address and length of the register set for the device
> +- interrupts: Should contain macb interrupt
> diff --git a/drivers/spi/spi-atmel.c b/drivers/spi/spi-atmel.c
> index 16d6a83..7bcd11f 100644
> --- a/drivers/spi/spi-atmel.c
> +++ b/drivers/spi/spi-atmel.c
> @@ -19,6 +19,7 @@
> #include <linux/interrupt.h>
> #include <linux/spi/spi.h>
> #include <linux/slab.h>
> +#include <linux/of.h>
>
> #include <asm/io.h>
> #include <mach/board.h>
> @@ -938,7 +939,7 @@ static int __devinit atmel_spi_probe(struct platform_device *pdev)
> master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH;
>
> master->bus_num = pdev->id;
> - master->num_chipselect = 4;
> + master->num_chipselect = master->dev.of_node ? 0 : 4;
> master->setup = atmel_spi_setup;
> master->transfer = atmel_spi_transfer;
> master->cleanup = atmel_spi_cleanup;
> @@ -1064,11 +1065,20 @@ static int atmel_spi_resume(struct platform_device *pdev)
> #define atmel_spi_resume NULL
> #endif
>
> +#if defined(CONFIG_OF)
> +static const struct of_device_id atmel_spi_dt_ids[] = {
> + { .compatible = "atmel,at91rm9200-spi" },
> + { /* sentinel */ }
> +};
> +
> +MODULE_DEVICE_TABLE(of, atmel_spi_dt_ids);
> +#endif
>
> static struct platform_driver atmel_spi_driver = {
> .driver = {
> .name = "atmel_spi",
> .owner = THIS_MODULE,
> + .of_match_table = of_match_ptr(atmel_spi_dt_ids),
> },
> .suspend = atmel_spi_suspend,
> .resume = atmel_spi_resume,
> --
> 1.7.7
>
>
> ------------------------------------------------------------------------------
> Virtualization & Cloud Management Using Capacity Planning
> Cloud computing makes use of virtualization - but cloud computing
> also focuses on allowing computing to be delivered as a service.
> http://www.accelacomm.com/jaw/sfnl/114/51521223/
> _______________________________________________
> spi-devel-general mailing list
> spi-devel-general-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
> https://lists.sourceforge.net/lists/listinfo/spi-devel-general
--
email sent from notmuch.vim plugin
------------------------------------------------------------------------------
Virtualization & Cloud Management Using Capacity Planning
Cloud computing makes use of virtualization - but cloud computing
also focuses on allowing computing to be delivered as a service.
http://www.accelacomm.com/jaw/sfnl/114/51521223/
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH 3/3] spi/atmel: add DT support
@ 2012-03-03 2:39 ` Grant Likely
0 siblings, 0 replies; 15+ messages in thread
From: Grant Likely @ 2012-03-03 2:39 UTC (permalink / raw)
To: linux-arm-kernel
On Thu, 9 Feb 2012 17:14:37 +0100, Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> wrote:
> the atmel_spi use only gpio for chip select
>
> Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
> Cc: devicetree-discuss at lists.ozlabs.org
> Cc: spi-devel-general at lists.sourceforge.net
Looks good to me; applied.
g.
> ---
> .../devicetree/bindings/spi/spi_atmel.txt | 6 ++++++
> drivers/spi/spi-atmel.c | 12 +++++++++++-
> 2 files changed, 17 insertions(+), 1 deletions(-)
> create mode 100644 Documentation/devicetree/bindings/spi/spi_atmel.txt
>
> diff --git a/Documentation/devicetree/bindings/spi/spi_atmel.txt b/Documentation/devicetree/bindings/spi/spi_atmel.txt
> new file mode 100644
> index 0000000..7ec3d8d
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/spi/spi_atmel.txt
> @@ -0,0 +1,6 @@
> +Atmel SPI device
> +
> +Required properties:
> +- compatible : should be "atmel,at91rm9200-spi".
> +- reg: Address and length of the register set for the device
> +- interrupts: Should contain macb interrupt
> diff --git a/drivers/spi/spi-atmel.c b/drivers/spi/spi-atmel.c
> index 16d6a83..7bcd11f 100644
> --- a/drivers/spi/spi-atmel.c
> +++ b/drivers/spi/spi-atmel.c
> @@ -19,6 +19,7 @@
> #include <linux/interrupt.h>
> #include <linux/spi/spi.h>
> #include <linux/slab.h>
> +#include <linux/of.h>
>
> #include <asm/io.h>
> #include <mach/board.h>
> @@ -938,7 +939,7 @@ static int __devinit atmel_spi_probe(struct platform_device *pdev)
> master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH;
>
> master->bus_num = pdev->id;
> - master->num_chipselect = 4;
> + master->num_chipselect = master->dev.of_node ? 0 : 4;
> master->setup = atmel_spi_setup;
> master->transfer = atmel_spi_transfer;
> master->cleanup = atmel_spi_cleanup;
> @@ -1064,11 +1065,20 @@ static int atmel_spi_resume(struct platform_device *pdev)
> #define atmel_spi_resume NULL
> #endif
>
> +#if defined(CONFIG_OF)
> +static const struct of_device_id atmel_spi_dt_ids[] = {
> + { .compatible = "atmel,at91rm9200-spi" },
> + { /* sentinel */ }
> +};
> +
> +MODULE_DEVICE_TABLE(of, atmel_spi_dt_ids);
> +#endif
>
> static struct platform_driver atmel_spi_driver = {
> .driver = {
> .name = "atmel_spi",
> .owner = THIS_MODULE,
> + .of_match_table = of_match_ptr(atmel_spi_dt_ids),
> },
> .suspend = atmel_spi_suspend,
> .resume = atmel_spi_resume,
> --
> 1.7.7
>
>
> ------------------------------------------------------------------------------
> Virtualization & Cloud Management Using Capacity Planning
> Cloud computing makes use of virtualization - but cloud computing
> also focuses on allowing computing to be delivered as a service.
> http://www.accelacomm.com/jaw/sfnl/114/51521223/
> _______________________________________________
> spi-devel-general mailing list
> spi-devel-general at lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/spi-devel-general
--
email sent from notmuch.vim plugin
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 3/3] spi/atmel: add DT support
2012-03-03 2:39 ` Grant Likely
@ 2012-03-03 3:46 ` Jean-Christophe PLAGNIOL-VILLARD
-1 siblings, 0 replies; 15+ messages in thread
From: Jean-Christophe PLAGNIOL-VILLARD @ 2012-03-03 3:46 UTC (permalink / raw)
To: Grant Likely
Cc: spi-devel-general-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f,
devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r
On 19:39 Fri 02 Mar , Grant Likely wrote:
> On Thu, 9 Feb 2012 17:14:37 +0100, Jean-Christophe PLAGNIOL-VILLARD <plagnioj-sclMFOaUSTBWk0Htik3J/w@public.gmane.org> wrote:
> > the atmel_spi use only gpio for chip select
> >
> > Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj-sclMFOaUSTBWk0Htik3J/w@public.gmane.org>
> > Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org
> > Cc: spi-devel-general-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
>
> Looks good to me; applied.
please wait it's need to patch that manage the cs-gpio
will resend a new version soon
Best Regards,
J.
------------------------------------------------------------------------------
Virtualization & Cloud Management Using Capacity Planning
Cloud computing makes use of virtualization - but cloud computing
also focuses on allowing computing to be delivered as a service.
http://www.accelacomm.com/jaw/sfnl/114/51521223/
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH 3/3] spi/atmel: add DT support
@ 2012-03-03 3:46 ` Jean-Christophe PLAGNIOL-VILLARD
0 siblings, 0 replies; 15+ messages in thread
From: Jean-Christophe PLAGNIOL-VILLARD @ 2012-03-03 3:46 UTC (permalink / raw)
To: linux-arm-kernel
On 19:39 Fri 02 Mar , Grant Likely wrote:
> On Thu, 9 Feb 2012 17:14:37 +0100, Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> wrote:
> > the atmel_spi use only gpio for chip select
> >
> > Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
> > Cc: devicetree-discuss at lists.ozlabs.org
> > Cc: spi-devel-general at lists.sourceforge.net
>
> Looks good to me; applied.
please wait it's need to patch that manage the cs-gpio
will resend a new version soon
Best Regards,
J.
^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2012-03-03 3:46 UTC | newest]
Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-02-09 16:14 [PATCH 1/3] spi: move master of_node init to spi_alloc_master Jean-Christophe PLAGNIOL-VILLARD
2012-02-09 16:14 ` Jean-Christophe PLAGNIOL-VILLARD
[not found] ` <1328804077-6121-1-git-send-email-plagnioj-sclMFOaUSTBWk0Htik3J/w@public.gmane.org>
2012-02-09 16:14 ` [PATCH 2/3] of_spi: add generic binding support to specify ncs gpio Jean-Christophe PLAGNIOL-VILLARD
2012-02-09 16:14 ` Jean-Christophe PLAGNIOL-VILLARD
2012-02-14 4:24 ` Jean-Christophe PLAGNIOL-VILLARD
2012-02-14 4:24 ` Jean-Christophe PLAGNIOL-VILLARD
[not found] ` <20120214042419.GG3378-RQcB7r2h9QmfDR2tN2SG5Ni2O/JbrIOy@public.gmane.org>
2012-02-20 9:56 ` Jean-Christophe PLAGNIOL-VILLARD
2012-02-20 9:56 ` Jean-Christophe PLAGNIOL-VILLARD
2012-02-09 16:14 ` [PATCH 3/3] spi/atmel: add DT support Jean-Christophe PLAGNIOL-VILLARD
2012-02-09 16:14 ` Jean-Christophe PLAGNIOL-VILLARD
[not found] ` <1328804077-6121-3-git-send-email-plagnioj-sclMFOaUSTBWk0Htik3J/w@public.gmane.org>
2012-03-03 2:39 ` Grant Likely
2012-03-03 2:39 ` Grant Likely
2012-03-03 2:39 ` Grant Likely
2012-03-03 3:46 ` Jean-Christophe PLAGNIOL-VILLARD
2012-03-03 3:46 ` Jean-Christophe PLAGNIOL-VILLARD
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.