From patchwork Tue Aug 23 08:20:42 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Shashidhar Hiremath X-Patchwork-Id: 1087672 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter2.kernel.org (8.14.4/8.14.4) with ESMTP id p7N8KKZ4030333 for ; Tue, 23 Aug 2011 08:23:19 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754128Ab1HWIXS (ORCPT ); Tue, 23 Aug 2011 04:23:18 -0400 Received: from mail-iy0-f170.google.com ([209.85.210.170]:33515 "EHLO mail-iy0-f170.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752587Ab1HWIXR (ORCPT ); Tue, 23 Aug 2011 04:23:17 -0400 Received: by iye16 with SMTP id 16so11714688iye.1 for ; Tue, 23 Aug 2011 01:23:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=vayavyalabs.com; s=vayavyalabs; h=from:to:cc:subject:date:message-id:x-mailer; bh=p981LKk3m86hlGQHfnaBQ4J7fl/1Gio2oExr5KBZuN4=; b=WSfDd8N60OiXHbm9CrM1z9FVJ5+HTH4WZhRt283eNa1ghqgPVSmcIn1d0y/DBT5IRi nihlJvuuUAaNFi1Ko++yRFaQ3cgEFQLeJTs3Jnr77geBeOBQveHtuMlXOaKtKWQUlkxr 0c+cxx4ymS/AieCiTXhe2vHjHOKdZ+EdlDdXE= Received: by 10.231.9.1 with SMTP id j1mr7310046ibj.19.1314087796735; Tue, 23 Aug 2011 01:23:16 -0700 (PDT) Received: from localhost.localdomain ([122.166.13.141]) by mx.google.com with ESMTPS id a11sm3622118ibg.21.2011.08.23.01.23.12 (version=TLSv1/SSLv3 cipher=OTHER); Tue, 23 Aug 2011 01:23:16 -0700 (PDT) From: Shashidhar Hiremath To: Chris Ball , Will Newton , Jaehoon Chung , Kyungmin Park , Matt Fleming Cc: linux-mmc@vger.kernel.org, Shashidhar Hiremath Subject: [PATCH 1/1] mmc: Support of SDIO irq for dw_mmc Date: Tue, 23 Aug 2011 13:50:42 +0530 Message-Id: <1314087642-3450-1-git-send-email-shashidharh@vayavyalabs.com> X-Mailer: git-send-email 1.7.2.3 Sender: linux-mmc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-mmc@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.6 (demeter2.kernel.org [140.211.167.43]); Tue, 23 Aug 2011 08:23:19 +0000 (UTC) The Patch adds the support for SDIO interrupts for all slots. It includes enabling of SDIO interrupts through dw_mci_enable_sdio_irq and the handling of the slot specific interrupts in the Interrupt Service Routine. Signed-off-by: shashidhar Hiremath Acked-by: Will Newton --- drivers/mmc/host/dw_mmc.c | 37 +++++++++++++++++++++++++++++++++---- drivers/mmc/host/dw_mmc.h | 2 +- 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c index 66dcddb..00f207a 100644 --- a/drivers/mmc/host/dw_mmc.c +++ b/drivers/mmc/host/dw_mmc.c @@ -746,11 +746,31 @@ static int dw_mci_get_cd(struct mmc_host *mmc) return present; } +static void dw_mci_enable_sdio_irq(struct mmc_host *mmc, int enb) +{ + struct dw_mci_slot *slot = mmc_priv(mmc); + struct dw_mci *host = slot->host; + u32 int_mask; + + /* Enable/disable Slot Specific SDIO interrupt */ + int_mask = mci_readl(host, INTMASK); + if (enb) { + /* Dont disturb the Non-SDIO Interrupts */ + int_mask &= 0xFFFF; + mci_writel(host, INTMASK, (int_mask | (1 << (slot->id + 16)))); + } else { + /* Dont disturb the SDIO Interrupts */ + int_mask &= 0xFFFF0000; + mci_writel(host, INTMASK, (0 << (slot->id + 16))); + } +} + static const struct mmc_host_ops dw_mci_ops = { - .request = dw_mci_request, - .set_ios = dw_mci_set_ios, - .get_ro = dw_mci_get_ro, - .get_cd = dw_mci_get_cd, + .request = dw_mci_request, + .set_ios = dw_mci_set_ios, + .get_ro = dw_mci_get_ro, + .get_cd = dw_mci_get_cd, + .enable_sdio_irq = dw_mci_enable_sdio_irq, }; static void dw_mci_request_end(struct dw_mci *host, struct mmc_request *mrq) @@ -1179,6 +1199,7 @@ static irqreturn_t dw_mci_interrupt(int irq, void *dev_id) struct dw_mci *host = dev_id; u32 status, pending; unsigned int pass_count = 0; + int i; do { status = mci_readl(host, RINTSTS); @@ -1249,6 +1270,14 @@ static irqreturn_t dw_mci_interrupt(int irq, void *dev_id) tasklet_schedule(&host->card_tasklet); } + /* Handle SDIO Interrupts */ + for (i = 0; i < host->num_slots; i++) { + struct dw_mci_slot *slot = host->slot[i]; + if (pending & SDMMC_INT_SDIO(i)) { + mci_writel(host, RINTSTS, SDMMC_INT_SDIO(i)); + mmc_signal_sdio_irq(slot->mmc); + } + } } while (pass_count++ < 5); #ifdef CONFIG_MMC_DW_IDMAC diff --git a/drivers/mmc/host/dw_mmc.h b/drivers/mmc/host/dw_mmc.h index 23c662a..ecf1043 100644 --- a/drivers/mmc/host/dw_mmc.h +++ b/drivers/mmc/host/dw_mmc.h @@ -82,7 +82,7 @@ #define SDMMC_CTYPE_4BIT BIT(0) #define SDMMC_CTYPE_1BIT 0 /* Interrupt status & mask register defines */ -#define SDMMC_INT_SDIO BIT(16) +#define SDMMC_INT_SDIO(n) BIT((16 + (n))) #define SDMMC_INT_EBE BIT(15) #define SDMMC_INT_ACD BIT(14) #define SDMMC_INT_SBE BIT(13)