Skip to content

Commit

Permalink
spi/xilinx: merge OF support code into main driver
Browse files Browse the repository at this point in the history
Now that the of_platform_bus_type has been merged with the platform
bus type, a single platform driver can handle both OF and non-OF use
cases.  This patch merges the OF support into the platform driver.

Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
Tested-by: Michal Simek <monstr@monstr.eu>
  • Loading branch information
Grant Likely committed Nov 10, 2010
1 parent 8fd8821 commit eae6cb3
Show file tree
Hide file tree
Showing 5 changed files with 45 additions and 175 deletions.
7 changes: 0 additions & 7 deletions drivers/spi/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -353,7 +353,6 @@ config SPI_XILINX
tristate "Xilinx SPI controller common module"
depends on HAS_IOMEM && EXPERIMENTAL
select SPI_BITBANG
select SPI_XILINX_OF if (XILINX_VIRTEX || MICROBLAZE)
help
This exposes the SPI controller IP from the Xilinx EDK.

Expand All @@ -362,12 +361,6 @@ config SPI_XILINX

Or for the DS570, see "XPS Serial Peripheral Interface (SPI) (v2.00b)"

config SPI_XILINX_OF
tristate "Xilinx SPI controller OF device"
depends on SPI_XILINX && (XILINX_VIRTEX || MICROBLAZE)
help
This is the OF driver for the SPI controller IP from the Xilinx EDK.

config SPI_NUC900
tristate "Nuvoton NUC900 series SPI"
depends on ARCH_W90X900 && EXPERIMENTAL
Expand Down
1 change: 0 additions & 1 deletion drivers/spi/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,6 @@ obj-$(CONFIG_SPI_TEGRA) += spi_tegra.o
obj-$(CONFIG_SPI_TOPCLIFF_PCH) += spi_topcliff_pch.o
obj-$(CONFIG_SPI_TXX9) += spi_txx9.o
obj-$(CONFIG_SPI_XILINX) += xilinx_spi.o
obj-$(CONFIG_SPI_XILINX_OF) += xilinx_spi_of.o
obj-$(CONFIG_SPI_SH_SCI) += spi_sh_sci.o
obj-$(CONFIG_SPI_SH_MSIOF) += spi_sh_msiof.o
obj-$(CONFIG_SPI_STMP3XXX) += spi_stmp.o
Expand Down
56 changes: 45 additions & 11 deletions drivers/spi/xilinx_spi.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,12 @@
#include <linux/module.h>
#include <linux/init.h>
#include <linux/interrupt.h>
#include <linux/of.h>
#include <linux/platform_device.h>
#include <linux/spi/spi.h>
#include <linux/spi/spi_bitbang.h>
#include <linux/io.h>

#include "xilinx_spi.h"
#include <linux/spi/xilinx_spi.h>
#include <linux/io.h>

#define XILINX_SPI_NAME "xilinx_spi"

Expand Down Expand Up @@ -352,6 +351,15 @@ static irqreturn_t xilinx_spi_irq(int irq, void *dev_id)
return IRQ_HANDLED;
}

#ifdef CONFIG_OF
static const struct of_device_id xilinx_spi_of_match[] = {
{ .compatible = "xlnx,xps-spi-2.00.a", },
{ .compatible = "xlnx,xps-spi-2.00.b", },
{}
};
MODULE_DEVICE_TABLE(of, xilinx_spi_of_match);
#endif

struct spi_master *xilinx_spi_init(struct device *dev, struct resource *mem,
u32 irq, s16 bus_num, int num_cs, int little_endian, int bits_per_word)
{
Expand Down Expand Up @@ -462,13 +470,35 @@ static int __devinit xilinx_spi_probe(struct platform_device *dev)
{
struct xspi_platform_data *pdata;
struct resource *r;
int irq;
int irq, num_cs = 0, little_endian = 0, bits_per_word = 8;
struct spi_master *master;
u8 i;

pdata = dev->dev.platform_data;
if (!pdata)
return -ENODEV;
if (pdata) {
num_cs = pdata->num_chipselect;
little_endian = pdata->little_endian;
bits_per_word = pdata->bits_per_word;
}

#ifdef CONFIG_OF
if (dev->dev.of_node) {
const __be32 *prop;
int len;

/* number of slave select bits is required */
prop = of_get_property(dev->dev.of_node, "xlnx,num-ss-bits",
&len);
if (prop && len >= sizeof(*prop))
num_cs = __be32_to_cpup(prop);
}
#endif

if (!num_cs) {
dev_err(&dev->dev, "Missing slave select configuration data\n");
return -EINVAL;
}


r = platform_get_resource(dev, IORESOURCE_MEM, 0);
if (!r)
Expand All @@ -478,14 +508,15 @@ static int __devinit xilinx_spi_probe(struct platform_device *dev)
if (irq < 0)
return -ENXIO;

master = xilinx_spi_init(&dev->dev, r, irq, dev->id,
pdata->num_chipselect, pdata->little_endian,
pdata->bits_per_word);
master = xilinx_spi_init(&dev->dev, r, irq, dev->id, num_cs,
little_endian, bits_per_word);
if (!master)
return -ENODEV;

for (i = 0; i < pdata->num_devices; i++)
spi_new_device(master, pdata->devices + i);
if (pdata) {
for (i = 0; i < pdata->num_devices; i++)
spi_new_device(master, pdata->devices + i);
}

platform_set_drvdata(dev, master);
return 0;
Expand All @@ -508,6 +539,9 @@ static struct platform_driver xilinx_spi_driver = {
.driver = {
.name = XILINX_SPI_NAME,
.owner = THIS_MODULE,
#ifdef CONFIG_OF
.of_match_table = xilinx_spi_of_match,
#endif
},
};

Expand Down
32 changes: 0 additions & 32 deletions drivers/spi/xilinx_spi.h

This file was deleted.

124 changes: 0 additions & 124 deletions drivers/spi/xilinx_spi_of.c

This file was deleted.

0 comments on commit eae6cb3

Please sign in to comment.