162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * HID driver for TiVo Slide Bluetooth remote 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (c) 2011 Jarod Wilson <jarod@redhat.com> 662306a36Sopenharmony_ci * based on the hid-topseed driver, which is in turn, based on hid-cherry... 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci/* 1062306a36Sopenharmony_ci */ 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#include <linux/device.h> 1362306a36Sopenharmony_ci#include <linux/hid.h> 1462306a36Sopenharmony_ci#include <linux/module.h> 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci#include "hid-ids.h" 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#define HID_UP_TIVOVENDOR 0xffff0000 1962306a36Sopenharmony_ci#define tivo_map_key_clear(c) hid_map_usage_clear(hi, usage, bit, max, \ 2062306a36Sopenharmony_ci EV_KEY, (c)) 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_cistatic int tivo_input_mapping(struct hid_device *hdev, struct hid_input *hi, 2362306a36Sopenharmony_ci struct hid_field *field, struct hid_usage *usage, 2462306a36Sopenharmony_ci unsigned long **bit, int *max) 2562306a36Sopenharmony_ci{ 2662306a36Sopenharmony_ci switch (usage->hid & HID_USAGE_PAGE) { 2762306a36Sopenharmony_ci case HID_UP_TIVOVENDOR: 2862306a36Sopenharmony_ci switch (usage->hid & HID_USAGE) { 2962306a36Sopenharmony_ci /* TiVo button */ 3062306a36Sopenharmony_ci case 0x3d: tivo_map_key_clear(KEY_MEDIA); break; 3162306a36Sopenharmony_ci /* Live TV */ 3262306a36Sopenharmony_ci case 0x3e: tivo_map_key_clear(KEY_TV); break; 3362306a36Sopenharmony_ci /* Red thumbs down */ 3462306a36Sopenharmony_ci case 0x41: tivo_map_key_clear(KEY_KPMINUS); break; 3562306a36Sopenharmony_ci /* Green thumbs up */ 3662306a36Sopenharmony_ci case 0x42: tivo_map_key_clear(KEY_KPPLUS); break; 3762306a36Sopenharmony_ci default: 3862306a36Sopenharmony_ci return 0; 3962306a36Sopenharmony_ci } 4062306a36Sopenharmony_ci break; 4162306a36Sopenharmony_ci case HID_UP_CONSUMER: 4262306a36Sopenharmony_ci switch (usage->hid & HID_USAGE) { 4362306a36Sopenharmony_ci /* Enter/Last (default mapping: KEY_LAST) */ 4462306a36Sopenharmony_ci case 0x083: tivo_map_key_clear(KEY_ENTER); break; 4562306a36Sopenharmony_ci /* Info (default mapping: KEY_PROPS) */ 4662306a36Sopenharmony_ci case 0x209: tivo_map_key_clear(KEY_INFO); break; 4762306a36Sopenharmony_ci default: 4862306a36Sopenharmony_ci return 0; 4962306a36Sopenharmony_ci } 5062306a36Sopenharmony_ci break; 5162306a36Sopenharmony_ci default: 5262306a36Sopenharmony_ci return 0; 5362306a36Sopenharmony_ci } 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci /* This means we found a matching mapping here, else, look in the 5662306a36Sopenharmony_ci * standard hid mappings in hid-input.c */ 5762306a36Sopenharmony_ci return 1; 5862306a36Sopenharmony_ci} 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_cistatic const struct hid_device_id tivo_devices[] = { 6162306a36Sopenharmony_ci /* TiVo Slide Bluetooth remote, pairs with a Broadcom dongle */ 6262306a36Sopenharmony_ci { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_TIVO, USB_DEVICE_ID_TIVO_SLIDE_BT) }, 6362306a36Sopenharmony_ci { HID_USB_DEVICE(USB_VENDOR_ID_TIVO, USB_DEVICE_ID_TIVO_SLIDE) }, 6462306a36Sopenharmony_ci { HID_USB_DEVICE(USB_VENDOR_ID_TIVO, USB_DEVICE_ID_TIVO_SLIDE_PRO) }, 6562306a36Sopenharmony_ci { } 6662306a36Sopenharmony_ci}; 6762306a36Sopenharmony_ciMODULE_DEVICE_TABLE(hid, tivo_devices); 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_cistatic struct hid_driver tivo_driver = { 7062306a36Sopenharmony_ci .name = "tivo_slide", 7162306a36Sopenharmony_ci .id_table = tivo_devices, 7262306a36Sopenharmony_ci .input_mapping = tivo_input_mapping, 7362306a36Sopenharmony_ci}; 7462306a36Sopenharmony_cimodule_hid_driver(tivo_driver); 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ciMODULE_LICENSE("GPL"); 7762306a36Sopenharmony_ciMODULE_AUTHOR("Jarod Wilson <jarod@redhat.com>"); 78