All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v14 0/6] mmc: omap_hsmmc: Enable SDIO IRQ
@ 2014-05-29  8:27 Andreas Fenkart
  2014-05-29  8:28 ` [PATCH v14 1/6] mmc: omap_hsmmc: Enable SDIO interrupt Andreas Fenkart
                   ` (6 more replies)
  0 siblings, 7 replies; 17+ messages in thread
From: Andreas Fenkart @ 2014-05-29  8:27 UTC (permalink / raw)
  To: Tony Lindgren
  Cc: Chris Ball, Grant Likely, Felipe Balbi, Balaji T K,
	Andreas Mueller, Sebastian Reichel, zonque, galak, linux-doc,
	linux-mmc, linux-omap, Andreas Fenkart

Hi Balaji, Tony, Ulf, all

v14
- drop all ifdef/endif introduced by v13
-- rely on pinctrl_lookup_state to prevent ifdef CONFIG_PM
-- benefit: all code is compile tested no matter the configuration
-- drawback: require wake_irq/pinctrl configuration even when
   runtime suspend is not configured
- drop runtime state from debugfs output
- rebased onto current mmc-next 06732b84b4cf

v13
- fix compile breaks if !CONFIG_PM
- additional patch: install dummy pm runtime hooks if !CONFIG_PM_RUNTIME

v12
- drop !CONFIG_OF compile break only exists when
  #undef CONFIG_OF after include headers 1/7(Sebastian Reichel)
- do not emit "falling back to polling" if wake_irq not specified
  since MMC does not need it, and it might confuse users
  only emit if pinmux default/idle is not present or claiming
  the irq failed 2/7(Balaji)
- dropped out-of-tree patches 6/7(Balaji)
- mention "ti,am33xx-hsmmc" compatible section in bindings
  documentation 1/5

v11
- split !CONFIG_OF compile break into separate patch
- enable IWE/CLKEXTFREE in CON/HCTL register needed for omap4
- '&' vs '&&' in omap_hsmmc_resume, 1/5 (Andreas Müller)
- #define DLEV_DAT instead of BIT(21) 2/5 (Balaji)
- pinctrl_pm_select_default_state() removed, 4/5 (Balaji)
- drop _irqsave/_irqrestore from omap_hsmmc_wake_irq handler since it
  can't be preempted by same priority omap_hsmmc_irq handler 1/5(Joel Fernandes)
- replace devres_open_group by explicit devm_free calls 1/5 (Balaji)
- disable_irq_nosync wake_irq since we handle it thread safe 1/5 (Balaji)
- drop 'gpio_dat1' pinctrl states and rework documentation 5/5 (Balaji)

v10
- bug fix on multi-core, untested
- incorporated changes from Balaji
- use devres / RAII mechanism to configure wake_up /
  sdio irq capabilities
- drop pinctrl state 'active'
  rely on driver-model states 'default', 'idle'
- add specific 'gpio_dat1' state for am335x SWAKEUP hack
- reorganized patches; +1 patch multi-core bugfix / +1 for pinctrl
- rebased 455c6fdbd21916 / cherry-picks from mmc-next

v9
- extended comment about why wake-irq is needed
- drop double '(' ')' around card_detect_irq
- drop final '.' in in subject line of patch

v8
- rebased on top of Tony Lindgren<tony@atomide.com> changes
  - improved changelog describing the earlier work
  - improved wakeup irq setup
  - works for am3730 es platform now
- my changes on top:
  - compile tested with #undef CONFIG_OF
  - disable wake_irq in handler to prevent infinite loop  
  - fixed typo and added comment about wake-irq

v7
- rebase on 3.14.0-rc3-49726-g77e15ec
- split omap_hsmmc_pin_init due to regression on omap-3730 platform

v6
- rebase on Linux 3.13-rc3
- reformatting debugfs

v5
- fix compile error introduced by last minute one line fix

v4:
- switch to interrupts-extended format
- drop ti,swakeup-missing flag convert to comaptible section

v3:
- removed gpio_irq from platform_data

v2:
- incorparated changes as suggested by reviewers
- simplified workaround for am335x, gpio will now only wake
  the module from runtime suspend, not handle the sdio irq
  itself 

Andreas Fenkart (6):
  mmc: omap_hsmmc: Enable SDIO interrupt
  mmc: omap_hsmmc: Extend debugfs by SDIO IRQ handling, runtime state
  mmc: omap_hsmmc: enable wakeup event for sdio OMAP4
  mmc: omap_hsmmc: abort runtime suspend if pending sdio irq detected
  mmc: omap_hsmmc: switch default/idle pinctrl states in runtime hooks
  mmc: omap_hsmmc: Pin remux workaround to support SDIO interrupt on
    AM335x

 .../devicetree/bindings/mmc/ti-omap-hsmmc.txt      |   54 ++++
 drivers/mmc/host/omap_hsmmc.c                      |  283 ++++++++++++++++++--
 include/linux/platform_data/mmc-omap.h             |    1 +
 3 files changed, 317 insertions(+), 21 deletions(-)

-- 
1.7.10.4

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

^ permalink raw reply	[flat|nested] 17+ messages in thread

* [PATCH v14 1/6] mmc: omap_hsmmc: Enable SDIO interrupt
  2014-05-29  8:27 [PATCH v14 0/6] mmc: omap_hsmmc: Enable SDIO IRQ Andreas Fenkart
@ 2014-05-29  8:28 ` Andreas Fenkart
  2014-08-24  8:26   ` Florian Vaussard
  2014-05-29  8:28 ` [PATCH v14 2/6] mmc: omap_hsmmc: Extend debugfs by SDIO IRQ handling, runtime state Andreas Fenkart
                   ` (5 subsequent siblings)
  6 siblings, 1 reply; 17+ messages in thread
From: Andreas Fenkart @ 2014-05-29  8:28 UTC (permalink / raw)
  To: Tony Lindgren
  Cc: Chris Ball, Grant Likely, Felipe Balbi, Balaji T K,
	Andreas Mueller, Sebastian Reichel, zonque, galak, linux-doc,
	linux-mmc, linux-omap, Andreas Fenkart

There have been various patches floating around for enabling
the SDIO IRQ for hsmmc, but none of them ever got merged.

Probably the reason for not merging the SDIO interrupt patches
has been the lack of wake-up path for SDIO on some omaps that
has also needed remuxing the SDIO DAT1 line to a GPIO making
the patches complex.

This patch adds the minimal SDIO IRQ support to hsmmc for
omaps that do have the wake-up path. For those omaps, the
DAT1 line need to have the wake-up enable bit set, and the
wake-up interrupt is the same as for the MMC controller.

This patch has been tested on am3730 es1.2 with mwifiex
connected to MMC3 with mwifiex waking to Ethernet traffic
from off-idle mode. Note that for omaps that do not have
the SDIO wake-up path, this patch will not work for idle
modes and further patches for remuxing DAT1 to GPIO are
needed.

Based on earlier patches [1][2] by David Vrabel
<david.vrabel@csr.com>, Steve Sakoman <steve@sakoman.com>

For now, only support SDIO interrupt if we are booted with
a separate wake-irq configued via device tree. This is
because omaps need the wake-irq for idle states, and some
omaps need special quirks. And we don't want to add new
legacy mux platform init code callbacks any longer as we
are moving to DT based booting anyways.

To use it, you need to specify the wake-irq using the
interrupts-extended property.

[1] http://www.sakoman.com/cgi-bin/gitweb.cgi?p=linux.git;a=commitdiff_plain;h=010810d22f6f49ac03da4ba384969432e0320453
[2] http://comments.gmane.org/gmane.linux.kernel.mmc/20446

Acked-by: Balaji T K <balajitk@ti.com>
Signed-off-by: Andreas Fenkart <afenkart@gmail.com>
Signed-off-by: Tony Lindgren <tony@atomide.com>

diff --git a/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt b/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt
index ce80561..0233ba7 100644
--- a/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt
+++ b/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt
@@ -12,6 +12,7 @@ Required properties:
  Should be "ti,omap3-hsmmc", for OMAP3 controllers
  Should be "ti,omap3-pre-es3-hsmmc" for OMAP3 controllers pre ES3.0
  Should be "ti,omap4-hsmmc", for OMAP4 controllers
+ Should be "ti,am33xx-hsmmc", for AM335x controllers
 - ti,hwmods: Must be "mmc<n>", n is controller instance starting 1
 
 Optional properties:
diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
index 6b6fe1e..129569d 100644
--- a/drivers/mmc/host/omap_hsmmc.c
+++ b/drivers/mmc/host/omap_hsmmc.c
@@ -29,6 +29,7 @@
 #include <linux/timer.h>
 #include <linux/clk.h>
 #include <linux/of.h>
+#include <linux/of_irq.h>
 #include <linux/of_gpio.h>
 #include <linux/of_device.h>
 #include <linux/omap-dmaengine.h>
@@ -36,6 +37,7 @@
 #include <linux/mmc/core.h>
 #include <linux/mmc/mmc.h>
 #include <linux/io.h>
+#include <linux/irq.h>
 #include <linux/gpio.h>
 #include <linux/regulator/consumer.h>
 #include <linux/pinctrl/consumer.h>
@@ -106,6 +108,7 @@
 #define TC_EN			(1 << 1)
 #define BWR_EN			(1 << 4)
 #define BRR_EN			(1 << 5)
+#define CIRQ_EN			(1 << 8)
 #define ERR_EN			(1 << 15)
 #define CTO_EN			(1 << 16)
 #define CCRC_EN			(1 << 17)
@@ -140,7 +143,6 @@
 #define VDD_3V0			3000000		/* 300000 uV */
 #define VDD_165_195		(ffs(MMC_VDD_165_195) - 1)
 
-#define AUTO_CMD23		(1 << 1)	/* Auto CMD23 support */
 /*
  * One controller can have multiple slots, like on some omap boards using
  * omap.c controller driver. Luckily this is not currently done on any known
@@ -194,6 +196,7 @@ struct omap_hsmmc_host {
 	u32			sysctl;
 	u32			capa;
 	int			irq;
+	int			wake_irq;
 	int			use_dma, dma_ch;
 	struct dma_chan		*tx_chan;
 	struct dma_chan		*rx_chan;
@@ -206,6 +209,9 @@ struct omap_hsmmc_host {
 	int			req_in_progress;
 	unsigned long		clk_rate;
 	unsigned int		flags;
+#define AUTO_CMD23		(1 << 0)        /* Auto CMD23 support */
+#define HSMMC_SDIO_IRQ_ENABLED	(1 << 1)        /* SDIO irq enabled */
+#define HSMMC_WAKE_IRQ_ENABLED	(1 << 2)
 	struct omap_hsmmc_next	next_data;
 	struct	omap_mmc_platform_data	*pdata;
 };
@@ -510,27 +516,40 @@ static void omap_hsmmc_stop_clock(struct omap_hsmmc_host *host)
 static void omap_hsmmc_enable_irq(struct omap_hsmmc_host *host,
 				  struct mmc_command *cmd)
 {
-	unsigned int irq_mask;
+	u32 irq_mask = INT_EN_MASK;
+	unsigned long flags;
 
 	if (host->use_dma)
-		irq_mask = INT_EN_MASK & ~(BRR_EN | BWR_EN);
-	else
-		irq_mask = INT_EN_MASK;
+		irq_mask &= ~(BRR_EN | BWR_EN);
 
 	/* Disable timeout for erases */
 	if (cmd->opcode == MMC_ERASE)
 		irq_mask &= ~DTO_EN;
 
+	spin_lock_irqsave(&host->irq_lock, flags);
 	OMAP_HSMMC_WRITE(host->base, STAT, STAT_CLEAR);
 	OMAP_HSMMC_WRITE(host->base, ISE, irq_mask);
+
+	/* latch pending CIRQ, but don't signal MMC core */
+	if (host->flags & HSMMC_SDIO_IRQ_ENABLED)
+		irq_mask |= CIRQ_EN;
 	OMAP_HSMMC_WRITE(host->base, IE, irq_mask);
+	spin_unlock_irqrestore(&host->irq_lock, flags);
 }
 
 static void omap_hsmmc_disable_irq(struct omap_hsmmc_host *host)
 {
-	OMAP_HSMMC_WRITE(host->base, ISE, 0);
-	OMAP_HSMMC_WRITE(host->base, IE, 0);
+	u32 irq_mask = 0;
+	unsigned long flags;
+
+	spin_lock_irqsave(&host->irq_lock, flags);
+	/* no transfer running but need to keep cirq if enabled */
+	if (host->flags & HSMMC_SDIO_IRQ_ENABLED)
+		irq_mask |= CIRQ_EN;
+	OMAP_HSMMC_WRITE(host->base, ISE, irq_mask);
+	OMAP_HSMMC_WRITE(host->base, IE, irq_mask);
 	OMAP_HSMMC_WRITE(host->base, STAT, STAT_CLEAR);
+	spin_unlock_irqrestore(&host->irq_lock, flags);
 }
 
 /* Calculate divisor for the given clock frequency */
@@ -681,7 +700,9 @@ static int omap_hsmmc_context_restore(struct omap_hsmmc_host *host)
 		&& time_before(jiffies, timeout))
 		;
 
-	omap_hsmmc_disable_irq(host);
+	OMAP_HSMMC_WRITE(host->base, ISE, 0);
+	OMAP_HSMMC_WRITE(host->base, IE, 0);
+	OMAP_HSMMC_WRITE(host->base, STAT, STAT_CLEAR);
 
 	/* Do not initialize card-specific things if the power is off */
 	if (host->power_mode == MMC_POWER_OFF)
@@ -1118,8 +1139,12 @@ static irqreturn_t omap_hsmmc_irq(int irq, void *dev_id)
 	int status;
 
 	status = OMAP_HSMMC_READ(host->base, STAT);
-	while (status & INT_EN_MASK && host->req_in_progress) {
-		omap_hsmmc_do_irq(host, status);
+	while (status & (INT_EN_MASK | CIRQ_EN)) {
+		if (host->req_in_progress)
+			omap_hsmmc_do_irq(host, status);
+
+		if (status & CIRQ_EN)
+			mmc_signal_sdio_irq(host->mmc);
 
 		/* Flush posted write */
 		status = OMAP_HSMMC_READ(host->base, STAT);
@@ -1128,6 +1153,22 @@ static irqreturn_t omap_hsmmc_irq(int irq, void *dev_id)
 	return IRQ_HANDLED;
 }
 
+static irqreturn_t omap_hsmmc_wake_irq(int irq, void *dev_id)
+{
+	struct omap_hsmmc_host *host = dev_id;
+
+	/* cirq is level triggered, disable to avoid infinite loop */
+	spin_lock(&host->irq_lock);
+	if (host->flags & HSMMC_WAKE_IRQ_ENABLED) {
+		disable_irq_nosync(host->wake_irq);
+		host->flags &= ~HSMMC_WAKE_IRQ_ENABLED;
+	}
+	spin_unlock(&host->irq_lock);
+	pm_request_resume(host->dev); /* no use counter */
+
+	return IRQ_HANDLED;
+}
+
 static void set_sd_bus_power(struct omap_hsmmc_host *host)
 {
 	unsigned long i;
@@ -1639,6 +1680,79 @@ static void omap_hsmmc_init_card(struct mmc_host *mmc, struct mmc_card *card)
 		mmc_slot(host).init_card(card);
 }
 
+static void omap_hsmmc_enable_sdio_irq(struct mmc_host *mmc, int enable)
+{
+	struct omap_hsmmc_host *host = mmc_priv(mmc);
+	u32 irq_mask;
+	unsigned long flags;
+
+	spin_lock_irqsave(&host->irq_lock, flags);
+
+	irq_mask = OMAP_HSMMC_READ(host->base, ISE);
+	if (enable) {
+		host->flags |= HSMMC_SDIO_IRQ_ENABLED;
+		irq_mask |= CIRQ_EN;
+	} else {
+		host->flags &= ~HSMMC_SDIO_IRQ_ENABLED;
+		irq_mask &= ~CIRQ_EN;
+	}
+	OMAP_HSMMC_WRITE(host->base, IE, irq_mask);
+
+	/*
+	 * if enable, piggy back detection on current request
+	 * but always disable immediately
+	 */
+	if (!host->req_in_progress || !enable)
+		OMAP_HSMMC_WRITE(host->base, ISE, irq_mask);
+
+	/* flush posted write */
+	OMAP_HSMMC_READ(host->base, IE);
+
+	spin_unlock_irqrestore(&host->irq_lock, flags);
+}
+
+static int omap_hsmmc_configure_wake_irq(struct omap_hsmmc_host *host)
+{
+	struct mmc_host *mmc = host->mmc;
+	int ret;
+
+	/*
+	 * For omaps with wake-up path, wakeirq will be irq from pinctrl and
+	 * for other omaps, wakeirq will be from GPIO (dat line remuxed to
+	 * gpio). wakeirq is needed to detect sdio irq in runtime suspend state
+	 * with functional clock disabled.
+	 */
+	if (!host->dev->of_node || !host->wake_irq)
+		return -ENODEV;
+
+	/* Prevent auto-enabling of IRQ */
+	irq_set_status_flags(host->wake_irq, IRQ_NOAUTOEN);
+	ret = devm_request_irq(host->dev, host->wake_irq, omap_hsmmc_wake_irq,
+			       IRQF_TRIGGER_LOW | IRQF_ONESHOT,
+			       mmc_hostname(mmc), host);
+	if (ret) {
+		dev_err(mmc_dev(host->mmc), "Unable to request wake IRQ\n");
+		goto err;
+	}
+
+	/*
+	 * Some omaps don't have wake-up path from deeper idle states
+	 * and need to remux SDIO DAT1 to GPIO for wake-up from idle.
+	 */
+	if (host->pdata->controller_flags & OMAP_HSMMC_SWAKEUP_MISSING) {
+		ret = -ENODEV;
+		devm_free_irq(host->dev, host->wake_irq, host);
+		goto err;
+	}
+
+	return 0;
+
+err:
+	dev_warn(host->dev, "no SDIO IRQ support, falling back to polling\n");
+	host->wake_irq = 0;
+	return ret;
+}
+
 static void omap_hsmmc_conf_bus_power(struct omap_hsmmc_host *host)
 {
 	u32 hctl, capa, value;
@@ -1691,7 +1805,7 @@ static const struct mmc_host_ops omap_hsmmc_ops = {
 	.get_cd = omap_hsmmc_get_cd,
 	.get_ro = omap_hsmmc_get_ro,
 	.init_card = omap_hsmmc_init_card,
-	/* NYET -- enable_sdio_irq */
+	.enable_sdio_irq = omap_hsmmc_enable_sdio_irq,
 };
 
 #ifdef CONFIG_DEBUG_FS
@@ -1761,6 +1875,10 @@ static const struct omap_mmc_of_data omap3_pre_es3_mmc_of_data = {
 static const struct omap_mmc_of_data omap4_mmc_of_data = {
 	.reg_offset = 0x100,
 };
+static const struct omap_mmc_of_data am33xx_mmc_of_data = {
+	.reg_offset = 0x100,
+	.controller_flags = OMAP_HSMMC_SWAKEUP_MISSING,
+};
 
 static const struct of_device_id omap_mmc_of_match[] = {
 	{
@@ -1777,6 +1895,10 @@ static const struct of_device_id omap_mmc_of_match[] = {
 		.compatible = "ti,omap4-hsmmc",
 		.data = &omap4_mmc_of_data,
 	},
+	{
+		.compatible = "ti,am33xx-hsmmc",
+		.data = &am33xx_mmc_of_data,
+	},
 	{},
 };
 MODULE_DEVICE_TABLE(of, omap_mmc_of_match);
@@ -1913,6 +2035,9 @@ static int omap_hsmmc_probe(struct platform_device *pdev)
 
 	platform_set_drvdata(pdev, host);
 
+	if (pdev->dev.of_node)
+		host->wake_irq = irq_of_parse_and_map(pdev->dev.of_node, 1);
+
 	mmc->ops	= &omap_hsmmc_ops;
 
 	mmc->f_min = OMAP_MMC_MIN_CLOCK;
@@ -2076,6 +2201,18 @@ static int omap_hsmmc_probe(struct platform_device *pdev)
 		dev_warn(&pdev->dev,
 			"pins are not configured from the driver\n");
 
+	/*
+	 * For now, only support SDIO interrupt if we have a separate
+	 * wake-up interrupt configured from device tree. This is because
+	 * the wake-up interrupt is needed for idle state and some
+	 * platforms need special quirks. And we don't want to add new
+	 * legacy mux platform init code callbacks any longer as we
+	 * are moving to DT based booting anyways.
+	 */
+	ret = omap_hsmmc_configure_wake_irq(host);
+	if (!ret)
+		mmc->caps |= MMC_CAP_SDIO_IRQ;
+
 	omap_hsmmc_protect_card(host);
 
 	mmc_add_host(mmc);
@@ -2180,11 +2317,18 @@ static int omap_hsmmc_suspend(struct device *dev)
 	pm_runtime_get_sync(host->dev);
 
 	if (!(host->mmc->pm_flags & MMC_PM_KEEP_POWER)) {
-		omap_hsmmc_disable_irq(host);
+		OMAP_HSMMC_WRITE(host->base, ISE, 0);
+		OMAP_HSMMC_WRITE(host->base, IE, 0);
+		OMAP_HSMMC_WRITE(host->base, STAT, STAT_CLEAR);
 		OMAP_HSMMC_WRITE(host->base, HCTL,
 				OMAP_HSMMC_READ(host->base, HCTL) & ~SDBP);
 	}
 
+	/* do not wake up due to sdio irq */
+	if ((host->mmc->caps & MMC_CAP_SDIO_IRQ) &&
+	    !(host->mmc->pm_flags & MMC_PM_WAKE_SDIO_IRQ))
+		disable_irq(host->wake_irq);
+
 	if (host->dbclk)
 		clk_disable_unprepare(host->dbclk);
 
@@ -2210,6 +2354,10 @@ static int omap_hsmmc_resume(struct device *dev)
 
 	omap_hsmmc_protect_card(host);
 
+	if ((host->mmc->caps & MMC_CAP_SDIO_IRQ) &&
+	    !(host->mmc->pm_flags & MMC_PM_WAKE_SDIO_IRQ))
+		enable_irq(host->wake_irq);
+
 	pm_runtime_mark_last_busy(host->dev);
 	pm_runtime_put_autosuspend(host->dev);
 	return 0;
@@ -2225,22 +2373,51 @@ static int omap_hsmmc_resume(struct device *dev)
 static int omap_hsmmc_runtime_suspend(struct device *dev)
 {
 	struct omap_hsmmc_host *host;
+	unsigned long flags;
 
 	host = platform_get_drvdata(to_platform_device(dev));
 	omap_hsmmc_context_save(host);
 	dev_dbg(dev, "disabled\n");
 
+	spin_lock_irqsave(&host->irq_lock, flags);
+	if ((host->mmc->caps & MMC_CAP_SDIO_IRQ) &&
+	    (host->flags & HSMMC_SDIO_IRQ_ENABLED)) {
+		/* disable sdio irq handling to prevent race */
+		OMAP_HSMMC_WRITE(host->base, ISE, 0);
+		OMAP_HSMMC_WRITE(host->base, IE, 0);
+		OMAP_HSMMC_WRITE(host->base, STAT, STAT_CLEAR);
+
+		WARN_ON(host->flags & HSMMC_WAKE_IRQ_ENABLED);
+		enable_irq(host->wake_irq);
+		host->flags |= HSMMC_WAKE_IRQ_ENABLED;
+	}
+	spin_unlock_irqrestore(&host->irq_lock, flags);
 	return 0;
 }
 
 static int omap_hsmmc_runtime_resume(struct device *dev)
 {
 	struct omap_hsmmc_host *host;
+	unsigned long flags;
 
 	host = platform_get_drvdata(to_platform_device(dev));
 	omap_hsmmc_context_restore(host);
 	dev_dbg(dev, "enabled\n");
 
+	spin_lock_irqsave(&host->irq_lock, flags);
+	if ((host->mmc->caps & MMC_CAP_SDIO_IRQ) &&
+	    (host->flags & HSMMC_SDIO_IRQ_ENABLED)) {
+		/* sdio irq flag can't change while in runtime suspend */
+		if (host->flags & HSMMC_WAKE_IRQ_ENABLED) {
+			disable_irq_nosync(host->wake_irq);
+			host->flags &= ~HSMMC_WAKE_IRQ_ENABLED;
+		}
+
+		OMAP_HSMMC_WRITE(host->base, STAT, STAT_CLEAR);
+		OMAP_HSMMC_WRITE(host->base, ISE, CIRQ_EN);
+		OMAP_HSMMC_WRITE(host->base, IE, CIRQ_EN);
+	}
+	spin_unlock_irqrestore(&host->irq_lock, flags);
 	return 0;
 }
 
diff --git a/include/linux/platform_data/mmc-omap.h b/include/linux/platform_data/mmc-omap.h
index 2bf1b30..51e70cf 100644
--- a/include/linux/platform_data/mmc-omap.h
+++ b/include/linux/platform_data/mmc-omap.h
@@ -28,6 +28,7 @@
  */
 #define OMAP_HSMMC_SUPPORTS_DUAL_VOLT		BIT(0)
 #define OMAP_HSMMC_BROKEN_MULTIBLOCK_READ	BIT(1)
+#define OMAP_HSMMC_SWAKEUP_MISSING		BIT(2)
 
 struct mmc_card;
 
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v14 2/6] mmc: omap_hsmmc: Extend debugfs by SDIO IRQ handling, runtime state
  2014-05-29  8:27 [PATCH v14 0/6] mmc: omap_hsmmc: Enable SDIO IRQ Andreas Fenkart
  2014-05-29  8:28 ` [PATCH v14 1/6] mmc: omap_hsmmc: Enable SDIO interrupt Andreas Fenkart
@ 2014-05-29  8:28 ` Andreas Fenkart
  2014-05-29 13:38   ` Balaji T K
  2014-05-29  8:28 ` [PATCH v14 3/6] mmc: omap_hsmmc: enable wakeup event for sdio OMAP4 Andreas Fenkart
                   ` (4 subsequent siblings)
  6 siblings, 1 reply; 17+ messages in thread
From: Andreas Fenkart @ 2014-05-29  8:28 UTC (permalink / raw)
  To: Tony Lindgren
  Cc: Chris Ball, Grant Likely, Felipe Balbi, Balaji T K,
	Andreas Mueller, Sebastian Reichel, zonque, galak, linux-doc,
	linux-mmc, linux-omap, Andreas Fenkart

Add SDIO IRQ entries to debugfs entry. Note that PSTATE shows current
state of data lines, incl. SDIO IRQ pending

Signed-off-by: Andreas Fenkart <afenkart@gmail.com>

diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
index 129569d..332d3d2 100644
--- a/drivers/mmc/host/omap_hsmmc.c
+++ b/drivers/mmc/host/omap_hsmmc.c
@@ -56,6 +56,7 @@
 #define OMAP_HSMMC_RSP54	0x0118
 #define OMAP_HSMMC_RSP76	0x011C
 #define OMAP_HSMMC_DATA		0x0120
+#define OMAP_HSMMC_PSTATE	0x0124
 #define OMAP_HSMMC_HCTL		0x0128
 #define OMAP_HSMMC_SYSCTL	0x012C
 #define OMAP_HSMMC_STAT		0x0130
@@ -1815,13 +1816,23 @@ static int omap_hsmmc_regs_show(struct seq_file *s, void *data)
 	struct mmc_host *mmc = s->private;
 	struct omap_hsmmc_host *host = mmc_priv(mmc);
 
-	seq_printf(s, "mmc%d:\n ctx_loss:\t%d\n\nregs:\n",
-			mmc->index, host->context_loss);
+	seq_printf(s, "mmc%d:\n", mmc->index);
+	seq_printf(s, "sdio irq mode\t%s\n",
+		   (mmc->caps & MMC_CAP_SDIO_IRQ) ? "interrupt" : "polling");
 
-	pm_runtime_get_sync(host->dev);
+	if (mmc->caps & MMC_CAP_SDIO_IRQ) {
+		seq_printf(s, "sdio irq \t%s\n",
+			   (host->flags & HSMMC_SDIO_IRQ_ENABLED) ?  "enabled"
+			   : "disabled");
+	}
+	seq_printf(s, "ctx_loss:\t%d\n", host->context_loss);
 
+	pm_runtime_get_sync(host->dev);
+	seq_puts(s, "\nregs:\n");
 	seq_printf(s, "CON:\t\t0x%08x\n",
 			OMAP_HSMMC_READ(host->base, CON));
+	seq_printf(s, "PSTATE:\t\t0x%08x\n",
+		   OMAP_HSMMC_READ(host->base, PSTATE));
 	seq_printf(s, "HCTL:\t\t0x%08x\n",
 			OMAP_HSMMC_READ(host->base, HCTL));
 	seq_printf(s, "SYSCTL:\t\t0x%08x\n",
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v14 3/6] mmc: omap_hsmmc: enable wakeup event for sdio OMAP4
  2014-05-29  8:27 [PATCH v14 0/6] mmc: omap_hsmmc: Enable SDIO IRQ Andreas Fenkart
  2014-05-29  8:28 ` [PATCH v14 1/6] mmc: omap_hsmmc: Enable SDIO interrupt Andreas Fenkart
  2014-05-29  8:28 ` [PATCH v14 2/6] mmc: omap_hsmmc: Extend debugfs by SDIO IRQ handling, runtime state Andreas Fenkart
@ 2014-05-29  8:28 ` Andreas Fenkart
  2014-05-29  8:28 ` [PATCH v14 4/6] mmc: omap_hsmmc: abort runtime suspend if pending sdio irq detected Andreas Fenkart
                   ` (3 subsequent siblings)
  6 siblings, 0 replies; 17+ messages in thread
From: Andreas Fenkart @ 2014-05-29  8:28 UTC (permalink / raw)
  To: Tony Lindgren
  Cc: Chris Ball, Grant Likely, Felipe Balbi, Balaji T K,
	Andreas Mueller, Sebastian Reichel, zonque, galak, linux-doc,
	linux-mmc, linux-omap

From: Balaji T K <balajitk@ti.com>

To detect sdio irqs properly without spurious events,
OMAP4 needs IWE in CON and CTPL, CLKEXTFREE in HCTL to be set

Tested-by: Andreas Fenkart <afenkart@gmail.com>
Signed-off-by: Balaji T K <balajitk@ti.com>

diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
index 332d3d2..b8be438 100644
--- a/drivers/mmc/host/omap_hsmmc.c
+++ b/drivers/mmc/host/omap_hsmmc.c
@@ -94,7 +94,10 @@
 #define BCE			(1 << 1)
 #define FOUR_BIT		(1 << 1)
 #define HSPE			(1 << 2)
+#define IWE			(1 << 24)
 #define DDR			(1 << 19)
+#define CLKEXTFREE		(1 << 16)
+#define CTPL			(1 << 11)
 #define DW8			(1 << 5)
 #define OD			0x1
 #define STAT_CLEAR		0xFFFFFFFF
@@ -687,6 +690,9 @@ static int omap_hsmmc_context_restore(struct omap_hsmmc_host *host)
 		capa = VS18;
 	}
 
+	if (host->mmc->caps & MMC_CAP_SDIO_IRQ)
+		hctl |= IWE;
+
 	OMAP_HSMMC_WRITE(host->base, HCTL,
 			OMAP_HSMMC_READ(host->base, HCTL) | hctl);
 
@@ -1684,19 +1690,23 @@ static void omap_hsmmc_init_card(struct mmc_host *mmc, struct mmc_card *card)
 static void omap_hsmmc_enable_sdio_irq(struct mmc_host *mmc, int enable)
 {
 	struct omap_hsmmc_host *host = mmc_priv(mmc);
-	u32 irq_mask;
+	u32 irq_mask, con;
 	unsigned long flags;
 
 	spin_lock_irqsave(&host->irq_lock, flags);
 
+	con = OMAP_HSMMC_READ(host->base, CON);
 	irq_mask = OMAP_HSMMC_READ(host->base, ISE);
 	if (enable) {
 		host->flags |= HSMMC_SDIO_IRQ_ENABLED;
 		irq_mask |= CIRQ_EN;
+		con |= CTPL | CLKEXTFREE;
 	} else {
 		host->flags &= ~HSMMC_SDIO_IRQ_ENABLED;
 		irq_mask &= ~CIRQ_EN;
+		con &= ~(CTPL | CLKEXTFREE);
 	}
+	OMAP_HSMMC_WRITE(host->base, CON, con);
 	OMAP_HSMMC_WRITE(host->base, IE, irq_mask);
 
 	/*
@@ -1746,6 +1756,8 @@ static int omap_hsmmc_configure_wake_irq(struct omap_hsmmc_host *host)
 		goto err;
 	}
 
+	OMAP_HSMMC_WRITE(host->base, HCTL,
+			 OMAP_HSMMC_READ(host->base, HCTL) | IWE);
 	return 0;
 
 err:
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v14 4/6] mmc: omap_hsmmc: abort runtime suspend if pending sdio irq detected
  2014-05-29  8:27 [PATCH v14 0/6] mmc: omap_hsmmc: Enable SDIO IRQ Andreas Fenkart
                   ` (2 preceding siblings ...)
  2014-05-29  8:28 ` [PATCH v14 3/6] mmc: omap_hsmmc: enable wakeup event for sdio OMAP4 Andreas Fenkart
@ 2014-05-29  8:28 ` Andreas Fenkart
  2014-05-29  8:28 ` [PATCH v14 5/6] mmc: omap_hsmmc: switch default/idle pinctrl states in runtime hooks Andreas Fenkart
                   ` (2 subsequent siblings)
  6 siblings, 0 replies; 17+ messages in thread
From: Andreas Fenkart @ 2014-05-29  8:28 UTC (permalink / raw)
  To: Tony Lindgren
  Cc: Chris Ball, Grant Likely, Felipe Balbi, Balaji T K,
	Andreas Mueller, Sebastian Reichel, zonque, galak, linux-doc,
	linux-mmc, linux-omap, Andreas Fenkart

On multicores, an sdio irq handler could be running in parallel to
runtime suspend. In the worst case it could be waiting for the spinlock
held by the runtime suspend. When runtime suspend is complete and the
functional clock (fclk) turned off, the irq handler will continue and
cause a SIGBUS on the first register access.

Acked-by: Balaji T K <balajitk@ti.com>
Signed-off-by: Andreas Fenkart <afenkart@gmail.com>

diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
index b8be438..2408ec9 100644
--- a/drivers/mmc/host/omap_hsmmc.c
+++ b/drivers/mmc/host/omap_hsmmc.c
@@ -107,6 +107,9 @@
 #define SRD			(1 << 26)
 #define SOFTRESET		(1 << 1)
 
+/* PSTATE */
+#define DLEV_DAT(x)		(1 << (20 + (x)))
+
 /* Interrupt masks for IE and ISE register */
 #define CC_EN			(1 << 0)
 #define TC_EN			(1 << 1)
@@ -2397,6 +2400,7 @@ static int omap_hsmmc_runtime_suspend(struct device *dev)
 {
 	struct omap_hsmmc_host *host;
 	unsigned long flags;
+	int ret = 0;
 
 	host = platform_get_drvdata(to_platform_device(dev));
 	omap_hsmmc_context_save(host);
@@ -2408,14 +2412,29 @@ static int omap_hsmmc_runtime_suspend(struct device *dev)
 		/* disable sdio irq handling to prevent race */
 		OMAP_HSMMC_WRITE(host->base, ISE, 0);
 		OMAP_HSMMC_WRITE(host->base, IE, 0);
-		OMAP_HSMMC_WRITE(host->base, STAT, STAT_CLEAR);
+
+		if (!(OMAP_HSMMC_READ(host->base, PSTATE) & DLEV_DAT(1))) {
+			/*
+			 * dat1 line low, pending sdio irq
+			 * race condition: possible irq handler running on
+			 * multi-core, abort
+			 */
+			dev_dbg(dev, "pending sdio irq, abort suspend\n");
+			OMAP_HSMMC_WRITE(host->base, STAT, STAT_CLEAR);
+			OMAP_HSMMC_WRITE(host->base, ISE, CIRQ_EN);
+			OMAP_HSMMC_WRITE(host->base, IE, CIRQ_EN);
+			pm_runtime_mark_last_busy(dev);
+			ret = -EBUSY;
+			goto abort;
+		}
 
 		WARN_ON(host->flags & HSMMC_WAKE_IRQ_ENABLED);
 		enable_irq(host->wake_irq);
 		host->flags |= HSMMC_WAKE_IRQ_ENABLED;
 	}
+abort:
 	spin_unlock_irqrestore(&host->irq_lock, flags);
-	return 0;
+	return ret;
 }
 
 static int omap_hsmmc_runtime_resume(struct device *dev)
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v14 5/6] mmc: omap_hsmmc: switch default/idle pinctrl states in runtime hooks
  2014-05-29  8:27 [PATCH v14 0/6] mmc: omap_hsmmc: Enable SDIO IRQ Andreas Fenkart
                   ` (3 preceding siblings ...)
  2014-05-29  8:28 ` [PATCH v14 4/6] mmc: omap_hsmmc: abort runtime suspend if pending sdio irq detected Andreas Fenkart
@ 2014-05-29  8:28 ` Andreas Fenkart
  2014-05-29  8:28 ` [PATCH v14 6/6] mmc: omap_hsmmc: Pin remux workaround to support SDIO interrupt on AM335x Andreas Fenkart
  2014-06-16  9:26 ` [PATCH v14 0/6] mmc: omap_hsmmc: Enable SDIO IRQ Ulf Hansson
  6 siblings, 0 replies; 17+ messages in thread
From: Andreas Fenkart @ 2014-05-29  8:28 UTC (permalink / raw)
  To: Tony Lindgren
  Cc: Chris Ball, Grant Likely, Felipe Balbi, Balaji T K,
	Andreas Mueller, Sebastian Reichel, zonque, galak, linux-doc,
	linux-mmc, linux-omap, Andreas Fenkart

These are predefined states of the driver model. When not present,
as if not set in the device tree, they become no-ops.
Explicitly selecting the default state is not needed since the
device core layer sets pin mux to "default" state before probe.
This is not the simplest implementation, on AM335x at least, we could
switch to idle at any point in the suspend hook, only the default state
needs to be set before writing to the irq registers or an IRQ might get
lost.

Acked-by: Balaji T K <balajitk@ti.com>
Signed-off-by: Andreas Fenkart <afenkart@gmail.com>

diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
index 2408ec9..0febb17 100644
--- a/drivers/mmc/host/omap_hsmmc.c
+++ b/drivers/mmc/host/omap_hsmmc.c
@@ -1998,7 +1998,6 @@ static int omap_hsmmc_probe(struct platform_device *pdev)
 	const struct of_device_id *match;
 	dma_cap_mask_t mask;
 	unsigned tx_req, rx_req;
-	struct pinctrl *pinctrl;
 	const struct omap_mmc_of_data *data;
 	void __iomem *base;
 
@@ -2222,11 +2221,6 @@ static int omap_hsmmc_probe(struct platform_device *pdev)
 
 	omap_hsmmc_disable_irq(host);
 
-	pinctrl = devm_pinctrl_get_select_default(&pdev->dev);
-	if (IS_ERR(pinctrl))
-		dev_warn(&pdev->dev,
-			"pins are not configured from the driver\n");
-
 	/*
 	 * For now, only support SDIO interrupt if we have a separate
 	 * wake-up interrupt configured from device tree. This is because
@@ -2428,10 +2422,15 @@ static int omap_hsmmc_runtime_suspend(struct device *dev)
 			goto abort;
 		}
 
+		pinctrl_pm_select_idle_state(dev);
+
 		WARN_ON(host->flags & HSMMC_WAKE_IRQ_ENABLED);
 		enable_irq(host->wake_irq);
 		host->flags |= HSMMC_WAKE_IRQ_ENABLED;
+	} else {
+		pinctrl_pm_select_idle_state(dev);
 	}
+
 abort:
 	spin_unlock_irqrestore(&host->irq_lock, flags);
 	return ret;
@@ -2455,9 +2454,14 @@ static int omap_hsmmc_runtime_resume(struct device *dev)
 			host->flags &= ~HSMMC_WAKE_IRQ_ENABLED;
 		}
 
+		pinctrl_pm_select_default_state(host->dev);
+
+		/* irq lost, if pinmux incorrect */
 		OMAP_HSMMC_WRITE(host->base, STAT, STAT_CLEAR);
 		OMAP_HSMMC_WRITE(host->base, ISE, CIRQ_EN);
 		OMAP_HSMMC_WRITE(host->base, IE, CIRQ_EN);
+	} else {
+		pinctrl_pm_select_default_state(host->dev);
 	}
 	spin_unlock_irqrestore(&host->irq_lock, flags);
 	return 0;
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v14 6/6] mmc: omap_hsmmc: Pin remux workaround to support SDIO interrupt on AM335x
  2014-05-29  8:27 [PATCH v14 0/6] mmc: omap_hsmmc: Enable SDIO IRQ Andreas Fenkart
                   ` (4 preceding siblings ...)
  2014-05-29  8:28 ` [PATCH v14 5/6] mmc: omap_hsmmc: switch default/idle pinctrl states in runtime hooks Andreas Fenkart
@ 2014-05-29  8:28 ` Andreas Fenkart
  2014-05-29 13:41   ` Balaji T K
  2014-06-16  9:26 ` [PATCH v14 0/6] mmc: omap_hsmmc: Enable SDIO IRQ Ulf Hansson
  6 siblings, 1 reply; 17+ messages in thread
From: Andreas Fenkart @ 2014-05-29  8:28 UTC (permalink / raw)
  To: Tony Lindgren
  Cc: Chris Ball, Grant Likely, Felipe Balbi, Balaji T K,
	Andreas Mueller, Sebastian Reichel, zonque, galak, linux-doc,
	linux-mmc, linux-omap, Andreas Fenkart

The am335x can't detect pending cirq in PM runtime suspend.
This patch reconfigures dat1 as a GPIO before going to suspend.
SDIO interrupts are detected with the GPIO, the GPIO will only wake
the module from suspend, SDIO irq detection will still happen through the
IP block.

Idea of remuxing the pins by Tony Lindgren. Code contributions from
Tony Lindgren and Balaji T K <balajitk@ti.com>

Signed-off-by: Andreas Fenkart <afenkart@gmail.com>
Signed-off-by: Tony Lindgren <tony@atomide.com>

diff --git a/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt b/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt
index 0233ba7..76bf087 100644
--- a/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt
+++ b/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt
@@ -57,3 +57,56 @@ Examples:
 			&edma 25>;
 		dma-names = "tx", "rx";
 	};
