summaryrefslogtreecommitdiff
path: root/drivers/mmc/host/mmci_qcom_dml.c
diff options
context:
space:
mode:
authorLudovic Barre <ludovic.barre@st.com>2018-10-08 14:08:33 +0200
committerUlf Hansson <ulf.hansson@linaro.org>2018-10-09 09:13:03 +0200
commitc3647fdc6a5a48699a1248a7f3d9a0429369e939 (patch)
tree991fad512b5c4613290f3dc9b1feaa4ef94130c2 /drivers/mmc/host/mmci_qcom_dml.c
parentf0061fed1f8a9f86ddec303a3f94742a71b20cb7 (diff)
mmc: mmci: create common mmci_dma_setup/release
This patch creates a common mmci_dma_setup/release which calls dma_setup/release callbacks of mmci_host_ops and manages common features like use_dma... If there is a fallbacks to pio mode, dma functions must check use_dma. error management: -mmci_dmae_setup fail if Tx and Rx dma channels are not defined -qcom_dma_setup fail if one of both dma channels is not defined, Qcom has no specific resource to release, just mmci dmae resource. Signed-off-by: Ludovic Barre <ludovic.barre@st.com> Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Diffstat (limited to 'drivers/mmc/host/mmci_qcom_dml.c')
-rw-r--r--drivers/mmc/host/mmci_qcom_dml.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/drivers/mmc/host/mmci_qcom_dml.c b/drivers/mmc/host/mmci_qcom_dml.c
index be3fab5db83f..92b03a3343e5 100644
--- a/drivers/mmc/host/mmci_qcom_dml.c
+++ b/drivers/mmc/host/mmci_qcom_dml.c
@@ -119,19 +119,23 @@ static int of_get_dml_pipe_index(struct device_node *np, const char *name)
}
/* Initialize the dml hardware connected to SD Card controller */
-static void qcom_dma_setup(struct mmci_host *host)
+static int qcom_dma_setup(struct mmci_host *host)
{
u32 config;
void __iomem *base;
int consumer_id, producer_id;
struct device_node *np = host->mmc->parent->of_node;
+ if (mmci_dmae_setup(host))
+ return -EINVAL;
+
consumer_id = of_get_dml_pipe_index(np, "tx");
producer_id = of_get_dml_pipe_index(np, "rx");
if (producer_id < 0 || consumer_id < 0) {
host->variant->qcom_dml = false;
- return;
+ mmci_dmae_release(host);
+ return -EINVAL;
}
base = host->base + DML_OFFSET;
@@ -175,10 +179,13 @@ static void qcom_dma_setup(struct mmci_host *host)
/* Make sure dml initialization is finished */
mb();
+
+ return 0;
}
static struct mmci_host_ops qcom_variant_ops = {
.dma_setup = qcom_dma_setup,
+ .dma_release = mmci_dmae_release,
};
void qcom_variant_init(struct mmci_host *host)