mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Arnd Bergmann <arnd@arndb.de>
To: linux-arm-msm@vger.kernel.org
Cc: linux-arm-kernel@lists.infradead.org,
	David Brown <davidb@codeaurora.org>,
	Daniel Walker <dwalker@fifo99.com>,
	Bryan Huntsman <bryanh@codeaurora.org>,
	Stephen Boyd <sboyd@codeaurora.org>,
	Tim Bird <tim.bird@sonymobile.com>,
	Bjorn Andersson <bjorn.andersson@sonymobile.com>,
	Linus Walleij <linus.walleij@linaro.org>,
	linux-kernel@vger.kernel.org,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Ulf Hansson <ulf.hansson@linaro.org>,
	Arnd Bergmann <arnd@arndb.de>
Subject: [RFC PATCH 03/18] mmc: msm: pass dmov resources via device
Date: Wed,  4 Mar 2015 20:32:57 +0100	[thread overview]
Message-ID: <1425497592-1831064-4-git-send-email-arnd@arndb.de> (raw)
In-Reply-To: <1425497592-1831064-1-git-send-email-arnd@arndb.de>

The data mover code that got moved here from arch/arm was not
using the device model at all. This tries to retrofit it
passing the irq and mmio address using resources.

The approach is a little half-baked, but it still seems better
than the original code. One problem now is that the resources
are not getting cleaned up properly. Instead of doing something
that I can't test myself, I just disable module unloading to
avoid having to rewrite more than necessary.

It's unclear whether this works with multiple sdcc devices.
What I know is that no platform in the kernel registers more
than one at the moment, and I suspect that trying to use more
than one was already broken. If it was working previously,
it most likely keeps working, and it's unlikely that we will
see new users of this driver that require more than one
device.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
 arch/arm/mach-msm/devices-msm7x00.c | 44 +++++++++++++++++++++++++++++++++++
 arch/arm/mach-msm/devices-qsd8x50.c | 44 +++++++++++++++++++++++++++++++++++
 drivers/mmc/host/msm_sdcc.c         | 46 ++++++++++++++++++++++---------------
 3 files changed, 115 insertions(+), 19 deletions(-)

