Commit 12b15e83 authored by Anatolij Gustschin's avatar Anatolij Gustschin Committed by Grant Likely

of/spi: call of_register_spi_devices() from spi core code

Move of_register_spi_devices() call from drivers to
spi_register_master(). Also change the function to use
the struct device_node pointer from master spi device
instead of passing it as function argument.
Signed-off-by: default avatarAnatolij Gustschin <agust@denx.de>
Signed-off-by: default avatarGrant Likely <grant.likely@secretlab.ca>
parent 559e2b7e
...@@ -15,12 +15,11 @@ ...@@ -15,12 +15,11 @@
/** /**
* of_register_spi_devices - Register child devices onto the SPI bus * of_register_spi_devices - Register child devices onto the SPI bus
* @master: Pointer to spi_master device * @master: Pointer to spi_master device
* @np: parent node of SPI device nodes
* *
* Registers an spi_device for each child node of 'np' which has a 'reg' * Registers an spi_device for each child node of master node which has a 'reg'
* property. * property.
*/ */
void of_register_spi_devices(struct spi_master *master, struct device_node *np) void of_register_spi_devices(struct spi_master *master)
{ {
struct spi_device *spi; struct spi_device *spi;
struct device_node *nc; struct device_node *nc;
...@@ -28,7 +27,10 @@ void of_register_spi_devices(struct spi_master *master, struct device_node *np) ...@@ -28,7 +27,10 @@ void of_register_spi_devices(struct spi_master *master, struct device_node *np)
int rc; int rc;
int len; int len;
for_each_child_of_node(np, nc) { if (!master->dev.of_node)
return;
for_each_child_of_node(master->dev.of_node, nc) {
/* Alloc an spi_device */ /* Alloc an spi_device */
spi = spi_alloc_device(master); spi = spi_alloc_device(master);
if (!spi) { if (!spi) {
......
...@@ -440,6 +440,7 @@ static int __init mpc512x_psc_spi_do_probe(struct device *dev, u32 regaddr, ...@@ -440,6 +440,7 @@ static int __init mpc512x_psc_spi_do_probe(struct device *dev, u32 regaddr,
master->setup = mpc512x_psc_spi_setup; master->setup = mpc512x_psc_spi_setup;
master->transfer = mpc512x_psc_spi_transfer; master->transfer = mpc512x_psc_spi_transfer;
master->cleanup = mpc512x_psc_spi_cleanup; master->cleanup = mpc512x_psc_spi_cleanup;
master->dev.of_node = dev->of_node;
tempp = ioremap(regaddr, size); tempp = ioremap(regaddr, size);
if (!tempp) { if (!tempp) {
......
...@@ -17,7 +17,6 @@ ...@@ -17,7 +17,6 @@
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/of_platform.h> #include <linux/of_platform.h>
#include <linux/of_spi.h>
#include <linux/workqueue.h> #include <linux/workqueue.h>
#include <linux/completion.h> #include <linux/completion.h>
#include <linux/io.h> #include <linux/io.h>
...@@ -398,6 +397,7 @@ static int __init mpc52xx_psc_spi_do_probe(struct device *dev, u32 regaddr, ...@@ -398,6 +397,7 @@ static int __init mpc52xx_psc_spi_do_probe(struct device *dev, u32 regaddr,
master->setup = mpc52xx_psc_spi_setup; master->setup = mpc52xx_psc_spi_setup;
master->transfer = mpc52xx_psc_spi_transfer; master->transfer = mpc52xx_psc_spi_transfer;
master->cleanup = mpc52xx_psc_spi_cleanup; master->cleanup = mpc52xx_psc_spi_cleanup;
master->dev.of_node = dev->of_node;
mps->psc = ioremap(regaddr, size); mps->psc = ioremap(regaddr, size);
if (!mps->psc) { if (!mps->psc) {
...@@ -470,7 +470,6 @@ static int __init mpc52xx_psc_spi_of_probe(struct of_device *op, ...@@ -470,7 +470,6 @@ static int __init mpc52xx_psc_spi_of_probe(struct of_device *op,
const u32 *regaddr_p; const u32 *regaddr_p;
u64 regaddr64, size64; u64 regaddr64, size64;
s16 id = -1; s16 id = -1;
int rc;
regaddr_p = of_get_address(op->dev.of_node, 0, &size64, NULL); regaddr_p = of_get_address(op->dev.of_node, 0, &size64, NULL);
if (!regaddr_p) { if (!regaddr_p) {
...@@ -491,13 +490,8 @@ static int __init mpc52xx_psc_spi_of_probe(struct of_device *op, ...@@ -491,13 +490,8 @@ static int __init mpc52xx_psc_spi_of_probe(struct of_device *op,
id = *psc_nump + 1; id = *psc_nump + 1;
} }
rc = mpc52xx_psc_spi_do_probe(&op->dev, (u32)regaddr64, (u32)size64, return mpc52xx_psc_spi_do_probe(&op->dev, (u32)regaddr64, (u32)size64,
irq_of_parse_and_map(op->dev.of_node, 0), id); irq_of_parse_and_map(op->dev.of_node, 0), id);
if (rc == 0)
of_register_spi_devices(dev_get_drvdata(&op->dev),
op->dev.of_node);
return rc;
} }
static int __exit mpc52xx_psc_spi_of_remove(struct of_device *op) static int __exit mpc52xx_psc_spi_of_remove(struct of_device *op)
......
...@@ -18,7 +18,6 @@ ...@@ -18,7 +18,6 @@
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/spi/spi.h> #include <linux/spi/spi.h>
#include <linux/of_spi.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/of_gpio.h> #include <linux/of_gpio.h>
#include <linux/slab.h> #include <linux/slab.h>
...@@ -439,6 +438,7 @@ static int __devinit mpc52xx_spi_probe(struct of_device *op, ...@@ -439,6 +438,7 @@ static int __devinit mpc52xx_spi_probe(struct of_device *op,
master->setup = mpc52xx_spi_setup; master->setup = mpc52xx_spi_setup;
master->transfer = mpc52xx_spi_transfer; master->transfer = mpc52xx_spi_transfer;
master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_LSB_FIRST; master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_LSB_FIRST;
master->dev.of_node = op->dev.of_node;
dev_set_drvdata(&op->dev, master); dev_set_drvdata(&op->dev, master);
...@@ -512,7 +512,6 @@ static int __devinit mpc52xx_spi_probe(struct of_device *op, ...@@ -512,7 +512,6 @@ static int __devinit mpc52xx_spi_probe(struct of_device *op,
if (rc) if (rc)
goto err_register; goto err_register;
of_register_spi_devices(master, op->dev.of_node);
dev_info(&ms->master->dev, "registered MPC5200 SPI bus\n"); dev_info(&ms->master->dev, "registered MPC5200 SPI bus\n");
return rc; return rc;
......
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/mod_devicetable.h> #include <linux/mod_devicetable.h>
#include <linux/spi/spi.h> #include <linux/spi/spi.h>
#include <linux/of_spi.h>
/* SPI bustype and spi_master class are registered after board init code /* SPI bustype and spi_master class are registered after board init code
...@@ -540,6 +541,9 @@ int spi_register_master(struct spi_master *master) ...@@ -540,6 +541,9 @@ int spi_register_master(struct spi_master *master)
/* populate children from any spi device tables */ /* populate children from any spi device tables */
scan_boardinfo(master); scan_boardinfo(master);
status = 0; status = 0;
/* Register devices from the device tree */
of_register_spi_devices(master);
done: done:
return status; return status;
} }
......
...@@ -38,7 +38,6 @@ ...@@ -38,7 +38,6 @@
#include <linux/of_platform.h> #include <linux/of_platform.h>
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/of_gpio.h> #include <linux/of_gpio.h>
#include <linux/of_spi.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <sysdev/fsl_soc.h> #include <sysdev/fsl_soc.h>
...@@ -1009,6 +1008,7 @@ mpc8xxx_spi_probe(struct device *dev, struct resource *mem, unsigned int irq) ...@@ -1009,6 +1008,7 @@ mpc8xxx_spi_probe(struct device *dev, struct resource *mem, unsigned int irq)
master->setup = mpc8xxx_spi_setup; master->setup = mpc8xxx_spi_setup;
master->transfer = mpc8xxx_spi_transfer; master->transfer = mpc8xxx_spi_transfer;
master->cleanup = mpc8xxx_spi_cleanup; master->cleanup = mpc8xxx_spi_cleanup;
master->dev.of_node = dev->of_node;
mpc8xxx_spi = spi_master_get_devdata(master); mpc8xxx_spi = spi_master_get_devdata(master);
mpc8xxx_spi->dev = dev; mpc8xxx_spi->dev = dev;
...@@ -1299,8 +1299,6 @@ static int __devinit of_mpc8xxx_spi_probe(struct of_device *ofdev, ...@@ -1299,8 +1299,6 @@ static int __devinit of_mpc8xxx_spi_probe(struct of_device *ofdev,
goto err; goto err;
} }
of_register_spi_devices(master, np);
return 0; return 0;
err: err:
......
...@@ -407,6 +407,7 @@ static int __init spi_ppc4xx_of_probe(struct of_device *op, ...@@ -407,6 +407,7 @@ static int __init spi_ppc4xx_of_probe(struct of_device *op,
master = spi_alloc_master(dev, sizeof *hw); master = spi_alloc_master(dev, sizeof *hw);
if (master == NULL) if (master == NULL)
return -ENOMEM; return -ENOMEM;
master->dev.of_node = np;
dev_set_drvdata(dev, master); dev_set_drvdata(dev, master);
hw = spi_master_get_devdata(master); hw = spi_master_get_devdata(master);
hw->master = spi_master_get(master); hw->master = spi_master_get(master);
...@@ -545,7 +546,6 @@ static int __init spi_ppc4xx_of_probe(struct of_device *op, ...@@ -545,7 +546,6 @@ static int __init spi_ppc4xx_of_probe(struct of_device *op,
} }
dev_info(dev, "driver initialized\n"); dev_info(dev, "driver initialized\n");
of_register_spi_devices(master, np);
return 0; return 0;
......
...@@ -390,6 +390,9 @@ struct spi_master *xilinx_spi_init(struct device *dev, struct resource *mem, ...@@ -390,6 +390,9 @@ struct spi_master *xilinx_spi_init(struct device *dev, struct resource *mem,
master->bus_num = bus_num; master->bus_num = bus_num;
master->num_chipselect = pdata->num_chipselect; master->num_chipselect = pdata->num_chipselect;
#ifdef CONFIG_OF
master->dev.of_node = dev->of_node;
#endif
xspi->mem = *mem; xspi->mem = *mem;
xspi->irq = irq; xspi->irq = irq;
......
...@@ -80,9 +80,6 @@ static int __devinit xilinx_spi_of_probe(struct of_device *ofdev, ...@@ -80,9 +80,6 @@ static int __devinit xilinx_spi_of_probe(struct of_device *ofdev,
dev_set_drvdata(&ofdev->dev, master); dev_set_drvdata(&ofdev->dev, master);
/* Add any subnodes on the SPI bus */
of_register_spi_devices(master, ofdev->dev.of_node);
return 0; return 0;
} }
......
...@@ -9,10 +9,15 @@ ...@@ -9,10 +9,15 @@
#ifndef __LINUX_OF_SPI_H #ifndef __LINUX_OF_SPI_H
#define __LINUX_OF_SPI_H #define __LINUX_OF_SPI_H
#include <linux/of.h>
#include <linux/spi/spi.h> #include <linux/spi/spi.h>
extern void of_register_spi_devices(struct spi_master *master, #if defined(CONFIG_OF_SPI) || defined(CONFIG_OF_SPI_MODULE)
struct device_node *np); 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 */ #endif /* __LINUX_OF_SPI */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment