580 lines · c
1// SPDX-License-Identifier: GPL-2.0-or-later2/*3 *4 * Copyright (c) 2003 Gerd Knorr5 * Copyright (c) 2003 Pavel Machek6 */7 8#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt9 10#include <linux/module.h>11#include <linux/init.h>12#include <linux/delay.h>13#include <linux/interrupt.h>14#include <linux/input.h>15#include <linux/slab.h>16 17#include "bttv.h"18#include "bttvp.h"19 20 21static int ir_debug;22module_param(ir_debug, int, 0644);23 24static int ir_rc5_remote_gap = 885;25module_param(ir_rc5_remote_gap, int, 0644);26 27#undef dprintk28#define dprintk(fmt, ...) \29do { \30 if (ir_debug >= 1) \31 pr_info(fmt, ##__VA_ARGS__); \32} while (0)33 34#define DEVNAME "bttv-input"35 36#define MODULE_NAME "bttv"37 38/* ---------------------------------------------------------------------- */39 40static void ir_handle_key(struct bttv *btv)41{42 struct bttv_ir *ir = btv->remote;43 u32 gpio,data;44 45 /* read gpio value */46 gpio = bttv_gpio_read(&btv->c);47 if (ir->polling) {48 if (ir->last_gpio == gpio)49 return;50 ir->last_gpio = gpio;51 }52 53 /* extract data */54 data = ir_extract_bits(gpio, ir->mask_keycode);55 dprintk("irq gpio=0x%x code=%d | %s%s%s\n",56 gpio, data,57 ir->polling ? "poll" : "irq",58 (gpio & ir->mask_keydown) ? " down" : "",59 (gpio & ir->mask_keyup) ? " up" : "");60 61 if ((ir->mask_keydown && (gpio & ir->mask_keydown)) ||62 (ir->mask_keyup && !(gpio & ir->mask_keyup))) {63 rc_keydown_notimeout(ir->dev, RC_PROTO_UNKNOWN, data, 0);64 } else {65 /* HACK: Probably, ir->mask_keydown is missing66 for this board */67 if (btv->c.type == BTTV_BOARD_WINFAST2000)68 rc_keydown_notimeout(ir->dev, RC_PROTO_UNKNOWN, data,69 0);70 71 rc_keyup(ir->dev);72 }73}74 75static void ir_enltv_handle_key(struct bttv *btv)76{77 struct bttv_ir *ir = btv->remote;78 u32 gpio, data, keyup;79 80 /* read gpio value */81 gpio = bttv_gpio_read(&btv->c);82 83 /* extract data */84 data = ir_extract_bits(gpio, ir->mask_keycode);85 86 /* Check if it is keyup */87 keyup = (gpio & ir->mask_keyup) ? 1UL << 31 : 0;88 89 if ((ir->last_gpio & 0x7f) != data) {90 dprintk("gpio=0x%x code=%d | %s\n",91 gpio, data,92 (gpio & ir->mask_keyup) ? " up" : "up/down");93 94 rc_keydown_notimeout(ir->dev, RC_PROTO_UNKNOWN, data, 0);95 if (keyup)96 rc_keyup(ir->dev);97 } else {98 if ((ir->last_gpio & 1UL << 31) == keyup)99 return;100 101 dprintk("(cnt) gpio=0x%x code=%d | %s\n",102 gpio, data,103 (gpio & ir->mask_keyup) ? " up" : "down");104 105 if (keyup)106 rc_keyup(ir->dev);107 else108 rc_keydown_notimeout(ir->dev, RC_PROTO_UNKNOWN, data,109 0);110 }111 112 ir->last_gpio = data | keyup;113}114 115static int bttv_rc5_irq(struct bttv *btv);116 117void bttv_input_irq(struct bttv *btv)118{119 struct bttv_ir *ir = btv->remote;120 121 if (ir->rc5_gpio)122 bttv_rc5_irq(btv);123 else if (!ir->polling)124 ir_handle_key(btv);125}126 127static void bttv_input_timer(struct timer_list *t)128{129 struct bttv_ir *ir = from_timer(ir, t, timer);130 struct bttv *btv = ir->btv;131 132 if (btv->c.type == BTTV_BOARD_ENLTV_FM_2)133 ir_enltv_handle_key(btv);134 else135 ir_handle_key(btv);136 mod_timer(&ir->timer, jiffies + msecs_to_jiffies(ir->polling));137}138 139/*140 * FIXME: Nebula digi uses the legacy way to decode RC5, instead of relying141 * on the rc-core way. As we need to be sure that both IRQ transitions are142 * properly triggered, Better to touch it only with this hardware for143 * testing.144 */145 146#define RC5_START(x) (((x) >> 12) & 0x03)147#define RC5_TOGGLE(x) (((x) >> 11) & 0x01)148#define RC5_ADDR(x) (((x) >> 6) & 0x1f)149#define RC5_INSTR(x) (((x) >> 0) & 0x3f)150 151/* decode raw bit pattern to RC5 code */152static u32 bttv_rc5_decode(unsigned int code)153{154 unsigned int org_code = code;155 unsigned int pair;156 unsigned int rc5 = 0;157 int i;158 159 for (i = 0; i < 14; ++i) {160 pair = code & 0x3;161 code >>= 2;162 163 rc5 <<= 1;164 switch (pair) {165 case 0:166 case 2:167 break;168 case 1:169 rc5 |= 1;170 break;171 case 3:172 dprintk("rc5_decode(%x) bad code\n",173 org_code);174 return 0;175 }176 }177 dprintk("code=%x, rc5=%x, start=%x, toggle=%x, address=%x, instr=%x\n",178 rc5, org_code, RC5_START(rc5),179 RC5_TOGGLE(rc5), RC5_ADDR(rc5), RC5_INSTR(rc5));180 return rc5;181}182 183static void bttv_rc5_timer_end(struct timer_list *t)184{185 struct bttv_ir *ir = from_timer(ir, t, timer);186 ktime_t tv;187 u32 gap, rc5, scancode;188 u8 toggle, command, system;189 190 /* get time */191 tv = ktime_get();192 193 gap = ktime_to_us(ktime_sub(tv, ir->base_time));194 /* avoid overflow with gap >1s */195 if (gap > USEC_PER_SEC) {196 gap = 200000;197 }198 /* signal we're ready to start a new code */199 ir->active = false;200 201 /* Allow some timer jitter (RC5 is ~24ms anyway so this is ok) */202 if (gap < 28000) {203 dprintk("spurious timer_end\n");204 return;205 }206 207 if (ir->last_bit < 20) {208 /* ignore spurious codes (caused by light/other remotes) */209 dprintk("short code: %x\n", ir->code);210 return;211 }212 213 ir->code = (ir->code << ir->shift_by) | 1;214 rc5 = bttv_rc5_decode(ir->code);215 216 toggle = RC5_TOGGLE(rc5);217 system = RC5_ADDR(rc5);218 command = RC5_INSTR(rc5);219 220 switch (RC5_START(rc5)) {221 case 0x3:222 break;223 case 0x2:224 command += 0x40;225 break;226 default:227 return;228 }229 230 scancode = RC_SCANCODE_RC5(system, command);231 rc_keydown(ir->dev, RC_PROTO_RC5, scancode, toggle);232 dprintk("scancode %x, toggle %x\n", scancode, toggle);233}234 235static int bttv_rc5_irq(struct bttv *btv)236{237 struct bttv_ir *ir = btv->remote;238 ktime_t tv;239 u32 gpio;240 u32 gap;241 unsigned long current_jiffies;242 243 /* read gpio port */244 gpio = bttv_gpio_read(&btv->c);245 246 /* get time of bit */247 current_jiffies = jiffies;248 tv = ktime_get();249 250 gap = ktime_to_us(ktime_sub(tv, ir->base_time));251 /* avoid overflow with gap >1s */252 if (gap > USEC_PER_SEC) {253 gap = 200000;254 }255 256 dprintk("RC5 IRQ: gap %d us for %s\n",257 gap, (gpio & 0x20) ? "mark" : "space");258 259 /* remote IRQ? */260 if (!(gpio & 0x20))261 return 0;262 263 /* active code => add bit */264 if (ir->active) {265 /* only if in the code (otherwise spurious IRQ or timer266 late) */267 if (ir->last_bit < 28) {268 ir->last_bit = (gap - ir_rc5_remote_gap / 2) /269 ir_rc5_remote_gap;270 ir->code |= 1 << ir->last_bit;271 }272 /* starting new code */273 } else {274 ir->active = true;275 ir->code = 0;276 ir->base_time = tv;277 ir->last_bit = 0;278 279 mod_timer(&ir->timer, current_jiffies + msecs_to_jiffies(30));280 }281 282 /* toggle GPIO pin 4 to reset the irq */283 bttv_gpio_write(&btv->c, gpio & ~(1 << 4));284 bttv_gpio_write(&btv->c, gpio | (1 << 4));285 return 1;286}287 288/* ---------------------------------------------------------------------- */289 290static void bttv_ir_start(struct bttv_ir *ir)291{292 if (ir->polling) {293 timer_setup(&ir->timer, bttv_input_timer, 0);294 ir->timer.expires = jiffies + msecs_to_jiffies(1000);295 add_timer(&ir->timer);296 } else if (ir->rc5_gpio) {297 /* set timer_end for code completion */298 timer_setup(&ir->timer, bttv_rc5_timer_end, 0);299 ir->shift_by = 1;300 ir->rc5_remote_gap = ir_rc5_remote_gap;301 }302}303 304static void bttv_ir_stop(struct bttv *btv)305{306 if (btv->remote->polling)307 del_timer_sync(&btv->remote->timer);308 309 if (btv->remote->rc5_gpio) {310 u32 gpio;311 312 del_timer_sync(&btv->remote->timer);313 314 gpio = bttv_gpio_read(&btv->c);315 bttv_gpio_write(&btv->c, gpio & ~(1 << 4));316 }317}318 319/*320 * Get_key functions used by I2C remotes321 */322 323static int get_key_pv951(struct IR_i2c *ir, enum rc_proto *protocol,324 u32 *scancode, u8 *toggle)325{326 int rc;327 unsigned char b;328 329 /* poll IR chip */330 rc = i2c_master_recv(ir->c, &b, 1);331 if (rc != 1) {332 dprintk("read error\n");333 if (rc < 0)334 return rc;335 return -EIO;336 }337 338 /* ignore 0xaa */339 if (b==0xaa)340 return 0;341 dprintk("key %02x\n", b);342 343 /*344 * NOTE:345 * lirc_i2c maps the pv951 code as:346 * addr = 0x61D6347 * cmd = bit_reverse (b)348 * So, it seems that this device uses NEC extended349 * I decided to not fix the table, due to two reasons:350 * 1) Without the actual device, this is only a guess;351 * 2) As the addr is not reported via I2C, nor can be changed,352 * the device is bound to the vendor-provided RC.353 */354 355 *protocol = RC_PROTO_UNKNOWN;356 *scancode = b;357 *toggle = 0;358 return 1;359}360 361/* Instantiate the I2C IR receiver device, if present */362void init_bttv_i2c_ir(struct bttv *btv)363{364 static const unsigned short addr_list[] = {365 0x1a, 0x18, 0x64, 0x30, 0x71,366 I2C_CLIENT_END367 };368 struct i2c_board_info info;369 struct i2c_client *i2c_dev;370 371 if (0 != btv->i2c_rc)372 return;373 374 memset(&info, 0, sizeof(struct i2c_board_info));375 memset(&btv->init_data, 0, sizeof(btv->init_data));376 strscpy(info.type, "ir_video", I2C_NAME_SIZE);377 378 switch (btv->c.type) {379 case BTTV_BOARD_PV951:380 btv->init_data.name = "PV951";381 btv->init_data.get_key = get_key_pv951;382 btv->init_data.ir_codes = RC_MAP_PV951;383 info.addr = 0x4b;384 break;385 }386 387 if (btv->init_data.name) {388 info.platform_data = &btv->init_data;389 i2c_dev = i2c_new_client_device(&btv->c.i2c_adap, &info);390 } else {391 /*392 * The external IR receiver is at i2c address 0x34 (0x35 for393 * reads). Future Hauppauge cards will have an internal394 * receiver at 0x30 (0x31 for reads). In theory, both can be395 * fitted, and Hauppauge suggest an external overrides an396 * internal.397 * That's why we probe 0x1a (~0x34) first. CB398 */399 i2c_dev = i2c_new_scanned_device(&btv->c.i2c_adap, &info, addr_list, NULL);400 }401 if (IS_ERR(i2c_dev))402 return;403 404#if defined(CONFIG_MODULES) && defined(MODULE)405 request_module("ir-kbd-i2c");406#endif407}408 409int bttv_input_init(struct bttv *btv)410{411 struct bttv_ir *ir;412 char *ir_codes = NULL;413 struct rc_dev *rc;414 int err = -ENOMEM;415 416 if (!btv->has_remote)417 return -ENODEV;418 419 ir = kzalloc(sizeof(*ir),GFP_KERNEL);420 rc = rc_allocate_device(RC_DRIVER_SCANCODE);421 if (!ir || !rc)422 goto err_out_free;423 424 /* detect & configure */425 switch (btv->c.type) {426 case BTTV_BOARD_AVERMEDIA:427 case BTTV_BOARD_AVPHONE98:428 case BTTV_BOARD_AVERMEDIA98:429 ir_codes = RC_MAP_AVERMEDIA;430 ir->mask_keycode = 0xf88000;431 ir->mask_keydown = 0x010000;432 ir->polling = 50; // ms433 break;434 435 case BTTV_BOARD_AVDVBT_761:436 case BTTV_BOARD_AVDVBT_771:437 ir_codes = RC_MAP_AVERMEDIA_DVBT;438 ir->mask_keycode = 0x0f00c0;439 ir->mask_keydown = 0x000020;440 ir->polling = 50; // ms441 break;442 443 case BTTV_BOARD_PXELVWPLTVPAK:444 ir_codes = RC_MAP_PIXELVIEW;445 ir->mask_keycode = 0x003e00;446 ir->mask_keyup = 0x010000;447 ir->polling = 50; // ms448 break;449 case BTTV_BOARD_PV_M4900:450 case BTTV_BOARD_PV_BT878P_9B:451 case BTTV_BOARD_PV_BT878P_PLUS:452 ir_codes = RC_MAP_PIXELVIEW;453 ir->mask_keycode = 0x001f00;454 ir->mask_keyup = 0x008000;455 ir->polling = 50; // ms456 break;457 458 case BTTV_BOARD_WINFAST2000:459 ir_codes = RC_MAP_WINFAST;460 ir->mask_keycode = 0x1f8;461 break;462 case BTTV_BOARD_MAGICTVIEW061:463 case BTTV_BOARD_MAGICTVIEW063:464 ir_codes = RC_MAP_WINFAST;465 ir->mask_keycode = 0x0008e000;466 ir->mask_keydown = 0x00200000;467 break;468 case BTTV_BOARD_APAC_VIEWCOMP:469 ir_codes = RC_MAP_APAC_VIEWCOMP;470 ir->mask_keycode = 0x001f00;471 ir->mask_keyup = 0x008000;472 ir->polling = 50; // ms473 break;474 case BTTV_BOARD_ASKEY_CPH03X:475 case BTTV_BOARD_CONCEPTRONIC_CTVFMI2:476 case BTTV_BOARD_CONTVFMI:477 case BTTV_BOARD_KWORLD_VSTREAM_XPERT:478 ir_codes = RC_MAP_PIXELVIEW;479 ir->mask_keycode = 0x001F00;480 ir->mask_keyup = 0x006000;481 ir->polling = 50; // ms482 break;483 case BTTV_BOARD_NEBULA_DIGITV:484 ir_codes = RC_MAP_NEBULA;485 ir->rc5_gpio = true;486 break;487 case BTTV_BOARD_MACHTV_MAGICTV:488 ir_codes = RC_MAP_APAC_VIEWCOMP;489 ir->mask_keycode = 0x001F00;490 ir->mask_keyup = 0x004000;491 ir->polling = 50; /* ms */492 break;493 case BTTV_BOARD_KOZUMI_KTV_01C:494 ir_codes = RC_MAP_PCTV_SEDNA;495 ir->mask_keycode = 0x001f00;496 ir->mask_keyup = 0x006000;497 ir->polling = 50; /* ms */498 break;499 case BTTV_BOARD_ENLTV_FM_2:500 ir_codes = RC_MAP_ENCORE_ENLTV2;501 ir->mask_keycode = 0x00fd00;502 ir->mask_keyup = 0x000080;503 ir->polling = 1; /* ms */504 ir->last_gpio = ir_extract_bits(bttv_gpio_read(&btv->c),505 ir->mask_keycode);506 break;507 }508 509 if (!ir_codes) {510 dprintk("Ooops: IR config error [card=%d]\n", btv->c.type);511 err = -ENODEV;512 goto err_out_free;513 }514 515 if (ir->rc5_gpio) {516 u32 gpio;517 /* enable remote irq */518 bttv_gpio_inout(&btv->c, (1 << 4), 1 << 4);519 gpio = bttv_gpio_read(&btv->c);520 bttv_gpio_write(&btv->c, gpio & ~(1 << 4));521 bttv_gpio_write(&btv->c, gpio | (1 << 4));522 } else {523 /* init hardware-specific stuff */524 bttv_gpio_inout(&btv->c, ir->mask_keycode | ir->mask_keydown, 0);525 }526 527 /* init input device */528 ir->dev = rc;529 ir->btv = btv;530 531 snprintf(ir->name, sizeof(ir->name), "bttv IR (card=%d)",532 btv->c.type);533 snprintf(ir->phys, sizeof(ir->phys), "pci-%s/ir0",534 pci_name(btv->c.pci));535 536 rc->device_name = ir->name;537 rc->input_phys = ir->phys;538 rc->input_id.bustype = BUS_PCI;539 rc->input_id.version = 1;540 if (btv->c.pci->subsystem_vendor) {541 rc->input_id.vendor = btv->c.pci->subsystem_vendor;542 rc->input_id.product = btv->c.pci->subsystem_device;543 } else {544 rc->input_id.vendor = btv->c.pci->vendor;545 rc->input_id.product = btv->c.pci->device;546 }547 rc->dev.parent = &btv->c.pci->dev;548 rc->map_name = ir_codes;549 rc->driver_name = MODULE_NAME;550 551 btv->remote = ir;552 bttv_ir_start(ir);553 554 /* all done */555 err = rc_register_device(rc);556 if (err)557 goto err_out_stop;558 559 return 0;560 561 err_out_stop:562 bttv_ir_stop(btv);563 btv->remote = NULL;564 err_out_free:565 rc_free_device(rc);566 kfree(ir);567 return err;568}569 570void bttv_input_fini(struct bttv *btv)571{572 if (btv->remote == NULL)573 return;574 575 bttv_ir_stop(btv);576 rc_unregister_device(btv->remote->dev);577 kfree(btv->remote);578 btv->remote = NULL;579}580