blob: 57e5ed784686bafc56782510384ec8dd6d61e473 [file] [log] [blame] [edit]
/* SPDX-License-Identifier: GPL-2.0 */
/*
* Honeywell ABP2 series pressure sensor driver
*
* Copyright (c) 2025 Petre Rodan <petre.rodan@subdimension.ro>
*/
#ifndef _ABP2030PA_H
#define _ABP2030PA_H
#include <linux/completion.h>
#include <linux/types.h>
#include <linux/iio/iio.h>
#define ABP2_MEASUREMENT_RD_SIZE 7
struct device;
struct abp2_data;
struct abp2_ops;
enum abp2_func_id {
ABP2_FUNCTION_A,
};
/**
* struct abp2_data
* @dev: current device structure
* @ops: pointers for bus specific read and write functions
* @pmin: minimal pressure in pascal
* @pmax: maximal pressure in pascal
* @outmin: minimum raw pressure in counts (based on transfer function)
* @outmax: maximum raw pressure in counts (based on transfer function)
* @function: transfer function
* @p_scale: pressure scale
* @p_scale_dec: pressure scale, decimal number
* @p_offset: pressure offset
* @irq: end of conversion - applies only to the i2c sensor
* @completion: handshake from irq to read
* @scan: channel values for buffered mode
* @tx_buf: transmit buffer used during the SPI communication
* @rx_buf: raw data provided by sensor
*/
struct abp2_data {
struct device *dev;
const struct abp2_ops *ops;
s32 pmin;
s32 pmax;
u32 outmin;
u32 outmax;
enum abp2_func_id function;
int p_scale;
int p_scale_dec;
int p_offset;
int irq;
struct completion completion;
struct {
u32 chan[2];
aligned_s64 timestamp;
} scan;
u8 rx_buf[ABP2_MEASUREMENT_RD_SIZE] __aligned(IIO_DMA_MINALIGN);
u8 tx_buf[ABP2_MEASUREMENT_RD_SIZE];
};
struct abp2_ops {
int (*read)(struct abp2_data *data, u8 cmd, u8 nbytes);
int (*write)(struct abp2_data *data, u8 cmd, u8 nbytes);
};
int abp2_common_probe(struct device *dev, const struct abp2_ops *ops, int irq);
#endif