1a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross/* 2a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross * Copyright (C) 2012 The Android Open Source Project 3a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross * 4a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross * Licensed under the Apache License, Version 2.0 (the "License"); 5a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross * you may not use this file except in compliance with the License. 6a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross * You may obtain a copy of the License at 7a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross * 8a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross * http://www.apache.org/licenses/LICENSE-2.0 9a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross * 10a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross * Unless required by applicable law or agreed to in writing, software 11a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross * distributed under the License is distributed on an "AS IS" BASIS, 12a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross * See the License for the specific language governing permissions and 14a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross * limitations under the License. 15a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross */ 16a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross 17a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross#include <stdbool.h> 18a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross 19a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross#define LOG_TAG "libsuspend" 20a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross#include <cutils/log.h> 21a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross 22a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross#include <suspend/autosuspend.h> 23a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross 24a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross#include "autosuspend_ops.h" 25a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross 26a2582c2c4d20684b21aaf50913a27239789bf5ebColin Crossstatic struct autosuspend_ops *autosuspend_ops; 27a2582c2c4d20684b21aaf50913a27239789bf5ebColin Crossstatic bool autosuspend_enabled; 28a2582c2c4d20684b21aaf50913a27239789bf5ebColin Crossstatic bool autosuspend_inited; 29a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross 30a2582c2c4d20684b21aaf50913a27239789bf5ebColin Crossstatic int autosuspend_init(void) 31a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross{ 32a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross if (autosuspend_inited) { 33a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross return 0; 34a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross } 35a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross 36a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross autosuspend_inited = true; 37a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross 38a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross autosuspend_ops = autosuspend_earlysuspend_init(); 39a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross if (autosuspend_ops) { 40a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross goto out; 41a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross } 42a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross 43a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross autosuspend_ops = autosuspend_autosleep_init(); 44a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross if (autosuspend_ops) { 45a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross goto out; 46a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross } 47a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross 48a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross autosuspend_ops = autosuspend_wakeup_count_init(); 49a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross if (autosuspend_ops) { 50a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross goto out; 51a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross } 52a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross 53a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross if (!autosuspend_ops) { 54a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross ALOGE("failed to initialize autosuspend\n"); 55a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross return -1; 56a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross } 57a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross 58a2582c2c4d20684b21aaf50913a27239789bf5ebColin Crossout: 59a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross ALOGV("autosuspend initialized\n"); 60a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross return 0; 61a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross} 62a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross 63a2582c2c4d20684b21aaf50913a27239789bf5ebColin Crossint autosuspend_enable(void) 64a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross{ 65a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross int ret; 66a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross 67a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross ret = autosuspend_init(); 68a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross if (ret) { 69a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross return ret; 70a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross } 71a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross 72a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross ALOGV("autosuspend_enable\n"); 73a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross 74a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross if (autosuspend_enabled) { 75a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross return 0; 76a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross } 77a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross 78a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross ret = autosuspend_ops->enable(); 79a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross if (ret) { 80a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross return ret; 81a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross } 82a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross 83a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross autosuspend_enabled = true; 84a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross return 0; 85a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross} 86a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross 87a2582c2c4d20684b21aaf50913a27239789bf5ebColin Crossint autosuspend_disable(void) 88a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross{ 89a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross int ret; 90a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross 91a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross ret = autosuspend_init(); 92a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross if (ret) { 93a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross return ret; 94a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross } 95a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross 96a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross ALOGV("autosuspend_disable\n"); 97a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross 98a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross if (!autosuspend_enabled) { 99a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross return 0; 100a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross } 101a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross 102a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross ret = autosuspend_ops->disable(); 103a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross if (ret) { 104a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross return ret; 105a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross } 106a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross 107a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross autosuspend_enabled = false; 108a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross return 0; 109a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross} 110