⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 full.patch

📁 2.6.12 内核版本的patch
💻 PATCH
📖 第 1 页 / 共 5 页
字号:
+	if ((info->delay&0xffff) > 0)+		writel(info->delay & 0xffff,  base_addr+S3C2410_ADCDLY);++	writel(WAIT4INT(0), base_addr+S3C2410_ADCTSC);++	/* Initialise input stuff */+	memset(&ts, 0, sizeof(struct s3c2410ts));+	init_input_dev(&ts.dev);+	ts.dev.evbit[0] = ts.dev.evbit[0] = BIT(EV_SYN) | BIT(EV_KEY) | BIT(EV_ABS);+	ts.dev.keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH);+	input_set_abs_params(&ts.dev, ABS_X, 0, 0x3FF, 0, 0);+	input_set_abs_params(&ts.dev, ABS_Y, 0, 0x3FF, 0, 0);+	input_set_abs_params(&ts.dev, ABS_PRESSURE, 0, 1, 0, 0);++	sprintf(ts.phys, "ts0");++	ts.dev.private = &ts;+	ts.dev.name = s3c2410ts_name;+	ts.dev.phys = ts.phys;+	ts.dev.id.bustype = BUS_RS232;+	ts.dev.id.vendor = 0xDEAD;+	ts.dev.id.product = 0xBEEF;+	ts.dev.id.version = S3C2410TSVERSION;++	ts.shift = info->oversampling_shift;++	/* Get irqs */+	if (request_irq(IRQ_ADC, stylus_action, SA_SAMPLE_RANDOM,+		"s3c2410_action", &ts.dev)) {+		printk(KERN_ERR "s3c2410_ts.c: Could not allocate ts IRQ_ADC !\n");+		iounmap(base_addr);+		return -EIO;+	}+	if (request_irq(IRQ_TC, stylus_updown, SA_SAMPLE_RANDOM,+			"s3c2410_action", &ts.dev)) {+		printk(KERN_ERR "s3c2410_ts.c: Could not allocate ts IRQ_TC !\n");+		iounmap(base_addr);+		return -EIO;+	}++	printk(KERN_INFO "%s successfully loaded\n", s3c2410ts_name);++	/* All went ok, so register to the input system */+	input_register_device(&ts.dev);++	return 0;+}++static int s3c2410ts_remove(struct device *dev)+{+	disable_irq(IRQ_ADC);+	disable_irq(IRQ_TC);+	free_irq(IRQ_TC,&ts.dev);+	free_irq(IRQ_ADC,&ts.dev);++	if (adc_clock) {+		clk_disable(adc_clock);+		clk_unuse(adc_clock);+		clk_put(adc_clock);+		adc_clock = NULL;+	}++	input_unregister_device(&ts.dev);+	iounmap(base_addr);++	return 0;+}++static struct device_driver s3c2410ts_driver = {+       .name           = "s3c2410-ts",+       .bus            = &platform_bus_type,+       .probe          = s3c2410ts_probe,+       .remove         = s3c2410ts_remove,+};+++int __init s3c2410ts_init(void)+{+	return driver_register(&s3c2410ts_driver);+}++void __exit s3c2410ts_exit(void)+{+	driver_unregister(&s3c2410ts_driver);+}++module_init(s3c2410ts_init);+module_exit(s3c2410ts_exit);++/*+    Local variables:+        compile-command: "make ARCH=arm CROSS_COMPILE=/usr/local/arm/3.3.2/bin/arm-linux- -k -C ../../.."+        c-basic-offset: 8+    End:+*/diff --git a/drivers/mmc/Kconfig b/drivers/mmc/Kconfig--- a/drivers/mmc/Kconfig+++ b/drivers/mmc/Kconfig@@ -60,4 +60,13 @@ config MMC_WBSD  	  If unsure, say N. +config MMC_S3C2410+	tristate "Samsung S3C2410 Multimedia Card Interface support"+	depends on ARCH_S3C2410 && MMC+	help+	  This selects the Samsung S3C2410 Multimedia Card Interface +	  support. ++	  If unsure, say N.+ endmenudiff --git a/drivers/mmc/Makefile b/drivers/mmc/Makefile--- a/drivers/mmc/Makefile+++ b/drivers/mmc/Makefile@@ -18,5 +18,6 @@ obj-$(CONFIG_MMC_BLOCK)		+= mmc_block.o obj-$(CONFIG_MMC_ARMMMCI)	+= mmci.o obj-$(CONFIG_MMC_PXA)		+= pxamci.o obj-$(CONFIG_MMC_WBSD)		+= wbsd.o+obj-$(CONFIG_MMC_S3C2410)	+= s3c2410mci.o  mmc_core-y := mmc.o mmc_queue.o mmc_sysfs.odiff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c--- a/drivers/mmc/mmc.c+++ b/drivers/mmc/mmc.c@@ -3,6 +3,9 @@  *  *  Copyright (C) 2003-2004 Russell King, All Rights Reserved.  *+ *  SD-Card support:+ *    Copyright (C) 2004 Thomas Kleffel, 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.@@ -172,6 +175,34 @@ int mmc_wait_for_cmd(struct mmc_host *ho  EXPORT_SYMBOL(mmc_wait_for_cmd); +static int mmc_send_app_cmd(struct mmc_host *host,  u16 rca)+{+	struct mmc_command cmd;++	cmd.opcode = MMC_APP_CMD;+	cmd.arg =((u32)rca)<<16;+	cmd.flags = MMC_RSP_R1;++	return mmc_wait_for_cmd(host, &cmd, 0);+}++int mmc_wait_for_acmd(struct mmc_host *host, u16 rca, struct mmc_command *cmd, int retries)+{+	int err;++	do {+		err = mmc_send_app_cmd(host, rca);+		if(err != MMC_ERR_NONE) continue;++		err = mmc_wait_for_cmd(host, cmd, 0);+		if(err == MMC_ERR_NONE) break;++	} while (retries--);++	return err;+}++   /**@@ -274,6 +305,7 @@ static inline void mmc_delay(unsigned in 	} } +#if 0 /* UNUSED */ /*  * Mask off any voltages we don't support and select  * the lowest voltage@@ -298,6 +330,7 @@ static u32 mmc_select_voltage(struct mmc  	return ocr; }+#endif  #define UNSTUFF_BITS(resp,start,size)					\ 	({								\@@ -322,48 +355,65 @@ static void mmc_decode_cid(struct mmc_ca  	memset(&card->cid, 0, sizeof(struct mmc_cid)); -	/*-	 * The selection of the format here is guesswork based upon-	 * information people have sent to date.-	 */-	switch (card->csd.mmca_vsn) {-	case 0: /* MMC v1.? */-	case 1: /* MMC v1.4 */-		card->cid.manfid	= UNSTUFF_BITS(resp, 104, 24);-		card->cid.prod_name[0]	= UNSTUFF_BITS(resp, 96, 8);-		card->cid.prod_name[1]	= UNSTUFF_BITS(resp, 88, 8);-		card->cid.prod_name[2]	= UNSTUFF_BITS(resp, 80, 8);-		card->cid.prod_name[3]	= UNSTUFF_BITS(resp, 72, 8);-		card->cid.prod_name[4]	= UNSTUFF_BITS(resp, 64, 8);-		card->cid.prod_name[5]	= UNSTUFF_BITS(resp, 56, 8);-		card->cid.prod_name[6]	= UNSTUFF_BITS(resp, 48, 8);-		card->cid.hwrev		= UNSTUFF_BITS(resp, 44, 4);-		card->cid.fwrev		= UNSTUFF_BITS(resp, 40, 4);-		card->cid.serial	= UNSTUFF_BITS(resp, 16, 24);-		card->cid.month		= UNSTUFF_BITS(resp, 12, 4);-		card->cid.year		= UNSTUFF_BITS(resp, 8, 4) + 1997;-		break;--	case 2: /* MMC v2.x ? */-	case 3: /* MMC v3.x ? */-		card->cid.manfid	= UNSTUFF_BITS(resp, 120, 8);-		card->cid.oemid		= UNSTUFF_BITS(resp, 104, 16);-		card->cid.prod_name[0]	= UNSTUFF_BITS(resp, 96, 8);-		card->cid.prod_name[1]	= UNSTUFF_BITS(resp, 88, 8);-		card->cid.prod_name[2]	= UNSTUFF_BITS(resp, 80, 8);-		card->cid.prod_name[3]	= UNSTUFF_BITS(resp, 72, 8);-		card->cid.prod_name[4]	= UNSTUFF_BITS(resp, 64, 8);-		card->cid.prod_name[5]	= UNSTUFF_BITS(resp, 56, 8);-		card->cid.serial	= UNSTUFF_BITS(resp, 16, 32);-		card->cid.month		= UNSTUFF_BITS(resp, 12, 4);-		card->cid.year		= UNSTUFF_BITS(resp, 8, 4) + 1997;-		break;--	default:-		printk("%s: card has unknown MMCA version %d\n",-			card->host->host_name, card->csd.mmca_vsn);-		mmc_card_set_bad(card);-		break;+	if(card->sd) {+		if(card->csd.csd_vers != SD_CSDV_1) {+			DBG("%s: card has unknown SD-MMCA version %d\n", card->host->host_name, card->csd.spec_vers);+			mmc_card_set_bad(card);+		} else {+			card->cid.manfid	= UNSTUFF_BITS(resp, 120,  8);+			card->cid.oemid		= UNSTUFF_BITS(resp, 104, 16);+			card->cid.prod_name[0]	= UNSTUFF_BITS(resp,  96,  8);+			card->cid.prod_name[1]	= UNSTUFF_BITS(resp,  88,  8);+			card->cid.prod_name[2]	= UNSTUFF_BITS(resp,  80,  8);+			card->cid.prod_name[3]	= UNSTUFF_BITS(resp,  72,  8);+			card->cid.prod_name[4]	= UNSTUFF_BITS(resp,  64,  8);+			card->cid.prod_name[5]  = 0;+			card->cid.prod_name[6]  = 0;+			card->cid.hwrev		= UNSTUFF_BITS(resp,  60,  4);+			card->cid.fwrev		= UNSTUFF_BITS(resp,  56,  4);+			card->cid.serial	= UNSTUFF_BITS(resp,  24, 32);+			card->cid.month		= UNSTUFF_BITS(resp,  12,  4);+			card->cid.year		= UNSTUFF_BITS(resp,   8,  4) + 2000;+		}+	} else {+		switch (card->csd.csd_vers) {+		case MMC_CSDV_1: /* MMC v1.? */+		case MMC_CSDV_14: /* MMC v1.4 */+			card->cid.manfid	= UNSTUFF_BITS(resp, 104, 24);+			card->cid.prod_name[0]	= UNSTUFF_BITS(resp,  96,  8);+			card->cid.prod_name[1]	= UNSTUFF_BITS(resp,  88,  8);+			card->cid.prod_name[2]	= UNSTUFF_BITS(resp,  80,  8);+			card->cid.prod_name[3]	= UNSTUFF_BITS(resp,  72,  8);+			card->cid.prod_name[4]	= UNSTUFF_BITS(resp,  64,  8);+			card->cid.prod_name[5]	= UNSTUFF_BITS(resp,  56,  8);+			card->cid.prod_name[6]	= UNSTUFF_BITS(resp,  48,  8);+			card->cid.hwrev		= UNSTUFF_BITS(resp,  44,  4);+			card->cid.fwrev		= UNSTUFF_BITS(resp,  40,  4);+			card->cid.serial	= UNSTUFF_BITS(resp,  16, 24);+			card->cid.month		= UNSTUFF_BITS(resp,  12,  4);+			card->cid.year		= UNSTUFF_BITS(resp,   8,  4) + 1997;+			break;++		case MMC_CSDV_2: /* MMC v2.x ? */+		case MMC_CSDV_3: /* MMC v3.x ? */+			card->cid.manfid	= UNSTUFF_BITS(resp, 120,  8);+			card->cid.oemid		= UNSTUFF_BITS(resp, 104, 16);+			card->cid.prod_name[0]	= UNSTUFF_BITS(resp,  96,  8);+			card->cid.prod_name[1]	= UNSTUFF_BITS(resp,  88,  8);+			card->cid.prod_name[2]	= UNSTUFF_BITS(resp,  80,  8);+			card->cid.prod_name[3]	= UNSTUFF_BITS(resp,  72,  8);+			card->cid.prod_name[4]	= UNSTUFF_BITS(resp,  64,  8);+			card->cid.prod_name[5]	= UNSTUFF_BITS(resp,  56,  8);+			card->cid.serial	= UNSTUFF_BITS(resp,  16, 32);+			card->cid.month		= UNSTUFF_BITS(resp,  12,  4);+			card->cid.year		= UNSTUFF_BITS(resp,   8,  4) + 1997;+			break;++		default:+			printk(KERN_WARNING "%s: card has unknown MMC-MMCA version %d\n", card->host->host_name, card->csd.spec_vers);+			mmc_card_set_bad(card);+			break;+		} 	} } @@ -373,37 +423,95 @@ static void mmc_decode_cid(struct mmc_ca static void mmc_decode_csd(struct mmc_card *card) { 	struct mmc_csd *csd = &card->csd;-	unsigned int e, m, csd_struct;+	unsigned int e, m; 	u32 *resp = card->raw_csd; -	/*-	 * We only understand CSD structure v1.1 and v2.-	 * v2 has extra information in bits 15, 11 and 10.-	 */-	csd_struct = UNSTUFF_BITS(resp, 126, 2);-	if (csd_struct != 1 && csd_struct != 2) {-		printk("%s: unrecognised CSD structure version %d\n",-			card->host->host_name, csd_struct);-		mmc_card_set_bad(card);-		return;-	}--	csd->mmca_vsn	 = UNSTUFF_BITS(resp, 122, 4);-	m = UNSTUFF_BITS(resp, 115, 4);-	e = UNSTUFF_BITS(resp, 112, 3);-	csd->tacc_ns	 = (tacc_exp[e] * tacc_mant[m] + 9) / 10;-	csd->tacc_clks	 = UNSTUFF_BITS(resp, 104, 8) * 100;--	m = UNSTUFF_BITS(resp, 99, 4);-	e = UNSTUFF_BITS(resp, 96, 3);-	csd->max_dtr	  = tran_exp[e] * tran_mant[m];-	csd->cmdclass	  = UNSTUFF_BITS(resp, 84, 12);--	e = UNSTUFF_BITS(resp, 47, 3);-	m = UNSTUFF_BITS(resp, 62, 12);-	csd->capacity	  = (1 + m) << (e + 2);+	if(card->sd) {+		/*+		* We only understand SD-CSD structure v1.0.+		*/+		csd->sd=1;+		csd->csd_vers = UNSTUFF_BITS(resp, 126, 2);+		if(csd->csd_vers != SD_CSDV_1) {+			printk("%s: unrecognised SD-CSD structure version %d\n",+				card->host->host_name, csd->csd_vers);+			mmc_card_set_bad(card);+			return;+		}++		csd->spec_vers 		= 0;+		csd->taac		= UNSTUFF_BITS(resp, 112, 8);+		csd->nsac		= UNSTUFF_BITS(resp, 104, 8);+		csd->tran_speed		= UNSTUFF_BITS(resp,  96, 8);+		csd->ccc		= UNSTUFF_BITS(resp,  84,12);+		csd->read_bl_len	= UNSTUFF_BITS(resp,  80, 4);+		csd->read_bl_partial	= UNSTUFF_BITS(resp,  79, 1);+		csd->write_blk_misalign	= UNSTUFF_BITS(resp,  78, 1);+		csd->read_blk_misalign	= UNSTUFF_BITS(resp,  77, 1);+		csd->dsr_imp		= UNSTUFF_BITS(resp,  76, 1);+		csd->c_size		= UNSTUFF_BITS(resp,  62,12);+		csd->vdd_r_curr_min	= UNSTUFF_BITS(resp,  69, 3);+		csd->vdd_r_curr_max	= UNSTUFF_BITS(resp,  56, 3);+		csd->vdd_w_curr_min	= UNSTUFF_BITS(resp,  53, 3);+		csd->vdd_w_curr_max	= UNSTUFF_BITS(resp,  50, 3);+		csd->c_size_mult	= UNSTUFF_BITS(resp,  47, 3);+		csd->erase.sd10.erase_blk_en	= UNSTUFF_BITS(resp,  46, 1);+		csd->erase.sd10.erase_blk_size= UNSTUFF_BITS(resp,  39, 7);+		csd->wp_grp_size	= UNSTUFF_BITS(resp,  32, 7);+		csd->wp_grp_enable	= UNSTUFF_BITS(resp,  31, 1);+		csd->r2w_factor		= UNSTUFF_BITS(resp,  26, 3);+		csd->write_bl_len	= UNSTUFF_BITS(resp,  22, 4);+		csd->write_bl_partial	= UNSTUFF_BITS(resp,  21, 1);+		csd->file_format_grp	= UNSTUFF_BITS(resp,  15, 1);+		csd->copy		= UNSTUFF_BITS(resp,  14, 1);+		csd->perm_write_protect	= UNSTUFF_BITS(resp,  13, 1);+		csd->tmp_write_protect	= UNSTUFF_BITS(resp,  12, 1);+		csd->file_format	= UNSTUFF_BITS(resp,  10, 1);+		csd->ecc		= UNSTUFF_BITS(resp,   1, 7);++		m = UNSTUFF_BITS(resp, 115, 4);+		e = UNSTUFF_BITS(resp, 112, 3);+		csd->tacc_ns	 = (tacc_exp[e] * tacc_mant[m] + 9) / 10;+		csd->tacc_clks	 = UNSTUFF_BITS(resp, 104, 8) * 100;++		m = UNSTUFF_BITS(resp, 99, 4);+		e = UNSTUFF_BITS(resp, 96, 3);+		csd->max_dtr	  = tran_exp[e] * tran_mant[m];++		e = UNSTUFF_BITS(resp, 47, 3);+		m = UNSTUFF_BITS(resp, 62, 12);+		csd->capacity	  = (1 + m) << (e + 2);+	} else {+		/*+		* We only understand MMC-CSD structure v1.1 and v2.+		* v2 has extra information in bits 15, 11 and 10.+		*/+		csd->sd=0;+		csd->csd_vers = UNSTUFF_BITS(resp, 126, 2);+		if (csd->csd_vers != MMC_CSDV_14 && csd->csd_vers != MMC_CSDV_2) {+			printk("%s: unrecognised MMC-CSD structure version %d\n",+				card->host->host_name, csd->csd_vers);+			mmc_card_set_bad(card);+			return;+		} -	csd->read_blkbits = UNSTUFF_BITS(resp, 80, 4);+		csd->spec_vers	 = UNSTUFF_BITS(resp, 122, 4);+		m = UNSTUFF_BITS(resp, 115, 4);+		e = UNSTUFF_BITS(resp, 112, 3);+		csd->tacc_ns	 = (tacc_exp[e] * tacc_mant[m] + 9) / 10;+		csd->tacc_clks	 = UNSTUFF_BITS(resp, 104, 8) * 100;++		m = UNSTUFF_BITS(resp, 99, 4);+		e = UNSTUFF_BITS(resp, 96, 3);+		csd->max_dtr	  = tran_exp[e] * tran_mant[m];+		csd->ccc	  = UNSTUFF_BITS(resp, 84, 12);++		e = UNSTUFF_BITS(resp, 47, 3);+		m = UNSTUFF_BITS(resp, 62, 12);+		csd->capacity	  = (1 + m) << (e + 2);++		csd->read_bl_len = UNSTUFF_BITS(resp, 80, 4);+	} }  /*@@ -424,7 +532,7 @@ static struct mmc_card *mmc_find_card(st  * Allocate a new MMC card, and assign a unique RCA.  */ static struct mmc_card *-mmc_alloc_card(struct mmc_host *host, u32 *raw_cid, unsigned int *frca)+mmc_alloc_card(struct mmc_host *host, u32 *raw_cid, u8 sd, unsigned int *frca) { 	struct mmc_card *card, *c; 	unsigned int rca = *frca;@@ -435,6 +543,7 @@ mmc_alloc_card(struct mmc_host *host, u3  	mmc_init_card(card, host); 	memcpy(card->raw_cid, raw_cid, sizeof(card->raw_cid));+	card->sd = sd;   again: 	list_for_each_entry(c, &host->cards, node)@@ -456,6 +565,7 @@ mmc_alloc_card(struct mmc_host *host, u3 static void mmc_idle_cards(struct mmc_host *host) { 	struct mmc_command cmd;+	struct mmc_card *card;  	cmd.opcode = MMC_GO_IDLE_STATE; 	cmd.arg = 0;@@ -463,9 +573,83 @@ static void mmc_idle_cards(struct mmc_ho  	mmc_wait_for_cmd(host, &cmd, 0); -	mmc_delay(1);+	//MMC_GO_IDLE_STATE resets all cards to bus width 1+	list_for_each_entry(card, &host->cards, node) {+		card->bus_width=1;+	}+++	mmc_delay(100);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -