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

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

?? bvd-e680_mmc.c

?? 包含MMC協議,驅動源碼. 在LINUX操作系統下通過.
?? C
字號:
/* * drivers/mmc/bvd-e680_mmc.c * Mainstone (bulverde-based) board-level MMC driver * * Copyright 2003 MontaVista Software Inc. * Author: MontaVista Software, Inc. *	   source@mvista.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  SOFTWARE  IS PROVIDED	  ``AS	IS'' AND   ANY	EXPRESS OR IMPLIED *  WARRANTIES,	  INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN *  NO	EVENT  SHALL   THE AUTHOR  BE	 LIABLE FOR ANY	  DIRECT, INDIRECT, *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT *  NOT LIMITED	  TO, PROCUREMENT OF  SUBSTITUTE GOODS	OR SERVICES; LOSS OF *  USE, DATA,	OR PROFITS; OR	BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON *  ANY THEORY OF LIABILITY, WHETHER IN	 CONTRACT, STRICT LIABILITY, OR TORT *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * *  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. * * References to technical documents used in comments: * [1] - Intel(R) HCDDBVA0 Development Platform for Intel(R) PCA User's Guide * [2] - Intel(R) Bulverde Processor (B-Stepping) Developer's Manual *//* * Copyright 2004-2005 Motorola, Inc. All Rights Reserved. * Revision History:                    Modification     Changed by            Date             Description of Changes----------------   ------------      -------------------------Zhu Zhifu           09/24/2004         import to E680 HWjiang Lili          05/11/2005         Change for sumatra HW*//* * E680 MMC/SD driver spec * * o Card slot  * *   There are two MMC/SD card slots on board. One is for Tri-Flash, the other *   is for SD card. 1 is assigned to SD card slot(external), 0 is assigned to *   Tri-Flash slot(internal). *  * o Card detection * *   Tri-Flash slot is assumed to be available always. SD card slot detection *   is through GPIO11(SD_nCD).  * * o Card selection  * *   For chip selection, E680 assigns *   - 0 to select SD card slot(external)   *   - 1 to select Tri-Flash slot(internal) * * o Mode switching *    *   In E680 MMC/SD driver, we need to use MMC/SD mode when SD slot is empty *   for higher performance as Motoroal required. We switch to SPI mode when  *   SD slot is occupied, and won't switch back to MMC/SD mode. * */#include <linux/module.h>#include <linux/version.h>#include <linux/init.h>#include <linux/sched.h>#include <linux/interrupt.h>#include <linux/mmc/mmc_ll.h>#include <asm/irq.h>        #include <asm/unaligned.h>#include <asm/io.h>#include <asm/arch/hardware.h>#include <asm/arch/mainstone.h>#include <linux/power_ic.h>#include "../misc/ssp_pcap.h"/* Generic Bulverde MMC driver externals */extern void bvd_mmc_slot_up(void);extern void bvd_mmc_slot_down(void);extern int  bvd_mmc_slot_init(void);extern void bvd_mmc_slot_cleanup(void);extern void bvd_mmc_send_command(struct mmc_request *request);extern int  bvd_mmc_set_clock(u32 rate);static struct timer_list e680_detection;typedef enum {	MMC_CARD_REMOVED,	MMC_CARD_INSERTED}slot_state_t;extern int mmc_slot_enable;extern int first_have_card;slot_state_t slot_state[2];#define E680_SLOT_TRIFLASH	0#define E680_SLOT_SD		1/* Initialize the h/w to up the slot, assuming the card is in slot */static void e680_mmc_slot_up(int slot) {	int i, flag;	MOD_INC_USE_COUNT;	/* TODO : Turn on power for the MMC controller */	/* Enable Bulverde MMC/SD controller */	flag = 0;	//for (i=0; i < 2; i++) {	for (i=0;i < 1; i++) {		if (slot_state[i] == MMC_CARD_INSERTED) {			flag = 1;			break;		}	}	if (!flag) {		DEBUG(2, "Init MMC h/w\n");		bvd_mmc_slot_up();		DEBUG(2, "MMC h/w initialized\n");	}	slot_state[slot] = MMC_CARD_INSERTED;}/* Shut down the slot h/w */static void e680_mmc_slot_down(int slot){	int i, flag;        slot_state[slot] = MMC_CARD_REMOVED; 	 	/* Disable Bulverde MMC/SD controller */	flag = 0;	//for (i=0; i < 2; i++) {	for (i=0; i < 1; i++) {		if (slot_state[i] == MMC_CARD_INSERTED) {			flag = 1;			break;		}	}	if (!flag) {		DEBUG(2, "down MMC h/w\n");		/* Disable the Bulverde MMC controller */		bvd_mmc_slot_down();	}	/* TODO : Turn off power for MMC controller ([1], 3.2.2.5) */	MOD_DEC_USE_COUNT;}/* Returns true if MMC slot is empty */static int e680_mmc_slot_is_empty(int slot){	int empty;       // P1 use a XOR on MMC detect and radio detect, SD insert is high.    int ret;       ret = GPLR0 & GPIO_bit(GPIO_MMC_DETECT);    if (ret )    {       DEBUG(2, "~~~~~~SD is inserted\n");       return 0;    }    else    {       DEBUG(2, "~~~~~~SD is empty\n");       return 1;    }//for P0//	return GPLR0 & GPIO_bit(GPIO_MMC_DETECT);#if 0	if (slot == E680_SLOT_TRIFLASH ) 		empty= 0;	else 		empty= GPLR0 & GPIO_bit(11);	return empty;#endif}/* Return true if MMC slot is write-protected */static int e680_mmc_slot_is_wp(int slot){//Sumatra P1 is GPIO21, P0 is GPIO 80        return (GPLR2 & GPIO_bit(GPIO_MMC_WP));#if 0	if (slot == E680_SLOT_TRIFLASH)  		return 0;	else		return (GPLR3 & GPIO_bit(96));#endif} /* Called when MMC card is inserted into / removed from slot */static void e680_detect_handler(unsigned long data){	int empty;	DEBUG(2, "card detect handler\n");        empty = e680_mmc_slot_is_empty(0);	if (slot_state[0] == MMC_CARD_INSERTED && empty) {	        DEBUG(3, "no card in slot\n");		mmc_slot_enable = 0;	        e680_mmc_slot_down(0);	        mmc_eject(0);	} else if (slot_state[0] == MMC_CARD_REMOVED && !empty) {	        DEBUG(3, "found the card in slot\n");	        e680_mmc_slot_up(0);	        mmc_insert(0);	} 		#if 0	empty = e680_mmc_slot_is_empty(E680_SLOT_SD);	if (slot_state[E680_SLOT_SD] == MMC_CARD_INSERTED && empty) {		DEBUG(3, "no card in slot\n");		e680_mmc_slot_down(E680_SLOT_SD);		mmc_eject(E680_SLOT_SD);	} else if (slot_state[E680_SLOT_SD] == MMC_CARD_REMOVED && !empty) {		DEBUG(3, "found the card in slot\n");		e680_mmc_slot_up(E680_SLOT_SD);		mmc_insert(E680_SLOT_SD);	}#endif}static void e680_detect_int(int irq, void *dev, struct pt_regs *regs){	DEBUG(2, "card detect IRQ\n");	mod_timer(&e680_detection, jiffies + HZ);}/* Initialize the slot and prepare software layer to operate with it */static int e680_mmc_slot_init(void){	int retval;	retval = bvd_mmc_slot_init();	if (retval)		return retval;		/* GPIO IRQ detection: GPIO 11 (SD_nCD) */	set_GPIO_IRQ_edge( GPIO_MMC_DETECT, GPIO_FALLING_EDGE | GPIO_RISING_EDGE);        /* Request card detect interrupt */	retval = request_irq(IRQ_GPIO(GPIO_MMC_DETECT), e680_detect_int,			SA_INTERRUPT | SA_SAMPLE_RANDOM,			"MMC/SD card detect", (void*)1);	if (retval) {		printk(KERN_ERR "MMC/SD: can't request MMC card detect IRQ\n");		bvd_mmc_slot_cleanup();		return -1;	}	/* set wp GPIO(GPIO96 or GPIO107) as input *///	GPDR3 &= 0x1ffffff & ( ~(0x1ffffff & (1 << (GPIO_MMC_WP - 96))));         set_GPIO_mode(GPIO_MMC_WP | GPIO_IN);        /* Making slot usable if the card present */	if (!e680_mmc_slot_is_empty(0)) {		first_have_card = 1;	        e680_mmc_slot_up(0);        }	#if 0		/* Making Tri-Flash usable always */	e680_mmc_slot_up(E680_SLOT_TRIFLASH);	/* Making slot usable if the card present */	if (!e680_mmc_slot_is_empty(E680_SLOT_SD)) {		e680_mmc_slot_up(E680_SLOT_SD);	}#endif	DEBUG(2, "MMC initialized\n");	return 0;}/* Shut down the slot and relax software about MMC slot */static void e680_mmc_slot_cleanup(void){        long flags;        local_irq_save(flags); 	/* Shut down the slot */#if 0	e680_mmc_slot_down(E680_SLOT_TRIFLASH);	e680_mmc_slot_down(E680_SLOT_SD);#endif	e680_mmc_slot_down(0);	bvd_mmc_slot_cleanup();	/* Free card detect IRQ */	free_irq(IRQ_GPIO(GPIO_MMC_DETECT), (void *)1);        local_irq_restore(flags);}static struct mmc_slot_driver e680_dops = {	owner:		THIS_MODULE,	name:		"Motorola E680 MMC/SD",	ocr:		1 << 19,  /* Mainstone voltage is 3.15V */	flags:		MMC_SDFLAG_MMC_MODE | MMC_SDFLAG_SD_MODE | MMC_SDFLAG_SPI_MODE,	init:		e680_mmc_slot_init,	cleanup:	e680_mmc_slot_cleanup,	is_empty:	e680_mmc_slot_is_empty,	is_wp:		e680_mmc_slot_is_wp,	send_cmd:	bvd_mmc_send_command,	set_clock:	bvd_mmc_set_clock,};int __init e680_mmc_init(void){	int retval;#ifdef CONFIG_ARCH_EZX_E680	SSP_PCAP_MMCSD_poweroff();	mdelay(100);	SSP_PCAP_MMCSD_poweron();#else	/* For Sumatra P0 use VAUX3, for Sumatra P1 and later use VAUX2 */		/* For VAUX2, temp code, waiting for power_ic module new API */  /*  SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUX_VREG_VAUX2_EN);	mdelay(100);		SSP_PCAP_bit_clean(SSP_PCAP_PRI_BIT_AUX_VREG_VAUX2_0);	SSP_PCAP_bit_set(SSP_PCAP_PRI_BIT_AUX_VREG_VAUX2_1);    SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUX_VREG_VAUX2_EN);*/        // By power ic module API:        power_ic_periph_set_flash_card_on(POWER_IC_PERIPH_OFF);        mdelay(10);        power_ic_periph_set_flash_card_on(POWER_IC_PERIPH_ON);#endif	init_timer(&e680_detection);	e680_detection.function = e680_detect_handler;	/* The MMC clock is stopped at this point */	//retval = mmc_register_slot_driver(&e680_dops, 2);	retval = mmc_register_slot_driver(&e680_dops, 1);	if (retval < 0)		printk(KERN_INFO "MMC/SD: unable to register slot "		       "driver, error %d\n", retval);	DEBUG(3, "slot driver registered\n");	return retval;}void __exit e680_mmc_exit(void){	mmc_unregister_slot_driver(&e680_dops);#ifdef CONFIG_ARCH_EZX_E680	SSP_PCAP_MMCSD_poweroff();#else	// By power ic module API:	power_ic_periph_set_flash_card_on(POWER_IC_PERIPH_OFF);		/* For VAUX2 */	//SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUX_VREG_VAUX2_EN);#endif			DEBUG(3, "slot driver unregistered\n");}module_init(e680_mmc_init);module_exit(e680_mmc_exit);MODULE_AUTHOR("MontaVista Software, Inc. <source@mvista.com>");MODULE_DESCRIPTION("Intel Mainstone MMC/SD driver");MODULE_LICENSE("GPL");

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品成人一区二区三区| 91日韩一区二区三区| 五月天亚洲精品| 亚洲婷婷在线视频| 国产精品狼人久久影院观看方式| 日韩一区二区免费视频| 6080yy午夜一二三区久久| 在线一区二区三区四区五区| 成人av在线影院| 99九九99九九九视频精品| www.av精品| 在线观看一区日韩| 欧美日韩午夜在线| 欧美一区二区免费| 久久综合久久99| 欧美极品美女视频| 亚洲日本va在线观看| 一区二区三区日韩精品视频| 亚洲国产aⅴ成人精品无吗| 亚洲午夜免费福利视频| 午夜精品一区二区三区免费视频| 午夜成人免费视频| 日本不卡一区二区三区高清视频| 毛片av一区二区| 国产99久久久精品| 色av综合在线| 91精品国产欧美一区二区成人| 欧美成人免费网站| 国产精品天干天干在观线| 亚洲摸摸操操av| 人人爽香蕉精品| 国产高清不卡一区| 欧美视频一二三区| 欧美变态tickling挠脚心| 国产欧美日韩久久| 亚洲成人免费影院| 粉嫩一区二区三区性色av| 色欧美片视频在线观看在线视频| 欧美一区二区久久| 亚洲少妇中出一区| 国模套图日韩精品一区二区| 99精品视频在线观看| 欧美电视剧免费观看| 中文字幕一区二区不卡| 免费在线看成人av| 91视频一区二区| xfplay精品久久| 亚洲无人区一区| 成人免费毛片嘿嘿连载视频| 欧美日本一区二区| 亚洲青青青在线视频| 国产中文字幕精品| 制服丝袜中文字幕亚洲| 亚洲精品乱码久久久久久| 欧美aaaaa成人免费观看视频| 99久久国产免费看| 国产视频亚洲色图| 久久国产精品第一页| 欧美在线制服丝袜| 亚洲人成精品久久久久| 国产精品18久久久久久久久久久久| 欧美午夜精品久久久久久孕妇| 久久精品视频在线免费观看| 日韩av在线播放中文字幕| 欧美综合天天夜夜久久| 亚洲丝袜自拍清纯另类| 国产精品综合在线视频| 久久久av毛片精品| 国内久久精品视频| 2024国产精品视频| 国产米奇在线777精品观看| 精品免费国产二区三区| 麻豆精品在线播放| 欧美一级二级在线观看| 日本特黄久久久高潮| 欧美另类z0zxhd电影| 五月婷婷另类国产| 欧美精品色综合| 日本午夜精品一区二区三区电影| 制服丝袜一区二区三区| 首页国产欧美久久| 日韩一级欧美一级| 久久66热re国产| 精品久久久久久久久久久久久久久| 亚洲电影欧美电影有声小说| a级高清视频欧美日韩| 亚洲女子a中天字幕| 懂色av一区二区三区免费看| 久久久国际精品| 国产福利精品一区二区| 2021国产精品久久精品| 免费成人av资源网| 日韩精品在线一区| 韩国精品主播一区二区在线观看| 日韩一区二区三区精品视频| 婷婷丁香久久五月婷婷| 欧美精品三级日韩久久| 亚洲精品久久久蜜桃| 欧美日本在线视频| 青娱乐精品在线视频| 精品国产一区久久| 国产一区二区精品久久91| 国产网站一区二区| av一本久道久久综合久久鬼色| 日韩限制级电影在线观看| 国产精品66部| 亚洲欧美一区二区不卡| 欧美日韩一区二区三区免费看 | 亚洲免费毛片网站| 一本在线高清不卡dvd| 一区二区三区在线观看国产 | 天天综合天天做天天综合| 69av一区二区三区| 国产精品中文字幕一区二区三区| 日韩午夜激情av| 国产高清无密码一区二区三区| 国产精品视频yy9299一区| 97超碰欧美中文字幕| 亚洲成人免费观看| 国产亚洲精品久| 欧美综合色免费| 九色|91porny| 中国色在线观看另类| 欧美亚洲禁片免费| 国产在线日韩欧美| 亚洲免费资源在线播放| 精品剧情v国产在线观看在线| 国产一区二区免费看| 亚洲欧美另类在线| 日韩一级欧美一级| 欧美女孩性生活视频| 国内精品伊人久久久久av一坑| 国产精品久久久久一区二区三区共| 欧美性生活久久| 国产精品一二三在| 视频一区视频二区在线观看| 日韩免费看网站| 欧美一区二区二区| 色老综合老女人久久久| 激情综合色综合久久综合| 亚洲国产欧美日韩另类综合| 久久精品网站免费观看| 日韩亚洲欧美在线观看| 欧美午夜影院一区| 91视视频在线直接观看在线看网页在线看 | 国产精品乱码妇女bbbb| 91精品中文字幕一区二区三区| 北条麻妃国产九九精品视频| 极品少妇xxxx偷拍精品少妇| 亚洲午夜精品在线| 亚洲三级在线免费观看| 日本一区二区在线不卡| 精品国产91久久久久久久妲己| 99国产精品久久久久久久久久久| 亚洲mv在线观看| 亚洲精品免费播放| 中文字幕欧美区| 9191国产精品| 欧美挠脚心视频网站| 欧美性猛交xxxx黑人交| 91视视频在线观看入口直接观看www | 日韩电影在线免费观看| 亚洲国产综合在线| 亚洲你懂的在线视频| 中文字幕精品一区| 国产拍欧美日韩视频二区| 26uuu国产日韩综合| 精品美女一区二区| 26uuu精品一区二区三区四区在线 26uuu精品一区二区在线观看 | 亚洲成人资源网| 亚洲最快最全在线视频| 亚洲男人的天堂在线观看| 日韩美女久久久| 亚洲人成伊人成综合网小说| 日韩免费视频一区| 国产精品久久久久婷婷二区次| 久久久久久一级片| 国产色爱av资源综合区| 中文一区二区完整视频在线观看| 国产午夜亚洲精品午夜鲁丝片| 国产精品久久久久7777按摩 | 成人激情动漫在线观看| 99精品久久只有精品| 色婷婷av久久久久久久| 在线日韩国产精品| 欧美三级在线播放| 久久久久久久久久看片| 成人欧美一区二区三区视频网页 | 国产麻豆精品视频| 成人精品亚洲人成在线| 99久久精品免费看国产免费软件| 欧美日韩三级在线| 日韩欧美国产不卡| 中国色在线观看另类| 亚洲一级二级三级在线免费观看| 亚洲国产综合在线| 久久99久久99精品免视看婷婷| 97精品久久久午夜一区二区三区| 欧美亚洲国产bt| 欧美大黄免费观看|