50
50
#define ATLAS_REG_PH_CALIB_STATUS_MID BIT(1)
51
51
#define ATLAS_REG_PH_CALIB_STATUS_HIGH BIT(2)
52
52
53
+ #define ATLAS_REG_EC_CALIB_STATUS 0x0f
54
+ #define ATLAS_REG_EC_CALIB_STATUS_MASK 0x0f
55
+ #define ATLAS_REG_EC_CALIB_STATUS_DRY BIT(0)
56
+ #define ATLAS_REG_EC_CALIB_STATUS_SINGLE BIT(1)
57
+ #define ATLAS_REG_EC_CALIB_STATUS_LOW BIT(2)
58
+ #define ATLAS_REG_EC_CALIB_STATUS_HIGH BIT(3)
59
+
53
60
#define ATLAS_REG_PH_TEMP_DATA 0x0e
54
61
#define ATLAS_REG_PH_DATA 0x16
55
62
63
+ #define ATLAS_REG_EC_PROBE 0x08
64
+ #define ATLAS_REG_EC_TEMP_DATA 0x10
65
+ #define ATLAS_REG_EC_DATA 0x18
66
+ #define ATLAS_REG_TDS_DATA 0x1c
67
+ #define ATLAS_REG_PSS_DATA 0x20
68
+
56
69
#define ATLAS_PH_INT_TIME_IN_US 450000
70
+ #define ATLAS_EC_INT_TIME_IN_US 650000
57
71
58
72
enum {
59
73
ATLAS_PH_SM ,
74
+ ATLAS_EC_SM ,
60
75
};
61
76
62
77
struct atlas_data {
@@ -66,12 +81,13 @@ struct atlas_data {
66
81
struct regmap * regmap ;
67
82
struct irq_work work ;
68
83
69
- __be32 buffer [4 ]; /* 32 -bit pH data + 32-bit pad + 64-bit timestamp */
84
+ __be32 buffer [6 ]; /* 96 -bit data + 32-bit pad + 64-bit timestamp */
70
85
};
71
86
72
87
static const struct regmap_range atlas_volatile_ranges [] = {
73
88
regmap_reg_range (ATLAS_REG_INT_CONTROL , ATLAS_REG_INT_CONTROL ),
74
89
regmap_reg_range (ATLAS_REG_PH_DATA , ATLAS_REG_PH_DATA + 4 ),
90
+ regmap_reg_range (ATLAS_REG_EC_DATA , ATLAS_REG_PSS_DATA + 4 ),
75
91
};
76
92
77
93
static const struct regmap_access_table atlas_volatile_table = {
@@ -86,7 +102,7 @@ static const struct regmap_config atlas_regmap_config = {
86
102
.val_bits = 8 ,
87
103
88
104
.volatile_table = & atlas_volatile_table ,
89
- .max_register = ATLAS_REG_PH_DATA + 4 ,
105
+ .max_register = ATLAS_REG_PSS_DATA + 4 ,
90
106
.cache_type = REGCACHE_RBTREE ,
91
107
};
92
108
@@ -115,6 +131,50 @@ static const struct iio_chan_spec atlas_ph_channels[] = {
115
131
},
116
132
};
117
133
134
+ #define ATLAS_EC_CHANNEL (_idx , _addr ) \
135
+ {\
136
+ .type = IIO_CONCENTRATION, \
137
+ .indexed = 1, \
138
+ .channel = _idx, \
139
+ .address = _addr, \
140
+ .info_mask_separate = \
141
+ BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE), \
142
+ .scan_index = _idx + 1, \
143
+ .scan_type = { \
144
+ .sign = 'u', \
145
+ .realbits = 32, \
146
+ .storagebits = 32, \
147
+ .endianness = IIO_BE, \
148
+ }, \
149
+ }
150
+
151
+ static const struct iio_chan_spec atlas_ec_channels [] = {
152
+ {
153
+ .type = IIO_ELECTRICALCONDUCTIVITY ,
154
+ .address = ATLAS_REG_EC_DATA ,
155
+ .info_mask_separate =
156
+ BIT (IIO_CHAN_INFO_RAW ) | BIT (IIO_CHAN_INFO_SCALE ),
157
+ .scan_index = 0 ,
158
+ .scan_type = {
159
+ .sign = 'u' ,
160
+ .realbits = 32 ,
161
+ .storagebits = 32 ,
162
+ .endianness = IIO_BE ,
163
+ },
164
+ },
165
+ ATLAS_EC_CHANNEL (0 , ATLAS_REG_TDS_DATA ),
166
+ ATLAS_EC_CHANNEL (1 , ATLAS_REG_PSS_DATA ),
167
+ IIO_CHAN_SOFT_TIMESTAMP (3 ),
168
+ {
169
+ .type = IIO_TEMP ,
170
+ .address = ATLAS_REG_EC_TEMP_DATA ,
171
+ .info_mask_separate =
172
+ BIT (IIO_CHAN_INFO_RAW ) | BIT (IIO_CHAN_INFO_SCALE ),
173
+ .output = 1 ,
174
+ .scan_index = -1
175
+ },
176
+ };
177
+
118
178
static int atlas_check_ph_calibration (struct atlas_data * data )
119
179
{
120
180
struct device * dev = & data -> client -> dev ;
@@ -142,6 +202,44 @@ static int atlas_check_ph_calibration(struct atlas_data *data)
142
202
return 0 ;
143
203
}
144
204
205
+ static int atlas_check_ec_calibration (struct atlas_data * data )
206
+ {
207
+ struct device * dev = & data -> client -> dev ;
208
+ int ret ;
209
+ unsigned int val ;
210
+
211
+ ret = regmap_bulk_read (data -> regmap , ATLAS_REG_EC_PROBE , & val , 2 );
212
+ if (ret )
213
+ return ret ;
214
+
215
+ dev_info (dev , "probe set to K = %d.%.2d" , be16_to_cpu (val ) / 100 ,
216
+ be16_to_cpu (val ) % 100 );
217
+
218
+ ret = regmap_read (data -> regmap , ATLAS_REG_EC_CALIB_STATUS , & val );
219
+ if (ret )
220
+ return ret ;
221
+
222
+ if (!(val & ATLAS_REG_EC_CALIB_STATUS_MASK )) {
223
+ dev_warn (dev , "device has not been calibrated\n" );
224
+ return 0 ;
225
+ }
226
+
227
+ if (!(val & ATLAS_REG_EC_CALIB_STATUS_DRY ))
228
+ dev_warn (dev , "device missing dry point calibration\n" );
229
+
230
+ if (val & ATLAS_REG_EC_CALIB_STATUS_SINGLE ) {
231
+ dev_warn (dev , "device using single point calibration\n" );
232
+ } else {
233
+ if (!(val & ATLAS_REG_EC_CALIB_STATUS_LOW ))
234
+ dev_warn (dev , "device missing low point calibration\n" );
235
+
236
+ if (!(val & ATLAS_REG_EC_CALIB_STATUS_HIGH ))
237
+ dev_warn (dev , "device missing high point calibration\n" );
238
+ }
239
+
240
+ return 0 ;
241
+ }
242
+
145
243
struct atlas_device {
146
244
const struct iio_chan_spec * channels ;
147
245
int num_channels ;
@@ -159,6 +257,14 @@ static struct atlas_device atlas_devices[] = {
159
257
.calibration = & atlas_check_ph_calibration ,
160
258
.delay = ATLAS_PH_INT_TIME_IN_US ,
161
259
},
260
+ [ATLAS_EC_SM ] = {
261
+ .channels = atlas_ec_channels ,
262
+ .num_channels = 5 ,
263
+ .data_reg = ATLAS_REG_EC_DATA ,
264
+ .calibration = & atlas_check_ec_calibration ,
265
+ .delay = ATLAS_EC_INT_TIME_IN_US ,
266
+ },
267
+
162
268
};
163
269
164
270
static int atlas_set_powermode (struct atlas_data * data , int on )
@@ -294,6 +400,8 @@ static int atlas_read_raw(struct iio_dev *indio_dev,
294
400
(u8 * ) & reg , sizeof (reg ));
295
401
break ;
296
402
case IIO_PH :
403
+ case IIO_CONCENTRATION :
404
+ case IIO_ELECTRICALCONDUCTIVITY :
297
405
mutex_lock (& indio_dev -> mlock );
298
406
299
407
if (iio_buffer_enabled (indio_dev ))
@@ -324,6 +432,14 @@ static int atlas_read_raw(struct iio_dev *indio_dev,
324
432
* val = 1 ; /* 0.001 */
325
433
* val2 = 1000 ;
326
434
break ;
435
+ case IIO_ELECTRICALCONDUCTIVITY :
436
+ * val = 1 ; /* 0.00001 */
437
+ * val = 100000 ;
438
+ break ;
439
+ case IIO_CONCENTRATION :
440
+ * val = 0 ; /* 0.000000001 */
441
+ * val2 = 1000 ;
442
+ return IIO_VAL_INT_PLUS_NANO ;
327
443
default :
328
444
return - EINVAL ;
329
445
}
@@ -358,12 +474,14 @@ static const struct iio_info atlas_info = {
358
474
359
475
static const struct i2c_device_id atlas_id [] = {
360
476
{ "atlas-ph-sm" , ATLAS_PH_SM },
477
+ { "atlas-ec-sm" , ATLAS_EC_SM },
361
478
{}
362
479
};
363
480
MODULE_DEVICE_TABLE (i2c , atlas_id );
364
481
365
482
static const struct of_device_id atlas_dt_ids [] = {
366
483
{ .compatible = "atlas,ph-sm" , .data = (void * )ATLAS_PH_SM , },
484
+ { .compatible = "atlas,ec-sm" , .data = (void * )ATLAS_EC_SM , },
367
485
{ }
368
486
};
369
487
MODULE_DEVICE_TABLE (of , atlas_dt_ids );
0 commit comments