@@ -321,17 +321,8 @@ void cros_ec_unregister(struct cros_ec_device *ec_dev)
321321EXPORT_SYMBOL (cros_ec_unregister );
322322
323323#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 )
333325{
334- struct device * dev = ec_dev -> dev ;
335326 int ret ;
336327 u8 sleep_event ;
337328
@@ -343,15 +334,62 @@ int cros_ec_suspend(struct cros_ec_device *ec_dev)
343334 if (ret < 0 )
344335 dev_dbg (ec_dev -> dev , "Error %d sending suspend event to ec\n" ,
345336 ret );
337+ }
346338
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 ;
347357 if (device_may_wakeup (dev ))
348358 ec_dev -> wake_enabled = !enable_irq_wake (ec_dev -> irq );
349359 else
350360 ec_dev -> wake_enabled = false;
351361
352362 disable_irq (ec_dev -> irq );
353363 ec_dev -> suspended = true;
364+ }
354365
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 );
355393 return 0 ;
356394}
357395EXPORT_SYMBOL (cros_ec_suspend );
@@ -370,22 +408,11 @@ static void cros_ec_report_events_during_suspend(struct cros_ec_device *ec_dev)
370408 }
371409}
372410
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 )
382412{
383413 int ret ;
384414 u8 sleep_event ;
385415
386- ec_dev -> suspended = false;
387- enable_irq (ec_dev -> irq );
388-
389416 sleep_event = (!IS_ENABLED (CONFIG_ACPI ) || pm_suspend_via_firmware ()) ?
390417 HOST_SLEEP_EVENT_S3_RESUME :
391418 HOST_SLEEP_EVENT_S0IX_RESUME ;
@@ -394,6 +421,24 @@ int cros_ec_resume(struct cros_ec_device *ec_dev)
394421 if (ret < 0 )
395422 dev_dbg (ec_dev -> dev , "Error %d sending resume event to ec\n" ,
396423 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 );
397442
398443 if (ec_dev -> wake_enabled )
399444 disable_irq_wake (ec_dev -> irq );
@@ -403,8 +448,35 @@ int cros_ec_resume(struct cros_ec_device *ec_dev)
403448 * suspend. This way the clients know what to do with them.
404449 */
405450 cros_ec_report_events_during_suspend (ec_dev );
451+ }
406452
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 );
407467
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 );
408480 return 0 ;
409481}
410482EXPORT_SYMBOL (cros_ec_resume );
0 commit comments