1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * GPIO driven matrix keyboard driver 4 * 5 * Copyright (c) 2008 Marek Vasut <marek.vasut@gmail.com> 6 * 7 * Based on corgikbd.c 8 */ 9 10 #include <linux/types.h> 11 #include <linux/delay.h> 12 #include <linux/gpio/consumer.h> 13 #include <linux/platform_device.h> 14 #include <linux/input.h> 15 #include <linux/irq.h> 16 #include <linux/interrupt.h> 17 #include <linux/jiffies.h> 18 #include <linux/module.h> 19 #include <linux/gpio.h> 20 #include <linux/input/matrix_keypad.h> 21 #include <linux/slab.h> 22 #include <linux/of.h> 23 #include <linux/of_gpio.h> 24 #include <linux/of_platform.h> 25 26 struct matrix_keypad { 27 const struct matrix_keypad_platform_data *pdata; 28 struct input_dev *input_dev; 29 unsigned int row_shift; 30 31 DECLARE_BITMAP(disabled_gpios, MATRIX_MAX_ROWS); 32 33 uint32_t last_key_state[MATRIX_MAX_COLS]; 34 struct delayed_work work; 35 spinlock_t lock; 36 bool scan_pending; 37 bool stopped; 38 bool gpio_all_disabled; 39 }; 40 41 /* 42 * NOTE: If drive_inactive_cols is false, then the GPIO has to be put into 43 * HiZ when de-activated to cause minmal side effect when scanning other 44 * columns. In that case it is configured here to be input, otherwise it is 45 * driven with the inactive value. 46 */ 47 static void __activate_col(const struct matrix_keypad_platform_data *pdata, 48 int col, bool on) 49 { 50 bool level_on = !pdata->active_low; 51 52 if (on) { 53 gpio_direction_output(pdata->col_gpios[col], level_on); 54 } else { 55 gpio_set_value_cansleep(pdata->col_gpios[col], !level_on); 56 if (!pdata->drive_inactive_cols) 57 gpio_direction_input(pdata->col_gpios[col]); 58 } 59 } 60 61 static void activate_col(const struct matrix_keypad_platform_data *pdata, 62 int col, bool on) 63 { 64 __activate_col(pdata, col, on); 65 66 if (on && pdata->col_scan_delay_us) 67 udelay(pdata->col_scan_delay_us); 68 } 69 70 static void activate_all_cols(const struct matrix_keypad_platform_data *pdata, 71 bool on) 72 { 73 int col; 74 75 for (col = 0; col < pdata->num_col_gpios; col++) 76 __activate_col(pdata, col, on); 77 } 78 79 static bool row_asserted(const struct matrix_keypad_platform_data *pdata, 80 int row) 81 { 82 return gpio_get_value_cansleep(pdata->row_gpios[row]) ? 83 !pdata->active_low : pdata->active_low; 84 } 85 86 static void enable_row_irqs(struct matrix_keypad *keypad) 87 { 88 const struct matrix_keypad_platform_data *pdata = keypad->pdata; 89 int i; 90 91 if (pdata->clustered_irq > 0) 92 enable_irq(pdata->clustered_irq); 93 else { 94 for (i = 0; i < pdata->num_row_gpios; i++) 95 enable_irq(gpio_to_irq(pdata->row_gpios[i])); 96 } 97 } 98 99 static void disable_row_irqs(struct matrix_keypad *keypad) 100 { 101 const struct matrix_keypad_platform_data *pdata = keypad->pdata; 102 int i; 103 104 if (pdata->clustered_irq > 0) 105 disable_irq_nosync(pdata->clustered_irq); 106 else { 107 for (i = 0; i < pdata->num_row_gpios; i++) 108 disable_irq_nosync(gpio_to_irq(pdata->row_gpios[i])); 109 } 110 } 111 112 /* 113 * This gets the keys from keyboard and reports it to input subsystem 114 */ 115 static void matrix_keypad_scan(struct work_struct *work) 116 { 117 struct matrix_keypad *keypad = 118 container_of(work, struct matrix_keypad, work.work); 119 struct input_dev *input_dev = keypad->input_dev; 120 const unsigned short *keycodes = input_dev->keycode; 121 const struct matrix_keypad_platform_data *pdata = keypad->pdata; 122 uint32_t new_state[MATRIX_MAX_COLS]; 123 int row, col, code; 124 125 /* de-activate all columns for scanning */ 126 activate_all_cols(pdata, false); 127 128 memset(new_state, 0, sizeof(new_state)); 129 130 /* assert each column and read the row status out */ 131 for (col = 0; col < pdata->num_col_gpios; col++) { 132 133 activate_col(pdata, col, true); 134 135 for (row = 0; row < pdata->num_row_gpios; row++) 136 new_state[col] |= 137 row_asserted(pdata, row) ? (1 << row) : 0; 138 139 activate_col(pdata, col, false); 140 } 141 142 for (col = 0; col < pdata->num_col_gpios; col++) { 143 uint32_t bits_changed; 144 145 bits_changed = keypad->last_key_state[col] ^ new_state[col]; 146 if (bits_changed == 0) 147 continue; 148 149 for (row = 0; row < pdata->num_row_gpios; row++) { 150 if ((bits_changed & (1 << row)) == 0) 151 continue; 152 153 code = MATRIX_SCAN_CODE(row, col, keypad->row_shift); 154 input_event(input_dev, EV_MSC, MSC_SCAN, code); 155 input_report_key(input_dev, 156 keycodes[code], 157 new_state[col] & (1 << row)); 158 } 159 } 160 input_sync(input_dev); 161 162 memcpy(keypad->last_key_state, new_state, sizeof(new_state)); 163 164 activate_all_cols(pdata, true); 165 166 /* Enable IRQs again */ 167 spin_lock_irq(&keypad->lock); 168 keypad->scan_pending = false; 169 enable_row_irqs(keypad); 170 spin_unlock_irq(&keypad->lock); 171 } 172 173 static irqreturn_t matrix_keypad_interrupt(int irq, void *id) 174 { 175 struct matrix_keypad *keypad = id; 176 unsigned long flags; 177 178 spin_lock_irqsave(&keypad->lock, flags); 179 180 /* 181 * See if another IRQ beaten us to it and scheduled the 182 * scan already. In that case we should not try to 183 * disable IRQs again. 184 */ 185 if (unlikely(keypad->scan_pending || keypad->stopped)) 186 goto out; 187 188 disable_row_irqs(keypad); 189 keypad->scan_pending = true; 190 schedule_delayed_work(&keypad->work, 191 msecs_to_jiffies(keypad->pdata->debounce_ms)); 192 193 out: 194 spin_unlock_irqrestore(&keypad->lock, flags); 195 return IRQ_HANDLED; 196 } 197 198 static int matrix_keypad_start(struct input_dev *dev) 199 { 200 struct matrix_keypad *keypad = input_get_drvdata(dev); 201 202 keypad->stopped = false; 203 mb(); 204 205 /* 206 * Schedule an immediate key scan to capture current key state; 207 * columns will be activated and IRQs be enabled after the scan. 208 */ 209 schedule_delayed_work(&keypad->work, 0); 210 211 return 0; 212 } 213 214 static void matrix_keypad_stop(struct input_dev *dev) 215 { 216 struct matrix_keypad *keypad = input_get_drvdata(dev); 217 218 spin_lock_irq(&keypad->lock); 219 keypad->stopped = true; 220 spin_unlock_irq(&keypad->lock); 221 222 flush_delayed_work(&keypad->work); 223 /* 224 * matrix_keypad_scan() will leave IRQs enabled; 225 * we should disable them now. 226 */ 227 disable_row_irqs(keypad); 228 } 229 230 #ifdef CONFIG_PM_SLEEP 231 static void matrix_keypad_enable_wakeup(struct matrix_keypad *keypad) 232 { 233 const struct matrix_keypad_platform_data *pdata = keypad->pdata; 234 unsigned int gpio; 235 int i; 236 237 if (pdata->clustered_irq > 0) { 238 if (enable_irq_wake(pdata->clustered_irq) == 0) 239 keypad->gpio_all_disabled = true; 240 } else { 241 242 for (i = 0; i < pdata->num_row_gpios; i++) { 243 if (!test_bit(i, keypad->disabled_gpios)) { 244 gpio = pdata->row_gpios[i]; 245 246 if (enable_irq_wake(gpio_to_irq(gpio)) == 0) 247 __set_bit(i, keypad->disabled_gpios); 248 } 249 } 250 } 251 } 252 253 static void matrix_keypad_disable_wakeup(struct matrix_keypad *keypad) 254 { 255 const struct matrix_keypad_platform_data *pdata = keypad->pdata; 256 unsigned int gpio; 257 int i; 258 259 if (pdata->clustered_irq > 0) { 260 if (keypad->gpio_all_disabled) { 261 disable_irq_wake(pdata->clustered_irq); 262 keypad->gpio_all_disabled = false; 263 } 264 } else { 265 for (i = 0; i < pdata->num_row_gpios; i++) { 266 if (test_and_clear_bit(i, keypad->disabled_gpios)) { 267 gpio = pdata->row_gpios[i]; 268 disable_irq_wake(gpio_to_irq(gpio)); 269 } 270 } 271 } 272 } 273 274 static int matrix_keypad_suspend(struct device *dev) 275 { 276 struct platform_device *pdev = to_platform_device(dev); 277 struct matrix_keypad *keypad = platform_get_drvdata(pdev); 278 279 matrix_keypad_stop(keypad->input_dev); 280 281 if (device_may_wakeup(&pdev->dev)) 282 matrix_keypad_enable_wakeup(keypad); 283 284 return 0; 285 } 286 287 static int matrix_keypad_resume(struct device *dev) 288 { 289 struct platform_device *pdev = to_platform_device(dev); 290 struct matrix_keypad *keypad = platform_get_drvdata(pdev); 291 292 if (device_may_wakeup(&pdev->dev)) 293 matrix_keypad_disable_wakeup(keypad); 294 295 matrix_keypad_start(keypad->input_dev); 296 297 return 0; 298 } 299 #endif 300 301 static SIMPLE_DEV_PM_OPS(matrix_keypad_pm_ops, 302 matrix_keypad_suspend, matrix_keypad_resume); 303 304 static int matrix_keypad_init_gpio(struct platform_device *pdev, 305 struct matrix_keypad *keypad) 306 { 307 const struct matrix_keypad_platform_data *pdata = keypad->pdata; 308 int i, err; 309 310 /* initialized strobe lines as outputs, activated */ 311 for (i = 0; i < pdata->num_col_gpios; i++) { 312 err = gpio_request(pdata->col_gpios[i], "matrix_kbd_col"); 313 if (err) { 314 dev_err(&pdev->dev, 315 "failed to request GPIO%d for COL%d\n", 316 pdata->col_gpios[i], i); 317 goto err_free_cols; 318 } 319 320 gpio_direction_output(pdata->col_gpios[i], !pdata->active_low); 321 } 322 323 for (i = 0; i < pdata->num_row_gpios; i++) { 324 err = gpio_request(pdata->row_gpios[i], "matrix_kbd_row"); 325 if (err) { 326 dev_err(&pdev->dev, 327 "failed to request GPIO%d for ROW%d\n", 328 pdata->row_gpios[i], i); 329 goto err_free_rows; 330 } 331 332 gpio_direction_input(pdata->row_gpios[i]); 333 } 334 335 if (pdata->clustered_irq > 0) { 336 err = request_any_context_irq(pdata->clustered_irq, 337 matrix_keypad_interrupt, 338 pdata->clustered_irq_flags, 339 "matrix-keypad", keypad); 340 if (err < 0) { 341 dev_err(&pdev->dev, 342 "Unable to acquire clustered interrupt\n"); 343 goto err_free_rows; 344 } 345 } else { 346 for (i = 0; i < pdata->num_row_gpios; i++) { 347 err = request_any_context_irq( 348 gpio_to_irq(pdata->row_gpios[i]), 349 matrix_keypad_interrupt, 350 IRQF_TRIGGER_RISING | 351 IRQF_TRIGGER_FALLING, 352 "matrix-keypad", keypad); 353 if (err < 0) { 354 dev_err(&pdev->dev, 355 "Unable to acquire interrupt for GPIO line %i\n", 356 pdata->row_gpios[i]); 357 goto err_free_irqs; 358 } 359 } 360 } 361 362 /* initialized as disabled - enabled by input->open */ 363 disable_row_irqs(keypad); 364 return 0; 365 366 err_free_irqs: 367 while (--i >= 0) 368 free_irq(gpio_to_irq(pdata->row_gpios[i]), keypad); 369 i = pdata->num_row_gpios; 370 err_free_rows: 371 while (--i >= 0) 372 gpio_free(pdata->row_gpios[i]); 373 i = pdata->num_col_gpios; 374 err_free_cols: 375 while (--i >= 0) 376 gpio_free(pdata->col_gpios[i]); 377 378 return err; 379 } 380 381 static void matrix_keypad_free_gpio(struct matrix_keypad *keypad) 382 { 383 const struct matrix_keypad_platform_data *pdata = keypad->pdata; 384 int i; 385 386 if (pdata->clustered_irq > 0) { 387 free_irq(pdata->clustered_irq, keypad); 388 } else { 389 for (i = 0; i < pdata->num_row_gpios; i++) 390 free_irq(gpio_to_irq(pdata->row_gpios[i]), keypad); 391 } 392 393 for (i = 0; i < pdata->num_row_gpios; i++) 394 gpio_free(pdata->row_gpios[i]); 395 396 for (i = 0; i < pdata->num_col_gpios; i++) 397 gpio_free(pdata->col_gpios[i]); 398 } 399 400 #ifdef CONFIG_OF 401 static struct matrix_keypad_platform_data * 402 matrix_keypad_parse_dt(struct device *dev) 403 { 404 struct matrix_keypad_platform_data *pdata; 405 struct device_node *np = dev->of_node; 406 unsigned int *gpios; 407 int ret, i, nrow, ncol; 408 409 if (!np) { 410 dev_err(dev, "device lacks DT data\n"); 411 return ERR_PTR(-ENODEV); 412 } 413 414 pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); 415 if (!pdata) { 416 dev_err(dev, "could not allocate memory for platform data\n"); 417 return ERR_PTR(-ENOMEM); 418 } 419 420 pdata->num_row_gpios = nrow = gpiod_count(dev, "row"); 421 pdata->num_col_gpios = ncol = gpiod_count(dev, "col"); 422 if (nrow < 0 || ncol < 0) { 423 dev_err(dev, "number of keypad rows/columns not specified\n"); 424 return ERR_PTR(-EINVAL); 425 } 426 427 if (of_get_property(np, "linux,no-autorepeat", NULL)) 428 pdata->no_autorepeat = true; 429 430 pdata->wakeup = of_property_read_bool(np, "wakeup-source") || 431 of_property_read_bool(np, "linux,wakeup"); /* legacy */ 432 433 if (of_get_property(np, "gpio-activelow", NULL)) 434 pdata->active_low = true; 435 436 pdata->drive_inactive_cols = 437 of_property_read_bool(np, "drive-inactive-cols"); 438 439 of_property_read_u32(np, "debounce-delay-ms", &pdata->debounce_ms); 440 of_property_read_u32(np, "col-scan-delay-us", 441 &pdata->col_scan_delay_us); 442 443 gpios = devm_kcalloc(dev, 444 pdata->num_row_gpios + pdata->num_col_gpios, 445 sizeof(unsigned int), 446 GFP_KERNEL); 447 if (!gpios) { 448 dev_err(dev, "could not allocate memory for gpios\n"); 449 return ERR_PTR(-ENOMEM); 450 } 451 452 for (i = 0; i < nrow; i++) { 453 ret = of_get_named_gpio(np, "row-gpios", i); 454 if (ret < 0) 455 return ERR_PTR(ret); 456 gpios[i] = ret; 457 } 458 459 for (i = 0; i < ncol; i++) { 460 ret = of_get_named_gpio(np, "col-gpios", i); 461 if (ret < 0) 462 return ERR_PTR(ret); 463 gpios[nrow + i] = ret; 464 } 465 466 pdata->row_gpios = gpios; 467 pdata->col_gpios = &gpios[pdata->num_row_gpios]; 468 469 return pdata; 470 } 471 #else 472 static inline struct matrix_keypad_platform_data * 473 matrix_keypad_parse_dt(struct device *dev) 474 { 475 dev_err(dev, "no platform data defined\n"); 476 477 return ERR_PTR(-EINVAL); 478 } 479 #endif 480 481 static int matrix_keypad_probe(struct platform_device *pdev) 482 { 483 const struct matrix_keypad_platform_data *pdata; 484 struct matrix_keypad *keypad; 485 struct input_dev *input_dev; 486 int err; 487 488 pdata = dev_get_platdata(&pdev->dev); 489 if (!pdata) { 490 pdata = matrix_keypad_parse_dt(&pdev->dev); 491 if (IS_ERR(pdata)) 492 return PTR_ERR(pdata); 493 } else if (!pdata->keymap_data) { 494 dev_err(&pdev->dev, "no keymap data defined\n"); 495 return -EINVAL; 496 } 497 498 keypad = kzalloc(sizeof(struct matrix_keypad), GFP_KERNEL); 499 input_dev = input_allocate_device(); 500 if (!keypad || !input_dev) { 501 err = -ENOMEM; 502 goto err_free_mem; 503 } 504 505 keypad->input_dev = input_dev; 506 keypad->pdata = pdata; 507 keypad->row_shift = get_count_order(pdata->num_col_gpios); 508 keypad->stopped = true; 509 INIT_DELAYED_WORK(&keypad->work, matrix_keypad_scan); 510 spin_lock_init(&keypad->lock); 511 512 input_dev->name = pdev->name; 513 input_dev->id.bustype = BUS_HOST; 514 input_dev->dev.parent = &pdev->dev; 515 input_dev->open = matrix_keypad_start; 516 input_dev->close = matrix_keypad_stop; 517 518 err = matrix_keypad_build_keymap(pdata->keymap_data, NULL, 519 pdata->num_row_gpios, 520 pdata->num_col_gpios, 521 NULL, input_dev); 522 if (err) { 523 dev_err(&pdev->dev, "failed to build keymap\n"); 524 goto err_free_mem; 525 } 526 527 if (!pdata->no_autorepeat) 528 __set_bit(EV_REP, input_dev->evbit); 529 input_set_capability(input_dev, EV_MSC, MSC_SCAN); 530 input_set_drvdata(input_dev, keypad); 531 532 err = matrix_keypad_init_gpio(pdev, keypad); 533 if (err) 534 goto err_free_mem; 535 536 err = input_register_device(keypad->input_dev); 537 if (err) 538 goto err_free_gpio; 539 540 device_init_wakeup(&pdev->dev, pdata->wakeup); 541 platform_set_drvdata(pdev, keypad); 542 543 return 0; 544 545 err_free_gpio: 546 matrix_keypad_free_gpio(keypad); 547 err_free_mem: 548 input_free_device(input_dev); 549 kfree(keypad); 550 return err; 551 } 552 553 static int matrix_keypad_remove(struct platform_device *pdev) 554 { 555 struct matrix_keypad *keypad = platform_get_drvdata(pdev); 556 557 matrix_keypad_free_gpio(keypad); 558 input_unregister_device(keypad->input_dev); 559 kfree(keypad); 560 561 return 0; 562 } 563 564 #ifdef CONFIG_OF 565 static const struct of_device_id matrix_keypad_dt_match[] = { 566 { .compatible = "gpio-matrix-keypad" }, 567 { } 568 }; 569 MODULE_DEVICE_TABLE(of, matrix_keypad_dt_match); 570 #endif 571 572 static struct platform_driver matrix_keypad_driver = { 573 .probe = matrix_keypad_probe, 574 .remove = matrix_keypad_remove, 575 .driver = { 576 .name = "matrix-keypad", 577 .pm = &matrix_keypad_pm_ops, 578 .of_match_table = of_match_ptr(matrix_keypad_dt_match), 579 }, 580 }; 581 module_platform_driver(matrix_keypad_driver); 582 583 MODULE_AUTHOR("Marek Vasut <marek.vasut@gmail.com>"); 584 MODULE_DESCRIPTION("GPIO Driven Matrix Keypad Driver"); 585 MODULE_LICENSE("GPL v2"); 586 MODULE_ALIAS("platform:matrix-keypad"); 587