1*47d323ceSPetre Rodan /* SPDX-License-Identifier: GPL-2.0 */ 2*47d323ceSPetre Rodan /* 3*47d323ceSPetre Rodan * Honeywell ABP2 series pressure sensor driver 4*47d323ceSPetre Rodan * 5*47d323ceSPetre Rodan * Copyright (c) 2025 Petre Rodan <petre.rodan@subdimension.ro> 6*47d323ceSPetre Rodan */ 7*47d323ceSPetre Rodan 8*47d323ceSPetre Rodan #ifndef _ABP2030PA_H 9*47d323ceSPetre Rodan #define _ABP2030PA_H 10*47d323ceSPetre Rodan 11*47d323ceSPetre Rodan #include <linux/completion.h> 12*47d323ceSPetre Rodan #include <linux/types.h> 13*47d323ceSPetre Rodan 14*47d323ceSPetre Rodan #include <linux/iio/iio.h> 15*47d323ceSPetre Rodan 16*47d323ceSPetre Rodan #define ABP2_MEASUREMENT_RD_SIZE 7 17*47d323ceSPetre Rodan 18*47d323ceSPetre Rodan struct device; 19*47d323ceSPetre Rodan 20*47d323ceSPetre Rodan struct abp2_data; 21*47d323ceSPetre Rodan struct abp2_ops; 22*47d323ceSPetre Rodan 23*47d323ceSPetre Rodan enum abp2_func_id { 24*47d323ceSPetre Rodan ABP2_FUNCTION_A, 25*47d323ceSPetre Rodan }; 26*47d323ceSPetre Rodan 27*47d323ceSPetre Rodan /** 28*47d323ceSPetre Rodan * struct abp2_data 29*47d323ceSPetre Rodan * @dev: current device structure 30*47d323ceSPetre Rodan * @ops: pointers for bus specific read and write functions 31*47d323ceSPetre Rodan * @pmin: minimal pressure in pascal 32*47d323ceSPetre Rodan * @pmax: maximal pressure in pascal 33*47d323ceSPetre Rodan * @outmin: minimum raw pressure in counts (based on transfer function) 34*47d323ceSPetre Rodan * @outmax: maximum raw pressure in counts (based on transfer function) 35*47d323ceSPetre Rodan * @function: transfer function 36*47d323ceSPetre Rodan * @p_scale: pressure scale 37*47d323ceSPetre Rodan * @p_scale_dec: pressure scale, decimal number 38*47d323ceSPetre Rodan * @p_offset: pressure offset 39*47d323ceSPetre Rodan * @irq: end of conversion - applies only to the i2c sensor 40*47d323ceSPetre Rodan * @completion: handshake from irq to read 41*47d323ceSPetre Rodan * @scan: channel values for buffered mode 42*47d323ceSPetre Rodan * @tx_buf: transmit buffer used during the SPI communication 43*47d323ceSPetre Rodan * @rx_buf: raw data provided by sensor 44*47d323ceSPetre Rodan */ 45*47d323ceSPetre Rodan struct abp2_data { 46*47d323ceSPetre Rodan struct device *dev; 47*47d323ceSPetre Rodan const struct abp2_ops *ops; 48*47d323ceSPetre Rodan s32 pmin; 49*47d323ceSPetre Rodan s32 pmax; 50*47d323ceSPetre Rodan u32 outmin; 51*47d323ceSPetre Rodan u32 outmax; 52*47d323ceSPetre Rodan enum abp2_func_id function; 53*47d323ceSPetre Rodan int p_scale; 54*47d323ceSPetre Rodan int p_scale_dec; 55*47d323ceSPetre Rodan int p_offset; 56*47d323ceSPetre Rodan int irq; 57*47d323ceSPetre Rodan struct completion completion; 58*47d323ceSPetre Rodan struct { 59*47d323ceSPetre Rodan u32 chan[2]; 60*47d323ceSPetre Rodan aligned_s64 timestamp; 61*47d323ceSPetre Rodan } scan; 62*47d323ceSPetre Rodan u8 rx_buf[ABP2_MEASUREMENT_RD_SIZE] __aligned(IIO_DMA_MINALIGN); 63*47d323ceSPetre Rodan u8 tx_buf[ABP2_MEASUREMENT_RD_SIZE]; 64*47d323ceSPetre Rodan }; 65*47d323ceSPetre Rodan 66*47d323ceSPetre Rodan struct abp2_ops { 67*47d323ceSPetre Rodan int (*read)(struct abp2_data *data, u8 cmd, u8 nbytes); 68*47d323ceSPetre Rodan int (*write)(struct abp2_data *data, u8 cmd, u8 nbytes); 69*47d323ceSPetre Rodan }; 70*47d323ceSPetre Rodan 71*47d323ceSPetre Rodan int abp2_common_probe(struct device *dev, const struct abp2_ops *ops, int irq); 72*47d323ceSPetre Rodan 73*47d323ceSPetre Rodan #endif 74