cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

saa7134-input.c (26844B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 *
      4 * handle saa7134 IR remotes via linux kernel input layer.
      5 */
      6
      7#include "saa7134.h"
      8#include "saa7134-reg.h"
      9
     10#include <linux/module.h>
     11#include <linux/init.h>
     12#include <linux/delay.h>
     13#include <linux/interrupt.h>
     14#include <linux/slab.h>
     15
     16#define MODULE_NAME "saa7134"
     17
     18static unsigned int disable_ir;
     19module_param(disable_ir, int, 0444);
     20MODULE_PARM_DESC(disable_ir,"disable infrared remote support");
     21
     22static unsigned int ir_debug;
     23module_param(ir_debug, int, 0644);
     24MODULE_PARM_DESC(ir_debug,"enable debug messages [IR]");
     25
     26static int pinnacle_remote;
     27module_param(pinnacle_remote, int, 0644);    /* Choose Pinnacle PCTV remote */
     28MODULE_PARM_DESC(pinnacle_remote, "Specify Pinnacle PCTV remote: 0=coloured, 1=grey (defaults to 0)");
     29
     30#define input_dbg(fmt, arg...) do { \
     31	if (ir_debug) \
     32		printk(KERN_DEBUG pr_fmt("input: " fmt), ## arg); \
     33	} while (0)
     34#define ir_dbg(ir, fmt, arg...) do { \
     35	if (ir_debug) \
     36		printk(KERN_DEBUG pr_fmt("ir %s: " fmt), ir->rc->device_name, \
     37		       ## arg); \
     38	} while (0)
     39
     40/* Helper function for raw decoding at GPIO16 or GPIO18 */
     41static int saa7134_raw_decode_irq(struct saa7134_dev *dev);
     42
     43/* -------------------- GPIO generic keycode builder -------------------- */
     44
     45static int build_key(struct saa7134_dev *dev)
     46{
     47	struct saa7134_card_ir *ir = dev->remote;
     48	u32 gpio, data;
     49
     50	/* here comes the additional handshake steps for some cards */
     51	switch (dev->board) {
     52	case SAA7134_BOARD_GOTVIEW_7135:
     53		saa_setb(SAA7134_GPIO_GPSTATUS1, 0x80);
     54		saa_clearb(SAA7134_GPIO_GPSTATUS1, 0x80);
     55		break;
     56	}
     57	/* rising SAA7134_GPIO_GPRESCAN reads the status */
     58	saa_clearb(SAA7134_GPIO_GPMODE3,SAA7134_GPIO_GPRESCAN);
     59	saa_setb(SAA7134_GPIO_GPMODE3,SAA7134_GPIO_GPRESCAN);
     60
     61	gpio = saa_readl(SAA7134_GPIO_GPSTATUS0 >> 2);
     62	if (ir->polling) {
     63		if (ir->last_gpio == gpio)
     64			return 0;
     65		ir->last_gpio = gpio;
     66	}
     67
     68	data = ir_extract_bits(gpio, ir->mask_keycode);
     69	input_dbg("build_key gpio=0x%x mask=0x%x data=%d\n",
     70		gpio, ir->mask_keycode, data);
     71
     72	switch (dev->board) {
     73	case SAA7134_BOARD_KWORLD_PLUS_TV_ANALOG:
     74		if (data == ir->mask_keycode)
     75			rc_keyup(ir->dev);
     76		else
     77			rc_keydown_notimeout(ir->dev, RC_PROTO_UNKNOWN, data,
     78					     0);
     79		return 0;
     80	}
     81
     82	if (ir->polling) {
     83		if ((ir->mask_keydown  &&  (0 != (gpio & ir->mask_keydown))) ||
     84		    (ir->mask_keyup    &&  (0 == (gpio & ir->mask_keyup)))) {
     85			rc_keydown_notimeout(ir->dev, RC_PROTO_UNKNOWN, data,
     86					     0);
     87		} else {
     88			rc_keyup(ir->dev);
     89		}
     90	}
     91	else {	/* IRQ driven mode - handle key press and release in one go */
     92		if ((ir->mask_keydown  &&  (0 != (gpio & ir->mask_keydown))) ||
     93		    (ir->mask_keyup    &&  (0 == (gpio & ir->mask_keyup)))) {
     94			rc_keydown_notimeout(ir->dev, RC_PROTO_UNKNOWN, data,
     95					     0);
     96			rc_keyup(ir->dev);
     97		}
     98	}
     99
    100	return 0;
    101}
    102
    103/* --------------------- Chip specific I2C key builders ----------------- */
    104
    105static int get_key_flydvb_trio(struct IR_i2c *ir, enum rc_proto *protocol,
    106			       u32 *scancode, u8 *toggle)
    107{
    108	int gpio, rc;
    109	int attempt = 0;
    110	unsigned char b;
    111
    112	/* We need this to access GPI Used by the saa_readl macro. */
    113	struct saa7134_dev *dev = ir->c->adapter->algo_data;
    114
    115	if (dev == NULL) {
    116		ir_dbg(ir, "get_key_flydvb_trio: ir->c->adapter->algo_data is NULL!\n");
    117		return -EIO;
    118	}
    119
    120	/* rising SAA7134_GPIGPRESCAN reads the status */
    121	saa_clearb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);
    122	saa_setb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);
    123
    124	gpio = saa_readl(SAA7134_GPIO_GPSTATUS0 >> 2);
    125
    126	if (0x40000 & ~gpio)
    127		return 0; /* No button press */
    128
    129	/* poll IR chip */
    130	/* weak up the IR chip */
    131	b = 0;
    132
    133	while (1 != i2c_master_send(ir->c, &b, 1)) {
    134		if ((attempt++) < 10) {
    135			/*
    136			 * wait a bit for next attempt -
    137			 * I don't know how make it better
    138			 */
    139			msleep(10);
    140			continue;
    141		}
    142		ir_dbg(ir, "send wake up byte to pic16C505 (IR chip)failed %dx\n",
    143		       attempt);
    144		return -EIO;
    145	}
    146	rc = i2c_master_recv(ir->c, &b, 1);
    147	if (rc != 1) {
    148		ir_dbg(ir, "read error\n");
    149		if (rc < 0)
    150			return rc;
    151		return -EIO;
    152	}
    153
    154	*protocol = RC_PROTO_UNKNOWN;
    155	*scancode = b;
    156	*toggle = 0;
    157	return 1;
    158}
    159
    160static int get_key_msi_tvanywhere_plus(struct IR_i2c *ir,
    161				       enum rc_proto *protocol,
    162				       u32 *scancode, u8 *toggle)
    163{
    164	unsigned char b;
    165	int gpio, rc;
    166
    167	/* <dev> is needed to access GPIO. Used by the saa_readl macro. */
    168	struct saa7134_dev *dev = ir->c->adapter->algo_data;
    169	if (dev == NULL) {
    170		ir_dbg(ir, "get_key_msi_tvanywhere_plus: ir->c->adapter->algo_data is NULL!\n");
    171		return -EIO;
    172	}
    173
    174	/* rising SAA7134_GPIO_GPRESCAN reads the status */
    175
    176	saa_clearb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);
    177	saa_setb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);
    178
    179	gpio = saa_readl(SAA7134_GPIO_GPSTATUS0 >> 2);
    180
    181	/* GPIO&0x40 is pulsed low when a button is pressed. Don't do
    182	   I2C receive if gpio&0x40 is not low. */
    183
    184	if (gpio & 0x40)
    185		return 0;       /* No button press */
    186
    187	/* GPIO says there is a button press. Get it. */
    188
    189	rc = i2c_master_recv(ir->c, &b, 1);
    190	if (rc != 1) {
    191		ir_dbg(ir, "read error\n");
    192		if (rc < 0)
    193			return rc;
    194		return -EIO;
    195	}
    196
    197	/* No button press */
    198
    199	if (b == 0xff)
    200		return 0;
    201
    202	/* Button pressed */
    203
    204	input_dbg("get_key_msi_tvanywhere_plus: Key = 0x%02X\n", b);
    205	*protocol = RC_PROTO_UNKNOWN;
    206	*scancode = b;
    207	*toggle = 0;
    208	return 1;
    209}
    210
    211/* copied and modified from get_key_msi_tvanywhere_plus() */
    212static int get_key_kworld_pc150u(struct IR_i2c *ir, enum rc_proto *protocol,
    213				 u32 *scancode, u8 *toggle)
    214{
    215	unsigned char b;
    216	unsigned int gpio;
    217	int rc;
    218
    219	/* <dev> is needed to access GPIO. Used by the saa_readl macro. */
    220	struct saa7134_dev *dev = ir->c->adapter->algo_data;
    221	if (dev == NULL) {
    222		ir_dbg(ir, "get_key_kworld_pc150u: ir->c->adapter->algo_data is NULL!\n");
    223		return -EIO;
    224	}
    225
    226	/* rising SAA7134_GPIO_GPRESCAN reads the status */
    227
    228	saa_clearb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);
    229	saa_setb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);
    230
    231	gpio = saa_readl(SAA7134_GPIO_GPSTATUS0 >> 2);
    232
    233	/* GPIO&0x100 is pulsed low when a button is pressed. Don't do
    234	   I2C receive if gpio&0x100 is not low. */
    235
    236	if (gpio & 0x100)
    237		return 0;       /* No button press */
    238
    239	/* GPIO says there is a button press. Get it. */
    240
    241	rc = i2c_master_recv(ir->c, &b, 1);
    242	if (rc != 1) {
    243		ir_dbg(ir, "read error\n");
    244		if (rc < 0)
    245			return rc;
    246		return -EIO;
    247	}
    248
    249	/* No button press */
    250
    251	if (b == 0xff)
    252		return 0;
    253
    254	/* Button pressed */
    255
    256	input_dbg("get_key_kworld_pc150u: Key = 0x%02X\n", b);
    257	*protocol = RC_PROTO_UNKNOWN;
    258	*scancode = b;
    259	*toggle = 0;
    260	return 1;
    261}
    262
    263static int get_key_purpletv(struct IR_i2c *ir, enum rc_proto *protocol,
    264			    u32 *scancode, u8 *toggle)
    265{
    266	int rc;
    267	unsigned char b;
    268
    269	/* poll IR chip */
    270	rc = i2c_master_recv(ir->c, &b, 1);
    271	if (rc != 1) {
    272		ir_dbg(ir, "read error\n");
    273		if (rc < 0)
    274			return rc;
    275		return -EIO;
    276	}
    277
    278	/* no button press */
    279	if (b==0)
    280		return 0;
    281
    282	/* repeating */
    283	if (b & 0x80)
    284		return 1;
    285
    286	*protocol = RC_PROTO_UNKNOWN;
    287	*scancode = b;
    288	*toggle = 0;
    289	return 1;
    290}
    291
    292static int get_key_beholdm6xx(struct IR_i2c *ir, enum rc_proto *protocol,
    293			      u32 *scancode, u8 *toggle)
    294{
    295	int rc;
    296	unsigned char data[12];
    297	u32 gpio;
    298
    299	struct saa7134_dev *dev = ir->c->adapter->algo_data;
    300
    301	/* rising SAA7134_GPIO_GPRESCAN reads the status */
    302	saa_clearb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);
    303	saa_setb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);
    304
    305	gpio = saa_readl(SAA7134_GPIO_GPSTATUS0 >> 2);
    306
    307	if (0x400000 & ~gpio)
    308		return 0; /* No button press */
    309
    310	ir->c->addr = 0x5a >> 1;
    311
    312	rc = i2c_master_recv(ir->c, data, 12);
    313	if (rc != 12) {
    314		ir_dbg(ir, "read error\n");
    315		if (rc < 0)
    316			return rc;
    317		return -EIO;
    318	}
    319
    320	if (data[9] != (unsigned char)(~data[8]))
    321		return 0;
    322
    323	*protocol = RC_PROTO_NECX;
    324	*scancode = RC_SCANCODE_NECX(data[11] << 8 | data[10], data[9]);
    325	*toggle = 0;
    326	return 1;
    327}
    328
    329/* Common (grey or coloured) pinnacle PCTV remote handling
    330 *
    331 */
    332static int get_key_pinnacle(struct IR_i2c *ir, enum rc_proto *protocol,
    333			    u32 *scancode, u8 *toggle, int parity_offset,
    334			    int marker, int code_modulo)
    335{
    336	int rc;
    337	unsigned char b[4];
    338	unsigned int start = 0,parity = 0,code = 0;
    339
    340	/* poll IR chip */
    341	rc = i2c_master_recv(ir->c, b, 4);
    342	if (rc != 4) {
    343		ir_dbg(ir, "read error\n");
    344		if (rc < 0)
    345			return rc;
    346		return -EIO;
    347	}
    348
    349	for (start = 0; start < ARRAY_SIZE(b); start++) {
    350		if (b[start] == marker) {
    351			code=b[(start+parity_offset + 1) % 4];
    352			parity=b[(start+parity_offset) % 4];
    353		}
    354	}
    355
    356	/* Empty Request */
    357	if (parity == 0)
    358		return 0;
    359
    360	/* Repeating... */
    361	if (ir->old == parity)
    362		return 0;
    363
    364	ir->old = parity;
    365
    366	/* drop special codes when a key is held down a long time for the grey controller
    367	   In this case, the second bit of the code is asserted */
    368	if (marker == 0xfe && (code & 0x40))
    369		return 0;
    370
    371	code %= code_modulo;
    372
    373	*protocol = RC_PROTO_UNKNOWN;
    374	*scancode = code;
    375	*toggle = 0;
    376
    377	ir_dbg(ir, "Pinnacle PCTV key %02x\n", code);
    378	return 1;
    379}
    380
    381/* The grey pinnacle PCTV remote
    382 *
    383 *  There are one issue with this remote:
    384 *   - I2c packet does not change when the same key is pressed quickly. The workaround
    385 *     is to hold down each key for about half a second, so that another code is generated
    386 *     in the i2c packet, and the function can distinguish key presses.
    387 *
    388 * Sylvain Pasche <sylvain.pasche@gmail.com>
    389 */
    390static int get_key_pinnacle_grey(struct IR_i2c *ir, enum rc_proto *protocol,
    391				 u32 *scancode, u8 *toggle)
    392{
    393
    394	return get_key_pinnacle(ir, protocol, scancode, toggle, 1, 0xfe, 0xff);
    395}
    396
    397
    398/* The new pinnacle PCTV remote (with the colored buttons)
    399 *
    400 * Ricardo Cerqueira <v4l@cerqueira.org>
    401 */
    402static int get_key_pinnacle_color(struct IR_i2c *ir, enum rc_proto *protocol,
    403				  u32 *scancode, u8 *toggle)
    404{
    405	/* code_modulo parameter (0x88) is used to reduce code value to fit inside IR_KEYTAB_SIZE
    406	 *
    407	 * this is the only value that results in 42 unique
    408	 * codes < 128
    409	 */
    410
    411	return get_key_pinnacle(ir, protocol, scancode, toggle, 2, 0x80, 0x88);
    412}
    413
    414void saa7134_input_irq(struct saa7134_dev *dev)
    415{
    416	struct saa7134_card_ir *ir;
    417
    418	if (!dev || !dev->remote)
    419		return;
    420
    421	ir = dev->remote;
    422	if (!ir->running)
    423		return;
    424
    425	if (!ir->polling && !ir->raw_decode) {
    426		build_key(dev);
    427	} else if (ir->raw_decode) {
    428		saa7134_raw_decode_irq(dev);
    429	}
    430}
    431
    432static void saa7134_input_timer(struct timer_list *t)
    433{
    434	struct saa7134_card_ir *ir = from_timer(ir, t, timer);
    435	struct saa7134_dev *dev = ir->dev->priv;
    436
    437	build_key(dev);
    438	mod_timer(&ir->timer, jiffies + msecs_to_jiffies(ir->polling));
    439}
    440
    441int saa7134_ir_open(struct rc_dev *rc)
    442{
    443	struct saa7134_dev *dev = rc->priv;
    444	struct saa7134_card_ir *ir = dev->remote;
    445
    446	/* Moved here from saa7134_input_init1() because the latter
    447	 * is not called on device resume */
    448	switch (dev->board) {
    449	case SAA7134_BOARD_MD2819:
    450	case SAA7134_BOARD_KWORLD_VSTREAM_XPERT:
    451	case SAA7134_BOARD_AVERMEDIA_305:
    452	case SAA7134_BOARD_AVERMEDIA_307:
    453	case SAA7134_BOARD_AVERMEDIA_505:
    454	case SAA7134_BOARD_AVERMEDIA_STUDIO_305:
    455	case SAA7134_BOARD_AVERMEDIA_STUDIO_505:
    456	case SAA7134_BOARD_AVERMEDIA_STUDIO_307:
    457	case SAA7134_BOARD_AVERMEDIA_STUDIO_507:
    458	case SAA7134_BOARD_AVERMEDIA_STUDIO_507UA:
    459	case SAA7134_BOARD_AVERMEDIA_GO_007_FM:
    460	case SAA7134_BOARD_AVERMEDIA_M102:
    461	case SAA7134_BOARD_AVERMEDIA_GO_007_FM_PLUS:
    462		/* Without this we won't receive key up events */
    463		saa_setb(SAA7134_GPIO_GPMODE0, 0x4);
    464		saa_setb(SAA7134_GPIO_GPSTATUS0, 0x4);
    465		break;
    466	case SAA7134_BOARD_AVERMEDIA_777:
    467	case SAA7134_BOARD_AVERMEDIA_A16AR:
    468		/* Without this we won't receive key up events */
    469		saa_setb(SAA7134_GPIO_GPMODE1, 0x1);
    470		saa_setb(SAA7134_GPIO_GPSTATUS1, 0x1);
    471		break;
    472	case SAA7134_BOARD_AVERMEDIA_A16D:
    473		/* Without this we won't receive key up events */
    474		saa_setb(SAA7134_GPIO_GPMODE1, 0x1);
    475		saa_setb(SAA7134_GPIO_GPSTATUS1, 0x1);
    476		break;
    477	case SAA7134_BOARD_GOTVIEW_7135:
    478		saa_setb(SAA7134_GPIO_GPMODE1, 0x80);
    479		break;
    480	}
    481
    482	ir->running = true;
    483
    484	if (ir->polling) {
    485		timer_setup(&ir->timer, saa7134_input_timer, 0);
    486		ir->timer.expires = jiffies + HZ;
    487		add_timer(&ir->timer);
    488	}
    489
    490	return 0;
    491}
    492
    493void saa7134_ir_close(struct rc_dev *rc)
    494{
    495	struct saa7134_dev *dev = rc->priv;
    496	struct saa7134_card_ir *ir = dev->remote;
    497
    498	if (ir->polling)
    499		del_timer_sync(&ir->timer);
    500
    501	ir->running = false;
    502}
    503
    504int saa7134_input_init1(struct saa7134_dev *dev)
    505{
    506	struct saa7134_card_ir *ir;
    507	struct rc_dev *rc;
    508	char *ir_codes = NULL;
    509	u32 mask_keycode = 0;
    510	u32 mask_keydown = 0;
    511	u32 mask_keyup   = 0;
    512	unsigned polling = 0;
    513	bool raw_decode  = false;
    514	int err;
    515
    516	if (dev->has_remote != SAA7134_REMOTE_GPIO)
    517		return -ENODEV;
    518	if (disable_ir)
    519		return -ENODEV;
    520
    521	/* detect & configure */
    522	switch (dev->board) {
    523	case SAA7134_BOARD_FLYVIDEO2000:
    524	case SAA7134_BOARD_FLYVIDEO3000:
    525	case SAA7134_BOARD_FLYTVPLATINUM_FM:
    526	case SAA7134_BOARD_FLYTVPLATINUM_MINI2:
    527	case SAA7134_BOARD_ROVERMEDIA_LINK_PRO_FM:
    528		ir_codes     = RC_MAP_FLYVIDEO;
    529		mask_keycode = 0xEC00000;
    530		mask_keydown = 0x0040000;
    531		break;
    532	case SAA7134_BOARD_CINERGY400:
    533	case SAA7134_BOARD_CINERGY600:
    534	case SAA7134_BOARD_CINERGY600_MK3:
    535		ir_codes     = RC_MAP_CINERGY;
    536		mask_keycode = 0x00003f;
    537		mask_keyup   = 0x040000;
    538		break;
    539	case SAA7134_BOARD_ECS_TVP3XP:
    540	case SAA7134_BOARD_ECS_TVP3XP_4CB5:
    541		ir_codes     = RC_MAP_EZTV;
    542		mask_keycode = 0x00017c;
    543		mask_keyup   = 0x000002;
    544		polling      = 50; // ms
    545		break;
    546	case SAA7134_BOARD_KWORLD_XPERT:
    547	case SAA7134_BOARD_AVACSSMARTTV:
    548		ir_codes     = RC_MAP_PIXELVIEW;
    549		mask_keycode = 0x00001F;
    550		mask_keyup   = 0x000020;
    551		polling      = 50; // ms
    552		break;
    553	case SAA7134_BOARD_MD2819:
    554	case SAA7134_BOARD_KWORLD_VSTREAM_XPERT:
    555	case SAA7134_BOARD_AVERMEDIA_305:
    556	case SAA7134_BOARD_AVERMEDIA_307:
    557	case SAA7134_BOARD_AVERMEDIA_505:
    558	case SAA7134_BOARD_AVERMEDIA_STUDIO_305:
    559	case SAA7134_BOARD_AVERMEDIA_STUDIO_505:
    560	case SAA7134_BOARD_AVERMEDIA_STUDIO_307:
    561	case SAA7134_BOARD_AVERMEDIA_STUDIO_507:
    562	case SAA7134_BOARD_AVERMEDIA_STUDIO_507UA:
    563	case SAA7134_BOARD_AVERMEDIA_GO_007_FM:
    564	case SAA7134_BOARD_AVERMEDIA_M102:
    565	case SAA7134_BOARD_AVERMEDIA_GO_007_FM_PLUS:
    566		ir_codes     = RC_MAP_AVERMEDIA;
    567		mask_keycode = 0x0007C8;
    568		mask_keydown = 0x000010;
    569		polling      = 50; // ms
    570		/* GPIO stuff moved to saa7134_ir_open() */
    571		break;
    572	case SAA7134_BOARD_AVERMEDIA_M135A:
    573		ir_codes     = RC_MAP_AVERMEDIA_M135A;
    574		mask_keydown = 0x0040000;	/* Enable GPIO18 line on both edges */
    575		mask_keyup   = 0x0040000;
    576		mask_keycode = 0xffff;
    577		raw_decode   = true;
    578		break;
    579	case SAA7134_BOARD_AVERMEDIA_M733A:
    580		ir_codes     = RC_MAP_AVERMEDIA_M733A_RM_K6;
    581		mask_keydown = 0x0040000;
    582		mask_keyup   = 0x0040000;
    583		mask_keycode = 0xffff;
    584		raw_decode   = true;
    585		break;
    586	case SAA7134_BOARD_AVERMEDIA_777:
    587	case SAA7134_BOARD_AVERMEDIA_A16AR:
    588		ir_codes     = RC_MAP_AVERMEDIA;
    589		mask_keycode = 0x02F200;
    590		mask_keydown = 0x000400;
    591		polling      = 50; // ms
    592		/* GPIO stuff moved to saa7134_ir_open() */
    593		break;
    594	case SAA7134_BOARD_AVERMEDIA_A16D:
    595		ir_codes     = RC_MAP_AVERMEDIA_A16D;
    596		mask_keycode = 0x02F200;
    597		mask_keydown = 0x000400;
    598		polling      = 50; /* ms */
    599		/* GPIO stuff moved to saa7134_ir_open() */
    600		break;
    601	case SAA7134_BOARD_KWORLD_TERMINATOR:
    602		ir_codes     = RC_MAP_PIXELVIEW;
    603		mask_keycode = 0x00001f;
    604		mask_keyup   = 0x000060;
    605		polling      = 50; // ms
    606		break;
    607	case SAA7134_BOARD_MANLI_MTV001:
    608	case SAA7134_BOARD_MANLI_MTV002:
    609		ir_codes     = RC_MAP_MANLI;
    610		mask_keycode = 0x001f00;
    611		mask_keyup   = 0x004000;
    612		polling      = 50; /* ms */
    613		break;
    614	case SAA7134_BOARD_BEHOLD_409FM:
    615	case SAA7134_BOARD_BEHOLD_401:
    616	case SAA7134_BOARD_BEHOLD_403:
    617	case SAA7134_BOARD_BEHOLD_403FM:
    618	case SAA7134_BOARD_BEHOLD_405:
    619	case SAA7134_BOARD_BEHOLD_405FM:
    620	case SAA7134_BOARD_BEHOLD_407:
    621	case SAA7134_BOARD_BEHOLD_407FM:
    622	case SAA7134_BOARD_BEHOLD_409:
    623	case SAA7134_BOARD_BEHOLD_505FM:
    624	case SAA7134_BOARD_BEHOLD_505RDS_MK5:
    625	case SAA7134_BOARD_BEHOLD_505RDS_MK3:
    626	case SAA7134_BOARD_BEHOLD_507_9FM:
    627	case SAA7134_BOARD_BEHOLD_507RDS_MK3:
    628	case SAA7134_BOARD_BEHOLD_507RDS_MK5:
    629		ir_codes     = RC_MAP_MANLI;
    630		mask_keycode = 0x003f00;
    631		mask_keyup   = 0x004000;
    632		polling      = 50; /* ms */
    633		break;
    634	case SAA7134_BOARD_BEHOLD_COLUMBUS_TVFM:
    635		ir_codes     = RC_MAP_BEHOLD_COLUMBUS;
    636		mask_keycode = 0x003f00;
    637		mask_keyup   = 0x004000;
    638		polling      = 50; // ms
    639		break;
    640	case SAA7134_BOARD_SEDNA_PC_TV_CARDBUS:
    641		ir_codes     = RC_MAP_PCTV_SEDNA;
    642		mask_keycode = 0x001f00;
    643		mask_keyup   = 0x004000;
    644		polling      = 50; // ms
    645		break;
    646	case SAA7134_BOARD_GOTVIEW_7135:
    647		ir_codes     = RC_MAP_GOTVIEW7135;
    648		mask_keycode = 0x0003CC;
    649		mask_keydown = 0x000010;
    650		polling	     = 5; /* ms */
    651		/* GPIO stuff moved to saa7134_ir_open() */
    652		break;
    653	case SAA7134_BOARD_VIDEOMATE_TV_PVR:
    654	case SAA7134_BOARD_VIDEOMATE_GOLD_PLUS:
    655	case SAA7134_BOARD_VIDEOMATE_TV_GOLD_PLUSII:
    656		ir_codes     = RC_MAP_VIDEOMATE_TV_PVR;
    657		mask_keycode = 0x00003F;
    658		mask_keyup   = 0x400000;
    659		polling      = 50; // ms
    660		break;
    661	case SAA7134_BOARD_PROTEUS_2309:
    662		ir_codes     = RC_MAP_PROTEUS_2309;
    663		mask_keycode = 0x00007F;
    664		mask_keyup   = 0x000080;
    665		polling      = 50; // ms
    666		break;
    667	case SAA7134_BOARD_VIDEOMATE_DVBT_300:
    668	case SAA7134_BOARD_VIDEOMATE_DVBT_200:
    669		ir_codes     = RC_MAP_VIDEOMATE_TV_PVR;
    670		mask_keycode = 0x003F00;
    671		mask_keyup   = 0x040000;
    672		break;
    673	case SAA7134_BOARD_FLYDVBS_LR300:
    674	case SAA7134_BOARD_FLYDVBT_LR301:
    675	case SAA7134_BOARD_FLYDVBTDUO:
    676		ir_codes     = RC_MAP_FLYDVB;
    677		mask_keycode = 0x0001F00;
    678		mask_keydown = 0x0040000;
    679		break;
    680	case SAA7134_BOARD_ASUSTeK_P7131_DUAL:
    681	case SAA7134_BOARD_ASUSTeK_P7131_HYBRID_LNA:
    682	case SAA7134_BOARD_ASUSTeK_P7131_ANALOG:
    683		ir_codes     = RC_MAP_ASUS_PC39;
    684		mask_keydown = 0x0040000;	/* Enable GPIO18 line on both edges */
    685		mask_keyup   = 0x0040000;
    686		mask_keycode = 0xffff;
    687		raw_decode   = true;
    688		break;
    689	case SAA7134_BOARD_ASUSTeK_PS3_100:
    690		ir_codes     = RC_MAP_ASUS_PS3_100;
    691		mask_keydown = 0x0040000;
    692		mask_keyup   = 0x0040000;
    693		mask_keycode = 0xffff;
    694		raw_decode   = true;
    695		break;
    696	case SAA7134_BOARD_ENCORE_ENLTV:
    697	case SAA7134_BOARD_ENCORE_ENLTV_FM:
    698		ir_codes     = RC_MAP_ENCORE_ENLTV;
    699		mask_keycode = 0x00007f;
    700		mask_keyup   = 0x040000;
    701		polling      = 50; // ms
    702		break;
    703	case SAA7134_BOARD_ENCORE_ENLTV_FM53:
    704	case SAA7134_BOARD_ENCORE_ENLTV_FM3:
    705		ir_codes     = RC_MAP_ENCORE_ENLTV_FM53;
    706		mask_keydown = 0x0040000;	/* Enable GPIO18 line on both edges */
    707		mask_keyup   = 0x0040000;
    708		mask_keycode = 0xffff;
    709		raw_decode   = true;
    710		break;
    711	case SAA7134_BOARD_10MOONSTVMASTER3:
    712		ir_codes     = RC_MAP_ENCORE_ENLTV;
    713		mask_keycode = 0x5f80000;
    714		mask_keyup   = 0x8000000;
    715		polling      = 50; //ms
    716		break;
    717	case SAA7134_BOARD_GENIUS_TVGO_A11MCE:
    718		ir_codes     = RC_MAP_GENIUS_TVGO_A11MCE;
    719		mask_keycode = 0xff;
    720		mask_keydown = 0xf00000;
    721		polling = 50; /* ms */
    722		break;
    723	case SAA7134_BOARD_REAL_ANGEL_220:
    724		ir_codes     = RC_MAP_REAL_AUDIO_220_32_KEYS;
    725		mask_keycode = 0x3f00;
    726		mask_keyup   = 0x4000;
    727		polling = 50; /* ms */
    728		break;
    729	case SAA7134_BOARD_KWORLD_PLUS_TV_ANALOG:
    730		ir_codes     = RC_MAP_KWORLD_PLUS_TV_ANALOG;
    731		mask_keycode = 0x7f;
    732		polling = 40; /* ms */
    733		break;
    734	case SAA7134_BOARD_VIDEOMATE_S350:
    735		ir_codes     = RC_MAP_VIDEOMATE_S350;
    736		mask_keycode = 0x003f00;
    737		mask_keydown = 0x040000;
    738		break;
    739	case SAA7134_BOARD_LEADTEK_WINFAST_DTV1000S:
    740		ir_codes     = RC_MAP_WINFAST;
    741		mask_keycode = 0x5f00;
    742		mask_keyup   = 0x020000;
    743		polling      = 50; /* ms */
    744		break;
    745	case SAA7134_BOARD_VIDEOMATE_M1F:
    746		ir_codes     = RC_MAP_VIDEOMATE_K100;
    747		mask_keycode = 0x0ff00;
    748		mask_keyup   = 0x040000;
    749		break;
    750	case SAA7134_BOARD_HAUPPAUGE_HVR1150:
    751	case SAA7134_BOARD_HAUPPAUGE_HVR1120:
    752		ir_codes     = RC_MAP_HAUPPAUGE;
    753		mask_keydown = 0x0040000;	/* Enable GPIO18 line on both edges */
    754		mask_keyup   = 0x0040000;
    755		mask_keycode = 0xffff;
    756		raw_decode   = true;
    757		break;
    758	case SAA7134_BOARD_LEADTEK_WINFAST_TV2100_FM:
    759		ir_codes     = RC_MAP_LEADTEK_Y04G0051;
    760		mask_keydown = 0x0040000;	/* Enable GPIO18 line on both edges */
    761		mask_keyup   = 0x0040000;
    762		mask_keycode = 0xffff;
    763		raw_decode   = true;
    764		break;
    765	}
    766	if (NULL == ir_codes) {
    767		pr_err("Oops: IR config error [card=%d]\n", dev->board);
    768		return -ENODEV;
    769	}
    770
    771	ir = kzalloc(sizeof(*ir), GFP_KERNEL);
    772	rc = rc_allocate_device(RC_DRIVER_SCANCODE);
    773	if (!ir || !rc) {
    774		err = -ENOMEM;
    775		goto err_out_free;
    776	}
    777
    778	ir->dev = rc;
    779	dev->remote = ir;
    780
    781	/* init hardware-specific stuff */
    782	ir->mask_keycode = mask_keycode;
    783	ir->mask_keydown = mask_keydown;
    784	ir->mask_keyup   = mask_keyup;
    785	ir->polling      = polling;
    786	ir->raw_decode	 = raw_decode;
    787
    788	/* init input device */
    789	snprintf(ir->phys, sizeof(ir->phys), "pci-%s/ir0",
    790		 pci_name(dev->pci));
    791
    792	rc->priv = dev;
    793	rc->open = saa7134_ir_open;
    794	rc->close = saa7134_ir_close;
    795	if (raw_decode) {
    796		rc->driver_type = RC_DRIVER_IR_RAW;
    797		rc->allowed_protocols = RC_PROTO_BIT_ALL_IR_DECODER;
    798	}
    799
    800	rc->device_name = saa7134_boards[dev->board].name;
    801	rc->input_phys = ir->phys;
    802	rc->input_id.bustype = BUS_PCI;
    803	rc->input_id.version = 1;
    804	if (dev->pci->subsystem_vendor) {
    805		rc->input_id.vendor  = dev->pci->subsystem_vendor;
    806		rc->input_id.product = dev->pci->subsystem_device;
    807	} else {
    808		rc->input_id.vendor  = dev->pci->vendor;
    809		rc->input_id.product = dev->pci->device;
    810	}
    811	rc->dev.parent = &dev->pci->dev;
    812	rc->map_name = ir_codes;
    813	rc->driver_name = MODULE_NAME;
    814	rc->min_timeout = 1;
    815	rc->timeout = IR_DEFAULT_TIMEOUT;
    816	rc->max_timeout = 10 * IR_DEFAULT_TIMEOUT;
    817
    818	err = rc_register_device(rc);
    819	if (err)
    820		goto err_out_free;
    821
    822	return 0;
    823
    824err_out_free:
    825	rc_free_device(rc);
    826	dev->remote = NULL;
    827	kfree(ir);
    828	return err;
    829}
    830
    831void saa7134_input_fini(struct saa7134_dev *dev)
    832{
    833	if (NULL == dev->remote)
    834		return;
    835
    836	rc_unregister_device(dev->remote->dev);
    837	kfree(dev->remote);
    838	dev->remote = NULL;
    839}
    840
    841void saa7134_probe_i2c_ir(struct saa7134_dev *dev)
    842{
    843	struct i2c_board_info info;
    844	struct i2c_msg msg_msi = {
    845		.addr = 0x50,
    846		.flags = I2C_M_RD,
    847		.len = 0,
    848		.buf = NULL,
    849	};
    850	int rc;
    851
    852	if (disable_ir) {
    853		input_dbg("IR has been disabled, not probing for i2c remote\n");
    854		return;
    855	}
    856
    857	memset(&info, 0, sizeof(struct i2c_board_info));
    858	memset(&dev->init_data, 0, sizeof(dev->init_data));
    859	strscpy(info.type, "ir_video", I2C_NAME_SIZE);
    860
    861	switch (dev->board) {
    862	case SAA7134_BOARD_PINNACLE_PCTV_110i:
    863	case SAA7134_BOARD_PINNACLE_PCTV_310i:
    864		dev->init_data.name = "Pinnacle PCTV";
    865		if (pinnacle_remote == 0) {
    866			dev->init_data.get_key = get_key_pinnacle_color;
    867			dev->init_data.ir_codes = RC_MAP_PINNACLE_COLOR;
    868			info.addr = 0x47;
    869		} else {
    870			dev->init_data.get_key = get_key_pinnacle_grey;
    871			dev->init_data.ir_codes = RC_MAP_PINNACLE_GREY;
    872			info.addr = 0x47;
    873		}
    874		break;
    875	case SAA7134_BOARD_UPMOST_PURPLE_TV:
    876		dev->init_data.name = "Purple TV";
    877		dev->init_data.get_key = get_key_purpletv;
    878		dev->init_data.ir_codes = RC_MAP_PURPLETV;
    879		info.addr = 0x7a;
    880		break;
    881	case SAA7134_BOARD_MSI_TVATANYWHERE_PLUS:
    882		dev->init_data.name = "MSI TV@nywhere Plus";
    883		dev->init_data.get_key = get_key_msi_tvanywhere_plus;
    884		dev->init_data.ir_codes = RC_MAP_MSI_TVANYWHERE_PLUS;
    885		/*
    886		 * MSI TV@nyware Plus requires more frequent polling
    887		 * otherwise it will miss some keypresses
    888		 */
    889		dev->init_data.polling_interval = 50;
    890		info.addr = 0x30;
    891		/* MSI TV@nywhere Plus controller doesn't seem to
    892		   respond to probes unless we read something from
    893		   an existing device. Weird...
    894		   REVISIT: might no longer be needed */
    895		rc = i2c_transfer(&dev->i2c_adap, &msg_msi, 1);
    896		input_dbg("probe 0x%02x @ %s: %s\n",
    897			msg_msi.addr, dev->i2c_adap.name,
    898			(1 == rc) ? "yes" : "no");
    899		break;
    900	case SAA7134_BOARD_SNAZIO_TVPVR_PRO:
    901		dev->init_data.name = "SnaZio* TVPVR PRO";
    902		dev->init_data.get_key = get_key_msi_tvanywhere_plus;
    903		dev->init_data.ir_codes = RC_MAP_MSI_TVANYWHERE_PLUS;
    904		/*
    905		 * MSI TV@nyware Plus requires more frequent polling
    906		 * otherwise it will miss some keypresses
    907		 */
    908		dev->init_data.polling_interval = 50;
    909		info.addr = 0x30;
    910		/*
    911		 * MSI TV@nywhere Plus controller doesn't seem to
    912		 *  respond to probes unless we read something from
    913		 *  an existing device. Weird...
    914		 * REVISIT: might no longer be needed
    915		 */
    916		rc = i2c_transfer(&dev->i2c_adap, &msg_msi, 1);
    917		input_dbg("probe 0x%02x @ %s: %s\n",
    918			msg_msi.addr, dev->i2c_adap.name,
    919			(rc == 1) ? "yes" : "no");
    920		break;
    921	case SAA7134_BOARD_KWORLD_PC150U:
    922		/* copied and modified from MSI TV@nywhere Plus */
    923		dev->init_data.name = "Kworld PC150-U";
    924		dev->init_data.get_key = get_key_kworld_pc150u;
    925		dev->init_data.ir_codes = RC_MAP_KWORLD_PC150U;
    926		info.addr = 0x30;
    927		/* MSI TV@nywhere Plus controller doesn't seem to
    928		   respond to probes unless we read something from
    929		   an existing device. Weird...
    930		   REVISIT: might no longer be needed */
    931		rc = i2c_transfer(&dev->i2c_adap, &msg_msi, 1);
    932		input_dbg("probe 0x%02x @ %s: %s\n",
    933			msg_msi.addr, dev->i2c_adap.name,
    934			(1 == rc) ? "yes" : "no");
    935		break;
    936	case SAA7134_BOARD_HAUPPAUGE_HVR1110:
    937		dev->init_data.name = saa7134_boards[dev->board].name;
    938		dev->init_data.ir_codes = RC_MAP_HAUPPAUGE;
    939		dev->init_data.type = RC_PROTO_BIT_RC5 |
    940				RC_PROTO_BIT_RC6_MCE | RC_PROTO_BIT_RC6_6A_32;
    941		dev->init_data.internal_get_key_func = IR_KBD_GET_KEY_HAUP_XVR;
    942		info.addr = 0x71;
    943		break;
    944	case SAA7134_BOARD_BEHOLD_607FM_MK3:
    945	case SAA7134_BOARD_BEHOLD_607FM_MK5:
    946	case SAA7134_BOARD_BEHOLD_609FM_MK3:
    947	case SAA7134_BOARD_BEHOLD_609FM_MK5:
    948	case SAA7134_BOARD_BEHOLD_607RDS_MK3:
    949	case SAA7134_BOARD_BEHOLD_607RDS_MK5:
    950	case SAA7134_BOARD_BEHOLD_609RDS_MK3:
    951	case SAA7134_BOARD_BEHOLD_609RDS_MK5:
    952	case SAA7134_BOARD_BEHOLD_M6:
    953	case SAA7134_BOARD_BEHOLD_M63:
    954	case SAA7134_BOARD_BEHOLD_M6_EXTRA:
    955	case SAA7134_BOARD_BEHOLD_H6:
    956	case SAA7134_BOARD_BEHOLD_X7:
    957	case SAA7134_BOARD_BEHOLD_H7:
    958	case SAA7134_BOARD_BEHOLD_A7:
    959		dev->init_data.name = "BeholdTV";
    960		dev->init_data.get_key = get_key_beholdm6xx;
    961		dev->init_data.ir_codes = RC_MAP_BEHOLD;
    962		dev->init_data.type = RC_PROTO_BIT_NECX;
    963		info.addr = 0x2d;
    964		break;
    965	case SAA7134_BOARD_AVERMEDIA_CARDBUS_501:
    966	case SAA7134_BOARD_AVERMEDIA_CARDBUS_506:
    967		info.addr = 0x40;
    968		break;
    969	case SAA7134_BOARD_AVERMEDIA_A706:
    970		info.addr = 0x41;
    971		break;
    972	case SAA7134_BOARD_FLYDVB_TRIO:
    973		dev->init_data.name = "FlyDVB Trio";
    974		dev->init_data.get_key = get_key_flydvb_trio;
    975		dev->init_data.ir_codes = RC_MAP_FLYDVB;
    976		info.addr = 0x0b;
    977		break;
    978	default:
    979		input_dbg("No I2C IR support for board %x\n", dev->board);
    980		return;
    981	}
    982
    983	if (dev->init_data.name)
    984		info.platform_data = &dev->init_data;
    985	i2c_new_client_device(&dev->i2c_adap, &info);
    986}
    987
    988static int saa7134_raw_decode_irq(struct saa7134_dev *dev)
    989{
    990	struct saa7134_card_ir *ir = dev->remote;
    991	int space;
    992
    993	/* Generate initial event */
    994	saa_clearb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);
    995	saa_setb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);
    996	space = saa_readl(SAA7134_GPIO_GPSTATUS0 >> 2) & ir->mask_keydown;
    997	ir_raw_event_store_edge(dev->remote->dev, !space);
    998
    999	return 1;
   1000}