Une fonction que j'ai ecrite pour le kernel linux dont je suis le plus fier:
static volatile uint8_t gros_truc_crade_pour_pas_tomber_en_veille;
void prevent_suspend_by_gros_truc_crade(void)
{
gros_truc_crade_pour_pas_tomber_en_veille = 1;
}
EXPORT_SYMBOL_GPL(prevent_suspend_by_gros_truc_crade);
[...]
int suspend_devices_and_enter(suspend_state_t state)
{
int error;
gros_truc_crade_pour_pas_tomber_en_veille = 0; // Unarm it.
[...]
}
[...]
int suspend_devices_and_enter(suspend_state_t state)
{
if (suspend_test(TEST_DEVICES))
goto Recover_platform;
if (gros_truc_crade_pour_pas_tomber_en_veille == 1)
{
printk(KERN_ERR "PM: Some devices tell me to not suspend GTCBM\n");
goto Recover_platform;
}
suspend_enter(state);
[...]
Recover_platform:
[...]
}
Pour l'histoire
En gros sur la dite plateform, il y a, de pas la facon dont marche le soft (cad merdiquement) une race condition sur la mise en veille et gestion des boutons/ints.
Il arrive que lors de la tombé en veille l'utilisateur pousse un bouton, probleme, ca va etre ignoré de par l'architecture du truc. Donc en gros, cette function est utilisé par les driver de gestion des boutons et autres choses qui ne doivent pas etre ignoré et empecher la machine de tomber en veille si l'appuis sur le bouton arrive lors de la tentative de mise en veille (d'ou le desarmement quand on a un appel a "suspend_devices_and_enter".