Lines Matching refs:data

72 static void ssp_toggle_mcu_reset_gpio(struct ssp_data *data)  in ssp_toggle_mcu_reset_gpio()  argument
74 gpio_set_value(data->mcu_reset_gpio, 0); in ssp_toggle_mcu_reset_gpio()
76 gpio_set_value(data->mcu_reset_gpio, 1); in ssp_toggle_mcu_reset_gpio()
80 static void ssp_sync_available_sensors(struct ssp_data *data) in ssp_sync_available_sensors() argument
85 if (data->available_sensors & BIT(i)) { in ssp_sync_available_sensors()
86 ret = ssp_enable_sensor(data, i, data->delay_buf[i]); in ssp_sync_available_sensors()
88 dev_err(&data->spi->dev, in ssp_sync_available_sensors()
95 ret = ssp_command(data, SSP_MSG2SSP_AP_MCU_SET_DUMPMODE, in ssp_sync_available_sensors()
96 data->mcu_dump_mode); in ssp_sync_available_sensors()
98 dev_err(&data->spi->dev, in ssp_sync_available_sensors()
102 static void ssp_enable_mcu(struct ssp_data *data, bool enable) in ssp_enable_mcu() argument
104 dev_info(&data->spi->dev, "current shutdown = %d, old = %d\n", enable, in ssp_enable_mcu()
105 data->shut_down); in ssp_enable_mcu()
107 if (enable && data->shut_down) { in ssp_enable_mcu()
108 data->shut_down = false; in ssp_enable_mcu()
109 enable_irq(data->spi->irq); in ssp_enable_mcu()
110 enable_irq_wake(data->spi->irq); in ssp_enable_mcu()
111 } else if (!enable && !data->shut_down) { in ssp_enable_mcu()
112 data->shut_down = true; in ssp_enable_mcu()
113 disable_irq(data->spi->irq); in ssp_enable_mcu()
114 disable_irq_wake(data->spi->irq); in ssp_enable_mcu()
116 dev_warn(&data->spi->dev, "current shutdown = %d, old = %d\n", in ssp_enable_mcu()
117 enable, data->shut_down); in ssp_enable_mcu()
125 static int ssp_check_fwbl(struct ssp_data *data) in ssp_check_fwbl() argument
130 data->cur_firm_rev = ssp_get_firmware_rev(data); in ssp_check_fwbl()
131 if (data->cur_firm_rev == SSP_INVALID_REVISION || in ssp_check_fwbl()
132 data->cur_firm_rev == SSP_INVALID_REVISION2) { in ssp_check_fwbl()
133 dev_warn(&data->spi->dev, in ssp_check_fwbl()
140 if (data->cur_firm_rev == SSP_INVALID_REVISION || in ssp_check_fwbl()
141 data->cur_firm_rev == SSP_INVALID_REVISION2) { in ssp_check_fwbl()
142 dev_err(&data->spi->dev, "SSP_INVALID_REVISION\n"); in ssp_check_fwbl()
146 dev_info(&data->spi->dev, in ssp_check_fwbl()
148 data->cur_firm_rev, in ssp_check_fwbl()
149 data->sensorhub_info->fw_rev); in ssp_check_fwbl()
151 if (data->cur_firm_rev != data->sensorhub_info->fw_rev) in ssp_check_fwbl()
157 static void ssp_reset_mcu(struct ssp_data *data) in ssp_reset_mcu() argument
159 ssp_enable_mcu(data, false); in ssp_reset_mcu()
160 ssp_clean_pending_list(data); in ssp_reset_mcu()
161 ssp_toggle_mcu_reset_gpio(data); in ssp_reset_mcu()
162 ssp_enable_mcu(data, true); in ssp_reset_mcu()
167 struct ssp_data *data = container_of(work, struct ssp_data, work_wdt); in ssp_wdt_work_func() local
169 dev_err(&data->spi->dev, "%s - Sensor state: 0x%x, RC: %u, CC: %u\n", in ssp_wdt_work_func()
170 __func__, data->available_sensors, data->reset_cnt, in ssp_wdt_work_func()
171 data->com_fail_cnt); in ssp_wdt_work_func()
173 ssp_reset_mcu(data); in ssp_wdt_work_func()
174 data->com_fail_cnt = 0; in ssp_wdt_work_func()
175 data->timeout_cnt = 0; in ssp_wdt_work_func()
180 struct ssp_data *data = (struct ssp_data *)ptr; in ssp_wdt_timer_func() local
182 switch (data->fw_dl_state) { in ssp_wdt_timer_func()
189 if (data->timeout_cnt > SSP_LIMIT_TIMEOUT_CNT || in ssp_wdt_timer_func()
190 data->com_fail_cnt > SSP_LIMIT_RESET_CNT) in ssp_wdt_timer_func()
191 queue_work(system_power_efficient_wq, &data->work_wdt); in ssp_wdt_timer_func()
193 mod_timer(&data->wdt_timer, jiffies + msecs_to_jiffies(SSP_WDT_TIME)); in ssp_wdt_timer_func()
196 static void ssp_enable_wdt_timer(struct ssp_data *data) in ssp_enable_wdt_timer() argument
198 mod_timer(&data->wdt_timer, jiffies + msecs_to_jiffies(SSP_WDT_TIME)); in ssp_enable_wdt_timer()
201 static void ssp_disable_wdt_timer(struct ssp_data *data) in ssp_disable_wdt_timer() argument
203 del_timer_sync(&data->wdt_timer); in ssp_disable_wdt_timer()
204 cancel_work_sync(&data->work_wdt); in ssp_disable_wdt_timer()
214 u32 ssp_get_sensor_delay(struct ssp_data *data, enum ssp_sensor_type type) in ssp_get_sensor_delay() argument
216 return data->delay_buf[type]; in ssp_get_sensor_delay()
228 int ssp_enable_sensor(struct ssp_data *data, enum ssp_sensor_type type, in ssp_enable_sensor() argument
235 to_send.b = cpu_to_le32(data->batch_latency_buf[type]); in ssp_enable_sensor()
236 to_send.c = data->batch_opt_buf[type]; in ssp_enable_sensor()
238 switch (data->check_status[type]) { in ssp_enable_sensor()
242 ret = ssp_send_instruction(data, in ssp_enable_sensor()
247 dev_err(&data->spi->dev, "Enabling sensor failed\n"); in ssp_enable_sensor()
248 data->check_status[type] = SSP_NO_SENSOR_STATE; in ssp_enable_sensor()
252 data->sensor_enable |= BIT(type); in ssp_enable_sensor()
253 data->check_status[type] = SSP_RUNNING_SENSOR_STATE; in ssp_enable_sensor()
256 ret = ssp_send_instruction(data, in ssp_enable_sensor()
260 dev_err(&data->spi->dev, in ssp_enable_sensor()
266 data->check_status[type] = SSP_ADD_SENSOR_STATE; in ssp_enable_sensor()
270 data->delay_buf[type] = delay; in ssp_enable_sensor()
272 if (atomic_inc_return(&data->enable_refcount) == 1) in ssp_enable_sensor()
273 ssp_enable_wdt_timer(data); in ssp_enable_sensor()
290 int ssp_change_delay(struct ssp_data *data, enum ssp_sensor_type type, in ssp_change_delay() argument
297 to_send.b = cpu_to_le32(data->batch_latency_buf[type]); in ssp_change_delay()
298 to_send.c = data->batch_opt_buf[type]; in ssp_change_delay()
300 ret = ssp_send_instruction(data, SSP_MSG2SSP_INST_CHANGE_DELAY, type, in ssp_change_delay()
303 dev_err(&data->spi->dev, "Changing sensor delay failed\n"); in ssp_change_delay()
307 data->delay_buf[type] = delay; in ssp_change_delay()
321 int ssp_disable_sensor(struct ssp_data *data, enum ssp_sensor_type type) in ssp_disable_sensor() argument
326 if (data->sensor_enable & BIT(type)) { in ssp_disable_sensor()
327 command = cpu_to_le32(data->delay_buf[type]); in ssp_disable_sensor()
329 ret = ssp_send_instruction(data, in ssp_disable_sensor()
334 dev_err(&data->spi->dev, "Remove sensor fail\n"); in ssp_disable_sensor()
338 data->sensor_enable &= ~BIT(type); in ssp_disable_sensor()
341 data->check_status[type] = SSP_ADD_SENSOR_STATE; in ssp_disable_sensor()
343 if (atomic_dec_and_test(&data->enable_refcount)) in ssp_disable_sensor()
344 ssp_disable_wdt_timer(data); in ssp_disable_sensor()
352 struct ssp_data *data = dev_id; in ssp_irq_thread_fn() local
358 ssp_irq_msg(data); in ssp_irq_thread_fn()
363 static int ssp_initialize_mcu(struct ssp_data *data) in ssp_initialize_mcu() argument
367 ssp_clean_pending_list(data); in ssp_initialize_mcu()
369 ret = ssp_get_chipid(data); in ssp_initialize_mcu()
371 dev_err(&data->spi->dev, "%s - MCU %s ret = %d\n", __func__, in ssp_initialize_mcu()
377 dev_info(&data->spi->dev, "MCU device ID = %d\n", ret); in ssp_initialize_mcu()
383 ret = ssp_set_magnetic_matrix(data); in ssp_initialize_mcu()
385 dev_err(&data->spi->dev, in ssp_initialize_mcu()
390 data->available_sensors = ssp_get_sensor_scanning_info(data); in ssp_initialize_mcu()
391 if (data->available_sensors == 0) { in ssp_initialize_mcu()
392 dev_err(&data->spi->dev, in ssp_initialize_mcu()
397 data->cur_firm_rev = ssp_get_firmware_rev(data); in ssp_initialize_mcu()
398 dev_info(&data->spi->dev, "MCU Firm Rev : New = %8u\n", in ssp_initialize_mcu()
399 data->cur_firm_rev); in ssp_initialize_mcu()
401 return ssp_command(data, SSP_MSG2SSP_AP_MCU_DUMP_CHECK, 0); in ssp_initialize_mcu()
410 struct ssp_data *data = container_of((struct delayed_work *)work, in ssp_refresh_task() local
413 dev_info(&data->spi->dev, "refreshing\n"); in ssp_refresh_task()
415 data->reset_cnt++; in ssp_refresh_task()
417 if (ssp_initialize_mcu(data) >= 0) { in ssp_refresh_task()
418 ssp_sync_available_sensors(data); in ssp_refresh_task()
419 if (data->last_ap_state != 0) in ssp_refresh_task()
420 ssp_command(data, data->last_ap_state, 0); in ssp_refresh_task()
422 if (data->last_resume_state != 0) in ssp_refresh_task()
423 ssp_command(data, data->last_resume_state, 0); in ssp_refresh_task()
425 data->timeout_cnt = 0; in ssp_refresh_task()
426 data->com_fail_cnt = 0; in ssp_refresh_task()
430 int ssp_queue_ssp_refresh_task(struct ssp_data *data, unsigned int delay) in ssp_queue_ssp_refresh_task() argument
432 cancel_delayed_work_sync(&data->work_refresh); in ssp_queue_ssp_refresh_task()
435 &data->work_refresh, in ssp_queue_ssp_refresh_task()
443 .data = &ssp_rinato_info,
446 .data = &ssp_thermostat_info,
455 struct ssp_data *data; in ssp_parse_dt() local
459 data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL); in ssp_parse_dt()
460 if (!data) in ssp_parse_dt()
463 data->mcu_ap_gpio = of_get_named_gpio(node, "mcu-ap-gpios", 0); in ssp_parse_dt()
464 if (data->mcu_ap_gpio < 0) in ssp_parse_dt()
467 data->ap_mcu_gpio = of_get_named_gpio(node, "ap-mcu-gpios", 0); in ssp_parse_dt()
468 if (data->ap_mcu_gpio < 0) in ssp_parse_dt()
471 data->mcu_reset_gpio = of_get_named_gpio(node, "mcu-reset-gpios", 0); in ssp_parse_dt()
472 if (data->mcu_reset_gpio < 0) in ssp_parse_dt()
475 ret = devm_gpio_request_one(dev, data->ap_mcu_gpio, GPIOF_OUT_INIT_HIGH, in ssp_parse_dt()
480 ret = devm_gpio_request_one(dev, data->mcu_reset_gpio, in ssp_parse_dt()
489 data->sensorhub_info = (struct ssp_sensorhub_info *)match->data; in ssp_parse_dt()
491 dev_set_drvdata(dev, data); in ssp_parse_dt()
493 return data; in ssp_parse_dt()
496 devm_gpio_free(dev, data->mcu_reset_gpio); in ssp_parse_dt()
498 devm_gpio_free(dev, data->ap_mcu_gpio); in ssp_parse_dt()
500 devm_kfree(dev, data); in ssp_parse_dt()
518 struct ssp_data *data = dev_get_drvdata(indio_dev->dev.parent->parent); in ssp_register_consumer() local
520 data->sensor_devs[type] = indio_dev; in ssp_register_consumer()
527 struct ssp_data *data; in ssp_probe() local
529 data = ssp_parse_dt(&spi->dev); in ssp_probe()
530 if (!data) { in ssp_probe()
549 data->fw_dl_state = SSP_FW_DL_STATE_NONE; in ssp_probe()
550 data->spi = spi; in ssp_probe()
551 spi_set_drvdata(spi, data); in ssp_probe()
553 mutex_init(&data->comm_lock); in ssp_probe()
556 data->delay_buf[i] = SSP_DEFAULT_POLLING_DELAY; in ssp_probe()
557 data->batch_latency_buf[i] = 0; in ssp_probe()
558 data->batch_opt_buf[i] = 0; in ssp_probe()
559 data->check_status[i] = SSP_INITIALIZATION_STATE; in ssp_probe()
562 data->delay_buf[SSP_BIO_HRM_LIB] = 100; in ssp_probe()
564 data->time_syncing = true; in ssp_probe()
566 mutex_init(&data->pending_lock); in ssp_probe()
567 INIT_LIST_HEAD(&data->pending_list); in ssp_probe()
569 atomic_set(&data->enable_refcount, 0); in ssp_probe()
571 INIT_WORK(&data->work_wdt, ssp_wdt_work_func); in ssp_probe()
572 INIT_DELAYED_WORK(&data->work_refresh, ssp_refresh_task); in ssp_probe()
574 setup_timer(&data->wdt_timer, ssp_wdt_timer_func, (unsigned long)data); in ssp_probe()
576 ret = request_threaded_irq(data->spi->irq, NULL, in ssp_probe()
579 "SSP_Int", data); in ssp_probe()
586 data->shut_down = false; in ssp_probe()
589 enable_irq_wake(data->spi->irq); in ssp_probe()
591 data->fw_dl_state = ssp_check_fwbl(data); in ssp_probe()
592 if (data->fw_dl_state == SSP_FW_DL_STATE_NONE) { in ssp_probe()
593 ret = ssp_initialize_mcu(data); in ssp_probe()
607 free_irq(data->spi->irq, data); in ssp_probe()
609 mutex_destroy(&data->pending_lock); in ssp_probe()
610 mutex_destroy(&data->comm_lock); in ssp_probe()
619 struct ssp_data *data = spi_get_drvdata(spi); in ssp_remove() local
621 if (ssp_command(data, SSP_MSG2SSP_AP_STATUS_SHUTDOWN, 0) < 0) in ssp_remove()
622 dev_err(&data->spi->dev, in ssp_remove()
625 ssp_enable_mcu(data, false); in ssp_remove()
626 ssp_disable_wdt_timer(data); in ssp_remove()
628 ssp_clean_pending_list(data); in ssp_remove()
630 free_irq(data->spi->irq, data); in ssp_remove()
632 del_timer_sync(&data->wdt_timer); in ssp_remove()
633 cancel_work_sync(&data->work_wdt); in ssp_remove()
635 mutex_destroy(&data->comm_lock); in ssp_remove()
636 mutex_destroy(&data->pending_lock); in ssp_remove()
647 struct ssp_data *data = spi_get_drvdata(to_spi_device(dev)); in ssp_suspend() local
649 data->last_resume_state = SSP_MSG2SSP_AP_STATUS_SUSPEND; in ssp_suspend()
651 if (atomic_read(&data->enable_refcount) > 0) in ssp_suspend()
652 ssp_disable_wdt_timer(data); in ssp_suspend()
654 ret = ssp_command(data, SSP_MSG2SSP_AP_STATUS_SUSPEND, 0); in ssp_suspend()
656 dev_err(&data->spi->dev, in ssp_suspend()
659 ssp_enable_wdt_timer(data); in ssp_suspend()
663 data->time_syncing = false; in ssp_suspend()
664 disable_irq(data->spi->irq); in ssp_suspend()
672 struct ssp_data *data = spi_get_drvdata(to_spi_device(dev)); in ssp_resume() local
674 enable_irq(data->spi->irq); in ssp_resume()
676 if (atomic_read(&data->enable_refcount) > 0) in ssp_resume()
677 ssp_enable_wdt_timer(data); in ssp_resume()
679 ret = ssp_command(data, SSP_MSG2SSP_AP_STATUS_RESUME, 0); in ssp_resume()
681 dev_err(&data->spi->dev, in ssp_resume()
683 ssp_disable_wdt_timer(data); in ssp_resume()
688 data->last_resume_state = SSP_MSG2SSP_AP_STATUS_RESUME; in ssp_resume()