1001 lines · c
1// SPDX-License-Identifier: GPL-2.0-or-later2/*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 else77 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 better138 */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 do182 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 do234 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 handling330 *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 controller367 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 remote382 *383 * There are one issue with this remote:384 * - I2c packet does not change when the same key is pressed quickly. The workaround385 * is to hold down each key for about half a second, so that another code is generated386 * 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_SIZE406 *407 * this is the only value that results in 42 unique408 * codes < 128409 */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 latter447 * 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; // ms545 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; // ms552 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; // ms570 /* 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; // ms592 /* 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; // ms606 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; // ms639 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; // ms645 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; // ms660 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; // ms666 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; // ms702 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; //ms716 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 polling887 * otherwise it will miss some keypresses888 */889 dev->init_data.polling_interval = 50;890 info.addr = 0x30;891 /* MSI TV@nywhere Plus controller doesn't seem to892 respond to probes unless we read something from893 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 polling906 * otherwise it will miss some keypresses907 */908 dev->init_data.polling_interval = 50;909 info.addr = 0x30;910 /*911 * MSI TV@nywhere Plus controller doesn't seem to912 * respond to probes unless we read something from913 * an existing device. Weird...914 * REVISIT: might no longer be needed915 */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 to928 respond to probes unless we read something from929 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}1001