power.c revision 868f7635b2b57d883a3978b3837a58aecc0d7131
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
25868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev#define LOG_TAG "Qualcomm 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
32868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchevstatic void power_init(struct power_module *module)
33868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev{
34868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev}
35868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev
36868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchevstatic void power_set_interactive(struct power_module *module, int on)
37868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev{
38868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev}
39868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev
40868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchevstatic void touch_boost()
41868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev{
42868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev    static int client_comsoc = -1;
43868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev    static struct sockaddr_un client_addr;
44868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev    int rc = 0;
45868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev
46868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev    client_comsoc = socket(PF_UNIX, SOCK_DGRAM, 0);
47868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev
48868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev    if (client_comsoc < 0) {
49868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev        return;
50868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev    }
51868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev
52868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev    memset(&client_addr, 0, sizeof(struct sockaddr_un));
53868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev    client_addr.sun_family = AF_UNIX;
54868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev    snprintf(client_addr.sun_path, UNIX_PATH_MAX, TOUCHBOOST_SOCKET);
55868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev
56868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev    rc = sendto(client_comsoc, "1", 1, 0, (const struct sockaddr *)&client_addr, sizeof(struct sockaddr_un));
57868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev
58868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev    if (rc == -1) {
59868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev        ALOGE("Failed to send rc=%d", rc);
60868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev    }
61868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev
62868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev    if (client_comsoc >= 0) {
63868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev        close(client_comsoc);
64868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev        client_comsoc = -1;
65868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev    }
66868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev}
67868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev
68868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchevstatic void power_hint(struct power_module *module, power_hint_t hint,
69868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev                       void *data) {
70868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev    switch (hint) {
71868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev
72868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev        case POWER_HINT_INTERACTION:
73868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev            touch_boost();
74868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev	    break;
75868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev        default:
76868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev             break;
77868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev    }
78868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev}
79868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev
80868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchevstatic struct hw_module_methods_t power_module_methods = {
81868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev    .open = NULL,
82868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev};
83868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev
84868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchevstruct power_module HAL_MODULE_INFO_SYM = {
85868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev    .common = {
86868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev        .tag = HARDWARE_MODULE_TAG,
87868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev        .module_api_version = POWER_MODULE_API_VERSION_0_2,
88868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev        .hal_api_version = HARDWARE_HAL_API_VERSION,
89868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev        .id = POWER_HARDWARE_MODULE_ID,
90868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev        .name = "Qualcomm Power HAL",
91868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev        .author = "The Android Open Source Project",
92868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev        .methods = &power_module_methods,
93868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev    },
94868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev
95868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev    .init = power_init,
96868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev    .setInteractive = power_set_interactive,
97868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev    .powerHint = power_hint,
98868f7635b2b57d883a3978b3837a58aecc0d7131Iliyan Malchev};
99