Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Input: rotary-encoder - support more than 2 gpios as input

This changes how the used gpios are stored (i.e. a struct gpio_descs
instead of two struct gpio_desc) and as with >2 gpios the states are
numbered differently the function rotary_encoder_get_state returns
unencoded numbers instead of grey encoded numbers before. The latter has
some implications on how the returned value is used and so the change is
bigger than one might expect at first.

Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Acked-by: Rob Herring <robh@kernel.org>
Acked-by: Daniel Mack <daniel@zonque.org>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>

authored by

Uwe Kleine-König and committed by
Dmitry Torokhov
7dde4e74 a9e340dc

+65 -93
+1 -1
Documentation/devicetree/bindings/input/rotary-encoder.txt
··· 1 1 Rotary encoder DT bindings 2 2 3 3 Required properties: 4 - - gpios: a spec for two GPIOs to be used 4 + - gpios: a spec for at least two GPIOs to be used, most significant first 5 5 6 6 Optional properties: 7 7 - linux,axis: the input subsystem axis to map to this rotary encoder.
+64 -92
drivers/input/misc/rotary_encoder.c
··· 40 40 41 41 unsigned int pos; 42 42 43 - struct gpio_desc *gpio_a; 44 - struct gpio_desc *gpio_b; 43 + struct gpio_descs *gpios; 45 44 46 - unsigned int irq_a; 47 - unsigned int irq_b; 45 + unsigned int *irq; 48 46 49 47 bool armed; 50 - unsigned char dir; /* 0 - clockwise, 1 - CCW */ 48 + signed char dir; /* 1 - clockwise, -1 - CCW */ 51 49 52 - char last_stable; 50 + unsigned last_stable; 53 51 }; 54 52 55 - static int rotary_encoder_get_state(struct rotary_encoder *encoder) 53 + static unsigned rotary_encoder_get_state(struct rotary_encoder *encoder) 56 54 { 57 - int a = !!gpiod_get_value_cansleep(encoder->gpio_a); 58 - int b = !!gpiod_get_value_cansleep(encoder->gpio_b); 55 + int i; 56 + unsigned ret = 0; 59 57 60 - return ((a << 1) | b); 58 + for (i = 0; i < encoder->gpios->ndescs; ++i) { 59 + int val = gpiod_get_value_cansleep(encoder->gpios->desc[i]); 60 + /* convert from gray encoding to normal */ 61 + if (ret & 1) 62 + val = !val; 63 + 64 + ret = ret << 1 | val; 65 + } 66 + 67 + return ret & 3; 61 68 } 62 69 63 70 static void rotary_encoder_report_event(struct rotary_encoder *encoder) 64 71 { 65 72 if (encoder->relative_axis) { 66 73 input_report_rel(encoder->input, 67 - encoder->axis, encoder->dir ? -1 : 1); 74 + encoder->axis, encoder->dir); 68 75 } else { 69 76 unsigned int pos = encoder->pos; 70 77 71 - if (encoder->dir) { 78 + if (encoder->dir < 0) { 72 79 /* turning counter-clockwise */ 73 80 if (encoder->rollover) 74 81 pos += encoder->steps; ··· 100 93 static irqreturn_t rotary_encoder_irq(int irq, void *dev_id) 101 94 { 102 95 struct rotary_encoder *encoder = dev_id; 103 - int state; 96 + unsigned state; 104 97 105 98 mutex_lock(&encoder->access_mutex); 106 99 ··· 115 108 break; 116 109 117 110 case 0x1: 118 - case 0x2: 111 + case 0x3: 119 112 if (encoder->armed) 120 - encoder->dir = state - 1; 113 + encoder->dir = 2 - state; 121 114 break; 122 115 123 - case 0x3: 116 + case 0x2: 124 117 encoder->armed = true; 125 118 break; 126 119 } ··· 133 126 static irqreturn_t rotary_encoder_half_period_irq(int irq, void *dev_id) 134 127 { 135 128 struct rotary_encoder *encoder = dev_id; 136 - int state; 129 + unsigned int state; 137 130 138 131 mutex_lock(&encoder->access_mutex); 139 132 140 133 state = rotary_encoder_get_state(encoder); 141 134 142 - switch (state) { 143 - case 0x00: 144 - case 0x03: 135 + if (state & 1) { 136 + encoder->dir = ((encoder->last_stable - state + 1) % 4) - 1; 137 + } else { 145 138 if (state != encoder->last_stable) { 146 139 rotary_encoder_report_event(encoder); 147 140 encoder->last_stable = state; 148 141 } 149 - break; 150 - 151 - case 0x01: 152 - case 0x02: 153 - encoder->dir = (encoder->last_stable + state) & 0x01; 154 - break; 155 142 } 156 143 157 144 mutex_unlock(&encoder->access_mutex); ··· 156 155 static irqreturn_t rotary_encoder_quarter_period_irq(int irq, void *dev_id) 157 156 { 158 157 struct rotary_encoder *encoder = dev_id; 159 - unsigned char sum; 160 - int state; 158 + unsigned int state; 161 159 162 160 mutex_lock(&encoder->access_mutex); 163 161 164 162 state = rotary_encoder_get_state(encoder); 165 163 166 - /* 167 - * We encode the previous and the current state using a byte. 168 - * The previous state in the MSB nibble, the current state in the LSB 169 - * nibble. Then use a table to decide the direction of the turn. 170 - */ 171 - sum = (encoder->last_stable << 4) + state; 172 - switch (sum) { 173 - case 0x31: 174 - case 0x10: 175 - case 0x02: 176 - case 0x23: 177 - encoder->dir = 0; /* clockwise */ 178 - break; 179 - 180 - case 0x13: 181 - case 0x01: 182 - case 0x20: 183 - case 0x32: 184 - encoder->dir = 1; /* counter-clockwise */ 185 - break; 186 - 187 - default: 188 - /* 189 - * Ignore all other values. This covers the case when the 190 - * state didn't change (a spurious interrupt) and the 191 - * cases where the state changed by two steps, making it 192 - * impossible to tell the direction. 193 - * 194 - * In either case, don't report any event and save the 195 - * state for later. 196 - */ 164 + if ((encoder->last_stable + 1) % 4 == state) 165 + encoder->dir = 1; 166 + else if (encoder->last_stable == (state + 1) % 4) 167 + encoder->dir = -1; 168 + else 197 169 goto out; 198 - } 199 170 200 171 rotary_encoder_report_event(encoder); 201 172 ··· 185 212 struct input_dev *input; 186 213 irq_handler_t handler; 187 214 u32 steps_per_period; 215 + unsigned int i; 188 216 int err; 189 217 190 218 encoder = devm_kzalloc(dev, sizeof(struct rotary_encoder), GFP_KERNEL); ··· 217 243 encoder->relative_axis = 218 244 device_property_read_bool(dev, "rotary-encoder,relative-axis"); 219 245 220 - encoder->gpio_a = devm_gpiod_get_index(dev, NULL, 0, GPIOD_IN); 221 - if (IS_ERR(encoder->gpio_a)) { 222 - err = PTR_ERR(encoder->gpio_a); 223 - dev_err(dev, "unable to get GPIO at index 0: %d\n", err); 224 - return err; 246 + encoder->gpios = devm_gpiod_get_array(dev, NULL, GPIOD_IN); 247 + if (IS_ERR(encoder->gpios)) { 248 + dev_err(dev, "unable to get gpios\n"); 249 + return PTR_ERR(encoder->gpios); 225 250 } 226 - 227 - encoder->irq_a = gpiod_to_irq(encoder->gpio_a); 228 - 229 - encoder->gpio_b = devm_gpiod_get_index(dev, NULL, 1, GPIOD_IN); 230 - if (IS_ERR(encoder->gpio_b)) { 231 - err = PTR_ERR(encoder->gpio_b); 232 - dev_err(dev, "unable to get GPIO at index 1: %d\n", err); 233 - return err; 251 + if (encoder->gpios->ndescs < 2) { 252 + dev_err(dev, "not enough gpios found\n"); 253 + return -EINVAL; 234 254 } 235 - 236 - encoder->irq_b = gpiod_to_irq(encoder->gpio_b); 237 255 238 256 input = devm_input_allocate_device(dev); 239 257 if (!input) ··· 243 277 input_set_abs_params(input, 244 278 encoder->axis, 0, encoder->steps, 0, 1); 245 279 246 - switch (steps_per_period) { 280 + switch (steps_per_period >> (encoder->gpios->ndescs - 2)) { 247 281 case 4: 248 282 handler = &rotary_encoder_quarter_period_irq; 249 283 encoder->last_stable = rotary_encoder_get_state(encoder); ··· 261 295 return -EINVAL; 262 296 } 263 297 264 - err = devm_request_threaded_irq(dev, encoder->irq_a, NULL, handler, 265 - IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | 266 - IRQF_ONESHOT, 267 - DRV_NAME, encoder); 268 - if (err) { 269 - dev_err(dev, "unable to request IRQ %d\n", encoder->irq_a); 270 - return err; 271 - } 298 + encoder->irq = 299 + devm_kzalloc(dev, 300 + sizeof(*encoder->irq) * encoder->gpios->ndescs, 301 + GFP_KERNEL); 302 + if (!encoder->irq) 303 + return -ENOMEM; 272 304 273 - err = devm_request_threaded_irq(dev, encoder->irq_b, NULL, handler, 305 + for (i = 0; i < encoder->gpios->ndescs; ++i) { 306 + encoder->irq[i] = gpiod_to_irq(encoder->gpios->desc[i]); 307 + 308 + err = devm_request_threaded_irq(dev, encoder->irq[i], 309 + NULL, handler, 274 310 IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | 275 311 IRQF_ONESHOT, 276 312 DRV_NAME, encoder); 277 - if (err) { 278 - dev_err(dev, "unable to request IRQ %d\n", encoder->irq_b); 279 - return err; 313 + if (err) { 314 + dev_err(dev, "unable to request IRQ %d (gpio#%d)\n", 315 + encoder->irq[i], i); 316 + return err; 317 + } 280 318 } 281 319 282 320 err = input_register_device(input); ··· 300 330 static int __maybe_unused rotary_encoder_suspend(struct device *dev) 301 331 { 302 332 struct rotary_encoder *encoder = dev_get_drvdata(dev); 333 + unsigned int i; 303 334 304 335 if (device_may_wakeup(dev)) { 305 - enable_irq_wake(encoder->irq_a); 306 - enable_irq_wake(encoder->irq_b); 336 + for (i = 0; i < encoder->gpios->ndescs; ++i) 337 + enable_irq_wake(encoder->irq[i]); 307 338 } 308 339 309 340 return 0; ··· 313 342 static int __maybe_unused rotary_encoder_resume(struct device *dev) 314 343 { 315 344 struct rotary_encoder *encoder = dev_get_drvdata(dev); 345 + unsigned int i; 316 346 317 347 if (device_may_wakeup(dev)) { 318 - disable_irq_wake(encoder->irq_a); 319 - disable_irq_wake(encoder->irq_b); 348 + for (i = 0; i < encoder->gpios->ndescs; ++i) 349 + disable_irq_wake(encoder->irq[i]); 320 350 } 321 351 322 352 return 0;