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

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

?? s3c2410mci.c

?? linux下基于arm處理器s3c2410x開發板的MMC設備驅動程序。
?? C
?? 第 1 頁 / 共 2 頁
字號:
			sdi_dcon |= S3C2410_SDIDCON_XFER_RXSTART;			s3c2410sdi_dma_setup(host, DMAP_READ);		}				//start DMA#ifdef S3C2410SDI_DMA_BACKBUF		s3c2410_dma_enqueue(host->dma, (void *) host,			host->dmabuf_phys,			(mrq->data->blocks << mrq->data->blksz_bits) );#else		s3c2410_dma_enqueue(host->dma, (void *) host,			virt_to_phys(mrq->data->req->buffer),			(mrq->data->blocks << mrq->data->blksz_bits) );#endif	}	host->mrq = mrq;	init_completion(&host->complete_request);	init_completion(&host->complete_dma);	//Clear command and data status registers	writel(0xFFFFFFFF, host->base + S3C2410_SDICMDSTAT);	writel(0xFFFFFFFF, host->base + S3C2410_SDIDSTA);	// Setup SDI controller	writel(sdi_bsize,host->base + S3C2410_SDIBSIZE);	writel(sdi_timer,host->base + S3C2410_SDITIMER);	writel(sdi_imsk,host->base + S3C2410_SDIIMSK);	// Setup SDI command argument and data control	writel(sdi_carg, host->base + S3C2410_SDICMDARG);	writel(sdi_dcon, host->base + S3C2410_SDIDCON);	// This initiates transfer	writel(sdi_ccon, host->base + S3C2410_SDICMDCON);	// Wait for transfer to complete	wait_for_completion(&host->complete_request);	DBG("[CMD] request complete.\n");	if(mrq->data) {		wait_for_completion(&host->complete_dma);		DBG("[DAT] DMA complete.\n");	}	//Cleanup controller	writel(0, host->base + S3C2410_SDICMDARG);	writel(0, host->base + S3C2410_SDIDCON);	writel(0, host->base + S3C2410_SDICMDCON);	writel(0, host->base + S3C2410_SDIIMSK);	// Read response	mrq->cmd->resp[0] = readl(host->base + S3C2410_SDIRSP0);	mrq->cmd->resp[1] = readl(host->base + S3C2410_SDIRSP1);	mrq->cmd->resp[2] = readl(host->base + S3C2410_SDIRSP2);	mrq->cmd->resp[3] = readl(host->base + S3C2410_SDIRSP3);	host->mrq = NULL;	DBG(PFX "request done.\n");	// If we have no data transfer we are finished here	if (!mrq->data) goto request_done;	// Calulate the amout of bytes transfer, but only if there was	// no error	if(mrq->data->error == MMC_ERR_NONE) {		mrq->data->bytes_xfered = (mrq->data->blocks << mrq->data->blksz_bits);		if(mrq->data->flags & MMC_DATA_READ);#ifdef S3C2410SDI_DMA_BACKBUF		memcpy(mrq->data->req->buffer, host->dmabuf_log, mrq->data->bytes_xfered);#endif	} else {		mrq->data->bytes_xfered = 0;	}	// If we had an error while transfering data we flush the	// DMA channel to clear out any garbage	if(mrq->data->error != MMC_ERR_NONE) {		s3c2410_dma_ctrl(host->dma, S3C2410_DMAOP_FLUSH);		DBG(PFX "flushing DMA.\n");			}	// Issue stop command	if(mrq->data->stop) mmc_wait_for_cmd(mmc, mrq->data->stop, 3);request_done:	mrq->done(mrq);}static void s3c2410sdi_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) {	struct s3c2410sdi_host *host = mmc_priv(mmc);	u32 sdi_psc, sdi_con;	//Set power	sdi_con = readl(host->base + S3C2410_SDICON);	switch(ios->power_mode) {		case MMC_POWER_ON:		case MMC_POWER_UP:			s3c2410_gpio_setpin(S3C2410_GPA17, 1); // card power on			s3c2410_gpio_cfgpin(S3C2410_GPE5, S3C2410_GPE5_SDCLK);			s3c2410_gpio_cfgpin(S3C2410_GPE6, S3C2410_GPE6_SDCMD);			s3c2410_gpio_cfgpin(S3C2410_GPE7, S3C2410_GPE7_SDDAT0);			s3c2410_gpio_cfgpin(S3C2410_GPE8, S3C2410_GPE8_SDDAT1);			s3c2410_gpio_cfgpin(S3C2410_GPE9, S3C2410_GPE9_SDDAT2);			s3c2410_gpio_cfgpin(S3C2410_GPE10, S3C2410_GPE10_SDDAT3);			sdi_con|= S3C2410_SDICON_FIFORESET;			break;		case MMC_POWER_OFF:		default:			s3c2410_gpio_setpin(S3C2410_GPA17, 0); // card power off			s3c2410_gpio_setpin(S3C2410_GPE5, 0);			s3c2410_gpio_cfgpin(S3C2410_GPE5, S3C2410_GPE5_OUTP);			break;	}	//Set clock	for(sdi_psc=0;sdi_psc<255;sdi_psc++) {		if( (clk_get_rate(host->clk) / (2*(sdi_psc+1))) <= ios->clock) break;	}	if(sdi_psc > 255) sdi_psc = 255;	writel(sdi_psc, host->base + S3C2410_SDIPRE);	//Set CLOCK_ENABLE	if(ios->clock) 	sdi_con |= S3C2410_SDICON_CLOCKTYPE;	else		sdi_con &=~S3C2410_SDICON_CLOCKTYPE;	writel(sdi_con, host->base + S3C2410_SDICON);}static struct mmc_host_ops s3c2410sdi_ops = {	.request	= s3c2410sdi_request,	.set_ios	= s3c2410sdi_set_ios,};static int s3c2410sdi_probe(struct device *dev){	struct platform_device	*pdev = to_platform_device(dev);	struct mmc_host 	*mmc;	struct s3c2410sdi_host 	*host;	int ret;	mmc = mmc_alloc_host(sizeof(struct s3c2410sdi_host), dev);	if (!mmc) {		ret = -ENOMEM;		goto probe_out;	}	host = mmc_priv(mmc);	spin_lock_init( &host->complete_lock );	host->complete_what 	= COMPLETION_NONE;	host->mmc 		= mmc;	host->dma		= S3C2410SDI_DMA;	host->irq_cd		= IRQ_EINT2;	host->mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);	if (!host->mem) {		printk(KERN_INFO PFX "failed to get io memory region resouce.\n");		ret = -ENOENT;		goto probe_free_host;	}	host->mem = request_mem_region(host->mem->start,		RESSIZE(host->mem), pdev->name);	if (!host->mem) {		printk(KERN_INFO PFX "failed to request io memory region.\n");		ret = -ENOENT;		goto probe_free_host;	}	host->base = ioremap(host->mem->start, RESSIZE(host->mem));	if (host->base == 0) {		printk(KERN_INFO PFX "failed to ioremap() io memory region.\n");		ret = -EINVAL;		goto probe_free_mem_region;	}	host->irq = platform_get_irq(pdev, 0);	if (host->irq == 0) {		printk(KERN_INFO PFX "failed to get interrupt resouce.\n");		ret = -EINVAL;		goto probe_iounmap;	}	if(request_irq(host->irq, s3c2410sdi_irq, 0, DRIVER_NAME, host)) {		printk(KERN_INFO PFX "failed to request sdi interrupt.\n");		ret = -ENOENT;		goto probe_iounmap;	}	s3c2410_gpio_cfgpin(S3C2410_GPF2, S3C2410_GPF2_EINT2);	set_irq_type(host->irq_cd, IRQT_BOTHEDGE);	if(request_irq(host->irq_cd, s3c2410sdi_irq_cd, 0, DRIVER_NAME, host)) {		printk(KERN_WARNING PFX "failed to request card detect interrupt.\n" );		ret = -ENOENT;		goto probe_free_irq;	}	if(s3c2410_dma_request(S3C2410SDI_DMA, &s3c2410sdi_dma_client, NULL)) {		printk(KERN_WARNING PFX "unable to get DMA channel.\n" );		ret = -EBUSY;		goto probe_free_irq_cd;	}	host->clk = clk_get(dev, "sdi");	if (IS_ERR(host->clk)) {		printk(KERN_INFO PFX "failed to find clock source.\n");		ret = PTR_ERR(host->clk);		host->clk = NULL;		goto probe_free_host;	}	if((ret = clk_use(host->clk))) {		printk(KERN_INFO PFX "failed to use clock source.\n");		goto clk_free;	}	if((ret = clk_enable(host->clk))) {		printk(KERN_INFO PFX "failed to enable clock source.\n");		goto clk_unuse;	}	mmc->ops 	= &s3c2410sdi_ops;	mmc->ocr_avail	= MMC_VDD_32_33;	mmc->f_min 	= clk_get_rate(host->clk) / 512;	mmc->f_max 	= clk_get_rate(host->clk) / 2;	//HACK: There seems to be a hardware bug in TomTom GO.	if(mmc->f_max>3000000) mmc->f_max=3000000;	/*	 * Since we only have a 16-bit data length register, we must	 * ensure that we don't exceed 2^16-1 bytes in a single request.	 * Choose 64 (512-byte) sectors as the limit.	 */	mmc->max_sectors = 64;	/*	 * Set the maximum segment size.  Since we aren't doing DMA	 * (yet) we are only limited by the data length register.	 */	mmc->max_seg_size = mmc->max_sectors << 9;#ifdef S3C2410SDI_DMA_BACKBUF		host->dmabuf_log = dma_alloc_coherent(NULL, mmc->max_seg_size ,&host->dmabuf_phys, GFP_KERNEL|GFP_DMA);		if(!host->dmabuf_log) {		printk(KERN_INFO PFX "failed to allocate DMA buffer.\n");		goto clk_disable;	}		host->dmabuf_size = mmc->max_seg_size;		printk(KERN_INFO PFX "probe: mapped sdi_base=%p irq=%u irq_cd=%u dma=%u dmabuf_l=%p dmabuf_p=%p.\n", 		host->base, host->irq, host->irq_cd, host->dma, host->dmabuf_log, host->dmabuf_phys);#else	printk(KERN_INFO PFX "probe: mapped sdi_base=%p irq=%u irq_cd=%u dma=%u.\n", 		host->base, host->irq, host->irq_cd, host->dma);#endif		if((ret = mmc_add_host(mmc))) {		printk(KERN_INFO PFX "failed to add mmc host.\n");		goto free_dmabuf;	}	dev_set_drvdata(dev, mmc);	printk(KERN_INFO PFX "initialisation done.\n");	return 0;	 free_dmabuf:#ifdef S3C2410SDI_DMA_BACKBUF 	dma_free_coherent(NULL, host->dmabuf_size, host->dmabuf_log, host->dmabuf_phys);#endif clk_disable:	clk_disable(host->clk); clk_unuse:	clk_unuse(host->clk); clk_free:	clk_put(host->clk); probe_free_irq_cd: 	free_irq(host->irq_cd, host); probe_free_irq: 	free_irq(host->irq, host); probe_iounmap:	iounmap(host->base); probe_free_mem_region:	release_mem_region(host->mem->start, RESSIZE(host->mem)); probe_free_host:	mmc_free_host(mmc); probe_out:	return ret;}static int s3c2410sdi_remove(struct device *dev){	struct mmc_host 	*mmc  = dev_get_drvdata(dev);	struct s3c2410sdi_host 	*host = mmc_priv(mmc);	mmc_remove_host(mmc);#ifdef S3C2410SDI_DMA_BACKBUF 	dma_free_coherent(NULL, host->dmabuf_size, host->dmabuf_log, host->dmabuf_phys);#endif	clk_disable(host->clk);	clk_unuse(host->clk);	clk_put(host->clk); 	free_irq(host->irq_cd, host); 	free_irq(host->irq, host);	iounmap(host->base);	release_mem_region(host->mem->start, RESSIZE(host->mem));	mmc_free_host(mmc);	return 0;}static struct device_driver s3c2410sdi_driver ={        .name           = "s3c2410-sdi",        .bus            = &platform_bus_type,        .probe          = s3c2410sdi_probe,        .remove         = s3c2410sdi_remove,};static int __init s3c2410sdi_init(void){	return driver_register(&s3c2410sdi_driver);}static void __exit s3c2410sdi_exit(void){	driver_unregister(&s3c2410sdi_driver);}module_init(s3c2410sdi_init);module_exit(s3c2410sdi_exit);MODULE_DESCRIPTION("Samsung S3C2410 Multimedia Card Interface driver");MODULE_LICENSE("GPL");

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久精品国产77777蜜臀| 久久国产精品免费| 国产亚洲精品7777| 欧美大片日本大片免费观看| 欧美人妖巨大在线| 91精品国产综合久久久久久久| 欧美日韩中文国产| 91麻豆精品国产自产在线 | 日韩欧美一级二级| 欧美电影免费观看高清完整版在线| 91精品国产欧美一区二区成人| 欧美一区二区三区在线看 | 国产精品一区二区黑丝| 国产精品一区二区三区网站| 成人性色生活片免费看爆迷你毛片| 成人黄色小视频在线观看| av在线不卡网| 4438亚洲最大| 国产精品乱人伦| 一卡二卡欧美日韩| 免费观看在线色综合| 国产东北露脸精品视频| 色诱视频网站一区| 日韩欧美国产成人一区二区| 国产欧美va欧美不卡在线 | 欧美日韩亚洲不卡| 日韩一区二区不卡| 欧美激情一二三区| 国产精品一区二区免费不卡| 高清不卡在线观看| 欧美日韩大陆一区二区| 日韩免费看的电影| 亚洲日本中文字幕区| 午夜伊人狠狠久久| 成人av在线播放网址| 欧美日韩高清一区| 国产精品视频在线看| 亚洲chinese男男1069| 国产精品自产自拍| 欧美日韩亚洲国产综合| 国产欧美一区二区三区网站| 一区二区三区美女视频| 精品一区二区精品| 在线免费一区三区| 中文字幕免费一区| 激情国产一区二区| 欧美日韩免费观看一区二区三区| 久久久精品中文字幕麻豆发布| 一区二区三区成人在线视频| 国产精品一区二区果冻传媒| 欧美日韩一二三| 亚洲码国产岛国毛片在线| 精品制服美女丁香| 欧美日韩一区二区三区视频| 日韩一区日韩二区| 成人午夜短视频| 91精品国产欧美日韩| 樱桃视频在线观看一区| 成人免费视频视频| 国产欧美日韩另类视频免费观看 | 6080yy午夜一二三区久久| 成人欧美一区二区三区视频网页 | 91捆绑美女网站| 国产欧美日韩不卡| 国产一区二区视频在线| 欧美成人aa大片| 日韩国产欧美一区二区三区| 欧美色网一区二区| 亚洲精品美国一| 在线观看国产91| 一区二区三区国产| 欧美色涩在线第一页| 一区二区理论电影在线观看| 色婷婷av一区二区三区软件| 亚洲欧洲一区二区三区| 91丨九色丨国产丨porny| 亚洲色图欧美在线| 欧美午夜免费电影| 日韩影院免费视频| 日韩欧美高清dvd碟片| 美女诱惑一区二区| 国产亚洲午夜高清国产拍精品 | 亚洲欧美色图小说| 色综合中文综合网| 日韩激情视频在线观看| 欧美一二三区在线| 国产乱码一区二区三区| 国产精品午夜在线观看| 色悠悠亚洲一区二区| 亚洲一区二区三区免费视频| 欧美日本韩国一区二区三区视频 | 国产真实精品久久二三区| 日韩三级.com| 国内国产精品久久| 国产精品欧美久久久久无广告 | 亚洲在线观看免费| 欧美一级在线观看| 成人小视频免费观看| 有坂深雪av一区二区精品| 欧美精品在线一区二区| 国产在线视频一区二区三区| 久久精品亚洲精品国产欧美| 91色porny| 蜜臀a∨国产成人精品| 久久久99免费| 欧美色爱综合网| 黄一区二区三区| 亚洲自拍都市欧美小说| 欧美精品一区二区在线播放| 色综合天天视频在线观看| 日韩精品亚洲一区| 国产精品久久久爽爽爽麻豆色哟哟| 欧美日韩一区在线观看| 国产suv一区二区三区88区| 洋洋成人永久网站入口| 欧美成人三级在线| 色吊一区二区三区| 国产精品一线二线三线| 性做久久久久久久免费看| 国产精品美女久久久久高潮| 538prom精品视频线放| 91年精品国产| 国产精品资源在线观看| 日韩成人av影视| 夜夜嗨av一区二区三区中文字幕| 久久久久久久久免费| 日韩一区二区在线观看视频| 色8久久人人97超碰香蕉987| 国内不卡的二区三区中文字幕 | 91精品国产免费| 欧洲国内综合视频| 成人免费精品视频| 国产一区视频导航| 美女www一区二区| 日精品一区二区| 亚洲午夜免费电影| 亚洲天堂成人在线观看| 国产精品久久久久一区二区三区共| 欧美成人精品高清在线播放| 欧美日韩国产欧美日美国产精品| 97久久超碰国产精品| 成人午夜在线播放| 成人国产一区二区三区精品| 国产九色精品成人porny | 亚洲天堂网中文字| 欧美国产禁国产网站cc| 国产三级一区二区三区| 国产丝袜美腿一区二区三区| 久久―日本道色综合久久| 欧美mv日韩mv亚洲| 精品999在线播放| 日韩精品一区二| 久久一区二区三区四区| 国产亚洲一区二区三区四区 | 成人午夜激情在线| 高清不卡在线观看av| av网站一区二区三区| 不卡一区在线观看| 色噜噜偷拍精品综合在线| 91小视频免费看| 欧美日韩在线电影| 7878成人国产在线观看| 精品国产伦一区二区三区免费| 久久一区二区三区四区| 国产日韩亚洲欧美综合| 中文av一区二区| 亚洲一区二区三区中文字幕| 亚洲成人动漫一区| 美女久久久精品| 国产mv日韩mv欧美| 日本大香伊一区二区三区| 欧美精品一二三| www精品美女久久久tv| 亚洲欧洲av另类| 石原莉奈在线亚洲二区| 国产在线视视频有精品| 99精品视频在线观看| 欧美另类变人与禽xxxxx| 337p粉嫩大胆噜噜噜噜噜91av| 综合精品久久久| 美国欧美日韩国产在线播放| 成人免费观看视频| 欧美久久一二区| 欧美国产一区二区| 天堂在线亚洲视频| 高清视频一区二区| 欧美一区二区三区在线| 国产精品久久久久影院老司| 亚洲成av人在线观看| 国产成人精品三级| 欧美日韩午夜影院| 国产女同互慰高潮91漫画| 亚洲午夜在线观看视频在线| 国产一区欧美一区| 欧美电影在哪看比较好| 国产精品久久久久久久午夜片| 免费看日韩a级影片| 色乱码一区二区三区88| 久久久久久免费| 日韩电影一二三区|