Linux 6.7-rc7
[linux-modified.git] / drivers / iio / humidity / hts221_core.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * STMicroelectronics hts221 sensor driver
4  *
5  * Copyright 2016 STMicroelectronics Inc.
6  *
7  * Lorenzo Bianconi <lorenzo.bianconi@st.com>
8  */
9
10 #include <linux/kernel.h>
11 #include <linux/module.h>
12 #include <linux/device.h>
13 #include <linux/iio/sysfs.h>
14 #include <linux/delay.h>
15 #include <linux/pm.h>
16 #include <linux/regmap.h>
17 #include <linux/regulator/consumer.h>
18 #include <linux/bitfield.h>
19
20 #include "hts221.h"
21
22 #define HTS221_REG_WHOAMI_ADDR          0x0f
23 #define HTS221_REG_WHOAMI_VAL           0xbc
24
25 #define HTS221_REG_CNTRL1_ADDR          0x20
26 #define HTS221_REG_CNTRL2_ADDR          0x21
27
28 #define HTS221_ODR_MASK                 0x03
29 #define HTS221_BDU_MASK                 BIT(2)
30 #define HTS221_ENABLE_MASK              BIT(7)
31
32 /* calibration registers */
33 #define HTS221_REG_0RH_CAL_X_H          0x36
34 #define HTS221_REG_1RH_CAL_X_H          0x3a
35 #define HTS221_REG_0RH_CAL_Y_H          0x30
36 #define HTS221_REG_1RH_CAL_Y_H          0x31
37 #define HTS221_REG_0T_CAL_X_L           0x3c
38 #define HTS221_REG_1T_CAL_X_L           0x3e
39 #define HTS221_REG_0T_CAL_Y_H           0x32
40 #define HTS221_REG_1T_CAL_Y_H           0x33
41 #define HTS221_REG_T1_T0_CAL_Y_H        0x35
42
43 struct hts221_odr {
44         u8 hz;
45         u8 val;
46 };
47
48 #define HTS221_AVG_DEPTH                8
49 struct hts221_avg {
50         u8 addr;
51         u8 mask;
52         u16 avg_avl[HTS221_AVG_DEPTH];
53 };
54
55 static const struct hts221_odr hts221_odr_table[] = {
56         {  1, 0x01 },   /* 1Hz */
57         {  7, 0x02 },   /* 7Hz */
58         { 13, 0x03 },   /* 12.5Hz */
59 };
60
61 static const struct hts221_avg hts221_avg_list[] = {
62         {
63                 .addr = 0x10,
64                 .mask = 0x07,
65                 .avg_avl = {
66                         4, /* 0.4 %RH */
67                         8, /* 0.3 %RH */
68                         16, /* 0.2 %RH */
69                         32, /* 0.15 %RH */
70                         64, /* 0.1 %RH */
71                         128, /* 0.07 %RH */
72                         256, /* 0.05 %RH */
73                         512, /* 0.03 %RH */
74                 },
75         },
76         {
77                 .addr = 0x10,
78                 .mask = 0x38,
79                 .avg_avl = {
80                         2, /* 0.08 degC */
81                         4, /* 0.05 degC */
82                         8, /* 0.04 degC */
83                         16, /* 0.03 degC */
84                         32, /* 0.02 degC */
85                         64, /* 0.015 degC */
86                         128, /* 0.01 degC */
87                         256, /* 0.007 degC */
88                 },
89         },
90 };
91
92 static const struct iio_chan_spec hts221_channels[] = {
93         {
94                 .type = IIO_HUMIDITYRELATIVE,
95                 .address = 0x28,
96                 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
97                                       BIT(IIO_CHAN_INFO_OFFSET) |
98                                       BIT(IIO_CHAN_INFO_SCALE) |
99                                       BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO),
100                 .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
101                 .scan_index = 0,
102                 .scan_type = {
103                         .sign = 's',
104                         .realbits = 16,
105                         .storagebits = 16,
106                         .endianness = IIO_LE,
107                 },
108         },
109         {
110                 .type = IIO_TEMP,
111                 .address = 0x2a,
112                 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
113                                       BIT(IIO_CHAN_INFO_OFFSET) |
114                                       BIT(IIO_CHAN_INFO_SCALE) |
115                                       BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO),
116                 .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
117                 .scan_index = 1,
118                 .scan_type = {
119                         .sign = 's',
120                         .realbits = 16,
121                         .storagebits = 16,
122                         .endianness = IIO_LE,
123                 },
124         },
125         IIO_CHAN_SOFT_TIMESTAMP(2),
126 };
127
128 static int hts221_check_whoami(struct hts221_hw *hw)
129 {
130         int err, data;
131
132         err = regmap_read(hw->regmap, HTS221_REG_WHOAMI_ADDR, &data);
133         if (err < 0) {
134                 dev_err(hw->dev, "failed to read whoami register\n");
135                 return err;
136         }
137
138         if (data != HTS221_REG_WHOAMI_VAL) {
139                 dev_err(hw->dev, "wrong whoami {%02x vs %02x}\n",
140                         data, HTS221_REG_WHOAMI_VAL);
141                 return -ENODEV;
142         }
143
144         return 0;
145 }
146
147 static int hts221_update_odr(struct hts221_hw *hw, u8 odr)
148 {
149         int i, err;
150
151         for (i = 0; i < ARRAY_SIZE(hts221_odr_table); i++)
152                 if (hts221_odr_table[i].hz == odr)
153                         break;
154
155         if (i == ARRAY_SIZE(hts221_odr_table))
156                 return -EINVAL;
157
158         err = regmap_update_bits(hw->regmap, HTS221_REG_CNTRL1_ADDR,
159                                  HTS221_ODR_MASK,
160                                  FIELD_PREP(HTS221_ODR_MASK,
161                                             hts221_odr_table[i].val));
162         if (err < 0)
163                 return err;
164
165         hw->odr = odr;
166
167         return 0;
168 }
169
170 static int hts221_update_avg(struct hts221_hw *hw,
171                              enum hts221_sensor_type type,
172                              u16 val)
173 {
174         const struct hts221_avg *avg = &hts221_avg_list[type];
175         int i, err, data;
176
177         for (i = 0; i < HTS221_AVG_DEPTH; i++)
178                 if (avg->avg_avl[i] == val)
179                         break;
180
181         if (i == HTS221_AVG_DEPTH)
182                 return -EINVAL;
183
184         data = ((i << __ffs(avg->mask)) & avg->mask);
185         err = regmap_update_bits(hw->regmap, avg->addr,
186                                  avg->mask, data);
187         if (err < 0)
188                 return err;
189
190         hw->sensors[type].cur_avg_idx = i;
191
192         return 0;
193 }
194
195 static ssize_t hts221_sysfs_sampling_freq(struct device *dev,
196                                           struct device_attribute *attr,
197                                           char *buf)
198 {
199         int i;
200         ssize_t len = 0;
201
202         for (i = 0; i < ARRAY_SIZE(hts221_odr_table); i++)
203                 len += scnprintf(buf + len, PAGE_SIZE - len, "%d ",
204                                  hts221_odr_table[i].hz);
205         buf[len - 1] = '\n';
206
207         return len;
208 }
209
210 static ssize_t
211 hts221_sysfs_rh_oversampling_avail(struct device *dev,
212                                    struct device_attribute *attr,
213                                    char *buf)
214 {
215         const struct hts221_avg *avg = &hts221_avg_list[HTS221_SENSOR_H];
216         ssize_t len = 0;
217         int i;
218
219         for (i = 0; i < ARRAY_SIZE(avg->avg_avl); i++)
220                 len += scnprintf(buf + len, PAGE_SIZE - len, "%d ",
221                                  avg->avg_avl[i]);
222         buf[len - 1] = '\n';
223
224         return len;
225 }
226
227 static ssize_t
228 hts221_sysfs_temp_oversampling_avail(struct device *dev,
229                                      struct device_attribute *attr,
230                                      char *buf)
231 {
232         const struct hts221_avg *avg = &hts221_avg_list[HTS221_SENSOR_T];
233         ssize_t len = 0;
234         int i;
235
236         for (i = 0; i < ARRAY_SIZE(avg->avg_avl); i++)
237                 len += scnprintf(buf + len, PAGE_SIZE - len, "%d ",
238                                  avg->avg_avl[i]);
239         buf[len - 1] = '\n';
240
241         return len;
242 }
243
244 int hts221_set_enable(struct hts221_hw *hw, bool enable)
245 {
246         int err;
247
248         err = regmap_update_bits(hw->regmap, HTS221_REG_CNTRL1_ADDR,
249                                  HTS221_ENABLE_MASK,
250                                  FIELD_PREP(HTS221_ENABLE_MASK, enable));
251         if (err < 0)
252                 return err;
253
254         hw->enabled = enable;
255
256         return 0;
257 }
258
259 static int hts221_parse_temp_caldata(struct hts221_hw *hw)
260 {
261         int err, *slope, *b_gen, cal0, cal1;
262         s16 cal_x0, cal_x1, cal_y0, cal_y1;
263         __le16 val;
264
265         err = regmap_read(hw->regmap, HTS221_REG_0T_CAL_Y_H, &cal0);
266         if (err < 0)
267                 return err;
268
269         err = regmap_read(hw->regmap, HTS221_REG_T1_T0_CAL_Y_H, &cal1);
270         if (err < 0)
271                 return err;
272         cal_y0 = ((cal1 & 0x3) << 8) | cal0;
273
274         err = regmap_read(hw->regmap, HTS221_REG_1T_CAL_Y_H, &cal0);
275         if (err < 0)
276                 return err;
277         cal_y1 = (((cal1 & 0xc) >> 2) << 8) | cal0;
278
279         err = regmap_bulk_read(hw->regmap, HTS221_REG_0T_CAL_X_L,
280                                &val, sizeof(val));
281         if (err < 0)
282                 return err;
283         cal_x0 = le16_to_cpu(val);
284
285         err = regmap_bulk_read(hw->regmap, HTS221_REG_1T_CAL_X_L,
286                                &val, sizeof(val));
287         if (err < 0)
288                 return err;
289         cal_x1 = le16_to_cpu(val);
290
291         slope = &hw->sensors[HTS221_SENSOR_T].slope;
292         b_gen = &hw->sensors[HTS221_SENSOR_T].b_gen;
293
294         *slope = ((cal_y1 - cal_y0) * 8000) / (cal_x1 - cal_x0);
295         *b_gen = (((s32)cal_x1 * cal_y0 - (s32)cal_x0 * cal_y1) * 1000) /
296                  (cal_x1 - cal_x0);
297         *b_gen *= 8;
298
299         return 0;
300 }
301
302 static int hts221_parse_rh_caldata(struct hts221_hw *hw)
303 {
304         int err, *slope, *b_gen, data;
305         s16 cal_x0, cal_x1, cal_y0, cal_y1;
306         __le16 val;
307
308         err = regmap_read(hw->regmap, HTS221_REG_0RH_CAL_Y_H, &data);
309         if (err < 0)
310                 return err;
311         cal_y0 = data;
312
313         err = regmap_read(hw->regmap, HTS221_REG_1RH_CAL_Y_H, &data);
314         if (err < 0)
315                 return err;
316         cal_y1 = data;
317
318         err = regmap_bulk_read(hw->regmap, HTS221_REG_0RH_CAL_X_H,
319                                &val, sizeof(val));
320         if (err < 0)
321                 return err;
322         cal_x0 = le16_to_cpu(val);
323
324         err = regmap_bulk_read(hw->regmap, HTS221_REG_1RH_CAL_X_H,
325                                &val, sizeof(val));
326         if (err < 0)
327                 return err;
328         cal_x1 = le16_to_cpu(val);
329
330         slope = &hw->sensors[HTS221_SENSOR_H].slope;
331         b_gen = &hw->sensors[HTS221_SENSOR_H].b_gen;
332
333         *slope = ((cal_y1 - cal_y0) * 8000) / (cal_x1 - cal_x0);
334         *b_gen = (((s32)cal_x1 * cal_y0 - (s32)cal_x0 * cal_y1) * 1000) /
335                  (cal_x1 - cal_x0);
336         *b_gen *= 8;
337
338         return 0;
339 }
340
341 static int hts221_get_sensor_scale(struct hts221_hw *hw,
342                                    enum iio_chan_type ch_type,
343                                    int *val, int *val2)
344 {
345         s64 tmp;
346         s32 rem, div, data;
347
348         switch (ch_type) {
349         case IIO_HUMIDITYRELATIVE:
350                 data = hw->sensors[HTS221_SENSOR_H].slope;
351                 div = (1 << 4) * 1000;
352                 break;
353         case IIO_TEMP:
354                 data = hw->sensors[HTS221_SENSOR_T].slope;
355                 div = (1 << 6) * 1000;
356                 break;
357         default:
358                 return -EINVAL;
359         }
360
361         tmp = div_s64(data * 1000000000LL, div);
362         tmp = div_s64_rem(tmp, 1000000000LL, &rem);
363
364         *val = tmp;
365         *val2 = rem;
366
367         return IIO_VAL_INT_PLUS_NANO;
368 }
369
370 static int hts221_get_sensor_offset(struct hts221_hw *hw,
371                                     enum iio_chan_type ch_type,
372                                     int *val, int *val2)
373 {
374         s64 tmp;
375         s32 rem, div, data;
376
377         switch (ch_type) {
378         case IIO_HUMIDITYRELATIVE:
379                 data = hw->sensors[HTS221_SENSOR_H].b_gen;
380                 div = hw->sensors[HTS221_SENSOR_H].slope;
381                 break;
382         case IIO_TEMP:
383                 data = hw->sensors[HTS221_SENSOR_T].b_gen;
384                 div = hw->sensors[HTS221_SENSOR_T].slope;
385                 break;
386         default:
387                 return -EINVAL;
388         }
389
390         tmp = div_s64(data * 1000000000LL, div);
391         tmp = div_s64_rem(tmp, 1000000000LL, &rem);
392
393         *val = tmp;
394         *val2 = rem;
395
396         return IIO_VAL_INT_PLUS_NANO;
397 }
398
399 static int hts221_read_oneshot(struct hts221_hw *hw, u8 addr, int *val)
400 {
401         __le16 data;
402         int err;
403
404         err = hts221_set_enable(hw, true);
405         if (err < 0)
406                 return err;
407
408         msleep(50);
409
410         err = regmap_bulk_read(hw->regmap, addr, &data, sizeof(data));
411         if (err < 0)
412                 return err;
413
414         hts221_set_enable(hw, false);
415
416         *val = (s16)le16_to_cpu(data);
417
418         return IIO_VAL_INT;
419 }
420
421 static int hts221_read_raw(struct iio_dev *iio_dev,
422                            struct iio_chan_spec const *ch,
423                            int *val, int *val2, long mask)
424 {
425         struct hts221_hw *hw = iio_priv(iio_dev);
426         int ret;
427
428         ret = iio_device_claim_direct_mode(iio_dev);
429         if (ret)
430                 return ret;
431
432         switch (mask) {
433         case IIO_CHAN_INFO_RAW:
434                 ret = hts221_read_oneshot(hw, ch->address, val);
435                 break;
436         case IIO_CHAN_INFO_SCALE:
437                 ret = hts221_get_sensor_scale(hw, ch->type, val, val2);
438                 break;
439         case IIO_CHAN_INFO_OFFSET:
440                 ret = hts221_get_sensor_offset(hw, ch->type, val, val2);
441                 break;
442         case IIO_CHAN_INFO_SAMP_FREQ:
443                 *val = hw->odr;
444                 ret = IIO_VAL_INT;
445                 break;
446         case IIO_CHAN_INFO_OVERSAMPLING_RATIO: {
447                 u8 idx;
448                 const struct hts221_avg *avg;
449
450                 switch (ch->type) {
451                 case IIO_HUMIDITYRELATIVE:
452                         avg = &hts221_avg_list[HTS221_SENSOR_H];
453                         idx = hw->sensors[HTS221_SENSOR_H].cur_avg_idx;
454                         *val = avg->avg_avl[idx];
455                         ret = IIO_VAL_INT;
456                         break;
457                 case IIO_TEMP:
458                         avg = &hts221_avg_list[HTS221_SENSOR_T];
459                         idx = hw->sensors[HTS221_SENSOR_T].cur_avg_idx;
460                         *val = avg->avg_avl[idx];
461                         ret = IIO_VAL_INT;
462                         break;
463                 default:
464                         ret = -EINVAL;
465                         break;
466                 }
467                 break;
468         }
469         default:
470                 ret = -EINVAL;
471                 break;
472         }
473
474         iio_device_release_direct_mode(iio_dev);
475
476         return ret;
477 }
478
479 static int hts221_write_raw(struct iio_dev *iio_dev,
480                             struct iio_chan_spec const *chan,
481                             int val, int val2, long mask)
482 {
483         struct hts221_hw *hw = iio_priv(iio_dev);
484         int ret;
485
486         ret = iio_device_claim_direct_mode(iio_dev);
487         if (ret)
488                 return ret;
489
490         switch (mask) {
491         case IIO_CHAN_INFO_SAMP_FREQ:
492                 ret = hts221_update_odr(hw, val);
493                 break;
494         case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
495                 switch (chan->type) {
496                 case IIO_HUMIDITYRELATIVE:
497                         ret = hts221_update_avg(hw, HTS221_SENSOR_H, val);
498                         break;
499                 case IIO_TEMP:
500                         ret = hts221_update_avg(hw, HTS221_SENSOR_T, val);
501                         break;
502                 default:
503                         ret = -EINVAL;
504                         break;
505                 }
506                 break;
507         default:
508                 ret = -EINVAL;
509                 break;
510         }
511
512         iio_device_release_direct_mode(iio_dev);
513
514         return ret;
515 }
516
517 static int hts221_validate_trigger(struct iio_dev *iio_dev,
518                                    struct iio_trigger *trig)
519 {
520         struct hts221_hw *hw = iio_priv(iio_dev);
521
522         return hw->trig == trig ? 0 : -EINVAL;
523 }
524
525 static IIO_DEVICE_ATTR(in_humidity_oversampling_ratio_available, S_IRUGO,
526                        hts221_sysfs_rh_oversampling_avail, NULL, 0);
527 static IIO_DEVICE_ATTR(in_temp_oversampling_ratio_available, S_IRUGO,
528                        hts221_sysfs_temp_oversampling_avail, NULL, 0);
529 static IIO_DEV_ATTR_SAMP_FREQ_AVAIL(hts221_sysfs_sampling_freq);
530
531 static struct attribute *hts221_attributes[] = {
532         &iio_dev_attr_sampling_frequency_available.dev_attr.attr,
533         &iio_dev_attr_in_humidity_oversampling_ratio_available.dev_attr.attr,
534         &iio_dev_attr_in_temp_oversampling_ratio_available.dev_attr.attr,
535         NULL,
536 };
537
538 static const struct attribute_group hts221_attribute_group = {
539         .attrs = hts221_attributes,
540 };
541
542 static const struct iio_info hts221_info = {
543         .attrs = &hts221_attribute_group,
544         .read_raw = hts221_read_raw,
545         .write_raw = hts221_write_raw,
546         .validate_trigger = hts221_validate_trigger,
547 };
548
549 static const unsigned long hts221_scan_masks[] = {0x3, 0x0};
550
551 static int hts221_init_regulators(struct device *dev)
552 {
553         int err;
554
555         err = devm_regulator_get_enable(dev, "vdd");
556         if (err)
557                 return dev_err_probe(dev, err, "failed to get vdd regulator\n");
558
559         msleep(50);
560
561         return 0;
562 }
563
564 int hts221_probe(struct device *dev, int irq, const char *name,
565                  struct regmap *regmap)
566 {
567         struct iio_dev *iio_dev;
568         struct hts221_hw *hw;
569         int err;
570         u8 data;
571
572         iio_dev = devm_iio_device_alloc(dev, sizeof(*hw));
573         if (!iio_dev)
574                 return -ENOMEM;
575
576         dev_set_drvdata(dev, (void *)iio_dev);
577
578         hw = iio_priv(iio_dev);
579         hw->name = name;
580         hw->dev = dev;
581         hw->irq = irq;
582         hw->regmap = regmap;
583
584         err = hts221_init_regulators(dev);
585         if (err)
586                 return err;
587
588         err = hts221_check_whoami(hw);
589         if (err < 0)
590                 return err;
591
592         iio_dev->modes = INDIO_DIRECT_MODE;
593         iio_dev->available_scan_masks = hts221_scan_masks;
594         iio_dev->channels = hts221_channels;
595         iio_dev->num_channels = ARRAY_SIZE(hts221_channels);
596         iio_dev->name = HTS221_DEV_NAME;
597         iio_dev->info = &hts221_info;
598
599         /* enable Block Data Update */
600         err = regmap_update_bits(hw->regmap, HTS221_REG_CNTRL1_ADDR,
601                                  HTS221_BDU_MASK,
602                                  FIELD_PREP(HTS221_BDU_MASK, 1));
603         if (err < 0)
604                 return err;
605
606         err = hts221_update_odr(hw, hts221_odr_table[0].hz);
607         if (err < 0)
608                 return err;
609
610         /* configure humidity sensor */
611         err = hts221_parse_rh_caldata(hw);
612         if (err < 0) {
613                 dev_err(hw->dev, "failed to get rh calibration data\n");
614                 return err;
615         }
616
617         data = hts221_avg_list[HTS221_SENSOR_H].avg_avl[3];
618         err = hts221_update_avg(hw, HTS221_SENSOR_H, data);
619         if (err < 0) {
620                 dev_err(hw->dev, "failed to set rh oversampling ratio\n");
621                 return err;
622         }
623
624         /* configure temperature sensor */
625         err = hts221_parse_temp_caldata(hw);
626         if (err < 0) {
627                 dev_err(hw->dev,
628                         "failed to get temperature calibration data\n");
629                 return err;
630         }
631
632         data = hts221_avg_list[HTS221_SENSOR_T].avg_avl[3];
633         err = hts221_update_avg(hw, HTS221_SENSOR_T, data);
634         if (err < 0) {
635                 dev_err(hw->dev,
636                         "failed to set temperature oversampling ratio\n");
637                 return err;
638         }
639
640         if (hw->irq > 0) {
641                 err = hts221_allocate_buffers(iio_dev);
642                 if (err < 0)
643                         return err;
644
645                 err = hts221_allocate_trigger(iio_dev);
646                 if (err)
647                         return err;
648         }
649
650         return devm_iio_device_register(hw->dev, iio_dev);
651 }
652 EXPORT_SYMBOL_NS(hts221_probe, IIO_HTS221);
653
654 static int hts221_suspend(struct device *dev)
655 {
656         struct iio_dev *iio_dev = dev_get_drvdata(dev);
657         struct hts221_hw *hw = iio_priv(iio_dev);
658
659         return regmap_update_bits(hw->regmap, HTS221_REG_CNTRL1_ADDR,
660                                   HTS221_ENABLE_MASK,
661                                   FIELD_PREP(HTS221_ENABLE_MASK, false));
662 }
663
664 static int hts221_resume(struct device *dev)
665 {
666         struct iio_dev *iio_dev = dev_get_drvdata(dev);
667         struct hts221_hw *hw = iio_priv(iio_dev);
668         int err = 0;
669
670         if (hw->enabled)
671                 err = regmap_update_bits(hw->regmap, HTS221_REG_CNTRL1_ADDR,
672                                          HTS221_ENABLE_MASK,
673                                          FIELD_PREP(HTS221_ENABLE_MASK,
674                                                     true));
675         return err;
676 }
677
678 EXPORT_NS_SIMPLE_DEV_PM_OPS(hts221_pm_ops, hts221_suspend, hts221_resume,
679                             IIO_HTS221);
680
681 MODULE_AUTHOR("Lorenzo Bianconi <lorenzo.bianconi@st.com>");
682 MODULE_DESCRIPTION("STMicroelectronics hts221 sensor driver");
683 MODULE_LICENSE("GPL v2");