From 8cdb9cac41707c1ece2e9b5e18defc6399d0058a Mon Sep 17 00:00:00 2001 From: Tushar Janefalkar Date: Sun, 24 Aug 2014 12:21:21 -0700 Subject: [PATCH] Use peripheral mgr to vote for modem power up/down Peripheral manager APIs are now used to vote for modem to be powered up when location is enabled and powered down when location is disabled. If peripheral manager is not supported, the powerup node will be opened and closed to vote CRs-fixed: 655587 Change-Id: I2b865ce1d88bf1a65e3c9b875f24d669579bc61e --- loc_api/libloc_api_50001/Android.mk | 6 +- loc_api/libloc_api_50001/loc.cpp | 139 ++++++++++++++++++++++------ 2 files changed, 116 insertions(+), 29 deletions(-) diff --git a/loc_api/libloc_api_50001/Android.mk b/loc_api/libloc_api_50001/Android.mk index 50019b89..484bcd65 100644 --- a/loc_api/libloc_api_50001/Android.mk +++ b/loc_api/libloc_api_50001/Android.mk @@ -75,7 +75,8 @@ LOCAL_SHARED_LIBRARIES := \ libloc_core \ libgps.utils \ libdl \ - libmdmdetect + libmdmdetect \ + libperipheral_client LOCAL_SRC_FILES += \ loc.cpp \ @@ -93,7 +94,8 @@ endif LOCAL_C_INCLUDES:= \ $(TARGET_OUT_HEADERS)/gps.utils \ $(TARGET_OUT_HEADERS)/libloc_core \ - $(TARGET_OUT_HEADERS)/libmdmdetect/inc + $(TARGET_OUT_HEADERS)/libmdmdetect/inc \ + $(TARGET_OUT_HEADERS)/libperipheralclient/inc LOCAL_PRELINK_MODULE := false LOCAL_MODULE_RELATIVE_PATH := hw diff --git a/loc_api/libloc_api_50001/loc.cpp b/loc_api/libloc_api_50001/loc.cpp index 0b3c943d..b3c267e6 100644 --- a/loc_api/libloc_api_50001/loc.cpp +++ b/loc_api/libloc_api_50001/loc.cpp @@ -44,6 +44,7 @@ #include #include #include +#include #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ @@ -53,6 +54,8 @@ extern "C" { #endif /* __cplusplus */ using namespace loc_core; +#define LOC_PM_CLIENT_NAME "GPS" + //Globals defns static gps_location_callback gps_loc_cb = NULL; static gps_sv_status_callback gps_sv_cb = NULL; @@ -127,9 +130,21 @@ const GpsNiInterface sLocEngNiInterface = loc_ni_respond, }; -// For shutting down MDM in fusion devices -static int mdm_fd = -1; +typedef struct { + //MAX_NAME_LEN defined in mdm_detect.h + char modem_name[MAX_NAME_LEN]; + //MAX_PATH_LEN defined in mdm_detect.h + char powerup_node[MAX_PATH_LEN]; + //this handle is used by peripheral mgr + void *handle; + int mdm_fd; + MdmType mdm_type; + bool peripheral_mgr_supported; + bool peripheral_mgr_registered; +}s_loc_mdm_info; +static s_loc_mdm_info loc_mdm_info; +static void loc_pm_event_notifier(void *client_data, enum pm_event event); static void loc_agps_ril_init( AGpsRilCallbacks* callbacks ); static void loc_agps_ril_set_ref_location(const AGpsRefLocation *agps_reflocation, size_t sz_struct); static void loc_agps_ril_set_set_id(AGpsSetIDType type, const char* setid); @@ -262,7 +277,10 @@ SIDE EFFECTS static int loc_init(GpsCallbacks* callbacks) { int retVal = -1; - int i = 0; + enum pm_event mdm_state; + static int mdm_index = -1; + int peripheral_mgr_ret = PM_RET_FAILED; + ENTRY_LOG(); LOC_API_ADAPTER_EVENT_MASK_T event; @@ -311,7 +329,11 @@ static int loc_init(GpsCallbacks* callbacks) loc_afw_data.adapter->setPowerVote(true); LOC_LOGD("loc_eng_init() success!"); - if (mdm_fd < 0) { + + //if index is 0 or more, then we've looked for mdm already + LOC_LOGD("%s:%d]: mdm_index: %d", __func__, __LINE__, + mdm_index); + if (mdm_index < 0) { struct dev_info modem_info; memset(&modem_info, 0, sizeof(struct dev_info)); if(get_system_info(&modem_info) != RET_SUCCESS) { @@ -319,26 +341,76 @@ static int loc_init(GpsCallbacks* callbacks) __func__, __LINE__); goto err; } - for(i=0; i= 0) { + if(loc_mdm_info.peripheral_mgr_supported == true) { + LOC_LOGD("%s:%d]: Voting for modem power down", __func__, __LINE__); + pm_client_disconnect(loc_mdm_info.handle); + } + else if (loc_mdm_info.mdm_fd >= 0) { LOC_LOGD("closing the powerup node"); - close(mdm_fd); - mdm_fd = -1; + close(loc_mdm_info.mdm_fd); + loc_mdm_info.mdm_fd = -1; LOC_LOGD("finished closing the powerup node"); - } else { + } + else { LOC_LOGD("powerup node has not been opened yet."); } @@ -994,3 +1071,11 @@ static void local_sv_cb(GpsSvStatus* sv_status, void* svExt) } EXIT_LOG(%s, VOID_RET); } + +static void loc_pm_event_notifier(void *client_data, enum pm_event event) +{ + ENTRY_LOG(); + LOC_LOGD("%s:%d]: event: %d", __func__, __LINE__, (int)event); + pm_client_event_acknowledge(loc_mdm_info.handle, event); + EXIT_LOG(%s, VOID_RET); +}