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 <errno.h> 18a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross#include <fcntl.h> 19a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross#include <stddef.h> 20a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross#include <string.h> 21a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross#include <sys/stat.h> 22a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross#include <sys/types.h> 23a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross#include <unistd.h> 24a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross 25a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross#define LOG_TAG "libsuspend" 26a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross#include <cutils/log.h> 27a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross 28a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross#include "autosuspend_ops.h" 29a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross 30a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross#define SYS_POWER_AUTOSLEEP "/sys/power/autosleep" 31a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross 32a2582c2c4d20684b21aaf50913a27239789bf5ebColin Crossstatic int autosleep_fd; 33a2582c2c4d20684b21aaf50913a27239789bf5ebColin Crossstatic const char *sleep_state = "mem"; 34a2582c2c4d20684b21aaf50913a27239789bf5ebColin Crossstatic const char *on_state = "off"; 35a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross 36a2582c2c4d20684b21aaf50913a27239789bf5ebColin Crossstatic int autosuspend_autosleep_enable(void) 37a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross{ 38a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross char buf[80]; 39a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross int ret; 40a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross 41a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross ALOGV("autosuspend_autosleep_enable\n"); 42a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross 43a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross ret = write(autosleep_fd, sleep_state, strlen(sleep_state)); 44a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross if (ret < 0) { 45a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross strerror_r(errno, buf, sizeof(buf)); 46a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross ALOGE("Error writing to %s: %s\n", SYS_POWER_AUTOSLEEP, buf); 47a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross goto err; 48a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross } 49a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross 50a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross ALOGV("autosuspend_autosleep_enable done\n"); 51a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross 52a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross return 0; 53a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross 54a2582c2c4d20684b21aaf50913a27239789bf5ebColin Crosserr: 55a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross return ret; 56a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross} 57a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross 58a2582c2c4d20684b21aaf50913a27239789bf5ebColin Crossstatic int autosuspend_autosleep_disable(void) 59a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross{ 60a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross char buf[80]; 61a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross int ret; 62a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross 63a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross ALOGV("autosuspend_autosleep_disable\n"); 64a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross 65a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross ret = write(autosleep_fd, on_state, strlen(on_state)); 66a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross if (ret < 0) { 67a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross strerror_r(errno, buf, sizeof(buf)); 68a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross ALOGE("Error writing to %s: %s\n", SYS_POWER_AUTOSLEEP, buf); 69a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross goto err; 70a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross } 71a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross 72a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross ALOGV("autosuspend_autosleep_disable done\n"); 73a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross 74a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross return 0; 75a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross 76a2582c2c4d20684b21aaf50913a27239789bf5ebColin Crosserr: 77a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross return ret; 78a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross} 79a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross 80a2582c2c4d20684b21aaf50913a27239789bf5ebColin Crossstruct autosuspend_ops autosuspend_autosleep_ops = { 81a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross .enable = autosuspend_autosleep_enable, 82a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross .disable = autosuspend_autosleep_disable, 83a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross}; 84a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross 85a2582c2c4d20684b21aaf50913a27239789bf5ebColin Crossstruct autosuspend_ops *autosuspend_autosleep_init(void) 86a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross{ 87a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross int ret; 88a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross char buf[80]; 89a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross 90a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross autosleep_fd = open(SYS_POWER_AUTOSLEEP, O_WRONLY); 91a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross if (autosleep_fd < 0) { 92a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross strerror_r(errno, buf, sizeof(buf)); 93a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross ALOGE("Error opening %s: %s\n", SYS_POWER_AUTOSLEEP, buf); 94a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross return NULL; 95a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross } 96a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross 97a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross ALOGI("Selected autosleep\n"); 98b98865586bcf7779150c461b64e4fe49972f6351Colin Cross 99b98865586bcf7779150c461b64e4fe49972f6351Colin Cross autosuspend_autosleep_disable(); 100b98865586bcf7779150c461b64e4fe49972f6351Colin Cross 101a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross return &autosuspend_autosleep_ops; 102a2582c2c4d20684b21aaf50913a27239789bf5ebColin Cross} 103