Lines Matching +full:linux +full:- +full:event +full:- +full:codes
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * dm355evm_keys.c - support buttons and IR remote on DM355 EVM board
7 #include <linux/kernel.h>
8 #include <linux/slab.h>
9 #include <linux/input.h>
10 #include <linux/input/sparse-keymap.h>
11 #include <linux/platform_device.h>
12 #include <linux/interrupt.h>
14 #include <linux/mfd/dm355evm_msp.h>
15 #include <linux/module.h>
19 * The MSP430 firmware on the DM355 EVM monitors on-board pushbuttons
21 * pressed, or its autorepeat kicks in, an event is sent. This driver
22 * read those events from the small (32 event) queue and reports them.
40 * is to the right. (That is, rotate the board counter-clockwise
50 * IR buttons ... codes assigned to match the universal remote
53 * These event codes match firmware documentation, but other
54 * remote controls could easily send more RC5-encoded events.
58 * RC5 codes are 14 bits, with two start bits (0x3 prefix)
94 * in Linux sleep, we use a threaded IRQ handler. The IRQ itself is
106 u16 event; in dm355evm_keys_irq() local
115 dev_dbg(keys->dev, "input high err %d\n", in dm355evm_keys_irq()
119 event = status << 8; in dm355evm_keys_irq()
123 dev_dbg(keys->dev, "input low err %d\n", in dm355evm_keys_irq()
127 event |= status; in dm355evm_keys_irq()
128 if (event == 0xdead) in dm355evm_keys_irq()
134 * distinguish (for example) "1-autorepeat" from "1 1"; in dm355evm_keys_irq()
138 * mapping events to a press/release event pair; then in dm355evm_keys_irq()
139 * to avoid adding extra events, skip the second event in dm355evm_keys_irq()
142 if (event == last_event) { in dm355evm_keys_irq()
146 last_event = event; in dm355evm_keys_irq()
149 event &= ~0x0800; in dm355evm_keys_irq()
152 ke = sparse_keymap_entry_from_scancode(keys->input, event); in dm355evm_keys_irq()
153 keycode = ke ? ke->keycode : KEY_UNKNOWN; in dm355evm_keys_irq()
154 dev_dbg(keys->dev, in dm355evm_keys_irq()
155 "input event 0x%04x--> keycode %d\n", in dm355evm_keys_irq()
156 event, keycode); in dm355evm_keys_irq()
159 input_report_key(keys->input, keycode, 1); in dm355evm_keys_irq()
160 input_sync(keys->input); in dm355evm_keys_irq()
161 input_report_key(keys->input, keycode, 0); in dm355evm_keys_irq()
162 input_sync(keys->input); in dm355evm_keys_irq()
168 /*----------------------------------------------------------------------*/
177 keys = devm_kzalloc(&pdev->dev, sizeof (*keys), GFP_KERNEL); in dm355evm_keys_probe()
179 return -ENOMEM; in dm355evm_keys_probe()
181 input = devm_input_allocate_device(&pdev->dev); in dm355evm_keys_probe()
183 return -ENOMEM; in dm355evm_keys_probe()
185 keys->dev = &pdev->dev; in dm355evm_keys_probe()
186 keys->input = input; in dm355evm_keys_probe()
188 input->name = "DM355 EVM Controls"; in dm355evm_keys_probe()
189 input->phys = "dm355evm/input0"; in dm355evm_keys_probe()
191 input->id.bustype = BUS_I2C; in dm355evm_keys_probe()
192 input->id.product = 0x0355; in dm355evm_keys_probe()
193 input->id.version = dm355evm_msp_read(DM355EVM_MSP_FIRMREV); in dm355evm_keys_probe()
199 /* REVISIT: flush the event queue? */ in dm355evm_keys_probe()
206 error = devm_request_threaded_irq(&pdev->dev, irq, in dm355evm_keys_probe()
209 dev_name(&pdev->dev), keys); in dm355evm_keys_probe()
222 * be able to wake up the system. When device_may_wakeup(&pdev->dev), call