Merge tag 'v3.4-rc6' into spi/next
authorGrant Likely <grant.likely@secretlab.ca>
Thu, 10 May 2012 00:32:01 +0000 (18:32 -0600)
committerGrant Likely <grant.likely@secretlab.ca>
Thu, 10 May 2012 00:32:01 +0000 (18:32 -0600)
Linux 3.4-rc6

drivers/of/Kconfig
drivers/of/Makefile
drivers/of/of_spi.c [deleted file]
drivers/spi/spi-dw-pci.c
drivers/spi/spi-fsl-espi.c
drivers/spi/spi-fsl-lib.c
drivers/spi/spi-omap2-mcspi.c
drivers/spi/spi-ppc4xx.c
drivers/spi/spi-pxa2xx-pci.c
drivers/spi/spi.c
include/linux/of_spi.h [deleted file]

index 8e84ce9..f623f17 100644 (file)
@@ -67,12 +67,6 @@ config OF_NET
        depends on NETDEVICES
        def_bool y
 
-config OF_SPI
-       def_tristate SPI
-       depends on SPI && !SPARC
-       help
-         OpenFirmware SPI accessors
-
 config OF_MDIO
        def_tristate PHYLIB
        depends on PHYLIB
index aa90e60..0040d18 100644 (file)
@@ -7,7 +7,6 @@ obj-$(CONFIG_OF_DEVICE) += device.o platform.o
 obj-$(CONFIG_OF_GPIO)   += gpio.o
 obj-$(CONFIG_OF_I2C)   += of_i2c.o
 obj-$(CONFIG_OF_NET)   += of_net.o
-obj-$(CONFIG_OF_SPI)   += of_spi.o
 obj-$(CONFIG_OF_SELFTEST) += selftest.o
 obj-$(CONFIG_OF_MDIO)  += of_mdio.o
 obj-$(CONFIG_OF_PCI)   += of_pci.o
diff --git a/drivers/of/of_spi.c b/drivers/of/of_spi.c
deleted file mode 100644 (file)
index 6dbc074..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * SPI OF support routines
- * Copyright (C) 2008 Secret Lab Technologies Ltd.
- *
- * Support routines for deriving SPI device attachments from the device
- * tree.
- */
-
-#include <linux/module.h>
-#include <linux/of.h>
-#include <linux/device.h>
-#include <linux/spi/spi.h>
-#include <linux/of_irq.h>
-#include <linux/of_spi.h>
-
-/**
- * of_register_spi_devices - Register child devices onto the SPI bus
- * @master:    Pointer to spi_master device
- *
- * Registers an spi_device for each child node of master node which has a 'reg'
- * property.
- */
-void of_register_spi_devices(struct spi_master *master)
-{
-       struct spi_device *spi;
-       struct device_node *nc;
-       const __be32 *prop;
-       int rc;
-       int len;
-
-       if (!master->dev.of_node)
-               return;
-
-       for_each_child_of_node(master->dev.of_node, nc) {
-               /* Alloc an spi_device */
-               spi = spi_alloc_device(master);
-               if (!spi) {
-                       dev_err(&master->dev, "spi_device alloc error for %s\n",
-                               nc->full_name);
-                       spi_dev_put(spi);
-                       continue;
-               }
-
-               /* Select device driver */
-               if (of_modalias_node(nc, spi->modalias,
-                                    sizeof(spi->modalias)) < 0) {
-                       dev_err(&master->dev, "cannot find modalias for %s\n",
-                               nc->full_name);
-                       spi_dev_put(spi);
-                       continue;
-               }
-
-               /* Device address */
-               prop = of_get_property(nc, "reg", &len);
-               if (!prop || len < sizeof(*prop)) {
-                       dev_err(&master->dev, "%s has no 'reg' property\n",
-                               nc->full_name);
-                       spi_dev_put(spi);
-                       continue;
-               }
-               spi->chip_select = be32_to_cpup(prop);
-
-               /* Mode (clock phase/polarity/etc.) */
-               if (of_find_property(nc, "spi-cpha", NULL))
-                       spi->mode |= SPI_CPHA;
-               if (of_find_property(nc, "spi-cpol", NULL))
-                       spi->mode |= SPI_CPOL;
-               if (of_find_property(nc, "spi-cs-high", NULL))
-                       spi->mode |= SPI_CS_HIGH;
-
-               /* Device speed */
-               prop = of_get_property(nc, "spi-max-frequency", &len);
-               if (!prop || len < sizeof(*prop)) {
-                       dev_err(&master->dev, "%s has no 'spi-max-frequency' property\n",
-                               nc->full_name);
-                       spi_dev_put(spi);
-                       continue;
-               }
-               spi->max_speed_hz = be32_to_cpup(prop);
-
-               /* IRQ */
-               spi->irq = irq_of_parse_and_map(nc, 0);
-
-               /* Store a pointer to the node in the device structure */
-               of_node_get(nc);
-               spi->dev.of_node = nc;
-
-               /* Register the new device */
-               request_module(spi->modalias);
-               rc = spi_add_device(spi);
-               if (rc) {
-                       dev_err(&master->dev, "spi_device register error %s\n",
-                               nc->full_name);
-                       spi_dev_put(spi);
-               }
-
-       }
-}
-EXPORT_SYMBOL(of_register_spi_devices);
index 14f7cc9..ff81abb 100644 (file)
@@ -164,18 +164,7 @@ static struct pci_driver dw_spi_driver = {
        .resume =       spi_resume,
 };
 
