saa7134-input.c 29.1 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
/*
 *
 * handle saa7134 IR remotes via linux kernel input layer.
 *
 * 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; either version 2 of the License, or
 * (at your option) any later version.
 *
 * 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.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 *
 */

#include <linux/module.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/interrupt.h>
25
#include <linux/slab.h>
L
Linus Torvalds 已提交
26 27 28 29

#include "saa7134-reg.h"
#include "saa7134.h"

30
#define MODULE_NAME "saa7134"
31

32
static unsigned int disable_ir;
L
Linus Torvalds 已提交
33 34 35
module_param(disable_ir, int, 0444);
MODULE_PARM_DESC(disable_ir,"disable infrared remote support");

36
static unsigned int ir_debug;
L
Linus Torvalds 已提交
37 38 39
module_param(ir_debug, int, 0644);
MODULE_PARM_DESC(ir_debug,"enable debug messages [IR]");

40
static int pinnacle_remote;
41 42 43
module_param(pinnacle_remote, int, 0644);    /* Choose Pinnacle PCTV remote */
MODULE_PARM_DESC(pinnacle_remote, "Specify Pinnacle PCTV remote: 0=coloured, 1=grey (defaults to 0)");

44
static int ir_rc5_remote_gap = 885;
45 46
module_param(ir_rc5_remote_gap, int, 0644);

47 48 49 50 51
static unsigned int disable_other_ir;
module_param(disable_other_ir, int, 0644);
MODULE_PARM_DESC(disable_other_ir, "disable full codes of "
    "alternative remotes from other manufacturers");

L
Linus Torvalds 已提交
52 53
#define dprintk(fmt, arg...)	if (ir_debug) \
	printk(KERN_DEBUG "%s/ir: " fmt, dev->name , ## arg)
54
#define i2cdprintk(fmt, arg...)    if (ir_debug) \
55
	printk(KERN_DEBUG "%s/ir: " fmt, ir->name , ## arg)
L
Linus Torvalds 已提交
56

57 58 59
/* Helper functions for RC5 and NEC decoding at GPIO16 or GPIO18 */
static int saa7134_rc5_irq(struct saa7134_dev *dev);
static int saa7134_nec_irq(struct saa7134_dev *dev);
60
static int saa7134_raw_decode_irq(struct saa7134_dev *dev);
61
static void nec_task(unsigned long data);
62

63
/* -------------------- GPIO generic keycode builder -------------------- */
L
Linus Torvalds 已提交
64 65 66

static int build_key(struct saa7134_dev *dev)
{
67
	struct card_ir *ir = dev->remote;
L
Linus Torvalds 已提交
68 69
	u32 gpio, data;

70 71 72 73 74 75 76
	/* here comes the additional handshake steps for some cards */
	switch (dev->board) {
	case SAA7134_BOARD_GOTVIEW_7135:
		saa_setb(SAA7134_GPIO_GPSTATUS1, 0x80);
		saa_clearb(SAA7134_GPIO_GPSTATUS1, 0x80);
		break;
	}
L
Linus Torvalds 已提交
77 78 79 80 81
	/* rising SAA7134_GPIO_GPRESCAN reads the status */
	saa_clearb(SAA7134_GPIO_GPMODE3,SAA7134_GPIO_GPRESCAN);
	saa_setb(SAA7134_GPIO_GPMODE3,SAA7134_GPIO_GPRESCAN);

	gpio = saa_readl(SAA7134_GPIO_GPSTATUS0 >> 2);
82 83 84 85 86
	if (ir->polling) {
		if (ir->last_gpio == gpio)
			return 0;
		ir->last_gpio = gpio;
	}
L
Linus Torvalds 已提交
87

88
	data = ir_extract_bits(gpio, ir->mask_keycode);
L
Linus Torvalds 已提交
89 90 91
	dprintk("build_key gpio=0x%x mask=0x%x data=%d\n",
		gpio, ir->mask_keycode, data);

92 93 94
	switch (dev->board) {
	case SAA7134_BOARD_KWORLD_PLUS_TV_ANALOG:
		if (data == ir->mask_keycode)
95
			ir_keyup(ir->dev);
96
		else
97
			ir_keydown_notimeout(ir->dev, data, 0);
98 99 100
		return 0;
	}

101 102 103
	if (ir->polling) {
		if ((ir->mask_keydown  &&  (0 != (gpio & ir->mask_keydown))) ||
		    (ir->mask_keyup    &&  (0 == (gpio & ir->mask_keyup)))) {
104
			ir_keydown_notimeout(ir->dev, data, 0);
105
		} else {
106
			ir_keyup(ir->dev);
107
		}
L
Linus Torvalds 已提交
108
	}
109 110 111
	else {	/* IRQ driven mode - handle key press and release in one go */
		if ((ir->mask_keydown  &&  (0 != (gpio & ir->mask_keydown))) ||
		    (ir->mask_keyup    &&  (0 == (gpio & ir->mask_keyup)))) {
112 113
			ir_keydown_notimeout(ir->dev, data, 0);
			ir_keyup(ir->dev);
114 115 116
		}
	}

L
Linus Torvalds 已提交
117 118 119
	return 0;
}

120 121
/* --------------------- Chip specific I2C key builders ----------------- */

122 123 124 125 126 127 128 129 130 131
static int get_key_flydvb_trio(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
{
	int gpio;
	int attempt = 0;
	unsigned char b;

	/* We need this to access GPI Used by the saa_readl macro. */
	struct saa7134_dev *dev = ir->c->adapter->algo_data;

	if (dev == NULL) {
132 133
		i2cdprintk("get_key_flydvb_trio: "
			   "ir->c->adapter->algo_data is NULL!\n");
134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176
		return -EIO;
	}

	/* rising SAA7134_GPIGPRESCAN reads the status */
	saa_clearb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);
	saa_setb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);

	gpio = saa_readl(SAA7134_GPIO_GPSTATUS0 >> 2);

	if (0x40000 & ~gpio)
		return 0; /* No button press */

	/* No button press - only before first key pressed */
	if (b == 0xFF)
		return 0;

	/* poll IR chip */
	/* weak up the IR chip */
	b = 0;

	while (1 != i2c_master_send(ir->c, &b, 1)) {
		if ((attempt++) < 10) {
			/*
			 * wait a bit for next attempt -
			 * I don't know how make it better
			 */
			msleep(10);
			continue;
		}
		i2cdprintk("send wake up byte to pic16C505 (IR chip)"
			   "failed %dx\n", attempt);
		return -EIO;
	}
	if (1 != i2c_master_recv(ir->c, &b, 1)) {
		i2cdprintk("read error\n");
		return -EIO;
	}

	*ir_key = b;
	*ir_raw = b;
	return 1;
}

177 178 179 180 181 182 183
static int get_key_msi_tvanywhere_plus(struct IR_i2c *ir, u32 *ir_key,
				       u32 *ir_raw)
{
	unsigned char b;
	int gpio;

	/* <dev> is needed to access GPIO. Used by the saa_readl macro. */
184
	struct saa7134_dev *dev = ir->c->adapter->algo_data;
185
	if (dev == NULL) {
186 187
		i2cdprintk("get_key_msi_tvanywhere_plus: "
			   "ir->c->adapter->algo_data is NULL!\n");
188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205
		return -EIO;
	}

	/* rising SAA7134_GPIO_GPRESCAN reads the status */

	saa_clearb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);
	saa_setb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);

	gpio = saa_readl(SAA7134_GPIO_GPSTATUS0 >> 2);

	/* GPIO&0x40 is pulsed low when a button is pressed. Don't do
	   I2C receive if gpio&0x40 is not low. */

	if (gpio & 0x40)
		return 0;       /* No button press */

	/* GPIO says there is a button press. Get it. */

