1*2874c5fdSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later
23b8006e5SJiri Slaby /*
33b8006e5SJiri Slaby * HID driver for some monterey "special" devices
43b8006e5SJiri Slaby *
53b8006e5SJiri Slaby * Copyright (c) 1999 Andreas Gal
63b8006e5SJiri Slaby * Copyright (c) 2000-2005 Vojtech Pavlik <vojtech@suse.cz>
73b8006e5SJiri Slaby * Copyright (c) 2005 Michael Haboustak <mike-@cinci.rr.com> for Concept2, Inc
83b8006e5SJiri Slaby * Copyright (c) 2006-2007 Jiri Kosina
93b8006e5SJiri Slaby * Copyright (c) 2008 Jiri Slaby
103b8006e5SJiri Slaby */
113b8006e5SJiri Slaby
123b8006e5SJiri Slaby /*
133b8006e5SJiri Slaby */
143b8006e5SJiri Slaby
153b8006e5SJiri Slaby #include <linux/device.h>
163b8006e5SJiri Slaby #include <linux/hid.h>
173b8006e5SJiri Slaby #include <linux/module.h>
183b8006e5SJiri Slaby
193b8006e5SJiri Slaby #include "hid-ids.h"
203b8006e5SJiri Slaby
mr_report_fixup(struct hid_device * hdev,__u8 * rdesc,unsigned int * rsize)2173e4008dSNikolai Kondrashov static __u8 *mr_report_fixup(struct hid_device *hdev, __u8 *rdesc,
2273e4008dSNikolai Kondrashov unsigned int *rsize)
233b8006e5SJiri Slaby {
244ab25786SJiri Kosina if (*rsize >= 31 && rdesc[29] == 0x05 && rdesc[30] == 0x09) {
254291ee30SJoe Perches hid_info(hdev, "fixing up button/consumer in HID report descriptor\n");
263b8006e5SJiri Slaby rdesc[30] = 0x0c;
273b8006e5SJiri Slaby }
2873e4008dSNikolai Kondrashov return rdesc;
293b8006e5SJiri Slaby }
303b8006e5SJiri Slaby
313b8006e5SJiri Slaby #define mr_map_key_clear(c) hid_map_usage_clear(hi, usage, bit, max, \
323b8006e5SJiri Slaby EV_KEY, (c))
mr_input_mapping(struct hid_device * hdev,struct hid_input * hi,struct hid_field * field,struct hid_usage * usage,unsigned long ** bit,int * max)333b8006e5SJiri Slaby static int mr_input_mapping(struct hid_device *hdev, struct hid_input *hi,
343b8006e5SJiri Slaby struct hid_field *field, struct hid_usage *usage,
353b8006e5SJiri Slaby unsigned long **bit, int *max)
363b8006e5SJiri Slaby {
373b8006e5SJiri Slaby if ((usage->hid & HID_USAGE_PAGE) != HID_UP_CONSUMER)
383b8006e5SJiri Slaby return 0;
393b8006e5SJiri Slaby
403b8006e5SJiri Slaby switch (usage->hid & HID_USAGE) {
413b8006e5SJiri Slaby case 0x156: mr_map_key_clear(KEY_WORDPROCESSOR); break;
423b8006e5SJiri Slaby case 0x157: mr_map_key_clear(KEY_SPREADSHEET); break;
433b8006e5SJiri Slaby case 0x158: mr_map_key_clear(KEY_PRESENTATION); break;
443b8006e5SJiri Slaby case 0x15c: mr_map_key_clear(KEY_STOP); break;
453b8006e5SJiri Slaby default:
463b8006e5SJiri Slaby return 0;
473b8006e5SJiri Slaby }
483b8006e5SJiri Slaby return 1;
493b8006e5SJiri Slaby }
503b8006e5SJiri Slaby
513b8006e5SJiri Slaby static const struct hid_device_id mr_devices[] = {
523b8006e5SJiri Slaby { HID_USB_DEVICE(USB_VENDOR_ID_MONTEREY, USB_DEVICE_ID_GENIUS_KB29E) },
533b8006e5SJiri Slaby { }
543b8006e5SJiri Slaby };
553b8006e5SJiri Slaby MODULE_DEVICE_TABLE(hid, mr_devices);
563b8006e5SJiri Slaby
573b8006e5SJiri Slaby static struct hid_driver mr_driver = {
583b8006e5SJiri Slaby .name = "monterey",
593b8006e5SJiri Slaby .id_table = mr_devices,
603b8006e5SJiri Slaby .report_fixup = mr_report_fixup,
613b8006e5SJiri Slaby .input_mapping = mr_input_mapping,
623b8006e5SJiri Slaby };
63f425458eSH Hartley Sweeten module_hid_driver(mr_driver);
643b8006e5SJiri Slaby
653b8006e5SJiri Slaby MODULE_LICENSE("GPL");
66