@@ -525,10 +525,12 @@ static void acpi_ec_clear(struct acpi_ec *ec)
525
525
526
526
static void acpi_ec_enable_event (struct acpi_ec * ec )
527
527
{
528
- spin_lock (& ec -> lock );
528
+ unsigned long flags ;
529
+
530
+ spin_lock_irqsave (& ec -> lock , flags );
529
531
if (acpi_ec_started (ec ))
530
532
__acpi_ec_enable_event (ec );
531
- spin_unlock (& ec -> lock );
533
+ spin_unlock_irqrestore (& ec -> lock , flags );
532
534
533
535
/* Drain additional events if hardware requires that */
534
536
if (EC_FLAGS_CLEAR_ON_RESUME )
@@ -544,9 +546,11 @@ static void __acpi_ec_flush_work(void)
544
546
545
547
static void acpi_ec_disable_event (struct acpi_ec * ec )
546
548
{
547
- spin_lock (& ec -> lock );
549
+ unsigned long flags ;
550
+
551
+ spin_lock_irqsave (& ec -> lock , flags );
548
552
__acpi_ec_disable_event (ec );
549
- spin_unlock (& ec -> lock );
553
+ spin_unlock_irqrestore (& ec -> lock , flags );
550
554
551
555
/*
552
556
* When ec_freeze_events is true, we need to flush events in
@@ -567,9 +571,10 @@ void acpi_ec_flush_work(void)
567
571
568
572
static bool acpi_ec_guard_event (struct acpi_ec * ec )
569
573
{
574
+ unsigned long flags ;
570
575
bool guarded ;
571
576
572
- spin_lock (& ec -> lock );
577
+ spin_lock_irqsave (& ec -> lock , flags );
573
578
/*
574
579
* If firmware SCI_EVT clearing timing is "event", we actually
575
580
* don't know when the SCI_EVT will be cleared by firmware after
@@ -585,29 +590,31 @@ static bool acpi_ec_guard_event(struct acpi_ec *ec)
585
590
guarded = ec_event_clearing == ACPI_EC_EVT_TIMING_EVENT &&
586
591
ec -> event_state != EC_EVENT_READY &&
587
592
(!ec -> curr || ec -> curr -> command != ACPI_EC_COMMAND_QUERY );
588
- spin_unlock (& ec -> lock );
593
+ spin_unlock_irqrestore (& ec -> lock , flags );
589
594
return guarded ;
590
595
}
591
596
592
597
static int ec_transaction_polled (struct acpi_ec * ec )
593
598
{
599
+ unsigned long flags ;
594
600
int ret = 0 ;
595
601
596
- spin_lock (& ec -> lock );
602
+ spin_lock_irqsave (& ec -> lock , flags );
597
603
if (ec -> curr && (ec -> curr -> flags & ACPI_EC_COMMAND_POLL ))
598
604
ret = 1 ;
599
- spin_unlock (& ec -> lock );
605
+ spin_unlock_irqrestore (& ec -> lock , flags );
600
606
return ret ;
601
607
}
602
608
603
609
static int ec_transaction_completed (struct acpi_ec * ec )
604
610
{
611
+ unsigned long flags ;
605
612
int ret = 0 ;
606
613
607
- spin_lock (& ec -> lock );
614
+ spin_lock_irqsave (& ec -> lock , flags );
608
615
if (ec -> curr && (ec -> curr -> flags & ACPI_EC_COMMAND_COMPLETE ))
609
616
ret = 1 ;
610
- spin_unlock (& ec -> lock );
617
+ spin_unlock_irqrestore (& ec -> lock , flags );
611
618
return ret ;
612
619
}
613
620
@@ -749,6 +756,7 @@ static int ec_guard(struct acpi_ec *ec)
749
756
750
757
static int ec_poll (struct acpi_ec * ec )
751
758
{
759
+ unsigned long flags ;
752
760
int repeat = 5 ; /* number of command restarts */
753
761
754
762
while (repeat -- ) {
@@ -757,25 +765,26 @@ static int ec_poll(struct acpi_ec *ec)
757
765
do {
758
766
if (!ec_guard (ec ))
759
767
return 0 ;
760
- spin_lock (& ec -> lock );
768
+ spin_lock_irqsave (& ec -> lock , flags );
761
769
advance_transaction (ec , false);
762
- spin_unlock (& ec -> lock );
770
+ spin_unlock_irqrestore (& ec -> lock , flags );
763
771
} while (time_before (jiffies , delay ));
764
772
pr_debug ("controller reset, restart transaction\n" );
765
- spin_lock (& ec -> lock );
773
+ spin_lock_irqsave (& ec -> lock , flags );
766
774
start_transaction (ec );
767
- spin_unlock (& ec -> lock );
775
+ spin_unlock_irqrestore (& ec -> lock , flags );
768
776
}
769
777
return - ETIME ;
770
778
}
771
779
772
780
static int acpi_ec_transaction_unlocked (struct acpi_ec * ec ,
773
781
struct transaction * t )
774
782
{
783
+ unsigned long tmp ;
775
784
int ret = 0 ;
776
785
777
786
/* start transaction */
778
- spin_lock (& ec -> lock );
787
+ spin_lock_irqsave (& ec -> lock , tmp );
779
788
/* Enable GPE for command processing (IBF=0/OBF=1) */
780
789
if (!acpi_ec_submit_flushable_request (ec )) {
781
790
ret = - EINVAL ;
@@ -786,11 +795,11 @@ static int acpi_ec_transaction_unlocked(struct acpi_ec *ec,
786
795
ec -> curr = t ;
787
796
ec_dbg_req ("Command(%s) started" , acpi_ec_cmd_string (t -> command ));
788
797
start_transaction (ec );
789
- spin_unlock (& ec -> lock );
798
+ spin_unlock_irqrestore (& ec -> lock , tmp );
790
799
791
800
ret = ec_poll (ec );
792
801
793
- spin_lock (& ec -> lock );
802
+ spin_lock_irqsave (& ec -> lock , tmp );
794
803
if (t -> irq_count == ec_storm_threshold )
795
804
acpi_ec_unmask_events (ec );
796
805
ec_dbg_req ("Command(%s) stopped" , acpi_ec_cmd_string (t -> command ));
@@ -799,7 +808,7 @@ static int acpi_ec_transaction_unlocked(struct acpi_ec *ec,
799
808
acpi_ec_complete_request (ec );
800
809
ec_dbg_ref (ec , "Decrease command" );
801
810
unlock :
802
- spin_unlock (& ec -> lock );
811
+ spin_unlock_irqrestore (& ec -> lock , tmp );
803
812
return ret ;
804
813
}
805
814
@@ -927,7 +936,9 @@ EXPORT_SYMBOL(ec_get_handle);
927
936
928
937
static void acpi_ec_start (struct acpi_ec * ec , bool resuming )
929
938
{
930
- spin_lock (& ec -> lock );
939
+ unsigned long flags ;
940
+
941
+ spin_lock_irqsave (& ec -> lock , flags );
931
942
if (!test_and_set_bit (EC_FLAGS_STARTED , & ec -> flags )) {
932
943
ec_dbg_drv ("Starting EC" );
933
944
/* Enable GPE for event processing (SCI_EVT=1) */
@@ -937,28 +948,31 @@ static void acpi_ec_start(struct acpi_ec *ec, bool resuming)
937
948
}
938
949
ec_log_drv ("EC started" );
939
950
}
940
- spin_unlock (& ec -> lock );
951
+ spin_unlock_irqrestore (& ec -> lock , flags );
941
952
}
942
953
943
954
static bool acpi_ec_stopped (struct acpi_ec * ec )
944
955
{
956
+ unsigned long flags ;
945
957
bool flushed ;
946
958
947
- spin_lock (& ec -> lock );
959
+ spin_lock_irqsave (& ec -> lock , flags );
948
960
flushed = acpi_ec_flushed (ec );
949
- spin_unlock (& ec -> lock );
961
+ spin_unlock_irqrestore (& ec -> lock , flags );
950
962
return flushed ;
951
963
}
952
964
953
965
static void acpi_ec_stop (struct acpi_ec * ec , bool suspending )
954
966
{
955
- spin_lock (& ec -> lock );
967
+ unsigned long flags ;
968
+
969
+ spin_lock_irqsave (& ec -> lock , flags );
956
970
if (acpi_ec_started (ec )) {
957
971
ec_dbg_drv ("Stopping EC" );
958
972
set_bit (EC_FLAGS_STOPPED , & ec -> flags );
959
- spin_unlock (& ec -> lock );
973
+ spin_unlock_irqrestore (& ec -> lock , flags );
960
974
wait_event (ec -> wait , acpi_ec_stopped (ec ));
961
- spin_lock (& ec -> lock );
975
+ spin_lock_irqsave (& ec -> lock , flags );
962
976
/* Disable GPE for event processing (SCI_EVT=1) */
963
977
if (!suspending ) {
964
978
acpi_ec_complete_request (ec );
@@ -969,25 +983,29 @@ static void acpi_ec_stop(struct acpi_ec *ec, bool suspending)
969
983
clear_bit (EC_FLAGS_STOPPED , & ec -> flags );
970
984
ec_log_drv ("EC stopped" );
971
985
}
972
- spin_unlock (& ec -> lock );
986
+ spin_unlock_irqrestore (& ec -> lock , flags );
973
987
}
974
988
975
989
static void acpi_ec_enter_noirq (struct acpi_ec * ec )
976
990
{
977
- spin_lock (& ec -> lock );
991
+ unsigned long flags ;
992
+
993
+ spin_lock_irqsave (& ec -> lock , flags );
978
994
ec -> busy_polling = true;
979
995
ec -> polling_guard = 0 ;
980
996
ec_log_drv ("interrupt blocked" );
981
- spin_unlock (& ec -> lock );
997
+ spin_unlock_irqrestore (& ec -> lock , flags );
982
998
}
983
999
984
1000
static void acpi_ec_leave_noirq (struct acpi_ec * ec )
985
1001
{
986
- spin_lock (& ec -> lock );
1002
+ unsigned long flags ;
1003
+
1004
+ spin_lock_irqsave (& ec -> lock , flags );
987
1005
ec -> busy_polling = ec_busy_polling ;
988
1006
ec -> polling_guard = ec_polling_guard ;
989
1007
ec_log_drv ("interrupt unblocked" );
990
- spin_unlock (& ec -> lock );
1008
+ spin_unlock_irqrestore (& ec -> lock , flags );
991
1009
}
992
1010
993
1011
void acpi_ec_block_transactions (void )
@@ -1119,9 +1137,9 @@ static void acpi_ec_event_processor(struct work_struct *work)
1119
1137
1120
1138
ec_dbg_evt ("Query(0x%02x) stopped" , handler -> query_bit );
1121
1139
1122
- spin_lock (& ec -> lock );
1140
+ spin_lock_irq (& ec -> lock );
1123
1141
ec -> queries_in_progress -- ;
1124
- spin_unlock (& ec -> lock );
1142
+ spin_unlock_irq (& ec -> lock );
1125
1143
1126
1144
acpi_ec_put_query_handler (handler );
1127
1145
kfree (q );
@@ -1184,12 +1202,12 @@ static int acpi_ec_submit_query(struct acpi_ec *ec)
1184
1202
*/
1185
1203
ec_dbg_evt ("Query(0x%02x) scheduled" , value );
1186
1204
1187
- spin_lock (& ec -> lock );
1205
+ spin_lock_irq (& ec -> lock );
1188
1206
1189
1207
ec -> queries_in_progress ++ ;
1190
1208
queue_work (ec_query_wq , & q -> work );
1191
1209
1192
- spin_unlock (& ec -> lock );
1210
+ spin_unlock_irq (& ec -> lock );
1193
1211
1194
1212
return 0 ;
1195
1213
@@ -1205,14 +1223,14 @@ static void acpi_ec_event_handler(struct work_struct *work)
1205
1223
1206
1224
ec_dbg_evt ("Event started" );
1207
1225
1208
- spin_lock (& ec -> lock );
1226
+ spin_lock_irq (& ec -> lock );
1209
1227
1210
1228
while (ec -> events_to_process ) {
1211
- spin_unlock (& ec -> lock );
1229
+ spin_unlock_irq (& ec -> lock );
1212
1230
1213
1231
acpi_ec_submit_query (ec );
1214
1232
1215
- spin_lock (& ec -> lock );
1233
+ spin_lock_irq (& ec -> lock );
1216
1234
1217
1235
ec -> events_to_process -- ;
1218
1236
}
@@ -1229,11 +1247,11 @@ static void acpi_ec_event_handler(struct work_struct *work)
1229
1247
1230
1248
ec_dbg_evt ("Event stopped" );
1231
1249
1232
- spin_unlock (& ec -> lock );
1250
+ spin_unlock_irq (& ec -> lock );
1233
1251
1234
1252
guard_timeout = !!ec_guard (ec );
1235
1253
1236
- spin_lock (& ec -> lock );
1254
+ spin_lock_irq (& ec -> lock );
1237
1255
1238
1256
/* Take care of SCI_EVT unless someone else is doing that. */
1239
1257
if (guard_timeout && !ec -> curr )
@@ -1246,7 +1264,7 @@ static void acpi_ec_event_handler(struct work_struct *work)
1246
1264
1247
1265
ec -> events_in_progress -- ;
1248
1266
1249
- spin_unlock (& ec -> lock );
1267
+ spin_unlock_irq (& ec -> lock );
1250
1268
}
1251
1269
1252
1270
static void clear_gpe_and_advance_transaction (struct acpi_ec * ec , bool interrupt )
@@ -1271,11 +1289,13 @@ static void clear_gpe_and_advance_transaction(struct acpi_ec *ec, bool interrupt
1271
1289
1272
1290
static void acpi_ec_handle_interrupt (struct acpi_ec * ec )
1273
1291
{
1274
- spin_lock (& ec -> lock );
1292
+ unsigned long flags ;
1293
+
1294
+ spin_lock_irqsave (& ec -> lock , flags );
1275
1295
1276
1296
clear_gpe_and_advance_transaction (ec , true);
1277
1297
1278
- spin_unlock (& ec -> lock );
1298
+ spin_unlock_irqrestore (& ec -> lock , flags );
1279
1299
}
1280
1300
1281
1301
static u32 acpi_ec_gpe_handler (acpi_handle gpe_device ,
@@ -2085,7 +2105,7 @@ bool acpi_ec_dispatch_gpe(void)
2085
2105
* Dispatch the EC GPE in-band, but do not report wakeup in any case
2086
2106
* to allow the caller to process events properly after that.
2087
2107
*/
2088
- spin_lock (& first_ec -> lock );
2108
+ spin_lock_irq (& first_ec -> lock );
2089
2109
2090
2110
if (acpi_ec_gpe_status_set (first_ec )) {
2091
2111
pm_pr_dbg ("ACPI EC GPE status set\n" );
@@ -2094,7 +2114,7 @@ bool acpi_ec_dispatch_gpe(void)
2094
2114
work_in_progress = acpi_ec_work_in_progress (first_ec );
2095
2115
}
2096
2116
2097
- spin_unlock (& first_ec -> lock );
2117
+ spin_unlock_irq (& first_ec -> lock );
2098
2118
2099
2119
if (!work_in_progress )
2100
2120
return false;
@@ -2107,11 +2127,11 @@ bool acpi_ec_dispatch_gpe(void)
2107
2127
2108
2128
pm_pr_dbg ("ACPI EC work flushed\n" );
2109
2129
2110
- spin_lock (& first_ec -> lock );
2130
+ spin_lock_irq (& first_ec -> lock );
2111
2131
2112
2132
work_in_progress = acpi_ec_work_in_progress (first_ec );
2113
2133
2114
- spin_unlock (& first_ec -> lock );
2134
+ spin_unlock_irq (& first_ec -> lock );
2115
2135
} while (work_in_progress && !pm_wakeup_pending ());
2116
2136
2117
2137
return false;
0 commit comments