Skip to content

Commit eb9299b

Browse files
committed
ACPI: EC: Use a spin lock without disabing interrupts
Since all of the ACPI EC driver code runs in thread context after recent changes, it does not need to disable interrupts on the local CPU when acquiring a spin lock. Make it use the spin lock without disabling interrupts. Signed-off-by: Rafael J. Wysocki <[email protected]>
1 parent 655a6e7 commit eb9299b

File tree

1 file changed

+46
-66
lines changed

1 file changed

+46
-66
lines changed

drivers/acpi/ec.c

Lines changed: 46 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -525,12 +525,10 @@ static void acpi_ec_clear(struct acpi_ec *ec)
525525

526526
static void acpi_ec_enable_event(struct acpi_ec *ec)
527527
{
528-
unsigned long flags;
529-
530-
spin_lock_irqsave(&ec->lock, flags);
528+
spin_lock(&ec->lock);
531529
if (acpi_ec_started(ec))
532530
__acpi_ec_enable_event(ec);
533-
spin_unlock_irqrestore(&ec->lock, flags);
531+
spin_unlock(&ec->lock);
534532

535533
/* Drain additional events if hardware requires that */
536534
if (EC_FLAGS_CLEAR_ON_RESUME)
@@ -546,11 +544,9 @@ static void __acpi_ec_flush_work(void)
546544

547545
static void acpi_ec_disable_event(struct acpi_ec *ec)
548546
{
549-
unsigned long flags;
550-
551-
spin_lock_irqsave(&ec->lock, flags);
547+
spin_lock(&ec->lock);
552548
__acpi_ec_disable_event(ec);
553-
spin_unlock_irqrestore(&ec->lock, flags);
549+
spin_unlock(&ec->lock);
554550

555551
/*
556552
* When ec_freeze_events is true, we need to flush events in
@@ -571,10 +567,9 @@ void acpi_ec_flush_work(void)
571567

572568
static bool acpi_ec_guard_event(struct acpi_ec *ec)
573569
{
574-
unsigned long flags;
575570
bool guarded;
576571

577-
spin_lock_irqsave(&ec->lock, flags);
572+
spin_lock(&ec->lock);
578573
/*
579574
* If firmware SCI_EVT clearing timing is "event", we actually
580575
* don't know when the SCI_EVT will be cleared by firmware after
@@ -590,31 +585,29 @@ static bool acpi_ec_guard_event(struct acpi_ec *ec)
590585
guarded = ec_event_clearing == ACPI_EC_EVT_TIMING_EVENT &&
591586
ec->event_state != EC_EVENT_READY &&
592587
(!ec->curr || ec->curr->command != ACPI_EC_COMMAND_QUERY);
593-
spin_unlock_irqrestore(&ec->lock, flags);
588+
spin_unlock(&ec->lock);
594589
return guarded;
595590
}
596591

597592
static int ec_transaction_polled(struct acpi_ec *ec)
598593
{
599-
unsigned long flags;
600594
int ret = 0;
601595

602-
spin_lock_irqsave(&ec->lock, flags);
596+
spin_lock(&ec->lock);
603597
if (ec->curr && (ec->curr->flags & ACPI_EC_COMMAND_POLL))
604598
ret = 1;
605-
spin_unlock_irqrestore(&ec->lock, flags);
599+
spin_unlock(&ec->lock);
606600
return ret;
607601
}
608602

609603
static int ec_transaction_completed(struct acpi_ec *ec)
610604
{
611-
unsigned long flags;
612605
int ret = 0;
613606

614-
spin_lock_irqsave(&ec->lock, flags);
607+
spin_lock(&ec->lock);
615608
if (ec->curr && (ec->curr->flags & ACPI_EC_COMMAND_COMPLETE))
616609
ret = 1;
617-
spin_unlock_irqrestore(&ec->lock, flags);
610+
spin_unlock(&ec->lock);
618611
return ret;
619612
}
620613

@@ -756,7 +749,6 @@ static int ec_guard(struct acpi_ec *ec)
756749

757750
static int ec_poll(struct acpi_ec *ec)
758751
{
759-
unsigned long flags;
760752
int repeat = 5; /* number of command restarts */
761753

762754
while (repeat--) {
@@ -765,26 +757,25 @@ static int ec_poll(struct acpi_ec *ec)
765757
do {
766758
if (!ec_guard(ec))
767759
return 0;
768-
spin_lock_irqsave(&ec->lock, flags);
760+
spin_lock(&ec->lock);
769761
advance_transaction(ec, false);
770-
spin_unlock_irqrestore(&ec->lock, flags);
762+
spin_unlock(&ec->lock);
771763
} while (time_before(jiffies, delay));
772764
pr_debug("controller reset, restart transaction\n");
773-
spin_lock_irqsave(&ec->lock, flags);
765+
spin_lock(&ec->lock);
774766
start_transaction(ec);
775-
spin_unlock_irqrestore(&ec->lock, flags);
767+
spin_unlock(&ec->lock);
776768
}
777769
return -ETIME;
778770
}
779771

780772
static int acpi_ec_transaction_unlocked(struct acpi_ec *ec,
781773
struct transaction *t)
782774
{
783-
unsigned long tmp;
784775
int ret = 0;
785776

786777
/* start transaction */
787-
spin_lock_irqsave(&ec->lock, tmp);
778+
spin_lock(&ec->lock);
788779
/* Enable GPE for command processing (IBF=0/OBF=1) */
789780
if (!acpi_ec_submit_flushable_request(ec)) {
790781
ret = -EINVAL;
@@ -795,11 +786,11 @@ static int acpi_ec_transaction_unlocked(struct acpi_ec *ec,
795786
ec->curr = t;
796787
ec_dbg_req("Command(%s) started", acpi_ec_cmd_string(t->command));
797788
start_transaction(ec);
798-
spin_unlock_irqrestore(&ec->lock, tmp);
789+
spin_unlock(&ec->lock);
799790

800791
ret = ec_poll(ec);
801792

802-
spin_lock_irqsave(&ec->lock, tmp);
793+
spin_lock(&ec->lock);
803794
if (t->irq_count == ec_storm_threshold)
804795
acpi_ec_unmask_events(ec);
805796
ec_dbg_req("Command(%s) stopped", acpi_ec_cmd_string(t->command));
@@ -808,7 +799,7 @@ static int acpi_ec_transaction_unlocked(struct acpi_ec *ec,
808799
acpi_ec_complete_request(ec);
809800
ec_dbg_ref(ec, "Decrease command");
810801
unlock:
811-
spin_unlock_irqrestore(&ec->lock, tmp);
802+
spin_unlock(&ec->lock);
812803
return ret;
813804
}
814805

@@ -936,9 +927,7 @@ EXPORT_SYMBOL(ec_get_handle);
936927

937928
static void acpi_ec_start(struct acpi_ec *ec, bool resuming)
938929
{
939-
unsigned long flags;
940-
941-
spin_lock_irqsave(&ec->lock, flags);
930+
spin_lock(&ec->lock);
942931
if (!test_and_set_bit(EC_FLAGS_STARTED, &ec->flags)) {
943932
ec_dbg_drv("Starting EC");
944933
/* Enable GPE for event processing (SCI_EVT=1) */
@@ -948,31 +937,28 @@ static void acpi_ec_start(struct acpi_ec *ec, bool resuming)
948937
}
949938
ec_log_drv("EC started");
950939
}
951-
spin_unlock_irqrestore(&ec->lock, flags);
940+
spin_unlock(&ec->lock);
952941
}
953942

954943
static bool acpi_ec_stopped(struct acpi_ec *ec)
955944
{
956-
unsigned long flags;
957945
bool flushed;
958946

959-
spin_lock_irqsave(&ec->lock, flags);
947+
spin_lock(&ec->lock);
960948
flushed = acpi_ec_flushed(ec);
961-
spin_unlock_irqrestore(&ec->lock, flags);
949+
spin_unlock(&ec->lock);
962950
return flushed;
963951
}
964952

965953
static void acpi_ec_stop(struct acpi_ec *ec, bool suspending)
966954
{
967-
unsigned long flags;
968-
969-
spin_lock_irqsave(&ec->lock, flags);
955+
spin_lock(&ec->lock);
970956
if (acpi_ec_started(ec)) {
971957
ec_dbg_drv("Stopping EC");
972958
set_bit(EC_FLAGS_STOPPED, &ec->flags);
973-
spin_unlock_irqrestore(&ec->lock, flags);
959+
spin_unlock(&ec->lock);
974960
wait_event(ec->wait, acpi_ec_stopped(ec));
975-
spin_lock_irqsave(&ec->lock, flags);
961+
spin_lock(&ec->lock);
976962
/* Disable GPE for event processing (SCI_EVT=1) */
977963
if (!suspending) {
978964
acpi_ec_complete_request(ec);
@@ -983,29 +969,25 @@ static void acpi_ec_stop(struct acpi_ec *ec, bool suspending)
983969
clear_bit(EC_FLAGS_STOPPED, &ec->flags);
984970
ec_log_drv("EC stopped");
985971
}
986-
spin_unlock_irqrestore(&ec->lock, flags);
972+
spin_unlock(&ec->lock);
987973
}
988974

989975
static void acpi_ec_enter_noirq(struct acpi_ec *ec)
990976
{
991-
unsigned long flags;
992-
993-
spin_lock_irqsave(&ec->lock, flags);
977+
spin_lock(&ec->lock);
994978
ec->busy_polling = true;
995979
ec->polling_guard = 0;
996980
ec_log_drv("interrupt blocked");
997-
spin_unlock_irqrestore(&ec->lock, flags);
981+
spin_unlock(&ec->lock);
998982
}
999983

1000984
static void acpi_ec_leave_noirq(struct acpi_ec *ec)
1001985
{
1002-
unsigned long flags;
1003-
1004-
spin_lock_irqsave(&ec->lock, flags);
986+
spin_lock(&ec->lock);
1005987
ec->busy_polling = ec_busy_polling;
1006988
ec->polling_guard = ec_polling_guard;
1007989
ec_log_drv("interrupt unblocked");
1008-
spin_unlock_irqrestore(&ec->lock, flags);
990+
spin_unlock(&ec->lock);
1009991
}
1010992

1011993
void acpi_ec_block_transactions(void)
@@ -1137,9 +1119,9 @@ static void acpi_ec_event_processor(struct work_struct *work)
11371119

11381120
ec_dbg_evt("Query(0x%02x) stopped", handler->query_bit);
11391121

1140-
spin_lock_irq(&ec->lock);
1122+
spin_lock(&ec->lock);
11411123
ec->queries_in_progress--;
1142-
spin_unlock_irq(&ec->lock);
1124+
spin_unlock(&ec->lock);
11431125

11441126
acpi_ec_put_query_handler(handler);
11451127
kfree(q);
@@ -1202,12 +1184,12 @@ static int acpi_ec_submit_query(struct acpi_ec *ec)
12021184
*/
12031185
ec_dbg_evt("Query(0x%02x) scheduled", value);
12041186

1205-
spin_lock_irq(&ec->lock);
1187+
spin_lock(&ec->lock);
12061188

12071189
ec->queries_in_progress++;
12081190
queue_work(ec_query_wq, &q->work);
12091191

1210-
spin_unlock_irq(&ec->lock);
1192+
spin_unlock(&ec->lock);
12111193

12121194
return 0;
12131195

@@ -1223,14 +1205,14 @@ static void acpi_ec_event_handler(struct work_struct *work)
12231205

12241206
ec_dbg_evt("Event started");
12251207

1226-
spin_lock_irq(&ec->lock);
1208+
spin_lock(&ec->lock);
12271209

12281210
while (ec->events_to_process) {
1229-
spin_unlock_irq(&ec->lock);
1211+
spin_unlock(&ec->lock);
12301212

12311213
acpi_ec_submit_query(ec);
12321214

1233-
spin_lock_irq(&ec->lock);
1215+
spin_lock(&ec->lock);
12341216

12351217
ec->events_to_process--;
12361218
}
@@ -1247,11 +1229,11 @@ static void acpi_ec_event_handler(struct work_struct *work)
12471229

12481230
ec_dbg_evt("Event stopped");
12491231

1250-
spin_unlock_irq(&ec->lock);
1232+
spin_unlock(&ec->lock);
12511233

12521234
guard_timeout = !!ec_guard(ec);
12531235

1254-
spin_lock_irq(&ec->lock);
1236+
spin_lock(&ec->lock);
12551237

12561238
/* Take care of SCI_EVT unless someone else is doing that. */
12571239
if (guard_timeout && !ec->curr)
@@ -1264,7 +1246,7 @@ static void acpi_ec_event_handler(struct work_struct *work)
12641246

12651247
ec->events_in_progress--;
12661248

1267-
spin_unlock_irq(&ec->lock);
1249+
spin_unlock(&ec->lock);
12681250
}
12691251

12701252
static void clear_gpe_and_advance_transaction(struct acpi_ec *ec, bool interrupt)
@@ -1289,13 +1271,11 @@ static void clear_gpe_and_advance_transaction(struct acpi_ec *ec, bool interrupt
12891271

12901272
static void acpi_ec_handle_interrupt(struct acpi_ec *ec)
12911273
{
1292-
unsigned long flags;
1293-
1294-
spin_lock_irqsave(&ec->lock, flags);
1274+
spin_lock(&ec->lock);
12951275

12961276
clear_gpe_and_advance_transaction(ec, true);
12971277

1298-
spin_unlock_irqrestore(&ec->lock, flags);
1278+
spin_unlock(&ec->lock);
12991279
}
13001280

13011281
static u32 acpi_ec_gpe_handler(acpi_handle gpe_device,
@@ -2105,7 +2085,7 @@ bool acpi_ec_dispatch_gpe(void)
21052085
* Dispatch the EC GPE in-band, but do not report wakeup in any case
21062086
* to allow the caller to process events properly after that.
21072087
*/
2108-
spin_lock_irq(&first_ec->lock);
2088+
spin_lock(&first_ec->lock);
21092089

21102090
if (acpi_ec_gpe_status_set(first_ec)) {
21112091
pm_pr_dbg("ACPI EC GPE status set\n");
@@ -2114,7 +2094,7 @@ bool acpi_ec_dispatch_gpe(void)
21142094
work_in_progress = acpi_ec_work_in_progress(first_ec);
21152095
}
21162096

2117-
spin_unlock_irq(&first_ec->lock);
2097+
spin_unlock(&first_ec->lock);
21182098

21192099
if (!work_in_progress)
21202100
return false;
@@ -2127,11 +2107,11 @@ bool acpi_ec_dispatch_gpe(void)
21272107

21282108
pm_pr_dbg("ACPI EC work flushed\n");
21292109

2130-
spin_lock_irq(&first_ec->lock);
2110+
spin_lock(&first_ec->lock);
21312111

21322112
work_in_progress = acpi_ec_work_in_progress(first_ec);
21332113

2134-
spin_unlock_irq(&first_ec->lock);
2114+
spin_unlock(&first_ec->lock);
21352115
} while (work_in_progress && !pm_wakeup_pending());
21362116

21372117
return false;

0 commit comments

Comments
 (0)