aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/nfc
diff options
context:
space:
mode:
authorMark A. Greer <mgreer@animalcreek.com>2014-09-02 18:12:36 -0400
committerSamuel Ortiz <sameo@linux.intel.com>2014-09-07 17:13:44 -0400
commitb528281b8b7a9c379baf37720191a799fbc9800c (patch)
treeccf37ab8ffd3e4f483c11e561d0589ed5d12ab88 /drivers/nfc
parentceccd6aa50887352e66d0edf68d8be510a639da6 (diff)
NFC: trf7970a: Create startup and shutdown routines
Encapsulate the code to start up and gracefully shutdown the driver and trf7970a device. Doing this makes adding system suspend/resume support easier and the resulting code cleaner. Signed-off-by: Mark A. Greer <mgreer@animalcreek.com> Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
Diffstat (limited to 'drivers/nfc')
-rw-r--r--drivers/nfc/trf7970a.c72
1 files changed, 43 insertions, 29 deletions
diff --git a/drivers/nfc/trf7970a.c b/drivers/nfc/trf7970a.c
index 84a9c3f78621..a42675da0667 100644
--- a/drivers/nfc/trf7970a.c
+++ b/drivers/nfc/trf7970a.c
@@ -1385,6 +1385,44 @@ static int trf7970a_power_down(struct trf7970a *trf)
1385 return ret; 1385 return ret;
1386} 1386}
1387 1387
1388static int trf7970a_startup(struct trf7970a *trf)
1389{
1390 int ret;
1391
1392 ret = trf7970a_power_up(trf);
1393 if (ret)
1394 return ret;
1395
1396 pm_runtime_set_active(trf->dev);
1397 pm_runtime_enable(trf->dev);
1398 pm_runtime_mark_last_busy(trf->dev);
1399
1400 return 0;
1401}
1402
1403static void trf7970a_shutdown(struct trf7970a *trf)
1404{
1405 switch (trf->state) {
1406 case TRF7970A_ST_WAIT_FOR_TX_FIFO:
1407 case TRF7970A_ST_WAIT_FOR_RX_DATA:
1408 case TRF7970A_ST_WAIT_FOR_RX_DATA_CONT:
1409 case TRF7970A_ST_WAIT_TO_ISSUE_EOF:
1410 trf7970a_send_err_upstream(trf, -ECANCELED);
1411 /* FALLTHROUGH */
1412 case TRF7970A_ST_IDLE:
1413 case TRF7970A_ST_IDLE_RX_BLOCKED:
1414 trf7970a_switch_rf_off(trf);
1415 break;
1416 default:
1417 break;
1418 }
1419
1420 pm_runtime_disable(trf->dev);
1421 pm_runtime_set_suspended(trf->dev);
1422
1423 trf7970a_power_down(trf);
1424}
1425
1388static int trf7970a_get_autosuspend_delay(struct device_node *np) 1426static int trf7970a_get_autosuspend_delay(struct device_node *np)
1389{ 1427{
1390 int autosuspend_delay, ret; 1428 int autosuspend_delay, ret;
@@ -1512,27 +1550,21 @@ static int trf7970a_probe(struct spi_device *spi)
1512 pm_runtime_set_autosuspend_delay(trf->dev, autosuspend_delay); 1550 pm_runtime_set_autosuspend_delay(trf->dev, autosuspend_delay);
1513 pm_runtime_use_autosuspend(trf->dev); 1551 pm_runtime_use_autosuspend(trf->dev);
1514 1552
1515 ret = trf7970a_power_up(trf); 1553 ret = trf7970a_startup(trf);
1516 if (ret) 1554 if (ret)
1517 goto err_free_ddev; 1555 goto err_free_ddev;
1518 1556
1519 pm_runtime_set_active(trf->dev);
1520 pm_runtime_enable(trf->dev);
1521 pm_runtime_mark_last_busy(trf->dev);
1522
1523 ret = nfc_digital_register_device(trf->ddev); 1557 ret = nfc_digital_register_device(trf->ddev);
1524 if (ret) { 1558 if (ret) {
1525 dev_err(trf->dev, "Can't register NFC digital device: %d\n", 1559 dev_err(trf->dev, "Can't register NFC digital device: %d\n",
1526 ret); 1560 ret);
1527 goto err_power_down; 1561 goto err_shutdown;
1528 } 1562 }
1529 1563
1530 return 0; 1564 return 0;
1531 1565
1532err_power_down: 1566err_shutdown:
1533 pm_runtime_disable(trf->dev); 1567 trf7970a_shutdown(trf);
1534 pm_runtime_set_suspended(trf->dev);
1535 trf7970a_power_down(trf);
1536err_free_ddev: 1568err_free_ddev:
1537 nfc_digital_free_device(trf->ddev); 1569 nfc_digital_free_device(trf->ddev);
1538err_disable_regulator: 1570err_disable_regulator:
@@ -1548,25 +1580,7 @@ static int trf7970a_remove(struct spi_device *spi)
1548 1580
1549 mutex_lock(&trf->lock); 1581 mutex_lock(&trf->lock);
1550 1582
1551 switch (trf->state) { 1583 trf7970a_shutdown(trf);
1552 case TRF7970A_ST_WAIT_FOR_TX_FIFO:
1553 case TRF7970A_ST_WAIT_FOR_RX_DATA:
1554 case TRF7970A_ST_WAIT_FOR_RX_DATA_CONT:
1555 case TRF7970A_ST_WAIT_TO_ISSUE_EOF:
1556 trf7970a_send_err_upstream(trf, -ECANCELED);
1557 /* FALLTHROUGH */
1558 case TRF7970A_ST_IDLE:
1559 case TRF7970A_ST_IDLE_RX_BLOCKED:
1560 trf7970a_switch_rf_off(trf);
1561 break;
1562 default:
1563 break;
1564 }
1565
1566 pm_runtime_disable(trf->dev);
1567 pm_runtime_set_suspended(trf->dev);
1568
1569 trf7970a_power_down(trf);
1570 1584
1571 mutex_unlock(&trf->lock); 1585 mutex_unlock(&trf->lock);
1572 1586