+
+[workaround for missing swakeup on am33xx]
+
+This SOC is missing the swakeup line, it will not detect SDIO irq
+while in suspend.
+
+                             ------
+                             | PRCM |
+                              ------
+                               ^ |
+                       swakeup | | fclk
+                               | v
+       ------                -------               -----
+      | card | -- CIRQ -->  | hsmmc | -- IRQ -->  | CPU |
+       ------                -------               -----
+
+In suspend the fclk is off and the module is disfunctional. Even register reads
+will fail. A small logic in the host will request fclk restore, when an
+external event is detected. Once the clock is restored, the host detects the
+event normally. Since am33xx doesn't have this line it never wakes from
+suspend.
+
+The workaround is to reconfigure the dat1 line as a GPIO upon suspend. To make
+this work, we need to set the named pinctrl states "default" and "idle".
+Prepare idle to remux dat1 as a gpio, and default to remux it back as sdio
+dat1. The MMC driver will then toggle between idle and default state during
+runtime.
+
+In summary:
+1. select matching 'compatible' section, see example below.
+2. specify pinctrl states "default" and "idle", "sleep" is optional.
+3. specify the gpio irq used for detecting sdio irq in suspend
+
+If configuration is incomplete, a warning message is emitted "falling back to
+polling". Also check the "sdio irq mode" in /sys/kernel/debug/mmc0/regs. Mind
+not every application needs SDIO irq, e.g. MMC cards.
+
+	mmc1: mmc@48060100 {
+		compatible = "ti,am33xx-hsmmc";
+		...
+		pinctrl-names = "default", "idle", "sleep"
+		pinctrl-0 = <&mmc1_pins>;
+		pinctrl-1 = <&mmc1_idle>;
+		pinctrl-2 = <&mmc1_sleep>;
+		...
+		interrupts-extended = <&intc 64 &gpio2 28 0>;
+	};
+
+	mmc1_idle : pinmux_cirq_pin {
+		pinctrl-single,pins = <
+		        0x0f8 0x3f      /* GPIO2_28 */
+		>;
+	};
diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
index 0febb17..35ac2e4 100644
--- a/drivers/mmc/host/omap_hsmmc.c
+++ b/drivers/mmc/host/omap_hsmmc.c
@@ -1754,15 +1754,33 @@ static int omap_hsmmc_configure_wake_irq(struct omap_hsmmc_host *host)
 	 * and need to remux SDIO DAT1 to GPIO for wake-up from idle.
 	 */
 	if (host->pdata->controller_flags & OMAP_HSMMC_SWAKEUP_MISSING) {
-		ret = -ENODEV;
-		devm_free_irq(host->dev, host->wake_irq, host);
-		goto err;
+		struct pinctrl *p = devm_pinctrl_get(host->dev);
+		if (!p) {
+			ret = -ENODEV;
+			goto err_free_irq;
+		}
+		if (IS_ERR(pinctrl_lookup_state(p, PINCTRL_STATE_DEFAULT))) {
+			dev_info(host->dev, "missing default pinctrl state\n");
+			devm_pinctrl_put(p);
+			ret = -EINVAL;
+			goto err_free_irq;
+		}
+
+		if (IS_ERR(pinctrl_lookup_state(p, PINCTRL_STATE_IDLE))) {
+			dev_info(host->dev, "missing idle pinctrl state\n");
+			devm_pinctrl_put(p);
+			ret = -EINVAL;
+			goto err_free_irq;
+		}
+		devm_pinctrl_put(p);
 	}
 
 	OMAP_HSMMC_WRITE(host->base, HCTL,
 			 OMAP_HSMMC_READ(host->base, HCTL) | IWE);
 	return 0;
 
