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