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

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

?? mmc_sysfs.c

?? The latest MontaVista Linux driver about SD/MMC code
?? C
字號:
/* *  linux/drivers/mmc/mmc_sysfs.c * *  Copyright (C) 2003 Russell King, All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * *  MMC sysfs/driver model support. */#include <linux/module.h>#include <linux/init.h>#include <linux/device.h>#include <linux/mmc/card.h>#include <linux/mmc/host.h>#include "mmc.h"#define dev_to_mmc_card(d)	container_of(d, struct mmc_card, dev)#define to_mmc_driver(d)	container_of(d, struct mmc_driver, drv)#define cls_dev_to_mmc_host(d)	container_of(d, struct mmc_host, class_dev)static void mmc_release_card(struct device *dev){	struct mmc_card *card = dev_to_mmc_card(dev);	kfree(card);}/* * This currently matches any MMC driver to any MMC card - drivers * themselves make the decision whether to drive this card in their * probe method.  However, we force "bad" cards to fail. */static int mmc_bus_match(struct device *dev, struct device_driver *drv){	struct mmc_card *card = dev_to_mmc_card(dev);	return !mmc_card_bad(card);}static intmmc_bus_hotplug(struct device *dev, char **envp, int num_envp, char *buf,		int buf_size){	struct mmc_card *card = dev_to_mmc_card(dev);	char ccc[13];	int i = 0;#define add_env(fmt,val)						\	({								\		int len, ret = -ENOMEM;					\		if (i < num_envp) {					\			envp[i++] = buf;				\			len = snprintf(buf, buf_size, fmt, val) + 1;	\			buf_size -= len;				\			buf += len;					\			if (buf_size >= 0)				\				ret = 0;				\		}							\		ret;							\	})	for (i = 0; i < 12; i++)		ccc[i] = card->csd.cmdclass & (1 << i) ? '1' : '0';	ccc[12] = '\0';	i = 0;	add_env("MMC_CCC=%s", ccc);	add_env("MMC_MANFID=%06x", card->cid.manfid);	add_env("MMC_NAME=%s", mmc_card_name(card));	add_env("MMC_OEMID=%04x", card->cid.oemid);	return 0;}static int mmc_bus_suspend(struct device *dev, u32 state){	struct mmc_driver *drv = to_mmc_driver(dev->driver);	struct mmc_card *card = dev_to_mmc_card(dev);	int ret = 0;	if (dev->driver && drv->suspend)		ret = drv->suspend(card, state);	return ret;}static int mmc_bus_resume(struct device *dev){	struct mmc_driver *drv = to_mmc_driver(dev->driver);	struct mmc_card *card = dev_to_mmc_card(dev);	int ret = 0;	if (dev->driver && drv->resume)		ret = drv->resume(card);	return ret;}static struct bus_type mmc_bus_type = {	.name		= "mmc",	.match		= mmc_bus_match,	.hotplug	= mmc_bus_hotplug,	.suspend	= mmc_bus_suspend,	.resume		= mmc_bus_resume,};static int mmc_drv_probe(struct device *dev){	struct mmc_driver *drv = to_mmc_driver(dev->driver);	struct mmc_card *card = dev_to_mmc_card(dev);	return drv->probe(card);}static int mmc_drv_remove(struct device *dev){	struct mmc_driver *drv = to_mmc_driver(dev->driver);	struct mmc_card *card = dev_to_mmc_card(dev);	drv->remove(card);	return 0;}/** *	mmc_register_driver - register a media driver *	@drv: MMC media driver */int mmc_register_driver(struct mmc_driver *drv){	drv->drv.bus = &mmc_bus_type;	drv->drv.probe = mmc_drv_probe;	drv->drv.remove = mmc_drv_remove;	return driver_register(&drv->drv);}EXPORT_SYMBOL(mmc_register_driver);/** *	mmc_unregister_driver - unregister a media driver *	@drv: MMC media driver */void mmc_unregister_driver(struct mmc_driver *drv){	drv->drv.bus = &mmc_bus_type;	driver_unregister(&drv->drv);}EXPORT_SYMBOL(mmc_unregister_driver);#define MMC_ATTR(name, fmt, args...)					\static ssize_t mmc_dev_show_##name (struct device *dev, char *buf)	\{									\	struct mmc_card *card = dev_to_mmc_card(dev);			\	return sprintf(buf, fmt, args);					\}									\static DEVICE_ATTR(name, S_IRUGO, mmc_dev_show_##name, NULL)MMC_ATTR(cid, "%08x%08x%08x%08x\n", card->raw_cid[0], card->raw_cid[1],	card->raw_cid[2], card->raw_cid[3]);MMC_ATTR(csd, "%08x%08x%08x%08x\n", card->raw_csd[0], card->raw_csd[1],	card->raw_csd[2], card->raw_csd[3]);MMC_ATTR(scr, "%08x%08x\n", card->raw_scr[0], card->raw_scr[1]);MMC_ATTR(date, "%02d/%04d\n", card->cid.month, card->cid.year);MMC_ATTR(fwrev, "0x%x\n", card->cid.fwrev);MMC_ATTR(hwrev, "0x%x\n", card->cid.hwrev);MMC_ATTR(manfid, "0x%06x\n", card->cid.manfid);MMC_ATTR(name, "%s\n", card->cid.prod_name);MMC_ATTR(oemid, "0x%04x\n", card->cid.oemid);MMC_ATTR(serial, "0x%08x\n", card->cid.serial);static struct device_attribute *mmc_dev_attributes[] = {	&dev_attr_cid,	&dev_attr_csd,	&dev_attr_scr,	&dev_attr_date,	&dev_attr_fwrev,	&dev_attr_hwrev,	&dev_attr_manfid,	&dev_attr_name,	&dev_attr_oemid,	&dev_attr_serial,};/* * Internal function.  Initialise a MMC card structure. */void mmc_init_card(struct mmc_card *card, struct mmc_host *host){	memset(card, 0, sizeof(struct mmc_card));	card->host = host;	device_initialize(&card->dev);	card->dev.parent = card->host->dev;	card->dev.bus = &mmc_bus_type;	card->dev.release = mmc_release_card;}/* * Internal function.  Register a new MMC card with the driver model. */int mmc_register_card(struct mmc_card *card){	int ret, i;	snprintf(card->dev.bus_id, sizeof(card->dev.bus_id),		 "%s:%04x", mmc_hostname(card->host), card->rca);	ret = device_add(&card->dev);	if (ret == 0)		for (i = 0; i < ARRAY_SIZE(mmc_dev_attributes); i++)			device_create_file(&card->dev, mmc_dev_attributes[i]);	return ret;}/* * Internal function.  Unregister a new MMC card with the * driver model, and (eventually) free it. */void mmc_remove_card(struct mmc_card *card){	if (mmc_card_present(card))		device_del(&card->dev);	put_device(&card->dev);}static void mmc_host_classdev_release(struct class_device *dev){	struct mmc_host *host = cls_dev_to_mmc_host(dev);	kfree(host);}static struct class mmc_host_class = {	.name		= "mmc_host",	.release	= mmc_host_classdev_release,};/* * Internal function. Allocate a new MMC host. */struct mmc_host *mmc_alloc_host_sysfs(int extra, struct device *dev){	struct mmc_host *host;	host = kmalloc(sizeof(struct mmc_host) + extra, GFP_KERNEL);	if (host) {		memset(host, 0, sizeof(struct mmc_host) + extra);		host->dev = dev;		host->class_dev.dev = host->dev;		host->class_dev.class = &mmc_host_class;		class_device_initialize(&host->class_dev);	}	return host;}/* * Internal function. Register a new MMC host with the MMC class. */int mmc_add_host_sysfs(struct mmc_host *host){	static unsigned int host_num;	snprintf(host->host_name, sizeof(host->host_name),		 "mmc%d", host_num++);	strlcpy(host->class_dev.class_id, host->host_name, BUS_ID_SIZE);	return class_device_add(&host->class_dev);}/* * Internal function. Unregister a MMC host with the MMC class. */void mmc_remove_host_sysfs(struct mmc_host *host){	class_device_del(&host->class_dev);}/* * Internal function. Free a MMC host. */void mmc_free_host_sysfs(struct mmc_host *host){	class_device_put(&host->class_dev);}static int __init mmc_init(void){	int ret = bus_register(&mmc_bus_type);	if (ret == 0) {		ret = class_register(&mmc_host_class);		if (ret)			bus_unregister(&mmc_bus_type);	}	return ret;}static void __exit mmc_exit(void){	class_unregister(&mmc_host_class);	bus_unregister(&mmc_bus_type);}module_init(mmc_init);module_exit(mmc_exit);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美视频一区二区三区| 精品日本一线二线三线不卡| 五月综合激情日本mⅴ| 久久精品一区二区三区不卡| 欧美午夜精品久久久久久孕妇| 国产又黄又大久久| 香蕉加勒比综合久久| 欧美激情在线看| 精品日韩av一区二区| 精品视频在线免费观看| 成人av在线看| 精品一区二区在线观看| 亚洲国产精品欧美一二99| 国产欧美日韩不卡| 日韩午夜中文字幕| 欧美剧在线免费观看网站| av在线综合网| 成人看片黄a免费看在线| 奇米777欧美一区二区| 亚洲最大成人综合| 亚洲色图制服丝袜| 国产精品水嫩水嫩| 久久综合久久综合九色| 在线成人免费视频| 欧美日本一道本| 欧美性猛交xxxx黑人交| 91一区在线观看| 97精品视频在线观看自产线路二| 高清不卡一区二区在线| 国产一区二区三区免费看| 青娱乐精品在线视频| 丝袜美腿高跟呻吟高潮一区| 一区二区三区欧美视频| 亚洲女人小视频在线观看| **性色生活片久久毛片| 国产精品每日更新在线播放网址 | 色婷婷综合五月| 91在线一区二区三区| 成人av网址在线| 成人免费不卡视频| 99久久国产综合色|国产精品| 成人av在线影院| 95精品视频在线| 日本高清成人免费播放| 欧美午夜影院一区| 3d动漫精品啪啪1区2区免费| 欧美年轻男男videosbes| 欧美美女视频在线观看| 亚洲最大成人网4388xx| 亚洲成人动漫在线免费观看| 亚洲成人精品影院| 欧美aⅴ一区二区三区视频| 麻豆视频一区二区| 国产精品影视在线观看| 成人深夜在线观看| 一本大道久久a久久综合| 欧美综合天天夜夜久久| 在线播放中文一区| 久久综合色鬼综合色| 国产精品视频看| 亚洲一区二区三区四区在线观看 | 国产成人av资源| 波多野结衣亚洲| 在线一区二区三区四区五区 | 欧美xxxx老人做受| 国产亚洲精品超碰| 亚洲三级在线免费| 三级成人在线视频| 国产盗摄视频一区二区三区| 91丨九色丨蝌蚪丨老版| 91麻豆精品国产无毒不卡在线观看 | 欧美一级片免费看| 久久精品人人做人人爽人人| 国产精品麻豆一区二区| 亚洲一区av在线| 国产乱码精品一区二区三区忘忧草| 成人午夜精品在线| 在线观看国产91| 精品国产一区二区三区不卡| 国产精品国模大尺度视频| 午夜欧美在线一二页| 国产自产视频一区二区三区| 99国产精品一区| 欧美videos中文字幕| 亚洲裸体xxx| 国产一区二区91| 欧美最新大片在线看| 国产视频一区不卡| 肉丝袜脚交视频一区二区| 成人自拍视频在线观看| 91麻豆精品国产91久久久久| 国产欧美一区二区精品性色超碰| 亚洲一区二区高清| 成人av电影免费观看| 日韩一区二区三区精品视频 | 一区二区三区精品在线观看| 麻豆freexxxx性91精品| 一本一道综合狠狠老| 久久久蜜臀国产一区二区| 午夜精品视频一区| 91日韩一区二区三区| 亚洲一区免费观看| 一个色在线综合| 欧美一区二区三区人| 亚洲欧洲av色图| 国产麻豆成人传媒免费观看| 欧美午夜一区二区| 亚洲视频在线观看三级| 韩国成人在线视频| 欧美美女网站色| 亚洲成人一区二区在线观看| av亚洲产国偷v产偷v自拍| 精品福利二区三区| 美女网站色91| 欧美一区二区二区| 亚洲成人动漫一区| 在线亚洲欧美专区二区| 中文字幕一区二区三区在线不卡| 国产精品系列在线播放| 精品欧美黑人一区二区三区| 视频一区欧美精品| 欧美美女视频在线观看| 亚洲成av人影院| 欧美性生活影院| 亚洲最新视频在线观看| 在线观看av一区二区| 亚洲欧美色图小说| 色婷婷激情综合| 亚洲精品中文在线影院| 99免费精品视频| 国产精品蜜臀av| 99riav一区二区三区| 综合色天天鬼久久鬼色| a在线欧美一区| 亚洲日穴在线视频| 97国产一区二区| 亚洲视频 欧洲视频| 色综合激情久久| 亚洲一二三四在线观看| 欧美三级日韩在线| 天堂资源在线中文精品| 91精品国产综合久久小美女| 五月婷婷欧美视频| 日韩一区二区三区四区| 黑人巨大精品欧美黑白配亚洲| 日韩免费观看高清完整版| 老鸭窝一区二区久久精品| 2022国产精品视频| 国产精一区二区三区| 国产精品无码永久免费888| 99精品国产视频| 亚洲www啪成人一区二区麻豆| 欧美理论电影在线| 久久99国产精品久久99| 国产日韩综合av| 色综合色狠狠综合色| 性感美女久久精品| 精品久久久三级丝袜| 成人av影视在线观看| 亚洲一区二区免费视频| 欧美电影免费提供在线观看| 国产一区二区三区四区五区美女| 国产精品国产三级国产aⅴ中文| 色婷婷综合久久久久中文一区二区| 午夜精品久久久久久久99水蜜桃 | 国产精品丝袜在线| 日本丶国产丶欧美色综合| 免费在线观看精品| 国产欧美久久久精品影院| 91久久一区二区| 日韩一区二区在线看片| 国产成人一区在线| 亚洲电影一区二区三区| 精品国产免费人成在线观看| 97精品超碰一区二区三区| 日韩精品91亚洲二区在线观看| 国产日本欧美一区二区| 欧美午夜一区二区三区免费大片| 久久爱www久久做| 亚洲免费大片在线观看| 欧美成人三级在线| 欧洲精品视频在线观看| 黄色日韩三级电影| 一区二区三区不卡视频 | 亚洲国产三级在线| 国产女人aaa级久久久级| 欧美人与性动xxxx| a亚洲天堂av| 精品一区二区三区香蕉蜜桃| 亚洲视频一区二区在线| 精品国产亚洲在线| 欧美日韩国产精品成人| 成人免费福利片| 激情小说亚洲一区| 亚洲无线码一区二区三区| 国产日韩精品一区二区三区 | 国产精品狼人久久影院观看方式| 7777精品伊人久久久大香线蕉的 | 日本黄色一区二区| 国产白丝精品91爽爽久久|