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

Configure Feed

Select the types of activity you want to include in your feed.

Input: keypad-nomadik-ske - remove the driver

The users of this driver were removed in 2013 in commit 28633c54bda6
("ARM: ux500: Rip out keypad initialisation which is no longer used").

Remove the driver as well.

Acked-by: Arnd Bergmann <arnd@arndb.de>
Link: https://lore.kernel.org/r/Zr-gX0dfN4te_8VG@google.com
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>

-440
-11
drivers/input/keyboard/Kconfig
··· 473 473 To compile this driver as a module, choose M here: the 474 474 module will be called newtonkbd. 475 475 476 - config KEYBOARD_NOMADIK 477 - tristate "ST-Ericsson Nomadik SKE keyboard" 478 - depends on (ARCH_NOMADIK || ARCH_U8500 || COMPILE_TEST) 479 - select INPUT_MATRIXKMAP 480 - help 481 - Say Y here if you want to use a keypad provided on the SKE controller 482 - used on the Ux500 and Nomadik platforms 483 - 484 - To compile this driver as a module, choose M here: the 485 - module will be called nmk-ske-keypad. 486 - 487 476 config KEYBOARD_NSPIRE 488 477 tristate "TI-NSPIRE built-in keyboard" 489 478 depends on ARCH_NSPIRE && OF
-1
drivers/input/keyboard/Makefile
··· 45 45 obj-$(CONFIG_KEYBOARD_MT6779) += mt6779-keypad.o 46 46 obj-$(CONFIG_KEYBOARD_MTK_PMIC) += mtk-pmic-keys.o 47 47 obj-$(CONFIG_KEYBOARD_NEWTON) += newtonkbd.o 48 - obj-$(CONFIG_KEYBOARD_NOMADIK) += nomadik-ske-keypad.o 49 48 obj-$(CONFIG_KEYBOARD_NSPIRE) += nspire-keypad.o 50 49 obj-$(CONFIG_KEYBOARD_OMAP) += omap-keypad.o 51 50 obj-$(CONFIG_KEYBOARD_OMAP4) += omap4-keypad.o
-378
drivers/input/keyboard/nomadik-ske-keypad.c
··· 1 - // SPDX-License-Identifier: GPL-2.0-only 2 - /* 3 - * Copyright (C) ST-Ericsson SA 2010 4 - * 5 - * Author: Naveen Kumar G <naveen.gaddipati@stericsson.com> for ST-Ericsson 6 - * Author: Sundar Iyer <sundar.iyer@stericsson.com> for ST-Ericsson 7 - * 8 - * Keypad controller driver for the SKE (Scroll Key Encoder) module used in 9 - * the Nomadik 8815 and Ux500 platforms. 10 - */ 11 - 12 - #include <linux/platform_device.h> 13 - #include <linux/interrupt.h> 14 - #include <linux/spinlock.h> 15 - #include <linux/io.h> 16 - #include <linux/delay.h> 17 - #include <linux/input.h> 18 - #include <linux/slab.h> 19 - #include <linux/clk.h> 20 - #include <linux/module.h> 21 - 22 - #include <linux/platform_data/keypad-nomadik-ske.h> 23 - 24 - /* SKE_CR bits */ 25 - #define SKE_KPMLT (0x1 << 6) 26 - #define SKE_KPCN (0x7 << 3) 27 - #define SKE_KPASEN (0x1 << 2) 28 - #define SKE_KPASON (0x1 << 7) 29 - 30 - /* SKE_IMSC bits */ 31 - #define SKE_KPIMA (0x1 << 2) 32 - 33 - /* SKE_ICR bits */ 34 - #define SKE_KPICS (0x1 << 3) 35 - #define SKE_KPICA (0x1 << 2) 36 - 37 - /* SKE_RIS bits */ 38 - #define SKE_KPRISA (0x1 << 2) 39 - 40 - #define SKE_KEYPAD_ROW_SHIFT 3 41 - #define SKE_KPD_NUM_ROWS 8 42 - #define SKE_KPD_NUM_COLS 8 43 - 44 - /* keypad auto scan registers */ 45 - #define SKE_ASR0 0x20 46 - #define SKE_ASR1 0x24 47 - #define SKE_ASR2 0x28 48 - #define SKE_ASR3 0x2C 49 - 50 - #define SKE_NUM_ASRX_REGISTERS (4) 51 - #define KEY_PRESSED_DELAY 10 52 - 53 - /** 54 - * struct ske_keypad - data structure used by keypad driver 55 - * @irq: irq no 56 - * @reg_base: ske registers base address 57 - * @input: pointer to input device object 58 - * @board: keypad platform device 59 - * @keymap: matrix scan code table for keycodes 60 - * @clk: clock structure pointer 61 - * @pclk: clock structure pointer 62 - * @ske_keypad_lock: spinlock protecting the keypad read/writes 63 - */ 64 - struct ske_keypad { 65 - int irq; 66 - void __iomem *reg_base; 67 - struct input_dev *input; 68 - const struct ske_keypad_platform_data *board; 69 - unsigned short keymap[SKE_KPD_NUM_ROWS * SKE_KPD_NUM_COLS]; 70 - struct clk *clk; 71 - struct clk *pclk; 72 - spinlock_t ske_keypad_lock; 73 - }; 74 - 75 - static void ske_keypad_set_bits(struct ske_keypad *keypad, u16 addr, 76 - u8 mask, u8 data) 77 - { 78 - u32 ret; 79 - 80 - spin_lock(&keypad->ske_keypad_lock); 81 - 82 - ret = readl(keypad->reg_base + addr); 83 - ret &= ~mask; 84 - ret |= data; 85 - writel(ret, keypad->reg_base + addr); 86 - 87 - spin_unlock(&keypad->ske_keypad_lock); 88 - } 89 - 90 - /* 91 - * ske_keypad_chip_init: init keypad controller configuration 92 - * 93 - * Enable Multi key press detection, auto scan mode 94 - */ 95 - static int __init ske_keypad_chip_init(struct ske_keypad *keypad) 96 - { 97 - u32 value; 98 - int timeout = keypad->board->debounce_ms; 99 - 100 - /* check SKE_RIS to be 0 */ 101 - while ((readl(keypad->reg_base + SKE_RIS) != 0x00000000) && timeout--) 102 - cpu_relax(); 103 - 104 - if (timeout == -1) 105 - return -EINVAL; 106 - 107 - /* 108 - * set debounce value 109 - * keypad dbounce is configured in DBCR[15:8] 110 - * dbounce value in steps of 32/32.768 ms 111 - */ 112 - spin_lock(&keypad->ske_keypad_lock); 113 - value = readl(keypad->reg_base + SKE_DBCR); 114 - value = value & 0xff; 115 - value |= ((keypad->board->debounce_ms * 32000)/32768) << 8; 116 - writel(value, keypad->reg_base + SKE_DBCR); 117 - spin_unlock(&keypad->ske_keypad_lock); 118 - 119 - /* enable multi key detection */ 120 - ske_keypad_set_bits(keypad, SKE_CR, 0x0, SKE_KPMLT); 121 - 122 - /* 123 - * set up the number of columns 124 - * KPCN[5:3] defines no. of keypad columns to be auto scanned 125 - */ 126 - value = (keypad->board->kcol - 1) << 3; 127 - ske_keypad_set_bits(keypad, SKE_CR, SKE_KPCN, value); 128 - 129 - /* clear keypad interrupt for auto(and pending SW) scans */ 130 - ske_keypad_set_bits(keypad, SKE_ICR, 0x0, SKE_KPICA | SKE_KPICS); 131 - 132 - /* un-mask keypad interrupts */ 133 - ske_keypad_set_bits(keypad, SKE_IMSC, 0x0, SKE_KPIMA); 134 - 135 - /* enable automatic scan */ 136 - ske_keypad_set_bits(keypad, SKE_CR, 0x0, SKE_KPASEN); 137 - 138 - return 0; 139 - } 140 - 141 - static void ske_keypad_report(struct ske_keypad *keypad, u8 status, int col) 142 - { 143 - int row = 0, code, pos; 144 - struct input_dev *input = keypad->input; 145 - u32 ske_ris; 146 - int key_pressed; 147 - int num_of_rows; 148 - 149 - /* find out the row */ 150 - num_of_rows = hweight8(status); 151 - do { 152 - pos = __ffs(status); 153 - row = pos; 154 - status &= ~(1 << pos); 155 - 156 - code = MATRIX_SCAN_CODE(row, col, SKE_KEYPAD_ROW_SHIFT); 157 - ske_ris = readl(keypad->reg_base + SKE_RIS); 158 - key_pressed = ske_ris & SKE_KPRISA; 159 - 160 - input_event(input, EV_MSC, MSC_SCAN, code); 161 - input_report_key(input, keypad->keymap[code], key_pressed); 162 - input_sync(input); 163 - num_of_rows--; 164 - } while (num_of_rows); 165 - } 166 - 167 - static void ske_keypad_read_data(struct ske_keypad *keypad) 168 - { 169 - u8 status; 170 - int col = 0; 171 - int ske_asr, i; 172 - 173 - /* 174 - * Read the auto scan registers 175 - * 176 - * Each SKE_ASRx (x=0 to x=3) contains two row values. 177 - * lower byte contains row value for column 2*x, 178 - * upper byte contains row value for column 2*x + 1 179 - */ 180 - for (i = 0; i < SKE_NUM_ASRX_REGISTERS; i++) { 181 - ske_asr = readl(keypad->reg_base + SKE_ASR0 + (4 * i)); 182 - if (!ske_asr) 183 - continue; 184 - 185 - /* now that ASRx is zero, find out the coloumn x and row y */ 186 - status = ske_asr & 0xff; 187 - if (status) { 188 - col = i * 2; 189 - ske_keypad_report(keypad, status, col); 190 - } 191 - status = (ske_asr & 0xff00) >> 8; 192 - if (status) { 193 - col = (i * 2) + 1; 194 - ske_keypad_report(keypad, status, col); 195 - } 196 - } 197 - } 198 - 199 - static irqreturn_t ske_keypad_irq(int irq, void *dev_id) 200 - { 201 - struct ske_keypad *keypad = dev_id; 202 - int timeout = keypad->board->debounce_ms; 203 - 204 - /* disable auto scan interrupt; mask the interrupt generated */ 205 - ske_keypad_set_bits(keypad, SKE_IMSC, ~SKE_KPIMA, 0x0); 206 - ske_keypad_set_bits(keypad, SKE_ICR, 0x0, SKE_KPICA); 207 - 208 - while ((readl(keypad->reg_base + SKE_CR) & SKE_KPASON) && --timeout) 209 - cpu_relax(); 210 - 211 - /* SKEx registers are stable and can be read */ 212 - ske_keypad_read_data(keypad); 213 - 214 - /* wait until raw interrupt is clear */ 215 - while ((readl(keypad->reg_base + SKE_RIS)) && --timeout) 216 - msleep(KEY_PRESSED_DELAY); 217 - 218 - /* enable auto scan interrupts */ 219 - ske_keypad_set_bits(keypad, SKE_IMSC, 0x0, SKE_KPIMA); 220 - 221 - return IRQ_HANDLED; 222 - } 223 - 224 - static void ske_keypad_board_exit(void *data) 225 - { 226 - struct ske_keypad *keypad = data; 227 - 228 - keypad->board->exit(); 229 - } 230 - 231 - static int __init ske_keypad_probe(struct platform_device *pdev) 232 - { 233 - const struct ske_keypad_platform_data *plat = 234 - dev_get_platdata(&pdev->dev); 235 - struct device *dev = &pdev->dev; 236 - struct ske_keypad *keypad; 237 - struct input_dev *input; 238 - int irq; 239 - int error; 240 - 241 - if (!plat) { 242 - dev_err(&pdev->dev, "invalid keypad platform data\n"); 243 - return -EINVAL; 244 - } 245 - 246 - irq = platform_get_irq(pdev, 0); 247 - if (irq < 0) 248 - return irq; 249 - 250 - keypad = devm_kzalloc(dev, sizeof(struct ske_keypad), 251 - GFP_KERNEL); 252 - input = devm_input_allocate_device(dev); 253 - if (!keypad || !input) { 254 - dev_err(&pdev->dev, "failed to allocate keypad memory\n"); 255 - return -ENOMEM; 256 - } 257 - 258 - keypad->irq = irq; 259 - keypad->board = plat; 260 - keypad->input = input; 261 - spin_lock_init(&keypad->ske_keypad_lock); 262 - 263 - keypad->reg_base = devm_platform_ioremap_resource(pdev, 0); 264 - if (IS_ERR(keypad->reg_base)) 265 - return PTR_ERR(keypad->reg_base); 266 - 267 - keypad->pclk = devm_clk_get_enabled(dev, "apb_pclk"); 268 - if (IS_ERR(keypad->pclk)) { 269 - dev_err(&pdev->dev, "failed to get pclk\n"); 270 - return PTR_ERR(keypad->pclk); 271 - } 272 - 273 - keypad->clk = devm_clk_get_enabled(dev, NULL); 274 - if (IS_ERR(keypad->clk)) { 275 - dev_err(&pdev->dev, "failed to get clk\n"); 276 - return PTR_ERR(keypad->clk); 277 - } 278 - 279 - input->id.bustype = BUS_HOST; 280 - input->name = "ux500-ske-keypad"; 281 - input->dev.parent = &pdev->dev; 282 - 283 - error = matrix_keypad_build_keymap(plat->keymap_data, NULL, 284 - SKE_KPD_NUM_ROWS, SKE_KPD_NUM_COLS, 285 - keypad->keymap, input); 286 - if (error) { 287 - dev_err(&pdev->dev, "Failed to build keymap\n"); 288 - return error; 289 - } 290 - 291 - input_set_capability(input, EV_MSC, MSC_SCAN); 292 - if (!plat->no_autorepeat) 293 - __set_bit(EV_REP, input->evbit); 294 - 295 - /* go through board initialization helpers */ 296 - if (keypad->board->init) 297 - keypad->board->init(); 298 - 299 - if (keypad->board->exit) { 300 - error = devm_add_action_or_reset(dev, ske_keypad_board_exit, 301 - keypad); 302 - if (error) 303 - return error; 304 - } 305 - 306 - error = ske_keypad_chip_init(keypad); 307 - if (error) { 308 - dev_err(&pdev->dev, "unable to init keypad hardware\n"); 309 - return error; 310 - } 311 - 312 - error = devm_request_threaded_irq(dev, keypad->irq, 313 - NULL, ske_keypad_irq, 314 - IRQF_ONESHOT, "ske-keypad", keypad); 315 - if (error) { 316 - dev_err(&pdev->dev, "allocate irq %d failed\n", keypad->irq); 317 - return error; 318 - } 319 - 320 - error = input_register_device(input); 321 - if (error) { 322 - dev_err(&pdev->dev, 323 - "unable to register input device: %d\n", error); 324 - return error; 325 - } 326 - 327 - if (plat->wakeup_enable) 328 - device_init_wakeup(&pdev->dev, true); 329 - 330 - platform_set_drvdata(pdev, keypad); 331 - 332 - return 0; 333 - } 334 - 335 - static int ske_keypad_suspend(struct device *dev) 336 - { 337 - struct platform_device *pdev = to_platform_device(dev); 338 - struct ske_keypad *keypad = platform_get_drvdata(pdev); 339 - int irq = platform_get_irq(pdev, 0); 340 - 341 - if (device_may_wakeup(dev)) 342 - enable_irq_wake(irq); 343 - else 344 - ske_keypad_set_bits(keypad, SKE_IMSC, ~SKE_KPIMA, 0x0); 345 - 346 - return 0; 347 - } 348 - 349 - static int ske_keypad_resume(struct device *dev) 350 - { 351 - struct platform_device *pdev = to_platform_device(dev); 352 - struct ske_keypad *keypad = platform_get_drvdata(pdev); 353 - int irq = platform_get_irq(pdev, 0); 354 - 355 - if (device_may_wakeup(dev)) 356 - disable_irq_wake(irq); 357 - else 358 - ske_keypad_set_bits(keypad, SKE_IMSC, 0x0, SKE_KPIMA); 359 - 360 - return 0; 361 - } 362 - 363 - static DEFINE_SIMPLE_DEV_PM_OPS(ske_keypad_dev_pm_ops, 364 - ske_keypad_suspend, ske_keypad_resume); 365 - 366 - static struct platform_driver ske_keypad_driver = { 367 - .driver = { 368 - .name = "nmk-ske-keypad", 369 - .pm = pm_sleep_ptr(&ske_keypad_dev_pm_ops), 370 - }, 371 - }; 372 - 373 - module_platform_driver_probe(ske_keypad_driver, ske_keypad_probe); 374 - 375 - MODULE_LICENSE("GPL v2"); 376 - MODULE_AUTHOR("Naveen Kumar <naveen.gaddipati@stericsson.com> / Sundar Iyer <sundar.iyer@stericsson.com>"); 377 - MODULE_DESCRIPTION("Nomadik Scroll-Key-Encoder Keypad Driver"); 378 - MODULE_ALIAS("platform:nomadik-ske-keypad");
-50
include/linux/platform_data/keypad-nomadik-ske.h
··· 1 - /* SPDX-License-Identifier: GPL-2.0-only */ 2 - /* 3 - * Copyright (C) ST-Ericsson SA 2010 4 - * 5 - * Author: Naveen Kumar Gaddipati <naveen.gaddipati@stericsson.com> 6 - * 7 - * ux500 Scroll key and Keypad Encoder (SKE) header 8 - */ 9 - 10 - #ifndef __SKE_H 11 - #define __SKE_H 12 - 13 - #include <linux/input/matrix_keypad.h> 14 - 15 - /* register definitions for SKE peripheral */ 16 - #define SKE_CR 0x00 17 - #define SKE_VAL0 0x04 18 - #define SKE_VAL1 0x08 19 - #define SKE_DBCR 0x0C 20 - #define SKE_IMSC 0x10 21 - #define SKE_RIS 0x14 22 - #define SKE_MIS 0x18 23 - #define SKE_ICR 0x1C 24 - 25 - /* 26 - * Keypad module 27 - */ 28 - 29 - /** 30 - * struct keypad_platform_data - structure for platform specific data 31 - * @init: pointer to keypad init function 32 - * @exit: pointer to keypad deinitialisation function 33 - * @keymap_data: matrix scan code table for keycodes 34 - * @krow: maximum number of rows 35 - * @kcol: maximum number of columns 36 - * @debounce_ms: platform specific debounce time 37 - * @no_autorepeat: flag for auto repetition 38 - * @wakeup_enable: allow waking up the system 39 - */ 40 - struct ske_keypad_platform_data { 41 - int (*init)(void); 42 - int (*exit)(void); 43 - const struct matrix_keymap_data *keymap_data; 44 - u8 krow; 45 - u8 kcol; 46 - u8 debounce_ms; 47 - bool no_autorepeat; 48 - bool wakeup_enable; 49 - }; 50 - #endif /*__SKE_KPD_H*/