Lines Matching +full:kx132acr +full:- +full:lbz

1 // SPDX-License-Identifier: GPL-2.0-only
39 #include "kionix-kx022a.h"
99 * The HW does not set WHO_AM_I reg as read-only but we don't want to write it
100 * so we still include it in the read-only ranges.
317 return &data->orientation; in kx022a_get_mount_matrix()
403 * range is typically +-2G/4G/8G/16G, distributed over the amount of bits.
406 * => KX022A uses 16 bit (HiRes mode - assume the low 8 bits are zeroed
407 * in low-power mode(?) )
408 * => +/-2G => 4 / 2^16 * 9,80665
409 * => +/-2G - 0.000598550415
410 * +/-4G - 0.00119710083
411 * +/-8G - 0.00239420166
412 * +/-16G - 0.00478840332
421 /* KX134ACR-LBZ ranges are (+/-) 8, 16, 32, 64 G */
444 *vals = (const int *)data->chip_info->scale_table; in kx022a_read_avail()
445 *length = data->chip_info->scale_table_size; in kx022a_read_avail()
449 return -EINVAL; in kx022a_read_avail()
467 *val1 = data->chip_info->scale_table[val][0]; in kx022a_reg2scale()
468 *val2 = data->chip_info->scale_table[val][1]; in kx022a_reg2scale()
476 ret = regmap_set_bits(data->regmap, data->chip_info->cntl, in __kx022a_turn_on_off()
479 ret = regmap_clear_bits(data->regmap, data->chip_info->cntl, in __kx022a_turn_on_off()
482 dev_err(data->dev, "Turn %s fail %d\n", str_on_off(on), ret); in __kx022a_turn_on_off()
491 mutex_lock(&data->mutex); in kx022a_turn_off_lock()
494 mutex_unlock(&data->mutex); in kx022a_turn_off_lock()
504 mutex_unlock(&data->mutex); in kx022a_turn_on_unlock()
519 return -EINVAL; in kx022a_write_raw_get_fmt()
534 while (n--) in __kx022a_write_raw()
539 return -EINVAL; in __kx022a_write_raw()
545 ret = regmap_update_bits(data->regmap, in __kx022a_write_raw()
546 data->chip_info->odcntl, in __kx022a_write_raw()
548 data->odr_ns = kx022a_odrs[n]; in __kx022a_write_raw()
552 n = data->chip_info->scale_table_size / 2; in __kx022a_write_raw()
554 while (n-- > 0) in __kx022a_write_raw()
555 if (val == data->chip_info->scale_table[n][0] && in __kx022a_write_raw()
556 val2 == data->chip_info->scale_table[n][1]) in __kx022a_write_raw()
559 return -EINVAL; in __kx022a_write_raw()
565 ret = regmap_update_bits(data->regmap, data->chip_info->cntl, in __kx022a_write_raw()
571 return -EINVAL; in __kx022a_write_raw()
588 * time-limit). in kx022a_write_raw()
591 return -EBUSY; in kx022a_write_raw()
604 threshold = data->watermark; in kx022a_fifo_set_wmi()
606 return regmap_update_bits(data->regmap, data->chip_info->buf_cntl1, in kx022a_fifo_set_wmi()
616 ret = regmap_bulk_read(data->regmap, chan->address, &data->buffer[0], in kx022a_get_axis()
621 *val = (s16)le16_to_cpu(data->buffer[0]); in kx022a_get_axis()
637 return -EBUSY; in kx022a_read_raw()
639 mutex_lock(&data->mutex); in kx022a_read_raw()
641 mutex_unlock(&data->mutex); in kx022a_read_raw()
648 ret = regmap_read(data->regmap, data->chip_info->odcntl, &regval); in kx022a_read_raw()
654 dev_err(data->dev, "Invalid ODR\n"); in kx022a_read_raw()
655 return -EINVAL; in kx022a_read_raw()
663 ret = regmap_read(data->regmap, data->chip_info->cntl, &regval); in kx022a_read_raw()
672 return -EINVAL; in kx022a_read_raw()
679 val = min(data->chip_info->fifo_length, val); in kx022a_set_watermark()
681 mutex_lock(&data->mutex); in kx022a_set_watermark()
682 data->watermark = val; in kx022a_set_watermark()
683 mutex_unlock(&data->mutex); in kx022a_set_watermark()
696 mutex_lock(&data->mutex); in hwfifo_enabled_show()
697 state = data->state; in hwfifo_enabled_show()
698 mutex_unlock(&data->mutex); in hwfifo_enabled_show()
711 mutex_lock(&data->mutex); in hwfifo_watermark_show()
712 wm = data->watermark; in hwfifo_watermark_show()
713 mutex_unlock(&data->mutex); in hwfifo_watermark_show()
730 * We must clear the old time-stamp to avoid computing the timestamps in kx022a_drop_fifo_contents()
734 * called from fifo-disable where we can guarantee the sensor is not in kx022a_drop_fifo_contents()
736 * user-space access. in kx022a_drop_fifo_contents()
738 data->timestamp = 0; in kx022a_drop_fifo_contents()
740 return regmap_write(data->regmap, data->chip_info->buf_clear, 0x0); in kx022a_drop_fifo_contents()
747 ret = regmap_read(data->regmap, KX022A_REG_BUF_STATUS_1, &fifo_bytes); in kx022a_get_fifo_bytes_available()
749 dev_err(data->dev, "Error reading buffer status\n"); in kx022a_get_fifo_bytes_available()
764 ret = regmap_bulk_read(data->regmap, data->chip_info->buf_status1, in kx132_get_fifo_bytes_available()
767 dev_err(data->dev, "Error reading buffer status\n"); in kx132_get_fifo_bytes_available()
772 fifo_bytes &= data->chip_info->buf_smp_lvl_mask; in kx132_get_fifo_bytes_available()
773 fifo_bytes = min((unsigned int)fifo_bytes, data->chip_info->fifo_length * in kx132_get_fifo_bytes_available()
789 fifo_bytes = data->chip_info->get_fifo_bytes_available(data); in __kx022a_fifo_flush()
792 dev_warn(data->dev, "Bad FIFO alignment. Data may be corrupt\n"); in __kx022a_fifo_flush()
808 * We need to have the IRQ disabled or we risk of messing-up in __kx022a_fifo_flush()
810 * IRQF_ONESHOT has us covered - but if we are ran by the in __kx022a_fifo_flush()
811 * user-space read we need to disable the IRQ to be on a safe in __kx022a_fifo_flush()
816 disable_irq(data->irq); in __kx022a_fifo_flush()
819 data->old_timestamp = data->timestamp; in __kx022a_fifo_flush()
820 data->timestamp = iio_get_time_ns(idev); in __kx022a_fifo_flush()
834 if (data->old_timestamp) { in __kx022a_fifo_flush()
835 sample_period = data->timestamp - data->old_timestamp; in __kx022a_fifo_flush()
838 sample_period = data->odr_ns; in __kx022a_fifo_flush()
840 tstamp = data->timestamp - (count - 1) * sample_period; in __kx022a_fifo_flush()
848 data->timestamp -= (count - samples) * sample_period; in __kx022a_fifo_flush()
853 ret = regmap_noinc_read(data->regmap, data->chip_info->buf_read, in __kx022a_fifo_flush()
854 data->fifo_buffer, fifo_bytes); in __kx022a_fifo_flush()
859 __le16 *sam = &data->fifo_buffer[i * 3]; in __kx022a_fifo_flush()
863 chs = &data->scan.channels[0]; in __kx022a_fifo_flush()
864 for_each_set_bit(bit, idev->active_scan_mask, AXIS_MAX) in __kx022a_fifo_flush()
867 iio_push_to_buffers_with_timestamp(idev, &data->scan, tstamp); in __kx022a_fifo_flush()
876 enable_irq(data->irq); in __kx022a_fifo_flush()
886 mutex_lock(&data->mutex); in kx022a_fifo_flush()
888 mutex_unlock(&data->mutex); in kx022a_fifo_flush()
907 return regmap_set_bits(data->regmap, data->chip_info->cntl, in kx022a_set_drdy_irq()
910 return regmap_clear_bits(data->regmap, data->chip_info->cntl, in kx022a_set_drdy_irq()
923 ret = regmap_update_bits(data->regmap, data->inc_reg, mask, val); in kx022a_prepare_irq_pin()
930 return regmap_set_bits(data->regmap, data->ien_reg, mask); in kx022a_prepare_irq_pin()
937 guard(mutex)(&data->mutex); in kx022a_fifo_disable()
942 ret = regmap_clear_bits(data->regmap, data->ien_reg, KX022A_MASK_WMI); in kx022a_fifo_disable()
946 ret = regmap_clear_bits(data->regmap, data->chip_info->buf_cntl2, in kx022a_fifo_disable()
951 data->state &= ~KX022A_STATE_FIFO; in kx022a_fifo_disable()
955 kfree(data->fifo_buffer); in kx022a_fifo_disable()
974 data->fifo_buffer = kmalloc_array(data->chip_info->fifo_length, in kx022a_fifo_enable()
977 if (!data->fifo_buffer) in kx022a_fifo_enable()
978 return -ENOMEM; in kx022a_fifo_enable()
980 guard(mutex)(&data->mutex); in kx022a_fifo_enable()
991 ret = regmap_set_bits(data->regmap, data->chip_info->buf_cntl2, in kx022a_fifo_enable()
996 data->state |= KX022A_STATE_FIFO; in kx022a_fifo_enable()
997 ret = regmap_set_bits(data->regmap, data->ien_reg, in kx022a_fifo_enable()
1010 * If we use data-ready trigger, then the IRQ masks should be handled by in kx022a_buffer_postenable()
1012 * results to the IIO fifo when data-ready triggers. in kx022a_buffer_postenable()
1028 struct iio_dev *idev = pf->indio_dev; in kx022a_trigger_handler()
1032 ret = regmap_bulk_read(data->regmap, data->chip_info->xout_l, data->buffer, in kx022a_trigger_handler()
1037 iio_push_to_buffers_with_timestamp(idev, data->buffer, data->timestamp); in kx022a_trigger_handler()
1039 iio_trigger_notify_done(idev->trig); in kx022a_trigger_handler()
1050 data->old_timestamp = data->timestamp; in kx022a_irq_handler()
1051 data->timestamp = iio_get_time_ns(idev); in kx022a_irq_handler()
1053 if (data->state & KX022A_STATE_FIFO || data->trigger_enabled) in kx022a_irq_handler()
1060 * WMI and data-ready IRQs are acked when results are read. If we add
1061 * TILT/WAKE or other IRQs - then we may need to implement the acking
1070 guard(mutex)(&data->mutex); in kx022a_irq_thread_handler()
1072 if (data->trigger_enabled) { in kx022a_irq_thread_handler()
1073 iio_trigger_poll_nested(data->trig); in kx022a_irq_thread_handler()
1077 if (data->state & KX022A_STATE_FIFO) { in kx022a_irq_thread_handler()
1080 ok = __kx022a_fifo_flush(idev, data->chip_info->fifo_length, true); in kx022a_irq_thread_handler()
1094 guard(mutex)(&data->mutex); in kx022a_trigger_set_state()
1096 if (data->trigger_enabled == state) in kx022a_trigger_set_state()
1099 if (data->state & KX022A_STATE_FIFO) { in kx022a_trigger_set_state()
1100 dev_warn(data->dev, "Can't set trigger when FIFO enabled\n"); in kx022a_trigger_set_state()
1101 return -EBUSY; in kx022a_trigger_set_state()
1108 data->trigger_enabled = state; in kx022a_trigger_set_state()
1125 ret = regmap_write(data->regmap, data->chip_info->cntl2, KX022A_MASK_SRST); in kx022a_chip_init()
1130 * According to the power-on procedure documents, there is (at least) in kx022a_chip_init()
1132 * all, KX022ACR-Z, KX132-1211, KX132ACR-LBZ and KX134ACR-LBZ. in kx022a_chip_init()
1134 * https://fscdn.rohm.com/kionix/en/document/AN010_KX022ACR-Z_Power-on_Procedure_E.pdf in kx022a_chip_init()
1135 * https://fscdn.rohm.com/kionix/en/document/TN027-Power-On-Procedure.pdf in kx022a_chip_init()
1136 * https://fscdn.rohm.com/kionix/en/document/AN011_KX134ACR-LBZ_Power-on_Procedure_E.pdf in kx022a_chip_init()
1140 ret = regmap_read_poll_timeout(data->regmap, data->chip_info->cntl2, val, in kx022a_chip_init()
1145 dev_err(data->dev, "Sensor reset %s\n", in kx022a_chip_init()
1150 ret = regmap_reinit_cache(data->regmap, data->chip_info->regmap_config); in kx022a_chip_init()
1152 dev_err(data->dev, "Failed to reinit reg cache\n"); in kx022a_chip_init()
1157 ret = regmap_set_bits(data->regmap, data->chip_info->buf_cntl2, in kx022a_chip_init()
1160 dev_err(data->dev, "Failed to set data resolution\n"); in kx022a_chip_init()
1168 .name = "kx022-accel",
1196 .name = "kx132-1211",
1225 .name = "kx134-1211",
1254 * Despite the naming, KX132ACR-LBZ is not similar to KX132-1211 but it is
1255 * exact subset of KX022A. KX132ACR-LBZ is meant to be used for industrial
1261 .name = "kx132acr-lbz",
1289 .name = "kx134acr-lbz",
1318 static const char * const regulator_names[] = {"io-vdd", "vdd"}; in kx022a_probe_internal()
1331 return -EINVAL; in kx022a_probe_internal()
1336 return -ENODEV; in kx022a_probe_internal()
1340 return -ENOMEM; in kx022a_probe_internal()
1343 data->chip_info = chip_info; in kx022a_probe_internal()
1351 if (ret && ret != -ENODEV) in kx022a_probe_internal()
1354 ret = regmap_read(regmap, chip_info->who, &chip_id); in kx022a_probe_internal()
1358 if (chip_id != chip_info->id) in kx022a_probe_internal()
1363 data->inc_reg = chip_info->inc1; in kx022a_probe_internal()
1364 data->ien_reg = chip_info->inc4; in kx022a_probe_internal()
1370 data->inc_reg = chip_info->inc5; in kx022a_probe_internal()
1371 data->ien_reg = chip_info->inc6; in kx022a_probe_internal()
1374 data->regmap = regmap; in kx022a_probe_internal()
1375 data->dev = dev; in kx022a_probe_internal()
1376 data->irq = irq; in kx022a_probe_internal()
1377 data->odr_ns = KX022A_DEFAULT_PERIOD_NS; in kx022a_probe_internal()
1378 mutex_init(&data->mutex); in kx022a_probe_internal()
1380 idev->channels = chip_info->channels; in kx022a_probe_internal()
1381 idev->num_channels = chip_info->num_channels; in kx022a_probe_internal()
1382 idev->name = chip_info->name; in kx022a_probe_internal()
1383 idev->info = &kx022a_info; in kx022a_probe_internal()
1384 idev->modes = INDIO_DIRECT_MODE | INDIO_BUFFER_SOFTWARE; in kx022a_probe_internal()
1385 idev->available_scan_masks = kx022a_scan_masks; in kx022a_probe_internal()
1388 ret = iio_read_mount_matrix(dev, &data->orientation); in kx022a_probe_internal()
1399 mutex_unlock(&data->mutex); in kx022a_probe_internal()
1415 return dev_err_probe(data->dev, ret, in kx022a_probe_internal()
1417 indio_trig = devm_iio_trigger_alloc(dev, "%sdata-rdy-dev%d", idev->name, in kx022a_probe_internal()
1420 return -ENOMEM; in kx022a_probe_internal()
1422 data->trig = indio_trig; in kx022a_probe_internal()
1424 indio_trig->ops = &kx022a_trigger_ops; in kx022a_probe_internal()
1431 name = devm_kasprintf(data->dev, GFP_KERNEL, "%s-kx022a", in kx022a_probe_internal()
1432 dev_name(data->dev)); in kx022a_probe_internal()
1434 ret = devm_request_threaded_irq(data->dev, irq, kx022a_irq_handler, in kx022a_probe_internal()
1438 return dev_err_probe(data->dev, ret, "Could not request IRQ\n"); in kx022a_probe_internal()
1442 return dev_err_probe(data->dev, ret, in kx022a_probe_internal()
1445 ret = devm_iio_device_register(data->dev, idev); in kx022a_probe_internal()