+err_free_irq:
+	devm_free_irq(host->dev, host->wake_irq, host);
 err:
 	dev_warn(host->dev, "no SDIO IRQ support, falling back to polling\n");
 	host->wake_irq = 0;
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* Re: [PATCH v14 2/6] mmc: omap_hsmmc: Extend debugfs by SDIO IRQ handling, runtime state
  2014-05-29  8:28 ` [PATCH v14 2/6] mmc: omap_hsmmc: Extend debugfs by SDIO IRQ handling, runtime state Andreas Fenkart
@ 2014-05-29 13:38   ` Balaji T K
  0 siblings, 0 replies; 17+ messages in thread
From: Balaji T K @ 2014-05-29 13:38 UTC (permalink / raw)
  To: Andreas Fenkart
  Cc: Tony Lindgren, Chris Ball, Grant Likely, Felipe Balbi,
	Andreas Mueller, Sebastian Reichel, zonque, galak, linux-doc,
	linux-mmc, linux-omap

On Thursday 29 May 2014 01:58 PM, Andreas Fenkart wrote:
> Add SDIO IRQ entries to debugfs entry. Note that PSTATE shows current
> state of data lines, incl. SDIO IRQ pending
>
> Signed-off-by: Andreas Fenkart <afenkart@gmail.com>

Thanks Andreas for fixing compilation with !CONFIG_PM[_RUNTIME],

Acked-by: Balaji T K <balajitk@ti.com>

