void refresh_task(struct work_struct *work) { struct ssp_data *data = container_of((struct delayed_work *)work, struct ssp_data, work_refresh); if(data->bSspShutdown == true) { pr_err("[SSP]: %s - ssp already shutdown\n", __func__); return; } wake_lock(&data->ssp_wake_lock); pr_err("[SSP]: %s\n", __func__); data->uResetCnt++; if (initialize_mcu(data) > 0) { sync_sensor_state(data); ssp_sensorhub_report_notice(data, MSG2SSP_AP_STATUS_RESET); if (data->uLastAPState != 0) ssp_send_cmd(data, data->uLastAPState, 0); if (data->uLastResumeState != 0) ssp_send_cmd(data, data->uLastResumeState, 0); data->uTimeOutCnt = 0; } wake_unlock(&data->ssp_wake_lock); }
void sync_sensor_state(struct ssp_data *data) { unsigned char uBuf[9] = {0,}; unsigned int uSensorCnt; int iRet = 0; iRet = set_gyro_cal(data); if (iRet < 0) ssp_errf("set_gyro_cal failed"); iRet = set_accel_cal(data); if (iRet < 0) ssp_errf("set_accel_cal failed"); udelay(10); for (uSensorCnt = 0; uSensorCnt < SENSOR_MAX; uSensorCnt++) { if (atomic64_read(&data->aSensorEnable) & (1 << uSensorCnt)) { s32 dMsDelay = get_msdelay(data->adDelayBuf[uSensorCnt]); memcpy(&uBuf[0], &dMsDelay, 4); memcpy(&uBuf[4], &data->batchLatencyBuf[uSensorCnt], 4); uBuf[8] = data->batchOptBuf[uSensorCnt]; send_instruction(data, ADD_SENSOR, uSensorCnt, uBuf, 9); udelay(10); } } if (data->bProximityRawEnabled == true) { s32 dMsDelay = 20; memcpy(&uBuf[0], &dMsDelay, 4); send_instruction(data, ADD_SENSOR, PROXIMITY_RAW, uBuf, 4); } set_proximity_threshold(data, data->uProxHiThresh, data->uProxLoThresh); data->buf[PROXIMITY_SENSOR].prox = 0; report_sensordata(data, PROXIMITY_SENSOR, &data->buf[PROXIMITY_SENSOR]); #if 1 if(sec_debug_get_debug_level() > 0) { data->bMcuDumpMode = true; ssp_info("Mcu Dump Enabled"); } iRet = ssp_send_cmd(data, MSG2SSP_AP_MCU_SET_DUMPMODE, data->bMcuDumpMode); if (iRet < 0) ssp_errf("MSG2SSP_AP_MCU_SET_DUMPMODE failed"); #else #if CONFIG_SEC_DEBUG data->bMcuDumpMode = sec_debug_is_enabled(); iRet = ssp_send_cmd(data, MSG2SSP_AP_MCU_SET_DUMPMODE, data->bMcuDumpMode); if (iRet < 0) ssp_errf("MSG2SSP_AP_MCU_SET_DUMPMODE failed"); #endif #endif }
static void ssp_shutdown(struct spi_device *spi) { struct ssp_data *data = spi_get_drvdata(spi); pr_err("[SSP] %s, data->fw_dl_state[%d]*******************!\n", __func__,data->fw_dl_state); pr_err("[SSP] lpm %d recovery \n",lpcharge /*, recovery_mode*/); func_dbg(); if (data->bProbeIsDone == false) goto exit; disable_debug_timer(data); if (data->fw_dl_state >= FW_DL_STATE_SCHEDULED && data->fw_dl_state < FW_DL_STATE_DONE) { pr_err("[SSP] %s, cancel_delayed_work_sync state = %d\n", __func__, data->fw_dl_state); cancel_delayed_work_sync(&data->work_firmware); } if (SUCCESS != ssp_send_cmd(data, MSG2SSP_AP_STATUS_SHUTDOWN, 0)) pr_err("[SSP]: %s MSG2SSP_AP_STATUS_SHUTDOWN failed\n", __func__); ssp_enable(data, false); clean_pending_list(data); #ifdef CONFIG_HAS_EARLYSUSPEND unregister_early_suspend(&data->early_suspend); #endif free_irq(data->iIrq, data); gpio_free(data->mcu_int1); remove_event_symlink(data); remove_sysfs(data); remove_input_dev(data); #ifdef CONFIG_SENSORS_SSP_SENSORHUB ssp_sensorhub_remove(data); #endif del_timer_sync(&data->debug_timer); cancel_work_sync(&data->work_debug); cancel_delayed_work_sync(&data->work_refresh); destroy_workqueue(data->debug_wq); wake_lock_destroy(&data->ssp_wake_lock); #ifdef CONFIG_SENSORS_SSP_SHTC1 mutex_destroy(&data->bulk_temp_read_lock); mutex_destroy(&data->cp_temp_adc_lock); #endif #ifdef CONFIG_SENSORS_SSP_ATMEL mutex_destroy(&data->comm_mutex); mutex_destroy(&data->pending_mutex); #endif toggle_mcu_reset(data); pr_info("[SSP] %s done\n", __func__); exit: kfree(data); }
int initialize_mcu(struct ssp_data *data) { int iRet = 0; clean_pending_list(data); iRet = get_chipid(data); pr_info("[SSP] MCU device ID = %d, reading ID = %d\n", DEVICE_ID, iRet); if (iRet != DEVICE_ID) { if (iRet < 0) { pr_err("[SSP]: %s - MCU is not working : 0x%x\n", __func__, iRet); } else { pr_err("[SSP]: %s - MCU identification failed\n", __func__); iRet = -ENODEV; } goto out; } iRet = set_sensor_position(data); if (iRet < 0) { pr_err("[SSP]: %s - set_sensor_position failed\n", __func__); goto out; } #ifdef CONFIG_SENSORS_MULTIPLE_GLASS_TYPE iRet = set_glass_type(data); if (iRet < 0) { pr_err("[SSP]: %s - set_sensor_position failed\n", __func__); goto out; } #endif data->uSensorState = get_sensor_scanning_info(data); if (data->uSensorState == 0) { pr_err("[SSP]: %s - get_sensor_scanning_info failed\n", __func__); iRet = ERROR; goto out; } iRet = initialize_magnetic_sensor(data); if (iRet < 0) pr_err("[SSP]: %s - initialize magnetic sensor failed\n", __func__); data->uCurFirmRev = get_firmware_rev(data); pr_info("[SSP] MCU Firm Rev : New = %8u\n", data->uCurFirmRev); // hoi: il dan mak a #ifndef CONFIG_SENSORS_SSP_BBD iRet = ssp_send_cmd(data, MSG2SSP_AP_MCU_DUMP_CHECK, 0); #endif out: return iRet; }
void sync_sensor_state(struct ssp_data *data) { unsigned char uBuf[9] = {0,}; unsigned int uSensorCnt; int iRet = 0; iRet = set_gyro_cal(data); if (iRet < 0) pr_err("[SSP]: %s - set_gyro_cal failed\n", __func__); iRet = set_accel_cal(data); if (iRet < 0) pr_err("[SSP]: %s - set_accel_cal failed\n", __func__); #ifdef CONFIG_SENSORS_SSP_SX9306 if (atomic_read(&data->aSensorEnable) & (1 << GRIP_SENSOR)) { open_grip_caldata(data); set_grip_calibration(data, true); } #endif udelay(10); for (uSensorCnt = 0; uSensorCnt < SENSOR_MAX; uSensorCnt++) { mutex_lock(&data->enable_mutex); if (atomic_read(&data->aSensorEnable) & (1 << uSensorCnt)) { s32 dMsDelay = get_msdelay(data->adDelayBuf[uSensorCnt]); memcpy(&uBuf[0], &dMsDelay, 4); memcpy(&uBuf[4], &data->batchLatencyBuf[uSensorCnt], 4); uBuf[8] = data->batchOptBuf[uSensorCnt]; send_instruction(data, ADD_SENSOR, uSensorCnt, uBuf, 9); udelay(10); } mutex_unlock(&data->enable_mutex); } if (data->bProximityRawEnabled == true) { s32 dMsDelay = 20; memcpy(&uBuf[0], &dMsDelay, 4); send_instruction(data, ADD_SENSOR, PROXIMITY_RAW, uBuf, 4); } set_proximity_threshold(data, data->uProxHiThresh,data->uProxLoThresh); data->bMcuDumpMode = ssp_check_sec_dump_mode(); iRet = ssp_send_cmd(data, MSG2SSP_AP_MCU_SET_DUMPMODE, data->bMcuDumpMode); if (iRet < 0) pr_err("[SSP]: %s - MSG2SSP_AP_MCU_SET_DUMPMODE failed\n", __func__); }
static int ssp_resume(struct device *dev) { struct i2c_client *client = to_i2c_client(dev); struct ssp_data *data = i2c_get_clientdata(client); func_dbg(); if (SUCCESS != ssp_send_cmd(data, MSG2SSP_AP_STATUS_RESUME)) pr_err("[SSP]: %s MSG2SSP_AP_STATUS_RESUME failed\n", __func__); return 0; }
static int ssp_suspend(struct device *dev) { struct i2c_client *client = to_i2c_client(dev); struct ssp_data *data = i2c_get_clientdata(client); func_dbg(); if (SUCCESS != ssp_send_cmd(data, MSG2SSP_AP_STATUS_SUSPEND)) pr_err("[SSP]: %s MSG2SSP_AP_STATUS_SUSPEND failed\n", __func__); disable_irq(data->iIrq); return 0; }
void reset_mcu(struct ssp_data *data) { func_dbg(); ssp_enable(data, false); clean_pending_list(data); toggle_mcu_reset(data); msleep(SSP_SW_RESET_TIME); ssp_enable(data, true); if (initialize_mcu(data) < 0) return; sync_sensor_state(data); #ifdef CONFIG_SENSORS_SSP_SENSORHUB ssp_sensorhub_report_notice(data, MSG2SSP_AP_STATUS_RESET); #endif if (data->uLastAPState != 0) ssp_send_cmd(data, data->uLastAPState, 0); if (data->uLastResumeState != 0) ssp_send_cmd(data, data->uLastResumeState, 0); }
static int ssp_suspend(struct device *dev) { struct spi_device *spi_dev = to_spi_device(dev); struct ssp_data *data = spi_get_drvdata(spi_dev); func_dbg(); disable_debug_timer(data); if (SUCCESS != ssp_send_cmd(data, MSG2SSP_AP_STATUS_SUSPEND, 0)) pr_err("[SSP]: %s MSG2SSP_AP_STATUS_SUSPEND failed\n", __func__); data->uLastResumeState = MSG2SSP_AP_STATUS_SUSPEND; disable_irq(data->iIrq); return 0; }
static int ssp_resume(struct device *dev) { struct spi_device *spi = to_spi_device(dev); struct ssp_data *data = spi_get_drvdata(spi); func_dbg(); enable_debug_timer(data); if (SUCCESS != ssp_send_cmd(data, MSG2SSP_AP_STATUS_RESUME, 0)) pr_err("[SSP]: %s MSG2SSP_AP_STATUS_RESUME failed\n", __func__); data->uLastResumeState = MSG2SSP_AP_STATUS_RESUME; return 0; }
int initialize_mcu(struct ssp_data *data) { int iRet = 0; iRet = get_chipid(data); pr_info("[SSP] MCU device ID = %d, reading ID = %d\n", DEVICE_ID, iRet); if (iRet != DEVICE_ID) { if (iRet < 0) { pr_err("[SSP]: %s - MCU is not working : 0x%x\n", __func__, iRet); } else { pr_err("[SSP]: %s - MCU identification failed\n", __func__); iRet = -ENODEV; } goto out; } iRet = set_sensor_position(data); if (iRet < 0) { pr_err("[SSP]: %s - set_sensor_position failed\n", __func__); goto out; } data->uSensorState = get_sensor_scanning_info(data); if (data->uSensorState == 0) { pr_err("[SSP]: %s - get_sensor_scanning_info failed\n", __func__); iRet = ERROR; goto out; } iRet = ssp_send_cmd(data, MSG2SSP_AP_MCU_SET_DUMPMODE, sec_debug_is_enabled()); if (iRet < 0) { pr_err("[SSP]: %s - set_mcu_dump_mode failed\n", __func__); goto out; } #if defined (CONFIG_SENSORS_SSP_YAS532) iRet = set_static_matrix(data); if (iRet < 0) pr_err("[SSP]: %s - yas set static matrix failed\n", __func__); #endif iRet = SUCCESS; out: return iRet; }
void sync_sensor_state(struct ssp_data *data) { unsigned char uBuf[9] = {0,}; unsigned int uSensorCnt; int iRet = 0; #ifdef CONFIG_SENSORS_SSP_YAS532 iRet = set_hw_offset(data); if (iRet < 0) { pr_err("[SSP]: %s - set_hw_offset failed\n", __func__); } #endif iRet = set_gyro_cal(data); if (iRet < 0) { pr_err("[SSP]: %s - set_gyro_cal failed\n", __func__); } iRet = set_accel_cal(data); if (iRet < 0) { pr_err("[SSP]: %s - set_accel_cal failed\n", __func__); } udelay(10); for (uSensorCnt = 0; uSensorCnt < SENSOR_MAX; uSensorCnt++) { if (atomic_read(&data->aSensorEnable) & (1 << uSensorCnt)) { s32 dMsDelay = get_msdelay(data->adDelayBuf[uSensorCnt]); memcpy(&uBuf[0], &dMsDelay, 4); memcpy(&uBuf[4], &data->batchLatencyBuf[uSensorCnt], 4); uBuf[8] = data->batchOptBuf[uSensorCnt]; send_instruction(data, ADD_SENSOR, uSensorCnt, uBuf, 9); udelay(10); } } if (data->bProximityRawEnabled == true) { s32 dMsDelay = 20; memcpy(&uBuf[0], &dMsDelay, 4); send_instruction(data, ADD_SENSOR, PROXIMITY_RAW, uBuf, 4); } set_proximity_threshold(data, data->uProxHiThresh,data->uProxLoThresh); #if SSP_SEC_DEBUG data->bMcuDumpMode = sec_debug_is_enabled(); iRet = ssp_send_cmd(data, MSG2SSP_AP_MCU_SET_DUMPMODE,data->bMcuDumpMode); if (iRet < 0) { pr_err("[SSP]: %s - MSG2SSP_AP_MCU_SET_DUMPMODE failed\n", __func__); } #endif }
static int ssp_resume(struct device *dev) { struct spi_device *spi_dev = to_spi_device(dev); struct ssp_data *data = spi_get_drvdata(spi_dev); enable_irq(data->iIrq); ssp_infof(); enable_debug_timer(data); if (SUCCESS != ssp_send_cmd(data, MSG2SSP_AP_STATUS_RESUME, 0)) ssp_errf("MSG2SSP_AP_STATUS_RESUME failed"); data->uLastResumeState = MSG2SSP_AP_STATUS_RESUME; return 0; }
static int ssp_suspend(struct device *dev) { struct spi_device *spi_dev = to_spi_device(dev); struct ssp_data *data = spi_get_drvdata(spi_dev); ssp_infof(); data->uLastResumeState = MSG2SSP_AP_STATUS_SUSPEND; disable_debug_timer(data); if (SUCCESS != ssp_send_cmd(data, MSG2SSP_AP_STATUS_SUSPEND, 0)) ssp_errf("MSG2SSP_AP_STATUS_SUSPEND failed"); data->bTimeSyncing = false; disable_irq(data->iIrq); return 0; }
ssize_t temphumidity_send_accuracy(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { struct ssp_data *data = dev_get_drvdata(dev); u8 accuracy; if (kstrtou8(buf, 10, &accuracy) < 0) { pr_err("[SSP] %s - read buf is fail(%s)\n", __func__, buf); return size; } if (accuracy == DONE_CAL) ssp_send_cmd(data, MSG2SSP_AP_TEMPHUMIDITY_CAL_DONE); pr_info("[SSP] %s - accuracy = %d\n", __func__, accuracy); return size; }
int initialize_mcu(struct ssp_data *data) { int iRet = 0; clean_pending_list(data); iRet = get_chipid(data); pr_info("[SSP] MCU device ID = %d, reading ID = %d\n", DEVICE_ID, iRet); if (iRet != DEVICE_ID) { if (iRet < 0) { pr_err("[SSP]: %s - MCU is not working : 0x%x\n", __func__, iRet); } else { pr_err("[SSP]: %s - MCU identification failed\n", __func__); iRet = -ENODEV; } goto out; } iRet = set_sensor_position(data); if (iRet < 0) { pr_err("[SSP]: %s - set_sensor_position failed\n", __func__); goto out; } iRet = get_fuserom_data(data); if (iRet < 0) pr_err("[SSP]: %s - get_fuserom_data failed\n", __func__); data->uSensorState = get_sensor_scanning_info(data); if (data->uSensorState == 0) { pr_err("[SSP]: %s - get_sensor_scanning_info failed\n", __func__); iRet = ERROR; goto out; } data->uCurFirmRev = get_firmware_rev(data); pr_info("[SSP] MCU Firm Rev : New = %8u\n", data->uCurFirmRev); iRet = ssp_send_cmd(data, MSG2SSP_AP_MCU_DUMP_CHECK, 0); out: return iRet; }
void sync_sensor_state(struct ssp_data *data) { unsigned char uBuf[2] = {0,}; unsigned int uSensorCnt; int iRet = 0; iRet = set_hw_offset(data); if (iRet < 0) { pr_err("[SSP]: %s - set_hw_offset failed\n", __func__); } iRet = set_gyro_cal(data); if (iRet < 0) { pr_err("[SSP]: %s - set_gyro_cal failed\n", __func__); } iRet = set_accel_cal(data); if (iRet < 0) { pr_err("[SSP]: %s - set_accel_cal failed\n", __func__); } udelay(10); for (uSensorCnt = 0; uSensorCnt < (SENSOR_MAX - 1); uSensorCnt++) { if (atomic_read(&data->aSensorEnable) & (1 << uSensorCnt)) { uBuf[1] = (u8)get_msdelay(data->adDelayBuf[uSensorCnt]); uBuf[0] = (u8)get_delay_cmd(uBuf[1]); send_instruction(data, ADD_SENSOR, uSensorCnt, uBuf, 2); udelay(10); } } if (data->bProximityRawEnabled == true) { uBuf[0] = 1; uBuf[1] = 20; send_instruction(data, ADD_SENSOR, PROXIMITY_RAW, uBuf, 2); } set_proximity_threshold(data, data->uProxHiThresh,data->uProxLoThresh); data->bMcuDumpMode = sec_debug_is_enabled(); iRet = ssp_send_cmd(data, MSG2SSP_AP_MCU_SET_DUMPMODE,data->bMcuDumpMode); if (iRet < 0) { pr_err("[SSP]: %s - MSG2SSP_AP_MCU_SET_DUMPMODE failed\n", __func__); } }
static int ssp_resume(struct device *dev) { struct spi_device *spi = to_spi_device(dev); struct ssp_data *data = spi_get_drvdata(spi); enable_irq(data->iIrq); func_dbg(); enable_debug_timer(data); data->bSuspended = false; if (SUCCESS != ssp_send_cmd(data, MSG2SSP_AP_STATUS_RESUME, 0)) pr_err("[SSP]: %s MSG2SSP_AP_STATUS_RESUME failed\n", __func__); data->uLastResumeState = MSG2SSP_AP_STATUS_RESUME; #if SSP_STATUS_MONITOR schedule_delayed_work(&data->polling_work, msecs_to_jiffies(3000)); #endif return 0; }
static void ssp_shutdown(struct spi_device *spi_dev) { struct ssp_data *data = spi_get_drvdata(spi_dev); ssp_infof(); if (data->bProbeIsDone == false) goto exit; disable_debug_timer(data); if (data->fw_dl_state >= FW_DL_STATE_SCHEDULED && data->fw_dl_state < FW_DL_STATE_DONE) { ssp_errf("cancel_delayed_work_sync state = %d", data->fw_dl_state); cancel_delayed_work_sync(&data->work_firmware); } if (SUCCESS != ssp_send_cmd(data, MSG2SSP_AP_STATUS_SHUTDOWN, 0)) ssp_errf("MSG2SSP_AP_STATUS_SHUTDOWN failed"); ssp_enable(data, false); clean_pending_list(data); free_irq(data->iIrq, data); gpio_free(data->mcu_int1); remove_sysfs(data); remove_indio_dev(data); ssp_sensorhub_remove(data); del_timer_sync(&data->debug_timer); cancel_work_sync(&data->work_debug); cancel_delayed_work_sync(&data->work_refresh); destroy_workqueue(data->debug_wq); wake_lock_destroy(&data->ssp_wake_lock); mutex_destroy(&data->comm_mutex); mutex_destroy(&data->pending_mutex); toggle_mcu_reset(data); ssp_infof("done"); exit: kfree(data); }
static int ssp_suspend(struct device *dev) { struct spi_device *spi = to_spi_device(dev); struct ssp_data *data = spi_get_drvdata(spi); func_dbg(); data->uLastResumeState = MSG2SSP_AP_STATUS_SUSPEND; disable_debug_timer(data); #if SSP_STATUS_MONITOR cancel_delayed_work_sync(&data->polling_work); #endif if (SUCCESS != ssp_send_cmd(data, MSG2SSP_AP_STATUS_SUSPEND, 0)) pr_err("[SSP]: %s MSG2SSP_AP_STATUS_SUSPEND failed\n", __func__); data->bSuspended = true; data->bTimeSyncing = false; disable_irq(data->iIrq); return 0; }
static int ssp_sensorhub_send_cmd(struct ssp_sensorhub_data *hub_data, const char *buf, int count) { int ret = 0; if (buf[2] < MSG2SSP_AP_STATUS_WAKEUP || buf[2] >= MSG2SSP_AP_TEMPHUMIDITY_CAL_DONE) { sensorhub_err("MSG2SSP_INST_LIB_NOTI err(%d)", buf[2]); return -EINVAL; } ret = ssp_send_cmd(hub_data->ssp_data, buf[2], 0); if (buf[2] == MSG2SSP_AP_STATUS_WAKEUP || buf[2] == MSG2SSP_AP_STATUS_SLEEP) hub_data->ssp_data->uLastAPState = buf[2]; if (buf[2] == MSG2SSP_AP_STATUS_SUSPEND || buf[2] == MSG2SSP_AP_STATUS_RESUME) hub_data->ssp_data->uLastResumeState = buf[2]; return ret; }
static int ssp_probe(struct spi_device *spi_dev) { int iRet = 0; struct ssp_data *data; struct ssp_platform_data *pdata; if (poweroff_charging == 1 || recovery_mode == 1) { pr_err("[SSP] probe exit : lpm %d recovery %d \n", poweroff_charging, recovery_mode); return -ENODEV; } data = kzalloc(sizeof(*data), GFP_KERNEL); if (data == NULL) { pr_err("[SSP]: %s - failed to allocate memory for data\n", __func__); iRet = -ENOMEM; goto exit; } if (spi_dev->dev.of_node) { iRet = ssp_parse_dt(&spi_dev->dev, data); if (iRet) { pr_err("[SSP]: %s - Failed to parse DT\n", __func__); goto err_setup; } data->ssp_changes = SSP_MCU_L5; /* K330, MPU L5*/ } else { pdata = spi_dev->dev.platform_data; if (pdata == NULL) { pr_err("[SSP]: %s - platform_data is null\n", __func__); iRet = -ENOMEM; goto err_setup; } data->wakeup_mcu = pdata->wakeup_mcu; data->check_mcu_ready = pdata->check_mcu_ready; data->check_mcu_busy = pdata->check_mcu_busy; data->set_mcu_reset = pdata->set_mcu_reset; data->read_chg = pdata->read_chg; /* AP system_rev */ if (pdata->check_ap_rev) data->ap_rev = pdata->check_ap_rev(); else data->ap_rev = 0; /* For changed devices */ if (pdata->check_changes) data->ssp_changes = pdata->check_changes(); else data->ssp_changes = SSP_MCU_L5; /* K330, MPU L5*/ /* Get sensor positions */ if (pdata->get_positions) pdata->get_positions(&data->accel_position, &data->mag_position); else if (spi_dev->dev.of_node == NULL) { data->accel_position = 0; data->mag_position = 0; } } spi_dev->mode = SPI_MODE_1; if (spi_setup(spi_dev)) { pr_err("failed to setup spi for ssp_spi\n"); goto err_setup; } data->bProbeIsDone = false; data->fw_dl_state = FW_DL_STATE_NONE; data->spi = spi_dev; spi_set_drvdata(spi_dev, data); #ifdef CONFIG_SENSORS_SSP_SHTC1 mutex_init(&data->cp_temp_adc_lock); mutex_init(&data->bulk_temp_read_lock); #endif #ifdef CONFIG_SENSORS_SSP_STM mutex_init(&data->comm_mutex); mutex_init(&data->pending_mutex); #endif if (((data->wakeup_mcu == NULL) || (data->check_mcu_ready == NULL) || (data->check_mcu_busy == NULL) || (data->set_mcu_reset == NULL) || (data->read_chg == NULL)) && (spi_dev->dev.of_node == NULL)) { pr_err("[SSP]: %s - function callback is null\n", __func__); iRet = -EIO; goto err_reset_null; } pr_info("\n#####################################################\n"); INIT_DELAYED_WORK(&data->work_firmware, work_function_firmware_update); wake_lock_init(&data->ssp_wake_lock, WAKE_LOCK_SUSPEND, "ssp_wake_lock"); iRet = initialize_input_dev(data); if (iRet < 0) { pr_err("[SSP]: %s - could not create input device\n", __func__); goto err_input_register_device; } iRet = initialize_debug_timer(data); if (iRet < 0) { pr_err("[SSP]: %s - could not create workqueue\n", __func__); goto err_create_workqueue; } iRet = initialize_irq(data); if (iRet < 0) { pr_err("[SSP]: %s - could not create irq\n", __func__); goto err_setup_irq; } iRet = initialize_sysfs(data); if (iRet < 0) { pr_err("[SSP]: %s - could not create sysfs\n", __func__); goto err_sysfs_create; } iRet = initialize_event_symlink(data); if (iRet < 0) { pr_err("[SSP]: %s - could not create symlink\n", __func__); goto err_symlink_create; } initialize_variable(data); ssp_enable(data, true); /* check boot loader binary */ data->fw_dl_state = check_fwbl(data); if (data->fw_dl_state == FW_DL_STATE_NONE) { iRet = initialize_mcu(data); if (iRet == ERROR) { data->uResetCnt++; toggle_mcu_reset(data); msleep(SSP_SW_RESET_TIME); initialize_mcu(data); } else if (iRet < ERROR) { pr_err("[SSP]: %s - initialize_mcu failed\n", __func__); goto err_read_reg; } } #ifdef CONFIG_HAS_EARLYSUSPEND data->early_suspend.suspend = ssp_early_suspend; data->early_suspend.resume = ssp_late_resume; register_early_suspend(&data->early_suspend); #endif #ifdef CONFIG_SENSORS_SSP_SENSORHUB /* init sensorhub device */ iRet = ssp_sensorhub_initialize(data); if (iRet < 0) { pr_err("%s: ssp_sensorhub_initialize err(%d)", __func__, iRet); ssp_sensorhub_remove(data); } #endif data->bMcuDumpMode = sec_debug_is_enabled(); iRet = ssp_send_cmd(data, MSG2SSP_AP_MCU_SET_DUMPMODE,data->bMcuDumpMode); if (iRet < 0) { pr_err("[SSP]: %s - MSG2SSP_AP_MCU_SET_DUMPMODE failed\n", __func__); } pr_info("[SSP]: %s - setup debuglevel %d!\n", __func__,data->bMcuDumpMode); pr_info("[SSP]: %s - probe success!\n", __func__); enable_debug_timer(data); iRet = 0; if (data->fw_dl_state == FW_DL_STATE_NEED_TO_SCHEDULE) { pr_info("[SSP]: Firmware update is scheduled\n"); schedule_delayed_work(&data->work_firmware, msecs_to_jiffies(1000)); data->fw_dl_state = FW_DL_STATE_SCHEDULED; } else if (data->fw_dl_state == FW_DL_STATE_FAIL) data->bSspShutdown = true; data->bProbeIsDone = true; goto exit; err_read_reg: err_symlink_create: remove_sysfs(data); err_sysfs_create: free_irq(data->iIrq, data); gpio_free(data->mcu_int1); err_setup_irq: destroy_workqueue(data->debug_wq); err_create_workqueue: remove_input_dev(data); err_input_register_device: wake_lock_destroy(&data->ssp_wake_lock); err_reset_null: #ifdef CONFIG_SENSORS_SSP_SHTC1 mutex_destroy(&data->cp_temp_adc_lock); mutex_destroy(&data->bulk_temp_read_lock); #endif #ifdef CONFIG_SENSORS_SSP_STM mutex_destroy(&data->comm_mutex); mutex_destroy(&data->pending_mutex); #endif err_setup: kfree(data); pr_err("[SSP]: %s - probe failed!\n", __func__); exit: pr_info("#####################################################\n\n"); return iRet; }
void ssp_dump_task(struct work_struct *work) { struct ssp_big *big; struct file *dump_file; struct ssp_msg *msg; char *buffer; char strFilePath[60]; struct timeval cur_time; int iTimeTemp; mm_segment_t fs; int buf_len, packet_len, residue, iRet = 0, index = 0 ,iRetTrans=0 ,iRetWrite=0; big = container_of(work, struct ssp_big, work); pr_err("[SSP]: %s - start ssp dumping (%d)(%d)\n", __func__,big->data->bMcuDumpMode,big->data->uDumpCnt); big->data->uDumpCnt++; wake_lock(&big->data->ssp_wake_lock); fs = get_fs(); set_fs(get_ds()); if(big->data->bMcuDumpMode == true) { do_gettimeofday(&cur_time); iTimeTemp = (int) cur_time.tv_sec; sprintf(strFilePath, "%s%d.txt", DUMP_FILE_PATH, iTimeTemp); dump_file = filp_open(strFilePath, O_RDWR | O_CREAT | O_APPEND, 0666); if (IS_ERR(dump_file)) { pr_err("[SSP]: %s - Can't open dump file\n", __func__); set_fs(fs); iRet = PTR_ERR(dump_file); wake_unlock(&big->data->ssp_wake_lock); return; } } else dump_file = NULL; buf_len = big->length > DATA_PACKET_SIZE ? DATA_PACKET_SIZE : big->length; buffer = kzalloc(buf_len, GFP_KERNEL); residue = big->length; while (residue > 0) { packet_len = residue > DATA_PACKET_SIZE ? DATA_PACKET_SIZE : residue; msg = kzalloc(sizeof(*msg), GFP_KERNEL); msg->cmd = MSG2SSP_AP_GET_BIG_DATA; msg->length = packet_len; msg->options = AP2HUB_READ | (index++ << SSP_INDEX); msg->data = big->addr; msg->buffer = buffer; msg->free_buffer = 0; iRetTrans = ssp_spi_sync(big->data, msg, 1000); if (iRetTrans != SUCCESS) { pr_err("[SSP]: %s - Fail to receive data %d (%d)\n", __func__, iRetTrans,residue); break; } if(big->data->bMcuDumpMode == true) { iRetWrite = vfs_write(dump_file, (char __user *) buffer, packet_len, &dump_file->f_pos); if (iRetWrite < 0) { pr_err("[SSP]: %s - Can't write dump to file\n", __func__); break; } } residue -= packet_len; } if(big->data->bMcuDumpMode == true && (iRetTrans != SUCCESS || iRetWrite < 0) ) { char FAILSTRING[100]; sprintf(FAILSTRING,"FAIL OCCURED(%d)(%d)(%d)",iRetTrans,iRetWrite,big->length); vfs_write(dump_file, (char __user *) FAILSTRING, strlen(FAILSTRING),&dump_file->f_pos); } ssp_send_cmd(big->data, MSG2SSP_AP_MCU_DUMP_FINISH, SUCCESS); big->data->bDumping = false; if(big->data->bMcuDumpMode == true) filp_close(dump_file, current->files); set_fs(fs); sanity_check(big->data); wake_unlock(&big->data->ssp_wake_lock); kfree(buffer); kfree(big); pr_err("[SSP]: %s done\n", __func__); }