|
|
@@ -298,58 +298,44 @@ 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);
|
|
|
+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;
|
|
|
+ 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);
|
|
|
|
|
|
- return status;
|
|
|
+ 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)
|
|
|
@@ -438,7 +424,8 @@ static int mcfqspi_probe(struct platform_device *pdev)
|
|
|
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);
|