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