Merge remote-tracking branches 'spi/topic/bus-num', 'spi/topic/cleanup', 'spi/topic...
[cascardo/linux.git] / drivers / spi / spi-coldfire-qspi.c
index 0ab2c55..e2fa628 100644 (file)
@@ -77,8 +77,6 @@ struct mcfqspi {
        struct mcfqspi_cs_control *cs_control;
 
        wait_queue_head_t waitq;
-
-       struct device *dev;
 };
 
 static void mcfqspi_wr_qmr(struct mcfqspi *mcfqspi, u16 val)
@@ -135,13 +133,13 @@ static void mcfqspi_cs_deselect(struct mcfqspi *mcfqspi, u8 chip_select,
 
 static int mcfqspi_cs_setup(struct mcfqspi *mcfqspi)
 {
-       return (mcfqspi->cs_control && mcfqspi->cs_control->setup) ?
+       return (mcfqspi->cs_control->setup) ?
                mcfqspi->cs_control->setup(mcfqspi->cs_control) : 0;
 }
 
 static void mcfqspi_cs_teardown(struct mcfqspi *mcfqspi)
 {
-       if (mcfqspi->cs_control && mcfqspi->cs_control->teardown)
+       if (mcfqspi->cs_control->teardown)
                mcfqspi->cs_control->teardown(mcfqspi->cs_control);
 }
 
@@ -300,58 +298,41 @@ static void mcfqspi_transfer_msg16(struct mcfqspi *mcfqspi, unsigned count,
        }
 }
 
-static int mcfqspi_transfer_one_message(struct spi_master *master,
-                                        struct spi_message *msg)
+static void mcfqspi_set_cs(struct spi_device *spi, bool enable)
 {
-       struct mcfqspi *mcfqspi = spi_master_get_devdata(master);
-       struct spi_device *spi = msg->spi;
-       struct spi_transfer *t;
-       int status = 0;
-
-       list_for_each_entry(t, &msg->transfers, transfer_list) {
-               bool cs_high = spi->mode & SPI_CS_HIGH;
-               u16 qmr = MCFQSPI_QMR_MSTR;
-
-               qmr |= t->bits_per_word << 10;
-               if (spi->mode & SPI_CPHA)
-                       qmr |= MCFQSPI_QMR_CPHA;
-               if (spi->mode & SPI_CPOL)
-                       qmr |= MCFQSPI_QMR_CPOL;
-               if (t->speed_hz)
-                       qmr |= mcfqspi_qmr_baud(t->speed_hz);
-               else
-                       qmr |= mcfqspi_qmr_baud(spi->max_speed_hz);
-               mcfqspi_wr_qmr(mcfqspi, qmr);
+       struct mcfqspi *mcfqspi = spi_master_get_devdata(spi->master);
+       bool cs_high = spi->mode & SPI_CS_HIGH;
 
+       if (enable)
                mcfqspi_cs_select(mcfqspi, spi->chip_select, cs_high);
+       else
+               mcfqspi_cs_deselect(mcfqspi, spi->chip_select, cs_high);
+}
 
-               mcfqspi_wr_qir(mcfqspi, MCFQSPI_QIR_SPIFE);
-               if (t->bits_per_word == 8)
-                       mcfqspi_transfer_msg8(mcfqspi, t->len, t->tx_buf,
-                                       t->rx_buf);
-               else
-                       mcfqspi_transfer_msg16(mcfqspi, t->len / 2, t->tx_buf,
-                                       t->rx_buf);
-               mcfqspi_wr_qir(mcfqspi, 0);
-
-               if (t->delay_usecs)
-                       udelay(t->delay_usecs);
-               if (t->cs_change) {
-                       if (!list_is_last(&t->transfer_list, &msg->transfers))
-                               mcfqspi_cs_deselect(mcfqspi, spi->chip_select,
-                                               cs_high);
-               } else {
-                       if (list_is_last(&t->transfer_list, &msg->transfers))
-                               mcfqspi_cs_deselect(mcfqspi, spi->chip_select,
-                                               cs_high);
-               }
-               msg->actual_length += t->len;
-       }
-       msg->status = status;
-       spi_finalize_current_message(master);
-
-       return status;
+static int mcfqspi_transfer_one(struct spi_master *master,
+                               struct spi_device *spi,
+                               struct spi_transfer *t)
+{
+       struct mcfqspi *mcfqspi = spi_master_get_devdata(master);
+       u16 qmr = MCFQSPI_QMR_MSTR;
+
+       qmr |= t->bits_per_word << 10;
+       if (spi->mode & SPI_CPHA)
+               qmr |= MCFQSPI_QMR_CPHA;
+       if (spi->mode & SPI_CPOL)
+               qmr |= MCFQSPI_QMR_CPOL;
+       qmr |= mcfqspi_qmr_baud(t->speed_hz);
+       mcfqspi_wr_qmr(mcfqspi, qmr);
+
+       mcfqspi_wr_qir(mcfqspi, MCFQSPI_QIR_SPIFE);
+       if (t->bits_per_word == 8)
+               mcfqspi_transfer_msg8(mcfqspi, t->len, t->tx_buf, t->rx_buf);
+       else
+               mcfqspi_transfer_msg16(mcfqspi, t->len / 2, t->tx_buf,
+                                      t->rx_buf);
+       mcfqspi_wr_qir(mcfqspi, 0);
 
+       return 0;
 }
 
 static int mcfqspi_setup(struct spi_device *spi)
