Skip to content

Commit 5fa5e6d

Browse files
djsazbroonie
authored andcommitted
spi: atmel: Switch to transfer_one transfer method
Switch from using our own transfer_one_message routine to using the one provided by the SPI core. Signed-off-by: Dan Sneddon <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Mark Brown <[email protected]>
1 parent ec679bd commit 5fa5e6d

File tree

1 file changed

+33
-91
lines changed

1 file changed

+33
-91
lines changed

drivers/spi/spi-atmel.c

Lines changed: 33 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -863,7 +863,6 @@ static int atmel_spi_set_xfer_speed(struct atmel_spi *as,
863863
* lock is held, spi irq is blocked
864864
*/
865865
static void atmel_spi_pdc_next_xfer(struct spi_master *master,
866-
struct spi_message *msg,
867866
struct spi_transfer *xfer)
868867
{
869868
struct atmel_spi *as = spi_master_get_devdata(master);
@@ -879,12 +878,12 @@ static void atmel_spi_pdc_next_xfer(struct spi_master *master,
879878
spi_writel(as, RPR, rx_dma);
880879
spi_writel(as, TPR, tx_dma);
881880

882-
if (msg->spi->bits_per_word > 8)
881+
if (xfer->bits_per_word > 8)
883882
len >>= 1;
884883
spi_writel(as, RCR, len);
885884
spi_writel(as, TCR, len);
886885

887-
dev_dbg(&msg->spi->dev,
886+
dev_dbg(&master->dev,
888887
" start xfer %p: len %u tx %p/%08llx rx %p/%08llx\n",
889888
xfer, xfer->len, xfer->tx_buf,
890889
(unsigned long long)xfer->tx_dma, xfer->rx_buf,
@@ -898,12 +897,12 @@ static void atmel_spi_pdc_next_xfer(struct spi_master *master,
898897
spi_writel(as, RNPR, rx_dma);
899898
spi_writel(as, TNPR, tx_dma);
900899

901-
if (msg->spi->bits_per_word > 8)
900+
if (xfer->bits_per_word > 8)
902901
len >>= 1;
903902
spi_writel(as, RNCR, len);
904903
spi_writel(as, TNCR, len);
905904

906-
dev_dbg(&msg->spi->dev,
905+
dev_dbg(&master->dev,
907906
" next xfer %p: len %u tx %p/%08llx rx %p/%08llx\n",
908907
xfer, xfer->len, xfer->tx_buf,
909908
(unsigned long long)xfer->tx_dma, xfer->rx_buf,
@@ -1273,12 +1272,28 @@ static int atmel_spi_setup(struct spi_device *spi)
12731272
return 0;
12741273
}
12751274

1275+
static void atmel_spi_set_cs(struct spi_device *spi, bool enable)
1276+
{
1277+
struct atmel_spi *as = spi_master_get_devdata(spi->master);
1278+
/* the core doesn't really pass us enable/disable, but CS HIGH vs CS LOW
1279+
* since we already have routines for activate/deactivate translate
1280+
* high/low to active/inactive
1281+
*/
1282+
enable = (!!(spi->mode & SPI_CS_HIGH) == enable);
1283+
1284+
if (enable) {
1285+
cs_activate(as, spi);
1286+
} else {
1287+
cs_deactivate(as, spi);
1288+
}
1289+
1290+
}
1291+
12761292
static int atmel_spi_one_transfer(struct spi_master *master,
1277-
struct spi_message *msg,
1293+
struct spi_device *spi,
12781294
struct spi_transfer *xfer)
12791295
{
12801296
struct atmel_spi *as;
1281-
struct spi_device *spi = msg->spi;
12821297
u8 bits;
12831298
u32 len;
12841299
struct atmel_spi_device *asd;
@@ -1287,11 +1302,8 @@ static int atmel_spi_one_transfer(struct spi_master *master,
12871302
unsigned long dma_timeout;
12881303

12891304
as = spi_master_get_devdata(master);
1290-
1291-
if (!(xfer->tx_buf || xfer->rx_buf) && xfer->len) {
1292-
dev_dbg(&spi->dev, "missing rx or tx buf\n");
1293-
return -EINVAL;
1294-
}
1305+
/* This lock was orignally taken in atmel_spi_trasfer_one_message */
1306+
atmel_spi_lock(as);
12951307

12961308
asd = spi->controller_state;
12971309
bits = (asd->csr >> 4) & 0xf;
@@ -1305,13 +1317,13 @@ static int atmel_spi_one_transfer(struct spi_master *master,
13051317
* DMA map early, for performance (empties dcache ASAP) and
13061318
* better fault reporting.
13071319
*/
1308-
if ((!msg->is_dma_mapped)
1320+
if ((!master->cur_msg_mapped)
13091321
&& as->use_pdc) {
13101322
if (atmel_spi_dma_map_xfer(as, xfer) < 0)
13111323
return -ENOMEM;
13121324
}
13131325

1314-
atmel_spi_set_xfer_speed(as, msg->spi, xfer);
1326+
atmel_spi_set_xfer_speed(as, spi, xfer);
13151327

13161328
as->done_status = 0;
13171329
as->current_transfer = xfer;
@@ -1320,15 +1332,16 @@ static int atmel_spi_one_transfer(struct spi_master *master,
13201332
reinit_completion(&as->xfer_completion);
13211333

13221334
if (as->use_pdc) {
1323-
atmel_spi_pdc_next_xfer(master, msg, xfer);
1335+
atmel_spi_pdc_next_xfer(master, xfer);
13241336
} else if (atmel_spi_use_dma(as, xfer)) {
13251337
len = as->current_remaining_bytes;
13261338
ret = atmel_spi_next_xfer_dma_submit(master,
13271339
xfer, &len);
13281340
if (ret) {
13291341
dev_err(&spi->dev,
13301342
"unable to use DMA, fallback to PIO\n");
1331-
atmel_spi_next_xfer_pio(master, xfer);
1343+
as->done_status = ret;
1344+
break;
13321345
} else {
13331346
as->current_remaining_bytes -= len;
13341347
if (as->current_remaining_bytes < 0)
@@ -1381,90 +1394,18 @@ static int atmel_spi_one_transfer(struct spi_master *master,
13811394
} else if (atmel_spi_use_dma(as, xfer)) {
13821395
atmel_spi_stop_dma(master);
13831396
}
1384-
1385-
if (!msg->is_dma_mapped
1386-
&& as->use_pdc)
1387-
atmel_spi_dma_unmap_xfer(master, xfer);
1388-
1389-
return 0;
1390-
1391-
} else {
1392-
/* only update length if no error */
1393-
msg->actual_length += xfer->len;
13941397
}
13951398

1396-
if (!msg->is_dma_mapped
1399+
if (!master->cur_msg_mapped
13971400
&& as->use_pdc)
13981401
atmel_spi_dma_unmap_xfer(master, xfer);
13991402

1400-
spi_transfer_delay_exec(xfer);
1401-
1402-
if (xfer->cs_change) {
1403-
if (list_is_last(&xfer->transfer_list,
1404-
&msg->transfers)) {
1405-
as->keep_cs = true;
1406-
} else {
1407-
cs_deactivate(as, msg->spi);
1408-
udelay(10);
1409-
cs_activate(as, msg->spi);
1410-
}
1411-
}
1412-
1413-
return 0;
1414-
}
1415-
1416-
static int atmel_spi_transfer_one_message(struct spi_master *master,
1417-
struct spi_message *msg)
1418-
{
1419-
struct atmel_spi *as;
1420-
struct spi_transfer *xfer;
1421-
struct spi_device *spi = msg->spi;
1422-
int ret = 0;
1423-
1424-
as = spi_master_get_devdata(master);
1425-
1426-
dev_dbg(&spi->dev, "new message %p submitted for %s\n",
1427-
msg, dev_name(&spi->dev));
1428-
1429-
atmel_spi_lock(as);
1430-
cs_activate(as, spi);
1431-
1432-
as->keep_cs = false;
1433-
1434-
msg->status = 0;
1435-
msg->actual_length = 0;
1436-
1437-
list_for_each_entry(xfer, &msg->transfers, transfer_list) {
1438-
trace_spi_transfer_start(msg, xfer);
1439-
1440-
ret = atmel_spi_one_transfer(master, msg, xfer);
1441-
if (ret)
1442-
goto msg_done;
1443-
1444-
trace_spi_transfer_stop(msg, xfer);
1445-
}
1446-
14471403
if (as->use_pdc)
14481404
atmel_spi_disable_pdc_transfer(as);
14491405

1450-
list_for_each_entry(xfer, &msg->transfers, transfer_list) {
1451-
dev_dbg(&spi->dev,
1452-
" xfer %p: len %u tx %p/%pad rx %p/%pad\n",
1453-
xfer, xfer->len,
1454-
xfer->tx_buf, &xfer->tx_dma,
1455-
xfer->rx_buf, &xfer->rx_dma);
1456-
}
1457-
1458-
msg_done:
1459-
if (!as->keep_cs)
1460-
cs_deactivate(as, msg->spi);
1461-
14621406
atmel_spi_unlock(as);
14631407

1464-
msg->status = as->done_status;
1465-
spi_finalize_current_message(spi->master);
1466-
1467-
return ret;
1408+
return as->done_status;
14681409
}
14691410

14701411
static void atmel_spi_cleanup(struct spi_device *spi)
@@ -1554,7 +1495,8 @@ static int atmel_spi_probe(struct platform_device *pdev)
15541495
master->num_chipselect = 4;
15551496
master->setup = atmel_spi_setup;
15561497
master->flags = (SPI_MASTER_MUST_RX | SPI_MASTER_MUST_TX);
1557-
master->transfer_one_message = atmel_spi_transfer_one_message;
1498+
master->transfer_one = atmel_spi_one_transfer;
1499+
master->set_cs = atmel_spi_set_cs;
15581500
master->cleanup = atmel_spi_cleanup;
15591501
master->auto_runtime_pm = true;
15601502
master->max_dma_len = SPI_MAX_DMA_XFER;

0 commit comments

Comments
 (0)