hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/drivers/iio/chemical/bme680_core.c
....@@ -105,8 +105,6 @@
105105 },
106106 };
107107
108
-static const int bme680_oversampling_avail[] = { 1, 2, 4, 8, 16 };
109
-
110108 static int bme680_read_calib(struct bme680_data *data,
111109 struct bme680_calib *calib)
112110 {
....@@ -117,7 +115,7 @@
117115
118116 /* Temperature related coefficients */
119117 ret = regmap_bulk_read(data->regmap, BME680_T1_LSB_REG,
120
- (u8 *) &buf, 2);
118
+ &buf, sizeof(buf));
121119 if (ret < 0) {
122120 dev_err(dev, "failed to read BME680_T1_LSB_REG\n");
123121 return ret;
....@@ -125,7 +123,7 @@
125123 calib->par_t1 = le16_to_cpu(buf);
126124
127125 ret = regmap_bulk_read(data->regmap, BME680_T2_LSB_REG,
128
- (u8 *) &buf, 2);
126
+ &buf, sizeof(buf));
129127 if (ret < 0) {
130128 dev_err(dev, "failed to read BME680_T2_LSB_REG\n");
131129 return ret;
....@@ -141,7 +139,7 @@
141139
142140 /* Pressure related coefficients */
143141 ret = regmap_bulk_read(data->regmap, BME680_P1_LSB_REG,
144
- (u8 *) &buf, 2);
142
+ &buf, sizeof(buf));
145143 if (ret < 0) {
146144 dev_err(dev, "failed to read BME680_P1_LSB_REG\n");
147145 return ret;
....@@ -149,7 +147,7 @@
149147 calib->par_p1 = le16_to_cpu(buf);
150148
151149 ret = regmap_bulk_read(data->regmap, BME680_P2_LSB_REG,
152
- (u8 *) &buf, 2);
150
+ &buf, sizeof(buf));
153151 if (ret < 0) {
154152 dev_err(dev, "failed to read BME680_P2_LSB_REG\n");
155153 return ret;
....@@ -164,7 +162,7 @@
164162 calib->par_p3 = tmp;
165163
166164 ret = regmap_bulk_read(data->regmap, BME680_P4_LSB_REG,
167
- (u8 *) &buf, 2);
165
+ &buf, sizeof(buf));
168166 if (ret < 0) {
169167 dev_err(dev, "failed to read BME680_P4_LSB_REG\n");
170168 return ret;
....@@ -172,7 +170,7 @@
172170 calib->par_p4 = le16_to_cpu(buf);
173171
174172 ret = regmap_bulk_read(data->regmap, BME680_P5_LSB_REG,
175
- (u8 *) &buf, 2);
173
+ &buf, sizeof(buf));
176174 if (ret < 0) {
177175 dev_err(dev, "failed to read BME680_P5_LSB_REG\n");
178176 return ret;
....@@ -194,7 +192,7 @@
194192 calib->par_p7 = tmp;
195193
196194 ret = regmap_bulk_read(data->regmap, BME680_P8_LSB_REG,
197
- (u8 *) &buf, 2);
195
+ &buf, sizeof(buf));
198196 if (ret < 0) {
199197 dev_err(dev, "failed to read BME680_P8_LSB_REG\n");
200198 return ret;
....@@ -202,7 +200,7 @@
202200 calib->par_p8 = le16_to_cpu(buf);
203201
204202 ret = regmap_bulk_read(data->regmap, BME680_P9_LSB_REG,
205
- (u8 *) &buf, 2);
203
+ &buf, sizeof(buf));
206204 if (ret < 0) {
207205 dev_err(dev, "failed to read BME680_P9_LSB_REG\n");
208206 return ret;
....@@ -222,30 +220,26 @@
222220 dev_err(dev, "failed to read BME680_H1_MSB_REG\n");
223221 return ret;
224222 }
225
-
226223 ret = regmap_read(data->regmap, BME680_H1_LSB_REG, &tmp_lsb);
227224 if (ret < 0) {
228225 dev_err(dev, "failed to read BME680_H1_LSB_REG\n");
229226 return ret;
230227 }
231
-
232228 calib->par_h1 = (tmp_msb << BME680_HUM_REG_SHIFT_VAL) |
233
- (tmp_lsb & BME680_BIT_H1_DATA_MSK);
229
+ (tmp_lsb & BME680_BIT_H1_DATA_MASK);
234230
235231 ret = regmap_read(data->regmap, BME680_H2_MSB_REG, &tmp_msb);
236232 if (ret < 0) {
237233 dev_err(dev, "failed to read BME680_H2_MSB_REG\n");
238234 return ret;
239235 }
240
-
241236 ret = regmap_read(data->regmap, BME680_H2_LSB_REG, &tmp_lsb);
242237 if (ret < 0) {
243238 dev_err(dev, "failed to read BME680_H2_LSB_REG\n");
244239 return ret;
245240 }
246
-
247241 calib->par_h2 = (tmp_msb << BME680_HUM_REG_SHIFT_VAL) |
248
- (tmp_lsb >> BME680_HUM_REG_SHIFT_VAL);
242
+ (tmp_lsb >> BME680_HUM_REG_SHIFT_VAL);
249243
250244 ret = regmap_read(data->regmap, BME680_H3_REG, &tmp);
251245 if (ret < 0) {
....@@ -291,7 +285,7 @@
291285 calib->par_gh1 = tmp;
292286
293287 ret = regmap_bulk_read(data->regmap, BME680_GH2_LSB_REG,
294
- (u8 *) &buf, 2);
288
+ &buf, sizeof(buf));
295289 if (ret < 0) {
296290 dev_err(dev, "failed to read BME680_GH2_LSB_REG\n");
297291 return ret;
....@@ -311,7 +305,7 @@
311305 dev_err(dev, "failed to read resistance heat range\n");
312306 return ret;
313307 }
314
- calib->res_heat_range = (tmp & BME680_RHRANGE_MSK) / 16;
308
+ calib->res_heat_range = FIELD_GET(BME680_RHRANGE_MASK, tmp);
315309
316310 ret = regmap_read(data->regmap, BME680_REG_RES_HEAT_VAL, &tmp);
317311 if (ret < 0) {
....@@ -325,7 +319,7 @@
325319 dev_err(dev, "failed to read range software error\n");
326320 return ret;
327321 }
328
- calib->range_sw_err = (tmp & BME680_RSERROR_MSK) / 16;
322
+ calib->range_sw_err = FIELD_GET(BME680_RSERROR_MASK, tmp);
329323
330324 return 0;
331325 }
....@@ -426,10 +420,7 @@
426420 var6 = (var4 * var5) >> 1;
427421 calc_hum = (((var3 + var6) >> 10) * 1000) >> 12;
428422
429
- if (calc_hum > 100000) /* Cap at 100%rH */
430
- calc_hum = 100000;
431
- else if (calc_hum < 0)
432
- calc_hum = 0;
423
+ calc_hum = clamp(calc_hum, 0, 100000); /* clamp between 0-100 %rH */
433424
434425 return calc_hum;
435426 }
....@@ -536,12 +527,20 @@
536527 return ret;
537528 }
538529
530
+static u8 bme680_oversampling_to_reg(u8 val)
531
+{
532
+ return ilog2(val) + 1;
533
+}
534
+
539535 static int bme680_chip_config(struct bme680_data *data)
540536 {
541537 struct device *dev = regmap_get_device(data->regmap);
542538 int ret;
543
- u8 osrs = FIELD_PREP(BME680_OSRS_HUMIDITY_MASK,
544
- data->oversampling_humid + 1);
539
+ u8 osrs;
540
+
541
+ osrs = FIELD_PREP(
542
+ BME680_OSRS_HUMIDITY_MASK,
543
+ bme680_oversampling_to_reg(data->oversampling_humid));
545544 /*
546545 * Highly recommended to set oversampling of humidity before
547546 * temperature/pressure oversampling.
....@@ -562,12 +561,12 @@
562561 return ret;
563562 }
564563
565
- osrs = FIELD_PREP(BME680_OSRS_TEMP_MASK, data->oversampling_temp + 1) |
566
- FIELD_PREP(BME680_OSRS_PRESS_MASK, data->oversampling_press + 1);
567
-
564
+ osrs = FIELD_PREP(BME680_OSRS_TEMP_MASK,
565
+ bme680_oversampling_to_reg(data->oversampling_temp)) |
566
+ FIELD_PREP(BME680_OSRS_PRESS_MASK,
567
+ bme680_oversampling_to_reg(data->oversampling_press));
568568 ret = regmap_write_bits(data->regmap, BME680_REG_CTRL_MEAS,
569
- BME680_OSRS_TEMP_MASK |
570
- BME680_OSRS_PRESS_MASK,
569
+ BME680_OSRS_TEMP_MASK | BME680_OSRS_PRESS_MASK,
571570 osrs);
572571 if (ret < 0)
573572 dev_err(dev, "failed to write ctrl_meas register\n");
....@@ -595,14 +594,15 @@
595594 /* set target heating duration */
596595 ret = regmap_write(data->regmap, BME680_REG_GAS_WAIT_0, heatr_dur);
597596 if (ret < 0) {
598
- dev_err(dev, "failted to write gas_wait_0 register\n");
597
+ dev_err(dev, "failed to write gas_wait_0 register\n");
599598 return ret;
600599 }
601600
602
- /* Selecting the runGas and NB conversion settings for the sensor */
601
+ /* Enable the gas sensor and select heater profile set-point 0 */
603602 ret = regmap_update_bits(data->regmap, BME680_REG_CTRL_GAS_1,
604603 BME680_RUN_GAS_MASK | BME680_NB_CONV_MASK,
605
- BME680_RUN_GAS_EN_BIT | BME680_NB_CONV_0_VAL);
604
+ FIELD_PREP(BME680_RUN_GAS_MASK, 1) |
605
+ FIELD_PREP(BME680_NB_CONV_MASK, 0));
606606 if (ret < 0)
607607 dev_err(dev, "failed to write ctrl_gas_1 register\n");
608608
....@@ -623,7 +623,7 @@
623623 return ret;
624624
625625 ret = regmap_bulk_read(data->regmap, BME680_REG_TEMP_MSB,
626
- (u8 *) &tmp, 3);
626
+ &tmp, 3);
627627 if (ret < 0) {
628628 dev_err(dev, "failed to read temperature\n");
629629 return ret;
....@@ -664,7 +664,7 @@
664664 return ret;
665665
666666 ret = regmap_bulk_read(data->regmap, BME680_REG_PRESS_MSB,
667
- (u8 *) &tmp, 3);
667
+ &tmp, 3);
668668 if (ret < 0) {
669669 dev_err(dev, "failed to read pressure\n");
670670 return ret;
....@@ -697,7 +697,7 @@
697697 return ret;
698698
699699 ret = regmap_bulk_read(data->regmap, BM6880_REG_HUMIDITY_MSB,
700
- (u8 *) &tmp, 2);
700
+ &tmp, sizeof(tmp));
701701 if (ret < 0) {
702702 dev_err(dev, "failed to read humidity\n");
703703 return ret;
....@@ -762,7 +762,7 @@
762762 }
763763
764764 ret = regmap_bulk_read(data->regmap, BME680_REG_GAS_MSB,
765
- (u8 *) &tmp, 2);
765
+ &tmp, sizeof(tmp));
766766 if (ret < 0) {
767767 dev_err(dev, "failed to read gas resistance\n");
768768 return ret;
....@@ -798,13 +798,13 @@
798798 case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
799799 switch (chan->type) {
800800 case IIO_TEMP:
801
- *val = 1 << data->oversampling_temp;
801
+ *val = data->oversampling_temp;
802802 return IIO_VAL_INT;
803803 case IIO_PRESSURE:
804
- *val = 1 << data->oversampling_press;
804
+ *val = data->oversampling_press;
805805 return IIO_VAL_INT;
806806 case IIO_HUMIDITYRELATIVE:
807
- *val = 1 << data->oversampling_humid;
807
+ *val = data->oversampling_humid;
808808 return IIO_VAL_INT;
809809 default:
810810 return -EINVAL;
....@@ -814,52 +814,9 @@
814814 }
815815 }
816816
817
-static int bme680_write_oversampling_ratio_temp(struct bme680_data *data,
818
- int val)
817
+static bool bme680_is_valid_oversampling(int rate)
819818 {
820
- int i;
821
-
822
- for (i = 0; i < ARRAY_SIZE(bme680_oversampling_avail); i++) {
823
- if (bme680_oversampling_avail[i] == val) {
824
- data->oversampling_temp = ilog2(val);
825
-
826
- return bme680_chip_config(data);
827
- }
828
- }
829
-
830
- return -EINVAL;
831
-}
832
-
833
-static int bme680_write_oversampling_ratio_press(struct bme680_data *data,
834
- int val)
835
-{
836
- int i;
837
-
838
- for (i = 0; i < ARRAY_SIZE(bme680_oversampling_avail); i++) {
839
- if (bme680_oversampling_avail[i] == val) {
840
- data->oversampling_press = ilog2(val);
841
-
842
- return bme680_chip_config(data);
843
- }
844
- }
845
-
846
- return -EINVAL;
847
-}
848
-
849
-static int bme680_write_oversampling_ratio_humid(struct bme680_data *data,
850
- int val)
851
-{
852
- int i;
853
-
854
- for (i = 0; i < ARRAY_SIZE(bme680_oversampling_avail); i++) {
855
- if (bme680_oversampling_avail[i] == val) {
856
- data->oversampling_humid = ilog2(val);
857
-
858
- return bme680_chip_config(data);
859
- }
860
- }
861
-
862
- return -EINVAL;
819
+ return (rate > 0 && rate <= 16 && is_power_of_2(rate));
863820 }
864821
865822 static int bme680_write_raw(struct iio_dev *indio_dev,
....@@ -868,18 +825,31 @@
868825 {
869826 struct bme680_data *data = iio_priv(indio_dev);
870827
828
+ if (val2 != 0)
829
+ return -EINVAL;
830
+
871831 switch (mask) {
872832 case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
833
+ {
834
+ if (!bme680_is_valid_oversampling(val))
835
+ return -EINVAL;
836
+
873837 switch (chan->type) {
874838 case IIO_TEMP:
875
- return bme680_write_oversampling_ratio_temp(data, val);
839
+ data->oversampling_temp = val;
840
+ break;
876841 case IIO_PRESSURE:
877
- return bme680_write_oversampling_ratio_press(data, val);
842
+ data->oversampling_press = val;
843
+ break;
878844 case IIO_HUMIDITYRELATIVE:
879
- return bme680_write_oversampling_ratio_humid(data, val);
845
+ data->oversampling_humid = val;
846
+ break;
880847 default:
881848 return -EINVAL;
882849 }
850
+
851
+ return bme680_chip_config(data);
852
+ }
883853 default:
884854 return -EINVAL;
885855 }
....@@ -953,7 +923,6 @@
953923 data = iio_priv(indio_dev);
954924 dev_set_drvdata(dev, indio_dev);
955925 data->regmap = regmap;
956
- indio_dev->dev.parent = dev;
957926 indio_dev->name = name;
958927 indio_dev->channels = bme680_channels;
959928 indio_dev->num_channels = ARRAY_SIZE(bme680_channels);
....@@ -961,9 +930,9 @@
961930 indio_dev->modes = INDIO_DIRECT_MODE;
962931
963932 /* default values for the sensor */
964
- data->oversampling_humid = ilog2(2); /* 2X oversampling rate */
965
- data->oversampling_press = ilog2(4); /* 4X oversampling rate */
966
- data->oversampling_temp = ilog2(8); /* 8X oversampling rate */
933
+ data->oversampling_humid = 2; /* 2X oversampling rate */
934
+ data->oversampling_press = 4; /* 4X oversampling rate */
935
+ data->oversampling_temp = 8; /* 8X oversampling rate */
967936 data->heater_temp = 320; /* degree Celsius */
968937 data->heater_dur = 150; /* milliseconds */
969938