hid-nvidia-shield.c 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
  4. *
  5. * HID driver for NVIDIA SHIELD peripherals.
  6. */
  7. #include <linux/hid.h>
  8. #include <linux/idr.h>
  9. #include <linux/input-event-codes.h>
  10. #include <linux/input.h>
  11. #include <linux/jiffies.h>
  12. #include <linux/leds.h>
  13. #include <linux/module.h>
  14. #include <linux/power_supply.h>
  15. #include <linux/spinlock.h>
  16. #include <linux/timer.h>
  17. #include <linux/workqueue.h>
  18. #include "hid-ids.h"
  19. #define NOT_INIT_STR "NOT INITIALIZED"
  20. #define android_map_key(c) hid_map_usage(hi, usage, bit, max, EV_KEY, (c))
  21. enum {
  22. HID_USAGE_ANDROID_PLAYPAUSE_BTN = 0xcd, /* Double-tap volume slider */
  23. HID_USAGE_ANDROID_VOLUMEUP_BTN = 0xe9,
  24. HID_USAGE_ANDROID_VOLUMEDOWN_BTN = 0xea,
  25. HID_USAGE_ANDROID_SEARCH_BTN = 0x221, /* NVIDIA btn on Thunderstrike */
  26. HID_USAGE_ANDROID_HOME_BTN = 0x223,
  27. HID_USAGE_ANDROID_BACK_BTN = 0x224,
  28. };
  29. enum {
  30. SHIELD_FW_VERSION_INITIALIZED = 0,
  31. SHIELD_BOARD_INFO_INITIALIZED,
  32. SHIELD_BATTERY_STATS_INITIALIZED,
  33. SHIELD_CHARGER_STATE_INITIALIZED,
  34. };
  35. enum {
  36. THUNDERSTRIKE_FW_VERSION_UPDATE = 0,
  37. THUNDERSTRIKE_BOARD_INFO_UPDATE,
  38. THUNDERSTRIKE_HAPTICS_UPDATE,
  39. THUNDERSTRIKE_LED_UPDATE,
  40. THUNDERSTRIKE_POWER_SUPPLY_STATS_UPDATE,
  41. };
  42. enum {
  43. THUNDERSTRIKE_HOSTCMD_REPORT_SIZE = 33,
  44. THUNDERSTRIKE_HOSTCMD_REQ_REPORT_ID = 0x4,
  45. THUNDERSTRIKE_HOSTCMD_RESP_REPORT_ID = 0x3,
  46. };
  47. enum {
  48. THUNDERSTRIKE_HOSTCMD_ID_FW_VERSION = 1,
  49. THUNDERSTRIKE_HOSTCMD_ID_LED = 6,
  50. THUNDERSTRIKE_HOSTCMD_ID_BATTERY,
  51. THUNDERSTRIKE_HOSTCMD_ID_BOARD_INFO = 16,
  52. THUNDERSTRIKE_HOSTCMD_ID_USB_INIT = 53,
  53. THUNDERSTRIKE_HOSTCMD_ID_HAPTICS = 57,
  54. THUNDERSTRIKE_HOSTCMD_ID_CHARGER,
  55. };
  56. struct power_supply_dev {
  57. struct power_supply *psy;
  58. struct power_supply_desc desc;
  59. };
  60. struct thunderstrike_psy_prop_values {
  61. int voltage_min;
  62. int voltage_now;
  63. int voltage_avg;
  64. int voltage_boot;
  65. int capacity;
  66. int status;
  67. int charge_type;
  68. int temp;
  69. };
  70. static const enum power_supply_property thunderstrike_battery_props[] = {
  71. POWER_SUPPLY_PROP_STATUS,
  72. POWER_SUPPLY_PROP_CHARGE_TYPE,
  73. POWER_SUPPLY_PROP_PRESENT,
  74. POWER_SUPPLY_PROP_VOLTAGE_MIN,
  75. POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN,
  76. POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN,
  77. POWER_SUPPLY_PROP_VOLTAGE_NOW,
  78. POWER_SUPPLY_PROP_VOLTAGE_AVG,
  79. POWER_SUPPLY_PROP_VOLTAGE_BOOT,
  80. POWER_SUPPLY_PROP_CAPACITY,
  81. POWER_SUPPLY_PROP_SCOPE,
  82. POWER_SUPPLY_PROP_TEMP,
  83. POWER_SUPPLY_PROP_TEMP_MIN,
  84. POWER_SUPPLY_PROP_TEMP_MAX,
  85. POWER_SUPPLY_PROP_TEMP_ALERT_MIN,
  86. POWER_SUPPLY_PROP_TEMP_ALERT_MAX,
  87. };
  88. enum thunderstrike_led_state {
  89. THUNDERSTRIKE_LED_OFF = 1,
  90. THUNDERSTRIKE_LED_ON = 8,
  91. } __packed;
  92. static_assert(sizeof(enum thunderstrike_led_state) == 1);
  93. struct thunderstrike_hostcmd_battery {
  94. __le16 voltage_avg;
  95. u8 reserved_at_10;
  96. __le16 thermistor;
  97. __le16 voltage_min;
  98. __le16 voltage_boot;
  99. __le16 voltage_now;
  100. u8 capacity;
  101. } __packed;
  102. enum thunderstrike_charger_type {
  103. THUNDERSTRIKE_CHARGER_TYPE_NONE = 0,
  104. THUNDERSTRIKE_CHARGER_TYPE_TRICKLE,
  105. THUNDERSTRIKE_CHARGER_TYPE_NORMAL,
  106. } __packed;
  107. static_assert(sizeof(enum thunderstrike_charger_type) == 1);
  108. enum thunderstrike_charger_state {
  109. THUNDERSTRIKE_CHARGER_STATE_UNKNOWN = 0,
  110. THUNDERSTRIKE_CHARGER_STATE_DISABLED,
  111. THUNDERSTRIKE_CHARGER_STATE_CHARGING,
  112. THUNDERSTRIKE_CHARGER_STATE_FULL,
  113. THUNDERSTRIKE_CHARGER_STATE_FAILED = 8,
  114. } __packed;
  115. static_assert(sizeof(enum thunderstrike_charger_state) == 1);
  116. struct thunderstrike_hostcmd_charger {
  117. u8 connected;
  118. enum thunderstrike_charger_type type;
  119. enum thunderstrike_charger_state state;
  120. } __packed;
  121. struct thunderstrike_hostcmd_board_info {
  122. __le16 revision;
  123. __le16 serial[7];
  124. } __packed;
  125. struct thunderstrike_hostcmd_haptics {
  126. u8 motor_left;
  127. u8 motor_right;
  128. } __packed;
  129. struct thunderstrike_hostcmd_resp_report {
  130. u8 report_id; /* THUNDERSTRIKE_HOSTCMD_RESP_REPORT_ID */
  131. u8 cmd_id;
  132. u8 reserved_at_10;
  133. union {
  134. struct thunderstrike_hostcmd_board_info board_info;
  135. struct thunderstrike_hostcmd_haptics motors;
  136. __le16 fw_version;
  137. enum thunderstrike_led_state led_state;
  138. struct thunderstrike_hostcmd_battery battery;
  139. struct thunderstrike_hostcmd_charger charger;
  140. u8 payload[30];
  141. } __packed;
  142. } __packed;
  143. static_assert(sizeof(struct thunderstrike_hostcmd_resp_report) ==
  144. THUNDERSTRIKE_HOSTCMD_REPORT_SIZE);
  145. struct thunderstrike_hostcmd_req_report {
  146. u8 report_id; /* THUNDERSTRIKE_HOSTCMD_REQ_REPORT_ID */
  147. u8 cmd_id;
  148. u8 reserved_at_10;
  149. union {
  150. struct __packed {
  151. u8 update;
  152. enum thunderstrike_led_state state;
  153. } led;
  154. struct __packed {
  155. u8 update;
  156. struct thunderstrike_hostcmd_haptics motors;
  157. } haptics;
  158. } __packed;
  159. u8 reserved_at_30[27];
  160. } __packed;
  161. static_assert(sizeof(struct thunderstrike_hostcmd_req_report) ==
  162. THUNDERSTRIKE_HOSTCMD_REPORT_SIZE);
  163. /* Common struct for shield accessories. */
  164. struct shield_device {
  165. struct hid_device *hdev;
  166. struct power_supply_dev battery_dev;
  167. unsigned long initialized_flags;
  168. const char *codename;
  169. u16 fw_version;
  170. struct {
  171. u16 revision;
  172. char serial_number[15];
  173. } board_info;
  174. };
  175. /*
  176. * Non-trivial to uniquely identify Thunderstrike controllers at initialization
  177. * time. Use an ID allocator to help with this.
  178. */
  179. static DEFINE_IDA(thunderstrike_ida);
  180. struct thunderstrike {
  181. struct shield_device base;
  182. int id;
  183. /* Sub-devices */
  184. struct input_dev *haptics_dev;
  185. struct led_classdev led_dev;
  186. /* Resources */
  187. void *req_report_dmabuf;
  188. unsigned long update_flags;
  189. struct thunderstrike_hostcmd_haptics haptics_val;
  190. spinlock_t haptics_update_lock;
  191. u8 led_state : 1;
  192. enum thunderstrike_led_state led_value;
  193. struct thunderstrike_psy_prop_values psy_stats;
  194. spinlock_t psy_stats_lock;
  195. struct timer_list psy_stats_timer;
  196. struct work_struct hostcmd_req_work;
  197. };
  198. static inline void thunderstrike_hostcmd_req_report_init(
  199. struct thunderstrike_hostcmd_req_report *report, u8 cmd_id)
  200. {
  201. memset(report, 0, sizeof(*report));
  202. report->report_id = THUNDERSTRIKE_HOSTCMD_REQ_REPORT_ID;
  203. report->cmd_id = cmd_id;
  204. }
  205. static inline void shield_strrev(char *dest, size_t len, u16 rev)
  206. {
  207. dest[0] = ('A' - 1) + (rev >> 8);
  208. snprintf(&dest[1], len - 1, "%02X", 0xff & rev);
  209. }
  210. static struct input_dev *shield_allocate_input_dev(struct hid_device *hdev,
  211. const char *name_suffix)
  212. {
  213. struct input_dev *idev;
  214. idev = input_allocate_device();
  215. if (!idev)
  216. goto err_device;
  217. idev->id.bustype = hdev->bus;
  218. idev->id.vendor = hdev->vendor;
  219. idev->id.product = hdev->product;
  220. idev->id.version = hdev->version;
  221. idev->uniq = hdev->uniq;
  222. idev->name = devm_kasprintf(&hdev->dev, GFP_KERNEL, "%s %s", hdev->name,
  223. name_suffix);
  224. if (!idev->name)
  225. goto err_name;
  226. input_set_drvdata(idev, hdev);
  227. return idev;
  228. err_name:
  229. input_free_device(idev);
  230. err_device:
  231. return ERR_PTR(-ENOMEM);
  232. }
  233. static struct input_dev *shield_haptics_create(
  234. struct shield_device *dev,
  235. int (*play_effect)(struct input_dev *, void *, struct ff_effect *))
  236. {
  237. struct input_dev *haptics;
  238. int ret;
  239. if (!IS_ENABLED(CONFIG_NVIDIA_SHIELD_FF))
  240. return NULL;
  241. haptics = shield_allocate_input_dev(dev->hdev, "Haptics");
  242. if (IS_ERR(haptics))
  243. return haptics;
  244. input_set_capability(haptics, EV_FF, FF_RUMBLE);
  245. ret = input_ff_create_memless(haptics, NULL, play_effect);
  246. if (ret)
  247. goto err;
  248. ret = input_register_device(haptics);
  249. if (ret)
  250. goto err;
  251. return haptics;
  252. err:
  253. input_free_device(haptics);
  254. return ERR_PTR(ret);
  255. }
  256. static inline void thunderstrike_send_hostcmd_request(struct thunderstrike *ts)
  257. {
  258. struct thunderstrike_hostcmd_req_report *report = ts->req_report_dmabuf;
  259. struct shield_device *shield_dev = &ts->base;
  260. int ret;
  261. ret = hid_hw_raw_request(shield_dev->hdev, report->report_id,
  262. ts->req_report_dmabuf,
  263. THUNDERSTRIKE_HOSTCMD_REPORT_SIZE,
  264. HID_OUTPUT_REPORT, HID_REQ_SET_REPORT);
  265. if (ret < 0) {
  266. hid_err(shield_dev->hdev,
  267. "Failed to output Thunderstrike HOSTCMD request HID report due to %pe\n",
  268. ERR_PTR(ret));
  269. }
  270. }
  271. static void thunderstrike_hostcmd_req_work_handler(struct work_struct *work)
  272. {
  273. struct thunderstrike *ts =
  274. container_of(work, struct thunderstrike, hostcmd_req_work);
  275. struct thunderstrike_hostcmd_req_report *report;
  276. unsigned long flags;
  277. report = ts->req_report_dmabuf;
  278. if (test_and_clear_bit(THUNDERSTRIKE_FW_VERSION_UPDATE, &ts->update_flags)) {
  279. thunderstrike_hostcmd_req_report_init(
  280. report, THUNDERSTRIKE_HOSTCMD_ID_FW_VERSION);
  281. thunderstrike_send_hostcmd_request(ts);
  282. }
  283. if (test_and_clear_bit(THUNDERSTRIKE_LED_UPDATE, &ts->update_flags)) {
  284. thunderstrike_hostcmd_req_report_init(report, THUNDERSTRIKE_HOSTCMD_ID_LED);
  285. report->led.update = 1;
  286. report->led.state = ts->led_value;
  287. thunderstrike_send_hostcmd_request(ts);
  288. }
  289. if (test_and_clear_bit(THUNDERSTRIKE_POWER_SUPPLY_STATS_UPDATE, &ts->update_flags)) {
  290. thunderstrike_hostcmd_req_report_init(
  291. report, THUNDERSTRIKE_HOSTCMD_ID_BATTERY);
  292. thunderstrike_send_hostcmd_request(ts);
  293. thunderstrike_hostcmd_req_report_init(
  294. report, THUNDERSTRIKE_HOSTCMD_ID_CHARGER);
  295. thunderstrike_send_hostcmd_request(ts);
  296. }
  297. if (test_and_clear_bit(THUNDERSTRIKE_BOARD_INFO_UPDATE, &ts->update_flags)) {
  298. thunderstrike_hostcmd_req_report_init(
  299. report, THUNDERSTRIKE_HOSTCMD_ID_BOARD_INFO);
  300. thunderstrike_send_hostcmd_request(ts);
  301. }
  302. if (test_and_clear_bit(THUNDERSTRIKE_HAPTICS_UPDATE, &ts->update_flags)) {
  303. thunderstrike_hostcmd_req_report_init(
  304. report, THUNDERSTRIKE_HOSTCMD_ID_HAPTICS);
  305. report->haptics.update = 1;
  306. spin_lock_irqsave(&ts->haptics_update_lock, flags);
  307. report->haptics.motors = ts->haptics_val;
  308. spin_unlock_irqrestore(&ts->haptics_update_lock, flags);
  309. thunderstrike_send_hostcmd_request(ts);
  310. }
  311. }
  312. static inline void thunderstrike_request_firmware_version(struct thunderstrike *ts)
  313. {
  314. set_bit(THUNDERSTRIKE_FW_VERSION_UPDATE, &ts->update_flags);
  315. schedule_work(&ts->hostcmd_req_work);
  316. }
  317. static inline void thunderstrike_request_board_info(struct thunderstrike *ts)
  318. {
  319. set_bit(THUNDERSTRIKE_BOARD_INFO_UPDATE, &ts->update_flags);
  320. schedule_work(&ts->hostcmd_req_work);
  321. }
  322. static inline int
  323. thunderstrike_update_haptics(struct thunderstrike *ts,
  324. struct thunderstrike_hostcmd_haptics *motors)
  325. {
  326. unsigned long flags;
  327. spin_lock_irqsave(&ts->haptics_update_lock, flags);
  328. ts->haptics_val = *motors;
  329. spin_unlock_irqrestore(&ts->haptics_update_lock, flags);
  330. set_bit(THUNDERSTRIKE_HAPTICS_UPDATE, &ts->update_flags);
  331. schedule_work(&ts->hostcmd_req_work);
  332. return 0;
  333. }
  334. static int thunderstrike_play_effect(struct input_dev *idev, void *data,
  335. struct ff_effect *effect)
  336. {
  337. struct hid_device *hdev = input_get_drvdata(idev);
  338. struct thunderstrike_hostcmd_haptics motors;
  339. struct shield_device *shield_dev;
  340. struct thunderstrike *ts;
  341. if (effect->type != FF_RUMBLE)
  342. return 0;
  343. shield_dev = hid_get_drvdata(hdev);
  344. ts = container_of(shield_dev, struct thunderstrike, base);
  345. /* Thunderstrike motor values range from 0 to 32 inclusively */
  346. motors.motor_left = effect->u.rumble.strong_magnitude / 2047;
  347. motors.motor_right = effect->u.rumble.weak_magnitude / 2047;
  348. hid_dbg(hdev, "Thunderstrike FF_RUMBLE request, left: %u right: %u\n",
  349. motors.motor_left, motors.motor_right);
  350. return thunderstrike_update_haptics(ts, &motors);
  351. }
  352. static enum led_brightness
  353. thunderstrike_led_get_brightness(struct led_classdev *led)
  354. {
  355. struct hid_device *hdev = to_hid_device(led->dev->parent);
  356. struct shield_device *shield_dev = hid_get_drvdata(hdev);
  357. struct thunderstrike *ts;
  358. ts = container_of(shield_dev, struct thunderstrike, base);
  359. return ts->led_state;
  360. }
  361. static void thunderstrike_led_set_brightness(struct led_classdev *led,
  362. enum led_brightness value)
  363. {
  364. struct hid_device *hdev = to_hid_device(led->dev->parent);
  365. struct shield_device *shield_dev = hid_get_drvdata(hdev);
  366. struct thunderstrike *ts;
  367. ts = container_of(shield_dev, struct thunderstrike, base);
  368. switch (value) {
  369. case LED_OFF:
  370. ts->led_value = THUNDERSTRIKE_LED_OFF;
  371. break;
  372. default:
  373. ts->led_value = THUNDERSTRIKE_LED_ON;
  374. break;
  375. }
  376. set_bit(THUNDERSTRIKE_LED_UPDATE, &ts->update_flags);
  377. schedule_work(&ts->hostcmd_req_work);
  378. }
  379. static int thunderstrike_battery_get_property(struct power_supply *psy,
  380. enum power_supply_property psp,
  381. union power_supply_propval *val)
  382. {
  383. struct shield_device *shield_dev = power_supply_get_drvdata(psy);
  384. struct thunderstrike_psy_prop_values prop_values;
  385. struct thunderstrike *ts;
  386. int ret = 0;
  387. ts = container_of(shield_dev, struct thunderstrike, base);
  388. spin_lock(&ts->psy_stats_lock);
  389. prop_values = ts->psy_stats;
  390. spin_unlock(&ts->psy_stats_lock);
  391. switch (psp) {
  392. case POWER_SUPPLY_PROP_STATUS:
  393. val->intval = prop_values.status;
  394. break;
  395. case POWER_SUPPLY_PROP_CHARGE_TYPE:
  396. val->intval = prop_values.charge_type;
  397. break;
  398. case POWER_SUPPLY_PROP_PRESENT:
  399. val->intval = 1;
  400. break;
  401. case POWER_SUPPLY_PROP_VOLTAGE_MIN:
  402. val->intval = prop_values.voltage_min;
  403. break;
  404. case POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN:
  405. val->intval = 2900000; /* 2.9 V */
  406. break;
  407. case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN:
  408. val->intval = 2200000; /* 2.2 V */
  409. break;
  410. case POWER_SUPPLY_PROP_VOLTAGE_NOW:
  411. val->intval = prop_values.voltage_now;
  412. break;
  413. case POWER_SUPPLY_PROP_VOLTAGE_AVG:
  414. val->intval = prop_values.voltage_avg;
  415. break;
  416. case POWER_SUPPLY_PROP_VOLTAGE_BOOT:
  417. val->intval = prop_values.voltage_boot;
  418. break;
  419. case POWER_SUPPLY_PROP_CAPACITY:
  420. val->intval = prop_values.capacity;
  421. break;
  422. case POWER_SUPPLY_PROP_SCOPE:
  423. val->intval = POWER_SUPPLY_SCOPE_DEVICE;
  424. break;
  425. case POWER_SUPPLY_PROP_TEMP:
  426. val->intval = prop_values.temp;
  427. break;
  428. case POWER_SUPPLY_PROP_TEMP_MIN:
  429. val->intval = 0; /* 0 C */
  430. break;
  431. case POWER_SUPPLY_PROP_TEMP_MAX:
  432. val->intval = 400; /* 40 C */
  433. break;
  434. case POWER_SUPPLY_PROP_TEMP_ALERT_MIN:
  435. val->intval = 15; /* 1.5 C */
  436. break;
  437. case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
  438. val->intval = 380; /* 38 C */
  439. break;
  440. default:
  441. ret = -EINVAL;
  442. break;
  443. }
  444. return ret;
  445. }
  446. static inline void thunderstrike_request_psy_stats(struct thunderstrike *ts)
  447. {
  448. set_bit(THUNDERSTRIKE_POWER_SUPPLY_STATS_UPDATE, &ts->update_flags);
  449. schedule_work(&ts->hostcmd_req_work);
  450. }
  451. static void thunderstrike_psy_stats_timer_handler(struct timer_list *timer)
  452. {
  453. struct thunderstrike *ts =
  454. container_of(timer, struct thunderstrike, psy_stats_timer);
  455. thunderstrike_request_psy_stats(ts);
  456. /* Query battery statistics from device every five minutes */
  457. mod_timer(timer, jiffies + 300 * HZ);
  458. }
  459. static void
  460. thunderstrike_parse_fw_version_payload(struct shield_device *shield_dev,
  461. __le16 fw_version)
  462. {
  463. shield_dev->fw_version = le16_to_cpu(fw_version);
  464. set_bit(SHIELD_FW_VERSION_INITIALIZED, &shield_dev->initialized_flags);
  465. hid_dbg(shield_dev->hdev, "Thunderstrike firmware version 0x%04X\n",
  466. shield_dev->fw_version);
  467. }
  468. static void
  469. thunderstrike_parse_board_info_payload(struct shield_device *shield_dev,
  470. struct thunderstrike_hostcmd_board_info *board_info)
  471. {
  472. char board_revision_str[4];
  473. int i;
  474. shield_dev->board_info.revision = le16_to_cpu(board_info->revision);
  475. for (i = 0; i < 7; ++i) {
  476. u16 val = le16_to_cpu(board_info->serial[i]);
  477. shield_dev->board_info.serial_number[2 * i] = val & 0xFF;
  478. shield_dev->board_info.serial_number[2 * i + 1] = val >> 8;
  479. }
  480. shield_dev->board_info.serial_number[14] = '\0';
  481. set_bit(SHIELD_BOARD_INFO_INITIALIZED, &shield_dev->initialized_flags);
  482. shield_strrev(board_revision_str, 4, shield_dev->board_info.revision);
  483. hid_dbg(shield_dev->hdev,
  484. "Thunderstrike BOARD_REVISION_%s (0x%04X) S/N: %s\n",
  485. board_revision_str, shield_dev->board_info.revision,
  486. shield_dev->board_info.serial_number);
  487. }
  488. static inline void
  489. thunderstrike_parse_haptics_payload(struct shield_device *shield_dev,
  490. struct thunderstrike_hostcmd_haptics *haptics)
  491. {
  492. hid_dbg(shield_dev->hdev,
  493. "Thunderstrike haptics HOSTCMD response, left: %u right: %u\n",
  494. haptics->motor_left, haptics->motor_right);
  495. }
  496. static void
  497. thunderstrike_parse_led_payload(struct shield_device *shield_dev,
  498. enum thunderstrike_led_state led_state)
  499. {
  500. struct thunderstrike *ts = container_of(shield_dev, struct thunderstrike, base);
  501. switch (led_state) {
  502. case THUNDERSTRIKE_LED_OFF:
  503. ts->led_state = 0;
  504. break;
  505. case THUNDERSTRIKE_LED_ON:
  506. ts->led_state = 1;
  507. break;
  508. }
  509. hid_dbg(shield_dev->hdev, "Thunderstrike led HOSTCMD response, 0x%02X\n", led_state);
  510. }
  511. static void thunderstrike_parse_battery_payload(
  512. struct shield_device *shield_dev,
  513. struct thunderstrike_hostcmd_battery *battery)
  514. {
  515. struct thunderstrike *ts = container_of(shield_dev, struct thunderstrike, base);
  516. u16 hostcmd_voltage_boot = le16_to_cpu(battery->voltage_boot);
  517. u16 hostcmd_voltage_avg = le16_to_cpu(battery->voltage_avg);
  518. u16 hostcmd_voltage_min = le16_to_cpu(battery->voltage_min);
  519. u16 hostcmd_voltage_now = le16_to_cpu(battery->voltage_now);
  520. u16 hostcmd_thermistor = le16_to_cpu(battery->thermistor);
  521. int voltage_boot, voltage_avg, voltage_min, voltage_now;
  522. struct hid_device *hdev = shield_dev->hdev;
  523. u8 capacity = battery->capacity;
  524. int temp;
  525. /* Convert thunderstrike device values to µV and tenths of degree Celsius */
  526. voltage_boot = hostcmd_voltage_boot * 1000;
  527. voltage_avg = hostcmd_voltage_avg * 1000;
  528. voltage_min = hostcmd_voltage_min * 1000;
  529. voltage_now = hostcmd_voltage_now * 1000;
  530. temp = (1378 - (int)hostcmd_thermistor) * 10 / 19;
  531. /* Copy converted values */
  532. spin_lock(&ts->psy_stats_lock);
  533. ts->psy_stats.voltage_boot = voltage_boot;
  534. ts->psy_stats.voltage_avg = voltage_avg;
  535. ts->psy_stats.voltage_min = voltage_min;
  536. ts->psy_stats.voltage_now = voltage_now;
  537. ts->psy_stats.capacity = capacity;
  538. ts->psy_stats.temp = temp;
  539. spin_unlock(&ts->psy_stats_lock);
  540. set_bit(SHIELD_BATTERY_STATS_INITIALIZED, &shield_dev->initialized_flags);
  541. hid_dbg(hdev,
  542. "Thunderstrike battery HOSTCMD response, voltage_avg: %u voltage_now: %u\n",
  543. hostcmd_voltage_avg, hostcmd_voltage_now);
  544. hid_dbg(hdev,
  545. "Thunderstrike battery HOSTCMD response, voltage_boot: %u voltage_min: %u\n",
  546. hostcmd_voltage_boot, hostcmd_voltage_min);
  547. hid_dbg(hdev,
  548. "Thunderstrike battery HOSTCMD response, thermistor: %u\n",
  549. hostcmd_thermistor);
  550. hid_dbg(hdev,
  551. "Thunderstrike battery HOSTCMD response, capacity: %u%%\n",
  552. capacity);
  553. }
  554. static void thunderstrike_parse_charger_payload(
  555. struct shield_device *shield_dev,
  556. struct thunderstrike_hostcmd_charger *charger)
  557. {
  558. struct thunderstrike *ts = container_of(shield_dev, struct thunderstrike, base);
  559. int charge_type = POWER_SUPPLY_CHARGE_TYPE_UNKNOWN;
  560. struct hid_device *hdev = shield_dev->hdev;
  561. int status = POWER_SUPPLY_STATUS_UNKNOWN;
  562. switch (charger->type) {
  563. case THUNDERSTRIKE_CHARGER_TYPE_NONE:
  564. charge_type = POWER_SUPPLY_CHARGE_TYPE_NONE;
  565. break;
  566. case THUNDERSTRIKE_CHARGER_TYPE_TRICKLE:
  567. charge_type = POWER_SUPPLY_CHARGE_TYPE_TRICKLE;
  568. break;
  569. case THUNDERSTRIKE_CHARGER_TYPE_NORMAL:
  570. charge_type = POWER_SUPPLY_CHARGE_TYPE_STANDARD;
  571. break;
  572. default:
  573. hid_warn(hdev, "Unhandled Thunderstrike charger HOSTCMD type, %u\n",
  574. charger->type);
  575. break;
  576. }
  577. switch (charger->state) {
  578. case THUNDERSTRIKE_CHARGER_STATE_UNKNOWN:
  579. status = POWER_SUPPLY_STATUS_UNKNOWN;
  580. break;
  581. case THUNDERSTRIKE_CHARGER_STATE_DISABLED:
  582. /* Indicates charger is disconnected */
  583. break;
  584. case THUNDERSTRIKE_CHARGER_STATE_CHARGING:
  585. status = POWER_SUPPLY_STATUS_CHARGING;
  586. break;
  587. case THUNDERSTRIKE_CHARGER_STATE_FULL:
  588. status = POWER_SUPPLY_STATUS_FULL;
  589. break;
  590. case THUNDERSTRIKE_CHARGER_STATE_FAILED:
  591. status = POWER_SUPPLY_STATUS_NOT_CHARGING;
  592. hid_err(hdev, "Thunderstrike device failed to charge\n");
  593. break;
  594. default:
  595. hid_warn(hdev, "Unhandled Thunderstrike charger HOSTCMD state, %u\n",
  596. charger->state);
  597. break;
  598. }
  599. if (!charger->connected)
  600. status = POWER_SUPPLY_STATUS_DISCHARGING;
  601. spin_lock(&ts->psy_stats_lock);
  602. ts->psy_stats.charge_type = charge_type;
  603. ts->psy_stats.status = status;
  604. spin_unlock(&ts->psy_stats_lock);
  605. set_bit(SHIELD_CHARGER_STATE_INITIALIZED, &shield_dev->initialized_flags);
  606. hid_dbg(hdev,
  607. "Thunderstrike charger HOSTCMD response, connected: %u, type: %u, state: %u\n",
  608. charger->connected, charger->type, charger->state);
  609. }
  610. static inline void thunderstrike_device_init_info(struct shield_device *shield_dev)
  611. {
  612. struct thunderstrike *ts =
  613. container_of(shield_dev, struct thunderstrike, base);
  614. if (!test_bit(SHIELD_FW_VERSION_INITIALIZED, &shield_dev->initialized_flags))
  615. thunderstrike_request_firmware_version(ts);
  616. if (!test_bit(SHIELD_BOARD_INFO_INITIALIZED, &shield_dev->initialized_flags))
  617. thunderstrike_request_board_info(ts);
  618. if (!test_bit(SHIELD_BATTERY_STATS_INITIALIZED, &shield_dev->initialized_flags) ||
  619. !test_bit(SHIELD_CHARGER_STATE_INITIALIZED, &shield_dev->initialized_flags))
  620. thunderstrike_psy_stats_timer_handler(&ts->psy_stats_timer);
  621. }
  622. static int thunderstrike_parse_report(struct shield_device *shield_dev,
  623. struct hid_report *report, u8 *data,
  624. int size)
  625. {
  626. struct thunderstrike_hostcmd_resp_report *hostcmd_resp_report;
  627. struct hid_device *hdev = shield_dev->hdev;
  628. switch (report->id) {
  629. case THUNDERSTRIKE_HOSTCMD_RESP_REPORT_ID:
  630. if (size != THUNDERSTRIKE_HOSTCMD_REPORT_SIZE) {
  631. hid_err(hdev,
  632. "Encountered Thunderstrike HOSTCMD HID report with unexpected size %d\n",
  633. size);
  634. return -EINVAL;
  635. }
  636. hostcmd_resp_report =
  637. (struct thunderstrike_hostcmd_resp_report *)data;
  638. switch (hostcmd_resp_report->cmd_id) {
  639. case THUNDERSTRIKE_HOSTCMD_ID_FW_VERSION:
  640. thunderstrike_parse_fw_version_payload(
  641. shield_dev, hostcmd_resp_report->fw_version);
  642. break;
  643. case THUNDERSTRIKE_HOSTCMD_ID_LED:
  644. thunderstrike_parse_led_payload(shield_dev, hostcmd_resp_report->led_state);
  645. break;
  646. case THUNDERSTRIKE_HOSTCMD_ID_BATTERY:
  647. thunderstrike_parse_battery_payload(shield_dev,
  648. &hostcmd_resp_report->battery);
  649. break;
  650. case THUNDERSTRIKE_HOSTCMD_ID_BOARD_INFO:
  651. thunderstrike_parse_board_info_payload(
  652. shield_dev, &hostcmd_resp_report->board_info);
  653. break;
  654. case THUNDERSTRIKE_HOSTCMD_ID_HAPTICS:
  655. thunderstrike_parse_haptics_payload(
  656. shield_dev, &hostcmd_resp_report->motors);
  657. break;
  658. case THUNDERSTRIKE_HOSTCMD_ID_USB_INIT:
  659. /* May block HOSTCMD requests till received initially */
  660. thunderstrike_device_init_info(shield_dev);
  661. break;
  662. case THUNDERSTRIKE_HOSTCMD_ID_CHARGER:
  663. /* May block HOSTCMD requests till received initially */
  664. thunderstrike_device_init_info(shield_dev);
  665. thunderstrike_parse_charger_payload(
  666. shield_dev, &hostcmd_resp_report->charger);
  667. break;
  668. default:
  669. hid_warn(hdev,
  670. "Unhandled Thunderstrike HOSTCMD id %d\n",
  671. hostcmd_resp_report->cmd_id);
  672. return -ENOENT;
  673. }
  674. break;
  675. default:
  676. return 0;
  677. }
  678. return 0;
  679. }
  680. static inline int thunderstrike_led_create(struct thunderstrike *ts)
  681. {
  682. struct led_classdev *led = &ts->led_dev;
  683. led->name = devm_kasprintf(&ts->base.hdev->dev, GFP_KERNEL,
  684. "thunderstrike%d:blue:led", ts->id);
  685. if (!led->name)
  686. return -ENOMEM;
  687. led->max_brightness = 1;
  688. led->flags = LED_CORE_SUSPENDRESUME | LED_RETAIN_AT_SHUTDOWN;
  689. led->brightness_get = &thunderstrike_led_get_brightness;
  690. led->brightness_set = &thunderstrike_led_set_brightness;
  691. return led_classdev_register(&ts->base.hdev->dev, led);
  692. }
  693. static inline int thunderstrike_psy_create(struct shield_device *shield_dev)
  694. {
  695. struct thunderstrike *ts = container_of(shield_dev, struct thunderstrike, base);
  696. struct power_supply_config psy_cfg = { .drv_data = shield_dev, };
  697. struct hid_device *hdev = shield_dev->hdev;
  698. int ret;
  699. /*
  700. * Set an initial capacity and temperature value to avoid prematurely
  701. * triggering alerts. Will be replaced by values queried from initial
  702. * HOSTCMD requests.
  703. */
  704. ts->psy_stats.capacity = 100;
  705. ts->psy_stats.temp = 182;
  706. shield_dev->battery_dev.desc.properties = thunderstrike_battery_props;
  707. shield_dev->battery_dev.desc.num_properties =
  708. ARRAY_SIZE(thunderstrike_battery_props);
  709. shield_dev->battery_dev.desc.get_property = thunderstrike_battery_get_property;
  710. shield_dev->battery_dev.desc.type = POWER_SUPPLY_TYPE_BATTERY;
  711. shield_dev->battery_dev.desc.name =
  712. devm_kasprintf(&ts->base.hdev->dev, GFP_KERNEL,
  713. "thunderstrike_%d", ts->id);
  714. if (!shield_dev->battery_dev.desc.name)
  715. return -ENOMEM;
  716. shield_dev->battery_dev.psy = power_supply_register(
  717. &hdev->dev, &shield_dev->battery_dev.desc, &psy_cfg);
  718. if (IS_ERR(shield_dev->battery_dev.psy)) {
  719. hid_err(hdev, "Failed to register Thunderstrike battery device\n");
  720. return PTR_ERR(shield_dev->battery_dev.psy);
  721. }
  722. ret = power_supply_powers(shield_dev->battery_dev.psy, &hdev->dev);
  723. if (ret) {
  724. hid_err(hdev, "Failed to associate battery device to Thunderstrike\n");
  725. goto err;
  726. }
  727. return 0;
  728. err:
  729. power_supply_unregister(shield_dev->battery_dev.psy);
  730. return ret;
  731. }
  732. static struct shield_device *thunderstrike_create(struct hid_device *hdev)
  733. {
  734. struct shield_device *shield_dev;
  735. struct thunderstrike *ts;
  736. int ret;
  737. ts = devm_kzalloc(&hdev->dev, sizeof(*ts), GFP_KERNEL);
  738. if (!ts)
  739. return ERR_PTR(-ENOMEM);
  740. ts->req_report_dmabuf = devm_kzalloc(
  741. &hdev->dev, THUNDERSTRIKE_HOSTCMD_REPORT_SIZE, GFP_KERNEL);
  742. if (!ts->req_report_dmabuf)
  743. return ERR_PTR(-ENOMEM);
  744. shield_dev = &ts->base;
  745. shield_dev->hdev = hdev;
  746. shield_dev->codename = "Thunderstrike";
  747. spin_lock_init(&ts->haptics_update_lock);
  748. spin_lock_init(&ts->psy_stats_lock);
  749. INIT_WORK(&ts->hostcmd_req_work, thunderstrike_hostcmd_req_work_handler);
  750. hid_set_drvdata(hdev, shield_dev);
  751. ts->id = ida_alloc(&thunderstrike_ida, GFP_KERNEL);
  752. if (ts->id < 0)
  753. return ERR_PTR(ts->id);
  754. ts->haptics_dev = shield_haptics_create(shield_dev, thunderstrike_play_effect);
  755. if (IS_ERR(ts->haptics_dev)) {
  756. hid_err(hdev, "Failed to create Thunderstrike haptics instance\n");
  757. ret = PTR_ERR(ts->haptics_dev);
  758. goto err_id;
  759. }
  760. ret = thunderstrike_psy_create(shield_dev);
  761. if (ret) {
  762. hid_err(hdev, "Failed to create Thunderstrike power supply instance\n");
  763. goto err_haptics;
  764. }
  765. ret = thunderstrike_led_create(ts);
  766. if (ret) {
  767. hid_err(hdev, "Failed to create Thunderstrike LED instance\n");
  768. goto err_psy;
  769. }
  770. timer_setup(&ts->psy_stats_timer, thunderstrike_psy_stats_timer_handler, 0);
  771. hid_info(hdev, "Registered Thunderstrike controller\n");
  772. return shield_dev;
  773. err_psy:
  774. power_supply_unregister(shield_dev->battery_dev.psy);
  775. err_haptics:
  776. if (ts->haptics_dev)
  777. input_unregister_device(ts->haptics_dev);
  778. err_id:
  779. ida_free(&thunderstrike_ida, ts->id);
  780. return ERR_PTR(ret);
  781. }
  782. static void thunderstrike_destroy(struct thunderstrike *ts)
  783. {
  784. led_classdev_unregister(&ts->led_dev);
  785. power_supply_unregister(ts->base.battery_dev.psy);
  786. if (ts->haptics_dev)
  787. input_unregister_device(ts->haptics_dev);
  788. ida_free(&thunderstrike_ida, ts->id);
  789. }
  790. static int android_input_mapping(struct hid_device *hdev, struct hid_input *hi,
  791. struct hid_field *field,
  792. struct hid_usage *usage, unsigned long **bit,
  793. int *max)
  794. {
  795. if ((usage->hid & HID_USAGE_PAGE) != HID_UP_CONSUMER)
  796. return 0;
  797. switch (usage->hid & HID_USAGE) {
  798. case HID_USAGE_ANDROID_PLAYPAUSE_BTN:
  799. android_map_key(KEY_PLAYPAUSE);
  800. break;
  801. case HID_USAGE_ANDROID_VOLUMEUP_BTN:
  802. android_map_key(KEY_VOLUMEUP);
  803. break;
  804. case HID_USAGE_ANDROID_VOLUMEDOWN_BTN:
  805. android_map_key(KEY_VOLUMEDOWN);
  806. break;
  807. case HID_USAGE_ANDROID_SEARCH_BTN:
  808. android_map_key(BTN_Z);
  809. break;
  810. case HID_USAGE_ANDROID_HOME_BTN:
  811. android_map_key(BTN_MODE);
  812. break;
  813. case HID_USAGE_ANDROID_BACK_BTN:
  814. android_map_key(BTN_SELECT);
  815. break;
  816. default:
  817. return 0;
  818. }
  819. return 1;
  820. }
  821. static ssize_t firmware_version_show(struct device *dev,
  822. struct device_attribute *attr, char *buf)
  823. {
  824. struct hid_device *hdev = to_hid_device(dev);
  825. struct shield_device *shield_dev;
  826. int ret;
  827. shield_dev = hid_get_drvdata(hdev);
  828. if (test_bit(SHIELD_FW_VERSION_INITIALIZED, &shield_dev->initialized_flags))
  829. ret = sysfs_emit(buf, "0x%04X\n", shield_dev->fw_version);
  830. else
  831. ret = sysfs_emit(buf, NOT_INIT_STR "\n");
  832. return ret;
  833. }
  834. static DEVICE_ATTR_RO(firmware_version);
  835. static ssize_t hardware_version_show(struct device *dev,
  836. struct device_attribute *attr, char *buf)
  837. {
  838. struct hid_device *hdev = to_hid_device(dev);
  839. struct shield_device *shield_dev;
  840. char board_revision_str[4];
  841. int ret;
  842. shield_dev = hid_get_drvdata(hdev);
  843. if (test_bit(SHIELD_BOARD_INFO_INITIALIZED, &shield_dev->initialized_flags)) {
  844. shield_strrev(board_revision_str, 4, shield_dev->board_info.revision);
  845. ret = sysfs_emit(buf, "%s BOARD_REVISION_%s (0x%04X)\n",
  846. shield_dev->codename, board_revision_str,
  847. shield_dev->board_info.revision);
  848. } else
  849. ret = sysfs_emit(buf, NOT_INIT_STR "\n");
  850. return ret;
  851. }
  852. static DEVICE_ATTR_RO(hardware_version);
  853. static ssize_t serial_number_show(struct device *dev,
  854. struct device_attribute *attr, char *buf)
  855. {
  856. struct hid_device *hdev = to_hid_device(dev);
  857. struct shield_device *shield_dev;
  858. int ret;
  859. shield_dev = hid_get_drvdata(hdev);
  860. if (test_bit(SHIELD_BOARD_INFO_INITIALIZED, &shield_dev->initialized_flags))
  861. ret = sysfs_emit(buf, "%s\n", shield_dev->board_info.serial_number);
  862. else
  863. ret = sysfs_emit(buf, NOT_INIT_STR "\n");
  864. return ret;
  865. }
  866. static DEVICE_ATTR_RO(serial_number);
  867. static struct attribute *shield_device_attrs[] = {
  868. &dev_attr_firmware_version.attr,
  869. &dev_attr_hardware_version.attr,
  870. &dev_attr_serial_number.attr,
  871. NULL,
  872. };
  873. ATTRIBUTE_GROUPS(shield_device);
  874. static int shield_raw_event(struct hid_device *hdev, struct hid_report *report,
  875. u8 *data, int size)
  876. {
  877. struct shield_device *dev = hid_get_drvdata(hdev);
  878. return thunderstrike_parse_report(dev, report, data, size);
  879. }
  880. static int shield_probe(struct hid_device *hdev, const struct hid_device_id *id)
  881. {
  882. struct shield_device *shield_dev = NULL;
  883. struct thunderstrike *ts;
  884. int ret;
  885. ret = hid_parse(hdev);
  886. if (ret) {
  887. hid_err(hdev, "Parse failed\n");
  888. return ret;
  889. }
  890. switch (id->product) {
  891. case USB_DEVICE_ID_NVIDIA_THUNDERSTRIKE_CONTROLLER:
  892. shield_dev = thunderstrike_create(hdev);
  893. break;
  894. }
  895. if (unlikely(!shield_dev)) {
  896. hid_err(hdev, "Failed to identify SHIELD device\n");
  897. return -ENODEV;
  898. }
  899. if (IS_ERR(shield_dev)) {
  900. hid_err(hdev, "Failed to create SHIELD device\n");
  901. return PTR_ERR(shield_dev);
  902. }
  903. ts = container_of(shield_dev, struct thunderstrike, base);
  904. ret = hid_hw_start(hdev, HID_CONNECT_HIDINPUT);
  905. if (ret) {
  906. hid_err(hdev, "Failed to start HID device\n");
  907. goto err_ts_create;
  908. }
  909. ret = hid_hw_open(hdev);
  910. if (ret) {
  911. hid_err(hdev, "Failed to open HID device\n");
  912. goto err_stop;
  913. }
  914. thunderstrike_device_init_info(shield_dev);
  915. return ret;
  916. err_stop:
  917. hid_hw_stop(hdev);
  918. err_ts_create:
  919. thunderstrike_destroy(ts);
  920. return ret;
  921. }
  922. static void shield_remove(struct hid_device *hdev)
  923. {
  924. struct shield_device *dev = hid_get_drvdata(hdev);
  925. struct thunderstrike *ts;
  926. ts = container_of(dev, struct thunderstrike, base);
  927. hid_hw_close(hdev);
  928. thunderstrike_destroy(ts);
  929. del_timer_sync(&ts->psy_stats_timer);
  930. cancel_work_sync(&ts->hostcmd_req_work);
  931. hid_hw_stop(hdev);
  932. }
  933. static const struct hid_device_id shield_devices[] = {
  934. { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_NVIDIA,
  935. USB_DEVICE_ID_NVIDIA_THUNDERSTRIKE_CONTROLLER) },
  936. { HID_USB_DEVICE(USB_VENDOR_ID_NVIDIA,
  937. USB_DEVICE_ID_NVIDIA_THUNDERSTRIKE_CONTROLLER) },
  938. { }
  939. };
  940. MODULE_DEVICE_TABLE(hid, shield_devices);
  941. static struct hid_driver shield_driver = {
  942. .name = "shield",
  943. .id_table = shield_devices,
  944. .input_mapping = android_input_mapping,
  945. .probe = shield_probe,
  946. .remove = shield_remove,
  947. .raw_event = shield_raw_event,
  948. .driver = {
  949. .dev_groups = shield_device_groups,
  950. },
  951. };
  952. module_hid_driver(shield_driver);
  953. MODULE_AUTHOR("Rahul Rameshbabu <rrameshbabu@nvidia.com>");
  954. MODULE_DESCRIPTION("HID Driver for NVIDIA SHIELD peripherals.");
  955. MODULE_LICENSE("GPL");