On 7/2/2013 2:26 PM, Sourav Poddar wrote:Ok.The patch add basic support for the quad spi controller.Please cc devicetree-discuss list when adding new bindings.
QSPI is a kind of spi module that allows single,
dual and quad read access to external spi devices. The module
has a memory mapped interface which provide direct interface
for accessing data form external spi devices.
The patch will configure controller clocks, device control
register and for defining low level transfer apis which
will be used by the spi framework to transfer data to
the slave spi device(flash in this case).
Signed-off-by: Sourav Poddar<sourav.poddar@xxxxxx>
---
This patch was sent as a part of a series[1];
but this can go in as a standalone patch.
[1]: https://lkml.org/lkml/2013/6/26/83
v1->v2:
1. Placed pm specific calls in prepare/unprepare apis.
2. Put a mask to support upto 32 bits word length.
3. Used "devm_ioremap_resource" variants.
4. Add dt binding doumentation.
Documentation/devicetree/bindings/spi/ti_qspi.txt | 22 ++
drivers/spi/Kconfig | 8 +
drivers/spi/Makefile | 1 +
drivers/spi/ti-qspi.c | 357 +++++++++++++++++++++
4 files changed, 388 insertions(+), 0 deletions(-)
create mode 100644 Documentation/devicetree/bindings/spi/ti_qspi.txt
create mode 100644 drivers/spi/ti-qspi.c
Ok. will change it in next version.+static int dra7xxx_qspi_probe(struct platform_device *pdev)This should be
+{
+ struct dra7xxx_qspi *qspi;
+ struct spi_master *master;
+ struct resource *r;
+ struct device_node *np = pdev->dev.of_node;
+ u32 max_freq;
+ int ret;
+
+ master = spi_alloc_master(&pdev->dev, sizeof(*qspi));
+ if (!master)
+ return -ENOMEM;
+
+ master->mode_bits = SPI_CPOL | SPI_CPHA;
+
+ master->num_chipselect = 1;
+ master->bus_num = -1;
+ master->setup = dra7xxx_qspi_setup;
+ master->prepare_transfer_hardware = dra7xxx_qspi_prepare_xfer;
+ master->transfer_one_message = dra7xxx_qspi_start_transfer_one;
+ master->unprepare_transfer_hardware = dra7xxx_qspi_unprepare_xfer;
+ master->dev.of_node = pdev->dev.of_node;
+ master->bits_per_word_mask = BIT(32 - 1) | BIT(16 - 1) | BIT(8 - 1);
+
+ dev_set_drvdata(&pdev->dev, master);
+
+ qspi = spi_master_get_devdata(master);
+ qspi->master = master;
+ qspi->dev =&pdev->dev;
+
+ r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ if (r == NULL) {
+ ret = -ENODEV;
+ goto free_master;
+ }
+
+ qspi->base = devm_ioremap_resource(&pdev->dev, r);
+ if (!qspi->base) {
+ dev_dbg(&pdev->dev, "can't ioremap MCSPI\n");
+ ret = -ENOMEM;
+ goto free_master;
+ }
if (IS_ERR(qspi->base)) {
dev_dbg(&pdev->dev, "can't ioremap QSPI\n");
ret = PTR_ERR(qspi->base);
goto free_master;
}
Thanks,
Sekhar