rc-main.c 29.3 KB
Newer Older
1
/* rc-core.c - handle IR scancode->keycode tables
2
 *
3
 * Copyright (C) 2009-2010 by Mauro Carvalho Chehab <mchehab@redhat.com>
4 5 6 7 8 9 10 11 12
 *
 * This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation version 2 of the License.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
13 14
 */

15
#include <media/rc-core.h>
16 17
#include <linux/spinlock.h>
#include <linux/delay.h>
18
#include <linux/input.h>
19
#include <linux/slab.h>
20
#include <linux/device.h>
21
#include "rc-core-priv.h"
22

23 24 25
/* Sizes are in bytes, 256 bytes allows for 32 entries on x64 */
#define IR_TAB_MIN_SIZE	256
#define IR_TAB_MAX_SIZE	8192
26

27 28 29
/* FIXME: IR_KEYPRESS_TIMEOUT should be protocol specific */
#define IR_KEYPRESS_TIMEOUT 250

30
/* Used to keep track of known keymaps */
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
static LIST_HEAD(rc_map_list);
static DEFINE_SPINLOCK(rc_map_lock);

static struct rc_keymap *seek_rc_map(const char *name)
{
	struct rc_keymap *map = NULL;

	spin_lock(&rc_map_lock);
	list_for_each_entry(map, &rc_map_list, list) {
		if (!strcmp(name, map->map.name)) {
			spin_unlock(&rc_map_lock);
			return map;
		}
	}
	spin_unlock(&rc_map_lock);

	return NULL;
}

struct ir_scancode_table *get_rc_map(const char *name)
{

	struct rc_keymap *map;

	map = seek_rc_map(name);
#ifdef MODULE
	if (!map) {
		int rc = request_module(name);
		if (rc < 0) {
			printk(KERN_ERR "Couldn't load IR keymap %s\n", name);
			return NULL;
		}
		msleep(20);	/* Give some time for IR to register */

		map = seek_rc_map(name);
	}
#endif
	if (!map) {
		printk(KERN_ERR "IR keymap %s not found\n", name);
		return NULL;
	}

	printk(KERN_INFO "Registered IR keymap %s\n", map->map.name);

	return &map->map;
}
EXPORT_SYMBOL_GPL(get_rc_map);

int ir_register_map(struct rc_keymap *map)
{
	spin_lock(&rc_map_lock);
	list_add_tail(&map->list, &rc_map_list);
	spin_unlock(&rc_map_lock);
	return 0;
}
EXPORT_SYMBOL_GPL(ir_register_map);

void ir_unregister_map(struct rc_keymap *map)
{
	spin_lock(&rc_map_lock);
	list_del(&map->list);
	spin_unlock(&rc_map_lock);
}
EXPORT_SYMBOL_GPL(ir_unregister_map);


static struct ir_scancode empty[] = {
	{ 0x2a, KEY_COFFEE },
};

static struct rc_keymap empty_map = {
	.map = {
		.scan    = empty,
		.size    = ARRAY_SIZE(empty),
		.ir_type = IR_TYPE_UNKNOWN,	/* Legacy IR type */
		.name    = RC_MAP_EMPTY,
	}
};

110 111 112 113 114 115 116 117 118
/**
 * ir_create_table() - initializes a scancode table
 * @rc_tab:	the ir_scancode_table to initialize
 * @name:	name to assign to the table
 * @ir_type:	ir type to assign to the new table
 * @size:	initial size of the table
 * @return:	zero on success or a negative error code
 *
 * This routine will initialize the ir_scancode_table and will allocate
119
 * memory to hold at least the specified number of elements.
120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
 */
static int ir_create_table(struct ir_scancode_table *rc_tab,
			   const char *name, u64 ir_type, size_t size)
{
	rc_tab->name = name;
	rc_tab->ir_type = ir_type;
	rc_tab->alloc = roundup_pow_of_two(size * sizeof(struct ir_scancode));
	rc_tab->size = rc_tab->alloc / sizeof(struct ir_scancode);
	rc_tab->scan = kmalloc(rc_tab->alloc, GFP_KERNEL);
	if (!rc_tab->scan)
		return -ENOMEM;

	IR_dprintk(1, "Allocated space for %u keycode entries (%u bytes)\n",
		   rc_tab->size, rc_tab->alloc);
	return 0;
}

/**
 * ir_free_table() - frees memory allocated by a scancode table
 * @rc_tab:	the table whose mappings need to be freed
 *
 * This routine will free memory alloctaed for key mappings used by given
 * scancode table.
 */
static void ir_free_table(struct ir_scancode_table *rc_tab)
{
	rc_tab->size = 0;
	kfree(rc_tab->scan);
	rc_tab->scan = NULL;
}

151
/**
152 153
 * ir_resize_table() - resizes a scancode table if necessary
 * @rc_tab:	the ir_scancode_table to resize
154
 * @gfp_flags:	gfp flags to use when allocating memory
155
 * @return:	zero on success or a negative error code
156
 *
157 158
 * This routine will shrink the ir_scancode_table if it has lots of
 * unused entries and grow it if it is full.
159
 */
