2 * MS5611 pressure and temperature sensor driver (I2C bus)
4 * Copyright (c) Tomasz Duszynski <tduszyns@gmail.com>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
10 * 7-bit I2C slave addresses:
17 #include <linux/delay.h>
18 #include <linux/i2c.h>
19 #include <linux/module.h>
23 static int ms5611_i2c_reset(struct device
*dev
)
25 struct ms5611_state
*st
= iio_priv(dev_to_iio_dev(dev
));
27 return i2c_smbus_write_byte(st
->client
, MS5611_RESET
);
30 static int ms5611_i2c_read_prom_word(struct device
*dev
, int index
, u16
*word
)
33 struct ms5611_state
*st
= iio_priv(dev_to_iio_dev(dev
));
35 ret
= i2c_smbus_read_word_swapped(st
->client
,
36 MS5611_READ_PROM_WORD
+ (index
<< 1));
45 static int ms5611_i2c_read_adc(struct ms5611_state
*st
, s32
*val
)
50 ret
= i2c_smbus_read_i2c_block_data(st
->client
, MS5611_READ_ADC
,
55 *val
= (buf
[0] << 16) | (buf
[1] << 8) | buf
[2];
60 static int ms5611_i2c_read_adc_temp_and_pressure(struct device
*dev
,
61 s32
*temp
, s32
*pressure
)
64 struct ms5611_state
*st
= iio_priv(dev_to_iio_dev(dev
));
66 ret
= i2c_smbus_write_byte(st
->client
, MS5611_START_TEMP_CONV
);
70 usleep_range(MS5611_CONV_TIME_MIN
, MS5611_CONV_TIME_MAX
);
72 ret
= ms5611_i2c_read_adc(st
, temp
);
76 ret
= i2c_smbus_write_byte(st
->client
, MS5611_START_PRESSURE_CONV
);
80 usleep_range(MS5611_CONV_TIME_MIN
, MS5611_CONV_TIME_MAX
);
82 return ms5611_i2c_read_adc(st
, pressure
);
85 static int ms5611_i2c_probe(struct i2c_client
*client
,
86 const struct i2c_device_id
*id
)
88 struct ms5611_state
*st
;
89 struct iio_dev
*indio_dev
;
91 if (!i2c_check_functionality(client
->adapter
,
92 I2C_FUNC_SMBUS_WRITE_BYTE
|
93 I2C_FUNC_SMBUS_READ_WORD_DATA
|
94 I2C_FUNC_SMBUS_READ_I2C_BLOCK
))
97 indio_dev
= devm_iio_device_alloc(&client
->dev
, sizeof(*st
));
101 st
= iio_priv(indio_dev
);
102 i2c_set_clientdata(client
, indio_dev
);
103 st
->reset
= ms5611_i2c_reset
;
104 st
->read_prom_word
= ms5611_i2c_read_prom_word
;
105 st
->read_adc_temp_and_pressure
= ms5611_i2c_read_adc_temp_and_pressure
;
108 return ms5611_probe(indio_dev
, &client
->dev
, id
->name
, id
->driver_data
);
111 static int ms5611_i2c_remove(struct i2c_client
*client
)
113 return ms5611_remove(i2c_get_clientdata(client
));
116 static const struct i2c_device_id ms5611_id
[] = {
117 { "ms5611", MS5611
},
118 { "ms5607", MS5607
},
121 MODULE_DEVICE_TABLE(i2c
, ms5611_id
);
123 static struct i2c_driver ms5611_driver
= {
127 .id_table
= ms5611_id
,
128 .probe
= ms5611_i2c_probe
,
129 .remove
= ms5611_i2c_remove
,
131 module_i2c_driver(ms5611_driver
);
133 MODULE_AUTHOR("Tomasz Duszynski <tduszyns@gmail.com>");
134 MODULE_DESCRIPTION("MS5611 i2c driver");
135 MODULE_LICENSE("GPL v2");