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

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

?? mmc_disk.c

?? samsung s3c2410 的sd/mmc driver
?? C
字號:
/* * drivers/mmc/mmc_disk.c * * Block Device Driver for MMC * * Copyright (C) 2001-2003 MIZI Research, Inc. * * Author: Yong-iL Joh <tolkien@mizi.com> * $Id: mmc_disk.c,v 1.2 2004/01/26 08:29:56 laputa Exp $ * * Revision History: * * 2001-XX-XX Yong-iL Joh <tolkien@mizi.com> * - initial release * * 2002-07-25 Chan Gyun Jeong <cgjeong@mizi.com> * - code cleanup and restructuring *  * 2003-01-13 Chan Gyun Jeong <cgjeong@mizi.com> * - remove task_schedule() * * * 2004-01-06 kwang hyun La <nala.la@samsung.com> * - removed a delay fn for a performance  */#include <linux/config.h>#include <linux/module.h>#include <linux/kernel.h>#include <linux/init.h>#include <linux/errno.h>#include <linux/devfs_fs_kernel.h>#include <linux/blkpg.h>#include <linux/hdreg.h>#include <linux/genhd.h>#include <linux/sched.h>#include <linux/delay.h>#include <asm/uaccess.h>#include <asm/hardware.h>#include "mmc.h"#define MMC_SHIFT      2  /* max 4 partition */#define MMC_NRDEV      (1 << MMC_SHIFT)#define MMC_NDISK      (MAX_MMC_SLOTS << MMC_SHIFT)#define MAJOR_NR          60#define DEVICE_NAME       "mmc"#define DEVICE_REQUEST    do_mmc_request#define DEVICE_NR(device) (MINOR(device) >> MMC_SHIFT)#define DEVICE_ON(device)#define DEVICE_OFF(device)#define DEVICE_NO_RANDOM#include <linux/blk.h>static int mmc_sizes[MMC_NDISK];static int mmc_blksizes[MMC_NDISK];static struct hd_struct mmc_part[MMC_NDISK];static char mmc_gendisk_flags[MAX_MMC_SLOTS];static struct gendisk mmc_gendisk = {	major:              MAJOR_NR,	major_name:         DEVICE_NAME,	minor_shift:        MMC_SHIFT,	max_p:              MMC_NRDEV,	part:               mmc_part,	sizes:              mmc_sizes,	flags:              mmc_gendisk_flags,};static struct mmc_disk {	int use_cnt;	struct mmc_slot *slot;} mmc_disk[MAX_MMC_SLOTS];#define SD_PRIV(x)	((struct mmc_disk *)(mmc_disk) + (x))#define SD_SLOT(x)	(SD_PRIV(x)->slot)#define IS_EMPTY(x)	(SD_SLOT(x) == NULL)static int do_mmc_rw(struct request *req, int rd){	int ret = 0;	int dev = DEVICE_NR(req->rq_dev);	unsigned int sect_first, sect_last;	unsigned long blksize, from;	char *buffer;	/* read_len must be 512 bytes */	blksize = SD_SLOT(dev)->read_len;	buffer = req->buffer;	sect_first = req->sector + mmc_part[MINOR(req->rq_dev)].start_sect;	sect_last = sect_first + req->current_nr_sectors;	from = sect_first * blksize;	while (sect_first < sect_last) {		ret = SD_SLOT(dev)->transfer1b(SD_SLOT(dev), rd, from, buffer);		if (ret) {			if (ret == -EBUSY) {				DEBUG2(3, "[%s] MMC busy\n", __FUNCTION__);				schedule_timeout(HZ/20); /* prevent busy waiting */				continue;			} else {				DEBUG2(1, "[%s] error: %d\n", 				       __FUNCTION__, ret);				break;			}		}		sect_first++;		from += blksize;		buffer += blksize;	}	return ret;}static void do_mmc_request(request_queue_t * q){	int dev, ret, res;	struct request *req;	int rd;	while (1) {		INIT_REQUEST;	/* blk.h */		req = CURRENT;		/* We can do this because the generic code knows not to		   touch the request at the head of the queue */		spin_unlock_irq(&io_request_lock);		/* check if the device is valid */		dev = DEVICE_NR(req->rq_dev);		if (dev >= MAX_MMC_SLOTS || IS_EMPTY(dev) || 		    mmc_sizes[MINOR(req->rq_dev)] == 0) {			res = 0;			goto endreq;		}		if (req->sector + req->current_nr_sectors > 		    mmc_part[MINOR(req->rq_dev)].nr_sects) {			/* request past end of device */			res = 0;			goto endreq;		}		if (req->cmd == READ) {			rd = 1;		} else if (req->cmd == WRITE) {			rd = 0;		} else {			/* invalid request command */			res = 0;			goto endreq;		}		ret = do_mmc_rw(req, rd);		if (ret) {			res = 0;			goto endreq;		}		res = 1;	endreq:		spin_lock_irq(&io_request_lock);		end_request(res);	}}static int mmc_ioctl(struct inode *inode, struct file *filp,		       unsigned int cmd, unsigned long arg){	int dev = DEVICE_NR(inode->i_rdev);	int minor = MINOR(inode->i_rdev);		switch (cmd) {	case BLKGETSIZE:		return put_user(mmc_gendisk.part[minor].nr_sects, 				(long *) arg);#ifdef BLKGETSIZE64	case BLKGETSIZE64:		return put_user((u64)mmc_gendisk.part[minor].nr_sects,				(u64 *)arg);#endif	case BLKFLSBUF:		if (!capable(CAP_SYS_ADMIN)) return -EACCES;		invalidate_device(inode->i_rdev, 1);		return 0;	case HDIO_GETGEO: {		struct hd_geometry geo;		geo.cylinders = 1;		geo.heads = 1;		geo.sectors = mmc_gendisk.part[minor].nr_sects;		geo.start = mmc_gendisk.part[minor].start_sect;		return copy_to_user((void *)arg, &geo, sizeof(geo)) ? 			-EFAULT : 0;	}	case BLKRRPART: {		int i;		if (!capable(CAP_SYS_ADMIN)) return -EACCES;		if (SD_PRIV(dev)->use_cnt > 1) return -EBUSY;		for (i = mmc_gendisk.max_p - 1; i >= 0; i--) {			if (mmc_gendisk.part[i].nr_sects) {				kdev_t devid = MKDEV(MAJOR(inode->i_rdev), 						     minor + i);				invalidate_device(devid, 1);				mmc_gendisk.part[minor + i].start_sect = 0;				mmc_gendisk.part[minor + i].nr_sects = 0;			}		}		grok_partitions(&mmc_gendisk, dev, mmc_gendisk.max_p, 				SD_SLOT(dev)->size / SD_SLOT(dev)->read_len);		return 0;	}	case BLKROSET:	case BLKROGET:	case BLKSSZGET:		return blk_ioctl(inode->i_rdev, cmd, arg);	default: 		return -EINVAL;	}}static int mmc_open(struct inode *inode, struct file *filp){	int dev = DEVICE_NR(inode->i_rdev);	if (dev >= MAX_MMC_SLOTS) return -ENODEV;	if (IS_EMPTY(dev)) return -ENODEV;	if ((filp->f_mode & FMODE_WRITE) && SD_SLOT(dev)->readonly) {		DEBUG2(2, "[%s] it's readonly", __FUNCTION__); 		return -EROFS;	}	SD_PRIV(dev)->use_cnt++;	MOD_INC_USE_COUNT;	return 0;}static int mmc_release(struct inode * inode, struct file * filp){	int dev = DEVICE_NR(inode->i_rdev);	invalidate_device(inode->i_rdev, 1);		SD_PRIV(dev)->use_cnt--;	if (!mmc_sizes[MINOR(inode->i_rdev)]) {		SD_SLOT(dev) = NULL;	}	MOD_DEC_USE_COUNT;	return 0;}static struct block_device_operations mmc_fops = {	owner:			THIS_MODULE,	open:			mmc_open,	release:		mmc_release,	ioctl:			mmc_ioctl,};static void mmc_notify_add(struct mmc_slot *slot){	int i, dev, minor;	for (i = 0, dev = -1; i < MAX_MMC_SLOTS; i++) {		if (IS_EMPTY(i)) {			if (dev == -1) dev = i;		} else if (SD_SLOT(i)->id == slot->id) {			/* already mounted */			dev = i;			break;		}	}	if (dev == -1) return;	SD_SLOT(dev) = slot;	minor = dev << mmc_gendisk.minor_shift;	mmc_gendisk.part[minor].start_sect = 0;	mmc_gendisk.nr_real++;	register_disk(&mmc_gendisk, MKDEV(MAJOR_NR, minor), 		      mmc_gendisk.max_p, mmc_gendisk.fops, 		      SD_SLOT(dev)->size / SD_SLOT(dev)->read_len);#ifdef CONFIG_MIZI	event_notify(EXT_DEV_INSERT);#endif	DEBUG2(1, "Register %s: %ldMB\n", 	       "MultiMediaCard",	       SD_SLOT(dev)->size/(1024 * 1024));}static void mmc_notify_remove(struct mmc_slot *slot){	int dev, minor;	for (dev = 0; dev < MAX_MMC_SLOTS; dev++) {		if (SD_SLOT(dev) == slot) {			break;		}	}	if (dev >= MAX_MMC_SLOTS) return;	minor = dev << mmc_gendisk.minor_shift;	/* Unregister the related device files at the /dev/mmc directory, 	   grok_partitions(*, *, *, 0) does not work here */	devfs_register_partitions (&mmc_gendisk, minor, 1);	mmc_gendisk.nr_real--;	if (!(SD_PRIV(dev)->use_cnt)) {		SD_SLOT(dev) = NULL;	}	for (; minor < (dev + 1) << mmc_gendisk.minor_shift; minor++) {		if (mmc_sizes[minor]) {			mmc_sizes[minor] = 0;		}	}#ifdef CONFIG_MIZI	event_notify(EXT_DEV_REMOVE);#endif	DEBUG2(1, "Unregister %s: remain %s\n",	       "MultiMediaCard",	       IS_EMPTY(dev) ? "unmounted":"mounted");}static struct mmc_notifier disk_notifier = {	add:    mmc_notify_add,	remove: mmc_notify_remove,};static int __init init_mmc_disk(void){	if (devfs_register_blkdev(MAJOR_NR, DEVICE_NAME, &mmc_fops)) {		printk("MMC Disk: failed to register major %d\n", MAJOR_NR);		return -EBUSY;	}	mmc_gendisk.fops = &mmc_fops;	memset(mmc_gendisk.flags, GENHD_FL_REMOVABLE, MAX_MMC_SLOTS);	blksize_size[MAJOR_NR] = mmc_blksizes;	blk_size[MAJOR_NR] = mmc_sizes;	blk_init_queue(BLK_DEFAULT_QUEUE(MAJOR_NR), DEVICE_REQUEST);	add_gendisk(&mmc_gendisk);	register_mmc_user(&disk_notifier);	return 0;}static void __exit exit_mmc_disk(void){	unregister_mmc_user(&disk_notifier);	devfs_unregister_blkdev(MAJOR_NR, DEVICE_NAME);	blk_cleanup_queue(BLK_DEFAULT_QUEUE(MAJOR_NR));	del_gendisk(&mmc_gendisk);	blk_size[MAJOR_NR] = NULL;	blksize_size[MAJOR_NR] = NULL;}module_init(init_mmc_disk);module_exit(exit_mmc_disk);MODULE_AUTHOR("Yong-iL Joh <tolkien@mizi.com>");MODULE_LICENSE("Not GPL, Proprietary License");MODULE_DESCRIPTION("MMC Memory Card block device driver");

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
夜夜亚洲天天久久| 亚洲国产另类av| 亚洲最新视频在线观看| 久久精品国产秦先生| 色综合久久综合网欧美综合网| 日韩一区二区影院| 亚洲柠檬福利资源导航| 国产伦精一区二区三区| 91精品免费观看| 夜夜揉揉日日人人青青一国产精品| 国精产品一区一区三区mba桃花| 欧美在线免费观看视频| 中文字幕一区二区三区精华液| 久久99国产精品尤物| 色94色欧美sute亚洲13| 欧美激情在线免费观看| 国模无码大尺度一区二区三区| 91蝌蚪国产九色| 欧美国产精品一区二区三区| 激情文学综合丁香| 欧美一区二区三区视频免费 | 91老司机福利 在线| 久久精品人人做| 久久国产精品区| 欧美一级精品大片| 日本成人在线看| 欧美日韩在线精品一区二区三区激情| 日韩毛片精品高清免费| 成人免费毛片app| 欧美激情综合五月色丁香小说| 国产伦精品一区二区三区免费迷| 日韩欧美中文一区二区| 老司机精品视频导航| 欧美一区二区三区白人| 丝袜美腿亚洲一区二区图片| 欧美男人的天堂一二区| 天堂va蜜桃一区二区三区 | 欧美片在线播放| 午夜精品福利在线| 欧美一区在线视频| 久久国产精品色| 久久久久久久精| 成人av在线观| 亚洲精品福利视频网站| 欧美四级电影在线观看| 五月婷婷久久综合| 日韩欧美aaaaaa| 国产91在线观看丝袜| 国产精品美女久久久久久| 色综合久久九月婷婷色综合| 亚洲香肠在线观看| 欧美日韩精品一区二区天天拍小说| 午夜私人影院久久久久| 欧美一区二区视频网站| 国产在线国偷精品产拍免费yy| 精品成人私密视频| 丁香婷婷综合网| 亚洲精品乱码久久久久| 欧美伦理影视网| 国产盗摄一区二区| 一区二区三区在线观看视频| 777午夜精品视频在线播放| 国产一区二区三区四区五区美女 | 国产成+人+日韩+欧美+亚洲| 综合欧美亚洲日本| 欧美精品在线观看一区二区| 国产一二三精品| 一区二区视频免费在线观看| 日韩精品中文字幕一区| a美女胸又www黄视频久久| 天天爽夜夜爽夜夜爽精品视频| 26uuu亚洲综合色欧美| 97精品国产露脸对白| 青青草原综合久久大伊人精品优势 | 91精品国模一区二区三区| 国产91清纯白嫩初高中在线观看 | av亚洲产国偷v产偷v自拍| 亚洲v日本v欧美v久久精品| 精品国产乱码久久| 欧美亚洲动漫精品| 国产成人啪午夜精品网站男同| 亚洲第四色夜色| 国产精品无人区| 日韩欧美电影一二三| 在线视频你懂得一区| 国产高清不卡一区| 丝袜美腿一区二区三区| 成人免费一区二区三区在线观看| 一区二区三区国产| 欧美精品日韩精品| 成人污视频在线观看| 日韩成人dvd| 亚洲精品视频免费看| 久久久久国产成人精品亚洲午夜| 欧美美女网站色| 色激情天天射综合网| 国产成人亚洲精品狼色在线| 免费观看91视频大全| 亚洲一区视频在线观看视频| 国产精品福利影院| 国产欧美1区2区3区| 亚洲精品一区二区三区蜜桃下载| 在线观看91精品国产麻豆| 日本精品一区二区三区高清| 成人国产在线观看| 国产麻豆精品久久一二三| 蜜臀va亚洲va欧美va天堂| 午夜成人免费电影| 亚洲不卡一区二区三区| 精品美女在线观看| 国产精品三级av| 精品美女在线播放| 精品成人佐山爱一区二区| 欧美成人a∨高清免费观看| 91精品国产高清一区二区三区| 欧美日韩亚洲国产综合| 在线观看三级视频欧美| 欧美性色黄大片| 欧美在线观看一区| 欧美日韩视频不卡| 欧美挠脚心视频网站| 欧美一区二区三区公司| 日韩一区二区三区三四区视频在线观看 | 国产午夜精品一区二区| 欧美精品一区在线观看| 国产亚洲一区字幕| 国产精品卡一卡二卡三| 亚洲美女视频在线观看| 亚洲综合精品自拍| 天天影视色香欲综合网老头| 日韩黄色免费网站| 久久99精品久久只有精品| 国产麻豆精品视频| www.久久久久久久久| 欧美在线观看一二区| 7777精品伊人久久久大香线蕉经典版下载 | 在线不卡欧美精品一区二区三区| 这里只有精品免费| 精品欧美一区二区久久| 久久久精品国产免大香伊| 国产精品乱人伦| 亚洲线精品一区二区三区八戒| 蜜臀av在线播放一区二区三区| 国产精品中文字幕欧美| 不卡视频一二三四| 欧美日韩国产高清一区| 亚洲精品一区二区三区在线观看| 中文字幕一区二区三区蜜月| 亚洲成人黄色影院| 福利一区福利二区| 欧美日韩大陆一区二区| 久久亚洲综合色一区二区三区| 亚洲欧美日韩国产手机在线| 水蜜桃久久夜色精品一区的特点| 国产一区二区视频在线| 日本韩国欧美一区| 精品国产乱码久久久久久牛牛| 成人欧美一区二区三区视频网页| 亚洲午夜国产一区99re久久| 精品在线免费视频| 在线观看三级视频欧美| 久久蜜臀精品av| 亚洲成人在线网站| 国产精品1024| 欧美久久久久久蜜桃| 中文字幕+乱码+中文字幕一区| 日本三级亚洲精品| 夫妻av一区二区| 日韩精品综合一本久道在线视频| 综合激情成人伊人| 国产乱码精品一区二区三区av| 欧洲精品一区二区三区在线观看| 国产午夜精品久久久久久免费视 | 色999日韩国产欧美一区二区| 欧美一区二区三区四区视频| 亚洲天堂2014| 成人中文字幕电影| 欧美成人一区二区三区在线观看 | 91成人免费在线视频| 国产精品入口麻豆九色| 美女www一区二区| 欧美日韩一区国产| 亚洲色图.com| a4yy欧美一区二区三区| 久久色成人在线| 美腿丝袜亚洲综合| 欧美无乱码久久久免费午夜一区| 国产精品国产三级国产普通话蜜臀| 国内成人自拍视频| 精品久久久久久综合日本欧美| 五月婷婷激情综合| 欧美欧美欧美欧美| 亚洲成a人v欧美综合天堂下载| 91免费视频网| 一区二区三区四区不卡在线 | 国产精品第五页| 国产91丝袜在线播放九色| 久久久精品人体av艺术| 激情综合亚洲精品| 欧美精品一区二|