Lines Matching +full:wake +full:- +full:on +full:- +full:motion
2 * KMX61 - Kionix 6-axis Accelerometer/Magnetometer
10 * IIO driver for KMX61 (7-bit I2C slave address 0x0E or 0x0F).
36 * three 16-bit accelerometer output registers for X/Y/Z axis
49 * one 16-bit temperature output register
55 * three 16-bit magnetometer output registers for X/Y/Z axis
122 /* serialize access to non-atomic ops, e.g set_mode */
303 return -EINVAL; in kmx61_convert_freq_to_bit()
314 return -EINVAL; in kmx61_convert_wake_up_odr_to_bit()
318 * kmx61_set_mode() - set KMX61 device operating mode
319 * @data - kmx61 device private data pointer
320 * @mode - bitmask, indicating operating mode for @device
321 * @device - bitmask, indicating device for which @mode needs to be set
322 * @update - update stby bits stored in device's private @data
333 int acc_stby = -1, mag_stby = -1; in kmx61_set_mode()
335 ret = i2c_smbus_read_byte_data(data->client, KMX61_REG_STBY); in kmx61_set_mode()
337 dev_err(&data->client->dev, "Error reading reg_stby\n"); in kmx61_set_mode()
363 ret = i2c_smbus_write_byte_data(data->client, KMX61_REG_STBY, ret); in kmx61_set_mode()
365 dev_err(&data->client->dev, "Error writing reg_stby\n"); in kmx61_set_mode()
369 if (acc_stby != -1 && update) in kmx61_set_mode()
370 data->acc_stby = acc_stby; in kmx61_set_mode()
371 if (mag_stby != -1 && update) in kmx61_set_mode()
372 data->mag_stby = mag_stby; in kmx61_set_mode()
381 ret = i2c_smbus_read_byte_data(data->client, KMX61_REG_STBY); in kmx61_get_mode()
383 dev_err(&data->client->dev, "Error reading reg_stby\n"); in kmx61_get_mode()
413 ret = i2c_smbus_write_byte_data(data->client, KMX61_REG_CTRL2, in kmx61_set_wake_up_odr()
416 dev_err(&data->client->dev, "Error writing reg_ctrl2\n"); in kmx61_set_wake_up_odr()
446 ret = i2c_smbus_write_byte_data(data->client, KMX61_REG_ODCNTL, in kmx61_set_odr()
451 data->odr_bits = odr_bits; in kmx61_set_odr()
468 lodr_bits = (data->odr_bits >> KMX61_ACC_ODR_SHIFT) & in kmx61_get_odr()
471 lodr_bits = (data->odr_bits >> KMX61_MAG_ODR_SHIFT) & in kmx61_get_odr()
474 return -EINVAL; in kmx61_get_odr()
477 return -EINVAL; in kmx61_get_odr()
489 ret = i2c_smbus_read_byte_data(data->client, KMX61_REG_CTRL1); in kmx61_set_range()
491 dev_err(&data->client->dev, "Error reading reg_ctrl1\n"); in kmx61_set_range()
498 ret = i2c_smbus_write_byte_data(data->client, KMX61_REG_CTRL1, ret); in kmx61_set_range()
500 dev_err(&data->client->dev, "Error writing reg_ctrl1\n"); in kmx61_set_range()
504 data->range = range; in kmx61_set_range()
534 return -EINVAL; in kmx61_set_scale()
541 ret = i2c_smbus_read_byte_data(data->client, KMX61_REG_WHO_AM_I); in kmx61_chip_init()
543 dev_err(&data->client->dev, "Error reading who_am_i\n"); in kmx61_chip_init()
548 dev_err(&data->client->dev, in kmx61_chip_init()
551 return -EINVAL; in kmx61_chip_init()
559 ret = i2c_smbus_read_byte_data(data->client, KMX61_REG_ODCNTL); in kmx61_chip_init()
561 dev_err(&data->client->dev, "Error reading reg_odcntl\n"); in kmx61_chip_init()
564 data->odr_bits = ret; in kmx61_chip_init()
567 * set output data rate for wake up (motion detection) function in kmx61_chip_init()
583 data->wake_thresh = KMX61_DEFAULT_WAKE_THRESH; in kmx61_chip_init()
584 data->wake_duration = KMX61_DEFAULT_WAKE_DURATION; in kmx61_chip_init()
603 ret = i2c_smbus_read_byte_data(data->client, KMX61_REG_INC1); in kmx61_setup_new_data_interrupt()
605 dev_err(&data->client->dev, "Error reading reg_ctrl1\n"); in kmx61_setup_new_data_interrupt()
622 ret = i2c_smbus_write_byte_data(data->client, KMX61_REG_INC1, ret); in kmx61_setup_new_data_interrupt()
624 dev_err(&data->client->dev, "Error writing reg_int_ctrl1\n"); in kmx61_setup_new_data_interrupt()
628 ret = i2c_smbus_read_byte_data(data->client, KMX61_REG_CTRL1); in kmx61_setup_new_data_interrupt()
630 dev_err(&data->client->dev, "Error reading reg_ctrl1\n"); in kmx61_setup_new_data_interrupt()
639 ret = i2c_smbus_write_byte_data(data->client, KMX61_REG_CTRL1, ret); in kmx61_setup_new_data_interrupt()
641 dev_err(&data->client->dev, "Error writing reg_ctrl1\n"); in kmx61_setup_new_data_interrupt()
652 ret = i2c_smbus_write_byte_data(data->client, in kmx61_chip_update_thresholds()
654 data->wake_duration); in kmx61_chip_update_thresholds()
656 dev_err(&data->client->dev, "Errow writing reg_wuf_timer\n"); in kmx61_chip_update_thresholds()
660 ret = i2c_smbus_write_byte_data(data->client, in kmx61_chip_update_thresholds()
662 data->wake_thresh); in kmx61_chip_update_thresholds()
664 dev_err(&data->client->dev, "Error writing reg_wuf_thresh\n"); in kmx61_chip_update_thresholds()
687 ret = i2c_smbus_read_byte_data(data->client, KMX61_REG_INC1); in kmx61_setup_any_motion_interrupt()
689 dev_err(&data->client->dev, "Error reading reg_inc1\n"); in kmx61_setup_any_motion_interrupt()
697 ret = i2c_smbus_write_byte_data(data->client, KMX61_REG_INC1, ret); in kmx61_setup_any_motion_interrupt()
699 dev_err(&data->client->dev, "Error writing reg_inc1\n"); in kmx61_setup_any_motion_interrupt()
703 ret = i2c_smbus_read_byte_data(data->client, KMX61_REG_CTRL1); in kmx61_setup_any_motion_interrupt()
705 dev_err(&data->client->dev, "Error reading reg_ctrl1\n"); in kmx61_setup_any_motion_interrupt()
714 ret = i2c_smbus_write_byte_data(data->client, KMX61_REG_CTRL1, ret); in kmx61_setup_any_motion_interrupt()
716 dev_err(&data->client->dev, "Error writing reg_ctrl1\n"); in kmx61_setup_any_motion_interrupt()
724 * kmx61_set_power_state() - set power state for kmx61 @device
725 * @data - kmx61 device private pointer
726 * @on - power state to be set for @device
727 * @device - bitmask indicating device for which @on state needs to be set
729 * Notice that when ACC power state needs to be set to ON and MAG is in
732 * state needs to be set to ON and ACC is in OPERATION.
734 static int kmx61_set_power_state(struct kmx61_data *data, bool on, u8 device) in kmx61_set_power_state() argument
740 if (on && !data->acc_ps && !data->mag_stby) { in kmx61_set_power_state()
745 data->acc_ps = on; in kmx61_set_power_state()
748 if (on && !data->mag_ps && !data->acc_stby) { in kmx61_set_power_state()
753 data->mag_ps = on; in kmx61_set_power_state()
756 if (on) { in kmx61_set_power_state()
757 ret = pm_runtime_get_sync(&data->client->dev); in kmx61_set_power_state()
759 pm_runtime_mark_last_busy(&data->client->dev); in kmx61_set_power_state()
760 ret = pm_runtime_put_autosuspend(&data->client->dev); in kmx61_set_power_state()
763 dev_err(&data->client->dev, in kmx61_set_power_state()
765 on, ret); in kmx61_set_power_state()
766 if (on) in kmx61_set_power_state()
767 pm_runtime_put_noidle(&data->client->dev); in kmx61_set_power_state()
780 ret = i2c_smbus_read_word_data(data->client, reg); in kmx61_read_measurement()
782 dev_err(&data->client->dev, "failed to read reg at %x\n", reg); in kmx61_read_measurement()
797 switch (chan->type) { in kmx61_read_raw()
805 return -EINVAL; in kmx61_read_raw()
807 mutex_lock(&data->lock); in kmx61_read_raw()
809 ret = kmx61_set_power_state(data, true, chan->address); in kmx61_read_raw()
811 mutex_unlock(&data->lock); in kmx61_read_raw()
815 ret = kmx61_read_measurement(data, base_reg, chan->scan_index); in kmx61_read_raw()
817 kmx61_set_power_state(data, false, chan->address); in kmx61_read_raw()
818 mutex_unlock(&data->lock); in kmx61_read_raw()
821 *val = sign_extend32(ret >> chan->scan_type.shift, in kmx61_read_raw()
822 chan->scan_type.realbits - 1); in kmx61_read_raw()
823 ret = kmx61_set_power_state(data, false, chan->address); in kmx61_read_raw()
825 mutex_unlock(&data->lock); in kmx61_read_raw()
830 switch (chan->type) { in kmx61_read_raw()
833 *val2 = kmx61_uscale_table[data->range]; in kmx61_read_raw()
841 return -EINVAL; in kmx61_read_raw()
844 if (chan->type != IIO_ACCEL && chan->type != IIO_MAGN) in kmx61_read_raw()
845 return -EINVAL; in kmx61_read_raw()
847 mutex_lock(&data->lock); in kmx61_read_raw()
848 ret = kmx61_get_odr(data, val, val2, chan->address); in kmx61_read_raw()
849 mutex_unlock(&data->lock); in kmx61_read_raw()
851 return -EINVAL; in kmx61_read_raw()
854 return -EINVAL; in kmx61_read_raw()
866 if (chan->type != IIO_ACCEL && chan->type != IIO_MAGN) in kmx61_write_raw()
867 return -EINVAL; in kmx61_write_raw()
869 mutex_lock(&data->lock); in kmx61_write_raw()
870 ret = kmx61_set_odr(data, val, val2, chan->address); in kmx61_write_raw()
871 mutex_unlock(&data->lock); in kmx61_write_raw()
874 switch (chan->type) { in kmx61_write_raw()
877 return -EINVAL; in kmx61_write_raw()
878 mutex_lock(&data->lock); in kmx61_write_raw()
880 mutex_unlock(&data->lock); in kmx61_write_raw()
883 return -EINVAL; in kmx61_write_raw()
886 return -EINVAL; in kmx61_write_raw()
902 *val = data->wake_thresh; in kmx61_read_event()
905 *val = data->wake_duration; in kmx61_read_event()
908 return -EINVAL; in kmx61_read_event()
921 if (data->ev_enable_state) in kmx61_write_event()
922 return -EBUSY; in kmx61_write_event()
926 data->wake_thresh = val; in kmx61_write_event()
929 data->wake_duration = val; in kmx61_write_event()
932 return -EINVAL; in kmx61_write_event()
943 return data->ev_enable_state; in kmx61_read_event_config()
955 if (state && data->ev_enable_state) in kmx61_write_event_config()
958 mutex_lock(&data->lock); in kmx61_write_event_config()
960 if (!state && data->motion_trig_on) { in kmx61_write_event_config()
961 data->ev_enable_state = false; in kmx61_write_event_config()
975 data->ev_enable_state = state; in kmx61_write_event_config()
978 mutex_unlock(&data->lock); in kmx61_write_event_config()
988 if (data->acc_dready_trig != trig && data->motion_trig != trig) in kmx61_acc_validate_trigger()
989 return -EINVAL; in kmx61_acc_validate_trigger()
999 if (data->mag_dready_trig != trig) in kmx61_mag_validate_trigger()
1000 return -EINVAL; in kmx61_mag_validate_trigger()
1033 mutex_lock(&data->lock); in kmx61_data_rdy_trigger_set_state()
1035 if (!state && data->ev_enable_state && data->motion_trig_on) { in kmx61_data_rdy_trigger_set_state()
1036 data->motion_trig_on = false; in kmx61_data_rdy_trigger_set_state()
1040 if (data->acc_dready_trig == trig || data->motion_trig == trig) in kmx61_data_rdy_trigger_set_state()
1049 if (data->acc_dready_trig == trig || data->mag_dready_trig == trig) in kmx61_data_rdy_trigger_set_state()
1058 if (data->acc_dready_trig == trig) in kmx61_data_rdy_trigger_set_state()
1059 data->acc_dready_trig_on = state; in kmx61_data_rdy_trigger_set_state()
1060 else if (data->mag_dready_trig == trig) in kmx61_data_rdy_trigger_set_state()
1061 data->mag_dready_trig_on = state; in kmx61_data_rdy_trigger_set_state()
1063 data->motion_trig_on = state; in kmx61_data_rdy_trigger_set_state()
1065 mutex_unlock(&data->lock); in kmx61_data_rdy_trigger_set_state()
1076 ret = i2c_smbus_read_byte_data(data->client, KMX61_REG_INL); in kmx61_trig_try_reenable()
1078 dev_err(&data->client->dev, "Error reading reg_inl\n"); in kmx61_trig_try_reenable()
1093 struct iio_dev *indio_dev = data->acc_indio_dev; in kmx61_event_handler()
1096 ret = i2c_smbus_read_byte_data(data->client, KMX61_REG_INS1); in kmx61_event_handler()
1098 dev_err(&data->client->dev, "Error reading reg_ins1\n"); in kmx61_event_handler()
1103 ret = i2c_smbus_read_byte_data(data->client, KMX61_REG_INS2); in kmx61_event_handler()
1105 dev_err(&data->client->dev, "Error reading reg_ins2\n"); in kmx61_event_handler()
1165 ret = i2c_smbus_read_byte_data(data->client, KMX61_REG_CTRL1); in kmx61_event_handler()
1167 dev_err(&data->client->dev, "Error reading reg_ctrl1\n"); in kmx61_event_handler()
1170 ret = i2c_smbus_write_byte_data(data->client, KMX61_REG_CTRL1, ret); in kmx61_event_handler()
1172 dev_err(&data->client->dev, "Error writing reg_ctrl1\n"); in kmx61_event_handler()
1174 ret = i2c_smbus_read_byte_data(data->client, KMX61_REG_INL); in kmx61_event_handler()
1176 dev_err(&data->client->dev, "Error reading reg_inl\n"); in kmx61_event_handler()
1185 if (data->acc_dready_trig_on) in kmx61_data_rdy_trig_poll()
1186 iio_trigger_poll(data->acc_dready_trig); in kmx61_data_rdy_trig_poll()
1187 if (data->mag_dready_trig_on) in kmx61_data_rdy_trig_poll()
1188 iio_trigger_poll(data->mag_dready_trig); in kmx61_data_rdy_trig_poll()
1190 if (data->motion_trig_on) in kmx61_data_rdy_trig_poll()
1191 iio_trigger_poll(data->motion_trig); in kmx61_data_rdy_trig_poll()
1193 if (data->ev_enable_state) in kmx61_data_rdy_trig_poll()
1201 struct iio_dev *indio_dev = pf->indio_dev; in kmx61_trigger_handler()
1207 if (indio_dev == data->acc_indio_dev) in kmx61_trigger_handler()
1212 mutex_lock(&data->lock); in kmx61_trigger_handler()
1213 for_each_set_bit(bit, indio_dev->active_scan_mask, in kmx61_trigger_handler()
1214 indio_dev->masklength) { in kmx61_trigger_handler()
1217 mutex_unlock(&data->lock); in kmx61_trigger_handler()
1222 mutex_unlock(&data->lock); in kmx61_trigger_handler()
1226 iio_trigger_notify_done(indio_dev->trig); in kmx61_trigger_handler()
1235 id = acpi_match_device(dev->driver->acpi_match_table, dev); in kmx61_match_acpi_device()
1249 indio_dev = devm_iio_device_alloc(&data->client->dev, sizeof(data)); in kmx61_indiodev_setup()
1251 return ERR_PTR(-ENOMEM); in kmx61_indiodev_setup()
1255 indio_dev->dev.parent = &data->client->dev; in kmx61_indiodev_setup()
1256 indio_dev->channels = chan; in kmx61_indiodev_setup()
1257 indio_dev->num_channels = num_channels; in kmx61_indiodev_setup()
1258 indio_dev->name = name; in kmx61_indiodev_setup()
1259 indio_dev->modes = INDIO_DIRECT_MODE; in kmx61_indiodev_setup()
1260 indio_dev->info = info; in kmx61_indiodev_setup()
1272 trig = devm_iio_trigger_alloc(&data->client->dev, in kmx61_trigger_setup()
1273 "%s-%s-dev%d", in kmx61_trigger_setup()
1274 indio_dev->name, in kmx61_trigger_setup()
1276 indio_dev->id); in kmx61_trigger_setup()
1278 return ERR_PTR(-ENOMEM); in kmx61_trigger_setup()
1280 trig->dev.parent = &data->client->dev; in kmx61_trigger_setup()
1281 trig->ops = &kmx61_trigger_ops; in kmx61_trigger_setup()
1298 data = devm_kzalloc(&client->dev, sizeof(*data), GFP_KERNEL); in kmx61_probe()
1300 return -ENOMEM; in kmx61_probe()
1303 data->client = client; in kmx61_probe()
1305 mutex_init(&data->lock); in kmx61_probe()
1308 name = id->name; in kmx61_probe()
1309 else if (ACPI_HANDLE(&client->dev)) in kmx61_probe()
1310 name = kmx61_match_acpi_device(&client->dev); in kmx61_probe()
1312 return -ENODEV; in kmx61_probe()
1314 data->acc_indio_dev = in kmx61_probe()
1319 if (IS_ERR(data->acc_indio_dev)) in kmx61_probe()
1320 return PTR_ERR(data->acc_indio_dev); in kmx61_probe()
1322 data->mag_indio_dev = in kmx61_probe()
1327 if (IS_ERR(data->mag_indio_dev)) in kmx61_probe()
1328 return PTR_ERR(data->mag_indio_dev); in kmx61_probe()
1334 if (client->irq > 0) { in kmx61_probe()
1335 ret = devm_request_threaded_irq(&client->dev, client->irq, in kmx61_probe()
1344 data->acc_dready_trig = in kmx61_probe()
1345 kmx61_trigger_setup(data, data->acc_indio_dev, in kmx61_probe()
1347 if (IS_ERR(data->acc_dready_trig)) { in kmx61_probe()
1348 ret = PTR_ERR(data->acc_dready_trig); in kmx61_probe()
1352 data->mag_dready_trig = in kmx61_probe()
1353 kmx61_trigger_setup(data, data->mag_indio_dev, in kmx61_probe()
1355 if (IS_ERR(data->mag_dready_trig)) { in kmx61_probe()
1356 ret = PTR_ERR(data->mag_dready_trig); in kmx61_probe()
1360 data->motion_trig = in kmx61_probe()
1361 kmx61_trigger_setup(data, data->acc_indio_dev, in kmx61_probe()
1362 "any-motion"); in kmx61_probe()
1363 if (IS_ERR(data->motion_trig)) { in kmx61_probe()
1364 ret = PTR_ERR(data->motion_trig); in kmx61_probe()
1368 ret = iio_triggered_buffer_setup(data->acc_indio_dev, in kmx61_probe()
1373 dev_err(&data->client->dev, in kmx61_probe()
1378 ret = iio_triggered_buffer_setup(data->mag_indio_dev, in kmx61_probe()
1383 dev_err(&data->client->dev, in kmx61_probe()
1389 ret = pm_runtime_set_active(&client->dev); in kmx61_probe()
1393 pm_runtime_enable(&client->dev); in kmx61_probe()
1394 pm_runtime_set_autosuspend_delay(&client->dev, KMX61_SLEEP_DELAY_MS); in kmx61_probe()
1395 pm_runtime_use_autosuspend(&client->dev); in kmx61_probe()
1397 ret = iio_device_register(data->acc_indio_dev); in kmx61_probe()
1399 dev_err(&client->dev, "Failed to register acc iio device\n"); in kmx61_probe()
1403 ret = iio_device_register(data->mag_indio_dev); in kmx61_probe()
1405 dev_err(&client->dev, "Failed to register mag iio device\n"); in kmx61_probe()
1412 iio_device_unregister(data->acc_indio_dev); in kmx61_probe()
1414 if (client->irq > 0) in kmx61_probe()
1415 iio_triggered_buffer_cleanup(data->mag_indio_dev); in kmx61_probe()
1417 if (client->irq > 0) in kmx61_probe()
1418 iio_triggered_buffer_cleanup(data->acc_indio_dev); in kmx61_probe()
1420 iio_trigger_unregister(data->motion_trig); in kmx61_probe()
1422 iio_trigger_unregister(data->mag_dready_trig); in kmx61_probe()
1424 iio_trigger_unregister(data->acc_dready_trig); in kmx61_probe()
1434 iio_device_unregister(data->acc_indio_dev); in kmx61_remove()
1435 iio_device_unregister(data->mag_indio_dev); in kmx61_remove()
1437 pm_runtime_disable(&client->dev); in kmx61_remove()
1438 pm_runtime_set_suspended(&client->dev); in kmx61_remove()
1439 pm_runtime_put_noidle(&client->dev); in kmx61_remove()
1441 if (client->irq > 0) { in kmx61_remove()
1442 iio_triggered_buffer_cleanup(data->acc_indio_dev); in kmx61_remove()
1443 iio_triggered_buffer_cleanup(data->mag_indio_dev); in kmx61_remove()
1444 iio_trigger_unregister(data->acc_dready_trig); in kmx61_remove()
1445 iio_trigger_unregister(data->mag_dready_trig); in kmx61_remove()
1446 iio_trigger_unregister(data->motion_trig); in kmx61_remove()
1449 mutex_lock(&data->lock); in kmx61_remove()
1451 mutex_unlock(&data->lock); in kmx61_remove()
1462 mutex_lock(&data->lock); in kmx61_suspend()
1465 mutex_unlock(&data->lock); in kmx61_suspend()
1475 if (data->acc_stby) in kmx61_resume()
1477 if (data->mag_stby) in kmx61_resume()
1490 mutex_lock(&data->lock); in kmx61_runtime_suspend()
1492 mutex_unlock(&data->lock); in kmx61_runtime_suspend()
1502 if (!data->acc_ps) in kmx61_runtime_resume()
1504 if (!data->mag_ps) in kmx61_runtime_resume()