brintos

brintos / linux-shallow public Read only

0
0
Text · 13.1 KiB · 41226f1 Raw
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