21
21
#include <linux/device.h>
22
22
#include <linux/platform_device.h>
23
23
#include <linux/gpio/consumer.h>
24
- #include <linux/rotary_encoder.h>
25
24
#include <linux/slab.h>
26
25
#include <linux/of.h>
27
- #include <linux/of_platform.h>
28
26
#include <linux/pm.h>
27
+ #include <linux/property.h>
29
28
30
29
#define DRV_NAME "rotary-encoder"
31
30
32
31
struct rotary_encoder {
33
32
struct input_dev * input ;
34
- const struct rotary_encoder_platform_data * pdata ;
33
+
35
34
struct mutex access_mutex ;
36
35
37
- unsigned int axis ;
36
+ u32 steps ;
37
+ u32 axis ;
38
+ bool relative_axis ;
39
+ bool rollover ;
40
+
38
41
unsigned int pos ;
39
42
40
43
struct gpio_desc * gpio_a ;
@@ -59,31 +62,29 @@ static int rotary_encoder_get_state(struct rotary_encoder *encoder)
59
62
60
63
static void rotary_encoder_report_event (struct rotary_encoder * encoder )
61
64
{
62
- const struct rotary_encoder_platform_data * pdata = encoder -> pdata ;
63
-
64
- if (pdata -> relative_axis ) {
65
+ if (encoder -> relative_axis ) {
65
66
input_report_rel (encoder -> input ,
66
- pdata -> axis , encoder -> dir ? -1 : 1 );
67
+ encoder -> axis , encoder -> dir ? -1 : 1 );
67
68
} else {
68
69
unsigned int pos = encoder -> pos ;
69
70
70
71
if (encoder -> dir ) {
71
72
/* turning counter-clockwise */
72
- if (pdata -> rollover )
73
- pos += pdata -> steps ;
73
+ if (encoder -> rollover )
74
+ pos += encoder -> steps ;
74
75
if (pos )
75
76
pos -- ;
76
77
} else {
77
78
/* turning clockwise */
78
- if (pdata -> rollover || pos < pdata -> steps )
79
+ if (encoder -> rollover || pos < encoder -> steps )
79
80
pos ++ ;
80
81
}
81
82
82
- if (pdata -> rollover )
83
- pos %= pdata -> steps ;
83
+ if (encoder -> rollover )
84
+ pos %= encoder -> steps ;
84
85
85
86
encoder -> pos = pos ;
86
- input_report_abs (encoder -> input , pdata -> axis , encoder -> pos );
87
+ input_report_abs (encoder -> input , encoder -> axis , encoder -> pos );
87
88
}
88
89
89
90
input_sync (encoder -> input );
@@ -204,90 +205,43 @@ static irqreturn_t rotary_encoder_quarter_period_irq(int irq, void *dev_id)
204
205
return IRQ_HANDLED ;
205
206
}
206
207
207
- #ifdef CONFIG_OF
208
- static const struct of_device_id rotary_encoder_of_match [] = {
209
- { .compatible = "rotary-encoder" , },
210
- { },
211
- };
212
- MODULE_DEVICE_TABLE (of , rotary_encoder_of_match );
213
-
214
- static struct rotary_encoder_platform_data * rotary_encoder_parse_dt (struct device * dev )
215
- {
216
- const struct of_device_id * of_id =
217
- of_match_device (rotary_encoder_of_match , dev );
218
- struct device_node * np = dev -> of_node ;
219
- struct rotary_encoder_platform_data * pdata ;
220
- int error ;
221
-
222
- if (!of_id || !np )
223
- return NULL ;
224
-
225
- pdata = devm_kzalloc (dev , sizeof (struct rotary_encoder_platform_data ),
226
- GFP_KERNEL );
227
- if (!pdata )
228
- return ERR_PTR (- ENOMEM );
229
-
230
- of_property_read_u32 (np , "rotary-encoder,steps" , & pdata -> steps );
231
- of_property_read_u32 (np , "linux,axis" , & pdata -> axis );
232
-
233
- pdata -> relative_axis =
234
- of_property_read_bool (np , "rotary-encoder,relative-axis" );
235
- pdata -> rollover = of_property_read_bool (np , "rotary-encoder,rollover" );
236
-
237
- error = of_property_read_u32 (np , "rotary-encoder,steps-per-period" ,
238
- & pdata -> steps_per_period );
239
- if (error ) {
240
- /*
241
- * The 'half-period' property has been deprecated, you must use
242
- * 'steps-per-period' and set an appropriate value, but we still
243
- * need to parse it to maintain compatibility.
244
- */
245
- if (of_property_read_bool (np , "rotary-encoder,half-period" )) {
246
- pdata -> steps_per_period = 2 ;
247
- } else {
248
- /* Fallback to one step per period behavior */
249
- pdata -> steps_per_period = 1 ;
250
- }
251
- }
252
-
253
- pdata -> wakeup_source = of_property_read_bool (np , "wakeup-source" );
254
-
255
- return pdata ;
256
- }
257
- #else
258
- static inline struct rotary_encoder_platform_data *
259
- rotary_encoder_parse_dt (struct device * dev )
260
- {
261
- return NULL ;
262
- }
263
- #endif
264
-
265
208
static int rotary_encoder_probe (struct platform_device * pdev )
266
209
{
267
210
struct device * dev = & pdev -> dev ;
268
- const struct rotary_encoder_platform_data * pdata = dev_get_platdata (dev );
269
211
struct rotary_encoder * encoder ;
270
212
struct input_dev * input ;
271
213
irq_handler_t handler ;
214
+ u32 steps_per_period ;
272
215
int err ;
273
216
274
- if (!pdata ) {
275
- pdata = rotary_encoder_parse_dt (dev );
276
- if (IS_ERR (pdata ))
277
- return PTR_ERR (pdata );
278
-
279
- if (!pdata ) {
280
- dev_err (dev , "missing platform data\n" );
281
- return - EINVAL ;
282
- }
283
- }
284
-
285
217
encoder = devm_kzalloc (dev , sizeof (struct rotary_encoder ), GFP_KERNEL );
286
218
if (!encoder )
287
219
return - ENOMEM ;
288
220
289
221
mutex_init (& encoder -> access_mutex );
290
- encoder -> pdata = pdata ;
222
+
223
+ device_property_read_u32 (dev , "rotary-encoder,steps" , & encoder -> steps );
224
+
225
+ err = device_property_read_u32 (dev , "rotary-encoder,steps-per-period" ,
226
+ & steps_per_period );
227
+ if (err ) {
228
+ /*
229
+ * The 'half-period' property has been deprecated, you must
230
+ * use 'steps-per-period' and set an appropriate value, but
231
+ * we still need to parse it to maintain compatibility. If
232
+ * neither property is present we fall back to the one step
233
+ * per period behavior.
234
+ */
235
+ steps_per_period = device_property_read_bool (dev ,
236
+ "rotary-encoder,half-period" ) ? 2 : 1 ;
237
+ }
238
+
239
+ encoder -> rollover =
240
+ device_property_read_bool (dev , "rotary-encoder,rollover" );
241
+
242
+ device_property_read_u32 (dev , "linux,axis" , & encoder -> axis );
243
+ encoder -> relative_axis =
244
+ device_property_read_bool (dev , "rotary-encoder,relative-axis" );
291
245
292
246
encoder -> gpio_a = devm_gpiod_get_index (dev , NULL , 0 , GPIOD_IN );
293
247
if (IS_ERR (encoder -> gpio_a )) {
@@ -317,12 +271,13 @@ static int rotary_encoder_probe(struct platform_device *pdev)
317
271
input -> id .bustype = BUS_HOST ;
318
272
input -> dev .parent = dev ;
319
273
320
- if (pdata -> relative_axis )
321
- input_set_capability (input , EV_REL , pdata -> axis );
274
+ if (encoder -> relative_axis )
275
+ input_set_capability (input , EV_REL , encoder -> axis );
322
276
else
323
- input_set_abs_params (input , pdata -> axis , 0 , pdata -> steps , 0 , 1 );
277
+ input_set_abs_params (input ,
278
+ encoder -> axis , 0 , encoder -> steps , 0 , 1 );
324
279
325
- switch (pdata -> steps_per_period ) {
280
+ switch (steps_per_period ) {
326
281
case 4 :
327
282
handler = & rotary_encoder_quarter_period_irq ;
328
283
encoder -> last_stable = rotary_encoder_get_state (encoder );
@@ -336,7 +291,7 @@ static int rotary_encoder_probe(struct platform_device *pdev)
336
291
break ;
337
292
default :
338
293
dev_err (dev , "'%d' is not a valid steps-per-period value\n" ,
339
- pdata -> steps_per_period );
294
+ steps_per_period );
340
295
return - EINVAL ;
341
296
}
342
297
@@ -364,7 +319,8 @@ static int rotary_encoder_probe(struct platform_device *pdev)
364
319
return err ;
365
320
}
366
321
367
- device_init_wakeup (& pdev -> dev , pdata -> wakeup_source );
322
+ device_init_wakeup (dev ,
323
+ device_property_read_bool (dev , "wakeup-source" ));
368
324
369
325
platform_set_drvdata (pdev , encoder );
370
326
@@ -398,6 +354,14 @@ static int __maybe_unused rotary_encoder_resume(struct device *dev)
398
354
static SIMPLE_DEV_PM_OPS (rotary_encoder_pm_ops ,
399
355
rotary_encoder_suspend , rotary_encoder_resume ) ;
400
356
357
+ #ifdef CONFIG_OF
358
+ static const struct of_device_id rotary_encoder_of_match [] = {
359
+ { .compatible = "rotary-encoder" , },
360
+ { },
361
+ };
362
+ MODULE_DEVICE_TABLE (of , rotary_encoder_of_match );
363
+ #endif
364
+
401
365
static struct platform_driver rotary_encoder_driver = {
402
366
.probe = rotary_encoder_probe ,
403
367
.driver = {
0 commit comments