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

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

?? s3c2410mci.c

?? linux下基于arm處理器s3c2410x開發(fā)板的MMC設(shè)備驅(qū)動程序。
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* *  linux/drivers/mmc/s3c2410mci.h - Samsung S3C2410 SDI Interface driver * */#include <linux/config.h>#include <linux/module.h>#include <linux/moduleparam.h>#include <linux/init.h>#include <linux/ioport.h>#include <linux/device.h>#include <linux/interrupt.h>#include <linux/blkdev.h>#include <linux/delay.h>#include <linux/err.h>#include <linux/dma-mapping.h>#include <linux/mmc/host.h>#include <linux/mmc/protocol.h>#include <asm/dma.h>#include <asm/dma-mapping.h>#include <asm/arch/dma.h>#include <asm/io.h>#include <asm/irq.h>#include <asm/hardware/amba.h>#include <asm/hardware/clock.h>#include <asm/mach/mmc.h>#include <asm/arch/regs-sdi.h>#include <asm/arch/regs-gpio.h>#ifdef CONFIG_MMC_DEBUG#define DBG(x...)       printk(KERN_DEBUG x)#else#define DBG(x...)       do { } while (0)#endif#include "s3c2410mci.h"#define DRIVER_NAME "mmci-s3c2410"#define PFX DRIVER_NAME ": "#define RESSIZE(ressource) (((ressource)->end - (ressource)->start)+1)typedef enum {	DMAP_READ,	DMAP_WRITE,} eDMAPurpose_t;static struct s3c2410_dma_client s3c2410sdi_dma_client = {	.name		= "s3c2410-sdi",};static irqreturn_t s3c2410sdi_irq(int irq, void *dev_id, struct pt_regs *regs){	struct s3c2410sdi_host *host;	u32 sdi_csta, sdi_dsta, sdi_dcnt;	u32 sdi_cclear, sdi_dclear;	unsigned long iflags;	host = (struct s3c2410sdi_host *)dev_id;	if(!host) return IRQ_HANDLED;		sdi_csta 	= readl(host->base + S3C2410_SDICMDSTAT);	sdi_dsta 	= readl(host->base + S3C2410_SDIDSTA);	sdi_dcnt 	= readl(host->base + S3C2410_SDIDCNT);		DBG(PFX "IRQ csta=0x%08x dsta=0x%08x dcnt:0x%08x\n", sdi_csta, sdi_dsta, sdi_dcnt);			spin_lock_irqsave( &host->complete_lock, iflags);		if( host->complete_what==COMPLETION_NONE ) {		goto clear_imask;	}		if(!host->mrq) { 		goto clear_imask;	}		sdi_csta 	= readl(host->base + S3C2410_SDICMDSTAT);	sdi_dsta 	= readl(host->base + S3C2410_SDIDSTA);	sdi_dcnt 	= readl(host->base + S3C2410_SDIDCNT);	sdi_cclear	= 0;	sdi_dclear	= 0;			if(sdi_csta & S3C2410_SDICMDSTAT_CMDTIMEOUT) {		host->mrq->cmd->error = MMC_ERR_TIMEOUT;		goto transfer_closed;	}	if(sdi_csta & S3C2410_SDICMDSTAT_CMDSENT) {		if(host->complete_what == COMPLETION_CMDSENT) {			host->mrq->cmd->error = MMC_ERR_NONE;			goto transfer_closed;		}		sdi_cclear |= S3C2410_SDICMDSTAT_CMDSENT;	}	if(sdi_csta & S3C2410_SDICMDSTAT_CRCFAIL) {		if(host->mrq->cmd->flags & MMC_RSP_CRC) {			host->mrq->cmd->error = MMC_ERR_BADCRC;			goto transfer_closed;		}		sdi_cclear |= S3C2410_SDICMDSTAT_CRCFAIL;	}	if(sdi_csta & S3C2410_SDICMDSTAT_RSPFIN) {		if(host->complete_what == COMPLETION_RSPFIN) {			host->mrq->cmd->error = MMC_ERR_NONE;			goto transfer_closed;		}		if(host->complete_what == COMPLETION_XFERFINISH_RSPFIN) {			host->mrq->cmd->error = MMC_ERR_NONE;			host->complete_what = COMPLETION_XFERFINISH;		}		sdi_cclear |= S3C2410_SDICMDSTAT_RSPFIN;	}	if(sdi_dsta & S3C2410_SDIDSTA_FIFOFAIL) {		host->mrq->cmd->error = MMC_ERR_NONE;		host->mrq->data->error = MMC_ERR_FIFO;		goto transfer_closed;	}	if(sdi_dsta & S3C2410_SDIDSTA_RXCRCFAIL) {		host->mrq->cmd->error = MMC_ERR_NONE;		host->mrq->data->error = MMC_ERR_BADCRC;		goto transfer_closed;	}	if(sdi_dsta & S3C2410_SDIDSTA_CRCFAIL) {		host->mrq->cmd->error = MMC_ERR_NONE;		host->mrq->data->error = MMC_ERR_BADCRC;		goto transfer_closed;	}	if(sdi_dsta & S3C2410_SDIDSTA_DATATIMEOUT) {		host->mrq->cmd->error = MMC_ERR_NONE;		host->mrq->data->error = MMC_ERR_TIMEOUT;		goto transfer_closed;	}	if(sdi_dsta & S3C2410_SDIDSTA_XFERFINISH) {		if(host->complete_what == COMPLETION_XFERFINISH) {			host->mrq->cmd->error = MMC_ERR_NONE;			host->mrq->data->error = MMC_ERR_NONE;			goto transfer_closed;		}		if(host->complete_what == COMPLETION_XFERFINISH_RSPFIN) {			host->mrq->data->error = MMC_ERR_NONE;			host->complete_what = COMPLETION_RSPFIN;		}		sdi_dclear |= S3C2410_SDIDSTA_XFERFINISH;	}	writel(sdi_cclear, host->base + S3C2410_SDICMDSTAT);	writel(sdi_dclear, host->base + S3C2410_SDIDSTA);	spin_unlock_irqrestore( &host->complete_lock, iflags);	DBG(PFX "IRQ still waiting.\n");	return IRQ_HANDLED;transfer_closed:	host->complete_what = COMPLETION_NONE;	complete(&host->complete_request);	writel(0, host->base + S3C2410_SDIIMSK);	spin_unlock_irqrestore( &host->complete_lock, iflags);	DBG(PFX "IRQ transfer closed.\n");	return IRQ_HANDLED;	clear_imask:regular_clear_imask:	writel(0, host->base + S3C2410_SDIIMSK);	spin_unlock_irqrestore( &host->complete_lock, iflags);	DBG(PFX "IRQ clear imask.\n");	return IRQ_HANDLED;}/* * ISR for the CardDetect Pin*/static irqreturn_t s3c2410sdi_irq_cd(int irq, void *dev_id, struct pt_regs *regs){	struct s3c2410sdi_host *host = (struct s3c2410sdi_host *)dev_id;	mmc_detect_change(host->mmc);	return IRQ_HANDLED;}void s3c2410sdi_dma_done_callback(s3c2410_dma_chan_t *dma_ch, void *buf_id,	int size, s3c2410_dma_buffresult_t result){	unsigned long iflags;	u32 sdi_csta, sdi_dsta,sdi_dcnt;	struct s3c2410sdi_host *host = (struct s3c2410sdi_host *)buf_id;		sdi_csta 	= readl(host->base + S3C2410_SDICMDSTAT);	sdi_dsta 	= readl(host->base + S3C2410_SDIDSTA);	sdi_dcnt 	= readl(host->base + S3C2410_SDIDCNT);		DBG(PFX "DMAD csta=0x%08x dsta=0x%08x dcnt:0x%08x result:0x%08x\n", sdi_csta, sdi_dsta, sdi_dcnt, result);		spin_lock_irqsave( &host->complete_lock, iflags);		if(!host->mrq) goto out;	if(!host->mrq->data) goto out;			sdi_csta 	= readl(host->base + S3C2410_SDICMDSTAT);	sdi_dsta 	= readl(host->base + S3C2410_SDIDSTA);	sdi_dcnt 	= readl(host->base + S3C2410_SDIDCNT);			if( result!=S3C2410_RES_OK ) {		goto fail_request;	}			if(host->mrq->data->flags & MMC_DATA_READ) {		if( sdi_dcnt>0 ) {			goto fail_request;		}	}	out:		complete(&host->complete_dma);	spin_unlock_irqrestore( &host->complete_lock, iflags);	return;fail_request:	host->mrq->data->error = MMC_ERR_DMA;	host->complete_what = COMPLETION_NONE;	complete(&host->complete_dma);	complete(&host->complete_request);	writel(0, host->base + S3C2410_SDIIMSK);	goto out;}void s3c2410sdi_dma_setup(struct s3c2410sdi_host *host, eDMAPurpose_t purpose) {	s3c2410_dmasrc_t source;	switch(purpose) {		case DMAP_READ:			source  = S3C2410_DMASRC_HW;			break;		case DMAP_WRITE:			source  = S3C2410_DMASRC_MEM;			break;	}	s3c2410_dma_devconfig(host->dma, source, 3, host->mem->start + S3C2410_SDIDATA);	s3c2410_dma_config(host->dma, 4, (1<<23) | (2<<24));	s3c2410_dma_set_buffdone_fn(host->dma, s3c2410sdi_dma_done_callback);	s3c2410_dma_setflags(host->dma, S3C2410_DMAF_AUTOSTART);}static void s3c2410sdi_request(struct mmc_host *mmc, struct mmc_request *mrq) { 	struct s3c2410sdi_host *host = mmc_priv(mmc);	u32 sdi_carg, sdi_ccon, sdi_timer;	u32 sdi_bsize, sdi_dcon, sdi_imsk;	DBG(KERN_DEBUG PFX "request: [CMD] opcode:0x%02x arg:0x%08x flags:%x retries:%u\n",		mrq->cmd->opcode, mrq->cmd->arg, mrq->cmd->flags, mrq->cmd->retries);	sdi_ccon = mrq->cmd->opcode & S3C2410_SDICMDCON_INDEX;	sdi_ccon|= S3C2410_SDICMDCON_SENDERHOST;	sdi_ccon|= S3C2410_SDICMDCON_CMDSTART;	sdi_carg = mrq->cmd->arg;	//FIXME: Timer value ?!	sdi_timer= 0xF000;	sdi_bsize= 0;	sdi_dcon = 0;	sdi_imsk = 0;	//enable interrupts for transmission errors	sdi_imsk |= S3C2410_SDIIMSK_RESPONSEND;	sdi_imsk |= S3C2410_SDIIMSK_CRCSTATUS;	host->complete_what = COMPLETION_CMDSENT;	if (mrq->cmd->flags & MMC_RSP_MASK) {		host->complete_what = COMPLETION_RSPFIN;		sdi_ccon |= S3C2410_SDICMDCON_WAITRSP;		sdi_imsk |= S3C2410_SDIIMSK_CMDTIMEOUT;	} else {		//We need the CMDSENT-Interrupt only if we want are not waiting		//for a response		sdi_imsk |= S3C2410_SDIIMSK_CMDSENT;	}	if(mrq->cmd->flags & MMC_RSP_LONG) {		sdi_ccon|= S3C2410_SDICMDCON_LONGRSP;	}	if(mrq->cmd->flags & MMC_RSP_CRC) {		sdi_imsk |= S3C2410_SDIIMSK_RESPONSECRC;	}	if (mrq->data) {		host->complete_what = COMPLETION_XFERFINISH_RSPFIN;		sdi_bsize = (1 << mrq->data->blksz_bits);		sdi_dcon  = (mrq->data->blocks & S3C2410_SDIDCON_BLKNUM_MASK);		sdi_dcon |= S3C2410_SDIDCON_DMAEN;		sdi_imsk |= S3C2410_SDIIMSK_FIFOFAIL;		sdi_imsk |= S3C2410_SDIIMSK_DATACRC;		sdi_imsk |= S3C2410_SDIIMSK_DATATIMEOUT;		sdi_imsk |= S3C2410_SDIIMSK_DATAFINISH;		sdi_imsk |= 0xFFFFFFE0;		DBG(PFX "request: [DAT] bsize:%u blocks:%u bytes:%u\n",			sdi_bsize, mrq->data->blocks, mrq->data->blocks * sdi_bsize);		if(mrq->data->flags & MMC_DATA_WIDE) {			sdi_dcon |= S3C2410_SDIDCON_WIDEBUS;		}		if(!(mrq->data->flags & MMC_DATA_STREAM)) {			sdi_dcon |= S3C2410_SDIDCON_BLOCKMODE;		}		if(mrq->data->flags & MMC_DATA_WRITE) {			sdi_dcon |= S3C2410_SDIDCON_TXAFTERRESP;			sdi_dcon |= S3C2410_SDIDCON_XFER_TXSTART;			s3c2410sdi_dma_setup(host, DMAP_WRITE);#ifdef S3C2410SDI_DMA_BACKBUF						memcpy(host->dmabuf_log, mrq->data->req->buffer, mrq->data->blocks * sdi_bsize);#endif		}		if(mrq->data->flags & MMC_DATA_READ) {			sdi_dcon |= S3C2410_SDIDCON_RXAFTERCMD;

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人h版在线观看| 国产剧情一区二区| 在线免费一区三区| 亚洲午夜电影网| 在线播放中文一区| 久久91精品国产91久久小草| 日韩午夜精品电影| 另类欧美日韩国产在线| 国产三区在线成人av| 91小视频免费看| 亚洲国产视频直播| 欧美精品一区二区三区在线播放 | 亚洲精品一区二区三区四区高清| 精品一区二区日韩| 中文字幕一区二区三区色视频| 91丨九色porny丨蝌蚪| 亚洲成av人**亚洲成av**| 日韩一级大片在线观看| 国产suv精品一区二区883| 一区二区三区四区视频精品免费 | 国产精品综合一区二区| 亚洲欧洲日韩av| 欧美艳星brazzers| 国产一区二区三区蝌蚪| 亚洲人成电影网站色mp4| 制服.丝袜.亚洲.中文.综合| 国产精品羞羞答答xxdd| 伊人夜夜躁av伊人久久| 欧美成人精品1314www| 波多野结衣中文一区| 日本不卡不码高清免费观看 | 中文字幕一区在线观看视频| 欧美日韩精品一区视频| 国产v日产∨综合v精品视频| 午夜精品久久久久久久99樱桃| 久久精品一区蜜桃臀影院| 欧美视频一区在线| 国产一区二区剧情av在线| 午夜精品一区二区三区免费视频| 久久日韩精品一区二区五区| 在线免费观看一区| 国产不卡免费视频| 美女视频黄免费的久久| 一区二区三区产品免费精品久久75| 欧美不卡一区二区三区四区| 欧美主播一区二区三区| 丁香婷婷综合激情五月色| 午夜在线电影亚洲一区| 1区2区3区精品视频| 久久久精品2019中文字幕之3| 制服视频三区第一页精品| 色妹子一区二区| 成人a区在线观看| 国产麻豆日韩欧美久久| 久久精工是国产品牌吗| 五月天亚洲婷婷| 亚洲大型综合色站| 亚洲永久精品大片| 亚洲私人影院在线观看| 欧美国产欧美综合| 国产色综合一区| 久久久久国产精品免费免费搜索| 欧美一级午夜免费电影| 91精品国模一区二区三区| 欧美日韩精品免费观看视频 | 成人免费看黄yyy456| 久久99热狠狠色一区二区| 日韩不卡免费视频| 日韩vs国产vs欧美| 免费观看成人av| 美女精品一区二区| 极品少妇xxxx偷拍精品少妇| 精品在线一区二区| 激情伊人五月天久久综合| 免费精品视频在线| 麻豆精品在线视频| 韩国av一区二区三区四区| 精品一区二区免费| 国产一区高清在线| 国产一区二区三区免费播放| 国产精品香蕉一区二区三区| 国产美女一区二区三区| 粉嫩嫩av羞羞动漫久久久| 成人免费不卡视频| 99久久综合色| 在线免费观看视频一区| 欧美日韩电影在线播放| 日韩欧美久久一区| 国产欧美一区二区三区沐欲| 国产精品免费网站在线观看| 亚洲欧美自拍偷拍| 夜夜精品视频一区二区 | 欧美精品一区二区久久久| 精品乱人伦小说| 国产精品人妖ts系列视频| 亚洲欧美日韩在线播放| 午夜欧美电影在线观看| 日本美女视频一区二区| 国产高清一区日本| 一本高清dvd不卡在线观看 | 日韩欧美一区二区在线视频| 久久综合视频网| 亚洲情趣在线观看| 日本欧美一区二区三区| 国产精品456| 91福利精品视频| 精品国产乱码久久久久久影片| 日本一区二区三区dvd视频在线| 综合久久一区二区三区| 天天综合天天做天天综合| 国产成人精品免费在线| 91国偷自产一区二区三区观看| 91精品欧美一区二区三区综合在 | 国产成人av影院| 欧美日韩一区二区三区不卡| 日韩欧美一卡二卡| 日韩一区中文字幕| 激情久久五月天| 欧美影院一区二区| 久久久久国产免费免费| 香蕉久久一区二区不卡无毒影院 | 一区二区三区日本| 国产精品一二三在| 69堂国产成人免费视频| 欧美极品少妇xxxxⅹ高跟鞋 | 国产在线日韩欧美| 欧美综合久久久| 国产精品三级久久久久三级| 秋霞影院一区二区| 91福利国产精品| 国产精品三级在线观看| 久久99日本精品| 欧美狂野另类xxxxoooo| 亚洲欧美日本韩国| 国产sm精品调教视频网站| 51精品秘密在线观看| 一区二区三区色| 成人av电影免费观看| 久久男人中文字幕资源站| 亚洲电影你懂得| 99re热视频精品| 亚洲国产高清在线观看视频| 久久精品国产**网站演员| 欧美日韩国产在线播放网站| 亚洲天堂免费看| 成人免费毛片app| 国产欧美久久久精品影院| 麻豆国产91在线播放| 欧美一卡在线观看| 天堂成人免费av电影一区| 欧美性xxxxxxxx| 亚洲精品伦理在线| 91原创在线视频| 亚洲欧美日韩中文字幕一区二区三区 | 在线精品亚洲一区二区不卡| 国产精品乱码一区二三区小蝌蚪| 国产在线精品不卡| 精品国产91乱码一区二区三区| 日日夜夜精品视频免费| 欧美日韩日日摸| 首页亚洲欧美制服丝腿| 欧美综合色免费| 午夜精彩视频在线观看不卡| 欧美视频精品在线观看| 一区二区三区精品久久久| 在线观看日韩一区| 亚洲国产欧美在线| 欧美精品乱码久久久久久按摩 | 麻豆91精品91久久久的内涵| 欧美一区二区三区在线电影| 美日韩一区二区三区| 精品国产1区二区| 国产91精品一区二区麻豆网站| 国产欧美精品国产国产专区 | 欧美视频日韩视频| 日韩激情中文字幕| 日韩欧美国产小视频| 精品无人码麻豆乱码1区2区| 精品粉嫩超白一线天av| 国产一区二区免费视频| 国产精品久久久久久户外露出| eeuss影院一区二区三区| 亚洲一区影音先锋| 欧美另类一区二区三区| 精品一区二区三区在线观看| 久久久亚洲精华液精华液精华液| 成人免费观看av| 亚洲综合在线观看视频| 91麻豆精品91久久久久久清纯| 麻豆精品新av中文字幕| 国产欧美在线观看一区| 色欲综合视频天天天| 日韩电影在线一区| 国产视频911| 在线观看日韩精品| 国产一区二区在线电影| 亚洲欧美区自拍先锋| 日韩一区二区在线观看视频| 国产精品一区二区久久不卡| 亚洲视频一二三|