drivers: nanohub: send nanohub log to hal if sensorhal is alive.

BUG: 112289111

Descriptions:

When sensorservice is not started, the nanohub log will stuck in the
kernel sensor event buffer and cannot receive new event from sensorhub,
including fuel gauge event. So we need to just print the log to kernel
log and release the event.

Change-Id: Ie2e9dadacea5675b0a338b312f5479a896e62c6b
Signed-off-by: Fanming Kong <fmkong@mobvoi.com>
diff --git a/drivers/staging/nanohub/bq27xxx_fuelgauge.c b/drivers/staging/nanohub/bq27xxx_fuelgauge.c
index 19d84e7..6a1e109 100644
--- a/drivers/staging/nanohub/bq27xxx_fuelgauge.c
+++ b/drivers/staging/nanohub/bq27xxx_fuelgauge.c
@@ -135,12 +135,13 @@
 	if (!(strnstr(saved_command_line, "androidboot.mode=keep_charging",
 		strlen(saved_command_line)))) {
 		if ((fg_info->cache.voltage > 4000)
-		&& (strnstr(saved_command_line, "androidboot.mode=charger",
-			strlen(saved_command_line)))) {
-			pr_err("fg_info->cache.voltage %d more than 4V reboot the system\n",
-			fg_info->cache.voltage);
-			machine_restart(NULL);
-	}
+			&& (strnstr(saved_command_line,
+						"androidboot.mode=charger",
+						strlen(saved_command_line)))) {
+				pr_err("fg_info->cache.voltage %d more than 4V reboot the system\n",
+				fg_info->cache.voltage);
+				machine_restart(NULL);
+		}
 	}
 	if (fg_info->last_capacity != fg_info->cache.capacity) {
 		if ((charger_online &&
@@ -337,54 +338,6 @@
 	return 0;
 }
 
-int enable_fuelgauge(struct nanohub_data *data, int on)
-{
-	int ret;
-
-	struct ConfigCmd mConfigCmd;
-	uint8_t *pConfigCmdBuffer = NULL;
-	size_t length = sizeof(mConfigCmd);
-	struct FuelGaugeCfgData fuelgaugeCfgData;
-
-	mConfigCmd.evtType = EVT_NO_SENSOR_CONFIG_EVENT;
-	mConfigCmd.rate = 0;
-	mConfigCmd.latency = 0;
-	mConfigCmd.cmd = CONFIG_CMD_CFG_DATA;
-	mConfigCmd.flags = 0;
-	mConfigCmd.sensorType = SENS_TYPE_FUELGAUGE;
-
-	length = sizeof(struct ConfigCmd) + sizeof(struct FuelGaugeCfgData);
-
-	fuelgaugeCfgData.interval = poll_interval;
-	fuelgaugeCfgData.on = on;
-
-	pConfigCmdBuffer = kzalloc(length, GFP_KERNEL);
-	if (!pConfigCmdBuffer)
-		return -ENOMEM;
-	memcpy(pConfigCmdBuffer, &mConfigCmd, sizeof(mConfigCmd));
-	memcpy(&pConfigCmdBuffer[sizeof(mConfigCmd)], &fuelgaugeCfgData,
-		sizeof(fuelgaugeCfgData));
-
-	ret = request_wakeup_timeout(data, WAKEUP_TIMEOUT_MS);
-	if (ret) {
-		pr_err("nanohub: [FG] failed to take wakeup lock. %d\n", ret);
-		if (NULL != pConfigCmdBuffer)
-			kfree(pConfigCmdBuffer);
-		return ret;
-	}
-	ret = nanohub_comms_write(data, pConfigCmdBuffer, length);
-	if (ret != length)
-		pr_err("nanohub: [FG]error for write config cmd buffer. %d != %d\n",
-			ret, length);
-
-	release_wakeup(data);
-
-	if (NULL != pConfigCmdBuffer)
-		kfree(pConfigCmdBuffer);
-	return ret;
-}
-
-
 static int request_fuel_gauge_data(struct nanohub_data *data)
 {
 	return __nanohub_send_AP_cmd(data, GPIO_CMD_REQUEST_FUELGAUGE);
@@ -668,7 +621,7 @@
 		sizeof(struct bq27x00_reg_cache));
 	/*bq27x00_update(fg_info);*/
 	fg_info->last_update = jiffies;
-	/*enable_fuelgauge(fg_info->hub_data, 1);*/
+
 	request_fuel_gauge_data(fg_info->hub_data);
 	fg_info->requested = 1;
 
diff --git a/drivers/staging/nanohub/bq27xxx_fuelgauge.h b/drivers/staging/nanohub/bq27xxx_fuelgauge.h
index 1912735..22a994c0 100644
--- a/drivers/staging/nanohub/bq27xxx_fuelgauge.h
+++ b/drivers/staging/nanohub/bq27xxx_fuelgauge.h
@@ -81,7 +81,6 @@
 			struct nanohub_data *hub_data);
 void bq27x00_powersupply_unregister(void);
 
-int enable_fuelgauge(struct nanohub_data *data, int on);
 int is_fuel_gauge_data(struct nanohub_buf *buf, int len);
 int handle_fuelgauge_data(struct nanohub_buf *buf, int len);
 
diff --git a/drivers/staging/nanohub/main.c b/drivers/staging/nanohub/main.c
index 5d133ae..74b2f24 100644
--- a/drivers/staging/nanohub/main.c
+++ b/drivers/staging/nanohub/main.c
@@ -42,11 +42,11 @@
 #include "bq27xxx_fuelgauge.h"
 #include "custom_app_event.h"
 
-#define READ_QUEUE_DEPTH	20
-#define APP_FROM_HOST_EVENTID	0x000000F8
-#define FIRST_SENSOR_EVENTID	0x00000200
-#define LAST_SENSOR_EVENTID	0x000002FF
-#define APP_TO_HOST_EVENTID	0x00000401
+#define READ_QUEUE_DEPTH        20
+#define APP_FROM_HOST_EVENTID   0x000000F8
+#define FIRST_SENSOR_EVENTID    0x00000200
+#define LAST_SENSOR_EVENTID     0x000002FF
+#define APP_TO_HOST_EVENTID     0x00000401
 
 enum APP_TO_HOST_EVENT_SUBID {
 	APP_TO_HOST_EVENT_SUBID_OTHERS = 0,
@@ -57,15 +57,16 @@
 	APP_TO_HOST_EVENT_SUBID_SELFTEST,
 };
 
-#define OS_LOG_EVENTID		0x3B474F4C
-#define WAKEUP_INTERRUPT	1
-#define WAKEUP_TIMEOUT_MS	2000
-#define SUSPEND_TIMEOUT_MS	200
-#define KTHREAD_ERR_TIME_NS	(60LL * NSEC_PER_SEC)
-#define KTHREAD_ERR_CNT		70
-#define KTHREAD_WARN_CNT	10
-#define WAKEUP_ERR_TIME_NS	(60LL * NSEC_PER_SEC)
-#define WAKEUP_ERR_CNT		4
+#define OS_LOG_EVENTID          0x3B474F4C    /* ;LOG */
+#define OS_LOG_TO_HAL_EVENTID   0x474F4C41    /* ALOG */
+#define WAKEUP_INTERRUPT        1
+#define WAKEUP_TIMEOUT_MS       2000
+#define SUSPEND_TIMEOUT_MS      200
+#define KTHREAD_ERR_TIME_NS     (60LL * NSEC_PER_SEC)
+#define KTHREAD_ERR_CNT         70
+#define KTHREAD_WARN_CNT        10
+#define WAKEUP_ERR_TIME_NS      (60LL * NSEC_PER_SEC)
+#define WAKEUP_ERR_CNT          4
 
 /**
  * struct gpio_config - this is a binding between platform data and driver data
@@ -824,6 +825,29 @@
 		"%d\n", atomic_read(&data->lcd_mutex));
 }
 
+static ssize_t nanohub_sensorhal_status_set(struct device *dev,
+				struct device_attribute *attr,
+				const char *buf, size_t count)
+{
+	struct nanohub_data *data = dev_get_nanohub_data(dev);
+	int sensorhal_alive = 0;
+
+	if (sscanf(buf, "%d\n", &sensorhal_alive) > 0)
+		atomic_set(&data->sensor_hal_alive,
+			sensorhal_alive?SENSOR_HAL_ALIVED:SENSOR_HAL_DEAD);
+
+	return count;
+}
+
+static ssize_t nanohub_sensorhal_status_get(struct device *dev,
+				struct device_attribute *attr, char *buf)
+{
+	struct nanohub_data *data = dev_get_nanohub_data(dev);
+
+	return scnprintf(buf, PAGE_SIZE,
+		"%d\n", atomic_read(&data->sensor_hal_alive));
+}
+
 static ssize_t nanohub_erase_shared(struct device *dev,
 				    struct device_attribute *attr,
 				    const char *buf, size_t count)
@@ -1164,6 +1188,8 @@
 	__ATTR(mode, 0220, NULL, nanohub_mode_set),
 	__ATTR(download_bl_status, 0444, nanohub_download_bl_status, NULL),
 	__ATTR(lcd_mutex, 0660, nanohub_lcd_mutex_status, nanohub_lcd_mutex),
+	__ATTR(sensorhal_alive, 0660, nanohub_sensorhal_status_get,
+		nanohub_sensorhal_status_set),
 };
 
 static inline int nanohub_create_sensor(struct nanohub_data *data)
@@ -1317,7 +1343,6 @@
 static int nanohub_release(struct inode *inode, struct file *file)
 {
 	file->private_data = NULL;
-
 	return 0;
 }
 
@@ -1386,10 +1411,15 @@
 	return IRQ_HANDLED;
 }
 
-static bool nanohub_os_log(char *buffer, int len)
+static bool nanohub_os_log(struct nanohub_data *data, char *buffer, int len)
 {
-	if (le32_to_cpu((((uint32_t *)buffer)[0]) & 0x7FFFFFFF) ==
-	    OS_LOG_EVENTID) {
+	uint32_t event_id =
+		le32_to_cpu((((uint32_t *)buffer)[0]) & 0x7FFFFFFF);
+
+	if (event_id == OS_LOG_EVENTID ||
+		(event_id == OS_LOG_TO_HAL_EVENTID &&
+		SENSOR_HAL_DEAD ==
+		atomic_read(&data->sensor_hal_alive))) {
 		char *mtype, *mdata = &buffer[5];
 
 		buffer[len] = 0x00;
@@ -1613,7 +1643,7 @@
 				&data->wakeup_trace, buf, ret);
 #endif
 
-	if (ret < 4 || nanohub_os_log((*buf)->buffer, ret)) {
+	if (ret < 4 || nanohub_os_log(data, (*buf)->buffer, ret)) {
 		release_wakeup(data);
 		return;
 	}
@@ -2178,6 +2208,7 @@
 	atomic_set(&data->hub_mode_ap_active, GPIO_CMD_NORMAL);
 	atomic_set(&data->hub_mode_ap_pwr_down, GPIO_CMD_POWEROFF);
 	atomic_set(&data->lcd_mutex, LCD_MUTEX_OFF);
+	atomic_set(&data->sensor_hal_alive, SENSOR_HAL_DEAD);
 	init_waitqueue_head(&data->wakeup_wait);
 
 #if (NANOHUB_WAKEUP_TRACE_ENABLE)
diff --git a/drivers/staging/nanohub/main.h b/drivers/staging/nanohub/main.h
index 1903285..b88cf58 100644
--- a/drivers/staging/nanohub/main.h
+++ b/drivers/staging/nanohub/main.h
@@ -126,6 +126,7 @@
 	atomic_t hub_mode_ap_pwr_down;
 	atomic_t hub_mode_ap_active;
 	atomic_t lcd_mutex;
+	atomic_t sensor_hal_alive;
 #if (NANOHUB_WAKEUP_TRACE_ENABLE)
 	atomic_t suspend_status;
 	atomic_t st_wakeup_trace;
@@ -134,8 +135,8 @@
 #endif
 	struct mutex hub_mode_set_lock;
 	struct mutex nanohub_write_lock;
-	uint16_t nanohub_hw_type;
 	uint32_t nanohub_variant_version;
+	uint16_t nanohub_hw_type;
 };
 
 enum {
@@ -143,6 +144,11 @@
 	LCD_MUTEX_ON,
 };
 
+enum {
+	SENSOR_HAL_DEAD = 0,
+	SENSOR_HAL_ALIVED,
+};
+
 enum NRESET_POLARITY {
 	NRESET_ACTIVE_LOW,
 	NRESET_ACTIVE_HIGH,