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