| // SPDX-License-Identifier: GPL-2.0-or-later | |
| /* | |
| * Copyright (C) 2024-2026 Analog Devices, Inc. | |
| * Author: Radu Sabau <radu.sabau@analog.com> | |
| */ | |
| #include <linux/array_size.h> | |
| #include <linux/bitfield.h> | |
| #include <linux/bitmap.h> | |
| #include <linux/cleanup.h> | |
| #include <linux/delay.h> | |
| #include <linux/dev_printk.h> | |
| #include <linux/device/devres.h> | |
| #include <linux/dmaengine.h> | |
| #include <linux/err.h> | |
| #include <linux/interrupt.h> | |
| #include <linux/kstrtox.h> | |
| #include <linux/limits.h> | |
| #include <linux/math.h> | |
| #include <linux/module.h> | |
| #include <linux/property.h> | |
| #include <linux/pwm.h> | |
| #include <linux/regmap.h> | |
| #include <linux/regulator/consumer.h> | |
| #include <linux/reset.h> | |
| #include <linux/string.h> | |
| #include <linux/spi/spi.h> | |
| #include <linux/spi/offload/consumer.h> | |
| #include <linux/spi/offload/provider.h> | |
| #include <linux/types.h> | |
| #include <linux/units.h> | |
| #include <linux/unaligned.h> | |
| #include <linux/iio/buffer.h> | |
| #include <linux/iio/buffer-dma.h> | |
| #include <linux/iio/buffer-dmaengine.h> | |
| #include <linux/iio/iio.h> | |
| #include <linux/iio/sysfs.h> | |
| #include <linux/iio/trigger.h> | |
| #include <linux/iio/triggered_buffer.h> | |
| #include <linux/iio/trigger_consumer.h> | |
| #define AD4691_VREF_uV_MIN 2400000 | |
| #define AD4691_VREF_uV_MAX 5250000 | |
| #define AD4691_VREF_2P5_uV_MAX 2750000 | |
| #define AD4691_VREF_3P0_uV_MAX 3250000 | |
| #define AD4691_VREF_3P3_uV_MAX 3750000 | |
| #define AD4691_VREF_4P096_uV_MAX 4500000 | |
| #define AD4691_CNV_DUTY_CYCLE_NS 380 | |
| #define AD4691_CNV_HIGH_TIME_NS 430 | |
| /* | |
| * Conservative default for the manual offload periodic trigger. Low enough | |
| * to work safely out of the box across all OSR and channel count combinations. | |
| */ | |
| #define AD4691_OFFLOAD_INITIAL_TRIGGER_HZ (100 * HZ_PER_KHZ) | |
| #define AD4691_SPI_CONFIG_A_REG 0x000 | |
| #define AD4691_SW_RESET (BIT(7) | BIT(0)) | |
| #define AD4691_STATUS_REG 0x014 | |
| #define AD4691_CLAMP_STATUS1_REG 0x01A | |
| #define AD4691_CLAMP_STATUS2_REG 0x01B | |
| #define AD4691_DEVICE_SETUP 0x020 | |
| #define AD4691_MANUAL_MODE BIT(2) | |
| #define AD4691_LDO_EN BIT(4) | |
| #define AD4691_REF_CTRL 0x021 | |
| #define AD4691_REF_CTRL_MASK GENMASK(4, 2) | |
| #define AD4691_REFBUF_EN BIT(0) | |
| #define AD4691_OSC_FREQ_REG 0x023 | |
| #define AD4691_OSC_FREQ_MASK GENMASK(3, 0) | |
| #define AD4691_STD_SEQ_CONFIG 0x025 | |
| #define AD4691_SEQ_ALL_CHANNELS_OFF 0x00 | |
| #define AD4691_SPARE_CONTROL 0x02A | |
| #define AD4691_MAX_CHANNELS 16 | |
| #define AD4691_NOOP 0x00 | |
| #define AD4691_ADC_CHAN(ch) ((0x10 + (ch)) << 3) | |
| #define AD4691_EXIT_COMMAND 0x5000 | |
| #define AD4691_OSC_EN_REG 0x180 | |
| #define AD4691_STATE_RESET_REG 0x181 | |
| #define AD4691_STATE_RESET_ALL BIT(0) | |
| #define AD4691_ADC_SETUP 0x182 | |
| #define AD4691_ADC_MODE_MASK GENMASK(1, 0) | |
| #define AD4691_CNV_BURST_MODE 0x01 | |
| #define AD4691_AUTONOMOUS_MODE 0x02 | |
| /* | |
| * ACC_MASK_REG covers both mask bytes via ADDR_DESCENDING SPI: writing a | |
| * 16-bit BE value to 0x185 auto-decrements to 0x184 for the second byte. | |
| */ | |
| #define AD4691_ACC_MASK_REG 0x185 | |
| #define AD4691_ACC_DEPTH_IN(n) (0x186 + (n)) | |
| #define AD4691_GPIO_MODE1_REG 0x196 | |
| #define AD4691_GPIO_MODE2_REG 0x197 | |
| #define AD4691_GP_MODE_MASK GENMASK(3, 0) | |
| #define AD4691_GP_MODE_DATA_READY 0x06 | |
| #define AD4691_GPIO_READ 0x1A0 | |
| #define AD4691_ACC_STATUS_FULL1_REG 0x1B0 | |
| #define AD4691_ACC_STATUS_FULL2_REG 0x1B1 | |
| #define AD4691_ACC_STATUS_OVERRUN1_REG 0x1B2 | |
| #define AD4691_ACC_STATUS_OVERRUN2_REG 0x1B3 | |
| #define AD4691_ACC_STATUS_SAT1_REG 0x1B4 | |
| #define AD4691_ACC_STATUS_SAT2_REG 0x1BE | |
| #define AD4691_ACC_SAT_OVR_REG(n) (0x1C0 + (n)) | |
| #define AD4691_AVG_IN(n) (0x201 + (2 * (n))) | |
| #define AD4691_AVG_STS_IN(n) (0x222 + (3 * (n))) | |
| #define AD4691_ACC_IN(n) (0x252 + (3 * (n))) | |
| #define AD4691_ACC_STS_DATA(n) (0x283 + (4 * (n))) | |
| static const char * const ad4691_supplies[] = { "avdd", "vio" }; | |
| enum ad4691_ref_ctrl { | |
| AD4691_VREF_2P5, | |
| AD4691_VREF_3P0, | |
| AD4691_VREF_3P3, | |
| AD4691_VREF_4P096, | |
| AD4691_VREF_5P0 | |
| }; | |
| struct ad4691_channel_info { | |
| const struct iio_chan_spec *channels __counted_by_ptr(num_channels); | |
| const struct iio_chan_spec *manual_channels __counted_by_ptr(num_channels); | |
| unsigned int num_channels; | |
| }; | |
| struct ad4691_chip_info { | |
| const char *name; | |
| unsigned int max_rate; | |
| const struct ad4691_channel_info *sw_info; | |
| const struct ad4691_channel_info *offload_info; | |
| }; | |
| /* CNV burst mode channel — exposes oversampling ratio. */ | |
| #define AD4691_CHANNEL(ch) \ | |
| { \ | |
| .type = IIO_VOLTAGE, \ | |
| .indexed = 1, \ | |
| .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \ | |
| .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SCALE) \ | |
| | BIT(IIO_CHAN_INFO_SAMP_FREQ) \ | |
| | BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO), \ | |
| .info_mask_shared_by_all_available = \ | |
| BIT(IIO_CHAN_INFO_SAMP_FREQ) \ | |
| | BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO), \ | |
| .channel = ch, \ | |
| .scan_index = ch, \ | |
| .scan_type = { \ | |
| .format = 'u', \ | |
| .realbits = 16, \ | |
| .storagebits = 16, \ | |
| .endianness = IIO_BE, \ | |
| }, \ | |
| } | |
| /* | |
| * Manual mode channel — no oversampling ratio attribute. OSR is not | |
| * supported in manual mode; ACC_DEPTH_IN is not configured during manual | |
| * buffer enable. | |
| */ | |
| #define AD4691_MANUAL_CHANNEL(ch) \ | |
| { \ | |
| .type = IIO_VOLTAGE, \ | |
| .indexed = 1, \ | |
| .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \ | |
| .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SCALE) \ | |
| | BIT(IIO_CHAN_INFO_SAMP_FREQ), \ | |
| .info_mask_shared_by_all_available = \ | |
| BIT(IIO_CHAN_INFO_SAMP_FREQ), \ | |
| .channel = ch, \ | |
| .scan_index = ch, \ | |
| .scan_type = { \ | |
| .format = 'u', \ | |
| .realbits = 16, \ | |
| .storagebits = 16, \ | |
| .endianness = IIO_BE, \ | |
| }, \ | |
| } | |
| /* | |
| * Offload path (bits_per_word=16): the SPI Engine assembles received | |
| * bits into native 16-bit words before DMA, so samples are in | |
| * CPU-native byte order (IIO_CPU). storagebits=16 matches the 16-bit | |
| * DMA word size. | |
| * | |
| * CNV burst offload configures ACC_DEPTH_IN per channel, so the | |
| * oversampling_ratio attribute is exposed. Manual offload does not; | |
| * use AD4691_OFFLOAD_MANUAL_CHANNEL for that path. | |
| */ | |
| #define AD4691_OFFLOAD_CHANNEL(ch) \ | |
| { \ | |
| .type = IIO_VOLTAGE, \ | |
| .indexed = 1, \ | |
| .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \ | |
| .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SCALE) \ | |
| | BIT(IIO_CHAN_INFO_SAMP_FREQ) \ | |
| | BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO), \ | |
| .info_mask_shared_by_all_available = \ | |
| BIT(IIO_CHAN_INFO_SAMP_FREQ) \ | |
| | BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO), \ | |
| .channel = ch, \ | |
| .scan_index = ch, \ | |
| .scan_type = { \ | |
| .format = 'u', \ | |
| .realbits = 16, \ | |
| .storagebits = 16, \ | |
| }, \ | |
| } | |
| /* Manual offload — same IIO_CPU layout but no oversampling_ratio attribute. */ | |
| #define AD4691_OFFLOAD_MANUAL_CHANNEL(ch) \ | |
| { \ | |
| .type = IIO_VOLTAGE, \ | |
| .indexed = 1, \ | |
| .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \ | |
| .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SCALE) \ | |
| | BIT(IIO_CHAN_INFO_SAMP_FREQ), \ | |
| .info_mask_shared_by_all_available = \ | |
| BIT(IIO_CHAN_INFO_SAMP_FREQ), \ | |
| .channel = ch, \ | |
| .scan_index = ch, \ | |
| .scan_type = { \ | |
| .format = 'u', \ | |
| .realbits = 16, \ | |
| .storagebits = 16, \ | |
| }, \ | |
| } | |
| static const struct iio_chan_spec ad4691_channels[] = { | |
| AD4691_CHANNEL(0), | |
| AD4691_CHANNEL(1), | |
| AD4691_CHANNEL(2), | |
| AD4691_CHANNEL(3), | |
| AD4691_CHANNEL(4), | |
| AD4691_CHANNEL(5), | |
| AD4691_CHANNEL(6), | |
| AD4691_CHANNEL(7), | |
| AD4691_CHANNEL(8), | |
| AD4691_CHANNEL(9), | |
| AD4691_CHANNEL(10), | |
| AD4691_CHANNEL(11), | |
| AD4691_CHANNEL(12), | |
| AD4691_CHANNEL(13), | |
| AD4691_CHANNEL(14), | |
| AD4691_CHANNEL(15), | |
| IIO_CHAN_SOFT_TIMESTAMP(16), | |
| }; | |
| static const struct iio_chan_spec ad4693_channels[] = { | |
| AD4691_CHANNEL(0), | |
| AD4691_CHANNEL(1), | |
| AD4691_CHANNEL(2), | |
| AD4691_CHANNEL(3), | |
| AD4691_CHANNEL(4), | |
| AD4691_CHANNEL(5), | |
| AD4691_CHANNEL(6), | |
| AD4691_CHANNEL(7), | |
| IIO_CHAN_SOFT_TIMESTAMP(8), | |
| }; | |
| /* | |
| * Offload channel arrays: no IIO_CHAN_SOFT_TIMESTAMP because DMA delivers | |
| * data directly to userspace without a software timestamp. | |
| */ | |
| static const struct iio_chan_spec ad4691_offload_channels[] = { | |
| AD4691_OFFLOAD_CHANNEL(0), | |
| AD4691_OFFLOAD_CHANNEL(1), | |
| AD4691_OFFLOAD_CHANNEL(2), | |
| AD4691_OFFLOAD_CHANNEL(3), | |
| AD4691_OFFLOAD_CHANNEL(4), | |
| AD4691_OFFLOAD_CHANNEL(5), | |
| AD4691_OFFLOAD_CHANNEL(6), | |
| AD4691_OFFLOAD_CHANNEL(7), | |
| AD4691_OFFLOAD_CHANNEL(8), | |
| AD4691_OFFLOAD_CHANNEL(9), | |
| AD4691_OFFLOAD_CHANNEL(10), | |
| AD4691_OFFLOAD_CHANNEL(11), | |
| AD4691_OFFLOAD_CHANNEL(12), | |
| AD4691_OFFLOAD_CHANNEL(13), | |
| AD4691_OFFLOAD_CHANNEL(14), | |
| AD4691_OFFLOAD_CHANNEL(15), | |
| }; | |
| static const struct iio_chan_spec ad4693_offload_channels[] = { | |
| AD4691_OFFLOAD_CHANNEL(0), | |
| AD4691_OFFLOAD_CHANNEL(1), | |
| AD4691_OFFLOAD_CHANNEL(2), | |
| AD4691_OFFLOAD_CHANNEL(3), | |
| AD4691_OFFLOAD_CHANNEL(4), | |
| AD4691_OFFLOAD_CHANNEL(5), | |
| AD4691_OFFLOAD_CHANNEL(6), | |
| AD4691_OFFLOAD_CHANNEL(7), | |
| }; | |
| static const struct iio_chan_spec ad4691_manual_channels[] = { | |
| AD4691_MANUAL_CHANNEL(0), | |
| AD4691_MANUAL_CHANNEL(1), | |
| AD4691_MANUAL_CHANNEL(2), | |
| AD4691_MANUAL_CHANNEL(3), | |
| AD4691_MANUAL_CHANNEL(4), | |
| AD4691_MANUAL_CHANNEL(5), | |
| AD4691_MANUAL_CHANNEL(6), | |
| AD4691_MANUAL_CHANNEL(7), | |
| AD4691_MANUAL_CHANNEL(8), | |
| AD4691_MANUAL_CHANNEL(9), | |
| AD4691_MANUAL_CHANNEL(10), | |
| AD4691_MANUAL_CHANNEL(11), | |
| AD4691_MANUAL_CHANNEL(12), | |
| AD4691_MANUAL_CHANNEL(13), | |
| AD4691_MANUAL_CHANNEL(14), | |
| AD4691_MANUAL_CHANNEL(15), | |
| IIO_CHAN_SOFT_TIMESTAMP(16), | |
| }; | |
| static const struct iio_chan_spec ad4693_manual_channels[] = { | |
| AD4691_MANUAL_CHANNEL(0), | |
| AD4691_MANUAL_CHANNEL(1), | |
| AD4691_MANUAL_CHANNEL(2), | |
| AD4691_MANUAL_CHANNEL(3), | |
| AD4691_MANUAL_CHANNEL(4), | |
| AD4691_MANUAL_CHANNEL(5), | |
| AD4691_MANUAL_CHANNEL(6), | |
| AD4691_MANUAL_CHANNEL(7), | |
| IIO_CHAN_SOFT_TIMESTAMP(8), | |
| }; | |
| static const struct iio_chan_spec ad4691_offload_manual_channels[] = { | |
| AD4691_OFFLOAD_MANUAL_CHANNEL(0), | |
| AD4691_OFFLOAD_MANUAL_CHANNEL(1), | |
| AD4691_OFFLOAD_MANUAL_CHANNEL(2), | |
| AD4691_OFFLOAD_MANUAL_CHANNEL(3), | |
| AD4691_OFFLOAD_MANUAL_CHANNEL(4), | |
| AD4691_OFFLOAD_MANUAL_CHANNEL(5), | |
| AD4691_OFFLOAD_MANUAL_CHANNEL(6), | |
| AD4691_OFFLOAD_MANUAL_CHANNEL(7), | |
| AD4691_OFFLOAD_MANUAL_CHANNEL(8), | |
| AD4691_OFFLOAD_MANUAL_CHANNEL(9), | |
| AD4691_OFFLOAD_MANUAL_CHANNEL(10), | |
| AD4691_OFFLOAD_MANUAL_CHANNEL(11), | |
| AD4691_OFFLOAD_MANUAL_CHANNEL(12), | |
| AD4691_OFFLOAD_MANUAL_CHANNEL(13), | |
| AD4691_OFFLOAD_MANUAL_CHANNEL(14), | |
| AD4691_OFFLOAD_MANUAL_CHANNEL(15), | |
| }; | |
| static const struct iio_chan_spec ad4693_offload_manual_channels[] = { | |
| AD4691_OFFLOAD_MANUAL_CHANNEL(0), | |
| AD4691_OFFLOAD_MANUAL_CHANNEL(1), | |
| AD4691_OFFLOAD_MANUAL_CHANNEL(2), | |
| AD4691_OFFLOAD_MANUAL_CHANNEL(3), | |
| AD4691_OFFLOAD_MANUAL_CHANNEL(4), | |
| AD4691_OFFLOAD_MANUAL_CHANNEL(5), | |
| AD4691_OFFLOAD_MANUAL_CHANNEL(6), | |
| AD4691_OFFLOAD_MANUAL_CHANNEL(7), | |
| }; | |
| static const int ad4691_oversampling_ratios[] = { 1, 2, 4, 8, 16, 32 }; | |
| static const struct ad4691_channel_info ad4691_sw_info = { | |
| .channels = ad4691_channels, | |
| .manual_channels = ad4691_manual_channels, | |
| .num_channels = ARRAY_SIZE(ad4691_channels), | |
| }; | |
| static const struct ad4691_channel_info ad4693_sw_info = { | |
| .channels = ad4693_channels, | |
| .manual_channels = ad4693_manual_channels, | |
| .num_channels = ARRAY_SIZE(ad4693_channels), | |
| }; | |
| static const struct ad4691_channel_info ad4691_offload_info = { | |
| .channels = ad4691_offload_channels, | |
| .manual_channels = ad4691_offload_manual_channels, | |
| .num_channels = ARRAY_SIZE(ad4691_offload_channels), | |
| }; | |
| static const struct ad4691_channel_info ad4693_offload_info = { | |
| .channels = ad4693_offload_channels, | |
| .manual_channels = ad4693_offload_manual_channels, | |
| .num_channels = ARRAY_SIZE(ad4693_offload_channels), | |
| }; | |
| /* | |
| * Internal oscillator frequency table. Index is the OSC_FREQ_REG[3:0] value. | |
| * Index 0 (1 MHz) is only valid for AD4692/AD4694; AD4691/AD4693 support | |
| * up to 500 kHz and use index 1 as their highest valid rate. | |
| */ | |
| static const int ad4691_osc_freqs_Hz[] = { | |
| [0x0] = 1000000, | |
| [0x1] = 500000, | |
| [0x2] = 400000, | |
| [0x3] = 250000, | |
| [0x4] = 200000, | |
| [0x5] = 167000, | |
| [0x6] = 133000, | |
| [0x7] = 125000, | |
| [0x8] = 100000, | |
| [0x9] = 50000, | |
| [0xA] = 25000, | |
| [0xB] = 12500, | |
| [0xC] = 10000, | |
| [0xD] = 5000, | |
| [0xE] = 2500, | |
| [0xF] = 1250, | |
| }; | |
| static const char * const ad4691_gp_names[] = { "gp0", "gp1", "gp2", "gp3" }; | |
| static const struct ad4691_chip_info ad4691_chip_info = { | |
| .name = "ad4691", | |
| .max_rate = 500 * HZ_PER_KHZ, | |
| .sw_info = &ad4691_sw_info, | |
| .offload_info = &ad4691_offload_info, | |
| }; | |
| static const struct ad4691_chip_info ad4692_chip_info = { | |
| .name = "ad4692", | |
| .max_rate = 1 * HZ_PER_MHZ, | |
| .sw_info = &ad4691_sw_info, | |
| .offload_info = &ad4691_offload_info, | |
| }; | |
| static const struct ad4691_chip_info ad4693_chip_info = { | |
| .name = "ad4693", | |
| .max_rate = 500 * HZ_PER_KHZ, | |
| .sw_info = &ad4693_sw_info, | |
| .offload_info = &ad4693_offload_info, | |
| }; | |
| static const struct ad4691_chip_info ad4694_chip_info = { | |
| .name = "ad4694", | |
| .max_rate = 1 * HZ_PER_MHZ, | |
| .sw_info = &ad4693_sw_info, | |
| .offload_info = &ad4693_offload_info, | |
| }; | |
| struct ad4691_state { | |
| const struct ad4691_chip_info *info; | |
| struct regmap *regmap; | |
| struct spi_device *spi; | |
| struct pwm_device *conv_trigger; | |
| int irq; | |
| int vref_uV; | |
| u32 cnv_period_ns; | |
| /* | |
| * Snapped oscillator frequency (Hz) shared by all channels. Set when | |
| * sampling_frequency or oversampling_ratio is written; written to | |
| * OSC_FREQ_REG at buffer enable and single-shot time so both attributes | |
| * can be set in any order. Reading in_voltage_sampling_frequency | |
| * returns target_osc_freq_Hz / osr — the effective rate given the | |
| * shared oversampling ratio. | |
| */ | |
| u32 target_osc_freq_Hz; | |
| /* Shared oversampling ratio across all channels; always 1 in manual mode. */ | |
| unsigned int osr; | |
| /* | |
| * Precomputed effective-rate lists, one row per entry in | |
| * ad4691_oversampling_ratios[]. Populated at probe; read_avail picks | |
| * the row for the current shared OSR. The tables are stable after | |
| * probe so returning a pointer into them from read_avail is race-free. | |
| */ | |
| int samp_freq_avail[ARRAY_SIZE(ad4691_oversampling_ratios)][ARRAY_SIZE(ad4691_osc_freqs_Hz)]; | |
| int samp_freq_avail_len[ARRAY_SIZE(ad4691_oversampling_ratios)]; | |
| bool manual_mode; | |
| bool irq_enabled; | |
| bool refbuf_en; | |
| bool ldo_en; | |
| /* | |
| * Synchronize access to members of the driver state, and ensure | |
| * atomicity of consecutive SPI operations. | |
| */ | |
| struct mutex lock; | |
| /* NULL when no SPI offload hardware is present. */ | |
| struct spi_offload *offload; | |
| struct spi_offload_trigger *offload_trigger; | |
| u64 trigger_hz; | |
| /* | |
| * Per-buffer-enable lifetime resources: | |
| * Manual Mode - a pre-built SPI message that clocks out N+1 | |
| * transfers in one go. | |
| * CNV Burst Mode - a pre-built SPI message that clocks out 2*N | |
| * transfers in one go. | |
| */ | |
| struct spi_message scan_msg; | |
| /* | |
| * max 16 + 1 NOOP (manual) or 2*16 + 1 state-reset (CNV burst). | |
| */ | |
| struct spi_transfer scan_xfers[34]; | |
| /* | |
| * CNV burst: 16 AVG_IN addresses = 16. Manual: 16 channel cmds + | |
| * 1 NOOP = 17. Stored as native u16. The non-offload path fills slots | |
| * with put_unaligned_be16() (bits_per_word=8, bytes go out in memory | |
| * order). The offload path assigns native values directly | |
| * (bits_per_word=bpw, SPI reads each slot as a native 16-bit word and | |
| * shifts it out MSB-first). | |
| */ | |
| u16 scan_tx[17] __aligned(IIO_DMA_MINALIGN); | |
| /* | |
| * CNV burst state-reset: 4-byte write [addr_hi, addr_lo, | |
| * STATE_RESET_ALL, OSC_EN=1]. CS is asserted throughout, so | |
| * ADDR_DESCENDING writes byte[3]=1 to OSC_EN_REG (0x180) as a | |
| * deliberate side-write, keeping the oscillator enabled. Shared | |
| * with the offload path (mutually exclusive at probe). | |
| */ | |
| u8 scan_tx_reset[4] __aligned(IIO_DMA_MINALIGN); | |
| /* | |
| * Scan buffer: one BE16 slot per active channel, plus timestamp. | |
| * DMA-aligned because scan_xfers point rx_buf directly into vals[]. | |
| */ | |
| IIO_DECLARE_DMA_BUFFER_WITH_TS(__be16, vals, 16); | |
| }; | |
| /* | |
| * Configure the given GP pin (0-3) as DATA_READY output. | |
| * GP0/GP1 → GPIO_MODE1_REG, GP2/GP3 → GPIO_MODE2_REG. | |
| * Even pins occupy bits [3:0], odd pins bits [7:4]. | |
| */ | |
| static int ad4691_gpio_setup(struct ad4691_state *st, unsigned int gp_num) | |
| { | |
| unsigned int bit_off = gp_num % 2; | |
| unsigned int reg_off = gp_num / 2; | |
| unsigned int shift = 4 * bit_off; | |
| return regmap_update_bits(st->regmap, | |
| AD4691_GPIO_MODE1_REG + reg_off, | |
| AD4691_GP_MODE_MASK << shift, | |
| AD4691_GP_MODE_DATA_READY << shift); | |
| } | |
| static const struct spi_offload_config ad4691_offload_config = { | |
| .capability_flags = SPI_OFFLOAD_CAP_TRIGGER | | |
| SPI_OFFLOAD_CAP_RX_STREAM_DMA, | |
| }; | |
| static bool ad4691_offload_trigger_match(struct spi_offload_trigger *trigger, | |
| enum spi_offload_trigger_type type, | |
| u64 *args, u32 nargs) | |
| { | |
| return type == SPI_OFFLOAD_TRIGGER_DATA_READY && nargs == 1 && args[0] <= 3; | |
| } | |
| static int ad4691_offload_trigger_request(struct spi_offload_trigger *trigger, | |
| enum spi_offload_trigger_type type, | |
| u64 *args, u32 nargs) | |
| { | |
| struct ad4691_state *st = spi_offload_trigger_get_priv(trigger); | |
| if (nargs != 1 || args[0] > 3) | |
| return -EINVAL; | |
| return ad4691_gpio_setup(st, args[0]); | |
| } | |
| static int ad4691_offload_trigger_validate(struct spi_offload_trigger *trigger, | |
| struct spi_offload_trigger_config *config) | |
| { | |
| if (config->type != SPI_OFFLOAD_TRIGGER_DATA_READY) | |
| return -EINVAL; | |
| return 0; | |
| } | |
| static const struct spi_offload_trigger_ops ad4691_offload_trigger_ops = { | |
| .match = ad4691_offload_trigger_match, | |
| .request = ad4691_offload_trigger_request, | |
| .validate = ad4691_offload_trigger_validate, | |
| }; | |
| static int ad4691_reg_read(void *context, unsigned int reg, unsigned int *val) | |
| { | |
| struct spi_device *spi = context; | |
| u8 tx[2], rx[4]; | |
| int ret; | |
| /* Set bit 15 to mark the operation as READ. */ | |
| put_unaligned_be16(0x8000 | reg, tx); | |
| switch (reg) { | |
| case 0 ... AD4691_OSC_FREQ_REG: | |
| case AD4691_SPARE_CONTROL ... AD4691_ACC_MASK_REG - 1: | |
| case AD4691_ACC_MASK_REG + 1 ... AD4691_ACC_SAT_OVR_REG(15): | |
| ret = spi_write_then_read(spi, tx, sizeof(tx), rx, 1); | |
| if (ret) | |
| return ret; | |
| *val = rx[0]; | |
| return 0; | |
| case AD4691_ACC_MASK_REG: | |
| case AD4691_STD_SEQ_CONFIG: | |
| case AD4691_AVG_IN(0) ... AD4691_AVG_IN(15): | |
| ret = spi_write_then_read(spi, tx, sizeof(tx), rx, 2); | |
| if (ret) | |
| return ret; | |
| *val = get_unaligned_be16(rx); | |
| return 0; | |
| case AD4691_AVG_STS_IN(0) ... AD4691_AVG_STS_IN(15): | |
| case AD4691_ACC_IN(0) ... AD4691_ACC_IN(15): | |
| ret = spi_write_then_read(spi, tx, sizeof(tx), rx, 3); | |
| if (ret) | |
| return ret; | |
| *val = get_unaligned_be24(rx); | |
| return 0; | |
| case AD4691_ACC_STS_DATA(0) ... AD4691_ACC_STS_DATA(15): | |
| ret = spi_write_then_read(spi, tx, sizeof(tx), rx, 4); | |
| if (ret) | |
| return ret; | |
| *val = get_unaligned_be32(rx); | |
| return 0; | |
| default: | |
| return -EINVAL; | |
| } | |
| } | |
| static int ad4691_reg_write(void *context, unsigned int reg, unsigned int val) | |
| { | |
| struct spi_device *spi = context; | |
| u8 tx[4]; | |
| put_unaligned_be16(reg, tx); | |
| switch (reg) { | |
| case 0 ... AD4691_OSC_FREQ_REG: | |
| case AD4691_SPARE_CONTROL ... AD4691_ACC_MASK_REG - 1: | |
| case AD4691_ACC_MASK_REG + 1 ... AD4691_GPIO_MODE2_REG: | |
| if (val > U8_MAX) | |
| return -EINVAL; | |
| tx[2] = val; | |
| return spi_write_then_read(spi, tx, 3, NULL, 0); | |
| case AD4691_ACC_MASK_REG: | |
| case AD4691_STD_SEQ_CONFIG: | |
| if (val > U16_MAX) | |
| return -EINVAL; | |
| put_unaligned_be16(val, &tx[2]); | |
| return spi_write_then_read(spi, tx, 4, NULL, 0); | |
| default: | |
| return -EINVAL; | |
| } | |
| } | |
| static bool ad4691_volatile_reg(struct device *dev, unsigned int reg) | |
| { | |
| switch (reg) { | |
| case AD4691_STATUS_REG: | |
| case AD4691_CLAMP_STATUS1_REG: | |
| case AD4691_CLAMP_STATUS2_REG: | |
| case AD4691_GPIO_READ: | |
| case AD4691_ACC_STATUS_FULL1_REG ... AD4691_ACC_STATUS_SAT2_REG: | |
| case AD4691_ACC_SAT_OVR_REG(0) ... AD4691_ACC_SAT_OVR_REG(15): | |
| case AD4691_AVG_IN(0) ... AD4691_AVG_IN(15): | |
| case AD4691_AVG_STS_IN(0) ... AD4691_AVG_STS_IN(15): | |
| case AD4691_ACC_IN(0) ... AD4691_ACC_IN(15): | |
| case AD4691_ACC_STS_DATA(0) ... AD4691_ACC_STS_DATA(15): | |
| return true; | |
| default: | |
| return false; | |
| } | |
| } | |
| static bool ad4691_readable_reg(struct device *dev, unsigned int reg) | |
| { | |
| switch (reg) { | |
| case 0 ... AD4691_OSC_FREQ_REG: | |
| case AD4691_SPARE_CONTROL ... AD4691_ACC_SAT_OVR_REG(15): | |
| case AD4691_STD_SEQ_CONFIG: | |
| return true; | |
| default: | |
| break; | |
| } | |
| /* | |
| * Multi-byte result registers have non-unit strides; only the base | |
| * address of each entry is a valid single-register read. | |
| */ | |
| if (reg >= AD4691_AVG_IN(0) && reg <= AD4691_AVG_IN(15)) | |
| return (reg - AD4691_AVG_IN(0)) % 2 == 0; | |
| if (reg >= AD4691_AVG_STS_IN(0) && reg <= AD4691_AVG_STS_IN(15)) | |
| return (reg - AD4691_AVG_STS_IN(0)) % 3 == 0; | |
| if (reg >= AD4691_ACC_IN(0) && reg <= AD4691_ACC_IN(15)) | |
| return (reg - AD4691_ACC_IN(0)) % 3 == 0; | |
| if (reg >= AD4691_ACC_STS_DATA(0) && reg <= AD4691_ACC_STS_DATA(15)) | |
| return (reg - AD4691_ACC_STS_DATA(0)) % 4 == 0; | |
| return false; | |
| } | |
| static bool ad4691_writeable_reg(struct device *dev, unsigned int reg) | |
| { | |
| switch (reg) { | |
| case 0 ... AD4691_OSC_FREQ_REG: | |
| case AD4691_STD_SEQ_CONFIG: | |
| case AD4691_SPARE_CONTROL ... AD4691_GPIO_MODE2_REG: | |
| return true; | |
| default: | |
| return false; | |
| } | |
| } | |
| static const struct regmap_config ad4691_regmap_config = { | |
| .reg_bits = 16, | |
| .val_bits = 32, | |
| .reg_read = ad4691_reg_read, | |
| .reg_write = ad4691_reg_write, | |
| .volatile_reg = ad4691_volatile_reg, | |
| .readable_reg = ad4691_readable_reg, | |
| .writeable_reg = ad4691_writeable_reg, | |
| .max_register = AD4691_ACC_STS_DATA(15), | |
| .cache_type = REGCACHE_MAPLE, | |
| }; | |
| /* | |
| * Index 0 in ad4691_osc_freqs_Hz is 1 MHz — valid only for AD4692/AD4694 | |
| * (max_rate == 1 MHz). AD4691/AD4693 cap at 500 kHz so their valid range | |
| * starts at index 1. | |
| */ | |
| static unsigned int ad4691_samp_freq_start(const struct ad4691_chip_info *info) | |
| { | |
| return (info->max_rate == 1 * HZ_PER_MHZ) ? 0 : 1; | |
| } | |
| /* | |
| * Find the largest oscillator table entry that is both <= needed_osc and | |
| * evenly divisible by osr (guaranteeing an integer effective rate on | |
| * read-back). Returns 0 if no such entry exists in the chip's valid range. | |
| */ | |
| static unsigned int ad4691_find_osc_freq(struct ad4691_state *st, | |
| unsigned int needed_osc, | |
| unsigned int osr) | |
| { | |
| unsigned int start = ad4691_samp_freq_start(st->info); | |
| for (unsigned int i = start; i < ARRAY_SIZE(ad4691_osc_freqs_Hz); i++) { | |
| if ((unsigned int)ad4691_osc_freqs_Hz[i] > needed_osc) | |
| continue; | |
| if (ad4691_osc_freqs_Hz[i] % osr) | |
| continue; | |
| return ad4691_osc_freqs_Hz[i]; | |
| } | |
| return 0; | |
| } | |
| /* Write target_osc_freq_Hz to OSC_FREQ_REG. Called at use time. */ | |
| static int ad4691_write_osc_freq(struct ad4691_state *st) | |
| { | |
| for (unsigned int i = 0; i < ARRAY_SIZE(ad4691_osc_freqs_Hz); i++) { | |
| if (ad4691_osc_freqs_Hz[i] == st->target_osc_freq_Hz) | |
| return regmap_write(st->regmap, AD4691_OSC_FREQ_REG, i); | |
| } | |
| return -EINVAL; | |
| } | |
| /* Return the index of osr in ad4691_oversampling_ratios[], defaulting to 0. */ | |
| static unsigned int ad4691_osr_index(unsigned int osr) | |
| { | |
| for (unsigned int i = 0; i < ARRAY_SIZE(ad4691_oversampling_ratios) - 1; i++) { | |
| if ((unsigned int)ad4691_oversampling_ratios[i] == osr) | |
| return i; | |
| } | |
| return ARRAY_SIZE(ad4691_oversampling_ratios) - 1; | |
| } | |
| /* | |
| * Precompute samp_freq_avail[][]: for each OSR value, list the oscillator | |
| * table entries that divide evenly by that OSR, expressed as effective rates | |
| * (osc_freq / osr). Called once at probe after st->info is set. | |
| */ | |
| static void ad4691_precompute_samp_freq_avail(struct ad4691_state *st) | |
| { | |
| unsigned int start = ad4691_samp_freq_start(st->info); | |
| for (unsigned int i = 0; i < ARRAY_SIZE(ad4691_oversampling_ratios); i++) { | |
| unsigned int osr = ad4691_oversampling_ratios[i]; | |
| int n = 0; | |
| for (unsigned int j = start; j < ARRAY_SIZE(ad4691_osc_freqs_Hz); j++) { | |
| if (ad4691_osc_freqs_Hz[j] % osr) | |
| continue; | |
| st->samp_freq_avail[i][n++] = ad4691_osc_freqs_Hz[j] / osr; | |
| } | |
| st->samp_freq_avail_len[i] = n; | |
| } | |
| } | |
| static int ad4691_set_sampling_freq(struct ad4691_state *st, int freq) | |
| { | |
| unsigned int osr, found; | |
| /* | |
| * Read osr under st->lock: osr and target_osc_freq_Hz are modified | |
| * together under the lock; reading after acquiring it ensures we see | |
| * a consistent snapshot with no concurrent write racing us. | |
| */ | |
| guard(mutex)(&st->lock); | |
| osr = st->osr; | |
| if (freq <= 0 || (unsigned int)freq > st->info->max_rate / osr) | |
| return -EINVAL; | |
| found = ad4691_find_osc_freq(st, (unsigned int)freq * osr, osr); | |
| if (!found) | |
| return -EINVAL; | |
| /* | |
| * Store the snapped oscillator frequency; OSC_FREQ_REG is written at | |
| * buffer enable and single-shot time so that sampling_frequency and | |
| * oversampling_ratio can be set in any order. | |
| */ | |
| st->target_osc_freq_Hz = found; | |
| return 0; | |
| } | |
| static int ad4691_read_avail(struct iio_dev *indio_dev, | |
| struct iio_chan_spec const *chan, | |
| const int **vals, int *type, | |
| int *length, long mask) | |
| { | |
| struct ad4691_state *st = iio_priv(indio_dev); | |
| switch (mask) { | |
| case IIO_CHAN_INFO_SAMP_FREQ: { | |
| unsigned int osr_idx; | |
| /* | |
| * The precomputed tables are stable after probe; only the | |
| * current OSR needs to be read under the lock to pick the | |
| * right row atomically. | |
| */ | |
| guard(mutex)(&st->lock); | |
| osr_idx = ad4691_osr_index(st->osr); | |
| *vals = st->samp_freq_avail[osr_idx]; | |
| *type = IIO_VAL_INT; | |
| *length = st->samp_freq_avail_len[osr_idx]; | |
| return IIO_AVAIL_LIST; | |
| } | |
| case IIO_CHAN_INFO_OVERSAMPLING_RATIO: | |
| *vals = ad4691_oversampling_ratios; | |
| *type = IIO_VAL_INT; | |
| *length = ARRAY_SIZE(ad4691_oversampling_ratios); | |
| return IIO_AVAIL_LIST; | |
| default: | |
| return -EINVAL; | |
| } | |
| } | |
| static int ad4691_single_shot_read(struct iio_dev *indio_dev, | |
| struct iio_chan_spec const *chan, int *val) | |
| { | |
| struct ad4691_state *st = iio_priv(indio_dev); | |
| unsigned int reg_val, period_us; | |
| int ret; | |
| guard(mutex)(&st->lock); | |
| /* Use AUTONOMOUS mode for single-shot reads. */ | |
| ret = regmap_write(st->regmap, AD4691_STATE_RESET_REG, AD4691_STATE_RESET_ALL); | |
| if (ret) | |
| return ret; | |
| ret = regmap_write(st->regmap, AD4691_STD_SEQ_CONFIG, | |
| BIT(chan->channel)); | |
| if (ret) | |
| return ret; | |
| ret = regmap_write(st->regmap, AD4691_ACC_MASK_REG, | |
| ~BIT(chan->channel) & GENMASK(15, 0)); | |
| if (ret) | |
| return ret; | |
| ret = regmap_write(st->regmap, AD4691_ACC_DEPTH_IN(0), st->osr); | |
| if (ret) | |
| return ret; | |
| ret = ad4691_write_osc_freq(st); | |
| if (ret) | |
| return ret; | |
| ret = regmap_write(st->regmap, AD4691_OSC_EN_REG, 1); | |
| if (ret) | |
| return ret; | |
| /* | |
| * Wait osr + 1 oscillator periods: osr for accumulation, +1 for the | |
| * pipeline margin (one extra period ensures the final result is ready). | |
| */ | |
| period_us = DIV_ROUND_UP((st->osr + 1) * USEC_PER_SEC, | |
| st->target_osc_freq_Hz); | |
| fsleep(period_us); | |
| ret = regmap_write(st->regmap, AD4691_OSC_EN_REG, 0); | |
| if (ret) | |
| return ret; | |
| ret = regmap_read(st->regmap, AD4691_AVG_IN(chan->channel), ®_val); | |
| if (ret) | |
| return ret; | |
| *val = reg_val; | |
| ret = regmap_write(st->regmap, AD4691_STATE_RESET_REG, AD4691_STATE_RESET_ALL); | |
| if (ret) | |
| return ret; | |
| return IIO_VAL_INT; | |
| } | |
| static int ad4691_read_raw(struct iio_dev *indio_dev, | |
| struct iio_chan_spec const *chan, int *val, | |
| int *val2, long info) | |
| { | |
| struct ad4691_state *st = iio_priv(indio_dev); | |
| switch (info) { | |
| case IIO_CHAN_INFO_RAW: { | |
| IIO_DEV_ACQUIRE_DIRECT_MODE(indio_dev, claim); | |
| if (IIO_DEV_ACQUIRE_FAILED(claim)) | |
| return -EBUSY; | |
| return ad4691_single_shot_read(indio_dev, chan, val); | |
| } | |
| case IIO_CHAN_INFO_SAMP_FREQ: { | |
| /* | |
| * Read target_osc_freq_Hz and osr under st->lock to get a | |
| * consistent snapshot: write_raw for SAMP_FREQ or OSR modifies | |
| * both fields under the lock, so a concurrent read without the | |
| * lock could observe a new oscillator frequency with the old OSR. | |
| */ | |
| guard(mutex)(&st->lock); | |
| *val = st->target_osc_freq_Hz / st->osr; | |
| return IIO_VAL_INT; | |
| } | |
| case IIO_CHAN_INFO_OVERSAMPLING_RATIO: { | |
| guard(mutex)(&st->lock); | |
| *val = st->osr; | |
| return IIO_VAL_INT; | |
| } | |
| case IIO_CHAN_INFO_SCALE: | |
| *val = st->vref_uV / (MICRO / MILLI); | |
| *val2 = chan->scan_type.realbits; | |
| return IIO_VAL_FRACTIONAL_LOG2; | |
| default: | |
| return -EINVAL; | |
| } | |
| } | |
| static int ad4691_write_raw(struct iio_dev *indio_dev, | |
| struct iio_chan_spec const *chan, | |
| int val, int val2, long mask) | |
| { | |
| struct ad4691_state *st = iio_priv(indio_dev); | |
| IIO_DEV_ACQUIRE_DIRECT_MODE(indio_dev, claim); | |
| if (IIO_DEV_ACQUIRE_FAILED(claim)) | |
| return -EBUSY; | |
| switch (mask) { | |
| case IIO_CHAN_INFO_SAMP_FREQ: | |
| return ad4691_set_sampling_freq(st, val); | |
| case IIO_CHAN_INFO_OVERSAMPLING_RATIO: { | |
| unsigned int old_effective, found, osr_idx; | |
| osr_idx = ad4691_osr_index(val); | |
| if (ad4691_oversampling_ratios[osr_idx] != val) | |
| return -EINVAL; | |
| /* | |
| * Hold st->lock while computing the new oscillator frequency | |
| * and updating both target_osc_freq_Hz and osr atomically: | |
| * read_raw for SAMP_FREQ reads both fields under the lock and | |
| * must see a consistent pair (new osc ↔ new osr). | |
| * | |
| * Snap target_osc_freq_Hz to the largest table entry that is | |
| * both <= old_effective * new_osr and evenly divisible by | |
| * new_osr, preserving an integer read-back of | |
| * in_voltage_sampling_frequency after the OSR change. | |
| */ | |
| guard(mutex)(&st->lock); | |
| old_effective = st->target_osc_freq_Hz / st->osr; | |
| found = ad4691_find_osc_freq(st, old_effective * (unsigned int)val, val); | |
| if (!found) | |
| return -EINVAL; | |
| st->target_osc_freq_Hz = found; | |
| st->osr = val; | |
| return 0; | |
| } | |
| default: | |
| return -EINVAL; | |
| } | |
| } | |
| static int ad4691_reg_access(struct iio_dev *indio_dev, unsigned int reg, | |
| unsigned int writeval, unsigned int *readval) | |
| { | |
| struct ad4691_state *st = iio_priv(indio_dev); | |
| guard(mutex)(&st->lock); | |
| if (readval) | |
| return regmap_read(st->regmap, reg, readval); | |
| return regmap_write(st->regmap, reg, writeval); | |
| } | |
| static int ad4691_set_pwm_freq(struct ad4691_state *st, unsigned int freq) | |
| { | |
| if (!freq) | |
| return -EINVAL; | |
| st->cnv_period_ns = DIV_ROUND_UP(NSEC_PER_SEC, freq); | |
| return 0; | |
| } | |
| static int ad4691_sampling_enable(struct ad4691_state *st, bool enable) | |
| { | |
| struct pwm_state conv_state = { | |
| .period = st->cnv_period_ns, | |
| .duty_cycle = AD4691_CNV_DUTY_CYCLE_NS, | |
| .polarity = PWM_POLARITY_NORMAL, | |
| .enabled = enable, | |
| }; | |
| return pwm_apply_might_sleep(st->conv_trigger, &conv_state); | |
| } | |
| /* | |
| * ad4691_enter_conversion_mode - Switch the chip to its buffer conversion mode. | |
| * | |
| * Configures the ADC hardware registers for the mode selected at probe | |
| * (CNV_BURST or MANUAL). Called from buffer preenable before starting | |
| * sampling. The chip is in AUTONOMOUS mode during idle (for read_raw). | |
| */ | |
| static int ad4691_enter_conversion_mode(struct ad4691_state *st) | |
| { | |
| int ret; | |
| if (st->manual_mode) | |
| return regmap_update_bits(st->regmap, AD4691_DEVICE_SETUP, | |
| AD4691_MANUAL_MODE, AD4691_MANUAL_MODE); | |
| ret = ad4691_write_osc_freq(st); | |
| if (ret) | |
| return ret; | |
| ret = regmap_update_bits(st->regmap, AD4691_ADC_SETUP, | |
| AD4691_ADC_MODE_MASK, AD4691_CNV_BURST_MODE); | |
| if (ret) | |
| return ret; | |
| return regmap_write(st->regmap, AD4691_STATE_RESET_REG, | |
| AD4691_STATE_RESET_ALL); | |
| } | |
| static int ad4691_transfer(struct ad4691_state *st, u16 cmd) | |
| { | |
| u8 buf[2]; | |
| put_unaligned_be16(cmd, buf); | |
| return spi_write_then_read(st->spi, buf, sizeof(buf), NULL, 0); | |
| } | |
| /* | |
| * ad4691_exit_conversion_mode - Return the chip to AUTONOMOUS mode. | |
| * | |
| * Called from buffer postdisable to restore the chip to the | |
| * idle state used by read_raw. Clears the sequencer and resets state. | |
| */ | |
| static int ad4691_exit_conversion_mode(struct ad4691_state *st) | |
| { | |
| if (st->manual_mode) | |
| return ad4691_transfer(st, AD4691_EXIT_COMMAND); | |
| return regmap_update_bits(st->regmap, AD4691_ADC_SETUP, | |
| AD4691_ADC_MODE_MASK, AD4691_AUTONOMOUS_MODE); | |
| } | |
| static int ad4691_manual_buffer_preenable(struct iio_dev *indio_dev) | |
| { | |
| struct ad4691_state *st = iio_priv(indio_dev); | |
| unsigned int k, i; | |
| int ret; | |
| memset(st->scan_xfers, 0, sizeof(st->scan_xfers)); | |
| memset(st->scan_tx, 0, sizeof(st->scan_tx)); | |
| spi_message_init(&st->scan_msg); | |
| k = 0; | |
| iio_for_each_active_channel(indio_dev, i) { | |
| /* | |
| * Channel-select command occupies the first (high) byte of the | |
| * 16-bit DIN frame; the second byte is a don't-care zero pad. | |
| * put_unaligned_be16() writes [cmd, 0x00] in memory so the | |
| * SPI controller sends the command byte first on the wire. | |
| */ | |
| put_unaligned_be16((u16)(AD4691_ADC_CHAN(i) << 8), &st->scan_tx[k]); | |
| st->scan_xfers[k].tx_buf = &st->scan_tx[k]; | |
| /* | |
| * The pipeline means xfer[0] receives the residual from the | |
| * previous sequence, not a valid sample. Discard it (rx_buf=NULL) | |
| * to avoid aliasing vals[0] across two concurrent DMA mappings. | |
| * xfer[1] (or the NOOP when only one channel is active) writes | |
| * the real ch[0] result to vals[0]. Subsequent transfers write | |
| * into vals[k-1] so each result lands at the next dense slot. | |
| */ | |
| st->scan_xfers[k].rx_buf = (k == 0) ? NULL : &st->vals[k - 1]; | |
| st->scan_xfers[k].len = sizeof(*st->scan_tx); | |
| st->scan_xfers[k].cs_change = 1; | |
| st->scan_xfers[k].cs_change_delay.value = AD4691_CNV_HIGH_TIME_NS; | |
| st->scan_xfers[k].cs_change_delay.unit = SPI_DELAY_UNIT_NSECS; | |
| spi_message_add_tail(&st->scan_xfers[k], &st->scan_msg); | |
| k++; | |
| } | |
| /* Final NOOP transfer retrieves the last channel's result. */ | |
| st->scan_xfers[k].tx_buf = &st->scan_tx[k]; /* scan_tx[k] == 0 == NOOP */ | |
| st->scan_xfers[k].rx_buf = &st->vals[k - 1]; | |
| st->scan_xfers[k].len = sizeof(*st->scan_tx); | |
| spi_message_add_tail(&st->scan_xfers[k], &st->scan_msg); | |
| ret = spi_optimize_message(st->spi, &st->scan_msg); | |
| if (ret) | |
| return ret; | |
| ret = ad4691_enter_conversion_mode(st); | |
| if (ret) { | |
| spi_unoptimize_message(&st->scan_msg); | |
| return ret; | |
| } | |
| return 0; | |
| } | |
| static int ad4691_manual_buffer_postdisable(struct iio_dev *indio_dev) | |
| { | |
| struct ad4691_state *st = iio_priv(indio_dev); | |
| int ret; | |
| ret = ad4691_exit_conversion_mode(st); | |
| spi_unoptimize_message(&st->scan_msg); | |
| return ret; | |
| } | |
| static const struct iio_buffer_setup_ops ad4691_manual_buffer_setup_ops = { | |
| .preenable = ad4691_manual_buffer_preenable, | |
| .postdisable = ad4691_manual_buffer_postdisable, | |
| }; | |
| static int ad4691_cnv_burst_buffer_preenable(struct iio_dev *indio_dev) | |
| { | |
| struct ad4691_state *st = iio_priv(indio_dev); | |
| unsigned int acc_mask, std_seq_config; | |
| unsigned int k, i; | |
| int ret; | |
| memset(st->scan_xfers, 0, sizeof(st->scan_xfers)); | |
| memset(st->scan_tx, 0, sizeof(st->scan_tx)); | |
| spi_message_init(&st->scan_msg); | |
| /* | |
| * Each AVG_IN read needs two transfers: a 2-byte address write phase | |
| * followed by a 2-byte data read phase. CS toggles between channels | |
| * (cs_change=1 on the read phase of all but the last channel). | |
| */ | |
| k = 0; | |
| iio_for_each_active_channel(indio_dev, i) { | |
| put_unaligned_be16(0x8000 | AD4691_AVG_IN(i), &st->scan_tx[k]); | |
| st->scan_xfers[2 * k].tx_buf = &st->scan_tx[k]; | |
| st->scan_xfers[2 * k].len = sizeof(*st->scan_tx); | |
| spi_message_add_tail(&st->scan_xfers[2 * k], &st->scan_msg); | |
| st->scan_xfers[2 * k + 1].rx_buf = &st->vals[k]; | |
| st->scan_xfers[2 * k + 1].len = sizeof(*st->scan_tx); | |
| st->scan_xfers[2 * k + 1].cs_change = 1; | |
| spi_message_add_tail(&st->scan_xfers[2 * k + 1], &st->scan_msg); | |
| k++; | |
| } | |
| /* | |
| * Append a 4-byte state-reset transfer [addr_hi, addr_lo, | |
| * STATE_RESET_ALL, OSC_EN=1]. CS is asserted throughout, so | |
| * ADDR_DESCENDING writes byte[3]=1 to OSC_EN_REG (0x180) as a | |
| * deliberate side-write, keeping the oscillator enabled. | |
| * STATE_RESET_ALL starts the next burst; the hardware does not | |
| * accumulate new conversions until after a STATE_RESET pulse, so | |
| * no in-progress data is lost. No cs_change here — CS must | |
| * deassert normally at end of message to frame the next command. | |
| */ | |
| put_unaligned_be16(AD4691_STATE_RESET_REG, st->scan_tx_reset); | |
| st->scan_tx_reset[2] = AD4691_STATE_RESET_ALL; | |
| st->scan_tx_reset[3] = 1; | |
| st->scan_xfers[2 * k].tx_buf = st->scan_tx_reset; | |
| st->scan_xfers[2 * k].len = sizeof(st->scan_tx_reset); | |
| spi_message_add_tail(&st->scan_xfers[2 * k], &st->scan_msg); | |
| ret = spi_optimize_message(st->spi, &st->scan_msg); | |
| if (ret) | |
| return ret; | |
| std_seq_config = bitmap_read(indio_dev->active_scan_mask, 0, | |
| iio_get_masklength(indio_dev)) & GENMASK(15, 0); | |
| ret = regmap_write(st->regmap, AD4691_STD_SEQ_CONFIG, std_seq_config); | |
| if (ret) | |
| goto err_unoptimize; | |
| acc_mask = ~std_seq_config & GENMASK(15, 0); | |
| ret = regmap_write(st->regmap, AD4691_ACC_MASK_REG, acc_mask); | |
| if (ret) | |
| goto err_unoptimize; | |
| ret = regmap_write(st->regmap, AD4691_ACC_DEPTH_IN(0), st->osr); | |
| if (ret) | |
| goto err_unoptimize; | |
| ret = ad4691_enter_conversion_mode(st); | |
| if (ret) | |
| goto err_unoptimize; | |
| return 0; | |
| err_unoptimize: | |
| spi_unoptimize_message(&st->scan_msg); | |
| return ret; | |
| } | |
| static int ad4691_cnv_burst_buffer_postenable(struct iio_dev *indio_dev) | |
| { | |
| struct ad4691_state *st = iio_priv(indio_dev); | |
| int ret; | |
| /* | |
| * Start the PWM and unmask the IRQ here in postenable, not in | |
| * preenable. The IIO core attaches the trigger poll function between | |
| * preenable and postenable; enabling sampling or unmasking the IRQ | |
| * before that point risks a DATA_READY assertion landing before the | |
| * poll function is registered. iio_trigger_poll() would drop the | |
| * event, disable_irq_nosync() would fire, and enable_irq() would | |
| * never be called, leaving the IRQ permanently masked. | |
| */ | |
| ret = ad4691_sampling_enable(st, true); | |
| if (ret) | |
| return ret; | |
| enable_irq(st->irq); | |
| st->irq_enabled = true; | |
| return 0; | |
| } | |
| static int ad4691_cnv_burst_buffer_predisable(struct iio_dev *indio_dev) | |
| { | |
| struct ad4691_state *st = iio_priv(indio_dev); | |
| if (st->irq_enabled) { | |
| disable_irq(st->irq); | |
| st->irq_enabled = false; | |
| } | |
| return ad4691_sampling_enable(st, false); | |
| } | |
| static int ad4691_cnv_burst_buffer_postdisable(struct iio_dev *indio_dev) | |
| { | |
| struct ad4691_state *st = iio_priv(indio_dev); | |
| int ret; | |
| ret = ad4691_exit_conversion_mode(st); | |
| spi_unoptimize_message(&st->scan_msg); | |
| return ret; | |
| } | |
| static const struct iio_buffer_setup_ops ad4691_cnv_burst_buffer_setup_ops = { | |
| .preenable = ad4691_cnv_burst_buffer_preenable, | |
| .postenable = ad4691_cnv_burst_buffer_postenable, | |
| .predisable = ad4691_cnv_burst_buffer_predisable, | |
| .postdisable = ad4691_cnv_burst_buffer_postdisable, | |
| }; | |
| static int ad4691_manual_offload_buffer_postenable(struct iio_dev *indio_dev) | |
| { | |
| struct ad4691_state *st = iio_priv(indio_dev); | |
| struct device *dev = regmap_get_device(st->regmap); | |
| struct spi_device *spi = to_spi_device(dev); | |
| struct spi_offload_trigger_config config = { | |
| .type = SPI_OFFLOAD_TRIGGER_PERIODIC, | |
| }; | |
| unsigned int bpw = indio_dev->channels[0].scan_type.realbits; | |
| unsigned int bit, k; | |
| int ret; | |
| ret = ad4691_enter_conversion_mode(st); | |
| if (ret) | |
| return ret; | |
| memset(st->scan_xfers, 0, sizeof(st->scan_xfers)); | |
| memset(st->scan_tx, 0, sizeof(st->scan_tx)); | |
| /* | |
| * N+1 transfers for N channels. Each CS-low period triggers | |
| * a conversion AND returns the previous result (pipelined). | |
| * TX: [AD4691_ADC_CHAN(n), 0x00] | |
| * RX: [data_hi, data_lo] (storagebits=16, shift=0) | |
| * Transfer 0 RX is garbage; transfers 1..N carry real data. | |
| * scan_tx is reused for TX commands (mutually exclusive with the | |
| * non-offload triggered-buffer path). | |
| * | |
| * bits_per_word=bpw: the SPI controller reads tx_buf as a native | |
| * 16-bit word and shifts it out MSB-first. Store the exact 16-bit | |
| * value we want on the wire as a plain native u16 — no endianness | |
| * macro — so the wire bytes are correct on both LE and BE hosts. | |
| * The channel-select command is a single byte; shift it to the MSB | |
| * position so SPI sends it first, with a zero pad in the LSB. | |
| */ | |
| k = 0; | |
| iio_for_each_active_channel(indio_dev, bit) { | |
| st->scan_tx[k] = AD4691_ADC_CHAN(bit) << 8; | |
| st->scan_xfers[k].tx_buf = &st->scan_tx[k]; | |
| st->scan_xfers[k].len = sizeof(*st->scan_tx); | |
| st->scan_xfers[k].bits_per_word = bpw; | |
| st->scan_xfers[k].cs_change = 1; | |
| st->scan_xfers[k].cs_change_delay.value = AD4691_CNV_HIGH_TIME_NS; | |
| st->scan_xfers[k].cs_change_delay.unit = SPI_DELAY_UNIT_NSECS; | |
| /* First transfer RX is garbage — skip it. */ | |
| if (k > 0) | |
| st->scan_xfers[k].offload_flags = SPI_OFFLOAD_XFER_RX_STREAM; | |
| k++; | |
| } | |
| /* Final NOOP transfer retrieves the last channel's result. */ | |
| st->scan_xfers[k].tx_buf = &st->scan_tx[k]; /* scan_tx[k] == 0 == NOOP */ | |
| st->scan_xfers[k].len = sizeof(*st->scan_tx); | |
| st->scan_xfers[k].bits_per_word = bpw; | |
| st->scan_xfers[k].offload_flags = SPI_OFFLOAD_XFER_RX_STREAM; | |
| k++; | |
| spi_message_init_with_transfers(&st->scan_msg, st->scan_xfers, k); | |
| st->scan_msg.offload = st->offload; | |
| ret = spi_optimize_message(spi, &st->scan_msg); | |
| if (ret) | |
| goto err_exit_conversion; | |
| config.periodic.frequency_hz = st->trigger_hz; | |
| ret = spi_offload_trigger_enable(st->offload, st->offload_trigger, &config); | |
| if (ret) | |
| goto err_unoptimize; | |
| return 0; | |
| err_unoptimize: | |
| spi_unoptimize_message(&st->scan_msg); | |
| err_exit_conversion: | |
| ad4691_exit_conversion_mode(st); | |
| return ret; | |
| } | |
| static int ad4691_manual_offload_buffer_predisable(struct iio_dev *indio_dev) | |
| { | |
| struct ad4691_state *st = iio_priv(indio_dev); | |
| spi_offload_trigger_disable(st->offload, st->offload_trigger); | |
| spi_unoptimize_message(&st->scan_msg); | |
| return ad4691_exit_conversion_mode(st); | |
| } | |
| static const struct iio_buffer_setup_ops ad4691_manual_offload_buffer_setup_ops = { | |
| .postenable = ad4691_manual_offload_buffer_postenable, | |
| .predisable = ad4691_manual_offload_buffer_predisable, | |
| }; | |
| static int ad4691_cnv_burst_offload_buffer_postenable(struct iio_dev *indio_dev) | |
| { | |
| struct ad4691_state *st = iio_priv(indio_dev); | |
| struct device *dev = regmap_get_device(st->regmap); | |
| struct spi_device *spi = to_spi_device(dev); | |
| struct spi_offload_trigger_config config = { | |
| .type = SPI_OFFLOAD_TRIGGER_DATA_READY, | |
| }; | |
| unsigned int bpw = indio_dev->channels[0].scan_type.realbits; | |
| unsigned int acc_mask, std_seq_config; | |
| unsigned int bit, k; | |
| int ret; | |
| std_seq_config = bitmap_read(indio_dev->active_scan_mask, 0, | |
| iio_get_masklength(indio_dev)) & GENMASK(15, 0); | |
| ret = regmap_write(st->regmap, AD4691_STD_SEQ_CONFIG, std_seq_config); | |
| if (ret) | |
| return ret; | |
| acc_mask = ~std_seq_config & GENMASK(15, 0); | |
| ret = regmap_write(st->regmap, AD4691_ACC_MASK_REG, acc_mask); | |
| if (ret) | |
| return ret; | |
| ret = regmap_write(st->regmap, AD4691_ACC_DEPTH_IN(0), st->osr); | |
| if (ret) | |
| return ret; | |
| ret = ad4691_enter_conversion_mode(st); | |
| if (ret) | |
| return ret; | |
| memset(st->scan_xfers, 0, sizeof(st->scan_xfers)); | |
| memset(st->scan_tx, 0, sizeof(st->scan_tx)); | |
| /* | |
| * Each AVG_IN register read uses two transfers: | |
| * TX: [reg_hi | 0x80, reg_lo] (address phase, CS stays asserted) | |
| * RX: [data_hi, data_lo] (bpw-wide data phase, storagebits=16) | |
| * Both TX and RX use bits_per_word=bpw: the SPI controller reads tx_buf | |
| * as a native 16-bit word and shifts it out MSB-first. Store the exact | |
| * 16-bit wire value as a plain native u16 — no endianness macro — so the | |
| * wire bytes are correct on both LE and BE hosts. The read-address | |
| * (0x8000 | reg) is already the 16-bit value we want on the wire. | |
| * scan_tx is reused for TX addresses (mutually exclusive with the | |
| * non-offload triggered-buffer path). | |
| */ | |
| k = 0; | |
| iio_for_each_active_channel(indio_dev, bit) { | |
| st->scan_tx[k] = 0x8000 | AD4691_AVG_IN(bit); | |
| /* TX: address phase, CS stays asserted into data phase */ | |
| st->scan_xfers[2 * k].tx_buf = &st->scan_tx[k]; | |
| st->scan_xfers[2 * k].len = sizeof(*st->scan_tx); | |
| st->scan_xfers[2 * k].bits_per_word = bpw; | |
| /* RX: data phase, CS toggles after to delimit the next register op */ | |
| st->scan_xfers[2 * k + 1].len = sizeof(*st->scan_tx); | |
| st->scan_xfers[2 * k + 1].bits_per_word = bpw; | |
| st->scan_xfers[2 * k + 1].offload_flags = SPI_OFFLOAD_XFER_RX_STREAM; | |
| st->scan_xfers[2 * k + 1].cs_change = 1; | |
| k++; | |
| } | |
| /* | |
| * State reset: single 4-byte write [addr_hi, addr_lo, STATE_RESET_ALL, | |
| * OSC_EN=1]. ADDR_DESCENDING writes byte[3]=1 to OSC_EN_REG (0x180) as | |
| * a deliberate side-write, keeping the oscillator enabled. | |
| * scan_tx_reset is shared with the non-offload path (len=4 here vs | |
| * len=3 there) since the two paths are mutually exclusive at probe. | |
| */ | |
| put_unaligned_be16(AD4691_STATE_RESET_REG, st->scan_tx_reset); | |
| st->scan_tx_reset[2] = AD4691_STATE_RESET_ALL; | |
| st->scan_tx_reset[3] = 1; | |
| st->scan_xfers[2 * k].tx_buf = st->scan_tx_reset; | |
| st->scan_xfers[2 * k].len = sizeof(st->scan_tx_reset); | |
| /* | |
| * 4-byte u8 buffer assembled with put_unaligned_be16(); leave | |
| * bits_per_word at the default (8) so bytes go out in memory order. | |
| */ | |
| spi_message_init_with_transfers(&st->scan_msg, st->scan_xfers, 2 * k + 1); | |
| st->scan_msg.offload = st->offload; | |
| ret = spi_optimize_message(spi, &st->scan_msg); | |
| if (ret) | |
| goto err_exit_conversion; | |
| ret = spi_offload_trigger_enable(st->offload, st->offload_trigger, &config); | |
| if (ret) | |
| goto err_unoptimize; | |
| ret = ad4691_sampling_enable(st, true); | |
| if (ret) | |
| goto err_disable_trigger; | |
| return 0; | |
| err_disable_trigger: | |
| spi_offload_trigger_disable(st->offload, st->offload_trigger); | |
| err_unoptimize: | |
| spi_unoptimize_message(&st->scan_msg); | |
| err_exit_conversion: | |
| ad4691_exit_conversion_mode(st); | |
| return ret; | |
| } | |
| static int ad4691_cnv_burst_offload_buffer_predisable(struct iio_dev *indio_dev) | |
| { | |
| struct ad4691_state *st = iio_priv(indio_dev); | |
| ad4691_sampling_enable(st, false); | |
| spi_offload_trigger_disable(st->offload, st->offload_trigger); | |
| spi_unoptimize_message(&st->scan_msg); | |
| return ad4691_exit_conversion_mode(st); | |
| } | |
| static const struct iio_buffer_setup_ops ad4691_cnv_burst_offload_buffer_setup_ops = { | |
| .postenable = ad4691_cnv_burst_offload_buffer_postenable, | |
| .predisable = ad4691_cnv_burst_offload_buffer_predisable, | |
| }; | |
| static ssize_t sampling_frequency_show(struct device *dev, | |
| struct device_attribute *attr, | |
| char *buf) | |
| { | |
| struct iio_dev *indio_dev = dev_to_iio_dev(dev); | |
| struct ad4691_state *st = iio_priv(indio_dev); | |
| if (st->manual_mode && st->offload) | |
| return sysfs_emit(buf, "%llu\n", READ_ONCE(st->trigger_hz)); | |
| return sysfs_emit(buf, "%lu\n", NSEC_PER_SEC / st->cnv_period_ns); | |
| } | |
| static ssize_t sampling_frequency_store(struct device *dev, | |
| struct device_attribute *attr, | |
| const char *buf, size_t len) | |
| { | |
| struct iio_dev *indio_dev = dev_to_iio_dev(dev); | |
| struct ad4691_state *st = iio_priv(indio_dev); | |
| unsigned int freq; | |
| int ret; | |
| ret = kstrtouint(buf, 10, &freq); | |
| if (ret) | |
| return ret; | |
| IIO_DEV_ACQUIRE_DIRECT_MODE(indio_dev, claim); | |
| if (IIO_DEV_ACQUIRE_FAILED(claim)) | |
| return -EBUSY; | |
| if (st->manual_mode && st->offload) { | |
| struct spi_offload_trigger_config config = { | |
| .type = SPI_OFFLOAD_TRIGGER_PERIODIC, | |
| .periodic = { .frequency_hz = freq }, | |
| }; | |
| ret = spi_offload_trigger_validate(st->offload_trigger, &config); | |
| if (ret) | |
| return ret; | |
| WRITE_ONCE(st->trigger_hz, config.periodic.frequency_hz); | |
| return len; | |
| } | |
| ret = ad4691_set_pwm_freq(st, freq); | |
| if (ret) | |
| return ret; | |
| return len; | |
| } | |
| static IIO_DEVICE_ATTR_RW(sampling_frequency, 0); | |
| static const struct iio_dev_attr *ad4691_buffer_attrs[] = { | |
| &iio_dev_attr_sampling_frequency, | |
| NULL | |
| }; | |
| static irqreturn_t ad4691_irq(int irq, void *private) | |
| { | |
| struct iio_dev *indio_dev = private; | |
| struct ad4691_state *st = iio_priv(indio_dev); | |
| /* | |
| * Disable the IRQ before calling iio_trigger_poll(). The IRQ is | |
| * re-enabled via the trigger .reenable callback, which the IIO core | |
| * calls inside iio_trigger_notify_done() once use_count reaches zero. | |
| * Re-enabling here (before notify_done) would race: a DATA_READY | |
| * between enable_irq() and notify_done() calls iio_trigger_poll() | |
| * while use_count > 0, dropping the event and permanently masking | |
| * the IRQ. | |
| */ | |
| disable_irq_nosync(st->irq); | |
| iio_trigger_poll(indio_dev->trig); | |
| return IRQ_HANDLED; | |
| } | |
| static void ad4691_trigger_reenable(struct iio_trigger *trig) | |
| { | |
| struct ad4691_state *st = iio_trigger_get_drvdata(trig); | |
| enable_irq(st->irq); | |
| } | |
| static const struct iio_trigger_ops ad4691_trigger_ops = { | |
| .reenable = ad4691_trigger_reenable, | |
| .validate_device = iio_trigger_validate_own_device, | |
| }; | |
| static void ad4691_read_scan(struct iio_dev *indio_dev, s64 ts) | |
| { | |
| struct ad4691_state *st = iio_priv(indio_dev); | |
| int ret; | |
| guard(mutex)(&st->lock); | |
| ret = spi_sync(st->spi, &st->scan_msg); | |
| if (ret) { | |
| dev_err_ratelimited(regmap_get_device(st->regmap), | |
| "SPI scan failed: %d\n", ret); | |
| return; | |
| } | |
| /* | |
| * rx_buf pointers in scan_xfers point directly into scan.vals, so no | |
| * copy is needed. The scan_msg already includes a STATE_RESET at the | |
| * end (appended in preenable), so no explicit reset is needed here. | |
| */ | |
| iio_push_to_buffers_with_ts(indio_dev, st->vals, sizeof(st->vals), ts); | |
| } | |
| static irqreturn_t ad4691_trigger_handler(int irq, void *p) | |
| { | |
| struct iio_poll_func *pf = p; | |
| struct iio_dev *indio_dev = pf->indio_dev; | |
| ad4691_read_scan(indio_dev, pf->timestamp); | |
| iio_trigger_notify_done(indio_dev->trig); | |
| return IRQ_HANDLED; | |
| } | |
| /* | |
| * CNV burst mode: only allow our own trigger (driven by DATA_READY IRQ). | |
| * Manual mode: external triggers (e.g. iio-trig-hrtimer) must be allowed | |
| * because manual mode has no DATA_READY IRQ to fire the internal trigger. | |
| * iio_trigger_ops.validate_device = iio_trigger_validate_own_device is | |
| * correct in both modes — it prevents other devices from hijacking our | |
| * internal trigger; the distinction here is only for iio_info.validate_trigger. | |
| */ | |
| static const struct iio_info ad4691_cnv_burst_info = { | |
| .read_raw = ad4691_read_raw, | |
| .write_raw = ad4691_write_raw, | |
| .read_avail = ad4691_read_avail, | |
| .debugfs_reg_access = ad4691_reg_access, | |
| .validate_trigger = iio_validate_own_trigger, | |
| }; | |
| static const struct iio_info ad4691_manual_info = { | |
| .read_raw = ad4691_read_raw, | |
| .write_raw = ad4691_write_raw, | |
| .read_avail = ad4691_read_avail, | |
| .debugfs_reg_access = ad4691_reg_access, | |
| }; | |
| static int ad4691_pwm_setup(struct ad4691_state *st) | |
| { | |
| struct device *dev = regmap_get_device(st->regmap); | |
| st->conv_trigger = devm_pwm_get(dev, "cnv"); | |
| if (IS_ERR(st->conv_trigger)) | |
| return dev_err_probe(dev, PTR_ERR(st->conv_trigger), | |
| "Failed to get CNV PWM\n"); | |
| return ad4691_set_pwm_freq(st, st->info->max_rate); | |
| } | |
| static int ad4691_regulator_setup(struct ad4691_state *st) | |
| { | |
| struct device *dev = regmap_get_device(st->regmap); | |
| int ret; | |
| ret = devm_regulator_bulk_get_enable(dev, ARRAY_SIZE(ad4691_supplies), | |
| ad4691_supplies); | |
| if (ret) | |
| return dev_err_probe(dev, ret, "Failed to get and enable supplies\n"); | |
| /* | |
| * vdd-supply and ldo-in-supply are mutually exclusive: | |
| * vdd-supply present → external 1.8V VDD; disable internal LDO. | |
| * vdd-supply absent → enable internal LDO fed from ldo-in-supply. | |
| * Having both simultaneously is strongly inadvisable per the datasheet. | |
| */ | |
| if (device_property_present(dev, "vdd-supply")) { | |
| ret = devm_regulator_get_enable(dev, "vdd"); | |
| if (ret) | |
| return dev_err_probe(dev, ret, | |
| "Failed to get and enable VDD\n"); | |
| } else if (device_property_present(dev, "ldo-in-supply")) { | |
| ret = devm_regulator_get_enable(dev, "ldo-in"); | |
| if (ret) | |
| return dev_err_probe(dev, ret, | |
| "Failed to get and enable LDO-IN\n"); | |
| st->ldo_en = true; | |
| } else { | |
| return dev_err_probe(dev, -EINVAL, | |
| "missing one of vdd-supply, ldo-in-supply\n"); | |
| } | |
| if (device_property_present(dev, "ref-supply")) { | |
| st->vref_uV = devm_regulator_get_enable_read_voltage(dev, "ref"); | |
| if (st->vref_uV < 0) | |
| return dev_err_probe(dev, st->vref_uV, | |
| "Failed to get REF supply voltage\n"); | |
| } else if (device_property_present(dev, "refin-supply")) { | |
| st->vref_uV = devm_regulator_get_enable_read_voltage(dev, "refin"); | |
| if (st->vref_uV < 0) | |
| return dev_err_probe(dev, st->vref_uV, | |
| "Failed to get REFIN supply voltage\n"); | |
| st->refbuf_en = true; | |
| } else { | |
| return dev_err_probe(dev, -EINVAL, | |
| "missing one of ref-supply, refin-supply\n"); | |
| } | |
| if (st->vref_uV < AD4691_VREF_uV_MIN || st->vref_uV > AD4691_VREF_uV_MAX) | |
| return dev_err_probe(dev, -EINVAL, | |
| "vref(%d) must be in the range [%u...%u]\n", | |
| st->vref_uV, AD4691_VREF_uV_MIN, | |
| AD4691_VREF_uV_MAX); | |
| return 0; | |
| } | |
| static int ad4691_reset(struct ad4691_state *st) | |
| { | |
| struct device *dev = regmap_get_device(st->regmap); | |
| struct reset_control *rst; | |
| int ret; | |
| rst = devm_reset_control_get_optional_exclusive(dev, NULL); | |
| if (IS_ERR(rst)) | |
| return dev_err_probe(dev, PTR_ERR(rst), "Failed to get reset\n"); | |
| if (rst) { | |
| /* | |
| * Assert the reset line to guarantee a clean reset pulse on | |
| * every probe, including driver reloads where the line may | |
| * already be deasserted (reset_control_put() does not | |
| * re-assert on release). tRESETL (minimum pulse width) = 10 ns | |
| * (Table 5); kernel function-call overhead alone exceeds this, | |
| * so no explicit delay is needed between assert and deassert. | |
| */ | |
| reset_control_assert(rst); | |
| ret = reset_control_deassert(rst); | |
| if (ret) | |
| return ret; | |
| } else { | |
| /* No hardware reset available, fall back to software reset. */ | |
| ret = regmap_write(st->regmap, AD4691_SPI_CONFIG_A_REG, | |
| AD4691_SW_RESET); | |
| if (ret) | |
| return ret; | |
| } | |
| /* | |
| * Wait 300 µs (Table 5) for the device to complete its internal reset | |
| * sequence before accepting SPI commands. | |
| */ | |
| fsleep(300); | |
| return 0; | |
| } | |
| static int ad4691_config(struct ad4691_state *st) | |
| { | |
| struct device *dev = regmap_get_device(st->regmap); | |
| enum ad4691_ref_ctrl ref_val; | |
| unsigned int val; | |
| int ret; | |
| /* | |
| * Determine buffer conversion mode from DT: if a PWM is provided it | |
| * drives the CNV pin (CNV_BURST_MODE); otherwise CNV is tied to CS | |
| * and each SPI transfer triggers a conversion (MANUAL_MODE). | |
| * Both modes idle in AUTONOMOUS mode so that read_raw can use the | |
| * internal oscillator without disturbing the hardware configuration. | |
| */ | |
| if (device_property_present(dev, "pwms")) { | |
| st->manual_mode = false; | |
| ret = ad4691_pwm_setup(st); | |
| if (ret) | |
| return ret; | |
| } else { | |
| st->manual_mode = true; | |
| } | |
| switch (st->vref_uV) { | |
| case AD4691_VREF_uV_MIN ... AD4691_VREF_2P5_uV_MAX: | |
| ref_val = AD4691_VREF_2P5; | |
| break; | |
| case AD4691_VREF_2P5_uV_MAX + 1 ... AD4691_VREF_3P0_uV_MAX: | |
| ref_val = AD4691_VREF_3P0; | |
| break; | |
| case AD4691_VREF_3P0_uV_MAX + 1 ... AD4691_VREF_3P3_uV_MAX: | |
| ref_val = AD4691_VREF_3P3; | |
| break; | |
| case AD4691_VREF_3P3_uV_MAX + 1 ... AD4691_VREF_4P096_uV_MAX: | |
| ref_val = AD4691_VREF_4P096; | |
| break; | |
| case AD4691_VREF_4P096_uV_MAX + 1 ... AD4691_VREF_uV_MAX: | |
| ref_val = AD4691_VREF_5P0; | |
| break; | |
| default: | |
| return dev_err_probe(dev, -EINVAL, | |
| "Unsupported vref voltage: %d uV\n", | |
| st->vref_uV); | |
| } | |
| val = FIELD_PREP(AD4691_REF_CTRL_MASK, ref_val); | |
| if (st->refbuf_en) | |
| val |= AD4691_REFBUF_EN; | |
| ret = regmap_write(st->regmap, AD4691_REF_CTRL, val); | |
| if (ret) | |
| return dev_err_probe(dev, ret, "Failed to write REF_CTRL\n"); | |
| ret = regmap_assign_bits(st->regmap, AD4691_DEVICE_SETUP, | |
| AD4691_LDO_EN, st->ldo_en); | |
| if (ret) | |
| return dev_err_probe(dev, ret, "Failed to write DEVICE_SETUP\n"); | |
| /* | |
| * Set the internal oscillator to the highest rate this chip supports. | |
| * Index 0 (1 MHz) exceeds the 500 kHz max of AD4691/AD4693, so those | |
| * chips start at index 1 (500 kHz). | |
| */ | |
| ret = regmap_write(st->regmap, AD4691_OSC_FREQ_REG, | |
| ad4691_samp_freq_start(st->info)); | |
| if (ret) | |
| return dev_err_probe(dev, ret, "Failed to write OSC_FREQ\n"); | |
| st->target_osc_freq_Hz = ad4691_osc_freqs_Hz[ad4691_samp_freq_start(st->info)]; | |
| ret = regmap_update_bits(st->regmap, AD4691_ADC_SETUP, | |
| AD4691_ADC_MODE_MASK, AD4691_AUTONOMOUS_MODE); | |
| if (ret) | |
| return dev_err_probe(dev, ret, "Failed to write ADC_SETUP\n"); | |
| ad4691_precompute_samp_freq_avail(st); | |
| return 0; | |
| } | |
| static int ad4691_setup_triggered_buffer(struct iio_dev *indio_dev, | |
| struct ad4691_state *st) | |
| { | |
| struct device *dev = regmap_get_device(st->regmap); | |
| struct iio_trigger *trig; | |
| unsigned int i; | |
| int irq, ret; | |
| /* | |
| * Manual mode exposes channels without the oversampling_ratio attribute | |
| * because ACC_DEPTH_IN is not configured in manual mode. | |
| */ | |
| if (st->manual_mode) | |
| indio_dev->channels = st->info->sw_info->manual_channels; | |
| else | |
| indio_dev->channels = st->info->sw_info->channels; | |
| indio_dev->num_channels = st->info->sw_info->num_channels; | |
| indio_dev->info = st->manual_mode ? &ad4691_manual_info : &ad4691_cnv_burst_info; | |
| /* | |
| * Manual mode relies on an external trigger (e.g. iio-trig-hrtimer); | |
| * no internal trigger is needed or registered. | |
| */ | |
| if (st->manual_mode) | |
| return devm_iio_triggered_buffer_setup(dev, indio_dev, | |
| iio_pollfunc_store_time, | |
| ad4691_trigger_handler, | |
| &ad4691_manual_buffer_setup_ops); | |
| /* | |
| * CNV burst mode: allocate an internal trigger driven by the | |
| * DATA_READY IRQ on the GP pin. | |
| */ | |
| trig = devm_iio_trigger_alloc(dev, "%s-dev%d", indio_dev->name, | |
| iio_device_id(indio_dev)); | |
| if (!trig) | |
| return -ENOMEM; | |
| trig->ops = &ad4691_trigger_ops; | |
| iio_trigger_set_drvdata(trig, st); | |
| ret = devm_iio_trigger_register(dev, trig); | |
| if (ret) | |
| return dev_err_probe(dev, ret, "IIO trigger register failed\n"); | |
| indio_dev->trig = iio_trigger_get(trig); | |
| /* | |
| * The GP pin named in interrupt-names asserts at end-of-conversion. | |
| * The IRQ handler fires the IIO trigger so the trigger handler can | |
| * read and push the sample to the buffer. The IRQ is kept disabled | |
| * until the buffer is enabled. | |
| */ | |
| irq = -ENXIO; | |
| for (i = 0; i < ARRAY_SIZE(ad4691_gp_names); i++) { | |
| irq = fwnode_irq_get_byname(dev_fwnode(dev), | |
| ad4691_gp_names[i]); | |
| if (irq > 0 || irq == -EPROBE_DEFER) | |
| break; | |
| } | |
| if (irq < 0) | |
| return dev_err_probe(dev, irq, "failed to get GP interrupt\n"); | |
| st->irq = irq; | |
| ret = ad4691_gpio_setup(st, i); | |
| if (ret) | |
| return ret; | |
| /* | |
| * The handler only calls disable_irq_nosync() and iio_trigger_poll(), | |
| * both safe in hardirq context, so register as a hard IRQ handler. | |
| * IRQF_NO_AUTOEN keeps it disabled until the buffer is enabled. | |
| */ | |
| ret = devm_request_irq(dev, irq, ad4691_irq, IRQF_NO_AUTOEN, | |
| indio_dev->name, indio_dev); | |
| if (ret) | |
| return ret; | |
| return devm_iio_triggered_buffer_setup_ext(dev, indio_dev, | |
| iio_pollfunc_store_time, | |
| ad4691_trigger_handler, | |
| IIO_BUFFER_DIRECTION_IN, | |
| &ad4691_cnv_burst_buffer_setup_ops, | |
| ad4691_buffer_attrs); | |
| } | |
| static int ad4691_setup_offload(struct iio_dev *indio_dev, | |
| struct ad4691_state *st, | |
| struct spi_offload *spi_offload) | |
| { | |
| struct device *dev = regmap_get_device(st->regmap); | |
| struct dma_chan *rx_dma; | |
| int ret; | |
| st->offload = spi_offload; | |
| /* | |
| * CNV burst offload exposes oversampling_ratio (ACC_DEPTH_IN is | |
| * configured per channel at buffer enable). Manual offload does not | |
| * configure ACC_DEPTH_IN, so it uses a separate channel array | |
| * without the oversampling_ratio attribute. Both paths use IIO_CPU | |
| * (no .endianness annotation) because bits_per_word=16 causes the | |
| * SPI Engine to produce native 16-bit DMA words. | |
| */ | |
| if (st->manual_mode) | |
| indio_dev->channels = st->info->offload_info->manual_channels; | |
| else | |
| indio_dev->channels = st->info->offload_info->channels; | |
| indio_dev->num_channels = st->info->offload_info->num_channels; | |
| /* | |
| * Offload path uses DMA directly; no IIO trigger is involved, so | |
| * external triggers are not restricted (no validate_trigger). | |
| */ | |
| indio_dev->info = &ad4691_manual_info; | |
| if (st->manual_mode) { | |
| st->offload_trigger = | |
| devm_spi_offload_trigger_get(dev, st->offload, | |
| SPI_OFFLOAD_TRIGGER_PERIODIC); | |
| if (IS_ERR(st->offload_trigger)) | |
| return dev_err_probe(dev, PTR_ERR(st->offload_trigger), | |
| "Failed to get periodic offload trigger\n"); | |
| st->trigger_hz = AD4691_OFFLOAD_INITIAL_TRIGGER_HZ; | |
| } else { | |
| struct spi_offload_trigger_info trigger_info = { | |
| .fwnode = dev_fwnode(dev), | |
| .ops = &ad4691_offload_trigger_ops, | |
| .priv = st, | |
| }; | |
| ret = devm_spi_offload_trigger_register(dev, &trigger_info); | |
| if (ret) | |
| return dev_err_probe(dev, ret, | |
| "Failed to register offload trigger\n"); | |
| st->offload_trigger = | |
| devm_spi_offload_trigger_get(dev, st->offload, | |
| SPI_OFFLOAD_TRIGGER_DATA_READY); | |
| if (IS_ERR(st->offload_trigger)) | |
| return dev_err_probe(dev, PTR_ERR(st->offload_trigger), | |
| "Failed to get DATA_READY offload trigger\n"); | |
| } | |
| rx_dma = devm_spi_offload_rx_stream_request_dma_chan(dev, st->offload); | |
| if (IS_ERR(rx_dma)) | |
| return dev_err_probe(dev, PTR_ERR(rx_dma), | |
| "Failed to get offload RX DMA channel\n"); | |
| if (st->manual_mode) | |
| indio_dev->setup_ops = &ad4691_manual_offload_buffer_setup_ops; | |
| else | |
| indio_dev->setup_ops = &ad4691_cnv_burst_offload_buffer_setup_ops; | |
| ret = devm_iio_dmaengine_buffer_setup_with_handle(dev, indio_dev, rx_dma, | |
| IIO_BUFFER_DIRECTION_IN); | |
| if (ret) | |
| return ret; | |
| indio_dev->buffer->attrs = ad4691_buffer_attrs; | |
| return 0; | |
| } | |
| static int ad4691_probe(struct spi_device *spi) | |
| { | |
| struct device *dev = &spi->dev; | |
| struct spi_offload *spi_offload; | |
| struct iio_dev *indio_dev; | |
| struct ad4691_state *st; | |
| int ret; | |
| indio_dev = devm_iio_device_alloc(dev, sizeof(*st)); | |
| if (!indio_dev) | |
| return -ENOMEM; | |
| st = iio_priv(indio_dev); | |
| st->spi = spi; | |
| st->info = spi_get_device_match_data(spi); | |
| if (!st->info) | |
| return -ENODEV; | |
| st->osr = 1; | |
| ret = devm_mutex_init(dev, &st->lock); | |
| if (ret) | |
| return ret; | |
| st->regmap = devm_regmap_init(dev, NULL, spi, &ad4691_regmap_config); | |
| if (IS_ERR(st->regmap)) | |
| return dev_err_probe(dev, PTR_ERR(st->regmap), | |
| "Failed to initialize regmap\n"); | |
| ret = ad4691_regulator_setup(st); | |
| if (ret) | |
| return ret; | |
| ret = ad4691_reset(st); | |
| if (ret) | |
| return ret; | |
| ret = ad4691_config(st); | |
| if (ret) | |
| return ret; | |
| spi_offload = devm_spi_offload_get(dev, spi, &ad4691_offload_config); | |
| ret = PTR_ERR_OR_ZERO(spi_offload); | |
| if (ret == -ENODEV) | |
| spi_offload = NULL; | |
| else if (ret) | |
| return dev_err_probe(dev, ret, "Failed to get SPI offload\n"); | |
| indio_dev->name = st->info->name; | |
| indio_dev->modes = INDIO_DIRECT_MODE; | |
| if (spi_offload) | |
| ret = ad4691_setup_offload(indio_dev, st, spi_offload); | |
| else | |
| ret = ad4691_setup_triggered_buffer(indio_dev, st); | |
| if (ret) | |
| return ret; | |
| return devm_iio_device_register(dev, indio_dev); | |
| } | |
| static const struct of_device_id ad4691_of_match[] = { | |
| { .compatible = "adi,ad4691", .data = &ad4691_chip_info }, | |
| { .compatible = "adi,ad4692", .data = &ad4692_chip_info }, | |
| { .compatible = "adi,ad4693", .data = &ad4693_chip_info }, | |
| { .compatible = "adi,ad4694", .data = &ad4694_chip_info }, | |
| { } | |
| }; | |
| MODULE_DEVICE_TABLE(of, ad4691_of_match); | |
| static const struct spi_device_id ad4691_id[] = { | |
| { .name = "ad4691", .driver_data = (kernel_ulong_t)&ad4691_chip_info }, | |
| { .name = "ad4692", .driver_data = (kernel_ulong_t)&ad4692_chip_info }, | |
| { .name = "ad4693", .driver_data = (kernel_ulong_t)&ad4693_chip_info }, | |
| { .name = "ad4694", .driver_data = (kernel_ulong_t)&ad4694_chip_info }, | |
| { } | |
| }; | |
| MODULE_DEVICE_TABLE(spi, ad4691_id); | |
| static struct spi_driver ad4691_driver = { | |
| .driver = { | |
| .name = "ad4691", | |
| .of_match_table = ad4691_of_match, | |
| }, | |
| .probe = ad4691_probe, | |
| .id_table = ad4691_id, | |
| }; | |
| module_spi_driver(ad4691_driver); | |
| MODULE_AUTHOR("Radu Sabau <radu.sabau@analog.com>"); | |
| MODULE_DESCRIPTION("Analog Devices AD4691 Family ADC Driver"); | |
| MODULE_LICENSE("GPL"); | |
| MODULE_IMPORT_NS("IIO_DMA_BUFFER"); | |
| MODULE_IMPORT_NS("IIO_DMAENGINE_BUFFER"); |