Compile tested only. I haven't booted this yet.
---
Grant Likely (3):
spi/xilinx: Eliminate pdata references from common code.
spi/xilinx: fold platform_driver support into main body
spi/xilinx: merge OF support code into main driver
drivers/spi/Kconfig | 14 ----
drivers/spi/Makefile | 2 -
drivers/spi/xilinx_spi.c | 133 ++++++++++++++++++++++++++++++++++------
drivers/spi/xilinx_spi.h | 32 ----------
drivers/spi/xilinx_spi_of.c | 133 ----------------------------------------
drivers/spi/xilinx_spi_pltfm.c | 102 -------------------------------
6 files changed, 114 insertions(+), 302 deletions(-)
delete mode 100644 drivers/spi/xilinx_spi.h
delete mode 100644 drivers/spi/xilinx_spi_of.c
delete mode 100644 drivers/spi/xilinx_spi_pltfm.c
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majo...@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Signed-off-by: Grant Likely <grant....@secretlab.ca>
---
drivers/spi/xilinx_spi.c | 14 ++++----------
drivers/spi/xilinx_spi.h | 2 +-
drivers/spi/xilinx_spi_of.c | 17 ++++-------------
drivers/spi/xilinx_spi_pltfm.c | 4 +++-
4 files changed, 12 insertions(+), 25 deletions(-)
diff --git a/drivers/spi/xilinx_spi.c b/drivers/spi/xilinx_spi.c
index 80f2db5..efb28ba 100644
--- a/drivers/spi/xilinx_spi.c
+++ b/drivers/spi/xilinx_spi.c
@@ -351,18 +351,12 @@ static irqreturn_t xilinx_spi_irq(int irq, void *dev_id)
}
struct spi_master *xilinx_spi_init(struct device *dev, struct resource *mem,
- u32 irq, s16 bus_num)
+ u32 irq, s16 bus_num, int num_cs, int little_endian, int bits_per_word)
{
struct spi_master *master;
struct xilinx_spi *xspi;
- struct xspi_platform_data *pdata = dev->platform_data;
int ret;
- if (!pdata) {
- dev_err(dev, "No platform data attached\n");
- return NULL;
- }
-
master = spi_alloc_master(dev, sizeof(struct xilinx_spi));
if (!master)
return NULL;
@@ -389,21 +383,21 @@ struct spi_master *xilinx_spi_init(struct device *dev, struct resource *mem,
}
master->bus_num = bus_num;
- master->num_chipselect = pdata->num_chipselect;
+ master->num_chipselect = num_cs;
#ifdef CONFIG_OF
master->dev.of_node = dev->of_node;
#endif
xspi->mem = *mem;
xspi->irq = irq;
- if (pdata->little_endian) {
+ if (little_endian) {
xspi->read_fn = xspi_read32;
xspi->write_fn = xspi_write32;
} else {
xspi->read_fn = xspi_read32_be;
xspi->write_fn = xspi_write32_be;
}
- xspi->bits_per_word = pdata->bits_per_word;
+ xspi->bits_per_word = bits_per_word;
if (xspi->bits_per_word == 8) {
xspi->tx_fn = xspi_tx8;
xspi->rx_fn = xspi_rx8;
diff --git a/drivers/spi/xilinx_spi.h b/drivers/spi/xilinx_spi.h
index d211acc..d710a33 100644
--- a/drivers/spi/xilinx_spi.h
+++ b/drivers/spi/xilinx_spi.h
@@ -26,7 +26,7 @@
#define XILINX_SPI_NAME "xilinx_spi"
struct spi_master *xilinx_spi_init(struct device *dev, struct resource *mem,
- u32 irq, s16 bus_num);
+ u32 irq, s16 bus_num, int num_cs, int little_endian, int bits_per_word);
void xilinx_spi_deinit(struct spi_master *master);
#endif
diff --git a/drivers/spi/xilinx_spi_of.c b/drivers/spi/xilinx_spi_of.c
index b66c2db..c2d8ade 100644
--- a/drivers/spi/xilinx_spi_of.c
+++ b/drivers/spi/xilinx_spi_of.c
@@ -42,12 +42,11 @@ static int __devinit xilinx_spi_of_probe(struct platform_device *ofdev,
const struct of_device_id *match)
{
struct spi_master *master;
- struct xspi_platform_data *pdata;
struct resource r_mem;
struct resource r_irq;
int rc = 0;
const u32 *prop;
- int len;
+ int len, num_cs;
rc = of_address_to_resource(ofdev->dev.of_node, 0, &r_mem);
if (rc) {
@@ -61,21 +60,15 @@ static int __devinit xilinx_spi_of_probe(struct platform_device *ofdev,
return -ENODEV;
}
- ofdev->dev.platform_data =
- kzalloc(sizeof(struct xspi_platform_data), GFP_KERNEL);
- pdata = ofdev->dev.platform_data;
- if (!pdata)
- return -ENOMEM;
-
/* number of slave select bits is required */
prop = of_get_property(ofdev->dev.of_node, "xlnx,num-ss-bits", &len);
if (!prop || len < sizeof(*prop)) {
dev_warn(&ofdev->dev, "no 'xlnx,num-ss-bits' property\n");
return -EINVAL;
}
- pdata->num_chipselect = *prop;
- pdata->bits_per_word = 8;
- master = xilinx_spi_init(&ofdev->dev, &r_mem, r_irq.start, -1);
+ num_cs = __be32_to_cpup(prop);
+ master = xilinx_spi_init(&ofdev->dev, &r_mem, r_irq.start, -1,
+ num_cs, 0, 8);
if (!master)
return -ENODEV;
@@ -88,8 +81,6 @@ static int __devexit xilinx_spi_remove(struct platform_device *ofdev)
{
xilinx_spi_deinit(dev_get_drvdata(&ofdev->dev));
dev_set_drvdata(&ofdev->dev, 0);
- kfree(ofdev->dev.platform_data);
- ofdev->dev.platform_data = NULL;
return 0;
}
diff --git a/drivers/spi/xilinx_spi_pltfm.c b/drivers/spi/xilinx_spi_pltfm.c
index 24debac..a16722a 100644
--- a/drivers/spi/xilinx_spi_pltfm.c
+++ b/drivers/spi/xilinx_spi_pltfm.c
@@ -54,7 +54,9 @@ 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);
+ master = xilinx_spi_init(&dev->dev, r, irq, dev->id,
+ pdata->num_chipselect, pdata->little_endian,
+ pdata->bits_per_word);
if (!master)
return -ENODEV;
Grant Likely wrote:
> Since of_platform_bus_type has been merged with the platform_bus_type,
> a single platform driver can now support both use cases. This patch
> series merges the two halves of the xilinx_spi device driver.
>
> Compile tested only. I haven't booted this yet.
I have tested it on sp605 and works well. Have you added that patches
to your repository? Or are they somewhere else? Who is responsible for?
I would like to also discuss one change which is related mmc_spi kernel driver.
Let me describe the problem. Microblaze can use dma in all addresses
that's why dma_mask is setup to 0xffffffff in of_platform_device_create.
Xilinx spi driver doesn't support dma but mmc_spi driver is checking dma_mask in parent device
which is xilinx spi driver.
Here is the corresponding the part of code (Expect dma_mask=zero for no dma operations).
mmc_spi.c:~1395
if (spi->master->dev.parent->dma_mask) {
struct device *dev = spi->master->dev.parent;
host->dma_dev = dev;
Based on this one our customer came with the following solution to setup
dma_mask in xilinx_spi to zero and then mmc_spi doesn't setup dma operation.
I think that this is nice solution but I would like to be sure that I didn't miss anything.
After that i will create proper patch with description.
diff --git a/drivers/spi/xilinx_spi.c b/drivers/spi/xilinx_spi.c
index 7adaef6..3612e1b 100644
--- a/drivers/spi/xilinx_spi.c
+++ b/drivers/spi/xilinx_spi.c
@@ -519,6 +519,9 @@ static int __devinit xilinx_spi_probe(struct platform_device *dev)
}
platform_set_drvdata(dev, master);
+ /* clear the dma_mask, to try to disable use of dma */
+ dev->dev.dma_mask = 0;
+
return 0;
}
Thanks,
Michal
--
Michal Simek, Ing. (M.Eng)
w: www.monstr.eu p: +42-0-721842854
Maintainer of Linux kernel 2.6 Microblaze Linux - http://www.monstr.eu/fdt/
Microblaze U-BOOT custodian
This email and any attachments are intended for the sole use of the named recipient(s) and contain(s) confidential information that may be proprietary, privileged or copyrighted under applicable law. If you are not the intended recipient, do not read, copy, or forward this email message or any attachments. Delete this email message and any attachments immediately.
Hmmm, that actually is not sane. Ideally, drivers should never be
mucking with the dma mask. It is supposed to only be set by the code
actually registering the device. The mmc code should not be looking
at the parent's dma mask to determine if DMA is available; the spi bus
drivers should be explicitly stating whether or not it supports DMA.
The mmc_spi code is doing the wrong thing here.
That being said, until the mmc_spi code is fixed (and all the users
are fixed up so DMA still works) then this patch is probably the best
solution. However, please note that dev->dma_mask is a pointer, so
you should actually be setting it to NULL.
g.
>
> Thanks,
> John
>
>>
>>
>> diff --git a/drivers/spi/xilinx_spi.c b/drivers/spi/xilinx_spi.c
>> index 7adaef6..3612e1b 100644
>> --- a/drivers/spi/xilinx_spi.c
>> +++ b/drivers/spi/xilinx_spi.c
>> @@ -519,6 +519,9 @@ static int __devinit xilinx_spi_probe(struct platform_device *dev)
>> }
>>
>> platform_set_drvdata(dev, master);
>> + /* clear the dma_mask, to try to disable use of dma */
>> + dev->dev.dma_mask = 0;
>> +
>> return 0;
>> }
>>
>>
>> Thanks,
>> Michal
>>
>>
>> --
>> Michal Simek, Ing. (M.Eng)
>> w: www.monstr.eu p: +42-0-721842854
>> Maintainer of Linux kernel 2.6 Microblaze Linux - http://www.monstr.eu/fdt/
>> Microblaze U-BOOT custodian
>
>
> This email and any attachments are intended for the sole use of the named recipient(s) and contain(s) confidential information that may be proprietary, privileged or copyrighted under applicable law. If you are not the intended recipient, do not read, copy, or forward this email message or any attachments. Delete this email message and any attachments immediately.
>
--
Grant Likely, B.Sc., P.Eng.
Secret Lab Technologies Ltd.
I have no problem to fix mmc_spi driver but what is the standard way how to detect
DMA capability for this case? This part of code is in mmc_spi from the beginning that's why I am
wondering that none complain about.
David?
Sorry I don't have HW where I can test it. :-(
>
> That being said, until the mmc_spi code is fixed (and all the users
> are fixed up so DMA still works) then this patch is probably the best
> solution. However, please note that dev->dma_mask is a pointer, so
> you should actually be setting it to NULL.
Yes truth.
Michal
Nobody will have *all* the hardware required to test it. The solution
is actually really hard because it requires auditing all of the spi
bus drivers, figuring out which ones of them support dma, and then
publishing that information in a way readable by the spi_device
drivers. For the time being, you're solution is probably the most
reasonable.
g.
Grant: Can you answer my questions?
That our patch about DMA should follow your three patches.
Thanks,
Michal
--
Michal Simek, Ing. (M.Eng)
w: www.monstr.eu p: +42-0-721842854
Maintainer of Linux kernel 2.6 Microblaze Linux - http://www.monstr.eu/fdt/
Microblaze U-BOOT custodian
It is in my spi/next branch which I haven't pushed out to my public
tree yet. Sometime today I will after I've given it one more run
through.
g.