linux-spi.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2] Memory-mapped dw_spi driver
@ 2010-01-21 14:27 Jean-Hugues Deschenes
       [not found] ` <20100121142636.31707.70616.stgit-PR71IgaHmJalNznWqnLNUK6RkeBMCJyt@public.gmane.org>
  0 siblings, 1 reply; 5+ messages in thread
From: Jean-Hugues Deschenes @ 2010-01-21 14:27 UTC (permalink / raw)
  To: Feng Tang
  Cc: spi-devel-general-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f, David Brownell

Adds a memory-mapped I/O dw_spi platform device.

---
Changelog v1->v2
- simplified dw_spi_mmio.c preamble (Grant Likely)
- build of dw_spi_mmio and dw_spi_pci are now independant
  of each other (Grant Likely)
- add call to dw_spi_remove_host (Feng Tang)
---

Signed-off-by: Jean-Hugues Deschenes <jean-hugues.deschenes-YGVykHU+fedBDgjK7y7TUQ@public.gmane.org>
---
 drivers/spi/Kconfig       |    4 +
 drivers/spi/Makefile      |    1 
 drivers/spi/dw_spi_mmio.c |  148 +++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 153 insertions(+), 0 deletions(-)
 create mode 100644 drivers/spi/dw_spi_mmio.c

diff --git a/drivers/spi/Kconfig b/drivers/spi/Kconfig
index f55eb01..02be3a6 100644
--- a/drivers/spi/Kconfig
+++ b/drivers/spi/Kconfig
@@ -317,6 +317,10 @@ config SPI_DW_PCI
 	tristate "PCI interface driver for DW SPI core"
 	depends on SPI_DESIGNWARE && PCI
 
+config SPI_DW_MMIO
+	tristate "Memory-mapped io interface driver for DW SPI core"
+	depends on SPI_DESIGNWARE
+
 #
 # There are lots of SPI device types, with sensors and memory
 # being probably the most widely used ones.
diff --git a/drivers/spi/Makefile b/drivers/spi/Makefile
index f3d2810..c3e5ce7 100644
--- a/drivers/spi/Makefile
+++ b/drivers/spi/Makefile
@@ -18,6 +18,7 @@ obj-$(CONFIG_SPI_AU1550)		+= au1550_spi.o
 obj-$(CONFIG_SPI_BUTTERFLY)		+= spi_butterfly.o
 obj-$(CONFIG_SPI_DESIGNWARE)		+= dw_spi.o
 obj-$(CONFIG_SPI_DW_PCI)		+= dw_spi_pci.o
+obj-$(CONFIG_SPI_DW_MMIO)		+= dw_spi_mmio.o
 obj-$(CONFIG_SPI_GPIO)			+= spi_gpio.o
 obj-$(CONFIG_SPI_IMX)			+= spi_imx.o
 obj-$(CONFIG_SPI_LM70_LLP)		+= spi_lm70llp.o
diff --git a/drivers/spi/dw_spi_mmio.c b/drivers/spi/dw_spi_mmio.c
new file mode 100644
index 0000000..26c4b49
--- /dev/null
+++ b/drivers/spi/dw_spi_mmio.c
@@ -0,0 +1,148 @@
+/*
+ * dw_spi_mmio.c - Memory-mapped interface driver for DW SPI Core
+ *
+ * Copyright (c) 2010, Octasic semiconductor.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ */
+
+#include <linux/clk.h>
+#include <linux/interrupt.h>
+#include <linux/platform_device.h>
+#include <linux/spi/dw_spi.h>
+#include <linux/spi/spi.h>
+
+#define DRIVER_NAME "dw_spi_mmio"
+
+struct dw_spi_mmio {
+	struct dw_spi	dws;
+	struct clk		*clk;
+};
+
+static int __devinit dw_spi_mmio_probe(struct platform_device *pdev)
+{
+	struct dw_spi_mmio *dwsmmio;
+	struct dw_spi *dws;
+	struct resource *mem, *ioarea;
+	int ret;
+
+	dwsmmio = kzalloc(sizeof(struct dw_spi_mmio), GFP_KERNEL);
+	if (!dwsmmio) {
+		ret = -ENOMEM;
+		goto err_end;
+	}
+
+	dws = &dwsmmio->dws;
+
+	/* Get basic io resource and map it */
+	mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+	if (!mem) {
+		dev_err(&pdev->dev, "no mem resource?\n");
+		ret = -EINVAL;
+		goto err_kfree;
+	}
+
+	ioarea = request_mem_region(mem->start, resource_size(mem),
+			pdev->name);
+	if (!ioarea) {
+		dev_err(&pdev->dev, "SPI region already claimed\n");
+		ret = -EBUSY;
+		goto err_kfree;
+	}
+
+	dws->regs = ioremap_nocache(mem->start, resource_size(mem));
+	if (!dws->regs) {
+		dev_err(&pdev->dev, "SPI region already mapped\n");
+		ret = -ENOMEM;
+		goto err_release_reg;
+	}
+
+	dws->irq = platform_get_irq(pdev, 0);
+	if (dws->irq < 0) {
+		dev_err(&pdev->dev, "no irq resource?\n");
+		ret = dws->irq; /* -ENXIO */
+		goto err_unmap;
+	}
+
+	dwsmmio->clk = clk_get(&pdev->dev, NULL);
+	if (!dwsmmio->clk) {
+		ret = -ENODEV;
+		goto err_irq;
+	}
+	clk_enable(dwsmmio->clk);
+
+	dws->parent_dev = &pdev->dev;
+	dws->bus_num = 0;
+	dws->num_cs = 4;
+	dws->max_freq = clk_get_rate(dwsmmio->clk);
+
+	ret = dw_spi_add_host(dws);
+	if (ret)
+		goto err_clk;
+
+	platform_set_drvdata(pdev, dwsmmio);
+	return 0;
+
+err_clk:
+	clk_disable(dwsmmio->clk);
+	clk_put(dwsmmio->clk);
+	dwsmmio->clk = NULL;
+err_irq:
+	free_irq(dws->irq, dws);
+err_unmap:
+	iounmap(dws->regs);
+err_release_reg:
+	release_mem_region(mem->start, resource_size(mem));
+err_kfree:
+	kfree(dwsmmio);
+err_end:
+	return ret;
+}
+
+static int __devexit dw_spi_mmio_remove(struct platform_device *pdev)
+{
+	struct dw_spi_mmio *dwsmmio = platform_get_drvdata(pdev);
+	struct resource *mem;
+
+	platform_set_drvdata(pdev, NULL);
+
+	clk_disable(dwsmmio->clk);
+	clk_put(dwsmmio->clk);
+	dwsmmio->clk = NULL;
+
+	free_irq(dwsmmio->dws.irq, &dwsmmio->dws);
+	dw_spi_remove_host(&dwsmmio->dws);
+	iounmap(dwsmmio->dws.regs);
+	kfree(dwsmmio);
+
+	mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+	release_mem_region(mem->start, resource_size(mem));
+	return 0;
+}
+
+static struct platform_driver dw_spi_mmio_driver = {
+	.remove		= __devexit_p(dw_spi_mmio_remove),
+	.driver		= {
+		.name	= DRIVER_NAME,
+		.owner	= THIS_MODULE,
+	},
+};
+
+static int __init dw_spi_mmio_init(void)
+{
+	return platform_driver_probe(&dw_spi_mmio_driver, dw_spi_mmio_probe);
+}
+
+static void __exit dw_spi_mmio_exit(void)
+{
+	platform_driver_unregister(&dw_spi_mmio_driver);
+}
+
+module_init(dw_spi_mmio_init);
+module_exit(dw_spi_mmio_exit);
+
+MODULE_AUTHOR("Jean-Hugues Deschenes <jean-hugues.deschenes-YGVykHU+fedBDgjK7y7TUQ@public.gmane.org>");
+MODULE_DESCRIPTION("Memory-mapped I/O interface driver for DW SPI Core");
+MODULE_LICENSE("GPL v2");


------------------------------------------------------------------------------
Throughout its 18-year history, RSA Conference consistently attracts the
world's best and brightest in the field, creating opportunities for Conference
attendees to learn about information security's most important issues through
interactions with peers, luminaries and emerging and established companies.
http://p.sf.net/sfu/rsaconf-dev2dev

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v2] Memory-mapped dw_spi driver
       [not found] ` <20100121142636.31707.70616.stgit-PR71IgaHmJalNznWqnLNUK6RkeBMCJyt@public.gmane.org>
