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

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

?? davinci_mmc.c

?? The latest MontaVista Linux driver about SD/MMC code
?? C
?? 第 1 頁 / 共 3 頁
字號:
		dst_port = MMCSD_REGS_BASE_ADDR + 0x2C;		mode_dst = INCR;		fifo_width_dst = W8BIT;	/* It's not cared as modeDsr is INCR */		dst_bidx = 0;		dst_cidx = 0;		bcntrld = 8;		sync_mode = ABSYNC;	} else {		sync_dev = DAVINCI_DMA_MMCRXEVT;	/* Read */		acnt = 4;		bcnt = 8;		if (num_eight_words > MAX_C_CNT) {			temp_ccnt = MAX_C_CNT;			ccnt = temp_ccnt;		} else {			ccnt = num_eight_words;			temp_ccnt = ccnt;		}		src_port = MMCSD_REGS_BASE_ADDR + 0x28;		mode_src = INCR;		fifo_width_src = W8BIT;		src_bidx = 0;		src_cidx = 0;		dst_port = (unsigned int)virt_to_phys(req->data->req->buffer);		mode_dst = INCR;		fifo_width_dst = W8BIT;	/* It's not cared as modeDsr is INCR */		dst_bidx = 4;		dst_cidx = 32;		bcntrld = 8;		sync_mode = ABSYNC;	}	davinci_set_dma_src_params(sync_dev, src_port, mode_src,				   fifo_width_src);	davinci_set_dma_dest_params(sync_dev, dst_port, mode_dst,				    fifo_width_dst);	davinci_set_dma_src_index(sync_dev, src_bidx, src_cidx);	davinci_set_dma_dest_index(sync_dev, dst_bidx, dst_cidx);	davinci_set_dma_transfer_params(sync_dev, acnt, bcnt, ccnt, bcntrld,					sync_mode);	host->edma_ch_details.cnt_chanel = 0;	davinci_get_dma_params(sync_dev, &temp);	if (sync_dev == DAVINCI_DMA_MMCTXEVT) {		if (option_write == 0) {			option_write = temp.opt;		} else {			temp.opt = option_write;			davinci_set_dma_params(sync_dev, &temp);		}	}	if (sync_dev == DAVINCI_DMA_MMCRXEVT) {		if (option_read == 0) {			option_read = temp.opt;		} else {			temp.opt = option_read;			davinci_set_dma_params(sync_dev, &temp);		}	}	if (num_eight_words > MAX_C_CNT) {	/* Linking will be performed */		davinci_get_dma_params(sync_dev, &temp);		temp.opt &= ~TCINTEN;		davinci_set_dma_params(sync_dev, &temp);		for (i = 0; i < EDMA_MAX_LOGICAL_CHA_ALLOWED; i++) {			if (i != 0) {				j = i - 1;				davinci_get_dma_params(host->edma_ch_details.						       chanel_num[j], &temp);				temp.opt &= ~TCINTEN;				davinci_set_dma_params(host->edma_ch_details.						       chanel_num[j], &temp);			}			host->edma_ch_details.cnt_chanel++;			davinci_request_dma(DAVINCI_EDMA_PARAM_ANY, "LINK",					    NULL, NULL, &edma_chan_num,					    &sync_dev, queue_no);			host->edma_ch_details.chanel_num[i] = edma_chan_num;			ccnt = temp.ccnt & 0x0000FFFF;			if (sync_dev == DAVINCI_DMA_MMCTXEVT) {				temp.src = temp.src + (acnt * bcnt * ccnt);			} else {				temp.dst = temp.dst + (acnt * bcnt * ccnt);			}			temp.opt |= TCINTEN;			if ((num_eight_words - temp_ccnt) > MAX_C_CNT) {				temp.ccnt =				    (temp.ccnt & 0xFFFF0000) | MAX_C_CNT;				ccnt = temp.ccnt & 0x0000FFFF;				temp_ccnt = temp_ccnt + ccnt;			} else {				temp.ccnt =				    (temp.				     ccnt & 0xFFFF0000) | (num_eight_words -							   temp_ccnt);				ccnt = temp.ccnt & 0x0000FFFF;				temp_ccnt = temp_ccnt + ccnt;			}			davinci_set_dma_params(edma_chan_num, &temp);			if (i != 0) {				j = i - 1;				davinci_dma_link_lch(host->edma_ch_details.						     chanel_num[j],						     edma_chan_num);			}			if (temp_ccnt == num_eight_words) {				break;			}		}		davinci_dma_link_lch(sync_dev,				     host->edma_ch_details.chanel_num[0]);	}	davinci_start_dma(sync_dev);	return 0;}static void mmc_davinci_prepare_data(struct mmc_davinci_host *host,				     struct mmc_request *req){	int timeout;	host->data = req->data;	if (req->data == NULL) {		host->data_dir = DAVINCI_MMC_DATADIR_NONE;		mmcsd_regs->mmc_blen = 0;		mmcsd_regs->mmc_nblk = 0;		return;	}	dev_dbg(&mmc_dev,		"MMCSD : Data xfer (%s %s), "		"DTO %d cycles + %d ns, %d blocks of %d bytes\r\n",		(req->data->flags & MMC_DATA_STREAM) ? "stream" : "block",		(req->data->flags & MMC_DATA_WRITE) ? "write" : "read",		req->data->timeout_clks, req->data->timeout_ns,		req->data->blocks, 1 << req->data->blksz_bits);	/* Convert ns to clock cycles by assuming 20MHz frequency	 * 1 cycle at 20MHz = 500 ns	 */	timeout = req->data->timeout_clks + req->data->timeout_ns / 500;	if (timeout > 0xffff) {		timeout = 0xffff;	}	mmcsd_regs->mmc_tod = timeout;	mmcsd_regs->mmc_nblk = req->data->blocks;	mmcsd_regs->mmc_blen = (1 << req->data->blksz_bits);	host->data_dir = (req->data->flags & MMC_DATA_WRITE) ?	    DAVINCI_MMC_DATADIR_WRITE : DAVINCI_MMC_DATADIR_READ;	/* Configure the FIFO */	switch (host->data_dir) {	case DAVINCI_MMC_DATADIR_WRITE:		mmcsd_regs->mmc_fifo_ctl = mmcsd_regs->mmc_fifo_ctl | 0x1;		mmcsd_regs->mmc_fifo_ctl = 0x0;		mmcsd_regs->mmc_fifo_ctl = mmcsd_regs->mmc_fifo_ctl | (1 << 1);		mmcsd_regs->mmc_fifo_ctl = mmcsd_regs->mmc_fifo_ctl | (1 << 2);		break;	case DAVINCI_MMC_DATADIR_READ:		mmcsd_regs->mmc_fifo_ctl = mmcsd_regs->mmc_fifo_ctl | 0x1;		mmcsd_regs->mmc_fifo_ctl = 0x0;		mmcsd_regs->mmc_fifo_ctl = mmcsd_regs->mmc_fifo_ctl | (1 << 2);		break;	default:		break;	}	if ((host->use_dma == 1)	    && (mmc_davinci_start_dma_transfer(host, req) == 0)) {		host->buffer = NULL;		host->bytes_left = 0;	} else {		/* Revert to CPU Copy */		host->buffer = (u32 *) (req->data->req->buffer);		host->bytes_left =		    req->data->blocks * (1 << req->data->blksz_bits);		host->use_dma = 0;	}}static void mmc_davinci_request(struct mmc_host *mmc, struct mmc_request *req){	struct mmc_davinci_host *host = mmc_priv(mmc);	unsigned long flags;	if (!is_card_detect_progress) {		spin_lock_irqsave(&mmc_lock, flags);		is_card_busy = 1;		spin_unlock_irqrestore(&mmc_lock, flags);		mmc_davinci_prepare_data(host, req);		mmc_davinci_start_command(host, req->cmd);	} else {		/* Queue up the request as card dectection is being excuted */		que_mmc_host = mmc;		que_mmc_request = req;		spin_lock_irqsave(&mmc_lock, flags);		is_req_queued_up = 1;		spin_unlock_irqrestore(&mmc_lock, flags);	}}static unsigned int calculate_freq_for_card(unsigned int mmc_req_freq){	unsigned int mmc_freq = 0, cpu_arm_clk = 0, mmc_push_pull = 0;	cpu_arm_clk = mmc_input_clk;	if (cpu_arm_clk > (2 * mmc_req_freq)) {		mmc_push_pull =		    ((unsigned int)cpu_arm_clk / (2 * mmc_req_freq)) - 1;	} else {		mmc_push_pull = 0;	}	mmc_freq = (unsigned int)cpu_arm_clk / (2 * (mmc_push_pull + 1));	if (mmc_freq > mmc_req_freq) {		mmc_push_pull = mmc_push_pull + 1;	}	return mmc_push_pull;}static void mmc_davinci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios){	unsigned short status;	unsigned int open_drain_freq = 0, cpu_arm_clk = 0;	unsigned int mmc_push_pull_freq = 0;	struct mmc_davinci_host *host = mmc_priv(mmc);	cpu_arm_clk = mmc_input_clk;	dev_dbg(&mmc_dev, "clock %dHz busmode %d powermode %d Vdd %d.%02d\r\n",		ios->clock, ios->bus_mode, ios->power_mode,		ios->vdd / 100, ios->vdd % 100);	if (ios->bus_mode == MMC_BUSMODE_OPENDRAIN) {		open_drain_freq =		    ((unsigned int)cpu_arm_clk / (2 * MMCSD_INIT_CLOCK)) - 1;		mmcsd_regs->mmc_clk =		    (mmcsd_regs->mmc_clk & ~(0xFF)) | open_drain_freq;	} else {		mmc_push_pull_freq = calculate_freq_for_card(ios->clock);		mmcsd_regs->mmc_clk =		    (mmcsd_regs->mmc_clk & ~(0xFF)) | mmc_push_pull_freq;	}	host->bus_mode = ios->bus_mode;	if (ios->power_mode == MMC_POWER_UP) {		/* Send clock cycles, poll completion */		mmcsd_regs->mmc_arghl = 0x0;		mmcsd_regs->mmc_cmd = 0x4000;		status = 0;		while (!(status & (MMCSD_EVENT_EOFCMD))) {			status = mmcsd_regs->mmc_st0;		}	}}static void mmc_davinci_xfer_done(struct mmc_davinci_host *host,				  struct mmc_data *data){	unsigned long flags;	host->data = NULL;	host->data_dir = DAVINCI_MMC_DATADIR_NONE;	if (data->error == MMC_ERR_NONE)		data->bytes_xfered += data->blocks * (1 << data->blksz_bits);	if (data->error == MMC_ERR_TIMEOUT) {		spin_lock_irqsave(&mmc_lock, flags);		is_card_busy = 0;		spin_unlock_irqrestore(&mmc_lock, flags);		mmc_request_done(host->mmc, data->mrq);		return;	}	if (!data->stop) {		host->req = NULL;		spin_lock_irqsave(&mmc_lock, flags);		is_card_busy = 0;		spin_unlock_irqrestore(&mmc_lock, flags);		mmc_request_done(host->mmc, data->mrq);		return;	}	mmc_davinci_start_command(host, data->stop);}static void mmc_davinci_cmd_done(struct mmc_davinci_host *host,				 struct mmc_command *cmd){	unsigned long flags;	host->cmd = NULL;	switch (cmd->flags & MMC_RSP_MASK) {	case MMC_RSP_NONE:		/* resp 0 */		break;	case MMC_RSP_SHORT:		/* response types 1, 1b, 3, 4, 5, 6 */		cmd->resp[0] = mmcsd_regs->mmc_rsp67;		break;	case MMC_RSP_LONG:		/* response type 2 */		cmd->resp[3] = mmcsd_regs->mmc_rsp01;		cmd->resp[2] = mmcsd_regs->mmc_rsp23;		cmd->resp[1] = mmcsd_regs->mmc_rsp45;		cmd->resp[0] = mmcsd_regs->mmc_rsp67;		break;	}	if (host->data == NULL || cmd->error != MMC_ERR_NONE) {		host->req = NULL;		if (cmd->error == MMC_ERR_TIMEOUT) {			cmd->mrq->cmd->retries = 0;		}		spin_lock_irqsave(&mmc_lock, flags);		is_card_busy = 0;		spin_unlock_irqrestore(&mmc_lock, flags);		mmc_request_done(host->mmc, cmd->mrq);	}}static irqreturn_t mmc_davinci_irq(int irq, void *dev_id, struct pt_regs *regs){	struct mmc_davinci_host *host = (struct mmc_davinci_host *)dev_id;	u16 status;	int end_command;	int end_transfer;	int byte_cnt = 0, i = 0;	unsigned long flags;	if (host->is_core_command) {		if (host->cmd == NULL && host->data == NULL) {			status = mmcsd_regs->mmc_st0;			dev_dbg(&mmc_dev, "Spurious interrupt 0x%04x\r\n",				status);			/* Disable the interrupt from mmcsd */			mmcsd_regs->mmc_im = 0;			return IRQ_HANDLED;		}	}	end_command = 0;	end_transfer = 0;	status = mmcsd_regs->mmc_st0;	if (status == 0) {		return IRQ_HANDLED;	}	if (host->is_core_command) {		if (is_card_initialized) {			if (new_card_state == 0) {				if (host->cmd) {					host->cmd->error |= MMC_ERR_TIMEOUT;					mmc_davinci_cmd_done(host, host->cmd);				}				dev_dbg(&mmc_dev,					"From code segment excuted when card removed\n");				return IRQ_HANDLED;			}		}		while (status != 0) {			if (host->data_dir == DAVINCI_MMC_DATADIR_WRITE) {				if (status & MMCSD_EVENT_WRITE) {					/* Buffer almost empty */					if (host->bytes_left > 0) {						byte_cnt =						    mmcsd_cfg.rw_threshold;						host->bytes_left -=						    mmcsd_cfg.rw_threshold;						for (i = 0; i < (byte_cnt / 4);						     i++) {							mmcsd_regs->mmc_dxr =							    *host->buffer;							host->buffer++;						}					}				}			}			if (host->data_dir == DAVINCI_MMC_DATADIR_READ) {				if (status & MMCSD_EVENT_READ) {					/* Buffer almost empty */					if (host->bytes_left > 0) {						byte_cnt =						    mmcsd_cfg.rw_threshold;						host->bytes_left -=						    mmcsd_cfg.rw_threshold;						for (i = 0; i < (byte_cnt / 4);						     i++) {							*host->buffer =							    mmcsd_regs->mmc_drr;							host->buffer++;						}					}				}			}			if (status & MMCSD_EVENT_BLOCK_XFERRED) {				/* Block sent/received */				if (host->data != NULL) {					end_transfer = 1;				}			}			if (status & MMCSD_EVENT_ERROR_DATATIMEOUT) {				/* Data timeout */				if ((host->data) && (new_card_state != 0)) {					host->data->error |= MMC_ERR_TIMEOUT;					spin_lock_irqsave(&mmc_lock, flags);					new_card_state = 0;					is_card_initialized = 0;					spin_unlock_irqrestore(&mmc_lock,

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品欧美一区喷水| 在线观看视频91| 久久色成人在线| 国产精品一区在线观看你懂的| 精品美女在线观看| 国产成人精品一区二| 欧美激情一区二区三区不卡 | 久久一夜天堂av一区二区三区| 久久99国产精品免费网站| 久久综合久久综合亚洲| 国产成人精品www牛牛影视| 中文字幕av资源一区| 色偷偷久久人人79超碰人人澡| 亚洲风情在线资源站| 91精品国产全国免费观看| 国产一区二区三区四区五区入口| 国产日韩综合av| 在线亚洲人成电影网站色www| 日韩精品亚洲一区二区三区免费| 久久夜色精品一区| 99riav一区二区三区| 日本特黄久久久高潮| 国产色产综合产在线视频 | 91亚洲精品久久久蜜桃| 视频一区视频二区中文字幕| 久久精品视频在线免费观看| 91精品福利视频| 久久精品av麻豆的观看方式| ●精品国产综合乱码久久久久| 欧美三区免费完整视频在线观看| 蜜桃一区二区三区在线| 中文字幕在线观看一区| 91精品国产日韩91久久久久久| gogogo免费视频观看亚洲一| 亚洲成人自拍一区| 国产精品妹子av| 6080国产精品一区二区| www.欧美.com| 精品一区二区三区香蕉蜜桃| 一区二区三区**美女毛片| 国产色综合久久| 91精品国产免费| 91麻豆6部合集magnet| 国产一区二区三区在线看麻豆| 亚洲精品伦理在线| 久久免费国产精品| 欧美一级欧美一级在线播放| 99国产精品视频免费观看| 激情综合一区二区三区| 亚洲高清免费视频| 亚洲欧洲av一区二区三区久久| 日韩欧美中文字幕一区| 欧美性大战久久久久久久蜜臀| 国产成人一区在线| 国产综合久久久久影院| 日本午夜精品一区二区三区电影 | 久久综合久久综合九色| 91.com视频| 91女厕偷拍女厕偷拍高清| 国产成人午夜99999| 久久99国产精品尤物| 青青草97国产精品免费观看无弹窗版| 亚洲日本韩国一区| 中文字幕视频一区| 亚洲国产成人在线| 久久新电视剧免费观看| 精品国产一区二区国模嫣然| 884aa四虎影成人精品一区| 欧洲精品视频在线观看| 色一情一乱一乱一91av| av成人免费在线| www.欧美精品一二区| 白白色 亚洲乱淫| 成人深夜在线观看| 成人丝袜18视频在线观看| 国产精品一区二区三区99| 国产在线视频精品一区| 国产一区在线观看视频| 国产精品中文字幕日韩精品| 国产精品一区二区三区四区| 国产成人三级在线观看| 成人免费高清在线| 99在线热播精品免费| 一本大道久久a久久精品综合| 91免费在线视频观看| 色女孩综合影院| 欧美在线|欧美| 欧美巨大另类极品videosbest | 日韩亚洲欧美在线| 精品久久久久久久人人人人传媒| 久久九九全国免费| 国产精品久久三区| 五月天精品一区二区三区| 一级日本不卡的影视| 亚洲成人av一区二区三区| 日韩国产在线观看一区| 蜜臀va亚洲va欧美va天堂| 捆绑紧缚一区二区三区视频| 国产精品一区在线观看你懂的| 成人午夜在线播放| 日本韩国一区二区三区| 欧美老肥妇做.爰bbww| 欧美成人欧美edvon| 国产精品萝li| 久久国产人妖系列| 国产精华液一区二区三区| 99精品一区二区三区| 欧美猛男超大videosgay| 欧美精品一区二区三区高清aⅴ| 国产精品美女久久福利网站| 亚洲国产成人porn| 国产最新精品免费| 色又黄又爽网站www久久| 日韩一区二区免费视频| 欧美国产日韩精品免费观看| 亚洲成人av中文| 国产精品资源在线观看| 在线欧美一区二区| 精品粉嫩超白一线天av| 亚洲欧洲精品一区二区三区| 日韩av二区在线播放| 国产69精品久久777的优势| 欧美视频自拍偷拍| 国产精品日产欧美久久久久| 亚洲成人免费视| 岛国av在线一区| 91精品国产91综合久久蜜臀| 中文字幕一区二区三区在线不卡 | 91网站最新网址| 日韩欧美一区电影| 亚洲狠狠丁香婷婷综合久久久| 国产一区激情在线| 欧美电影影音先锋| 亚洲欧美一区二区三区孕妇| 国内精品伊人久久久久av影院| 欧美亚洲自拍偷拍| 国产精品欧美经典| 精品一区二区免费在线观看| 欧美在线免费播放| 综合精品久久久| 国产成人综合自拍| 精品久久久久久久久久久久包黑料| 一区二区三区在线视频免费观看 | 美女爽到高潮91| 精品视频在线免费| 樱花草国产18久久久久| 国产成a人亚洲精品| 欧美v亚洲v综合ⅴ国产v| 婷婷久久综合九色综合伊人色| 91丨porny丨蝌蚪视频| 国产欧美一区二区在线观看| 国产一区日韩二区欧美三区| 欧美一级片免费看| 蜜桃av一区二区三区| 欧美男生操女生| 亚洲二区在线视频| 欧美在线不卡视频| 亚洲柠檬福利资源导航| 99精品久久99久久久久| 亚洲欧洲成人精品av97| av网站免费线看精品| 国产精品理论在线观看| 国产精品中文字幕日韩精品| 久久久亚洲综合| 国产一区二区不卡| 国产欧美中文在线| www.日韩av| 亚洲码国产岛国毛片在线| 99精品国产热久久91蜜凸| 亚洲日穴在线视频| 欧美三级中文字幕在线观看| 午夜精品免费在线| 91精选在线观看| 蜜桃久久久久久| 精品国产凹凸成av人网站| 久久机这里只有精品| 国产亚洲制服色| 成人av电影在线观看| 亚洲欧美一区二区三区极速播放| 色天天综合色天天久久| 亚洲一级二级在线| 日韩一级二级三级精品视频| 国产在线播放一区| 国产精品毛片高清在线完整版 | 欧美性受xxxx| 丝袜亚洲另类丝袜在线| 日韩一级成人av| 国产精品一二三四五| 中文字幕中文在线不卡住| 欧美在线高清视频| 久久精品免费观看| 中文字幕一区二区三区蜜月 | 国产三级精品在线| 一本一道综合狠狠老| 日本亚洲电影天堂| 久久嫩草精品久久久精品| 色哟哟欧美精品| 欧美aⅴ一区二区三区视频| 国产日韩成人精品| 欧美在线免费视屏|