r3676 - branches/src/target/kernel/2.6.24.x/patches
laforge at sita.openmoko.org
laforge at sita.openmoko.org
Tue Dec 18 12:30:44 CET 2007
Author: laforge
Date: 2007-12-18 12:30:42 +0100 (Tue, 18 Dec 2007)
New Revision: 3676
Removed:
branches/src/target/kernel/2.6.24.x/patches/s3c_mci_platform.patch
branches/src/target/kernel/2.6.24.x/patches/s3cmci-dma-free.patch
branches/src/target/kernel/2.6.24.x/patches/s3cmci-stop-fix.patch
branches/src/target/kernel/2.6.24.x/patches/s3cmci-unfinished-write-fix.patch
branches/src/target/kernel/2.6.24.x/patches/s3cmci_dbg.patch
Modified:
branches/src/target/kernel/2.6.24.x/patches/s3c_mci.patch
branches/src/target/kernel/2.6.24.x/patches/series
Log:
merge various s3c_mci fixes into the main patch
Modified: branches/src/target/kernel/2.6.24.x/patches/s3c_mci.patch
===================================================================
--- branches/src/target/kernel/2.6.24.x/patches/s3c_mci.patch 2007-12-18 11:18:15 UTC (rev 3675)
+++ branches/src/target/kernel/2.6.24.x/patches/s3c_mci.patch 2007-12-18 11:30:42 UTC (rev 3676)
@@ -149,11 +149,12 @@
===================================================================
--- /dev/null
+++ linux-2.6/drivers/mmc/host/s3cmci.c
-@@ -0,0 +1,1341 @@
+@@ -0,0 +1,1384 @@
+/*
+ * linux/drivers/mmc/s3cmci.h - Samsung S3C MCI driver
+ *
+ * Copyright (C) 2004-2006 maintech GmbH, Thomas Kleffel <tk at maintech.de>
++ * Copyright (C) 2007 OpenMoko, Inc., Harald Welte <laforge at openmoko.org>
+ *
+ * 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
@@ -174,6 +175,7 @@
+#include <asm/io.h>
+#include <asm/arch/regs-sdi.h>
+#include <asm/arch/regs-gpio.h>
++#include <asm/arch/mci.h>
+
+#include "mmc_debug.h"
+#include "s3cmci.h"
@@ -469,6 +471,7 @@
+{
+ struct s3cmci_host *host = (struct s3cmci_host *) data;
+
++ disable_irq(host->irq);
+
+ if (host->pio_active == XFER_WRITE)
+ do_pio_write(host);
@@ -487,9 +490,9 @@
+ host->mrq->data->error = -EIO;
+ }
+
-+ disable_irq(host->irq);
+ finalize_request(host);
-+ }
++ } else
++ enable_irq(host->irq);
+}
+
+/*
@@ -597,9 +600,14 @@
+
+ if (mci_csta & S3C2410_SDICMDSTAT_CRCFAIL) {
+ if (cmd->flags & MMC_RSP_CRC) {
-+ cmd->error = -EILSEQ;
-+ host->status = "error: bad command crc";
-+ goto fail_transfer;
++ if (host->mrq->cmd->flags & MMC_RSP_136) {
++ dbg(host, dbg_irq, "fixup for chip bug: "
++ "ignore CRC fail with long rsp\n");
++ } else {
++ cmd->error = -EILSEQ;
++ host->status = "error: bad command crc";
++ goto fail_transfer;
++ }
+ }
+
+ mci_cclear |= S3C2410_SDICMDSTAT_CRCFAIL;
@@ -812,7 +820,7 @@
+#endif
+ //Cleanup controller
+ writel(0, host->base + S3C2410_SDICMDARG);
-+ writel(0, host->base + S3C2410_SDIDCON);
++ writel(S3C2410_SDIDCON_STOP, host->base + S3C2410_SDIDCON);
+ writel(0, host->base + S3C2410_SDICMDCON);
+ writel(0, host->base + host->sdiimsk);
+
@@ -939,7 +947,7 @@
+ dbg(host, dbg_err,
+ "mci_setup_data() transfer stillin progress.\n");
+
-+ writel(0, host->base + S3C2410_SDIDCON);
++ writel(S3C2410_SDIDCON_STOP, host->base + S3C2410_SDIDCON);
+ s3cmci_reset(host);
+
+ if (0 == (stoptries--)) {
@@ -1158,6 +1166,9 @@
+ s3c2410_gpio_cfgpin(S3C2410_GPE9, S3C2410_GPE9_SDDAT2);
+ s3c2410_gpio_cfgpin(S3C2410_GPE10, S3C2410_GPE10_SDDAT3);
+
++ if (host->pdata->set_power)
++ host->pdata->set_power(ios->power_mode, ios->vdd);
++
+ if (!host->is2440)
+ mci_con|=S3C2410_SDICON_FIFORESET;
+
@@ -1168,6 +1179,9 @@
+ s3c2410_gpio_setpin(S3C2410_GPE5, 0);
+ s3c2410_gpio_cfgpin(S3C2410_GPE5, S3C2410_GPE5_OUTP);
+
++ if (host->pdata->set_power)
++ host->pdata->set_power(ios->power_mode, ios->vdd);
++
+ if (host->is2440)
+ mci_con|=S3C2440_SDICON_SDRESET;
+
@@ -1221,11 +1235,28 @@
+ writel(con, host->base + S3C2410_SDICON);
+}
+
++static int s3cmci_get_ro(struct mmc_host *mmc)
++{
++ struct s3cmci_host *host = mmc_priv(mmc);
++
++ if (host->pdata->gpio_wprotect == 0)
++ return 0;
++
++ return s3c2410_gpio_getpin(host->pdata->gpio_wprotect);
++}
++
+static struct mmc_host_ops s3cmci_ops = {
+ .request = s3cmci_request,
+ .set_ios = s3cmci_set_ios,
++ .get_ro = s3cmci_get_ro,
+};
+
++static struct s3c24xx_mci_pdata s3cmci_def_pdata = {
++ .gpio_detect = 0,
++ .set_power = NULL,
++ .ocr_avail = MMC_VDD_32_33,
++};
++
+static int s3cmci_probe(struct platform_device *pdev, int is2440)
+{
+ struct mmc_host *mmc;
@@ -1243,6 +1274,12 @@
+ host->mmc = mmc;
+ host->pdev = pdev;
+
++ host->pdata = pdev->dev.platform_data;
++ if (!host->pdata) {
++ pdev->dev.platform_data = &s3cmci_def_pdata;
++ host->pdata = &s3cmci_def_pdata;
++ }
++
+ spin_lock_init(&host->complete_lock);
+ tasklet_init(&host->pio_tasklet, pio_tasklet, (unsigned long) host);
+ if (is2440) {
@@ -1261,7 +1298,8 @@
+ host->pio_active = XFER_NONE;
+
+ host->dma = S3CMCI_DMA;
-+ host->irq_cd = IRQ_EINT2;
++ host->irq_cd = s3c2410_gpio_getirq(host->pdata->gpio_detect);
++ s3c2410_gpio_cfgpin(host->pdata->gpio_detect, S3C2410_GPIO_IRQ);
+
+ host->mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ if (!host->mem) {
@@ -1303,7 +1341,7 @@
+
+ disable_irq(host->irq);
+
-+ s3c2410_gpio_cfgpin(S3C2410_GPF2, S3C2410_GPF2_EINT2);
++ s3c2410_gpio_cfgpin(host->pdata->gpio_detect, S3C2410_GPIO_IRQ);
+ set_irq_type(host->irq_cd, IRQT_BOTHEDGE);
+
+ if (request_irq(host->irq_cd, s3cmci_irq_cd, 0, DRIVER_NAME, host)) {
@@ -1314,6 +1352,10 @@
+ goto probe_free_irq;
+ }
+
++ if (host->pdata->gpio_wprotect)
++ s3c2410_gpio_cfgpin(host->pdata->gpio_wprotect,
++ S3C2410_GPIO_INPUT);
++
+ if (s3c2410_dma_request(S3CMCI_DMA, &s3cmci_dma_client, NULL)) {
+ dev_err(&pdev->dev, "unable to get DMA channel.\n");
+ ret = -EBUSY;
@@ -1336,7 +1378,7 @@
+ host->clk_rate = clk_get_rate(host->clk);
+
+ mmc->ops = &s3cmci_ops;
-+ mmc->ocr_avail = MMC_VDD_32_33;
++ mmc->ocr_avail = host->pdata->ocr_avail;
+ mmc->caps = MMC_CAP_4_BIT_DATA;
+ mmc->f_min = host->clk_rate / (host->clk_div * 256);
+ mmc->f_max = host->clk_rate / host->clk_div;
@@ -1395,6 +1437,7 @@
+ mmc_remove_host(mmc);
+ clk_disable(host->clk);
+ clk_put(host->clk);
++ s3c2410_dma_free(S3CMCI_DMA, &s3cmci_dma_client);
+ free_irq(host->irq_cd, host);
+ free_irq(host->irq, host);
+ iounmap(host->base);
@@ -1495,7 +1538,7 @@
===================================================================
--- /dev/null
+++ linux-2.6/drivers/mmc/host/s3cmci.h
-@@ -0,0 +1,71 @@
+@@ -0,0 +1,72 @@
+/*
+ * linux/drivers/mmc/s3cmci.h - Samsung S3C MCI driver
+ *
@@ -1520,6 +1563,7 @@
+
+struct s3cmci_host {
+ struct platform_device *pdev;
++ struct s3c24xx_mci_pdata *pdata;
+ struct mmc_host *mmc;
+ struct resource *mem;
+ struct clk *clk;
Deleted: branches/src/target/kernel/2.6.24.x/patches/s3c_mci_platform.patch
===================================================================
--- branches/src/target/kernel/2.6.24.x/patches/s3c_mci_platform.patch 2007-12-18 11:18:15 UTC (rev 3675)
+++ branches/src/target/kernel/2.6.24.x/patches/s3c_mci_platform.patch 2007-12-18 11:30:42 UTC (rev 3676)
@@ -1,143 +0,0 @@
-This patch adds platform data support to the s3mci driver. This allows
-flexible board-specific configuration of set_power, card detect and read only
-pins.
-Index: linux-2.6.22.1/drivers/mmc/host/s3cmci.c
-===================================================================
---- linux-2.6.22.1.orig/drivers/mmc/host/s3cmci.c 2007-07-19 00:27:24.937824075 +0200
-+++ linux-2.6.22.1/drivers/mmc/host/s3cmci.c 2007-07-19 00:27:45.823014255 +0200
-@@ -22,6 +22,7 @@
- #include <asm/io.h>
- #include <asm/arch/regs-sdi.h>
- #include <asm/arch/regs-gpio.h>
-+#include <asm/arch/mci.h>
-
- #include "mmc_debug.h"
- #include "s3cmci.h"
-@@ -1012,6 +1013,9 @@
- s3c2410_gpio_cfgpin(S3C2410_GPE9, S3C2410_GPE9_SDDAT2);
- s3c2410_gpio_cfgpin(S3C2410_GPE10, S3C2410_GPE10_SDDAT3);
-
-+ if (host->pdata->set_power)
-+ host->pdata->set_power(ios->power_mode, ios->vdd);
-+
- if (!host->is2440)
- mci_con|=S3C2410_SDICON_FIFORESET;
-
-@@ -1022,6 +1026,9 @@
- s3c2410_gpio_setpin(S3C2410_GPE5, 0);
- s3c2410_gpio_cfgpin(S3C2410_GPE5, S3C2410_GPE5_OUTP);
-
-+ if (host->pdata->set_power)
-+ host->pdata->set_power(ios->power_mode, ios->vdd);
-+
- if (host->is2440)
- mci_con|=S3C2440_SDICON_SDRESET;
-
-@@ -1075,9 +1082,26 @@
- writel(con, host->base + S3C2410_SDICON);
- }
-
-+static int s3cmci_get_ro(struct mmc_host *mmc)
-+{
-+ struct s3cmci_host *host = mmc_priv(mmc);
-+
-+ if (host->pdata->gpio_wprotect == 0)
-+ return 0;
-+
-+ return s3c2410_gpio_getpin(host->pdata->gpio_wprotect);
-+}
-+
- static struct mmc_host_ops s3cmci_ops = {
- .request = s3cmci_request,
- .set_ios = s3cmci_set_ios,
-+ .get_ro = s3cmci_get_ro,
-+};
-+
-+static struct s3c24xx_mci_pdata s3cmci_def_pdata = {
-+ .gpio_detect = 0,
-+ .set_power = NULL,
-+ .ocr_avail = MMC_VDD_32_33,
- };
-
- static int s3cmci_probe(struct platform_device *pdev, int is2440)
-@@ -1097,6 +1121,12 @@
- host->mmc = mmc;
- host->pdev = pdev;
-
-+ host->pdata = pdev->dev.platform_data;
-+ if (!host->pdata) {
-+ pdev->dev.platform_data = &s3cmci_def_pdata;
-+ host->pdata = &s3cmci_def_pdata;
-+ }
-+
- spin_lock_init(&host->complete_lock);
- tasklet_init(&host->pio_tasklet, pio_tasklet, (unsigned long) host);
- if (is2440) {
-@@ -1115,7 +1145,8 @@
- host->pio_active = XFER_NONE;
-
- host->dma = S3CMCI_DMA;
-- host->irq_cd = IRQ_EINT2;
-+ host->irq_cd = s3c2410_gpio_getirq(host->pdata->gpio_detect);
-+ s3c2410_gpio_cfgpin(host->pdata->gpio_detect, S3C2410_GPIO_IRQ);
-
- host->mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
- if (!host->mem) {
-@@ -1157,7 +1188,7 @@
-
- disable_irq(host->irq);
-
-- s3c2410_gpio_cfgpin(S3C2410_GPF2, S3C2410_GPF2_EINT2);
-+ s3c2410_gpio_cfgpin(host->pdata->gpio_detect, S3C2410_GPIO_IRQ);
- set_irq_type(host->irq_cd, IRQT_BOTHEDGE);
-
- if (request_irq(host->irq_cd, s3cmci_irq_cd, 0, DRIVER_NAME, host)) {
-@@ -1168,6 +1199,10 @@
- goto probe_free_irq;
- }
-
-+ if (host->pdata->gpio_wprotect)
-+ s3c2410_gpio_cfgpin(host->pdata->gpio_wprotect,
-+ S3C2410_GPIO_INPUT);
-+
- if (s3c2410_dma_request(S3CMCI_DMA, &s3cmci_dma_client, NULL)) {
- dev_err(&pdev->dev, "unable to get DMA channel.\n");
- ret = -EBUSY;
-@@ -1190,7 +1225,7 @@
- host->clk_rate = clk_get_rate(host->clk);
-
- mmc->ops = &s3cmci_ops;
-- mmc->ocr_avail = MMC_VDD_32_33;
-+ mmc->ocr_avail = host->pdata->ocr_avail;
- mmc->caps = MMC_CAP_4_BIT_DATA;
- mmc->f_min = host->clk_rate / (host->clk_div * 256);
- mmc->f_max = host->clk_rate / host->clk_div;
-Index: linux-2.6.22.1/drivers/mmc/host/s3cmci.h
-===================================================================
---- linux-2.6.22.1.orig/drivers/mmc/host/s3cmci.h 2007-07-19 00:25:34.647538991 +0200
-+++ linux-2.6.22.1/drivers/mmc/host/s3cmci.h 2007-07-19 00:27:45.831014710 +0200
-@@ -22,6 +22,7 @@
-
- struct s3cmci_host {
- struct platform_device *pdev;
-+ struct s3c24xx_mci_pdata *pdata;
- struct mmc_host *mmc;
- struct resource *mem;
- struct clk *clk;
-Index: linux-2.6.22.1/include/asm-arm/arch-s3c2410/mci.h
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22.1/include/asm-arm/arch-s3c2410/mci.h 2007-07-19 00:27:45.859016308 +0200
-@@ -0,0 +1,12 @@
-+#ifndef _ARCH_MCI_H
-+#define _ARCH_MCI_H
-+
-+struct s3c24xx_mci_pdata {
-+ unsigned int gpio_detect;
-+ unsigned int gpio_wprotect;
-+ unsigned long ocr_avail;
-+ void (*set_power)(unsigned char power_mode,
-+ unsigned short vdd);
-+};
-+
-+#endif /* _ARCH_NCI_H */
Deleted: branches/src/target/kernel/2.6.24.x/patches/s3cmci-dma-free.patch
===================================================================
--- branches/src/target/kernel/2.6.24.x/patches/s3cmci-dma-free.patch 2007-12-18 11:18:15 UTC (rev 3675)
+++ branches/src/target/kernel/2.6.24.x/patches/s3cmci-dma-free.patch 2007-12-18 11:30:42 UTC (rev 3676)
@@ -1,10 +0,0 @@
---- linux-2.6.22.1.orig/drivers/mmc/host/s3cmci.c
-+++ linux-2.6.22.1/drivers/mmc/host/s3cmci.c
-@@ -1248,6 +1248,7 @@
- mmc_remove_host(mmc);
- clk_disable(host->clk);
- clk_put(host->clk);
-+ s3c2410_dma_free(S3CMCI_DMA, &s3cmci_dma_client);
- free_irq(host->irq_cd, host);
- free_irq(host->irq, host);
- iounmap(host->base);
Deleted: branches/src/target/kernel/2.6.24.x/patches/s3cmci-stop-fix.patch
===================================================================
--- branches/src/target/kernel/2.6.24.x/patches/s3cmci-stop-fix.patch 2007-12-18 11:18:15 UTC (rev 3675)
+++ branches/src/target/kernel/2.6.24.x/patches/s3cmci-stop-fix.patch 2007-12-18 11:30:42 UTC (rev 3676)
@@ -1,25 +0,0 @@
-This patch from Thomas Kleffel (the author of s3cmci) should fix our
-SD/MMC instability problems.
-
-Signed-off-by: Harald Welte <laforge at openmoko.org>
-
---- linux-2.6.22.1.orig/drivers/mmc/host/s3cmci.c
-+++ linux-2.6.22.1/drivers/mmc/host/s3cmci.c
-@@ -665,7 +665,7 @@
- #endif
- //Cleanup controller
- writel(0, host->base + S3C2410_SDICMDARG);
-- writel(0, host->base + S3C2410_SDIDCON);
-+ writel(S3C2410_SDIDCON_STOP, host->base + S3C2410_SDIDCON);
- writel(0, host->base + S3C2410_SDICMDCON);
- writel(0, host->base + host->sdiimsk);
-
-@@ -792,7 +792,7 @@
- dbg(host, dbg_err,
- "mci_setup_data() transfer stillin progress.\n");
-
-- writel(0, host->base + S3C2410_SDIDCON);
-+ writel(S3C2410_SDIDCON_STOP, host->base + S3C2410_SDIDCON);
- s3cmci_reset(host);
-
- if (0 == (stoptries--)) {
Deleted: branches/src/target/kernel/2.6.24.x/patches/s3cmci-unfinished-write-fix.patch
===================================================================
--- branches/src/target/kernel/2.6.24.x/patches/s3cmci-unfinished-write-fix.patch 2007-12-18 11:18:15 UTC (rev 3675)
+++ branches/src/target/kernel/2.6.24.x/patches/s3cmci-unfinished-write-fix.patch 2007-12-18 11:30:42 UTC (rev 3676)
@@ -1,24 +0,0 @@
-Index: linux-2.6.22.1/drivers/mmc/host/s3cmci.c
-===================================================================
---- linux-2.6.22.1.orig/drivers/mmc/host/s3cmci.c
-+++ linux-2.6.22.1/drivers/mmc/host/s3cmci.c
-@@ -318,6 +318,7 @@
- {
- struct s3cmci_host *host = (struct s3cmci_host *) data;
-
-+ disable_irq(host->irq);
-
- if (host->pio_active == XFER_WRITE)
- do_pio_write(host);
-@@ -336,9 +337,9 @@
- host->mrq->data->error = MMC_ERR_DMA;
- }
-
-- disable_irq(host->irq);
- finalize_request(host);
-- }
-+ } else
-+ enable_irq(host->irq);
- }
-
- /*
Deleted: branches/src/target/kernel/2.6.24.x/patches/s3cmci_dbg.patch
===================================================================
--- branches/src/target/kernel/2.6.24.x/patches/s3cmci_dbg.patch 2007-12-18 11:18:15 UTC (rev 3675)
+++ branches/src/target/kernel/2.6.24.x/patches/s3cmci_dbg.patch 2007-12-18 11:30:42 UTC (rev 3676)
@@ -1,26 +0,0 @@
-This patch is a workaround of some S3C2410 MMC chip bug
-
-Index: linux-2.6/drivers/mmc/host/s3cmci.c
-===================================================================
---- linux-2.6.orig/drivers/mmc/host/s3cmci.c
-+++ linux-2.6/drivers/mmc/host/s3cmci.c
-@@ -445,9 +445,16 @@
-
- if (mci_csta & S3C2410_SDICMDSTAT_CRCFAIL) {
- if (cmd->flags & MMC_RSP_CRC) {
-- cmd->error = -EILSEQ;
-- host->status = "error: bad command crc";
-- goto fail_transfer;
-+ if (host->mrq->cmd->flags & MMC_RSP_136) {
-+ dbg(host, dbg_irq,
-+ "fixup: ignore CRC fail with long rsp\n");
-+ } else {
-+#if 0
-+ cmd->error = -EILSEQ;
-+ host->status = "error: bad command crc";
-+ goto fail_transfer;
-+#endif
-+ }
- }
-
- mci_cclear |= S3C2410_SDICMDSTAT_CRCFAIL;
Modified: branches/src/target/kernel/2.6.24.x/patches/series
===================================================================
--- branches/src/target/kernel/2.6.24.x/patches/series 2007-12-18 11:18:15 UTC (rev 3675)
+++ branches/src/target/kernel/2.6.24.x/patches/series 2007-12-18 11:30:42 UTC (rev 3676)
@@ -28,11 +28,6 @@
# SD/MMC for S3C24xx
s3c_mci.patch
-s3cmci_dbg.patch
-s3cmci-dma-free.patch
-s3cmci-stop-fix.patch
-s3cmci-unfinished-write-fix.patch
-s3c_mci_platform.patch
s3c_mci-gta01.patch
qt2410-s3c_mci-pdata.patch
More information about the commitlog
mailing list