static int ssp_probe(struct i2c_client *client, const struct i2c_device_id *devid) { int iRet = 0; struct ssp_data *data; struct ssp_platform_data *pdata = client->dev.platform_data; if (pdata == NULL) { pr_err("[SSP]: %s - platform_data is null..\n", __func__); iRet = -ENOMEM; goto exit; } 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; } data->fw_dl_state = FW_DL_STATE_NONE; data->client = client; i2c_set_clientdata(client, data); 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->check_ap_rev = pdata->check_ap_rev; if ((data->wakeup_mcu == NULL) || (data->check_mcu_ready == NULL) || (data->check_mcu_busy == NULL) || (data->set_mcu_reset == NULL) || (data->check_ap_rev == 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); /* check boot loader binary */ data->fw_dl_state = check_fwbl(data); initialize_variable(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; } } 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; } initialize_magnetic(data); iRet = misc_register(&data->akmd_device); if (iRet) goto err_akmd_device_register; 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; } #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->bSspShutdown = false; enable_irq(data->iIrq); enable_irq_wake(data->iIrq); 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(3000)); data->fw_dl_state = FW_DL_STATE_SCHEDULED; } else if (data->fw_dl_state == FW_DL_STATE_FAIL) data->bSspShutdown = true; goto exit; err_symlink_create: remove_sysfs(data); err_sysfs_create: free_irq(data->iIrq, data); gpio_free(data->client->irq); err_setup_irq: destroy_workqueue(data->debug_wq); err_create_workqueue: misc_deregister(&data->akmd_device); err_akmd_device_register: remove_input_dev(data); err_input_register_device: wake_lock_destroy(&data->ssp_wake_lock); err_read_reg: err_reset_null: kfree(data); pr_err("[SSP]: %s - probe failed!\n", __func__); exit: pr_info("#####################################################\n\n"); return iRet; }
static int ssp_probe(struct spi_device *spi_dev) { int iRet = 0; struct ssp_data *data; struct ssp_platform_data *pdata; pr_info("[SSP] %s\n", __func__); if (poweroff_charging == 1) { pr_err("[SSP] probe exit : lpm %d\n", poweroff_charging); 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); #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 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); } 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 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; }
static int ssp_probe(struct spi_device *spi) { int iRet = 0; struct ssp_data *data; ssp_infof(); /* if (poweroff_charging == 1 || boot_mode_recovery == 1) { ssp_err("probe exit : lpm %d, recovery %d", poweroff_charging, boot_mode_recovery); return -ENODEV; } */ data = kzalloc(sizeof(*data), GFP_KERNEL); if (data == NULL) { ssp_errf("failed to allocate memory for data"); iRet = -ENOMEM; goto exit; } if (spi->dev.of_node) { iRet = ssp_parse_dt(&spi->dev, data); if (iRet) { ssp_errf("Failed to parse DT"); goto err_setup; } } else { ssp_errf("failed to get device node"); iRet = -ENODEV; goto err_setup; } spi->mode = SPI_MODE_1; if (spi_setup(spi)) { ssp_errf("failed to setup spi"); iRet = -ENODEV; goto err_setup; } data->fw_dl_state = FW_DL_STATE_NONE; data->spi = spi; spi_set_drvdata(spi, data); mutex_init(&data->comm_mutex); mutex_init(&data->pending_mutex); 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_indio_dev(data); if (iRet < 0) { ssp_errf("could not create input device"); goto err_input_register_device; } iRet = initialize_debug_timer(data); if (iRet < 0) { ssp_errf("could not create workqueue"); goto err_create_workqueue; } iRet = initialize_irq(data); if (iRet < 0) { ssp_errf("could not create irq"); goto err_setup_irq; } iRet = initialize_sysfs(data); if (iRet < 0) { ssp_errf("could not create sysfs"); goto err_sysfs_create; } initialize_variable(data); /* init sensorhub device */ iRet = ssp_sensorhub_initialize(data); if (iRet < 0) { ssp_errf("ssp_sensorhub_initialize err(%d)", iRet); ssp_sensorhub_remove(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) { toggle_mcu_reset(data); } else if (iRet < ERROR) { ssp_errf("initialize_mcu failed"); goto err_read_reg; } } ssp_infof("probe success!"); enable_debug_timer(data); if (data->fw_dl_state == FW_DL_STATE_NEED_TO_SCHEDULE) { ssp_info("Firmware update is scheduled"); 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; iRet = 0; goto exit; err_read_reg: 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_indio_dev(data); err_input_register_device: wake_lock_destroy(&data->ssp_wake_lock); mutex_destroy(&data->comm_mutex); mutex_destroy(&data->pending_mutex); err_setup: kfree(data); ssp_errf("probe failed!"); exit: pr_info("#####################################################\n\n"); return iRet; }
static int ssp_probe(struct spi_device *spi) { struct ssp_data *data; struct ssp_platform_data *pdata; int iRet = 0; pr_info("[SSP] %s, is called\n", __func__); if (lpcharge == 1 || bootmode == 2) { pr_err("[SSP] probe exit : lpm %d (recovery)bootmode:%d \n", lpcharge, bootmode); 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.of_node) { iRet = ssp_parse_dt(&spi->dev, data); if (iRet) { pr_err("[SSP]: %s - Failed to parse DT\n", __func__); goto err_setup; } } else { pdata = spi->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->set_mcu_reset = pdata->set_mcu_reset; data->ap_int = pdata->ap_int; data->mcu_int1 = pdata->mcu_int1; data->mcu_int2 = pdata->mcu_int2; /* AP system_rev */ if (pdata->check_ap_rev) data->ap_rev = pdata->check_ap_rev(); else data->ap_rev = 0; /* Get sensor positions */ if (pdata->get_positions) { pdata->get_positions(&data->accel_position, &data->mag_position); } else { data->accel_position = 0; data->mag_position = 0; } if (pdata->mag_matrix) { data->mag_matrix_size = pdata->mag_matrix_size; data->mag_matrix = pdata->mag_matrix; } } #if 0//def CONFIG_SENSORS_SSP_SHTC1 /* Get pdata for cp thermister */ if (pdata->cp_thm_adc_table) { data->cp_thm_adc_channel = pdata->cp_thm_adc_channel; data->cp_thm_adc_arr_size= pdata->cp_thm_adc_arr_size; data->cp_thm_adc_table = pdata->cp_thm_adc_table; } /* Get pdata for batt thermister */ if (pdata->batt_thm_adc_table) { data->batt_thm_adc_arr_size= pdata->batt_thm_adc_arr_size; data->batt_thm_adc_table = pdata->batt_thm_adc_table; } /* Get pdata for chg thermister */ if (pdata->chg_thm_adc_table) { data->chg_thm_adc_arr_size= pdata->chg_thm_adc_arr_size; data->chg_thm_adc_table = pdata->chg_thm_adc_table; } #endif spi->mode = SPI_MODE_1; if (spi_setup(spi)) { pr_err("[SSP] %s, failed to setup spi\n", __func__); goto err_setup; } data->bProbeIsDone = false; data->fw_dl_state = FW_DL_STATE_NONE; data->spi = spi; spi_set_drvdata(spi, 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_ATMEL mutex_init(&data->comm_mutex); mutex_init(&data->pending_mutex); #endif if (((data->wakeup_mcu == NULL) || (data->set_mcu_reset == NULL)) && (spi->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); msleep(40); #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 ssp_enable(data, true); #if defined SSP_IRQ_EDGE_PROTECT prevent_irq = 1; #endif /* 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) { toggle_mcu_reset(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 pr_info("[SSP]: %s - probe success!\n", __func__); enable_debug_timer(data); 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; iRet = 0; 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_ATMEL mutex_destroy(&data->comm_mutex); mutex_destroy(&data->pending_mutex); #endif #ifdef CONFIG_SENSORS_SSP_SHTC1 mutex_destroy(&data->bulk_temp_read_lock); mutex_destroy(&data->cp_temp_adc_lock); #endif err_setup: kfree(data); pr_err("[SSP] %s, probe failed!\n", __func__); exit: pr_info("#####################################################\n\n"); return iRet; }
static int ssp_probe(struct spi_device *spi) { int iRet = 0; struct ssp_data *data; pr_info("[SSP] %s\n", __func__); if (poweroff_charging == 1 || boot_mode_recovery == 1) { pr_err("[SSP] probe exit : lpm %d, recovery %d\n", poweroff_charging, boot_mode_recovery); 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.of_node) { iRet = ssp_parse_dt(&spi->dev, data); if (iRet) { pr_err("[SSP]: %s - Failed to parse DT\n", __func__); goto err_setup; } } else { pr_err("[SSP]: %s - failed to get device node\n", __func__); iRet = -ENODEV; goto err_setup; } spi->mode = SPI_MODE_1; if (spi_setup(spi)) { pr_err("[SSP] %s, failed to setup spi\n", __func__); iRet = -ENODEV; goto err_setup; } data->bProbeIsDone = false; data->fw_dl_state = FW_DL_STATE_NONE; data->spi = spi; spi_set_drvdata(spi, data); mutex_init(&data->comm_mutex); mutex_init(&data->pending_mutex); mutex_init(&data->tsp_mutex); 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; } #if SSP_STATUS_MONITOR iRet = initialize_polling_work(data); if (iRet < 0) { pr_err("[SSP]: %s - could not create delayed_work\n", __func__); goto err_create_workqueue; } #endif 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); #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 ssp_enable(data, true); #if defined(SSP_IRQ_EDGE_PROTECT) prevent_irq = 1; #endif /* 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) { toggle_mcu_reset(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 pr_info("[SSP]: %s - probe success!\n", __func__); enable_debug_timer(data); 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; } #if SSP_STATUS_MONITOR else schedule_delayed_work(&data->polling_work, msecs_to_jiffies(10000)); #endif data->bProbeIsDone = true; iRet = 0; 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); mutex_destroy(&data->comm_mutex); mutex_destroy(&data->pending_mutex); mutex_destroy(&data->tsp_mutex); err_setup: kfree(data); pr_err("[SSP] %s, probe failed!\n", __func__); exit: pr_info("#####################################################\n\n"); return iRet; }
static int ssp_probe(struct i2c_client *client, const struct i2c_device_id *devid) { int iRet = 0; struct ssp_data *data; struct ssp_platform_data *pdata = client->dev.platform_data; if (pdata == NULL) { pr_err("[SSP]: %s - platform_data is null..\n", __func__); iRet = -ENOMEM; goto exit; } 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; } data->client = client; i2c_set_clientdata(client, data); 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->check_ap_rev = pdata->check_ap_rev; if ((data->wakeup_mcu == NULL) || (data->check_mcu_ready == NULL) || (data->check_mcu_busy == NULL) || (data->set_mcu_reset == NULL) || (data->check_ap_rev == NULL)) { pr_err("[SSP]: %s - function callback is null\n", __func__); iRet = -EIO; goto err_reset_null; } pr_info("\n#####################################################\n"); /* check boot loader binary */ check_fwbl(data); initialize_variable(data); iRet = initialize_mcu(data); if (iRet < 0) { pr_err("[SSP]: %s - initialize_mcu failed\n", __func__); goto err_read_reg; } 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; } initialize_magnetic(data); iRet = misc_register(&data->akmd_device); if (iRet) goto err_akmd_device_register; 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; } #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_initialize_sensorhub(data); if (iRet < 0) { pr_err("%s: ssp_initialize_sensorhub err(%d)", __func__, iRet); ssp_remove_sensorhub(data); } #endif enable_irq(data->iIrq); enable_irq_wake(data->iIrq); pr_info("[SSP]: %s - probe success!\n", __func__); enable_debug_timer(data); iRet = 0; goto exit; err_symlink_create: remove_sysfs(data); err_sysfs_create: free_irq(data->iIrq, data); gpio_free(data->client->irq); err_setup_irq: destroy_workqueue(data->debug_wq); err_create_workqueue: misc_deregister(&data->akmd_device); err_akmd_device_register: remove_input_dev(data); err_input_register_device: wake_lock_destroy(&data->ssp_wake_lock); err_read_reg: err_reset_null: kfree(data); pr_err("[SSP]: %s - probe failed!\n", __func__); exit: pr_info("#####################################################\n\n"); return iRet; }
static int ssp_probe(struct spi_device *spi) { int iRet = 0; struct ssp_data *data; pr_info("\n#####################################################\n"); 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; } iRet = initialize_platformdata(data, spi->dev.platform_data); if (iRet < 0) { pr_err("[SSP]: %s - failed initialize pdata\n", __func__); iRet = -ENOMEM; goto err_init_pdata; } mutex_init(&data->comm_mutex); mutex_init(&data->wakeup_mutex); mutex_init(&data->reset_mutex); mutex_init(&data->enable_mutex); spi->mode = SPI_MODE_1; if (spi_setup(spi)) { pr_err("failed to setup spi for ssp_spi\n"); goto err_setup; } data->spi = spi; spi_set_drvdata(spi, data); initialize_variable(data); INIT_DELAYED_WORK(&data->work_firmware, work_function_firmware_update); /* check boot loader binary */ data->fw_dl_state = check_fwbl(data); if (data->fw_dl_state == FW_DL_STATE_NONE) { iRet = startup_mcu(data); if (iRet == ERROR) { data->uResetCnt++; toggle_mcu_reset(data); msleep(SSP_SW_RESET_TIME); iRet = startup_mcu(data); } if (iRet != SUCCESS) { pr_err("[SSP]: %s - startup_mcu failed\n", __func__); goto err_read_reg; } } wake_lock_init(&data->ssp_wake_lock, WAKE_LOCK_SUSPEND, "ssp_wake_lock"); 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_sensors(data); if (iRet < 0) { pr_err("[SSP]: %s - could not initialize sensor\n", __func__); goto err_init_sensor; } /* 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); } ssp_enable(data, true); data->bProbeIsDone = true; pr_info("[SSP]: %s - probe success!\n", __func__); enable_debug_timer(data); 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; } iRet = 0; if (data->check_lpmode() == true) { ssp_charging_motion(data, 1); data->bLpModeEnabled = true; pr_info("[SSP]: LPM Charging...\n"); } else { data->bLpModeEnabled = false; pr_info("[SSP]: Normal Booting OK\n"); } goto exit; err_init_sensor: free_irq(data->iIrq, data); gpio_free(data->spi->irq); err_setup_irq: destroy_workqueue(data->debug_wq); err_create_workqueue: err_input_register_device: wake_lock_destroy(&data->ssp_wake_lock); err_read_reg: err_reset_null: err_setup: mutex_destroy(&data->enable_mutex); mutex_destroy(&data->reset_mutex); mutex_destroy(&data->wakeup_mutex); mutex_destroy(&data->comm_mutex); err_init_pdata: kfree(data); pr_err("[SSP]: %s - probe failed!\n", __func__); exit: pr_info("#####################################################\n\n"); return iRet; }