📄 full.patch
字号:
+ 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 + -