>
> diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
> index 129569d..332d3d2 100644
> --- a/drivers/mmc/host/omap_hsmmc.c
> +++ b/drivers/mmc/host/omap_hsmmc.c
> @@ -56,6 +56,7 @@
>   #define OMAP_HSMMC_RSP54	0x0118
>   #define OMAP_HSMMC_RSP76	0x011C
>   #define OMAP_HSMMC_DATA		0x0120
> +#define OMAP_HSMMC_PSTATE	0x0124
>   #define OMAP_HSMMC_HCTL		0x0128
>   #define OMAP_HSMMC_SYSCTL	0x012C
>   #define OMAP_HSMMC_STAT		0x0130
> @@ -1815,13 +1816,23 @@ static int omap_hsmmc_regs_show(struct seq_file *s, void *data)
>   	struct mmc_host *mmc = s->private;
>   	struct omap_hsmmc_host *host = mmc_priv(mmc);
>
> -	seq_printf(s, "mmc%d:\n ctx_loss:\t%d\n\nregs:\n",
> -			mmc->index, host->context_loss);
> +	seq_printf(s, "mmc%d:\n", mmc->index);
> +	seq_printf(s, "sdio irq mode\t%s\n",
> +		   (mmc->caps & MMC_CAP_SDIO_IRQ) ? "interrupt" : "polling");
>
> -	pm_runtime_get_sync(host->dev);
> +	if (mmc->caps & MMC_CAP_SDIO_IRQ) {
> +		seq_printf(s, "sdio irq \t%s\n",
> +			   (host->flags & HSMMC_SDIO_IRQ_ENABLED) ?  "enabled"
> +			   : "disabled");
> +	}
> +	seq_printf(s, "ctx_loss:\t%d\n", host->context_loss);
>
> +	pm_runtime_get_sync(host->dev);
> +	seq_puts(s, "\nregs:\n");
>   	seq_printf(s, "CON:\t\t0x%08x\n",
>   			OMAP_HSMMC_READ(host->base, CON));
> +	seq_printf(s, "PSTATE:\t\t0x%08x\n",
> +		   OMAP_HSMMC_READ(host->base, PSTATE));
>   	seq_printf(s, "HCTL:\t\t0x%08x\n",
>   			OMAP_HSMMC_READ(host->base, HCTL));
>   	seq_printf(s, "SYSCTL:\t\t0x%08x\n",
>


^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v14 6/6] mmc: omap_hsmmc: Pin remux workaround to support SDIO interrupt on AM335x
  2014-05-29  8:28 ` [PATCH v14 6/6] mmc: omap_hsmmc: Pin remux workaround to support SDIO interrupt on AM335x Andreas Fenkart
@ 2014-05-29 13:41   ` Balaji T K
  2014-06-02 22:38     ` Tony Lindgren
  0 siblings, 1 reply; 17+ messages in thread
From: Balaji T K @ 2014-05-29 13:41 UTC (permalink / raw)
  To: Andreas Fenkart, Chris Ball, Ulf Hansson
  Cc: Tony Lindgren, Grant Likely, Felipe Balbi, Andreas Mueller,
	Sebastian Reichel, zonque, galak, linux-doc, linux-mmc,
	linux-omap

On Thursday 29 May 2014 01:58 PM, Andreas Fenkart wrote:
> The am335x can't detect pending cirq in PM runtime suspend.
> This patch reconfigures dat1 as a GPIO before going to suspend.
> SDIO interrupts are detected with the GPIO, the GPIO will only wake
> the module from suspend, SDIO irq detection will still happen through the
> IP block.
>
> Idea of remuxing the pins by Tony Lindgren. Code contributions from
> Tony Lindgren and Balaji T K <balajitk@ti.com>
>
> Signed-off-by: Andreas Fenkart <afenkart@gmail.com>
> Signed-off-by: Tony Lindgren <tony@atomide.com>

Acked-by: Balaji T K <balajitk@ti.com>

Hi Chris/Ulf,

Can you please queue this series for 3.16

Thanks and Regards,
Balaji T K

>
> diff --git a/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt b/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt
> index 0233ba7..76bf087 100644
> --- a/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt
> +++ b/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt
> @@ -57,3 +57,56 @@ Examples:
>   			&edma 25>;
>   		dma-names = "tx", "rx";
>   	};
> +
> +[workaround for missing swakeup on am33xx]
> +
> +This SOC is missing the swakeup line, it will not detect SDIO irq
> +while in suspend.
> +
> +                             ------
> +                             | PRCM |
> +                              ------
> +                               ^ |
> +                       swakeup | | fclk
> +                               | v
> +       ------                -------               -----
> +      | card | -- CIRQ -->  | hsmmc | -- IRQ -->  | CPU |
> +       ------                -------               -----
> +
> +In suspend the fclk is off and the module is disfunctional. Even register reads
> +will fail. A small logic in the host will request fclk restore, when an
> +external event is detected. Once the clock is restored, the host detects the
> +event normally. Since am33xx doesn't have this line it never wakes from
> +suspend.
> +
> +The workaround is to reconfigure the dat1 line as a GPIO upon suspend. To make
> +this work, we need to set the named pinctrl states "default" and "idle".
> +Prepare idle to remux dat1 as a gpio, and default to remux it back as sdio
> +dat1. The MMC driver will then toggle between idle and default state during
> +runtime.
> +
> +In summary:
> +1. select matching 'compatible' section, see example below.
> +2. specify pinctrl states "default" and "idle", "sleep" is optional.
> +3. specify the gpio irq used for detecting sdio irq in suspend
> +
> +If configuration is incomplete, a warning message is emitted "falling back to
> +polling". Also check the "sdio irq mode" in /sys/kernel/debug/mmc0/regs. Mind
> +not every application needs SDIO irq, e.g. MMC cards.
> +
> +	mmc1: mmc@48060100 {
> +		compatible = "ti,am33xx-hsmmc";
> +		...
> +		pinctrl-names = "default", "idle", "sleep"
> +		pinctrl-0 = <&mmc1_pins>;
> +		pinctrl-1 = <&mmc1_idle>;
> +		pinctrl-2 = <&mmc1_sleep>;
> +		...
> +		interrupts-extended = <&intc 64 &gpio2 28 0>;
> +	};
> +
> +	mmc1_idle : pinmux_cirq_pin {
> +		pinctrl-single,pins = <
> +		        0x0f8 0x3f      /* GPIO2_28 */
> +		>;
> +	};
> diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
> index 0febb17..35ac2e4 100644
> --- a/drivers/mmc/host/omap_hsmmc.c
> +++ b/drivers/mmc/host/omap_hsmmc.c
> @@ -1754,15 +1754,33 @@ static int omap_hsmmc_configure_wake_irq(struct omap_hsmmc_host *host)
>   	 * and need to remux SDIO DAT1 to GPIO for wake-up from idle.
>   	 */
>   	if (host->pdata->controller_flags & OMAP_HSMMC_SWAKEUP_MISSING) {
> -		ret = -ENODEV;
> -		devm_free_irq(host->dev, host->wake_irq, host);
> -		goto err;
> +		struct pinctrl *p = devm_pinctrl_get(host->dev);
> +		if (!p) {
> +			ret = -ENODEV;
> +			goto err_free_irq;
> +		}
> +		if (IS_ERR(pinctrl_lookup_state(p, PINCTRL_STATE_DEFAULT))) {
> +			dev_info(host->dev, "missing default pinctrl state\n");
> +			devm_pinctrl_put(p);
> +			ret = -EINVAL;
> +			goto err_free_irq;
> +		}
> +
> +		if (IS_ERR(pinctrl_lookup_state(p, PINCTRL_STATE_IDLE))) {
> +			dev_info(host->dev, "missing idle pinctrl state\n");
> +			devm_pinctrl_put(p);
> +			ret = -EINVAL;
> +			goto err_free_irq;
> +		}
> +		devm_pinctrl_put(p);
>   	}
>
>   	OMAP_HSMMC_WRITE(host->base, HCTL,
>   			 OMAP_HSMMC_READ(host->base, HCTL) | IWE);
>   	return 0;
>
> +err_free_irq:
> +	devm_free_irq(host->dev, host->wake_irq, host);
>   err:
>   	dev_warn(host->dev, "no SDIO IRQ support, falling back to polling\n");
>   	host->wake_irq = 0;
>


^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v14 6/6] mmc: omap_hsmmc: Pin remux workaround to support SDIO interrupt on AM335x
  2014-05-29 13:41   ` Balaji T K
@ 2014-06-02 22:38     ` Tony Lindgren
  0 siblings, 0 replies; 17+ messages in thread
From: Tony Lindgren @ 2014-06-02 22:38 UTC (permalink / raw)
  To: Balaji T K
  Cc: Andreas Fenkart, Chris Ball, Ulf Hansson, Grant Likely,
	Felipe Balbi, Andreas Mueller, Sebastian Reichel, zonque, galak,
	linux-doc, linux-mmc, linux-omap

* Balaji T K <balajitk@ti.com> [140529 06:42]:
> On Thursday 29 May 2014 01:58 PM, Andreas Fenkart wrote:
> >The am335x can't detect pending cirq in PM runtime suspend.
> >This patch reconfigures dat1 as a GPIO before going to suspend.
> >SDIO interrupts are detected with the GPIO, the GPIO will only wake
> >the module from suspend, SDIO irq detection will still happen through the
> >IP block.
> >
> >Idea of remuxing the pins by Tony Lindgren. Code contributions from
> >Tony Lindgren and Balaji T K <balajitk@ti.com>
> >
> >Signed-off-by: Andreas Fenkart <afenkart@gmail.com>
> >Signed-off-by: Tony Lindgren <tony@atomide.com>
> 
> Acked-by: Balaji T K <balajitk@ti.com>
> 
> Hi Chris/Ulf,
> 
> Can you please queue this series for 3.16

Yes please, not seeing these in linux next yet.

Regards,

Tony
 
> >diff --git a/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt b/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt
> >index 0233ba7..76bf087 100644
> >--- a/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt
> >+++ b/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt
> >@@ -57,3 +57,56 @@ Examples:
> >  			&edma 25>;
> >  		dma-names = "tx", "rx";
> >  	};
> >+
> >+[workaround for missing swakeup on am33xx]
> >+
> >+This SOC is missing the swakeup line, it will not detect SDIO irq
> >+while in suspend.
> >+
> >+                             ------
> >+                             | PRCM |
> >+                              ------
> >+                               ^ |
> >+                       swakeup | | fclk
> >+                               | v
> >+       ------                -------               -----
> >+      | card | -- CIRQ -->  | hsmmc | -- IRQ -->  | CPU |
> >+       ------                -------               -----
> >+
> >+In suspend the fclk is off and the module is disfunctional. Even register reads
> >+will fail. A small logic in the host will request fclk restore, when an
> >+external event is detected. Once the clock is restored, the host detects the
> >+event normally. Since am33xx doesn't have this line it never wakes from
> >+suspend.
> >+
> >+The workaround is to reconfigure the dat1 line as a GPIO upon suspend. To make
> >+this work, we need to set the named pinctrl states "default" and "idle".
> >+Prepare idle to remux dat1 as a gpio, and default to remux it back as sdio
> >+dat1. The MMC driver will then toggle between idle and default state during
> >+runtime.
> >+
> >+In summary:
> >+1. select matching 'compatible' section, see example below.
> >+2. specify pinctrl states "default" and "idle", "sleep" is optional.
> >+3. specify the gpio irq used for detecting sdio irq in suspend
> >+
> >+If configuration is incomplete, a warning message is emitted "falling back to
> >+polling". Also check the "sdio irq mode" in /sys/kernel/debug/mmc0/regs. Mind
> >+not every application needs SDIO irq, e.g. MMC cards.
> >+
> >+	mmc1: mmc@48060100 {
> >+		compatible = "ti,am33xx-hsmmc";
> >+		...
> >+		pinctrl-names = "default", "idle", "sleep"
> >+		pinctrl-0 = <&mmc1_pins>;
> >+		pinctrl-1 = <&mmc1_idle>;
> >+		pinctrl-2 = <&mmc1_sleep>;
> >+		...
> >+		interrupts-extended = <&intc 64 &gpio2 28 0>;
> >+	};
> >+
> >+	mmc1_idle : pinmux_cirq_pin {
> >+		pinctrl-single,pins = <
> >+		        0x0f8 0x3f      /* GPIO2_28 */
> >+		>;
> >+	};
> >diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
> >index 0febb17..35ac2e4 100644
> >--- a/drivers/mmc/host/omap_hsmmc.c
> >+++ b/drivers/mmc/host/omap_hsmmc.c
> >@@ -1754,15 +1754,33 @@ static int omap_hsmmc_configure_wake_irq(struct omap_hsmmc_host *host)
> >  	 * and need to remux SDIO DAT1 to GPIO for wake-up from idle.
> >  	 */
> >  	if (host->pdata->controller_flags & OMAP_HSMMC_SWAKEUP_MISSING) {
> >-		ret = -ENODEV;
> >-		devm_free_irq(host->dev, host->wake_irq, host);
> >-		goto err;
> >+		struct pinctrl *p = devm_pinctrl_get(host->dev);
> >+		if (!p) {
> >+			ret = -ENODEV;
> >+			goto err_free_irq;
> >+		}
> >+		if (IS_ERR(pinctrl_lookup_state(p, PINCTRL_STATE_DEFAULT))) {
> >+			dev_info(host->dev, "missing default pinctrl state\n");
> >+			devm_pinctrl_put(p);
> >+			ret = -EINVAL;
> >+			goto err_free_irq;
> >+		}
> >+
> >+		if (IS_ERR(pinctrl_lookup_state(p, PINCTRL_STATE_IDLE))) {
> >+			dev_info(host->dev, "missing idle pinctrl state\n");
> >+			devm_pinctrl_put(p);
> >+			ret = -EINVAL;
> >+			goto err_free_irq;
> >+		}
> >+		devm_pinctrl_put(p);
> >  	}
> >
> >  	OMAP_HSMMC_WRITE(host->base, HCTL,
> >  			 OMAP_HSMMC_READ(host->base, HCTL) | IWE);
> >  	return 0;
> >
> >+err_free_irq:
> >+	devm_free_irq(host->dev, host->wake_irq, host);
> >  err:
> >  	dev_warn(host->dev, "no SDIO IRQ support, falling back to polling\n");
> >  	host->wake_irq = 0;
> >
> 

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v14 0/6] mmc: omap_hsmmc: Enable SDIO IRQ
  2014-05-29  8:27 [PATCH v14 0/6] mmc: omap_hsmmc: Enable SDIO IRQ Andreas Fenkart
                   ` (5 preceding siblings ...)
  2014-05-29  8:28 ` [PATCH v14 6/6] mmc: omap_hsmmc: Pin remux workaround to support SDIO interrupt on AM335x Andreas Fenkart
@ 2014-06-16  9:26 ` Ulf Hansson
  2014-08-06  6:18   ` Dmitry Lifshitz
  6 siblings, 1 reply; 17+ messages in thread
From: Ulf Hansson @ 2014-06-16  9:26 UTC (permalink / raw)
  To: Andreas Fenkart
  Cc: Tony Lindgren, Chris Ball, Grant Likely, Felipe Balbi,
	Balaji T K, Andreas Mueller, Sebastian Reichel, Daniel Mack,
	Kumar Gala, linux-doc, linux-mmc, linux-omap

On 29 May 2014 10:27, Andreas Fenkart <afenkart@gmail.com> wrote:
> Hi Balaji, Tony, Ulf, all
>
> v14
> - drop all ifdef/endif introduced by v13
> -- rely on pinctrl_lookup_state to prevent ifdef CONFIG_PM
> -- benefit: all code is compile tested no matter the configuration
> -- drawback: require wake_irq/pinctrl configuration even when
>    runtime suspend is not configured
> - drop runtime state from debugfs output
> - rebased onto current mmc-next 06732b84b4cf

Thanks! Applied for next.

Kind regards
Ulf Hansson

>
> v13
> - fix compile breaks if !CONFIG_PM
> - additional patch: install dummy pm runtime hooks if !CONFIG_PM_RUNTIME
>
> v12
> - drop !CONFIG_OF compile break only exists when
>   #undef CONFIG_OF after include headers 1/7(Sebastian Reichel)
> - do not emit "falling back to polling" if wake_irq not specified
>   since MMC does not need it, and it might confuse users
>   only emit if pinmux default/idle is not present or claiming
>   the irq failed 2/7(Balaji)
> - dropped out-of-tree patches 6/7(Balaji)
> - mention "ti,am33xx-hsmmc" compatible section in bindings
>   documentation 1/5
>
> v11
> - split !CONFIG_OF compile break into separate patch
> - enable IWE/CLKEXTFREE in CON/HCTL register needed for omap4
> - '&' vs '&&' in omap_hsmmc_resume, 1/5 (Andreas Müller)
> - #define DLEV_DAT instead of BIT(21) 2/5 (Balaji)
> - pinctrl_pm_select_default_state() removed, 4/5 (Balaji)
> - drop _irqsave/_irqrestore from omap_hsmmc_wake_irq handler since it
>   can't be preempted by same priority omap_hsmmc_irq handler 1/5(Joel Fernandes)
> - replace devres_open_group by explicit devm_free calls 1/5 (Balaji)
> - disable_irq_nosync wake_irq since we handle it thread safe 1/5 (Balaji)
> - drop 'gpio_dat1' pinctrl states and rework documentation 5/5 (Balaji)
>
> v10
> - bug fix on multi-core, untested
> - incorporated changes from Balaji
> - use devres / RAII mechanism to configure wake_up /
>   sdio irq capabilities
> - drop pinctrl state 'active'
>   rely on driver-model states 'default', 'idle'
> - add specific 'gpio_dat1' state for am335x SWAKEUP hack
> - reorganized patches; +1 patch multi-core bugfix / +1 for pinctrl
> - rebased 455c6fdbd21916 / cherry-picks from mmc-next
>
> v9
> - extended comment about why wake-irq is needed
> - drop double '(' ')' around card_detect_irq
> - drop final '.' in in subject line of patch
>
> v8
> - rebased on top of Tony Lindgren<tony@atomide.com> changes
>   - improved changelog describing the earlier work
>   - improved wakeup irq setup
>   - works for am3730 es platform now
> - my changes on top:
>   - compile tested with #undef CONFIG_OF
>   - disable wake_irq in handler to prevent infinite loop
>   - fixed typo and added comment about wake-irq
>
> v7
> - rebase on 3.14.0-rc3-49726-g77e15ec
> - split omap_hsmmc_pin_init due to regression on omap-3730 platform
>
> v6
> - rebase on Linux 3.13-rc3
> - reformatting debugfs
>
> v5
> - fix compile error introduced by last minute one line fix
>
> v4:
> - switch to interrupts-extended format
> - drop ti,swakeup-missing flag convert to comaptible section
>
> v3:
> - removed gpio_irq from platform_data
>
> v2:
> - incorparated changes as suggested by reviewers
> - simplified workaround for am335x, gpio will now only wake
>   the module from runtime suspend, not handle the sdio irq
>   itself
>
> Andreas Fenkart (6):
>   mmc: omap_hsmmc: Enable SDIO interrupt
>   mmc: omap_hsmmc: Extend debugfs by SDIO IRQ handling, runtime state
>   mmc: omap_hsmmc: enable wakeup event for sdio OMAP4
>   mmc: omap_hsmmc: abort runtime suspend if pending sdio irq detected
>   mmc: omap_hsmmc: switch default/idle pinctrl states in runtime hooks
>   mmc: omap_hsmmc: Pin remux workaround to support SDIO interrupt on
>     AM335x
>
>  .../devicetree/bindings/mmc/ti-omap-hsmmc.txt      |   54 ++++
>  drivers/mmc/host/omap_hsmmc.c                      |  283 ++++++++++++++++++--
>  include/linux/platform_data/mmc-omap.h             |    1 +
>  3 files changed, 317 insertions(+), 21 deletions(-)
>
> --
> 1.7.10.4
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v14 0/6] mmc: omap_hsmmc: Enable SDIO IRQ
  2014-06-16  9:26 ` [PATCH v14 0/6] mmc: omap_hsmmc: Enable SDIO IRQ Ulf Hansson
