亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? psmouse-base.c

?? Serial mouse driver for Linux
?? C
?? 第 1 頁 / 共 3 頁
字號:
	psmouse_set_state(psmouse, PSMOUSE_CMD_MODE);	/* make sure we don't have a resync in progress */	mutex_unlock(&psmouse_mutex);	flush_workqueue(kpsmoused_wq);	mutex_lock(&psmouse_mutex);	if (serio->parent && serio->id.type == SERIO_PS_PSTHRU) {		parent = serio_get_drvdata(serio->parent);		psmouse_deactivate(parent);	}	if (psmouse->disconnect)		psmouse->disconnect(psmouse);	if (parent && parent->pt_deactivate)		parent->pt_deactivate(parent);	psmouse_set_state(psmouse, PSMOUSE_IGNORE);	serio_close(serio);	serio_set_drvdata(serio, NULL);	input_unregister_device(psmouse->dev);	kfree(psmouse);	if (parent)		psmouse_activate(parent);	mutex_unlock(&psmouse_mutex);}static int psmouse_switch_protocol(struct psmouse *psmouse, const struct psmouse_protocol *proto){	struct input_dev *input_dev = psmouse->dev;	input_dev->private = psmouse;	input_dev->cdev.dev = &psmouse->ps2dev.serio->dev;	input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REL);	input_dev->keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT);	input_dev->relbit[0] = BIT(REL_X) | BIT(REL_Y);	psmouse->set_rate = psmouse_set_rate;	psmouse->set_resolution = psmouse_set_resolution;	psmouse->poll = psmouse_poll;	psmouse->protocol_handler = psmouse_process_byte;	psmouse->pktsize = 3;	if (proto && (proto->detect || proto->init)) {		if (proto->detect && proto->detect(psmouse, 1) < 0)			return -1;		if (proto->init && proto->init(psmouse) < 0)			return -1;		psmouse->type = proto->type;	}	else		psmouse->type = psmouse_extensions(psmouse, psmouse_max_proto, 1);	/*	 * If mouse's packet size is 3 there is no point in polling the	 * device in hopes to detect protocol reset - we won't get less	 * than 3 bytes response anyhow.	 */	if (psmouse->pktsize == 3)		psmouse->resync_time = 0;	/*	 * Some smart KVMs fake response to POLL command returning just	 * 3 bytes and messing up our resync logic, so if initial poll	 * fails we won't try polling the device anymore. Hopefully	 * such KVM will maintain initially selected protocol.	 */	if (psmouse->resync_time && psmouse->poll(psmouse))		psmouse->resync_time = 0;	snprintf(psmouse->devname, sizeof(psmouse->devname), "%s %s %s",		 psmouse_protocol_by_type(psmouse->type)->name, psmouse->vendor, psmouse->name);	input_dev->name = psmouse->devname;	input_dev->phys = psmouse->phys;	input_dev->id.bustype = BUS_I8042;	input_dev->id.vendor = 0x0002;	input_dev->id.product = psmouse->type;	input_dev->id.version = psmouse->model;	return 0;}/* * psmouse_connect() is a callback from the serio module when * an unhandled serio port is found. */static int psmouse_connect(struct serio *serio, struct serio_driver *drv){	struct psmouse *psmouse, *parent = NULL;	struct input_dev *input_dev;	int retval = -ENOMEM;	mutex_lock(&psmouse_mutex);	/*	 * If this is a pass-through port deactivate parent so the device	 * connected to this port can be successfully identified	 */	if (serio->parent && serio->id.type == SERIO_PS_PSTHRU) {		parent = serio_get_drvdata(serio->parent);		psmouse_deactivate(parent);	}	psmouse = kzalloc(sizeof(struct psmouse), GFP_KERNEL);	input_dev = input_allocate_device();	if (!psmouse || !input_dev)		goto out;	ps2_init(&psmouse->ps2dev, serio);	INIT_WORK(&psmouse->resync_work, psmouse_resync, psmouse);	psmouse->dev = input_dev;	snprintf(psmouse->phys, sizeof(psmouse->phys), "%s/input0", serio->phys);	psmouse_set_state(psmouse, PSMOUSE_INITIALIZING);	serio_set_drvdata(serio, psmouse);	retval = serio_open(serio, drv);	if (retval)		goto out;	if (psmouse_probe(psmouse) < 0) {		serio_close(serio);		retval = -ENODEV;		goto out;	}	psmouse->rate = psmouse_rate;	psmouse->resolution = psmouse_resolution;	psmouse->resetafter = psmouse_resetafter;	psmouse->resync_time = parent ? 0 : psmouse_resync_time;	psmouse->smartscroll = psmouse_smartscroll;	psmouse_switch_protocol(psmouse, NULL);	psmouse_set_state(psmouse, PSMOUSE_CMD_MODE);	psmouse_initialize(psmouse);	input_register_device(psmouse->dev);	if (parent && parent->pt_activate)		parent->pt_activate(parent);	sysfs_create_group(&serio->dev.kobj, &psmouse_attribute_group);	psmouse_activate(psmouse);	retval = 0;out:	if (retval) {		serio_set_drvdata(serio, NULL);		input_free_device(input_dev);		kfree(psmouse);	}	/* If this is a pass-through port the parent needs to be re-activated */	if (parent)		psmouse_activate(parent);	mutex_unlock(&psmouse_mutex);	return retval;}static int psmouse_reconnect(struct serio *serio){	struct psmouse *psmouse = serio_get_drvdata(serio);	struct psmouse *parent = NULL;	struct serio_driver *drv = serio->drv;	int rc = -1;	if (!drv || !psmouse) {		printk(KERN_DEBUG "psmouse: reconnect request, but serio is disconnected, ignoring...\n");		return -1;	}	mutex_lock(&psmouse_mutex);	if (serio->parent && serio->id.type == SERIO_PS_PSTHRU) {		parent = serio_get_drvdata(serio->parent);		psmouse_deactivate(parent);	}	psmouse_set_state(psmouse, PSMOUSE_INITIALIZING);	if (psmouse->reconnect) {		if (psmouse->reconnect(psmouse))			goto out;	} else if (psmouse_probe(psmouse) < 0 ||		   psmouse->type != psmouse_extensions(psmouse, psmouse_max_proto, 0))		goto out;	/* ok, the device type (and capabilities) match the old one,	 * we can continue using it, complete intialization	 */	psmouse_set_state(psmouse, PSMOUSE_CMD_MODE);	psmouse_initialize(psmouse);	if (parent && parent->pt_activate)		parent->pt_activate(parent);	psmouse_activate(psmouse);	rc = 0;out:	/* If this is a pass-through port the parent waits to be activated */	if (parent)		psmouse_activate(parent);	mutex_unlock(&psmouse_mutex);	return rc;}static struct serio_device_id psmouse_serio_ids[] = {	{		.type	= SERIO_8042,		.proto	= SERIO_ANY,		.id	= SERIO_ANY,		.extra	= SERIO_ANY,	},	{		.type	= SERIO_PS_PSTHRU,		.proto	= SERIO_ANY,		.id	= SERIO_ANY,		.extra	= SERIO_ANY,	},	{ 0 }};MODULE_DEVICE_TABLE(serio, psmouse_serio_ids);static struct serio_driver psmouse_drv = {	.driver		= {		.name	= "psmouse",	},	.description	= DRIVER_DESC,	.id_table	= psmouse_serio_ids,	.interrupt	= psmouse_interrupt,	.connect	= psmouse_connect,	.reconnect	= psmouse_reconnect,	.disconnect	= psmouse_disconnect,	.cleanup	= psmouse_cleanup,};ssize_t psmouse_attr_show_helper(struct device *dev, struct device_attribute *devattr,				 char *buf){	struct serio *serio = to_serio_port(dev);	struct psmouse_attribute *attr = to_psmouse_attr(devattr);	struct psmouse *psmouse;	int retval;	retval = serio_pin_driver(serio);	if (retval)		return retval;	if (serio->drv != &psmouse_drv) {		retval = -ENODEV;		goto out;	}	psmouse = serio_get_drvdata(serio);	retval = attr->show(psmouse, attr->data, buf);out:	serio_unpin_driver(serio);	return retval;}ssize_t psmouse_attr_set_helper(struct device *dev, struct device_attribute *devattr,				const char *buf, size_t count){	struct serio *serio = to_serio_port(dev);	struct psmouse_attribute *attr = to_psmouse_attr(devattr);	struct psmouse *psmouse, *parent = NULL;	int retval;	retval = serio_pin_driver(serio);	if (retval)		return retval;	if (serio->drv != &psmouse_drv) {		retval = -ENODEV;		goto out_unpin;	}	retval = mutex_lock_interruptible(&psmouse_mutex);	if (retval)		goto out_unpin;	psmouse = serio_get_drvdata(serio);	if (psmouse->state == PSMOUSE_IGNORE) {		retval = -ENODEV;		goto out_unlock;	}	if (serio->parent && serio->id.type == SERIO_PS_PSTHRU) {		parent = serio_get_drvdata(serio->parent);		psmouse_deactivate(parent);	}	psmouse_deactivate(psmouse);	retval = attr->set(psmouse, attr->data, buf, count);	if (retval != -ENODEV)		psmouse_activate(psmouse);	if (parent)		psmouse_activate(parent); out_unlock:	mutex_unlock(&psmouse_mutex); out_unpin:	serio_unpin_driver(serio);	return retval;}static ssize_t psmouse_show_int_attr(struct psmouse *psmouse, void *offset, char *buf){	unsigned long *field = (unsigned long *)((char *)psmouse + (size_t)offset);	return sprintf(buf, "%lu\n", *field);}static ssize_t psmouse_set_int_attr(struct psmouse *psmouse, void *offset, const char *buf, size_t count){	unsigned long *field = (unsigned long *)((char *)psmouse + (size_t)offset);	unsigned long value;	char *rest;	value = simple_strtoul(buf, &rest, 10);	if (*rest)		return -EINVAL;	*field = value;	return count;}static ssize_t psmouse_attr_show_protocol(struct psmouse *psmouse, void *data, char *buf){	return sprintf(buf, "%s\n", psmouse_protocol_by_type(psmouse->type)->name);}static ssize_t psmouse_attr_set_protocol(struct psmouse *psmouse, void *data, const char *buf, size_t count){	struct serio *serio = psmouse->ps2dev.serio;	struct psmouse *parent = NULL;	struct input_dev *new_dev;	const struct psmouse_protocol *proto;	int retry = 0;	if (!(proto = psmouse_protocol_by_name(buf, count)))		return -EINVAL;	if (psmouse->type == proto->type)		return count;	if (!(new_dev = input_allocate_device()))		return -ENOMEM;	while (serio->child) {		if (++retry > 3) {			printk(KERN_WARNING "psmouse: failed to destroy child port, protocol change aborted.\n");			input_free_device(new_dev);			return -EIO;		}		mutex_unlock(&psmouse_mutex);		serio_unpin_driver(serio);		serio_unregister_child_port(serio);		serio_pin_driver_uninterruptible(serio);		mutex_lock(&psmouse_mutex);		if (serio->drv != &psmouse_drv) {			input_free_device(new_dev);			return -ENODEV;		}		if (psmouse->type == proto->type) {			input_free_device(new_dev);			return count; /* switched by other thread */		}	}	if (serio->parent && serio->id.type == SERIO_PS_PSTHRU) {		parent = serio_get_drvdata(serio->parent);		if (parent->pt_deactivate)			parent->pt_deactivate(parent);	}	if (psmouse->disconnect)		psmouse->disconnect(psmouse);	psmouse_set_state(psmouse, PSMOUSE_IGNORE);	input_unregister_device(psmouse->dev);	psmouse->dev = new_dev;	psmouse_set_state(psmouse, PSMOUSE_INITIALIZING);	if (psmouse_switch_protocol(psmouse, proto) < 0) {		psmouse_reset(psmouse);		/* default to PSMOUSE_PS2 */		psmouse_switch_protocol(psmouse, &psmouse_protocols[0]);	}	psmouse_initialize(psmouse);	psmouse_set_state(psmouse, PSMOUSE_CMD_MODE);	input_register_device(psmouse->dev);	if (parent && parent->pt_activate)		parent->pt_activate(parent);	return count;}static ssize_t psmouse_attr_set_rate(struct psmouse *psmouse, void *data, const char *buf, size_t count){	unsigned long value;	char *rest;	value = simple_strtoul(buf, &rest, 10);	if (*rest)		return -EINVAL;	psmouse->set_rate(psmouse, value);	return count;}static ssize_t psmouse_attr_set_resolution(struct psmouse *psmouse, void *data, const char *buf, size_t count){	unsigned long value;	char *rest;	value = simple_strtoul(buf, &rest, 10);	if (*rest)		return -EINVAL;	psmouse->set_resolution(psmouse, value);	return count;}static int psmouse_set_maxproto(const char *val, struct kernel_param *kp){	const struct psmouse_protocol *proto;	if (!val)		return -EINVAL;	proto = psmouse_protocol_by_name(val, strlen(val));	if (!proto || !proto->maxproto)		return -EINVAL;	*((unsigned int *)kp->arg) = proto->type;	return 0;}static int psmouse_get_maxproto(char *buffer, struct kernel_param *kp){	int type = *((unsigned int *)kp->arg);	return sprintf(buffer, "%s\n", psmouse_protocol_by_type(type)->name);}static int __init psmouse_init(void){	kpsmoused_wq = create_singlethread_workqueue("kpsmoused");	if (!kpsmoused_wq) {		printk(KERN_ERR "psmouse: failed to create kpsmoused workqueue\n");		return -ENOMEM;	}	serio_register_driver(&psmouse_drv);	return 0;}static void __exit psmouse_exit(void){	serio_unregister_driver(&psmouse_drv);	destroy_workqueue(kpsmoused_wq);}module_init(psmouse_init);module_exit(psmouse_exit);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品麻豆欧美日韩ww| 欧美一区二区三区白人| 亚洲综合色成人| 国产亚洲欧美日韩日本| 欧美裸体bbwbbwbbw| 色综合网站在线| 国产乱国产乱300精品| 午夜精品视频一区| 亚洲午夜电影网| 2023国产精品自拍| 日韩欧美激情在线| 在线观看一区日韩| 一本到一区二区三区| 国产91精品精华液一区二区三区| 日韩电影在线一区| 日日摸夜夜添夜夜添国产精品| 一个色在线综合| 亚洲欧美日韩一区二区| 亚洲欧洲色图综合| 亚洲欧美日韩在线不卡| 夜夜嗨av一区二区三区中文字幕| 亚洲视频免费观看| 亚洲一区二区av在线| 美女视频一区二区| 青青青爽久久午夜综合久久午夜| 日本三级亚洲精品| 成人午夜av影视| 94-欧美-setu| 国产凹凸在线观看一区二区| 亚洲综合在线免费观看| 日日夜夜免费精品视频| 国产精品1024| 日韩视频免费观看高清完整版在线观看| 国产欧美一区视频| 亚洲色图清纯唯美| 首页综合国产亚洲丝袜| 国产精品538一区二区在线| 国产91色综合久久免费分享| 五月天中文字幕一区二区| 毛片一区二区三区| kk眼镜猥琐国模调教系列一区二区| 99精品视频免费在线观看| 欧美另类videos死尸| 精品乱人伦小说| 一区二区三区日本| 美女脱光内衣内裤视频久久影院| 国产成人aaa| 欧美一级二级三级蜜桃| 国产精品另类一区| 亚洲五月六月丁香激情| 久草中文综合在线| 欧美性高清videossexo| 欧美妇女性影城| 国产精品五月天| 一区二区三区小说| 国产九九视频一区二区三区| 69堂国产成人免费视频| 中文字幕一区二区三区在线观看| 亚洲黄色免费电影| 成人精品一区二区三区四区| 在线成人高清不卡| 久久婷婷一区二区三区| 日韩福利视频网| 国产精品正在播放| 7777精品伊人久久久大香线蕉超级流畅| 日本一区二区三区在线不卡| 视频一区二区国产| 91啦中文在线观看| 中文字幕一区在线观看视频| 国模一区二区三区白浆| 欧美不卡视频一区| 国产综合色精品一区二区三区| 精品少妇一区二区三区| 国产一区二区女| 欧美国产精品v| 91免费看视频| 美女性感视频久久| 色狠狠一区二区| 亚洲mv在线观看| 欧美日韩国产综合一区二区三区 | 香蕉av福利精品导航| 欧美吻胸吃奶大尺度电影| 亚洲美女精品一区| 色av一区二区| 性久久久久久久久| 日韩欧美区一区二| 国产乱码精品一区二区三| 久久精品在线免费观看| av网站一区二区三区| 亚洲国产精品一区二区久久 | 国产精品色婷婷久久58| 成人av在线看| 国产精品1区二区.| 亚洲精品日产精品乱码不卡| 国产精品传媒在线| 国产精品正在播放| 亚洲激情五月婷婷| 精品国产伦一区二区三区观看方式| 免费成人小视频| 亚洲同性gay激情无套| 97久久超碰国产精品电影| 性久久久久久久久久久久| 久久综合视频网| 成人午夜激情在线| 久久精品欧美一区二区三区麻豆| 色婷婷综合久色| 国产一区二区三区免费| 亚洲激情六月丁香| 日韩视频免费观看高清在线视频| 成人黄色片在线观看| 久久国产精品露脸对白| 亚洲免费大片在线观看| 精品卡一卡二卡三卡四在线| 欧美在线一区二区三区| 成人av网址在线| 国产综合成人久久大片91| 免费精品视频最新在线| 亚洲桃色在线一区| 国产精品久久久久久久第一福利| 精品国产一区二区亚洲人成毛片 | 亚洲国产精品欧美一二99 | 欧美视频一区二区三区四区| 成人国产亚洲欧美成人综合网| 经典三级在线一区| 蜜臀久久99精品久久久久久9| 亚洲女同一区二区| 国产精品乱码人人做人人爱 | 91美女在线视频| 国产一区二区三区蝌蚪| 美腿丝袜亚洲三区| 蜜桃视频在线一区| 激情久久久久久久久久久久久久久久| 亚洲电影激情视频网站| 亚洲成人激情社区| 亚洲精品伦理在线| 亚洲国产精品久久人人爱蜜臀| 亚洲精品大片www| 婷婷综合在线观看| 日韩av成人高清| 成人精品小蝌蚪| 6080午夜不卡| 国产欧美一区二区精品性色 | 免费观看日韩av| 成人性生交大合| 欧美男男青年gay1069videost| 欧美精品一区二区精品网| 国产欧美一区二区三区在线看蜜臀 | 日韩欧美一区二区不卡| 久久免费电影网| 日韩精品电影在线| 一本大道久久a久久精品综合| 18涩涩午夜精品.www| 美国一区二区三区在线播放| 色天使色偷偷av一区二区| 久久综合精品国产一区二区三区| 国产精品美女久久久久久久| 亚洲另类春色校园小说| 国产成人免费av在线| 欧美高清视频不卡网| 国产精品久久久久久久久免费樱桃 | 国产aⅴ精品一区二区三区色成熟| 色婷婷久久久久swag精品| 国产欧美va欧美不卡在线| 蜜桃av一区二区三区| 91福利在线导航| 久久九九国产精品| 国产在线精品国自产拍免费| 日韩一级免费观看| 婷婷综合另类小说色区| 欧美丝袜丝交足nylons图片| 日韩毛片在线免费观看| 99久久免费精品高清特色大片| 久久九九久精品国产免费直播| 国产原创一区二区| 国产精品久久久久aaaa樱花| a级精品国产片在线观看| 亚洲国产精品精华液ab| hitomi一区二区三区精品| 国产精品久久久一区麻豆最新章节| 国产精品影视在线观看| 中文字幕乱码一区二区免费| 国产999精品久久久久久绿帽| 欧美mv和日韩mv的网站| 精品一区二区三区在线观看| 久久久高清一区二区三区| 成人午夜看片网址| 亚洲黄一区二区三区| 欧美一区二区三区系列电影| 日韩激情视频网站| 久久精品人人爽人人爽| av不卡在线观看| 亚洲欧美韩国综合色| 欧美亚洲一区二区三区四区| 天堂久久一区二区三区| 日韩午夜中文字幕| 91亚洲精品一区二区乱码| 蜜臀久久久久久久| 成人免费在线观看入口| 91精品国产美女浴室洗澡无遮挡| 国产毛片一区二区|