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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? s3c2410.c

?? 老版本的mtd-snap
?? C
?? 第 1 頁 / 共 2 頁
字號:
	writel(ctrl, info->regs + S3C2410_NFCONF);}static void s3c2440_nand_enable_hwecc(struct mtd_info *mtd, int mode){	struct s3c2410_nand_info *info = s3c2410_nand_mtd_toinfo(mtd);	unsigned long ctrl;	ctrl = readl(info->regs + S3C2440_NFCONT);	writel(ctrl | S3C2440_NFCONT_INITECC, info->regs + S3C2440_NFCONT);}static int s3c2410_nand_calculate_ecc(struct mtd_info *mtd,				      const u_char *dat, u_char *ecc_code){	struct s3c2410_nand_info *info = s3c2410_nand_mtd_toinfo(mtd);	ecc_code[0] = readb(info->regs + S3C2410_NFECC + 0);	ecc_code[1] = readb(info->regs + S3C2410_NFECC + 1);	ecc_code[2] = readb(info->regs + S3C2410_NFECC + 2);	pr_debug("calculate_ecc: returning ecc %02x,%02x,%02x\n",		 ecc_code[0], ecc_code[1], ecc_code[2]);	return 0;}static int s3c2440_nand_calculate_ecc(struct mtd_info *mtd,				      const u_char *dat, u_char *ecc_code){	struct s3c2410_nand_info *info = s3c2410_nand_mtd_toinfo(mtd);	unsigned long ecc = readl(info->regs + S3C2440_NFMECC0);	ecc_code[0] = ecc;	ecc_code[1] = ecc >> 8;	ecc_code[2] = ecc >> 16;	pr_debug("calculate_ecc: returning ecc %02x,%02x,%02x\n",		 ecc_code[0], ecc_code[1], ecc_code[2]);	return 0;}/* over-ride the standard functions for a little more speed. We can * use read/write block to move the data buffers to/from the controller*/static void s3c2410_nand_read_buf(struct mtd_info *mtd, u_char *buf, int len){	struct nand_chip *this = mtd->priv;	readsb(this->IO_ADDR_R, buf, len);}static void s3c2410_nand_write_buf(struct mtd_info *mtd,				   const u_char *buf, int len){	struct nand_chip *this = mtd->priv;	writesb(this->IO_ADDR_W, buf, len);}/* device management functions */static int s3c2410_nand_remove(struct device *dev){	struct s3c2410_nand_info *info = to_nand_info(dev);	dev_set_drvdata(dev, NULL);	if (info == NULL) 		return 0;	/* first thing we need to do is release all our mtds	 * and their partitions, then go through freeing the	 * resources used 	 */		if (info->mtds != NULL) {		struct s3c2410_nand_mtd *ptr = info->mtds;		int mtdno;		for (mtdno = 0; mtdno < info->mtd_count; mtdno++, ptr++) {			pr_debug("releasing mtd %d (%p)\n", mtdno, ptr);			nand_release(&ptr->mtd);		}		kfree(info->mtds);	}	/* free the common resources */	if (info->clk != NULL && !IS_ERR(info->clk)) {		clk_disable(info->clk);		clk_unuse(info->clk);		clk_put(info->clk);	}	if (info->regs != NULL) {		iounmap(info->regs);		info->regs = NULL;	}	if (info->area != NULL) {		release_resource(info->area);		kfree(info->area);		info->area = NULL;	}	kfree(info);	return 0;}#ifdef CONFIG_MTD_PARTITIONSstatic int s3c2410_nand_add_partition(struct s3c2410_nand_info *info,				      struct s3c2410_nand_mtd *mtd,				      struct s3c2410_nand_set *set){	if (set == NULL)		return add_mtd_device(&mtd->mtd);	if (set->nr_partitions > 0 && set->partitions != NULL) {		return add_mtd_partitions(&mtd->mtd,					  set->partitions,					  set->nr_partitions);	}	return add_mtd_device(&mtd->mtd);}#elsestatic int s3c2410_nand_add_partition(struct s3c2410_nand_info *info,				      struct s3c2410_nand_mtd *mtd,				      struct s3c2410_nand_set *set){	return add_mtd_device(&mtd->mtd);}#endif/* s3c2410_nand_init_chip * * init a single instance of an chip */static void s3c2410_nand_init_chip(struct s3c2410_nand_info *info,				   struct s3c2410_nand_mtd *nmtd,				   struct s3c2410_nand_set *set){	struct nand_chip *chip = &nmtd->chip;	chip->IO_ADDR_R	   = info->regs + S3C2410_NFDATA;	chip->IO_ADDR_W    = info->regs + S3C2410_NFDATA;	chip->hwcontrol    = s3c2410_nand_hwcontrol;	chip->dev_ready    = s3c2410_nand_devready;	chip->write_buf    = s3c2410_nand_write_buf;	chip->read_buf     = s3c2410_nand_read_buf;	chip->select_chip  = s3c2410_nand_select_chip;	chip->chip_delay   = 50;	chip->priv	   = nmtd;	chip->options	   = 0;	chip->controller   = &info->controller;	if (info->is_s3c2440) {		chip->IO_ADDR_R	 = info->regs + S3C2440_NFDATA;		chip->IO_ADDR_W  = info->regs + S3C2440_NFDATA;		chip->hwcontrol  = s3c2440_nand_hwcontrol;	}	nmtd->info	   = info;	nmtd->mtd.priv	   = chip;	nmtd->set	   = set;	if (hardware_ecc) {		chip->correct_data  = s3c2410_nand_correct_data;		chip->enable_hwecc  = s3c2410_nand_enable_hwecc;		chip->calculate_ecc = s3c2410_nand_calculate_ecc;		chip->eccmode	    = NAND_ECC_HW3_512;		chip->autooob       = &nand_hw_eccoob;		if (info->is_s3c2440) {			chip->enable_hwecc  = s3c2440_nand_enable_hwecc;			chip->calculate_ecc = s3c2440_nand_calculate_ecc;		}	} else {		chip->eccmode	    = NAND_ECC_SOFT;	}}/* s3c2410_nand_probe * * called by device layer when it finds a device matching * one our driver can handled. This code checks to see if * it can allocate all necessary resources then calls the * nand layer to look for devices*/static int s3c24xx_nand_probe(struct device *dev, int is_s3c2440){	struct platform_device *pdev = to_platform_device(dev);	struct s3c2410_platform_nand *plat = to_nand_plat(dev);	struct s3c2410_nand_info *info;	struct s3c2410_nand_mtd *nmtd;	struct s3c2410_nand_set *sets;	struct resource *res;	int err = 0;	int size;	int nr_sets;	int setno;	pr_debug("s3c2410_nand_probe(%p)\n", dev);	info = kmalloc(sizeof(*info), GFP_KERNEL);	if (info == NULL) {		printk(KERN_ERR PFX "no memory for flash info\n");		err = -ENOMEM;		goto exit_error;	}	memzero(info, sizeof(*info));	dev_set_drvdata(dev, info);	spin_lock_init(&info->controller.lock);	init_waitqueue_head(&info->controller.wq);	/* get the clock source and enable it */	info->clk = clk_get(dev, "nand");	if (IS_ERR(info->clk)) {		printk(KERN_ERR PFX "failed to get clock");		err = -ENOENT;		goto exit_error;	}	clk_use(info->clk);	clk_enable(info->clk);	/* allocate and map the resource */	/* currently we assume we have the one resource */	res  = pdev->resource;	size = res->end - res->start + 1;	info->area = request_mem_region(res->start, size, pdev->name);	if (info->area == NULL) {		printk(KERN_ERR PFX "cannot reserve register region\n");		err = -ENOENT;		goto exit_error;	}	info->device     = dev;	info->platform   = plat;	info->regs       = ioremap(res->start, size);	info->is_s3c2440 = is_s3c2440;	if (info->regs == NULL) {		printk(KERN_ERR PFX "cannot reserve register region\n");		err = -EIO;		goto exit_error;	}			printk(KERN_INFO PFX "mapped registers at %p\n", info->regs);	/* initialise the hardware */	err = s3c2410_nand_inithw(info, dev);	if (err != 0)		goto exit_error;	sets = (plat != NULL) ? plat->sets : NULL;	nr_sets = (plat != NULL) ? plat->nr_sets : 1;	info->mtd_count = nr_sets;	/* allocate our information */	size = nr_sets * sizeof(*info->mtds);	info->mtds = kmalloc(size, GFP_KERNEL);	if (info->mtds == NULL) {		printk(KERN_ERR PFX "failed to allocate mtd storage\n");		err = -ENOMEM;		goto exit_error;	}	memzero(info->mtds, size);	/* initialise all possible chips */	nmtd = info->mtds;	for (setno = 0; setno < nr_sets; setno++, nmtd++) {		pr_debug("initialising set %d (%p, info %p)\n",			 setno, nmtd, info);				s3c2410_nand_init_chip(info, nmtd, sets);		nmtd->scan_res = nand_scan(&nmtd->mtd,					   (sets) ? sets->nr_chips : 1);		if (nmtd->scan_res == 0) {			s3c2410_nand_add_partition(info, nmtd, sets);		}		if (sets != NULL)			sets++;	}		pr_debug("initialised ok\n");	return 0; exit_error:	s3c2410_nand_remove(dev);	if (err == 0)		err = -EINVAL;	return err;}/* driver device registration */static int s3c2410_nand_probe(struct device *dev){	return s3c24xx_nand_probe(dev, 0);}static int s3c2440_nand_probe(struct device *dev){	return s3c24xx_nand_probe(dev, 1);}static struct device_driver s3c2410_nand_driver = {	.name		= "s3c2410-nand",	.bus		= &platform_bus_type,	.probe		= s3c2410_nand_probe,	.remove		= s3c2410_nand_remove,};static struct device_driver s3c2440_nand_driver = {	.name		= "s3c2440-nand",	.bus		= &platform_bus_type,	.probe		= s3c2440_nand_probe,	.remove		= s3c2410_nand_remove,};static int __init s3c2410_nand_init(void){	printk("S3C24XX NAND Driver, (c) 2004 Simtec Electronics\n");	driver_register(&s3c2440_nand_driver);	return driver_register(&s3c2410_nand_driver);}static void __exit s3c2410_nand_exit(void){	driver_unregister(&s3c2440_nand_driver);	driver_unregister(&s3c2410_nand_driver);}module_init(s3c2410_nand_init);module_exit(s3c2410_nand_exit);MODULE_LICENSE("GPL");MODULE_AUTHOR("Ben Dooks <ben@simtec.co.uk>");MODULE_DESCRIPTION("S3C24XX MTD NAND driver");

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产成人在线观看| 日韩三区在线观看| 欧美日韩国产成人在线免费| 26uuu亚洲综合色欧美 | 欧美一级xxx| 国产精品久久久久久妇女6080 | 国产精品影视天天线| 一本大道av伊人久久综合| 欧美大度的电影原声| 亚洲女与黑人做爰| 国产伦精品一区二区三区视频青涩| 91传媒视频在线播放| 国产视频一区二区在线观看| 婷婷中文字幕综合| 91在线精品秘密一区二区| 精品剧情v国产在线观看在线| 午夜精彩视频在线观看不卡| a亚洲天堂av| 日本一区二区三区在线观看| 蜜芽一区二区三区| 色老汉av一区二区三区| 国产精品久久久久久久久动漫| 国产综合成人久久大片91| 欧美日韩国产高清一区| 亚洲精品日日夜夜| 成人黄色电影在线 | 欧美一二三四在线| 亚洲成人黄色小说| 色综合天天综合网天天狠天天| 久久精品网站免费观看| 国产一区二区在线电影| 欧美草草影院在线视频| 美女免费视频一区| 欧美一区二区二区| 蜜臀久久99精品久久久画质超高清| 717成人午夜免费福利电影| 亚洲777理论| 欧美精品在线一区二区三区| 亚洲一区二区三区小说| 欧美亚洲国产一区在线观看网站| 亚洲综合色网站| 欧美三级中文字幕在线观看| 亚洲va韩国va欧美va精品| 欧美三级韩国三级日本三斤| 婷婷六月综合网| 欧美一区二区视频在线观看2022 | 欧美日韩成人在线一区| 亚洲成人动漫精品| 欧美一区二区三区人| 麻豆成人综合网| 久久亚洲二区三区| 99久久综合狠狠综合久久| 亚洲理论在线观看| 在线成人小视频| 久久精品国产网站| 国产日韩欧美制服另类| 成人午夜免费视频| 日本sm残虐另类| 久久亚洲二区三区| 色综合天天天天做夜夜夜夜做| 亚洲一区二区三区四区在线观看 | 久久精品国产精品亚洲红杏| 精品久久久久久久久久久久包黑料| 国产美女视频91| 亚洲天堂福利av| 欧美精品久久久久久久多人混战| 精品影视av免费| 欧美激情一区二区三区| 91豆麻精品91久久久久久| 久久国产日韩欧美精品| 国产精品乱子久久久久| 在线欧美日韩国产| 麻豆成人在线观看| 亚洲丝袜自拍清纯另类| 日韩午夜小视频| 91小宝寻花一区二区三区| 首页综合国产亚洲丝袜| 久久九九久精品国产免费直播| 色婷婷狠狠综合| 国产乱淫av一区二区三区| 亚洲综合在线电影| 久久婷婷色综合| 欧美亚日韩国产aⅴ精品中极品| 久久99国产精品免费| 日本特黄久久久高潮| 色综合久久中文综合久久97| 欧美成人一区二区| 成人三级在线视频| 久久综合久久综合九色| 丝袜a∨在线一区二区三区不卡 | 色网站国产精品| 欧美—级在线免费片| 国产精品中文字幕欧美| 久久午夜色播影院免费高清| www.在线欧美| 亚洲色图.com| 91精品欧美久久久久久动漫| 粉嫩av一区二区三区在线播放 | 午夜精品福利在线| 亚洲欧美一区二区不卡| 国产欧美日韩久久| 日韩精品一区二区三区四区视频 | 一本色道久久综合亚洲aⅴ蜜桃 | 一区二区三区四区中文字幕| 国产欧美综合在线观看第十页| 欧美精品99久久久**| 91国产精品成人| 99久久亚洲一区二区三区青草| 极品少妇一区二区三区精品视频| 亚洲高清免费观看高清完整版在线观看| 中文字幕制服丝袜一区二区三区| 久久香蕉国产线看观看99| 777亚洲妇女| 欧美丰满嫩嫩电影| 欧美日韩一区二区三区四区| 92精品国产成人观看免费 | 麻豆国产欧美日韩综合精品二区| 亚洲成av人**亚洲成av**| 亚洲欧美一区二区三区国产精品| 国产精品色眯眯| 中文字幕亚洲精品在线观看| 中文久久乱码一区二区| 国产欧美精品在线观看| 欧美国产视频在线| 中文字幕制服丝袜一区二区三区| 亚洲欧美综合色| 伊人色综合久久天天| 夜色激情一区二区| 亚洲成人在线免费| 久久精品av麻豆的观看方式| 精品一区二区三区av| 狠狠狠色丁香婷婷综合久久五月| 精品亚洲成a人在线观看| 精品一区二区三区av| 国产69精品一区二区亚洲孕妇| 东方aⅴ免费观看久久av| 国产91露脸合集magnet| 色综合天天综合网国产成人综合天| 在线观看一区二区视频| 欧美系列一区二区| 日韩欧美卡一卡二| 久久精品视频一区二区| 亚洲色图丝袜美腿| 日韩精品三区四区| 国内一区二区在线| gogogo免费视频观看亚洲一| 欧洲在线/亚洲| 91精品国产综合久久精品麻豆| 欧美大度的电影原声| 国产精品色在线| 日韩精品欧美精品| 国产成人福利片| 欧美在线观看视频在线| 欧美xxxxxxxxx| 成人免费一区二区三区在线观看| 亚洲一区二区三区四区在线观看| 久草这里只有精品视频| 成人app网站| 91精品一区二区三区在线观看| 久久精品欧美日韩精品| 久久国产精品99久久人人澡| 国产经典欧美精品| 欧美日韩日日摸| 国产嫩草影院久久久久| 日韩高清不卡一区| 99热这里都是精品| 日韩午夜在线影院| 一区二区三区在线看| 高清不卡在线观看| 884aa四虎影成人精品一区| 18成人在线观看| 国模一区二区三区白浆| 欧美亚一区二区| 国产精品欧美久久久久无广告| 日韩精品一二区| 欧美综合亚洲图片综合区| 久久久777精品电影网影网 | 亚洲欧美另类图片小说| 日韩中文字幕av电影| 不卡av电影在线播放| 欧美一区二区三区日韩视频| 亚洲自拍偷拍九九九| jlzzjlzz亚洲女人18| 久久久精品影视| 久久国产精品第一页| 欧美精品欧美精品系列| 亚洲激情av在线| 95精品视频在线| 中文字幕一区二区三区视频| 激情久久久久久久久久久久久久久久 | 色香蕉久久蜜桃| 亚洲国产高清在线| 国产一区二区三区在线观看免费| 欧美一区二区日韩| 三级久久三级久久久| 欧美日韩午夜影院| 亚洲最新视频在线观看| 91视频免费观看| 亚洲免费在线观看视频| 91蜜桃视频在线|