160
static int ir_resize_table(struct ir_scancode_table *rc_tab, gfp_t gfp_flags)
161
{
162 163 164 165 166 167 168 169 170
	unsigned int oldalloc = rc_tab->alloc;
	unsigned int newalloc = oldalloc;
	struct ir_scancode *oldscan = rc_tab->scan;
	struct ir_scancode *newscan;

	if (rc_tab->size == rc_tab->len) {
		/* All entries in use -> grow keytable */
		if (rc_tab->alloc >= IR_TAB_MAX_SIZE)
			return -ENOMEM;
171

172 173 174
		newalloc *= 2;
		IR_dprintk(1, "Growing table to %u bytes\n", newalloc);
	}
175

176 177 178 179 180
	if ((rc_tab->len * 3 < rc_tab->size) && (oldalloc > IR_TAB_MIN_SIZE)) {
		/* Less than 1/3 of entries in use -> shrink keytable */
		newalloc /= 2;
		IR_dprintk(1, "Shrinking table to %u bytes\n", newalloc);
	}
181

182 183
	if (newalloc == oldalloc)
		return 0;
184

185
	newscan = kmalloc(newalloc, gfp_flags);
186 187 188 189
	if (!newscan) {
		IR_dprintk(1, "Failed to kmalloc %u bytes\n", newalloc);
		return -ENOMEM;
	}
190

191 192 193 194 195 196
	memcpy(newscan, rc_tab->scan, rc_tab->len * sizeof(struct ir_scancode));
	rc_tab->scan = newscan;
	rc_tab->alloc = newalloc;
	rc_tab->size = rc_tab->alloc / sizeof(struct ir_scancode);
	kfree(oldscan);
	return 0;
197 198
}

199
/**
200
 * ir_update_mapping() - set a keycode in the scancode->keycode table
201
 * @dev:	the struct rc_dev device descriptor
202 203 204 205 206
 * @rc_tab:	scancode table to be adjusted
 * @index:	index of the mapping that needs to be updated
 * @keycode:	the desired keycode
 * @return:	previous keycode assigned to the mapping
 *
207
 * This routine is used to update scancode->keycode mapping at given
208 209
 * position.
 */
210
static unsigned int ir_update_mapping(struct rc_dev *dev,
211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230
				      struct ir_scancode_table *rc_tab,
				      unsigned int index,
				      unsigned int new_keycode)
{
	int old_keycode = rc_tab->scan[index].keycode;
	int i;

	/* Did the user wish to remove the mapping? */
	if (new_keycode == KEY_RESERVED || new_keycode == KEY_UNKNOWN) {
		IR_dprintk(1, "#%d: Deleting scan 0x%04x\n",
			   index, rc_tab->scan[index].scancode);
		rc_tab->len--;
		memmove(&rc_tab->scan[index], &rc_tab->scan[index+ 1],
			(rc_tab->len - index) * sizeof(struct ir_scancode));
	} else {
		IR_dprintk(1, "#%d: %s scan 0x%04x with key 0x%04x\n",
			   index,
			   old_keycode == KEY_RESERVED ? "New" : "Replacing",
			   rc_tab->scan[index].scancode, new_keycode);
		rc_tab->scan[index].keycode = new_keycode;
231
		__set_bit(new_keycode, dev->input_dev->keybit);
232 233 234 235
	}

	if (old_keycode != KEY_RESERVED) {
		/* A previous mapping was updated... */
236
		__clear_bit(old_keycode, dev->input_dev->keybit);
237 238 239
		/* ... but another scancode might use the same keycode */
		for (i = 0; i < rc_tab->len; i++) {
			if (rc_tab->scan[i].keycode == old_keycode) {
240
				__set_bit(old_keycode, dev->input_dev->keybit);
241 242 243 244 245 246 247 248 249 250 251 252
				break;
			}
		}

		/* Possibly shrink the keytable, failure is not a problem */
		ir_resize_table(rc_tab, GFP_ATOMIC);
	}

	return old_keycode;
}

/**
253
 * ir_establish_scancode() - set a keycode in the scancode->keycode table
254
 * @dev:	the struct rc_dev device descriptor
255 256 257 258 259 260
 * @rc_tab:	scancode table to be searched
 * @scancode:	the desired scancode
 * @resize:	controls whether we allowed to resize the table to
 *		accomodate not yet present scancodes
 * @return:	index of the mapping containing scancode in question
 *		or -1U in case of failure.
261
 *
262 263 264
 * This routine is used to locate given scancode in ir_scancode_table.
 * If scancode is not yet present the routine will allocate a new slot
 * for it.
265
 */
266
static unsigned int ir_establish_scancode(struct rc_dev *dev,
267 268 269
					  struct ir_scancode_table *rc_tab,
					  unsigned int scancode,
					  bool resize)
