19614219eSNikolai Kondrashov /* SPDX-License-Identifier: GPL-2.0+ */ 29614219eSNikolai Kondrashov /* 39614219eSNikolai Kondrashov * HID driver for UC-Logic devices not fully compliant with HID standard 49614219eSNikolai Kondrashov * - tablet initialization and parameter retrieval 59614219eSNikolai Kondrashov * 69614219eSNikolai Kondrashov * Copyright (c) 2018 Nikolai Kondrashov 79614219eSNikolai Kondrashov */ 89614219eSNikolai Kondrashov 99614219eSNikolai Kondrashov /* 109614219eSNikolai Kondrashov * This program is free software; you can redistribute it and/or modify it 119614219eSNikolai Kondrashov * under the terms of the GNU General Public License as published by the Free 129614219eSNikolai Kondrashov * Software Foundation; either version 2 of the License, or (at your option) 139614219eSNikolai Kondrashov * any later version. 149614219eSNikolai Kondrashov */ 159614219eSNikolai Kondrashov 169614219eSNikolai Kondrashov #ifndef _HID_UCLOGIC_PARAMS_H 179614219eSNikolai Kondrashov #define _HID_UCLOGIC_PARAMS_H 189614219eSNikolai Kondrashov 199614219eSNikolai Kondrashov #include <linux/usb.h> 209614219eSNikolai Kondrashov #include <linux/hid.h> 219614219eSNikolai Kondrashov 229614219eSNikolai Kondrashov /* Types of pen in-range reporting */ 239614219eSNikolai Kondrashov enum uclogic_params_pen_inrange { 249614219eSNikolai Kondrashov /* Normal reports: zero - out of proximity, one - in proximity */ 259614219eSNikolai Kondrashov UCLOGIC_PARAMS_PEN_INRANGE_NORMAL = 0, 269614219eSNikolai Kondrashov /* Inverted reports: zero - in proximity, one - out of proximity */ 279614219eSNikolai Kondrashov UCLOGIC_PARAMS_PEN_INRANGE_INVERTED, 2801309e29SNikolai Kondrashov /* No reports */ 2901309e29SNikolai Kondrashov UCLOGIC_PARAMS_PEN_INRANGE_NONE, 309614219eSNikolai Kondrashov }; 319614219eSNikolai Kondrashov 329614219eSNikolai Kondrashov /* Convert a pen in-range reporting type to a string */ 339614219eSNikolai Kondrashov extern const char *uclogic_params_pen_inrange_to_str( 349614219eSNikolai Kondrashov enum uclogic_params_pen_inrange inrange); 359614219eSNikolai Kondrashov 368b013098SNikolai Kondrashov 378b013098SNikolai Kondrashov /* 388b013098SNikolai Kondrashov * Pen report's subreport data. 398b013098SNikolai Kondrashov */ 408b013098SNikolai Kondrashov struct uclogic_params_pen_subreport { 418b013098SNikolai Kondrashov /* 42e6be956fSNikolai Kondrashov * The value of the second byte of the pen report indicating this 43e6be956fSNikolai Kondrashov * subreport. If zero, the subreport should be considered invalid and 44e6be956fSNikolai Kondrashov * not matched. 458b013098SNikolai Kondrashov */ 46e6be956fSNikolai Kondrashov __u8 value; 478b013098SNikolai Kondrashov 488b013098SNikolai Kondrashov /* 49e6be956fSNikolai Kondrashov * The ID to be assigned to the report, if the second byte of the pen 50e6be956fSNikolai Kondrashov * report is equal to "value". Only valid if "value" is not zero. 518b013098SNikolai Kondrashov */ 528b013098SNikolai Kondrashov __u8 id; 538b013098SNikolai Kondrashov }; 548b013098SNikolai Kondrashov 559614219eSNikolai Kondrashov /* 569614219eSNikolai Kondrashov * Tablet interface's pen input parameters. 579614219eSNikolai Kondrashov * 589614219eSNikolai Kondrashov * Must use declarative (descriptive) language, not imperative, to simplify 599614219eSNikolai Kondrashov * understanding and maintain consistency. 609614219eSNikolai Kondrashov * 619614219eSNikolai Kondrashov * Noop (preserving functionality) when filled with zeroes. 629614219eSNikolai Kondrashov */ 639614219eSNikolai Kondrashov struct uclogic_params_pen { 649614219eSNikolai Kondrashov /* 65*f5927973SNikolai Kondrashov * True if pen usage is invalid for this interface and should be 66*f5927973SNikolai Kondrashov * ignored, false otherwise. 67*f5927973SNikolai Kondrashov */ 68*f5927973SNikolai Kondrashov bool usage_invalid; 69*f5927973SNikolai Kondrashov /* 704933a722SNikolai Kondrashov * Pointer to report descriptor part describing the pen inputs. 714933a722SNikolai Kondrashov * Allocated with kmalloc. NULL if the part is not specified. 729614219eSNikolai Kondrashov */ 739614219eSNikolai Kondrashov __u8 *desc_ptr; 749614219eSNikolai Kondrashov /* 759614219eSNikolai Kondrashov * Size of the report descriptor. 769614219eSNikolai Kondrashov * Only valid, if "desc_ptr" is not NULL. 779614219eSNikolai Kondrashov */ 789614219eSNikolai Kondrashov unsigned int desc_size; 799614219eSNikolai Kondrashov /* Report ID, if reports should be tweaked, zero if not */ 809614219eSNikolai Kondrashov unsigned int id; 813e200d6cSNikolai Kondrashov /* The list of subreports, only valid if "id" is not zero */ 823e200d6cSNikolai Kondrashov struct uclogic_params_pen_subreport subreport_list[3]; 839614219eSNikolai Kondrashov /* Type of in-range reporting, only valid if "id" is not zero */ 849614219eSNikolai Kondrashov enum uclogic_params_pen_inrange inrange; 8559f2e0fcSNikolai Kondrashov /* 8659f2e0fcSNikolai Kondrashov * True, if reports include fragmented high resolution coords, with 8759f2e0fcSNikolai Kondrashov * high-order X and then Y bytes following the pressure field. 8859f2e0fcSNikolai Kondrashov * Only valid if "id" is not zero. 8959f2e0fcSNikolai Kondrashov */ 9059f2e0fcSNikolai Kondrashov bool fragmented_hires; 911324c5acSNikolai Kondrashov /* 921324c5acSNikolai Kondrashov * True if the pen reports tilt in bytes at offset 10 (X) and 11 (Y), 931324c5acSNikolai Kondrashov * and the Y tilt direction is flipped. 941324c5acSNikolai Kondrashov * Only valid if "id" is not zero. 951324c5acSNikolai Kondrashov */ 961324c5acSNikolai Kondrashov bool tilt_y_flipped; 979614219eSNikolai Kondrashov }; 989614219eSNikolai Kondrashov 999614219eSNikolai Kondrashov /* 1009614219eSNikolai Kondrashov * Parameters of frame control inputs of a tablet interface. 1019614219eSNikolai Kondrashov * 1029614219eSNikolai Kondrashov * Must use declarative (descriptive) language, not imperative, to simplify 1039614219eSNikolai Kondrashov * understanding and maintain consistency. 1049614219eSNikolai Kondrashov * 1059614219eSNikolai Kondrashov * Noop (preserving functionality) when filled with zeroes. 1069614219eSNikolai Kondrashov */ 1079614219eSNikolai Kondrashov struct uclogic_params_frame { 1089614219eSNikolai Kondrashov /* 1094933a722SNikolai Kondrashov * Pointer to report descriptor part describing the frame inputs. 1104933a722SNikolai Kondrashov * Allocated with kmalloc. NULL if the part is not specified. 1119614219eSNikolai Kondrashov */ 1129614219eSNikolai Kondrashov __u8 *desc_ptr; 1139614219eSNikolai Kondrashov /* 1149614219eSNikolai Kondrashov * Size of the report descriptor. 1159614219eSNikolai Kondrashov * Only valid, if "desc_ptr" is not NULL. 1169614219eSNikolai Kondrashov */ 1179614219eSNikolai Kondrashov unsigned int desc_size; 1189614219eSNikolai Kondrashov /* 1199614219eSNikolai Kondrashov * Report ID, if reports should be tweaked, zero if not. 1209614219eSNikolai Kondrashov */ 1219614219eSNikolai Kondrashov unsigned int id; 122fde44ac5SNikolai Kondrashov /* 123ee007036SNikolai Kondrashov * The suffix to add to the input device name, if not NULL. 124ee007036SNikolai Kondrashov */ 125ee007036SNikolai Kondrashov const char *suffix; 126ee007036SNikolai Kondrashov /* 1278a47670cSNikolai Kondrashov * Number of the least-significant bit of the 2-bit state of a rotary 1288a47670cSNikolai Kondrashov * encoder, in the report. Cannot point to a 2-bit field crossing a 1298a47670cSNikolai Kondrashov * byte boundary. Zero if not present. Only valid if "id" is not zero. 1308a47670cSNikolai Kondrashov */ 1318a47670cSNikolai Kondrashov unsigned int re_lsb; 1328a47670cSNikolai Kondrashov /* 133fde44ac5SNikolai Kondrashov * Offset of the Wacom-style device ID byte in the report, to be set 134fde44ac5SNikolai Kondrashov * to pad device ID (0xf), for compatibility with Wacom drivers. Zero 135d170e8e0SNikolai Kondrashov * if no changes to the report should be made. The ID byte will be set 136d170e8e0SNikolai Kondrashov * to zero whenever the byte pointed by "touch_ring_byte" is zero, if 137d170e8e0SNikolai Kondrashov * the latter is valid. Only valid if "id" is not zero. 138fde44ac5SNikolai Kondrashov */ 139fde44ac5SNikolai Kondrashov unsigned int dev_id_byte; 140d170e8e0SNikolai Kondrashov /* 141d170e8e0SNikolai Kondrashov * Offset of the touch ring state byte, in the report. 142d170e8e0SNikolai Kondrashov * Zero if not present. If dev_id_byte is also valid and non-zero, 143d170e8e0SNikolai Kondrashov * then the device ID byte will be cleared when the byte pointed to by 144d170e8e0SNikolai Kondrashov * this offset is zero. Only valid if "id" is not zero. 145d170e8e0SNikolai Kondrashov */ 146d170e8e0SNikolai Kondrashov unsigned int touch_ring_byte; 147d170e8e0SNikolai Kondrashov 148d170e8e0SNikolai Kondrashov /* 149d170e8e0SNikolai Kondrashov * Maximum value of the touch ring report. 150d170e8e0SNikolai Kondrashov * The minimum valid value is considered to be one, 151d170e8e0SNikolai Kondrashov * with zero being out-of-proximity (finger lift) value. 152d170e8e0SNikolai Kondrashov */ 153d170e8e0SNikolai Kondrashov __s8 touch_ring_max; 154d170e8e0SNikolai Kondrashov 155d170e8e0SNikolai Kondrashov /* 156d170e8e0SNikolai Kondrashov * The value to anchor the reversed reports at. 157d170e8e0SNikolai Kondrashov * I.e. one, if the reports should be flipped without offset. 158d170e8e0SNikolai Kondrashov * Zero if no reversal should be done. 159d170e8e0SNikolai Kondrashov */ 160d170e8e0SNikolai Kondrashov __s8 touch_ring_flip_at; 1612112b49eSNikolai Kondrashov /* 1622112b49eSNikolai Kondrashov * Offset of the bitmap dial byte, in the report. Zero if not present. 1632112b49eSNikolai Kondrashov * Only valid if "id" is not zero. A bitmap dial sends reports with a 1642112b49eSNikolai Kondrashov * dedicated bit per direction: 1 means clockwise rotation, 2 means 1652112b49eSNikolai Kondrashov * counterclockwise, as opposed to the normal 1 and -1. 1662112b49eSNikolai Kondrashov */ 1672112b49eSNikolai Kondrashov unsigned int bitmap_dial_byte; 1689614219eSNikolai Kondrashov }; 1699614219eSNikolai Kondrashov 1709614219eSNikolai Kondrashov /* 1719614219eSNikolai Kondrashov * Tablet interface report parameters. 1729614219eSNikolai Kondrashov * 1739614219eSNikolai Kondrashov * Must use declarative (descriptive) language, not imperative, to simplify 1749614219eSNikolai Kondrashov * understanding and maintain consistency. 1759614219eSNikolai Kondrashov * 1769614219eSNikolai Kondrashov * When filled with zeros represents a "noop" configuration - passes all 1779614219eSNikolai Kondrashov * reports unchanged and lets the generic HID driver handle everything. 1789614219eSNikolai Kondrashov * 1799614219eSNikolai Kondrashov * The resulting device report descriptor is assembled from all the report 1809614219eSNikolai Kondrashov * descriptor parts referenced by the structure. No order of assembly should 1819614219eSNikolai Kondrashov * be assumed. The structure represents original device report descriptor if 1829614219eSNikolai Kondrashov * all the parts are NULL. 1839614219eSNikolai Kondrashov */ 1849614219eSNikolai Kondrashov struct uclogic_params { 1859614219eSNikolai Kondrashov /* 1869614219eSNikolai Kondrashov * True if the whole interface is invalid, false otherwise. 1879614219eSNikolai Kondrashov */ 1889614219eSNikolai Kondrashov bool invalid; 1899614219eSNikolai Kondrashov /* 1909614219eSNikolai Kondrashov * Pointer to the common part of the replacement report descriptor, 1919614219eSNikolai Kondrashov * allocated with kmalloc. NULL if no common part is needed. 1929614219eSNikolai Kondrashov * Only valid, if "invalid" is false. 1939614219eSNikolai Kondrashov */ 1949614219eSNikolai Kondrashov __u8 *desc_ptr; 1959614219eSNikolai Kondrashov /* 1969614219eSNikolai Kondrashov * Size of the common part of the replacement report descriptor. 19787dc28ebSNikolai Kondrashov * Only valid, if "desc_ptr" is valid and not NULL. 1989614219eSNikolai Kondrashov */ 1999614219eSNikolai Kondrashov unsigned int desc_size; 2009614219eSNikolai Kondrashov /* 2019614219eSNikolai Kondrashov * Pen parameters and optional report descriptor part. 202606dadc1SNikolai Kondrashov * Only valid, if "invalid" is false. 2039614219eSNikolai Kondrashov */ 2049614219eSNikolai Kondrashov struct uclogic_params_pen pen; 2059614219eSNikolai Kondrashov /* 206337fa051SNikolai Kondrashov * The list of frame control parameters and optional report descriptor 207337fa051SNikolai Kondrashov * parts. Only valid, if "invalid" is false. 2089614219eSNikolai Kondrashov */ 2093e200d6cSNikolai Kondrashov struct uclogic_params_frame frame_list[3]; 2109614219eSNikolai Kondrashov }; 2119614219eSNikolai Kondrashov 2129614219eSNikolai Kondrashov /* Initialize a tablet interface and discover its parameters */ 2139614219eSNikolai Kondrashov extern int uclogic_params_init(struct uclogic_params *params, 2149614219eSNikolai Kondrashov struct hid_device *hdev); 2159614219eSNikolai Kondrashov 2169614219eSNikolai Kondrashov /* Tablet interface parameters *printf format string */ 2179614219eSNikolai Kondrashov #define UCLOGIC_PARAMS_FMT_STR \ 2189614219eSNikolai Kondrashov ".invalid = %s\n" \ 2199614219eSNikolai Kondrashov ".desc_ptr = %p\n" \ 2209614219eSNikolai Kondrashov ".desc_size = %u\n" \ 221eea4269fSNikolai Kondrashov ".pen = {\n" \ 222*f5927973SNikolai Kondrashov "\t.usage_invalid = %s\n" \ 223eea4269fSNikolai Kondrashov "\t.desc_ptr = %p\n" \ 224eea4269fSNikolai Kondrashov "\t.desc_size = %u\n" \ 225eea4269fSNikolai Kondrashov "\t.id = %u\n" \ 226eea4269fSNikolai Kondrashov "\t.subreport_list = {\n" \ 227eea4269fSNikolai Kondrashov "\t\t{0x%02hhx, %hhu},\n" \ 228eea4269fSNikolai Kondrashov "\t\t{0x%02hhx, %hhu},\n" \ 229eea4269fSNikolai Kondrashov "\t\t{0x%02hhx, %hhu},\n" \ 230eea4269fSNikolai Kondrashov "\t}\n" \ 231eea4269fSNikolai Kondrashov "\t.inrange = %s\n" \ 232eea4269fSNikolai Kondrashov "\t.fragmented_hires = %s\n" \ 233eea4269fSNikolai Kondrashov "\t.tilt_y_flipped = %s\n" \ 234eea4269fSNikolai Kondrashov "}\n" \ 235eea4269fSNikolai Kondrashov ".frame_list = {\n" \ 236eea4269fSNikolai Kondrashov "\t{\n" \ 237eea4269fSNikolai Kondrashov "\t\t.desc_ptr = %p\n" \ 238eea4269fSNikolai Kondrashov "\t\t.desc_size = %u\n" \ 239eea4269fSNikolai Kondrashov "\t\t.id = %u\n" \ 240eea4269fSNikolai Kondrashov "\t\t.suffix = %s\n" \ 241eea4269fSNikolai Kondrashov "\t\t.re_lsb = %u\n" \ 242eea4269fSNikolai Kondrashov "\t\t.dev_id_byte = %u\n" \ 243eea4269fSNikolai Kondrashov "\t\t.touch_ring_byte = %u\n" \ 244eea4269fSNikolai Kondrashov "\t\t.touch_ring_max = %hhd\n" \ 245eea4269fSNikolai Kondrashov "\t\t.touch_ring_flip_at = %hhd\n" \ 2462112b49eSNikolai Kondrashov "\t\t.bitmap_dial_byte = %u\n" \ 247eea4269fSNikolai Kondrashov "\t},\n" \ 248eea4269fSNikolai Kondrashov "\t{\n" \ 249eea4269fSNikolai Kondrashov "\t\t.desc_ptr = %p\n" \ 250eea4269fSNikolai Kondrashov "\t\t.desc_size = %u\n" \ 251eea4269fSNikolai Kondrashov "\t\t.id = %u\n" \ 252eea4269fSNikolai Kondrashov "\t\t.suffix = %s\n" \ 253eea4269fSNikolai Kondrashov "\t\t.re_lsb = %u\n" \ 254eea4269fSNikolai Kondrashov "\t\t.dev_id_byte = %u\n" \ 255eea4269fSNikolai Kondrashov "\t\t.touch_ring_byte = %u\n" \ 256eea4269fSNikolai Kondrashov "\t\t.touch_ring_max = %hhd\n" \ 257eea4269fSNikolai Kondrashov "\t\t.touch_ring_flip_at = %hhd\n" \ 2582112b49eSNikolai Kondrashov "\t\t.bitmap_dial_byte = %u\n" \ 259eea4269fSNikolai Kondrashov "\t},\n" \ 260eea4269fSNikolai Kondrashov "\t{\n" \ 261eea4269fSNikolai Kondrashov "\t\t.desc_ptr = %p\n" \ 262eea4269fSNikolai Kondrashov "\t\t.desc_size = %u\n" \ 263eea4269fSNikolai Kondrashov "\t\t.id = %u\n" \ 264eea4269fSNikolai Kondrashov "\t\t.suffix = %s\n" \ 265eea4269fSNikolai Kondrashov "\t\t.re_lsb = %u\n" \ 266eea4269fSNikolai Kondrashov "\t\t.dev_id_byte = %u\n" \ 267eea4269fSNikolai Kondrashov "\t\t.touch_ring_byte = %u\n" \ 268eea4269fSNikolai Kondrashov "\t\t.touch_ring_max = %hhd\n" \ 269eea4269fSNikolai Kondrashov "\t\t.touch_ring_flip_at = %hhd\n" \ 2702112b49eSNikolai Kondrashov "\t\t.bitmap_dial_byte = %u\n" \ 271eea4269fSNikolai Kondrashov "\t},\n" \ 272eea4269fSNikolai Kondrashov "}\n" 2739614219eSNikolai Kondrashov 2749614219eSNikolai Kondrashov /* Tablet interface parameters *printf format arguments */ 2759614219eSNikolai Kondrashov #define UCLOGIC_PARAMS_FMT_ARGS(_params) \ 2769614219eSNikolai Kondrashov ((_params)->invalid ? "true" : "false"), \ 2779614219eSNikolai Kondrashov (_params)->desc_ptr, \ 2789614219eSNikolai Kondrashov (_params)->desc_size, \ 279*f5927973SNikolai Kondrashov ((_params)->pen.usage_invalid ? "true" : "false"), \ 2809614219eSNikolai Kondrashov (_params)->pen.desc_ptr, \ 2819614219eSNikolai Kondrashov (_params)->pen.desc_size, \ 2829614219eSNikolai Kondrashov (_params)->pen.id, \ 283e6be956fSNikolai Kondrashov (_params)->pen.subreport_list[0].value, \ 2848b013098SNikolai Kondrashov (_params)->pen.subreport_list[0].id, \ 2853e200d6cSNikolai Kondrashov (_params)->pen.subreport_list[1].value, \ 2863e200d6cSNikolai Kondrashov (_params)->pen.subreport_list[1].id, \ 2873e200d6cSNikolai Kondrashov (_params)->pen.subreport_list[2].value, \ 2883e200d6cSNikolai Kondrashov (_params)->pen.subreport_list[2].id, \ 2899614219eSNikolai Kondrashov uclogic_params_pen_inrange_to_str((_params)->pen.inrange), \ 29059f2e0fcSNikolai Kondrashov ((_params)->pen.fragmented_hires ? "true" : "false"), \ 2911324c5acSNikolai Kondrashov ((_params)->pen.tilt_y_flipped ? "true" : "false"), \ 292337fa051SNikolai Kondrashov (_params)->frame_list[0].desc_ptr, \ 293337fa051SNikolai Kondrashov (_params)->frame_list[0].desc_size, \ 294337fa051SNikolai Kondrashov (_params)->frame_list[0].id, \ 295ee007036SNikolai Kondrashov (_params)->frame_list[0].suffix, \ 296337fa051SNikolai Kondrashov (_params)->frame_list[0].re_lsb, \ 297d170e8e0SNikolai Kondrashov (_params)->frame_list[0].dev_id_byte, \ 298d170e8e0SNikolai Kondrashov (_params)->frame_list[0].touch_ring_byte, \ 299d170e8e0SNikolai Kondrashov (_params)->frame_list[0].touch_ring_max, \ 3003e200d6cSNikolai Kondrashov (_params)->frame_list[0].touch_ring_flip_at, \ 3012112b49eSNikolai Kondrashov (_params)->frame_list[0].bitmap_dial_byte, \ 3023e200d6cSNikolai Kondrashov (_params)->frame_list[1].desc_ptr, \ 3033e200d6cSNikolai Kondrashov (_params)->frame_list[1].desc_size, \ 3043e200d6cSNikolai Kondrashov (_params)->frame_list[1].id, \ 3053e200d6cSNikolai Kondrashov (_params)->frame_list[1].suffix, \ 3063e200d6cSNikolai Kondrashov (_params)->frame_list[1].re_lsb, \ 3073e200d6cSNikolai Kondrashov (_params)->frame_list[1].dev_id_byte, \ 3083e200d6cSNikolai Kondrashov (_params)->frame_list[1].touch_ring_byte, \ 3093e200d6cSNikolai Kondrashov (_params)->frame_list[1].touch_ring_max, \ 3103e200d6cSNikolai Kondrashov (_params)->frame_list[1].touch_ring_flip_at, \ 3112112b49eSNikolai Kondrashov (_params)->frame_list[1].bitmap_dial_byte, \ 3123e200d6cSNikolai Kondrashov (_params)->frame_list[2].desc_ptr, \ 3133e200d6cSNikolai Kondrashov (_params)->frame_list[2].desc_size, \ 3143e200d6cSNikolai Kondrashov (_params)->frame_list[2].id, \ 3153e200d6cSNikolai Kondrashov (_params)->frame_list[2].suffix, \ 3163e200d6cSNikolai Kondrashov (_params)->frame_list[2].re_lsb, \ 3173e200d6cSNikolai Kondrashov (_params)->frame_list[2].dev_id_byte, \ 3183e200d6cSNikolai Kondrashov (_params)->frame_list[2].touch_ring_byte, \ 3193e200d6cSNikolai Kondrashov (_params)->frame_list[2].touch_ring_max, \ 3202112b49eSNikolai Kondrashov (_params)->frame_list[2].touch_ring_flip_at, \ 3212112b49eSNikolai Kondrashov (_params)->frame_list[2].bitmap_dial_byte 3229614219eSNikolai Kondrashov 3239614219eSNikolai Kondrashov /* Get a replacement report descriptor for a tablet's interface. */ 3249614219eSNikolai Kondrashov extern int uclogic_params_get_desc(const struct uclogic_params *params, 3259614219eSNikolai Kondrashov __u8 **pdesc, 3269614219eSNikolai Kondrashov unsigned int *psize); 3279614219eSNikolai Kondrashov 3289614219eSNikolai Kondrashov /* Free resources used by tablet interface's parameters */ 3299614219eSNikolai Kondrashov extern void uclogic_params_cleanup(struct uclogic_params *params); 3309614219eSNikolai Kondrashov 3319614219eSNikolai Kondrashov #endif /* _HID_UCLOGIC_PARAMS_H */ 332