20
20
#include <linux/input.h>
21
21
#include <linux/device.h>
22
22
#include <linux/platform_device.h>
23
- #include <linux/gpio.h>
23
+ #include <linux/gpio/consumer .h>
24
24
#include <linux/rotary_encoder.h>
25
25
#include <linux/slab.h>
26
26
#include <linux/of.h>
27
27
#include <linux/of_platform.h>
28
- #include <linux/of_gpio.h>
29
28
#include <linux/pm.h>
30
29
31
30
#define DRV_NAME "rotary-encoder"
@@ -38,6 +37,9 @@ struct rotary_encoder {
38
37
unsigned int axis ;
39
38
unsigned int pos ;
40
39
40
+ struct gpio_desc * gpio_a ;
41
+ struct gpio_desc * gpio_b ;
42
+
41
43
unsigned int irq_a ;
42
44
unsigned int irq_b ;
43
45
@@ -47,13 +49,10 @@ struct rotary_encoder {
47
49
char last_stable ;
48
50
};
49
51
50
- static int rotary_encoder_get_state (const struct rotary_encoder_platform_data * pdata )
52
+ static int rotary_encoder_get_state (struct rotary_encoder * encoder )
51
53
{
52
- int a = !!gpio_get_value_cansleep (pdata -> gpio_a );
53
- int b = !!gpio_get_value_cansleep (pdata -> gpio_b );
54
-
55
- a ^= pdata -> inverted_a ;
56
- b ^= pdata -> inverted_b ;
54
+ int a = !!gpiod_get_value_cansleep (encoder -> gpio_a );
55
+ int b = !!gpiod_get_value_cansleep (encoder -> gpio_b );
57
56
58
57
return ((a << 1 ) | b );
59
58
}
@@ -97,7 +96,7 @@ static irqreturn_t rotary_encoder_irq(int irq, void *dev_id)
97
96
98
97
mutex_lock (& encoder -> access_mutex );
99
98
100
- state = rotary_encoder_get_state (encoder -> pdata );
99
+ state = rotary_encoder_get_state (encoder );
101
100
102
101
switch (state ) {
103
102
case 0x0 :
@@ -130,7 +129,7 @@ static irqreturn_t rotary_encoder_half_period_irq(int irq, void *dev_id)
130
129
131
130
mutex_lock (& encoder -> access_mutex );
132
131
133
- state = rotary_encoder_get_state (encoder -> pdata );
132
+ state = rotary_encoder_get_state (encoder );
134
133
135
134
switch (state ) {
136
135
case 0x00 :
@@ -160,7 +159,7 @@ static irqreturn_t rotary_encoder_quarter_period_irq(int irq, void *dev_id)
160
159
161
160
mutex_lock (& encoder -> access_mutex );
162
161
163
- state = rotary_encoder_get_state (encoder -> pdata );
162
+ state = rotary_encoder_get_state (encoder );
164
163
165
164
/*
166
165
* We encode the previous and the current state using a byte.
@@ -218,7 +217,6 @@ static struct rotary_encoder_platform_data *rotary_encoder_parse_dt(struct devic
218
217
of_match_device (rotary_encoder_of_match , dev );
219
218
struct device_node * np = dev -> of_node ;
220
219
struct rotary_encoder_platform_data * pdata ;
221
- enum of_gpio_flags flags ;
222
220
int error ;
223
221
224
222
if (!of_id || !np )
@@ -232,12 +230,6 @@ static struct rotary_encoder_platform_data *rotary_encoder_parse_dt(struct devic
232
230
of_property_read_u32 (np , "rotary-encoder,steps" , & pdata -> steps );
233
231
of_property_read_u32 (np , "linux,axis" , & pdata -> axis );
234
232
235
- pdata -> gpio_a = of_get_gpio_flags (np , 0 , & flags );
236
- pdata -> inverted_a = flags & OF_GPIO_ACTIVE_LOW ;
237
-
238
- pdata -> gpio_b = of_get_gpio_flags (np , 1 , & flags );
239
- pdata -> inverted_b = flags & OF_GPIO_ACTIVE_LOW ;
240
-
241
233
pdata -> relative_axis =
242
234
of_property_read_bool (np , "rotary-encoder,relative-axis" );
243
235
pdata -> rollover = of_property_read_bool (np , "rotary-encoder,rollover" );
@@ -294,14 +286,32 @@ static int rotary_encoder_probe(struct platform_device *pdev)
294
286
if (!encoder )
295
287
return - ENOMEM ;
296
288
289
+ mutex_init (& encoder -> access_mutex );
290
+ encoder -> pdata = pdata ;
291
+
292
+ encoder -> gpio_a = devm_gpiod_get_index (dev , NULL , 0 , GPIOD_IN );
293
+ if (IS_ERR (encoder -> gpio_a )) {
294
+ err = PTR_ERR (encoder -> gpio_a );
295
+ dev_err (dev , "unable to get GPIO at index 0: %d\n" , err );
296
+ return err ;
297
+ }
298
+
299
+ encoder -> irq_a = gpiod_to_irq (encoder -> gpio_a );
300
+
301
+ encoder -> gpio_b = devm_gpiod_get_index (dev , NULL , 1 , GPIOD_IN );
302
+ if (IS_ERR (encoder -> gpio_b )) {
303
+ err = PTR_ERR (encoder -> gpio_b );
304
+ dev_err (dev , "unable to get GPIO at index 1: %d\n" , err );
305
+ return err ;
306
+ }
307
+
308
+ encoder -> irq_b = gpiod_to_irq (encoder -> gpio_b );
309
+
297
310
input = devm_input_allocate_device (dev );
298
311
if (!input )
299
312
return - ENOMEM ;
300
313
301
- mutex_init (& encoder -> access_mutex );
302
-
303
314
encoder -> input = input ;
304
- encoder -> pdata = pdata ;
305
315
306
316
input -> name = pdev -> name ;
307
317
input -> id .bustype = BUS_HOST ;
@@ -316,32 +326,14 @@ static int rotary_encoder_probe(struct platform_device *pdev)
316
326
pdata -> axis , 0 , pdata -> steps , 0 , 1 );
317
327
}
318
328
319
- /* request the GPIOs */
320
- err = devm_gpio_request_one (dev , pdata -> gpio_a , GPIOF_IN ,
321
- dev_name (dev ));
322
- if (err ) {
323
- dev_err (dev , "unable to request GPIO %d\n" , pdata -> gpio_a );
324
- return err ;
325
- }
326
-
327
- err = devm_gpio_request_one (dev , pdata -> gpio_b , GPIOF_IN ,
328
- dev_name (dev ));
329
- if (err ) {
330
- dev_err (dev , "unable to request GPIO %d\n" , pdata -> gpio_b );
331
- return err ;
332
- }
333
-
334
- encoder -> irq_a = gpio_to_irq (pdata -> gpio_a );
335
- encoder -> irq_b = gpio_to_irq (pdata -> gpio_b );
336
-
337
329
switch (pdata -> steps_per_period ) {
338
330
case 4 :
339
331
handler = & rotary_encoder_quarter_period_irq ;
340
- encoder -> last_stable = rotary_encoder_get_state (pdata );
332
+ encoder -> last_stable = rotary_encoder_get_state (encoder );
341
333
break ;
342
334
case 2 :
343
335
handler = & rotary_encoder_half_period_irq ;
344
- encoder -> last_stable = rotary_encoder_get_state (pdata );
336
+ encoder -> last_stable = rotary_encoder_get_state (encoder );
345
337
break ;
346
338
case 1 :
347
339
handler = & rotary_encoder_irq ;
0 commit comments