270
{
271
	unsigned int i;
272 273 274 275 276 277

	/*
	 * Unfortunately, some hardware-based IR decoders don't provide
	 * all bits for the complete IR code. In general, they provide only
	 * the command part of the IR code. Yet, as it is possible to replace
	 * the provided IR with another one, it is needed to allow loading
278 279
	 * IR tables from other remotes. So, we support specifying a mask to
	 * indicate the valid bits of the scancodes.
280
	 */
281 282
	if (dev->scanmask)
		scancode &= dev->scanmask;
283 284 285

	/* First check if we already have a mapping for this ir command */
	for (i = 0; i < rc_tab->len; i++) {
286 287 288
		if (rc_tab->scan[i].scancode == scancode)
			return i;

289
		/* Keytable is sorted from lowest to highest scancode */
290
		if (rc_tab->scan[i].scancode >= scancode)
291 292
			break;
	}
293

294 295 296 297 298
	/* No previous mapping found, we might need to grow the table */
	if (rc_tab->size == rc_tab->len) {
		if (!resize || ir_resize_table(rc_tab, GFP_ATOMIC))
			return -1U;
	}
299

300 301
	/* i is the proper index to insert our new keycode */
	if (i < rc_tab->len)
302 303
		memmove(&rc_tab->scan[i + 1], &rc_tab->scan[i],
			(rc_tab->len - i) * sizeof(struct ir_scancode));
304 305 306
	rc_tab->scan[i].scancode = scancode;
	rc_tab->scan[i].keycode = KEY_RESERVED;
	rc_tab->len++;
307

308
	return i;
309 310
}

311
/**
312
 * ir_setkeycode() - set a keycode in the scancode->keycode table
313
 * @idev:	the struct input_dev device descriptor
314
 * @scancode:	the desired scancode
315 316
 * @keycode:	result
 * @return:	-EINVAL if the keycode could not be inserted, otherwise zero.
317
 *
318
 * This routine is used to handle evdev EVIOCSKEY ioctl.
319
 */
320
static int ir_setkeycode(struct input_dev *idev,
321 322
			 const struct input_keymap_entry *ke,
			 unsigned int *old_keycode)
323
{
324 325
	struct rc_dev *rdev = input_get_drvdata(idev);
	struct ir_scancode_table *rc_tab = &rdev->rc_tab;
326 327 328 329
	unsigned int index;
	unsigned int scancode;
	int retval;
	unsigned long flags;
330

331
	spin_lock_irqsave(&rc_tab->lock, flags);
332 333 334 335 336 337 338 339 340 341 342 343

	if (ke->flags & INPUT_KEYMAP_BY_INDEX) {
		index = ke->index;
		if (index >= rc_tab->len) {
			retval = -EINVAL;
			goto out;
		}
	} else {
		retval = input_scancode_to_scalar(ke, &scancode);
		if (retval)
			goto out;

344
		index = ir_establish_scancode(rdev, rc_tab, scancode, true);
345 346 347 348 349 350
		if (index >= rc_tab->len) {
			retval = -ENOMEM;
			goto out;
		}
	}

351
	*old_keycode = ir_update_mapping(rdev, rc_tab, index, ke->keycode);
352 353

out:
354
	spin_unlock_irqrestore(&rc_tab->lock, flags);
355
	return retval;
356 357 358
}

/**
359
 * ir_setkeytable() - sets several entries in the scancode->keycode table
360
 * @dev:	the struct rc_dev device descriptor
361 362
 * @to:		the struct ir_scancode_table to copy entries to
 * @from:	the struct ir_scancode_table to copy entries from
363
 * @return:	-ENOMEM if all keycodes could not be inserted, otherwise zero.
364
 *
365
 * This routine is used to handle table initialization.
366
 */
367
static int ir_setkeytable(struct rc_dev *dev,
368
			  const struct ir_scancode_table *from)
369
{
370
	struct ir_scancode_table *rc_tab = &dev->rc_tab;
371 372 373
	unsigned int i, index;
	int rc;

374 375
	rc = ir_create_table(rc_tab, from->name,
			     from->ir_type, from->size);
376 377 378 379 380
	if (rc)
		return rc;

	IR_dprintk(1, "Allocated space for %u keycode entries (%u bytes)\n",
		   rc_tab->size, rc_tab->alloc);
381

382
	for (i = 0; i < from->size; i++) {
383
		index = ir_establish_scancode(dev, rc_tab,
384 385 386
					      from->scan[i].scancode, false);
		if (index >= rc_tab->len) {
			rc = -ENOMEM;
387
			break;
388 389
		}

390
		ir_update_mapping(dev, rc_tab, index,
391
				  from->scan[i].keycode);
392
	}
393 394 395 396

	if (rc)
		ir_free_table(rc_tab);

397
	return rc;
398 399
}

400 401
/**
 * ir_lookup_by_scancode() - locate mapping by scancode
402
 * @rc_tab:	the struct ir_scancode_table to search
403 404 405 406 407 408 409 410 411
 * @scancode:	scancode to look for in the table
 * @return:	index in the table, -1U if not found
 *
 * This routine performs binary search in RC keykeymap table for
 * given scancode.
 */
static unsigned int ir_lookup_by_scancode(const struct ir_scancode_table *rc_tab,
					  unsigned int scancode)
{
412 413 414
	int start = 0;
	int end = rc_tab->len - 1;
	int mid;
415 416 417 418 419 420 421 422 423 424 425 426 427 428

	while (start <= end) {
		mid = (start + end) / 2;
		if (rc_tab->scan[mid].scancode < scancode)
			start = mid + 1;
		else if (rc_tab->scan[mid].scancode > scancode)
			end = mid - 1;
		else
			return mid;
	}

	return -1U;
}

