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

ati_remote.c (28433B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 *  USB ATI Remote support
      4 *
      5 *                Copyright (c) 2011, 2012 Anssi Hannula <anssi.hannula@iki.fi>
      6 *  Version 2.2.0 Copyright (c) 2004 Torrey Hoffman <thoffman@arnor.net>
      7 *  Version 2.1.1 Copyright (c) 2002 Vladimir Dergachev
      8 *
      9 *  This 2.2.0 version is a rewrite / cleanup of the 2.1.1 driver, including
     10 *  porting to the 2.6 kernel interfaces, along with other modification
     11 *  to better match the style of the existing usb/input drivers.  However, the
     12 *  protocol and hardware handling is essentially unchanged from 2.1.1.
     13 *
     14 *  The 2.1.1 driver was derived from the usbati_remote and usbkbd drivers by
     15 *  Vojtech Pavlik.
     16 *
     17 *  Changes:
     18 *
     19 *  Feb 2004: Torrey Hoffman <thoffman@arnor.net>
     20 *            Version 2.2.0
     21 *  Jun 2004: Torrey Hoffman <thoffman@arnor.net>
     22 *            Version 2.2.1
     23 *            Added key repeat support contributed by:
     24 *                Vincent Vanackere <vanackere@lif.univ-mrs.fr>
     25 *            Added support for the "Lola" remote contributed by:
     26 *                Seth Cohn <sethcohn@yahoo.com>
     27 *
     28 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
     29 *
     30 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
     31 *
     32 * Hardware & software notes
     33 *
     34 * These remote controls are distributed by ATI as part of their
     35 * "All-In-Wonder" video card packages.  The receiver self-identifies as a
     36 * "USB Receiver" with manufacturer "X10 Wireless Technology Inc".
     37 *
     38 * The "Lola" remote is available from X10.  See:
     39 *    http://www.x10.com/products/lola_sg1.htm
     40 * The Lola is similar to the ATI remote but has no mouse support, and slightly
     41 * different keys.
     42 *
     43 * It is possible to use multiple receivers and remotes on multiple computers
     44 * simultaneously by configuring them to use specific channels.
     45 *
     46 * The RF protocol used by the remote supports 16 distinct channels, 1 to 16.
     47 * Actually, it may even support more, at least in some revisions of the
     48 * hardware.
     49 *
     50 * Each remote can be configured to transmit on one channel as follows:
     51 *   - Press and hold the "hand icon" button.
     52 *   - When the red LED starts to blink, let go of the "hand icon" button.
     53 *   - When it stops blinking, input the channel code as two digits, from 01
     54 *     to 16, and press the hand icon again.
     55 *
     56 * The timing can be a little tricky.  Try loading the module with debug=1
     57 * to have the kernel print out messages about the remote control number
     58 * and mask.  Note: debugging prints remote numbers as zero-based hexadecimal.
     59 *
     60 * The driver has a "channel_mask" parameter. This bitmask specifies which
     61 * channels will be ignored by the module.  To mask out channels, just add
     62 * all the 2^channel_number values together.
     63 *
     64 * For instance, set channel_mask = 2^4 = 16 (binary 10000) to make ati_remote
     65 * ignore signals coming from remote controls transmitting on channel 4, but
     66 * accept all other channels.
     67 *
     68 * Or, set channel_mask = 65533, (0xFFFD), and all channels except 1 will be
     69 * ignored.
     70 *
     71 * The default is 0 (respond to all channels). Bit 0 and bits 17-32 of this
     72 * parameter are unused.
     73 */
     74
     75#include <linux/kernel.h>
     76#include <linux/errno.h>
     77#include <linux/init.h>
     78#include <linux/slab.h>
     79#include <linux/module.h>
     80#include <linux/mutex.h>
     81#include <linux/usb/input.h>
     82#include <linux/wait.h>
     83#include <linux/jiffies.h>
     84#include <media/rc-core.h>
     85
     86/*
     87 * Module and Version Information, Module Parameters
     88 */
     89
     90#define ATI_REMOTE_VENDOR_ID		0x0bc7
     91#define LOLA_REMOTE_PRODUCT_ID		0x0002
     92#define LOLA2_REMOTE_PRODUCT_ID		0x0003
     93#define ATI_REMOTE_PRODUCT_ID		0x0004
     94#define NVIDIA_REMOTE_PRODUCT_ID	0x0005
     95#define MEDION_REMOTE_PRODUCT_ID	0x0006
     96#define FIREFLY_REMOTE_PRODUCT_ID	0x0008
     97
     98#define DRIVER_VERSION		"2.2.1"
     99#define DRIVER_AUTHOR           "Torrey Hoffman <thoffman@arnor.net>"
    100#define DRIVER_DESC             "ATI/X10 RF USB Remote Control"
    101
    102#define NAME_BUFSIZE      80    /* size of product name, path buffers */
    103#define DATA_BUFSIZE      63    /* size of URB data buffers */
    104
    105/*
    106 * Duplicate event filtering time.
    107 * Sequential, identical KIND_FILTERED inputs with less than
    108 * FILTER_TIME milliseconds between them are considered as repeat
    109 * events. The hardware generates 5 events for the first keypress
    110 * and we have to take this into account for an accurate repeat
    111 * behaviour.
    112 */
    113#define FILTER_TIME	60 /* msec */
    114#define REPEAT_DELAY	500 /* msec */
    115
    116static unsigned long channel_mask;
    117module_param(channel_mask, ulong, 0644);
    118MODULE_PARM_DESC(channel_mask, "Bitmask of remote control channels to ignore");
    119
    120static int debug;
    121module_param(debug, int, 0644);
    122MODULE_PARM_DESC(debug, "Enable extra debug messages and information");
    123
    124static int repeat_filter = FILTER_TIME;
    125module_param(repeat_filter, int, 0644);
    126MODULE_PARM_DESC(repeat_filter, "Repeat filter time, default = 60 msec");
    127
    128static int repeat_delay = REPEAT_DELAY;
    129module_param(repeat_delay, int, 0644);
    130MODULE_PARM_DESC(repeat_delay, "Delay before sending repeats, default = 500 msec");
    131
    132static bool mouse = true;
    133module_param(mouse, bool, 0444);
    134MODULE_PARM_DESC(mouse, "Enable mouse device, default = yes");
    135
    136#define dbginfo(dev, format, arg...) \
    137	do { if (debug) dev_info(dev , format , ## arg); } while (0)
    138#undef err
    139#define err(format, arg...) printk(KERN_ERR format , ## arg)
    140
    141struct ati_receiver_type {
    142	/* either default_keymap or get_default_keymap should be set */
    143	const char *default_keymap;
    144	const char *(*get_default_keymap)(struct usb_interface *interface);
    145};
    146
    147static const char *get_medion_keymap(struct usb_interface *interface)
    148{
    149	struct usb_device *udev = interface_to_usbdev(interface);
    150
    151	/*
    152	 * There are many different Medion remotes shipped with a receiver
    153	 * with the same usb id, but the receivers have subtle differences
    154	 * in the USB descriptors allowing us to detect them.
    155	 */
    156
    157	if (udev->manufacturer && udev->product) {
    158		if (udev->actconfig->desc.bmAttributes & USB_CONFIG_ATT_WAKEUP) {
    159
    160			if (!strcmp(udev->manufacturer, "X10 Wireless Technology Inc")
    161			    && !strcmp(udev->product, "USB Receiver"))
    162				return RC_MAP_MEDION_X10_DIGITAINER;
    163
    164			if (!strcmp(udev->manufacturer, "X10 WTI")
    165			    && !strcmp(udev->product, "RF receiver"))
    166				return RC_MAP_MEDION_X10_OR2X;
    167		} else {
    168
    169			 if (!strcmp(udev->manufacturer, "X10 Wireless Technology Inc")
    170			    && !strcmp(udev->product, "USB Receiver"))
    171				return RC_MAP_MEDION_X10;
    172		}
    173	}
    174
    175	dev_info(&interface->dev,
    176		 "Unknown Medion X10 receiver, using default ati_remote Medion keymap\n");
    177
    178	return RC_MAP_MEDION_X10;
    179}
    180
    181static const struct ati_receiver_type type_ati		= {
    182	.default_keymap = RC_MAP_ATI_X10
    183};
    184static const struct ati_receiver_type type_medion	= {
    185	.get_default_keymap = get_medion_keymap
    186};
    187static const struct ati_receiver_type type_firefly	= {
    188	.default_keymap = RC_MAP_SNAPSTREAM_FIREFLY
    189};
    190
    191static const struct usb_device_id ati_remote_table[] = {
    192	{
    193		USB_DEVICE(ATI_REMOTE_VENDOR_ID, LOLA_REMOTE_PRODUCT_ID),
    194		.driver_info = (unsigned long)&type_ati
    195	},
    196	{
    197		USB_DEVICE(ATI_REMOTE_VENDOR_ID, LOLA2_REMOTE_PRODUCT_ID),
    198		.driver_info = (unsigned long)&type_ati
    199	},
    200	{
    201		USB_DEVICE(ATI_REMOTE_VENDOR_ID, ATI_REMOTE_PRODUCT_ID),
    202		.driver_info = (unsigned long)&type_ati
    203	},
    204	{
    205		USB_DEVICE(ATI_REMOTE_VENDOR_ID, NVIDIA_REMOTE_PRODUCT_ID),
    206		.driver_info = (unsigned long)&type_ati
    207	},
    208	{
    209		USB_DEVICE(ATI_REMOTE_VENDOR_ID, MEDION_REMOTE_PRODUCT_ID),
    210		.driver_info = (unsigned long)&type_medion
    211	},
    212	{
    213		USB_DEVICE(ATI_REMOTE_VENDOR_ID, FIREFLY_REMOTE_PRODUCT_ID),
    214		.driver_info = (unsigned long)&type_firefly
    215	},
    216	{}	/* Terminating entry */
    217};
    218
    219MODULE_DEVICE_TABLE(usb, ati_remote_table);
    220
    221/* Get hi and low bytes of a 16-bits int */
    222#define HI(a)	((unsigned char)((a) >> 8))
    223#define LO(a)	((unsigned char)((a) & 0xff))
    224
    225#define SEND_FLAG_IN_PROGRESS	1
    226#define SEND_FLAG_COMPLETE	2
    227
    228/* Device initialization strings */
    229static char init1[] = { 0x01, 0x00, 0x20, 0x14 };
    230static char init2[] = { 0x01, 0x00, 0x20, 0x14, 0x20, 0x20, 0x20 };
    231
    232struct ati_remote {
    233	struct input_dev *idev;
    234	struct rc_dev *rdev;
    235	struct usb_device *udev;
    236	struct usb_interface *interface;
    237
    238	struct urb *irq_urb;
    239	struct urb *out_urb;
    240	struct usb_endpoint_descriptor *endpoint_in;
    241	struct usb_endpoint_descriptor *endpoint_out;
    242	unsigned char *inbuf;
    243	unsigned char *outbuf;
    244	dma_addr_t inbuf_dma;
    245	dma_addr_t outbuf_dma;
    246
    247	unsigned char old_data;     /* Detect duplicate events */
    248	unsigned long old_jiffies;
    249	unsigned long acc_jiffies;  /* handle acceleration */
    250	unsigned long first_jiffies;
    251
    252	unsigned int repeat_count;
    253
    254	char rc_name[NAME_BUFSIZE];
    255	char rc_phys[NAME_BUFSIZE];
    256	char mouse_name[NAME_BUFSIZE];
    257	char mouse_phys[NAME_BUFSIZE];
    258
    259	wait_queue_head_t wait;
    260	int send_flags;
    261
    262	int users; /* 0-2, users are rc and input */
    263	struct mutex open_mutex;
    264};
    265
    266/* "Kinds" of messages sent from the hardware to the driver. */
    267#define KIND_END        0
    268#define KIND_LITERAL    1   /* Simply pass to input system as EV_KEY */
    269#define KIND_FILTERED   2   /* Add artificial key-up events, drop keyrepeats */
    270#define KIND_ACCEL      3   /* Translate to EV_REL mouse-move events */
    271
    272/* Translation table from hardware messages to input events. */
    273static const struct {
    274	unsigned char kind;
    275	unsigned char data;	/* Raw key code from remote */
    276	unsigned short code;	/* Input layer translation */
    277}  ati_remote_tbl[] = {
    278	/* Directional control pad axes.  Code is xxyy */
    279	{KIND_ACCEL,    0x70, 0xff00},	/* left */
    280	{KIND_ACCEL,    0x71, 0x0100},	/* right */
    281	{KIND_ACCEL,    0x72, 0x00ff},	/* up */
    282	{KIND_ACCEL,    0x73, 0x0001},	/* down */
    283
    284	/* Directional control pad diagonals */
    285	{KIND_ACCEL,    0x74, 0xffff},	/* left up */
    286	{KIND_ACCEL,    0x75, 0x01ff},	/* right up */
    287	{KIND_ACCEL,    0x77, 0xff01},	/* left down */
    288	{KIND_ACCEL,    0x76, 0x0101},	/* right down */
    289
    290	/* "Mouse button" buttons.  The code below uses the fact that the
    291	 * lsbit of the raw code is a down/up indicator. */
    292	{KIND_LITERAL,  0x78, BTN_LEFT}, /* left btn down */
    293	{KIND_LITERAL,  0x79, BTN_LEFT}, /* left btn up */
    294	{KIND_LITERAL,  0x7c, BTN_RIGHT},/* right btn down */
    295	{KIND_LITERAL,  0x7d, BTN_RIGHT},/* right btn up */
    296
    297	/* Artificial "double-click" events are generated by the hardware.
    298	 * They are mapped to the "side" and "extra" mouse buttons here. */
    299	{KIND_FILTERED, 0x7a, BTN_SIDE}, /* left dblclick */
    300	{KIND_FILTERED, 0x7e, BTN_EXTRA},/* right dblclick */
    301
    302	/* Non-mouse events are handled by rc-core */
    303	{KIND_END, 0x00, 0}
    304};
    305
    306/*
    307 * ati_remote_dump_input
    308 */
    309static void ati_remote_dump(struct device *dev, unsigned char *data,
    310			    unsigned int len)
    311{
    312	if (len == 1) {
    313		if (data[0] != (unsigned char)0xff && data[0] != 0x00)
    314			dev_warn(dev, "Weird byte 0x%02x\n", data[0]);
    315	} else if (len == 4)
    316		dev_warn(dev, "Weird key %*ph\n", 4, data);
    317	else
    318		dev_warn(dev, "Weird data, len=%d %*ph ...\n", len, 6, data);
    319}
    320
    321/*
    322 * ati_remote_open
    323 */
    324static int ati_remote_open(struct ati_remote *ati_remote)
    325{
    326	int err = 0;
    327
    328	mutex_lock(&ati_remote->open_mutex);
    329
    330	if (ati_remote->users++ != 0)
    331		goto out; /* one was already active */
    332
    333	/* On first open, submit the read urb which was set up previously. */
    334	ati_remote->irq_urb->dev = ati_remote->udev;
    335	if (usb_submit_urb(ati_remote->irq_urb, GFP_KERNEL)) {
    336		dev_err(&ati_remote->interface->dev,
    337			"%s: usb_submit_urb failed!\n", __func__);
    338		err = -EIO;
    339	}
    340
    341out:	mutex_unlock(&ati_remote->open_mutex);
    342	return err;
    343}
    344
    345/*
    346 * ati_remote_close
    347 */
    348static void ati_remote_close(struct ati_remote *ati_remote)
    349{
    350	mutex_lock(&ati_remote->open_mutex);
    351	if (--ati_remote->users == 0)
    352		usb_kill_urb(ati_remote->irq_urb);
    353	mutex_unlock(&ati_remote->open_mutex);
    354}
    355
    356static int ati_remote_input_open(struct input_dev *inputdev)
    357{
    358	struct ati_remote *ati_remote = input_get_drvdata(inputdev);
    359	return ati_remote_open(ati_remote);
    360}
    361
    362static void ati_remote_input_close(struct input_dev *inputdev)
    363{
    364	struct ati_remote *ati_remote = input_get_drvdata(inputdev);
    365	ati_remote_close(ati_remote);
    366}
    367
    368static int ati_remote_rc_open(struct rc_dev *rdev)
    369{
    370	struct ati_remote *ati_remote = rdev->priv;
    371	return ati_remote_open(ati_remote);
    372}
    373
    374static void ati_remote_rc_close(struct rc_dev *rdev)
    375{
    376	struct ati_remote *ati_remote = rdev->priv;
    377	ati_remote_close(ati_remote);
    378}
    379
    380/*
    381 * ati_remote_irq_out
    382 */
    383static void ati_remote_irq_out(struct urb *urb)
    384{
    385	struct ati_remote *ati_remote = urb->context;
    386
    387	if (urb->status) {
    388		dev_dbg(&ati_remote->interface->dev, "%s: status %d\n",
    389			__func__, urb->status);
    390		return;
    391	}
    392
    393	ati_remote->send_flags |= SEND_FLAG_COMPLETE;
    394	wmb();
    395	wake_up(&ati_remote->wait);
    396}
    397
    398/*
    399 * ati_remote_sendpacket
    400 *
    401 * Used to send device initialization strings
    402 */
    403static int ati_remote_sendpacket(struct ati_remote *ati_remote, u16 cmd,
    404	unsigned char *data)
    405{
    406	int retval = 0;
    407
    408	/* Set up out_urb */
    409	memcpy(ati_remote->out_urb->transfer_buffer + 1, data, LO(cmd));
    410	((char *) ati_remote->out_urb->transfer_buffer)[0] = HI(cmd);
    411
    412	ati_remote->out_urb->transfer_buffer_length = LO(cmd) + 1;
    413	ati_remote->out_urb->dev = ati_remote->udev;
    414	ati_remote->send_flags = SEND_FLAG_IN_PROGRESS;
    415
    416	retval = usb_submit_urb(ati_remote->out_urb, GFP_ATOMIC);
    417	if (retval) {
    418		dev_dbg(&ati_remote->interface->dev,
    419			 "sendpacket: usb_submit_urb failed: %d\n", retval);
    420		return retval;
    421	}
    422
    423	wait_event_timeout(ati_remote->wait,
    424		((ati_remote->out_urb->status != -EINPROGRESS) ||
    425			(ati_remote->send_flags & SEND_FLAG_COMPLETE)),
    426		HZ);
    427	usb_kill_urb(ati_remote->out_urb);
    428
    429	return retval;
    430}
    431
    432struct accel_times {
    433	const char	value;
    434	unsigned int	msecs;
    435};
    436
    437static const struct accel_times accel[] = {
    438	{  1,  125 },
    439	{  2,  250 },
    440	{  4,  500 },
    441	{  6, 1000 },
    442	{  9, 1500 },
    443	{ 13, 2000 },
    444	{ 20,    0 },
    445};
    446
    447/*
    448 * ati_remote_compute_accel
    449 *
    450 * Implements acceleration curve for directional control pad
    451 * If elapsed time since last event is > 1/4 second, user "stopped",
    452 * so reset acceleration. Otherwise, user is probably holding the control
    453 * pad down, so we increase acceleration, ramping up over two seconds to
    454 * a maximum speed.
    455 */
    456static int ati_remote_compute_accel(struct ati_remote *ati_remote)
    457{
    458	unsigned long now = jiffies, reset_time;
    459	int i;
    460
    461	reset_time = msecs_to_jiffies(250);
    462
    463	if (time_after(now, ati_remote->old_jiffies + reset_time)) {
    464		ati_remote->acc_jiffies = now;
    465		return 1;
    466	}
    467	for (i = 0; i < ARRAY_SIZE(accel) - 1; i++) {
    468		unsigned long timeout = msecs_to_jiffies(accel[i].msecs);
    469
    470		if (time_before(now, ati_remote->acc_jiffies + timeout))
    471			return accel[i].value;
    472	}
    473	return accel[i].value;
    474}
    475
    476/*
    477 * ati_remote_report_input
    478 */
    479static void ati_remote_input_report(struct urb *urb)
    480{
    481	struct ati_remote *ati_remote = urb->context;
    482	unsigned char *data= ati_remote->inbuf;
    483	struct input_dev *dev = ati_remote->idev;
    484	int index = -1;
    485	int remote_num;
    486	unsigned char scancode;
    487	u32 wheel_keycode = KEY_RESERVED;
    488	int i;
    489
    490	/*
    491	 * data[0] = 0x14
    492	 * data[1] = data[2] + data[3] + 0xd5 (a checksum byte)
    493	 * data[2] = the key code (with toggle bit in MSB with some models)
    494	 * data[3] = channel << 4 (the low 4 bits must be zero)
    495	 */
    496
    497	/* Deal with strange looking inputs */
    498	if ( urb->actual_length != 4 || data[0] != 0x14 ||
    499	     data[1] != (unsigned char)(data[2] + data[3] + 0xD5) ||
    500	     (data[3] & 0x0f) != 0x00) {
    501		ati_remote_dump(&urb->dev->dev, data, urb->actual_length);
    502		return;
    503	}
    504
    505	if (data[1] != ((data[2] + data[3] + 0xd5) & 0xff)) {
    506		dbginfo(&ati_remote->interface->dev,
    507			"wrong checksum in input: %*ph\n", 4, data);
    508		return;
    509	}
    510
    511	/* Mask unwanted remote channels.  */
    512	/* note: remote_num is 0-based, channel 1 on remote == 0 here */
    513	remote_num = (data[3] >> 4) & 0x0f;
    514	if (channel_mask & (1 << (remote_num + 1))) {
    515		dbginfo(&ati_remote->interface->dev,
    516			"Masked input from channel 0x%02x: data %02x, mask= 0x%02lx\n",
    517			remote_num, data[2], channel_mask);
    518		return;
    519	}
    520
    521	/*
    522	 * MSB is a toggle code, though only used by some devices
    523	 * (e.g. SnapStream Firefly)
    524	 */
    525	scancode = data[2] & 0x7f;
    526
    527	dbginfo(&ati_remote->interface->dev,
    528		"channel 0x%02x; key data %02x, scancode %02x\n",
    529		remote_num, data[2], scancode);
    530
    531	if (scancode >= 0x70) {
    532		/*
    533		 * This is either a mouse or scrollwheel event, depending on
    534		 * the remote/keymap.
    535		 * Get the keycode assigned to scancode 0x78/0x70. If it is
    536		 * set, assume this is a scrollwheel up/down event.
    537		 */
    538		wheel_keycode = rc_g_keycode_from_table(ati_remote->rdev,
    539							scancode & 0x78);
    540
    541		if (wheel_keycode == KEY_RESERVED) {
    542			/* scrollwheel was not mapped, assume mouse */
    543
    544			/* Look up event code index in the mouse translation
    545			 * table.
    546			 */
    547			for (i = 0; ati_remote_tbl[i].kind != KIND_END; i++) {
    548				if (scancode == ati_remote_tbl[i].data) {
    549					index = i;
    550					break;
    551				}
    552			}
    553		}
    554	}
    555
    556	if (index >= 0 && ati_remote_tbl[index].kind == KIND_LITERAL) {
    557		/*
    558		 * The lsbit of the raw key code is a down/up flag.
    559		 * Invert it to match the input layer's conventions.
    560		 */
    561		input_event(dev, EV_KEY, ati_remote_tbl[index].code,
    562			!(data[2] & 1));
    563
    564		ati_remote->old_jiffies = jiffies;
    565
    566	} else if (index < 0 || ati_remote_tbl[index].kind == KIND_FILTERED) {
    567		unsigned long now = jiffies;
    568
    569		/* Filter duplicate events which happen "too close" together. */
    570		if (ati_remote->old_data == data[2] &&
    571		    time_before(now, ati_remote->old_jiffies +
    572				     msecs_to_jiffies(repeat_filter))) {
    573			ati_remote->repeat_count++;
    574		} else {
    575			ati_remote->repeat_count = 0;
    576			ati_remote->first_jiffies = now;
    577		}
    578
    579		ati_remote->old_jiffies = now;
    580
    581		/* Ensure we skip at least the 4 first duplicate events
    582		 * (generated by a single keypress), and continue skipping
    583		 * until repeat_delay msecs have passed.
    584		 */
    585		if (ati_remote->repeat_count > 0 &&
    586		    (ati_remote->repeat_count < 5 ||
    587		     time_before(now, ati_remote->first_jiffies +
    588				      msecs_to_jiffies(repeat_delay))))
    589			return;
    590
    591		if (index >= 0) {
    592			input_event(dev, EV_KEY, ati_remote_tbl[index].code, 1);
    593			input_event(dev, EV_KEY, ati_remote_tbl[index].code, 0);
    594		} else {
    595			/* Not a mouse event, hand it to rc-core. */
    596			int count = 1;
    597
    598			if (wheel_keycode != KEY_RESERVED) {
    599				/*
    600				 * This is a scrollwheel event, send the
    601				 * scroll up (0x78) / down (0x70) scancode
    602				 * repeatedly as many times as indicated by
    603				 * rest of the scancode.
    604				 */
    605				count = (scancode & 0x07) + 1;
    606				scancode &= 0x78;
    607			}
    608
    609			while (count--) {
    610				/*
    611				* We don't use the rc-core repeat handling yet as
    612				* it would cause ghost repeats which would be a
    613				* regression for this driver.
    614				*/
    615				rc_keydown_notimeout(ati_remote->rdev,
    616						     RC_PROTO_OTHER,
    617						     scancode, data[2]);
    618				rc_keyup(ati_remote->rdev);
    619			}
    620			goto nosync;
    621		}
    622
    623	} else if (ati_remote_tbl[index].kind == KIND_ACCEL) {
    624		signed char dx = ati_remote_tbl[index].code >> 8;
    625		signed char dy = ati_remote_tbl[index].code & 255;
    626
    627		/*
    628		 * Other event kinds are from the directional control pad, and
    629		 * have an acceleration factor applied to them.  Without this
    630		 * acceleration, the control pad is mostly unusable.
    631		 */
    632		int acc = ati_remote_compute_accel(ati_remote);
    633		if (dx)
    634			input_report_rel(dev, REL_X, dx * acc);
    635		if (dy)
    636			input_report_rel(dev, REL_Y, dy * acc);
    637		ati_remote->old_jiffies = jiffies;
    638
    639	} else {
    640		dev_dbg(&ati_remote->interface->dev, "ati_remote kind=%d\n",
    641			ati_remote_tbl[index].kind);
    642		return;
    643	}
    644	input_sync(dev);
    645nosync:
    646	ati_remote->old_data = data[2];
    647}
    648
    649/*
    650 * ati_remote_irq_in
    651 */
    652static void ati_remote_irq_in(struct urb *urb)
    653{
    654	struct ati_remote *ati_remote = urb->context;
    655	int retval;
    656
    657	switch (urb->status) {
    658	case 0:			/* success */
    659		ati_remote_input_report(urb);
    660		break;
    661	case -ECONNRESET:	/* unlink */
    662	case -ENOENT:
    663	case -ESHUTDOWN:
    664		dev_dbg(&ati_remote->interface->dev,
    665			"%s: urb error status, unlink?\n",
    666			__func__);
    667		return;
    668	default:		/* error */
    669		dev_dbg(&ati_remote->interface->dev,
    670			"%s: Nonzero urb status %d\n",
    671			__func__, urb->status);
    672	}
    673
    674	retval = usb_submit_urb(urb, GFP_ATOMIC);
    675	if (retval)
    676		dev_err(&ati_remote->interface->dev,
    677			"%s: usb_submit_urb()=%d\n",
    678			__func__, retval);
    679}
    680
    681/*
    682 * ati_remote_alloc_buffers
    683 */
    684static int ati_remote_alloc_buffers(struct usb_device *udev,
    685				    struct ati_remote *ati_remote)
    686{
    687	ati_remote->inbuf = usb_alloc_coherent(udev, DATA_BUFSIZE, GFP_ATOMIC,
    688					       &ati_remote->inbuf_dma);
    689	if (!ati_remote->inbuf)
    690		return -1;
    691
    692	ati_remote->outbuf = usb_alloc_coherent(udev, DATA_BUFSIZE, GFP_ATOMIC,
    693						&ati_remote->outbuf_dma);
    694	if (!ati_remote->outbuf)
    695		return -1;
    696
    697	ati_remote->irq_urb = usb_alloc_urb(0, GFP_KERNEL);
    698	if (!ati_remote->irq_urb)
    699		return -1;
    700
    701	ati_remote->out_urb = usb_alloc_urb(0, GFP_KERNEL);
    702	if (!ati_remote->out_urb)
    703		return -1;
    704
    705	return 0;
    706}
    707
    708/*
    709 * ati_remote_free_buffers
    710 */
    711static void ati_remote_free_buffers(struct ati_remote *ati_remote)
    712{
    713	usb_free_urb(ati_remote->irq_urb);
    714	usb_free_urb(ati_remote->out_urb);
    715
    716	usb_free_coherent(ati_remote->udev, DATA_BUFSIZE,
    717		ati_remote->inbuf, ati_remote->inbuf_dma);
    718
    719	usb_free_coherent(ati_remote->udev, DATA_BUFSIZE,
    720		ati_remote->outbuf, ati_remote->outbuf_dma);
    721}
    722
    723static void ati_remote_input_init(struct ati_remote *ati_remote)
    724{
    725	struct input_dev *idev = ati_remote->idev;
    726	int i;
    727
    728	idev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REL);
    729	idev->keybit[BIT_WORD(BTN_MOUSE)] = BIT_MASK(BTN_LEFT) |
    730		BIT_MASK(BTN_RIGHT) | BIT_MASK(BTN_SIDE) | BIT_MASK(BTN_EXTRA);
    731	idev->relbit[0] = BIT_MASK(REL_X) | BIT_MASK(REL_Y);
    732	for (i = 0; ati_remote_tbl[i].kind != KIND_END; i++)
    733		if (ati_remote_tbl[i].kind == KIND_LITERAL ||
    734		    ati_remote_tbl[i].kind == KIND_FILTERED)
    735			__set_bit(ati_remote_tbl[i].code, idev->keybit);
    736
    737	input_set_drvdata(idev, ati_remote);
    738
    739	idev->open = ati_remote_input_open;
    740	idev->close = ati_remote_input_close;
    741
    742	idev->name = ati_remote->mouse_name;
    743	idev->phys = ati_remote->mouse_phys;
    744
    745	usb_to_input_id(ati_remote->udev, &idev->id);
    746	idev->dev.parent = &ati_remote->interface->dev;
    747}
    748
    749static void ati_remote_rc_init(struct ati_remote *ati_remote)
    750{
    751	struct rc_dev *rdev = ati_remote->rdev;
    752
    753	rdev->priv = ati_remote;
    754	rdev->allowed_protocols = RC_PROTO_BIT_OTHER;
    755	rdev->driver_name = "ati_remote";
    756
    757	rdev->open = ati_remote_rc_open;
    758	rdev->close = ati_remote_rc_close;
    759
    760	rdev->device_name = ati_remote->rc_name;
    761	rdev->input_phys = ati_remote->rc_phys;
    762
    763	usb_to_input_id(ati_remote->udev, &rdev->input_id);
    764	rdev->dev.parent = &ati_remote->interface->dev;
    765}
    766
    767static int ati_remote_initialize(struct ati_remote *ati_remote)
    768{
    769	struct usb_device *udev = ati_remote->udev;
    770	int pipe, maxp;
    771
    772	init_waitqueue_head(&ati_remote->wait);
    773
    774	/* Set up irq_urb */
    775	pipe = usb_rcvintpipe(udev, ati_remote->endpoint_in->bEndpointAddress);
    776	maxp = usb_maxpacket(udev, pipe);
    777	maxp = (maxp > DATA_BUFSIZE) ? DATA_BUFSIZE : maxp;
    778
    779	usb_fill_int_urb(ati_remote->irq_urb, udev, pipe, ati_remote->inbuf,
    780			 maxp, ati_remote_irq_in, ati_remote,
    781			 ati_remote->endpoint_in->bInterval);
    782	ati_remote->irq_urb->transfer_dma = ati_remote->inbuf_dma;
    783	ati_remote->irq_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
    784
    785	/* Set up out_urb */
    786	pipe = usb_sndintpipe(udev, ati_remote->endpoint_out->bEndpointAddress);
    787	maxp = usb_maxpacket(udev, pipe);
    788	maxp = (maxp > DATA_BUFSIZE) ? DATA_BUFSIZE : maxp;
    789
    790	usb_fill_int_urb(ati_remote->out_urb, udev, pipe, ati_remote->outbuf,
    791			 maxp, ati_remote_irq_out, ati_remote,
    792			 ati_remote->endpoint_out->bInterval);
    793	ati_remote->out_urb->transfer_dma = ati_remote->outbuf_dma;
    794	ati_remote->out_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
    795
    796	/* send initialization strings */
    797	if ((ati_remote_sendpacket(ati_remote, 0x8004, init1)) ||
    798	    (ati_remote_sendpacket(ati_remote, 0x8007, init2))) {
    799		dev_err(&ati_remote->interface->dev,
    800			 "Initializing ati_remote hardware failed.\n");
    801		return -EIO;
    802	}
    803
    804	return 0;
    805}
    806
    807/*
    808 * ati_remote_probe
    809 */
    810static int ati_remote_probe(struct usb_interface *interface,
    811	const struct usb_device_id *id)
    812{
    813	struct usb_device *udev = interface_to_usbdev(interface);
    814	struct usb_host_interface *iface_host = interface->cur_altsetting;
    815	struct usb_endpoint_descriptor *endpoint_in, *endpoint_out;
    816	struct ati_receiver_type *type = (struct ati_receiver_type *)id->driver_info;
    817	struct ati_remote *ati_remote;
    818	struct input_dev *input_dev;
    819	struct rc_dev *rc_dev;
    820	int err = -ENOMEM;
    821
    822	if (iface_host->desc.bNumEndpoints != 2) {
    823		err("%s: Unexpected desc.bNumEndpoints\n", __func__);
    824		return -ENODEV;
    825	}
    826
    827	endpoint_in = &iface_host->endpoint[0].desc;
    828	endpoint_out = &iface_host->endpoint[1].desc;
    829
    830	if (!usb_endpoint_is_int_in(endpoint_in)) {
    831		err("%s: Unexpected endpoint_in\n", __func__);
    832		return -ENODEV;
    833	}
    834	if (le16_to_cpu(endpoint_in->wMaxPacketSize) == 0) {
    835		err("%s: endpoint_in message size==0? \n", __func__);
    836		return -ENODEV;
    837	}
    838	if (!usb_endpoint_is_int_out(endpoint_out)) {
    839		err("%s: Unexpected endpoint_out\n", __func__);
    840		return -ENODEV;
    841	}
    842
    843	ati_remote = kzalloc(sizeof (struct ati_remote), GFP_KERNEL);
    844	rc_dev = rc_allocate_device(RC_DRIVER_SCANCODE);
    845	if (!ati_remote || !rc_dev)
    846		goto exit_free_dev_rdev;
    847
    848	/* Allocate URB buffers, URBs */
    849	if (ati_remote_alloc_buffers(udev, ati_remote))
    850		goto exit_free_buffers;
    851
    852	ati_remote->endpoint_in = endpoint_in;
    853	ati_remote->endpoint_out = endpoint_out;
    854	ati_remote->udev = udev;
    855	ati_remote->rdev = rc_dev;
    856	ati_remote->interface = interface;
    857
    858	usb_make_path(udev, ati_remote->rc_phys, sizeof(ati_remote->rc_phys));
    859	strscpy(ati_remote->mouse_phys, ati_remote->rc_phys,
    860		sizeof(ati_remote->mouse_phys));
    861
    862	strlcat(ati_remote->rc_phys, "/input0", sizeof(ati_remote->rc_phys));
    863	strlcat(ati_remote->mouse_phys, "/input1", sizeof(ati_remote->mouse_phys));
    864
    865	snprintf(ati_remote->rc_name, sizeof(ati_remote->rc_name), "%s%s%s",
    866		udev->manufacturer ?: "",
    867		udev->manufacturer && udev->product ? " " : "",
    868		udev->product ?: "");
    869
    870	if (!strlen(ati_remote->rc_name))
    871		snprintf(ati_remote->rc_name, sizeof(ati_remote->rc_name),
    872			DRIVER_DESC "(%04x,%04x)",
    873			le16_to_cpu(ati_remote->udev->descriptor.idVendor),
    874			le16_to_cpu(ati_remote->udev->descriptor.idProduct));
    875
    876	snprintf(ati_remote->mouse_name, sizeof(ati_remote->mouse_name),
    877		 "%s mouse", ati_remote->rc_name);
    878
    879	rc_dev->map_name = RC_MAP_ATI_X10; /* default map */
    880
    881	/* set default keymap according to receiver model */
    882	if (type) {
    883		if (type->default_keymap)
    884			rc_dev->map_name = type->default_keymap;
    885		else if (type->get_default_keymap)
    886			rc_dev->map_name = type->get_default_keymap(interface);
    887	}
    888
    889	ati_remote_rc_init(ati_remote);
    890	mutex_init(&ati_remote->open_mutex);
    891
    892	/* Device Hardware Initialization - fills in ati_remote->idev from udev. */
    893	err = ati_remote_initialize(ati_remote);
    894	if (err)
    895		goto exit_kill_urbs;
    896
    897	/* Set up and register rc device */
    898	err = rc_register_device(ati_remote->rdev);
    899	if (err)
    900		goto exit_kill_urbs;
    901
    902	/* Set up and register mouse input device */
    903	if (mouse) {
    904		input_dev = input_allocate_device();
    905		if (!input_dev) {
    906			err = -ENOMEM;
    907			goto exit_unregister_device;
    908		}
    909
    910		ati_remote->idev = input_dev;
    911		ati_remote_input_init(ati_remote);
    912		err = input_register_device(input_dev);
    913
    914		if (err)
    915			goto exit_free_input_device;
    916	}
    917
    918	usb_set_intfdata(interface, ati_remote);
    919	return 0;
    920
    921 exit_free_input_device:
    922	input_free_device(input_dev);
    923 exit_unregister_device:
    924	rc_unregister_device(rc_dev);
    925	rc_dev = NULL;
    926 exit_kill_urbs:
    927	usb_kill_urb(ati_remote->irq_urb);
    928	usb_kill_urb(ati_remote->out_urb);
    929 exit_free_buffers:
    930	ati_remote_free_buffers(ati_remote);
    931 exit_free_dev_rdev:
    932	 rc_free_device(rc_dev);
    933	kfree(ati_remote);
    934	return err;
    935}
    936
    937/*
    938 * ati_remote_disconnect
    939 */
    940static void ati_remote_disconnect(struct usb_interface *interface)
    941{
    942	struct ati_remote *ati_remote;
    943
    944	ati_remote = usb_get_intfdata(interface);
    945	usb_set_intfdata(interface, NULL);
    946	if (!ati_remote) {
    947		dev_warn(&interface->dev, "%s - null device?\n", __func__);
    948		return;
    949	}
    950
    951	usb_kill_urb(ati_remote->irq_urb);
    952	usb_kill_urb(ati_remote->out_urb);
    953	if (ati_remote->idev)
    954		input_unregister_device(ati_remote->idev);
    955	rc_unregister_device(ati_remote->rdev);
    956	ati_remote_free_buffers(ati_remote);
    957	kfree(ati_remote);
    958}
    959
    960/* usb specific object to register with the usb subsystem */
    961static struct usb_driver ati_remote_driver = {
    962	.name         = "ati_remote",
    963	.probe        = ati_remote_probe,
    964	.disconnect   = ati_remote_disconnect,
    965	.id_table     = ati_remote_table,
    966};
    967
    968module_usb_driver(ati_remote_driver);
    969
    970MODULE_AUTHOR(DRIVER_AUTHOR);
    971MODULE_DESCRIPTION(DRIVER_DESC);
    972MODULE_LICENSE("GPL");