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

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

?? mmc.c

?? mmc 記憶棒驅動 for linux ,可以看一看
?? C
?? 第 1 頁 / 共 2 頁
字號:
	mmc_init_card(card, host);	memcpy(card->raw_cid, raw_cid, sizeof(card->raw_cid)); again:	list_for_each_entry(c, &host->cards, node)		if (c->rca == rca) {			rca++;			goto again;		}	card->rca = rca;	*frca = rca;	return card;}/* * Tell attached cards to go to IDLE state */static void mmc_idle_cards(struct mmc_host *host){	struct mmc_command cmd;	host->ios.chip_select = MMC_CS_HIGH;	host->ops->set_ios(host, &host->ios);	mmc_delay(1);	cmd.opcode = MMC_GO_IDLE_STATE;	cmd.arg = 0;	cmd.flags = MMC_RSP_NONE | MMC_CMD_BC;	mmc_wait_for_cmd(host, &cmd, 0);	mmc_delay(1);	host->ios.chip_select = MMC_CS_DONTCARE;	host->ops->set_ios(host, &host->ios);	mmc_delay(1);}/* * Apply power to the MMC stack.  This is a two-stage process. * First, we enable power to the card without the clock running. * We then wait a bit for the power to stabilise.  Finally, * enable the bus drivers and clock to the card. * * We must _NOT_ enable the clock prior to power stablising. * * If a host does all the power sequencing itself, ignore the * initial MMC_POWER_UP stage. */static void mmc_power_up(struct mmc_host *host){	int bit = fls(host->ocr_avail) - 1;	host->ios.vdd = bit;	host->ios.bus_mode = MMC_BUSMODE_OPENDRAIN;	host->ios.chip_select = MMC_CS_DONTCARE;	host->ios.power_mode = MMC_POWER_UP;	host->ios.bus_width = MMC_BUS_WIDTH_1;	host->ops->set_ios(host, &host->ios);	mmc_delay(1);	host->ios.clock = host->f_min;	host->ios.power_mode = MMC_POWER_ON;	host->ops->set_ios(host, &host->ios);	mmc_delay(2);}static void mmc_power_off(struct mmc_host *host){	host->ios.clock = 0;	host->ios.vdd = 0;	host->ios.bus_mode = MMC_BUSMODE_OPENDRAIN;	host->ios.chip_select = MMC_CS_DONTCARE;	host->ios.power_mode = MMC_POWER_OFF;	host->ios.bus_width = MMC_BUS_WIDTH_1;	host->ops->set_ios(host, &host->ios);}static int mmc_send_op_cond(struct mmc_host *host, u32 ocr, u32 *rocr){	struct mmc_command cmd;	int i, err = 0;	cmd.opcode = MMC_SEND_OP_COND;	cmd.arg = ocr;	cmd.flags = MMC_RSP_R3 | MMC_CMD_BCR;	for (i = 100; i; i--) {		err = mmc_wait_for_cmd(host, &cmd, 0);		if (err != MMC_ERR_NONE)			break;		if (cmd.resp[0] & MMC_CARD_BUSY || ocr == 0)			break;		err = MMC_ERR_TIMEOUT;		mmc_delay(10);	}	if (rocr)		*rocr = cmd.resp[0];	return err;}static int mmc_send_app_op_cond(struct mmc_host *host, u32 ocr, u32 *rocr){	struct mmc_command cmd;	int i, err = 0;	cmd.opcode = SD_APP_OP_COND;	cmd.arg = ocr;	cmd.flags = MMC_RSP_R3 | MMC_CMD_BCR;	for (i = 100; i; i--) {		err = mmc_wait_for_app_cmd(host, 0, &cmd, CMD_RETRIES);		if (err != MMC_ERR_NONE)			break;		if (cmd.resp[0] & MMC_CARD_BUSY || ocr == 0)			break;		err = MMC_ERR_TIMEOUT;		mmc_delay(10);	}	if (rocr)		*rocr = cmd.resp[0];	return err;}/* * Discover cards by requesting their CID.  If this command * times out, it is not an error; there are no further cards * to be discovered.  Add new cards to the list. * * Create a mmc_card entry for each discovered card, assigning * it an RCA, and save the raw CID for decoding later. */static void mmc_discover_cards(struct mmc_host *host){	struct mmc_card *card;	unsigned int first_rca = 1, err;	while (1) {		struct mmc_command cmd;		cmd.opcode = MMC_ALL_SEND_CID;		cmd.arg = 0;		cmd.flags = MMC_RSP_R2 | MMC_CMD_BCR;		err = mmc_wait_for_cmd(host, &cmd, CMD_RETRIES);		if (err == MMC_ERR_TIMEOUT) {			err = MMC_ERR_NONE;			break;		}		if (err != MMC_ERR_NONE) {			printk(KERN_ERR "%s: error requesting CID: %d\n",				mmc_hostname(host), err);			break;		}		card = mmc_find_card(host, cmd.resp);		if (!card) {			card = mmc_alloc_card(host, cmd.resp, &first_rca);			if (IS_ERR(card)) {				err = PTR_ERR(card);				break;			}			list_add(&card->node, &host->cards);		}		card->state &= ~MMC_STATE_DEAD;		if (host->mode == MMC_MODE_SD) {			mmc_card_set_sd(card);			cmd.opcode = SD_SEND_RELATIVE_ADDR;			cmd.arg = 0;			cmd.flags = MMC_RSP_R6 | MMC_CMD_BCR;			err = mmc_wait_for_cmd(host, &cmd, CMD_RETRIES);			if (err != MMC_ERR_NONE)				mmc_card_set_dead(card);			else {				card->rca = cmd.resp[0] >> 16;				if (!host->ops->get_ro) {					printk(KERN_WARNING "%s: host does not "						"support reading read-only "						"switch. assuming write-enable.\n",						mmc_hostname(host));				} else {					if (host->ops->get_ro(host))						mmc_card_set_readonly(card);				}			}		} else {			cmd.opcode = MMC_SET_RELATIVE_ADDR;			cmd.arg = card->rca << 16;			cmd.flags = MMC_RSP_R1 | MMC_CMD_AC;			err = mmc_wait_for_cmd(host, &cmd, CMD_RETRIES);			if (err != MMC_ERR_NONE)				mmc_card_set_dead(card);		}	}}static void mmc_read_csds(struct mmc_host *host){	struct mmc_card *card;	list_for_each_entry(card, &host->cards, node) {		struct mmc_command cmd;		int err;		if (card->state & (MMC_STATE_DEAD|MMC_STATE_PRESENT))			continue;		cmd.opcode = MMC_SEND_CSD;		cmd.arg = card->rca << 16;		cmd.flags = MMC_RSP_R2 | MMC_CMD_AC;		err = mmc_wait_for_cmd(host, &cmd, CMD_RETRIES);		if (err != MMC_ERR_NONE) {			mmc_card_set_dead(card);			continue;		}		memcpy(card->raw_csd, cmd.resp, sizeof(card->raw_csd));		mmc_decode_csd(card);		mmc_decode_cid(card);	}}static void mmc_read_scrs(struct mmc_host *host){	int err;	struct mmc_card *card;	struct mmc_request mrq;	struct mmc_command cmd;	struct mmc_data data;	struct scatterlist sg;	list_for_each_entry(card, &host->cards, node) {		if (card->state & (MMC_STATE_DEAD|MMC_STATE_PRESENT))			continue;		if (!mmc_card_sd(card))			continue;		err = mmc_select_card(host, card);		if (err != MMC_ERR_NONE) {			mmc_card_set_dead(card);			continue;		}		memset(&cmd, 0, sizeof(struct mmc_command));		cmd.opcode = MMC_APP_CMD;		cmd.arg = card->rca << 16;		cmd.flags = MMC_RSP_R1 | MMC_CMD_AC;		err = mmc_wait_for_cmd(host, &cmd, 0);		if ((err != MMC_ERR_NONE) || !(cmd.resp[0] & R1_APP_CMD)) {			mmc_card_set_dead(card);			continue;		}		memset(&cmd, 0, sizeof(struct mmc_command));		cmd.opcode = SD_APP_SEND_SCR;		cmd.arg = 0;		cmd.flags = MMC_RSP_R1 | MMC_CMD_ADTC;		memset(&data, 0, sizeof(struct mmc_data));		data.timeout_ns = card->csd.tacc_ns * 10;		data.timeout_clks = card->csd.tacc_clks * 10;		data.blksz_bits = 3;		data.blocks = 1;		data.flags = MMC_DATA_READ;		data.sg = &sg;		data.sg_len = 1;		memset(&mrq, 0, sizeof(struct mmc_request));		mrq.cmd = &cmd;		mrq.data = &data;		sg_init_one(&sg, (u8*)card->raw_scr, 8);		mmc_wait_for_req(host, &mrq);		if (cmd.error != MMC_ERR_NONE || data.error != MMC_ERR_NONE) {			mmc_card_set_dead(card);			continue;		}		card->raw_scr[0] = ntohl(card->raw_scr[0]);		card->raw_scr[1] = ntohl(card->raw_scr[1]);		mmc_decode_scr(card);	}	mmc_deselect_cards(host);}static unsigned int mmc_calculate_clock(struct mmc_host *host){	struct mmc_card *card;	unsigned int max_dtr = host->f_max;	list_for_each_entry(card, &host->cards, node)		if (!mmc_card_dead(card) && max_dtr > card->csd.max_dtr)			max_dtr = card->csd.max_dtr;	DBG("MMC: selected %d.%03dMHz transfer rate\n",	    max_dtr / 1000000, (max_dtr / 1000) % 1000);	return max_dtr;}/* * Check whether cards we already know about are still present. * We do this by requesting status, and checking whether a card * responds. * * A request for status does not cause a state change in data * transfer mode. */static void mmc_check_cards(struct mmc_host *host){	struct list_head *l, *n;	mmc_deselect_cards(host);	list_for_each_safe(l, n, &host->cards) {		struct mmc_card *card = mmc_list_to_card(l);		struct mmc_command cmd;		int err;		cmd.opcode = MMC_SEND_STATUS;		cmd.arg = card->rca << 16;		cmd.flags = MMC_RSP_R1 | MMC_CMD_AC;		err = mmc_wait_for_cmd(host, &cmd, CMD_RETRIES);		if (err == MMC_ERR_NONE)			continue;		mmc_card_set_dead(card);	}}static void mmc_setup(struct mmc_host *host){	if (host->ios.power_mode != MMC_POWER_ON) {		int err;		u32 ocr;		host->mode = MMC_MODE_SD;		mmc_power_up(host);		mmc_idle_cards(host);		err = mmc_send_app_op_cond(host, 0, &ocr);		/*		 * If we fail to detect any SD cards then try		 * searching for MMC cards.		 */		if (err != MMC_ERR_NONE) {			host->mode = MMC_MODE_MMC;			err = mmc_send_op_cond(host, 0, &ocr);			if (err != MMC_ERR_NONE)				return;		}		host->ocr = mmc_select_voltage(host, ocr);		/*		 * Since we're changing the OCR value, we seem to		 * need to tell some cards to go back to the idle		 * state.  We wait 1ms to give cards time to		 * respond.		 */		if (host->ocr)			mmc_idle_cards(host);	} else {		host->ios.bus_mode = MMC_BUSMODE_OPENDRAIN;		host->ios.clock = host->f_min;		host->ops->set_ios(host, &host->ios);		/*		 * We should remember the OCR mask from the existing		 * cards, and detect the new cards OCR mask, combine		 * the two and re-select the VDD.  However, if we do		 * change VDD, we should do an idle, and then do a		 * full re-initialisation.  We would need to notify		 * drivers so that they can re-setup the cards as		 * well, while keeping their queues at bay.		 *		 * For the moment, we take the easy way out - if the		 * new cards don't like our currently selected VDD,		 * they drop off the bus.		 */	}	if (host->ocr == 0)		return;	/*	 * Send the selected OCR multiple times... until the cards	 * all get the idea that they should be ready for CMD2.	 * (My SanDisk card seems to need this.)	 */	if (host->mode == MMC_MODE_SD)		mmc_send_app_op_cond(host, host->ocr, NULL);	else		mmc_send_op_cond(host, host->ocr, NULL);	mmc_discover_cards(host);	/*	 * Ok, now switch to push-pull mode.	 */	host->ios.bus_mode = MMC_BUSMODE_PUSHPULL;	host->ops->set_ios(host, &host->ios);	mmc_read_csds(host);	if (host->mode == MMC_MODE_SD)		mmc_read_scrs(host);}/** *	mmc_detect_change - process change of state on a MMC socket *	@host: host which changed state. *	@delay: optional delay to wait before detection (jiffies) * *	All we know is that card(s) have been inserted or removed *	from the socket(s).  We don't know which socket or cards. */void mmc_detect_change(struct mmc_host *host, unsigned long delay){	if (delay)		schedule_delayed_work(&host->detect, delay);	else		schedule_work(&host->detect);}EXPORT_SYMBOL(mmc_detect_change);static void mmc_rescan(void *data){	struct mmc_host *host = data;	struct list_head *l, *n;	mmc_claim_host(host);	if (host->ios.power_mode == MMC_POWER_ON)		mmc_check_cards(host);	mmc_setup(host);	if (!list_empty(&host->cards)) {		/*		 * (Re-)calculate the fastest clock rate which the		 * attached cards and the host support.		 */		host->ios.clock = mmc_calculate_clock(host);		host->ops->set_ios(host, &host->ios);	}	mmc_release_host(host);	list_for_each_safe(l, n, &host->cards) {		struct mmc_card *card = mmc_list_to_card(l);		/*		 * If this is a new and good card, register it.		 */		if (!mmc_card_present(card) && !mmc_card_dead(card)) {			if (mmc_register_card(card))				mmc_card_set_dead(card);			else				mmc_card_set_present(card);		}		/*		 * If this card is dead, destroy it.		 */		if (mmc_card_dead(card)) {			list_del(&card->node);			mmc_remove_card(card);		}	}	/*	 * If we discover that there are no cards on the	 * bus, turn off the clock and power down.	 */	if (list_empty(&host->cards))		mmc_power_off(host);}/** *	mmc_alloc_host - initialise the per-host structure. *	@extra: sizeof private data structure *	@dev: pointer to host device model structure * *	Initialise the per-host structure. */struct mmc_host *mmc_alloc_host(int extra, struct device *dev){	struct mmc_host *host;	host = mmc_alloc_host_sysfs(extra, dev);	if (host) {		spin_lock_init(&host->lock);		init_waitqueue_head(&host->wq);		INIT_LIST_HEAD(&host->cards);		INIT_WORK(&host->detect, mmc_rescan, host);		/*		 * By default, hosts do not support SGIO or large requests.		 * They have to set these according to their abilities.		 */		host->max_hw_segs = 1;		host->max_phys_segs = 1;		host->max_sectors = 1 << (PAGE_CACHE_SHIFT - 9);		host->max_seg_size = PAGE_CACHE_SIZE;	}	return host;}EXPORT_SYMBOL(mmc_alloc_host);/** *	mmc_add_host - initialise host hardware *	@host: mmc host */int mmc_add_host(struct mmc_host *host){	int ret;	ret = mmc_add_host_sysfs(host);	if (ret == 0) {		mmc_power_off(host);		mmc_detect_change(host, 0);	}	return ret;}EXPORT_SYMBOL(mmc_add_host);/** *	mmc_remove_host - remove host hardware *	@host: mmc host * *	Unregister and remove all cards associated with this host, *	and power down the MMC bus. */void mmc_remove_host(struct mmc_host *host){	struct list_head *l, *n;	list_for_each_safe(l, n, &host->cards) {		struct mmc_card *card = mmc_list_to_card(l);		mmc_remove_card(card);	}	mmc_power_off(host);	mmc_remove_host_sysfs(host);}EXPORT_SYMBOL(mmc_remove_host);/** *	mmc_free_host - free the host structure *	@host: mmc host * *	Free the host once all references to it have been dropped. */void mmc_free_host(struct mmc_host *host){	flush_scheduled_work();	mmc_free_host_sysfs(host);}EXPORT_SYMBOL(mmc_free_host);#ifdef CONFIG_PM/** *	mmc_suspend_host - suspend a host *	@host: mmc host *	@state: suspend mode (PM_SUSPEND_xxx) */int mmc_suspend_host(struct mmc_host *host, pm_message_t state){	mmc_claim_host(host);	mmc_deselect_cards(host);	mmc_power_off(host);	mmc_release_host(host);	return 0;}EXPORT_SYMBOL(mmc_suspend_host);/** *	mmc_resume_host - resume a previously suspended host *	@host: mmc host */int mmc_resume_host(struct mmc_host *host){	mmc_rescan(host);	return 0;}EXPORT_SYMBOL(mmc_resume_host);#endifMODULE_LICENSE("GPL");

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
青青青伊人色综合久久| 欧美一区中文字幕| 高清成人在线观看| 91久久人澡人人添人人爽欧美| 欧美日韩成人激情| 国产亚洲综合在线| 亚洲制服丝袜一区| 成人一区二区视频| 91.麻豆视频| 国产欧美一区二区在线| 欧美亚洲综合一区| 欧美日高清视频| 日韩中文欧美在线| 国产91露脸合集magnet| 一色屋精品亚洲香蕉网站| 午夜久久电影网| 91同城在线观看| 国产欧美一区二区三区在线老狼| 成人开心网精品视频| 亚洲成在人线在线播放| 一道本成人在线| 久久网站热最新地址| 午夜激情久久久| 久久精品日产第一区二区三区高清版 | 亚洲区小说区图片区qvod| 久久99精品国产.久久久久| 欧美亚洲综合另类| 激情综合色综合久久综合| 亚洲日本电影在线| 91丨九色丨黑人外教| 奇米精品一区二区三区在线观看 | 成人性色生活片| 亚洲综合激情网| 国产欧美日韩在线观看| 欧美日韩一区二区三区四区| 一区二区三区自拍| 91视频com| 国内精品久久久久影院薰衣草| 4438亚洲最大| 99久久免费视频.com| 国产精品第五页| 在线看一区二区| 亚洲成在人线在线播放| 中文字幕免费在线观看视频一区| 精品美女被调教视频大全网站| 亚洲色图制服诱惑| 欧美日韩一区二区在线观看| 国产99久久久国产精品潘金| 日本怡春院一区二区| 555www色欧美视频| 91免费观看视频在线| 国产馆精品极品| 国产精品系列在线| 91在线免费播放| 亚洲亚洲精品在线观看| 色视频成人在线观看免| 国产精品自在欧美一区| 亚洲色图20p| 久久久久国产精品人| 99久精品国产| 成人aa视频在线观看| 亚洲一区二区在线观看视频| 中文字幕人成不卡一区| 国产精品三级电影| 国产精品久久久久影院| 久久久精品黄色| 亚洲国产精品精华液ab| 久久香蕉国产线看观看99| 久久综合久久久久88| 精品国产乱码久久久久久1区2区| 成人免费毛片嘿嘿连载视频| 国产福利不卡视频| 国产乱人伦偷精品视频不卡 | 国产成人亚洲精品狼色在线| 久草在线在线精品观看| 美国毛片一区二区三区| 椎名由奈av一区二区三区| 国产精品电影一区二区三区| 国产精品久久久久一区二区三区 | 精品乱码亚洲一区二区不卡| 日韩欧美激情在线| 在线观看一区不卡| 欧美在线高清视频| 欧美日韩一级片网站| 88在线观看91蜜桃国自产| 在线播放日韩导航| 97久久超碰国产精品电影| 色一情一伦一子一伦一区| 欧美自拍丝袜亚洲| 欧美伦理电影网| 欧美精品一区视频| 国产精品久久久久婷婷| 亚洲老妇xxxxxx| 欧美国产欧美亚州国产日韩mv天天看完整| 国产欧美精品一区| 18成人在线观看| 亚洲国产一区二区三区| 免费高清视频精品| 国产福利一区在线观看| 色综合久久综合网97色综合| 欧美日韩电影在线播放| 精品国产乱码久久| 亚洲精品中文字幕乱码三区| 午夜电影网亚洲视频| 国产精品91一区二区| 欧美伊人久久大香线蕉综合69| 欧美一级生活片| 亚洲国产精品ⅴa在线观看| 亚洲精品高清视频在线观看| 蜜臀av一区二区三区| 成人高清av在线| 日韩一区二区在线看片| 欧美一区日韩一区| 国产区在线观看成人精品| 亚洲尤物视频在线| 国产成人自拍高清视频在线免费播放| 91在线观看高清| 日韩午夜av电影| 亚洲欧美区自拍先锋| 国精产品一区一区三区mba视频 | 成人丝袜18视频在线观看| 欧美自拍偷拍午夜视频| 国产免费观看久久| 日韩精品亚洲一区| 91麻豆自制传媒国产之光| 欧美成人福利视频| 一区二区三区在线视频观看| 国产在线视视频有精品| 欧美性猛片aaaaaaa做受| 国产三级精品三级在线专区| 香港成人在线视频| 91视频www| 国产精品欧美久久久久一区二区| 婷婷综合另类小说色区| 91美女蜜桃在线| 国产精品三级电影| 国产精品一区二区免费不卡 | 色欧美乱欧美15图片| 久久综合久久久久88| 婷婷中文字幕一区三区| 一本久久综合亚洲鲁鲁五月天| ...av二区三区久久精品| 亚洲在线视频网站| 国产精品正在播放| 精品播放一区二区| 亚洲视频资源在线| 韩国视频一区二区| 欧美一级在线视频| 午夜精品一区二区三区免费视频| 成人av在线一区二区三区| ww亚洲ww在线观看国产| 男女视频一区二区| 欧美一区二区三区婷婷月色 | 色狠狠av一区二区三区| 日本一区二区成人在线| 国产精品91xxx| 久久麻豆一区二区| 国产麻豆成人精品| 国产大陆亚洲精品国产| 欧美电影免费观看高清完整版在线| 亚洲成人av中文| 欧美日韩精品电影| 天堂影院一区二区| 91精选在线观看| 日韩av一区二区在线影视| 欧美年轻男男videosbes| 午夜视频久久久久久| 欧美三级韩国三级日本一级| 亚洲国产视频在线| 欧美精品成人一区二区三区四区| 午夜精品久久久久久久久久| 欧美欧美欧美欧美| 青青草91视频| 亚洲乱码国产乱码精品精的特点 | 欧美日韩视频在线观看一区二区三区| 欧美国产一区在线| 不卡高清视频专区| 国产精品国产馆在线真实露脸 | 国产亚洲美州欧州综合国| 国产99一区视频免费| 国产视频在线观看一区二区三区| 国产成人av影院| 综合电影一区二区三区| 日本电影欧美片| 午夜伊人狠狠久久| 精品国产乱码久久久久久久 | 欧美高清你懂得| 久久爱另类一区二区小说| 成人av片在线观看| 亚洲啪啪综合av一区二区三区| 国产午夜精品一区二区三区四区 | 久久国产精品一区二区| 国产精品污污网站在线观看| 94色蜜桃网一区二区三区| 亚洲一区二区三区美女| 日韩视频一区在线观看| 国产成人啪午夜精品网站男同| 1区2区3区精品视频| 日韩欧美一区中文| 成人精品视频.|