@ 2010-01-21 14:43   ` Grant Likely
  2010-01-21 14:46   ` Grant Likely
  2010-01-21 14:53   ` Wolfram Sang
  2 siblings, 0 replies; 5+ messages in thread
From: Grant Likely @ 2010-01-21 14:43 UTC (permalink / raw)
  To: Jean-Hugues Deschenes
  Cc: spi-devel-general-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f, David Brownell

On Thu, Jan 21, 2010 at 7:27 AM, Jean-Hugues Deschenes
<jean-hugues.deschenes-YGVykHU+fedBDgjK7y7TUQ@public.gmane.org> wrote:
> Adds a memory-mapped I/O dw_spi platform device.
>
> ---
> Changelog v1->v2
> - simplified dw_spi_mmio.c preamble (Grant Likely)
> - build of dw_spi_mmio and dw_spi_pci are now independant
>  of each other (Grant Likely)
> - add call to dw_spi_remove_host (Feng Tang)
> ---

Merged, thanks.

g.

>
> Signed-off-by: Jean-Hugues Deschenes <jean-hugues.deschenes-YGVykHU+fedBDgjK7y7TUQ@public.gmane.org>
> ---
>  drivers/spi/Kconfig       |    4 +
>  drivers/spi/Makefile      |    1
>  drivers/spi/dw_spi_mmio.c |  148 +++++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 153 insertions(+), 0 deletions(-)
>  create mode 100644 drivers/spi/dw_spi_mmio.c
>
> diff --git a/drivers/spi/Kconfig b/drivers/spi/Kconfig
> index f55eb01..02be3a6 100644
> --- a/drivers/spi/Kconfig
> +++ b/drivers/spi/Kconfig
> @@ -317,6 +317,10 @@ config SPI_DW_PCI
>        tristate "PCI interface driver for DW SPI core"
>        depends on SPI_DESIGNWARE && PCI
>
> +config SPI_DW_MMIO
> +       tristate "Memory-mapped io interface driver for DW SPI core"
> +       depends on SPI_DESIGNWARE
> +
>  #
>  # There are lots of SPI device types, with sensors and memory
>  # being probably the most widely used ones.
> diff --git a/drivers/spi/Makefile b/drivers/spi/Makefile
> index f3d2810..c3e5ce7 100644
> --- a/drivers/spi/Makefile
> +++ b/drivers/spi/Makefile
> @@ -18,6 +18,7 @@ obj-$(CONFIG_SPI_AU1550)              += au1550_spi.o
>  obj-$(CONFIG_SPI_BUTTERFLY)            += spi_butterfly.o
>  obj-$(CONFIG_SPI_DESIGNWARE)           += dw_spi.o
>  obj-$(CONFIG_SPI_DW_PCI)               += dw_spi_pci.o
> +obj-$(CONFIG_SPI_DW_MMIO)              += dw_spi_mmio.o
>  obj-$(CONFIG_SPI_GPIO)                 += spi_gpio.o
>  obj-$(CONFIG_SPI_IMX)                  += spi_imx.o
>  obj-$(CONFIG_SPI_LM70_LLP)             += spi_lm70llp.o
> diff --git a/drivers/spi/dw_spi_mmio.c b/drivers/spi/dw_spi_mmio.c
> new file mode 100644
> index 0000000..26c4b49
> --- /dev/null
> +++ b/drivers/spi/dw_spi_mmio.c
> @@ -0,0 +1,148 @@
> +/*
> + * dw_spi_mmio.c - Memory-mapped interface driver for DW SPI Core
> + *
> + * Copyright (c) 2010, Octasic semiconductor.
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms and conditions of the GNU General Public License,
> + * version 2, as published by the Free Software Foundation.
> + */
> +
> +#include <linux/clk.h>
> +#include <linux/interrupt.h>
> +#include <linux/platform_device.h>
> +#include <linux/spi/dw_spi.h>
> +#include <linux/spi/spi.h>
> +
> +#define DRIVER_NAME "dw_spi_mmio"
> +
> +struct dw_spi_mmio {
> +       struct dw_spi   dws;
> +       struct clk              *clk;
> +};
> +
> +static int __devinit dw_spi_mmio_probe(struct platform_device *pdev)
> +{
> +       struct dw_spi_mmio *dwsmmio;
> +       struct dw_spi *dws;
> +       struct resource *mem, *ioarea;
> +       int ret;
> +
> +       dwsmmio = kzalloc(sizeof(struct dw_spi_mmio), GFP_KERNEL);
> +       if (!dwsmmio) {
> +               ret = -ENOMEM;
> +               goto err_end;
> +       }
> +
> +       dws = &dwsmmio->dws;
> +
> +       /* Get basic io resource and map it */
> +       mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> +       if (!mem) {
> +               dev_err(&pdev->dev, "no mem resource?\n");
> +               ret = -EINVAL;
> +               goto err_kfree;
> +       }
> +
> +       ioarea = request_mem_region(mem->start, resource_size(mem),
> +                       pdev->name);
> +       if (!ioarea) {
> +               dev_err(&pdev->dev, "SPI region already claimed\n");
> +               ret = -EBUSY;
> +               goto err_kfree;
> +       }
> +
> +       dws->regs = ioremap_nocache(mem->start, resource_size(mem));
> +       if (!dws->regs) {
> +               dev_err(&pdev->dev, "SPI region already mapped\n");
> +               ret = -ENOMEM;
> +               goto err_release_reg;
> +       }
> +
> +       dws->irq = platform_get_irq(pdev, 0);
> +       if (dws->irq < 0) {
> +               dev_err(&pdev->dev, "no irq resource?\n");
> +               ret = dws->irq; /* -ENXIO */
> +               goto err_unmap;
> +       }
> +
> +       dwsmmio->clk = clk_get(&pdev->dev, NULL);
> +       if (!dwsmmio->clk) {
> +               ret = -ENODEV;
> +               goto err_irq;
> +       }
> +       clk_enable(dwsmmio->clk);
> +
> +       dws->parent_dev = &pdev->dev;
> +       dws->bus_num = 0;
> +       dws->num_cs = 4;
> +       dws->max_freq = clk_get_rate(dwsmmio->clk);
> +
> +       ret = dw_spi_add_host(dws);
> +       if (ret)
> +               goto err_clk;
> +
> +       platform_set_drvdata(pdev, dwsmmio);
> +       return 0;
> +
> +err_clk:
> +       clk_disable(dwsmmio->clk);
> +       clk_put(dwsmmio->clk);
> +       dwsmmio->clk = NULL;
> +err_irq:
> +       free_irq(dws->irq, dws);
> +err_unmap:
> +       iounmap(dws->regs);
> +err_release_reg:
> +       release_mem_region(mem->start, resource_size(mem));
> +err_kfree:
> +       kfree(dwsmmio);
> +err_end:
> +       return ret;
> +}
> +
> +static int __devexit dw_spi_mmio_remove(struct platform_device *pdev)
> +{
> +       struct dw_spi_mmio *dwsmmio = platform_get_drvdata(pdev);
> +       struct resource *mem;
> +
> +       platform_set_drvdata(pdev, NULL);
> +
> +       clk_disable(dwsmmio->clk);
> +       clk_put(dwsmmio->clk);
> +       dwsmmio->clk = NULL;
> +
> +       free_irq(dwsmmio->dws.irq, &dwsmmio->dws);
> +       dw_spi_remove_host(&dwsmmio->dws);
> +       iounmap(dwsmmio->dws.regs);
> +       kfree(dwsmmio);
> +
> +       mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> +       release_mem_region(mem->start, resource_size(mem));
> +       return 0;
> +}
> +
> +static struct platform_driver dw_spi_mmio_driver = {
> +       .remove         = __devexit_p(dw_spi_mmio_remove),
> +       .driver         = {
> +               .name   = DRIVER_NAME,
> +               .owner  = THIS_MODULE,
> +       },
> +};
> +
> +static int __init dw_spi_mmio_init(void)
> +{
> +       return platform_driver_probe(&dw_spi_mmio_driver, dw_spi_mmio_probe);
> +}
> +
> +static void __exit dw_spi_mmio_exit(void)
> +{
> +       platform_driver_unregister(&dw_spi_mmio_driver);
> +}
> +
> +module_init(dw_spi_mmio_init);
> +module_exit(dw_spi_mmio_exit);
> +
> +MODULE_AUTHOR("Jean-Hugues Deschenes <jean-hugues.deschenes-YGVykHU+fedBDgjK7y7TUQ@public.gmane.org>");
> +MODULE_DESCRIPTION("Memory-mapped I/O interface driver for DW SPI Core");
> +MODULE_LICENSE("GPL v2");
>
>



-- 
Grant Likely, B.Sc., P.Eng.
Secret Lab Technologies Ltd.

------------------------------------------------------------------------------
Throughout its 18-year history, RSA Conference consistently attracts the
world's best and brightest in the field, creating opportunities for Conference
attendees to learn about information security's most important issues through
interactions with peers, luminaries and emerging and established companies.
http://p.sf.net/sfu/rsaconf-dev2dev

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v2] Memory-mapped dw_spi driver
       [not found] ` <20100121142636.31707.70616.stgit-PR71IgaHmJalNznWqnLNUK6RkeBMCJyt@public.gmane.org>
  2010-01-21 14:43   ` Grant Likely
@ 2010-01-21 14:46   ` Grant Likely
  2010-01-21 14:53   ` Wolfram Sang
  2 siblings, 0 replies; 5+ messages in thread
From: Grant Likely @ 2010-01-21 14:46 UTC (permalink / raw)
  To: Jean-Hugues Deschenes
  Cc: spi-devel-general-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f, David Brownell

On Thu, Jan 21, 2010 at 7:27 AM, Jean-Hugues Deschenes
<jean-hugues.deschenes-YGVykHU+fedBDgjK7y7TUQ@public.gmane.org> wrote:
> Adds a memory-mapped I/O dw_spi platform device.
>
> ---
> Changelog v1->v2
> - simplified dw_spi_mmio.c preamble (Grant Likely)
> - build of dw_spi_mmio and dw_spi_pci are now independant
>  of each other (Grant Likely)
> - add call to dw_spi_remove_host (Feng Tang)
> ---
>
> Signed-off-by: Jean-Hugues Deschenes <jean-hugues.deschenes-YGVykHU+fedBDgjK7y7TUQ@public.gmane.org>
> ---

BTW, anything below a '---' line gets dropped by git, so your s-o-b
line got dropped and I had to add it back manually.  Please make sure
anything that belongs in the commit text goes above the first ---
line.

Cheers,
g.

>  drivers/spi/Kconfig       |    4 +
>  drivers/spi/Makefile      |    1
>  drivers/spi/dw_spi_mmio.c |  148 +++++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 153 insertions(+), 0 deletions(-)
>  create mode 100644 drivers/spi/dw_spi_mmio.c
>
> diff --git a/drivers/spi/Kconfig b/drivers/spi/Kconfig
> index f55eb01..02be3a6 100644
> --- a/drivers/spi/Kconfig
> +++ b/drivers/spi/Kconfig
> @@ -317,6 +317,10 @@ config SPI_DW_PCI
>        tristate "PCI interface driver for DW SPI core"
>        depends on SPI_DESIGNWARE && PCI
>
> +config SPI_DW_MMIO
> +       tristate "Memory-mapped io interface driver for DW SPI core"
> +       depends on SPI_DESIGNWARE
> +
>  #
>  # There are lots of SPI device types, with sensors and memory
>  # being probably the most widely used ones.
> diff --git a/drivers/spi/Makefile b/drivers/spi/Makefile
> index f3d2810..c3e5ce7 100644
> --- a/drivers/spi/Makefile
> +++ b/drivers/spi/Makefile
> @@ -18,6 +18,7 @@ obj-$(CONFIG_SPI_AU1550)              += au1550_spi.o
>  obj-$(CONFIG_SPI_BUTTERFLY)            += spi_butterfly.o
>  obj-$(CONFIG_SPI_DESIGNWARE)           += dw_spi.o
>  obj-$(CONFIG_SPI_DW_PCI)               += dw_spi_pci.o
> +obj-$(CONFIG_SPI_DW_MMIO)              += dw_spi_mmio.o
>  obj-$(CONFIG_SPI_GPIO)                 += spi_gpio.o
>  obj-$(CONFIG_SPI_IMX)                  += spi_imx.o
>  obj-$(CONFIG_SPI_LM70_LLP)             += spi_lm70llp.o
> diff --git a/drivers/spi/dw_spi_mmio.c b/drivers/spi/dw_spi_mmio.c
> new file mode 100644
> index 0000000..26c4b49
> --- /dev/null
> +++ b/drivers/spi/dw_spi_mmio.c
> @@ -0,0 +1,148 @@
> +/*
> + * dw_spi_mmio.c - Memory-mapped interface driver for DW SPI Core
> + *
> + * Copyright (c) 2010, Octasic semiconductor.
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms and conditions of the GNU General Public License,
> + * version 2, as published by the Free Software Foundation.
> + */
> +
> +#include <linux/clk.h>
> +#include <linux/interrupt.h>
> +#include <linux/platform_device.h>
> +#include <linux/spi/dw_spi.h>
> +#include <linux/spi/spi.h>
> +
> +#define DRIVER_NAME "dw_spi_mmio"
> +
> +struct dw_spi_mmio {
> +       struct dw_spi   dws;
> +       struct clk              *clk;
> +};
> +
> +static int __devinit dw_spi_mmio_probe(struct platform_device *pdev)
> +{
> +       struct dw_spi_mmio *dwsmmio;
> +       struct dw_spi *dws;
> +       struct resource *mem, *ioarea;
> +       int ret;
> +
> +       dwsmmio = kzalloc(sizeof(struct dw_spi_mmio), GFP_KERNEL);
> +       if (!dwsmmio) {
> +               ret = -ENOMEM;
> +               goto err_end;
> +       }
> +
> +       dws = &dwsmmio->dws;
> +
> +       /* Get basic io resource and map it */
> +       mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> +       if (!mem) {
> +               dev_err(&pdev->dev, "no mem resource?\n");
> +               ret = -EINVAL;
> +               goto err_kfree;
> +       }
> +
> +       ioarea = request_mem_region(mem->start, resource_size(mem),
> +                       pdev->name);
> +       if (!ioarea) {
> +               dev_err(&pdev->dev, "SPI region already claimed\n");
> +               ret = -EBUSY;
> +               goto err_kfree;
> +       }
> +
> +       dws->regs = ioremap_nocache(mem->start, resource_size(mem));
> +       if (!dws->regs) {
> +               dev_err(&pdev->dev, "SPI region already mapped\n");
> +               ret = -ENOMEM;
> +               goto err_release_reg;
> +       }
> +
> +       dws->irq = platform_get_irq(pdev, 0);
> +       if (dws->irq < 0) {
> +               dev_err(&pdev->dev, "no irq resource?\n");
> +               ret = dws->irq; /* -ENXIO */
> +               goto err_unmap;
> +       }
> +
> +       dwsmmio->clk = clk_get(&pdev->dev, NULL);
> +       if (!dwsmmio->clk) {
> +               ret = -ENODEV;
> +               goto err_irq;
> +       }
> +       clk_enable(dwsmmio->clk);
> +
> +       dws->parent_dev = &pdev->dev;
> +       dws->bus_num = 0;
> +       dws->num_cs = 4;
> +       dws->max_freq = clk_get_rate(dwsmmio->clk);
> +
> +       ret = dw_spi_add_host(dws);
> +       if (ret)
> +               goto err_clk;
> +
> +       platform_set_drvdata(pdev, dwsmmio);
> +       return 0;
> +
> +err_clk:
> +       clk_disable(dwsmmio->clk);
> +       clk_put(dwsmmio->clk);
> +       dwsmmio->clk = NULL;
> +err_irq:
> +       free_irq(dws->irq, dws);
> +err_unmap:
> +       iounmap(dws->regs);
> +err_release_reg:
> +       release_mem_region(mem->start, resource_size(mem));
> +err_kfree:
> +       kfree(dwsmmio);
> +err_end:
> +       return ret;
> +}
> +
> +static int __devexit dw_spi_mmio_remove(struct platform_device *pdev)
> +{
> +       struct dw_spi_mmio *dwsmmio = platform_get_drvdata(pdev);
> +       struct resource *mem;
> +
> +       platform_set_drvdata(pdev, NULL);
> +
> +       clk_disable(dwsmmio->clk);
> +       clk_put(dwsmmio->clk);
> +       dwsmmio->clk = NULL;
> +
> +       free_irq(dwsmmio->dws.irq, &dwsmmio->dws);
> +       dw_spi_remove_host(&dwsmmio->dws);
> +       iounmap(dwsmmio->dws.regs);
> +       kfree(dwsmmio);
> +
> +       mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> +       release_mem_region(mem->start, resource_size(mem));
> +       return 0;
> +}
> +
> +static struct platform_driver dw_spi_mmio_driver = {
> +       .remove         = __devexit_p(dw_spi_mmio_remove),
> +       .driver         = {
> +               .name   = DRIVER_NAME,
> +               .owner  = THIS_MODULE,
> +       },
> +};
> +
> +static int __init dw_spi_mmio_init(void)
> +{
> +       return platform_driver_probe(&dw_spi_mmio_driver, dw_spi_mmio_probe);
> +}
> +
> +static void __exit dw_spi_mmio_exit(void)
> +{
> +       platform_driver_unregister(&dw_spi_mmio_driver);
> +}
> +
> +module_init(dw_spi_mmio_init);
> +module_exit(dw_spi_mmio_exit);
> +
> +MODULE_AUTHOR("Jean-Hugues Deschenes <jean-hugues.deschenes-YGVykHU+fedBDgjK7y7TUQ@public.gmane.org>");
> +MODULE_DESCRIPTION("Memory-mapped I/O interface driver for DW SPI Core");
> +MODULE_LICENSE("GPL v2");
>
>



-- 
Grant Likely, B.Sc., P.Eng.
Secret Lab Technologies Ltd.

------------------------------------------------------------------------------
Throughout its 18-year history, RSA Conference consistently attracts the
world's best and brightest in the field, creating opportunities for Conference
attendees to learn about information security's most important issues through
interactions with peers, luminaries and emerging and established companies.
http://p.sf.net/sfu/rsaconf-dev2dev

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v2] Memory-mapped dw_spi driver
       [not found] ` <20100121142636.31707.70616.stgit-PR71IgaHmJalNznWqnLNUK6RkeBMCJyt@public.gmane.org>
  2010-01-21 14:43   ` Grant Likely
  2010-01-21 14:46   ` Grant Likely
