aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Reichel <sre@kernel.org>2016-06-17 18:57:20 -0400
committerSebastian Reichel <sre@kernel.org>2016-06-27 18:38:32 -0400
commit866dcb9d57fcad11c2647a154b2b246ac10d0795 (patch)
tree217d1202616b7056802609b36ffefd0434b75860
parent6d6c30973b62f1979e39f5e768b3b31c6dc81c4e (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.c64
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
553static void ssip_free_strans(struct hsi_msg *msg) 553static 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
716static void ssip_rx_waketest(struct hsi_client *cl, u32 cmd) 716static 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 }
901out: 901out: