forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-10 37f49e37ab4cb5d0bc4c60eb5c6d4dd57db767bb
kernel/drivers/iio/pressure/ms5611_core.c
....@@ -1,11 +1,8 @@
1
+// SPDX-License-Identifier: GPL-2.0
12 /*
23 * MS5611 pressure and temperature sensor driver
34 *
45 * Copyright (c) Tomasz Duszynski <tduszyns@gmail.com>
5
- *
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.
96 *
107 * Data sheet:
118 * http://www.meas-spec.com/downloads/MS5611-01BA03.pdf
....@@ -88,8 +85,7 @@
8885 struct ms5611_state *st = iio_priv(indio_dev);
8986
9087 for (i = 0; i < MS5611_PROM_WORDS_NB; i++) {
91
- ret = st->read_prom_word(&indio_dev->dev,
92
- i, &st->chip_info->prom[i]);
88
+ ret = st->read_prom_word(st, i, &st->prom[i]);
9389 if (ret < 0) {
9490 dev_err(&indio_dev->dev,
9591 "failed to read prom at %d\n", i);
....@@ -97,7 +93,7 @@
9793 }
9894 }
9995
100
- if (!ms5611_prom_is_valid(st->chip_info->prom, MS5611_PROM_WORDS_NB)) {
96
+ if (!ms5611_prom_is_valid(st->prom, MS5611_PROM_WORDS_NB)) {
10197 dev_err(&indio_dev->dev, "PROM integrity check failed\n");
10298 return -ENODEV;
10399 }
....@@ -111,28 +107,27 @@
111107 int ret;
112108 struct ms5611_state *st = iio_priv(indio_dev);
113109
114
- ret = st->read_adc_temp_and_pressure(&indio_dev->dev, temp, pressure);
110
+ ret = st->read_adc_temp_and_pressure(st, temp, pressure);
115111 if (ret < 0) {
116112 dev_err(&indio_dev->dev,
117113 "failed to read temperature and pressure\n");
118114 return ret;
119115 }
120116
121
- return st->chip_info->temp_and_pressure_compensate(st->chip_info,
122
- temp, pressure);
117
+ return st->compensate_temp_and_pressure(st, temp, pressure);
123118 }
124119
125
-static int ms5611_temp_and_pressure_compensate(struct ms5611_chip_info *chip_info,
120
+static int ms5611_temp_and_pressure_compensate(struct ms5611_state *st,
126121 s32 *temp, s32 *pressure)
127122 {
128123 s32 t = *temp, p = *pressure;
129124 s64 off, sens, dt;
130125
131
- dt = t - (chip_info->prom[5] << 8);
132
- off = ((s64)chip_info->prom[2] << 16) + ((chip_info->prom[4] * dt) >> 7);
133
- sens = ((s64)chip_info->prom[1] << 15) + ((chip_info->prom[3] * dt) >> 8);
126
+ dt = t - (st->prom[5] << 8);
127
+ off = ((s64)st->prom[2] << 16) + ((st->prom[4] * dt) >> 7);
128
+ sens = ((s64)st->prom[1] << 15) + ((st->prom[3] * dt) >> 8);
134129
135
- t = 2000 + ((chip_info->prom[6] * dt) >> 23);
130
+ t = 2000 + ((st->prom[6] * dt) >> 23);
136131 if (t < 2000) {
137132 s64 off2, sens2, t2;
138133
....@@ -158,17 +153,17 @@
158153 return 0;
159154 }
160155
161
-static int ms5607_temp_and_pressure_compensate(struct ms5611_chip_info *chip_info,
156
+static int ms5607_temp_and_pressure_compensate(struct ms5611_state *st,
162157 s32 *temp, s32 *pressure)
163158 {
164159 s32 t = *temp, p = *pressure;
165160 s64 off, sens, dt;
166161
167
- dt = t - (chip_info->prom[5] << 8);
168
- off = ((s64)chip_info->prom[2] << 17) + ((chip_info->prom[4] * dt) >> 6);
169
- sens = ((s64)chip_info->prom[1] << 16) + ((chip_info->prom[3] * dt) >> 7);
162
+ dt = t - (st->prom[5] << 8);
163
+ off = ((s64)st->prom[2] << 17) + ((st->prom[4] * dt) >> 6);
164
+ sens = ((s64)st->prom[1] << 16) + ((st->prom[3] * dt) >> 7);
170165
171
- t = 2000 + ((chip_info->prom[6] * dt) >> 23);
166
+ t = 2000 + ((st->prom[6] * dt) >> 23);
172167 if (t < 2000) {
173168 s64 off2, sens2, t2, tmp;
174169
....@@ -199,7 +194,7 @@
199194 int ret;
200195 struct ms5611_state *st = iio_priv(indio_dev);
201196
202
- ret = st->reset(&indio_dev->dev);
197
+ ret = st->reset(st);
203198 if (ret < 0) {
204199 dev_err(&indio_dev->dev, "failed to reset device\n");
205200 return ret;
....@@ -346,15 +341,6 @@
346341
347342 static const unsigned long ms5611_scan_masks[] = {0x3, 0};
348343
349
-static struct ms5611_chip_info chip_info_tbl[] = {
350
- [MS5611] = {
351
- .temp_and_pressure_compensate = ms5611_temp_and_pressure_compensate,
352
- },
353
- [MS5607] = {
354
- .temp_and_pressure_compensate = ms5607_temp_and_pressure_compensate,
355
- }
356
-};
357
-
358344 static const struct iio_chan_spec ms5611_channels[] = {
359345 {
360346 .type = IIO_PRESSURE,
....@@ -437,13 +423,25 @@
437423 struct ms5611_state *st = iio_priv(indio_dev);
438424
439425 mutex_init(&st->lock);
440
- st->chip_info = &chip_info_tbl[type];
426
+
427
+ switch (type) {
428
+ case MS5611:
429
+ st->compensate_temp_and_pressure =
430
+ ms5611_temp_and_pressure_compensate;
431
+ break;
432
+ case MS5607:
433
+ st->compensate_temp_and_pressure =
434
+ ms5607_temp_and_pressure_compensate;
435
+ break;
436
+ default:
437
+ return -EINVAL;
438
+ }
439
+
441440 st->temp_osr =
442441 &ms5611_avail_temp_osr[ARRAY_SIZE(ms5611_avail_temp_osr) - 1];
443442 st->pressure_osr =
444443 &ms5611_avail_pressure_osr[ARRAY_SIZE(ms5611_avail_pressure_osr)
445444 - 1];
446
- indio_dev->dev.parent = dev;
447445 indio_dev->name = name;
448446 indio_dev->info = &ms5611_info;
449447 indio_dev->channels = ms5611_channels;