/* SPDX-License-Identifier: GPL-2.0 */ /* * GXP wakelock support * * Copyright (C) 2022 Google LLC */ #ifndef __GXP_WAKELOCK_H__ #define __GXP_WAKELOCK_H__ #include "gxp-internal.h" #include "gxp.h" struct gxp_wakelock_manager { /* Protects count and suspended */ struct mutex lock; uint count; bool suspended; }; /** * gxp_wakelock_init() - Initialize wakelock support * @gxp: The GXP device to initialize wakelock support for * * Return: * * 0 - Success * * -ENOMEM - Insufficient memory is available to initialize support */ int gxp_wakelock_init(struct gxp_dev *gxp); /** * gxp_wakelock_acquire() - Increment the GXP wakelock counter * @gxp: The GXP device to increment the wakelock counter for * * If the wakelock counter transitions from 0 to 1, this will result in BLK_AUR * being powered on. * * Return: * * 0 - Success * * -EAGAIN - The system is suspending and BLK_AUR cannot be powered on * * Other - An attempt to power on BLK_AUR failed */ int gxp_wakelock_acquire(struct gxp_dev *gxp); /** * gxp_wakelock_acquire_if_powered() - Increment the GXP wakelock counter if * the counter is nonzero. * @gxp: The GXP device to increment the wakelock counter for * * Similar to gxp_wakelock_acquire, but only increment the wakelock counter if * the counter is nonzero. * * Return: * * 0 - Success * * -EAGAIN - Wakelock counter is zero * * Other - Error returned by gxp_wakelock_acquire */ int gxp_wakelock_acquire_if_powered(struct gxp_dev *gxp); /** * gxp_wakelock_release() - Decrement the GXP wakelock counter * @gxp: The GXP device to decrement the wakelock counter for * * If the wakelock counter transitions from 1 to 0, this will result in BLK_AUR * being powered off. In the event BLK_AUR cannot be powered off, a message * will be logged, but the wakelock will still be released. */ void gxp_wakelock_release(struct gxp_dev *gxp); /** * gxp_wakelock_suspend() - Check if the wakelock will allow a system suspend * @gxp: The GXP device to check the wakelock of * * Return: * * 0 - The wakelock has been suspended and is ready for system suspend * * -EAGAIN - The wakelock is held, and system suspend should be aborted */ int gxp_wakelock_suspend(struct gxp_dev *gxp); /** * gxp_wakelock_resume() - Notify the wakelock that system suspend has exited * @gxp: The GXP device to notify the wakelock of * * Return: * * 0 - The wakelock is ready to be acquired again */ int gxp_wakelock_resume(struct gxp_dev *gxp); #endif /* __GXP_WAKELOCK_H__ */