r4726 - developers/werner/wlan-spi/patches-tracking

werner at docs.openmoko.org werner at docs.openmoko.org
Mon Oct 20 16:52:58 CEST 2008


Author: werner
Date: 2008-10-20 16:52:57 +0200 (Mon, 20 Oct 2008)
New Revision: 4726

Added:
   developers/werner/wlan-spi/patches-tracking/s3c-mmc-hdrmig-fix.patch
   developers/werner/wlan-spi/patches-tracking/s3c-mmc-sdio-int.patch
Modified:
   developers/werner/wlan-spi/patches-tracking/hif-linux-sdio.patch
   developers/werner/wlan-spi/patches-tracking/series
Log:
Moving towards the use of SDIO interrupts instead of polling.

- s3c-mmc-sdio-int.patch: Christer Weinigel's SDIO interrupt changes (doesn't
  work yet)
- s3c-mmc-hdrmig-fix.patch: build fixes for recent header migration
- hif-linux-sdio.patch: removed bus width change, which is done in the stack
- series: added s3c-mmc-sdio-int.patch and s3c-mmc-hdrmig-fix.patch



Modified: developers/werner/wlan-spi/patches-tracking/hif-linux-sdio.patch
===================================================================
--- developers/werner/wlan-spi/patches-tracking/hif-linux-sdio.patch	2008-10-20 08:21:08 UTC (rev 4725)
+++ developers/werner/wlan-spi/patches-tracking/hif-linux-sdio.patch	2008-10-20 14:52:57 UTC (rev 4726)
@@ -25,8 +25,8 @@
 Index: ktrack/drivers/ar6000/hif/hif2.c
 ===================================================================
 --- /dev/null	1970-01-01 00:00:00.000000000 +0000
-+++ ktrack/drivers/ar6000/hif/hif2.c	2008-10-15 22:32:07.000000000 -0200
-@@ -0,0 +1,633 @@
++++ ktrack/drivers/ar6000/hif/hif2.c	2008-10-17 04:26:14.000000000 -0200
+@@ -0,0 +1,625 @@
 +/*
 + * hif2.c - HIF layer re-implementation for the Linux SDIO stack
 + *
@@ -555,15 +555,7 @@
 +		dev_err(dev, "sdio_claim_irq returns %d\n", ret);
 +		/* @@@ cleanup */
 +	}
