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

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

?? mmc_core.c

?? 包含MMC協議,驅動源碼. 在LINUX操作系統下通過.
?? C
?? 第 1 頁 / 共 3 頁
字號:
	if ( !(state & STATE_INSERT) ) 		return 0;	for ( i = 0 ; i < dev->num_slots ; i++ ) {		struct mmc_slot *slot = dev->slot + i;		if ( slot->flags & MMC_SLOT_FLAG_INSERT ) {			if  (!dev->sdrive->is_empty(i)) {				slot->dev = dev;				slot->state = CARD_STATE_IDLE;				card_count++;			}			slot->flags &= ~MMC_SLOT_FLAG_INSERT;		}	}	return card_count;}/****************************************************************** * * Hotplug callback card insertion/removal * ******************************************************************/ #if !defined(CONFIG_OMAP_INNOVATOR) && !defined(CONFIG_MACH_OMAP_PERSEUS2)#ifdef CONFIG_HOTPLUGextern char hotplug_path[];extern int call_usermodehelper(char *path, char **argv, char **envp);static void run_sbin_hotplug(struct mmc_dev *dev, int id, int insert){	int i;	char *argv[3], *envp[8];	char media[64], slotnum[16];	if (!hotplug_path[0])		return;	DEBUG(0,": hotplug_path=%s id=%d insert=%d\n", hotplug_path, id, insert);	i = 0;	argv[i++] = hotplug_path;	argv[i++] = "mmc";	argv[i] = 0;	/* minimal command environment */	i = 0;	envp[i++] = "HOME=/";	envp[i++] = "PATH=/sbin:/bin:/usr/sbin:/usr/bin";		/* other stuff we want to pass to /sbin/hotplug */	sprintf(slotnum, "SLOT=%d", id );	if ( dev->slot[id].media_driver && dev->slot[id].media_driver->name )		sprintf(media, "MEDIA=%s", dev->slot[id].media_driver->name );	else		sprintf(media, "MEDIA=unknown");	envp[i++] = slotnum;	envp[i++] = media;	if (insert)		envp[i++] = "ACTION=add";	else		envp[i++] = "ACTION=remove";	envp[i] = 0;	call_usermodehelper (argv [0], argv, envp);}static void mmc_hotplug_task_handler( void *nr ){	int insert = ((int) nr) & 0x01;	int id     = ((int) nr) >> 1;	DEBUG(2," id=%d insert=%d\n", id, insert );	run_sbin_hotplug(&g_mmc_dev, id, insert );}static struct tq_struct mmc_hotplug_task = {	routine:  mmc_hotplug_task_handler};void run_sbin_mmc_hotplug(struct mmc_dev *dev, int id, int insert ){//#ifdef CONFIG_ARCH_EZX_E680	if (first_have_card)	{	    first_have_card = 0;	    return;	}//#endif	mmc_hotplug_task.data = (void *) ((id << 1) | insert);	schedule_task( &mmc_hotplug_task );}#elsevoid run_sbin_mmc_hotplug(struct mmc_dev *sdev, int id, int insert) { }#endif /* CONFIG_HOTPLUG */#elsevoid run_sbin_mmc_hotplug(struct mmc_dev *sdev,  int id, int insert) { }#endif/****************************************************************** * Common processing tasklet * Everything gets serialized through this ******************************************************************/static void mmc_tasklet_action(unsigned long data){	struct mmc_dev *dev = (struct mmc_dev *)data;	unsigned long   flags;	int             state;	DEBUG(2,": dev=%p flags=%02x\n", dev, dev->state);	/* Grab the current working state */	local_irq_save(flags);	state = dev->state;	if ( state & STATE_CMD_DONE )		dev->state = state & ~(STATE_CMD_DONE | STATE_CMD_ACTIVE);	local_irq_restore(flags);	/* If there is an active command, don't do anything */	if ( (state & STATE_CMD_ACTIVE) && !(state & STATE_CMD_DONE) )		return;	if ( dev->protocol )		dev->protocol(dev,state);}/****************************************************************** * Callbacks from low-level driver * These run at interrupt time ******************************************************************/void mmc_cmd_complete(struct mmc_request *request){	DEBUG(2,": request=%p retval=%d\n", request, request->result);	g_mmc_dev.state |= STATE_CMD_DONE;	if ( !g_mmc_dev.suspended )		tasklet_schedule(&g_mmc_dev.task);}void mmc_insert(int slot){	DEBUG(2,": %d\n", slot);	g_mmc_dev.state |= STATE_INSERT;	g_mmc_dev.slot[slot].flags |= MMC_SLOT_FLAG_INSERT;	if ( !g_mmc_dev.suspended )		tasklet_schedule(&g_mmc_dev.task);	mmc_slot_enable = 1;}void mmc_eject(int slot){	DEBUG(2,": %d\n", slot);	g_mmc_dev.state |= STATE_EJECT;	g_mmc_dev.slot[slot].flags |= MMC_SLOT_FLAG_EJECT;	if ( !g_mmc_dev.suspended )		tasklet_schedule(&g_mmc_dev.task);	mmc_slot_enable = 0;}EXPORT_SYMBOL(mmc_cmd_complete);EXPORT_SYMBOL(mmc_insert);EXPORT_SYMBOL(mmc_eject);/****************************************************************** * Called from the media handler ******************************************************************/int mmc_handle_io_request( struct mmc_io_request *t ){	DEBUG(2," id=%d cmd=%d sector=%ld nr_sectors=%ld block_len=%ld buf=%p\n",	      t->id, t->cmd, t->sector, t->nr_sectors, t->block_len, t->buffer);		if ( g_mmc_dev.io_request ) {		/* FIXME : Urgly solution here */		if (g_mmc_dev.next_io_request || (g_mmc_dev.io_request->cmd == t->cmd)) {			DEBUG(0,": error! io_request in progress\n");			return 0;		} 		else {			g_mmc_dev.next_io_request = t;			return 1;		}	}		g_mmc_dev.io_request = t;	tasklet_schedule(&g_mmc_dev.task);	return 1;}EXPORT_SYMBOL(mmc_handle_io_request);/****************************************************************** *  Media handlers *  Allow different drivers to register a media handler ******************************************************************/static LIST_HEAD(mmc_media_drivers);int mmc_match_media_driver( struct mmc_slot *slot ){	struct list_head *item;	DEBUG(2,": slot=%p\n", slot);	for ( item = mmc_media_drivers.next ; item != &mmc_media_drivers ; item = item->next ) {		struct mmc_media_driver *drv = list_entry(item, struct mmc_media_driver, node );		if ( drv->probe(slot) ) {			slot->media_driver = drv;			drv->load(slot);			return 1;		}	}	return 0;}int mmc_register_media_driver( struct mmc_media_driver *drv ){	list_add_tail( &drv->node, &mmc_media_drivers );	return 0;}void mmc_unregister_media_driver( struct mmc_media_driver *drv ){	list_del(&drv->node);}EXPORT_SYMBOL(mmc_register_media_driver);EXPORT_SYMBOL(mmc_unregister_media_driver);/******************************************************************/int mmc_register_slot_driver( struct mmc_slot_driver *sdrive, int num_slots ){	int i;	int retval;	DEBUG(2," max=%d ocr=0x%08x\n", num_slots, sdrive->ocr);	if ( num_slots > MMC_MAX_SLOTS ) {		printk(KERN_CRIT "%s: illegal num of slots %d\n", __FUNCTION__, num_slots);		return -ENOMEM;	}	if ( g_mmc_dev.sdrive ) {		printk(KERN_ALERT "%s:: slot in use\n", __FUNCTION__);		return -EBUSY;	}	g_mmc_dev.sdrive    = sdrive;	g_mmc_dev.num_slots = num_slots;	for ( i = 0 ; i < num_slots ; i++ ) {		struct mmc_slot *slot = &g_mmc_dev.slot[i];		memset(slot,0,sizeof(struct mmc_slot));		slot->id = i;		slot->state = CARD_STATE_EMPTY;	}	retval = sdrive->init();	if ( retval )		return retval;#ifndef CONFIG_ARCH_EZX_HAINAN	/* Generate insert events for cards */	for ( i = 0 ; i < num_slots ; i++ )		if ( !sdrive->is_empty(i) )			mmc_insert(i);#endif	return 0;}void mmc_unregister_slot_driver( struct mmc_slot_driver *sdrive ){	int i;	DEBUG(2,"\n");	for ( i = 0 ; i < g_mmc_dev.num_slots ; i++ )		mmc_eject(i);	if ( sdrive == g_mmc_dev.sdrive ) {		g_mmc_dev.sdrive->cleanup();		g_mmc_dev.sdrive = NULL;	}}EXPORT_SYMBOL(mmc_register_slot_driver);EXPORT_SYMBOL(mmc_unregister_slot_driver);/******************************************************************/static struct pm_dev *mmc_pm_dev;static int mmc_pm_callback(struct pm_dev *pm_dev, pm_request_t req, void *data){#ifndef CONFIG_ARCH_EZX	int i;	DEBUG(0,": pm callback %d\n", req );	switch (req) {	case PM_SUSPEND: /* Enter D1-D3 */		g_mmc_dev.suspended = 1;                break;	case PM_RESUME:  /* Enter D0 */		if ( g_mmc_dev.suspended ) {			g_mmc_dev.suspended = 0;			g_mmc_dev.state = 0;     // Clear the old state			for ( i = 0 ; i < g_mmc_dev.num_slots ; i++ ) {				mmc_eject(i);				if ( !g_mmc_dev.sdrive->is_empty(i) )					mmc_insert(i);			}		}		break;        }#endif        return 0;}#ifdef CONFIG_CEE#include <linux/device.h>static int mmc_suspend(struct device *dev, u32 state, u32 level);static int mmc_resume(struct device *dev, u32 level);static struct device_driver mmc_driver_ldm = {	name:          "mmc",	devclass:      NULL,	probe:         NULL,	suspend:       mmc_suspend,	resume:        mmc_resume,	scale:         NULL,	remove:        NULL,};static struct device mmc_device_ldm = {	name:         "MMC",	bus_id:       "mmc",	driver:       NULL,	power_state:  DPM_POWER_ON,};static voidmmc_ldm_register(void){#ifdef CONFIG_ARCH_MAINSTONE	extern void pxaopb_driver_register(struct device_driver *driver);	extern void pxaopb_device_register(struct device *device);		pxaopb_driver_register(&mmc_driver_ldm);	pxaopb_device_register(&mmc_device_ldm);#endif#ifdef CONFIG_ARCH_OMAP   extern void mpu_public_driver_register(struct device_driver *driver);   extern void mpu_public_device_register(struct device *device);   mpu_public_driver_register(&mmc_driver_ldm);   mpu_public_device_register(&mmc_device_ldm);#endif#ifdef CONFIG_ARCH_MX2ADS	extern void mx21_ldm_device_register(struct device *device);	extern void mx21_ldm_driver_register(struct device_driver *driver);	mx21_ldm_driver_register(&mmc_driver_ldm);	mx21_ldm_device_register(&mmc_device_ldm);#endif}static voidmmc_ldm_unregister(void){#ifdef CONFIG_ARCH_MAINSTONE	extern void pxaopb_driver_unregister(struct device_driver *driver);	extern void pxaopb_device_unregister(struct device *device);		pxaopb_device_unregister(&mmc_device_ldm);	pxaopb_driver_unregister(&mmc_driver_ldm);#endif#ifdef CONFIG_ARCH_OMAP   extern void mpu_public_driver_unregister(struct device_driver *driver);   extern void mpu_public_device_unregister(struct device *device);   mpu_public_driver_unregister(&mmc_driver_ldm);   mpu_public_device_unregister(&mmc_device_ldm);#endif#ifdef CONFIG_ARCH_MX2ADS	extern void mx21_ldm_device_unregister(struct device *device);	extern void mx21_ldm_driver_unregister(struct device_driver *driver);	mx21_ldm_device_unregister(&mmc_device_ldm);	mx21_ldm_driver_unregister(&mmc_driver_ldm);#endif}static intmmc_resume(struct device *dev, u32 level){	int i;	switch (level) {	case RESUME_RESTORE_STATE:	case RESUME_ENABLE:	case RESUME_POWER_ON:		/* Enter D0 */		if ( g_mmc_dev.suspended ) {			g_mmc_dev.suspended = 0;			g_mmc_dev.state = 0;     // Clear the old state			for ( i = 0 ; i < g_mmc_dev.num_slots ; i++ ) {				mmc_eject(i);				if ( !g_mmc_dev.sdrive->is_empty(i) )					mmc_insert(i);			}		}		break;	}	return 0;}static intmmc_suspend(struct device *dev, u32 state, u32 level){	switch (level) {	case SUSPEND_NOTIFY:	case SUSPEND_SAVE_STATE:	case SUSPEND_DISABLE:	case SUSPEND_POWER_DOWN:		/* Enter D1-D3 */		g_mmc_dev.suspended = 1;		break;	}	return 0;}#endif /* CONFIG_CEE *//****************************************************************** * TODO: These would be better handled by driverfs * For the moment, we'll just eject and insert everything ******************************************************************/int mmc_do_eject(ctl_table *ctl, int write, struct file * filp, void *buffer, size_t *lenp){	mmc_eject(0);	return 0;}int mmc_do_insert(ctl_table *ctl, int write, struct file * filp, void *buffer, size_t *lenp){	mmc_insert(0);	return 0;}static struct ctl_table mmc_sysctl_table[] ={	{ 1, "debug", &g_mmc_debug, sizeof(int), 0666, NULL, &proc_dointvec },	{ 2, "eject", NULL, 0, 0600, NULL, &mmc_do_eject },	{ 3, "insert", NULL, 0, 0600, NULL, &mmc_do_insert },	{0}};static struct ctl_table mmc_dir_table[] ={	{BUS_MMC, "mmc", NULL, 0, 0555, mmc_sysctl_table},	{0}};static struct ctl_table bus_dir_table[] = {	{CTL_BUS, "bus", NULL, 0, 0555, mmc_dir_table},        {0}};static struct ctl_table_header *mmc_sysctl_header;#ifdef CONFIG_USBD_ISP_BUSstatic unsigned int read_request_head = 0;static unsigned int read_request_tail = 0;static struct read_request_pool_s read_request_pool[MAX_READ_AHEAD_REQUEST];static struct dma_buf_pool_s *write_request_pool[MAX_WRITE_PENDING_REQUEST];static struct mmc_io_request gg_io_read_request, gg_io_write_request[MAX_WRITE_PENDING_REQUEST];static unsigned int write_request_head = 0;static unsigned int write_request_tail = 0;void (*old_io_request_done)(struct mmc_io_request * req, int result);LIST_HEAD(dma_write_buf_pool_head);LIST_HEAD(dma_read_buf_pool_head);struct dma_buf_pool_s dma_write_buf_pool[MAX_BUF_POOL_SIZE];

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩中文字幕亚洲一区二区va在线| 午夜精品久久久久久久久| 亚洲美女屁股眼交3| 麻豆精品在线观看| 99综合影院在线| 精品乱人伦一区二区三区| 亚洲视频1区2区| 国产福利一区二区三区视频在线 | 亚洲一级二级三级| 国产激情精品久久久第一区二区| 欧美午夜精品理论片a级按摩| 欧美成人乱码一区二区三区| 亚洲成av人片| 波多野结衣视频一区| 欧美精品一区二区三区高清aⅴ | 久久综合久色欧美综合狠狠| 午夜私人影院久久久久| 91久久香蕉国产日韩欧美9色| 国产视频一区二区在线| 精品一区二区三区免费| 日韩一级片网站| 日本vs亚洲vs韩国一区三区二区| 在线观看网站黄不卡| 亚洲精品久久嫩草网站秘色| 91网址在线看| 亚洲同性gay激情无套| 成人精品亚洲人成在线| 中文字幕欧美日韩一区| 不卡一区在线观看| 中文字幕精品一区| 成人av片在线观看| 国产精品美女久久久久久久网站| 国产一区二区不卡| 国产日韩欧美麻豆| 国产91精品精华液一区二区三区| 中文字幕精品在线不卡| www.色综合.com| 伊人开心综合网| 欧美日韩色一区| 日韩国产欧美在线视频| 欧美一级高清片| 国产乱人伦精品一区二区在线观看| 精品成人佐山爱一区二区| 国产老肥熟一区二区三区| 国产婷婷色一区二区三区四区| 国产高清精品网站| 中文字幕一区二区三区精华液| 91小视频在线免费看| 亚洲大型综合色站| 欧美xingq一区二区| 成人一区二区在线观看| 亚洲婷婷综合色高清在线| 欧美色图片你懂的| 久久精品久久99精品久久| 国产免费成人在线视频| 在线免费精品视频| 麻豆精品视频在线观看视频| 国产午夜精品久久久久久免费视 | 亚洲精品第一国产综合野| 欧美男生操女生| 国产在线看一区| 亚洲免费伊人电影| 欧美一区二区精美| 成人18精品视频| 日韩在线一二三区| 国产精品网站一区| 欧美日韩国产系列| 春色校园综合激情亚洲| 亚洲成av人片在线观看| 国产亚洲一本大道中文在线| 色综合久久久久网| 精品一区二区三区久久| 亚洲免费观看高清在线观看| 精品国产乱码久久久久久图片 | 在线视频国产一区| 紧缚捆绑精品一区二区| 亚洲尤物在线视频观看| 久久精品夜色噜噜亚洲a∨| 欧美探花视频资源| 国产a区久久久| 麻豆精品在线看| 亚洲第一福利视频在线| 国产精品麻豆欧美日韩ww| 日韩精品中文字幕一区二区三区 | 欧美撒尿777hd撒尿| 大美女一区二区三区| 日韩av一区二区在线影视| 亚洲少妇30p| 国产女同性恋一区二区| 日韩美女一区二区三区四区| 欧美日韩一区二区电影| 91女神在线视频| 国产精品99久久久久久宅男| 蜜桃av一区二区三区电影| 亚洲高清一区二区三区| 亚洲视频你懂的| 自拍偷拍国产亚洲| 国产精品水嫩水嫩| 久久久久久99精品| 久久综合九色综合97婷婷女人 | 欧美日韩免费一区二区三区视频| 播五月开心婷婷综合| 国精产品一区一区三区mba视频| 日韩国产精品91| 首页综合国产亚洲丝袜| 亚洲午夜久久久久中文字幕久| 成人免费一区二区三区视频 | 国产精品卡一卡二| 久久久久久久久免费| 精品免费视频一区二区| 日韩欧美电影在线| 日韩精品一区二| 欧美xxxxx牲另类人与| 久久午夜色播影院免费高清| 欧美r级在线观看| 久久久久99精品国产片| 久久久久久亚洲综合| 国产日韩欧美精品一区| 中文字幕 久热精品 视频在线| 久久久久久久久免费| 国产精品三级视频| 亚洲欧洲另类国产综合| 亚洲精品国产一区二区精华液| 亚洲图片另类小说| 香蕉av福利精品导航| 日韩av在线播放中文字幕| 国产中文一区二区三区| 国产成人免费在线观看不卡| 99国产精品久久久久| 欧美在线视频全部完| 欧美一级日韩免费不卡| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | 欧美日韩精品电影| 欧美一级高清大全免费观看| 国产婷婷色一区二区三区四区| 国产精品成人免费| 午夜私人影院久久久久| 国产美女精品人人做人人爽| 丰满亚洲少妇av| 欧美日韩在线亚洲一区蜜芽| 久久只精品国产| 亚洲精品久久久蜜桃| 久久99精品久久久久久| 成人av在线影院| 91.麻豆视频| 日本一二三不卡| 天天操天天干天天综合网| 国产精品一区二区无线| 欧美在线观看视频一区二区| 日韩欧美一区二区视频| 亚洲欧美一区二区三区孕妇| 日韩国产在线观看一区| aaa国产一区| 日韩视频一区在线观看| 亚洲三级久久久| 黄页网站大全一区二区| 色一情一乱一乱一91av| 精品成a人在线观看| 亚洲日本va在线观看| 久久99国内精品| 欧美综合视频在线观看| 国产日韩欧美不卡在线| 日本少妇一区二区| 99精品视频一区| 精品久久99ma| 亚洲成人午夜电影| heyzo一本久久综合| 欧美精品一区二区在线播放| 亚洲综合清纯丝袜自拍| 成人免费视频视频| 日韩你懂的电影在线观看| 亚洲综合无码一区二区| caoporm超碰国产精品| 精品盗摄一区二区三区| 秋霞电影一区二区| 在线观看国产91| 亚洲欧美激情一区二区| 成人中文字幕在线| 精品粉嫩aⅴ一区二区三区四区| 亚洲成av人片在线| 色婷婷av一区二区三区大白胸| 亚洲国产高清在线观看视频| 精品一区二区在线播放| 日韩欧美国产综合| 亚洲成a天堂v人片| 欧美在线一二三| 亚洲欧美激情在线| 一本大道久久a久久精二百| 国产精品毛片无遮挡高清| 国产精品一二三四五| 久久综合久久鬼色中文字| 久久精品国产色蜜蜜麻豆| 欧美精选一区二区| 亚洲第一搞黄网站| 欧美老肥妇做.爰bbww| 亚洲成人资源在线| 欧美精品乱码久久久久久按摩| 亚洲成人综合网站| 91麻豆精品国产91久久久久久久久| 亚洲高清免费视频|