429
/**
430
 * ir_getkeycode() - get a keycode from the scancode->keycode table
431
 * @idev:	the struct input_dev device descriptor
432
 * @scancode:	the desired scancode
433 434
 * @keycode:	used to return the keycode, if found, or KEY_RESERVED
 * @return:	always returns zero.
435
 *
436
 * This routine is used to handle evdev EVIOCGKEY ioctl.
437
 */
438
static int ir_getkeycode(struct input_dev *idev,
439
			 struct input_keymap_entry *ke)
440
{
441 442
	struct rc_dev *rdev = input_get_drvdata(idev);
	struct ir_scancode_table *rc_tab = &rdev->rc_tab;
443 444 445 446 447
	struct ir_scancode *entry;
	unsigned long flags;
	unsigned int index;
	unsigned int scancode;
	int retval;
448

449
	spin_lock_irqsave(&rc_tab->lock, flags);
450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466

	if (ke->flags & INPUT_KEYMAP_BY_INDEX) {
		index = ke->index;
	} else {
		retval = input_scancode_to_scalar(ke, &scancode);
		if (retval)
			goto out;

		index = ir_lookup_by_scancode(rc_tab, scancode);
	}

	if (index >= rc_tab->len) {
		if (!(ke->flags & INPUT_KEYMAP_BY_INDEX))
			IR_dprintk(1, "unknown key for scancode 0x%04x\n",
				   scancode);
		retval = -EINVAL;
		goto out;
467 468
	}

469
	entry = &rc_tab->scan[index];
470

471 472 473 474 475
	ke->index = index;
	ke->keycode = entry->keycode;
	ke->len = sizeof(entry->scancode);
	memcpy(ke->scancode, &entry->scancode, sizeof(entry->scancode));

476 477
	retval = 0;

478 479 480
out:
	spin_unlock_irqrestore(&rc_tab->lock, flags);
	return retval;
481 482 483 484
}

/**
 * ir_g_keycode_from_table() - gets the keycode that corresponds to a scancode
485 486 487
 * @dev:	the struct rc_dev descriptor of the device
 * @scancode:	the scancode to look for
 * @return:	the corresponding keycode, or KEY_RESERVED
488
 *
489 490 491
 * This routine is used by drivers which need to convert a scancode to a
 * keycode. Normally it should not be used since drivers should have no
 * interest in keycodes.
492
 */
493
u32 ir_g_keycode_from_table(struct rc_dev *dev, u32 scancode)
494
{
495
	struct ir_scancode_table *rc_tab = &dev->rc_tab;
496 497 498 499 500 501 502 503 504 505 506
	unsigned int keycode;
	unsigned int index;
	unsigned long flags;

	spin_lock_irqsave(&rc_tab->lock, flags);

	index = ir_lookup_by_scancode(rc_tab, scancode);
	keycode = index < rc_tab->len ?
			rc_tab->scan[index].keycode : KEY_RESERVED;

	spin_unlock_irqrestore(&rc_tab->lock, flags);
507

508 509
	if (keycode != KEY_RESERVED)
		IR_dprintk(1, "%s: scancode 0x%04x keycode 0x%02x\n",
510
			   dev->input_name, scancode, keycode);
511

512
	return keycode;
513
}
514
EXPORT_SYMBOL_GPL(ir_g_keycode_from_table);
515

516
/**
517
 * ir_do_keyup() - internal function to signal the release of a keypress
518
 * @dev:	the struct rc_dev descriptor of the device
519
 *
520 521
 * This function is used internally to release a keypress, it must be
 * called with keylock held.
522
 */
523
static void ir_do_keyup(struct rc_dev *dev)
524
{
525
	if (!dev->keypressed)
526 527
		return;

528 529 530 531
	IR_dprintk(1, "keyup key 0x%04x\n", dev->last_keycode);
	input_report_key(dev->input_dev, dev->last_keycode, 0);
	input_sync(dev->input_dev);
	dev->keypressed = false;
532
}
533 534

/**
535 536
 * ir_keyup() - signals the release of a keypress
 * @dev:	the struct rc_dev descriptor of the device
537 538 539 540
 *
 * This routine is used to signal that a key has been released on the
 * remote control.
 */
541
void ir_keyup(struct rc_dev *dev)
542 543 544
{
	unsigned long flags;

545 546 547
	spin_lock_irqsave(&dev->keylock, flags);
	ir_do_keyup(dev);
	spin_unlock_irqrestore(&dev->keylock, flags);
548
}
549
EXPORT_SYMBOL_GPL(ir_keyup);
550 551 552

/**
 * ir_timer_keyup() - generates a keyup event after a timeout
553
 * @cookie:	a pointer to the struct rc_dev for the device
554 555 556
 *
 * This routine will generate a keyup event some time after a keydown event
 * is generated when no further activity has been detected.
557
 */
