Lines Matching +full:hw +full:- +full:cal +full:- +full:a

1 // SPDX-License-Identifier: GPL-2.0-only
46 /* Pedometer status registers (R-only) */
67 #define MMA9553_STATUS_TO_BITNUM(bit) (ffs(bit) - 9)
75 * level and is updated every time a step is detected or once a second
91 /* Status register - activity field */
173 * 1. Serialize access to HW (requested by mma9551_core API).
174 * 2. Serialize sequences that power on/off the device and access HW.
193 return (val & mask) >> (ffs(mask) - 1); in mma9553_get_bits()
198 return (current_val & ~mask) | (val << (ffs(mask) - 1)); in mma9553_set_bits()
222 data->num_events = MMA9553_EVENTS_INFO_SIZE; in mma9553_init_events()
223 for (i = 0; i < data->num_events; i++) { in mma9553_init_events()
224 data->events[i].info = &mma9553_events_info[i]; in mma9553_init_events()
225 data->events[i].enabled = false; in mma9553_init_events()
236 for (i = 0; i < data->num_events; i++) in mma9553_get_event()
237 if (data->events[i].info->type == type && in mma9553_get_event()
238 data->events[i].info->mod == mod && in mma9553_get_event()
239 data->events[i].info->dir == dir) in mma9553_get_event()
240 return &data->events[i]; in mma9553_get_event()
251 for (i = 0; i < data->num_events; i++) in mma9553_is_any_event_enabled()
252 if ((check_type && data->events[i].info->type == type && in mma9553_is_any_event_enabled()
253 data->events[i].enabled) || in mma9553_is_any_event_enabled()
254 (!check_type && data->events[i].enabled)) in mma9553_is_any_event_enabled()
271 ret = mma9551_write_config_word(data->client, MMA9551_APPID_PEDOMETER, in mma9553_set_config()
274 dev_err(&data->client->dev, in mma9553_set_config()
282 config = mma9553_set_bits(data->conf.config, 1, in mma9553_set_config()
285 ret = mma9551_write_config_word(data->client, MMA9551_APPID_PEDOMETER, in mma9553_set_config()
288 dev_err(&data->client->dev, in mma9553_set_config()
297 ret = mma9551_read_config_word(data->client, in mma9553_set_config()
304 --retries > 0); in mma9553_set_config()
315 ret = mma9551_read_status_words(data->client, MMA9551_APPID_PEDOMETER, in mma9553_read_activity_stepcnt()
319 dev_err(&data->client->dev, in mma9553_read_activity_stepcnt()
346 if (activity_enabled && ev_step_detect->enabled) in mma9553_conf_gpio()
348 else if (ev_step_detect->enabled) in mma9553_conf_gpio()
355 if (data->gpio_bitnum == bitnum) in mma9553_conf_gpio()
359 if (activity_enabled || ev_step_detect->enabled) { in mma9553_conf_gpio()
360 ret = mma9553_read_activity_stepcnt(data, &data->activity, in mma9553_conf_gpio()
361 &data->stepcnt); in mma9553_conf_gpio()
366 ret = mma9551_gpio_config(data->client, MMA9553_DEFAULT_GPIO_PIN, appid, in mma9553_conf_gpio()
370 data->gpio_bitnum = bitnum; in mma9553_conf_gpio()
379 ret = mma9551_read_version(data->client); in mma9553_init()
385 * a device identification command to differentiate the MMA9553L in mma9553_init()
388 ret = mma9551_read_config_words(data->client, MMA9551_APPID_PEDOMETER, in mma9553_init()
390 sizeof(data->conf) / sizeof(u16), in mma9553_init()
391 (u16 *)&data->conf); in mma9553_init()
393 dev_err(&data->client->dev, in mma9553_init()
399 data->gpio_bitnum = MMA9553_MAX_BITNUM; in mma9553_init()
404 ret = mma9551_app_reset(data->client, MMA9551_RSC_PED); in mma9553_init()
409 data->conf.sleepmin = MMA9553_DEFAULT_SLEEPMIN; in mma9553_init()
410 data->conf.sleepmax = MMA9553_DEFAULT_SLEEPMAX; in mma9553_init()
411 data->conf.sleepthd = MMA9553_DEFAULT_SLEEPTHD; in mma9553_init()
412 data->conf.config = mma9553_set_bits(data->conf.config, 1, in mma9553_init()
418 data->conf.config = mma9553_set_bits(data->conf.config, 1, in mma9553_init()
420 ret = mma9551_write_config_words(data->client, MMA9551_APPID_PEDOMETER, in mma9553_init()
422 sizeof(data->conf) / sizeof(u16), in mma9553_init()
423 (u16 *)&data->conf); in mma9553_init()
425 dev_err(&data->client->dev, in mma9553_init()
430 return mma9551_set_device_state(data->client, true); in mma9553_init()
440 * The HW only counts steps and other dependent in mma9553_read_status_word()
446 data->stepcnt_enabled; in mma9553_read_status_word()
448 dev_err(&data->client->dev, "No channels enabled\n"); in mma9553_read_status_word()
449 return -EINVAL; in mma9553_read_status_word()
452 mutex_lock(&data->mutex); in mma9553_read_status_word()
453 ret = mma9551_read_status_word(data->client, MMA9551_APPID_PEDOMETER, in mma9553_read_status_word()
455 mutex_unlock(&data->mutex); in mma9553_read_status_word()
470 switch (chan->type) { in mma9553_read_raw()
502 if (chan->channel2 == mma9553_activity_to_mod(activity)) in mma9553_read_raw()
508 return -EINVAL; in mma9553_read_raw()
511 switch (chan->type) { in mma9553_read_raw()
513 if (chan->channel2 != IIO_MOD_ROOT_SUM_SQUARED_X_Y_Z) in mma9553_read_raw()
514 return -EINVAL; in mma9553_read_raw()
522 case IIO_ENERGY: /* Cal or kcal */ in mma9553_read_raw()
531 mutex_lock(&data->mutex); in mma9553_read_raw()
532 ret = mma9551_read_accel_chan(data->client, in mma9553_read_raw()
534 mutex_unlock(&data->mutex); in mma9553_read_raw()
537 return -EINVAL; in mma9553_read_raw()
540 switch (chan->type) { in mma9553_read_raw()
542 if (chan->channel2 != IIO_MOD_ROOT_SUM_SQUARED_X_Y_Z) in mma9553_read_raw()
543 return -EINVAL; in mma9553_read_raw()
547 case IIO_ENERGY: /* Cal or kcal to J */ in mma9553_read_raw()
553 return -EINVAL; in mma9553_read_raw()
556 *val = data->stepcnt_enabled; in mma9553_read_raw()
559 tmp = mma9553_get_bits(data->conf.height_weight, in mma9553_read_raw()
565 *val = mma9553_get_bits(data->conf.height_weight, in mma9553_read_raw()
569 switch (chan->type) { in mma9553_read_raw()
571 *val = mma9553_get_bits(data->conf.filter, in mma9553_read_raw()
575 return -EINVAL; in mma9553_read_raw()
578 switch (chan->type) { in mma9553_read_raw()
580 *val = mma9553_get_bits(data->conf.filter, in mma9553_read_raw()
584 return -EINVAL; in mma9553_read_raw()
587 switch (chan->type) { in mma9553_read_raw()
589 if (chan->channel2 != IIO_MOD_ROOT_SUM_SQUARED_X_Y_Z) in mma9553_read_raw()
590 return -EINVAL; in mma9553_read_raw()
591 *val = mma9553_get_bits(data->conf.speed_step, in mma9553_read_raw()
595 return -EINVAL; in mma9553_read_raw()
598 return -EINVAL; in mma9553_read_raw()
611 if (data->stepcnt_enabled == !!val) in mma9553_write_raw()
613 mutex_lock(&data->mutex); in mma9553_write_raw()
614 ret = mma9551_set_power_state(data->client, val); in mma9553_write_raw()
616 mutex_unlock(&data->mutex); in mma9553_write_raw()
619 data->stepcnt_enabled = val; in mma9553_write_raw()
620 mutex_unlock(&data->mutex); in mma9553_write_raw()
626 return -EINVAL; in mma9553_write_raw()
627 mutex_lock(&data->mutex); in mma9553_write_raw()
630 &data->conf.height_weight, in mma9553_write_raw()
632 mutex_unlock(&data->mutex); in mma9553_write_raw()
636 return -EINVAL; in mma9553_write_raw()
637 mutex_lock(&data->mutex); in mma9553_write_raw()
640 &data->conf.height_weight, in mma9553_write_raw()
642 mutex_unlock(&data->mutex); in mma9553_write_raw()
645 switch (chan->type) { in mma9553_write_raw()
652 return -EINVAL; in mma9553_write_raw()
655 mutex_lock(&data->mutex); in mma9553_write_raw()
657 &data->conf.filter, val, in mma9553_write_raw()
659 mutex_unlock(&data->mutex); in mma9553_write_raw()
662 return -EINVAL; in mma9553_write_raw()
665 switch (chan->type) { in mma9553_write_raw()
668 return -EINVAL; in mma9553_write_raw()
669 mutex_lock(&data->mutex); in mma9553_write_raw()
671 &data->conf.filter, val, in mma9553_write_raw()
673 mutex_unlock(&data->mutex); in mma9553_write_raw()
676 return -EINVAL; in mma9553_write_raw()
679 switch (chan->type) { in mma9553_write_raw()
681 if (chan->channel2 != IIO_MOD_ROOT_SUM_SQUARED_X_Y_Z) in mma9553_write_raw()
682 return -EINVAL; in mma9553_write_raw()
684 * If set to a value greater than 5, then 5 will be in mma9553_write_raw()
689 return -EINVAL; in mma9553_write_raw()
692 mutex_lock(&data->mutex); in mma9553_write_raw()
695 &data->conf.speed_step, val, in mma9553_write_raw()
697 mutex_unlock(&data->mutex); in mma9553_write_raw()
700 return -EINVAL; in mma9553_write_raw()
703 return -EINVAL; in mma9553_write_raw()
715 event = mma9553_get_event(data, chan->type, chan->channel2, dir); in mma9553_read_event_config()
717 return -EINVAL; in mma9553_read_event_config()
719 return event->enabled; in mma9553_read_event_config()
732 event = mma9553_get_event(data, chan->type, chan->channel2, dir); in mma9553_write_event_config()
734 return -EINVAL; in mma9553_write_event_config()
736 if (event->enabled == state) in mma9553_write_event_config()
739 mutex_lock(&data->mutex); in mma9553_write_event_config()
741 ret = mma9551_set_power_state(data->client, state); in mma9553_write_event_config()
744 event->enabled = state; in mma9553_write_event_config()
750 mutex_unlock(&data->mutex); in mma9553_write_event_config()
756 event->enabled = false; in mma9553_write_event_config()
757 mma9551_set_power_state(data->client, false); in mma9553_write_event_config()
760 mutex_unlock(&data->mutex); in mma9553_write_event_config()
776 switch (chan->type) { in mma9553_read_event_value()
778 *val = mma9553_get_bits(data->conf.speed_step, in mma9553_read_event_value()
789 return -EINVAL; in mma9553_read_event_value()
792 switch (chan->type) { in mma9553_read_event_value()
794 *val = MMA9553_ACTIVITY_THD_TO_SEC(data->conf.actthd); in mma9553_read_event_value()
797 return -EINVAL; in mma9553_read_event_value()
800 return -EINVAL; in mma9553_read_event_value()
816 switch (chan->type) { in mma9553_write_event_value()
819 return -EINVAL; in mma9553_write_event_value()
820 mutex_lock(&data->mutex); in mma9553_write_event_value()
823 &data->conf.speed_step, val, in mma9553_write_event_value()
825 mutex_unlock(&data->mutex); in mma9553_write_event_value()
828 return -EINVAL; in mma9553_write_event_value()
831 switch (chan->type) { in mma9553_write_event_value()
835 return -EINVAL; in mma9553_write_event_value()
836 mutex_lock(&data->mutex); in mma9553_write_event_value()
838 &data->conf.actthd, in mma9553_write_event_value()
841 mutex_unlock(&data->mutex); in mma9553_write_event_value()
844 return -EINVAL; in mma9553_write_event_value()
847 return -EINVAL; in mma9553_write_event_value()
857 gender = mma9553_get_bits(data->conf.filter, MMA9553_MASK_CONF_MALE); in mma9553_get_calibgender_mode()
859 * HW expects 0 for female and 1 for male, in mma9553_get_calibgender_mode()
874 return -EINVAL; in mma9553_set_calibgender_mode()
875 mutex_lock(&data->mutex); in mma9553_set_calibgender_mode()
877 &data->conf.filter, gender, in mma9553_set_calibgender_mode()
879 mutex_unlock(&data->mutex); in mma9553_set_calibgender_mode()
993 data->timestamp = iio_get_time_ns(indio_dev); in mma9553_irq_handler()
1011 mutex_lock(&data->mutex); in mma9553_event_handler()
1014 mutex_unlock(&data->mutex); in mma9553_event_handler()
1020 data->activity), in mma9553_event_handler()
1028 if (ev_step_detect->enabled && (stepcnt != data->stepcnt)) { in mma9553_event_handler()
1029 data->stepcnt = stepcnt; in mma9553_event_handler()
1034 data->timestamp); in mma9553_event_handler()
1037 if (activity != data->activity) { in mma9553_event_handler()
1038 data->activity = activity; in mma9553_event_handler()
1040 if (ev_prev_activity && ev_prev_activity->enabled) in mma9553_event_handler()
1043 ev_prev_activity->info->mod, in mma9553_event_handler()
1046 data->timestamp); in mma9553_event_handler()
1048 if (ev_activity && ev_activity->enabled) in mma9553_event_handler()
1051 ev_activity->info->mod, in mma9553_event_handler()
1054 data->timestamp); in mma9553_event_handler()
1056 mutex_unlock(&data->mutex); in mma9553_event_handler()
1069 indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); in mma9553_probe()
1071 return -ENOMEM; in mma9553_probe()
1075 data->client = client; in mma9553_probe()
1078 name = id->name; in mma9553_probe()
1080 name = iio_get_acpi_device_name(&client->dev); in mma9553_probe()
1082 return -ENOSYS; in mma9553_probe()
1084 mutex_init(&data->mutex); in mma9553_probe()
1091 indio_dev->channels = mma9553_channels; in mma9553_probe()
1092 indio_dev->num_channels = ARRAY_SIZE(mma9553_channels); in mma9553_probe()
1093 indio_dev->name = name; in mma9553_probe()
1094 indio_dev->modes = INDIO_DIRECT_MODE; in mma9553_probe()
1095 indio_dev->info = &mma9553_info; in mma9553_probe()
1097 if (client->irq > 0) { in mma9553_probe()
1098 ret = devm_request_threaded_irq(&client->dev, client->irq, in mma9553_probe()
1104 dev_err(&client->dev, "request irq %d failed\n", in mma9553_probe()
1105 client->irq); in mma9553_probe()
1110 ret = pm_runtime_set_active(&client->dev); in mma9553_probe()
1114 pm_runtime_enable(&client->dev); in mma9553_probe()
1115 pm_runtime_set_autosuspend_delay(&client->dev, in mma9553_probe()
1117 pm_runtime_use_autosuspend(&client->dev); in mma9553_probe()
1121 dev_err(&client->dev, "unable to register iio device\n"); in mma9553_probe()
1125 dev_dbg(&indio_dev->dev, "Registered device %s\n", name); in mma9553_probe()
1129 pm_runtime_dont_use_autosuspend(&client->dev); in mma9553_probe()
1130 pm_runtime_disable(&client->dev); in mma9553_probe()
1143 pm_runtime_disable(&client->dev); in mma9553_remove()
1144 pm_runtime_set_suspended(&client->dev); in mma9553_remove()
1146 mutex_lock(&data->mutex); in mma9553_remove()
1147 mma9551_set_device_state(data->client, false); in mma9553_remove()
1148 mutex_unlock(&data->mutex); in mma9553_remove()
1157 mutex_lock(&data->mutex); in mma9553_runtime_suspend()
1158 ret = mma9551_set_device_state(data->client, false); in mma9553_runtime_suspend()
1159 mutex_unlock(&data->mutex); in mma9553_runtime_suspend()
1161 dev_err(&data->client->dev, "powering off device failed\n"); in mma9553_runtime_suspend()
1162 return -EAGAIN; in mma9553_runtime_suspend()
1174 ret = mma9551_set_device_state(data->client, true); in mma9553_runtime_resume()
1189 mutex_lock(&data->mutex); in mma9553_suspend()
1190 ret = mma9551_set_device_state(data->client, false); in mma9553_suspend()
1191 mutex_unlock(&data->mutex); in mma9553_suspend()
1202 mutex_lock(&data->mutex); in mma9553_resume()
1203 ret = mma9551_set_device_state(data->client, true); in mma9553_resume()
1204 mutex_unlock(&data->mutex); in mma9553_resume()