rc-main.c 29.1 KB
Newer Older
1
/* rc-main.c - Remote Controller core module
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
static LIST_HEAD(rc_map_list);
static DEFINE_SPINLOCK(rc_map_lock);

34
static struct rc_map_list *seek_rc_map(const char *name)
35
{
36
	struct rc_map_list *map = NULL;
37 38 39 40 41 42 43 44 45 46 47 48 49

	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;
}

50
struct rc_map *rc_map_get(const char *name)
51 52
{

53
	struct rc_map_list *map;
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76

	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;
}
77
EXPORT_SYMBOL_GPL(rc_map_get);
78

79
int rc_map_register(struct rc_map_list *map)
80 81 82 83 84 85
{
	spin_lock(&rc_map_lock);
	list_add_tail(&map->list, &rc_map_list);
	spin_unlock(&rc_map_lock);
	return 0;
}
86
EXPORT_SYMBOL_GPL(rc_map_register);
87

88
void rc_map_unregister(struct rc_map_list *map)
89 90 91 92 93
{
	spin_lock(&rc_map_lock);
	list_del(&map->list);
	spin_unlock(&rc_map_lock);
}
94
EXPORT_SYMBOL_GPL(rc_map_unregister);
95 96


97
static struct rc_map_table empty[] = {
98 99 100
	{ 0x2a, KEY_COFFEE },
};

101
static struct rc_map_list empty_map = {
102 103 104
	.map = {
		.scan    = empty,
		.size    = ARRAY_SIZE(empty),
105
		.rc_type = RC_TYPE_UNKNOWN,	/* Legacy IR type */
106 107 108 109
		.name    = RC_MAP_EMPTY,
	}
};

110 111
/**
 * ir_create_table() - initializes a scancode table
112
 * @rc_map:	the rc_map to initialize
113
 * @name:	name to assign to the table
114
 * @rc_type:	ir type to assign to the new table
115 116 117
 * @size:	initial size of the table
 * @return:	zero on success or a negative error code
 *
118
 * This routine will initialize the rc_map and will allocate
119
 * memory to hold at least the specified number of elements.
120
 */
121
static int ir_create_table(struct rc_map *rc_map,
122
			   const char *name, u64 rc_type, size_t size)
123
{
124 125
	rc_map->name = name;
	rc_map->rc_type = rc_type;
126 127
	rc_map->alloc = roundup_pow_of_two(size * sizeof(struct rc_map_table));
	rc_map->size = rc_map->alloc / sizeof(struct rc_map_table);
128 129
	rc_map->scan = kmalloc(rc_map->alloc, GFP_KERNEL);
	if (!rc_map->scan)
130 131 132
		return -ENOMEM;

	IR_dprintk(1, "Allocated space for %u keycode entries (%u bytes)\n",
133
		   rc_map->size, rc_map->alloc);
134 135 136 137 138
	return 0;
}

/**
 * ir_free_table() - frees memory allocated by a scancode table
139
 * @rc_map:	the table whose mappings need to be freed
140 141 142 143
 *
 * This routine will free memory alloctaed for key mappings used by given
 * scancode table.
 */
144
static void ir_free_table(struct rc_map *rc_map)
145
{
146 147 148
	rc_map->size = 0;
	kfree(rc_map->scan);
	rc_map->scan = NULL;
149 150
}

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

167
	if (rc_map->size == rc_map->len) {
168
		/* All entries in use -> grow keytable */
169
		if (rc_map->alloc >= IR_TAB_MAX_SIZE)
170
			return -ENOMEM;
171

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

176
	if ((rc_map->len * 3 < rc_map->size) && (oldalloc > IR_TAB_MIN_SIZE)) {
177 178 179 180
		/* 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
	memcpy(newscan, rc_map->scan, rc_map->len * sizeof(struct rc_map_table));
192 193
	rc_map->scan = newscan;
	rc_map->alloc = newalloc;
194
	rc_map->size = rc_map->alloc / sizeof(struct rc_map_table);
195 196
	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
 * @rc_map:	scancode table to be adjusted
203 204 205 206
 * @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
				      struct rc_map *rc_map,
212 213 214
				      unsigned int index,
				      unsigned int new_keycode)
{
215
	int old_keycode = rc_map->scan[index].keycode;
216 217 218 219 220
	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",
221 222 223
			   index, rc_map->scan[index].scancode);
		rc_map->len--;
		memmove(&rc_map->scan[index], &rc_map->scan[index+ 1],
224
			(rc_map->len - index) * sizeof(struct rc_map_table));
225 226 227 228
	} else {
		IR_dprintk(1, "#%d: %s scan 0x%04x with key 0x%04x\n",
			   index,
			   old_keycode == KEY_RESERVED ? "New" : "Replacing",
229 230
			   rc_map->scan[index].scancode, new_keycode);
		rc_map->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
		/* ... but another scancode might use the same keycode */
238 239
		for (i = 0; i < rc_map->len; i++) {
			if (rc_map->scan[i].keycode == old_keycode) {
240
				__set_bit(old_keycode, dev->input_dev->keybit);
241 242 243 244 245
				break;
			}
		}

		/* Possibly shrink the keytable, failure is not a problem */
246
		ir_resize_table(rc_map, GFP_ATOMIC);
247 248 249 250 251 252
	}

	return old_keycode;
}