558
static void ir_timer_keyup(unsigned long cookie)
559
{
560
	struct rc_dev *dev = (struct rc_dev *)cookie;
561 562 563 564 565 566 567 568 569 570 571 572
	unsigned long flags;

	/*
	 * ir->keyup_jiffies is used to prevent a race condition if a
	 * hardware interrupt occurs at this point and the keyup timer
	 * event is moved further into the future as a result.
	 *
	 * The timer will then be reactivated and this function called
	 * again in the future. We need to exit gracefully in that case
	 * to allow the input subsystem to do its auto-repeat magic or
	 * a keyup event might follow immediately after the keydown.
	 */
573 574 575 576
	spin_lock_irqsave(&dev->keylock, flags);
	if (time_is_before_eq_jiffies(dev->keyup_jiffies))
		ir_do_keyup(dev);
	spin_unlock_irqrestore(&dev->keylock, flags);
577 578 579
}

/**
580 581
 * ir_repeat() - signals that a key is still pressed
 * @dev:	the struct rc_dev descriptor of the device
582 583 584 585 586
 *
 * This routine is used by IR decoders when a repeat message which does
 * not include the necessary bits to reproduce the scancode has been
 * received.
 */
587
void ir_repeat(struct rc_dev *dev)
588 589
{
	unsigned long flags;
590

591
	spin_lock_irqsave(&dev->keylock, flags);
592

593
	input_event(dev->input_dev, EV_MSC, MSC_SCAN, dev->last_scancode);
594

595
	if (!dev->keypressed)
596
		goto out;
597

598 599
	dev->keyup_jiffies = jiffies + msecs_to_jiffies(IR_KEYPRESS_TIMEOUT);
	mod_timer(&dev->timer_keyup, dev->keyup_jiffies);
600 601

out:
602
	spin_unlock_irqrestore(&dev->keylock, flags);
603
}
604
EXPORT_SYMBOL_GPL(ir_repeat);
605 606

/**
607
 * ir_do_keydown() - internal function to process a keypress
608
 * @dev:	the struct rc_dev descriptor of the device
609 610 611
 * @scancode:   the scancode of the keypress
 * @keycode:    the keycode of the keypress
 * @toggle:     the toggle value of the keypress
612
 *
613 614
 * This function is used internally to register a keypress, it must be
 * called with keylock held.
615
 */
616
static void ir_do_keydown(struct rc_dev *dev, int scancode,
617
			  u32 keycode, u8 toggle)
618
{
619
	input_event(dev->input_dev, EV_MSC, MSC_SCAN, scancode);
620

621
	/* Repeat event? */
622 623 624
	if (dev->keypressed &&
	    dev->last_scancode == scancode &&
	    dev->last_toggle == toggle)
625
		return;
626

627
	/* Release old keypress */
628
	ir_do_keyup(dev);
629

630 631 632
	dev->last_scancode = scancode;
	dev->last_toggle = toggle;
	dev->last_keycode = keycode;
633 634

	if (keycode == KEY_RESERVED)
635
		return;
636

637
	/* Register a keypress */
638
	dev->keypressed = true;
639
	IR_dprintk(1, "%s: key down event, key 0x%04x, scancode 0x%04x\n",
640 641 642
		   dev->input_name, keycode, scancode);
	input_report_key(dev->input_dev, dev->last_keycode, 1);
	input_sync(dev->input_dev);
643
}
644

645 646
/**
 * ir_keydown() - generates input event for a key press
647
 * @dev:	the struct rc_dev descriptor of the device
648 649 650 651
 * @scancode:   the scancode that we're seeking
 * @toggle:     the toggle value (protocol dependent, if the protocol doesn't
 *              support toggle values, this should be set to zero)
 *
652 653
 * This routine is used to signal that a key has been pressed on the
 * remote control.
654
 */
655
void ir_keydown(struct rc_dev *dev, int scancode, u8 toggle)
656 657 658 659
{
	unsigned long flags;
	u32 keycode = ir_g_keycode_from_table(dev, scancode);

660
	spin_lock_irqsave(&dev->keylock, flags);
661 662
	ir_do_keydown(dev, scancode, keycode, toggle);

663 664 665
	if (dev->keypressed) {
		dev->keyup_jiffies = jiffies + msecs_to_jiffies(IR_KEYPRESS_TIMEOUT);
		mod_timer(&dev->timer_keyup, dev->keyup_jiffies);
666
	}
667
	spin_unlock_irqrestore(&dev->keylock, flags);
668 669 670
}
EXPORT_SYMBOL_GPL(ir_keydown);

671 672 673
/**
 * ir_keydown_notimeout() - generates input event for a key press without
 *                          an automatic keyup event at a later time
674
 * @dev:	the struct rc_dev descriptor of the device
675 676 677 678
 * @scancode:   the scancode that we're seeking
 * @toggle:     the toggle value (protocol dependent, if the protocol doesn't
 *              support toggle values, this should be set to zero)
 *
679 680
 * This routine is used to signal that a key has been pressed on the
 * remote control. The driver must manually call ir_keyup() at a later stage.
681
 */
682
void ir_keydown_notimeout(struct rc_dev *dev, int scancode, u8 toggle)
683 684 685 686
{
	unsigned long flags;
	u32 keycode = ir_g_keycode_from_table(dev, scancode);

687
	spin_lock_irqsave(&dev->keylock, flags);
688
	ir_do_keydown(dev, scancode, keycode, toggle);
689
	spin_unlock_irqrestore(&dev->keylock, flags);
690 691 692
}
EXPORT_SYMBOL_GPL(ir_keydown_notimeout);

