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