power.c revision b59998fa25f217ba651f6f5a4f1ddcdb0d24b42d
1868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev/*
2868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev * Copyright (C) 2012 The Android Open Source Project
3868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev *
4868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev * Licensed under the Apache License, Version 2.0 (the "License");
5868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev * you may not use this file except in compliance with the License.
6868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev * You may obtain a copy of the License at
7868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev *
8868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev *      http://www.apache.org/licenses/LICENSE-2.0
9868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev *
10868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev * Unless required by applicable law or agreed to in writing, software
11868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev * distributed under the License is distributed on an "AS IS" BASIS,
12868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev * See the License for the specific language governing permissions and
14868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev * limitations under the License.
15868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev */
16868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev#include <errno.h>
17868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev#include <string.h>
18868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev#include <sys/types.h>
19868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev#include <sys/stat.h>
20868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev#include <sys/socket.h>
21868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev#include <sys/un.h>
22868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev#include <fcntl.h>
23868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev#include <dlfcn.h>
24868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev
25b59998fa25f217ba651f6f5a4f1ddcdb0d24b42dIliyan Malchev#define LOG_TAG "PowerHAL"
26868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev#include <utils/Log.h>
27868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev
28868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev#include <hardware/hardware.h>
29868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev#include <hardware/power.h>
30868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev#define TOUCHBOOST_SOCKET       "/dev/socket/mpdecision/touchboost"
31868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev
32b59998fa25f217ba651f6f5a4f1ddcdb0d24b42dIliyan Malchevstatic int client_sockfd;
33b59998fa25f217ba651f6f5a4f1ddcdb0d24b42dIliyan Malchevstatic struct sockaddr_un client_addr;
34868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev
35b59998fa25f217ba651f6f5a4f1ddcdb0d24b42dIliyan Malchevstatic void power_init(struct power_module *module)
36868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev{
37b59998fa25f217ba651f6f5a4f1ddcdb0d24b42dIliyan Malchev    ALOGI("%s", __func__);
38b59998fa25f217ba651f6f5a4f1ddcdb0d24b42dIliyan Malchev    client_sockfd = socket(PF_UNIX, SOCK_DGRAM, 0);
39b59998fa25f217ba651f6f5a4f1ddcdb0d24b42dIliyan Malchev    if (client_sockfd < 0) {
40b59998fa25f217ba651f6f5a4f1ddcdb0d24b42dIliyan Malchev        ALOGE("%s: failed to open: %s", __func__, strerror(errno));
41868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev        return;
42868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev    }
43868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev    memset(&client_addr, 0, sizeof(struct sockaddr_un));
44868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev    client_addr.sun_family = AF_UNIX;
45868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev    snprintf(client_addr.sun_path, UNIX_PATH_MAX, TOUCHBOOST_SOCKET);
46b59998fa25f217ba651f6f5a4f1ddcdb0d24b42dIliyan Malchev}
47868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev
48b59998fa25f217ba651f6f5a4f1ddcdb0d24b42dIliyan Malchevstatic void touch_boost()
49b59998fa25f217ba651f6f5a4f1ddcdb0d24b42dIliyan Malchev{
50b59998fa25f217ba651f6f5a4f1ddcdb0d24b42dIliyan Malchev    int rc;
51868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev
52b59998fa25f217ba651f6f5a4f1ddcdb0d24b42dIliyan Malchev    if (client_sockfd < 0) {
53b59998fa25f217ba651f6f5a4f1ddcdb0d24b42dIliyan Malchev        ALOGE("%s: touchboost socket not created", __func__);
54b59998fa25f217ba651f6f5a4f1ddcdb0d24b42dIliyan Malchev        return;
55868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev    }
56868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev
57b59998fa25f217ba651f6f5a4f1ddcdb0d24b42dIliyan Malchev    rc = sendto(client_sockfd, "1", 1, 0, (const struct sockaddr *)&client_addr, sizeof(struct sockaddr_un));
58b59998fa25f217ba651f6f5a4f1ddcdb0d24b42dIliyan Malchev    if (rc < 0) {
59b59998fa25f217ba651f6f5a4f1ddcdb0d24b42dIliyan Malchev        ALOGE("%s: failed to send: %s", __func__, strerror(errno));
60868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev    }
61868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev}
62868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev
63b59998fa25f217ba651f6f5a4f1ddcdb0d24b42dIliyan Malchevstatic void power_set_interactive(struct power_module *module, int on)
64b59998fa25f217ba651f6f5a4f1ddcdb0d24b42dIliyan Malchev{
65b59998fa25f217ba651f6f5a4f1ddcdb0d24b42dIliyan Malchev    ALOGV("%s %s", __func__, (on ? "ON" : "OFF"));
66b59998fa25f217ba651f6f5a4f1ddcdb0d24b42dIliyan Malchev    if (on)
67b59998fa25f217ba651f6f5a4f1ddcdb0d24b42dIliyan Malchev        touch_boost();
68b59998fa25f217ba651f6f5a4f1ddcdb0d24b42dIliyan Malchev}
69b59998fa25f217ba651f6f5a4f1ddcdb0d24b42dIliyan Malchev
70868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchevstatic void power_hint(struct power_module *module, power_hint_t hint,
71868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev                       void *data) {
72868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev    switch (hint) {
73868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev        case POWER_HINT_INTERACTION:
74b59998fa25f217ba651f6f5a4f1ddcdb0d24b42dIliyan Malchev            ALOGV("POWER_HINT_INTERACTION");
75868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev            touch_boost();
76b59998fa25f217ba651f6f5a4f1ddcdb0d24b42dIliyan Malchev            break;
77b59998fa25f217ba651f6f5a4f1ddcdb0d24b42dIliyan Malchev#if 0
78b59998fa25f217ba651f6f5a4f1ddcdb0d24b42dIliyan Malchev        case POWER_HINT_VSYNC:
79b59998fa25f217ba651f6f5a4f1ddcdb0d24b42dIliyan Malchev            ALOGV("POWER_HINT_VSYNC %s", (data ? "ON" : "OFF"));
80b59998fa25f217ba651f6f5a4f1ddcdb0d24b42dIliyan Malchev            break;
81b59998fa25f217ba651f6f5a4f1ddcdb0d24b42dIliyan Malchev#endif
82868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev        default:
83868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev             break;
84868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev    }
85868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev}
86868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev
87868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchevstatic struct hw_module_methods_t power_module_methods = {
88868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev    .open = NULL,
89868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev};
90868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev
91868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchevstruct power_module HAL_MODULE_INFO_SYM = {
92868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev    .common = {
93868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev        .tag = HARDWARE_MODULE_TAG,
94868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev        .module_api_version = POWER_MODULE_API_VERSION_0_2,
95868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev        .hal_api_version = HARDWARE_HAL_API_VERSION,
96868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev        .id = POWER_HARDWARE_MODULE_ID,
97868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev        .name = "Qualcomm Power HAL",
98868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev        .author = "The Android Open Source Project",
99868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev        .methods = &power_module_methods,
100868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev    },
101868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev
102868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev    .init = power_init,
103868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev    .setInteractive = power_set_interactive,
104868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev    .powerHint = power_hint,
105868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev};
106