33
33
struct rotary_encoder {
34
34
struct input_dev * input ;
35
35
const struct rotary_encoder_platform_data * pdata ;
36
+ struct mutex access_mutex ;
36
37
37
38
unsigned int axis ;
38
39
unsigned int pos ;
@@ -48,8 +49,8 @@ struct rotary_encoder {
48
49
49
50
static int rotary_encoder_get_state (const struct rotary_encoder_platform_data * pdata )
50
51
{
51
- int a = !!gpio_get_value (pdata -> gpio_a );
52
- int b = !!gpio_get_value (pdata -> gpio_b );
52
+ int a = !!gpio_get_value_cansleep (pdata -> gpio_a );
53
+ int b = !!gpio_get_value_cansleep (pdata -> gpio_b );
53
54
54
55
a ^= pdata -> inverted_a ;
55
56
b ^= pdata -> inverted_b ;
@@ -94,6 +95,8 @@ static irqreturn_t rotary_encoder_irq(int irq, void *dev_id)
94
95
struct rotary_encoder * encoder = dev_id ;
95
96
int state ;
96
97
98
+ mutex_lock (& encoder -> access_mutex );
99
+
97
100
state = rotary_encoder_get_state (encoder -> pdata );
98
101
99
102
switch (state ) {
@@ -115,6 +118,8 @@ static irqreturn_t rotary_encoder_irq(int irq, void *dev_id)
115
118
break ;
116
119
}
117
120
121
+ mutex_unlock (& encoder -> access_mutex );
122
+
118
123
return IRQ_HANDLED ;
119
124
}
120
125
@@ -123,6 +128,8 @@ static irqreturn_t rotary_encoder_half_period_irq(int irq, void *dev_id)
123
128
struct rotary_encoder * encoder = dev_id ;
124
129
int state ;
125
130
131
+ mutex_lock (& encoder -> access_mutex );
132
+
126
133
state = rotary_encoder_get_state (encoder -> pdata );
127
134
128
135
switch (state ) {
@@ -140,6 +147,8 @@ static irqreturn_t rotary_encoder_half_period_irq(int irq, void *dev_id)
140
147
break ;
141
148
}
142
149
150
+ mutex_unlock (& encoder -> access_mutex );
151
+
143
152
return IRQ_HANDLED ;
144
153
}
145
154
@@ -149,6 +158,8 @@ static irqreturn_t rotary_encoder_quarter_period_irq(int irq, void *dev_id)
149
158
unsigned char sum ;
150
159
int state ;
151
160
161
+ mutex_lock (& encoder -> access_mutex );
162
+
152
163
state = rotary_encoder_get_state (encoder -> pdata );
153
164
154
165
/*
@@ -189,6 +200,8 @@ static irqreturn_t rotary_encoder_quarter_period_irq(int irq, void *dev_id)
189
200
190
201
out :
191
202
encoder -> last_stable = state ;
203
+ mutex_unlock (& encoder -> access_mutex );
204
+
192
205
return IRQ_HANDLED ;
193
206
}
194
207
@@ -285,6 +298,8 @@ static int rotary_encoder_probe(struct platform_device *pdev)
285
298
if (!input )
286
299
return - ENOMEM ;
287
300
301
+ mutex_init (& encoder -> access_mutex );
302
+
288
303
encoder -> input = input ;
289
304
encoder -> pdata = pdata ;
290
305
@@ -337,17 +352,19 @@ static int rotary_encoder_probe(struct platform_device *pdev)
337
352
return - EINVAL ;
338
353
}
339
354
340
- err = devm_request_irq (dev , encoder -> irq_a , handler ,
341
- IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING ,
342
- DRV_NAME , encoder );
355
+ err = devm_request_threaded_irq (dev , encoder -> irq_a , NULL , handler ,
356
+ IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING |
357
+ IRQF_ONESHOT ,
358
+ DRV_NAME , encoder );
343
359
if (err ) {
344
360
dev_err (dev , "unable to request IRQ %d\n" , encoder -> irq_a );
345
361
return err ;
346
362
}
347
363
348
- err = devm_request_irq (dev , encoder -> irq_b , handler ,
349
- IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING ,
350
- DRV_NAME , encoder );
364
+ err = devm_request_threaded_irq (dev , encoder -> irq_b , NULL , handler ,
365
+ IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING |
366
+ IRQF_ONESHOT ,
367
+ DRV_NAME , encoder );
351
368
if (err ) {
352
369
dev_err (dev , "unable to request IRQ %d\n" , encoder -> irq_b );
353
370
return err ;
0 commit comments