1 // SPDX-License-Identifier: GPL-2.0
3 * MS5611 pressure and temperature sensor driver (I2C bus)
5 * Copyright (c) Tomasz Duszynski <tduszyns@gmail.com>
7 * 7-bit I2C slave addresses:
14 #include <linux/delay.h>
15 #include <linux/i2c.h>
16 #include <linux/module.h>
17 #include <linux/mod_devicetable.h>
19 #include <linux/unaligned.h>
23 static int ms5611_i2c_reset(struct ms5611_state
*st
)
25 return i2c_smbus_write_byte(st
->client
, MS5611_RESET
);
28 static int ms5611_i2c_read_prom_word(struct ms5611_state
*st
, int index
,
33 ret
= i2c_smbus_read_word_swapped(st
->client
,
34 MS5611_READ_PROM_WORD
+ (index
<< 1));
43 static int ms5611_i2c_read_adc(struct ms5611_state
*st
, s32
*val
)
48 ret
= i2c_smbus_read_i2c_block_data(st
->client
, MS5611_READ_ADC
,
53 *val
= get_unaligned_be24(&buf
[0]);
58 static int ms5611_i2c_read_adc_temp_and_pressure(struct ms5611_state
*st
,
59 s32
*temp
, s32
*pressure
)
62 const struct ms5611_osr
*osr
= st
->temp_osr
;
64 ret
= i2c_smbus_write_byte(st
->client
, osr
->cmd
);
68 usleep_range(osr
->conv_usec
, osr
->conv_usec
+ (osr
->conv_usec
/ 10UL));
69 ret
= ms5611_i2c_read_adc(st
, temp
);
73 osr
= st
->pressure_osr
;
74 ret
= i2c_smbus_write_byte(st
->client
, osr
->cmd
);
78 usleep_range(osr
->conv_usec
, osr
->conv_usec
+ (osr
->conv_usec
/ 10UL));
79 return ms5611_i2c_read_adc(st
, pressure
);
82 static int ms5611_i2c_probe(struct i2c_client
*client
)
84 const struct i2c_device_id
*id
= i2c_client_get_device_id(client
);
85 struct ms5611_state
*st
;
86 struct iio_dev
*indio_dev
;
88 if (!i2c_check_functionality(client
->adapter
,
89 I2C_FUNC_SMBUS_WRITE_BYTE
|
90 I2C_FUNC_SMBUS_READ_WORD_DATA
|
91 I2C_FUNC_SMBUS_READ_I2C_BLOCK
))
94 indio_dev
= devm_iio_device_alloc(&client
->dev
, sizeof(*st
));
98 st
= iio_priv(indio_dev
);
99 i2c_set_clientdata(client
, indio_dev
);
100 st
->reset
= ms5611_i2c_reset
;
101 st
->read_prom_word
= ms5611_i2c_read_prom_word
;
102 st
->read_adc_temp_and_pressure
= ms5611_i2c_read_adc_temp_and_pressure
;
105 return ms5611_probe(indio_dev
, &client
->dev
, id
->name
, id
->driver_data
);
108 static const struct of_device_id ms5611_i2c_matches
[] = {
109 { .compatible
= "meas,ms5611" },
110 { .compatible
= "meas,ms5607" },
113 MODULE_DEVICE_TABLE(of
, ms5611_i2c_matches
);
115 static const struct i2c_device_id ms5611_id
[] = {
116 { "ms5611", MS5611
},
117 { "ms5607", MS5607
},
120 MODULE_DEVICE_TABLE(i2c
, ms5611_id
);
122 static struct i2c_driver ms5611_driver
= {
125 .of_match_table
= ms5611_i2c_matches
,
127 .id_table
= ms5611_id
,
128 .probe
= ms5611_i2c_probe
,
130 module_i2c_driver(ms5611_driver
);
132 MODULE_AUTHOR("Tomasz Duszynski <tduszyns@gmail.com>");
133 MODULE_DESCRIPTION("MS5611 i2c driver");
134 MODULE_LICENSE("GPL v2");
135 MODULE_IMPORT_NS("IIO_MS5611");