Hi David,

David Vrabel wrote:
These patches add support for SDIO cards to the omap_hsmmc driver.
Power management changes to prevent SDIO cards from being turned off
and losing all state, and card interrupts.

I've tested your patches with libertas_sdio and after several small
additions I've made it work.

 drivers/mmc/host/omap_hsmmc.c |   19 +++++++++++++------
 1 files changed, 13 insertions(+), 6 deletions(-)

diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
index 53fa85d..6ed71b7 100644
--- a/drivers/mmc/host/omap_hsmmc.c
+++ b/drivers/mmc/host/omap_hsmmc.c
@@ -82,6 +82,7 @@
 #define BWR_ENABLE             (1 << 4)
 #define BRR_ENABLE             (1 << 5)
 #define CTPL                   (1 << 11)
+#define CLKEXTFREE             (1 << 16)
 #define INIT_STREAM            (1 << 1)
 #define DP_SELECT              (1 << 21)
 #define DDIR                   (1 << 4)
@@ -189,6 +190,7 @@ struct omap_hsmmc_host {
        int                     protect_card;
        int                     reqs_blocked;
        int                     use_reg;
+       int                     sdio_int;

        struct  omap_mmc_platform_data  *pdata;
 };
@@ -763,16 +765,19 @@ omap_hsmmc_start_command(struct omap_hsmmc_host *host, 
struct mmc_command *cmd,
        struct mmc_data *data)
 {
        int cmdreg = 0, resptype = 0, cmdtype = 0;
+       int int_en_mask = INT_EN_MASK;

        dev_dbg(mmc_dev(host->mmc), "%s: CMD%d, argument 0x%08x\n",
                mmc_hostname(host->mmc), cmd->opcode, cmd->arg);
        host->cmd = cmd;

        if (host->use_dma)
-               OMAP_HSMMC_WRITE(host->base, IE,
-                                INT_EN_MASK & ~(BRR_ENABLE | BWR_ENABLE));
-       else
-               OMAP_HSMMC_WRITE(host->base, IE, INT_EN_MASK);
+               int_en_mask &= ~(BRR_ENABLE | BWR_ENABLE);
+
+       if (host->sdio_int)
+               int_en_mask |= CIRQ;
+
+       OMAP_HSMMC_WRITE(host->base, IE, int_en_mask);

        host->response_busy = 0;
        if (cmd->flags & MMC_RSP_PRESENT) {
@@ -1619,10 +1624,12 @@ static void omap_hsmmc_enable_sdio_irq(struct mmc_host 
*mmc, int enable)
        if (enable) {
                clk_enable(host->fclk);
                ie |= CIRQ_ENABLE;
-               con |= CTPL;
+               con |= CTPL | CLKEXTFREE;
+               host->sdio_int = 1;
        } else {
                ie &= ~CIRQ_ENABLE;
-               con &= ~CTPL;
+               con &= ~(CTPL | CLKEXTFREE);
+               host->sdio_int = 0;
        }
        OMAP_HSMMC_WRITE(host->base, CON, con);
        OMAP_HSMMC_WRITE(host->base, IE, ie);
--
1.6.4.4


I've been unable to test these exact patches as I only have an N900 for testing and the N900 support in mainline is incomplete.

Changes since v1:
- (hopefully) get all cards working again by removing a second call to
  read MMCi_STAT in the interrupt handler.
- flush posted writes after enabling/disabling SDIO interrupts.
- tweak the FIXME commit on disabling FCLK to better match what really
  going on (at least I think so anyway).

David Vrabel (2):
  mmc: omap_hsmmc: don't turn SDIO cards off when idle
  mmc: omap_hsmmc: enable SDIO card interrupts

 drivers/mmc/host/omap_hsmmc.c |  114 ++++++++++++++++++++++++++++-------------
 1 files changed, 79 insertions(+), 35 deletions(-)

--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


--
Sincerely yours,
Mike.

--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to