-static int __init mrst_spi_init(void)
-{
-       return pci_register_driver(&dw_spi_driver);
-}
-
-static void __exit mrst_spi_exit(void)
-{
-       pci_unregister_driver(&dw_spi_driver);
-}
-
-module_init(mrst_spi_init);
-module_exit(mrst_spi_exit);
+module_pci_driver(dw_spi_driver);
 
 MODULE_AUTHOR("Feng Tang <feng.tang@intel.com>");
 MODULE_DESCRIPTION("PCI interface driver for DW SPI Core");
index 7523a24..27bdc47 100644 (file)
@@ -17,7 +17,6 @@
 #include <linux/mm.h>
 #include <linux/of.h>
 #include <linux/of_platform.h>
-#include <linux/of_spi.h>
 #include <linux/interrupt.h>
 #include <linux/err.h>
 #include <sysdev/fsl_soc.h>
index 2674fad..1503574 100644 (file)
@@ -22,7 +22,7 @@
 #include <linux/dma-mapping.h>
 #include <linux/mm.h>
 #include <linux/of_platform.h>
-#include <linux/of_spi.h>
+#include <linux/spi/spi.h>
 #include <sysdev/fsl_soc.h>
 
 #include "spi-fsl-lib.h"
index bb9274c..f374eee 100644 (file)
@@ -44,9 +44,7 @@
 #include <plat/mcspi.h>
 
 #define OMAP2_MCSPI_MAX_FREQ           48000000
-
-/* OMAP2 has 3 SPI controllers, while OMAP3 has 4 */
-#define OMAP2_MCSPI_MAX_CTRL           4
+#define SPI_AUTOSUSPEND_TIMEOUT                2000
 
 #define OMAP2_MCSPI_REVISION           0x00
 #define OMAP2_MCSPI_SYSSTATUS          0x14
