diff options
author | Mark A. Greer <mgreer@animalcreek.com> | 2014-09-02 18:12:36 -0400 |
---|---|---|
committer | Samuel Ortiz <sameo@linux.intel.com> | 2014-09-07 17:13:44 -0400 |
commit | b528281b8b7a9c379baf37720191a799fbc9800c (patch) | |
tree | ccf37ab8ffd3e4f483c11e561d0589ed5d12ab88 /drivers/nfc | |
parent | ceccd6aa50887352e66d0edf68d8be510a639da6 (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.c | 72 |
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 | ||
1388 | static 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 | |||
1403 | static 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 | |||
1388 | static int trf7970a_get_autosuspend_delay(struct device_node *np) | 1426 | static 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 | ||
1532 | err_power_down: | 1566 | err_shutdown: |
1533 | pm_runtime_disable(trf->dev); | 1567 | trf7970a_shutdown(trf); |
1534 | pm_runtime_set_suspended(trf->dev); | ||
1535 | trf7970a_power_down(trf); | ||
1536 | err_free_ddev: | 1568 | err_free_ddev: |
1537 | nfc_digital_free_device(trf->ddev); | 1569 | nfc_digital_free_device(trf->ddev); |
1538 | err_disable_regulator: | 1570 | err_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 | ||