Lines Matching refs:sensorhub
39 cros_sensorhub_send_sample(struct cros_ec_sensorhub *sensorhub, in cros_sensorhub_send_sample() argument
46 if (id >= sensorhub->sensor_num) in cros_sensorhub_send_sample()
49 cb = sensorhub->push_data[id].push_data_cb; in cros_sensorhub_send_sample()
53 indio_dev = sensorhub->push_data[id].indio_dev; in cros_sensorhub_send_sample()
75 int cros_ec_sensorhub_register_push_data(struct cros_ec_sensorhub *sensorhub, in cros_ec_sensorhub_register_push_data() argument
80 if (sensor_num >= sensorhub->sensor_num) in cros_ec_sensorhub_register_push_data()
82 if (sensorhub->push_data[sensor_num].indio_dev) in cros_ec_sensorhub_register_push_data()
85 sensorhub->push_data[sensor_num].indio_dev = indio_dev; in cros_ec_sensorhub_register_push_data()
86 sensorhub->push_data[sensor_num].push_data_cb = cb; in cros_ec_sensorhub_register_push_data()
92 void cros_ec_sensorhub_unregister_push_data(struct cros_ec_sensorhub *sensorhub, in cros_ec_sensorhub_unregister_push_data() argument
95 sensorhub->push_data[sensor_num].indio_dev = NULL; in cros_ec_sensorhub_unregister_push_data()
96 sensorhub->push_data[sensor_num].push_data_cb = NULL; in cros_ec_sensorhub_unregister_push_data()
110 int cros_ec_sensorhub_ring_fifo_enable(struct cros_ec_sensorhub *sensorhub, in cros_ec_sensorhub_ring_fifo_enable() argument
115 mutex_lock(&sensorhub->cmd_lock); in cros_ec_sensorhub_ring_fifo_enable()
116 if (sensorhub->tight_timestamps) in cros_ec_sensorhub_ring_fifo_enable()
117 for (i = 0; i < sensorhub->sensor_num; i++) in cros_ec_sensorhub_ring_fifo_enable()
118 sensorhub->batch_state[i].last_len = 0; in cros_ec_sensorhub_ring_fifo_enable()
120 sensorhub->params->cmd = MOTIONSENSE_CMD_FIFO_INT_ENABLE; in cros_ec_sensorhub_ring_fifo_enable()
121 sensorhub->params->fifo_int_enable.enable = on; in cros_ec_sensorhub_ring_fifo_enable()
123 sensorhub->msg->outsize = sizeof(struct ec_params_motion_sense); in cros_ec_sensorhub_ring_fifo_enable()
124 sensorhub->msg->insize = sizeof(struct ec_response_motion_sense); in cros_ec_sensorhub_ring_fifo_enable()
126 ret = cros_ec_cmd_xfer_status(sensorhub->ec->ec_dev, sensorhub->msg); in cros_ec_sensorhub_ring_fifo_enable()
127 mutex_unlock(&sensorhub->cmd_lock); in cros_ec_sensorhub_ring_fifo_enable()
396 *sensorhub, in cros_ec_sensor_ring_check_for_past_timestamp()
403 if (sensorhub->batch_state[sensor_id].newest_sensor_event > in cros_ec_sensor_ring_check_for_past_timestamp()
407 sensorhub->batch_state[sensor_id].last_ts; in cros_ec_sensor_ring_check_for_past_timestamp()
409 sensorhub->batch_state[sensor_id].newest_sensor_event = in cros_ec_sensor_ring_check_for_past_timestamp()
428 cros_ec_sensor_ring_process_event(struct cros_ec_sensorhub *sensorhub, in cros_ec_sensor_ring_process_event() argument
449 &sensorhub->overflow_a); in cros_ec_sensor_ring_process_event()
451 &sensorhub->overflow_b); in cros_ec_sensor_ring_process_event()
453 if (sensorhub->tight_timestamps) { in cros_ec_sensor_ring_process_event()
455 &sensorhub->filter, b, c); in cros_ec_sensor_ring_process_event()
457 &sensorhub->filter, a); in cros_ec_sensor_ring_process_event()
481 if (sensorhub->tight_timestamps) { in cros_ec_sensor_ring_process_event()
482 sensorhub->batch_state[in->sensor_num].last_len = 0; in cros_ec_sensor_ring_process_event()
483 sensorhub->batch_state[in->sensor_num].penul_len = 0; in cros_ec_sensor_ring_process_event()
496 if (sensorhub->tight_timestamps) in cros_ec_sensor_ring_process_event()
497 sensorhub->batch_state[out->sensor_id].last_len = 0; in cros_ec_sensor_ring_process_event()
522 sensorhub->future_timestamp_total_ns += in cros_ec_sensor_ring_process_event()
524 if (++sensorhub->future_timestamp_count == in cros_ec_sensor_ring_process_event()
526 s64 avg = div_s64(sensorhub->future_timestamp_total_ns, in cros_ec_sensor_ring_process_event()
527 sensorhub->future_timestamp_count); in cros_ec_sensor_ring_process_event()
528 dev_warn_ratelimited(sensorhub->dev, in cros_ec_sensor_ring_process_event()
531 sensorhub->future_timestamp_count = 0; in cros_ec_sensor_ring_process_event()
532 sensorhub->future_timestamp_total_ns = 0; in cros_ec_sensor_ring_process_event()
543 if (sensorhub->tight_timestamps) in cros_ec_sensor_ring_process_event()
544 cros_ec_sensor_ring_check_for_past_timestamp(sensorhub, out); in cros_ec_sensor_ring_process_event()
580 cros_ec_sensor_ring_spread_add(struct cros_ec_sensorhub *sensorhub, in cros_ec_sensor_ring_spread_add() argument
587 for_each_set_bit(id, &sensor_mask, sensorhub->sensor_num) { in cros_ec_sensor_ring_spread_add()
588 for (batch_start = sensorhub->ring; batch_start < last_out; in cros_ec_sensor_ring_spread_add()
616 cros_sensorhub_send_sample(sensorhub, in cros_ec_sensor_ring_spread_add()
623 sensorhub->batch_state[id].last_ts) { in cros_ec_sensor_ring_spread_add()
625 sensorhub->batch_state[id].last_ts; in cros_ec_sensor_ring_spread_add()
626 batch_len = sensorhub->batch_state[id].last_len; in cros_ec_sensor_ring_spread_add()
630 sensorhub->batch_state[id].last_ts = in cros_ec_sensor_ring_spread_add()
631 sensorhub->batch_state[id].penul_ts; in cros_ec_sensor_ring_spread_add()
632 sensorhub->batch_state[id].last_len = in cros_ec_sensor_ring_spread_add()
633 sensorhub->batch_state[id].penul_len; in cros_ec_sensor_ring_spread_add()
642 cros_sensorhub_send_sample(sensorhub, in cros_ec_sensor_ring_spread_add()
669 if (sensorhub->batch_state[id].last_len == 0) { in cros_ec_sensor_ring_spread_add()
670 dev_warn(sensorhub->dev, "Sensor %d: lost %d samples when spreading\n", in cros_ec_sensor_ring_spread_add()
682 sensorhub->batch_state[id].last_ts, in cros_ec_sensor_ring_spread_add()
683 sensorhub->batch_state[id].last_len); in cros_ec_sensor_ring_spread_add()
684 dev_dbg(sensorhub->dev, in cros_ec_sensor_ring_spread_add()
687 sensorhub->batch_state[id].last_ts, in cros_ec_sensor_ring_spread_add()
688 sensorhub->batch_state[id].last_len, in cros_ec_sensor_ring_spread_add()
708 cros_sensorhub_send_sample(sensorhub, s); in cros_ec_sensor_ring_spread_add()
712 sensorhub->batch_state[id].penul_ts = in cros_ec_sensor_ring_spread_add()
713 sensorhub->batch_state[id].last_ts; in cros_ec_sensor_ring_spread_add()
714 sensorhub->batch_state[id].penul_len = in cros_ec_sensor_ring_spread_add()
715 sensorhub->batch_state[id].last_len; in cros_ec_sensor_ring_spread_add()
717 sensorhub->batch_state[id].last_ts = in cros_ec_sensor_ring_spread_add()
719 sensorhub->batch_state[id].last_len = batch_len; in cros_ec_sensor_ring_spread_add()
748 cros_ec_sensor_ring_spread_add_legacy(struct cros_ec_sensorhub *sensorhub, in cros_ec_sensor_ring_spread_add_legacy() argument
757 for_each_set_bit(i, &sensor_mask, sensorhub->sensor_num) { in cros_ec_sensor_ring_spread_add_legacy()
762 for (out = sensorhub->ring; out < last_out; out++) { in cros_ec_sensor_ring_spread_add_legacy()
784 for (out = sensorhub->ring; out < last_out; out++) { in cros_ec_sensor_ring_spread_add_legacy()
793 for (out = sensorhub->ring; out < last_out; out++) in cros_ec_sensor_ring_spread_add_legacy()
794 cros_sensorhub_send_sample(sensorhub, out); in cros_ec_sensor_ring_spread_add_legacy()
804 static void cros_ec_sensorhub_ring_handler(struct cros_ec_sensorhub *sensorhub) in cros_ec_sensorhub_ring_handler() argument
807 sensorhub->fifo_info; in cros_ec_sensorhub_ring_handler()
808 struct cros_ec_dev *ec = sensorhub->ec; in cros_ec_sensorhub_ring_handler()
815 mutex_lock(&sensorhub->cmd_lock); in cros_ec_sensorhub_ring_handler()
821 sizeof(u16) * sensorhub->sensor_num; in cros_ec_sensorhub_ring_handler()
824 sensorhub->params->cmd = MOTIONSENSE_CMD_FIFO_INFO; in cros_ec_sensorhub_ring_handler()
825 sensorhub->msg->outsize = 1; in cros_ec_sensorhub_ring_handler()
826 sensorhub->msg->insize = fifo_info_length; in cros_ec_sensorhub_ring_handler()
828 if (cros_ec_cmd_xfer_status(ec->ec_dev, sensorhub->msg) < 0) in cros_ec_sensorhub_ring_handler()
831 memcpy(fifo_info, &sensorhub->resp->fifo_info, in cros_ec_sensorhub_ring_handler()
840 fifo_timestamp = sensorhub->fifo_timestamp[ in cros_ec_sensorhub_ring_handler()
844 if (fifo_info->count > sensorhub->fifo_size || in cros_ec_sensorhub_ring_handler()
845 fifo_info->size != sensorhub->fifo_size) { in cros_ec_sensorhub_ring_handler()
846 dev_warn(sensorhub->dev, in cros_ec_sensorhub_ring_handler()
849 sensorhub->fifo_size); in cros_ec_sensorhub_ring_handler()
854 current_timestamp = sensorhub->fifo_timestamp[CROS_EC_SENSOR_LAST_TS]; in cros_ec_sensorhub_ring_handler()
855 out = sensorhub->ring; in cros_ec_sensorhub_ring_handler()
857 sensorhub->params->cmd = MOTIONSENSE_CMD_FIFO_READ; in cros_ec_sensorhub_ring_handler()
858 sensorhub->params->fifo_read.max_data_vector = in cros_ec_sensorhub_ring_handler()
860 sensorhub->msg->outsize = in cros_ec_sensorhub_ring_handler()
862 sensorhub->msg->insize = in cros_ec_sensorhub_ring_handler()
863 sizeof(sensorhub->resp->fifo_read) + in cros_ec_sensorhub_ring_handler()
864 sensorhub->params->fifo_read.max_data_vector * in cros_ec_sensorhub_ring_handler()
866 ret = cros_ec_cmd_xfer_status(ec->ec_dev, sensorhub->msg); in cros_ec_sensorhub_ring_handler()
868 dev_warn(sensorhub->dev, "Fifo error: %d\n", ret); in cros_ec_sensorhub_ring_handler()
871 number_data = sensorhub->resp->fifo_read.number_data; in cros_ec_sensorhub_ring_handler()
873 dev_dbg(sensorhub->dev, "Unexpected empty FIFO\n"); in cros_ec_sensorhub_ring_handler()
877 dev_warn(sensorhub->dev, in cros_ec_sensorhub_ring_handler()
883 sensorhub->ring + fifo_info->count) { in cros_ec_sensorhub_ring_handler()
884 dev_warn(sensorhub->dev, in cros_ec_sensorhub_ring_handler()
886 i, out - sensorhub->ring, i + number_data, in cros_ec_sensorhub_ring_handler()
891 for (in = sensorhub->resp->fifo_read.data, j = 0; in cros_ec_sensorhub_ring_handler()
894 sensorhub, fifo_info, in cros_ec_sensorhub_ring_handler()
903 mutex_unlock(&sensorhub->cmd_lock); in cros_ec_sensorhub_ring_handler()
906 if (out == sensorhub->ring) in cros_ec_sensorhub_ring_handler()
916 if (!sensorhub->tight_timestamps && in cros_ec_sensorhub_ring_handler()
922 for (i = 0; i < sensorhub->sensor_num; i++) { in cros_ec_sensorhub_ring_handler()
924 dev_warn_ratelimited(sensorhub->dev, in cros_ec_sensorhub_ring_handler()
928 if (sensorhub->tight_timestamps) in cros_ec_sensorhub_ring_handler()
929 sensorhub->batch_state[i].last_len = 0; in cros_ec_sensorhub_ring_handler()
937 if (sensorhub->tight_timestamps) in cros_ec_sensorhub_ring_handler()
938 cros_ec_sensor_ring_spread_add(sensorhub, sensor_mask, in cros_ec_sensorhub_ring_handler()
941 cros_ec_sensor_ring_spread_add_legacy(sensorhub, sensor_mask, in cros_ec_sensorhub_ring_handler()
946 sensorhub->fifo_timestamp[CROS_EC_SENSOR_LAST_TS] = current_timestamp; in cros_ec_sensorhub_ring_handler()
950 mutex_unlock(&sensorhub->cmd_lock); in cros_ec_sensorhub_ring_handler()
957 struct cros_ec_sensorhub *sensorhub; in cros_ec_sensorhub_event() local
960 sensorhub = container_of(nb, struct cros_ec_sensorhub, notifier); in cros_ec_sensorhub_event()
961 ec_dev = sensorhub->ec->ec_dev; in cros_ec_sensorhub_event()
974 memcpy(sensorhub->fifo_info, &ec_dev->event_data.data.sensor_fifo.info, in cros_ec_sensorhub_event()
975 sizeof(*sensorhub->fifo_info)); in cros_ec_sensorhub_event()
976 sensorhub->fifo_timestamp[CROS_EC_SENSOR_NEW_TS] = in cros_ec_sensorhub_event()
978 cros_ec_sensorhub_ring_handler(sensorhub); in cros_ec_sensorhub_event()
991 int cros_ec_sensorhub_ring_allocate(struct cros_ec_sensorhub *sensorhub) in cros_ec_sensorhub_ring_allocate() argument
995 sizeof(u16) * sensorhub->sensor_num; in cros_ec_sensorhub_ring_allocate()
998 sensorhub->fifo_info = devm_kzalloc(sensorhub->dev, fifo_info_length, in cros_ec_sensorhub_ring_allocate()
1000 if (!sensorhub->fifo_info) in cros_ec_sensorhub_ring_allocate()
1007 sensorhub->push_data = devm_kcalloc(sensorhub->dev, in cros_ec_sensorhub_ring_allocate()
1008 sensorhub->sensor_num, in cros_ec_sensorhub_ring_allocate()
1009 sizeof(*sensorhub->push_data), in cros_ec_sensorhub_ring_allocate()
1011 if (!sensorhub->push_data) in cros_ec_sensorhub_ring_allocate()
1014 sensorhub->tight_timestamps = cros_ec_check_features( in cros_ec_sensorhub_ring_allocate()
1015 sensorhub->ec, in cros_ec_sensorhub_ring_allocate()
1018 if (sensorhub->tight_timestamps) { in cros_ec_sensorhub_ring_allocate()
1019 sensorhub->batch_state = devm_kcalloc(sensorhub->dev, in cros_ec_sensorhub_ring_allocate()
1020 sensorhub->sensor_num, in cros_ec_sensorhub_ring_allocate()
1021 sizeof(*sensorhub->batch_state), in cros_ec_sensorhub_ring_allocate()
1023 if (!sensorhub->batch_state) in cros_ec_sensorhub_ring_allocate()
1038 int cros_ec_sensorhub_ring_add(struct cros_ec_sensorhub *sensorhub) in cros_ec_sensorhub_ring_add() argument
1040 struct cros_ec_dev *ec = sensorhub->ec; in cros_ec_sensorhub_ring_add()
1044 sizeof(u16) * sensorhub->sensor_num; in cros_ec_sensorhub_ring_add()
1047 sensorhub->msg->version = 2; in cros_ec_sensorhub_ring_add()
1048 sensorhub->params->cmd = MOTIONSENSE_CMD_FIFO_INFO; in cros_ec_sensorhub_ring_add()
1049 sensorhub->msg->outsize = 1; in cros_ec_sensorhub_ring_add()
1050 sensorhub->msg->insize = fifo_info_length; in cros_ec_sensorhub_ring_add()
1052 ret = cros_ec_cmd_xfer_status(ec->ec_dev, sensorhub->msg); in cros_ec_sensorhub_ring_add()
1060 sensorhub->fifo_size = sensorhub->resp->fifo_info.size; in cros_ec_sensorhub_ring_add()
1061 sensorhub->ring = devm_kcalloc(sensorhub->dev, sensorhub->fifo_size, in cros_ec_sensorhub_ring_add()
1062 sizeof(*sensorhub->ring), GFP_KERNEL); in cros_ec_sensorhub_ring_add()
1063 if (!sensorhub->ring) in cros_ec_sensorhub_ring_add()
1066 sensorhub->fifo_timestamp[CROS_EC_SENSOR_LAST_TS] = in cros_ec_sensorhub_ring_add()
1070 sensorhub->notifier.notifier_call = cros_ec_sensorhub_event; in cros_ec_sensorhub_ring_add()
1072 &sensorhub->notifier); in cros_ec_sensorhub_ring_add()
1077 return cros_ec_sensorhub_ring_fifo_enable(sensorhub, true); in cros_ec_sensorhub_ring_add()
1082 struct cros_ec_sensorhub *sensorhub = arg; in cros_ec_sensorhub_ring_remove() local
1083 struct cros_ec_device *ec_dev = sensorhub->ec->ec_dev; in cros_ec_sensorhub_ring_remove()
1086 cros_ec_sensorhub_ring_fifo_enable(sensorhub, false); in cros_ec_sensorhub_ring_remove()
1088 &sensorhub->notifier); in cros_ec_sensorhub_ring_remove()