@@ -382,6 +363,11 @@ static int mcfqspi_probe(struct platform_device *pdev)
                return -ENOENT;
        }
 
+       if (!pdata->cs_control) {
+               dev_dbg(&pdev->dev, "pdata->cs_control is NULL\n");
+               return -EINVAL;
+       }
+
        master = spi_alloc_master(&pdev->dev, sizeof(*mcfqspi));
        if (master == NULL) {
                dev_dbg(&pdev->dev, "spi_alloc_master failed\n");
@@ -430,12 +416,12 @@ static int mcfqspi_probe(struct platform_device *pdev)
        }
 
        init_waitqueue_head(&mcfqspi->waitq);
-       mcfqspi->dev = &pdev->dev;
 
        master->mode_bits = SPI_CS_HIGH | SPI_CPOL | SPI_CPHA;
        master->bits_per_word_mask = SPI_BPW_RANGE_MASK(8, 16);
        master->setup = mcfqspi_setup;
-       master->transfer_one_message = mcfqspi_transfer_one_message;
+       master->set_cs = mcfqspi_set_cs;
+       master->transfer_one = mcfqspi_transfer_one;
        master->auto_runtime_pm = true;
 
        platform_set_drvdata(pdev, master);
@@ -445,7 +431,7 @@ static int mcfqspi_probe(struct platform_device *pdev)
                dev_dbg(&pdev->dev, "spi_register_master failed\n");
                goto fail2;
        }
-       pm_runtime_enable(mcfqspi->dev);
+       pm_runtime_enable(&pdev->dev);
 
        dev_info(&pdev->dev, "Coldfire QSPI bus driver\n");
 
@@ -467,9 +453,8 @@ static int mcfqspi_remove(struct platform_device *pdev)
 {
        struct spi_master *master = platform_get_drvdata(pdev);
        struct mcfqspi *mcfqspi = spi_master_get_devdata(master);
-       struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 
-       pm_runtime_disable(mcfqspi->dev);
+       pm_runtime_disable(&pdev->dev);
        /* disable the hardware (set the baud rate to 0) */
        mcfqspi_wr_qmr(mcfqspi, MCFQSPI_QMR_MSTR);
 
@@ -484,8 +469,11 @@ static int mcfqspi_suspend(struct device *dev)
 {
        struct spi_master *master = dev_get_drvdata(dev);
        struct mcfqspi *mcfqspi = spi_master_get_devdata(master);
+       int ret;
 
-       spi_master_suspend(master);
+       ret = spi_master_suspend(master);
+       if (ret)
+               return ret;
 
        clk_disable(mcfqspi->clk);
 
@@ -497,18 +485,17 @@ static int mcfqspi_resume(struct device *dev)
        struct spi_master *master = dev_get_drvdata(dev);
        struct mcfqspi *mcfqspi = spi_master_get_devdata(master);
 
-       spi_master_resume(master);
-
        clk_enable(mcfqspi->clk);
 
-       return 0;
+       return spi_master_resume(master);
 }
 #endif
 
 #ifdef CONFIG_PM_RUNTIME
 static int mcfqspi_runtime_suspend(struct device *dev)
 {
-       struct mcfqspi *mcfqspi = dev_get_drvdata(dev);
+       struct spi_master *master = dev_get_drvdata(dev);
+       struct mcfqspi *mcfqspi = spi_master_get_devdata(master);
 
        clk_disable(mcfqspi->clk);
 
@@ -517,7 +504,8 @@ static int mcfqspi_runtime_suspend(struct device *dev)
 
 static int mcfqspi_runtime_resume(struct device *dev)
 {
-       struct mcfqspi *mcfqspi = dev_get_drvdata(dev);
+       struct spi_master *master = dev_get_drvdata(dev);
+       struct mcfqspi *mcfqspi = spi_master_get_devdata(master);
 
        clk_enable(mcfqspi->clk);