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

hid-logitech-hidpp.c (126076B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 *  HIDPP protocol for Logitech receivers
      4 *
      5 *  Copyright (c) 2011 Logitech (c)
      6 *  Copyright (c) 2012-2013 Google (c)
      7 *  Copyright (c) 2013-2014 Red Hat Inc.
      8 */
      9
     10
     11#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
     12
     13#include <linux/device.h>
     14#include <linux/input.h>
     15#include <linux/usb.h>
     16#include <linux/hid.h>
     17#include <linux/module.h>
     18#include <linux/slab.h>
     19#include <linux/sched.h>
     20#include <linux/sched/clock.h>
     21#include <linux/kfifo.h>
     22#include <linux/input/mt.h>
     23#include <linux/workqueue.h>
     24#include <linux/atomic.h>
     25#include <linux/fixp-arith.h>
     26#include <asm/unaligned.h>
     27#include "usbhid/usbhid.h"
     28#include "hid-ids.h"
     29
     30MODULE_LICENSE("GPL");
     31MODULE_AUTHOR("Benjamin Tissoires <benjamin.tissoires@gmail.com>");
     32MODULE_AUTHOR("Nestor Lopez Casado <nlopezcasad@logitech.com>");
     33
     34static bool disable_raw_mode;
     35module_param(disable_raw_mode, bool, 0644);
     36MODULE_PARM_DESC(disable_raw_mode,
     37	"Disable Raw mode reporting for touchpads and keep firmware gestures.");
     38
     39static bool disable_tap_to_click;
     40module_param(disable_tap_to_click, bool, 0644);
     41MODULE_PARM_DESC(disable_tap_to_click,
     42	"Disable Tap-To-Click mode reporting for touchpads (only on the K400 currently).");
     43
     44#define REPORT_ID_HIDPP_SHORT			0x10
     45#define REPORT_ID_HIDPP_LONG			0x11
     46#define REPORT_ID_HIDPP_VERY_LONG		0x12
     47
     48#define HIDPP_REPORT_SHORT_LENGTH		7
     49#define HIDPP_REPORT_LONG_LENGTH		20
     50#define HIDPP_REPORT_VERY_LONG_MAX_LENGTH	64
     51
     52#define HIDPP_REPORT_SHORT_SUPPORTED		BIT(0)
     53#define HIDPP_REPORT_LONG_SUPPORTED		BIT(1)
     54#define HIDPP_REPORT_VERY_LONG_SUPPORTED	BIT(2)
     55
     56#define HIDPP_SUB_ID_CONSUMER_VENDOR_KEYS	0x03
     57#define HIDPP_SUB_ID_ROLLER			0x05
     58#define HIDPP_SUB_ID_MOUSE_EXTRA_BTNS		0x06
     59#define HIDPP_SUB_ID_USER_IFACE_EVENT		0x08
     60#define HIDPP_USER_IFACE_EVENT_ENCRYPTION_KEY_LOST	BIT(5)
     61
     62#define HIDPP_QUIRK_CLASS_WTP			BIT(0)
     63#define HIDPP_QUIRK_CLASS_M560			BIT(1)
     64#define HIDPP_QUIRK_CLASS_K400			BIT(2)
     65#define HIDPP_QUIRK_CLASS_G920			BIT(3)
     66#define HIDPP_QUIRK_CLASS_K750			BIT(4)
     67
     68/* bits 2..20 are reserved for classes */
     69/* #define HIDPP_QUIRK_CONNECT_EVENTS		BIT(21) disabled */
     70#define HIDPP_QUIRK_WTP_PHYSICAL_BUTTONS	BIT(22)
     71#define HIDPP_QUIRK_NO_HIDINPUT			BIT(23)
     72#define HIDPP_QUIRK_FORCE_OUTPUT_REPORTS	BIT(24)
     73#define HIDPP_QUIRK_UNIFYING			BIT(25)
     74#define HIDPP_QUIRK_HI_RES_SCROLL_1P0		BIT(26)
     75#define HIDPP_QUIRK_HI_RES_SCROLL_X2120		BIT(27)
     76#define HIDPP_QUIRK_HI_RES_SCROLL_X2121		BIT(28)
     77#define HIDPP_QUIRK_HIDPP_WHEELS		BIT(29)
     78#define HIDPP_QUIRK_HIDPP_EXTRA_MOUSE_BTNS	BIT(30)
     79#define HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS	BIT(31)
     80
     81/* These are just aliases for now */
     82#define HIDPP_QUIRK_KBD_SCROLL_WHEEL HIDPP_QUIRK_HIDPP_WHEELS
     83#define HIDPP_QUIRK_KBD_ZOOM_WHEEL   HIDPP_QUIRK_HIDPP_WHEELS
     84
     85/* Convenience constant to check for any high-res support. */
     86#define HIDPP_QUIRK_HI_RES_SCROLL	(HIDPP_QUIRK_HI_RES_SCROLL_1P0 | \
     87					 HIDPP_QUIRK_HI_RES_SCROLL_X2120 | \
     88					 HIDPP_QUIRK_HI_RES_SCROLL_X2121)
     89
     90#define HIDPP_QUIRK_DELAYED_INIT		HIDPP_QUIRK_NO_HIDINPUT
     91
     92#define HIDPP_CAPABILITY_HIDPP10_BATTERY	BIT(0)
     93#define HIDPP_CAPABILITY_HIDPP20_BATTERY	BIT(1)
     94#define HIDPP_CAPABILITY_BATTERY_MILEAGE	BIT(2)
     95#define HIDPP_CAPABILITY_BATTERY_LEVEL_STATUS	BIT(3)
     96#define HIDPP_CAPABILITY_BATTERY_VOLTAGE	BIT(4)
     97#define HIDPP_CAPABILITY_BATTERY_PERCENTAGE	BIT(5)
     98#define HIDPP_CAPABILITY_UNIFIED_BATTERY	BIT(6)
     99
    100#define lg_map_key_clear(c)  hid_map_usage_clear(hi, usage, bit, max, EV_KEY, (c))
    101
    102/*
    103 * There are two hidpp protocols in use, the first version hidpp10 is known
    104 * as register access protocol or RAP, the second version hidpp20 is known as
    105 * feature access protocol or FAP
    106 *
    107 * Most older devices (including the Unifying usb receiver) use the RAP protocol
    108 * where as most newer devices use the FAP protocol. Both protocols are
    109 * compatible with the underlying transport, which could be usb, Unifiying, or
    110 * bluetooth. The message lengths are defined by the hid vendor specific report
    111 * descriptor for the HIDPP_SHORT report type (total message lenth 7 bytes) and
    112 * the HIDPP_LONG report type (total message length 20 bytes)
    113 *
    114 * The RAP protocol uses both report types, whereas the FAP only uses HIDPP_LONG
    115 * messages. The Unifying receiver itself responds to RAP messages (device index
    116 * is 0xFF for the receiver), and all messages (short or long) with a device
    117 * index between 1 and 6 are passed untouched to the corresponding paired
    118 * Unifying device.
    119 *
    120 * The paired device can be RAP or FAP, it will receive the message untouched
    121 * from the Unifiying receiver.
    122 */
    123
    124struct fap {
    125	u8 feature_index;
    126	u8 funcindex_clientid;
    127	u8 params[HIDPP_REPORT_VERY_LONG_MAX_LENGTH - 4U];
    128};
    129
    130struct rap {
    131	u8 sub_id;
    132	u8 reg_address;
    133	u8 params[HIDPP_REPORT_VERY_LONG_MAX_LENGTH - 4U];
    134};
    135
    136struct hidpp_report {
    137	u8 report_id;
    138	u8 device_index;
    139	union {
    140		struct fap fap;
    141		struct rap rap;
    142		u8 rawbytes[sizeof(struct fap)];
    143	};
    144} __packed;
    145
    146struct hidpp_battery {
    147	u8 feature_index;
    148	u8 solar_feature_index;
    149	u8 voltage_feature_index;
    150	struct power_supply_desc desc;
    151	struct power_supply *ps;
    152	char name[64];
    153	int status;
    154	int capacity;
    155	int level;
    156	int voltage;
    157	int charge_type;
    158	bool online;
    159	u8 supported_levels_1004;
    160};
    161
    162/**
    163 * struct hidpp_scroll_counter - Utility class for processing high-resolution
    164 *                             scroll events.
    165 * @dev: the input device for which events should be reported.
    166 * @wheel_multiplier: the scalar multiplier to be applied to each wheel event
    167 * @remainder: counts the number of high-resolution units moved since the last
    168 *             low-resolution event (REL_WHEEL or REL_HWHEEL) was sent. Should
    169 *             only be used by class methods.
    170 * @direction: direction of last movement (1 or -1)
    171 * @last_time: last event time, used to reset remainder after inactivity
    172 */
    173struct hidpp_scroll_counter {
    174	int wheel_multiplier;
    175	int remainder;
    176	int direction;
    177	unsigned long long last_time;
    178};
    179
    180struct hidpp_device {
    181	struct hid_device *hid_dev;
    182	struct input_dev *input;
    183	struct mutex send_mutex;
    184	void *send_receive_buf;
    185	char *name;		/* will never be NULL and should not be freed */
    186	wait_queue_head_t wait;
    187	int very_long_report_length;
    188	bool answer_available;
    189	u8 protocol_major;
    190	u8 protocol_minor;
    191
    192	void *private_data;
    193
    194	struct work_struct work;
    195	struct kfifo delayed_work_fifo;
    196	atomic_t connected;
    197	struct input_dev *delayed_input;
    198
    199	unsigned long quirks;
    200	unsigned long capabilities;
    201	u8 supported_reports;
    202
    203	struct hidpp_battery battery;
    204	struct hidpp_scroll_counter vertical_wheel_counter;
    205
    206	u8 wireless_feature_index;
    207};
    208
    209/* HID++ 1.0 error codes */
    210#define HIDPP_ERROR				0x8f
    211#define HIDPP_ERROR_SUCCESS			0x00
    212#define HIDPP_ERROR_INVALID_SUBID		0x01
    213#define HIDPP_ERROR_INVALID_ADRESS		0x02
    214#define HIDPP_ERROR_INVALID_VALUE		0x03
    215#define HIDPP_ERROR_CONNECT_FAIL		0x04
    216#define HIDPP_ERROR_TOO_MANY_DEVICES		0x05
    217#define HIDPP_ERROR_ALREADY_EXISTS		0x06
    218#define HIDPP_ERROR_BUSY			0x07
    219#define HIDPP_ERROR_UNKNOWN_DEVICE		0x08
    220#define HIDPP_ERROR_RESOURCE_ERROR		0x09
    221#define HIDPP_ERROR_REQUEST_UNAVAILABLE		0x0a
    222#define HIDPP_ERROR_INVALID_PARAM_VALUE		0x0b
    223#define HIDPP_ERROR_WRONG_PIN_CODE		0x0c
    224/* HID++ 2.0 error codes */
    225#define HIDPP20_ERROR				0xff
    226
    227static void hidpp_connect_event(struct hidpp_device *hidpp_dev);
    228
    229static int __hidpp_send_report(struct hid_device *hdev,
    230				struct hidpp_report *hidpp_report)
    231{
    232	struct hidpp_device *hidpp = hid_get_drvdata(hdev);
    233	int fields_count, ret;
    234
    235	switch (hidpp_report->report_id) {
    236	case REPORT_ID_HIDPP_SHORT:
    237		fields_count = HIDPP_REPORT_SHORT_LENGTH;
    238		break;
    239	case REPORT_ID_HIDPP_LONG:
    240		fields_count = HIDPP_REPORT_LONG_LENGTH;
    241		break;
    242	case REPORT_ID_HIDPP_VERY_LONG:
    243		fields_count = hidpp->very_long_report_length;
    244		break;
    245	default:
    246		return -ENODEV;
    247	}
    248
    249	/*
    250	 * set the device_index as the receiver, it will be overwritten by
    251	 * hid_hw_request if needed
    252	 */
    253	hidpp_report->device_index = 0xff;
    254
    255	if (hidpp->quirks & HIDPP_QUIRK_FORCE_OUTPUT_REPORTS) {
    256		ret = hid_hw_output_report(hdev, (u8 *)hidpp_report, fields_count);
    257	} else {
    258		ret = hid_hw_raw_request(hdev, hidpp_report->report_id,
    259			(u8 *)hidpp_report, fields_count, HID_OUTPUT_REPORT,
    260			HID_REQ_SET_REPORT);
    261	}
    262
    263	return ret == fields_count ? 0 : -1;
    264}
    265
    266/*
    267 * hidpp_send_message_sync() returns 0 in case of success, and something else
    268 * in case of a failure.
    269 * - If ' something else' is positive, that means that an error has been raised
    270 *   by the protocol itself.
    271 * - If ' something else' is negative, that means that we had a classic error
    272 *   (-ENOMEM, -EPIPE, etc...)
    273 */
    274static int hidpp_send_message_sync(struct hidpp_device *hidpp,
    275	struct hidpp_report *message,
    276	struct hidpp_report *response)
    277{
    278	int ret;
    279
    280	mutex_lock(&hidpp->send_mutex);
    281
    282	hidpp->send_receive_buf = response;
    283	hidpp->answer_available = false;
    284
    285	/*
    286	 * So that we can later validate the answer when it arrives
    287	 * in hidpp_raw_event
    288	 */
    289	*response = *message;
    290
    291	ret = __hidpp_send_report(hidpp->hid_dev, message);
    292
    293	if (ret) {
    294		dbg_hid("__hidpp_send_report returned err: %d\n", ret);
    295		memset(response, 0, sizeof(struct hidpp_report));
    296		goto exit;
    297	}
    298
    299	if (!wait_event_timeout(hidpp->wait, hidpp->answer_available,
    300				5*HZ)) {
    301		dbg_hid("%s:timeout waiting for response\n", __func__);
    302		memset(response, 0, sizeof(struct hidpp_report));
    303		ret = -ETIMEDOUT;
    304	}
    305
    306	if (response->report_id == REPORT_ID_HIDPP_SHORT &&
    307	    response->rap.sub_id == HIDPP_ERROR) {
    308		ret = response->rap.params[1];
    309		dbg_hid("%s:got hidpp error %02X\n", __func__, ret);
    310		goto exit;
    311	}
    312
    313	if ((response->report_id == REPORT_ID_HIDPP_LONG ||
    314			response->report_id == REPORT_ID_HIDPP_VERY_LONG) &&
    315			response->fap.feature_index == HIDPP20_ERROR) {
    316		ret = response->fap.params[1];
    317		dbg_hid("%s:got hidpp 2.0 error %02X\n", __func__, ret);
    318		goto exit;
    319	}
    320
    321exit:
    322	mutex_unlock(&hidpp->send_mutex);
    323	return ret;
    324
    325}
    326
    327static int hidpp_send_fap_command_sync(struct hidpp_device *hidpp,
    328	u8 feat_index, u8 funcindex_clientid, u8 *params, int param_count,
    329	struct hidpp_report *response)
    330{
    331	struct hidpp_report *message;
    332	int ret;
    333
    334	if (param_count > sizeof(message->fap.params))
    335		return -EINVAL;
    336
    337	message = kzalloc(sizeof(struct hidpp_report), GFP_KERNEL);
    338	if (!message)
    339		return -ENOMEM;
    340
    341	if (param_count > (HIDPP_REPORT_LONG_LENGTH - 4))
    342		message->report_id = REPORT_ID_HIDPP_VERY_LONG;
    343	else
    344		message->report_id = REPORT_ID_HIDPP_LONG;
    345	message->fap.feature_index = feat_index;
    346	message->fap.funcindex_clientid = funcindex_clientid;
    347	memcpy(&message->fap.params, params, param_count);
    348
    349	ret = hidpp_send_message_sync(hidpp, message, response);
    350	kfree(message);
    351	return ret;
    352}
    353
    354static int hidpp_send_rap_command_sync(struct hidpp_device *hidpp_dev,
    355	u8 report_id, u8 sub_id, u8 reg_address, u8 *params, int param_count,
    356	struct hidpp_report *response)
    357{
    358	struct hidpp_report *message;
    359	int ret, max_count;
    360
    361	/* Send as long report if short reports are not supported. */
    362	if (report_id == REPORT_ID_HIDPP_SHORT &&
    363	    !(hidpp_dev->supported_reports & HIDPP_REPORT_SHORT_SUPPORTED))
    364		report_id = REPORT_ID_HIDPP_LONG;
    365
    366	switch (report_id) {
    367	case REPORT_ID_HIDPP_SHORT:
    368		max_count = HIDPP_REPORT_SHORT_LENGTH - 4;
    369		break;
    370	case REPORT_ID_HIDPP_LONG:
    371		max_count = HIDPP_REPORT_LONG_LENGTH - 4;
    372		break;
    373	case REPORT_ID_HIDPP_VERY_LONG:
    374		max_count = hidpp_dev->very_long_report_length - 4;
    375		break;
    376	default:
    377		return -EINVAL;
    378	}
    379
    380	if (param_count > max_count)
    381		return -EINVAL;
    382
    383	message = kzalloc(sizeof(struct hidpp_report), GFP_KERNEL);
    384	if (!message)
    385		return -ENOMEM;
    386	message->report_id = report_id;
    387	message->rap.sub_id = sub_id;
    388	message->rap.reg_address = reg_address;
    389	memcpy(&message->rap.params, params, param_count);
    390
    391	ret = hidpp_send_message_sync(hidpp_dev, message, response);
    392	kfree(message);
    393	return ret;
    394}
    395
    396static void delayed_work_cb(struct work_struct *work)
    397{
    398	struct hidpp_device *hidpp = container_of(work, struct hidpp_device,
    399							work);
    400	hidpp_connect_event(hidpp);
    401}
    402
    403static inline bool hidpp_match_answer(struct hidpp_report *question,
    404		struct hidpp_report *answer)
    405{
    406	return (answer->fap.feature_index == question->fap.feature_index) &&
    407	   (answer->fap.funcindex_clientid == question->fap.funcindex_clientid);
    408}
    409
    410static inline bool hidpp_match_error(struct hidpp_report *question,
    411		struct hidpp_report *answer)
    412{
    413	return ((answer->rap.sub_id == HIDPP_ERROR) ||
    414	    (answer->fap.feature_index == HIDPP20_ERROR)) &&
    415	    (answer->fap.funcindex_clientid == question->fap.feature_index) &&
    416	    (answer->fap.params[0] == question->fap.funcindex_clientid);
    417}
    418
    419static inline bool hidpp_report_is_connect_event(struct hidpp_device *hidpp,
    420		struct hidpp_report *report)
    421{
    422	return (hidpp->wireless_feature_index &&
    423		(report->fap.feature_index == hidpp->wireless_feature_index)) ||
    424		((report->report_id == REPORT_ID_HIDPP_SHORT) &&
    425		(report->rap.sub_id == 0x41));
    426}
    427
    428/*
    429 * hidpp_prefix_name() prefixes the current given name with "Logitech ".
    430 */
    431static void hidpp_prefix_name(char **name, int name_length)
    432{
    433#define PREFIX_LENGTH 9 /* "Logitech " */
    434
    435	int new_length;
    436	char *new_name;
    437
    438	if (name_length > PREFIX_LENGTH &&
    439	    strncmp(*name, "Logitech ", PREFIX_LENGTH) == 0)
    440		/* The prefix has is already in the name */
    441		return;
    442
    443	new_length = PREFIX_LENGTH + name_length;
    444	new_name = kzalloc(new_length, GFP_KERNEL);
    445	if (!new_name)
    446		return;
    447
    448	snprintf(new_name, new_length, "Logitech %s", *name);
    449
    450	kfree(*name);
    451
    452	*name = new_name;
    453}
    454
    455/**
    456 * hidpp_scroll_counter_handle_scroll() - Send high- and low-resolution scroll
    457 *                                        events given a high-resolution wheel
    458 *                                        movement.
    459 * @input_dev: Pointer to the input device
    460 * @counter: a hid_scroll_counter struct describing the wheel.
    461 * @hi_res_value: the movement of the wheel, in the mouse's high-resolution
    462 *                units.
    463 *
    464 * Given a high-resolution movement, this function converts the movement into
    465 * fractions of 120 and emits high-resolution scroll events for the input
    466 * device. It also uses the multiplier from &struct hid_scroll_counter to
    467 * emit low-resolution scroll events when appropriate for
    468 * backwards-compatibility with userspace input libraries.
    469 */
    470static void hidpp_scroll_counter_handle_scroll(struct input_dev *input_dev,
    471					       struct hidpp_scroll_counter *counter,
    472					       int hi_res_value)
    473{
    474	int low_res_value, remainder, direction;
    475	unsigned long long now, previous;
    476
    477	hi_res_value = hi_res_value * 120/counter->wheel_multiplier;
    478	input_report_rel(input_dev, REL_WHEEL_HI_RES, hi_res_value);
    479
    480	remainder = counter->remainder;
    481	direction = hi_res_value > 0 ? 1 : -1;
    482
    483	now = sched_clock();
    484	previous = counter->last_time;
    485	counter->last_time = now;
    486	/*
    487	 * Reset the remainder after a period of inactivity or when the
    488	 * direction changes. This prevents the REL_WHEEL emulation point
    489	 * from sliding for devices that don't always provide the same
    490	 * number of movements per detent.
    491	 */
    492	if (now - previous > 1000000000 || direction != counter->direction)
    493		remainder = 0;
    494
    495	counter->direction = direction;
    496	remainder += hi_res_value;
    497
    498	/* Some wheels will rest 7/8ths of a detent from the previous detent
    499	 * after slow movement, so we want the threshold for low-res events to
    500	 * be in the middle between two detents (e.g. after 4/8ths) as
    501	 * opposed to on the detents themselves (8/8ths).
    502	 */
    503	if (abs(remainder) >= 60) {
    504		/* Add (or subtract) 1 because we want to trigger when the wheel
    505		 * is half-way to the next detent (i.e. scroll 1 detent after a
    506		 * 1/2 detent movement, 2 detents after a 1 1/2 detent movement,
    507		 * etc.).
    508		 */
    509		low_res_value = remainder / 120;
    510		if (low_res_value == 0)
    511			low_res_value = (hi_res_value > 0 ? 1 : -1);
    512		input_report_rel(input_dev, REL_WHEEL, low_res_value);
    513		remainder -= low_res_value * 120;
    514	}
    515	counter->remainder = remainder;
    516}
    517
    518/* -------------------------------------------------------------------------- */
    519/* HIDP++ 1.0 commands                                                        */
    520/* -------------------------------------------------------------------------- */
    521
    522#define HIDPP_SET_REGISTER				0x80
    523#define HIDPP_GET_REGISTER				0x81
    524#define HIDPP_SET_LONG_REGISTER				0x82
    525#define HIDPP_GET_LONG_REGISTER				0x83
    526
    527/**
    528 * hidpp10_set_register - Modify a HID++ 1.0 register.
    529 * @hidpp_dev: the device to set the register on.
    530 * @register_address: the address of the register to modify.
    531 * @byte: the byte of the register to modify. Should be less than 3.
    532 * @mask: mask of the bits to modify
    533 * @value: new values for the bits in mask
    534 * Return: 0 if successful, otherwise a negative error code.
    535 */
    536static int hidpp10_set_register(struct hidpp_device *hidpp_dev,
    537	u8 register_address, u8 byte, u8 mask, u8 value)
    538{
    539	struct hidpp_report response;
    540	int ret;
    541	u8 params[3] = { 0 };
    542
    543	ret = hidpp_send_rap_command_sync(hidpp_dev,
    544					  REPORT_ID_HIDPP_SHORT,
    545					  HIDPP_GET_REGISTER,
    546					  register_address,
    547					  NULL, 0, &response);
    548	if (ret)
    549		return ret;
    550
    551	memcpy(params, response.rap.params, 3);
    552
    553	params[byte] &= ~mask;
    554	params[byte] |= value & mask;
    555
    556	return hidpp_send_rap_command_sync(hidpp_dev,
    557					   REPORT_ID_HIDPP_SHORT,
    558					   HIDPP_SET_REGISTER,
    559					   register_address,
    560					   params, 3, &response);
    561}
    562
    563#define HIDPP_REG_ENABLE_REPORTS			0x00
    564#define HIDPP_ENABLE_CONSUMER_REPORT			BIT(0)
    565#define HIDPP_ENABLE_WHEEL_REPORT			BIT(2)
    566#define HIDPP_ENABLE_MOUSE_EXTRA_BTN_REPORT		BIT(3)
    567#define HIDPP_ENABLE_BAT_REPORT				BIT(4)
    568#define HIDPP_ENABLE_HWHEEL_REPORT			BIT(5)
    569
    570static int hidpp10_enable_battery_reporting(struct hidpp_device *hidpp_dev)
    571{
    572	return hidpp10_set_register(hidpp_dev, HIDPP_REG_ENABLE_REPORTS, 0,
    573			  HIDPP_ENABLE_BAT_REPORT, HIDPP_ENABLE_BAT_REPORT);
    574}
    575
    576#define HIDPP_REG_FEATURES				0x01
    577#define HIDPP_ENABLE_SPECIAL_BUTTON_FUNC		BIT(1)
    578#define HIDPP_ENABLE_FAST_SCROLL			BIT(6)
    579
    580/* On HID++ 1.0 devices, high-res scroll was called "scrolling acceleration". */
    581static int hidpp10_enable_scrolling_acceleration(struct hidpp_device *hidpp_dev)
    582{
    583	return hidpp10_set_register(hidpp_dev, HIDPP_REG_FEATURES, 0,
    584			  HIDPP_ENABLE_FAST_SCROLL, HIDPP_ENABLE_FAST_SCROLL);
    585}
    586
    587#define HIDPP_REG_BATTERY_STATUS			0x07
    588
    589static int hidpp10_battery_status_map_level(u8 param)
    590{
    591	int level;
    592
    593	switch (param) {
    594	case 1 ... 2:
    595		level = POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL;
    596		break;
    597	case 3 ... 4:
    598		level = POWER_SUPPLY_CAPACITY_LEVEL_LOW;
    599		break;
    600	case 5 ... 6:
    601		level = POWER_SUPPLY_CAPACITY_LEVEL_NORMAL;
    602		break;
    603	case 7:
    604		level = POWER_SUPPLY_CAPACITY_LEVEL_HIGH;
    605		break;
    606	default:
    607		level = POWER_SUPPLY_CAPACITY_LEVEL_UNKNOWN;
    608	}
    609
    610	return level;
    611}
    612
    613static int hidpp10_battery_status_map_status(u8 param)
    614{
    615	int status;
    616
    617	switch (param) {
    618	case 0x00:
    619		/* discharging (in use) */
    620		status = POWER_SUPPLY_STATUS_DISCHARGING;
    621		break;
    622	case 0x21: /* (standard) charging */
    623	case 0x24: /* fast charging */
    624	case 0x25: /* slow charging */
    625		status = POWER_SUPPLY_STATUS_CHARGING;
    626		break;
    627	case 0x26: /* topping charge */
    628	case 0x22: /* charge complete */
    629		status = POWER_SUPPLY_STATUS_FULL;
    630		break;
    631	case 0x20: /* unknown */
    632		status = POWER_SUPPLY_STATUS_UNKNOWN;
    633		break;
    634	/*
    635	 * 0x01...0x1F = reserved (not charging)
    636	 * 0x23 = charging error
    637	 * 0x27..0xff = reserved
    638	 */
    639	default:
    640		status = POWER_SUPPLY_STATUS_NOT_CHARGING;
    641		break;
    642	}
    643
    644	return status;
    645}
    646
    647static int hidpp10_query_battery_status(struct hidpp_device *hidpp)
    648{
    649	struct hidpp_report response;
    650	int ret, status;
    651
    652	ret = hidpp_send_rap_command_sync(hidpp,
    653					REPORT_ID_HIDPP_SHORT,
    654					HIDPP_GET_REGISTER,
    655					HIDPP_REG_BATTERY_STATUS,
    656					NULL, 0, &response);
    657	if (ret)
    658		return ret;
    659
    660	hidpp->battery.level =
    661		hidpp10_battery_status_map_level(response.rap.params[0]);
    662	status = hidpp10_battery_status_map_status(response.rap.params[1]);
    663	hidpp->battery.status = status;
    664	/* the capacity is only available when discharging or full */
    665	hidpp->battery.online = status == POWER_SUPPLY_STATUS_DISCHARGING ||
    666				status == POWER_SUPPLY_STATUS_FULL;
    667
    668	return 0;
    669}
    670
    671#define HIDPP_REG_BATTERY_MILEAGE			0x0D
    672
    673static int hidpp10_battery_mileage_map_status(u8 param)
    674{
    675	int status;
    676
    677	switch (param >> 6) {
    678	case 0x00:
    679		/* discharging (in use) */
    680		status = POWER_SUPPLY_STATUS_DISCHARGING;
    681		break;
    682	case 0x01: /* charging */
    683		status = POWER_SUPPLY_STATUS_CHARGING;
    684		break;
    685	case 0x02: /* charge complete */
    686		status = POWER_SUPPLY_STATUS_FULL;
    687		break;
    688	/*
    689	 * 0x03 = charging error
    690	 */
    691	default:
    692		status = POWER_SUPPLY_STATUS_NOT_CHARGING;
    693		break;
    694	}
    695
    696	return status;
    697}
    698
    699static int hidpp10_query_battery_mileage(struct hidpp_device *hidpp)
    700{
    701	struct hidpp_report response;
    702	int ret, status;
    703
    704	ret = hidpp_send_rap_command_sync(hidpp,
    705					REPORT_ID_HIDPP_SHORT,
    706					HIDPP_GET_REGISTER,
    707					HIDPP_REG_BATTERY_MILEAGE,
    708					NULL, 0, &response);
    709	if (ret)
    710		return ret;
    711
    712	hidpp->battery.capacity = response.rap.params[0];
    713	status = hidpp10_battery_mileage_map_status(response.rap.params[2]);
    714	hidpp->battery.status = status;
    715	/* the capacity is only available when discharging or full */
    716	hidpp->battery.online = status == POWER_SUPPLY_STATUS_DISCHARGING ||
    717				status == POWER_SUPPLY_STATUS_FULL;
    718
    719	return 0;
    720}
    721
    722static int hidpp10_battery_event(struct hidpp_device *hidpp, u8 *data, int size)
    723{
    724	struct hidpp_report *report = (struct hidpp_report *)data;
    725	int status, capacity, level;
    726	bool changed;
    727
    728	if (report->report_id != REPORT_ID_HIDPP_SHORT)
    729		return 0;
    730
    731	switch (report->rap.sub_id) {
    732	case HIDPP_REG_BATTERY_STATUS:
    733		capacity = hidpp->battery.capacity;
    734		level = hidpp10_battery_status_map_level(report->rawbytes[1]);
    735		status = hidpp10_battery_status_map_status(report->rawbytes[2]);
    736		break;
    737	case HIDPP_REG_BATTERY_MILEAGE:
    738		capacity = report->rap.params[0];
    739		level = hidpp->battery.level;
    740		status = hidpp10_battery_mileage_map_status(report->rawbytes[3]);
    741		break;
    742	default:
    743		return 0;
    744	}
    745
    746	changed = capacity != hidpp->battery.capacity ||
    747		  level != hidpp->battery.level ||
    748		  status != hidpp->battery.status;
    749
    750	/* the capacity is only available when discharging or full */
    751	hidpp->battery.online = status == POWER_SUPPLY_STATUS_DISCHARGING ||
    752				status == POWER_SUPPLY_STATUS_FULL;
    753
    754	if (changed) {
    755		hidpp->battery.level = level;
    756		hidpp->battery.status = status;
    757		if (hidpp->battery.ps)
    758			power_supply_changed(hidpp->battery.ps);
    759	}
    760
    761	return 0;
    762}
    763
    764#define HIDPP_REG_PAIRING_INFORMATION			0xB5
    765#define HIDPP_EXTENDED_PAIRING				0x30
    766#define HIDPP_DEVICE_NAME				0x40
    767
    768static char *hidpp_unifying_get_name(struct hidpp_device *hidpp_dev)
    769{
    770	struct hidpp_report response;
    771	int ret;
    772	u8 params[1] = { HIDPP_DEVICE_NAME };
    773	char *name;
    774	int len;
    775
    776	ret = hidpp_send_rap_command_sync(hidpp_dev,
    777					REPORT_ID_HIDPP_SHORT,
    778					HIDPP_GET_LONG_REGISTER,
    779					HIDPP_REG_PAIRING_INFORMATION,
    780					params, 1, &response);
    781	if (ret)
    782		return NULL;
    783
    784	len = response.rap.params[1];
    785
    786	if (2 + len > sizeof(response.rap.params))
    787		return NULL;
    788
    789	if (len < 4) /* logitech devices are usually at least Xddd */
    790		return NULL;
    791
    792	name = kzalloc(len + 1, GFP_KERNEL);
    793	if (!name)
    794		return NULL;
    795
    796	memcpy(name, &response.rap.params[2], len);
    797
    798	/* include the terminating '\0' */
    799	hidpp_prefix_name(&name, len + 1);
    800
    801	return name;
    802}
    803
    804static int hidpp_unifying_get_serial(struct hidpp_device *hidpp, u32 *serial)
    805{
    806	struct hidpp_report response;
    807	int ret;
    808	u8 params[1] = { HIDPP_EXTENDED_PAIRING };
    809
    810	ret = hidpp_send_rap_command_sync(hidpp,
    811					REPORT_ID_HIDPP_SHORT,
    812					HIDPP_GET_LONG_REGISTER,
    813					HIDPP_REG_PAIRING_INFORMATION,
    814					params, 1, &response);
    815	if (ret)
    816		return ret;
    817
    818	/*
    819	 * We don't care about LE or BE, we will output it as a string
    820	 * with %4phD, so we need to keep the order.
    821	 */
    822	*serial = *((u32 *)&response.rap.params[1]);
    823	return 0;
    824}
    825
    826static int hidpp_unifying_init(struct hidpp_device *hidpp)
    827{
    828	struct hid_device *hdev = hidpp->hid_dev;
    829	const char *name;
    830	u32 serial;
    831	int ret;
    832
    833	ret = hidpp_unifying_get_serial(hidpp, &serial);
    834	if (ret)
    835		return ret;
    836
    837	snprintf(hdev->uniq, sizeof(hdev->uniq), "%04x-%4phD",
    838		 hdev->product, &serial);
    839	dbg_hid("HID++ Unifying: Got serial: %s\n", hdev->uniq);
    840
    841	name = hidpp_unifying_get_name(hidpp);
    842	if (!name)
    843		return -EIO;
    844
    845	snprintf(hdev->name, sizeof(hdev->name), "%s", name);
    846	dbg_hid("HID++ Unifying: Got name: %s\n", name);
    847
    848	kfree(name);
    849	return 0;
    850}
    851
    852/* -------------------------------------------------------------------------- */
    853/* 0x0000: Root                                                               */
    854/* -------------------------------------------------------------------------- */
    855
    856#define HIDPP_PAGE_ROOT					0x0000
    857#define HIDPP_PAGE_ROOT_IDX				0x00
    858
    859#define CMD_ROOT_GET_FEATURE				0x01
    860#define CMD_ROOT_GET_PROTOCOL_VERSION			0x11
    861
    862static int hidpp_root_get_feature(struct hidpp_device *hidpp, u16 feature,
    863	u8 *feature_index, u8 *feature_type)
    864{
    865	struct hidpp_report response;
    866	int ret;
    867	u8 params[2] = { feature >> 8, feature & 0x00FF };
    868
    869	ret = hidpp_send_fap_command_sync(hidpp,
    870			HIDPP_PAGE_ROOT_IDX,
    871			CMD_ROOT_GET_FEATURE,
    872			params, 2, &response);
    873	if (ret)
    874		return ret;
    875
    876	if (response.fap.params[0] == 0)
    877		return -ENOENT;
    878
    879	*feature_index = response.fap.params[0];
    880	*feature_type = response.fap.params[1];
    881
    882	return ret;
    883}
    884
    885static int hidpp_root_get_protocol_version(struct hidpp_device *hidpp)
    886{
    887	const u8 ping_byte = 0x5a;
    888	u8 ping_data[3] = { 0, 0, ping_byte };
    889	struct hidpp_report response;
    890	int ret;
    891
    892	ret = hidpp_send_rap_command_sync(hidpp,
    893			REPORT_ID_HIDPP_SHORT,
    894			HIDPP_PAGE_ROOT_IDX,
    895			CMD_ROOT_GET_PROTOCOL_VERSION,
    896			ping_data, sizeof(ping_data), &response);
    897
    898	if (ret == HIDPP_ERROR_INVALID_SUBID) {
    899		hidpp->protocol_major = 1;
    900		hidpp->protocol_minor = 0;
    901		goto print_version;
    902	}
    903
    904	/* the device might not be connected */
    905	if (ret == HIDPP_ERROR_RESOURCE_ERROR)
    906		return -EIO;
    907
    908	if (ret > 0) {
    909		hid_err(hidpp->hid_dev, "%s: received protocol error 0x%02x\n",
    910			__func__, ret);
    911		return -EPROTO;
    912	}
    913	if (ret)
    914		return ret;
    915
    916	if (response.rap.params[2] != ping_byte) {
    917		hid_err(hidpp->hid_dev, "%s: ping mismatch 0x%02x != 0x%02x\n",
    918			__func__, response.rap.params[2], ping_byte);
    919		return -EPROTO;
    920	}
    921
    922	hidpp->protocol_major = response.rap.params[0];
    923	hidpp->protocol_minor = response.rap.params[1];
    924
    925print_version:
    926	hid_info(hidpp->hid_dev, "HID++ %u.%u device connected.\n",
    927		 hidpp->protocol_major, hidpp->protocol_minor);
    928	return 0;
    929}
    930
    931/* -------------------------------------------------------------------------- */
    932/* 0x0005: GetDeviceNameType                                                  */
    933/* -------------------------------------------------------------------------- */
    934
    935#define HIDPP_PAGE_GET_DEVICE_NAME_TYPE			0x0005
    936
    937#define CMD_GET_DEVICE_NAME_TYPE_GET_COUNT		0x01
    938#define CMD_GET_DEVICE_NAME_TYPE_GET_DEVICE_NAME	0x11
    939#define CMD_GET_DEVICE_NAME_TYPE_GET_TYPE		0x21
    940
    941static int hidpp_devicenametype_get_count(struct hidpp_device *hidpp,
    942	u8 feature_index, u8 *nameLength)
    943{
    944	struct hidpp_report response;
    945	int ret;
    946
    947	ret = hidpp_send_fap_command_sync(hidpp, feature_index,
    948		CMD_GET_DEVICE_NAME_TYPE_GET_COUNT, NULL, 0, &response);
    949
    950	if (ret > 0) {
    951		hid_err(hidpp->hid_dev, "%s: received protocol error 0x%02x\n",
    952			__func__, ret);
    953		return -EPROTO;
    954	}
    955	if (ret)
    956		return ret;
    957
    958	*nameLength = response.fap.params[0];
    959
    960	return ret;
    961}
    962
    963static int hidpp_devicenametype_get_device_name(struct hidpp_device *hidpp,
    964	u8 feature_index, u8 char_index, char *device_name, int len_buf)
    965{
    966	struct hidpp_report response;
    967	int ret, i;
    968	int count;
    969
    970	ret = hidpp_send_fap_command_sync(hidpp, feature_index,
    971		CMD_GET_DEVICE_NAME_TYPE_GET_DEVICE_NAME, &char_index, 1,
    972		&response);
    973
    974	if (ret > 0) {
    975		hid_err(hidpp->hid_dev, "%s: received protocol error 0x%02x\n",
    976			__func__, ret);
    977		return -EPROTO;
    978	}
    979	if (ret)
    980		return ret;
    981
    982	switch (response.report_id) {
    983	case REPORT_ID_HIDPP_VERY_LONG:
    984		count = hidpp->very_long_report_length - 4;
    985		break;
    986	case REPORT_ID_HIDPP_LONG:
    987		count = HIDPP_REPORT_LONG_LENGTH - 4;
    988		break;
    989	case REPORT_ID_HIDPP_SHORT:
    990		count = HIDPP_REPORT_SHORT_LENGTH - 4;
    991		break;
    992	default:
    993		return -EPROTO;
    994	}
    995
    996	if (len_buf < count)
    997		count = len_buf;
    998
    999	for (i = 0; i < count; i++)
   1000		device_name[i] = response.fap.params[i];
   1001
   1002	return count;
   1003}
   1004
   1005static char *hidpp_get_device_name(struct hidpp_device *hidpp)
   1006{
   1007	u8 feature_type;
   1008	u8 feature_index;
   1009	u8 __name_length;
   1010	char *name;
   1011	unsigned index = 0;
   1012	int ret;
   1013
   1014	ret = hidpp_root_get_feature(hidpp, HIDPP_PAGE_GET_DEVICE_NAME_TYPE,
   1015		&feature_index, &feature_type);
   1016	if (ret)
   1017		return NULL;
   1018
   1019	ret = hidpp_devicenametype_get_count(hidpp, feature_index,
   1020		&__name_length);
   1021	if (ret)
   1022		return NULL;
   1023
   1024	name = kzalloc(__name_length + 1, GFP_KERNEL);
   1025	if (!name)
   1026		return NULL;
   1027
   1028	while (index < __name_length) {
   1029		ret = hidpp_devicenametype_get_device_name(hidpp,
   1030			feature_index, index, name + index,
   1031			__name_length - index);
   1032		if (ret <= 0) {
   1033			kfree(name);
   1034			return NULL;
   1035		}
   1036		index += ret;
   1037	}
   1038
   1039	/* include the terminating '\0' */
   1040	hidpp_prefix_name(&name, __name_length + 1);
   1041
   1042	return name;
   1043}
   1044
   1045/* -------------------------------------------------------------------------- */
   1046/* 0x1000: Battery level status                                               */
   1047/* -------------------------------------------------------------------------- */
   1048
   1049#define HIDPP_PAGE_BATTERY_LEVEL_STATUS				0x1000
   1050
   1051#define CMD_BATTERY_LEVEL_STATUS_GET_BATTERY_LEVEL_STATUS	0x00
   1052#define CMD_BATTERY_LEVEL_STATUS_GET_BATTERY_CAPABILITY		0x10
   1053
   1054#define EVENT_BATTERY_LEVEL_STATUS_BROADCAST			0x00
   1055
   1056#define FLAG_BATTERY_LEVEL_DISABLE_OSD				BIT(0)
   1057#define FLAG_BATTERY_LEVEL_MILEAGE				BIT(1)
   1058#define FLAG_BATTERY_LEVEL_RECHARGEABLE				BIT(2)
   1059
   1060static int hidpp_map_battery_level(int capacity)
   1061{
   1062	if (capacity < 11)
   1063		return POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL;
   1064	/*
   1065	 * The spec says this should be < 31 but some devices report 30
   1066	 * with brand new batteries and Windows reports 30 as "Good".
   1067	 */
   1068	else if (capacity < 30)
   1069		return POWER_SUPPLY_CAPACITY_LEVEL_LOW;
   1070	else if (capacity < 81)
   1071		return POWER_SUPPLY_CAPACITY_LEVEL_NORMAL;
   1072	return POWER_SUPPLY_CAPACITY_LEVEL_FULL;
   1073}
   1074
   1075static int hidpp20_batterylevel_map_status_capacity(u8 data[3], int *capacity,
   1076						    int *next_capacity,
   1077						    int *level)
   1078{
   1079	int status;
   1080
   1081	*capacity = data[0];
   1082	*next_capacity = data[1];
   1083	*level = POWER_SUPPLY_CAPACITY_LEVEL_UNKNOWN;
   1084
   1085	/* When discharging, we can rely on the device reported capacity.
   1086	 * For all other states the device reports 0 (unknown).
   1087	 */
   1088	switch (data[2]) {
   1089		case 0: /* discharging (in use) */
   1090			status = POWER_SUPPLY_STATUS_DISCHARGING;
   1091			*level = hidpp_map_battery_level(*capacity);
   1092			break;
   1093		case 1: /* recharging */
   1094			status = POWER_SUPPLY_STATUS_CHARGING;
   1095			break;
   1096		case 2: /* charge in final stage */
   1097			status = POWER_SUPPLY_STATUS_CHARGING;
   1098			break;
   1099		case 3: /* charge complete */
   1100			status = POWER_SUPPLY_STATUS_FULL;
   1101			*level = POWER_SUPPLY_CAPACITY_LEVEL_FULL;
   1102			*capacity = 100;
   1103			break;
   1104		case 4: /* recharging below optimal speed */
   1105			status = POWER_SUPPLY_STATUS_CHARGING;
   1106			break;
   1107		/* 5 = invalid battery type
   1108		   6 = thermal error
   1109		   7 = other charging error */
   1110		default:
   1111			status = POWER_SUPPLY_STATUS_NOT_CHARGING;
   1112			break;
   1113	}
   1114
   1115	return status;
   1116}
   1117
   1118static int hidpp20_batterylevel_get_battery_capacity(struct hidpp_device *hidpp,
   1119						     u8 feature_index,
   1120						     int *status,
   1121						     int *capacity,
   1122						     int *next_capacity,
   1123						     int *level)
   1124{
   1125	struct hidpp_report response;
   1126	int ret;
   1127	u8 *params = (u8 *)response.fap.params;
   1128
   1129	ret = hidpp_send_fap_command_sync(hidpp, feature_index,
   1130					  CMD_BATTERY_LEVEL_STATUS_GET_BATTERY_LEVEL_STATUS,
   1131					  NULL, 0, &response);
   1132	/* Ignore these intermittent errors */
   1133	if (ret == HIDPP_ERROR_RESOURCE_ERROR)
   1134		return -EIO;
   1135	if (ret > 0) {
   1136		hid_err(hidpp->hid_dev, "%s: received protocol error 0x%02x\n",
   1137			__func__, ret);
   1138		return -EPROTO;
   1139	}
   1140	if (ret)
   1141		return ret;
   1142
   1143	*status = hidpp20_batterylevel_map_status_capacity(params, capacity,
   1144							   next_capacity,
   1145							   level);
   1146
   1147	return 0;
   1148}
   1149
   1150static int hidpp20_batterylevel_get_battery_info(struct hidpp_device *hidpp,
   1151						  u8 feature_index)
   1152{
   1153	struct hidpp_report response;
   1154	int ret;
   1155	u8 *params = (u8 *)response.fap.params;
   1156	unsigned int level_count, flags;
   1157
   1158	ret = hidpp_send_fap_command_sync(hidpp, feature_index,
   1159					  CMD_BATTERY_LEVEL_STATUS_GET_BATTERY_CAPABILITY,
   1160					  NULL, 0, &response);
   1161	if (ret > 0) {
   1162		hid_err(hidpp->hid_dev, "%s: received protocol error 0x%02x\n",
   1163			__func__, ret);
   1164		return -EPROTO;
   1165	}
   1166	if (ret)
   1167		return ret;
   1168
   1169	level_count = params[0];
   1170	flags = params[1];
   1171
   1172	if (level_count < 10 || !(flags & FLAG_BATTERY_LEVEL_MILEAGE))
   1173		hidpp->capabilities |= HIDPP_CAPABILITY_BATTERY_LEVEL_STATUS;
   1174	else
   1175		hidpp->capabilities |= HIDPP_CAPABILITY_BATTERY_MILEAGE;
   1176
   1177	return 0;
   1178}
   1179
   1180static int hidpp20_query_battery_info_1000(struct hidpp_device *hidpp)
   1181{
   1182	u8 feature_type;
   1183	int ret;
   1184	int status, capacity, next_capacity, level;
   1185
   1186	if (hidpp->battery.feature_index == 0xff) {
   1187		ret = hidpp_root_get_feature(hidpp,
   1188					     HIDPP_PAGE_BATTERY_LEVEL_STATUS,
   1189					     &hidpp->battery.feature_index,
   1190					     &feature_type);
   1191		if (ret)
   1192			return ret;
   1193	}
   1194
   1195	ret = hidpp20_batterylevel_get_battery_capacity(hidpp,
   1196						hidpp->battery.feature_index,
   1197						&status, &capacity,
   1198						&next_capacity, &level);
   1199	if (ret)
   1200		return ret;
   1201
   1202	ret = hidpp20_batterylevel_get_battery_info(hidpp,
   1203						hidpp->battery.feature_index);
   1204	if (ret)
   1205		return ret;
   1206
   1207	hidpp->battery.status = status;
   1208	hidpp->battery.capacity = capacity;
   1209	hidpp->battery.level = level;
   1210	/* the capacity is only available when discharging or full */
   1211	hidpp->battery.online = status == POWER_SUPPLY_STATUS_DISCHARGING ||
   1212				status == POWER_SUPPLY_STATUS_FULL;
   1213
   1214	return 0;
   1215}
   1216
   1217static int hidpp20_battery_event_1000(struct hidpp_device *hidpp,
   1218				 u8 *data, int size)
   1219{
   1220	struct hidpp_report *report = (struct hidpp_report *)data;
   1221	int status, capacity, next_capacity, level;
   1222	bool changed;
   1223
   1224	if (report->fap.feature_index != hidpp->battery.feature_index ||
   1225	    report->fap.funcindex_clientid != EVENT_BATTERY_LEVEL_STATUS_BROADCAST)
   1226		return 0;
   1227
   1228	status = hidpp20_batterylevel_map_status_capacity(report->fap.params,
   1229							  &capacity,
   1230							  &next_capacity,
   1231							  &level);
   1232
   1233	/* the capacity is only available when discharging or full */
   1234	hidpp->battery.online = status == POWER_SUPPLY_STATUS_DISCHARGING ||
   1235				status == POWER_SUPPLY_STATUS_FULL;
   1236
   1237	changed = capacity != hidpp->battery.capacity ||
   1238		  level != hidpp->battery.level ||
   1239		  status != hidpp->battery.status;
   1240
   1241	if (changed) {
   1242		hidpp->battery.level = level;
   1243		hidpp->battery.capacity = capacity;
   1244		hidpp->battery.status = status;
   1245		if (hidpp->battery.ps)
   1246			power_supply_changed(hidpp->battery.ps);
   1247	}
   1248
   1249	return 0;
   1250}
   1251
   1252/* -------------------------------------------------------------------------- */
   1253/* 0x1001: Battery voltage                                                    */
   1254/* -------------------------------------------------------------------------- */
   1255
   1256#define HIDPP_PAGE_BATTERY_VOLTAGE 0x1001
   1257
   1258#define CMD_BATTERY_VOLTAGE_GET_BATTERY_VOLTAGE 0x00
   1259
   1260#define EVENT_BATTERY_VOLTAGE_STATUS_BROADCAST 0x00
   1261
   1262static int hidpp20_battery_map_status_voltage(u8 data[3], int *voltage,
   1263						int *level, int *charge_type)
   1264{
   1265	int status;
   1266
   1267	long flags = (long) data[2];
   1268	*level = POWER_SUPPLY_CAPACITY_LEVEL_UNKNOWN;
   1269
   1270	if (flags & 0x80)
   1271		switch (flags & 0x07) {
   1272		case 0:
   1273			status = POWER_SUPPLY_STATUS_CHARGING;
   1274			break;
   1275		case 1:
   1276			status = POWER_SUPPLY_STATUS_FULL;
   1277			*level = POWER_SUPPLY_CAPACITY_LEVEL_FULL;
   1278			break;
   1279		case 2:
   1280			status = POWER_SUPPLY_STATUS_NOT_CHARGING;
   1281			break;
   1282		default:
   1283			status = POWER_SUPPLY_STATUS_UNKNOWN;
   1284			break;
   1285		}
   1286	else
   1287		status = POWER_SUPPLY_STATUS_DISCHARGING;
   1288
   1289	*charge_type = POWER_SUPPLY_CHARGE_TYPE_STANDARD;
   1290	if (test_bit(3, &flags)) {
   1291		*charge_type = POWER_SUPPLY_CHARGE_TYPE_FAST;
   1292	}
   1293	if (test_bit(4, &flags)) {
   1294		*charge_type = POWER_SUPPLY_CHARGE_TYPE_TRICKLE;
   1295	}
   1296	if (test_bit(5, &flags)) {
   1297		*level = POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL;
   1298	}
   1299
   1300	*voltage = get_unaligned_be16(data);
   1301
   1302	return status;
   1303}
   1304
   1305static int hidpp20_battery_get_battery_voltage(struct hidpp_device *hidpp,
   1306						 u8 feature_index,
   1307						 int *status, int *voltage,
   1308						 int *level, int *charge_type)
   1309{
   1310	struct hidpp_report response;
   1311	int ret;
   1312	u8 *params = (u8 *)response.fap.params;
   1313
   1314	ret = hidpp_send_fap_command_sync(hidpp, feature_index,
   1315					  CMD_BATTERY_VOLTAGE_GET_BATTERY_VOLTAGE,
   1316					  NULL, 0, &response);
   1317
   1318	if (ret > 0) {
   1319		hid_err(hidpp->hid_dev, "%s: received protocol error 0x%02x\n",
   1320			__func__, ret);
   1321		return -EPROTO;
   1322	}
   1323	if (ret)
   1324		return ret;
   1325
   1326	hidpp->capabilities |= HIDPP_CAPABILITY_BATTERY_VOLTAGE;
   1327
   1328	*status = hidpp20_battery_map_status_voltage(params, voltage,
   1329						     level, charge_type);
   1330
   1331	return 0;
   1332}
   1333
   1334static int hidpp20_map_battery_capacity(struct hid_device *hid_dev, int voltage)
   1335{
   1336	/* NB: This voltage curve doesn't necessarily map perfectly to all
   1337	 * devices that implement the BATTERY_VOLTAGE feature. This is because
   1338	 * there are a few devices that use different battery technology.
   1339	 */
   1340
   1341	static const int voltages[] = {
   1342		4186, 4156, 4143, 4133, 4122, 4113, 4103, 4094, 4086, 4075,
   1343		4067, 4059, 4051, 4043, 4035, 4027, 4019, 4011, 4003, 3997,
   1344		3989, 3983, 3976, 3969, 3961, 3955, 3949, 3942, 3935, 3929,
   1345		3922, 3916, 3909, 3902, 3896, 3890, 3883, 3877, 3870, 3865,
   1346		3859, 3853, 3848, 3842, 3837, 3833, 3828, 3824, 3819, 3815,
   1347		3811, 3808, 3804, 3800, 3797, 3793, 3790, 3787, 3784, 3781,
   1348		3778, 3775, 3772, 3770, 3767, 3764, 3762, 3759, 3757, 3754,
   1349		3751, 3748, 3744, 3741, 3737, 3734, 3730, 3726, 3724, 3720,
   1350		3717, 3714, 3710, 3706, 3702, 3697, 3693, 3688, 3683, 3677,
   1351		3671, 3666, 3662, 3658, 3654, 3646, 3633, 3612, 3579, 3537
   1352	};
   1353
   1354	int i;
   1355
   1356	BUILD_BUG_ON(ARRAY_SIZE(voltages) != 100);
   1357
   1358	if (unlikely(voltage < 3500 || voltage >= 5000))
   1359		hid_warn_once(hid_dev,
   1360			      "%s: possibly using the wrong voltage curve\n",
   1361			      __func__);
   1362
   1363	for (i = 0; i < ARRAY_SIZE(voltages); i++) {
   1364		if (voltage >= voltages[i])
   1365			return ARRAY_SIZE(voltages) - i;
   1366	}
   1367
   1368	return 0;
   1369}
   1370
   1371static int hidpp20_query_battery_voltage_info(struct hidpp_device *hidpp)
   1372{
   1373	u8 feature_type;
   1374	int ret;
   1375	int status, voltage, level, charge_type;
   1376
   1377	if (hidpp->battery.voltage_feature_index == 0xff) {
   1378		ret = hidpp_root_get_feature(hidpp, HIDPP_PAGE_BATTERY_VOLTAGE,
   1379					     &hidpp->battery.voltage_feature_index,
   1380					     &feature_type);
   1381		if (ret)
   1382			return ret;
   1383	}
   1384
   1385	ret = hidpp20_battery_get_battery_voltage(hidpp,
   1386						  hidpp->battery.voltage_feature_index,
   1387						  &status, &voltage, &level, &charge_type);
   1388
   1389	if (ret)
   1390		return ret;
   1391
   1392	hidpp->battery.status = status;
   1393	hidpp->battery.voltage = voltage;
   1394	hidpp->battery.capacity = hidpp20_map_battery_capacity(hidpp->hid_dev,
   1395							       voltage);
   1396	hidpp->battery.level = level;
   1397	hidpp->battery.charge_type = charge_type;
   1398	hidpp->battery.online = status != POWER_SUPPLY_STATUS_NOT_CHARGING;
   1399
   1400	return 0;
   1401}
   1402
   1403static int hidpp20_battery_voltage_event(struct hidpp_device *hidpp,
   1404					    u8 *data, int size)
   1405{
   1406	struct hidpp_report *report = (struct hidpp_report *)data;
   1407	int status, voltage, level, charge_type;
   1408
   1409	if (report->fap.feature_index != hidpp->battery.voltage_feature_index ||
   1410		report->fap.funcindex_clientid != EVENT_BATTERY_VOLTAGE_STATUS_BROADCAST)
   1411		return 0;
   1412
   1413	status = hidpp20_battery_map_status_voltage(report->fap.params, &voltage,
   1414						    &level, &charge_type);
   1415
   1416	hidpp->battery.online = status != POWER_SUPPLY_STATUS_NOT_CHARGING;
   1417
   1418	if (voltage != hidpp->battery.voltage || status != hidpp->battery.status) {
   1419		hidpp->battery.voltage = voltage;
   1420		hidpp->battery.capacity = hidpp20_map_battery_capacity(hidpp->hid_dev,
   1421								       voltage);
   1422		hidpp->battery.status = status;
   1423		hidpp->battery.level = level;
   1424		hidpp->battery.charge_type = charge_type;
   1425		if (hidpp->battery.ps)
   1426			power_supply_changed(hidpp->battery.ps);
   1427	}
   1428	return 0;
   1429}
   1430
   1431/* -------------------------------------------------------------------------- */
   1432/* 0x1004: Unified battery                                                    */
   1433/* -------------------------------------------------------------------------- */
   1434
   1435#define HIDPP_PAGE_UNIFIED_BATTERY				0x1004
   1436
   1437#define CMD_UNIFIED_BATTERY_GET_CAPABILITIES			0x00
   1438#define CMD_UNIFIED_BATTERY_GET_STATUS				0x10
   1439
   1440#define EVENT_UNIFIED_BATTERY_STATUS_EVENT			0x00
   1441
   1442#define FLAG_UNIFIED_BATTERY_LEVEL_CRITICAL			BIT(0)
   1443#define FLAG_UNIFIED_BATTERY_LEVEL_LOW				BIT(1)
   1444#define FLAG_UNIFIED_BATTERY_LEVEL_GOOD				BIT(2)
   1445#define FLAG_UNIFIED_BATTERY_LEVEL_FULL				BIT(3)
   1446
   1447#define FLAG_UNIFIED_BATTERY_FLAGS_RECHARGEABLE			BIT(0)
   1448#define FLAG_UNIFIED_BATTERY_FLAGS_STATE_OF_CHARGE		BIT(1)
   1449
   1450static int hidpp20_unifiedbattery_get_capabilities(struct hidpp_device *hidpp,
   1451						   u8 feature_index)
   1452{
   1453	struct hidpp_report response;
   1454	int ret;
   1455	u8 *params = (u8 *)response.fap.params;
   1456
   1457	if (hidpp->capabilities & HIDPP_CAPABILITY_BATTERY_LEVEL_STATUS ||
   1458	    hidpp->capabilities & HIDPP_CAPABILITY_BATTERY_PERCENTAGE) {
   1459		/* we have already set the device capabilities, so let's skip */
   1460		return 0;
   1461	}
   1462
   1463	ret = hidpp_send_fap_command_sync(hidpp, feature_index,
   1464					  CMD_UNIFIED_BATTERY_GET_CAPABILITIES,
   1465					  NULL, 0, &response);
   1466	/* Ignore these intermittent errors */
   1467	if (ret == HIDPP_ERROR_RESOURCE_ERROR)
   1468		return -EIO;
   1469	if (ret > 0) {
   1470		hid_err(hidpp->hid_dev, "%s: received protocol error 0x%02x\n",
   1471			__func__, ret);
   1472		return -EPROTO;
   1473	}
   1474	if (ret)
   1475		return ret;
   1476
   1477	/*
   1478	 * If the device supports state of charge (battery percentage) we won't
   1479	 * export the battery level information. there are 4 possible battery
   1480	 * levels and they all are optional, this means that the device might
   1481	 * not support any of them, we are just better off with the battery
   1482	 * percentage.
   1483	 */
   1484	if (params[1] & FLAG_UNIFIED_BATTERY_FLAGS_STATE_OF_CHARGE) {
   1485		hidpp->capabilities |= HIDPP_CAPABILITY_BATTERY_PERCENTAGE;
   1486		hidpp->battery.supported_levels_1004 = 0;
   1487	} else {
   1488		hidpp->capabilities |= HIDPP_CAPABILITY_BATTERY_LEVEL_STATUS;
   1489		hidpp->battery.supported_levels_1004 = params[0];
   1490	}
   1491
   1492	return 0;
   1493}
   1494
   1495static int hidpp20_unifiedbattery_map_status(struct hidpp_device *hidpp,
   1496					     u8 charging_status,
   1497					     u8 external_power_status)
   1498{
   1499	int status;
   1500
   1501	switch (charging_status) {
   1502		case 0: /* discharging */
   1503			status = POWER_SUPPLY_STATUS_DISCHARGING;
   1504			break;
   1505		case 1: /* charging */
   1506		case 2: /* charging slow */
   1507			status = POWER_SUPPLY_STATUS_CHARGING;
   1508			break;
   1509		case 3: /* complete */
   1510			status = POWER_SUPPLY_STATUS_FULL;
   1511			break;
   1512		case 4: /* error */
   1513			status = POWER_SUPPLY_STATUS_NOT_CHARGING;
   1514			hid_info(hidpp->hid_dev, "%s: charging error",
   1515				 hidpp->name);
   1516			break;
   1517		default:
   1518			status = POWER_SUPPLY_STATUS_NOT_CHARGING;
   1519			break;
   1520	}
   1521
   1522	return status;
   1523}
   1524
   1525static int hidpp20_unifiedbattery_map_level(struct hidpp_device *hidpp,
   1526					    u8 battery_level)
   1527{
   1528	/* cler unsupported level bits */
   1529	battery_level &= hidpp->battery.supported_levels_1004;
   1530
   1531	if (battery_level & FLAG_UNIFIED_BATTERY_LEVEL_FULL)
   1532		return POWER_SUPPLY_CAPACITY_LEVEL_FULL;
   1533	else if (battery_level & FLAG_UNIFIED_BATTERY_LEVEL_GOOD)
   1534		return POWER_SUPPLY_CAPACITY_LEVEL_NORMAL;
   1535	else if (battery_level & FLAG_UNIFIED_BATTERY_LEVEL_LOW)
   1536		return POWER_SUPPLY_CAPACITY_LEVEL_LOW;
   1537	else if (battery_level & FLAG_UNIFIED_BATTERY_LEVEL_CRITICAL)
   1538		return POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL;
   1539
   1540	return POWER_SUPPLY_CAPACITY_LEVEL_UNKNOWN;
   1541}
   1542
   1543static int hidpp20_unifiedbattery_get_status(struct hidpp_device *hidpp,
   1544					     u8 feature_index,
   1545					     u8 *state_of_charge,
   1546					     int *status,
   1547					     int *level)
   1548{
   1549	struct hidpp_report response;
   1550	int ret;
   1551	u8 *params = (u8 *)response.fap.params;
   1552
   1553	ret = hidpp_send_fap_command_sync(hidpp, feature_index,
   1554					  CMD_UNIFIED_BATTERY_GET_STATUS,
   1555					  NULL, 0, &response);
   1556	/* Ignore these intermittent errors */
   1557	if (ret == HIDPP_ERROR_RESOURCE_ERROR)
   1558		return -EIO;
   1559	if (ret > 0) {
   1560		hid_err(hidpp->hid_dev, "%s: received protocol error 0x%02x\n",
   1561			__func__, ret);
   1562		return -EPROTO;
   1563	}
   1564	if (ret)
   1565		return ret;
   1566
   1567	*state_of_charge = params[0];
   1568	*status = hidpp20_unifiedbattery_map_status(hidpp, params[2], params[3]);
   1569	*level = hidpp20_unifiedbattery_map_level(hidpp, params[1]);
   1570
   1571	return 0;
   1572}
   1573
   1574static int hidpp20_query_battery_info_1004(struct hidpp_device *hidpp)
   1575{
   1576	u8 feature_type;
   1577	int ret;
   1578	u8 state_of_charge;
   1579	int status, level;
   1580
   1581	if (hidpp->battery.feature_index == 0xff) {
   1582		ret = hidpp_root_get_feature(hidpp,
   1583					     HIDPP_PAGE_UNIFIED_BATTERY,
   1584					     &hidpp->battery.feature_index,
   1585					     &feature_type);
   1586		if (ret)
   1587			return ret;
   1588	}
   1589
   1590	ret = hidpp20_unifiedbattery_get_capabilities(hidpp,
   1591					hidpp->battery.feature_index);
   1592	if (ret)
   1593		return ret;
   1594
   1595	ret = hidpp20_unifiedbattery_get_status(hidpp,
   1596						hidpp->battery.feature_index,
   1597						&state_of_charge,
   1598						&status,
   1599						&level);
   1600	if (ret)
   1601		return ret;
   1602
   1603	hidpp->capabilities |= HIDPP_CAPABILITY_UNIFIED_BATTERY;
   1604	hidpp->battery.capacity = state_of_charge;
   1605	hidpp->battery.status = status;
   1606	hidpp->battery.level = level;
   1607	hidpp->battery.online = true;
   1608
   1609	return 0;
   1610}
   1611
   1612static int hidpp20_battery_event_1004(struct hidpp_device *hidpp,
   1613				 u8 *data, int size)
   1614{
   1615	struct hidpp_report *report = (struct hidpp_report *)data;
   1616	u8 *params = (u8 *)report->fap.params;
   1617	int state_of_charge, status, level;
   1618	bool changed;
   1619
   1620	if (report->fap.feature_index != hidpp->battery.feature_index ||
   1621	    report->fap.funcindex_clientid != EVENT_UNIFIED_BATTERY_STATUS_EVENT)
   1622		return 0;
   1623
   1624	state_of_charge = params[0];
   1625	status = hidpp20_unifiedbattery_map_status(hidpp, params[2], params[3]);
   1626	level = hidpp20_unifiedbattery_map_level(hidpp, params[1]);
   1627
   1628	changed = status != hidpp->battery.status ||
   1629		  (state_of_charge != hidpp->battery.capacity &&
   1630		   hidpp->capabilities & HIDPP_CAPABILITY_BATTERY_PERCENTAGE) ||
   1631		  (level != hidpp->battery.level &&
   1632		   hidpp->capabilities & HIDPP_CAPABILITY_BATTERY_LEVEL_STATUS);
   1633
   1634	if (changed) {
   1635		hidpp->battery.capacity = state_of_charge;
   1636		hidpp->battery.status = status;
   1637		hidpp->battery.level = level;
   1638		if (hidpp->battery.ps)
   1639			power_supply_changed(hidpp->battery.ps);
   1640	}
   1641
   1642	return 0;
   1643}
   1644
   1645/* -------------------------------------------------------------------------- */
   1646/* Battery feature helpers                                                    */
   1647/* -------------------------------------------------------------------------- */
   1648
   1649static enum power_supply_property hidpp_battery_props[] = {
   1650	POWER_SUPPLY_PROP_ONLINE,
   1651	POWER_SUPPLY_PROP_STATUS,
   1652	POWER_SUPPLY_PROP_SCOPE,
   1653	POWER_SUPPLY_PROP_MODEL_NAME,
   1654	POWER_SUPPLY_PROP_MANUFACTURER,
   1655	POWER_SUPPLY_PROP_SERIAL_NUMBER,
   1656	0, /* placeholder for POWER_SUPPLY_PROP_CAPACITY, */
   1657	0, /* placeholder for POWER_SUPPLY_PROP_CAPACITY_LEVEL, */
   1658	0, /* placeholder for POWER_SUPPLY_PROP_VOLTAGE_NOW, */
   1659};
   1660
   1661static int hidpp_battery_get_property(struct power_supply *psy,
   1662				      enum power_supply_property psp,
   1663				      union power_supply_propval *val)
   1664{
   1665	struct hidpp_device *hidpp = power_supply_get_drvdata(psy);
   1666	int ret = 0;
   1667
   1668	switch(psp) {
   1669		case POWER_SUPPLY_PROP_STATUS:
   1670			val->intval = hidpp->battery.status;
   1671			break;
   1672		case POWER_SUPPLY_PROP_CAPACITY:
   1673			val->intval = hidpp->battery.capacity;
   1674			break;
   1675		case POWER_SUPPLY_PROP_CAPACITY_LEVEL:
   1676			val->intval = hidpp->battery.level;
   1677			break;
   1678		case POWER_SUPPLY_PROP_SCOPE:
   1679			val->intval = POWER_SUPPLY_SCOPE_DEVICE;
   1680			break;
   1681		case POWER_SUPPLY_PROP_ONLINE:
   1682			val->intval = hidpp->battery.online;
   1683			break;
   1684		case POWER_SUPPLY_PROP_MODEL_NAME:
   1685			if (!strncmp(hidpp->name, "Logitech ", 9))
   1686				val->strval = hidpp->name + 9;
   1687			else
   1688				val->strval = hidpp->name;
   1689			break;
   1690		case POWER_SUPPLY_PROP_MANUFACTURER:
   1691			val->strval = "Logitech";
   1692			break;
   1693		case POWER_SUPPLY_PROP_SERIAL_NUMBER:
   1694			val->strval = hidpp->hid_dev->uniq;
   1695			break;
   1696		case POWER_SUPPLY_PROP_VOLTAGE_NOW:
   1697			/* hardware reports voltage in in mV. sysfs expects uV */
   1698			val->intval = hidpp->battery.voltage * 1000;
   1699			break;
   1700		case POWER_SUPPLY_PROP_CHARGE_TYPE:
   1701			val->intval = hidpp->battery.charge_type;
   1702			break;
   1703		default:
   1704			ret = -EINVAL;
   1705			break;
   1706	}
   1707
   1708	return ret;
   1709}
   1710
   1711/* -------------------------------------------------------------------------- */
   1712/* 0x1d4b: Wireless device status                                             */
   1713/* -------------------------------------------------------------------------- */
   1714#define HIDPP_PAGE_WIRELESS_DEVICE_STATUS			0x1d4b
   1715
   1716static int hidpp_set_wireless_feature_index(struct hidpp_device *hidpp)
   1717{
   1718	u8 feature_type;
   1719	int ret;
   1720
   1721	ret = hidpp_root_get_feature(hidpp,
   1722				     HIDPP_PAGE_WIRELESS_DEVICE_STATUS,
   1723				     &hidpp->wireless_feature_index,
   1724				     &feature_type);
   1725
   1726	return ret;
   1727}
   1728
   1729/* -------------------------------------------------------------------------- */
   1730/* 0x2120: Hi-resolution scrolling                                            */
   1731/* -------------------------------------------------------------------------- */
   1732
   1733#define HIDPP_PAGE_HI_RESOLUTION_SCROLLING			0x2120
   1734
   1735#define CMD_HI_RESOLUTION_SCROLLING_SET_HIGHRES_SCROLLING_MODE	0x10
   1736
   1737static int hidpp_hrs_set_highres_scrolling_mode(struct hidpp_device *hidpp,
   1738	bool enabled, u8 *multiplier)
   1739{
   1740	u8 feature_index;
   1741	u8 feature_type;
   1742	int ret;
   1743	u8 params[1];
   1744	struct hidpp_report response;
   1745
   1746	ret = hidpp_root_get_feature(hidpp,
   1747				     HIDPP_PAGE_HI_RESOLUTION_SCROLLING,
   1748				     &feature_index,
   1749				     &feature_type);
   1750	if (ret)
   1751		return ret;
   1752
   1753	params[0] = enabled ? BIT(0) : 0;
   1754	ret = hidpp_send_fap_command_sync(hidpp, feature_index,
   1755					  CMD_HI_RESOLUTION_SCROLLING_SET_HIGHRES_SCROLLING_MODE,
   1756					  params, sizeof(params), &response);
   1757	if (ret)
   1758		return ret;
   1759	*multiplier = response.fap.params[1];
   1760	return 0;
   1761}
   1762
   1763/* -------------------------------------------------------------------------- */
   1764/* 0x2121: HiRes Wheel                                                        */
   1765/* -------------------------------------------------------------------------- */
   1766
   1767#define HIDPP_PAGE_HIRES_WHEEL		0x2121
   1768
   1769#define CMD_HIRES_WHEEL_GET_WHEEL_CAPABILITY	0x00
   1770#define CMD_HIRES_WHEEL_SET_WHEEL_MODE		0x20
   1771
   1772static int hidpp_hrw_get_wheel_capability(struct hidpp_device *hidpp,
   1773	u8 *multiplier)
   1774{
   1775	u8 feature_index;
   1776	u8 feature_type;
   1777	int ret;
   1778	struct hidpp_report response;
   1779
   1780	ret = hidpp_root_get_feature(hidpp, HIDPP_PAGE_HIRES_WHEEL,
   1781				     &feature_index, &feature_type);
   1782	if (ret)
   1783		goto return_default;
   1784
   1785	ret = hidpp_send_fap_command_sync(hidpp, feature_index,
   1786					  CMD_HIRES_WHEEL_GET_WHEEL_CAPABILITY,
   1787					  NULL, 0, &response);
   1788	if (ret)
   1789		goto return_default;
   1790
   1791	*multiplier = response.fap.params[0];
   1792	return 0;
   1793return_default:
   1794	hid_warn(hidpp->hid_dev,
   1795		 "Couldn't get wheel multiplier (error %d)\n", ret);
   1796	return ret;
   1797}
   1798
   1799static int hidpp_hrw_set_wheel_mode(struct hidpp_device *hidpp, bool invert,
   1800	bool high_resolution, bool use_hidpp)
   1801{
   1802	u8 feature_index;
   1803	u8 feature_type;
   1804	int ret;
   1805	u8 params[1];
   1806	struct hidpp_report response;
   1807
   1808	ret = hidpp_root_get_feature(hidpp, HIDPP_PAGE_HIRES_WHEEL,
   1809				     &feature_index, &feature_type);
   1810	if (ret)
   1811		return ret;
   1812
   1813	params[0] = (invert          ? BIT(2) : 0) |
   1814		    (high_resolution ? BIT(1) : 0) |
   1815		    (use_hidpp       ? BIT(0) : 0);
   1816
   1817	return hidpp_send_fap_command_sync(hidpp, feature_index,
   1818					   CMD_HIRES_WHEEL_SET_WHEEL_MODE,
   1819					   params, sizeof(params), &response);
   1820}
   1821
   1822/* -------------------------------------------------------------------------- */
   1823/* 0x4301: Solar Keyboard                                                     */
   1824/* -------------------------------------------------------------------------- */
   1825
   1826#define HIDPP_PAGE_SOLAR_KEYBOARD			0x4301
   1827
   1828#define CMD_SOLAR_SET_LIGHT_MEASURE			0x00
   1829
   1830#define EVENT_SOLAR_BATTERY_BROADCAST			0x00
   1831#define EVENT_SOLAR_BATTERY_LIGHT_MEASURE		0x10
   1832#define EVENT_SOLAR_CHECK_LIGHT_BUTTON			0x20
   1833
   1834static int hidpp_solar_request_battery_event(struct hidpp_device *hidpp)
   1835{
   1836	struct hidpp_report response;
   1837	u8 params[2] = { 1, 1 };
   1838	u8 feature_type;
   1839	int ret;
   1840
   1841	if (hidpp->battery.feature_index == 0xff) {
   1842		ret = hidpp_root_get_feature(hidpp,
   1843					     HIDPP_PAGE_SOLAR_KEYBOARD,
   1844					     &hidpp->battery.solar_feature_index,
   1845					     &feature_type);
   1846		if (ret)
   1847			return ret;
   1848	}
   1849
   1850	ret = hidpp_send_fap_command_sync(hidpp,
   1851					  hidpp->battery.solar_feature_index,
   1852					  CMD_SOLAR_SET_LIGHT_MEASURE,
   1853					  params, 2, &response);
   1854	if (ret > 0) {
   1855		hid_err(hidpp->hid_dev, "%s: received protocol error 0x%02x\n",
   1856			__func__, ret);
   1857		return -EPROTO;
   1858	}
   1859	if (ret)
   1860		return ret;
   1861
   1862	hidpp->capabilities |= HIDPP_CAPABILITY_BATTERY_MILEAGE;
   1863
   1864	return 0;
   1865}
   1866
   1867static int hidpp_solar_battery_event(struct hidpp_device *hidpp,
   1868				     u8 *data, int size)
   1869{
   1870	struct hidpp_report *report = (struct hidpp_report *)data;
   1871	int capacity, lux, status;
   1872	u8 function;
   1873
   1874	function = report->fap.funcindex_clientid;
   1875
   1876
   1877	if (report->fap.feature_index != hidpp->battery.solar_feature_index ||
   1878	    !(function == EVENT_SOLAR_BATTERY_BROADCAST ||
   1879	      function == EVENT_SOLAR_BATTERY_LIGHT_MEASURE ||
   1880	      function == EVENT_SOLAR_CHECK_LIGHT_BUTTON))
   1881		return 0;
   1882
   1883	capacity = report->fap.params[0];
   1884
   1885	switch (function) {
   1886	case EVENT_SOLAR_BATTERY_LIGHT_MEASURE:
   1887		lux = (report->fap.params[1] << 8) | report->fap.params[2];
   1888		if (lux > 200)
   1889			status = POWER_SUPPLY_STATUS_CHARGING;
   1890		else
   1891			status = POWER_SUPPLY_STATUS_DISCHARGING;
   1892		break;
   1893	case EVENT_SOLAR_CHECK_LIGHT_BUTTON:
   1894	default:
   1895		if (capacity < hidpp->battery.capacity)
   1896			status = POWER_SUPPLY_STATUS_DISCHARGING;
   1897		else
   1898			status = POWER_SUPPLY_STATUS_CHARGING;
   1899
   1900	}
   1901
   1902	if (capacity == 100)
   1903		status = POWER_SUPPLY_STATUS_FULL;
   1904
   1905	hidpp->battery.online = true;
   1906	if (capacity != hidpp->battery.capacity ||
   1907	    status != hidpp->battery.status) {
   1908		hidpp->battery.capacity = capacity;
   1909		hidpp->battery.status = status;
   1910		if (hidpp->battery.ps)
   1911			power_supply_changed(hidpp->battery.ps);
   1912	}
   1913
   1914	return 0;
   1915}
   1916
   1917/* -------------------------------------------------------------------------- */
   1918/* 0x6010: Touchpad FW items                                                  */
   1919/* -------------------------------------------------------------------------- */
   1920
   1921#define HIDPP_PAGE_TOUCHPAD_FW_ITEMS			0x6010
   1922
   1923#define CMD_TOUCHPAD_FW_ITEMS_SET			0x10
   1924
   1925struct hidpp_touchpad_fw_items {
   1926	uint8_t presence;
   1927	uint8_t desired_state;
   1928	uint8_t state;
   1929	uint8_t persistent;
   1930};
   1931
   1932/*
   1933 * send a set state command to the device by reading the current items->state
   1934 * field. items is then filled with the current state.
   1935 */
   1936static int hidpp_touchpad_fw_items_set(struct hidpp_device *hidpp,
   1937				       u8 feature_index,
   1938				       struct hidpp_touchpad_fw_items *items)
   1939{
   1940	struct hidpp_report response;
   1941	int ret;
   1942	u8 *params = (u8 *)response.fap.params;
   1943
   1944	ret = hidpp_send_fap_command_sync(hidpp, feature_index,
   1945		CMD_TOUCHPAD_FW_ITEMS_SET, &items->state, 1, &response);
   1946
   1947	if (ret > 0) {
   1948		hid_err(hidpp->hid_dev, "%s: received protocol error 0x%02x\n",
   1949			__func__, ret);
   1950		return -EPROTO;
   1951	}
   1952	if (ret)
   1953		return ret;
   1954
   1955	items->presence = params[0];
   1956	items->desired_state = params[1];
   1957	items->state = params[2];
   1958	items->persistent = params[3];
   1959
   1960	return 0;
   1961}
   1962
   1963/* -------------------------------------------------------------------------- */
   1964/* 0x6100: TouchPadRawXY                                                      */
   1965/* -------------------------------------------------------------------------- */
   1966
   1967#define HIDPP_PAGE_TOUCHPAD_RAW_XY			0x6100
   1968
   1969#define CMD_TOUCHPAD_GET_RAW_INFO			0x01
   1970#define CMD_TOUCHPAD_SET_RAW_REPORT_STATE		0x21
   1971
   1972#define EVENT_TOUCHPAD_RAW_XY				0x00
   1973
   1974#define TOUCHPAD_RAW_XY_ORIGIN_LOWER_LEFT		0x01
   1975#define TOUCHPAD_RAW_XY_ORIGIN_UPPER_LEFT		0x03
   1976
   1977struct hidpp_touchpad_raw_info {
   1978	u16 x_size;
   1979	u16 y_size;
   1980	u8 z_range;
   1981	u8 area_range;
   1982	u8 timestamp_unit;
   1983	u8 maxcontacts;
   1984	u8 origin;
   1985	u16 res;
   1986};
   1987
   1988struct hidpp_touchpad_raw_xy_finger {
   1989	u8 contact_type;
   1990	u8 contact_status;
   1991	u16 x;
   1992	u16 y;
   1993	u8 z;
   1994	u8 area;
   1995	u8 finger_id;
   1996};
   1997
   1998struct hidpp_touchpad_raw_xy {
   1999	u16 timestamp;
   2000	struct hidpp_touchpad_raw_xy_finger fingers[2];
   2001	u8 spurious_flag;
   2002	u8 end_of_frame;
   2003	u8 finger_count;
   2004	u8 button;
   2005};
   2006
   2007static int hidpp_touchpad_get_raw_info(struct hidpp_device *hidpp,
   2008	u8 feature_index, struct hidpp_touchpad_raw_info *raw_info)
   2009{
   2010	struct hidpp_report response;
   2011	int ret;
   2012	u8 *params = (u8 *)response.fap.params;
   2013
   2014	ret = hidpp_send_fap_command_sync(hidpp, feature_index,
   2015		CMD_TOUCHPAD_GET_RAW_INFO, NULL, 0, &response);
   2016
   2017	if (ret > 0) {
   2018		hid_err(hidpp->hid_dev, "%s: received protocol error 0x%02x\n",
   2019			__func__, ret);
   2020		return -EPROTO;
   2021	}
   2022	if (ret)
   2023		return ret;
   2024
   2025	raw_info->x_size = get_unaligned_be16(&params[0]);
   2026	raw_info->y_size = get_unaligned_be16(&params[2]);
   2027	raw_info->z_range = params[4];
   2028	raw_info->area_range = params[5];
   2029	raw_info->maxcontacts = params[7];
   2030	raw_info->origin = params[8];
   2031	/* res is given in unit per inch */
   2032	raw_info->res = get_unaligned_be16(&params[13]) * 2 / 51;
   2033
   2034	return ret;
   2035}
   2036
   2037static int hidpp_touchpad_set_raw_report_state(struct hidpp_device *hidpp_dev,
   2038		u8 feature_index, bool send_raw_reports,
   2039		bool sensor_enhanced_settings)
   2040{
   2041	struct hidpp_report response;
   2042
   2043	/*
   2044	 * Params:
   2045	 *   bit 0 - enable raw
   2046	 *   bit 1 - 16bit Z, no area
   2047	 *   bit 2 - enhanced sensitivity
   2048	 *   bit 3 - width, height (4 bits each) instead of area
   2049	 *   bit 4 - send raw + gestures (degrades smoothness)
   2050	 *   remaining bits - reserved
   2051	 */
   2052	u8 params = send_raw_reports | (sensor_enhanced_settings << 2);
   2053
   2054	return hidpp_send_fap_command_sync(hidpp_dev, feature_index,
   2055		CMD_TOUCHPAD_SET_RAW_REPORT_STATE, &params, 1, &response);
   2056}
   2057
   2058static void hidpp_touchpad_touch_event(u8 *data,
   2059	struct hidpp_touchpad_raw_xy_finger *finger)
   2060{
   2061	u8 x_m = data[0] << 2;
   2062	u8 y_m = data[2] << 2;
   2063
   2064	finger->x = x_m << 6 | data[1];
   2065	finger->y = y_m << 6 | data[3];
   2066
   2067	finger->contact_type = data[0] >> 6;
   2068	finger->contact_status = data[2] >> 6;
   2069
   2070	finger->z = data[4];
   2071	finger->area = data[5];
   2072	finger->finger_id = data[6] >> 4;
   2073}
   2074
   2075static void hidpp_touchpad_raw_xy_event(struct hidpp_device *hidpp_dev,
   2076		u8 *data, struct hidpp_touchpad_raw_xy *raw_xy)
   2077{
   2078	memset(raw_xy, 0, sizeof(struct hidpp_touchpad_raw_xy));
   2079	raw_xy->end_of_frame = data[8] & 0x01;
   2080	raw_xy->spurious_flag = (data[8] >> 1) & 0x01;
   2081	raw_xy->finger_count = data[15] & 0x0f;
   2082	raw_xy->button = (data[8] >> 2) & 0x01;
   2083
   2084	if (raw_xy->finger_count) {
   2085		hidpp_touchpad_touch_event(&data[2], &raw_xy->fingers[0]);
   2086		hidpp_touchpad_touch_event(&data[9], &raw_xy->fingers[1]);
   2087	}
   2088}
   2089
   2090/* -------------------------------------------------------------------------- */
   2091/* 0x8123: Force feedback support                                             */
   2092/* -------------------------------------------------------------------------- */
   2093
   2094#define HIDPP_FF_GET_INFO		0x01
   2095#define HIDPP_FF_RESET_ALL		0x11
   2096#define HIDPP_FF_DOWNLOAD_EFFECT	0x21
   2097#define HIDPP_FF_SET_EFFECT_STATE	0x31
   2098#define HIDPP_FF_DESTROY_EFFECT		0x41
   2099#define HIDPP_FF_GET_APERTURE		0x51
   2100#define HIDPP_FF_SET_APERTURE		0x61
   2101#define HIDPP_FF_GET_GLOBAL_GAINS	0x71
   2102#define HIDPP_FF_SET_GLOBAL_GAINS	0x81
   2103
   2104#define HIDPP_FF_EFFECT_STATE_GET	0x00
   2105#define HIDPP_FF_EFFECT_STATE_STOP	0x01
   2106#define HIDPP_FF_EFFECT_STATE_PLAY	0x02
   2107#define HIDPP_FF_EFFECT_STATE_PAUSE	0x03
   2108
   2109#define HIDPP_FF_EFFECT_CONSTANT	0x00
   2110#define HIDPP_FF_EFFECT_PERIODIC_SINE		0x01
   2111#define HIDPP_FF_EFFECT_PERIODIC_SQUARE		0x02
   2112#define HIDPP_FF_EFFECT_PERIODIC_TRIANGLE	0x03
   2113#define HIDPP_FF_EFFECT_PERIODIC_SAWTOOTHUP	0x04
   2114#define HIDPP_FF_EFFECT_PERIODIC_SAWTOOTHDOWN	0x05
   2115#define HIDPP_FF_EFFECT_SPRING		0x06
   2116#define HIDPP_FF_EFFECT_DAMPER		0x07
   2117#define HIDPP_FF_EFFECT_FRICTION	0x08
   2118#define HIDPP_FF_EFFECT_INERTIA		0x09
   2119#define HIDPP_FF_EFFECT_RAMP		0x0A
   2120
   2121#define HIDPP_FF_EFFECT_AUTOSTART	0x80
   2122
   2123#define HIDPP_FF_EFFECTID_NONE		-1
   2124#define HIDPP_FF_EFFECTID_AUTOCENTER	-2
   2125#define HIDPP_AUTOCENTER_PARAMS_LENGTH	18
   2126
   2127#define HIDPP_FF_MAX_PARAMS	20
   2128#define HIDPP_FF_RESERVED_SLOTS	1
   2129
   2130struct hidpp_ff_private_data {
   2131	struct hidpp_device *hidpp;
   2132	u8 feature_index;
   2133	u8 version;
   2134	u16 gain;
   2135	s16 range;
   2136	u8 slot_autocenter;
   2137	u8 num_effects;
   2138	int *effect_ids;
   2139	struct workqueue_struct *wq;
   2140	atomic_t workqueue_size;
   2141};
   2142
   2143struct hidpp_ff_work_data {
   2144	struct work_struct work;
   2145	struct hidpp_ff_private_data *data;
   2146	int effect_id;
   2147	u8 command;
   2148	u8 params[HIDPP_FF_MAX_PARAMS];
   2149	u8 size;
   2150};
   2151
   2152static const signed short hidpp_ff_effects[] = {
   2153	FF_CONSTANT,
   2154	FF_PERIODIC,
   2155	FF_SINE,
   2156	FF_SQUARE,
   2157	FF_SAW_UP,
   2158	FF_SAW_DOWN,
   2159	FF_TRIANGLE,
   2160	FF_SPRING,
   2161	FF_DAMPER,
   2162	FF_AUTOCENTER,
   2163	FF_GAIN,
   2164	-1
   2165};
   2166
   2167static const signed short hidpp_ff_effects_v2[] = {
   2168	FF_RAMP,
   2169	FF_FRICTION,
   2170	FF_INERTIA,
   2171	-1
   2172};
   2173
   2174static const u8 HIDPP_FF_CONDITION_CMDS[] = {
   2175	HIDPP_FF_EFFECT_SPRING,
   2176	HIDPP_FF_EFFECT_FRICTION,
   2177	HIDPP_FF_EFFECT_DAMPER,
   2178	HIDPP_FF_EFFECT_INERTIA
   2179};
   2180
   2181static const char *HIDPP_FF_CONDITION_NAMES[] = {
   2182	"spring",
   2183	"friction",
   2184	"damper",
   2185	"inertia"
   2186};
   2187
   2188
   2189static u8 hidpp_ff_find_effect(struct hidpp_ff_private_data *data, int effect_id)
   2190{
   2191	int i;
   2192
   2193	for (i = 0; i < data->num_effects; i++)
   2194		if (data->effect_ids[i] == effect_id)
   2195			return i+1;
   2196
   2197	return 0;
   2198}
   2199
   2200static void hidpp_ff_work_handler(struct work_struct *w)
   2201{
   2202	struct hidpp_ff_work_data *wd = container_of(w, struct hidpp_ff_work_data, work);
   2203	struct hidpp_ff_private_data *data = wd->data;
   2204	struct hidpp_report response;
   2205	u8 slot;
   2206	int ret;
   2207
   2208	/* add slot number if needed */
   2209	switch (wd->effect_id) {
   2210	case HIDPP_FF_EFFECTID_AUTOCENTER:
   2211		wd->params[0] = data->slot_autocenter;
   2212		break;
   2213	case HIDPP_FF_EFFECTID_NONE:
   2214		/* leave slot as zero */
   2215		break;
   2216	default:
   2217		/* find current slot for effect */
   2218		wd->params[0] = hidpp_ff_find_effect(data, wd->effect_id);
   2219		break;
   2220	}
   2221
   2222	/* send command and wait for reply */
   2223	ret = hidpp_send_fap_command_sync(data->hidpp, data->feature_index,
   2224		wd->command, wd->params, wd->size, &response);
   2225
   2226	if (ret) {
   2227		hid_err(data->hidpp->hid_dev, "Failed to send command to device!\n");
   2228		goto out;
   2229	}
   2230
   2231	/* parse return data */
   2232	switch (wd->command) {
   2233	case HIDPP_FF_DOWNLOAD_EFFECT:
   2234		slot = response.fap.params[0];
   2235		if (slot > 0 && slot <= data->num_effects) {
   2236			if (wd->effect_id >= 0)
   2237				/* regular effect uploaded */
   2238				data->effect_ids[slot-1] = wd->effect_id;
   2239			else if (wd->effect_id >= HIDPP_FF_EFFECTID_AUTOCENTER)
   2240				/* autocenter spring uploaded */
   2241				data->slot_autocenter = slot;
   2242		}
   2243		break;
   2244	case HIDPP_FF_DESTROY_EFFECT:
   2245		if (wd->effect_id >= 0)
   2246			/* regular effect destroyed */
   2247			data->effect_ids[wd->params[0]-1] = -1;
   2248		else if (wd->effect_id >= HIDPP_FF_EFFECTID_AUTOCENTER)
   2249			/* autocenter spring destoyed */
   2250			data->slot_autocenter = 0;
   2251		break;
   2252	case HIDPP_FF_SET_GLOBAL_GAINS:
   2253		data->gain = (wd->params[0] << 8) + wd->params[1];
   2254		break;
   2255	case HIDPP_FF_SET_APERTURE:
   2256		data->range = (wd->params[0] << 8) + wd->params[1];
   2257		break;
   2258	default:
   2259		/* no action needed */
   2260		break;
   2261	}
   2262
   2263out:
   2264	atomic_dec(&data->workqueue_size);
   2265	kfree(wd);
   2266}
   2267
   2268static int hidpp_ff_queue_work(struct hidpp_ff_private_data *data, int effect_id, u8 command, u8 *params, u8 size)
   2269{
   2270	struct hidpp_ff_work_data *wd = kzalloc(sizeof(*wd), GFP_KERNEL);
   2271	int s;
   2272
   2273	if (!wd)
   2274		return -ENOMEM;
   2275
   2276	INIT_WORK(&wd->work, hidpp_ff_work_handler);
   2277
   2278	wd->data = data;
   2279	wd->effect_id = effect_id;
   2280	wd->command = command;
   2281	wd->size = size;
   2282	memcpy(wd->params, params, size);
   2283
   2284	s = atomic_inc_return(&data->workqueue_size);
   2285	queue_work(data->wq, &wd->work);
   2286
   2287	/* warn about excessive queue size */
   2288	if (s >= 20 && s % 20 == 0)
   2289		hid_warn(data->hidpp->hid_dev, "Force feedback command queue contains %d commands, causing substantial delays!", s);
   2290
   2291	return 0;
   2292}
   2293
   2294static int hidpp_ff_upload_effect(struct input_dev *dev, struct ff_effect *effect, struct ff_effect *old)
   2295{
   2296	struct hidpp_ff_private_data *data = dev->ff->private;
   2297	u8 params[20];
   2298	u8 size;
   2299	int force;
   2300
   2301	/* set common parameters */
   2302	params[2] = effect->replay.length >> 8;
   2303	params[3] = effect->replay.length & 255;
   2304	params[4] = effect->replay.delay >> 8;
   2305	params[5] = effect->replay.delay & 255;
   2306
   2307	switch (effect->type) {
   2308	case FF_CONSTANT:
   2309		force = (effect->u.constant.level * fixp_sin16((effect->direction * 360) >> 16)) >> 15;
   2310		params[1] = HIDPP_FF_EFFECT_CONSTANT;
   2311		params[6] = force >> 8;
   2312		params[7] = force & 255;
   2313		params[8] = effect->u.constant.envelope.attack_level >> 7;
   2314		params[9] = effect->u.constant.envelope.attack_length >> 8;
   2315		params[10] = effect->u.constant.envelope.attack_length & 255;
   2316		params[11] = effect->u.constant.envelope.fade_level >> 7;
   2317		params[12] = effect->u.constant.envelope.fade_length >> 8;
   2318		params[13] = effect->u.constant.envelope.fade_length & 255;
   2319		size = 14;
   2320		dbg_hid("Uploading constant force level=%d in dir %d = %d\n",
   2321				effect->u.constant.level,
   2322				effect->direction, force);
   2323		dbg_hid("          envelope attack=(%d, %d ms) fade=(%d, %d ms)\n",
   2324				effect->u.constant.envelope.attack_level,
   2325				effect->u.constant.envelope.attack_length,
   2326				effect->u.constant.envelope.fade_level,
   2327				effect->u.constant.envelope.fade_length);
   2328		break;
   2329	case FF_PERIODIC:
   2330	{
   2331		switch (effect->u.periodic.waveform) {
   2332		case FF_SINE:
   2333			params[1] = HIDPP_FF_EFFECT_PERIODIC_SINE;
   2334			break;
   2335		case FF_SQUARE:
   2336			params[1] = HIDPP_FF_EFFECT_PERIODIC_SQUARE;
   2337			break;
   2338		case FF_SAW_UP:
   2339			params[1] = HIDPP_FF_EFFECT_PERIODIC_SAWTOOTHUP;
   2340			break;
   2341		case FF_SAW_DOWN:
   2342			params[1] = HIDPP_FF_EFFECT_PERIODIC_SAWTOOTHDOWN;
   2343			break;
   2344		case FF_TRIANGLE:
   2345			params[1] = HIDPP_FF_EFFECT_PERIODIC_TRIANGLE;
   2346			break;
   2347		default:
   2348			hid_err(data->hidpp->hid_dev, "Unexpected periodic waveform type %i!\n", effect->u.periodic.waveform);
   2349			return -EINVAL;
   2350		}
   2351		force = (effect->u.periodic.magnitude * fixp_sin16((effect->direction * 360) >> 16)) >> 15;
   2352		params[6] = effect->u.periodic.magnitude >> 8;
   2353		params[7] = effect->u.periodic.magnitude & 255;
   2354		params[8] = effect->u.periodic.offset >> 8;
   2355		params[9] = effect->u.periodic.offset & 255;
   2356		params[10] = effect->u.periodic.period >> 8;
   2357		params[11] = effect->u.periodic.period & 255;
   2358		params[12] = effect->u.periodic.phase >> 8;
   2359		params[13] = effect->u.periodic.phase & 255;
   2360		params[14] = effect->u.periodic.envelope.attack_level >> 7;
   2361		params[15] = effect->u.periodic.envelope.attack_length >> 8;
   2362		params[16] = effect->u.periodic.envelope.attack_length & 255;
   2363		params[17] = effect->u.periodic.envelope.fade_level >> 7;
   2364		params[18] = effect->u.periodic.envelope.fade_length >> 8;
   2365		params[19] = effect->u.periodic.envelope.fade_length & 255;
   2366		size = 20;
   2367		dbg_hid("Uploading periodic force mag=%d/dir=%d, offset=%d, period=%d ms, phase=%d\n",
   2368				effect->u.periodic.magnitude, effect->direction,
   2369				effect->u.periodic.offset,
   2370				effect->u.periodic.period,
   2371				effect->u.periodic.phase);
   2372		dbg_hid("          envelope attack=(%d, %d ms) fade=(%d, %d ms)\n",
   2373				effect->u.periodic.envelope.attack_level,
   2374				effect->u.periodic.envelope.attack_length,
   2375				effect->u.periodic.envelope.fade_level,
   2376				effect->u.periodic.envelope.fade_length);
   2377		break;
   2378	}
   2379	case FF_RAMP:
   2380		params[1] = HIDPP_FF_EFFECT_RAMP;
   2381		force = (effect->u.ramp.start_level * fixp_sin16((effect->direction * 360) >> 16)) >> 15;
   2382		params[6] = force >> 8;
   2383		params[7] = force & 255;
   2384		force = (effect->u.ramp.end_level * fixp_sin16((effect->direction * 360) >> 16)) >> 15;
   2385		params[8] = force >> 8;
   2386		params[9] = force & 255;
   2387		params[10] = effect->u.ramp.envelope.attack_level >> 7;
   2388		params[11] = effect->u.ramp.envelope.attack_length >> 8;
   2389		params[12] = effect->u.ramp.envelope.attack_length & 255;
   2390		params[13] = effect->u.ramp.envelope.fade_level >> 7;
   2391		params[14] = effect->u.ramp.envelope.fade_length >> 8;
   2392		params[15] = effect->u.ramp.envelope.fade_length & 255;
   2393		size = 16;
   2394		dbg_hid("Uploading ramp force level=%d -> %d in dir %d = %d\n",
   2395				effect->u.ramp.start_level,
   2396				effect->u.ramp.end_level,
   2397				effect->direction, force);
   2398		dbg_hid("          envelope attack=(%d, %d ms) fade=(%d, %d ms)\n",
   2399				effect->u.ramp.envelope.attack_level,
   2400				effect->u.ramp.envelope.attack_length,
   2401				effect->u.ramp.envelope.fade_level,
   2402				effect->u.ramp.envelope.fade_length);
   2403		break;
   2404	case FF_FRICTION:
   2405	case FF_INERTIA:
   2406	case FF_SPRING:
   2407	case FF_DAMPER:
   2408		params[1] = HIDPP_FF_CONDITION_CMDS[effect->type - FF_SPRING];
   2409		params[6] = effect->u.condition[0].left_saturation >> 9;
   2410		params[7] = (effect->u.condition[0].left_saturation >> 1) & 255;
   2411		params[8] = effect->u.condition[0].left_coeff >> 8;
   2412		params[9] = effect->u.condition[0].left_coeff & 255;
   2413		params[10] = effect->u.condition[0].deadband >> 9;
   2414		params[11] = (effect->u.condition[0].deadband >> 1) & 255;
   2415		params[12] = effect->u.condition[0].center >> 8;
   2416		params[13] = effect->u.condition[0].center & 255;
   2417		params[14] = effect->u.condition[0].right_coeff >> 8;
   2418		params[15] = effect->u.condition[0].right_coeff & 255;
   2419		params[16] = effect->u.condition[0].right_saturation >> 9;
   2420		params[17] = (effect->u.condition[0].right_saturation >> 1) & 255;
   2421		size = 18;
   2422		dbg_hid("Uploading %s force left coeff=%d, left sat=%d, right coeff=%d, right sat=%d\n",
   2423				HIDPP_FF_CONDITION_NAMES[effect->type - FF_SPRING],
   2424				effect->u.condition[0].left_coeff,
   2425				effect->u.condition[0].left_saturation,
   2426				effect->u.condition[0].right_coeff,
   2427				effect->u.condition[0].right_saturation);
   2428		dbg_hid("          deadband=%d, center=%d\n",
   2429				effect->u.condition[0].deadband,
   2430				effect->u.condition[0].center);
   2431		break;
   2432	default:
   2433		hid_err(data->hidpp->hid_dev, "Unexpected force type %i!\n", effect->type);
   2434		return -EINVAL;
   2435	}
   2436
   2437	return hidpp_ff_queue_work(data, effect->id, HIDPP_FF_DOWNLOAD_EFFECT, params, size);
   2438}
   2439
   2440static int hidpp_ff_playback(struct input_dev *dev, int effect_id, int value)
   2441{
   2442	struct hidpp_ff_private_data *data = dev->ff->private;
   2443	u8 params[2];
   2444
   2445	params[1] = value ? HIDPP_FF_EFFECT_STATE_PLAY : HIDPP_FF_EFFECT_STATE_STOP;
   2446
   2447	dbg_hid("St%sing playback of effect %d.\n", value?"art":"opp", effect_id);
   2448
   2449	return hidpp_ff_queue_work(data, effect_id, HIDPP_FF_SET_EFFECT_STATE, params, ARRAY_SIZE(params));
   2450}
   2451
   2452static int hidpp_ff_erase_effect(struct input_dev *dev, int effect_id)
   2453{
   2454	struct hidpp_ff_private_data *data = dev->ff->private;
   2455	u8 slot = 0;
   2456
   2457	dbg_hid("Erasing effect %d.\n", effect_id);
   2458
   2459	return hidpp_ff_queue_work(data, effect_id, HIDPP_FF_DESTROY_EFFECT, &slot, 1);
   2460}
   2461
   2462static void hidpp_ff_set_autocenter(struct input_dev *dev, u16 magnitude)
   2463{
   2464	struct hidpp_ff_private_data *data = dev->ff->private;
   2465	u8 params[HIDPP_AUTOCENTER_PARAMS_LENGTH];
   2466
   2467	dbg_hid("Setting autocenter to %d.\n", magnitude);
   2468
   2469	/* start a standard spring effect */
   2470	params[1] = HIDPP_FF_EFFECT_SPRING | HIDPP_FF_EFFECT_AUTOSTART;
   2471	/* zero delay and duration */
   2472	params[2] = params[3] = params[4] = params[5] = 0;
   2473	/* set coeff to 25% of saturation */
   2474	params[8] = params[14] = magnitude >> 11;
   2475	params[9] = params[15] = (magnitude >> 3) & 255;
   2476	params[6] = params[16] = magnitude >> 9;
   2477	params[7] = params[17] = (magnitude >> 1) & 255;
   2478	/* zero deadband and center */
   2479	params[10] = params[11] = params[12] = params[13] = 0;
   2480
   2481	hidpp_ff_queue_work(data, HIDPP_FF_EFFECTID_AUTOCENTER, HIDPP_FF_DOWNLOAD_EFFECT, params, ARRAY_SIZE(params));
   2482}
   2483
   2484static void hidpp_ff_set_gain(struct input_dev *dev, u16 gain)
   2485{
   2486	struct hidpp_ff_private_data *data = dev->ff->private;
   2487	u8 params[4];
   2488
   2489	dbg_hid("Setting gain to %d.\n", gain);
   2490
   2491	params[0] = gain >> 8;
   2492	params[1] = gain & 255;
   2493	params[2] = 0; /* no boost */
   2494	params[3] = 0;
   2495
   2496	hidpp_ff_queue_work(data, HIDPP_FF_EFFECTID_NONE, HIDPP_FF_SET_GLOBAL_GAINS, params, ARRAY_SIZE(params));
   2497}
   2498
   2499static ssize_t hidpp_ff_range_show(struct device *dev, struct device_attribute *attr, char *buf)
   2500{
   2501	struct hid_device *hid = to_hid_device(dev);
   2502	struct hid_input *hidinput = list_entry(hid->inputs.next, struct hid_input, list);
   2503	struct input_dev *idev = hidinput->input;
   2504	struct hidpp_ff_private_data *data = idev->ff->private;
   2505
   2506	return scnprintf(buf, PAGE_SIZE, "%u\n", data->range);
   2507}
   2508
   2509static ssize_t hidpp_ff_range_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
   2510{
   2511	struct hid_device *hid = to_hid_device(dev);
   2512	struct hid_input *hidinput = list_entry(hid->inputs.next, struct hid_input, list);
   2513	struct input_dev *idev = hidinput->input;
   2514	struct hidpp_ff_private_data *data = idev->ff->private;
   2515	u8 params[2];
   2516	int range = simple_strtoul(buf, NULL, 10);
   2517
   2518	range = clamp(range, 180, 900);
   2519
   2520	params[0] = range >> 8;
   2521	params[1] = range & 0x00FF;
   2522
   2523	hidpp_ff_queue_work(data, -1, HIDPP_FF_SET_APERTURE, params, ARRAY_SIZE(params));
   2524
   2525	return count;
   2526}
   2527
   2528static DEVICE_ATTR(range, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH, hidpp_ff_range_show, hidpp_ff_range_store);
   2529
   2530static void hidpp_ff_destroy(struct ff_device *ff)
   2531{
   2532	struct hidpp_ff_private_data *data = ff->private;
   2533	struct hid_device *hid = data->hidpp->hid_dev;
   2534
   2535	hid_info(hid, "Unloading HID++ force feedback.\n");
   2536
   2537	device_remove_file(&hid->dev, &dev_attr_range);
   2538	destroy_workqueue(data->wq);
   2539	kfree(data->effect_ids);
   2540}
   2541
   2542static int hidpp_ff_init(struct hidpp_device *hidpp,
   2543			 struct hidpp_ff_private_data *data)
   2544{
   2545	struct hid_device *hid = hidpp->hid_dev;
   2546	struct hid_input *hidinput;
   2547	struct input_dev *dev;
   2548	const struct usb_device_descriptor *udesc = &(hid_to_usb_dev(hid)->descriptor);
   2549	const u16 bcdDevice = le16_to_cpu(udesc->bcdDevice);
   2550	struct ff_device *ff;
   2551	int error, j, num_slots = data->num_effects;
   2552	u8 version;
   2553
   2554	if (list_empty(&hid->inputs)) {
   2555		hid_err(hid, "no inputs found\n");
   2556		return -ENODEV;
   2557	}
   2558	hidinput = list_entry(hid->inputs.next, struct hid_input, list);
   2559	dev = hidinput->input;
   2560
   2561	if (!dev) {
   2562		hid_err(hid, "Struct input_dev not set!\n");
   2563		return -EINVAL;
   2564	}
   2565
   2566	/* Get firmware release */
   2567	version = bcdDevice & 255;
   2568
   2569	/* Set supported force feedback capabilities */
   2570	for (j = 0; hidpp_ff_effects[j] >= 0; j++)
   2571		set_bit(hidpp_ff_effects[j], dev->ffbit);
   2572	if (version > 1)
   2573		for (j = 0; hidpp_ff_effects_v2[j] >= 0; j++)
   2574			set_bit(hidpp_ff_effects_v2[j], dev->ffbit);
   2575
   2576	error = input_ff_create(dev, num_slots);
   2577
   2578	if (error) {
   2579		hid_err(dev, "Failed to create FF device!\n");
   2580		return error;
   2581	}
   2582	/*
   2583	 * Create a copy of passed data, so we can transfer memory
   2584	 * ownership to FF core
   2585	 */
   2586	data = kmemdup(data, sizeof(*data), GFP_KERNEL);
   2587	if (!data)
   2588		return -ENOMEM;
   2589	data->effect_ids = kcalloc(num_slots, sizeof(int), GFP_KERNEL);
   2590	if (!data->effect_ids) {
   2591		kfree(data);
   2592		return -ENOMEM;
   2593	}
   2594	data->wq = create_singlethread_workqueue("hidpp-ff-sendqueue");
   2595	if (!data->wq) {
   2596		kfree(data->effect_ids);
   2597		kfree(data);
   2598		return -ENOMEM;
   2599	}
   2600
   2601	data->hidpp = hidpp;
   2602	data->version = version;
   2603	for (j = 0; j < num_slots; j++)
   2604		data->effect_ids[j] = -1;
   2605
   2606	ff = dev->ff;
   2607	ff->private = data;
   2608
   2609	ff->upload = hidpp_ff_upload_effect;
   2610	ff->erase = hidpp_ff_erase_effect;
   2611	ff->playback = hidpp_ff_playback;
   2612	ff->set_gain = hidpp_ff_set_gain;
   2613	ff->set_autocenter = hidpp_ff_set_autocenter;
   2614	ff->destroy = hidpp_ff_destroy;
   2615
   2616	/* Create sysfs interface */
   2617	error = device_create_file(&(hidpp->hid_dev->dev), &dev_attr_range);
   2618	if (error)
   2619		hid_warn(hidpp->hid_dev, "Unable to create sysfs interface for \"range\", errno %d!\n", error);
   2620
   2621	/* init the hardware command queue */
   2622	atomic_set(&data->workqueue_size, 0);
   2623
   2624	hid_info(hid, "Force feedback support loaded (firmware release %d).\n",
   2625		 version);
   2626
   2627	return 0;
   2628}
   2629
   2630/* ************************************************************************** */
   2631/*                                                                            */
   2632/* Device Support                                                             */
   2633/*                                                                            */
   2634/* ************************************************************************** */
   2635
   2636/* -------------------------------------------------------------------------- */
   2637/* Touchpad HID++ devices                                                     */
   2638/* -------------------------------------------------------------------------- */
   2639
   2640#define WTP_MANUAL_RESOLUTION				39
   2641
   2642struct wtp_data {
   2643	u16 x_size, y_size;
   2644	u8 finger_count;
   2645	u8 mt_feature_index;
   2646	u8 button_feature_index;
   2647	u8 maxcontacts;
   2648	bool flip_y;
   2649	unsigned int resolution;
   2650};
   2651
   2652static int wtp_input_mapping(struct hid_device *hdev, struct hid_input *hi,
   2653		struct hid_field *field, struct hid_usage *usage,
   2654		unsigned long **bit, int *max)
   2655{
   2656	return -1;
   2657}
   2658
   2659static void wtp_populate_input(struct hidpp_device *hidpp,
   2660			       struct input_dev *input_dev)
   2661{
   2662	struct wtp_data *wd = hidpp->private_data;
   2663
   2664	__set_bit(EV_ABS, input_dev->evbit);
   2665	__set_bit(EV_KEY, input_dev->evbit);
   2666	__clear_bit(EV_REL, input_dev->evbit);
   2667	__clear_bit(EV_LED, input_dev->evbit);
   2668
   2669	input_set_abs_params(input_dev, ABS_MT_POSITION_X, 0, wd->x_size, 0, 0);
   2670	input_abs_set_res(input_dev, ABS_MT_POSITION_X, wd->resolution);
   2671	input_set_abs_params(input_dev, ABS_MT_POSITION_Y, 0, wd->y_size, 0, 0);
   2672	input_abs_set_res(input_dev, ABS_MT_POSITION_Y, wd->resolution);
   2673
   2674	/* Max pressure is not given by the devices, pick one */
   2675	input_set_abs_params(input_dev, ABS_MT_PRESSURE, 0, 50, 0, 0);
   2676
   2677	input_set_capability(input_dev, EV_KEY, BTN_LEFT);
   2678
   2679	if (hidpp->quirks & HIDPP_QUIRK_WTP_PHYSICAL_BUTTONS)
   2680		input_set_capability(input_dev, EV_KEY, BTN_RIGHT);
   2681	else
   2682		__set_bit(INPUT_PROP_BUTTONPAD, input_dev->propbit);
   2683
   2684	input_mt_init_slots(input_dev, wd->maxcontacts, INPUT_MT_POINTER |
   2685		INPUT_MT_DROP_UNUSED);
   2686}
   2687
   2688static void wtp_touch_event(struct hidpp_device *hidpp,
   2689	struct hidpp_touchpad_raw_xy_finger *touch_report)
   2690{
   2691	struct wtp_data *wd = hidpp->private_data;
   2692	int slot;
   2693
   2694	if (!touch_report->finger_id || touch_report->contact_type)
   2695		/* no actual data */
   2696		return;
   2697
   2698	slot = input_mt_get_slot_by_key(hidpp->input, touch_report->finger_id);
   2699
   2700	input_mt_slot(hidpp->input, slot);
   2701	input_mt_report_slot_state(hidpp->input, MT_TOOL_FINGER,
   2702					touch_report->contact_status);
   2703	if (touch_report->contact_status) {
   2704		input_event(hidpp->input, EV_ABS, ABS_MT_POSITION_X,
   2705				touch_report->x);
   2706		input_event(hidpp->input, EV_ABS, ABS_MT_POSITION_Y,
   2707				wd->flip_y ? wd->y_size - touch_report->y :
   2708					     touch_report->y);
   2709		input_event(hidpp->input, EV_ABS, ABS_MT_PRESSURE,
   2710				touch_report->area);
   2711	}
   2712}
   2713
   2714static void wtp_send_raw_xy_event(struct hidpp_device *hidpp,
   2715		struct hidpp_touchpad_raw_xy *raw)
   2716{
   2717	int i;
   2718
   2719	for (i = 0; i < 2; i++)
   2720		wtp_touch_event(hidpp, &(raw->fingers[i]));
   2721
   2722	if (raw->end_of_frame &&
   2723	    !(hidpp->quirks & HIDPP_QUIRK_WTP_PHYSICAL_BUTTONS))
   2724		input_event(hidpp->input, EV_KEY, BTN_LEFT, raw->button);
   2725
   2726	if (raw->end_of_frame || raw->finger_count <= 2) {
   2727		input_mt_sync_frame(hidpp->input);
   2728		input_sync(hidpp->input);
   2729	}
   2730}
   2731
   2732static int wtp_mouse_raw_xy_event(struct hidpp_device *hidpp, u8 *data)
   2733{
   2734	struct wtp_data *wd = hidpp->private_data;
   2735	u8 c1_area = ((data[7] & 0xf) * (data[7] & 0xf) +
   2736		      (data[7] >> 4) * (data[7] >> 4)) / 2;
   2737	u8 c2_area = ((data[13] & 0xf) * (data[13] & 0xf) +
   2738		      (data[13] >> 4) * (data[13] >> 4)) / 2;
   2739	struct hidpp_touchpad_raw_xy raw = {
   2740		.timestamp = data[1],
   2741		.fingers = {
   2742			{
   2743				.contact_type = 0,
   2744				.contact_status = !!data[7],
   2745				.x = get_unaligned_le16(&data[3]),
   2746				.y = get_unaligned_le16(&data[5]),
   2747				.z = c1_area,
   2748				.area = c1_area,
   2749				.finger_id = data[2],
   2750			}, {
   2751				.contact_type = 0,
   2752				.contact_status = !!data[13],
   2753				.x = get_unaligned_le16(&data[9]),
   2754				.y = get_unaligned_le16(&data[11]),
   2755				.z = c2_area,
   2756				.area = c2_area,
   2757				.finger_id = data[8],
   2758			}
   2759		},
   2760		.finger_count = wd->maxcontacts,
   2761		.spurious_flag = 0,
   2762		.end_of_frame = (data[0] >> 7) == 0,
   2763		.button = data[0] & 0x01,
   2764	};
   2765
   2766	wtp_send_raw_xy_event(hidpp, &raw);
   2767
   2768	return 1;
   2769}
   2770
   2771static int wtp_raw_event(struct hid_device *hdev, u8 *data, int size)
   2772{
   2773	struct hidpp_device *hidpp = hid_get_drvdata(hdev);
   2774	struct wtp_data *wd = hidpp->private_data;
   2775	struct hidpp_report *report = (struct hidpp_report *)data;
   2776	struct hidpp_touchpad_raw_xy raw;
   2777
   2778	if (!wd || !hidpp->input)
   2779		return 1;
   2780
   2781	switch (data[0]) {
   2782	case 0x02:
   2783		if (size < 2) {
   2784			hid_err(hdev, "Received HID report of bad size (%d)",
   2785				size);
   2786			return 1;
   2787		}
   2788		if (hidpp->quirks & HIDPP_QUIRK_WTP_PHYSICAL_BUTTONS) {
   2789			input_event(hidpp->input, EV_KEY, BTN_LEFT,
   2790					!!(data[1] & 0x01));
   2791			input_event(hidpp->input, EV_KEY, BTN_RIGHT,
   2792					!!(data[1] & 0x02));
   2793			input_sync(hidpp->input);
   2794			return 0;
   2795		} else {
   2796			if (size < 21)
   2797				return 1;
   2798			return wtp_mouse_raw_xy_event(hidpp, &data[7]);
   2799		}
   2800	case REPORT_ID_HIDPP_LONG:
   2801		/* size is already checked in hidpp_raw_event. */
   2802		if ((report->fap.feature_index != wd->mt_feature_index) ||
   2803		    (report->fap.funcindex_clientid != EVENT_TOUCHPAD_RAW_XY))
   2804			return 1;
   2805		hidpp_touchpad_raw_xy_event(hidpp, data + 4, &raw);
   2806
   2807		wtp_send_raw_xy_event(hidpp, &raw);
   2808		return 0;
   2809	}
   2810
   2811	return 0;
   2812}
   2813
   2814static int wtp_get_config(struct hidpp_device *hidpp)
   2815{
   2816	struct wtp_data *wd = hidpp->private_data;
   2817	struct hidpp_touchpad_raw_info raw_info = {0};
   2818	u8 feature_type;
   2819	int ret;
   2820
   2821	ret = hidpp_root_get_feature(hidpp, HIDPP_PAGE_TOUCHPAD_RAW_XY,
   2822		&wd->mt_feature_index, &feature_type);
   2823	if (ret)
   2824		/* means that the device is not powered up */
   2825		return ret;
   2826
   2827	ret = hidpp_touchpad_get_raw_info(hidpp, wd->mt_feature_index,
   2828		&raw_info);
   2829	if (ret)
   2830		return ret;
   2831
   2832	wd->x_size = raw_info.x_size;
   2833	wd->y_size = raw_info.y_size;
   2834	wd->maxcontacts = raw_info.maxcontacts;
   2835	wd->flip_y = raw_info.origin == TOUCHPAD_RAW_XY_ORIGIN_LOWER_LEFT;
   2836	wd->resolution = raw_info.res;
   2837	if (!wd->resolution)
   2838		wd->resolution = WTP_MANUAL_RESOLUTION;
   2839
   2840	return 0;
   2841}
   2842
   2843static int wtp_allocate(struct hid_device *hdev, const struct hid_device_id *id)
   2844{
   2845	struct hidpp_device *hidpp = hid_get_drvdata(hdev);
   2846	struct wtp_data *wd;
   2847
   2848	wd = devm_kzalloc(&hdev->dev, sizeof(struct wtp_data),
   2849			GFP_KERNEL);
   2850	if (!wd)
   2851		return -ENOMEM;
   2852
   2853	hidpp->private_data = wd;
   2854
   2855	return 0;
   2856};
   2857
   2858static int wtp_connect(struct hid_device *hdev, bool connected)
   2859{
   2860	struct hidpp_device *hidpp = hid_get_drvdata(hdev);
   2861	struct wtp_data *wd = hidpp->private_data;
   2862	int ret;
   2863
   2864	if (!wd->x_size) {
   2865		ret = wtp_get_config(hidpp);
   2866		if (ret) {
   2867			hid_err(hdev, "Can not get wtp config: %d\n", ret);
   2868			return ret;
   2869		}
   2870	}
   2871
   2872	return hidpp_touchpad_set_raw_report_state(hidpp, wd->mt_feature_index,
   2873			true, true);
   2874}
   2875
   2876/* ------------------------------------------------------------------------- */
   2877/* Logitech M560 devices                                                     */
   2878/* ------------------------------------------------------------------------- */
   2879
   2880/*
   2881 * Logitech M560 protocol overview
   2882 *
   2883 * The Logitech M560 mouse, is designed for windows 8. When the middle and/or
   2884 * the sides buttons are pressed, it sends some keyboard keys events
   2885 * instead of buttons ones.
   2886 * To complicate things further, the middle button keys sequence
   2887 * is different from the odd press and the even press.
   2888 *
   2889 * forward button -> Super_R
   2890 * backward button -> Super_L+'d' (press only)
   2891 * middle button -> 1st time: Alt_L+SuperL+XF86TouchpadOff (press only)
   2892 *                  2nd time: left-click (press only)
   2893 * NB: press-only means that when the button is pressed, the
   2894 * KeyPress/ButtonPress and KeyRelease/ButtonRelease events are generated
   2895 * together sequentially; instead when the button is released, no event is
   2896 * generated !
   2897 *
   2898 * With the command
   2899 *	10<xx>0a 3500af03 (where <xx> is the mouse id),
   2900 * the mouse reacts differently:
   2901 * - it never sends a keyboard key event
   2902 * - for the three mouse button it sends:
   2903 *	middle button               press   11<xx>0a 3500af00...
   2904 *	side 1 button (forward)     press   11<xx>0a 3500b000...
   2905 *	side 2 button (backward)    press   11<xx>0a 3500ae00...
   2906 *	middle/side1/side2 button   release 11<xx>0a 35000000...
   2907 */
   2908
   2909static const u8 m560_config_parameter[] = {0x00, 0xaf, 0x03};
   2910
   2911/* how buttons are mapped in the report */
   2912#define M560_MOUSE_BTN_LEFT		0x01
   2913#define M560_MOUSE_BTN_RIGHT		0x02
   2914#define M560_MOUSE_BTN_WHEEL_LEFT	0x08
   2915#define M560_MOUSE_BTN_WHEEL_RIGHT	0x10
   2916
   2917#define M560_SUB_ID			0x0a
   2918#define M560_BUTTON_MODE_REGISTER	0x35
   2919
   2920static int m560_send_config_command(struct hid_device *hdev, bool connected)
   2921{
   2922	struct hidpp_report response;
   2923	struct hidpp_device *hidpp_dev;
   2924
   2925	hidpp_dev = hid_get_drvdata(hdev);
   2926
   2927	return hidpp_send_rap_command_sync(
   2928		hidpp_dev,
   2929		REPORT_ID_HIDPP_SHORT,
   2930		M560_SUB_ID,
   2931		M560_BUTTON_MODE_REGISTER,
   2932		(u8 *)m560_config_parameter,
   2933		sizeof(m560_config_parameter),
   2934		&response
   2935	);
   2936}
   2937
   2938static int m560_raw_event(struct hid_device *hdev, u8 *data, int size)
   2939{
   2940	struct hidpp_device *hidpp = hid_get_drvdata(hdev);
   2941
   2942	/* sanity check */
   2943	if (!hidpp->input) {
   2944		hid_err(hdev, "error in parameter\n");
   2945		return -EINVAL;
   2946	}
   2947
   2948	if (size < 7) {
   2949		hid_err(hdev, "error in report\n");
   2950		return 0;
   2951	}
   2952
   2953	if (data[0] == REPORT_ID_HIDPP_LONG &&
   2954	    data[2] == M560_SUB_ID && data[6] == 0x00) {
   2955		/*
   2956		 * m560 mouse report for middle, forward and backward button
   2957		 *
   2958		 * data[0] = 0x11
   2959		 * data[1] = device-id
   2960		 * data[2] = 0x0a
   2961		 * data[5] = 0xaf -> middle
   2962		 *	     0xb0 -> forward
   2963		 *	     0xae -> backward
   2964		 *	     0x00 -> release all
   2965		 * data[6] = 0x00
   2966		 */
   2967
   2968		switch (data[5]) {
   2969		case 0xaf:
   2970			input_report_key(hidpp->input, BTN_MIDDLE, 1);
   2971			break;
   2972		case 0xb0:
   2973			input_report_key(hidpp->input, BTN_FORWARD, 1);
   2974			break;
   2975		case 0xae:
   2976			input_report_key(hidpp->input, BTN_BACK, 1);
   2977			break;
   2978		case 0x00:
   2979			input_report_key(hidpp->input, BTN_BACK, 0);
   2980			input_report_key(hidpp->input, BTN_FORWARD, 0);
   2981			input_report_key(hidpp->input, BTN_MIDDLE, 0);
   2982			break;
   2983		default:
   2984			hid_err(hdev, "error in report\n");
   2985			return 0;
   2986		}
   2987		input_sync(hidpp->input);
   2988
   2989	} else if (data[0] == 0x02) {
   2990		/*
   2991		 * Logitech M560 mouse report
   2992		 *
   2993		 * data[0] = type (0x02)
   2994		 * data[1..2] = buttons
   2995		 * data[3..5] = xy
   2996		 * data[6] = wheel
   2997		 */
   2998
   2999		int v;
   3000
   3001		input_report_key(hidpp->input, BTN_LEFT,
   3002			!!(data[1] & M560_MOUSE_BTN_LEFT));
   3003		input_report_key(hidpp->input, BTN_RIGHT,
   3004			!!(data[1] & M560_MOUSE_BTN_RIGHT));
   3005
   3006		if (data[1] & M560_MOUSE_BTN_WHEEL_LEFT) {
   3007			input_report_rel(hidpp->input, REL_HWHEEL, -1);
   3008			input_report_rel(hidpp->input, REL_HWHEEL_HI_RES,
   3009					 -120);
   3010		} else if (data[1] & M560_MOUSE_BTN_WHEEL_RIGHT) {
   3011			input_report_rel(hidpp->input, REL_HWHEEL, 1);
   3012			input_report_rel(hidpp->input, REL_HWHEEL_HI_RES,
   3013					 120);
   3014		}
   3015
   3016		v = hid_snto32(hid_field_extract(hdev, data+3, 0, 12), 12);
   3017		input_report_rel(hidpp->input, REL_X, v);
   3018
   3019		v = hid_snto32(hid_field_extract(hdev, data+3, 12, 12), 12);
   3020		input_report_rel(hidpp->input, REL_Y, v);
   3021
   3022		v = hid_snto32(data[6], 8);
   3023		if (v != 0)
   3024			hidpp_scroll_counter_handle_scroll(hidpp->input,
   3025					&hidpp->vertical_wheel_counter, v);
   3026
   3027		input_sync(hidpp->input);
   3028	}
   3029
   3030	return 1;
   3031}
   3032
   3033static void m560_populate_input(struct hidpp_device *hidpp,
   3034				struct input_dev *input_dev)
   3035{
   3036	__set_bit(EV_KEY, input_dev->evbit);
   3037	__set_bit(BTN_MIDDLE, input_dev->keybit);
   3038	__set_bit(BTN_RIGHT, input_dev->keybit);
   3039	__set_bit(BTN_LEFT, input_dev->keybit);
   3040	__set_bit(BTN_BACK, input_dev->keybit);
   3041	__set_bit(BTN_FORWARD, input_dev->keybit);
   3042
   3043	__set_bit(EV_REL, input_dev->evbit);
   3044	__set_bit(REL_X, input_dev->relbit);
   3045	__set_bit(REL_Y, input_dev->relbit);
   3046	__set_bit(REL_WHEEL, input_dev->relbit);
   3047	__set_bit(REL_HWHEEL, input_dev->relbit);
   3048	__set_bit(REL_WHEEL_HI_RES, input_dev->relbit);
   3049	__set_bit(REL_HWHEEL_HI_RES, input_dev->relbit);
   3050}
   3051
   3052static int m560_input_mapping(struct hid_device *hdev, struct hid_input *hi,
   3053		struct hid_field *field, struct hid_usage *usage,
   3054		unsigned long **bit, int *max)
   3055{
   3056	return -1;
   3057}
   3058
   3059/* ------------------------------------------------------------------------- */
   3060/* Logitech K400 devices                                                     */
   3061/* ------------------------------------------------------------------------- */
   3062
   3063/*
   3064 * The Logitech K400 keyboard has an embedded touchpad which is seen
   3065 * as a mouse from the OS point of view. There is a hardware shortcut to disable
   3066 * tap-to-click but the setting is not remembered accross reset, annoying some
   3067 * users.
   3068 *
   3069 * We can toggle this feature from the host by using the feature 0x6010:
   3070 * Touchpad FW items
   3071 */
   3072
   3073struct k400_private_data {
   3074	u8 feature_index;
   3075};
   3076
   3077static int k400_disable_tap_to_click(struct hidpp_device *hidpp)
   3078{
   3079	struct k400_private_data *k400 = hidpp->private_data;
   3080	struct hidpp_touchpad_fw_items items = {};
   3081	int ret;
   3082	u8 feature_type;
   3083
   3084	if (!k400->feature_index) {
   3085		ret = hidpp_root_get_feature(hidpp,
   3086			HIDPP_PAGE_TOUCHPAD_FW_ITEMS,
   3087			&k400->feature_index, &feature_type);
   3088		if (ret)
   3089			/* means that the device is not powered up */
   3090			return ret;
   3091	}
   3092
   3093	ret = hidpp_touchpad_fw_items_set(hidpp, k400->feature_index, &items);
   3094	if (ret)
   3095		return ret;
   3096
   3097	return 0;
   3098}
   3099
   3100static int k400_allocate(struct hid_device *hdev)
   3101{
   3102	struct hidpp_device *hidpp = hid_get_drvdata(hdev);
   3103	struct k400_private_data *k400;
   3104
   3105	k400 = devm_kzalloc(&hdev->dev, sizeof(struct k400_private_data),
   3106			    GFP_KERNEL);
   3107	if (!k400)
   3108		return -ENOMEM;
   3109
   3110	hidpp->private_data = k400;
   3111
   3112	return 0;
   3113};
   3114
   3115static int k400_connect(struct hid_device *hdev, bool connected)
   3116{
   3117	struct hidpp_device *hidpp = hid_get_drvdata(hdev);
   3118
   3119	if (!disable_tap_to_click)
   3120		return 0;
   3121
   3122	return k400_disable_tap_to_click(hidpp);
   3123}
   3124
   3125/* ------------------------------------------------------------------------- */
   3126/* Logitech G920 Driving Force Racing Wheel for Xbox One                     */
   3127/* ------------------------------------------------------------------------- */
   3128
   3129#define HIDPP_PAGE_G920_FORCE_FEEDBACK			0x8123
   3130
   3131static int g920_ff_set_autocenter(struct hidpp_device *hidpp,
   3132				  struct hidpp_ff_private_data *data)
   3133{
   3134	struct hidpp_report response;
   3135	u8 params[HIDPP_AUTOCENTER_PARAMS_LENGTH] = {
   3136		[1] = HIDPP_FF_EFFECT_SPRING | HIDPP_FF_EFFECT_AUTOSTART,
   3137	};
   3138	int ret;
   3139
   3140	/* initialize with zero autocenter to get wheel in usable state */
   3141
   3142	dbg_hid("Setting autocenter to 0.\n");
   3143	ret = hidpp_send_fap_command_sync(hidpp, data->feature_index,
   3144					  HIDPP_FF_DOWNLOAD_EFFECT,
   3145					  params, ARRAY_SIZE(params),
   3146					  &response);
   3147	if (ret)
   3148		hid_warn(hidpp->hid_dev, "Failed to autocenter device!\n");
   3149	else
   3150		data->slot_autocenter = response.fap.params[0];
   3151
   3152	return ret;
   3153}
   3154
   3155static int g920_get_config(struct hidpp_device *hidpp,
   3156			   struct hidpp_ff_private_data *data)
   3157{
   3158	struct hidpp_report response;
   3159	u8 feature_type;
   3160	int ret;
   3161
   3162	memset(data, 0, sizeof(*data));
   3163
   3164	/* Find feature and store for later use */
   3165	ret = hidpp_root_get_feature(hidpp, HIDPP_PAGE_G920_FORCE_FEEDBACK,
   3166				     &data->feature_index, &feature_type);
   3167	if (ret)
   3168		return ret;
   3169
   3170	/* Read number of slots available in device */
   3171	ret = hidpp_send_fap_command_sync(hidpp, data->feature_index,
   3172					  HIDPP_FF_GET_INFO,
   3173					  NULL, 0,
   3174					  &response);
   3175	if (ret) {
   3176		if (ret < 0)
   3177			return ret;
   3178		hid_err(hidpp->hid_dev,
   3179			"%s: received protocol error 0x%02x\n", __func__, ret);
   3180		return -EPROTO;
   3181	}
   3182
   3183	data->num_effects = response.fap.params[0] - HIDPP_FF_RESERVED_SLOTS;
   3184
   3185	/* reset all forces */
   3186	ret = hidpp_send_fap_command_sync(hidpp, data->feature_index,
   3187					  HIDPP_FF_RESET_ALL,
   3188					  NULL, 0,
   3189					  &response);
   3190	if (ret)
   3191		hid_warn(hidpp->hid_dev, "Failed to reset all forces!\n");
   3192
   3193	ret = hidpp_send_fap_command_sync(hidpp, data->feature_index,
   3194					  HIDPP_FF_GET_APERTURE,
   3195					  NULL, 0,
   3196					  &response);
   3197	if (ret) {
   3198		hid_warn(hidpp->hid_dev,
   3199			 "Failed to read range from device!\n");
   3200	}
   3201	data->range = ret ?
   3202		900 : get_unaligned_be16(&response.fap.params[0]);
   3203
   3204	/* Read the current gain values */
   3205	ret = hidpp_send_fap_command_sync(hidpp, data->feature_index,
   3206					  HIDPP_FF_GET_GLOBAL_GAINS,
   3207					  NULL, 0,
   3208					  &response);
   3209	if (ret)
   3210		hid_warn(hidpp->hid_dev,
   3211			 "Failed to read gain values from device!\n");
   3212	data->gain = ret ?
   3213		0xffff : get_unaligned_be16(&response.fap.params[0]);
   3214
   3215	/* ignore boost value at response.fap.params[2] */
   3216
   3217	return g920_ff_set_autocenter(hidpp, data);
   3218}
   3219
   3220/* -------------------------------------------------------------------------- */
   3221/* Logitech Dinovo Mini keyboard with builtin touchpad                        */
   3222/* -------------------------------------------------------------------------- */
   3223#define DINOVO_MINI_PRODUCT_ID		0xb30c
   3224
   3225static int lg_dinovo_input_mapping(struct hid_device *hdev, struct hid_input *hi,
   3226		struct hid_field *field, struct hid_usage *usage,
   3227		unsigned long **bit, int *max)
   3228{
   3229	if ((usage->hid & HID_USAGE_PAGE) != HID_UP_LOGIVENDOR)
   3230		return 0;
   3231
   3232	switch (usage->hid & HID_USAGE) {
   3233	case 0x00d: lg_map_key_clear(KEY_MEDIA);	break;
   3234	default:
   3235		return 0;
   3236	}
   3237	return 1;
   3238}
   3239
   3240/* -------------------------------------------------------------------------- */
   3241/* HID++1.0 devices which use HID++ reports for their wheels                  */
   3242/* -------------------------------------------------------------------------- */
   3243static int hidpp10_wheel_connect(struct hidpp_device *hidpp)
   3244{
   3245	return hidpp10_set_register(hidpp, HIDPP_REG_ENABLE_REPORTS, 0,
   3246			HIDPP_ENABLE_WHEEL_REPORT | HIDPP_ENABLE_HWHEEL_REPORT,
   3247			HIDPP_ENABLE_WHEEL_REPORT | HIDPP_ENABLE_HWHEEL_REPORT);
   3248}
   3249
   3250static int hidpp10_wheel_raw_event(struct hidpp_device *hidpp,
   3251				   u8 *data, int size)
   3252{
   3253	s8 value, hvalue;
   3254
   3255	if (!hidpp->input)
   3256		return -EINVAL;
   3257
   3258	if (size < 7)
   3259		return 0;
   3260
   3261	if (data[0] != REPORT_ID_HIDPP_SHORT || data[2] != HIDPP_SUB_ID_ROLLER)
   3262		return 0;
   3263
   3264	value = data[3];
   3265	hvalue = data[4];
   3266
   3267	input_report_rel(hidpp->input, REL_WHEEL, value);
   3268	input_report_rel(hidpp->input, REL_WHEEL_HI_RES, value * 120);
   3269	input_report_rel(hidpp->input, REL_HWHEEL, hvalue);
   3270	input_report_rel(hidpp->input, REL_HWHEEL_HI_RES, hvalue * 120);
   3271	input_sync(hidpp->input);
   3272
   3273	return 1;
   3274}
   3275
   3276static void hidpp10_wheel_populate_input(struct hidpp_device *hidpp,
   3277					 struct input_dev *input_dev)
   3278{
   3279	__set_bit(EV_REL, input_dev->evbit);
   3280	__set_bit(REL_WHEEL, input_dev->relbit);
   3281	__set_bit(REL_WHEEL_HI_RES, input_dev->relbit);
   3282	__set_bit(REL_HWHEEL, input_dev->relbit);
   3283	__set_bit(REL_HWHEEL_HI_RES, input_dev->relbit);
   3284}
   3285
   3286/* -------------------------------------------------------------------------- */
   3287/* HID++1.0 mice which use HID++ reports for extra mouse buttons              */
   3288/* -------------------------------------------------------------------------- */
   3289static int hidpp10_extra_mouse_buttons_connect(struct hidpp_device *hidpp)
   3290{
   3291	return hidpp10_set_register(hidpp, HIDPP_REG_ENABLE_REPORTS, 0,
   3292				    HIDPP_ENABLE_MOUSE_EXTRA_BTN_REPORT,
   3293				    HIDPP_ENABLE_MOUSE_EXTRA_BTN_REPORT);
   3294}
   3295
   3296static int hidpp10_extra_mouse_buttons_raw_event(struct hidpp_device *hidpp,
   3297				    u8 *data, int size)
   3298{
   3299	int i;
   3300
   3301	if (!hidpp->input)
   3302		return -EINVAL;
   3303
   3304	if (size < 7)
   3305		return 0;
   3306
   3307	if (data[0] != REPORT_ID_HIDPP_SHORT ||
   3308	    data[2] != HIDPP_SUB_ID_MOUSE_EXTRA_BTNS)
   3309		return 0;
   3310
   3311	/*
   3312	 * Buttons are either delivered through the regular mouse report *or*
   3313	 * through the extra buttons report. At least for button 6 how it is
   3314	 * delivered differs per receiver firmware version. Even receivers with
   3315	 * the same usb-id show different behavior, so we handle both cases.
   3316	 */
   3317	for (i = 0; i < 8; i++)
   3318		input_report_key(hidpp->input, BTN_MOUSE + i,
   3319				 (data[3] & (1 << i)));
   3320
   3321	/* Some mice report events on button 9+, use BTN_MISC */
   3322	for (i = 0; i < 8; i++)
   3323		input_report_key(hidpp->input, BTN_MISC + i,
   3324				 (data[4] & (1 << i)));
   3325
   3326	input_sync(hidpp->input);
   3327	return 1;
   3328}
   3329
   3330static void hidpp10_extra_mouse_buttons_populate_input(
   3331			struct hidpp_device *hidpp, struct input_dev *input_dev)
   3332{
   3333	/* BTN_MOUSE - BTN_MOUSE+7 are set already by the descriptor */
   3334	__set_bit(BTN_0, input_dev->keybit);
   3335	__set_bit(BTN_1, input_dev->keybit);
   3336	__set_bit(BTN_2, input_dev->keybit);
   3337	__set_bit(BTN_3, input_dev->keybit);
   3338	__set_bit(BTN_4, input_dev->keybit);
   3339	__set_bit(BTN_5, input_dev->keybit);
   3340	__set_bit(BTN_6, input_dev->keybit);
   3341	__set_bit(BTN_7, input_dev->keybit);
   3342}
   3343
   3344/* -------------------------------------------------------------------------- */
   3345/* HID++1.0 kbds which only report 0x10xx consumer usages through sub-id 0x03 */
   3346/* -------------------------------------------------------------------------- */
   3347
   3348/* Find the consumer-page input report desc and change Maximums to 0x107f */
   3349static u8 *hidpp10_consumer_keys_report_fixup(struct hidpp_device *hidpp,
   3350					      u8 *_rdesc, unsigned int *rsize)
   3351{
   3352	/* Note 0 terminated so we can use strnstr to search for this. */
   3353	static const char consumer_rdesc_start[] = {
   3354		0x05, 0x0C,	/* USAGE_PAGE (Consumer Devices)       */
   3355		0x09, 0x01,	/* USAGE (Consumer Control)            */
   3356		0xA1, 0x01,	/* COLLECTION (Application)            */
   3357		0x85, 0x03,	/* REPORT_ID = 3                       */
   3358		0x75, 0x10,	/* REPORT_SIZE (16)                    */
   3359		0x95, 0x02,	/* REPORT_COUNT (2)                    */
   3360		0x15, 0x01,	/* LOGICAL_MIN (1)                     */
   3361		0x26, 0x00	/* LOGICAL_MAX (...                    */
   3362	};
   3363	char *consumer_rdesc, *rdesc = (char *)_rdesc;
   3364	unsigned int size;
   3365
   3366	consumer_rdesc = strnstr(rdesc, consumer_rdesc_start, *rsize);
   3367	size = *rsize - (consumer_rdesc - rdesc);
   3368	if (consumer_rdesc && size >= 25) {
   3369		consumer_rdesc[15] = 0x7f;
   3370		consumer_rdesc[16] = 0x10;
   3371		consumer_rdesc[20] = 0x7f;
   3372		consumer_rdesc[21] = 0x10;
   3373	}
   3374	return _rdesc;
   3375}
   3376
   3377static int hidpp10_consumer_keys_connect(struct hidpp_device *hidpp)
   3378{
   3379	return hidpp10_set_register(hidpp, HIDPP_REG_ENABLE_REPORTS, 0,
   3380				    HIDPP_ENABLE_CONSUMER_REPORT,
   3381				    HIDPP_ENABLE_CONSUMER_REPORT);
   3382}
   3383
   3384static int hidpp10_consumer_keys_raw_event(struct hidpp_device *hidpp,
   3385					   u8 *data, int size)
   3386{
   3387	u8 consumer_report[5];
   3388
   3389	if (size < 7)
   3390		return 0;
   3391
   3392	if (data[0] != REPORT_ID_HIDPP_SHORT ||
   3393	    data[2] != HIDPP_SUB_ID_CONSUMER_VENDOR_KEYS)
   3394		return 0;
   3395
   3396	/*
   3397	 * Build a normal consumer report (3) out of the data, this detour
   3398	 * is necessary to get some keyboards to report their 0x10xx usages.
   3399	 */
   3400	consumer_report[0] = 0x03;
   3401	memcpy(&consumer_report[1], &data[3], 4);
   3402	/* We are called from atomic context */
   3403	hid_report_raw_event(hidpp->hid_dev, HID_INPUT_REPORT,
   3404			     consumer_report, 5, 1);
   3405
   3406	return 1;
   3407}
   3408
   3409/* -------------------------------------------------------------------------- */
   3410/* High-resolution scroll wheels                                              */
   3411/* -------------------------------------------------------------------------- */
   3412
   3413static int hi_res_scroll_enable(struct hidpp_device *hidpp)
   3414{
   3415	int ret;
   3416	u8 multiplier = 1;
   3417
   3418	if (hidpp->quirks & HIDPP_QUIRK_HI_RES_SCROLL_X2121) {
   3419		ret = hidpp_hrw_set_wheel_mode(hidpp, false, true, false);
   3420		if (ret == 0)
   3421			ret = hidpp_hrw_get_wheel_capability(hidpp, &multiplier);
   3422	} else if (hidpp->quirks & HIDPP_QUIRK_HI_RES_SCROLL_X2120) {
   3423		ret = hidpp_hrs_set_highres_scrolling_mode(hidpp, true,
   3424							   &multiplier);
   3425	} else /* if (hidpp->quirks & HIDPP_QUIRK_HI_RES_SCROLL_1P0) */ {
   3426		ret = hidpp10_enable_scrolling_acceleration(hidpp);
   3427		multiplier = 8;
   3428	}
   3429	if (ret)
   3430		return ret;
   3431
   3432	if (multiplier == 0)
   3433		multiplier = 1;
   3434
   3435	hidpp->vertical_wheel_counter.wheel_multiplier = multiplier;
   3436	hid_dbg(hidpp->hid_dev, "wheel multiplier = %d\n", multiplier);
   3437	return 0;
   3438}
   3439
   3440/* -------------------------------------------------------------------------- */
   3441/* Generic HID++ devices                                                      */
   3442/* -------------------------------------------------------------------------- */
   3443
   3444static u8 *hidpp_report_fixup(struct hid_device *hdev, u8 *rdesc,
   3445			      unsigned int *rsize)
   3446{
   3447	struct hidpp_device *hidpp = hid_get_drvdata(hdev);
   3448
   3449	if (!hidpp)
   3450		return rdesc;
   3451
   3452	/* For 27 MHz keyboards the quirk gets set after hid_parse. */
   3453	if (hdev->group == HID_GROUP_LOGITECH_27MHZ_DEVICE ||
   3454	    (hidpp->quirks & HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS))
   3455		rdesc = hidpp10_consumer_keys_report_fixup(hidpp, rdesc, rsize);
   3456
   3457	return rdesc;
   3458}
   3459
   3460static int hidpp_input_mapping(struct hid_device *hdev, struct hid_input *hi,
   3461		struct hid_field *field, struct hid_usage *usage,
   3462		unsigned long **bit, int *max)
   3463{
   3464	struct hidpp_device *hidpp = hid_get_drvdata(hdev);
   3465
   3466	if (!hidpp)
   3467		return 0;
   3468
   3469	if (hidpp->quirks & HIDPP_QUIRK_CLASS_WTP)
   3470		return wtp_input_mapping(hdev, hi, field, usage, bit, max);
   3471	else if (hidpp->quirks & HIDPP_QUIRK_CLASS_M560 &&
   3472			field->application != HID_GD_MOUSE)
   3473		return m560_input_mapping(hdev, hi, field, usage, bit, max);
   3474
   3475	if (hdev->product == DINOVO_MINI_PRODUCT_ID)
   3476		return lg_dinovo_input_mapping(hdev, hi, field, usage, bit, max);
   3477
   3478	return 0;
   3479}
   3480
   3481static int hidpp_input_mapped(struct hid_device *hdev, struct hid_input *hi,
   3482		struct hid_field *field, struct hid_usage *usage,
   3483		unsigned long **bit, int *max)
   3484{
   3485	struct hidpp_device *hidpp = hid_get_drvdata(hdev);
   3486
   3487	if (!hidpp)
   3488		return 0;
   3489
   3490	/* Ensure that Logitech G920 is not given a default fuzz/flat value */
   3491	if (hidpp->quirks & HIDPP_QUIRK_CLASS_G920) {
   3492		if (usage->type == EV_ABS && (usage->code == ABS_X ||
   3493				usage->code == ABS_Y || usage->code == ABS_Z ||
   3494				usage->code == ABS_RZ)) {
   3495			field->application = HID_GD_MULTIAXIS;
   3496		}
   3497	}
   3498
   3499	return 0;
   3500}
   3501
   3502
   3503static void hidpp_populate_input(struct hidpp_device *hidpp,
   3504				 struct input_dev *input)
   3505{
   3506	hidpp->input = input;
   3507
   3508	if (hidpp->quirks & HIDPP_QUIRK_CLASS_WTP)
   3509		wtp_populate_input(hidpp, input);
   3510	else if (hidpp->quirks & HIDPP_QUIRK_CLASS_M560)
   3511		m560_populate_input(hidpp, input);
   3512
   3513	if (hidpp->quirks & HIDPP_QUIRK_HIDPP_WHEELS)
   3514		hidpp10_wheel_populate_input(hidpp, input);
   3515
   3516	if (hidpp->quirks & HIDPP_QUIRK_HIDPP_EXTRA_MOUSE_BTNS)
   3517		hidpp10_extra_mouse_buttons_populate_input(hidpp, input);
   3518}
   3519
   3520static int hidpp_input_configured(struct hid_device *hdev,
   3521				struct hid_input *hidinput)
   3522{
   3523	struct hidpp_device *hidpp = hid_get_drvdata(hdev);
   3524	struct input_dev *input = hidinput->input;
   3525
   3526	if (!hidpp)
   3527		return 0;
   3528
   3529	hidpp_populate_input(hidpp, input);
   3530
   3531	return 0;
   3532}
   3533
   3534static int hidpp_raw_hidpp_event(struct hidpp_device *hidpp, u8 *data,
   3535		int size)
   3536{
   3537	struct hidpp_report *question = hidpp->send_receive_buf;
   3538	struct hidpp_report *answer = hidpp->send_receive_buf;
   3539	struct hidpp_report *report = (struct hidpp_report *)data;
   3540	int ret;
   3541
   3542	/*
   3543	 * If the mutex is locked then we have a pending answer from a
   3544	 * previously sent command.
   3545	 */
   3546	if (unlikely(mutex_is_locked(&hidpp->send_mutex))) {
   3547		/*
   3548		 * Check for a correct hidpp20 answer or the corresponding
   3549		 * error
   3550		 */
   3551		if (hidpp_match_answer(question, report) ||
   3552				hidpp_match_error(question, report)) {
   3553			*answer = *report;
   3554			hidpp->answer_available = true;
   3555			wake_up(&hidpp->wait);
   3556			/*
   3557			 * This was an answer to a command that this driver sent
   3558			 * We return 1 to hid-core to avoid forwarding the
   3559			 * command upstream as it has been treated by the driver
   3560			 */
   3561
   3562			return 1;
   3563		}
   3564	}
   3565
   3566	if (unlikely(hidpp_report_is_connect_event(hidpp, report))) {
   3567		atomic_set(&hidpp->connected,
   3568				!(report->rap.params[0] & (1 << 6)));
   3569		if (schedule_work(&hidpp->work) == 0)
   3570			dbg_hid("%s: connect event already queued\n", __func__);
   3571		return 1;
   3572	}
   3573
   3574	if (hidpp->hid_dev->group == HID_GROUP_LOGITECH_27MHZ_DEVICE &&
   3575	    data[0] == REPORT_ID_HIDPP_SHORT &&
   3576	    data[2] == HIDPP_SUB_ID_USER_IFACE_EVENT &&
   3577	    (data[3] & HIDPP_USER_IFACE_EVENT_ENCRYPTION_KEY_LOST)) {
   3578		dev_err_ratelimited(&hidpp->hid_dev->dev,
   3579			"Error the keyboard's wireless encryption key has been lost, your keyboard will not work unless you re-configure encryption.\n");
   3580		dev_err_ratelimited(&hidpp->hid_dev->dev,
   3581			"See: https://gitlab.freedesktop.org/jwrdegoede/logitech-27mhz-keyboard-encryption-setup/\n");
   3582	}
   3583
   3584	if (hidpp->capabilities & HIDPP_CAPABILITY_HIDPP20_BATTERY) {
   3585		ret = hidpp20_battery_event_1000(hidpp, data, size);
   3586		if (ret != 0)
   3587			return ret;
   3588		ret = hidpp20_battery_event_1004(hidpp, data, size);
   3589		if (ret != 0)
   3590			return ret;
   3591		ret = hidpp_solar_battery_event(hidpp, data, size);
   3592		if (ret != 0)
   3593			return ret;
   3594		ret = hidpp20_battery_voltage_event(hidpp, data, size);
   3595		if (ret != 0)
   3596			return ret;
   3597	}
   3598
   3599	if (hidpp->capabilities & HIDPP_CAPABILITY_HIDPP10_BATTERY) {
   3600		ret = hidpp10_battery_event(hidpp, data, size);
   3601		if (ret != 0)
   3602			return ret;
   3603	}
   3604
   3605	if (hidpp->quirks & HIDPP_QUIRK_HIDPP_WHEELS) {
   3606		ret = hidpp10_wheel_raw_event(hidpp, data, size);
   3607		if (ret != 0)
   3608			return ret;
   3609	}
   3610
   3611	if (hidpp->quirks & HIDPP_QUIRK_HIDPP_EXTRA_MOUSE_BTNS) {
   3612		ret = hidpp10_extra_mouse_buttons_raw_event(hidpp, data, size);
   3613		if (ret != 0)
   3614			return ret;
   3615	}
   3616
   3617	if (hidpp->quirks & HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS) {
   3618		ret = hidpp10_consumer_keys_raw_event(hidpp, data, size);
   3619		if (ret != 0)
   3620			return ret;
   3621	}
   3622
   3623	return 0;
   3624}
   3625
   3626static int hidpp_raw_event(struct hid_device *hdev, struct hid_report *report,
   3627		u8 *data, int size)
   3628{
   3629	struct hidpp_device *hidpp = hid_get_drvdata(hdev);
   3630	int ret = 0;
   3631
   3632	if (!hidpp)
   3633		return 0;
   3634
   3635	/* Generic HID++ processing. */
   3636	switch (data[0]) {
   3637	case REPORT_ID_HIDPP_VERY_LONG:
   3638		if (size != hidpp->very_long_report_length) {
   3639			hid_err(hdev, "received hid++ report of bad size (%d)",
   3640				size);
   3641			return 1;
   3642		}
   3643		ret = hidpp_raw_hidpp_event(hidpp, data, size);
   3644		break;
   3645	case REPORT_ID_HIDPP_LONG:
   3646		if (size != HIDPP_REPORT_LONG_LENGTH) {
   3647			hid_err(hdev, "received hid++ report of bad size (%d)",
   3648				size);
   3649			return 1;
   3650		}
   3651		ret = hidpp_raw_hidpp_event(hidpp, data, size);
   3652		break;
   3653	case REPORT_ID_HIDPP_SHORT:
   3654		if (size != HIDPP_REPORT_SHORT_LENGTH) {
   3655			hid_err(hdev, "received hid++ report of bad size (%d)",
   3656				size);
   3657			return 1;
   3658		}
   3659		ret = hidpp_raw_hidpp_event(hidpp, data, size);
   3660		break;
   3661	}
   3662
   3663	/* If no report is available for further processing, skip calling
   3664	 * raw_event of subclasses. */
   3665	if (ret != 0)
   3666		return ret;
   3667
   3668	if (hidpp->quirks & HIDPP_QUIRK_CLASS_WTP)
   3669		return wtp_raw_event(hdev, data, size);
   3670	else if (hidpp->quirks & HIDPP_QUIRK_CLASS_M560)
   3671		return m560_raw_event(hdev, data, size);
   3672
   3673	return 0;
   3674}
   3675
   3676static int hidpp_event(struct hid_device *hdev, struct hid_field *field,
   3677	struct hid_usage *usage, __s32 value)
   3678{
   3679	/* This function will only be called for scroll events, due to the
   3680	 * restriction imposed in hidpp_usages.
   3681	 */
   3682	struct hidpp_device *hidpp = hid_get_drvdata(hdev);
   3683	struct hidpp_scroll_counter *counter;
   3684
   3685	if (!hidpp)
   3686		return 0;
   3687
   3688	counter = &hidpp->vertical_wheel_counter;
   3689	/* A scroll event may occur before the multiplier has been retrieved or
   3690	 * the input device set, or high-res scroll enabling may fail. In such
   3691	 * cases we must return early (falling back to default behaviour) to
   3692	 * avoid a crash in hidpp_scroll_counter_handle_scroll.
   3693	 */
   3694	if (!(hidpp->quirks & HIDPP_QUIRK_HI_RES_SCROLL) || value == 0
   3695	    || hidpp->input == NULL || counter->wheel_multiplier == 0)
   3696		return 0;
   3697
   3698	hidpp_scroll_counter_handle_scroll(hidpp->input, counter, value);
   3699	return 1;
   3700}
   3701
   3702static int hidpp_initialize_battery(struct hidpp_device *hidpp)
   3703{
   3704	static atomic_t battery_no = ATOMIC_INIT(0);
   3705	struct power_supply_config cfg = { .drv_data = hidpp };
   3706	struct power_supply_desc *desc = &hidpp->battery.desc;
   3707	enum power_supply_property *battery_props;
   3708	struct hidpp_battery *battery;
   3709	unsigned int num_battery_props;
   3710	unsigned long n;
   3711	int ret;
   3712
   3713	if (hidpp->battery.ps)
   3714		return 0;
   3715
   3716	hidpp->battery.feature_index = 0xff;
   3717	hidpp->battery.solar_feature_index = 0xff;
   3718	hidpp->battery.voltage_feature_index = 0xff;
   3719
   3720	if (hidpp->protocol_major >= 2) {
   3721		if (hidpp->quirks & HIDPP_QUIRK_CLASS_K750)
   3722			ret = hidpp_solar_request_battery_event(hidpp);
   3723		else {
   3724			/* we only support one battery feature right now, so let's
   3725			   first check the ones that support battery level first
   3726			   and leave voltage for last */
   3727			ret = hidpp20_query_battery_info_1000(hidpp);
   3728			if (ret)
   3729				ret = hidpp20_query_battery_info_1004(hidpp);
   3730			if (ret)
   3731				ret = hidpp20_query_battery_voltage_info(hidpp);
   3732		}
   3733
   3734		if (ret)
   3735			return ret;
   3736		hidpp->capabilities |= HIDPP_CAPABILITY_HIDPP20_BATTERY;
   3737	} else {
   3738		ret = hidpp10_query_battery_status(hidpp);
   3739		if (ret) {
   3740			ret = hidpp10_query_battery_mileage(hidpp);
   3741			if (ret)
   3742				return -ENOENT;
   3743			hidpp->capabilities |= HIDPP_CAPABILITY_BATTERY_MILEAGE;
   3744		} else {
   3745			hidpp->capabilities |= HIDPP_CAPABILITY_BATTERY_LEVEL_STATUS;
   3746		}
   3747		hidpp->capabilities |= HIDPP_CAPABILITY_HIDPP10_BATTERY;
   3748	}
   3749
   3750	battery_props = devm_kmemdup(&hidpp->hid_dev->dev,
   3751				     hidpp_battery_props,
   3752				     sizeof(hidpp_battery_props),
   3753				     GFP_KERNEL);
   3754	if (!battery_props)
   3755		return -ENOMEM;
   3756
   3757	num_battery_props = ARRAY_SIZE(hidpp_battery_props) - 3;
   3758
   3759	if (hidpp->capabilities & HIDPP_CAPABILITY_BATTERY_MILEAGE ||
   3760	    hidpp->capabilities & HIDPP_CAPABILITY_BATTERY_PERCENTAGE ||
   3761	    hidpp->capabilities & HIDPP_CAPABILITY_BATTERY_VOLTAGE)
   3762		battery_props[num_battery_props++] =
   3763				POWER_SUPPLY_PROP_CAPACITY;
   3764
   3765	if (hidpp->capabilities & HIDPP_CAPABILITY_BATTERY_LEVEL_STATUS)
   3766		battery_props[num_battery_props++] =
   3767				POWER_SUPPLY_PROP_CAPACITY_LEVEL;
   3768
   3769	if (hidpp->capabilities & HIDPP_CAPABILITY_BATTERY_VOLTAGE)
   3770		battery_props[num_battery_props++] =
   3771			POWER_SUPPLY_PROP_VOLTAGE_NOW;
   3772
   3773	battery = &hidpp->battery;
   3774
   3775	n = atomic_inc_return(&battery_no) - 1;
   3776	desc->properties = battery_props;
   3777	desc->num_properties = num_battery_props;
   3778	desc->get_property = hidpp_battery_get_property;
   3779	sprintf(battery->name, "hidpp_battery_%ld", n);
   3780	desc->name = battery->name;
   3781	desc->type = POWER_SUPPLY_TYPE_BATTERY;
   3782	desc->use_for_apm = 0;
   3783
   3784	battery->ps = devm_power_supply_register(&hidpp->hid_dev->dev,
   3785						 &battery->desc,
   3786						 &cfg);
   3787	if (IS_ERR(battery->ps))
   3788		return PTR_ERR(battery->ps);
   3789
   3790	power_supply_powers(battery->ps, &hidpp->hid_dev->dev);
   3791
   3792	return ret;
   3793}
   3794
   3795static void hidpp_overwrite_name(struct hid_device *hdev)
   3796{
   3797	struct hidpp_device *hidpp = hid_get_drvdata(hdev);
   3798	char *name;
   3799
   3800	if (hidpp->protocol_major < 2)
   3801		return;
   3802
   3803	name = hidpp_get_device_name(hidpp);
   3804
   3805	if (!name) {
   3806		hid_err(hdev, "unable to retrieve the name of the device");
   3807	} else {
   3808		dbg_hid("HID++: Got name: %s\n", name);
   3809		snprintf(hdev->name, sizeof(hdev->name), "%s", name);
   3810	}
   3811
   3812	kfree(name);
   3813}
   3814
   3815static int hidpp_input_open(struct input_dev *dev)
   3816{
   3817	struct hid_device *hid = input_get_drvdata(dev);
   3818
   3819	return hid_hw_open(hid);
   3820}
   3821
   3822static void hidpp_input_close(struct input_dev *dev)
   3823{
   3824	struct hid_device *hid = input_get_drvdata(dev);
   3825
   3826	hid_hw_close(hid);
   3827}
   3828
   3829static struct input_dev *hidpp_allocate_input(struct hid_device *hdev)
   3830{
   3831	struct input_dev *input_dev = devm_input_allocate_device(&hdev->dev);
   3832	struct hidpp_device *hidpp = hid_get_drvdata(hdev);
   3833
   3834	if (!input_dev)
   3835		return NULL;
   3836
   3837	input_set_drvdata(input_dev, hdev);
   3838	input_dev->open = hidpp_input_open;
   3839	input_dev->close = hidpp_input_close;
   3840
   3841	input_dev->name = hidpp->name;
   3842	input_dev->phys = hdev->phys;
   3843	input_dev->uniq = hdev->uniq;
   3844	input_dev->id.bustype = hdev->bus;
   3845	input_dev->id.vendor  = hdev->vendor;
   3846	input_dev->id.product = hdev->product;
   3847	input_dev->id.version = hdev->version;
   3848	input_dev->dev.parent = &hdev->dev;
   3849
   3850	return input_dev;
   3851}
   3852
   3853static void hidpp_connect_event(struct hidpp_device *hidpp)
   3854{
   3855	struct hid_device *hdev = hidpp->hid_dev;
   3856	int ret = 0;
   3857	bool connected = atomic_read(&hidpp->connected);
   3858	struct input_dev *input;
   3859	char *name, *devm_name;
   3860
   3861	if (!connected) {
   3862		if (hidpp->battery.ps) {
   3863			hidpp->battery.online = false;
   3864			hidpp->battery.status = POWER_SUPPLY_STATUS_UNKNOWN;
   3865			hidpp->battery.level = POWER_SUPPLY_CAPACITY_LEVEL_UNKNOWN;
   3866			power_supply_changed(hidpp->battery.ps);
   3867		}
   3868		return;
   3869	}
   3870
   3871	if (hidpp->quirks & HIDPP_QUIRK_CLASS_WTP) {
   3872		ret = wtp_connect(hdev, connected);
   3873		if (ret)
   3874			return;
   3875	} else if (hidpp->quirks & HIDPP_QUIRK_CLASS_M560) {
   3876		ret = m560_send_config_command(hdev, connected);
   3877		if (ret)
   3878			return;
   3879	} else if (hidpp->quirks & HIDPP_QUIRK_CLASS_K400) {
   3880		ret = k400_connect(hdev, connected);
   3881		if (ret)
   3882			return;
   3883	}
   3884
   3885	if (hidpp->quirks & HIDPP_QUIRK_HIDPP_WHEELS) {
   3886		ret = hidpp10_wheel_connect(hidpp);
   3887		if (ret)
   3888			return;
   3889	}
   3890
   3891	if (hidpp->quirks & HIDPP_QUIRK_HIDPP_EXTRA_MOUSE_BTNS) {
   3892		ret = hidpp10_extra_mouse_buttons_connect(hidpp);
   3893		if (ret)
   3894			return;
   3895	}
   3896
   3897	if (hidpp->quirks & HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS) {
   3898		ret = hidpp10_consumer_keys_connect(hidpp);
   3899		if (ret)
   3900			return;
   3901	}
   3902
   3903	/* the device is already connected, we can ask for its name and
   3904	 * protocol */
   3905	if (!hidpp->protocol_major) {
   3906		ret = hidpp_root_get_protocol_version(hidpp);
   3907		if (ret) {
   3908			hid_err(hdev, "Can not get the protocol version.\n");
   3909			return;
   3910		}
   3911	}
   3912
   3913	if (hidpp->name == hdev->name && hidpp->protocol_major >= 2) {
   3914		name = hidpp_get_device_name(hidpp);
   3915		if (name) {
   3916			devm_name = devm_kasprintf(&hdev->dev, GFP_KERNEL,
   3917						   "%s", name);
   3918			kfree(name);
   3919			if (!devm_name)
   3920				return;
   3921
   3922			hidpp->name = devm_name;
   3923		}
   3924	}
   3925
   3926	hidpp_initialize_battery(hidpp);
   3927
   3928	/* forward current battery state */
   3929	if (hidpp->capabilities & HIDPP_CAPABILITY_HIDPP10_BATTERY) {
   3930		hidpp10_enable_battery_reporting(hidpp);
   3931		if (hidpp->capabilities & HIDPP_CAPABILITY_BATTERY_MILEAGE)
   3932			hidpp10_query_battery_mileage(hidpp);
   3933		else
   3934			hidpp10_query_battery_status(hidpp);
   3935	} else if (hidpp->capabilities & HIDPP_CAPABILITY_HIDPP20_BATTERY) {
   3936		if (hidpp->capabilities & HIDPP_CAPABILITY_BATTERY_VOLTAGE)
   3937			hidpp20_query_battery_voltage_info(hidpp);
   3938		else if (hidpp->capabilities & HIDPP_CAPABILITY_UNIFIED_BATTERY)
   3939			hidpp20_query_battery_info_1004(hidpp);
   3940		else
   3941			hidpp20_query_battery_info_1000(hidpp);
   3942	}
   3943	if (hidpp->battery.ps)
   3944		power_supply_changed(hidpp->battery.ps);
   3945
   3946	if (hidpp->quirks & HIDPP_QUIRK_HI_RES_SCROLL)
   3947		hi_res_scroll_enable(hidpp);
   3948
   3949	if (!(hidpp->quirks & HIDPP_QUIRK_NO_HIDINPUT) || hidpp->delayed_input)
   3950		/* if the input nodes are already created, we can stop now */
   3951		return;
   3952
   3953	input = hidpp_allocate_input(hdev);
   3954	if (!input) {
   3955		hid_err(hdev, "cannot allocate new input device: %d\n", ret);
   3956		return;
   3957	}
   3958
   3959	hidpp_populate_input(hidpp, input);
   3960
   3961	ret = input_register_device(input);
   3962	if (ret)
   3963		input_free_device(input);
   3964
   3965	hidpp->delayed_input = input;
   3966}
   3967
   3968static DEVICE_ATTR(builtin_power_supply, 0000, NULL, NULL);
   3969
   3970static struct attribute *sysfs_attrs[] = {
   3971	&dev_attr_builtin_power_supply.attr,
   3972	NULL
   3973};
   3974
   3975static const struct attribute_group ps_attribute_group = {
   3976	.attrs = sysfs_attrs
   3977};
   3978
   3979static int hidpp_get_report_length(struct hid_device *hdev, int id)
   3980{
   3981	struct hid_report_enum *re;
   3982	struct hid_report *report;
   3983
   3984	re = &(hdev->report_enum[HID_OUTPUT_REPORT]);
   3985	report = re->report_id_hash[id];
   3986	if (!report)
   3987		return 0;
   3988
   3989	return report->field[0]->report_count + 1;
   3990}
   3991
   3992static u8 hidpp_validate_device(struct hid_device *hdev)
   3993{
   3994	struct hidpp_device *hidpp = hid_get_drvdata(hdev);
   3995	int id, report_length;
   3996	u8 supported_reports = 0;
   3997
   3998	id = REPORT_ID_HIDPP_SHORT;
   3999	report_length = hidpp_get_report_length(hdev, id);
   4000	if (report_length) {
   4001		if (report_length < HIDPP_REPORT_SHORT_LENGTH)
   4002			goto bad_device;
   4003
   4004		supported_reports |= HIDPP_REPORT_SHORT_SUPPORTED;
   4005	}
   4006
   4007	id = REPORT_ID_HIDPP_LONG;
   4008	report_length = hidpp_get_report_length(hdev, id);
   4009	if (report_length) {
   4010		if (report_length < HIDPP_REPORT_LONG_LENGTH)
   4011			goto bad_device;
   4012
   4013		supported_reports |= HIDPP_REPORT_LONG_SUPPORTED;
   4014	}
   4015
   4016	id = REPORT_ID_HIDPP_VERY_LONG;
   4017	report_length = hidpp_get_report_length(hdev, id);
   4018	if (report_length) {
   4019		if (report_length < HIDPP_REPORT_LONG_LENGTH ||
   4020		    report_length > HIDPP_REPORT_VERY_LONG_MAX_LENGTH)
   4021			goto bad_device;
   4022
   4023		supported_reports |= HIDPP_REPORT_VERY_LONG_SUPPORTED;
   4024		hidpp->very_long_report_length = report_length;
   4025	}
   4026
   4027	return supported_reports;
   4028
   4029bad_device:
   4030	hid_warn(hdev, "not enough values in hidpp report %d\n", id);
   4031	return false;
   4032}
   4033
   4034static bool hidpp_application_equals(struct hid_device *hdev,
   4035				     unsigned int application)
   4036{
   4037	struct list_head *report_list;
   4038	struct hid_report *report;
   4039
   4040	report_list = &hdev->report_enum[HID_INPUT_REPORT].report_list;
   4041	report = list_first_entry_or_null(report_list, struct hid_report, list);
   4042	return report && report->application == application;
   4043}
   4044
   4045static int hidpp_probe(struct hid_device *hdev, const struct hid_device_id *id)
   4046{
   4047	struct hidpp_device *hidpp;
   4048	int ret;
   4049	bool connected;
   4050	unsigned int connect_mask = HID_CONNECT_DEFAULT;
   4051	struct hidpp_ff_private_data data;
   4052
   4053	/* report_fixup needs drvdata to be set before we call hid_parse */
   4054	hidpp = devm_kzalloc(&hdev->dev, sizeof(*hidpp), GFP_KERNEL);
   4055	if (!hidpp)
   4056		return -ENOMEM;
   4057
   4058	hidpp->hid_dev = hdev;
   4059	hidpp->name = hdev->name;
   4060	hidpp->quirks = id->driver_data;
   4061	hid_set_drvdata(hdev, hidpp);
   4062
   4063	ret = hid_parse(hdev);
   4064	if (ret) {
   4065		hid_err(hdev, "%s:parse failed\n", __func__);
   4066		return ret;
   4067	}
   4068
   4069	/*
   4070	 * Make sure the device is HID++ capable, otherwise treat as generic HID
   4071	 */
   4072	hidpp->supported_reports = hidpp_validate_device(hdev);
   4073
   4074	if (!hidpp->supported_reports) {
   4075		hid_set_drvdata(hdev, NULL);
   4076		devm_kfree(&hdev->dev, hidpp);
   4077		return hid_hw_start(hdev, HID_CONNECT_DEFAULT);
   4078	}
   4079
   4080	if (id->group == HID_GROUP_LOGITECH_DJ_DEVICE)
   4081		hidpp->quirks |= HIDPP_QUIRK_UNIFYING;
   4082
   4083	if (id->group == HID_GROUP_LOGITECH_27MHZ_DEVICE &&
   4084	    hidpp_application_equals(hdev, HID_GD_MOUSE))
   4085		hidpp->quirks |= HIDPP_QUIRK_HIDPP_WHEELS |
   4086				 HIDPP_QUIRK_HIDPP_EXTRA_MOUSE_BTNS;
   4087
   4088	if (id->group == HID_GROUP_LOGITECH_27MHZ_DEVICE &&
   4089	    hidpp_application_equals(hdev, HID_GD_KEYBOARD))
   4090		hidpp->quirks |= HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS;
   4091
   4092	if (disable_raw_mode) {
   4093		hidpp->quirks &= ~HIDPP_QUIRK_CLASS_WTP;
   4094		hidpp->quirks &= ~HIDPP_QUIRK_NO_HIDINPUT;
   4095	}
   4096
   4097	if (hidpp->quirks & HIDPP_QUIRK_CLASS_WTP) {
   4098		ret = wtp_allocate(hdev, id);
   4099		if (ret)
   4100			return ret;
   4101	} else if (hidpp->quirks & HIDPP_QUIRK_CLASS_K400) {
   4102		ret = k400_allocate(hdev);
   4103		if (ret)
   4104			return ret;
   4105	}
   4106
   4107	INIT_WORK(&hidpp->work, delayed_work_cb);
   4108	mutex_init(&hidpp->send_mutex);
   4109	init_waitqueue_head(&hidpp->wait);
   4110
   4111	/* indicates we are handling the battery properties in the kernel */
   4112	ret = sysfs_create_group(&hdev->dev.kobj, &ps_attribute_group);
   4113	if (ret)
   4114		hid_warn(hdev, "Cannot allocate sysfs group for %s\n",
   4115			 hdev->name);
   4116
   4117	/*
   4118	 * Plain USB connections need to actually call start and open
   4119	 * on the transport driver to allow incoming data.
   4120	 */
   4121	ret = hid_hw_start(hdev, 0);
   4122	if (ret) {
   4123		hid_err(hdev, "hw start failed\n");
   4124		goto hid_hw_start_fail;
   4125	}
   4126
   4127	ret = hid_hw_open(hdev);
   4128	if (ret < 0) {
   4129		dev_err(&hdev->dev, "%s:hid_hw_open returned error:%d\n",
   4130			__func__, ret);
   4131		goto hid_hw_open_fail;
   4132	}
   4133
   4134	/* Allow incoming packets */
   4135	hid_device_io_start(hdev);
   4136
   4137	if (hidpp->quirks & HIDPP_QUIRK_UNIFYING)
   4138		hidpp_unifying_init(hidpp);
   4139
   4140	connected = hidpp_root_get_protocol_version(hidpp) == 0;
   4141	atomic_set(&hidpp->connected, connected);
   4142	if (!(hidpp->quirks & HIDPP_QUIRK_UNIFYING)) {
   4143		if (!connected) {
   4144			ret = -ENODEV;
   4145			hid_err(hdev, "Device not connected");
   4146			goto hid_hw_init_fail;
   4147		}
   4148
   4149		hidpp_overwrite_name(hdev);
   4150	}
   4151
   4152	if (connected && hidpp->protocol_major >= 2) {
   4153		ret = hidpp_set_wireless_feature_index(hidpp);
   4154		if (ret == -ENOENT)
   4155			hidpp->wireless_feature_index = 0;
   4156		else if (ret)
   4157			goto hid_hw_init_fail;
   4158	}
   4159
   4160	if (connected && (hidpp->quirks & HIDPP_QUIRK_CLASS_WTP)) {
   4161		ret = wtp_get_config(hidpp);
   4162		if (ret)
   4163			goto hid_hw_init_fail;
   4164	} else if (connected && (hidpp->quirks & HIDPP_QUIRK_CLASS_G920)) {
   4165		ret = g920_get_config(hidpp, &data);
   4166		if (ret)
   4167			goto hid_hw_init_fail;
   4168	}
   4169
   4170	hidpp_connect_event(hidpp);
   4171
   4172	/* Reset the HID node state */
   4173	hid_device_io_stop(hdev);
   4174	hid_hw_close(hdev);
   4175	hid_hw_stop(hdev);
   4176
   4177	if (hidpp->quirks & HIDPP_QUIRK_NO_HIDINPUT)
   4178		connect_mask &= ~HID_CONNECT_HIDINPUT;
   4179
   4180	/* Now export the actual inputs and hidraw nodes to the world */
   4181	ret = hid_hw_start(hdev, connect_mask);
   4182	if (ret) {
   4183		hid_err(hdev, "%s:hid_hw_start returned error\n", __func__);
   4184		goto hid_hw_start_fail;
   4185	}
   4186
   4187	if (hidpp->quirks & HIDPP_QUIRK_CLASS_G920) {
   4188		ret = hidpp_ff_init(hidpp, &data);
   4189		if (ret)
   4190			hid_warn(hidpp->hid_dev,
   4191		     "Unable to initialize force feedback support, errno %d\n",
   4192				 ret);
   4193	}
   4194
   4195	return ret;
   4196
   4197hid_hw_init_fail:
   4198	hid_hw_close(hdev);
   4199hid_hw_open_fail:
   4200	hid_hw_stop(hdev);
   4201hid_hw_start_fail:
   4202	sysfs_remove_group(&hdev->dev.kobj, &ps_attribute_group);
   4203	cancel_work_sync(&hidpp->work);
   4204	mutex_destroy(&hidpp->send_mutex);
   4205	return ret;
   4206}
   4207
   4208static void hidpp_remove(struct hid_device *hdev)
   4209{
   4210	struct hidpp_device *hidpp = hid_get_drvdata(hdev);
   4211
   4212	if (!hidpp)
   4213		return hid_hw_stop(hdev);
   4214
   4215	sysfs_remove_group(&hdev->dev.kobj, &ps_attribute_group);
   4216
   4217	hid_hw_stop(hdev);
   4218	cancel_work_sync(&hidpp->work);
   4219	mutex_destroy(&hidpp->send_mutex);
   4220}
   4221
   4222#define LDJ_DEVICE(product) \
   4223	HID_DEVICE(BUS_USB, HID_GROUP_LOGITECH_DJ_DEVICE, \
   4224		   USB_VENDOR_ID_LOGITECH, (product))
   4225
   4226#define L27MHZ_DEVICE(product) \
   4227	HID_DEVICE(BUS_USB, HID_GROUP_LOGITECH_27MHZ_DEVICE, \
   4228		   USB_VENDOR_ID_LOGITECH, (product))
   4229
   4230static const struct hid_device_id hidpp_devices[] = {
   4231	{ /* wireless touchpad */
   4232	  LDJ_DEVICE(0x4011),
   4233	  .driver_data = HIDPP_QUIRK_CLASS_WTP | HIDPP_QUIRK_DELAYED_INIT |
   4234			 HIDPP_QUIRK_WTP_PHYSICAL_BUTTONS },
   4235	{ /* wireless touchpad T650 */
   4236	  LDJ_DEVICE(0x4101),
   4237	  .driver_data = HIDPP_QUIRK_CLASS_WTP | HIDPP_QUIRK_DELAYED_INIT },
   4238	{ /* wireless touchpad T651 */
   4239	  HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH,
   4240		USB_DEVICE_ID_LOGITECH_T651),
   4241	  .driver_data = HIDPP_QUIRK_CLASS_WTP },
   4242	{ /* Mouse Logitech Anywhere MX */
   4243	  LDJ_DEVICE(0x1017), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_1P0 },
   4244	{ /* Mouse Logitech Cube */
   4245	  LDJ_DEVICE(0x4010), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2120 },
   4246	{ /* Mouse Logitech M335 */
   4247	  LDJ_DEVICE(0x4050), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 },
   4248	{ /* Mouse Logitech M515 */
   4249	  LDJ_DEVICE(0x4007), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2120 },
   4250	{ /* Mouse logitech M560 */
   4251	  LDJ_DEVICE(0x402d),
   4252	  .driver_data = HIDPP_QUIRK_DELAYED_INIT | HIDPP_QUIRK_CLASS_M560
   4253		| HIDPP_QUIRK_HI_RES_SCROLL_X2120 },
   4254	{ /* Mouse Logitech M705 (firmware RQM17) */
   4255	  LDJ_DEVICE(0x101b), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_1P0 },
   4256	{ /* Mouse Logitech M705 (firmware RQM67) */
   4257	  LDJ_DEVICE(0x406d), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 },
   4258	{ /* Mouse Logitech M720 */
   4259	  LDJ_DEVICE(0x405e), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 },
   4260	{ /* Mouse Logitech MX Anywhere 2 */
   4261	  LDJ_DEVICE(0x404a), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 },
   4262	{ LDJ_DEVICE(0x4072), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 },
   4263	{ LDJ_DEVICE(0xb013), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 },
   4264	{ LDJ_DEVICE(0xb018), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 },
   4265	{ LDJ_DEVICE(0xb01f), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 },
   4266	{ /* Mouse Logitech MX Anywhere 2S */
   4267	  LDJ_DEVICE(0x406a), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 },
   4268	{ /* Mouse Logitech MX Master */
   4269	  LDJ_DEVICE(0x4041), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 },
   4270	{ LDJ_DEVICE(0x4060), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 },
   4271	{ LDJ_DEVICE(0x4071), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 },
   4272	{ /* Mouse Logitech MX Master 2S */
   4273	  LDJ_DEVICE(0x4069), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 },
   4274	{ /* Mouse Logitech MX Master 3 */
   4275	  LDJ_DEVICE(0x4082), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 },
   4276	{ /* Mouse Logitech Performance MX */
   4277	  LDJ_DEVICE(0x101a), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_1P0 },
   4278	{ /* Keyboard logitech K400 */
   4279	  LDJ_DEVICE(0x4024),
   4280	  .driver_data = HIDPP_QUIRK_CLASS_K400 },
   4281	{ /* Solar Keyboard Logitech K750 */
   4282	  LDJ_DEVICE(0x4002),
   4283	  .driver_data = HIDPP_QUIRK_CLASS_K750 },
   4284	{ /* Keyboard MX5000 (Bluetooth-receiver in HID proxy mode) */
   4285	  LDJ_DEVICE(0xb305),
   4286	  .driver_data = HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS },
   4287	{ /* Dinovo Edge (Bluetooth-receiver in HID proxy mode) */
   4288	  LDJ_DEVICE(0xb309),
   4289	  .driver_data = HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS },
   4290	{ /* Keyboard MX5500 (Bluetooth-receiver in HID proxy mode) */
   4291	  LDJ_DEVICE(0xb30b),
   4292	  .driver_data = HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS },
   4293
   4294	{ LDJ_DEVICE(HID_ANY_ID) },
   4295
   4296	{ /* Keyboard LX501 (Y-RR53) */
   4297	  L27MHZ_DEVICE(0x0049),
   4298	  .driver_data = HIDPP_QUIRK_KBD_ZOOM_WHEEL },
   4299	{ /* Keyboard MX3000 (Y-RAM74) */
   4300	  L27MHZ_DEVICE(0x0057),
   4301	  .driver_data = HIDPP_QUIRK_KBD_SCROLL_WHEEL },
   4302	{ /* Keyboard MX3200 (Y-RAV80) */
   4303	  L27MHZ_DEVICE(0x005c),
   4304	  .driver_data = HIDPP_QUIRK_KBD_ZOOM_WHEEL },
   4305	{ /* S510 Media Remote */
   4306	  L27MHZ_DEVICE(0x00fe),
   4307	  .driver_data = HIDPP_QUIRK_KBD_SCROLL_WHEEL },
   4308
   4309	{ L27MHZ_DEVICE(HID_ANY_ID) },
   4310
   4311	{ /* Logitech G403 Wireless Gaming Mouse over USB */
   4312	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 0xC082) },
   4313	{ /* Logitech G703 Gaming Mouse over USB */
   4314	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 0xC087) },
   4315	{ /* Logitech G703 Hero Gaming Mouse over USB */
   4316	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 0xC090) },
   4317	{ /* Logitech G900 Gaming Mouse over USB */
   4318	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 0xC081) },
   4319	{ /* Logitech G903 Gaming Mouse over USB */
   4320	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 0xC086) },
   4321	{ /* Logitech G903 Hero Gaming Mouse over USB */
   4322	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 0xC091) },
   4323	{ /* Logitech G920 Wheel over USB */
   4324	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_G920_WHEEL),
   4325		.driver_data = HIDPP_QUIRK_CLASS_G920 | HIDPP_QUIRK_FORCE_OUTPUT_REPORTS},
   4326	{ /* Logitech G Pro Gaming Mouse over USB */
   4327	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 0xC088) },
   4328
   4329	{ /* MX5000 keyboard over Bluetooth */
   4330	  HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb305),
   4331	  .driver_data = HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS },
   4332	{ /* Dinovo Edge keyboard over Bluetooth */
   4333	  HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb309),
   4334	  .driver_data = HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS },
   4335	{ /* MX5500 keyboard over Bluetooth */
   4336	  HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb30b),
   4337	  .driver_data = HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS },
   4338	{ /* M-RCQ142 V470 Cordless Laser Mouse over Bluetooth */
   4339	  HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb008) },
   4340	{ /* MX Master mouse over Bluetooth */
   4341	  HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb012),
   4342	  .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 },
   4343	{ /* MX Ergo trackball over Bluetooth */
   4344	  HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb01d) },
   4345	{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb01e),
   4346	  .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 },
   4347	{ /* MX Master 3 mouse over Bluetooth */
   4348	  HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb023),
   4349	  .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 },
   4350	{}
   4351};
   4352
   4353MODULE_DEVICE_TABLE(hid, hidpp_devices);
   4354
   4355static const struct hid_usage_id hidpp_usages[] = {
   4356	{ HID_GD_WHEEL, EV_REL, REL_WHEEL_HI_RES },
   4357	{ HID_ANY_ID - 1, HID_ANY_ID - 1, HID_ANY_ID - 1}
   4358};
   4359
   4360static struct hid_driver hidpp_driver = {
   4361	.name = "logitech-hidpp-device",
   4362	.id_table = hidpp_devices,
   4363	.report_fixup = hidpp_report_fixup,
   4364	.probe = hidpp_probe,
   4365	.remove = hidpp_remove,
   4366	.raw_event = hidpp_raw_event,
   4367	.usage_table = hidpp_usages,
   4368	.event = hidpp_event,
   4369	.input_configured = hidpp_input_configured,
   4370	.input_mapping = hidpp_input_mapping,
   4371	.input_mapped = hidpp_input_mapped,
   4372};
   4373
   4374module_hid_driver(hidpp_driver);