-+#if 0 /* only for hw SDIO */
-+	sdio_f0_writeb(func, SDIO_BUS_CD_DISABLE | SDIO_BUS_WIDTH_4BIT,
-+	    SDIO_CCCR_IF, &ret);
-+	if (ret) {
-+		dev_err(dev, "sdio_f0_writeb(SDIO_CCCR_IF) returns %d\n",
-+		    ret);
-+		/* @@@ cleanup */
-+	}
-+#endif
++	/* Set SDIO_BUS_CD_DISABLE in SDIO_CCCR_IF ? */
 +#if 0
 +	sdio_f0_writeb(func, SDIO_CCCR_CAP_E4MI, SDIO_CCCR_CAPS, &ret);
 +	if (ret) {

Added: developers/werner/wlan-spi/patches-tracking/s3c-mmc-hdrmig-fix.patch
===================================================================
--- developers/werner/wlan-spi/patches-tracking/s3c-mmc-hdrmig-fix.patch	                        (rev 0)
+++ developers/werner/wlan-spi/patches-tracking/s3c-mmc-hdrmig-fix.patch	2008-10-20 14:52:57 UTC (rev 4726)
@@ -0,0 +1,18 @@
+Build fix after header migration. Drop when we catch it from upstream.
+
+Index: ktrack/drivers/mmc/host/s3cmci.c
+===================================================================
+--- ktrack.orig/drivers/mmc/host/s3cmci.c	2008-10-17 05:58:11.000000000 -0200
++++ ktrack/drivers/mmc/host/s3cmci.c	2008-10-17 05:59:45.000000000 -0200
+@@ -28,9 +28,9 @@
+ #include <asm/dma-mapping.h>
+ 
+ #include <asm/io.h>
+-#include <asm/arch/regs-sdi.h>
++#include <asm/arch-s3c2410/regs-sdi.h>
+ #include <mach/regs-gpio.h>
+-#include <asm/arch/mci.h>
++#include <asm/arch-s3c2410/mci.h>
+ #include <mach/dma.h>
+ 
+ #include "s3cmci.h"

Added: developers/werner/wlan-spi/patches-tracking/s3c-mmc-sdio-int.patch
===================================================================
--- developers/werner/wlan-spi/patches-tracking/s3c-mmc-sdio-int.patch	                        (rev 0)
+++ developers/werner/wlan-spi/patches-tracking/s3c-mmc-sdio-int.patch	2008-10-20 14:52:57 UTC (rev 4726)
@@ -0,0 +1,189 @@
+http://thread.gmane.org/gmane.linux.ports.arm.kernel/46380
+
+Christer Weinigel wrote:
+> Now I just have to make the SDIO interrupt work and preferably get
+> DMA working so that I can reduce the CPU load a bit.
+
+Ok, this makes the SDIO interrupt work.  The existing driver disables
+interrupts when not doing anything because it had problems with spurious
+  interrupts even when the interrupt mask was clear.  So I've added some
+hacks to always keep the interrupts on.  This needs doing better, so
+I've not signed off on this, and the patch is whitespace-damaged just so
+that nobody tries to apply it anyway (good excuse using the wrong
+mailer, isn't it).
+
+But do you think the interrupt support looks sane otherwise?
+
+    /Christer
+
+Index: ktrack/drivers/mmc/host/s3cmci.c
+===================================================================
+--- ktrack.orig/drivers/mmc/host/s3cmci.c	2008-10-17 05:32:34.000000000 -0200
++++ ktrack/drivers/mmc/host/s3cmci.c	2008-10-17 05:46:43.000000000 -0200
+@@ -195,7 +195,11 @@
+ 
+ static inline void clear_imask(struct s3cmci_host *host)
+ {
+-	writel(0, host->base + host->sdiimsk);
++	u32 newmask;
++
++	newmask = readl(host->base + host->sdiimsk);
++	newmask &= S3C2410_SDIIMSK_SDIOIRQ;
++	writel(newmask, host->base + host->sdiimsk);
+ }
+ 
+ static inline int get_data_buffer(struct s3cmci_host *host,
+@@ -347,6 +351,7 @@
+ 	struct s3cmci_host *host = (struct s3cmci_host *) data;
+ 
+ 	disable_irq(host->irq);
++	host->irq_disabled++;
+ 
+ 	if (host->pio_active == XFER_WRITE)
+ 		do_pio_write(host);
+@@ -367,8 +372,12 @@
+ 		}
+ 
+ 		finalize_request(host);
+-	} else
++	}
++
++	if (host->irq_disabled) {
+ 		enable_irq(host->irq);
++		host->irq_disabled--;
++	}
+ }
+ 
+ /*
+@@ -405,6 +414,7 @@
+ 	u32 mci_csta, mci_dsta, mci_fsta, mci_dcnt, mci_imsk;
+ 	u32 mci_cclear, mci_dclear;
+ 	unsigned long iflags;
++	int cardint = 0;
+ 
+ 	spin_lock_irqsave(&host->complete_lock, iflags);
+ 
+@@ -416,6 +426,13 @@
+ 	mci_cclear = 0;
+ 	mci_dclear = 0;
+ 
++	if (mci_dsta & S3C2410_SDIDSTA_SDIOIRQDETECT &&
++	    mci_imsk & S3C2410_SDIIMSK_SDIOIRQ) {
++		cardint = 1;
++		mci_dclear = S3C2410_SDIDSTA_SDIOIRQDETECT;
++		goto clear_status_bits;
++	}
++
+ 	if ((host->complete_what == COMPLETION_NONE) ||
+ 	    (host->complete_what == COMPLETION_FINALIZE)) {
+ 		host->status = "nothing to complete";
+@@ -585,6 +602,11 @@
+ 	    mci_csta, mci_dsta, mci_fsta, mci_dcnt, host->status);
+ 
+ 	spin_unlock_irqrestore(&host->complete_lock, iflags);
++
++	/* We have to delay this as it calls back into the driver. */
++	if (cardint)
++		mmc_signal_sdio_irq(host->mmc);
++
+ 	return IRQ_HANDLED;
+ }
+ 
+@@ -653,7 +675,7 @@
+ fail_request:
+ 	host->mrq->data->error = -EINVAL;
+ 	host->complete_what = COMPLETION_FINALIZE;
+-	writel(0, host->base + host->sdiimsk);
++	clear_imask(host);
+ 	goto out;
+ 
+ }
+@@ -698,7 +720,7 @@
+ 	writel(0, host->base + S3C2410_SDICMDARG);
+ 	writel(S3C2410_SDIDCON_STOP, host->base + S3C2410_SDIDCON);
+ 	writel(0, host->base + S3C2410_SDICMDCON);
+-	writel(0, host->base + host->sdiimsk);
++	clear_imask(host);
+ 
+ 	if (cmd->data && cmd->error)
+ 		cmd->data->error = cmd->error;
+@@ -1010,7 +1032,10 @@
+ 	s3cmci_send_command(host, cmd);
+ 
+ 	/* Enable Interrupt */
+-	enable_irq(host->irq);
++	if (host->irq_disabled) {
++		enable_irq(host->irq);
++		host->irq_disabled--;
++	}
+ }
+ 
+ static int s3cmci_card_present(struct mmc_host *mmc)
+@@ -1103,9 +1128,9 @@
+ 
+ 	/* Set CLOCK_ENABLE */
+ 	if (ios->clock)
+-		mci_con |= S3C2410_SDICON_CLOCKTYPE;
++		mci_con |= S3C2410_SDICON_CLOCKTYPE | S3C2410_SDICON_SDIOIRQ;
+ 	else
+-		mci_con &= ~S3C2410_SDICON_CLOCKTYPE;
++		mci_con &= ~(S3C2410_SDICON_CLOCKTYPE | S3C2410_SDICON_SDIOIRQ);
+ 
+ 	writel(mci_con, host->base + S3C2410_SDICON);
+ 
+@@ -1145,11 +1170,27 @@
+ 	return ret;
+ }
+ 
++static void s3cmci_enable_sdio_irq(struct mmc_host *mmc, int enable)
++{
++	struct s3cmci_host *host = mmc_priv(mmc);
++	unsigned long flags;
++
++	spin_lock_irqsave(&host->complete_lock, flags);
++
++	if (enable)
++		enable_imask(host, S3C2410_SDIIMSK_SDIOIRQ);
++	else
++		disable_imask(host, S3C2410_SDIIMSK_SDIOIRQ);
++
++	spin_unlock_irqrestore(&host->complete_lock, flags);
++}
++
+ static struct mmc_host_ops s3cmci_ops = {
+ 	.request	= s3cmci_request,
+ 	.set_ios	= s3cmci_set_ios,
+ 	.get_ro		= s3cmci_get_ro,
+ 	.get_cd		= s3cmci_card_present,
++	.enable_sdio_irq = s3cmci_enable_sdio_irq,
+ };
+ 
+ static struct s3c24xx_mci_pdata s3cmci_def_pdata = {
+@@ -1242,6 +1283,7 @@
+ 	 * ensure we don't lock the system with un-serviceable requests. */
+ 
+ 	disable_irq(host->irq);
++	host->irq_disabled++;
+ 
+ 	host->irq_cd = s3c2410_gpio_getirq(host->pdata->gpio_detect);
+ 
+@@ -1287,7 +1329,7 @@
+ 
+ 	mmc->ops 	= &s3cmci_ops;
+ 	mmc->ocr_avail	= MMC_VDD_32_33 | MMC_VDD_33_34;
+-	mmc->caps	= MMC_CAP_4_BIT_DATA;
++	mmc->caps	= MMC_CAP_4_BIT_DATA | MMC_CAP_SDIO_IRQ;
+ 	mmc->f_min 	= host->clk_rate / (host->clk_div * 256);
+ 	mmc->f_max 	= host->clk_rate / host->clk_div;
+ 
+Index: ktrack/drivers/mmc/host/s3cmci.h
+===================================================================
+--- ktrack.orig/drivers/mmc/host/s3cmci.h	2008-10-17 05:46:53.000000000 -0200
++++ ktrack/drivers/mmc/host/s3cmci.h	2008-10-17 05:47:06.000000000 -0200
+@@ -67,4 +67,6 @@
+ 
+ 	unsigned int		ccnt, dcnt;
+ 	struct tasklet_struct	pio_tasklet;
++
++	int			irq_disabled;
+ };

Modified: developers/werner/wlan-spi/patches-tracking/series
===================================================================
--- developers/werner/wlan-spi/patches-tracking/series	2008-10-20 08:21:08 UTC (rev 4725)
+++ developers/werner/wlan-spi/patches-tracking/series	2008-10-20 14:52:57 UTC (rev 4726)
@@ -1,5 +1,5 @@
 #
-# This patch stack if for the Openmoko stable-tracking branch. Before applying
+# This patch stack is for the Openmoko stable-tracking branch. Before applying
 # the patches, you need to remove the Atheros SDIO stack as follows:
 #
 # cd drivers
@@ -24,3 +24,5 @@
 #hack-dont-poll-irq.patch 
 #hif-direct-interrupt.patch
 #hif-can-do-async.patch
+s3c-mmc-hdrmig-fix.patch
+s3c-mmc-sdio-int.patch




More information about the commitlog mailing list