| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-or-later |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * |
|---|
| 3 | 4 | * handle saa7134 IR remotes via linux kernel input layer. |
|---|
| 4 | | - * |
|---|
| 5 | | - * This program is free software; you can redistribute it and/or modify |
|---|
| 6 | | - * it under the terms of the GNU General Public License as published by |
|---|
| 7 | | - * the Free Software Foundation; either version 2 of the License, or |
|---|
| 8 | | - * (at your option) any later version. |
|---|
| 9 | | - * |
|---|
| 10 | | - * This program is distributed in the hope that it will be useful, |
|---|
| 11 | | - * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|---|
| 12 | | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|---|
| 13 | | - * GNU General Public License for more details. |
|---|
| 14 | | - * |
|---|
| 15 | 5 | */ |
|---|
| 16 | 6 | |
|---|
| 17 | 7 | #include "saa7134.h" |
|---|
| .. | .. |
|---|
| 299 | 289 | return 1; |
|---|
| 300 | 290 | } |
|---|
| 301 | 291 | |
|---|
| 302 | | -static int get_key_hvr1110(struct IR_i2c *ir, enum rc_proto *protocol, |
|---|
| 303 | | - u32 *scancode, u8 *toggle) |
|---|
| 304 | | -{ |
|---|
| 305 | | - int rc; |
|---|
| 306 | | - unsigned char buf[5]; |
|---|
| 307 | | - |
|---|
| 308 | | - /* poll IR chip */ |
|---|
| 309 | | - rc = i2c_master_recv(ir->c, buf, 5); |
|---|
| 310 | | - if (rc != 5) { |
|---|
| 311 | | - ir_dbg(ir, "read error\n"); |
|---|
| 312 | | - if (rc < 0) |
|---|
| 313 | | - return rc; |
|---|
| 314 | | - return -EIO; |
|---|
| 315 | | - } |
|---|
| 316 | | - |
|---|
| 317 | | - /* Check if some key were pressed */ |
|---|
| 318 | | - if (!(buf[0] & 0x80)) |
|---|
| 319 | | - return 0; |
|---|
| 320 | | - |
|---|
| 321 | | - /* |
|---|
| 322 | | - * buf[3] & 0x80 is always high. |
|---|
| 323 | | - * buf[3] & 0x40 is a parity bit. A repeat event is marked |
|---|
| 324 | | - * by preserving it into two separate readings |
|---|
| 325 | | - * buf[4] bits 0 and 1, and buf[1] and buf[2] are always |
|---|
| 326 | | - * zero. |
|---|
| 327 | | - * |
|---|
| 328 | | - * Note that the keymap which the hvr1110 uses is RC5. |
|---|
| 329 | | - * |
|---|
| 330 | | - * FIXME: start bits could maybe be used...? |
|---|
| 331 | | - */ |
|---|
| 332 | | - *protocol = RC_PROTO_RC5; |
|---|
| 333 | | - *scancode = RC_SCANCODE_RC5(buf[3] & 0x1f, buf[4] >> 2); |
|---|
| 334 | | - *toggle = !!(buf[3] & 0x40); |
|---|
| 335 | | - return 1; |
|---|
| 336 | | -} |
|---|
| 337 | | - |
|---|
| 338 | | - |
|---|
| 339 | 292 | static int get_key_beholdm6xx(struct IR_i2c *ir, enum rc_proto *protocol, |
|---|
| 340 | 293 | u32 *scancode, u8 *toggle) |
|---|
| 341 | 294 | { |
|---|
| .. | .. |
|---|
| 485 | 438 | mod_timer(&ir->timer, jiffies + msecs_to_jiffies(ir->polling)); |
|---|
| 486 | 439 | } |
|---|
| 487 | 440 | |
|---|
| 488 | | -static int __saa7134_ir_start(void *priv) |
|---|
| 441 | +int saa7134_ir_open(struct rc_dev *rc) |
|---|
| 489 | 442 | { |
|---|
| 490 | | - struct saa7134_dev *dev = priv; |
|---|
| 491 | | - struct saa7134_card_ir *ir; |
|---|
| 492 | | - |
|---|
| 493 | | - if (!dev || !dev->remote) |
|---|
| 494 | | - return -EINVAL; |
|---|
| 495 | | - |
|---|
| 496 | | - ir = dev->remote; |
|---|
| 497 | | - if (ir->running) |
|---|
| 498 | | - return 0; |
|---|
| 443 | + struct saa7134_dev *dev = rc->priv; |
|---|
| 444 | + struct saa7134_card_ir *ir = dev->remote; |
|---|
| 499 | 445 | |
|---|
| 500 | 446 | /* Moved here from saa7134_input_init1() because the latter |
|---|
| 501 | 447 | * is not called on device resume */ |
|---|
| .. | .. |
|---|
| 544 | 490 | return 0; |
|---|
| 545 | 491 | } |
|---|
| 546 | 492 | |
|---|
| 547 | | -static void __saa7134_ir_stop(void *priv) |
|---|
| 493 | +void saa7134_ir_close(struct rc_dev *rc) |
|---|
| 548 | 494 | { |
|---|
| 549 | | - struct saa7134_dev *dev = priv; |
|---|
| 550 | | - struct saa7134_card_ir *ir; |
|---|
| 551 | | - |
|---|
| 552 | | - if (!dev || !dev->remote) |
|---|
| 553 | | - return; |
|---|
| 554 | | - |
|---|
| 555 | | - ir = dev->remote; |
|---|
| 556 | | - if (!ir->running) |
|---|
| 557 | | - return; |
|---|
| 495 | + struct saa7134_dev *dev = rc->priv; |
|---|
| 496 | + struct saa7134_card_ir *ir = dev->remote; |
|---|
| 558 | 497 | |
|---|
| 559 | 498 | if (ir->polling) |
|---|
| 560 | 499 | del_timer_sync(&ir->timer); |
|---|
| 561 | 500 | |
|---|
| 562 | 501 | ir->running = false; |
|---|
| 563 | | - |
|---|
| 564 | | - return; |
|---|
| 565 | | -} |
|---|
| 566 | | - |
|---|
| 567 | | -int saa7134_ir_start(struct saa7134_dev *dev) |
|---|
| 568 | | -{ |
|---|
| 569 | | - if (dev->remote->users) |
|---|
| 570 | | - return __saa7134_ir_start(dev); |
|---|
| 571 | | - |
|---|
| 572 | | - return 0; |
|---|
| 573 | | -} |
|---|
| 574 | | - |
|---|
| 575 | | -void saa7134_ir_stop(struct saa7134_dev *dev) |
|---|
| 576 | | -{ |
|---|
| 577 | | - if (dev->remote->users) |
|---|
| 578 | | - __saa7134_ir_stop(dev); |
|---|
| 579 | | -} |
|---|
| 580 | | - |
|---|
| 581 | | -static int saa7134_ir_open(struct rc_dev *rc) |
|---|
| 582 | | -{ |
|---|
| 583 | | - struct saa7134_dev *dev = rc->priv; |
|---|
| 584 | | - |
|---|
| 585 | | - dev->remote->users++; |
|---|
| 586 | | - return __saa7134_ir_start(dev); |
|---|
| 587 | | -} |
|---|
| 588 | | - |
|---|
| 589 | | -static void saa7134_ir_close(struct rc_dev *rc) |
|---|
| 590 | | -{ |
|---|
| 591 | | - struct saa7134_dev *dev = rc->priv; |
|---|
| 592 | | - |
|---|
| 593 | | - dev->remote->users--; |
|---|
| 594 | | - if (!dev->remote->users) |
|---|
| 595 | | - __saa7134_ir_stop(dev); |
|---|
| 596 | 502 | } |
|---|
| 597 | 503 | |
|---|
| 598 | 504 | int saa7134_input_init1(struct saa7134_dev *dev) |
|---|
| .. | .. |
|---|
| 661 | 567 | mask_keycode = 0x0007C8; |
|---|
| 662 | 568 | mask_keydown = 0x000010; |
|---|
| 663 | 569 | polling = 50; // ms |
|---|
| 664 | | - /* GPIO stuff moved to __saa7134_ir_start() */ |
|---|
| 570 | + /* GPIO stuff moved to saa7134_ir_open() */ |
|---|
| 665 | 571 | break; |
|---|
| 666 | 572 | case SAA7134_BOARD_AVERMEDIA_M135A: |
|---|
| 667 | 573 | ir_codes = RC_MAP_AVERMEDIA_M135A; |
|---|
| .. | .. |
|---|
| 683 | 589 | mask_keycode = 0x02F200; |
|---|
| 684 | 590 | mask_keydown = 0x000400; |
|---|
| 685 | 591 | polling = 50; // ms |
|---|
| 686 | | - /* GPIO stuff moved to __saa7134_ir_start() */ |
|---|
| 592 | + /* GPIO stuff moved to saa7134_ir_open() */ |
|---|
| 687 | 593 | break; |
|---|
| 688 | 594 | case SAA7134_BOARD_AVERMEDIA_A16D: |
|---|
| 689 | 595 | ir_codes = RC_MAP_AVERMEDIA_A16D; |
|---|
| 690 | 596 | mask_keycode = 0x02F200; |
|---|
| 691 | 597 | mask_keydown = 0x000400; |
|---|
| 692 | 598 | polling = 50; /* ms */ |
|---|
| 693 | | - /* GPIO stuff moved to __saa7134_ir_start() */ |
|---|
| 599 | + /* GPIO stuff moved to saa7134_ir_open() */ |
|---|
| 694 | 600 | break; |
|---|
| 695 | 601 | case SAA7134_BOARD_KWORLD_TERMINATOR: |
|---|
| 696 | 602 | ir_codes = RC_MAP_PIXELVIEW; |
|---|
| .. | .. |
|---|
| 742 | 648 | mask_keycode = 0x0003CC; |
|---|
| 743 | 649 | mask_keydown = 0x000010; |
|---|
| 744 | 650 | polling = 5; /* ms */ |
|---|
| 745 | | - /* GPIO stuff moved to __saa7134_ir_start() */ |
|---|
| 651 | + /* GPIO stuff moved to saa7134_ir_open() */ |
|---|
| 746 | 652 | break; |
|---|
| 747 | 653 | case SAA7134_BOARD_VIDEOMATE_TV_PVR: |
|---|
| 748 | 654 | case SAA7134_BOARD_VIDEOMATE_GOLD_PLUS: |
|---|
| .. | .. |
|---|
| 880 | 786 | ir->raw_decode = raw_decode; |
|---|
| 881 | 787 | |
|---|
| 882 | 788 | /* init input device */ |
|---|
| 883 | | - snprintf(ir->name, sizeof(ir->name), "saa7134 IR (%s)", |
|---|
| 884 | | - saa7134_boards[dev->board].name); |
|---|
| 885 | 789 | snprintf(ir->phys, sizeof(ir->phys), "pci-%s/ir0", |
|---|
| 886 | 790 | pci_name(dev->pci)); |
|---|
| 887 | 791 | |
|---|
| .. | .. |
|---|
| 893 | 797 | rc->allowed_protocols = RC_PROTO_BIT_ALL_IR_DECODER; |
|---|
| 894 | 798 | } |
|---|
| 895 | 799 | |
|---|
| 896 | | - rc->device_name = ir->name; |
|---|
| 800 | + rc->device_name = saa7134_boards[dev->board].name; |
|---|
| 897 | 801 | rc->input_phys = ir->phys; |
|---|
| 898 | 802 | rc->input_id.bustype = BUS_PCI; |
|---|
| 899 | 803 | rc->input_id.version = 1; |
|---|
| .. | .. |
|---|
| 929 | 833 | if (NULL == dev->remote) |
|---|
| 930 | 834 | return; |
|---|
| 931 | 835 | |
|---|
| 932 | | - saa7134_ir_stop(dev); |
|---|
| 933 | 836 | rc_unregister_device(dev->remote->dev); |
|---|
| 934 | 837 | kfree(dev->remote); |
|---|
| 935 | 838 | dev->remote = NULL; |
|---|
| .. | .. |
|---|
| 953 | 856 | |
|---|
| 954 | 857 | memset(&info, 0, sizeof(struct i2c_board_info)); |
|---|
| 955 | 858 | memset(&dev->init_data, 0, sizeof(dev->init_data)); |
|---|
| 956 | | - strlcpy(info.type, "ir_video", I2C_NAME_SIZE); |
|---|
| 859 | + strscpy(info.type, "ir_video", I2C_NAME_SIZE); |
|---|
| 957 | 860 | |
|---|
| 958 | 861 | switch (dev->board) { |
|---|
| 959 | 862 | case SAA7134_BOARD_PINNACLE_PCTV_110i: |
|---|
| .. | .. |
|---|
| 1031 | 934 | (1 == rc) ? "yes" : "no"); |
|---|
| 1032 | 935 | break; |
|---|
| 1033 | 936 | case SAA7134_BOARD_HAUPPAUGE_HVR1110: |
|---|
| 1034 | | - dev->init_data.name = "HVR 1110"; |
|---|
| 1035 | | - dev->init_data.get_key = get_key_hvr1110; |
|---|
| 937 | + dev->init_data.name = saa7134_boards[dev->board].name; |
|---|
| 1036 | 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; |
|---|
| 1037 | 942 | info.addr = 0x71; |
|---|
| 1038 | 943 | break; |
|---|
| 1039 | 944 | case SAA7134_BOARD_BEHOLD_607FM_MK3: |
|---|
| .. | .. |
|---|
| 1077 | 982 | |
|---|
| 1078 | 983 | if (dev->init_data.name) |
|---|
| 1079 | 984 | info.platform_data = &dev->init_data; |
|---|
| 1080 | | - i2c_new_device(&dev->i2c_adap, &info); |
|---|
| 985 | + i2c_new_client_device(&dev->i2c_adap, &info); |
|---|
| 1081 | 986 | } |
|---|
| 1082 | 987 | |
|---|
| 1083 | 988 | static int saa7134_raw_decode_irq(struct saa7134_dev *dev) |
|---|