1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * OpenCores Keyboard Controller Driver
4 * http://www.opencores.org/project,keyboardcontroller
6 * Copyright 2007-2009 HV Sistemas S.L.
9 #include <linux/input.h>
10 #include <linux/interrupt.h>
12 #include <linux/ioport.h>
13 #include <linux/kernel.h>
14 #include <linux/module.h>
15 #include <linux/platform_device.h>
16 #include <linux/slab.h>
18 struct opencores_kbd
{
19 struct input_dev
*input
;
22 unsigned short keycodes
[128];
25 static irqreturn_t
opencores_kbd_isr(int irq
, void *dev_id
)
27 struct opencores_kbd
*opencores_kbd
= dev_id
;
28 struct input_dev
*input
= opencores_kbd
->input
;
31 c
= readb(opencores_kbd
->addr
);
32 input_report_key(input
, c
& 0x7f, c
& 0x80 ? 0 : 1);
38 static int opencores_kbd_probe(struct platform_device
*pdev
)
40 struct input_dev
*input
;
41 struct opencores_kbd
*opencores_kbd
;
44 irq
= platform_get_irq(pdev
, 0);
48 opencores_kbd
= devm_kzalloc(&pdev
->dev
, sizeof(*opencores_kbd
),
53 input
= devm_input_allocate_device(&pdev
->dev
);
55 dev_err(&pdev
->dev
, "failed to allocate input device\n");
59 opencores_kbd
->input
= input
;
61 opencores_kbd
->addr
= devm_platform_ioremap_resource(pdev
, 0);
62 if (IS_ERR(opencores_kbd
->addr
))
63 return PTR_ERR(opencores_kbd
->addr
);
65 input
->name
= pdev
->name
;
66 input
->phys
= "opencores-kbd/input0";
68 input
->id
.bustype
= BUS_HOST
;
69 input
->id
.vendor
= 0x0001;
70 input
->id
.product
= 0x0001;
71 input
->id
.version
= 0x0100;
73 input
->keycode
= opencores_kbd
->keycodes
;
74 input
->keycodesize
= sizeof(opencores_kbd
->keycodes
[0]);
75 input
->keycodemax
= ARRAY_SIZE(opencores_kbd
->keycodes
);
77 __set_bit(EV_KEY
, input
->evbit
);
79 for (i
= 0; i
< ARRAY_SIZE(opencores_kbd
->keycodes
); i
++) {
81 * OpenCores controller happens to have scancodes match
82 * our KEY_* definitions.
84 opencores_kbd
->keycodes
[i
] = i
;
85 __set_bit(opencores_kbd
->keycodes
[i
], input
->keybit
);
87 __clear_bit(KEY_RESERVED
, input
->keybit
);
89 error
= devm_request_irq(&pdev
->dev
, irq
, &opencores_kbd_isr
,
91 pdev
->name
, opencores_kbd
);
93 dev_err(&pdev
->dev
, "unable to claim irq %d\n", irq
);
97 error
= input_register_device(input
);
99 dev_err(&pdev
->dev
, "unable to register input device\n");
106 static struct platform_driver opencores_kbd_device_driver
= {
107 .probe
= opencores_kbd_probe
,
109 .name
= "opencores-kbd",
112 module_platform_driver(opencores_kbd_device_driver
);
114 MODULE_LICENSE("GPL");
115 MODULE_AUTHOR("Javier Herrero <jherrero@hvsistemas.es>");
116 MODULE_DESCRIPTION("Keyboard driver for OpenCores Keyboard Controller");