206
	if (1 != i2c_master_recv(ir->c, &b, 1)) {
207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223
		i2cdprintk("read error\n");
		return -EIO;
	}

	/* No button press */

	if (b == 0xff)
		return 0;

	/* Button pressed */

	dprintk("get_key_msi_tvanywhere_plus: Key = 0x%02X\n", b);
	*ir_key = b;
	*ir_raw = b;
	return 1;
}

224 225 226 227 228
static int get_key_purpletv(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
{
	unsigned char b;

	/* poll IR chip */
229
	if (1 != i2c_master_recv(ir->c, &b, 1)) {
230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246
		i2cdprintk("read error\n");
		return -EIO;
	}

	/* no button press */
	if (b==0)
		return 0;

	/* repeating */
	if (b & 0x80)
		return 1;

	*ir_key = b;
	*ir_raw = b;
	return 1;
}

247 248 249 250 251
static int get_key_hvr1110(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
{
	unsigned char buf[5], cod4, code3, code4;

	/* poll IR chip */
252
	if (5 != i2c_master_recv(ir->c, buf, 5))
253 254 255 256 257 258 259 260 261 262 263 264 265 266 267
		return -EIO;

	cod4	= buf[4];
	code4	= (cod4 >> 2);
	code3	= buf[3];
	if (code3 == 0)
		/* no key pressed */
		return 0;

	/* return key */
	*ir_key = code4;
	*ir_raw = code4;
	return 1;
}

268 269 270 271 272 273

static int get_key_beholdm6xx(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
{
	unsigned char data[12];
	u32 gpio;

274
	struct saa7134_dev *dev = ir->c->adapter->algo_data;
275 276 277 278 279 280 281

	/* rising SAA7134_GPIO_GPRESCAN reads the status */
	saa_clearb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);
	saa_setb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);

	gpio = saa_readl(SAA7134_GPIO_GPSTATUS0 >> 2);

282
	if (0x400000 & ~gpio)
283 284
		return 0; /* No button press */

285
	ir->c->addr = 0x5a >> 1;
286

287
	if (12 != i2c_master_recv(ir->c, data, 12)) {
288 289 290 291 292 293 294 295 296 297 298 299 300
		i2cdprintk("read error\n");
		return -EIO;
	}
	/* IR of this card normally decode signals NEC-standard from
	 * - Sven IHOO MT 5.1R remote. xxyye718
	 * - Sven DVD HD-10xx remote. xxyyf708
	 * - BBK ...
	 * - mayby others
	 * So, skip not our, if disable full codes mode.
	 */
	if (data[10] != 0x6b && data[11] != 0x86 && disable_other_ir)
		return 0;

301 302 303 304
	/* Wrong data decode fix */
	if (data[9] != (unsigned char)(~data[8]))
		return 0;

305 306 307 308 309 310
	*ir_key = data[9];
	*ir_raw = data[9];

	return 1;
}

311 312 313 314 315 316 317 318 319 320
/* Common (grey or coloured) pinnacle PCTV remote handling
 *
 */
static int get_key_pinnacle(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw,
			    int parity_offset, int marker, int code_modulo)
{
	unsigned char b[4];
	unsigned int start = 0,parity = 0,code = 0;

	/* poll IR chip */
321
	if (4 != i2c_master_recv(ir->c, b, 4)) {
322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388
		i2cdprintk("read error\n");
		return -EIO;
	}

	for (start = 0; start < ARRAY_SIZE(b); start++) {
		if (b[start] == marker) {
			code=b[(start+parity_offset + 1) % 4];
			parity=b[(start+parity_offset) % 4];
		}
	}

	/* Empty Request */
	if (parity == 0)
		return 0;

	/* Repeating... */
	if (ir->old == parity)
		return 0;

	ir->old = parity;

	/* drop special codes when a key is held down a long time for the grey controller
	   In this case, the second bit of the code is asserted */
	if (marker == 0xfe && (code & 0x40))
		return 0;

	code %= code_modulo;

	*ir_raw = code;
	*ir_key = code;

	i2cdprintk("Pinnacle PCTV key %02x\n", code);

	return 1;
}

/* The grey pinnacle PCTV remote
 *
 *  There are one issue with this remote:
 *   - I2c packet does not change when the same key is pressed quickly. The workaround
 *     is to hold down each key for about half a second, so that another code is generated
 *     in the i2c packet, and the function can distinguish key presses.
 *
 * Sylvain Pasche <sylvain.pasche@gmail.com>
 */
static int get_key_pinnacle_grey(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
{

	return get_key_pinnacle(ir, ir_key, ir_raw, 1, 0xfe, 0xff);
}


/* The new pinnacle PCTV remote (with the colored buttons)
 *
 * Ricardo Cerqueira <v4l@cerqueira.org>
 */
static int get_key_pinnacle_color(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
{
	/* code_modulo parameter (0x88) is used to reduce code value to fit inside IR_KEYTAB_SIZE
	 *
	 * this is the only value that results in 42 unique
	 * codes < 128
	 */

	return get_key_pinnacle(ir, ir_key, ir_raw, 2, 0x80, 0x88);
}

L
Linus Torvalds 已提交
389 390
void saa7134_input_irq(struct saa7134_dev *dev)
{
391 392 393 394 395 396 397 398
	struct card_ir *ir;

	if (!dev || !dev->remote)
		return;

	ir = dev->remote;
	if (!ir->running)
		return;
L
Linus Torvalds 已提交
399

400 401 402
	if (ir->nec_gpio) {
		saa7134_nec_irq(dev);
	} else if (!ir->polling && !ir->rc5_gpio && !ir->raw_decode) {
L
Linus Torvalds 已提交
403
		build_key(dev);
404 405
	} else if (ir->rc5_gpio) {
		saa7134_rc5_irq(dev);
406 407
	} else if (ir->raw_decode) {
		saa7134_raw_decode_irq(dev);
408
	}
L
Linus Torvalds 已提交
409 410 411 412
}

static void saa7134_input_timer(unsigned long data)
{
413
	struct saa7134_dev *dev = (struct saa7134_dev *)data;
414
	struct card_ir *ir = dev->remote;
L
Linus Torvalds 已提交
415 416

	build_key(dev);
417
	mod_timer(&ir->timer, jiffies + msecs_to_jiffies(ir->polling));
L
Linus Torvalds 已提交
418 419
}

420
static void ir_raw_decode_timer_end(unsigned long data)
421 422
{
	struct saa7134_dev *dev = (struct saa7134_dev *)data;
423
	struct card_ir *ir = dev->remote;
424

425
	ir_raw_event_handle(dev->remote->dev);
426 427

	ir->active = 0;
428 429
}

430
static int __saa7134_ir_start(void *priv)
431
{
432 433 434 435 436 437 438 439 440 441
	struct saa7134_dev *dev = priv;
	struct card_ir *ir;

	if (!dev)
		return -EINVAL;

	ir  = dev->remote;
	if (!ir)
		return -EINVAL;

442
	if (ir->running)
443
		return 0;
444 445

	ir->running = 1;
446
	if (ir->polling) {
447 448
		setup_timer(&ir->timer, saa7134_input_timer,
			    (unsigned long)dev);
449 450
		ir->timer.expires  = jiffies + HZ;
		add_timer(&ir->timer);
451 452 453 454 455 456 457 458 459 460 461
	} else if (ir->rc5_gpio) {
		/* set timer_end for code completion */
		init_timer(&ir->timer_end);
		ir->timer_end.function = ir_rc5_timer_end;
		ir->timer_end.data = (unsigned long)ir;
		ir->shift_by = 2;
		ir->start = 0x2;
		ir->addr = 0x17;
		ir->rc5_remote_gap = ir_rc5_remote_gap;
	} else if (ir->nec_gpio) {
		tasklet_init(&ir->tlet, nec_task, (unsigned long)dev);
462 463 464 465 466
	} else if (ir->raw_decode) {
		/* set timer_end for code completion */
		init_timer(&ir->timer_end);
		ir->timer_end.function = ir_raw_decode_timer_end;
		ir->timer_end.data = (unsigned long)dev;
467
		ir->active = 0;
468
	}
469 470

	return 0;
471 472
}

473
static void __saa7134_ir_stop(void *priv)
474
{
475 476 477 478 479 480 481 482 483
	struct saa7134_dev *dev = priv;
	struct card_ir *ir;

	if (!dev)
		return;

	ir  = dev->remote;
	if (!ir)
		return;
484 485 486

	if (!ir->running)
		return;
487 488
	if (dev->remote->polling)
		del_timer_sync(&dev->remote->timer);
489 490 491 492
	else if (ir->rc5_gpio)
		del_timer_sync(&ir->timer_end);
	else if (ir->nec_gpio)
		tasklet_kill(&ir->tlet);
493
	else if (ir->raw_decode) {
494
		del_timer_sync(&ir->timer_end);
495 496
		ir->active = 0;
	}
497

498
	ir->running = 0;
499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516

	return;
}

int saa7134_ir_start(struct saa7134_dev *dev)
{
	if (dev->remote->users)
		return __saa7134_ir_start(dev);

	return 0;
}

void saa7134_ir_stop(struct saa7134_dev *dev)
{
	if (dev->remote->users)
		__saa7134_ir_stop(dev);
}

517
static int saa7134_ir_open(struct rc_dev *rc)
518
{
519
	struct saa7134_dev *dev = rc->priv;
520 521 522 523 524

	dev->remote->users++;
	return __saa7134_ir_start(dev);
}

525
static void saa7134_ir_close(struct rc_dev *rc)
526
{
527
	struct saa7134_dev *dev = rc->priv;
528 529 530 531

	dev->remote->users--;
	if (!dev->remote->users)
		__saa7134_ir_stop(dev);
532 533
}

534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567

static int saa7134_ir_change_protocol(struct rc_dev *rc, u64 ir_type)
{
	struct saa7134_dev *dev = rc->priv;
	struct card_ir *ir = dev->remote;
	u32 nec_gpio, rc5_gpio;

	if (ir_type == IR_TYPE_RC5) {
		dprintk("Changing protocol to RC5\n");
		nec_gpio = 0;
		rc5_gpio = 1;
	} else if (ir_type == IR_TYPE_NEC) {
		dprintk("Changing protocol to NEC\n");
		nec_gpio = 1;
		rc5_gpio = 0;
	} else {
		dprintk("IR protocol type %ud is not supported\n",
			(unsigned)ir_type);
		return -EINVAL;
	}

	if (ir->running) {
		saa7134_ir_stop(dev);
		ir->nec_gpio = nec_gpio;
		ir->rc5_gpio = rc5_gpio;
		saa7134_ir_start(dev);
	} else {
		ir->nec_gpio = nec_gpio;
		ir->rc5_gpio = rc5_gpio;
	}

	return 0;
}

L
Linus Torvalds 已提交
568 569
int saa7134_input_init1(struct saa7134_dev *dev)
{
570
	struct card_ir *ir;
571
	struct rc_dev *rc;
572
	char *ir_codes = NULL;
L
Linus Torvalds 已提交
573 574 575 576
	u32 mask_keycode = 0;
	u32 mask_keydown = 0;
	u32 mask_keyup   = 0;
	int polling      = 0;
577 578
	int rc5_gpio	 = 0;
	int nec_gpio	 = 0;
579
	int raw_decode   = 0;
580
	int allow_protocol_change = 0;
581
	int err;
L
Linus Torvalds 已提交
582

583
	if (dev->has_remote != SAA7134_REMOTE_GPIO)
L
Linus Torvalds 已提交
584 585 586 587 588 589 590 591
		return -ENODEV;
	if (disable_ir)
		return -ENODEV;

	/* detect & configure */
	switch (dev->board) {
	case SAA7134_BOARD_FLYVIDEO2000:
	case SAA7134_BOARD_FLYVIDEO3000:
592
	case SAA7134_BOARD_FLYTVPLATINUM_FM:
593
	case SAA7134_BOARD_FLYTVPLATINUM_MINI2:
594
	case SAA7134_BOARD_ROVERMEDIA_LINK_PRO_FM:
595
		ir_codes     = RC_MAP_FLYVIDEO;
L
Linus Torvalds 已提交
596 597 598 599 600 601
		mask_keycode = 0xEC00000;
		mask_keydown = 0x0040000;
		break;
	case SAA7134_BOARD_CINERGY400:
	case SAA7134_BOARD_CINERGY600:
	case SAA7134_BOARD_CINERGY600_MK3:
602
		ir_codes     = RC_MAP_CINERGY;
L
Linus Torvalds 已提交
603 604 605 606 607
		mask_keycode = 0x00003f;
		mask_keyup   = 0x040000;
		break;
	case SAA7134_BOARD_ECS_TVP3XP:
	case SAA7134_BOARD_ECS_TVP3XP_4CB5:
608
		ir_codes     = RC_MAP_EZTV;
609 610
		mask_keycode = 0x00017c;
		mask_keyup   = 0x000002;
L
Linus Torvalds 已提交
611
		polling      = 50; // ms
612 613
		break;
	case SAA7134_BOARD_KWORLD_XPERT:
L
Linus Torvalds 已提交
614
	case SAA7134_BOARD_AVACSSMARTTV:
615
		ir_codes     = RC_MAP_PIXELVIEW;
L
Linus Torvalds 已提交
616 617 618 619 620
		mask_keycode = 0x00001F;
		mask_keyup   = 0x000020;
		polling      = 50; // ms
		break;
	case SAA7134_BOARD_MD2819:
621
	case SAA7134_BOARD_KWORLD_VSTREAM_XPERT:
L
Linus Torvalds 已提交
622 623
	case SAA7134_BOARD_AVERMEDIA_305:
	case SAA7134_BOARD_AVERMEDIA_307:
624
	case SAA7134_BOARD_AVERMEDIA_STUDIO_305:
625
	case SAA7134_BOARD_AVERMEDIA_STUDIO_505:
626
	case SAA7134_BOARD_AVERMEDIA_STUDIO_307:
627
	case SAA7134_BOARD_AVERMEDIA_STUDIO_507:
628
	case SAA7134_BOARD_AVERMEDIA_STUDIO_507UA:
629
	case SAA7134_BOARD_AVERMEDIA_GO_007_FM:
630
	case SAA7134_BOARD_AVERMEDIA_M102:
631
	case SAA7134_BOARD_AVERMEDIA_GO_007_FM_PLUS:
632
		ir_codes     = RC_MAP_AVERMEDIA;
L
Linus Torvalds 已提交
633 634 635 636 637 638 639
		mask_keycode = 0x0007C8;
		mask_keydown = 0x000010;
		polling      = 50; // ms
		/* Set GPIO pin2 to high to enable the IR controller */
		saa_setb(SAA7134_GPIO_GPMODE0, 0x4);
		saa_setb(SAA7134_GPIO_GPSTATUS0, 0x4);
		break;
640
	case SAA7134_BOARD_AVERMEDIA_M135A:
641
		ir_codes     = RC_MAP_AVERMEDIA_M135A;
642 643
		mask_keydown = 0x0040000;	/* Enable GPIO18 line on both edges */
		mask_keyup   = 0x0040000;
644
		mask_keycode = 0xffff;
645
		raw_decode   = 1;
646
		break;
647 648 649 650 651 652 653
	case SAA7134_BOARD_AVERMEDIA_M733A:
		ir_codes     = RC_MAP_AVERMEDIA_M733A_RM_K6;
		mask_keydown = 0x0040000;
		mask_keyup   = 0x0040000;
		mask_keycode = 0xffff;
		raw_decode   = 1;
		break;
654
	case SAA7134_BOARD_AVERMEDIA_777:
655
	case SAA7134_BOARD_AVERMEDIA_A16AR:
656
		ir_codes     = RC_MAP_AVERMEDIA;
657 658 659 660 661 662
		mask_keycode = 0x02F200;
		mask_keydown = 0x000400;
		polling      = 50; // ms
		/* Without this we won't receive key up events */
		saa_setb(SAA7134_GPIO_GPMODE1, 0x1);
		saa_setb(SAA7134_GPIO_GPSTATUS1, 0x1);
663
		break;
664
	case SAA7134_BOARD_AVERMEDIA_A16D:
665
		ir_codes     = RC_MAP_AVERMEDIA_A16D;
666 667 668 669 670 671 672
		mask_keycode = 0x02F200;
		mask_keydown = 0x000400;
		polling      = 50; /* ms */
		/* Without this we won't receive key up events */
		saa_setb(SAA7134_GPIO_GPMODE1, 0x1);
		saa_setb(SAA7134_GPIO_GPSTATUS1, 0x1);
		break;
673
	case SAA7134_BOARD_KWORLD_TERMINATOR:
674
		ir_codes     = RC_MAP_PIXELVIEW;
675 676 677 678
		mask_keycode = 0x00001f;
		mask_keyup   = 0x000060;
		polling      = 50; // ms
		break;
679 680
	case SAA7134_BOARD_MANLI_MTV001:
	case SAA7134_BOARD_MANLI_MTV002:
681
		ir_codes     = RC_MAP_MANLI;
682 683 684 685
		mask_keycode = 0x001f00;
		mask_keyup   = 0x004000;
		polling      = 50; /* ms */
		break;
686
	case SAA7134_BOARD_BEHOLD_409FM:
687 688 689 690 691 692 693 694 695
	case SAA7134_BOARD_BEHOLD_401:
	case SAA7134_BOARD_BEHOLD_403:
	case SAA7134_BOARD_BEHOLD_403FM:
	case SAA7134_BOARD_BEHOLD_405:
	case SAA7134_BOARD_BEHOLD_405FM:
	case SAA7134_BOARD_BEHOLD_407:
	case SAA7134_BOARD_BEHOLD_407FM:
	case SAA7134_BOARD_BEHOLD_409:
	case SAA7134_BOARD_BEHOLD_505FM:
696 697
	case SAA7134_BOARD_BEHOLD_505RDS_MK5:
	case SAA7134_BOARD_BEHOLD_505RDS_MK3:
698
	case SAA7134_BOARD_BEHOLD_507_9FM:
699 700
	case SAA7134_BOARD_BEHOLD_507RDS_MK3:
	case SAA7134_BOARD_BEHOLD_507RDS_MK5:
701
		ir_codes     = RC_MAP_MANLI;
702 703 704 705 706
		mask_keycode = 0x003f00;
		mask_keyup   = 0x004000;
		polling      = 50; /* ms */
		break;
	case SAA7134_BOARD_BEHOLD_COLUMBUS_TVFM:
707
		ir_codes     = RC_MAP_BEHOLD_COLUMBUS;
708
		mask_keycode = 0x003f00;
709 710 711
		mask_keyup   = 0x004000;
		polling      = 50; // ms
		break;
712
	case SAA7134_BOARD_SEDNA_PC_TV_CARDBUS:
713
		ir_codes     = RC_MAP_PCTV_SEDNA;
714 715 716 717
		mask_keycode = 0x001f00;
		mask_keyup   = 0x004000;
		polling      = 50; // ms
		break;
718
	case SAA7134_BOARD_GOTVIEW_7135:
719
		ir_codes     = RC_MAP_GOTVIEW7135;
720
		mask_keycode = 0x0003CC;
721
		mask_keydown = 0x000010;
722 723
		polling	     = 5; /* ms */
		saa_setb(SAA7134_GPIO_GPMODE1, 0x80);
724
		break;
L
Linus Torvalds 已提交
725
	case SAA7134_BOARD_VIDEOMATE_TV_PVR:
726
	case SAA7134_BOARD_VIDEOMATE_GOLD_PLUS:
727
	case SAA7134_BOARD_VIDEOMATE_TV_GOLD_PLUSII:
728
		ir_codes     = RC_MAP_VIDEOMATE_TV_PVR;
L
Linus Torvalds 已提交
729 730 731 732
		mask_keycode = 0x00003F;
		mask_keyup   = 0x400000;
		polling      = 50; // ms
		break;
733
	case SAA7134_BOARD_PROTEUS_2309:
734
		ir_codes     = RC_MAP_PROTEUS_2309;
735 736 737 738
		mask_keycode = 0x00007F;
		mask_keyup   = 0x000080;
		polling      = 50; // ms
		break;
739 740
	case SAA7134_BOARD_VIDEOMATE_DVBT_300:
	case SAA7134_BOARD_VIDEOMATE_DVBT_200:
741
		ir_codes     = RC_MAP_VIDEOMATE_TV_PVR;
742 743 744
		mask_keycode = 0x003F00;
		mask_keyup   = 0x040000;
		break;
745
	case SAA7134_BOARD_FLYDVBS_LR300:
746
	case SAA7134_BOARD_FLYDVBT_LR301:
747
	case SAA7134_BOARD_FLYDVBTDUO:
748
		ir_codes     = RC_MAP_FLYDVB;
749 750 751
		mask_keycode = 0x0001F00;
		mask_keydown = 0x0040000;
		break;
752
	case SAA7134_BOARD_ASUSTeK_P7131_DUAL:
753
	case SAA7134_BOARD_ASUSTeK_P7131_HYBRID_LNA:
754
	case SAA7134_BOARD_ASUSTeK_P7131_ANALOG:
755
		ir_codes     = RC_MAP_ASUS_PC39;
756 757 758 759
		mask_keydown = 0x0040000;	/* Enable GPIO18 line on both edges */
		mask_keyup   = 0x0040000;
		mask_keycode = 0xffff;
		raw_decode   = 1;
760
		break;
761 762
	case SAA7134_BOARD_ENCORE_ENLTV:
	case SAA7134_BOARD_ENCORE_ENLTV_FM:
763
		ir_codes     = RC_MAP_ENCORE_ENLTV;
764 765 766 767
		mask_keycode = 0x00007f;
		mask_keyup   = 0x040000;
		polling      = 50; // ms
		break;
768
	case SAA7134_BOARD_ENCORE_ENLTV_FM53:
769
		ir_codes     = RC_MAP_ENCORE_ENLTV_FM53;
770 771 772
		mask_keydown = 0x0040000;
		mask_keycode = 0x00007f;
		nec_gpio = 1;
773
		break;
774
	case SAA7134_BOARD_10MOONSTVMASTER3:
775
		ir_codes     = RC_MAP_ENCORE_ENLTV;
776 777 778 779
		mask_keycode = 0x5f80000;
		mask_keyup   = 0x8000000;
		polling      = 50; //ms
		break;
780
	case SAA7134_BOARD_GENIUS_TVGO_A11MCE:
781
		ir_codes     = RC_MAP_GENIUS_TVGO_A11MCE;
782 783 784 785
		mask_keycode = 0xff;
		mask_keydown = 0xf00000;
		polling = 50; /* ms */
		break;
786
	case SAA7134_BOARD_REAL_ANGEL_220:
787
		ir_codes     = RC_MAP_REAL_AUDIO_220_32_KEYS;
788 789 790 791
		mask_keycode = 0x3f00;
		mask_keyup   = 0x4000;
		polling = 50; /* ms */
		break;
792
	case SAA7134_BOARD_KWORLD_PLUS_TV_ANALOG:
793
		ir_codes     = RC_MAP_KWORLD_PLUS_TV_ANALOG;
794 795 796
		mask_keycode = 0x7f;
		polling = 40; /* ms */
		break;
797
	case SAA7134_BOARD_VIDEOMATE_S350:
798
		ir_codes     = RC_MAP_VIDEOMATE_S350;
799 800 801
		mask_keycode = 0x003f00;
		mask_keydown = 0x040000;
		break;
802
	case SAA7134_BOARD_LEADTEK_WINFAST_DTV1000S:
803
		ir_codes     = RC_MAP_WINFAST;
804 805
		mask_keycode = 0x5f00;
		mask_keyup   = 0x020000;
806
		polling      = 50; /* ms */
807
		break;
L
Linus Torvalds 已提交
808 809 810 811 812 813 814
	}
	if (NULL == ir_codes) {
		printk("%s: Oops: IR config error [card=%d]\n",
		       dev->name, dev->board);
		return -ENODEV;
	}

815
	ir = kzalloc(sizeof(*ir), GFP_KERNEL);
816 817
	rc = rc_allocate_device();
	if (!ir || !rc) {
818 819
		err = -ENOMEM;
		goto err_out_free;
820
	}
L
Linus Torvalds 已提交
821

822
	ir->dev = rc;
823 824 825
	dev->remote = ir;

	ir->running = 0;
826

L
Linus Torvalds 已提交
827 828 829 830
	/* init hardware-specific stuff */
	ir->mask_keycode = mask_keycode;
	ir->mask_keydown = mask_keydown;
	ir->mask_keyup   = mask_keyup;
831
	ir->polling      = polling;
832 833
	ir->rc5_gpio	 = rc5_gpio;
	ir->nec_gpio	 = nec_gpio;
834
	ir->raw_decode	 = raw_decode;
L
Linus Torvalds 已提交
835 836 837 838 839 840 841

	/* init input device */
	snprintf(ir->name, sizeof(ir->name), "saa7134 IR (%s)",
		 saa7134_boards[dev->board].name);
	snprintf(ir->phys, sizeof(ir->phys), "pci-%s/ir0",
		 pci_name(dev->pci));

842 843 844
	rc->priv = dev;
	rc->open = saa7134_ir_open;
	rc->close = saa7134_ir_close;
845
	if (raw_decode)
846
		rc->driver_type = RC_DRIVER_IR_RAW;
847

848 849 850 851 852
	if (!raw_decode && allow_protocol_change) {
		rc->allowed_protos = IR_TYPE_RC5 | IR_TYPE_NEC;
		rc->change_protocol = saa7134_ir_change_protocol;
	}

853 854 855 856
	rc->input_name = ir->name;
	rc->input_phys = ir->phys;
	rc->input_id.bustype = BUS_PCI;
	rc->input_id.version = 1;
L
Linus Torvalds 已提交
857
	if (dev->pci->subsystem_vendor) {
858 859
		rc->input_id.vendor  = dev->pci->subsystem_vendor;
		rc->input_id.product = dev->pci->subsystem_device;
L
Linus Torvalds 已提交
860
	} else {
861 862
		rc->input_id.vendor  = dev->pci->vendor;
		rc->input_id.product = dev->pci->device;
L
Linus Torvalds 已提交
863
	}
864 865 866
	rc->dev.parent = &dev->pci->dev;
	rc->map_name = ir_codes;
	rc->driver_name = MODULE_NAME;
L
Linus Torvalds 已提交
867

868
	err = rc_register_device(rc);
869
	if (err)
870
		goto err_out_free;
L
Linus Torvalds 已提交
871 872

	return 0;
873

874
err_out_free:
875
	rc_free_device(rc);
876 877 878
	dev->remote = NULL;
	kfree(ir);
	return err;
L
Linus Torvalds 已提交
879 880 881 882 883 884 885
}

void saa7134_input_fini(struct saa7134_dev *dev)
{
	if (NULL == dev->remote)
		return;

886
	saa7134_ir_stop(dev);
887
	rc_unregister_device(dev->remote->dev);
L
Linus Torvalds 已提交
888 889 890 891
	kfree(dev->remote);
	dev->remote = NULL;
}

892
void saa7134_probe_i2c_ir(struct saa7134_dev *dev)
893
{
894
	struct i2c_board_info info;
895 896 897 898 899 900 901 902 903 904

	struct i2c_msg msg_msi = {
		.addr = 0x50,
		.flags = I2C_M_RD,
		.len = 0,
		.buf = NULL,
	};

	int rc;

905
	if (disable_ir) {
906
		dprintk("IR has been disabled, not probing for i2c remote\n");
907 908 909
		return;
	}

910
	memset(&info, 0, sizeof(struct i2c_board_info));
911
	memset(&dev->init_data, 0, sizeof(dev->init_data));
912
	strlcpy(info.type, "ir_video", I2C_NAME_SIZE);
913

914 915
	switch (dev->board) {
	case SAA7134_BOARD_PINNACLE_PCTV_110i:
916
	case SAA7134_BOARD_PINNACLE_PCTV_310i:
917
		dev->init_data.name = "Pinnacle PCTV";
918
		if (pinnacle_remote == 0) {
919
			dev->init_data.get_key = get_key_pinnacle_color;
920
			dev->init_data.ir_codes = RC_MAP_PINNACLE_COLOR;
921
			info.addr = 0x47;
922
		} else {
923
			dev->init_data.get_key = get_key_pinnacle_grey;
924
			dev->init_data.ir_codes = RC_MAP_PINNACLE_GREY;
925
			info.addr = 0x47;
926
		}
927 928
		break;
	case SAA7134_BOARD_UPMOST_PURPLE_TV:
929 930
		dev->init_data.name = "Purple TV";
		dev->init_data.get_key = get_key_purpletv;
931
		dev->init_data.ir_codes = RC_MAP_PURPLETV;
932
		info.addr = 0x7a;
933
		break;
934
	case SAA7134_BOARD_MSI_TVATANYWHERE_PLUS:
935 936
		dev->init_data.name = "MSI TV@nywhere Plus";
		dev->init_data.get_key = get_key_msi_tvanywhere_plus;
937
		dev->init_data.ir_codes = RC_MAP_MSI_TVANYWHERE_PLUS;
938 939 940 941 942
		/*
		 * MSI TV@nyware Plus requires more frequent polling
		 * otherwise it will miss some keypresses
		 */
		dev->init_data.polling_interval = 50;
943
		info.addr = 0x30;
944 945 946 947 948
		/* MSI TV@nywhere Plus controller doesn't seem to
		   respond to probes unless we read something from
		   an existing device. Weird...
		   REVISIT: might no longer be needed */
		rc = i2c_transfer(&dev->i2c_adap, &msg_msi, 1);
949
		dprintk("probe 0x%02x @ %s: %s\n",
950 951
			msg_msi.addr, dev->i2c_adap.name,
			(1 == rc) ? "yes" : "no");
952
		break;
953
	case SAA7134_BOARD_HAUPPAUGE_HVR1110:
954 955
		dev->init_data.name = "HVR 1110";
		dev->init_data.get_key = get_key_hvr1110;
956
		dev->init_data.ir_codes = RC_MAP_HAUPPAUGE_NEW;
957
		info.addr = 0x71;
958
		break;
959 960 961 962 963 964 965 966
	case SAA7134_BOARD_BEHOLD_607FM_MK3:
	case SAA7134_BOARD_BEHOLD_607FM_MK5:
	case SAA7134_BOARD_BEHOLD_609FM_MK3:
	case SAA7134_BOARD_BEHOLD_609FM_MK5:
	case SAA7134_BOARD_BEHOLD_607RDS_MK3:
	case SAA7134_BOARD_BEHOLD_607RDS_MK5:
	case SAA7134_BOARD_BEHOLD_609RDS_MK3:
	case SAA7134_BOARD_BEHOLD_609RDS_MK5:
967
	case SAA7134_BOARD_BEHOLD_M6:
968 969
	case SAA7134_BOARD_BEHOLD_M63:
	case SAA7134_BOARD_BEHOLD_M6_EXTRA:
970
	case SAA7134_BOARD_BEHOLD_H6:
971
	case SAA7134_BOARD_BEHOLD_X7:
972 973
	case SAA7134_BOARD_BEHOLD_H7:
	case SAA7134_BOARD_BEHOLD_A7:
974 975
		dev->init_data.name = "BeholdTV";
		dev->init_data.get_key = get_key_beholdm6xx;
976
		dev->init_data.ir_codes = RC_MAP_BEHOLD;
977
		dev->init_data.type = IR_TYPE_NEC;
978
		info.addr = 0x2d;
979
		break;
980 981
	case SAA7134_BOARD_AVERMEDIA_CARDBUS_501:
	case SAA7134_BOARD_AVERMEDIA_CARDBUS_506:
982
		info.addr = 0x40;
983
		break;
984 985 986
	case SAA7134_BOARD_FLYDVB_TRIO:
		dev->init_data.name = "FlyDVB Trio";
		dev->init_data.get_key = get_key_flydvb_trio;
987
		dev->init_data.ir_codes = RC_MAP_FLYDVB;
988 989
		info.addr = 0x0b;
		break;
990 991 992
	default:
		dprintk("No I2C IR support for board %x\n", dev->board);
		return;
993 994
	}

995
	if (dev->init_data.name)
996
		info.platform_data = &dev->init_data;
997
	i2c_new_device(&dev->i2c_adap, &info);
998
}
999

1000 1001 1002 1003
static int saa7134_raw_decode_irq(struct saa7134_dev *dev)
{
	struct card_ir	*ir = dev->remote;
	unsigned long 	timeout;
1004
	int space;
1005 1006 1007 1008

	/* Generate initial event */
	saa_clearb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);
	saa_setb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);
1009
	space = saa_readl(SAA7134_GPIO_GPSTATUS0 >> 2) & ir->mask_keydown;
1010
	ir_raw_event_store_edge(dev->remote->dev, space ? IR_SPACE : IR_PULSE);
1011 1012


1013 1014 1015 1016 1017 1018 1019 1020 1021 1022
	/*
	 * Wait 15 ms from the start of the first IR event before processing
	 * the event. This time is enough for NEC protocol. May need adjustments
	 * to work with other protocols.
	 */
	if (!ir->active) {
		timeout = jiffies + jiffies_to_msecs(15);
		mod_timer(&ir->timer_end, timeout);
		ir->active = 1;
	}
1023 1024 1025

	return 1;
}
1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174

static int saa7134_rc5_irq(struct saa7134_dev *dev)
{
	struct card_ir *ir = dev->remote;
	struct timeval tv;
	u32 gap;
	unsigned long current_jiffies, timeout;

	/* get time of bit */
	current_jiffies = jiffies;
	do_gettimeofday(&tv);

	/* avoid overflow with gap >1s */
	if (tv.tv_sec - ir->base_time.tv_sec > 1) {
		gap = 200000;
	} else {
		gap = 1000000 * (tv.tv_sec - ir->base_time.tv_sec) +
		    tv.tv_usec - ir->base_time.tv_usec;
	}

	/* active code => add bit */
	if (ir->active) {
		/* only if in the code (otherwise spurious IRQ or timer
		   late) */
		if (ir->last_bit < 28) {
			ir->last_bit = (gap - ir_rc5_remote_gap / 2) /
			    ir_rc5_remote_gap;
			ir->code |= 1 << ir->last_bit;
		}
		/* starting new code */
	} else {
		ir->active = 1;
		ir->code = 0;
		ir->base_time = tv;
		ir->last_bit = 0;

		timeout = current_jiffies + (500 + 30 * HZ) / 1000;
		mod_timer(&ir->timer_end, timeout);
	}

	return 1;
}

static void nec_task(unsigned long data)
{
	struct saa7134_dev *dev = (struct saa7134_dev *) data;
	struct card_ir *ir;
	struct timeval tv;
	int count, pulse, oldpulse, gap;
	u32 ircode = 0, not_code = 0;
	int ngap = 0;

	if (!data) {
		printk(KERN_ERR "saa713x/ir: Can't recover dev struct\n");
		/* GPIO will be kept disabled */
		return;
	}

	ir = dev->remote;

	/* rising SAA7134_GPIO_GPRESCAN reads the status */
	saa_clearb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);
	saa_setb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);

	oldpulse = saa_readl(SAA7134_GPIO_GPSTATUS0 >> 2) & ir->mask_keydown;
	pulse = oldpulse;

	do_gettimeofday(&tv);
	ir->base_time = tv;

	/* Decode NEC pulsecode. This code can take up to 76.5 ms to run.
	   Unfortunately, using IRQ to decode pulse didn't work, since it uses
	   a pulse train of 38KHz. This means one pulse on each 52 us
	 */
	do {
		/* Wait until the end of pulse/space or 5 ms */
		for (count = 0; count < 500; count++)  {
			udelay(10);
			/* rising SAA7134_GPIO_GPRESCAN reads the status */
			saa_clearb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);
			saa_setb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);
			pulse = saa_readl(SAA7134_GPIO_GPSTATUS0 >> 2)
				& ir->mask_keydown;
			if (pulse != oldpulse)
				break;
		}

		do_gettimeofday(&tv);
		gap = 1000000 * (tv.tv_sec - ir->base_time.tv_sec) +
				tv.tv_usec - ir->base_time.tv_usec;

		if (!pulse) {
			/* Bit 0 has 560 us, while bit 1 has 1120 us.
			   Do something only if bit == 1
			 */
			if (ngap && (gap > 560 + 280)) {
				unsigned int shift = ngap - 1;

				/* Address first, then command */
				if (shift < 8) {
					shift += 8;
					ircode |= 1 << shift;
				} else if (shift < 16) {
					not_code |= 1 << shift;
				} else if (shift < 24) {
					shift -= 16;
					ircode |= 1 << shift;
				} else {
					shift -= 24;
					not_code |= 1 << shift;
				}
			}
			ngap++;
		}


		ir->base_time = tv;

		/* TIMEOUT - Long pulse */
		if (gap >= 5000)
			break;
		oldpulse = pulse;
	} while (ngap < 32);

	if (ngap == 32) {
		/* FIXME: should check if not_code == ~ircode */
		ir->code = ir_extract_bits(ircode, ir->mask_keycode);

		dprintk("scancode = 0x%02x (code = 0x%02x, notcode= 0x%02x)\n",
			 ir->code, ircode, not_code);

		ir_keydown(ir->dev, ir->code, 0);
	} else {
		dprintk("Repeat last key\n");
		ir_repeat(ir->dev);
	}

	saa_setl(SAA7134_IRQ2, SAA7134_IRQ2_INTE_GPIO18_P);
}

static int saa7134_nec_irq(struct saa7134_dev *dev)
{
	struct card_ir *ir = dev->remote;

	saa_clearl(SAA7134_IRQ2, SAA7134_IRQ2_INTE_GPIO18_P);
	tasklet_schedule(&ir->tlet);

	return 1;
}