Merge remote-tracking branches 'spi/topic/pxa2xx', 'spi/topic/qspi', 'spi/topic/s3c24...
authorMark Brown <broonie@linaro.org>
Thu, 23 Jan 2014 13:07:14 +0000 (13:07 +0000)
committerMark Brown <broonie@linaro.org>
Thu, 23 Jan 2014 13:07:14 +0000 (13:07 +0000)
1  2  3  4  5  6  7  8  9  10  11 
drivers/spi/Kconfig
drivers/spi/spi-pxa2xx.c
drivers/spi/spi-sh.c
drivers/spi/spi-ti-qspi.c
drivers/spi/spi-txx9.c

diff --combined drivers/spi/Kconfig
@@@@@@@@@@@@ -118,13 -118,6 -118,6 -118,6 -118,6 -118,6 -118,6 -118,6 -118,6 -118,6 -118,6 +118,13 @@@@@@@@@@@@ config SPI_BCM63X
                help
                     Enable support for the SPI controller on the Broadcom BCM63xx SoCs.
           
 ++++++++++config SPI_BCM63XX_HSSPI
 ++++++++++     tristate "Broadcom BCM63XX HS SPI controller driver"
 ++++++++++     depends on BCM63XX || COMPILE_TEST
 ++++++++++     help
 ++++++++++       This enables support for the High Speed SPI controller present on
 ++++++++++       newer Broadcom BCM63XX SoCs.
 ++++++++++
           config SPI_BITBANG
                tristate "Utilities for Bitbanging SPI masters"
                help
@@@@@@@@@@@@ -166,6 -159,7 -159,7 -159,7 -159,7 -159,7 -159,7 -159,7 -159,7 -159,7 -159,7 +166,6 @@@@@@@@@@@@ config SPI_DAVINC
                tristate "Texas Instruments DaVinci/DA8x/OMAP-L/AM1x SoC SPI controller"
                depends on ARCH_DAVINCI || ARCH_KEYSTONE
                select SPI_BITBANG
 ----------     select TI_EDMA
                help
                  SPI master controller for DaVinci/DA8x/OMAP-L/AM1x SPI modules.
           
@@@@@@@@@@@@ -307,7 -301,6 -301,6 -301,6 -301,6 -301,6 -301,6 -301,6 -301,6 -301,6 -301,6 +307,7 @@@@@@@@@@@@ config SPI_OMAP_UWIR
           
           config SPI_OMAP24XX
                tristate "McSPI driver for OMAP"
 ++++++++++     depends on ARM || ARM64 || AVR32 || HEXAGON || MIPS || SH
                depends on ARCH_OMAP2PLUS || COMPILE_TEST
                help
                  SPI master controller for OMAP24XX and later Multichannel SPI
@@@@@@@@@@@@ -377,7 -370,7 -370,7 -370,7 -370,7 -370,7 -370,7 -370,7 -370,7 -370,7 -370,7 +377,7 @@@@@@@@@@@@ config SPI_PXA2XX_PC
           
           config SPI_RSPI
                tristate "Renesas RSPI controller"
 ----------     depends on (SUPERH || ARCH_SHMOBILE) && SH_DMAE_BASE
 ++++++++++     depends on (SUPERH && SH_DMAE_BASE) || ARCH_SHMOBILE
                help
                  SPI driver for Renesas RSPI blocks.
           
@@@@@@@@@@@@ -402,7 -395,7 -395,7 -395,7 -395,7 -395,7 -395,7 -395,7 -395,7 -395,7 -395,7 +402,7 @@@@@@@@@@@@ config SPI_S3C24XX_FI
           config SPI_S3C64XX
                tristate "Samsung S3C64XX series type SPI"
                depends on PLAT_SAMSUNG
---- ------     select S3C64XX_DMA if ARCH_S3C64XX
++++ ++++++     select S3C64XX_PL080 if ARCH_S3C64XX
                help
                  SPI driver for Samsung S3C64XX and newer SoCs.
           
