1*47d323ceSPetre Rodan // SPDX-License-Identifier: GPL-2.0-only 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 #include <linux/errno.h> 9*47d323ceSPetre Rodan #include <linux/mod_devicetable.h> 10*47d323ceSPetre Rodan #include <linux/module.h> 11*47d323ceSPetre Rodan #include <linux/spi/spi.h> 12*47d323ceSPetre Rodan #include <linux/types.h> 13*47d323ceSPetre Rodan 14*47d323ceSPetre Rodan #include "abp2030pa.h" 15*47d323ceSPetre Rodan 16*47d323ceSPetre Rodan static int abp2_spi_xfer(struct abp2_data *data, u8 cmd, u8 nbytes) 17*47d323ceSPetre Rodan { 18*47d323ceSPetre Rodan struct spi_device *spi = to_spi_device(data->dev); 19*47d323ceSPetre Rodan struct spi_transfer xfer = { }; 20*47d323ceSPetre Rodan 21*47d323ceSPetre Rodan if (nbytes > ABP2_MEASUREMENT_RD_SIZE) 22*47d323ceSPetre Rodan return -EOVERFLOW; 23*47d323ceSPetre Rodan 24*47d323ceSPetre Rodan data->tx_buf[0] = cmd; 25*47d323ceSPetre Rodan xfer.tx_buf = data->tx_buf; 26*47d323ceSPetre Rodan xfer.rx_buf = data->rx_buf; 27*47d323ceSPetre Rodan xfer.len = nbytes; 28*47d323ceSPetre Rodan 29*47d323ceSPetre Rodan return spi_sync_transfer(spi, &xfer, 1); 30*47d323ceSPetre Rodan } 31*47d323ceSPetre Rodan 32*47d323ceSPetre Rodan static const struct abp2_ops abp2_spi_ops = { 33*47d323ceSPetre Rodan .read = abp2_spi_xfer, 34*47d323ceSPetre Rodan .write = abp2_spi_xfer, 35*47d323ceSPetre Rodan }; 36*47d323ceSPetre Rodan 37*47d323ceSPetre Rodan static int abp2_spi_probe(struct spi_device *spi) 38*47d323ceSPetre Rodan { 39*47d323ceSPetre Rodan return abp2_common_probe(&spi->dev, &abp2_spi_ops, spi->irq); 40*47d323ceSPetre Rodan } 41*47d323ceSPetre Rodan 42*47d323ceSPetre Rodan static const struct of_device_id abp2_spi_match[] = { 43*47d323ceSPetre Rodan { .compatible = "honeywell,abp2030pa" }, 44*47d323ceSPetre Rodan { } 45*47d323ceSPetre Rodan }; 46*47d323ceSPetre Rodan MODULE_DEVICE_TABLE(of, abp2_spi_match); 47*47d323ceSPetre Rodan 48*47d323ceSPetre Rodan static const struct spi_device_id abp2_spi_id[] = { 49*47d323ceSPetre Rodan { "abp2030pa" }, 50*47d323ceSPetre Rodan { } 51*47d323ceSPetre Rodan }; 52*47d323ceSPetre Rodan MODULE_DEVICE_TABLE(spi, abp2_spi_id); 53*47d323ceSPetre Rodan 54*47d323ceSPetre Rodan static struct spi_driver abp2_spi_driver = { 55*47d323ceSPetre Rodan .driver = { 56*47d323ceSPetre Rodan .name = "abp2030pa", 57*47d323ceSPetre Rodan .of_match_table = abp2_spi_match, 58*47d323ceSPetre Rodan }, 59*47d323ceSPetre Rodan .probe = abp2_spi_probe, 60*47d323ceSPetre Rodan .id_table = abp2_spi_id, 61*47d323ceSPetre Rodan }; 62*47d323ceSPetre Rodan module_spi_driver(abp2_spi_driver); 63*47d323ceSPetre Rodan 64*47d323ceSPetre Rodan MODULE_AUTHOR("Petre Rodan <petre.rodan@subdimension.ro>"); 65*47d323ceSPetre Rodan MODULE_DESCRIPTION("Honeywell ABP2 pressure sensor spi driver"); 66*47d323ceSPetre Rodan MODULE_LICENSE("GPL"); 67*47d323ceSPetre Rodan MODULE_IMPORT_NS("IIO_HONEYWELL_ABP2030PA"); 68