693
static int ir_open(struct input_dev *idev)
694
{
695
	struct rc_dev *rdev = input_get_drvdata(idev);
696

697
	return rdev->open(rdev);
698
}
699

700
static void ir_close(struct input_dev *idev)
701
{
702
	struct rc_dev *rdev = input_get_drvdata(idev);
703

704
	rdev->close(rdev);
705 706
}

707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735
/* class for /sys/class/rc */
static char *ir_devnode(struct device *dev, mode_t *mode)
{
	return kasprintf(GFP_KERNEL, "rc/%s", dev_name(dev));
}

static struct class ir_input_class = {
	.name		= "rc",
	.devnode	= ir_devnode,
};

static struct {
	u64	type;
	char	*name;
} proto_names[] = {
	{ IR_TYPE_UNKNOWN,	"unknown"	},
	{ IR_TYPE_RC5,		"rc-5"		},
	{ IR_TYPE_NEC,		"nec"		},
	{ IR_TYPE_RC6,		"rc-6"		},
	{ IR_TYPE_JVC,		"jvc"		},
	{ IR_TYPE_SONY,		"sony"		},
	{ IR_TYPE_RC5_SZ,	"rc-5-sz"	},
	{ IR_TYPE_LIRC,		"lirc"		},
};

#define PROTO_NONE	"none"

/**
 * show_protocols() - shows the current IR protocol(s)
736
 * @device:	the device descriptor
737 738 739 740 741 742 743 744
 * @mattr:	the device attribute struct (unused)
 * @buf:	a pointer to the output buffer
 *
 * This routine is a callback routine for input read the IR protocol type(s).
 * it is trigged by reading /sys/class/rc/rc?/protocols.
 * It returns the protocol names of supported protocols.
 * Enabled protocols are printed in brackets.
 */
745
static ssize_t show_protocols(struct device *device,
746 747
			      struct device_attribute *mattr, char *buf)
{
748
	struct rc_dev *dev = to_rc_dev(device);
749 750 751 752 753
	u64 allowed, enabled;
	char *tmp = buf;
	int i;

	/* Device is being removed */
754
	if (!dev)
755 756
		return -EINVAL;

757 758 759 760 761
	if (dev->driver_type == RC_DRIVER_SCANCODE) {
		enabled = dev->rc_tab.ir_type;
		allowed = dev->allowed_protos;
	} else {
		enabled = dev->raw->enabled_protocols;
762
		allowed = ir_raw_get_allowed_protocols();
763
	}
764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783

	IR_dprintk(1, "allowed - 0x%llx, enabled - 0x%llx\n",
		   (long long)allowed,
		   (long long)enabled);

	for (i = 0; i < ARRAY_SIZE(proto_names); i++) {
		if (allowed & enabled & proto_names[i].type)
			tmp += sprintf(tmp, "[%s] ", proto_names[i].name);
		else if (allowed & proto_names[i].type)
			tmp += sprintf(tmp, "%s ", proto_names[i].name);
	}

	if (tmp != buf)
		tmp--;
	*tmp = '\n';
	return tmp + 1 - buf;
}

/**
 * store_protocols() - changes the current IR protocol(s)
784
 * @device:	the device descriptor
785 786 787 788
 * @mattr:	the device attribute struct (unused)
 * @buf:	a pointer to the input buffer
 * @len:	length of the input buffer
 *
789
 * This routine is for changing the IR protocol type.
790 791 792 793 794 795 796 797
 * It is trigged by writing to /sys/class/rc/rc?/protocols.
 * Writing "+proto" will add a protocol to the list of enabled protocols.
 * Writing "-proto" will remove a protocol from the list of enabled protocols.
 * Writing "proto" will enable only "proto".
 * Writing "none" will disable all protocols.
 * Returns -EINVAL if an invalid protocol combination or unknown protocol name
 * is used, otherwise @len.
 */