/**
253
 * ir_establish_scancode() - set a keycode in the scancode->keycode table
254
 * @dev:	the struct rc_dev device descriptor
255
 * @rc_map:	scancode table to be searched
256 257 258 259 260
 * @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
 * This routine is used to locate given scancode in rc_map.
263 264
 * 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
					  struct rc_map *rc_map,
268 269
					  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

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

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

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

300
	/* i is the proper index to insert our new keycode */
301 302
	if (i < rc_map->len)
		memmove(&rc_map->scan[i + 1], &rc_map->scan[i],
303
			(rc_map->len - i) * sizeof(struct rc_map_table));
304 305 306
	rc_map->scan[i].scancode = scancode;
	rc_map->scan[i].keycode = KEY_RESERVED;
	rc_map->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
	struct rc_dev *rdev = input_get_drvdata(idev);
325
	struct rc_map *rc_map = &rdev->rc_map;
326 327
	unsigned int index;
	unsigned int scancode;
328
	int retval = 0;
329
	unsigned long flags;
330

331
	spin_lock_irqsave(&rc_map->lock, flags);
332 333 334

	if (ke->flags & INPUT_KEYMAP_BY_INDEX) {
		index = ke->index;
335
		if (index >= rc_map->len) {
336 337 338 339 340 341 342 343
			retval = -EINVAL;
			goto out;
		}
	} else {
		retval = input_scancode_to_scalar(ke, &scancode);
		if (retval)
			goto out;

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

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

out:
354
	spin_unlock_irqrestore(&rc_map->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 rc_map to copy entries to
 * @from:	the struct rc_map 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 rc_map *from)
369
{
370
	struct rc_map *rc_map = &dev->rc_map;
371 372 373
	unsigned int i, index;
	int rc;

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

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

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

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

	if (rc)
395
		ir_free_table(rc_map);
396

397
	return rc;
398 399
}

400 401
/**
 * ir_lookup_by_scancode() - locate mapping by scancode
402
 * @rc_map:	the struct rc_map to search
403 404 405 406 407 408
 * @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.
 */
409
static unsigned int ir_lookup_by_scancode(const struct rc_map *rc_map,
410 411
					  unsigned int scancode)
{
412
	int start = 0;
413
	int end = rc_map->len - 1;
414
	int mid;
415 416 417

	while (start <= end) {
		mid = (start + end) / 2;
418
		if (rc_map->scan[mid].scancode < scancode)
419
			start = mid + 1;
420
		else if (rc_map->scan[mid].scancode > scancode)
421 422 423 424 425 426 427 428
			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
	struct rc_dev *rdev = input_get_drvdata(idev);
442
	struct rc_map *rc_map = &rdev->rc_map;
443
	struct rc_map_table *entry;
444 445 446 447
	unsigned long flags;
	unsigned int index;
	unsigned int scancode;
	int retval;
448

449
	spin_lock_irqsave(&rc_map->lock, flags);
450 451 452 453 454 455 456 457

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

458
		index = ir_lookup_by_scancode(rc_map, scancode);
459 460
	}

461
	if (index >= rc_map->len) {
462 463 464 465 466
		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_map->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
out:
479
	spin_unlock_irqrestore(&rc_map->lock, flags);
480
	return retval;
481 482 483
}

/**
484
 * rc_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 rc_g_keycode_from_table(struct rc_dev *dev, u32 scancode)
494
{
495
	struct rc_map *rc_map = &dev->rc_map;
496 497 498 499
	unsigned int keycode;
	unsigned int index;
	unsigned long flags;

500
	spin_lock_irqsave(&rc_map->lock, flags);
501

502 503 504
	index = ir_lookup_by_scancode(rc_map, scancode);
	keycode = index < rc_map->len ?
			rc_map->scan[index].keycode : KEY_RESERVED;
505

506
	spin_unlock_irqrestore(&rc_map->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(rc_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
 * rc_keyup() - signals the release of a keypress
536
 * @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 rc_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(rc_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
 * rc_repeat() - signals that a key is still pressed
581
 * @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 rc_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(rc_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
 * rc_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 rc_keydown(struct rc_dev *dev, int scancode, u8 toggle)
656 657
{
	unsigned long flags;
658
	u32 keycode = rc_g_keycode_from_table(dev, scancode);
659

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
EXPORT_SYMBOL_GPL(rc_keydown);
670

671
/**
672
 * rc_keydown_notimeout() - generates input event for a key press without
673
 *                          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
 * This routine is used to signal that a key has been pressed on the
680
 * remote control. The driver must manually call rc_keyup() at a later stage.
681
 */
682
void rc_keydown_notimeout(struct rc_dev *dev, int scancode, u8 toggle)
683 684
{
	unsigned long flags;
685
	u32 keycode = rc_g_keycode_from_table(dev, scancode);
686

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

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
/* 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[] = {
722 723 724 725 726 727 728 729
	{ RC_TYPE_UNKNOWN,	"unknown"	},
	{ RC_TYPE_RC5,		"rc-5"		},
	{ RC_TYPE_NEC,		"nec"		},
	{ RC_TYPE_RC6,		"rc-6"		},
	{ RC_TYPE_JVC,		"jvc"		},
	{ RC_TYPE_SONY,		"sony"		},
	{ RC_TYPE_RC5_SZ,	"rc-5-sz"	},
	{ RC_TYPE_LIRC,		"lirc"		},
730 731 732 733 734 735
};

#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
	if (dev->driver_type == RC_DRIVER_SCANCODE) {
758
		enabled = dev->rc_map.rc_type;
759 760 761
		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
	if (dev->driver_type == RC_DRIVER_SCANCODE)
816
		type = dev->rc_map.rc_type;
817 818
	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
	if (dev->driver_type == RC_DRIVER_SCANCODE) {
883 884 885
		spin_lock_irqsave(&dev->rc_map.lock, flags);
		dev->rc_map.rc_type = type;
		spin_unlock_irqrestore(&dev->rc_map.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
	if (dev->rc_map.name)
		ADD_HOTPLUG_VAR("NAME=%s", dev->rc_map.name);
917 918
	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
	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);

967
	spin_lock_init(&dev->rc_map.lock);
968 969
	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
	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);
992
	struct rc_map *rc_map;
993
	const char *path;
994
	int rc;
995

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

999
	rc_map = rc_map_get(dev->map_name);
1000
	if (!rc_map)
1001
		rc_map = rc_map_get(RC_MAP_EMPTY);
1002
	if (!rc_map || !rc_map->scan || rc_map->size == 0)
1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018
		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
	rc = ir_setkeytable(dev, rc_map);
1022 1023 1024 1025 1026 1027 1028 1029 1030 1031
	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
	if (dev->driver_type == RC_DRIVER_IR_RAW) {
		rc = ir_raw_event_register(dev);
		if (rc < 0)
			goto out_input;
	}

	if (dev->change_protocol) {
1055
		rc = dev->change_protocol(dev, rc_map->rc_type);
1056 1057 1058 1059 1060 1061 1062
		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",
1063
		   rc_map->name ? rc_map->name : "unknown",
1064 1065
		   dev->driver_type == RC_DRIVER_IR_RAW ? "raw" : "cooked");

1066
	return 0;
1067 1068 1069 1070 1071 1072 1073 1074

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:
1075
	ir_free_table(&dev->rc_map);
1076 1077 1078
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
	if (dev->driver_type == RC_DRIVER_IR_RAW)
		ir_raw_event_unregister(dev);

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

1095
	ir_free_table(&dev->rc_map);
1096 1097 1098
	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
	rc_map_register(&empty_map);
1117 1118 1119 1120

	return 0;
}

1121
static void __exit rc_core_exit(void)
1122 1123
{
	class_unregister(&ir_input_class);
1124
	rc_map_unregister(&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");