@ 2014-08-06  6:18   ` Dmitry Lifshitz
  0 siblings, 0 replies; 17+ messages in thread
From: Dmitry Lifshitz @ 2014-08-06  6:18 UTC (permalink / raw)
  To: Ulf Hansson
  Cc: Andreas Fenkart, Tony Lindgren, Chris Ball, Grant Likely,
	Felipe Balbi, Balaji T K, Andreas Mueller, Sebastian Reichel,
	Daniel Mack, Kumar Gala, linux-doc, linux-mmc, linux-omap

Hi,

I did not find this patch set in Chris MMC tree.
I did succeed to locate it in Linaro repo only.

When it will be merged in the mainline?

We are using SDIO IRQ patch with OMAP5 board and it is really useful.

Andreas, thank you.

Regards,

Dmitry


On 06/16/2014 12:26 PM, Ulf Hansson wrote:
> On 29 May 2014 10:27, Andreas Fenkart <afenkart@gmail.com> wrote:
>> Hi Balaji, Tony, Ulf, all
>>
>> v14
>> - drop all ifdef/endif introduced by v13
>> -- rely on pinctrl_lookup_state to prevent ifdef CONFIG_PM
>> -- benefit: all code is compile tested no matter the configuration
>> -- drawback: require wake_irq/pinctrl configuration even when
>>     runtime suspend is not configured
>> - drop runtime state from debugfs output
>> - rebased onto current mmc-next 06732b84b4cf
>
> Thanks! Applied for next.
>
> Kind regards
> Ulf Hansson
>
>>
>> v13
>> - fix compile breaks if !CONFIG_PM
>> - additional patch: install dummy pm runtime hooks if !CONFIG_PM_RUNTIME
>>
>> v12
>> - drop !CONFIG_OF compile break only exists when
>>    #undef CONFIG_OF after include headers 1/7(Sebastian Reichel)
>> - do not emit "falling back to polling" if wake_irq not specified
>>    since MMC does not need it, and it might confuse users
>>    only emit if pinmux default/idle is not present or claiming
>>    the irq failed 2/7(Balaji)
>> - dropped out-of-tree patches 6/7(Balaji)
>> - mention "ti,am33xx-hsmmc" compatible section in bindings
>>    documentation 1/5
>>
>> v11
>> - split !CONFIG_OF compile break into separate patch
>> - enable IWE/CLKEXTFREE in CON/HCTL register needed for omap4
>> - '&' vs '&&' in omap_hsmmc_resume, 1/5 (Andreas Müller)
>> - #define DLEV_DAT instead of BIT(21) 2/5 (Balaji)
>> - pinctrl_pm_select_default_state() removed, 4/5 (Balaji)
>> - drop _irqsave/_irqrestore from omap_hsmmc_wake_irq handler since it
>>    can't be preempted by same priority omap_hsmmc_irq handler 1/5(Joel Fernandes)
>> - replace devres_open_group by explicit devm_free calls 1/5 (Balaji)
>> - disable_irq_nosync wake_irq since we handle it thread safe 1/5 (Balaji)
>> - drop 'gpio_dat1' pinctrl states and rework documentation 5/5 (Balaji)
>>
>> v10
>> - bug fix on multi-core, untested
>> - incorporated changes from Balaji
>> - use devres / RAII mechanism to configure wake_up /
>>    sdio irq capabilities
>> - drop pinctrl state 'active'
>>    rely on driver-model states 'default', 'idle'
>> - add specific 'gpio_dat1' state for am335x SWAKEUP hack
>> - reorganized patches; +1 patch multi-core bugfix / +1 for pinctrl
>> - rebased 455c6fdbd21916 / cherry-picks from mmc-next
>>
>> v9
>> - extended comment about why wake-irq is needed
>> - drop double '(' ')' around card_detect_irq
>> - drop final '.' in in subject line of patch
>>
>> v8
>> - rebased on top of Tony Lindgren<tony@atomide.com> changes
>>    - improved changelog describing the earlier work
>>    - improved wakeup irq setup
>>    - works for am3730 es platform now
>> - my changes on top:
>>    - compile tested with #undef CONFIG_OF
>>    - disable wake_irq in handler to prevent infinite loop
>>    - fixed typo and added comment about wake-irq
>>
>> v7
>> - rebase on 3.14.0-rc3-49726-g77e15ec
>> - split omap_hsmmc_pin_init due to regression on omap-3730 platform
>>
>> v6
>> - rebase on Linux 3.13-rc3
>> - reformatting debugfs
>>
>> v5
>> - fix compile error introduced by last minute one line fix
>>
>> v4:
>> - switch to interrupts-extended format
>> - drop ti,swakeup-missing flag convert to comaptible section
>>
>> v3:
>> - removed gpio_irq from platform_data
>>
>> v2:
>> - incorparated changes as suggested by reviewers
>> - simplified workaround for am335x, gpio will now only wake
>>    the module from runtime suspend, not handle the sdio irq
>>    itself
>>
>> Andreas Fenkart (6):
>>    mmc: omap_hsmmc: Enable SDIO interrupt
>>    mmc: omap_hsmmc: Extend debugfs by SDIO IRQ handling, runtime state
>>    mmc: omap_hsmmc: enable wakeup event for sdio OMAP4
>>    mmc: omap_hsmmc: abort runtime suspend if pending sdio irq detected
>>    mmc: omap_hsmmc: switch default/idle pinctrl states in runtime hooks
>>    mmc: omap_hsmmc: Pin remux workaround to support SDIO interrupt on
>>      AM335x
>>
>>   .../devicetree/bindings/mmc/ti-omap-hsmmc.txt      |   54 ++++
>>   drivers/mmc/host/omap_hsmmc.c                      |  283 ++++++++++++++++++--
>>   include/linux/platform_data/mmc-omap.h             |    1 +
>>   3 files changed, 317 insertions(+), 21 deletions(-)
>>
>> --
>> 1.7.10.4
>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> --
> To unsubscribe from this list: send the line "unsubscribe linux-omap" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>
>


^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v14 1/6] mmc: omap_hsmmc: Enable SDIO interrupt
  2014-05-29  8:28 ` [PATCH v14 1/6] mmc: omap_hsmmc: Enable SDIO interrupt Andreas Fenkart
