/*
 * Copyright (C) 2012 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#define LOG_TAG "libsuspend"

#include <errno.h>
#include <fcntl.h>
#include <stddef.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>

#include <android/log.h>

#include "autosuspend_ops.h"

#define SYS_POWER_AUTOSLEEP "/sys/power/autosleep"

static int autosleep_fd;
static const char *sleep_state = "mem";
static const char *on_state = "off";

static int autosuspend_autosleep_enable(void)
{
    char buf[80];
    int ret;

    ALOGV("autosuspend_autosleep_enable\n");

    ret = TEMP_FAILURE_RETRY(write(autosleep_fd, sleep_state, strlen(sleep_state)));
    if (ret < 0) {
        strerror_r(errno, buf, sizeof(buf));
        ALOGE("Error writing to %s: %s\n", SYS_POWER_AUTOSLEEP, buf);
        goto err;
    }

    ALOGV("autosuspend_autosleep_enable done\n");

    return 0;

err:
    return ret;
}

static int autosuspend_autosleep_disable(void)
{
    char buf[80];
    int ret;

    ALOGV("autosuspend_autosleep_disable\n");

    ret = TEMP_FAILURE_RETRY(write(autosleep_fd, on_state, strlen(on_state)));
    if (ret < 0) {
        strerror_r(errno, buf, sizeof(buf));
        ALOGE("Error writing to %s: %s\n", SYS_POWER_AUTOSLEEP, buf);
        goto err;
    }

    ALOGV("autosuspend_autosleep_disable done\n");

    return 0;

err:
    return ret;
}

struct autosuspend_ops autosuspend_autosleep_ops = {
        .enable = autosuspend_autosleep_enable,
        .disable = autosuspend_autosleep_disable,
};

struct autosuspend_ops *autosuspend_autosleep_init(void)
{
    char buf[80];

    autosleep_fd = TEMP_FAILURE_RETRY(open(SYS_POWER_AUTOSLEEP, O_WRONLY));
    if (autosleep_fd < 0) {
        strerror_r(errno, buf, sizeof(buf));
        ALOGE("Error opening %s: %s\n", SYS_POWER_AUTOSLEEP, buf);
        return NULL;
    }

    ALOGI("Selected autosleep\n");

    autosuspend_autosleep_disable();

    return &autosuspend_autosleep_ops;
}
