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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? i2c-keywest.c

?? linux下S3C2410的I2C總線的驅(qū)動
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*    i2c Support for Apple Keywest I2C Bus Controller    Copyright (c) 2001 Benjamin Herrenschmidt <benh@kernel.crashing.org>    Original work by        Copyright (c) 2000 Philip Edelbrock <phil@stimpy.netroedge.com>    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.    Changes:    2001/12/13 BenH	New implementation    2001/12/15 BenH	Add support for "byte" and "quick"                        transfers. Add i2c_xfer routine.    My understanding of the various modes supported by keywest are:     - Dumb mode : not implemented, probably direct tweaking of lines     - Standard mode : simple i2c transaction of type         S Addr R/W A Data A Data ... T     - Standard sub mode : combined 8 bit subaddr write with data read         S Addr R/W A SubAddr A Data A Data ... T     - Combined mode : Subaddress and Data sequences appended with no stop         S Addr R/W A SubAddr S Addr R/W A Data A Data ... T    Currently, this driver uses only Standard mode for i2c xfer, and    smbus byte & quick transfers ; and uses StandardSub mode for    other smbus transfers instead of combined as we need that for the    sound driver to be happy*/#include <linux/module.h>#include <linux/config.h>#include <linux/version.h>#include <linux/kernel.h>#include <linux/ioport.h>#include <linux/pci.h>#include <linux/types.h>#include <linux/delay.h>#include <linux/i2c.h>#include <linux/init.h>#include <linux/mm.h>#include <linux/timer.h>#include <linux/spinlock.h>#include <linux/completion.h>#include <asm/io.h>#include <asm/prom.h>#include <asm/machdep.h>#include <asm/pmac_feature.h>#include "i2c-keywest.h"#undef POLLED_MODE#define DBG(x...) do {\	if (debug > 0) \		printk(KERN_DEBUG "KW:" x); \	} while(0)MODULE_AUTHOR("Benjamin Herrenschmidt <benh@kernel.crashing.org>");MODULE_DESCRIPTION("I2C driver for Apple's Keywest");MODULE_LICENSE("GPL");MODULE_PARM(probe, "i");MODULE_PARM(debug, "i");EXPORT_NO_SYMBOLS;int probe = 0;int debug = 0;static struct keywest_iface *ifaces = NULL;#ifdef POLLED_MODE/* This isn't fast, but will go once I implement interrupt with * proper timeout */static u8wait_interrupt(struct keywest_iface* iface){	int i;	u8 isr;		for (i = 0; i < POLL_TIMEOUT; i++) {		isr = read_reg(reg_isr) & KW_I2C_IRQ_MASK;		if (isr != 0)			return isr;		current->state = TASK_UNINTERRUPTIBLE;		schedule_timeout(1);	}	return isr;}#endif /* POLLED_MODE */static voiddo_stop(struct keywest_iface* iface, int result){	write_reg(reg_control, read_reg(reg_control) | KW_I2C_CTL_STOP);	iface->state = state_stop;	iface->result = result;}/* Main state machine for standard & standard sub mode */static voidhandle_interrupt(struct keywest_iface *iface, u8 isr){	int ack;		DBG("handle_interrupt(), got: %x, status: %x, state: %d\n",		isr, read_reg(reg_status), iface->state);	if (isr == 0 && iface->state != state_stop) {		do_stop(iface, -1);		return;	}	if (isr & KW_I2C_IRQ_STOP && iface->state != state_stop) {		iface->result = -1;		iface->state = state_stop;	}	switch(iface->state) {	case state_addr:		if (!(isr & KW_I2C_IRQ_ADDR)) {			do_stop(iface, -1);			break;		}		ack = read_reg(reg_status);		DBG("ack on set address: %x\n", ack);		if ((ack & KW_I2C_STAT_LAST_AAK) == 0) {			do_stop(iface, -1);			break;		}		/* Handle rw "quick" mode */		if (iface->datalen == 0)			do_stop(iface, 0);		else if (iface->read_write == I2C_SMBUS_READ) {			iface->state = state_read;			if (iface->datalen > 1)				write_reg(reg_control, read_reg(reg_control)					| KW_I2C_CTL_AAK);		} else {			iface->state = state_write;			DBG("write byte: %x\n", *(iface->data));			write_reg(reg_data, *(iface->data++));			iface->datalen--;		}				break;	case state_read:		if (!(isr & KW_I2C_IRQ_DATA)) {			do_stop(iface, -1);			break;		}		*(iface->data++) = read_reg(reg_data);		DBG("read byte: %x\n", *(iface->data-1));		iface->datalen--;		if (iface->datalen == 0)			iface->state = state_stop;		else			write_reg(reg_control, 0);		break;	case state_write:		if (!(isr & KW_I2C_IRQ_DATA)) {			do_stop(iface, -1);			break;		}		/* Check ack status */		ack = read_reg(reg_status);		DBG("ack on data write: %x\n", ack);		if ((ack & KW_I2C_STAT_LAST_AAK) == 0) {			do_stop(iface, -1);			break;		}		if (iface->datalen) {			DBG("write byte: %x\n", *(iface->data));			write_reg(reg_data, *(iface->data++));			iface->datalen--;		} else			do_stop(iface, 0);		break;			case state_stop:		if (!(isr & KW_I2C_IRQ_STOP) && (++iface->stopretry) < 10)			do_stop(iface, -1);		else {			iface->state = state_idle;			write_reg(reg_control, 0x00);			write_reg(reg_ier, 0x00);#ifndef POLLED_MODE			complete(&iface->complete);#endif /* POLLED_MODE */					}		break;	}		write_reg(reg_isr, isr);}#ifndef POLLED_MODE/* Interrupt handler */static voidkeywest_irq(int irq, void *dev_id, struct pt_regs *regs){	struct keywest_iface *iface = (struct keywest_iface *)dev_id;	spin_lock(&iface->lock);	del_timer(&iface->timeout_timer);	handle_interrupt(iface, read_reg(reg_isr));	if (iface->state != state_idle) {		iface->timeout_timer.expires = jiffies + POLL_TIMEOUT;		add_timer(&iface->timeout_timer);	}	spin_unlock(&iface->lock);}static voidkeywest_timeout(unsigned long data){	struct keywest_iface *iface = (struct keywest_iface *)data;	DBG("timeout !\n");	spin_lock_irq(&iface->lock);	handle_interrupt(iface, read_reg(reg_isr));	if (iface->state != state_idle) {		iface->timeout_timer.expires = jiffies + POLL_TIMEOUT;		add_timer(&iface->timeout_timer);	}	spin_unlock(&iface->lock);}#endif /* POLLED_MODE *//* * SMBUS-type transfer entrypoint */static s32keywest_smbus_xfer(	struct i2c_adapter*	adap,			u16			addr,			unsigned short		flags,			char			read_write,			u8			command,			int			size,			union i2c_smbus_data*	data){	struct keywest_chan* chan = (struct keywest_chan*)adap->data;	struct keywest_iface* iface = chan->iface;	int len;	u8* buffer;	u16 cur_word;	int rc = 0;	if (iface->state == state_dead)		return -1;			/* Prepare datas & select mode */	iface->cur_mode &= ~KW_I2C_MODE_MODE_MASK;	switch (size) {	    case I2C_SMBUS_QUICK:	    	len = 0;	    	buffer = NULL;	    	iface->cur_mode |= KW_I2C_MODE_STANDARD;	    	break;	    case I2C_SMBUS_BYTE:	    	len = 1;	    	buffer = &data->byte;	    	iface->cur_mode |= KW_I2C_MODE_STANDARD;	    	break;	    case I2C_SMBUS_BYTE_DATA:	    	len = 1;	    	buffer = &data->byte;	    	iface->cur_mode |= KW_I2C_MODE_STANDARDSUB;	    	break;	    case I2C_SMBUS_WORD_DATA:	    	len = 2;	    	cur_word = cpu_to_le16(data->word);	    	buffer = (u8 *)&cur_word;	    	iface->cur_mode |= KW_I2C_MODE_STANDARDSUB;		break;	    case I2C_SMBUS_BLOCK_DATA:	    	len = data->block[0];	    	buffer = &data->block[1];	    	iface->cur_mode |= KW_I2C_MODE_STANDARDSUB;		break;	    default:	    	return -1;	}	/* Original driver had this limitation */	if (len > 32)		len = 32;	down(&iface->sem);	DBG("chan: %d, addr: 0x%x, transfer len: %d, read: %d\n",		chan->chan_no, addr, len, read_write == I2C_SMBUS_READ);	iface->data = buffer;	iface->datalen = len;	iface->state = state_addr;	iface->result = 0;	iface->stopretry = 0;	iface->read_write = read_write;		/* Setup channel & clear pending irqs */	write_reg(reg_mode, iface->cur_mode | (chan->chan_no << 4));	write_reg(reg_isr, read_reg(reg_isr));	write_reg(reg_status, 0);	/* Set up address and r/w bit */	write_reg(reg_addr,		(addr << 1) | ((read_write == I2C_SMBUS_READ) ? 0x01 : 0x00));	/* Set up the sub address */	if ((iface->cur_mode & KW_I2C_MODE_MODE_MASK) == KW_I2C_MODE_STANDARDSUB	    || (iface->cur_mode & KW_I2C_MODE_MODE_MASK) == KW_I2C_MODE_COMBINED)		write_reg(reg_subaddr, command);	/* Arm timeout */	iface->timeout_timer.expires = jiffies + POLL_TIMEOUT;	add_timer(&iface->timeout_timer);	/* Start sending address & enable interrupt*/	write_reg(reg_control, read_reg(reg_control) | KW_I2C_CTL_XADDR);	write_reg(reg_ier, KW_I2C_IRQ_MASK);#ifdef POLLED_MODE	DBG("using polled mode...\n");

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲一区日韩精品中文字幕| 国产福利一区二区三区| 国产大陆精品国产| 欧美日韩精品欧美日韩精品| 2020国产精品自拍| 五月天亚洲婷婷| 99久久综合国产精品| 精品国内二区三区| 洋洋成人永久网站入口| 国产成人av一区二区三区在线观看| 欧美羞羞免费网站| 综合欧美亚洲日本| 成人免费毛片app| 久久久精品国产免费观看同学| 亚洲国产综合视频在线观看| 色综合久久天天综合网| 国产女主播视频一区二区| 日韩福利电影在线| 欧美视频一区在线观看| 自拍偷自拍亚洲精品播放| 国产激情一区二区三区桃花岛亚洲| 欧美日韩另类一区| 一区二区三区不卡视频| 91在线一区二区| 久久精品欧美一区二区三区麻豆| 美女在线观看视频一区二区| 欧美三级韩国三级日本三斤 | 亚洲精品成人a在线观看| 国产麻豆精品一区二区| 精品国产在天天线2019| 激情深爱一区二区| 精品毛片乱码1区2区3区| 免费成人你懂的| 日韩视频免费观看高清完整版在线观看 | 一区二区三区欧美激情| 日本韩国欧美在线| 亚洲一区二区欧美日韩| 欧美日韩一区二区三区不卡| 亚洲最新视频在线播放| 欧美日韩你懂得| 日本在线不卡一区| 欧美电影免费观看高清完整版 | 国产成人精品aa毛片| 国产精品免费视频观看| 99久久99久久久精品齐齐| 亚洲欧美国产毛片在线| 91国产免费观看| 夜色激情一区二区| 69精品人人人人| 男男视频亚洲欧美| 久久久久久久久岛国免费| 国产v综合v亚洲欧| 亚洲欧美一区二区久久| 欧美男男青年gay1069videost | 亚洲观看高清完整版在线观看| 91麻豆精品91久久久久久清纯 | 中文字幕av在线一区二区三区| 国产成人精品网址| 亚洲一区二区中文在线| 欧美日韩成人高清| 国产一区二区三区av电影| 亚洲国产精品高清| 欧美在线视频不卡| 精品在线观看视频| 午夜视频在线观看一区二区| 欧美日韩成人在线| 国产成人自拍网| 亚洲猫色日本管| 日韩免费成人网| av亚洲精华国产精华精| 日韩精品欧美精品| 亚洲日本在线视频观看| 日韩三级在线观看| 成人久久久精品乱码一区二区三区 | 国产精品美女视频| 欧美久久一二三四区| 国产乱码精品一区二区三| 亚洲精品免费看| www久久精品| 欧美日本在线视频| 97久久精品人人澡人人爽| 免费一级片91| 亚洲一区二区黄色| 国产亚洲综合色| 欧美丰满一区二区免费视频| 成人黄色片在线观看| 日韩一区二区三区精品视频| 成人久久18免费网站麻豆| 裸体一区二区三区| 亚洲欧美韩国综合色| 久久久久久久久久久久电影| 7777精品伊人久久久大香线蕉经典版下载 | 国产日产精品1区| 6080午夜不卡| 在线亚洲+欧美+日本专区| 国产盗摄视频一区二区三区| 日韩va欧美va亚洲va久久| 亚洲品质自拍视频| 国产精品久久久久久亚洲毛片| 欧美v国产在线一区二区三区| 欧美亚洲丝袜传媒另类| av中文字幕亚洲| 国产精品18久久久久久久久 | 欧美日韩一区中文字幕| av综合在线播放| 高清在线成人网| 国产精品亚洲午夜一区二区三区 | 亚洲综合999| 最新日韩av在线| 国产精品水嫩水嫩| 国产日韩三级在线| 久久综合资源网| 精品久久久久久久久久久院品网| 欧美日韩国产片| 欧美日韩视频在线第一区| 欧美四级电影网| 欧美丝袜自拍制服另类| 欧美色偷偷大香| 色婷婷香蕉在线一区二区| 99精品国产热久久91蜜凸| www.成人网.com| 色婷婷香蕉在线一区二区| 99re8在线精品视频免费播放| 99久久综合99久久综合网站| 99久久久免费精品国产一区二区| 91丨porny丨最新| 欧美亚洲国产一区二区三区| 欧美系列一区二区| 91精品国产一区二区三区香蕉| 在线观看91av| wwww国产精品欧美| 欧美国产丝袜视频| 亚洲欧洲精品天堂一级| 亚洲蜜臀av乱码久久精品蜜桃| 国产精品国产三级国产有无不卡 | 精品一区二区在线视频| 国产一区二区三区四区五区入口| 国产精品99久| 99re成人精品视频| 欧美日韩亚洲综合在线| 欧美成人在线直播| 国产欧美精品在线观看| 亚洲男同1069视频| 无吗不卡中文字幕| 国产露脸91国语对白| 成人av动漫网站| 欧美日韩综合在线| 欧美成人性战久久| 中文字幕一区二区三区四区不卡| 亚洲一区二区视频| 韩国在线一区二区| 97成人超碰视| 欧美zozozo| 一区二区三区在线视频免费观看 | 一区二区三区电影在线播| 久草热8精品视频在线观看| 成人av先锋影音| 91麻豆精品国产91久久久久久 | 亚欧色一区w666天堂| 精品在线一区二区| 色诱视频网站一区| 26uuuu精品一区二区| 亚洲尤物在线视频观看| 国产综合色产在线精品| 色综合久久久网| 久久久久久免费网| 亚洲第一搞黄网站| 成人午夜电影久久影院| 欧美电影在哪看比较好| 成人免费一区二区三区视频| 麻豆精品在线看| 欧美日韩亚州综合| 综合自拍亚洲综合图不卡区| 久久电影国产免费久久电影| 日本高清视频一区二区| 中文字幕av一区 二区| 日韩有码一区二区三区| 91女神在线视频| 国产丝袜美腿一区二区三区| 秋霞成人午夜伦在线观看| 欧日韩精品视频| 综合色天天鬼久久鬼色| 国产精品一区在线| 日韩美女一区二区三区| 午夜影院久久久| 一本色道久久综合精品竹菊| 久久久av毛片精品| 国产一区二区三区在线观看精品 | 亚洲欧美自拍偷拍| 琪琪久久久久日韩精品| 欧美性极品少妇| 亚洲国产精品久久艾草纯爱| 99久久99久久精品免费看蜜桃| 国产亚洲成年网址在线观看| 国产一区二区三区蝌蚪| 精品国产网站在线观看| 奇米一区二区三区| 欧美一区二区三区在线| 美女国产一区二区三区| 日韩一区二区免费高清|