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