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