Lines Matching full:data

61 static void ssp_toggle_mcu_reset_gpio(struct ssp_data *data)  in ssp_toggle_mcu_reset_gpio()  argument
63 gpiod_set_value(data->mcu_reset_gpiod, 0); in ssp_toggle_mcu_reset_gpio()
65 gpiod_set_value(data->mcu_reset_gpiod, 1); in ssp_toggle_mcu_reset_gpio()
69 static void ssp_sync_available_sensors(struct ssp_data *data) in ssp_sync_available_sensors() argument
74 if (data->available_sensors & BIT(i)) { in ssp_sync_available_sensors()
75 ret = ssp_enable_sensor(data, i, data->delay_buf[i]); in ssp_sync_available_sensors()
77 dev_err(&data->spi->dev, in ssp_sync_available_sensors()
84 ret = ssp_command(data, SSP_MSG2SSP_AP_MCU_SET_DUMPMODE, in ssp_sync_available_sensors()
85 data->mcu_dump_mode); in ssp_sync_available_sensors()
87 dev_err(&data->spi->dev, in ssp_sync_available_sensors()
91 static void ssp_enable_mcu(struct ssp_data *data, bool enable) in ssp_enable_mcu() argument
93 dev_info(&data->spi->dev, "current shutdown = %d, old = %d\n", enable, in ssp_enable_mcu()
94 data->shut_down); in ssp_enable_mcu()
96 if (enable && data->shut_down) { in ssp_enable_mcu()
97 data->shut_down = false; in ssp_enable_mcu()
98 enable_irq(data->spi->irq); in ssp_enable_mcu()
99 enable_irq_wake(data->spi->irq); in ssp_enable_mcu()
100 } else if (!enable && !data->shut_down) { in ssp_enable_mcu()
101 data->shut_down = true; in ssp_enable_mcu()
102 disable_irq(data->spi->irq); in ssp_enable_mcu()
103 disable_irq_wake(data->spi->irq); in ssp_enable_mcu()
105 dev_warn(&data->spi->dev, "current shutdown = %d, old = %d\n", in ssp_enable_mcu()
106 enable, data->shut_down); in ssp_enable_mcu()
114 static int ssp_check_fwbl(struct ssp_data *data) in ssp_check_fwbl() argument
119 data->cur_firm_rev = ssp_get_firmware_rev(data); in ssp_check_fwbl()
120 if (data->cur_firm_rev == SSP_INVALID_REVISION || in ssp_check_fwbl()
121 data->cur_firm_rev == SSP_INVALID_REVISION2) { in ssp_check_fwbl()
122 dev_warn(&data->spi->dev, in ssp_check_fwbl()
129 if (data->cur_firm_rev == SSP_INVALID_REVISION || in ssp_check_fwbl()
130 data->cur_firm_rev == SSP_INVALID_REVISION2) { in ssp_check_fwbl()
131 dev_err(&data->spi->dev, "SSP_INVALID_REVISION\n"); in ssp_check_fwbl()
135 dev_info(&data->spi->dev, in ssp_check_fwbl()
137 data->cur_firm_rev, in ssp_check_fwbl()
138 data->sensorhub_info->fw_rev); in ssp_check_fwbl()
140 if (data->cur_firm_rev != data->sensorhub_info->fw_rev) in ssp_check_fwbl()
146 static void ssp_reset_mcu(struct ssp_data *data) in ssp_reset_mcu() argument
148 ssp_enable_mcu(data, false); in ssp_reset_mcu()
149 ssp_clean_pending_list(data); in ssp_reset_mcu()
150 ssp_toggle_mcu_reset_gpio(data); in ssp_reset_mcu()
151 ssp_enable_mcu(data, true); in ssp_reset_mcu()
156 struct ssp_data *data = container_of(work, struct ssp_data, work_wdt); in ssp_wdt_work_func() local
158 dev_err(&data->spi->dev, "%s - Sensor state: 0x%x, RC: %u, CC: %u\n", in ssp_wdt_work_func()
159 __func__, data->available_sensors, data->reset_cnt, in ssp_wdt_work_func()
160 data->com_fail_cnt); in ssp_wdt_work_func()
162 ssp_reset_mcu(data); in ssp_wdt_work_func()
163 data->com_fail_cnt = 0; in ssp_wdt_work_func()
164 data->timeout_cnt = 0; in ssp_wdt_work_func()
169 struct ssp_data *data = from_timer(data, t, wdt_timer); in ssp_wdt_timer_func() local
171 switch (data->fw_dl_state) { in ssp_wdt_timer_func()
178 if (data->timeout_cnt > SSP_LIMIT_TIMEOUT_CNT || in ssp_wdt_timer_func()
179 data->com_fail_cnt > SSP_LIMIT_RESET_CNT) in ssp_wdt_timer_func()
180 queue_work(system_power_efficient_wq, &data->work_wdt); in ssp_wdt_timer_func()
182 mod_timer(&data->wdt_timer, jiffies + msecs_to_jiffies(SSP_WDT_TIME)); in ssp_wdt_timer_func()
185 static void ssp_enable_wdt_timer(struct ssp_data *data) in ssp_enable_wdt_timer() argument
187 mod_timer(&data->wdt_timer, jiffies + msecs_to_jiffies(SSP_WDT_TIME)); in ssp_enable_wdt_timer()
190 static void ssp_disable_wdt_timer(struct ssp_data *data) in ssp_disable_wdt_timer() argument
192 del_timer_sync(&data->wdt_timer); in ssp_disable_wdt_timer()
193 cancel_work_sync(&data->work_wdt); in ssp_disable_wdt_timer()
197 * ssp_get_sensor_delay() - gets sensor data acquisition period
198 * @data: sensorhub structure
203 u32 ssp_get_sensor_delay(struct ssp_data *data, enum ssp_sensor_type type) in ssp_get_sensor_delay() argument
205 return data->delay_buf[type]; in ssp_get_sensor_delay()
210 * ssp_enable_sensor() - enables data acquisition for sensor
211 * @data: sensorhub structure
217 int ssp_enable_sensor(struct ssp_data *data, enum ssp_sensor_type type, in ssp_enable_sensor() argument
224 to_send.b = cpu_to_le32(data->batch_latency_buf[type]); in ssp_enable_sensor()
225 to_send.c = data->batch_opt_buf[type]; in ssp_enable_sensor()
227 switch (data->check_status[type]) { in ssp_enable_sensor()
231 ret = ssp_send_instruction(data, in ssp_enable_sensor()
236 dev_err(&data->spi->dev, "Enabling sensor failed\n"); in ssp_enable_sensor()
237 data->check_status[type] = SSP_NO_SENSOR_STATE; in ssp_enable_sensor()
241 data->sensor_enable |= BIT(type); in ssp_enable_sensor()
242 data->check_status[type] = SSP_RUNNING_SENSOR_STATE; in ssp_enable_sensor()
245 ret = ssp_send_instruction(data, in ssp_enable_sensor()
249 dev_err(&data->spi->dev, in ssp_enable_sensor()
255 data->check_status[type] = SSP_ADD_SENSOR_STATE; in ssp_enable_sensor()
259 data->delay_buf[type] = delay; in ssp_enable_sensor()
261 if (atomic_inc_return(&data->enable_refcount) == 1) in ssp_enable_sensor()
262 ssp_enable_wdt_timer(data); in ssp_enable_sensor()
272 * ssp_change_delay() - changes data acquisition for sensor
273 * @data: sensorhub structure
279 int ssp_change_delay(struct ssp_data *data, enum ssp_sensor_type type, in ssp_change_delay() argument
286 to_send.b = cpu_to_le32(data->batch_latency_buf[type]); in ssp_change_delay()
287 to_send.c = data->batch_opt_buf[type]; in ssp_change_delay()
289 ret = ssp_send_instruction(data, SSP_MSG2SSP_INST_CHANGE_DELAY, type, in ssp_change_delay()
292 dev_err(&data->spi->dev, "Changing sensor delay failed\n"); in ssp_change_delay()
296 data->delay_buf[type] = delay; in ssp_change_delay()
305 * @data: sensorhub structure
310 int ssp_disable_sensor(struct ssp_data *data, enum ssp_sensor_type type) in ssp_disable_sensor() argument
315 if (data->sensor_enable & BIT(type)) { in ssp_disable_sensor()
316 command = cpu_to_le32(data->delay_buf[type]); in ssp_disable_sensor()
318 ret = ssp_send_instruction(data, in ssp_disable_sensor()
323 dev_err(&data->spi->dev, "Remove sensor fail\n"); in ssp_disable_sensor()
327 data->sensor_enable &= ~BIT(type); in ssp_disable_sensor()
330 data->check_status[type] = SSP_ADD_SENSOR_STATE; in ssp_disable_sensor()
332 if (atomic_dec_and_test(&data->enable_refcount)) in ssp_disable_sensor()
333 ssp_disable_wdt_timer(data); in ssp_disable_sensor()
341 struct ssp_data *data = dev_id; in ssp_irq_thread_fn() local
347 ssp_irq_msg(data); in ssp_irq_thread_fn()
352 static int ssp_initialize_mcu(struct ssp_data *data) in ssp_initialize_mcu() argument
356 ssp_clean_pending_list(data); in ssp_initialize_mcu()
358 ret = ssp_get_chipid(data); in ssp_initialize_mcu()
360 dev_err(&data->spi->dev, "%s - MCU %s ret = %d\n", __func__, in ssp_initialize_mcu()
366 dev_info(&data->spi->dev, "MCU device ID = %d\n", ret); in ssp_initialize_mcu()
372 ret = ssp_set_magnetic_matrix(data); in ssp_initialize_mcu()
374 dev_err(&data->spi->dev, in ssp_initialize_mcu()
379 data->available_sensors = ssp_get_sensor_scanning_info(data); in ssp_initialize_mcu()
380 if (data->available_sensors == 0) { in ssp_initialize_mcu()
381 dev_err(&data->spi->dev, in ssp_initialize_mcu()
386 data->cur_firm_rev = ssp_get_firmware_rev(data); in ssp_initialize_mcu()
387 dev_info(&data->spi->dev, "MCU Firm Rev : New = %8u\n", in ssp_initialize_mcu()
388 data->cur_firm_rev); in ssp_initialize_mcu()
390 return ssp_command(data, SSP_MSG2SSP_AP_MCU_DUMP_CHECK, 0); in ssp_initialize_mcu()
399 struct ssp_data *data = container_of((struct delayed_work *)work, in ssp_refresh_task() local
402 dev_info(&data->spi->dev, "refreshing\n"); in ssp_refresh_task()
404 data->reset_cnt++; in ssp_refresh_task()
406 if (ssp_initialize_mcu(data) >= 0) { in ssp_refresh_task()
407 ssp_sync_available_sensors(data); in ssp_refresh_task()
408 if (data->last_ap_state != 0) in ssp_refresh_task()
409 ssp_command(data, data->last_ap_state, 0); in ssp_refresh_task()
411 if (data->last_resume_state != 0) in ssp_refresh_task()
412 ssp_command(data, data->last_resume_state, 0); in ssp_refresh_task()
414 data->timeout_cnt = 0; in ssp_refresh_task()
415 data->com_fail_cnt = 0; in ssp_refresh_task()
419 int ssp_queue_ssp_refresh_task(struct ssp_data *data, unsigned int delay) in ssp_queue_ssp_refresh_task() argument
421 cancel_delayed_work_sync(&data->work_refresh); in ssp_queue_ssp_refresh_task()
424 &data->work_refresh, in ssp_queue_ssp_refresh_task()
432 .data = &ssp_rinato_info,
435 .data = &ssp_thermostat_info,
443 struct ssp_data *data; in ssp_parse_dt() local
447 data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL); in ssp_parse_dt()
448 if (!data) in ssp_parse_dt()
451 data->mcu_ap_gpiod = devm_gpiod_get(dev, "mcu-ap", GPIOD_IN); in ssp_parse_dt()
452 if (IS_ERR(data->mcu_ap_gpiod)) in ssp_parse_dt()
455 data->ap_mcu_gpiod = devm_gpiod_get(dev, "ap-mcu", GPIOD_OUT_HIGH); in ssp_parse_dt()
456 if (IS_ERR(data->ap_mcu_gpiod)) in ssp_parse_dt()
459 data->mcu_reset_gpiod = devm_gpiod_get(dev, "mcu-reset", in ssp_parse_dt()
461 if (IS_ERR(data->mcu_reset_gpiod)) in ssp_parse_dt()
468 data->sensorhub_info = match->data; in ssp_parse_dt()
470 dev_set_drvdata(dev, data); in ssp_parse_dt()
472 return data; in ssp_parse_dt()
489 struct ssp_data *data = dev_get_drvdata(indio_dev->dev.parent->parent); in ssp_register_consumer() local
491 data->sensor_devs[type] = indio_dev; in ssp_register_consumer()
498 struct ssp_data *data; in ssp_probe() local
500 data = ssp_parse_dt(&spi->dev); in ssp_probe()
501 if (!data) { in ssp_probe()
502 dev_err(&spi->dev, "Failed to find platform data\n"); in ssp_probe()
521 data->fw_dl_state = SSP_FW_DL_STATE_NONE; in ssp_probe()
522 data->spi = spi; in ssp_probe()
523 spi_set_drvdata(spi, data); in ssp_probe()
525 mutex_init(&data->comm_lock); in ssp_probe()
528 data->delay_buf[i] = SSP_DEFAULT_POLLING_DELAY; in ssp_probe()
529 data->batch_latency_buf[i] = 0; in ssp_probe()
530 data->batch_opt_buf[i] = 0; in ssp_probe()
531 data->check_status[i] = SSP_INITIALIZATION_STATE; in ssp_probe()
534 data->delay_buf[SSP_BIO_HRM_LIB] = 100; in ssp_probe()
536 data->time_syncing = true; in ssp_probe()
538 mutex_init(&data->pending_lock); in ssp_probe()
539 INIT_LIST_HEAD(&data->pending_list); in ssp_probe()
541 atomic_set(&data->enable_refcount, 0); in ssp_probe()
543 INIT_WORK(&data->work_wdt, ssp_wdt_work_func); in ssp_probe()
544 INIT_DELAYED_WORK(&data->work_refresh, ssp_refresh_task); in ssp_probe()
546 timer_setup(&data->wdt_timer, ssp_wdt_timer_func, 0); in ssp_probe()
548 ret = request_threaded_irq(data->spi->irq, NULL, in ssp_probe()
551 "SSP_Int", data); in ssp_probe()
558 data->shut_down = false; in ssp_probe()
561 enable_irq_wake(data->spi->irq); in ssp_probe()
563 data->fw_dl_state = ssp_check_fwbl(data); in ssp_probe()
564 if (data->fw_dl_state == SSP_FW_DL_STATE_NONE) { in ssp_probe()
565 ret = ssp_initialize_mcu(data); in ssp_probe()
579 free_irq(data->spi->irq, data); in ssp_probe()
581 mutex_destroy(&data->pending_lock); in ssp_probe()
582 mutex_destroy(&data->comm_lock); in ssp_probe()
591 struct ssp_data *data = spi_get_drvdata(spi); in ssp_remove() local
593 if (ssp_command(data, SSP_MSG2SSP_AP_STATUS_SHUTDOWN, 0) < 0) in ssp_remove()
594 dev_err(&data->spi->dev, in ssp_remove()
597 ssp_enable_mcu(data, false); in ssp_remove()
598 ssp_disable_wdt_timer(data); in ssp_remove()
600 ssp_clean_pending_list(data); in ssp_remove()
602 free_irq(data->spi->irq, data); in ssp_remove()
604 del_timer_sync(&data->wdt_timer); in ssp_remove()
605 cancel_work_sync(&data->work_wdt); in ssp_remove()
607 mutex_destroy(&data->comm_lock); in ssp_remove()
608 mutex_destroy(&data->pending_lock); in ssp_remove()
619 struct ssp_data *data = spi_get_drvdata(to_spi_device(dev)); in ssp_suspend() local
621 data->last_resume_state = SSP_MSG2SSP_AP_STATUS_SUSPEND; in ssp_suspend()
623 if (atomic_read(&data->enable_refcount) > 0) in ssp_suspend()
624 ssp_disable_wdt_timer(data); in ssp_suspend()
626 ret = ssp_command(data, SSP_MSG2SSP_AP_STATUS_SUSPEND, 0); in ssp_suspend()
628 dev_err(&data->spi->dev, in ssp_suspend()
631 ssp_enable_wdt_timer(data); in ssp_suspend()
635 data->time_syncing = false; in ssp_suspend()
636 disable_irq(data->spi->irq); in ssp_suspend()
644 struct ssp_data *data = spi_get_drvdata(to_spi_device(dev)); in ssp_resume() local
646 enable_irq(data->spi->irq); in ssp_resume()
648 if (atomic_read(&data->enable_refcount) > 0) in ssp_resume()
649 ssp_enable_wdt_timer(data); in ssp_resume()
651 ret = ssp_command(data, SSP_MSG2SSP_AP_STATUS_RESUME, 0); in ssp_resume()
653 dev_err(&data->spi->dev, in ssp_resume()
655 ssp_disable_wdt_timer(data); in ssp_resume()
660 data->last_resume_state = SSP_MSG2SSP_AP_STATUS_RESUME; in ssp_resume()