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