@ 2014-08-24  8:26   ` Florian Vaussard
  2014-08-24 17:46     ` Andreas Fenkart
  2014-08-24 18:41     ` Tony Lindgren
  0 siblings, 2 replies; 17+ messages in thread
From: Florian Vaussard @ 2014-08-24  8:26 UTC (permalink / raw)
  To: Andreas Fenkart, Tony Lindgren
  Cc: Chris Ball, Grant Likely, Felipe Balbi, Balaji T K,
	Andreas Mueller, Sebastian Reichel, zonque, galak, linux-doc,
	linux-mmc, linux-omap

[-- Attachment #1: Type: text/plain, Size: 1455 bytes --]

Hi Andreas,

On 05/29/2014 10:28 AM, Andreas Fenkart wrote:
> There have been various patches floating around for enabling
> the SDIO IRQ for hsmmc, but none of them ever got merged.
> 

[...]

> For now, only support SDIO interrupt if we are booted with
> a separate wake-irq configued via device tree. This is
> because omaps need the wake-irq for idle states, and some
> omaps need special quirks. And we don't want to add new
> legacy mux platform init code callbacks any longer as we
> are moving to DT based booting anyways.
> 
> To use it, you need to specify the wake-irq using the
> interrupts-extended property.
> 

First, thanks a lot for your tenacity on this patchset, this was a long
needed feature. I enabled the SDIO interrupt, and got the throughput of
my 88W8686-based chip multiplied by 15. Nice! I just have an issue with
the wake-up path, and maybe you could help me.

According to the DM3730 TRM, the MMC2 has the SWAKEUP path. So first I
tried to give the same wake-irq as the MMC's one, but
omap_hsmmc_configure_wake_irq() fails to request it, as they are not
IRQF_SHARED.

So I used the DAT1 for the wake-irq (see patch below), and things are
working. But I get ~2000 wake-irq per seconds, even without any activity
on the WiFi. As a result, the driver is ping-ponging between
omap_hsmmc_runtime_suspend() and omap_hsmmc_runtime_resume(), causing
kworker to eat most of my CPU.

Am I missing something obvious?

Thanks!
Florian



[-- Attachment #2: enable-sdio.patch --]
[-- Type: text/x-patch, Size: 1703 bytes --]

commit 9e1602f58aa4605a8e8392533783720d899debed
Author: Florian Vaussard <florian.vaussard@epfl.ch>
Date:   Sun Aug 24 09:58:04 2014 +0200

    WIP: Enable SDIO IRQ for Wifi on MMC2

diff --git a/arch/arm/boot/dts/omap3-overo-base.dtsi b/arch/arm/boot/dts/omap3-overo-base.dtsi
index 1887c41..66e0cd7 100644
--- a/arch/arm/boot/dts/omap3-overo-base.dtsi
+++ b/arch/arm/boot/dts/omap3-overo-base.dtsi
@@ -119,7 +119,7 @@
 			OMAP3_CORE1_IOPAD(0x2158, PIN_INPUT_PULLUP | MUX_MODE0)		/* sdmmc2_clk.sdmmc2_clk */
 			OMAP3_CORE1_IOPAD(0x215a, PIN_INPUT_PULLUP | MUX_MODE0)		/* sdmmc2_cmd.sdmmc2_cmd */
 			OMAP3_CORE1_IOPAD(0x215c, PIN_INPUT_PULLUP | MUX_MODE0)		/* sdmmc2_dat0.sdmmc2_dat0 */
-			OMAP3_CORE1_IOPAD(0x215e, PIN_INPUT_PULLUP | MUX_MODE0)		/* sdmmc2_dat1.sdmmc2_dat1 */
+			OMAP3_CORE1_IOPAD(0x215e, PIN_INPUT_PULLUP | PIN_OFF_WAKEUPENABLE | MUX_MODE0)		/* sdmmc2_dat1.sdmmc2_dat1 */
 			OMAP3_CORE1_IOPAD(0x2160, PIN_INPUT_PULLUP | MUX_MODE0)		/* sdmmc2_dat2.sdmmc2_dat2 */
 			OMAP3_CORE1_IOPAD(0x2162, PIN_INPUT_PULLUP | MUX_MODE0)		/* sdmmc2_dat3.sdmmc2_dat3 */
 		>;
@@ -195,6 +195,9 @@
 	vmmc_aux-supply = <&w3cbw003c_wifi_nreset>;
 	bus-width = <4>;
 	cap-sdio-irq;
+	
+	interrupts-extended = <&intc 86>,
+			      <&gpio5 5 GPIO_ACTIVE_HIGH>; /* gpio_133 (mmc2.dat1) */
 	non-removable;
 };
 
diff --git a/arch/arm/boot/dts/omap3.dtsi b/arch/arm/boot/dts/omap3.dtsi
index b2891a9..1347bc9 100644
--- a/arch/arm/boot/dts/omap3.dtsi
+++ b/arch/arm/boot/dts/omap3.dtsi
@@ -417,7 +417,6 @@
 		mmc2: mmc@480b4000 {
 			compatible = "ti,omap3-hsmmc";
 			reg = <0x480b4000 0x200>;
-			interrupts = <86>;
 			ti,hwmods = "mmc2";
 			dmas = <&sdma 47>, <&sdma 48>;
 			dma-names = "tx", "rx";

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* Re: [PATCH v14 1/6] mmc: omap_hsmmc: Enable SDIO interrupt
  2014-08-24  8:26   ` Florian Vaussard
@ 2014-08-24 17:46     ` Andreas Fenkart
  2014-08-27  7:57       ` Florian Vaussard
  2014-08-24 18:41     ` Tony Lindgren
  1 sibling, 1 reply; 17+ messages in thread
From: Andreas Fenkart @ 2014-08-24 17:46 UTC (permalink / raw)
  To: florian.vaussard
  Cc: Tony Lindgren, Chris Ball, Grant Likely, Felipe Balbi,
	Balaji T K, Andreas Mueller, Sebastian Reichel, Daniel Mack,
	Kumar Gala, linux-doc, linux-mmc, linux-omap

Hi Florian

2014-08-24 10:26 GMT+02:00 Florian Vaussard <florian.vaussard@epfl.ch>:
> Hi Andreas,
>
> On 05/29/2014 10:28 AM, Andreas Fenkart wrote:
>> There have been various patches floating around for enabling
>> the SDIO IRQ for hsmmc, but none of them ever got merged.
>>
>
> [...]
>
>> For now, only support SDIO interrupt if we are booted with
>> a separate wake-irq configued via device tree. This is
>> because omaps need the wake-irq for idle states, and some
>> omaps need special quirks. And we don't want to add new
>> legacy mux platform init code callbacks any longer as we
>> are moving to DT based booting anyways.
>>
>> To use it, you need to specify the wake-irq using the
>> interrupts-extended property.
>>
>
> First, thanks a lot for your tenacity on this patchset, this was a long
> needed feature. I enabled the SDIO interrupt, and got the throughput of
> my 88W8686-based chip multiplied by 15. Nice! I just have an issue with
> the wake-up path, and maybe you could help me.
>
> According to the DM3730 TRM, the MMC2 has the SWAKEUP path. So first I
> tried to give the same wake-irq as the MMC's one, but
> omap_hsmmc_configure_wake_irq() fails to request it, as they are not
> IRQF_SHARED.

Why can't it be shared?

> So I used the DAT1 for the wake-irq (see patch below), and things are
> working. But I get ~2000 wake-irq per seconds, even without any activity
> on the WiFi. As a result, the driver is ping-ponging between
> omap_hsmmc_runtime_suspend() and omap_hsmmc_runtime_resume(), causing
> kworker to eat most of my CPU.
>
> Am I missing something obvious?
>
> Thanks!
> Florian
>
>

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v14 1/6] mmc: omap_hsmmc: Enable SDIO interrupt
  2014-08-24  8:26   ` Florian Vaussard
  2014-08-24 17:46     ` Andreas Fenkart
@ 2014-08-24 18:41     ` Tony Lindgren
  2014-08-27  7:53       ` Florian Vaussard
  1 sibling, 1 reply; 17+ messages in thread
From: Tony Lindgren @ 2014-08-24 18:41 UTC (permalink / raw)
  To: Florian Vaussard
  Cc: Andreas Fenkart, Chris Ball, Grant Likely, Felipe Balbi,
	Balaji T K, Andreas Mueller, Sebastian Reichel, zonque, galak,
	linux-doc, linux-mmc, linux-omap

* Florian Vaussard <florian.vaussard@epfl.ch> [140824 01:29]:
> --- a/arch/arm/boot/dts/omap3-overo-base.dtsi
> +++ b/arch/arm/boot/dts/omap3-overo-base.dtsi
> @@ -119,7 +119,7 @@
>  			OMAP3_CORE1_IOPAD(0x2158, PIN_INPUT_PULLUP | MUX_MODE0)		/* sdmmc2_clk.sdmmc2_clk */
>  			OMAP3_CORE1_IOPAD(0x215a, PIN_INPUT_PULLUP | MUX_MODE0)		/* sdmmc2_cmd.sdmmc2_cmd */
>  			OMAP3_CORE1_IOPAD(0x215c, PIN_INPUT_PULLUP | MUX_MODE0)		/* sdmmc2_dat0.sdmmc2_dat0 */
> -			OMAP3_CORE1_IOPAD(0x215e, PIN_INPUT_PULLUP | MUX_MODE0)		/* sdmmc2_dat1.sdmmc2_dat1 */
> +			OMAP3_CORE1_IOPAD(0x215e, PIN_INPUT_PULLUP | PIN_OFF_WAKEUPENABLE | MUX_MODE0)		/* sdmmc2_dat1.sdmmc2_dat1 */
>  			OMAP3_CORE1_IOPAD(0x2160, PIN_INPUT_PULLUP | MUX_MODE0)		/* sdmmc2_dat2.sdmmc2_dat2 */
>  			OMAP3_CORE1_IOPAD(0x2162, PIN_INPUT_PULLUP | MUX_MODE0)		/* sdmmc2_dat3.sdmmc2_dat3 */
>  		>;

No need to have PIN_OFF_WAKEUPENABLE any longer here, it gets
enabled automatically after you do request_irq on it.

> @@ -195,6 +195,9 @@
>  	vmmc_aux-supply = <&w3cbw003c_wifi_nreset>;
>  	bus-width = <4>;
>  	cap-sdio-irq;
> +	
> +	interrupts-extended = <&intc 86>,
> +			      <&gpio5 5 GPIO_ACTIVE_HIGH>; /* gpio_133 (mmc2.dat1) */
>  	non-removable;
>  };

The second interrupt here just needs to be &omap3_pmx_core
(or &omap3_pmx_core2 depending where it's located) with the
offset to the dat1 pin from it's padconf area. For example,
on mmc3 it should be:

interrupts-extended = <&intc 94 &omap3_pmx_core2 0x46>;

So you need to look it up from the TRM to figure out the right
offset for mmc2.
  
> diff --git a/arch/arm/boot/dts/omap3.dtsi b/arch/arm/boot/dts/omap3.dtsi
> index b2891a9..1347bc9 100644
> --- a/arch/arm/boot/dts/omap3.dtsi
> +++ b/arch/arm/boot/dts/omap3.dtsi
> @@ -417,7 +417,6 @@
>  		mmc2: mmc@480b4000 {
>  			compatible = "ti,omap3-hsmmc";
>  			reg = <0x480b4000 0x200>;
> -			interrupts = <86>;
>  			ti,hwmods = "mmc2";
>  			dmas = <&sdma 47>, <&sdma 48>;
>  			dma-names = "tx", "rx";

I think there's a patch now in mainline tree that by default tries
to use interrupts-extended first, so this may not need to be
changed.

Regards,

Tony

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v14 1/6] mmc: omap_hsmmc: Enable SDIO interrupt
  2014-08-24 18:41     ` Tony Lindgren