798
static ssize_t store_protocols(struct device *device,
799 800 801 802
			       struct device_attribute *mattr,
			       const char *data,
			       size_t len)
{
803
	struct rc_dev *dev = to_rc_dev(device);
804 805 806 807 808 809 810 811
	bool enable, disable;
	const char *tmp;
	u64 type;
	u64 mask;
	int rc, i, count = 0;
	unsigned long flags;

	/* Device is being removed */
812
	if (!dev)
813 814
		return -EINVAL;

815 816 817 818
	if (dev->driver_type == RC_DRIVER_SCANCODE)
		type = dev->rc_tab.ir_type;
	else if (dev->raw)
		type = dev->raw->enabled_protocols;
819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872
	else {
		IR_dprintk(1, "Protocol switching not supported\n");
		return -EINVAL;
	}

	while ((tmp = strsep((char **) &data, " \n")) != NULL) {
		if (!*tmp)
			break;

		if (*tmp == '+') {
			enable = true;
			disable = false;
			tmp++;
		} else if (*tmp == '-') {
			enable = false;
			disable = true;
			tmp++;
		} else {
			enable = false;
			disable = false;
		}

		if (!enable && !disable && !strncasecmp(tmp, PROTO_NONE, sizeof(PROTO_NONE))) {
			tmp += sizeof(PROTO_NONE);
			mask = 0;
			count++;
		} else {
			for (i = 0; i < ARRAY_SIZE(proto_names); i++) {
				if (!strncasecmp(tmp, proto_names[i].name, strlen(proto_names[i].name))) {
					tmp += strlen(proto_names[i].name);
					mask = proto_names[i].type;
					break;
				}
			}
			if (i == ARRAY_SIZE(proto_names)) {
				IR_dprintk(1, "Unknown protocol: '%s'\n", tmp);
				return -EINVAL;
			}
			count++;
		}

		if (enable)
			type |= mask;
		else if (disable)
			type &= ~mask;
		else
			type = mask;
	}

	if (!count) {
		IR_dprintk(1, "Protocol not specified\n");
		return -EINVAL;
	}

873 874
	if (dev->change_protocol) {
		rc = dev->change_protocol(dev, type);
875 876 877 878 879 880 881
		if (rc < 0) {
			IR_dprintk(1, "Error setting protocols to 0x%llx\n",
				   (long long)type);
			return -EINVAL;
		}
	}

882 883 884 885
	if (dev->driver_type == RC_DRIVER_SCANCODE) {
		spin_lock_irqsave(&dev->rc_tab.lock, flags);
		dev->rc_tab.ir_type = type;
		spin_unlock_irqrestore(&dev->rc_tab.lock, flags);
886
	} else {
887
		dev->raw->enabled_protocols = type;
888 889 890 891 892 893 894 895
	}

	IR_dprintk(1, "Current protocol(s): 0x%llx\n",
		   (long long)type);

	return len;
}

896 897 898 899 900 901 902 903
static void rc_dev_release(struct device *device)
{
	struct rc_dev *dev = to_rc_dev(device);

	kfree(dev);
	module_put(THIS_MODULE);
}

904 905 906 907 908 909 910 911 912
#define ADD_HOTPLUG_VAR(fmt, val...)					\
	do {								\
		int err = add_uevent_var(env, fmt, val);		\
		if (err)						\
			return err;					\
	} while (0)

static int rc_dev_uevent(struct device *device, struct kobj_uevent_env *env)
{
913
	struct rc_dev *dev = to_rc_dev(device);
914

915 916 917 918
	if (dev->rc_tab.name)
		ADD_HOTPLUG_VAR("NAME=%s", dev->rc_tab.name);
	if (dev->driver_name)
		ADD_HOTPLUG_VAR("DRV_NAME=%s", dev->driver_name);
919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944

	return 0;
}

/*
 * Static device attribute struct with the sysfs attributes for IR's
 */
static DEVICE_ATTR(protocols, S_IRUGO | S_IWUSR,
		   show_protocols, store_protocols);

static struct attribute *rc_dev_attrs[] = {
	&dev_attr_protocols.attr,
	NULL,
};

static struct attribute_group rc_dev_attr_grp = {
	.attrs	= rc_dev_attrs,
};

static const struct attribute_group *rc_dev_attr_groups[] = {
	&rc_dev_attr_grp,
	NULL
};

static struct device_type rc_dev_type = {
	.groups		= rc_dev_attr_groups,
945
	.release	= rc_dev_release,
946 947 948
	.uevent		= rc_dev_uevent,
};

949
struct rc_dev *rc_allocate_device(void)
950
{
951
	struct rc_dev *dev;
952

953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969
	dev = kzalloc(sizeof(*dev), GFP_KERNEL);
	if (!dev)
		return NULL;

	dev->input_dev = input_allocate_device();
	if (!dev->input_dev) {
		kfree(dev);
		return NULL;
	}

	dev->input_dev->getkeycode_new = ir_getkeycode;
	dev->input_dev->setkeycode_new = ir_setkeycode;
	input_set_drvdata(dev->input_dev, dev);

	spin_lock_init(&dev->rc_tab.lock);
	spin_lock_init(&dev->keylock);
	setup_timer(&dev->timer_keyup, ir_timer_keyup, (unsigned long)dev);
970

971 972 973 974 975 976 977 978 979 980
	dev->dev.type = &rc_dev_type;
	dev->dev.class = &ir_input_class;
	device_initialize(&dev->dev);

	__module_get(THIS_MODULE);
	return dev;
}
EXPORT_SYMBOL_GPL(rc_allocate_device);

void rc_free_device(struct rc_dev *dev)
981
{
982 983 984 985 986 987 988 989 990 991 992
	if (dev) {
		input_free_device(dev->input_dev);
		put_device(&dev->dev);
	}
}
EXPORT_SYMBOL_GPL(rc_free_device);

