1ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/******************************************************************************
2ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *
3ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *  Copyright (C) 2009-2012 Broadcom Corporation
4ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *
5ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *  Licensed under the Apache License, Version 2.0 (the "License");
6ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *  you may not use this file except in compliance with the License.
7ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *  You may obtain a copy of the License at:
8ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *
9ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *  http://www.apache.org/licenses/LICENSE-2.0
10ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *
11ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *  Unless required by applicable law or agreed to in writing, software
12ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *  distributed under the License is distributed on an "AS IS" BASIS,
13ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *  See the License for the specific language governing permissions and
15ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *  limitations under the License.
16ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *
17ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville ******************************************************************************/
18ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
19ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/******************************************************************************
20ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *
21ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *  Filename:      upio.c
22ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *
23ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *  Description:   Contains I/O functions, like
24ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *                      rfkill control
25ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *                      BT_WAKE/HOST_WAKE control
26ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *
27ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville ******************************************************************************/
28ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
29ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#define LOG_TAG "bt_upio"
30ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
31ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#include <utils/Log.h>
32ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#include <fcntl.h>
33ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#include <errno.h>
34ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#include <cutils/properties.h>
35ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#include "bt_vendor_brcm.h"
36ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#include "upio.h"
37ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#include "userial_vendor.h"
38ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
39ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/******************************************************************************
40ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**  Constants & Macros
41ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville******************************************************************************/
42ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
43ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#ifndef UPIO_DBG
44ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#define UPIO_DBG FALSE
45ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#endif
46ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
47ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#if (UPIO_DBG == TRUE)
48ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#define UPIODBG(param, ...) {ALOGD(param, ## __VA_ARGS__);}
49ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#else
50ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#define UPIODBG(param, ...) {}
51ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#endif
52ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
53ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/******************************************************************************
54ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**  Local type definitions
55ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville******************************************************************************/
56ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
5778e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao#if (BT_WAKE_VIA_PROC == TRUE)
5878e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao
5978e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao/* proc fs node for enable/disable lpm mode */
6078e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao#ifndef VENDOR_LPM_PROC_NODE
6178e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao#define VENDOR_LPM_PROC_NODE "/proc/bluetooth/sleep/lpm"
6278e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao#endif
6378e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao
6478e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao/* proc fs node for notifying write request */
6578e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao#ifndef VENDOR_BTWRITE_PROC_NODE
6678e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao#define VENDOR_BTWRITE_PROC_NODE "/proc/bluetooth/sleep/btwrite"
6778e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao#endif
6878e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao
6978e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao/*
7078e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao * Maximum btwrite assertion holding time without consecutive btwrite kicking.
7178e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao * This value is correlative(shorter) to the in-activity timeout period set in
7278e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao * the bluesleep LPM code. The current value used in bluesleep is 10sec.
7378e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao */
7478e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao#ifndef PROC_BTWRITE_TIMER_TIMEOUT_MS
7578e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao#define PROC_BTWRITE_TIMER_TIMEOUT_MS   8000
7678e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao#endif
7778e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao
7878e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao/* lpm proc control block */
7978e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chaotypedef struct
8078e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao{
8178e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao    uint8_t btwrite_active;
8278e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao    uint8_t timer_created;
8378e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao    timer_t timer_id;
8478e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao    uint32_t timeout_ms;
8578e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao} vnd_lpm_proc_cb_t;
8678e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao
8778e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chaostatic vnd_lpm_proc_cb_t lpm_proc_cb;
8878e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao#endif
8978e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao
90ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/******************************************************************************
91ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**  Static variables
92ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville******************************************************************************/
93ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
94ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savillestatic uint8_t upio_state[UPIO_MAX_COUNT];
95ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savillestatic int rfkill_id = -1;
96ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savillestatic int bt_emul_enable = 0;
97ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savillestatic char *rfkill_state_path = NULL;
98ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
99ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/******************************************************************************
100ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**  Static functions
101ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville******************************************************************************/
102ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
103ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/* for friendly debugging outpout string */
10478e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chaostatic char *lpm_mode[] = {
10578e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao    "UNKNOWN",
10678e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao    "disabled",
10778e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao    "enabled"
10878e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao};
10978e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao
110ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savillestatic char *lpm_state[] = {
111ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    "UNKNOWN",
112ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    "de-asserted",
113ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    "asserted"
114ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville};
115ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
116ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/*****************************************************************************
117ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**   Bluetooth On/Off Static Functions
118ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville*****************************************************************************/
119ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savillestatic int is_emulator_context(void)
120ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville{
121ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    char value[PROPERTY_VALUE_MAX];
122ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
123ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    property_get("ro.kernel.qemu", value, "0");
124ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    UPIODBG("is_emulator_context : %s", value);
125ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    if (strcmp(value, "1") == 0) {
126ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        return 1;
127ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    }
128ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    return 0;
129ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville}
130ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
131ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savillestatic int is_rfkill_disabled(void)
132ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville{
133ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    char value[PROPERTY_VALUE_MAX];
134ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
135ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    property_get("ro.rfkilldisabled", value, "0");
136ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    UPIODBG("is_rfkill_disabled ? [%s]", value);
137ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
138ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    if (strcmp(value, "1") == 0) {
139ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        return UPIO_BT_POWER_ON;
140ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    }
141ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
142ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    return UPIO_BT_POWER_OFF;
143ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville}
144ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
145ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savillestatic int init_rfkill()
146ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville{
147ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    char path[64];
148ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    char buf[16];
149ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    int fd, sz, id;
150ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
151ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    if (is_rfkill_disabled())
152ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        return -1;
153ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
154ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    for (id = 0; ; id++)
155ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    {
156ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        snprintf(path, sizeof(path), "/sys/class/rfkill/rfkill%d/type", id);
157ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        fd = open(path, O_RDONLY);
158ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        if (fd < 0)
159ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        {
160ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            ALOGE("init_rfkill : open(%s) failed: %s (%d)\n", \
161ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville                 path, strerror(errno), errno);
162ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            return -1;
163ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        }
164ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
165ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        sz = read(fd, &buf, sizeof(buf));
166ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        close(fd);
167ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
168ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        if (sz >= 9 && memcmp(buf, "bluetooth", 9) == 0)
169ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        {
170ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            rfkill_id = id;
171ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            break;
172ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        }
173ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    }
174ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
175ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    asprintf(&rfkill_state_path, "/sys/class/rfkill/rfkill%d/state", rfkill_id);
176ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    return 0;
177ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville}
178ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
179ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/*****************************************************************************
180ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**   LPM Static Functions
181ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville*****************************************************************************/
182ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
18378e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao#if (BT_WAKE_VIA_PROC == TRUE)
18478e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao/*******************************************************************************
18578e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao**
18678e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao** Function        proc_btwrite_timeout
18778e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao**
18878e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao** Description     Timeout thread of proc/.../btwrite assertion holding timer
18978e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao**
19078e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao** Returns         None
19178e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao**
19278e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao*******************************************************************************/
19378e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chaostatic void proc_btwrite_timeout(union sigval arg)
19478e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao{
19578e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao    UPIODBG("..%s..", __FUNCTION__);
19678e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao    lpm_proc_cb.btwrite_active = FALSE;
19778e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao}
19878e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao#endif
19978e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao
200ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/*****************************************************************************
201ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**   UPIO Interface Functions
202ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville*****************************************************************************/
203ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
204ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/*******************************************************************************
205ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**
206ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville** Function        upio_init
207ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**
208ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville** Description     Initialization
209ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**
210ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville** Returns         None
211ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**
212ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville*******************************************************************************/
213ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savillevoid upio_init(void)
214ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville{
215ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    memset(upio_state, UPIO_UNKNOWN, UPIO_MAX_COUNT);
21678e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao#if (BT_WAKE_VIA_PROC == TRUE)
21778e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao    memset(&lpm_proc_cb, 0, sizeof(vnd_lpm_proc_cb_t));
21878e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao#endif
219ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville}
220ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
221ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/*******************************************************************************
222ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**
223ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville** Function        upio_cleanup
224ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**
225ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville** Description     Clean up
226ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**
227ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville** Returns         None
228ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**
229ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville*******************************************************************************/
230ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savillevoid upio_cleanup(void)
231ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville{
23278e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao#if (BT_WAKE_VIA_PROC == TRUE)
23378e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao    if (lpm_proc_cb.timer_created == TRUE)
23478e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao        timer_delete(lpm_proc_cb.timer_id);
23578e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao
23678e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao    lpm_proc_cb.timer_created = FALSE;
23778e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao#endif
238ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville}
239ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
240ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/*******************************************************************************
241ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**
242ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville** Function        upio_set_bluetooth_power
243ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**
244ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville** Description     Interact with low layer driver to set Bluetooth power
245ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**                 on/off.
246ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**
247ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville** Returns         0  : SUCCESS or Not-Applicable
248ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**                 <0 : ERROR
249ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**
250ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville*******************************************************************************/
251ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savilleint upio_set_bluetooth_power(int on)
252ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville{
253ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    int sz;
254ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    int fd = -1;
255ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    int ret = -1;
256ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    char buffer = '0';
257ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
258ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    switch(on)
259ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    {
260ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        case UPIO_BT_POWER_OFF:
261ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            buffer = '0';
262ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            break;
263ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
264ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        case UPIO_BT_POWER_ON:
265ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            buffer = '1';
266ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            break;
267ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    }
268ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
269ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    if (is_emulator_context())
270ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    {
271ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        /* if new value is same as current, return -1 */
272ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        if (bt_emul_enable == on)
273ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            return ret;
274ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
275ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        UPIODBG("set_bluetooth_power [emul] %d", on);
276ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
277ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        bt_emul_enable = on;
278ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        return 0;
279ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    }
280ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
281ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    /* check if we have rfkill interface */
282ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    if (is_rfkill_disabled())
283ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        return 0;
284ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
285ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    if (rfkill_id == -1)
286ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    {
287ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        if (init_rfkill())
288ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            return ret;
289ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    }
290ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
291ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    fd = open(rfkill_state_path, O_WRONLY);
292ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
293ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    if (fd < 0)
294ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    {
295ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        ALOGE("set_bluetooth_power : open(%s) for write failed: %s (%d)",
296ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            rfkill_state_path, strerror(errno), errno);
297ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        return ret;
298ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    }
299ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
300ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    sz = write(fd, &buffer, 1);
301ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
302ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    if (sz < 0) {
303ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        ALOGE("set_bluetooth_power : write(%s) failed: %s (%d)",
304ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            rfkill_state_path, strerror(errno),errno);
305ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    }
306ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    else
307ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        ret = 0;
308ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
309ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    if (fd >= 0)
310ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        close(fd);
311ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
312ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    return ret;
313ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville}
314ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
315ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
316ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/*******************************************************************************
317ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**
318ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville** Function        upio_set
319ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**
320ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville** Description     Set i/o based on polarity
321ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**
322ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville** Returns         None
323ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**
324ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville*******************************************************************************/
325ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savillevoid upio_set(uint8_t pio, uint8_t action, uint8_t polarity)
326ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville{
327ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    int rc;
32878e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao#if (BT_WAKE_VIA_PROC == TRUE)
32978e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao    int fd = -1;
33078e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao    char buffer;
33178e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao#endif
332ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
333ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    switch (pio)
334ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    {
33578e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao        case UPIO_LPM_MODE:
33678e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao            if (upio_state[UPIO_LPM_MODE] == action)
33778e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao            {
33878e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                UPIODBG("LPM is %s already", lpm_mode[action]);
33978e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                return;
34078e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao            }
34178e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao
34278e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao            upio_state[UPIO_LPM_MODE] = action;
34378e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao
34478e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao#if (BT_WAKE_VIA_PROC == TRUE)
34578e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao            fd = open(VENDOR_LPM_PROC_NODE, O_WRONLY);
34678e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao
34778e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao            if (fd < 0)
34878e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao            {
34978e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                ALOGE("upio_set : open(%s) for write failed: %s (%d)",
35078e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                        VENDOR_LPM_PROC_NODE, strerror(errno), errno);
35178e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                return;
35278e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao            }
35378e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao
35478e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao            if (action == UPIO_ASSERT)
35578e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao            {
35678e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                buffer = '1';
35778e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao            }
35878e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao            else
35978e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao            {
36078e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                buffer = '0';
36178e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao
36278e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                // delete btwrite assertion holding timer
36378e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                if (lpm_proc_cb.timer_created == TRUE)
36478e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                {
36578e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                    timer_delete(lpm_proc_cb.timer_id);
36678e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                    lpm_proc_cb.timer_created = FALSE;
36778e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                }
36878e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao            }
36978e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao
37078e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao            if (write(fd, &buffer, 1) < 0)
37178e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao            {
37278e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                ALOGE("upio_set : write(%s) failed: %s (%d)",
37378e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                        VENDOR_LPM_PROC_NODE, strerror(errno),errno);
37478e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao            }
375822e4da8a67b777df7fa40b00aba434cb94ff601Devin Kim#if (PROC_BTWRITE_TIMER_TIMEOUT_MS != 0)
37678e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao            else
37778e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao            {
37878e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                if (action == UPIO_ASSERT)
37978e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                {
38078e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                    // create btwrite assertion holding timer
38178e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                    if (lpm_proc_cb.timer_created == FALSE)
38278e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                    {
38378e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                        int status;
38478e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                        struct sigevent se;
38578e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao
38678e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                        se.sigev_notify = SIGEV_THREAD;
38778e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                        se.sigev_value.sival_ptr = &lpm_proc_cb.timer_id;
38878e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                        se.sigev_notify_function = proc_btwrite_timeout;
38978e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                        se.sigev_notify_attributes = NULL;
39078e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao
39178e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                        status = timer_create(CLOCK_MONOTONIC, &se,
39278e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                                                &lpm_proc_cb.timer_id);
39378e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao
39478e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                        if (status == 0)
39578e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                            lpm_proc_cb.timer_created = TRUE;
39678e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                    }
39778e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                }
39878e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao            }
399822e4da8a67b777df7fa40b00aba434cb94ff601Devin Kim#endif
400ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
40178e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao            if (fd >= 0)
40278e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                close(fd);
40378e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao#endif
40478e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao            break;
40578e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao
40678e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao        case UPIO_BT_WAKE:
407ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            if (upio_state[UPIO_BT_WAKE] == action)
408ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            {
409ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville                UPIODBG("BT_WAKE is %s already", lpm_state[action]);
41078e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao
41178e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao#if (BT_WAKE_VIA_PROC == TRUE)
41278e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                if (lpm_proc_cb.btwrite_active == TRUE)
41378e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                    /*
41478e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                     * The proc btwrite node could have not been updated for
41578e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                     * certain time already due to heavy downstream path flow.
41678e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                     * In this case, we want to explicity touch proc btwrite
41778e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                     * node to keep the bt_wake assertion in the LPM kernel
41878e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                     * driver. The current kernel bluesleep LPM code starts
41978e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                     * a 10sec internal in-activity timeout timer before it
42078e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                     * attempts to deassert BT_WAKE line.
42178e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                     */
42278e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao#endif
423ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville                return;
424ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            }
425ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
426ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            upio_state[UPIO_BT_WAKE] = action;
427ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
428ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#if (BT_WAKE_VIA_USERIAL_IOCTL == TRUE)
42978e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao
430ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            userial_vendor_ioctl( ( (action==UPIO_ASSERT) ? \
431ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville                      USERIAL_OP_ASSERT_BT_WAKE : USERIAL_OP_DEASSERT_BT_WAKE),\
432ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville                      NULL);
43378e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao
43478e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao#elif (BT_WAKE_VIA_PROC == TRUE)
43578e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao
43678e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao            /*
43778e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao             *  Kick proc btwrite node only at UPIO_ASSERT
43878e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao             */
439a69c3a9b765f246cdded713969f922b40e1dfe15Thomas.TT_Lin#if (BT_WAKE_VIA_PROC_NOTIFY_DEASSERT == FALSE)
44078e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao            if (action == UPIO_DEASSERT)
44178e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                return;
442a69c3a9b765f246cdded713969f922b40e1dfe15Thomas.TT_Lin#endif
44378e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao            fd = open(VENDOR_BTWRITE_PROC_NODE, O_WRONLY);
44478e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao
44578e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao            if (fd < 0)
44678e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao            {
44778e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                ALOGE("upio_set : open(%s) for write failed: %s (%d)",
44878e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                        VENDOR_BTWRITE_PROC_NODE, strerror(errno), errno);
44978e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                return;
45078e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao            }
451a69c3a9b765f246cdded713969f922b40e1dfe15Thomas.TT_Lin#if (BT_WAKE_VIA_PROC_NOTIFY_DEASSERT == TRUE)
452a69c3a9b765f246cdded713969f922b40e1dfe15Thomas.TT_Lin            if (action == UPIO_DEASSERT)
453a69c3a9b765f246cdded713969f922b40e1dfe15Thomas.TT_Lin                buffer = '0';
454a69c3a9b765f246cdded713969f922b40e1dfe15Thomas.TT_Lin            else
455a69c3a9b765f246cdded713969f922b40e1dfe15Thomas.TT_Lin#endif
456a69c3a9b765f246cdded713969f922b40e1dfe15Thomas.TT_Lin                buffer = '1';
45778e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao
45878e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao            if (write(fd, &buffer, 1) < 0)
45978e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao            {
46078e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                ALOGE("upio_set : write(%s) failed: %s (%d)",
46178e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                        VENDOR_BTWRITE_PROC_NODE, strerror(errno),errno);
46278e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao            }
463822e4da8a67b777df7fa40b00aba434cb94ff601Devin Kim#if (PROC_BTWRITE_TIMER_TIMEOUT_MS != 0)
46478e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao            else
46578e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao            {
46678e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                lpm_proc_cb.btwrite_active = TRUE;
46778e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao
46878e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                if (lpm_proc_cb.timer_created == TRUE)
46978e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                {
47078e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                    struct itimerspec ts;
47178e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao
47278e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                    ts.it_value.tv_sec = PROC_BTWRITE_TIMER_TIMEOUT_MS/1000;
47334547bfc4e9b4352de66f7e42f89bcafa58aa3ffMatthew Xie                    ts.it_value.tv_nsec = 1000000*(PROC_BTWRITE_TIMER_TIMEOUT_MS%1000);
47478e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                    ts.it_interval.tv_sec = 0;
47578e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                    ts.it_interval.tv_nsec = 0;
47678e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao
47778e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                    timer_settime(lpm_proc_cb.timer_id, 0, &ts, 0);
47878e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                }
47978e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao            }
480822e4da8a67b777df7fa40b00aba434cb94ff601Devin Kim#endif
48178e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao
48278e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao            UPIODBG("proc btwrite assertion");
48378e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao
48478e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao            if (fd >= 0)
48578e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                close(fd);
486ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#endif
48778e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao
488ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            break;
489ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
490ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        case UPIO_HOST_WAKE:
491ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            UPIODBG("upio_set: UPIO_HOST_WAKE");
492ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            break;
493ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    }
494ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville}
495ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
496ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
497