@@@@@@@@@@@@ -414,8 -407,7 -407,7 -407,7 -407,7 -407,7 -407,7 -407,7 -407,7 -407,7 -407,7 +414,8 @@@@@@@@@@@@ config SPI_SC18IS60
           
           config SPI_SH_MSIOF
                tristate "SuperH MSIOF SPI controller"
 ----------     depends on (SUPERH || ARCH_SHMOBILE) && HAVE_CLK
 ++++++++++     depends on HAVE_CLK
 ++++++++++     depends on SUPERH || ARCH_SHMOBILE || COMPILE_TEST
                select SPI_BITBANG
                help
                  SPI driver for SuperH and SH Mobile MSIOF blocks.
diff --combined drivers/spi/spi-pxa2xx.c
@@@@@@@@@@@@ -1066,8 -1066,6 -1066,6 -1066,6 -1066,6 -1066,6 -1066,6 -1066,6 -1066,6 -1066,6 -1066,6 +1066,8 @@@@@@@@@@@@ pxa2xx_spi_acpi_get_pdata(struct platfo
           
                pdata->num_chipselect = 1;
                pdata->enable_dma = true;
 ++++++++++     pdata->tx_chan_id = -1;
 ++++++++++     pdata->rx_chan_id = -1;
           
                return pdata;
           }
           static struct acpi_device_id pxa2xx_spi_acpi_match[] = {
                { "INT33C0", 0 },
                { "INT33C1", 0 },
 ++++++++++     { "INT3430", 0 },
 ++++++++++     { "INT3431", 0 },
                { "80860F0E", 0 },
                { },
           };
@@@@@@@@@@@@ -1268,7 -1264,7 -1264,7 -1264,7 -1264,7 -1264,7 -1264,7 -1264,7 -1264,7 -1264,7 -1264,7 +1268,7 @@@@@@@@@@@@ static void pxa2xx_spi_shutdown(struct 
                        dev_err(&pdev->dev, "shutdown failed with %d\n", status);
           }
           
