cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

wacom.h (8265B)


      1/* SPDX-License-Identifier: GPL-2.0-or-later */
      2/*
      3 * drivers/input/tablet/wacom.h
      4 *
      5 *  USB Wacom tablet support
      6 *
      7 *  Copyright (c) 2000-2004 Vojtech Pavlik	<vojtech@ucw.cz>
      8 *  Copyright (c) 2000 Andreas Bach Aaen	<abach@stofanet.dk>
      9 *  Copyright (c) 2000 Clifford Wolf		<clifford@clifford.at>
     10 *  Copyright (c) 2000 Sam Mosel		<sam.mosel@computer.org>
     11 *  Copyright (c) 2000 James E. Blair		<corvus@gnu.org>
     12 *  Copyright (c) 2000 Daniel Egger		<egger@suse.de>
     13 *  Copyright (c) 2001 Frederic Lepied		<flepied@mandrakesoft.com>
     14 *  Copyright (c) 2004 Panagiotis Issaris	<panagiotis.issaris@mech.kuleuven.ac.be>
     15 *  Copyright (c) 2002-2011 Ping Cheng		<pingc@wacom.com>
     16 *  Copyright (c) 2014 Benjamin Tissoires	<benjamin.tissoires@redhat.com>
     17 *
     18 *  ChangeLog:
     19 *      v0.1 (vp)  - Initial release
     20 *      v0.2 (aba) - Support for all buttons / combinations
     21 *      v0.3 (vp)  - Support for Intuos added
     22 *	v0.4 (sm)  - Support for more Intuos models, menustrip
     23 *			relative mode, proximity.
     24 *	v0.5 (vp)  - Big cleanup, nifty features removed,
     25 *			they belong in userspace
     26 *	v1.8 (vp)  - Submit URB only when operating, moved to CVS,
     27 *			use input_report_key instead of report_btn and
     28 *			other cleanups
     29 *	v1.11 (vp) - Add URB ->dev setting for new kernels
     30 *	v1.11 (jb) - Add support for the 4D Mouse & Lens
     31 *	v1.12 (de) - Add support for two more inking pen IDs
     32 *	v1.14 (vp) - Use new USB device id probing scheme.
     33 *		     Fix Wacom Graphire mouse wheel
     34 *	v1.18 (vp) - Fix mouse wheel direction
     35 *		     Make mouse relative
     36 *      v1.20 (fl) - Report tool id for Intuos devices
     37 *                 - Multi tools support
     38 *                 - Corrected Intuos protocol decoding (airbrush, 4D mouse, lens cursor...)
     39 *                 - Add PL models support
     40 *		   - Fix Wacom Graphire mouse wheel again
     41 *	v1.21 (vp) - Removed protocol descriptions
     42 *		   - Added MISC_SERIAL for tool serial numbers
     43 *	      (gb) - Identify version on module load.
     44 *    v1.21.1 (fl) - added Graphire2 support
     45 *    v1.21.2 (fl) - added Intuos2 support
     46 *                 - added all the PL ids
     47 *    v1.21.3 (fl) - added another eraser id from Neil Okamoto
     48 *                 - added smooth filter for Graphire from Peri Hankey
     49 *                 - added PenPartner support from Olaf van Es
     50 *                 - new tool ids from Ole Martin Bjoerndalen
     51 *	v1.29 (pc) - Add support for more tablets
     52 *		   - Fix pressure reporting
     53 *	v1.30 (vp) - Merge 2.4 and 2.5 drivers
     54 *		   - Since 2.5 now has input_sync(), remove MSC_SERIAL abuse
     55 *		   - Cleanups here and there
     56 *    v1.30.1 (pi) - Added Graphire3 support
     57 *	v1.40 (pc) - Add support for several new devices, fix eraser reporting, ...
     58 *	v1.43 (pc) - Added support for Cintiq 21UX
     59 *		   - Fixed a Graphire bug
     60 *		   - Merged wacom_intuos3_irq into wacom_intuos_irq
     61 *	v1.44 (pc) - Added support for Graphire4, Cintiq 710, Intuos3 6x11, etc.
     62 *		   - Report Device IDs
     63 *      v1.45 (pc) - Added support for DTF 521, Intuos3 12x12 and 12x19
     64 *                 - Minor data report fix
     65 *      v1.46 (pc) - Split wacom.c into wacom_sys.c and wacom_wac.c,
     66 *		   - where wacom_sys.c deals with system specific code,
     67 *		   - and wacom_wac.c deals with Wacom specific code
     68 *		   - Support Intuos3 4x6
     69 *      v1.47 (pc) - Added support for Bamboo
     70 *      v1.48 (pc) - Added support for Bamboo1, BambooFun, and Cintiq 12WX
     71 *      v1.49 (pc) - Added support for USB Tablet PC (0x90, 0x93, and 0x9A)
     72 *      v1.50 (pc) - Fixed a TabletPC touch bug in 2.6.28
     73 *      v1.51 (pc) - Added support for Intuos4
     74 *      v1.52 (pc) - Query Wacom data upon system resume
     75 *                 - add defines for features->type
     76 *                 - add new devices (0x9F, 0xE2, and 0XE3)
     77 *      v2.00 (bt) - conversion to a HID driver
     78 *                 - integration of the Bluetooth devices
     79 */
     80
     81/*
     82 */
     83#ifndef WACOM_H
     84#define WACOM_H
     85#include <linux/kernel.h>
     86#include <linux/slab.h>
     87#include <linux/module.h>
     88#include <linux/mod_devicetable.h>
     89#include <linux/hid.h>
     90#include <linux/kfifo.h>
     91#include <linux/leds.h>
     92#include <linux/usb/input.h>
     93#include <linux/power_supply.h>
     94#include <asm/unaligned.h>
     95
     96/*
     97 * Version Information
     98 */
     99#define DRIVER_VERSION "v2.00"
    100#define DRIVER_AUTHOR "Vojtech Pavlik <vojtech@ucw.cz>"
    101#define DRIVER_DESC "USB Wacom tablet driver"
    102
    103#define USB_VENDOR_ID_WACOM	0x056a
    104#define USB_VENDOR_ID_LENOVO	0x17ef
    105
    106enum wacom_worker {
    107	WACOM_WORKER_WIRELESS,
    108	WACOM_WORKER_BATTERY,
    109	WACOM_WORKER_REMOTE,
    110	WACOM_WORKER_MODE_CHANGE,
    111};
    112
    113struct wacom;
    114
    115struct wacom_led {
    116	struct led_classdev cdev;
    117	struct led_trigger trigger;
    118	struct wacom *wacom;
    119	unsigned int group;
    120	unsigned int id;
    121	u8 llv;
    122	u8 hlv;
    123	bool held;
    124};
    125
    126struct wacom_group_leds {
    127	u8 select; /* status led selector (0..3) */
    128	struct wacom_led *leds;
    129	unsigned int count;
    130	struct device *dev;
    131};
    132
    133struct wacom_battery {
    134	struct wacom *wacom;
    135	struct power_supply_desc bat_desc;
    136	struct power_supply *battery;
    137	char bat_name[WACOM_NAME_MAX];
    138	int bat_status;
    139	int battery_capacity;
    140	int bat_charging;
    141	int bat_connected;
    142	int ps_connected;
    143};
    144
    145struct wacom_remote {
    146	spinlock_t remote_lock;
    147	struct kfifo remote_fifo;
    148	struct kobject *remote_dir;
    149	struct {
    150		struct attribute_group group;
    151		u32 serial;
    152		struct input_dev *input;
    153		bool registered;
    154		struct wacom_battery battery;
    155	} remotes[WACOM_MAX_REMOTES];
    156};
    157
    158struct wacom {
    159	struct usb_device *usbdev;
    160	struct usb_interface *intf;
    161	struct wacom_wac wacom_wac;
    162	struct hid_device *hdev;
    163	struct mutex lock;
    164	struct work_struct wireless_work;
    165	struct work_struct battery_work;
    166	struct work_struct remote_work;
    167	struct delayed_work init_work;
    168	struct wacom_remote *remote;
    169	struct work_struct mode_change_work;
    170	bool generic_has_leds;
    171	struct wacom_leds {
    172		struct wacom_group_leds *groups;
    173		unsigned int count;
    174		u8 llv;       /* status led brightness no button (1..127) */
    175		u8 hlv;       /* status led brightness button pressed (1..127) */
    176		u8 img_lum;   /* OLED matrix display brightness */
    177		u8 max_llv;   /* maximum brightness of LED (llv) */
    178		u8 max_hlv;   /* maximum brightness of LED (hlv) */
    179	} led;
    180	struct wacom_battery battery;
    181	bool resources;
    182};
    183
    184static inline void wacom_schedule_work(struct wacom_wac *wacom_wac,
    185				       enum wacom_worker which)
    186{
    187	struct wacom *wacom = container_of(wacom_wac, struct wacom, wacom_wac);
    188
    189	switch (which) {
    190	case WACOM_WORKER_WIRELESS:
    191		schedule_work(&wacom->wireless_work);
    192		break;
    193	case WACOM_WORKER_BATTERY:
    194		schedule_work(&wacom->battery_work);
    195		break;
    196	case WACOM_WORKER_REMOTE:
    197		schedule_work(&wacom->remote_work);
    198		break;
    199	case WACOM_WORKER_MODE_CHANGE:
    200		schedule_work(&wacom->mode_change_work);
    201		break;
    202	}
    203}
    204
    205/*
    206 * Convert a signed 32-bit integer to an unsigned n-bit integer. Undoes
    207 * the normally-helpful work of 'hid_snto32' for fields that use signed
    208 * ranges for questionable reasons.
    209 */
    210static inline __u32 wacom_s32tou(s32 value, __u8 n)
    211{
    212	switch (n) {
    213	case 8:  return ((__u8)value);
    214	case 16: return ((__u16)value);
    215	case 32: return ((__u32)value);
    216	}
    217	return value & (1 << (n - 1)) ? value & (~(~0U << n)) : value;
    218}
    219
    220extern const struct hid_device_id wacom_ids[];
    221
    222void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len);
    223void wacom_setup_device_quirks(struct wacom *wacom);
    224int wacom_setup_pen_input_capabilities(struct input_dev *input_dev,
    225				   struct wacom_wac *wacom_wac);
    226int wacom_setup_touch_input_capabilities(struct input_dev *input_dev,
    227				   struct wacom_wac *wacom_wac);
    228int wacom_setup_pad_input_capabilities(struct input_dev *input_dev,
    229				       struct wacom_wac *wacom_wac);
    230void wacom_wac_usage_mapping(struct hid_device *hdev,
    231		struct hid_field *field, struct hid_usage *usage);
    232void wacom_wac_event(struct hid_device *hdev, struct hid_field *field,
    233		struct hid_usage *usage, __s32 value);
    234void wacom_wac_report(struct hid_device *hdev, struct hid_report *report);
    235void wacom_battery_work(struct work_struct *work);
    236enum led_brightness wacom_leds_brightness_get(struct wacom_led *led);
    237struct wacom_led *wacom_led_find(struct wacom *wacom, unsigned int group,
    238				 unsigned int id);
    239struct wacom_led *wacom_led_next(struct wacom *wacom, struct wacom_led *cur);
    240int wacom_equivalent_usage(int usage);
    241int wacom_initialize_leds(struct wacom *wacom);
    242#endif