@@ -111,6 +109,16 @@ struct omap2_mcspi_dma {
 #define DMA_MIN_BYTES                  160
 
 
+/*
+ * Used for context save and restore, structure members to be updated whenever
+ * corresponding registers are modified.
+ */
+struct omap2_mcspi_regs {
+       u32 modulctrl;
+       u32 wakeupenable;
+       struct list_head cs;
+};
+
 struct omap2_mcspi {
        struct work_struct      work;
        /* lock protects queue and registers */
@@ -122,8 +130,9 @@ struct omap2_mcspi {
        unsigned long           phys;
        /* SPI1 has 4 channels, while SPI2 has 2 */
        struct omap2_mcspi_dma  *dma_channels;
-       struct  device          *dev;
+       struct device           *dev;
        struct workqueue_struct *wq;
+       struct omap2_mcspi_regs ctx;
 };
 
 struct omap2_mcspi_cs {
@@ -135,17 +144,6 @@ struct omap2_mcspi_cs {
        u32                     chconf0;
 };
 
-/* used for context save and restore, structure members to be updated whenever
- * corresponding registers are modified.
- */
-struct omap2_mcspi_regs {
-       u32 modulctrl;
-       u32 wakeupenable;
-       struct list_head cs;
-};
-
-static struct omap2_mcspi_regs omap2_mcspi_ctx[OMAP2_MCSPI_MAX_CTRL];
-
 #define MOD_REG_BIT(val, mask, set) do { \
        if (set) \
                val |= mask; \
@@ -236,9 +234,12 @@ static void omap2_mcspi_force_cs(struct spi_device *spi, int cs_active)
 
 static void omap2_mcspi_set_master_mode(struct spi_master *master)
 {
+       struct omap2_mcspi      *mcspi = spi_master_get_devdata(master);
+       struct omap2_mcspi_regs *ctx = &mcspi->ctx;
        u32 l;
 
-       /* setup when switching from (reset default) slave mode
+       /*
+        * Setup when switching from (reset default) slave mode
         * to single-channel master mode
         */
        l = mcspi_read_reg(master, OMAP2_MCSPI_MODULCTRL);
@@ -247,29 +248,26 @@ static void omap2_mcspi_set_master_mode(struct spi_master *master)
        MOD_REG_BIT(l, OMAP2_MCSPI_MODULCTRL_SINGLE, 1);
        mcspi_write_reg(master, OMAP2_MCSPI_MODULCTRL, l);
 
-       omap2_mcspi_ctx[master->bus_num - 1].modulctrl = l;
+       ctx->modulctrl = l;
 }
 
 static void omap2_mcspi_restore_ctx(struct omap2_mcspi *mcspi)
 {
-       struct spi_master *spi_cntrl;
-       struct omap2_mcspi_cs *cs;
-       spi_cntrl = mcspi->master;
+       struct spi_master       *spi_cntrl = mcspi->master;
+       struct omap2_mcspi_regs *ctx = &mcspi->ctx;
+       struct omap2_mcspi_cs   *cs;
 
        /* McSPI: context restore */
-       mcspi_write_reg(spi_cntrl, OMAP2_MCSPI_MODULCTRL,
-                       omap2_mcspi_ctx[spi_cntrl->bus_num - 1].modulctrl);
-
-       mcspi_write_reg(spi_cntrl, OMAP2_MCSPI_WAKEUPENABLE,
-                       omap2_mcspi_ctx[spi_cntrl->bus_num - 1].wakeupenable);
+       mcspi_write_reg(spi_cntrl, OMAP2_MCSPI_MODULCTRL, ctx->modulctrl);
+       mcspi_write_reg(spi_cntrl, OMAP2_MCSPI_WAKEUPENABLE, ctx->wakeupenable);
 
-       list_for_each_entry(cs, &omap2_mcspi_ctx[spi_cntrl->bus_num - 1].cs,
-                       node)
+       list_for_each_entry(cs, &ctx->cs, node)
                __raw_writel(cs->chconf0, cs->base + OMAP2_MCSPI_CHCONF0);
 }
 static void omap2_mcspi_disable_clocks(struct omap2_mcspi *mcspi)
 {
-       pm_runtime_put_sync(mcspi->dev);
+       pm_runtime_mark_last_busy(mcspi->dev);
+       pm_runtime_put_autosuspend(mcspi->dev);
 }
 
 static int omap2_mcspi_enable_clocks(struct omap2_mcspi *mcspi)
@@ -777,7 +775,8 @@ static int omap2_mcspi_request_dma(struct spi_device *spi)
 static int omap2_mcspi_setup(struct spi_device *spi)
 {
        int                     ret;
-       struct omap2_mcspi      *mcspi;
+       struct omap2_mcspi      *mcspi = spi_master_get_devdata(spi->master);
+       struct omap2_mcspi_regs *ctx = &mcspi->ctx;
        struct omap2_mcspi_dma  *mcspi_dma;
        struct omap2_mcspi_cs   *cs = spi->controller_state;
 
@@ -787,11 +786,10 @@ static int omap2_mcspi_setup(struct spi_device *spi)
                return -EINVAL;
        }
 
-       mcspi = spi_master_get_devdata(spi->master);
        mcspi_dma = &mcspi->dma_channels[spi->chip_select];
 
        if (!cs) {
-               cs = kzalloc(sizeof *cs, GFP_KERNEL);
+               cs = devm_kzalloc(&spi->dev , sizeof *cs, GFP_KERNEL);
                if (!cs)
                        return -ENOMEM;
                cs->base = mcspi->base + spi->chip_select * 0x14;
@@ -799,8 +797,7 @@ static int omap2_mcspi_setup(struct spi_device *spi)
                cs->chconf0 = 0;
                spi->controller_state = cs;
                /* Link this to context save list */
-               list_add_tail(&cs->node,
-                       &omap2_mcspi_ctx[mcspi->master->bus_num - 1].cs);
+               list_add_tail(&cs->node, &ctx->cs);
        }
 
        if (mcspi_dma->dma_rx_channel == -1
@@ -833,7 +830,6 @@ static void omap2_mcspi_cleanup(struct spi_device *spi)
                cs = spi->controller_state;
                list_del(&cs->node);
 
-               kfree(spi->controller_state);
        }
 
        if (spi->chip_select < spi->master->num_chipselect) {
@@ -1053,16 +1049,16 @@ static int omap2_mcspi_transfer(struct spi_device *spi, struct spi_message *m)
 static int __init omap2_mcspi_master_setup(struct omap2_mcspi *mcspi)
 {
        struct spi_master       *master = mcspi->master;
-       u32                     tmp;
-       int ret = 0;
+       struct omap2_mcspi_regs *ctx = &mcspi->ctx;
+       int                     ret = 0;
 
        ret = omap2_mcspi_enable_clocks(mcspi);
        if (ret < 0)
                return ret;
 
-       tmp = OMAP2_MCSPI_WAKEUPENABLE_WKEN;
-       mcspi_write_reg(master, OMAP2_MCSPI_WAKEUPENABLE, tmp);
-       omap2_mcspi_ctx[master->bus_num - 1].wakeupenable = tmp;
+       mcspi_write_reg(master, OMAP2_MCSPI_WAKEUPENABLE,
+                               OMAP2_MCSPI_WAKEUPENABLE_WKEN);
+       ctx->wakeupenable = OMAP2_MCSPI_WAKEUPENABLE_WKEN;
 
        omap2_mcspi_set_master_mode(master);
        omap2_mcspi_disable_clocks(mcspi);
@@ -1102,14 +1098,13 @@ static const struct of_device_id omap_mcspi_of_match[] = {
 };
 MODULE_DEVICE_TABLE(of, omap_mcspi_of_match);
 
-static int __init omap2_mcspi_probe(struct platform_device *pdev)
+static int __devinit omap2_mcspi_probe(struct platform_device *pdev)
 {
        struct spi_master       *master;
        struct omap2_mcspi_platform_config *pdata;
        struct omap2_mcspi      *mcspi;
        struct resource         *r;
        int                     status = 0, i;
-       char                    wq_name[20];
        u32                     regs_offset = 0;
        static int              bus_num = 1;
        struct device_node      *node = pdev->dev.of_node;
@@ -1150,8 +1145,7 @@ static int __init omap2_mcspi_probe(struct platform_device *pdev)
        mcspi = spi_master_get_devdata(master);
        mcspi->master = master;
 
-       sprintf(wq_name, "omap2_mcspi/%d", master->bus_num);
-       mcspi->wq = alloc_workqueue(wq_name, WQ_MEM_RECLAIM, 1);
+       mcspi->wq = alloc_workqueue(dev_name(&pdev->dev), WQ_MEM_RECLAIM, 1);
        if (mcspi->wq == NULL) {
                status = -ENOMEM;
                goto free_master;
@@ -1166,17 +1160,12 @@ static int __init omap2_mcspi_probe(struct platform_device *pdev)
        r->start += regs_offset;
        r->end += regs_offset;
        mcspi->phys = r->start;
-       if (!request_mem_region(r->start, resource_size(r),
-                               dev_name(&pdev->dev))) {
-               status = -EBUSY;
-               goto free_master;
-       }
 
-       mcspi->base = ioremap(r->start, resource_size(r));
+       mcspi->base = devm_request_and_ioremap(&pdev->dev, r);
        if (!mcspi->base) {
                dev_dbg(&pdev->dev, "can't ioremap MCSPI\n");
                status = -ENOMEM;
-               goto release_region;
+               goto free_master;
        }
 
        mcspi->dev = &pdev->dev;
@@ -1184,14 +1173,14 @@ static int __init omap2_mcspi_probe(struct platform_device *pdev)
 
        spin_lock_init(&mcspi->lock);
        INIT_LIST_HEAD(&mcspi->msg_queue);
-       INIT_LIST_HEAD(&omap2_mcspi_ctx[master->bus_num - 1].cs);
+       INIT_LIST_HEAD(&mcspi->ctx.cs);
 
        mcspi->dma_channels = kcalloc(master->num_chipselect,
                        sizeof(struct omap2_mcspi_dma),
                        GFP_KERNEL);
 
        if (mcspi->dma_channels == NULL)
-               goto unmap_io;
+               goto free_master;
 
        for (i = 0; i < master->num_chipselect; i++) {
                char dma_ch_name[14];
@@ -1224,6 +1213,8 @@ static int __init omap2_mcspi_probe(struct platform_device *pdev)
        if (status < 0)
                goto dma_chnl_free;
 
+       pm_runtime_use_autosuspend(&pdev->dev);
+       pm_runtime_set_autosuspend_delay(&pdev->dev, SPI_AUTOSUSPEND_TIMEOUT);
        pm_runtime_enable(&pdev->dev);
 
        if (status || omap2_mcspi_master_setup(mcspi) < 0)
@@ -1241,23 +1232,17 @@ disable_pm:
        pm_runtime_disable(&pdev->dev);
 dma_chnl_free:
        kfree(mcspi->dma_channels);
-unmap_io:
-       iounmap(mcspi->base);
-release_region:
-       release_mem_region(r->start, resource_size(r));
 free_master:
        kfree(master);
        platform_set_drvdata(pdev, NULL);
        return status;
 }
 
-static int __exit omap2_mcspi_remove(struct platform_device *pdev)
+static int __devexit omap2_mcspi_remove(struct platform_device *pdev)
 {
        struct spi_master       *master;
        struct omap2_mcspi      *mcspi;
        struct omap2_mcspi_dma  *dma_channels;
-       struct resource         *r;
-       void __iomem *base;
 
        master = dev_get_drvdata(&pdev->dev);
        mcspi = spi_master_get_devdata(master);
@@ -1265,12 +1250,8 @@ static int __exit omap2_mcspi_remove(struct platform_device *pdev)
 
        omap2_mcspi_disable_clocks(mcspi);
        pm_runtime_disable(&pdev->dev);
-       r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       release_mem_region(r->start, resource_size(r));
 
-       base = mcspi->base;
        spi_unregister_master(master);
-       iounmap(base);
        kfree(dma_channels);
        destroy_workqueue(mcspi->wq);
        platform_set_drvdata(pdev, NULL);
@@ -1291,13 +1272,12 @@ static int omap2_mcspi_resume(struct device *dev)
 {
        struct spi_master       *master = dev_get_drvdata(dev);
        struct omap2_mcspi      *mcspi = spi_master_get_devdata(master);
-       struct omap2_mcspi_cs *cs;
+       struct omap2_mcspi_regs *ctx = &mcspi->ctx;
+       struct omap2_mcspi_cs   *cs;
 
        omap2_mcspi_enable_clocks(mcspi);
-       list_for_each_entry(cs, &omap2_mcspi_ctx[master->bus_num - 1].cs,
-                           node) {
+       list_for_each_entry(cs, &ctx->cs, node) {
                if ((cs->chconf0 & OMAP2_MCSPI_CHCONF_FORCE) == 0) {
-
                        /*
                         * We need to toggle CS state for OMAP take this
                         * change in account.
@@ -1327,21 +1307,9 @@ static struct platform_driver omap2_mcspi_driver = {
                .pm =           &omap2_mcspi_pm_ops,
                .of_match_table = omap_mcspi_of_match,
        },
-       .remove =       __exit_p(omap2_mcspi_remove),
+       .probe =        omap2_mcspi_probe,
+       .remove =       __devexit_p(omap2_mcspi_remove),
 };
 
-
-static int __init omap2_mcspi_init(void)
-{
-       return platform_driver_probe(&omap2_mcspi_driver, omap2_mcspi_probe);
-}
-subsys_initcall(omap2_mcspi_init);
-
-static void __exit omap2_mcspi_exit(void)
-{
-       platform_driver_unregister(&omap2_mcspi_driver);
-
-}
-module_exit(omap2_mcspi_exit);
-
+module_platform_driver(omap2_mcspi_driver);
 MODULE_LICENSE("GPL");
index 98ec532..d95d307 100644 (file)
@@ -30,7 +30,6 @@
 #include <linux/errno.h>
 #include <linux/wait.h>
 #include <linux/of_platform.h>
-#include <linux/of_spi.h>
 #include <linux/of_gpio.h>
 #include <linux/interrupt.h>
 #include <linux/delay.h>
index 3fb44af..9f6ba34 100644 (file)
@@ -164,17 +164,7 @@ static struct pci_driver ce4100_spi_driver = {
        .remove         = __devexit_p(ce4100_spi_remove),
 };
 
-static int __init ce4100_spi_init(void)
-{
-       return pci_register_driver(&ce4100_spi_driver);
-}
-module_init(ce4100_spi_init);
-
-static void __exit ce4100_spi_exit(void)
-{
-       pci_unregister_driver(&ce4100_spi_driver);
-}
-module_exit(ce4100_spi_exit);
+module_pci_driver(ce4100_spi_driver);
 
 MODULE_DESCRIPTION("CE4100 PCI-SPI glue code for PXA's driver");
 MODULE_LICENSE("GPL v2");
index 3d8f662..37c555e 100644 (file)
@@ -2,6 +2,7 @@
  * SPI init/core code
  *
  * Copyright (C) 2005 David Brownell
+ * Copyright (C) 2008 Secret Lab Technologies Ltd.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  */
 
 #include <linux/kernel.h>
+#include <linux/kmod.h>
 #include <linux/device.h>
 #include <linux/init.h>
 #include <linux/cache.h>
 #include <linux/mutex.h>
 #include <linux/of_device.h>
+#include <linux/of_irq.h>
 #include <linux/slab.h>
 #include <linux/mod_devicetable.h>
 #include <linux/spi/spi.h>
-#include <linux/of_spi.h>
 #include <linux/pm_runtime.h>
 #include <linux/export.h>
 #include <linux/sched.h>
@@ -798,6 +800,94 @@ err_init_queue:
 
 /*-------------------------------------------------------------------------*/
 
+#if defined(CONFIG_OF) && !defined(CONFIG_SPARC)
+/**
+ * of_register_spi_devices() - Register child devices onto the SPI bus
+ * @master:    Pointer to spi_master device
+ *
+ * Registers an spi_device for each child node of master node which has a 'reg'
+ * property.
+ */
+static void of_register_spi_devices(struct spi_master *master)
+{
+       struct spi_device *spi;
+       struct device_node *nc;
+       const __be32 *prop;
+       int rc;
+       int len;
+
+       if (!master->dev.of_node)
+               return;
+
+       for_each_child_of_node(master->dev.of_node, nc) {
+               /* Alloc an spi_device */
+               spi = spi_alloc_device(master);
+               if (!spi) {
+                       dev_err(&master->dev, "spi_device alloc error for %s\n",
+                               nc->full_name);
+                       spi_dev_put(spi);
+                       continue;
+               }
+
+               /* Select device driver */
+               if (of_modalias_node(nc, spi->modalias,
+                                    sizeof(spi->modalias)) < 0) {
+                       dev_err(&master->dev, "cannot find modalias for %s\n",
+                               nc->full_name);
+                       spi_dev_put(spi);
+                       continue;
+               }
+
+               /* Device address */
+               prop = of_get_property(nc, "reg", &len);
+               if (!prop || len < sizeof(*prop)) {
+                       dev_err(&master->dev, "%s has no 'reg' property\n",
+                               nc->full_name);
+                       spi_dev_put(spi);
+                       continue;
+               }
+               spi->chip_select = be32_to_cpup(prop);
+
+               /* Mode (clock phase/polarity/etc.) */
+               if (of_find_property(nc, "spi-cpha", NULL))
+                       spi->mode |= SPI_CPHA;
+               if (of_find_property(nc, "spi-cpol", NULL))
+                       spi->mode |= SPI_CPOL;
+               if (of_find_property(nc, "spi-cs-high", NULL))
+                       spi->mode |= SPI_CS_HIGH;
+
+               /* Device speed */
+               prop = of_get_property(nc, "spi-max-frequency", &len);
+               if (!prop || len < sizeof(*prop)) {
+                       dev_err(&master->dev, "%s has no 'spi-max-frequency' property\n",
+                               nc->full_name);
+                       spi_dev_put(spi);
+                       continue;
+               }
+               spi->max_speed_hz = be32_to_cpup(prop);
+
+               /* IRQ */
+               spi->irq = irq_of_parse_and_map(nc, 0);
+
+               /* Store a pointer to the node in the device structure */
+               of_node_get(nc);
+               spi->dev.of_node = nc;
+
+               /* Register the new device */
+               request_module(spi->modalias);
+               rc = spi_add_device(spi);
+               if (rc) {
+                       dev_err(&master->dev, "spi_device register error %s\n",
+                               nc->full_name);
+                       spi_dev_put(spi);
+               }
+
+       }
+}
+#else
+static void of_register_spi_devices(struct spi_master *master) { }
+#endif
+
 static void spi_master_release(struct device *dev)
 {
        struct spi_master *master;
diff --git a/include/linux/of_spi.h b/include/linux/of_spi.h
deleted file mode 100644 (file)
index 9e3e70f..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * OpenFirmware SPI support routines
- * Copyright (C) 2008 Secret Lab Technologies Ltd.
- *
- * Support routines for deriving SPI device attachments from the device
- * tree.
- */
-
-#ifndef __LINUX_OF_SPI_H
-#define __LINUX_OF_SPI_H
-
-#include <linux/spi/spi.h>
-
-#if defined(CONFIG_OF_SPI) || defined(CONFIG_OF_SPI_MODULE)
-extern void of_register_spi_devices(struct spi_master *master);
-#else
-static inline void of_register_spi_devices(struct spi_master *master)
-{
-       return;
-}
-#endif /* CONFIG_OF_SPI */
-
-#endif /* __LINUX_OF_SPI */