diff options
author | Sebastian Reichel <sre@kernel.org> | 2016-06-17 18:57:20 -0400 |
---|---|---|
committer | Sebastian Reichel <sre@kernel.org> | 2016-06-27 18:38:32 -0400 |
commit | 866dcb9d57fcad11c2647a154b2b246ac10d0795 (patch) | |
tree | 217d1202616b7056802609b36ffefd0434b75860 | |
parent | 6d6c30973b62f1979e39f5e768b3b31c6dc81c4e (diff) |
HSI: ssi_protocol: replace spin_lock with spin_lock_bh
To avoid setting irq_safe runtime pm flag in omap-ssi, multiple calls
will be moved to process context. This also affects ssi-protocol, so
use the safer spin_lock_bh instead of a simple spin_lock.
Signed-off-by: Sebastian Reichel <sre@kernel.org>
Tested-by: Pavel Machek <pavel@ucw.cz>
-rw-r--r-- | drivers/hsi/clients/ssi_protocol.c | 64 |
1 files changed, 32 insertions, 32 deletions
diff --git a/drivers/hsi/clients/ssi_protocol.c b/drivers/hsi/clients/ssi_protocol.c index 8534efda8140..2388857db14b 100644 --- a/drivers/hsi/clients/ssi_protocol.c +++ b/drivers/hsi/clients/ssi_protocol.c | |||
@@ -520,17 +520,17 @@ static void ssip_start_rx(struct hsi_client *cl) | |||
520 | 520 | ||
521 | dev_dbg(&cl->device, "RX start M(%d) R(%d)\n", ssi->main_state, | 521 | dev_dbg(&cl->device, "RX start M(%d) R(%d)\n", ssi->main_state, |
522 | ssi->recv_state); | 522 | ssi->recv_state); |
523 | spin_lock(&ssi->lock); | 523 | spin_lock_bh(&ssi->lock); |
524 | /* | 524 | /* |
525 | * We can have two UP events in a row due to a short low | 525 | * We can have two UP events in a row due to a short low |
526 | * high transition. Therefore we need to ignore the sencond UP event. | 526 | * high transition. Therefore we need to ignore the sencond UP event. |
527 | */ | 527 | */ |
528 | if ((ssi->main_state != ACTIVE) || (ssi->recv_state == RECV_READY)) { | 528 | if ((ssi->main_state != ACTIVE) || (ssi->recv_state == RECV_READY)) { |
529 | spin_unlock(&ssi->lock); | 529 | spin_unlock_bh(&ssi->lock); |
530 | return; | 530 | return; |
531 | } | 531 | } |
532 | ssip_set_rxstate(ssi, RECV_READY); | 532 | ssip_set_rxstate(ssi, RECV_READY); |
533 | spin_unlock(&ssi->lock); | 533 | spin_unlock_bh(&ssi->lock); |
534 | 534 | ||
535 | msg = ssip_claim_cmd(ssi); | 535 | msg = ssip_claim_cmd(ssi); |
536 | ssip_set_cmd(msg, SSIP_READY_CMD); | 536 | ssip_set_cmd(msg, SSIP_READY_CMD); |
@@ -544,10 +544,10 @@ static void ssip_stop_rx(struct hsi_client *cl) | |||
544 | struct ssi_protocol *ssi = hsi_client_drvdata(cl); | 544 | struct ssi_protocol *ssi = hsi_client_drvdata(cl); |
545 | 545 | ||
546 | dev_dbg(&cl->device, "RX stop M(%d)\n", ssi->main_state); | 546 | dev_dbg(&cl->device, "RX stop M(%d)\n", ssi->main_state); |
547 | spin_lock(&ssi->lock); | 547 | spin_lock_bh(&ssi->lock); |
548 | if (likely(ssi->main_state == ACTIVE)) | 548 | if (likely(ssi->main_state == ACTIVE)) |
549 | ssip_set_rxstate(ssi, RECV_IDLE); | 549 | ssip_set_rxstate(ssi, RECV_IDLE); |
550 | spin_unlock(&ssi->lock); | 550 | spin_unlock_bh(&ssi->lock); |
551 | } | 551 | } |
552 | 552 | ||
553 | static void ssip_free_strans(struct hsi_msg *msg) | 553 | static void ssip_free_strans(struct hsi_msg *msg) |
@@ -564,9 +564,9 @@ static void ssip_strans_complete(struct hsi_msg *msg) | |||
564 | 564 | ||
565 | data = msg->context; | 565 | data = msg->context; |
566 | ssip_release_cmd(msg); | 566 | ssip_release_cmd(msg); |
567 | spin_lock(&ssi->lock); | 567 | spin_lock_bh(&ssi->lock); |
568 | ssip_set_txstate(ssi, SENDING); | 568 | ssip_set_txstate(ssi, SENDING); |
569 | spin_unlock(&ssi->lock); | 569 | spin_unlock_bh(&ssi->lock); |
570 | hsi_async_write(cl, data); | 570 | hsi_async_write(cl, data); |
571 | } | 571 | } |
572 | 572 | ||
@@ -671,17 +671,17 @@ static void ssip_rx_bootinforeq(struct hsi_client *cl, u32 cmd) | |||
671 | /* Fall through */ | 671 | /* Fall through */ |
672 | case INIT: | 672 | case INIT: |
673 | case HANDSHAKE: | 673 | case HANDSHAKE: |
674 | spin_lock(&ssi->lock); | 674 | spin_lock_bh(&ssi->lock); |
675 | ssi->main_state = HANDSHAKE; | 675 | ssi->main_state = HANDSHAKE; |
676 | spin_unlock(&ssi->lock); | 676 | spin_unlock_bh(&ssi->lock); |
677 | 677 | ||
678 | if (!test_and_set_bit(SSIP_WAKETEST_FLAG, &ssi->flags)) | 678 | if (!test_and_set_bit(SSIP_WAKETEST_FLAG, &ssi->flags)) |
679 | ssi_waketest(cl, 1); /* FIXME: To be removed */ | 679 | ssi_waketest(cl, 1); /* FIXME: To be removed */ |
680 | 680 | ||
681 | spin_lock(&ssi->lock); | 681 | spin_lock_bh(&ssi->lock); |
682 | /* Start boot handshake watchdog */ | 682 | /* Start boot handshake watchdog */ |
683 | mod_timer(&ssi->tx_wd, jiffies + msecs_to_jiffies(SSIP_WDTOUT)); | 683 | mod_timer(&ssi->tx_wd, jiffies + msecs_to_jiffies(SSIP_WDTOUT)); |
684 | spin_unlock(&ssi->lock); | 684 | spin_unlock_bh(&ssi->lock); |
685 | dev_dbg(&cl->device, "Send BOOTINFO_RESP\n"); | 685 | dev_dbg(&cl->device, "Send BOOTINFO_RESP\n"); |
686 | if (SSIP_DATA_VERSION(cmd) != SSIP_LOCAL_VERID) | 686 | if (SSIP_DATA_VERSION(cmd) != SSIP_LOCAL_VERID) |
687 | dev_warn(&cl->device, "boot info req verid mismatch\n"); | 687 | dev_warn(&cl->device, "boot info req verid mismatch\n"); |
@@ -703,14 +703,14 @@ static void ssip_rx_bootinforesp(struct hsi_client *cl, u32 cmd) | |||
703 | if (SSIP_DATA_VERSION(cmd) != SSIP_LOCAL_VERID) | 703 | if (SSIP_DATA_VERSION(cmd) != SSIP_LOCAL_VERID) |
704 | dev_warn(&cl->device, "boot info resp verid mismatch\n"); | 704 | dev_warn(&cl->device, "boot info resp verid mismatch\n"); |
705 | 705 | ||
706 | spin_lock(&ssi->lock); | 706 | spin_lock_bh(&ssi->lock); |
707 | if (ssi->main_state != ACTIVE) | 707 | if (ssi->main_state != ACTIVE) |
708 | /* Use tx_wd as a boot watchdog in non ACTIVE state */ | 708 | /* Use tx_wd as a boot watchdog in non ACTIVE state */ |
709 | mod_timer(&ssi->tx_wd, jiffies + msecs_to_jiffies(SSIP_WDTOUT)); | 709 | mod_timer(&ssi->tx_wd, jiffies + msecs_to_jiffies(SSIP_WDTOUT)); |
710 | else | 710 | else |
711 | dev_dbg(&cl->device, "boot info resp ignored M(%d)\n", | 711 | dev_dbg(&cl->device, "boot info resp ignored M(%d)\n", |
712 | ssi->main_state); | 712 | ssi->main_state); |
713 | spin_unlock(&ssi->lock); | 713 | spin_unlock_bh(&ssi->lock); |
714 | } | 714 | } |
715 | 715 | ||
716 | static void ssip_rx_waketest(struct hsi_client *cl, u32 cmd) | 716 | static void ssip_rx_waketest(struct hsi_client *cl, u32 cmd) |
@@ -718,22 +718,22 @@ static void ssip_rx_waketest(struct hsi_client *cl, u32 cmd) | |||
718 | struct ssi_protocol *ssi = hsi_client_drvdata(cl); | 718 | struct ssi_protocol *ssi = hsi_client_drvdata(cl); |
719 | unsigned int wkres = SSIP_PAYLOAD(cmd); | 719 | unsigned int wkres = SSIP_PAYLOAD(cmd); |
720 | 720 | ||
721 | spin_lock(&ssi->lock); | 721 | spin_lock_bh(&ssi->lock); |
722 | if (ssi->main_state != HANDSHAKE) { | 722 | if (ssi->main_state != HANDSHAKE) { |
723 | dev_dbg(&cl->device, "wake lines test ignored M(%d)\n", | 723 | dev_dbg(&cl->device, "wake lines test ignored M(%d)\n", |
724 | ssi->main_state); | 724 | ssi->main_state); |
725 | spin_unlock(&ssi->lock); | 725 | spin_unlock_bh(&ssi->lock); |
726 | return; | 726 | return; |
727 | } | 727 | } |
728 | spin_unlock(&ssi->lock); | 728 | spin_unlock_bh(&ssi->lock); |
729 | 729 | ||
730 | if (test_and_clear_bit(SSIP_WAKETEST_FLAG, &ssi->flags)) | 730 | if (test_and_clear_bit(SSIP_WAKETEST_FLAG, &ssi->flags)) |
731 | ssi_waketest(cl, 0); /* FIXME: To be removed */ | 731 | ssi_waketest(cl, 0); /* FIXME: To be removed */ |
732 | 732 | ||
733 | spin_lock(&ssi->lock); | 733 | spin_lock_bh(&ssi->lock); |
734 | ssi->main_state = ACTIVE; | 734 | ssi->main_state = ACTIVE; |
735 | del_timer(&ssi->tx_wd); /* Stop boot handshake timer */ | 735 | del_timer(&ssi->tx_wd); /* Stop boot handshake timer */ |
736 | spin_unlock(&ssi->lock); | 736 | spin_unlock_bh(&ssi->lock); |
737 | 737 | ||
738 | dev_notice(&cl->device, "WAKELINES TEST %s\n", | 738 | dev_notice(&cl->device, "WAKELINES TEST %s\n", |
739 | wkres & SSIP_WAKETEST_FAILED ? "FAILED" : "OK"); | 739 | wkres & SSIP_WAKETEST_FAILED ? "FAILED" : "OK"); |
@@ -750,20 +750,20 @@ static void ssip_rx_ready(struct hsi_client *cl) | |||
750 | { | 750 | { |
751 | struct ssi_protocol *ssi = hsi_client_drvdata(cl); | 751 | struct ssi_protocol *ssi = hsi_client_drvdata(cl); |
752 | 752 | ||
753 | spin_lock(&ssi->lock); | 753 | spin_lock_bh(&ssi->lock); |
754 | if (unlikely(ssi->main_state != ACTIVE)) { | 754 | if (unlikely(ssi->main_state != ACTIVE)) { |
755 | dev_dbg(&cl->device, "READY on wrong state: S(%d) M(%d)\n", | 755 | dev_dbg(&cl->device, "READY on wrong state: S(%d) M(%d)\n", |
756 | ssi->send_state, ssi->main_state); | 756 | ssi->send_state, ssi->main_state); |
757 | spin_unlock(&ssi->lock); | 757 | spin_unlock_bh(&ssi->lock); |
758 | return; | 758 | return; |
759 | } | 759 | } |
760 | if (ssi->send_state != WAIT4READY) { | 760 | if (ssi->send_state != WAIT4READY) { |
761 | dev_dbg(&cl->device, "Ignore spurious READY command\n"); | 761 | dev_dbg(&cl->device, "Ignore spurious READY command\n"); |
762 | spin_unlock(&ssi->lock); | 762 | spin_unlock_bh(&ssi->lock); |
763 | return; | 763 | return; |
764 | } | 764 | } |
765 | ssip_set_txstate(ssi, SEND_READY); | 765 | ssip_set_txstate(ssi, SEND_READY); |
766 | spin_unlock(&ssi->lock); | 766 | spin_unlock_bh(&ssi->lock); |
767 | ssip_xmit(cl); | 767 | ssip_xmit(cl); |
768 | } | 768 | } |
769 | 769 | ||
@@ -775,22 +775,22 @@ static void ssip_rx_strans(struct hsi_client *cl, u32 cmd) | |||
775 | int len = SSIP_PDU_LENGTH(cmd); | 775 | int len = SSIP_PDU_LENGTH(cmd); |
776 | 776 | ||
777 | dev_dbg(&cl->device, "RX strans: %d frames\n", len); | 777 | dev_dbg(&cl->device, "RX strans: %d frames\n", len); |
778 | spin_lock(&ssi->lock); | 778 | spin_lock_bh(&ssi->lock); |
779 | if (unlikely(ssi->main_state != ACTIVE)) { | 779 | if (unlikely(ssi->main_state != ACTIVE)) { |
780 | dev_err(&cl->device, "START TRANS wrong state: S(%d) M(%d)\n", | 780 | dev_err(&cl->device, "START TRANS wrong state: S(%d) M(%d)\n", |
781 | ssi->send_state, ssi->main_state); | 781 | ssi->send_state, ssi->main_state); |
782 | spin_unlock(&ssi->lock); | 782 | spin_unlock_bh(&ssi->lock); |
783 | return; | 783 | return; |
784 | } | 784 | } |
785 | ssip_set_rxstate(ssi, RECEIVING); | 785 | ssip_set_rxstate(ssi, RECEIVING); |
786 | if (unlikely(SSIP_MSG_ID(cmd) != ssi->rxid)) { | 786 | if (unlikely(SSIP_MSG_ID(cmd) != ssi->rxid)) { |
787 | dev_err(&cl->device, "START TRANS id %d expected %d\n", | 787 | dev_err(&cl->device, "START TRANS id %d expected %d\n", |
788 | SSIP_MSG_ID(cmd), ssi->rxid); | 788 | SSIP_MSG_ID(cmd), ssi->rxid); |
789 | spin_unlock(&ssi->lock); | 789 | spin_unlock_bh(&ssi->lock); |
790 | goto out1; | 790 | goto out1; |
791 | } | 791 | } |
792 | ssi->rxid++; | 792 | ssi->rxid++; |
793 | spin_unlock(&ssi->lock); | 793 | spin_unlock_bh(&ssi->lock); |
794 | skb = netdev_alloc_skb(ssi->netdev, len * 4); | 794 | skb = netdev_alloc_skb(ssi->netdev, len * 4); |
795 | if (unlikely(!skb)) { | 795 | if (unlikely(!skb)) { |
796 | dev_err(&cl->device, "No memory for rx skb\n"); | 796 | dev_err(&cl->device, "No memory for rx skb\n"); |
@@ -858,7 +858,7 @@ static void ssip_swbreak_complete(struct hsi_msg *msg) | |||
858 | struct ssi_protocol *ssi = hsi_client_drvdata(cl); | 858 | struct ssi_protocol *ssi = hsi_client_drvdata(cl); |
859 | 859 | ||
860 | ssip_release_cmd(msg); | 860 | ssip_release_cmd(msg); |
861 | spin_lock(&ssi->lock); | 861 | spin_lock_bh(&ssi->lock); |
862 | if (list_empty(&ssi->txqueue)) { | 862 | if (list_empty(&ssi->txqueue)) { |
863 | if (atomic_read(&ssi->tx_usecnt)) { | 863 | if (atomic_read(&ssi->tx_usecnt)) { |
864 | ssip_set_txstate(ssi, SEND_READY); | 864 | ssip_set_txstate(ssi, SEND_READY); |
@@ -866,9 +866,9 @@ static void ssip_swbreak_complete(struct hsi_msg *msg) | |||
866 | ssip_set_txstate(ssi, SEND_IDLE); | 866 | ssip_set_txstate(ssi, SEND_IDLE); |
867 | hsi_stop_tx(cl); | 867 | hsi_stop_tx(cl); |
868 | } | 868 | } |
869 | spin_unlock(&ssi->lock); | 869 | spin_unlock_bh(&ssi->lock); |
870 | } else { | 870 | } else { |
871 | spin_unlock(&ssi->lock); | 871 | spin_unlock_bh(&ssi->lock); |
872 | ssip_xmit(cl); | 872 | ssip_xmit(cl); |
873 | } | 873 | } |
874 | netif_wake_queue(ssi->netdev); | 874 | netif_wake_queue(ssi->netdev); |
@@ -885,17 +885,17 @@ static void ssip_tx_data_complete(struct hsi_msg *msg) | |||
885 | ssip_error(cl); | 885 | ssip_error(cl); |
886 | goto out; | 886 | goto out; |
887 | } | 887 | } |
888 | spin_lock(&ssi->lock); | 888 | spin_lock_bh(&ssi->lock); |
889 | if (list_empty(&ssi->txqueue)) { | 889 | if (list_empty(&ssi->txqueue)) { |
890 | ssip_set_txstate(ssi, SENDING_SWBREAK); | 890 | ssip_set_txstate(ssi, SENDING_SWBREAK); |
891 | spin_unlock(&ssi->lock); | 891 | spin_unlock_bh(&ssi->lock); |
892 | cmsg = ssip_claim_cmd(ssi); | 892 | cmsg = ssip_claim_cmd(ssi); |
893 | ssip_set_cmd(cmsg, SSIP_SWBREAK_CMD); | 893 | ssip_set_cmd(cmsg, SSIP_SWBREAK_CMD); |
894 | cmsg->complete = ssip_swbreak_complete; | 894 | cmsg->complete = ssip_swbreak_complete; |
895 | dev_dbg(&cl->device, "Send SWBREAK\n"); | 895 | dev_dbg(&cl->device, "Send SWBREAK\n"); |
896 | hsi_async_write(cl, cmsg); | 896 | hsi_async_write(cl, cmsg); |
897 | } else { | 897 | } else { |
898 | spin_unlock(&ssi->lock); | 898 | spin_unlock_bh(&ssi->lock); |
899 | ssip_xmit(cl); | 899 | ssip_xmit(cl); |
900 | } | 900 | } |
901 | out: | 901 | out: |