@ 2014-08-27  7:53       ` Florian Vaussard
  0 siblings, 0 replies; 17+ messages in thread
From: Florian Vaussard @ 2014-08-27  7:53 UTC (permalink / raw)
  To: Tony Lindgren
  Cc: Andreas Fenkart, Chris Ball, Grant Likely, Felipe Balbi,
	Balaji T K, Andreas Mueller, Sebastian Reichel, zonque, galak,
	linux-doc, linux-mmc, linux-omap

Hi Tony, Andreas,

On 08/24/2014 08:41 PM, Tony Lindgren wrote:
> * Florian Vaussard <florian.vaussard@epfl.ch> [140824 01:29]:
>> --- a/arch/arm/boot/dts/omap3-overo-base.dtsi
>> +++ b/arch/arm/boot/dts/omap3-overo-base.dtsi
>> @@ -119,7 +119,7 @@
>>  			OMAP3_CORE1_IOPAD(0x2158, PIN_INPUT_PULLUP | MUX_MODE0)		/* sdmmc2_clk.sdmmc2_clk */
>>  			OMAP3_CORE1_IOPAD(0x215a, PIN_INPUT_PULLUP | MUX_MODE0)		/* sdmmc2_cmd.sdmmc2_cmd */
>>  			OMAP3_CORE1_IOPAD(0x215c, PIN_INPUT_PULLUP | MUX_MODE0)		/* sdmmc2_dat0.sdmmc2_dat0 */
>> -			OMAP3_CORE1_IOPAD(0x215e, PIN_INPUT_PULLUP | MUX_MODE0)		/* sdmmc2_dat1.sdmmc2_dat1 */
>> +			OMAP3_CORE1_IOPAD(0x215e, PIN_INPUT_PULLUP | PIN_OFF_WAKEUPENABLE | MUX_MODE0)		/* sdmmc2_dat1.sdmmc2_dat1 */
>>  			OMAP3_CORE1_IOPAD(0x2160, PIN_INPUT_PULLUP | MUX_MODE0)		/* sdmmc2_dat2.sdmmc2_dat2 */
>>  			OMAP3_CORE1_IOPAD(0x2162, PIN_INPUT_PULLUP | MUX_MODE0)		/* sdmmc2_dat3.sdmmc2_dat3 */
>>  		>;
> 
> No need to have PIN_OFF_WAKEUPENABLE any longer here, it gets
> enabled automatically after you do request_irq on it.
> 

Good to know.

>> @@ -195,6 +195,9 @@
>>  	vmmc_aux-supply = <&w3cbw003c_wifi_nreset>;
>>  	bus-width = <4>;
>>  	cap-sdio-irq;
>> +	
>> +	interrupts-extended = <&intc 86>,
>> +			      <&gpio5 5 GPIO_ACTIVE_HIGH>; /* gpio_133 (mmc2.dat1) */
>>  	non-removable;
>>  };
> 
> The second interrupt here just needs to be &omap3_pmx_core
> (or &omap3_pmx_core2 depending where it's located) with the
> offset to the dat1 pin from it's padconf area. For example,
> on mmc3 it should be:
> 
> interrupts-extended = <&intc 94 &omap3_pmx_core2 0x46>;
> 
> So you need to look it up from the TRM to figure out the right
> offset for mmc2.
>   

So now I have:

interrupts-extended = <
	&intc 86
	&omap3_pmx_core OMAP_IOPAD_OFFSET(0x215e, 0x2030)>;

I checked that I have the right offset in the .dtb for mmc2_dat according
to the TRM (0x12E). But the wake-up path seems to be not working any more.
I get several timeouts and a BUG() inside libertas SDIO driver.

[   16.286407] libertas_sdio mmc0:0001:1 (unregistered net_device): 00:19:88:15:b7:c0, fw 9.70.3p24, cap 0x00000303
[   16.292938] libertas_sdio mmc0:0001:1 wlan0: Marvell WLAN 802.11 adapter
[   16.302703] cfg80211: Calling CRDA to update world regulatory domain
[   24.758880] libertas_sdio mmc0:0001:1 wlan0: command 0x0006 timed out
[   24.759582] libertas_sdio mmc0:0001:1 wlan0: Timeout submitting command 0x0006
[   24.761962] libertas_sdio mmc0:0001:1 wlan0: PREP_CMD: command 0x0006 failed: -110
[   24.762084] libertas_sdio: Resetting card...
[   29.768890] libertas_sdio mmc0:0001:1 wlan0: command 0x0006 timed out
[   29.769378] libertas_sdio mmc0:0001:1 wlan0: Timeout submitting command 0x0006
[   29.769531] libertas_sdio mmc0:0001:1 wlan0: PREP_CMD: command 0x0006 failed: -110
[   29.770538] ------------[ cut here ]------------
[   29.775421] kernel BUG at drivers/net/wireless/libertas/if_sdio.c:226!
[   29.782287] Internal error: Oops - BUG: 0 [#1] PREEMPT ARM
[   29.788055] Modules linked in:
[   29.791290] CPU: 0 PID: 471 Comm: ksdioirqd/mmc0 Not tainted 3.16.1mobovero-00014-g9e1602f-dirty #690
[   29.800994] task: dd81c480 ti: def48000 task.ti: def48000
[   29.806671] PC is at if_sdio_interrupt+0x1b4/0x330
[   29.811737] LR is at if_sdio_interrupt+0x194/0x330
[   29.816772] pc : [<c0428e68>]    lr : [<c0428e48>]    psr: 200e0093
[   29.816772] sp : def49ed0  ip : def49ed0  fp : def49efc
[   29.828826] r10: 00000000  r9 : 00000000  r8 : dece0024
[   29.834320] r7 : 0000016e  r6 : 00000001  r5 : 800e0013  r4 : decc43c0
[   29.841186] r3 : 0000051b  r2 : 000003b3  r1 : 00000001  r0 : 00000001
[   29.848052] Flags: nzCv  IRQs off  FIQs on  Mode SVC_32  ISA ARM  Segment kernel
[   29.855834] Control: 10c5387d  Table: 9edd4019  DAC: 00000015
[   29.861877] Process ksdioirqd/mmc0 (pid: 471, stack limit = 0xdef48240)
[   29.868835] Stack: (0xdef49ed0 to 0xdef4a000)
[   29.873413] 9ec0:                                     00000000 00000000 c04d82b0 00000001
[   29.882019] 9ee0: df4c9000 dec7f400 00000000 00000001 def49f34 def49f00 c04d010c c0428cc0
[   29.890624] 9f00: 00100100 00200200 def49f34 dec7f400 def48000 dec7f400 def48000 7fffffff
[   29.899230] 9f20: 00000000 00000001 def49f64 def49f38 c04d02f8 c04d00d4 c04d024c 00000001
[   29.907836] 9f40: 00000000 dd9bda40 00000000 dec7f400 c04d024c 00000000 def49fac def49f68
[   29.916442] 9f60: c005c724 c04d0258 def49f94 00000000 c0066e50 dec7f400 00000000 def49f7c
[   29.925048] 9f80: def49f7c 00000000 def49f88 def49f88 dd9bda40 c005c644 00000000 00000000
[   29.933654] 9fa0: 00000000 def49fb0 c000f1a8 c005c650 00000000 00000000 00000000 00000000
[   29.942260] 9fc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[   29.950866] 9fe0: 00000000 00000000 00000000 00000000 00000013 00000000 00000000 00000000
[   29.959503] [<c0428e68>] (if_sdio_interrupt) from [<c04d010c>] (process_sdio_pending_irqs+0x44/0x184)
[   29.969207] [<c04d010c>] (process_sdio_pending_irqs) from [<c04d02f8>] (sdio_irq_thread+0xac/0x1d8)
[   29.978729] [<c04d02f8>] (sdio_irq_thread) from [<c005c724>] (kthread+0xe0/0xf4)
[   29.986511] [<c005c724>] (kthread) from [<c000f1a8>] (ret_from_fork+0x14/0x20)
[   29.994140] Code: e283300a e7942103 e3520000 0a000000 (e7f001f2) 
[   30.000549] ---[ end trace 7fc618cf4aa9adbc ]---
[   30.005401] note: ksdioirqd/mmc0[471] exited with preempt_count 1
[   30.280792] init: tty1 main process (849) killed by TERM signal
[   32.778930] libertas_sdio mmc0:0001:1 wlan0: command 0x0010 timed out
[   32.785827] libertas_sdio mmc0:0001:1 wlan0: Timeout submitting command 0x0010

>> diff --git a/arch/arm/boot/dts/omap3.dtsi b/arch/arm/boot/dts/omap3.dtsi
>> index b2891a9..1347bc9 100644
>> --- a/arch/arm/boot/dts/omap3.dtsi
>> +++ b/arch/arm/boot/dts/omap3.dtsi
>> @@ -417,7 +417,6 @@
>>  		mmc2: mmc@480b4000 {
>>  			compatible = "ti,omap3-hsmmc";
>>  			reg = <0x480b4000 0x200>;
>> -			interrupts = <86>;
>>  			ti,hwmods = "mmc2";
>>  			dmas = <&sdma 47>, <&sdma 48>;
>>  			dma-names = "tx", "rx";
> 
> I think there's a patch now in mainline tree that by default tries
> to use interrupts-extended first, so this may not need to be
> changed.
> 

I based my tests on 3.16.1, this is why I had to do this.
I just tried with 3.17-rc2, same result.

Unfortunately, I do not have a lot of time to debug this issue for
now, but if you have ideas, I would be happy to test.

Regards
Florian

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v14 1/6] mmc: omap_hsmmc: Enable SDIO interrupt
  2014-08-24 17:46     ` Andreas Fenkart
@ 2014-08-27  7:57       ` Florian Vaussard
  0 siblings, 0 replies; 17+ messages in thread
From: Florian Vaussard @ 2014-08-27  7:57 UTC (permalink / raw)
  To: Andreas Fenkart
  Cc: Tony Lindgren, Chris Ball, Grant Likely, Felipe Balbi,
	Balaji T K, Andreas Mueller, Sebastian Reichel, Daniel Mack,
	Kumar Gala, linux-doc, linux-mmc, linux-omap

Hi Andreas,

On 08/24/2014 07:46 PM, Andreas Fenkart wrote:
> Hi Florian
> 
> 2014-08-24 10:26 GMT+02:00 Florian Vaussard <florian.vaussard@epfl.ch>:
>> Hi Andreas,
>>
>> On 05/29/2014 10:28 AM, Andreas Fenkart wrote:
>>> There have been various patches floating around for enabling
>>> the SDIO IRQ for hsmmc, but none of them ever got merged.
>>>
>>
>> [...]
>>
>>> For now, only support SDIO interrupt if we are booted with
>>> a separate wake-irq configued via device tree. This is
>>> because omaps need the wake-irq for idle states, and some
>>> omaps need special quirks. And we don't want to add new
>>> legacy mux platform init code callbacks any longer as we
>>> are moving to DT based booting anyways.
>>>
>>> To use it, you need to specify the wake-irq using the
>>> interrupts-extended property.
>>>
>>
>> First, thanks a lot for your tenacity on this patchset, this was a long
>> needed feature. I enabled the SDIO interrupt, and got the throughput of
>> my 88W8686-based chip multiplied by 15. Nice! I just have an issue with
>> the wake-up path, and maybe you could help me.
>>
>> According to the DM3730 TRM, the MMC2 has the SWAKEUP path. So first I
>> tried to give the same wake-irq as the MMC's one, but
>> omap_hsmmc_configure_wake_irq() fails to request it, as they are not
>> IRQF_SHARED.
> 
> Why can't it be shared?
> 

I first tried

interrupts-extended = <&intc 86 &intc 86>;

but devm_request_irq() in omap_hsmmc_configure_wake_irq() fails.
But this is probably not the good approach, as Tony pointed out.

Regards,
Florian

^ permalink raw reply	[flat|nested] 17+ messages in thread

end of thread, other threads:[~2014-08-27  7:57 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-05-29  8:27 [PATCH v14 0/6] mmc: omap_hsmmc: Enable SDIO IRQ Andreas Fenkart
2014-05-29  8:28 ` [PATCH v14 1/6] mmc: omap_hsmmc: Enable SDIO interrupt Andreas Fenkart
2014-08-24  8:26   ` Florian Vaussard
2014-08-24 17:46     ` Andreas Fenkart
2014-08-27  7:57       ` Florian Vaussard
2014-08-24 18:41     ` Tony Lindgren
2014-08-27  7:53       ` Florian Vaussard
2014-05-29  8:28 ` [PATCH v14 2/6] mmc: omap_hsmmc: Extend debugfs by SDIO IRQ handling, runtime state Andreas Fenkart
2014-05-29 13:38   ` Balaji T K
2014-05-29  8:28 ` [PATCH v14 3/6] mmc: omap_hsmmc: enable wakeup event for sdio OMAP4 Andreas Fenkart
2014-05-29  8:28 ` [PATCH v14 4/6] mmc: omap_hsmmc: abort runtime suspend if pending sdio irq detected Andreas Fenkart
2014-05-29  8:28 ` [PATCH v14 5/6] mmc: omap_hsmmc: switch default/idle pinctrl states in runtime hooks Andreas Fenkart
2014-05-29  8:28 ` [PATCH v14 6/6] mmc: omap_hsmmc: Pin remux workaround to support SDIO interrupt on AM335x Andreas Fenkart
2014-05-29 13:41   ` Balaji T K
2014-06-02 22:38     ` Tony Lindgren
2014-06-16  9:26 ` [PATCH v14 0/6] mmc: omap_hsmmc: Enable SDIO IRQ Ulf Hansson
2014-08-06  6:18   ` Dmitry Lifshitz

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.