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

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

?? bvd-e680_mmc.c

?? spi driver for sd /mmc card
?? 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一区二区三区免费野_久草精品视频
亚洲成在人线在线播放| 日韩电影在线观看一区| 在线观看成人小视频| 老司机免费视频一区二区| 2014亚洲片线观看视频免费| 欧美性生交片4| 成人性色生活片| 免费高清在线视频一区·| 亚洲天堂精品视频| 国产视频一区二区在线| 欧美另类高清zo欧美| 99国产精品一区| 精品一区二区三区免费毛片爱 | 亚洲综合激情另类小说区| 久久老女人爱爱| 欧美一区二区三区系列电影| a级高清视频欧美日韩| 激情综合网激情| 日韩制服丝袜av| 亚洲一线二线三线视频| 国产色婷婷亚洲99精品小说| 日韩欧美成人一区二区| 欧美日韩国产综合一区二区| 91在线视频免费91| 粗大黑人巨茎大战欧美成人| 激情小说欧美图片| 久久草av在线| 日av在线不卡| 蜜桃精品视频在线| 日韩成人一区二区| 一区二区三区在线观看国产| 中文字幕第一页久久| 国产女人aaa级久久久级| 久久久久久亚洲综合影院红桃| 欧美一区二区播放| 欧美久久久久中文字幕| 欧美体内she精高潮| 一本久久a久久精品亚洲| av成人免费在线| 99在线精品观看| 91在线小视频| 91美女片黄在线| av激情综合网| 色欧美88888久久久久久影院| 99精品视频一区二区| 成人av影院在线| 99riav一区二区三区| 91免费看片在线观看| 91婷婷韩国欧美一区二区| 色成年激情久久综合| 91精品办公室少妇高潮对白| 色综合久久综合| 在线免费av一区| 欧美日韩一区二区在线观看| 欧美一区二区在线免费播放| 6080亚洲精品一区二区| 日韩视频一区二区在线观看| 伊人夜夜躁av伊人久久| 18欧美乱大交hd1984| 亚洲激情网站免费观看| 午夜精品久久久久久| 六月婷婷色综合| 成人免费毛片a| 在线一区二区视频| 日韩欧美专区在线| 国产欧美日韩在线看| 亚洲欧洲另类国产综合| 亚洲在线中文字幕| 老司机午夜精品| 99精品桃花视频在线观看| 91国内精品野花午夜精品| 欧美日韩亚洲综合在线| 欧美电视剧免费观看| 中文字幕第一区综合| 亚洲福利视频导航| 黄色小说综合网站| 不卡的电视剧免费网站有什么| 欧美三级三级三级爽爽爽| www激情久久| 亚洲视频1区2区| 免费久久99精品国产| 不卡一区二区在线| 欧美一区二区成人| 中文字幕亚洲一区二区av在线| 三级亚洲高清视频| 成人a级免费电影| 欧美一区二区日韩| 综合久久给合久久狠狠狠97色| 美女视频黄频大全不卡视频在线播放| 国产精品自产自拍| 欧美在线一区二区| 国产欧美一区二区三区网站| 午夜一区二区三区视频| 国产成人精品亚洲日本在线桃色 | 欧美影视一区在线| 国产亚洲综合av| 亚洲3atv精品一区二区三区| 国产精品一区二区男女羞羞无遮挡| 日本韩国一区二区三区| 久久亚洲一区二区三区四区| 亚洲一区免费视频| 成人av午夜电影| 欧美成人精品二区三区99精品| 亚洲欧洲三级电影| 国产一区二区伦理片| 337p亚洲精品色噜噜| 亚洲视频精选在线| 成人妖精视频yjsp地址| 亚洲精品一区二区三区99| 亚洲高清免费视频| 一本色道亚洲精品aⅴ| 国产女主播视频一区二区| 蜜臀va亚洲va欧美va天堂| 欧美日韩国产综合草草| 亚洲三级电影全部在线观看高清| 国产米奇在线777精品观看| 欧美区一区二区三区| 成人欧美一区二区三区白人| 国产精品一区免费在线观看| 91精品久久久久久久99蜜桃| 亚洲小说欧美激情另类| 91视频观看免费| 国产精品成人在线观看| 国产69精品一区二区亚洲孕妇| 日韩国产在线一| 欧美亚洲图片小说| 一区二区视频免费在线观看| 成人毛片在线观看| 国产欧美日韩在线| 国产91高潮流白浆在线麻豆| 久久综合色天天久久综合图片| 久久激情五月婷婷| 日韩精品一区国产麻豆| 麻豆久久一区二区| 精品国一区二区三区| 久久99精品久久久久婷婷| 在线播放欧美女士性生活| 丝袜脚交一区二区| 欧美一二三四在线| 久久爱另类一区二区小说| 日韩女优毛片在线| 久久精品国产免费| 久久影院午夜论| 懂色av中文一区二区三区| 国产日韩视频一区二区三区| 国产sm精品调教视频网站| 国产精品乱码妇女bbbb| caoporn国产一区二区| 亚洲视频在线一区观看| 91美女片黄在线观看| 亚洲一级二级三级| 9191久久久久久久久久久| 久久精品国产色蜜蜜麻豆| 久久久影视传媒| 成人动漫视频在线| 亚洲综合一区二区| 欧美一区午夜精品| 国产在线播放一区| 中文字幕一区二区三区乱码在线| 99久久精品免费看| 午夜伦欧美伦电影理论片| 欧美成人免费网站| av亚洲精华国产精华精| 亚洲国产婷婷综合在线精品| 91精品国产综合久久国产大片| 国内国产精品久久| 国产精品福利一区| 欧美卡1卡2卡| 国产精品99久久久久久宅男| 日韩一区中文字幕| 欧美日本一区二区三区| 国产自产高清不卡| 亚洲女与黑人做爰| 91精品国产91综合久久蜜臀| 国产伦精品一区二区三区免费| 自拍偷拍国产亚洲| 6080国产精品一区二区| 国产成人免费在线视频| 亚洲一本大道在线| 久久久久国产精品麻豆| 在线中文字幕一区二区| 久99久精品视频免费观看| 亚洲蜜臀av乱码久久精品| 日韩欧美精品在线| 91色在线porny| 精品一区二区三区欧美| 樱花影视一区二区| 精品国产成人系列| 在线观看不卡视频| 国产精品一区一区| 日韩有码一区二区三区| 国产亲近乱来精品视频| 欧美日韩精品欧美日韩精品 | av在线综合网| 久久精品国产亚洲高清剧情介绍 | 成人高清免费在线播放| 免费观看91视频大全| 怡红院av一区二区三区| 日本一区二区三区四区 | 美女免费视频一区二区|