mirror of https://gitee.com/openkylin/linux.git
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: Anatolij Gustschin <agust@denx.de> Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
This commit is contained in:
parent
559e2b7ee7
commit
12b15e8328
|
@ -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)
|
||||||
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,
|
||||||
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 @@
|
||||||
#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,
|
||||||
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,
|
||||||
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,
|
||||||
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 @@
|
||||||
#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,
|
||||||
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,
|
||||||
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 @@
|
||||||
#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)
|
||||||
/* 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 @@
|
||||||
#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)
|
||||||
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,
|
||||||
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,
|
||||||
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,
|
||||||
}
|
}
|
||||||
|
|
||||||
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,
|
||||||
|
|
||||||
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,
|
||||||
|
|
||||||
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 @@
|
||||||
#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 */
|
||||||
|
|
Loading…
Reference in New Issue