int rc_register_device(struct rc_dev *dev)
{
	static atomic_t devno = ATOMIC_INIT(0);
	struct ir_scancode_table *rc_tab;
993
	const char *path;
994
	int rc;
995

996 997
	if (!dev || !dev->map_name)
		return -EINVAL;
998

999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018
	rc_tab = get_rc_map(dev->map_name);
	if (!rc_tab)
		rc_tab = get_rc_map(RC_MAP_EMPTY);
	if (!rc_tab || !rc_tab->scan || rc_tab->size == 0)
		return -EINVAL;

	set_bit(EV_KEY, dev->input_dev->evbit);
	set_bit(EV_REP, dev->input_dev->evbit);
	set_bit(EV_MSC, dev->input_dev->evbit);
	set_bit(MSC_SCAN, dev->input_dev->mscbit);
	if (dev->open)
		dev->input_dev->open = ir_open;
	if (dev->close)
		dev->input_dev->close = ir_close;

	dev->devno = (unsigned long)(atomic_inc_return(&devno) - 1);
	dev_set_name(&dev->dev, "rc%ld", dev->devno);
	dev_set_drvdata(&dev->dev, dev);
	rc = device_add(&dev->dev);
	if (rc)
1019 1020
		return rc;

1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031
	rc = ir_setkeytable(dev, rc_tab);
	if (rc)
		goto out_dev;

	dev->input_dev->dev.parent = &dev->dev;
	memcpy(&dev->input_dev->id, &dev->input_id, sizeof(dev->input_id));
	dev->input_dev->phys = dev->input_phys;
	dev->input_dev->name = dev->input_name;
	rc = input_register_device(dev->input_dev);
	if (rc)
		goto out_table;
1032

1033 1034 1035 1036 1037 1038 1039 1040 1041
	/*
	 * Default delay of 250ms is too short for some protocols, expecially
	 * since the timeout is currently set to 250ms. Increase it to 500ms,
	 * to avoid wrong repetition of the keycodes. Note that this must be
	 * set after the call to input_register_device().
	 */
	dev->input_dev->rep[REP_DELAY] = 500;

	path = kobject_get_path(&dev->dev.kobj, GFP_KERNEL);
1042
	printk(KERN_INFO "%s: %s as %s\n",
1043 1044
		dev_name(&dev->dev),
		dev->input_name ? dev->input_name : "Unspecified device",
1045 1046 1047
		path ? path : "N/A");
	kfree(path);

1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065
	if (dev->driver_type == RC_DRIVER_IR_RAW) {
		rc = ir_raw_event_register(dev);
		if (rc < 0)
			goto out_input;
	}

	if (dev->change_protocol) {
		rc = dev->change_protocol(dev, rc_tab->ir_type);
		if (rc < 0)
			goto out_raw;
	}

	IR_dprintk(1, "Registered rc%ld (driver: %s, remote: %s, mode %s)\n",
		   dev->devno,
		   dev->driver_name ? dev->driver_name : "unknown",
		   rc_tab->name ? rc_tab->name : "unknown",
		   dev->driver_type == RC_DRIVER_IR_RAW ? "raw" : "cooked");

1066
	return 0;
1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078

out_raw:
	if (dev->driver_type == RC_DRIVER_IR_RAW)
		ir_raw_event_unregister(dev);
out_input:
	input_unregister_device(dev->input_dev);
	dev->input_dev = NULL;
out_table:
	ir_free_table(&dev->rc_tab);
out_dev:
	device_del(&dev->dev);
	return rc;
1079
}
1080
EXPORT_SYMBOL_GPL(rc_register_device);
1081

1082
void rc_unregister_device(struct rc_dev *dev)
1083
{
1084 1085
	if (!dev)
		return;
1086

1087
	del_timer_sync(&dev->timer_keyup);
1088

1089 1090 1091 1092 1093 1094 1095 1096 1097 1098
	if (dev->driver_type == RC_DRIVER_IR_RAW)
		ir_raw_event_unregister(dev);

	input_unregister_device(dev->input_dev);
	dev->input_dev = NULL;

	ir_free_table(&dev->rc_tab);
	IR_dprintk(1, "Freed keycode table\n");

	device_unregister(&dev->dev);
1099
}
1100
EXPORT_SYMBOL_GPL(rc_unregister_device);
1101 1102 1103 1104 1105

/*
 * Init/exit code for the module. Basically, creates/removes /sys/class/rc
 */

1106
static int __init rc_core_init(void)
1107 1108 1109
{
	int rc = class_register(&ir_input_class);
	if (rc) {
1110
		printk(KERN_ERR "rc_core: unable to register rc class\n");
1111 1112 1113 1114 1115
		return rc;
	}

	/* Initialize/load the decoders/keymap code that will be used */
	ir_raw_init();
1116
	ir_register_map(&empty_map);
1117 1118 1119 1120

	return 0;
}

1121
static void __exit rc_core_exit(void)
1122 1123
{
	class_unregister(&ir_input_class);
1124
	ir_unregister_map(&empty_map);
1125 1126
}

1127 1128
module_init(rc_core_init);
module_exit(rc_core_exit);
1129

1130 1131 1132
int rc_core_debug;    /* ir_debug level (0,1,2) */
EXPORT_SYMBOL_GPL(rc_core_debug);
module_param_named(debug, rc_core_debug, int, 0644);
1133 1134 1135

MODULE_AUTHOR("Mauro Carvalho Chehab <mchehab@redhat.com>");
MODULE_LICENSE("GPL");