1*47d323ceSPetre Rodan // SPDX-License-Identifier: GPL-2.0-or-later 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/device.h> 9*47d323ceSPetre Rodan #include <linux/errno.h> 10*47d323ceSPetre Rodan #include <linux/i2c.h> 11*47d323ceSPetre Rodan #include <linux/mod_devicetable.h> 12*47d323ceSPetre Rodan #include <linux/module.h> 13*47d323ceSPetre Rodan #include <linux/types.h> 14*47d323ceSPetre Rodan 15*47d323ceSPetre Rodan #include "abp2030pa.h" 16*47d323ceSPetre Rodan 17*47d323ceSPetre Rodan static int abp2_i2c_read(struct abp2_data *data, u8 unused, u8 nbytes) 18*47d323ceSPetre Rodan { 19*47d323ceSPetre Rodan struct i2c_client *client = to_i2c_client(data->dev); 20*47d323ceSPetre Rodan int ret; 21*47d323ceSPetre Rodan 22*47d323ceSPetre Rodan if (nbytes > ABP2_MEASUREMENT_RD_SIZE) 23*47d323ceSPetre Rodan return -EOVERFLOW; 24*47d323ceSPetre Rodan 25*47d323ceSPetre Rodan ret = i2c_master_recv(client, data->rx_buf, nbytes); 26*47d323ceSPetre Rodan if (ret < 0) 27*47d323ceSPetre Rodan return ret; 28*47d323ceSPetre Rodan if (ret != nbytes) 29*47d323ceSPetre Rodan return -EIO; 30*47d323ceSPetre Rodan 31*47d323ceSPetre Rodan return 0; 32*47d323ceSPetre Rodan } 33*47d323ceSPetre Rodan 34*47d323ceSPetre Rodan static int abp2_i2c_write(struct abp2_data *data, u8 cmd, u8 nbytes) 35*47d323ceSPetre Rodan { 36*47d323ceSPetre Rodan struct i2c_client *client = to_i2c_client(data->dev); 37*47d323ceSPetre Rodan int ret; 38*47d323ceSPetre Rodan 39*47d323ceSPetre Rodan if (nbytes > ABP2_MEASUREMENT_RD_SIZE) 40*47d323ceSPetre Rodan return -EOVERFLOW; 41*47d323ceSPetre Rodan 42*47d323ceSPetre Rodan data->tx_buf[0] = cmd; 43*47d323ceSPetre Rodan ret = i2c_master_send(client, data->tx_buf, nbytes); 44*47d323ceSPetre Rodan if (ret < 0) 45*47d323ceSPetre Rodan return ret; 46*47d323ceSPetre Rodan if (ret != nbytes) 47*47d323ceSPetre Rodan return -EIO; 48*47d323ceSPetre Rodan 49*47d323ceSPetre Rodan return 0; 50*47d323ceSPetre Rodan } 51*47d323ceSPetre Rodan 52*47d323ceSPetre Rodan static const struct abp2_ops abp2_i2c_ops = { 53*47d323ceSPetre Rodan .read = abp2_i2c_read, 54*47d323ceSPetre Rodan .write = abp2_i2c_write, 55*47d323ceSPetre Rodan }; 56*47d323ceSPetre Rodan 57*47d323ceSPetre Rodan static int abp2_i2c_probe(struct i2c_client *client) 58*47d323ceSPetre Rodan { 59*47d323ceSPetre Rodan if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) 60*47d323ceSPetre Rodan return -EOPNOTSUPP; 61*47d323ceSPetre Rodan 62*47d323ceSPetre Rodan return abp2_common_probe(&client->dev, &abp2_i2c_ops, client->irq); 63*47d323ceSPetre Rodan } 64*47d323ceSPetre Rodan 65*47d323ceSPetre Rodan static const struct of_device_id abp2_i2c_match[] = { 66*47d323ceSPetre Rodan { .compatible = "honeywell,abp2030pa" }, 67*47d323ceSPetre Rodan { } 68*47d323ceSPetre Rodan }; 69*47d323ceSPetre Rodan MODULE_DEVICE_TABLE(of, abp2_i2c_match); 70*47d323ceSPetre Rodan 71*47d323ceSPetre Rodan static const struct i2c_device_id abp2_i2c_id[] = { 72*47d323ceSPetre Rodan { "abp2030pa" }, 73*47d323ceSPetre Rodan { } 74*47d323ceSPetre Rodan }; 75*47d323ceSPetre Rodan MODULE_DEVICE_TABLE(i2c, abp2_i2c_id); 76*47d323ceSPetre Rodan 77*47d323ceSPetre Rodan static struct i2c_driver abp2_i2c_driver = { 78*47d323ceSPetre Rodan .driver = { 79*47d323ceSPetre Rodan .name = "abp2030pa", 80*47d323ceSPetre Rodan .of_match_table = abp2_i2c_match, 81*47d323ceSPetre Rodan }, 82*47d323ceSPetre Rodan .probe = abp2_i2c_probe, 83*47d323ceSPetre Rodan .id_table = abp2_i2c_id, 84*47d323ceSPetre Rodan }; 85*47d323ceSPetre Rodan module_i2c_driver(abp2_i2c_driver); 86*47d323ceSPetre Rodan 87*47d323ceSPetre Rodan MODULE_AUTHOR("Petre Rodan <petre.rodan@subdimension.ro>"); 88*47d323ceSPetre Rodan MODULE_DESCRIPTION("Honeywell ABP2 pressure sensor i2c driver"); 89*47d323ceSPetre Rodan MODULE_LICENSE("GPL"); 90*47d323ceSPetre Rodan MODULE_IMPORT_NS("IIO_HONEYWELL_ABP2030PA"); 91