@ 2010-01-21 14:53   ` Wolfram Sang
       [not found]     ` <20100121145336.GC3738-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
  2 siblings, 1 reply; 5+ messages in thread
From: Wolfram Sang @ 2010-01-21 14:53 UTC (permalink / raw)
  To: Jean-Hugues Deschenes
  Cc: spi-devel-general-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f, David Brownell


[-- Attachment #1.1: Type: text/plain, Size: 6352 bytes --]

On Thu, Jan 21, 2010 at 09:27:26AM -0500, Jean-Hugues Deschenes wrote:
> Adds a memory-mapped I/O dw_spi platform device.
> 

Only minor stuff.

> ---
> Changelog v1->v2
> - simplified dw_spi_mmio.c preamble (Grant Likely)
> - build of dw_spi_mmio and dw_spi_pci are now independant
>   of each other (Grant Likely)
> - add call to dw_spi_remove_host (Feng Tang)
> ---
> 
> Signed-off-by: Jean-Hugues Deschenes <jean-hugues.deschenes-YGVykHU+fedBDgjK7y7TUQ@public.gmane.org>
> ---
>  drivers/spi/Kconfig       |    4 +
>  drivers/spi/Makefile      |    1 
>  drivers/spi/dw_spi_mmio.c |  148 +++++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 153 insertions(+), 0 deletions(-)
>  create mode 100644 drivers/spi/dw_spi_mmio.c
> 
> diff --git a/drivers/spi/Kconfig b/drivers/spi/Kconfig
> index f55eb01..02be3a6 100644
> --- a/drivers/spi/Kconfig
> +++ b/drivers/spi/Kconfig
> @@ -317,6 +317,10 @@ config SPI_DW_PCI
>  	tristate "PCI interface driver for DW SPI core"
>  	depends on SPI_DESIGNWARE && PCI
>  
> +config SPI_DW_MMIO
> +	tristate "Memory-mapped io interface driver for DW SPI core"

DesignWare would be better readable than DW, but then it should be fixed for
PCI, too. Well, never mind...

> +	depends on SPI_DESIGNWARE
> +
>  #
>  # There are lots of SPI device types, with sensors and memory
>  # being probably the most widely used ones.
> diff --git a/drivers/spi/Makefile b/drivers/spi/Makefile
> index f3d2810..c3e5ce7 100644
> --- a/drivers/spi/Makefile
> +++ b/drivers/spi/Makefile
> @@ -18,6 +18,7 @@ obj-$(CONFIG_SPI_AU1550)		+= au1550_spi.o
>  obj-$(CONFIG_SPI_BUTTERFLY)		+= spi_butterfly.o
>  obj-$(CONFIG_SPI_DESIGNWARE)		+= dw_spi.o
>  obj-$(CONFIG_SPI_DW_PCI)		+= dw_spi_pci.o
> +obj-$(CONFIG_SPI_DW_MMIO)		+= dw_spi_mmio.o
>  obj-$(CONFIG_SPI_GPIO)			+= spi_gpio.o
>  obj-$(CONFIG_SPI_IMX)			+= spi_imx.o
>  obj-$(CONFIG_SPI_LM70_LLP)		+= spi_lm70llp.o
> diff --git a/drivers/spi/dw_spi_mmio.c b/drivers/spi/dw_spi_mmio.c
> new file mode 100644
> index 0000000..26c4b49
> --- /dev/null
> +++ b/drivers/spi/dw_spi_mmio.c
> @@ -0,0 +1,148 @@
> +/*
> + * dw_spi_mmio.c - Memory-mapped interface driver for DW SPI Core
> + *
> + * Copyright (c) 2010, Octasic semiconductor.
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms and conditions of the GNU General Public License,
> + * version 2, as published by the Free Software Foundation.
> + */
> +
> +#include <linux/clk.h>
> +#include <linux/interrupt.h>
> +#include <linux/platform_device.h>
> +#include <linux/spi/dw_spi.h>
> +#include <linux/spi/spi.h>
> +
> +#define DRIVER_NAME "dw_spi_mmio"
> +
> +struct dw_spi_mmio {
> +	struct dw_spi	dws;
> +	struct clk		*clk;
> +};

Broken indentation (just space after the struct name)

> +
> +static int __devinit dw_spi_mmio_probe(struct platform_device *pdev)
> +{
> +	struct dw_spi_mmio *dwsmmio;
> +	struct dw_spi *dws;
> +	struct resource *mem, *ioarea;
> +	int ret;
> +
> +	dwsmmio = kzalloc(sizeof(struct dw_spi_mmio), GFP_KERNEL);
> +	if (!dwsmmio) {
> +		ret = -ENOMEM;
> +		goto err_end;
> +	}
> +
> +	dws = &dwsmmio->dws;
> +
> +	/* Get basic io resource and map it */
> +	mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> +	if (!mem) {
> +		dev_err(&pdev->dev, "no mem resource?\n");
> +		ret = -EINVAL;
> +		goto err_kfree;
> +	}
> +
> +	ioarea = request_mem_region(mem->start, resource_size(mem),
> +			pdev->name);
> +	if (!ioarea) {
> +		dev_err(&pdev->dev, "SPI region already claimed\n");
> +		ret = -EBUSY;
> +		goto err_kfree;
> +	}
> +
> +	dws->regs = ioremap_nocache(mem->start, resource_size(mem));
> +	if (!dws->regs) {
> +		dev_err(&pdev->dev, "SPI region already mapped\n");
> +		ret = -ENOMEM;
> +		goto err_release_reg;
> +	}
> +
> +	dws->irq = platform_get_irq(pdev, 0);
> +	if (dws->irq < 0) {
> +		dev_err(&pdev->dev, "no irq resource?\n");
> +		ret = dws->irq; /* -ENXIO */
> +		goto err_unmap;
> +	}
> +
> +	dwsmmio->clk = clk_get(&pdev->dev, NULL);
> +	if (!dwsmmio->clk) {
> +		ret = -ENODEV;
> +		goto err_irq;
> +	}
> +	clk_enable(dwsmmio->clk);
> +
> +	dws->parent_dev = &pdev->dev;
> +	dws->bus_num = 0;
> +	dws->num_cs = 4;
> +	dws->max_freq = clk_get_rate(dwsmmio->clk);
> +
> +	ret = dw_spi_add_host(dws);
> +	if (ret)
> +		goto err_clk;
> +
> +	platform_set_drvdata(pdev, dwsmmio);
> +	return 0;
> +
> +err_clk:
> +	clk_disable(dwsmmio->clk);
> +	clk_put(dwsmmio->clk);
> +	dwsmmio->clk = NULL;
> +err_irq:
> +	free_irq(dws->irq, dws);
> +err_unmap:
> +	iounmap(dws->regs);
> +err_release_reg:
> +	release_mem_region(mem->start, resource_size(mem));
> +err_kfree:
> +	kfree(dwsmmio);
> +err_end:
> +	return ret;
> +}
> +
> +static int __devexit dw_spi_mmio_remove(struct platform_device *pdev)
> +{
> +	struct dw_spi_mmio *dwsmmio = platform_get_drvdata(pdev);
> +	struct resource *mem;
> +
> +	platform_set_drvdata(pdev, NULL);
> +
> +	clk_disable(dwsmmio->clk);
> +	clk_put(dwsmmio->clk);
> +	dwsmmio->clk = NULL;
> +
> +	free_irq(dwsmmio->dws.irq, &dwsmmio->dws);
> +	dw_spi_remove_host(&dwsmmio->dws);
> +	iounmap(dwsmmio->dws.regs);
> +	kfree(dwsmmio);
> +
> +	mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> +	release_mem_region(mem->start, resource_size(mem));
> +	return 0;
> +}
> +
> +static struct platform_driver dw_spi_mmio_driver = {
> +	.remove		= __devexit_p(dw_spi_mmio_remove),
> +	.driver		= {
> +		.name	= DRIVER_NAME,
> +		.owner	= THIS_MODULE,
> +	},
> +};
> +
> +static int __init dw_spi_mmio_init(void)
> +{
> +	return platform_driver_probe(&dw_spi_mmio_driver, dw_spi_mmio_probe);
> +}
> +
> +static void __exit dw_spi_mmio_exit(void)
> +{
> +	platform_driver_unregister(&dw_spi_mmio_driver);
> +}
> +
> +module_init(dw_spi_mmio_init);
> +module_exit(dw_spi_mmio_exit);

Those should be directly below the functions.

> +
> +MODULE_AUTHOR("Jean-Hugues Deschenes <jean-hugues.deschenes-YGVykHU+fedBDgjK7y7TUQ@public.gmane.org>");
> +MODULE_DESCRIPTION("Memory-mapped I/O interface driver for DW SPI Core");

-- 
Pengutronix e.K.                           | Wolfram Sang                |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |

[-- Attachment #1.2: Digital signature --]
[-- Type: application/pgp-signature, Size: 197 bytes --]

[-- Attachment #2: Type: text/plain, Size: 420 bytes --]

------------------------------------------------------------------------------
Throughout its 18-year history, RSA Conference consistently attracts the
world's best and brightest in the field, creating opportunities for Conference
attendees to learn about information security's most important issues through
interactions with peers, luminaries and emerging and established companies.
http://p.sf.net/sfu/rsaconf-dev2dev

[-- Attachment #3: Type: text/plain, Size: 210 bytes --]

_______________________________________________
spi-devel-general mailing list
spi-devel-general-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
https://lists.sourceforge.net/lists/listinfo/spi-devel-general

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v2] Memory-mapped dw_spi driver
       [not found]     ` <20100121145336.GC3738-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
@ 2010-01-21 15:01       ` Grant Likely
  0 siblings, 0 replies; 5+ messages in thread
From: Grant Likely @ 2010-01-21 15:01 UTC (permalink / raw)
  To: Wolfram Sang
  Cc: spi-devel-general-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f, David Brownell

On Thu, Jan 21, 2010 at 7:53 AM, Wolfram Sang <w.sang-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org> wrote:
> On Thu, Jan 21, 2010 at 09:27:26AM -0500, Jean-Hugues Deschenes wrote:
>> Adds a memory-mapped I/O dw_spi platform device.
>>
>
> Only minor stuff.

I've already picked up the driver, so Jean can send the fixups and
follow on patches.

g.

------------------------------------------------------------------------------
Throughout its 18-year history, RSA Conference consistently attracts the
world's best and brightest in the field, creating opportunities for Conference
attendees to learn about information security's most important issues through
interactions with peers, luminaries and emerging and established companies.
http://p.sf.net/sfu/rsaconf-dev2dev

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2010-01-21 15:01 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-01-21 14:27 [PATCH v2] Memory-mapped dw_spi driver Jean-Hugues Deschenes
     [not found] ` <20100121142636.31707.70616.stgit-PR71IgaHmJalNznWqnLNUK6RkeBMCJyt@public.gmane.org>
2010-01-21 14:43   ` Grant Likely
2010-01-21 14:46   ` Grant Likely
2010-01-21 14:53   ` Wolfram Sang
     [not found]     ` <20100121145336.GC3738-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
2010-01-21 15:01       ` Grant Likely

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).