* [PATCH 1/3 v3] spi: move master of_node init to spi_alloc_master
@ 2012-03-02 10:03 ` Jean-Christophe PLAGNIOL-VILLARD
0 siblings, 0 replies; 14+ messages in thread
From: Jean-Christophe PLAGNIOL-VILLARD @ 2012-03-02 10:03 UTC (permalink / raw)
To: linux-arm-kernel
Cc: Grant Likely, spi-devel-general, devicetree-discuss,
Jean-Christophe PLAGNIOL-VILLARD
Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
Cc: devicetree-discuss@lists.ozlabs.org
Cc: spi-devel-general@lists.sourceforge.net
Cc: Grant Likely <grant.likely@secretlab.ca>
---
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] 14+ messages in thread
* [PATCH 1/3 v3] spi: move master of_node init to spi_alloc_master
@ 2012-03-02 10:03 ` Jean-Christophe PLAGNIOL-VILLARD
0 siblings, 0 replies; 14+ messages in thread
From: Jean-Christophe PLAGNIOL-VILLARD @ 2012-03-02 10:03 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
Cc: Grant Likely <grant.likely@secretlab.ca>
---
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] 14+ messages in thread
* [PATCH 2/3 v3] of_spi: add generic binding support to specify ncs gpio
2012-03-02 10:03 ` Jean-Christophe PLAGNIOL-VILLARD
@ 2012-03-02 10:03 ` Jean-Christophe PLAGNIOL-VILLARD
-1 siblings, 0 replies; 14+ messages in thread
From: Jean-Christophe PLAGNIOL-VILLARD @ 2012-03-02 10:03 UTC (permalink / raw)
To: linux-arm-kernel
Cc: Grant Likely, spi-devel-general, devicetree-discuss,
Jean-Christophe PLAGNIOL-VILLARD
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
Cc: Grant Likely <grant.likely@secretlab.ca>
---
v3:
use devm_kzalloc
v2:
specify the gpio array at controller level
Best Regards,
J.
Documentation/devicetree/bindings/spi/spi-bus.txt | 6 +++
drivers/spi/spi.c | 49 +++++++++++++++++++-
include/linux/spi/spi.h | 5 ++
3 files changed, 57 insertions(+), 3 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/spi/spi.c b/drivers/spi/spi.c
index e2f4ca0..f3df51f 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,36 @@ 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;
+
+ cs = devm_kzalloc(&master->dev, sizeof(int) * nb, GFP_KERNEL);
+ master->chipselect_gpios = cs;
+
+ 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[i] = 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 +632,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] 14+ messages in thread
* [PATCH 2/3 v3] of_spi: add generic binding support to specify ncs gpio
@ 2012-03-02 10:03 ` Jean-Christophe PLAGNIOL-VILLARD
0 siblings, 0 replies; 14+ messages in thread
From: Jean-Christophe PLAGNIOL-VILLARD @ 2012-03-02 10:03 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
Cc: Grant Likely <grant.likely@secretlab.ca>
---
v3:
use devm_kzalloc
v2:
specify the gpio array at controller level
Best Regards,
J.
Documentation/devicetree/bindings/spi/spi-bus.txt | 6 +++
drivers/spi/spi.c | 49 +++++++++++++++++++-
include/linux/spi/spi.h | 5 ++
3 files changed, 57 insertions(+), 3 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/spi/spi.c b/drivers/spi/spi.c
index e2f4ca0..f3df51f 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,36 @@ 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;
+
+ cs = devm_kzalloc(&master->dev, sizeof(int) * nb, GFP_KERNEL);
+ master->chipselect_gpios = cs;
+
+ 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[i] = 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 +632,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@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] 14+ messages in thread
* [PATCH 3/3 v3] spi/atmel: add DT support
2012-03-02 10:03 ` Jean-Christophe PLAGNIOL-VILLARD
@ 2012-03-02 10:03 ` Jean-Christophe PLAGNIOL-VILLARD
-1 siblings, 0 replies; 14+ messages in thread
From: Jean-Christophe PLAGNIOL-VILLARD @ 2012-03-02 10:03 UTC (permalink / raw)
To: linux-arm-kernel
Cc: spi-devel-general, devicetree-discuss, Jean-Christophe PLAGNIOL-VILLARD
The atmel_spi use only gpio for chip select.
Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
Cc: devicetree-discuss@lists.ozlabs.org
Cc: spi-devel-general@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] 14+ messages in thread
* [PATCH 3/3 v3] spi/atmel: add DT support
@ 2012-03-02 10:03 ` Jean-Christophe PLAGNIOL-VILLARD
0 siblings, 0 replies; 14+ messages in thread
From: Jean-Christophe PLAGNIOL-VILLARD @ 2012-03-02 10:03 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] 14+ messages in thread
* Re: [PATCH 1/3 v3] spi: move master of_node init to spi_alloc_master
[not found] ` <1330682587-20636-1-git-send-email-plagnioj-sclMFOaUSTBWk0Htik3J/w@public.gmane.org>
2012-03-02 19:20 ` Grant Likely
@ 2012-03-02 19:20 ` Grant Likely
0 siblings, 0 replies; 14+ messages in thread
From: Grant Likely @ 2012-03-02 19:20 UTC (permalink / raw)
To: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r
Cc: spi-devel-general-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f,
devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ,
Jean-Christophe PLAGNIOL-VILLARD
On Fri, 2 Mar 2012 11:03:05 +0100, Jean-Christophe PLAGNIOL-VILLARD <plagnioj-sclMFOaUSTBWk0Htik3J/w@public.gmane.org> wrote:
> 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
> Cc: Grant Likely <grant.likely-s3s/WqlpOiPyB63q8FvJNQ@public.gmane.org>
Actually, the of_node pointer setting was purposefully left out
of spi_alloc_master() because it is not necesarily true that the
dt node associated with the struct device will be the node where
all the spi children are parented. I want to leave this
initialization in the drivers.
g.
------------------------------------------------------------------------------
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] 14+ messages in thread
* Re: [PATCH 1/3 v3] spi: move master of_node init to spi_alloc_master
@ 2012-03-02 19:20 ` Grant Likely
0 siblings, 0 replies; 14+ messages in thread
From: Grant Likely @ 2012-03-02 19:20 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 Fri, 2 Mar 2012 11:03:05 +0100, Jean-Christophe PLAGNIOL-VILLARD <plagnioj-sclMFOaUSTBWk0Htik3J/w@public.gmane.org> wrote:
> 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
> Cc: Grant Likely <grant.likely-s3s/WqlpOiPyB63q8FvJNQ@public.gmane.org>
Actually, the of_node pointer setting was purposefully left out
of spi_alloc_master() because it is not necesarily true that the
dt node associated with the struct device will be the node where
all the spi children are parented. I want to leave this
initialization in the drivers.
g.
------------------------------------------------------------------------------
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] 14+ messages in thread
* [PATCH 1/3 v3] spi: move master of_node init to spi_alloc_master
@ 2012-03-02 19:20 ` Grant Likely
0 siblings, 0 replies; 14+ messages in thread
From: Grant Likely @ 2012-03-02 19:20 UTC (permalink / raw)
To: linux-arm-kernel
On Fri, 2 Mar 2012 11:03:05 +0100, Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> wrote:
> 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
> Cc: Grant Likely <grant.likely@secretlab.ca>
Actually, the of_node pointer setting was purposefully left out
of spi_alloc_master() because it is not necesarily true that the
dt node associated with the struct device will be the node where
all the spi children are parented. I want to leave this
initialization in the drivers.
g.
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 2/3 v3] of_spi: add generic binding support to specify ncs gpio
[not found] ` <1330682587-20636-2-git-send-email-plagnioj-sclMFOaUSTBWk0Htik3J/w@public.gmane.org>
2012-03-03 2:32 ` Grant Likely
@ 2012-03-03 2:32 ` Grant Likely
0 siblings, 0 replies; 14+ messages in thread
From: Grant Likely @ 2012-03-03 2:32 UTC (permalink / raw)
To: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r
Cc: spi-devel-general-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f,
devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ,
Jean-Christophe PLAGNIOL-VILLARD
On Fri, 2 Mar 2012 11:03:06 +0100, Jean-Christophe PLAGNIOL-VILLARD <plagnioj-sclMFOaUSTBWk0Htik3J/w@public.gmane.org> 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
> Cc: Grant Likely <grant.likely-s3s/WqlpOiPyB63q8FvJNQ@public.gmane.org>
> ---
> v3:
> use devm_kzalloc
>
> v2:
> specify the gpio array at controller level
>
> Best Regards,
> J.
> Documentation/devicetree/bindings/spi/spi-bus.txt | 6 +++
> drivers/spi/spi.c | 49 +++++++++++++++++++-
> include/linux/spi/spi.h | 5 ++
> 3 files changed, 57 insertions(+), 3 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.
ncs? What does the 'n' stand for?
> 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/spi/spi.c b/drivers/spi/spi.c
> index e2f4ca0..f3df51f 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;
I'd rather see an unconditional array of gpios; which only get used if a
valid gpio number is assigned.
> +
> + spi->controller_data = (void*)master->chipselect_gpios[num];
Controller_data cannot be used here since it is provided for use
by the controller driver.
> + }
> +
> /* 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,36 @@ 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;
> +
> + cs = devm_kzalloc(&master->dev, sizeof(int) * nb, GFP_KERNEL);
> + master->chipselect_gpios = cs;
the chipselect gpios functionality should be available regardless
of whether or not DT is used. This should be moved out of the of-specific
register function.
> +
> + 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[i] = of_get_named_gpio(np, "ncs-gpios", i);
> +
> + return 0;
> +}
This function should be #ifdefed out when !OF
> +
> /**
> * spi_register_master - register SPI master controller
> * @master: initialized master, originally from spi_alloc_master()
> @@ -593,6 +632,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;
s/chipselect/cs/ would be quite a bit less verbose
> };
>
> static inline void *spi_master_get_devdata(struct spi_master *master)
> --
> 1.7.7
>
--
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] 14+ messages in thread
* Re: [PATCH 2/3 v3] of_spi: add generic binding support to specify ncs gpio
@ 2012-03-03 2:32 ` Grant Likely
0 siblings, 0 replies; 14+ messages in thread
From: Grant Likely @ 2012-03-03 2:32 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 Fri, 2 Mar 2012 11:03:06 +0100, Jean-Christophe PLAGNIOL-VILLARD <plagnioj-sclMFOaUSTBWk0Htik3J/w@public.gmane.org> 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
> Cc: Grant Likely <grant.likely-s3s/WqlpOiPyB63q8FvJNQ@public.gmane.org>
> ---
> v3:
> use devm_kzalloc
>
> v2:
> specify the gpio array at controller level
>
> Best Regards,
> J.
> Documentation/devicetree/bindings/spi/spi-bus.txt | 6 +++
> drivers/spi/spi.c | 49 +++++++++++++++++++-
> include/linux/spi/spi.h | 5 ++
> 3 files changed, 57 insertions(+), 3 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.
ncs? What does the 'n' stand for?
> 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/spi/spi.c b/drivers/spi/spi.c
> index e2f4ca0..f3df51f 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;
I'd rather see an unconditional array of gpios; which only get used if a
valid gpio number is assigned.
> +
> + spi->controller_data = (void*)master->chipselect_gpios[num];
Controller_data cannot be used here since it is provided for use
by the controller driver.
> + }
> +
> /* 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,36 @@ 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;
> +
> + cs = devm_kzalloc(&master->dev, sizeof(int) * nb, GFP_KERNEL);
> + master->chipselect_gpios = cs;
the chipselect gpios functionality should be available regardless
of whether or not DT is used. This should be moved out of the of-specific
register function.
> +
> + 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[i] = of_get_named_gpio(np, "ncs-gpios", i);
> +
> + return 0;
> +}
This function should be #ifdefed out when !OF
> +
> /**
> * spi_register_master - register SPI master controller
> * @master: initialized master, originally from spi_alloc_master()
> @@ -593,6 +632,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;
s/chipselect/cs/ would be quite a bit less verbose
> };
>
> static inline void *spi_master_get_devdata(struct spi_master *master)
> --
> 1.7.7
>
--
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] 14+ messages in thread
* [PATCH 2/3 v3] of_spi: add generic binding support to specify ncs gpio
@ 2012-03-03 2:32 ` Grant Likely
0 siblings, 0 replies; 14+ messages in thread
From: Grant Likely @ 2012-03-03 2:32 UTC (permalink / raw)
To: linux-arm-kernel
On Fri, 2 Mar 2012 11:03:06 +0100, Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> 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
> Cc: Grant Likely <grant.likely@secretlab.ca>
> ---
> v3:
> use devm_kzalloc
>
> v2:
> specify the gpio array at controller level
>
> Best Regards,
> J.
> Documentation/devicetree/bindings/spi/spi-bus.txt | 6 +++
> drivers/spi/spi.c | 49 +++++++++++++++++++-
> include/linux/spi/spi.h | 5 ++
> 3 files changed, 57 insertions(+), 3 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.
ncs? What does the 'n' stand for?
> 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/spi/spi.c b/drivers/spi/spi.c
> index e2f4ca0..f3df51f 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;
I'd rather see an unconditional array of gpios; which only get used if a
valid gpio number is assigned.
> +
> + spi->controller_data = (void*)master->chipselect_gpios[num];
Controller_data cannot be used here since it is provided for use
by the controller driver.
> + }
> +
> /* 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,36 @@ 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;
> +
> + cs = devm_kzalloc(&master->dev, sizeof(int) * nb, GFP_KERNEL);
> + master->chipselect_gpios = cs;
the chipselect gpios functionality should be available regardless
of whether or not DT is used. This should be moved out of the of-specific
register function.
> +
> + 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[i] = of_get_named_gpio(np, "ncs-gpios", i);
> +
> + return 0;
> +}
This function should be #ifdefed out when !OF
> +
> /**
> * spi_register_master - register SPI master controller
> * @master: initialized master, originally from spi_alloc_master()
> @@ -593,6 +632,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;
s/chipselect/cs/ would be quite a bit less verbose
> };
>
> static inline void *spi_master_get_devdata(struct spi_master *master)
> --
> 1.7.7
>
--
email sent from notmuch.vim plugin
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 2/3 v3] of_spi: add generic binding support to specify ncs gpio
2012-03-03 2:32 ` Grant Likely
@ 2012-03-03 3:45 ` Jean-Christophe PLAGNIOL-VILLARD
-1 siblings, 0 replies; 14+ messages in thread
From: Jean-Christophe PLAGNIOL-VILLARD @ 2012-03-03 3:45 UTC (permalink / raw)
To: Grant Likely
Cc: spi-devel-general-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f,
devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r
On 19:32 Fri 02 Mar , Grant Likely wrote:
> On Fri, 2 Mar 2012 11:03:06 +0100, Jean-Christophe PLAGNIOL-VILLARD <plagnioj-sclMFOaUSTBWk0Htik3J/w@public.gmane.org> 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
> > Cc: Grant Likely <grant.likely-s3s/WqlpOiPyB63q8FvJNQ@public.gmane.org>
> > ---
> > v3:
> > use devm_kzalloc
> >
> > v2:
> > specify the gpio array at controller level
> >
> > Best Regards,
> > J.
> > Documentation/devicetree/bindings/spi/spi-bus.txt | 6 +++
> > drivers/spi/spi.c | 49 +++++++++++++++++++-
> > include/linux/spi/spi.h | 5 ++
> > 3 files changed, 57 insertions(+), 3 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.
>
> ncs? What does the 'n' stand for?
for not chipslelect will remove
>
> > 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/spi/spi.c b/drivers/spi/spi.c
> > index e2f4ca0..f3df51f 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;
>
> I'd rather see an unconditional array of gpios; which only get used if a
> valid gpio number is assigned.
I want to have this transparent for the driver
I don't want it to manage this. The driver just need to known it's cs-gpio
and wich one
>
> > +
> > + spi->controller_data = (void*)master->chipselect_gpios[num];
>
> Controller_data cannot be used here since it is provided for use
> by the controller driver.
a new entry cs_gpio in the spi_device
>
> > + }
> > +
> > /* 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,36 @@ 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;
> > +
> > + cs = devm_kzalloc(&master->dev, sizeof(int) * nb, GFP_KERNEL);
> > + master->chipselect_gpios = cs;
>
> the chipselect gpios functionality should be available regardless
> of whether or not DT is used. This should be moved out of the of-specific
> register function.
it's the case here it's just the management on the binding
>
> > +
> > + 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[i] = of_get_named_gpio(np, "ncs-gpios", i);
> > +
> > + return 0;
> > +}
>
> This function should be #ifdefed out when !OF
>
> > +
> > /**
> > * spi_register_master - register SPI master controller
> > * @master: initialized master, originally from spi_alloc_master()
> > @@ -593,6 +632,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;
>
> s/chipselect/cs/ would be quite a bit less verbose
ok
>
> > };
Best Regards,
J.
> >
> > static inline void *spi_master_get_devdata(struct spi_master *master)
> > --
> > 1.7.7
> >
>
> --
> 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] 14+ messages in thread
* [PATCH 2/3 v3] of_spi: add generic binding support to specify ncs gpio
@ 2012-03-03 3:45 ` Jean-Christophe PLAGNIOL-VILLARD
0 siblings, 0 replies; 14+ messages in thread
From: Jean-Christophe PLAGNIOL-VILLARD @ 2012-03-03 3:45 UTC (permalink / raw)
To: linux-arm-kernel
On 19:32 Fri 02 Mar , Grant Likely wrote:
> On Fri, 2 Mar 2012 11:03:06 +0100, Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> 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
> > Cc: Grant Likely <grant.likely@secretlab.ca>
> > ---
> > v3:
> > use devm_kzalloc
> >
> > v2:
> > specify the gpio array at controller level
> >
> > Best Regards,
> > J.
> > Documentation/devicetree/bindings/spi/spi-bus.txt | 6 +++
> > drivers/spi/spi.c | 49 +++++++++++++++++++-
> > include/linux/spi/spi.h | 5 ++
> > 3 files changed, 57 insertions(+), 3 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.
>
> ncs? What does the 'n' stand for?
for not chipslelect will remove
>
> > 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/spi/spi.c b/drivers/spi/spi.c
> > index e2f4ca0..f3df51f 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;
>
> I'd rather see an unconditional array of gpios; which only get used if a
> valid gpio number is assigned.
I want to have this transparent for the driver
I don't want it to manage this. The driver just need to known it's cs-gpio
and wich one
>
> > +
> > + spi->controller_data = (void*)master->chipselect_gpios[num];
>
> Controller_data cannot be used here since it is provided for use
> by the controller driver.
a new entry cs_gpio in the spi_device
>
> > + }
> > +
> > /* 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,36 @@ 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;
> > +
> > + cs = devm_kzalloc(&master->dev, sizeof(int) * nb, GFP_KERNEL);
> > + master->chipselect_gpios = cs;
>
> the chipselect gpios functionality should be available regardless
> of whether or not DT is used. This should be moved out of the of-specific
> register function.
it's the case here it's just the management on the binding
>
> > +
> > + 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[i] = of_get_named_gpio(np, "ncs-gpios", i);
> > +
> > + return 0;
> > +}
>
> This function should be #ifdefed out when !OF
>
> > +
> > /**
> > * spi_register_master - register SPI master controller
> > * @master: initialized master, originally from spi_alloc_master()
> > @@ -593,6 +632,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;
>
> s/chipselect/cs/ would be quite a bit less verbose
ok
>
> > };
Best Regards,
J.
> >
> > static inline void *spi_master_get_devdata(struct spi_master *master)
> > --
> > 1.7.7
> >
>
> --
> email sent from notmuch.vim plugin
^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2012-03-03 3:45 UTC | newest]
Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-03-02 10:03 [PATCH 1/3 v3] spi: move master of_node init to spi_alloc_master Jean-Christophe PLAGNIOL-VILLARD
2012-03-02 10:03 ` Jean-Christophe PLAGNIOL-VILLARD
2012-03-02 10:03 ` [PATCH 2/3 v3] of_spi: add generic binding support to specify ncs gpio Jean-Christophe PLAGNIOL-VILLARD
2012-03-02 10:03 ` Jean-Christophe PLAGNIOL-VILLARD
[not found] ` <1330682587-20636-2-git-send-email-plagnioj-sclMFOaUSTBWk0Htik3J/w@public.gmane.org>
2012-03-03 2:32 ` Grant Likely
2012-03-03 2:32 ` Grant Likely
2012-03-03 2:32 ` Grant Likely
2012-03-03 3:45 ` Jean-Christophe PLAGNIOL-VILLARD
2012-03-03 3:45 ` Jean-Christophe PLAGNIOL-VILLARD
2012-03-02 10:03 ` [PATCH 3/3 v3] spi/atmel: add DT support Jean-Christophe PLAGNIOL-VILLARD
2012-03-02 10:03 ` Jean-Christophe PLAGNIOL-VILLARD
[not found] ` <1330682587-20636-1-git-send-email-plagnioj-sclMFOaUSTBWk0Htik3J/w@public.gmane.org>
2012-03-02 19:20 ` [PATCH 1/3 v3] spi: move master of_node init to spi_alloc_master Grant Likely
2012-03-02 19:20 ` Grant Likely
2012-03-02 19:20 ` Grant Likely
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.