- ---------#ifdef CONFIG_PM
+ +++++++++#ifdef CONFIG_PM_SLEEP
           static int pxa2xx_spi_suspend(struct device *dev)
           {
                struct driver_data *drv_data = dev_get_drvdata(dev);
@@@@@@@@@@@@ -1295,9 -1291,6 -1291,6 -1291,6 -1291,6 -1291,6 -1291,6 -1291,6 -1291,6 -1291,6 -1291,6 +1295,9 @@@@@@@@@@@@ static int pxa2xx_spi_resume(struct dev
                /* Enable the SSP clock */
                clk_prepare_enable(ssp->clk);
           
 ++++++++++     /* Restore LPSS private register bits */
 ++++++++++     lpss_ssp_setup(drv_data);
 ++++++++++
                /* Start the queue running */
                status = spi_master_resume(drv_data->master);
                if (status != 0) {
diff --combined drivers/spi/spi-sh.c
@@@@@@@@@@@@ -171,7 -171,7 -171,7 -171,7 -171,7 -171,6 -171,7 -171,7 -171,7 -171,7 -171,7 +171,6 @@@@@@@@@@@@ static int spi_sh_send(struct spi_sh_da
                int remain = t->len;
                int cur_len;
                unsigned char *data;
----- -----     unsigned long tmp;
                long ret;
           
                if (t->len)
                }
           
                if (list_is_last(&t->transfer_list, &mesg->transfers)) {
----- -----             tmp = spi_sh_read(ss, SPI_SH_CR1);
----- -----             tmp = tmp & ~(SPI_SH_SSD | SPI_SH_SSDB);
----- -----             spi_sh_write(ss, tmp, SPI_SH_CR1);
+++++ +++++             spi_sh_clear_bit(ss, SPI_SH_SSD | SPI_SH_SSDB, SPI_SH_CR1);
                        spi_sh_set_bit(ss, SPI_SH_SSA, SPI_SH_CR1);
           
                        ss->cr1 &= ~SPI_SH_TBE;
@@@@@@@@@@@@ -239,7 -239,7 -239,7 -239,7 -239,7 -236,6 -239,7 -239,7 -239,7 -239,7 -239,7 +236,6 @@@@@@@@@@@@ static int spi_sh_receive(struct spi_sh
                int remain = t->len;
                int cur_len;
                unsigned char *data;
----- -----     unsigned long tmp;
                long ret;
           
                if (t->len > SPI_SH_MAX_BYTE)
                else
                        spi_sh_write(ss, t->len, SPI_SH_CR3);
           
----- -----     tmp = spi_sh_read(ss, SPI_SH_CR1);
----- -----     tmp = tmp & ~(SPI_SH_SSD | SPI_SH_SSDB);
----- -----     spi_sh_write(ss, tmp, SPI_SH_CR1);
+++++ +++++     spi_sh_clear_bit(ss, SPI_SH_SSD | SPI_SH_SSDB, SPI_SH_CR1);
                spi_sh_set_bit(ss, SPI_SH_SSA, SPI_SH_CR1);
           
                spi_sh_wait_write_buffer_empty(ss);
@@@@@@@@@@@@ -358,6 -358,9 -358,9 -358,9 -358,9 -352,9 -358,9 -358,9 -358,9 -358,9 -358,9 +352,6 @@@@@@@@@@@@ static int spi_sh_setup(struct spi_devi
           {
                struct spi_sh_data *ss = spi_master_get_devdata(spi->master);
           
 ----------     if (!spi->bits_per_word)
 ----------             spi->bits_per_word = 8;
 ----------
                pr_debug("%s: enter\n", __func__);
           
                spi_sh_write(ss, 0xfe, SPI_SH_CR1);     /* SPI sycle stop */
@@@@@@@@@@@@ -46,6 -46,6 -46,8 -46,6 -46,6 -46,6 -46,6 -46,6 -46,6 -46,6 -46,6 +46,8 @@@@@@@@@@@@ struct ti_qspi 
           
                struct spi_master       *master;
                void __iomem            *base;
++ ++++++++     void __iomem            *ctrl_base;
++ ++++++++     void __iomem            *mmap_base;
                struct clk              *fclk;
                struct device           *dev;
           
                u32 spi_max_frequency;
                u32 cmd;
                u32 dc;
++ ++++++++
++ ++++++++     bool ctrl_mod;
           };
           
           #define QSPI_PID                     (0x0)
@@@@@@@@@@@@ -161,7 -161,7 -165,7 -161,7 -161,7 -161,7 -161,7 -161,7 -161,7 -161,7 -161,7 +165,7 @@@@@@@@@@@@ static int ti_qspi_setup(struct spi_dev
                                qspi->spi_max_frequency, clk_div);
           
                ret = pm_runtime_get_sync(qspi->dev);
 ----------     if (ret) {
 ++++++++++     if (ret < 0) {
                        dev_err(qspi->dev, "pm_runtime_get_sync() failed\n");
                        return ret;
                }
@@@@@@@@@@@@ -204,53 -204,53 -208,36 -204,53 -204,53 -204,53 -204,53 -204,53 -204,53 -204,53 -204,53 +208,36 @@@@@@@@@@@@ static int qspi_write_msg(struct ti_qsp
                txbuf = t->tx_buf;
                cmd = qspi->cmd | QSPI_WR_SNGL;
                count = t->len;
-- --------     wlen = t->bits_per_word;
++ ++++++++     wlen = t->bits_per_word >> 3;   /* in bytes */
           
                while (count) {
                        switch (wlen) {
-- --------             case 8:
++ ++++++++             case 1:
                                dev_dbg(qspi->dev, "tx cmd %08x dc %08x data %02x\n",
                                                cmd, qspi->dc, *txbuf);
                                writeb(*txbuf, qspi->base + QSPI_SPI_DATA_REG);
-- --------                     ti_qspi_write(qspi, cmd, QSPI_SPI_CMD_REG);
-- --------                     ret = wait_for_completion_timeout(&qspi->transfer_complete,
-- --------                                     QSPI_COMPLETION_TIMEOUT);
-- --------                     if (ret == 0) {
-- --------                             dev_err(qspi->dev, "write timed out\n");
-- --------                             return -ETIMEDOUT;
-- --------                     }
-- --------                     txbuf += 1;
-- --------                     count -= 1;
                                break;
-- --------             case 16:
++ ++++++++             case 2:
                                dev_dbg(qspi->dev, "tx cmd %08x dc %08x data %04x\n",
                                                cmd, qspi->dc, *txbuf);
                                writew(*((u16 *)txbuf), qspi->base + QSPI_SPI_DATA_REG);
-- --------                     ti_qspi_write(qspi, cmd, QSPI_SPI_CMD_REG);
-- --------                     ret = wait_for_completion_timeout(&qspi->transfer_complete,
-- --------                             QSPI_COMPLETION_TIMEOUT);
-- --------                     if (ret == 0) {
-- --------                             dev_err(qspi->dev, "write timed out\n");
-- --------                             return -ETIMEDOUT;
-- --------                     }
-- --------                     txbuf += 2;
-- --------                     count -= 2;
                                break;
-- --------             case 32:
++ ++++++++             case 4:
                                dev_dbg(qspi->dev, "tx cmd %08x dc %08x data %08x\n",
                                                cmd, qspi->dc, *txbuf);
                                writel(*((u32 *)txbuf), qspi->base + QSPI_SPI_DATA_REG);
-- --------                     ti_qspi_write(qspi, cmd, QSPI_SPI_CMD_REG);
-- --------                     ret = wait_for_completion_timeout(&qspi->transfer_complete,
-- --------                             QSPI_COMPLETION_TIMEOUT);
-- --------                     if (ret == 0) {
-- --------                             dev_err(qspi->dev, "write timed out\n");
-- --------                             return -ETIMEDOUT;
-- --------                     }
-- --------                     txbuf += 4;
-- --------                     count -= 4;
                                break;
                        }
++ ++++++++
++ ++++++++             ti_qspi_write(qspi, cmd, QSPI_SPI_CMD_REG);
++ ++++++++             ret = wait_for_completion_timeout(&qspi->transfer_complete,
++ ++++++++                                               QSPI_COMPLETION_TIMEOUT);
++ ++++++++             if (ret == 0) {
++ ++++++++                     dev_err(qspi->dev, "write timed out\n");
++ ++++++++                     return -ETIMEDOUT;
++ ++++++++             }
++ ++++++++             txbuf += wlen;
++ ++++++++             count -= wlen;
                }
           
                return 0;
@@@@@@@@@@@@ -276,7 -276,7 -263,7 -276,7 -276,7 -276,7 -276,7 -276,7 -276,7 -276,7 -276,7 +263,7 @@@@@@@@@@@@ static int qspi_read_msg(struct ti_qsp
                        break;
                }
                count = t->len;
-- --------     wlen = t->bits_per_word;
++ ++++++++     wlen = t->bits_per_word >> 3;   /* in bytes */
           
                while (count) {
                        dev_dbg(qspi->dev, "rx cmd %08x dc %08x\n", cmd, qspi->dc);
                                return -ETIMEDOUT;
                        }
                        switch (wlen) {
-- --------             case 8:
++ ++++++++             case 1:
                                *rxbuf = readb(qspi->base + QSPI_SPI_DATA_REG);
-- --------                     rxbuf += 1;
-- --------                     count -= 1;
                                break;
-- --------             case 16:
++ ++++++++             case 2:
                                *((u16 *)rxbuf) = readw(qspi->base + QSPI_SPI_DATA_REG);
-- --------                     rxbuf += 2;
-- --------                     count -= 2;
                                break;
-- --------             case 32:
++ ++++++++             case 4:
                                *((u32 *)rxbuf) = readl(qspi->base + QSPI_SPI_DATA_REG);
-- --------                     rxbuf += 4;
-- --------                     count -= 4;
                                break;
                        }
++ ++++++++             rxbuf += wlen;
++ ++++++++             count -= wlen;
                }
           
                return 0;
           static int ti_qspi_runtime_resume(struct device *dev)
           {
                struct ti_qspi      *qspi;
 ----------     struct spi_master       *master;
           
 ----------     master = dev_get_drvdata(dev);
 ----------     qspi = spi_master_get_devdata(master);
 ++++++++++     qspi = dev_get_drvdata(dev);
                ti_qspi_restore_ctx(qspi);
           
                return 0;
@@@@@@@@@@@@ -435,7 -437,7 -420,7 -437,7 -437,7 -437,7 -437,7 -437,7 -437,7 -437,7 -437,7 +418,7 @@@@@@@@@@@@ static int ti_qspi_probe(struct platfor
           {
                struct  ti_qspi *qspi;
                struct spi_master *master;
-- --------     struct resource         *r;
++ ++++++++     struct resource         *r, *res_ctrl, *res_mmap;
                struct device_node *np = pdev->dev.of_node;
                u32 max_freq;
                int ret = 0, num_cs, irq;
                if (!of_property_read_u32(np, "num-cs", &num_cs))
                        master->num_chipselect = num_cs;
           
 ----------     platform_set_drvdata(pdev, master);
 ----------
                qspi = spi_master_get_devdata(master);
                qspi->master = master;
                qspi->dev = &pdev->dev;
-               r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 ++++++++++     platform_set_drvdata(pdev, qspi);
 + ++++++++
 - --------     r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
++ ++++++++     r = platform_get_resource_byname(pdev, IORESOURCE_MEM, "qspi_base");
++ ++++++++     if (r == NULL) {
++ ++++++++             r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
++ ++++++++             if (r == NULL) {
++ ++++++++                     dev_err(&pdev->dev, "missing platform data\n");
++ ++++++++                     return -ENODEV;
++ ++++++++             }
++ ++++++++     }
+          
++ ++++++++     res_mmap = platform_get_resource_byname(pdev,
++ ++++++++                     IORESOURCE_MEM, "qspi_mmap");
++ ++++++++     if (res_mmap == NULL) {
++ ++++++++             res_mmap = platform_get_resource(pdev, IORESOURCE_MEM, 1);
++ ++++++++             if (res_mmap == NULL) {
++ ++++++++                     dev_err(&pdev->dev,
++ ++++++++                             "memory mapped resource not required\n");
++ ++++++++                     return -ENODEV;
++ ++++++++             }
++ ++++++++     }
++ ++++++++
++ ++++++++     res_ctrl = platform_get_resource_byname(pdev,
++ ++++++++                     IORESOURCE_MEM, "qspi_ctrlmod");
++ ++++++++     if (res_ctrl == NULL) {
++ ++++++++             res_ctrl = platform_get_resource(pdev, IORESOURCE_MEM, 2);
++ ++++++++             if (res_ctrl == NULL) {
++ ++++++++                     dev_dbg(&pdev->dev,
++ ++++++++                             "control module resources not required\n");
++ ++++++++             }
++ ++++++++     }
           
                irq = platform_get_irq(pdev, 0);
                if (irq < 0) {
                        goto free_master;
                }
           
++ ++++++++     if (res_ctrl) {
++ ++++++++             qspi->ctrl_mod = true;
++ ++++++++             qspi->ctrl_base = devm_ioremap_resource(&pdev->dev, res_ctrl);
++ ++++++++             if (IS_ERR(qspi->ctrl_base)) {
++ ++++++++                     ret = PTR_ERR(qspi->ctrl_base);
++ ++++++++                     goto free_master;
++ ++++++++             }
++ ++++++++     }
++ ++++++++
++ ++++++++     if (res_mmap) {
++ ++++++++             qspi->mmap_base = devm_ioremap_resource(&pdev->dev, res_mmap);
++ ++++++++             if (IS_ERR(qspi->mmap_base)) {
++ ++++++++                     ret = PTR_ERR(qspi->mmap_base);
++ ++++++++                     goto free_master;
++ ++++++++             }
++ ++++++++     }
++ ++++++++
                ret = devm_request_irq(&pdev->dev, irq, ti_qspi_isr, 0,
                                dev_name(&pdev->dev), qspi);
                if (ret < 0) {
           
           static int ti_qspi_remove(struct platform_device *pdev)
           {
 ----------     struct  ti_qspi *qspi = platform_get_drvdata(pdev);
 ++++++++++     struct ti_qspi *qspi = platform_get_drvdata(pdev);
 ++++++++++     int ret;
 ++++++++++
 ++++++++++     ret = pm_runtime_get_sync(qspi->dev);
 ++++++++++     if (ret < 0) {
 ++++++++++             dev_err(qspi->dev, "pm_runtime_get_sync() failed\n");
 ++++++++++             return ret;
 ++++++++++     }
           
                ti_qspi_write(qspi, QSPI_WC_INT_DISABLE, QSPI_INTR_ENABLE_CLEAR_REG);
           
 ++++++++++     pm_runtime_put(qspi->dev);
 ++++++++++     pm_runtime_disable(&pdev->dev);
 ++++++++++
                return 0;
           }
           
@@@@@@@@@@@@ -539,7 -532,7 -560,7 -532,7 -532,7 -532,7 -532,7 -532,7 -532,7 -532,7 -532,7 +567,7 @@@@@@@@@@@@ static struct platform_driver ti_qspi_d
                .probe  = ti_qspi_probe,
                .remove = ti_qspi_remove,
                .driver = {
-- --------             .name   = "ti,dra7xxx-qspi",
++ ++++++++             .name   = "ti-qspi",
                        .owner  = THIS_MODULE,
                        .pm =   &ti_qspi_pm_ops,
                        .of_match_table = ti_qspi_match,
@@@@@@@@@@@@ -551,3 -544,3 -572,4 -544,3 -544,3 -544,3 -544,3 -544,3 -544,3 -544,3 -544,3 +579,4 @@@@@@@@@@@@ module_platform_driver(ti_qspi_driver)
           MODULE_AUTHOR("Sourav Poddar <sourav.poddar@ti.com>");
           MODULE_LICENSE("GPL v2");
           MODULE_DESCRIPTION("TI QSPI controller driver");
++ ++++++++MODULE_ALIAS("platform:ti-qspi");
diff --combined drivers/spi/spi-txx9.c
@@@@@@@@@@@@ -348,7 -348,7 -348,7 -348,7 -348,7 -348,7 -348,7 -348,7 -348,7 -348,7 -348,7 +348,7 @@@@@@@@@@@@ static int txx9spi_probe(struct platfor
                INIT_LIST_HEAD(&c->queue);
                init_waitqueue_head(&c->waitq);
           
--------- -     c->clk = clk_get(&dev->dev, "spi-baseclk");
+++++++++ +     c->clk = devm_clk_get(&dev->dev, "spi-baseclk");
                if (IS_ERR(c->clk)) {
                        ret = PTR_ERR(c->clk);
                        c->clk = NULL;
                }
                ret = clk_enable(c->clk);
                if (ret) {
--------- -             clk_put(c->clk);
                        c->clk = NULL;
                        goto exit;
                }
           exit:
                if (c->workqueue)
                        destroy_workqueue(c->workqueue);
--------- -     if (c->clk) {
+++++++++ +     if (c->clk)
                        clk_disable(c->clk);
--------- -             clk_put(c->clk);
--------- -     }
                spi_master_put(master);
                return ret;
           }
           
           static int txx9spi_remove(struct platform_device *dev)
           {
 ----------     struct spi_master *master = spi_master_get(platform_get_drvdata(dev));
 ++++++++++     struct spi_master *master = platform_get_drvdata(dev);
                struct txx9spi *c = spi_master_get_devdata(master);
           
                destroy_workqueue(c->workqueue);
                clk_disable(c->clk);
--------- -     clk_put(c->clk);
                return 0;
           }