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