@@ -321,17 +321,8 @@ void cros_ec_unregister(struct cros_ec_device *ec_dev)
321
321
EXPORT_SYMBOL (cros_ec_unregister );
322
322
323
323
#ifdef CONFIG_PM_SLEEP
324
- /**
325
- * cros_ec_suspend() - Handle a suspend operation for the ChromeOS EC device.
326
- * @ec_dev: Device to suspend.
327
- *
328
- * This can be called by drivers to handle a suspend event.
329
- *
330
- * Return: 0 on success or negative error code.
331
- */
332
- int cros_ec_suspend (struct cros_ec_device * ec_dev )
324
+ static void cros_ec_send_suspend_event (struct cros_ec_device * ec_dev )
333
325
{
334
- struct device * dev = ec_dev -> dev ;
335
326
int ret ;
336
327
u8 sleep_event ;
337
328
@@ -343,15 +334,62 @@ int cros_ec_suspend(struct cros_ec_device *ec_dev)
343
334
if (ret < 0 )
344
335
dev_dbg (ec_dev -> dev , "Error %d sending suspend event to ec\n" ,
345
336
ret );
337
+ }
346
338
339
+ /**
340
+ * cros_ec_suspend_prepare() - Handle a suspend prepare operation for the ChromeOS EC device.
341
+ * @ec_dev: Device to suspend.
342
+ *
343
+ * This can be called by drivers to handle a suspend prepare stage of suspend.
344
+ *
345
+ * Return: 0 always.
346
+ */
347
+ int cros_ec_suspend_prepare (struct cros_ec_device * ec_dev )
348
+ {
349
+ cros_ec_send_suspend_event (ec_dev );
350
+ return 0 ;
351
+ }
352
+ EXPORT_SYMBOL (cros_ec_suspend_prepare );
353
+
354
+ static void cros_ec_disable_irq (struct cros_ec_device * ec_dev )
355
+ {
356
+ struct device * dev = ec_dev -> dev ;
347
357
if (device_may_wakeup (dev ))
348
358
ec_dev -> wake_enabled = !enable_irq_wake (ec_dev -> irq );
349
359
else
350
360
ec_dev -> wake_enabled = false;
351
361
352
362
disable_irq (ec_dev -> irq );
353
363
ec_dev -> suspended = true;
364
+ }
354
365
366
+ /**
367
+ * cros_ec_suspend_late() - Handle a suspend late operation for the ChromeOS EC device.
368
+ * @ec_dev: Device to suspend.
369
+ *
370
+ * This can be called by drivers to handle a suspend late stage of suspend.
371
+ *
372
+ * Return: 0 always.
373
+ */
374
+ int cros_ec_suspend_late (struct cros_ec_device * ec_dev )
375
+ {
376
+ cros_ec_disable_irq (ec_dev );
377
+ return 0 ;
378
+ }
379
+ EXPORT_SYMBOL (cros_ec_suspend_late );
380
+
381
+ /**
382
+ * cros_ec_suspend() - Handle a suspend operation for the ChromeOS EC device.
383
+ * @ec_dev: Device to suspend.
384
+ *
385
+ * This can be called by drivers to handle a suspend event.
386
+ *
387
+ * Return: 0 always.
388
+ */
389
+ int cros_ec_suspend (struct cros_ec_device * ec_dev )
390
+ {
391
+ cros_ec_send_suspend_event (ec_dev );
392
+ cros_ec_disable_irq (ec_dev );
355
393
return 0 ;
356
394
}
357
395
EXPORT_SYMBOL (cros_ec_suspend );
@@ -370,22 +408,11 @@ static void cros_ec_report_events_during_suspend(struct cros_ec_device *ec_dev)
370
408
}
371
409
}
372
410
373
- /**
374
- * cros_ec_resume() - Handle a resume operation for the ChromeOS EC device.
375
- * @ec_dev: Device to resume.
376
- *
377
- * This can be called by drivers to handle a resume event.
378
- *
379
- * Return: 0 on success or negative error code.
380
- */
381
- int cros_ec_resume (struct cros_ec_device * ec_dev )
411
+ static void cros_ec_send_resume_event (struct cros_ec_device * ec_dev )
382
412
{
383
413
int ret ;
384
414
u8 sleep_event ;
385
415
386
- ec_dev -> suspended = false;
387
- enable_irq (ec_dev -> irq );
388
-
389
416
sleep_event = (!IS_ENABLED (CONFIG_ACPI ) || pm_suspend_via_firmware ()) ?
390
417
HOST_SLEEP_EVENT_S3_RESUME :
391
418
HOST_SLEEP_EVENT_S0IX_RESUME ;
@@ -394,6 +421,24 @@ int cros_ec_resume(struct cros_ec_device *ec_dev)
394
421
if (ret < 0 )
395
422
dev_dbg (ec_dev -> dev , "Error %d sending resume event to ec\n" ,
396
423
ret );
424
+ }
425
+
426
+ /**
427
+ * cros_ec_resume_complete() - Handle a resume complete operation for the ChromeOS EC device.
428
+ * @ec_dev: Device to resume.
429
+ *
430
+ * This can be called by drivers to handle a resume complete stage of resume.
431
+ */
432
+ void cros_ec_resume_complete (struct cros_ec_device * ec_dev )
433
+ {
434
+ cros_ec_send_resume_event (ec_dev );
435
+ }
436
+ EXPORT_SYMBOL (cros_ec_resume_complete );
437
+
438
+ static void cros_ec_enable_irq (struct cros_ec_device * ec_dev )
439
+ {
440
+ ec_dev -> suspended = false;
441
+ enable_irq (ec_dev -> irq );
397
442
398
443
if (ec_dev -> wake_enabled )
399
444
disable_irq_wake (ec_dev -> irq );
@@ -403,8 +448,35 @@ int cros_ec_resume(struct cros_ec_device *ec_dev)
403
448
* suspend. This way the clients know what to do with them.
404
449
*/
405
450
cros_ec_report_events_during_suspend (ec_dev );
451
+ }
406
452
453
+ /**
454
+ * cros_ec_resume_early() - Handle a resume early operation for the ChromeOS EC device.
455
+ * @ec_dev: Device to resume.
456
+ *
457
+ * This can be called by drivers to handle a resume early stage of resume.
458
+ *
459
+ * Return: 0 always.
460
+ */
461
+ int cros_ec_resume_early (struct cros_ec_device * ec_dev )
462
+ {
463
+ cros_ec_enable_irq (ec_dev );
464
+ return 0 ;
465
+ }
466
+ EXPORT_SYMBOL (cros_ec_resume_early );
407
467
468
+ /**
469
+ * cros_ec_resume() - Handle a resume operation for the ChromeOS EC device.
470
+ * @ec_dev: Device to resume.
471
+ *
472
+ * This can be called by drivers to handle a resume event.
473
+ *
474
+ * Return: 0 always.
475
+ */
476
+ int cros_ec_resume (struct cros_ec_device * ec_dev )
477
+ {
478
+ cros_ec_enable_irq (ec_dev );
479
+ cros_ec_send_resume_event (ec_dev );
408
480
return 0 ;
409
481
}
410
482
EXPORT_SYMBOL (cros_ec_resume );
0 commit comments