39
39
#define AS3935_AFE_GAIN_MAX 0x1F
40
40
#define AS3935_AFE_PWR_BIT BIT(0)
41
41
42
+ #define AS3935_NFLWDTH 0x01
43
+ #define AS3935_NFLWDTH_MASK 0x7f
44
+
42
45
#define AS3935_INT 0x03
43
46
#define AS3935_INT_MASK 0x0f
47
+ #define AS3935_DISTURB_INT BIT(2)
44
48
#define AS3935_EVENT_INT BIT(3)
45
49
#define AS3935_NOISE_INT BIT(0)
46
50
47
51
#define AS3935_DATA 0x07
48
52
#define AS3935_DATA_MASK 0x3F
49
53
50
54
#define AS3935_TUNE_CAP 0x08
55
+ #define AS3935_DEFAULTS 0x3C
51
56
#define AS3935_CALIBRATE 0x3D
52
57
53
58
#define AS3935_READ_DATA BIT(14)
@@ -62,7 +67,9 @@ struct as3935_state {
62
67
struct mutex lock ;
63
68
struct delayed_work work ;
64
69
70
+ unsigned long noise_tripped ;
65
71
u32 tune_cap ;
72
+ u32 nflwdth_reg ;
66
73
u8 buffer [16 ]; /* 8-bit data + 56-bit padding + 64-bit timestamp */
67
74
u8 buf [2 ] ____cacheline_aligned ;
68
75
};
@@ -145,12 +152,29 @@ static ssize_t as3935_sensor_sensitivity_store(struct device *dev,
145
152
return len ;
146
153
}
147
154
155
+ static ssize_t as3935_noise_level_tripped_show (struct device * dev ,
156
+ struct device_attribute * attr ,
157
+ char * buf )
158
+ {
159
+ struct as3935_state * st = iio_priv (dev_to_iio_dev (dev ));
160
+ int ret ;
161
+
162
+ mutex_lock (& st -> lock );
163
+ ret = sprintf (buf , "%d\n" , !time_after (jiffies , st -> noise_tripped + HZ ));
164
+ mutex_unlock (& st -> lock );
165
+
166
+ return ret ;
167
+ }
168
+
148
169
static IIO_DEVICE_ATTR (sensor_sensitivity , S_IRUGO | S_IWUSR ,
149
170
as3935_sensor_sensitivity_show , as3935_sensor_sensitivity_store , 0 ) ;
150
171
172
+ static IIO_DEVICE_ATTR (noise_level_tripped , S_IRUGO ,
173
+ as3935_noise_level_tripped_show , NULL, 0 ) ;
151
174
152
175
static struct attribute * as3935_attributes [] = {
153
176
& iio_dev_attr_sensor_sensitivity .dev_attr .attr ,
177
+ & iio_dev_attr_noise_level_tripped .dev_attr .attr ,
154
178
NULL ,
155
179
};
156
180
@@ -246,7 +270,11 @@ static void as3935_event_work(struct work_struct *work)
246
270
case AS3935_EVENT_INT :
247
271
iio_trigger_poll_chained (st -> trig );
248
272
break ;
273
+ case AS3935_DISTURB_INT :
249
274
case AS3935_NOISE_INT :
275
+ mutex_lock (& st -> lock );
276
+ st -> noise_tripped = jiffies ;
277
+ mutex_unlock (& st -> lock );
250
278
dev_warn (& st -> spi -> dev , "noise level is too high\n" );
251
279
break ;
252
280
}
@@ -269,15 +297,14 @@ static irqreturn_t as3935_interrupt_handler(int irq, void *private)
269
297
270
298
static void calibrate_as3935 (struct as3935_state * st )
271
299
{
272
- /* mask disturber interrupt bit */
273
- as3935_write (st , AS3935_INT , BIT (5 ));
274
-
300
+ as3935_write (st , AS3935_DEFAULTS , 0x96 );
275
301
as3935_write (st , AS3935_CALIBRATE , 0x96 );
276
302
as3935_write (st , AS3935_TUNE_CAP ,
277
303
BIT (5 ) | (st -> tune_cap / TUNE_CAP_DIV ));
278
304
279
305
mdelay (2 );
280
306
as3935_write (st , AS3935_TUNE_CAP , (st -> tune_cap / TUNE_CAP_DIV ));
307
+ as3935_write (st , AS3935_NFLWDTH , st -> nflwdth_reg );
281
308
}
282
309
283
310
#ifdef CONFIG_PM_SLEEP
@@ -370,6 +397,15 @@ static int as3935_probe(struct spi_device *spi)
370
397
return - EINVAL ;
371
398
}
372
399
400
+ ret = of_property_read_u32 (np ,
401
+ "ams,nflwdth" , & st -> nflwdth_reg );
402
+ if (!ret && st -> nflwdth_reg > AS3935_NFLWDTH_MASK ) {
403
+ dev_err (& spi -> dev ,
404
+ "invalid nflwdth setting of %d\n" ,
405
+ st -> nflwdth_reg );
406
+ return - EINVAL ;
407
+ }
408
+
373
409
indio_dev -> dev .parent = & spi -> dev ;
374
410
indio_dev -> name = spi_get_device_id (spi )-> name ;
375
411
indio_dev -> channels = as3935_channels ;
@@ -384,6 +420,7 @@ static int as3935_probe(struct spi_device *spi)
384
420
return - ENOMEM ;
385
421
386
422
st -> trig = trig ;
423
+ st -> noise_tripped = jiffies - HZ ;
387
424
trig -> dev .parent = indio_dev -> dev .parent ;
388
425
iio_trigger_set_drvdata (trig , indio_dev );
389
426
trig -> ops = & iio_interrupt_trigger_ops ;
0 commit comments