diff --git a/arch/arm/mach-msm/devices-msm7x00.c b/arch/arm/mach-msm/devices-msm7x00.c
index d83404d4b328..aa3feeb96414 100644
--- a/arch/arm/mach-msm/devices-msm7x00.c
+++ b/arch/arm/mach-msm/devices-msm7x00.c
@@ -211,6 +211,17 @@ static struct resource resources_sdc1[] = {
 		.name	= "status_irq"
 	},
 	{
+		.start	= INT_ADM_AARM,
+		.end	= INT_ADM_AARM,
+		.flags	= IORESOURCE_IRQ,
+		.name	= "dmov_irq",
+	},
+	{
+		.start	= MSM_DMOV_PHYS + (3 * 0x400),
+		.end	= MSM_DMOV_PHYS + (4 * 0x400) - 1,
+		.flags	= IORESOURCE_MEM,
+	},
+	{
 		.start	= 8,
 		.end	= 8,
 		.flags	= IORESOURCE_DMA,
@@ -234,6 +245,17 @@ static struct resource resources_sdc2[] = {
 		.name	= "status_irq"
 	},
 	{
+		.start	= INT_ADM_AARM,
+		.end	= INT_ADM_AARM,
+		.flags	= IORESOURCE_IRQ,
+		.name	= "dmov_irq",
+	},
+	{
+		.start	= MSM_DMOV_PHYS + (3 * 0x400),
+		.end	= MSM_DMOV_PHYS + (4 * 0x400) - 1,
+		.flags	= IORESOURCE_MEM,
+	},
+	{
 		.start	= 8,
 		.end	= 8,
 		.flags	= IORESOURCE_DMA,
@@ -257,6 +279,17 @@ static struct resource resources_sdc3[] = {
 		.name	= "status_irq"
 	},
 	{
+		.start	= INT_ADM_AARM,
+		.end	= INT_ADM_AARM,
+		.flags	= IORESOURCE_IRQ,
+		.name	= "dmov_irq",
+	},
+	{
+		.start	= MSM_DMOV_PHYS + (3 * 0x400),
+		.end	= MSM_DMOV_PHYS + (4 * 0x400) - 1,
+		.flags	= IORESOURCE_MEM,
+	},
+	{
 		.start	= 8,
 		.end	= 8,
 		.flags	= IORESOURCE_DMA,
@@ -280,6 +313,17 @@ static struct resource resources_sdc4[] = {
 		.name	= "status_irq"
 	},
 	{
+		.start	= INT_ADM_AARM,
+		.end	= INT_ADM_AARM,
+		.flags	= IORESOURCE_IRQ,
+		.name	= "dmov_irq",
+	},
+	{
+		.start	= MSM_DMOV_PHYS + (3 * 0x400),
+		.end	= MSM_DMOV_PHYS + (4 * 0x400) - 1,
+		.flags	= IORESOURCE_MEM,
+	},
+	{
 		.start	= 8,
 		.end	= 8,
 		.flags	= IORESOURCE_DMA,
diff --git a/arch/arm/mach-msm/devices-qsd8x50.c b/arch/arm/mach-msm/devices-qsd8x50.c
index dfc884521fc1..6db025cef825 100644
--- a/arch/arm/mach-msm/devices-qsd8x50.c
+++ b/arch/arm/mach-msm/devices-qsd8x50.c
@@ -175,6 +175,17 @@ static struct resource resources_sdc1[] = {
 		.name	= "status_irq"
 	},
 	{
+		.start	= INT_ADM_AARM,
+		.end	= INT_ADM_AARM,
+		.flags	= IORESOURCE_IRQ,
+		.name	= "dmov_irq",
+	},
+	{
+		.start	= MSM_DMOV_PHYS + (3 * 0x400),
+		.end	= MSM_DMOV_PHYS + (4 * 0x400) - 1,
+		.flags	= IORESOURCE_MEM,
+	},
+	{
 		.start	= 8,
 		.end	= 8,
 		.flags	= IORESOURCE_DMA,
@@ -198,6 +209,17 @@ static struct resource resources_sdc2[] = {
 		.name	= "status_irq"
 	},
 	{
+		.start	= INT_ADM_AARM,
+		.end	= INT_ADM_AARM,
+		.flags	= IORESOURCE_IRQ,
+		.name	= "dmov_irq",
+	},
+	{
+		.start	= MSM_DMOV_PHYS + (3 * 0x400),
+		.end	= MSM_DMOV_PHYS + (4 * 0x400) - 1,
+		.flags	= IORESOURCE_MEM,
+	},
+	{
 		.start	= 8,
 		.end	= 8,
 		.flags	= IORESOURCE_DMA,
@@ -221,6 +243,17 @@ static struct resource resources_sdc3[] = {
 		.name	= "status_irq"
 	},
 	{
+		.start	= INT_ADM_AARM,
+		.end	= INT_ADM_AARM,
+		.flags	= IORESOURCE_IRQ,
+		.name	= "dmov_irq",
+	},
+	{
+		.start	= MSM_DMOV_PHYS + (3 * 0x400),
+		.end	= MSM_DMOV_PHYS + (4 * 0x400) - 1,
+		.flags	= IORESOURCE_MEM,
+	},
+	{
 		.start	= 8,
 		.end	= 8,
 		.flags	= IORESOURCE_DMA,
@@ -244,6 +277,17 @@ static struct resource resources_sdc4[] = {
 		.name	= "status_irq"
 	},
 	{
+		.start	= INT_ADM_AARM,
+		.end	= INT_ADM_AARM,
+		.flags	= IORESOURCE_IRQ,
+		.name	= "dmov_irq",
+	},
+	{
+		.start	= MSM_DMOV_PHYS + (3 * 0x400),
+		.end	= MSM_DMOV_PHYS + (4 * 0x400) - 1,
+		.flags	= IORESOURCE_MEM,
+	},
+	{
 		.start	= 8,
 		.end	= 8,
 		.flags	= IORESOURCE_DMA,
diff --git a/drivers/mmc/host/msm_sdcc.c b/drivers/mmc/host/msm_sdcc.c
index 83dc4e5d9963..3002e377e9f7 100644
--- a/drivers/mmc/host/msm_sdcc.c
+++ b/drivers/mmc/host/msm_sdcc.c
@@ -45,7 +45,6 @@
 #include <asm/sizes.h>
 
 #include <linux/platform_data/mmc-msm_sdcc.h>
-#include <mach/msm_iomap.h>
 #include <mach/clk.h>
 
 /* data mover definitions */
@@ -170,16 +169,7 @@ typedef struct {
 
 #define MSM_DMOV_CHANNEL_COUNT 16
 
-#define DMOV_SD0(off, ch) (MSM_DMOV_BASE + 0x0000 + (off) + ((ch) << 2))
-#define DMOV_SD1(off, ch) (MSM_DMOV_BASE + 0x0400 + (off) + ((ch) << 2))
-#define DMOV_SD2(off, ch) (MSM_DMOV_BASE + 0x0800 + (off) + ((ch) << 2))
-#define DMOV_SD3(off, ch) (MSM_DMOV_BASE + 0x0C00 + (off) + ((ch) << 2))
-
-#if defined(CONFIG_ARCH_MSM7X30)
-#define DMOV_SD_AARM DMOV_SD2
-#else
-#define DMOV_SD_AARM DMOV_SD3
-#endif
+#define DMOV_SD_AARM(off, ch) (msm_dmov_base + (off) + ((ch) << 2))
 
 #define DMOV_CMD_PTR(ch)      DMOV_SD_AARM(0x000, ch)
 #define DMOV_RSLT(ch)         DMOV_SD_AARM(0x040, ch)
@@ -203,6 +193,8 @@ enum {
 
 static DEFINE_SPINLOCK(msm_dmov_lock);
 static struct clk *msm_dmov_clk;
+static int msm_dmov_irq;
+static void __iomem *msm_dmov_base;
 static unsigned int channel_active;
 static struct list_head ready_commands[MSM_DMOV_CHANNEL_COUNT];
 static struct list_head active_commands[MSM_DMOV_CHANNEL_COUNT];
@@ -248,7 +240,7 @@ static void msm_dmov_enqueue_cmd(unsigned id, struct msm_dmov_cmd *cmd)
 		PRINT_IO("msm_dmov_enqueue_cmd(%d), start command, status %x\n", id, status);
 		list_add_tail(&cmd->list, &active_commands[id]);
 		if (!channel_active)
-			enable_irq(INT_ADM_AARM);
+			enable_irq(msm_dmov_irq);
 		channel_active |= 1U << id;
 		writel(cmd->cmdptr, DMOV_CMD_PTR(id));
 	} else {
@@ -370,7 +362,7 @@ static irqreturn_t msm_datamover_irq_handler(int irq, void *dev_id)
 	}
 
 	if (!channel_active) {
-		disable_irq_nosync(INT_ADM_AARM);
+		disable_irq_nosync(msm_dmov_irq);
 		clk_disable(msm_dmov_clk);
 	}
 
@@ -378,12 +370,18 @@ static irqreturn_t msm_datamover_irq_handler(int irq, void *dev_id)
 	return IRQ_HANDLED;
 }
 
-static int __init msm_init_datamover(void)
+static int msm_init_datamover(int irq, resource_size_t phys)
 {
 	int i;
 	int ret;
 	struct clk *clk;
 
+	if (msm_dmov_irq || msm_dmov_base)
+		return -EBUSY;
+
+	msm_dmov_irq = irq;
+	msm_dmov_base = ioremap(phys, 0x400);
+
 	for (i = 0; i < MSM_DMOV_CHANNEL_COUNT; i++) {
 		INIT_LIST_HEAD(&ready_commands[i]);
 		INIT_LIST_HEAD(&active_commands[i]);
@@ -394,13 +392,12 @@ static int __init msm_init_datamover(void)
 		return PTR_ERR(clk);
 	clk_prepare(clk);
 	msm_dmov_clk = clk;
-	ret = request_irq(INT_ADM_AARM, msm_datamover_irq_handler, 0, "msmdatamover", NULL);
+	ret = request_irq(msm_dmov_irq, msm_datamover_irq_handler, 0, "msmdatamover", NULL);
 	if (ret)
 		return ret;
-	disable_irq(INT_ADM_AARM);
+	disable_irq(msm_dmov_irq);
 	return 0;
 }
-module_init(msm_init_datamover);
 
 /* now the actual SD card driver */
 
@@ -1529,8 +1526,10 @@ msmsdcc_probe(struct platform_device *pdev)
 	struct mmc_host *mmc;
 	struct resource *cmd_irqres = NULL;
 	struct resource *stat_irqres = NULL;
+	struct resource *dmov_irqres = NULL;
 	struct resource *memres = NULL;
 	struct resource *dmares = NULL;
+	struct resource *dmovres = NULL;
 	int ret;
 
 	/* must have platform data */
@@ -1549,17 +1548,22 @@ msmsdcc_probe(struct platform_device *pdev)
 	}
 
 	memres = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+	dmovres = platform_get_resource(pdev, IORESOURCE_MEM, 1);
 	dmares = platform_get_resource(pdev, IORESOURCE_DMA, 0);
 	cmd_irqres = platform_get_resource_byname(pdev, IORESOURCE_IRQ,
 						  "cmd_irq");
 	stat_irqres = platform_get_resource_byname(pdev, IORESOURCE_IRQ,
 						   "status_irq");
+	dmov_irqres = platform_get_resource_byname(pdev, IORESOURCE_IRQ,
+						   "dmov_irq");
 
-	if (!cmd_irqres || !memres) {
+	if (!cmd_irqres || !memres || !dmov_irqres || !dmovres) {
 		pr_err("%s: Invalid resource\n", __func__);
 		return -ENXIO;
 	}
 
+	msm_init_datamover(dmov_irqres->start, dmovres->start);
+
 	/*
 	 * Setup our host structure
 	 */
@@ -1826,7 +1830,11 @@ static struct platform_driver msmsdcc_driver = {
 	},
 };
 
-module_platform_driver(msmsdcc_driver);
+static int __init msmsdcc_init(void)
+{
+	return platform_driver_register(&msmsdcc_driver);
+}
+module_init(msmsdcc_init);
 
 MODULE_DESCRIPTION("Qualcomm MSM 7X00A Multimedia Card Interface driver");
 MODULE_LICENSE("GPL");
-- 
2.1.0.rc2


  parent reply	other threads:[~2015-03-04 19:33 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-03-04 19:32 [RFC PATCH 00/18] ARM: msm multiplatform support Arnd Bergmann
2015-03-04 19:32 ` [RFC PATCH 01/18] serial: remove obsolete msm_serial_hs driver Arnd Bergmann
2015-03-04 20:03   ` Paul Bolle
2015-03-04 20:07     ` Paul Bolle
2015-03-04 20:38       ` Arnd Bergmann
2015-03-04 19:32 ` [RFC PATCH 02/18] mmc: msm: move data mover into mmc driver Arnd Bergmann
2015-03-13 13:14   ` Ulf Hansson
2015-03-04 19:32 ` Arnd Bergmann [this message]
2015-03-13 13:15   ` [RFC PATCH 03/18] mmc: msm: pass dmov resources via device Ulf Hansson
2015-03-04 19:32 ` [RFC PATCH 04/18] mmc: msm: move clk-reset logic to platform Arnd Bergmann
2015-03-13 13:15   ` Ulf Hansson
2015-03-04 19:32 ` [RFC PATCH 05/18] ARM: msm: fix qsd8x50 rev.a support Arnd Bergmann
2015-03-04 19:33 ` [RFC PATCH 06/18] ARM: msm: fix mach/msm_iomap.h inclusions Arnd Bergmann
2015-03-04 19:33 ` [RFC PATCH 07/18] ARM: msm: fix sirc code for multiplatform Arnd Bergmann
2015-03-04 19:33 ` [RFC PATCH 08/18] ARM: msm: fix gpiomux config " Arnd Bergmann
2015-03-04 19:33 ` [RFC PATCH 09/18] ARM: msm: fix vic irqchip " Arnd Bergmann
2015-03-04 19:33 ` [RFC PATCH 10/18] gpio: move msm-v1 driver to mach-msm Arnd Bergmann
2015-03-09 16:10   ` Linus Walleij
2015-03-04 19:33 ` [RFC PATCH 11/18] clocksource: qcom: make mach-msm and mach-qcom coexist Arnd Bergmann
2015-03-04 19:33 ` [RFC PATCH 12/18] ARM: msm: make smd behave like a normal driver Arnd Bergmann
2015-03-04 19:33 ` [RFC PATCH 13/18] ARM: msm: rename conflicting symbols Arnd Bergmann
2015-03-04 19:33 ` [RFC PATCH 14/18] ARM: msm: pass gpio irq range as resource Arnd Bergmann
2015-03-04 19:33 ` [RFC PATCH 15/18] ARM: msm: clean up irq handling Arnd Bergmann
2015-03-04 19:33 ` [RFC PATCH 16/18] ARM: msm: make msm_smd.h global Arnd Bergmann
2015-03-04 19:33 ` [RFC PATCH 17/18] ARM: msm: make all header files local Arnd Bergmann
2015-03-04 19:33 ` [RFC PATCH 18/18] ARM: msm: enable multiplatform support Arnd Bergmann
2015-03-04 20:31 ` [RFC PATCH 00/18] ARM: msm " Paul Bolle
2015-03-04 20:35   ` Arnd Bergmann
2015-03-04 21:09     ` Paul Bolle
2015-03-04 21:14       ` Paul Bolle
2015-03-04 22:11 ` dwalker
2015-03-04 22:30   ` Arnd Bergmann
2015-03-05 16:40 ` Ulf Hansson
2015-03-08 22:52   ` Arnd Bergmann
2015-03-07  3:12 ` dwalker
2015-03-12 16:27   ` Arnd Bergmann

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1425497592-1831064-4-git-send-email-arnd@arndb.de \
    --to=arnd@arndb.de \
    --cc=bjorn.andersson@sonymobile.com \
    --cc=bryanh@codeaurora.org \
    --cc=davidb@codeaurora.org \
    --cc=dwalker@fifo99.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=linus.walleij@linaro.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-arm-msm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=sboyd@codeaurora.org \
    --cc=tim.bird@sonymobile.com \
    --cc=ulf.hansson@linaro.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®