@@ -863,7 +863,6 @@ static int atmel_spi_set_xfer_speed(struct atmel_spi *as,
863863 * lock is held, spi irq is blocked
864864 */
865865static 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+
12761292static 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
14701411static 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