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

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

?? i2c-core.c

?? linux下S3C2410的I2C總線的驅動
?? C
?? 第 1 頁 / 共 3 頁
字號:
/* i2c-core.c - a device driver for the iic-bus interface		     *//* ------------------------------------------------------------------------- *//*   Copyright (C) 1995-99 Simon G. Vogl    This program is free software; you can redistribute it and/or modify    it under the terms of the GNU General Public License as published by    the Free Software Foundation; either version 2 of the License, or    (at your option) any later version.    This program is distributed in the hope that it will be useful,    but WITHOUT ANY WARRANTY; without even the implied warranty of    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    GNU General Public License for more details.    You should have received a copy of the GNU General Public License    along with this program; if not, write to the Free Software    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.		     *//* ------------------------------------------------------------------------- *//* With some changes from Ky鰏ti M鋖kki <kmalkki@cc.hut.fi>.   All SMBus-related things are written by Frodo Looijaard <frodol@dds.nl> *//* $Id: i2c-core.c,v 1.2 2004/02/06 13:19:45 laputa Exp $ */#include <linux/module.h>#include <linux/kernel.h>#include <linux/errno.h>#include <linux/slab.h>#include <linux/proc_fs.h>#include <linux/config.h>#include <linux/i2c.h>/* ----- compatibility stuff ----------------------------------------------- */#include <linux/version.h>#include <linux/init.h>#if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,1)#define init_MUTEX(s) do { *(s) = MUTEX; } while(0)#endif#include <asm/uaccess.h>/* ----- global defines ---------------------------------------------------- *//* exclusive access to the bus */#define I2C_LOCK(adap) down(&adap->lock)#define I2C_UNLOCK(adap) up(&adap->lock) #define ADAP_LOCK()	down(&adap_lock)#define ADAP_UNLOCK()	up(&adap_lock)#define DRV_LOCK()	down(&driver_lock)#define DRV_UNLOCK()	up(&driver_lock)#define DEB(x) if (i2c_debug>=1) x;#define DEB2(x) if (i2c_debug>=2) x;/* ----- global variables -------------------------------------------------- *//**** lock for writing to global variables: the adapter & driver list */struct semaphore adap_lock;struct semaphore driver_lock;/**** adapter list */static struct i2c_adapter *adapters[I2C_ADAP_MAX];static int adap_count;/**** drivers list */static struct i2c_driver *drivers[I2C_DRIVER_MAX];static int driver_count;/**** debug level */static int i2c_debug = 0;/* --------------------------------------------------- * /proc entry declarations *---------------------------------------------------- */#ifdef CONFIG_PROC_FSstatic int i2cproc_init(void);static void i2cproc_cleanup(void);#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,3,27))static void monitor_bus_i2c(struct inode *inode, int fill);#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,58)) */static ssize_t i2cproc_bus_read(struct file * file, char * buf,size_t count,                                 loff_t *ppos);static int read_bus_i2c(char *buf, char **start, off_t offset, int len,                           int *eof , void *private);/* To implement the dynamic /proc/bus/i2c-? files, we need our own    implementation of the read hook */static struct file_operations i2cproc_operations = {	read:		i2cproc_bus_read,};#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,3,48))static struct inode_operations i2cproc_inode_operations = {	&i2cproc_operations};#endifstatic int i2cproc_initialized = 0;#else /* undef CONFIG_PROC_FS */#define i2cproc_init() 0#define i2cproc_cleanup() 0#endif /* CONFIG_PROC_FS *//* --------------------------------------------------- * registering functions  * ---------------------------------------------------  *//* ----- * i2c_add_adapter is called from within the algorithm layer, * when a new hw adapter registers. A new device is register to be * available for clients. */int i2c_add_adapter(struct i2c_adapter *adap){	int i,j,res;	ADAP_LOCK();	for (i = 0; i < I2C_ADAP_MAX; i++)		if (NULL == adapters[i])			break;	if (I2C_ADAP_MAX == i) {		printk(KERN_WARNING 		       " i2c-core.o: register_adapter(%s) - enlarge I2C_ADAP_MAX.\n",			adap->name);		res = -ENOMEM;		goto ERROR0;	}	adapters[i] = adap;	adap_count++;	ADAP_UNLOCK();		/* init data types */	init_MUTEX(&adap->lock);#ifdef CONFIG_PROC_FS	if (i2cproc_initialized) {		char name[8];		struct proc_dir_entry *proc_entry;		sprintf(name,"i2c-%d", i);		proc_entry = create_proc_entry(name,0,proc_bus);		if (! proc_entry) {			printk("i2c-core.o: Could not create /proc/bus/%s\n",			       name);			res = -ENOENT;			goto ERROR1;		}#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,48))		proc_entry->proc_fops = &i2cproc_operations;#else		proc_entry->ops = &i2cproc_inode_operations;#endif#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,27))		proc_entry->owner = THIS_MODULE;#else		proc_entry->fill_inode = &monitor_bus_i2c;#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,58)) */		adap->inode = proc_entry->low_ino;	}#endif /* def CONFIG_PROC_FS */	/* inform drivers of new adapters */	DRV_LOCK();		for (j=0;j<I2C_DRIVER_MAX;j++)		if (drivers[j]!=NULL && 		    (drivers[j]->flags&(I2C_DF_NOTIFY|I2C_DF_DUMMY)))			/* We ignore the return code; if it fails, too bad */			drivers[j]->attach_adapter(adap);	DRV_UNLOCK();		DEB(printk("i2c-core.o: adapter %s registered as adapter %d.\n",	           adap->name,i));	return 0;	ERROR1:	ADAP_LOCK();	adapters[i] = NULL;	adap_count--;ERROR0:	ADAP_UNLOCK();	return res;}int i2c_del_adapter(struct i2c_adapter *adap){	int i,j,res;	ADAP_LOCK();	for (i = 0; i < I2C_ADAP_MAX; i++)		if (adap == adapters[i])			break;	if (I2C_ADAP_MAX == i) {		printk( "i2c-core.o: unregister_adapter adap [%s] not found.\n",			adap->name);		res = -ENODEV;		goto ERROR0;	}	/* DUMMY drivers do not register their clients, so we have to	 * use a trick here: we call driver->attach_adapter to	 * *detach* it! Of course, each dummy driver should know about	 * this or hell will break loose...	 */	DRV_LOCK();	for (j = 0; j < I2C_DRIVER_MAX; j++) 		if (drivers[j] && (drivers[j]->flags & I2C_DF_DUMMY))			if ((res = drivers[j]->attach_adapter(adap))) {				printk("i2c-core.o: can't detach adapter %s "				       "while detaching driver %s: driver not "				       "detached!",adap->name,drivers[j]->name);				goto ERROR1;				}	DRV_UNLOCK();	/* detach any active clients. This must be done first, because	 * it can fail; in which case we give upp. */	for (j=0;j<I2C_CLIENT_MAX;j++) {		struct i2c_client *client = adap->clients[j];		if (client!=NULL)		    /* detaching devices is unconditional of the set notify		     * flag, as _all_ clients that reside on the adapter		     * must be deleted, as this would cause invalid states.		     */			if ((res=client->driver->detach_client(client))) {				printk("i2c-core.o: adapter %s not "					"unregistered, because client at "					"address %02x can't be detached. ",					adap->name, client->addr);				goto ERROR0;			}	}#ifdef CONFIG_PROC_FS	if (i2cproc_initialized) {		char name[8];		sprintf(name,"i2c-%d", i);		remove_proc_entry(name,proc_bus);	}#endif /* def CONFIG_PROC_FS */	adapters[i] = NULL;	adap_count--;		ADAP_UNLOCK();		DEB(printk("i2c-core.o: adapter unregistered: %s\n",adap->name));	return 0;ERROR0:	ADAP_UNLOCK();	return res;ERROR1:	DRV_UNLOCK();	return res;}/* ----- * What follows is the "upwards" interface: commands for talking to clients, * which implement the functions to access the physical information of the * chips. */int i2c_add_driver(struct i2c_driver *driver){	int i;	DRV_LOCK();	for (i = 0; i < I2C_DRIVER_MAX; i++)		if (NULL == drivers[i])			break;	if (I2C_DRIVER_MAX == i) {		printk(KERN_WARNING 		       " i2c-core.o: register_driver(%s) "		       "- enlarge I2C_DRIVER_MAX.\n",			driver->name);		DRV_UNLOCK();		return -ENOMEM;	}	drivers[i] = driver;	driver_count++;		DRV_UNLOCK();	/* driver was successfully added */		DEB(printk("i2c-core.o: driver %s registered.\n",driver->name));		ADAP_LOCK();	/* now look for instances of driver on our adapters	 */	if (driver->flags& (I2C_DF_NOTIFY|I2C_DF_DUMMY)) {		for (i=0;i<I2C_ADAP_MAX;i++)			if (adapters[i]!=NULL)				/* Ignore errors */				driver->attach_adapter(adapters[i]);	}	ADAP_UNLOCK();	return 0;}int i2c_del_driver(struct i2c_driver *driver){	int i,j,k,res;	DRV_LOCK();	for (i = 0; i < I2C_DRIVER_MAX; i++)		if (driver == drivers[i])			break;	if (I2C_DRIVER_MAX == i) {		printk(KERN_WARNING " i2c-core.o: unregister_driver: "				    "[%s] not found\n",			driver->name);		DRV_UNLOCK();		return -ENODEV;	}	/* Have a look at each adapter, if clients of this driver are still	 * attached. If so, detach them to be able to kill the driver 	 * afterwards.	 */	DEB2(printk("i2c-core.o: unregister_driver - looking for clients.\n"));	/* removing clients does not depend on the notify flag, else 	 * invalid operation might (will!) result, when using stale client	 * pointers.	 */	ADAP_LOCK(); /* should be moved inside the if statement... */	for (k=0;k<I2C_ADAP_MAX;k++) {		struct i2c_adapter *adap = adapters[k];		if (adap == NULL) /* skip empty entries. */			continue;		DEB2(printk("i2c-core.o: examining adapter %s:\n",			    adap->name));		if (driver->flags & I2C_DF_DUMMY) {		/* DUMMY drivers do not register their clients, so we have to		 * use a trick here: we call driver->attach_adapter to		 * *detach* it! Of course, each dummy driver should know about		 * this or hell will break loose...  		 */			if ((res = driver->attach_adapter(adap))) {				printk("i2c-core.o: while unregistering "				       "dummy driver %s, adapter %s could "				       "not be detached properly; driver "				       "not unloaded!",driver->name,				       adap->name);				ADAP_UNLOCK();				return res;			}		} else {			for (j=0;j<I2C_CLIENT_MAX;j++) { 				struct i2c_client *client = adap->clients[j];				if (client != NULL && 				    client->driver == driver) {					DEB2(printk("i2c-core.o: "						    "detaching client %s:\n",					            client->name));					if ((res = driver->							detach_client(client)))					{						printk("i2c-core.o: while "						       "unregistering driver "						       "`%s', the client at "						       "address %02x of						       adapter `%s' could not						       be detached; driver						       not unloaded!",						       driver->name,						       client->addr,						       adap->name);						ADAP_UNLOCK();						return res;					}				}			}		}	}	ADAP_UNLOCK();	drivers[i] = NULL;	driver_count--;	DRV_UNLOCK();		DEB(printk("i2c-core.o: driver unregistered: %s\n",driver->name));	return 0;}int i2c_check_addr (struct i2c_adapter *adapter, int addr){	int i;	for (i = 0; i < I2C_CLIENT_MAX ; i++) 		if (adapter->clients[i] && (adapter->clients[i]->addr == addr))			return -EBUSY;	return 0;}int i2c_attach_client(struct i2c_client *client){	struct i2c_adapter *adapter = client->adapter;	int i;	if (i2c_check_addr(client->adapter,client->addr))		return -EBUSY;	for (i = 0; i < I2C_CLIENT_MAX; i++)		if (NULL == adapter->clients[i])			break;	if (I2C_CLIENT_MAX == i) {		printk(KERN_WARNING 		       " i2c-core.o: attach_client(%s) - enlarge I2C_CLIENT_MAX.\n",			client->name);		return -ENOMEM;	}	adapter->clients[i] = client;	adapter->client_count++;		if (adapter->client_register) 		if (adapter->client_register(client)) 			printk("i2c-core.o: warning: client_register seems "			       "to have failed for client %02x at adapter %s\n",			       client->addr,adapter->name);	DEB(printk("i2c-core.o: client [%s] registered to adapter [%s](pos. %d).\n",		client->name, adapter->name,i));	if(client->flags & I2C_CLIENT_ALLOW_USE)		client->usage_count = 0;		return 0;}int i2c_detach_client(struct i2c_client *client){	struct i2c_adapter *adapter = client->adapter;	int i,res;	for (i = 0; i < I2C_CLIENT_MAX; i++)		if (client == adapter->clients[i])

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩激情一二三区| 成人国产亚洲欧美成人综合网 | 一级女性全黄久久生活片免费| 日日夜夜精品免费视频| 丁香亚洲综合激情啪啪综合| 69av一区二区三区| 一区二区三区免费观看| 懂色av一区二区三区免费观看| 欧美一区二区三区电影| 亚洲va韩国va欧美va精品| 99视频热这里只有精品免费| 亚洲精品在线观| 毛片av一区二区三区| 欧美日韩日日摸| 伊人色综合久久天天人手人婷| 国产剧情一区在线| 欧美一区日本一区韩国一区| 伊人开心综合网| 99精品国产视频| 国产精品国产三级国产三级人妇 | 久久综合五月天婷婷伊人| 午夜不卡在线视频| 在线观看一区二区视频| 亚洲免费观看高清完整版在线观看熊| av中文一区二区三区| 中文一区二区完整视频在线观看| 国产麻豆日韩欧美久久| 久久久精品一品道一区| 国产成a人无v码亚洲福利| 国产婷婷一区二区| 丁香啪啪综合成人亚洲小说| 国产视频一区二区在线观看| 国产精品一区二区在线播放| 91精品国产综合久久精品app | 欧美高清精品3d| 亚洲成av人影院在线观看网| 欧美区在线观看| 免费在线看一区| 欧美一区二区三区四区五区| 蜜桃视频在线一区| 国产性色一区二区| 成人av资源站| 亚洲乱码日产精品bd| 欧美三级日本三级少妇99| 奇米影视7777精品一区二区| 精品久久人人做人人爽| 国产69精品久久99不卡| 亚洲人成精品久久久久久| 在线观看91精品国产入口| 日韩在线播放一区二区| 欧美xxxxxxxx| 99久久免费精品高清特色大片| 一个色综合av| 2020国产成人综合网| av电影天堂一区二区在线观看| 一二三四区精品视频| 日韩欧美一区中文| 成人av在线资源网站| 亚洲一卡二卡三卡四卡五卡| 日韩限制级电影在线观看| 国产裸体歌舞团一区二区| 亚洲人成网站影音先锋播放| 日韩一区二区影院| 成人国产在线观看| 蜜臀a∨国产成人精品| 国产精品国模大尺度视频| 8v天堂国产在线一区二区| 国产69精品一区二区亚洲孕妇| 一区二区三区**美女毛片| 久久久久久免费毛片精品| 在线观看视频一区二区欧美日韩| 看片的网站亚洲| 一区二区三区日韩欧美| 久久久三级国产网站| 欧美三级中文字幕| 成人动漫av在线| 久久99九九99精品| 亚洲大片精品永久免费| 国产精品私人影院| 欧美成人aa大片| 欧美日韩国产影片| 色噜噜狠狠成人网p站| 国产精品影视在线| 日韩高清国产一区在线| 综合亚洲深深色噜噜狠狠网站| 日韩欧美一区二区三区在线| 精品视频在线免费看| 成人毛片在线观看| 国产精品白丝jk黑袜喷水| 蜜臀久久99精品久久久久宅男| 亚洲日本免费电影| 国产精品久久久久久久久免费桃花| 欧美大胆一级视频| 91.麻豆视频| 在线视频一区二区三| 91在线无精精品入口| 大桥未久av一区二区三区中文| 另类欧美日韩国产在线| 日韩精品一级二级 | 亚洲成人福利片| 亚洲人成网站精品片在线观看| 国产偷国产偷精品高清尤物| 精品少妇一区二区三区| 欧美一级免费观看| 制服丝袜成人动漫| 91精品欧美综合在线观看最新| 在线免费不卡视频| 欧美午夜免费电影| 欧美色精品天天在线观看视频| 91成人看片片| 欧洲国内综合视频| 欧美日韩在线播放三区四区| 91成人看片片| 欧美日韩mp4| 日韩亚洲欧美高清| 精品久久久久久久久久久久久久久久久| 69精品人人人人| 欧美videofree性高清杂交| 日韩欧美一二三| 久久久久久97三级| 中文乱码免费一区二区| 亚洲欧美在线视频| 亚洲综合偷拍欧美一区色| 亚洲午夜久久久久久久久电影网 | 7777精品伊人久久久大香线蕉最新版| 欧美日韩综合一区| 欧美xxxxxxxx| 国产精品麻豆99久久久久久| 一区二区欧美视频| 丝袜诱惑制服诱惑色一区在线观看| 美女视频黄久久| 高清不卡一二三区| 在线观看日韩毛片| 欧美xxx久久| 最新久久zyz资源站| 天天亚洲美女在线视频| 美女诱惑一区二区| 国产成人自拍网| 91官网在线观看| 久久夜色精品国产欧美乱极品| 中文字幕精品—区二区四季| 一二三四社区欧美黄| 久国产精品韩国三级视频| zzijzzij亚洲日本少妇熟睡| 欧美性猛交xxxx乱大交退制版| 精品国产免费一区二区三区香蕉 | 在线一区二区三区做爰视频网站| 欧洲av一区二区嗯嗯嗯啊| 日韩精品一区二| 亚洲猫色日本管| 麻豆精品国产传媒mv男同| av不卡免费在线观看| 日韩三级视频在线看| 亚洲日本va在线观看| 蜜臀av性久久久久蜜臀aⅴ四虎| 成人av在线一区二区| 日韩欧美不卡在线观看视频| 亚洲婷婷在线视频| 国产一区二区成人久久免费影院| 欧美色电影在线| 国产精品乱码妇女bbbb| 七七婷婷婷婷精品国产| 91在线观看污| 久久久国际精品| 男女男精品网站| 欧美三级电影网站| 亚洲日本成人在线观看| 国产黄人亚洲片| 精品国产乱码久久久久久1区2区 | 亚洲三级在线看| 国产一区二区三区国产| 欧美精品一二三| 亚洲一区二区在线免费观看视频| 国产成人无遮挡在线视频| 日韩丝袜美女视频| 亚洲香蕉伊在人在线观| 91蜜桃视频在线| 国产精品亲子乱子伦xxxx裸| 精品写真视频在线观看| 欧美一级免费观看| 日韩国产欧美在线观看| 欧美在线视频不卡| 亚洲永久精品国产| 91理论电影在线观看| 日韩理论片网站| 成年人午夜久久久| 国产视频在线观看一区二区三区| 久久精品国产亚洲5555| 日韩亚洲欧美在线观看| 美女视频黄频大全不卡视频在线播放 | 精品一区二区综合| 欧美一区二区三区男人的天堂| 亚洲国产日韩av| 在线成人午夜影院| 日韩黄色一级片| 日韩欧美一区二区免费| 精品在线播放免费| 久久精品日产第一区二区三区高清版 | 国产99精品视频| 国产亚洲欧洲一区高清在线观看|