• Home
  • Raw
  • Download

Lines Matching +full:wake +full:- +full:on +full:- +full:motion

1 // SPDX-License-Identifier: GPL-2.0-only
3 * KMX61 - Kionix 6-axis Accelerometer/Magnetometer
7 * IIO driver for KMX61 (7-bit I2C slave address 0x0E or 0x0F).
32 * three 16-bit accelerometer output registers for X/Y/Z axis
45 * one 16-bit temperature output register
51 * three 16-bit magnetometer output registers for X/Y/Z axis
118 /* serialize access to non-atomic ops, e.g set_mode */
299 return -EINVAL; in kmx61_convert_freq_to_bit()
310 return -EINVAL; in kmx61_convert_wake_up_odr_to_bit()
314 * kmx61_set_mode() - set KMX61 device operating mode
329 int acc_stby = -1, mag_stby = -1; in kmx61_set_mode()
331 ret = i2c_smbus_read_byte_data(data->client, KMX61_REG_STBY); in kmx61_set_mode()
333 dev_err(&data->client->dev, "Error reading reg_stby\n"); in kmx61_set_mode()
359 ret = i2c_smbus_write_byte_data(data->client, KMX61_REG_STBY, ret); in kmx61_set_mode()
361 dev_err(&data->client->dev, "Error writing reg_stby\n"); in kmx61_set_mode()
365 if (acc_stby != -1 && update) in kmx61_set_mode()
366 data->acc_stby = acc_stby; in kmx61_set_mode()
367 if (mag_stby != -1 && update) in kmx61_set_mode()
368 data->mag_stby = mag_stby; in kmx61_set_mode()
377 ret = i2c_smbus_read_byte_data(data->client, KMX61_REG_STBY); in kmx61_get_mode()
379 dev_err(&data->client->dev, "Error reading reg_stby\n"); in kmx61_get_mode()
409 ret = i2c_smbus_write_byte_data(data->client, KMX61_REG_CTRL2, in kmx61_set_wake_up_odr()
412 dev_err(&data->client->dev, "Error writing reg_ctrl2\n"); in kmx61_set_wake_up_odr()
442 ret = i2c_smbus_write_byte_data(data->client, KMX61_REG_ODCNTL, in kmx61_set_odr()
447 data->odr_bits = odr_bits; in kmx61_set_odr()
464 lodr_bits = (data->odr_bits >> KMX61_ACC_ODR_SHIFT) & in kmx61_get_odr()
467 lodr_bits = (data->odr_bits >> KMX61_MAG_ODR_SHIFT) & in kmx61_get_odr()
470 return -EINVAL; in kmx61_get_odr()
473 return -EINVAL; in kmx61_get_odr()
485 ret = i2c_smbus_read_byte_data(data->client, KMX61_REG_CTRL1); in kmx61_set_range()
487 dev_err(&data->client->dev, "Error reading reg_ctrl1\n"); in kmx61_set_range()
494 ret = i2c_smbus_write_byte_data(data->client, KMX61_REG_CTRL1, ret); in kmx61_set_range()
496 dev_err(&data->client->dev, "Error writing reg_ctrl1\n"); in kmx61_set_range()
500 data->range = range; in kmx61_set_range()
530 return -EINVAL; in kmx61_set_scale()
537 ret = i2c_smbus_read_byte_data(data->client, KMX61_REG_WHO_AM_I); in kmx61_chip_init()
539 dev_err(&data->client->dev, "Error reading who_am_i\n"); in kmx61_chip_init()
544 dev_err(&data->client->dev, in kmx61_chip_init()
547 return -EINVAL; in kmx61_chip_init()
555 ret = i2c_smbus_read_byte_data(data->client, KMX61_REG_ODCNTL); in kmx61_chip_init()
557 dev_err(&data->client->dev, "Error reading reg_odcntl\n"); in kmx61_chip_init()
560 data->odr_bits = ret; in kmx61_chip_init()
563 * set output data rate for wake up (motion detection) function in kmx61_chip_init()
579 data->wake_thresh = KMX61_DEFAULT_WAKE_THRESH; in kmx61_chip_init()
580 data->wake_duration = KMX61_DEFAULT_WAKE_DURATION; in kmx61_chip_init()
599 ret = i2c_smbus_read_byte_data(data->client, KMX61_REG_INC1); in kmx61_setup_new_data_interrupt()
601 dev_err(&data->client->dev, "Error reading reg_ctrl1\n"); in kmx61_setup_new_data_interrupt()
618 ret = i2c_smbus_write_byte_data(data->client, KMX61_REG_INC1, ret); in kmx61_setup_new_data_interrupt()
620 dev_err(&data->client->dev, "Error writing reg_int_ctrl1\n"); in kmx61_setup_new_data_interrupt()
624 ret = i2c_smbus_read_byte_data(data->client, KMX61_REG_CTRL1); in kmx61_setup_new_data_interrupt()
626 dev_err(&data->client->dev, "Error reading reg_ctrl1\n"); in kmx61_setup_new_data_interrupt()
635 ret = i2c_smbus_write_byte_data(data->client, KMX61_REG_CTRL1, ret); in kmx61_setup_new_data_interrupt()
637 dev_err(&data->client->dev, "Error writing reg_ctrl1\n"); in kmx61_setup_new_data_interrupt()
648 ret = i2c_smbus_write_byte_data(data->client, in kmx61_chip_update_thresholds()
650 data->wake_duration); in kmx61_chip_update_thresholds()
652 dev_err(&data->client->dev, "Errow writing reg_wuf_timer\n"); in kmx61_chip_update_thresholds()
656 ret = i2c_smbus_write_byte_data(data->client, in kmx61_chip_update_thresholds()
658 data->wake_thresh); in kmx61_chip_update_thresholds()
660 dev_err(&data->client->dev, "Error writing reg_wuf_thresh\n"); in kmx61_chip_update_thresholds()
683 ret = i2c_smbus_read_byte_data(data->client, KMX61_REG_INC1); in kmx61_setup_any_motion_interrupt()
685 dev_err(&data->client->dev, "Error reading reg_inc1\n"); in kmx61_setup_any_motion_interrupt()
693 ret = i2c_smbus_write_byte_data(data->client, KMX61_REG_INC1, ret); in kmx61_setup_any_motion_interrupt()
695 dev_err(&data->client->dev, "Error writing reg_inc1\n"); in kmx61_setup_any_motion_interrupt()
699 ret = i2c_smbus_read_byte_data(data->client, KMX61_REG_CTRL1); in kmx61_setup_any_motion_interrupt()
701 dev_err(&data->client->dev, "Error reading reg_ctrl1\n"); in kmx61_setup_any_motion_interrupt()
710 ret = i2c_smbus_write_byte_data(data->client, KMX61_REG_CTRL1, ret); in kmx61_setup_any_motion_interrupt()
712 dev_err(&data->client->dev, "Error writing reg_ctrl1\n"); in kmx61_setup_any_motion_interrupt()
720 * kmx61_set_power_state() - set power state for kmx61 @device
722 * @on: power state to be set for @device
723 * @device: bitmask indicating device for which @on state needs to be set
725 * Notice that when ACC power state needs to be set to ON and MAG is in
728 * state needs to be set to ON and ACC is in OPERATION.
730 static int kmx61_set_power_state(struct kmx61_data *data, bool on, u8 device) in kmx61_set_power_state() argument
736 if (on && !data->acc_ps && !data->mag_stby) { in kmx61_set_power_state()
741 data->acc_ps = on; in kmx61_set_power_state()
744 if (on && !data->mag_ps && !data->acc_stby) { in kmx61_set_power_state()
749 data->mag_ps = on; in kmx61_set_power_state()
752 if (on) { in kmx61_set_power_state()
753 ret = pm_runtime_get_sync(&data->client->dev); in kmx61_set_power_state()
755 pm_runtime_mark_last_busy(&data->client->dev); in kmx61_set_power_state()
756 ret = pm_runtime_put_autosuspend(&data->client->dev); in kmx61_set_power_state()
759 dev_err(&data->client->dev, in kmx61_set_power_state()
761 on, ret); in kmx61_set_power_state()
762 if (on) in kmx61_set_power_state()
763 pm_runtime_put_noidle(&data->client->dev); in kmx61_set_power_state()
776 ret = i2c_smbus_read_word_data(data->client, reg); in kmx61_read_measurement()
778 dev_err(&data->client->dev, "failed to read reg at %x\n", reg); in kmx61_read_measurement()
793 switch (chan->type) { in kmx61_read_raw()
801 return -EINVAL; in kmx61_read_raw()
803 mutex_lock(&data->lock); in kmx61_read_raw()
805 ret = kmx61_set_power_state(data, true, chan->address); in kmx61_read_raw()
807 mutex_unlock(&data->lock); in kmx61_read_raw()
811 ret = kmx61_read_measurement(data, base_reg, chan->scan_index); in kmx61_read_raw()
813 kmx61_set_power_state(data, false, chan->address); in kmx61_read_raw()
814 mutex_unlock(&data->lock); in kmx61_read_raw()
817 *val = sign_extend32(ret >> chan->scan_type.shift, in kmx61_read_raw()
818 chan->scan_type.realbits - 1); in kmx61_read_raw()
819 ret = kmx61_set_power_state(data, false, chan->address); in kmx61_read_raw()
821 mutex_unlock(&data->lock); in kmx61_read_raw()
826 switch (chan->type) { in kmx61_read_raw()
829 *val2 = kmx61_uscale_table[data->range]; in kmx61_read_raw()
837 return -EINVAL; in kmx61_read_raw()
840 if (chan->type != IIO_ACCEL && chan->type != IIO_MAGN) in kmx61_read_raw()
841 return -EINVAL; in kmx61_read_raw()
843 mutex_lock(&data->lock); in kmx61_read_raw()
844 ret = kmx61_get_odr(data, val, val2, chan->address); in kmx61_read_raw()
845 mutex_unlock(&data->lock); in kmx61_read_raw()
847 return -EINVAL; in kmx61_read_raw()
850 return -EINVAL; in kmx61_read_raw()
862 if (chan->type != IIO_ACCEL && chan->type != IIO_MAGN) in kmx61_write_raw()
863 return -EINVAL; in kmx61_write_raw()
865 mutex_lock(&data->lock); in kmx61_write_raw()
866 ret = kmx61_set_odr(data, val, val2, chan->address); in kmx61_write_raw()
867 mutex_unlock(&data->lock); in kmx61_write_raw()
870 switch (chan->type) { in kmx61_write_raw()
873 return -EINVAL; in kmx61_write_raw()
874 mutex_lock(&data->lock); in kmx61_write_raw()
876 mutex_unlock(&data->lock); in kmx61_write_raw()
879 return -EINVAL; in kmx61_write_raw()
882 return -EINVAL; in kmx61_write_raw()
898 *val = data->wake_thresh; in kmx61_read_event()
901 *val = data->wake_duration; in kmx61_read_event()
904 return -EINVAL; in kmx61_read_event()
917 if (data->ev_enable_state) in kmx61_write_event()
918 return -EBUSY; in kmx61_write_event()
922 data->wake_thresh = val; in kmx61_write_event()
925 data->wake_duration = val; in kmx61_write_event()
928 return -EINVAL; in kmx61_write_event()
939 return data->ev_enable_state; in kmx61_read_event_config()
951 if (state && data->ev_enable_state) in kmx61_write_event_config()
954 mutex_lock(&data->lock); in kmx61_write_event_config()
956 if (!state && data->motion_trig_on) { in kmx61_write_event_config()
957 data->ev_enable_state = false; in kmx61_write_event_config()
971 data->ev_enable_state = state; in kmx61_write_event_config()
974 mutex_unlock(&data->lock); in kmx61_write_event_config()
984 if (data->acc_dready_trig != trig && data->motion_trig != trig) in kmx61_acc_validate_trigger()
985 return -EINVAL; in kmx61_acc_validate_trigger()
995 if (data->mag_dready_trig != trig) in kmx61_mag_validate_trigger()
996 return -EINVAL; in kmx61_mag_validate_trigger()
1029 mutex_lock(&data->lock); in kmx61_data_rdy_trigger_set_state()
1031 if (!state && data->ev_enable_state && data->motion_trig_on) { in kmx61_data_rdy_trigger_set_state()
1032 data->motion_trig_on = false; in kmx61_data_rdy_trigger_set_state()
1036 if (data->acc_dready_trig == trig || data->motion_trig == trig) in kmx61_data_rdy_trigger_set_state()
1045 if (data->acc_dready_trig == trig || data->mag_dready_trig == trig) in kmx61_data_rdy_trigger_set_state()
1054 if (data->acc_dready_trig == trig) in kmx61_data_rdy_trigger_set_state()
1055 data->acc_dready_trig_on = state; in kmx61_data_rdy_trigger_set_state()
1056 else if (data->mag_dready_trig == trig) in kmx61_data_rdy_trigger_set_state()
1057 data->mag_dready_trig_on = state; in kmx61_data_rdy_trigger_set_state()
1059 data->motion_trig_on = state; in kmx61_data_rdy_trigger_set_state()
1061 mutex_unlock(&data->lock); in kmx61_data_rdy_trigger_set_state()
1072 ret = i2c_smbus_read_byte_data(data->client, KMX61_REG_INL); in kmx61_trig_try_reenable()
1074 dev_err(&data->client->dev, "Error reading reg_inl\n"); in kmx61_trig_try_reenable()
1089 struct iio_dev *indio_dev = data->acc_indio_dev; in kmx61_event_handler()
1092 ret = i2c_smbus_read_byte_data(data->client, KMX61_REG_INS1); in kmx61_event_handler()
1094 dev_err(&data->client->dev, "Error reading reg_ins1\n"); in kmx61_event_handler()
1099 ret = i2c_smbus_read_byte_data(data->client, KMX61_REG_INS2); in kmx61_event_handler()
1101 dev_err(&data->client->dev, "Error reading reg_ins2\n"); in kmx61_event_handler()
1161 ret = i2c_smbus_read_byte_data(data->client, KMX61_REG_CTRL1); in kmx61_event_handler()
1163 dev_err(&data->client->dev, "Error reading reg_ctrl1\n"); in kmx61_event_handler()
1166 ret = i2c_smbus_write_byte_data(data->client, KMX61_REG_CTRL1, ret); in kmx61_event_handler()
1168 dev_err(&data->client->dev, "Error writing reg_ctrl1\n"); in kmx61_event_handler()
1170 ret = i2c_smbus_read_byte_data(data->client, KMX61_REG_INL); in kmx61_event_handler()
1172 dev_err(&data->client->dev, "Error reading reg_inl\n"); in kmx61_event_handler()
1181 if (data->acc_dready_trig_on) in kmx61_data_rdy_trig_poll()
1182 iio_trigger_poll(data->acc_dready_trig); in kmx61_data_rdy_trig_poll()
1183 if (data->mag_dready_trig_on) in kmx61_data_rdy_trig_poll()
1184 iio_trigger_poll(data->mag_dready_trig); in kmx61_data_rdy_trig_poll()
1186 if (data->motion_trig_on) in kmx61_data_rdy_trig_poll()
1187 iio_trigger_poll(data->motion_trig); in kmx61_data_rdy_trig_poll()
1189 if (data->ev_enable_state) in kmx61_data_rdy_trig_poll()
1197 struct iio_dev *indio_dev = pf->indio_dev; in kmx61_trigger_handler()
1203 if (indio_dev == data->acc_indio_dev) in kmx61_trigger_handler()
1208 mutex_lock(&data->lock); in kmx61_trigger_handler()
1209 for_each_set_bit(bit, indio_dev->active_scan_mask, in kmx61_trigger_handler()
1210 indio_dev->masklength) { in kmx61_trigger_handler()
1213 mutex_unlock(&data->lock); in kmx61_trigger_handler()
1218 mutex_unlock(&data->lock); in kmx61_trigger_handler()
1222 iio_trigger_notify_done(indio_dev->trig); in kmx61_trigger_handler()
1231 id = acpi_match_device(dev->driver->acpi_match_table, dev); in kmx61_match_acpi_device()
1245 indio_dev = devm_iio_device_alloc(&data->client->dev, sizeof(data)); in kmx61_indiodev_setup()
1247 return ERR_PTR(-ENOMEM); in kmx61_indiodev_setup()
1251 indio_dev->channels = chan; in kmx61_indiodev_setup()
1252 indio_dev->num_channels = num_channels; in kmx61_indiodev_setup()
1253 indio_dev->name = name; in kmx61_indiodev_setup()
1254 indio_dev->modes = INDIO_DIRECT_MODE; in kmx61_indiodev_setup()
1255 indio_dev->info = info; in kmx61_indiodev_setup()
1267 trig = devm_iio_trigger_alloc(&data->client->dev, in kmx61_trigger_setup()
1268 "%s-%s-dev%d", in kmx61_trigger_setup()
1269 indio_dev->name, in kmx61_trigger_setup()
1271 indio_dev->id); in kmx61_trigger_setup()
1273 return ERR_PTR(-ENOMEM); in kmx61_trigger_setup()
1275 trig->dev.parent = &data->client->dev; in kmx61_trigger_setup()
1276 trig->ops = &kmx61_trigger_ops; in kmx61_trigger_setup()
1293 data = devm_kzalloc(&client->dev, sizeof(*data), GFP_KERNEL); in kmx61_probe()
1295 return -ENOMEM; in kmx61_probe()
1298 data->client = client; in kmx61_probe()
1300 mutex_init(&data->lock); in kmx61_probe()
1303 name = id->name; in kmx61_probe()
1304 else if (ACPI_HANDLE(&client->dev)) in kmx61_probe()
1305 name = kmx61_match_acpi_device(&client->dev); in kmx61_probe()
1307 return -ENODEV; in kmx61_probe()
1309 data->acc_indio_dev = in kmx61_probe()
1314 if (IS_ERR(data->acc_indio_dev)) in kmx61_probe()
1315 return PTR_ERR(data->acc_indio_dev); in kmx61_probe()
1317 data->mag_indio_dev = in kmx61_probe()
1322 if (IS_ERR(data->mag_indio_dev)) in kmx61_probe()
1323 return PTR_ERR(data->mag_indio_dev); in kmx61_probe()
1329 if (client->irq > 0) { in kmx61_probe()
1330 ret = devm_request_threaded_irq(&client->dev, client->irq, in kmx61_probe()
1339 data->acc_dready_trig = in kmx61_probe()
1340 kmx61_trigger_setup(data, data->acc_indio_dev, in kmx61_probe()
1342 if (IS_ERR(data->acc_dready_trig)) { in kmx61_probe()
1343 ret = PTR_ERR(data->acc_dready_trig); in kmx61_probe()
1347 data->mag_dready_trig = in kmx61_probe()
1348 kmx61_trigger_setup(data, data->mag_indio_dev, in kmx61_probe()
1350 if (IS_ERR(data->mag_dready_trig)) { in kmx61_probe()
1351 ret = PTR_ERR(data->mag_dready_trig); in kmx61_probe()
1355 data->motion_trig = in kmx61_probe()
1356 kmx61_trigger_setup(data, data->acc_indio_dev, in kmx61_probe()
1357 "any-motion"); in kmx61_probe()
1358 if (IS_ERR(data->motion_trig)) { in kmx61_probe()
1359 ret = PTR_ERR(data->motion_trig); in kmx61_probe()
1363 ret = iio_triggered_buffer_setup(data->acc_indio_dev, in kmx61_probe()
1368 dev_err(&data->client->dev, in kmx61_probe()
1373 ret = iio_triggered_buffer_setup(data->mag_indio_dev, in kmx61_probe()
1378 dev_err(&data->client->dev, in kmx61_probe()
1384 ret = pm_runtime_set_active(&client->dev); in kmx61_probe()
1388 pm_runtime_enable(&client->dev); in kmx61_probe()
1389 pm_runtime_set_autosuspend_delay(&client->dev, KMX61_SLEEP_DELAY_MS); in kmx61_probe()
1390 pm_runtime_use_autosuspend(&client->dev); in kmx61_probe()
1392 ret = iio_device_register(data->acc_indio_dev); in kmx61_probe()
1394 dev_err(&client->dev, "Failed to register acc iio device\n"); in kmx61_probe()
1398 ret = iio_device_register(data->mag_indio_dev); in kmx61_probe()
1400 dev_err(&client->dev, "Failed to register mag iio device\n"); in kmx61_probe()
1407 iio_device_unregister(data->acc_indio_dev); in kmx61_probe()
1409 if (client->irq > 0) in kmx61_probe()
1410 iio_triggered_buffer_cleanup(data->mag_indio_dev); in kmx61_probe()
1412 if (client->irq > 0) in kmx61_probe()
1413 iio_triggered_buffer_cleanup(data->acc_indio_dev); in kmx61_probe()
1415 iio_trigger_unregister(data->motion_trig); in kmx61_probe()
1417 iio_trigger_unregister(data->mag_dready_trig); in kmx61_probe()
1419 iio_trigger_unregister(data->acc_dready_trig); in kmx61_probe()
1429 iio_device_unregister(data->acc_indio_dev); in kmx61_remove()
1430 iio_device_unregister(data->mag_indio_dev); in kmx61_remove()
1432 pm_runtime_disable(&client->dev); in kmx61_remove()
1433 pm_runtime_set_suspended(&client->dev); in kmx61_remove()
1434 pm_runtime_put_noidle(&client->dev); in kmx61_remove()
1436 if (client->irq > 0) { in kmx61_remove()
1437 iio_triggered_buffer_cleanup(data->acc_indio_dev); in kmx61_remove()
1438 iio_triggered_buffer_cleanup(data->mag_indio_dev); in kmx61_remove()
1439 iio_trigger_unregister(data->acc_dready_trig); in kmx61_remove()
1440 iio_trigger_unregister(data->mag_dready_trig); in kmx61_remove()
1441 iio_trigger_unregister(data->motion_trig); in kmx61_remove()
1444 mutex_lock(&data->lock); in kmx61_remove()
1446 mutex_unlock(&data->lock); in kmx61_remove()
1457 mutex_lock(&data->lock); in kmx61_suspend()
1460 mutex_unlock(&data->lock); in kmx61_suspend()
1470 if (data->acc_stby) in kmx61_resume()
1472 if (data->mag_stby) in kmx61_resume()
1485 mutex_lock(&data->lock); in kmx61_runtime_suspend()
1487 mutex_unlock(&data->lock); in kmx61_runtime_suspend()
1497 if (!data->acc_ps) in kmx61_runtime_resume()
1499 if (!data->mag_ps) in kmx61_runtime_resume()