18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * MS5611 pressure and temperature sensor driver
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Copyright (c) Tomasz Duszynski <tduszyns@gmail.com>
68c2ecf20Sopenharmony_ci *
78c2ecf20Sopenharmony_ci */
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ci#ifndef _MS5611_H
108c2ecf20Sopenharmony_ci#define _MS5611_H
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ci#include <linux/device.h>
138c2ecf20Sopenharmony_ci#include <linux/iio/iio.h>
148c2ecf20Sopenharmony_ci#include <linux/mutex.h>
158c2ecf20Sopenharmony_ci
168c2ecf20Sopenharmony_cistruct regulator;
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_ci#define MS5611_RESET			0x1e
198c2ecf20Sopenharmony_ci#define MS5611_READ_ADC			0x00
208c2ecf20Sopenharmony_ci#define MS5611_READ_PROM_WORD		0xA0
218c2ecf20Sopenharmony_ci#define MS5611_PROM_WORDS_NB		8
228c2ecf20Sopenharmony_ci
238c2ecf20Sopenharmony_cienum {
248c2ecf20Sopenharmony_ci	MS5611,
258c2ecf20Sopenharmony_ci	MS5607,
268c2ecf20Sopenharmony_ci};
278c2ecf20Sopenharmony_ci
288c2ecf20Sopenharmony_ci/*
298c2ecf20Sopenharmony_ci * OverSampling Rate descriptor.
308c2ecf20Sopenharmony_ci * Warning: cmd MUST be kept aligned on a word boundary (see
318c2ecf20Sopenharmony_ci * m5611_spi_read_adc_temp_and_pressure in ms5611_spi.c).
328c2ecf20Sopenharmony_ci */
338c2ecf20Sopenharmony_cistruct ms5611_osr {
348c2ecf20Sopenharmony_ci	unsigned long conv_usec;
358c2ecf20Sopenharmony_ci	u8 cmd;
368c2ecf20Sopenharmony_ci	unsigned short rate;
378c2ecf20Sopenharmony_ci};
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_cistruct ms5611_state {
408c2ecf20Sopenharmony_ci	void *client;
418c2ecf20Sopenharmony_ci	struct mutex lock;
428c2ecf20Sopenharmony_ci
438c2ecf20Sopenharmony_ci	const struct ms5611_osr *pressure_osr;
448c2ecf20Sopenharmony_ci	const struct ms5611_osr *temp_osr;
458c2ecf20Sopenharmony_ci
468c2ecf20Sopenharmony_ci	u16 prom[MS5611_PROM_WORDS_NB];
478c2ecf20Sopenharmony_ci
488c2ecf20Sopenharmony_ci	int (*reset)(struct ms5611_state *st);
498c2ecf20Sopenharmony_ci	int (*read_prom_word)(struct ms5611_state *st, int index, u16 *word);
508c2ecf20Sopenharmony_ci	int (*read_adc_temp_and_pressure)(struct ms5611_state *st,
518c2ecf20Sopenharmony_ci					  s32 *temp, s32 *pressure);
528c2ecf20Sopenharmony_ci
538c2ecf20Sopenharmony_ci	int (*compensate_temp_and_pressure)(struct ms5611_state *st, s32 *temp,
548c2ecf20Sopenharmony_ci					  s32 *pressure);
558c2ecf20Sopenharmony_ci	struct regulator *vdd;
568c2ecf20Sopenharmony_ci};
578c2ecf20Sopenharmony_ci
588c2ecf20Sopenharmony_ciint ms5611_probe(struct iio_dev *indio_dev, struct device *dev,
598c2ecf20Sopenharmony_ci		 const char *name, int type);
608c2ecf20Sopenharmony_ciint ms5611_remove(struct iio_dev *indio_dev);
618c2ecf20Sopenharmony_ci
628c2ecf20Sopenharmony_ci#endif /* _MS5611_H */
63