mmc: mmci: Add and implement a ->dma_setup() callback for qcom dml
authorUlf Hansson <ulf.hansson@linaro.org>
Mon, 16 Jul 2018 11:08:18 +0000 (13:08 +0200)
committerUlf Hansson <ulf.hansson@linaro.org>
Wed, 1 Aug 2018 10:01:13 +0000 (12:01 +0200)
As a first step to improve the variant specific code for mmci, add a
->dma_setup() callback to the struct mmci_host_ops.

To show its use, let's deploy the callback for the qcom dml, which involves
also to the assign the mmci_host_ops pointer from the variant ->init()
callback.

Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Reviewed-by: Ludovic Barre <ludovic.barre@st.com>
drivers/mmc/host/mmci.c
drivers/mmc/host/mmci.h
drivers/mmc/host/mmci_qcom_dml.c
drivers/mmc/host/mmci_qcom_dml.h

index e907a0a866da71186aa54bc7aea4a33390029911..1841d250e9e2c67690d06e10f382e45857b6f6d9 100644 (file)
@@ -208,6 +208,7 @@ static struct variant_data variant_qcom = {
        .mmcimask1              = true,
        .start_err              = MCI_STARTBITERR,
        .opendrain              = MCI_ROD,
+       .init                   = qcom_variant_init,
 };
 
 /* Busy detection for the ST Micro variant */
@@ -417,7 +418,6 @@ static void mmci_init_sg(struct mmci_host *host, struct mmc_data *data)
 static void mmci_dma_setup(struct mmci_host *host)
 {
        const char *rxname, *txname;
-       struct variant_data *variant = host->variant;
 
        host->dma_rx_channel = dma_request_slave_channel(mmc_dev(host->mmc), "rx");
        host->dma_tx_channel = dma_request_slave_channel(mmc_dev(host->mmc), "tx");
@@ -465,9 +465,8 @@ static void mmci_dma_setup(struct mmci_host *host)
                        host->mmc->max_seg_size = max_seg_size;
        }
 
-       if (variant->qcom_dml && host->dma_rx_channel && host->dma_tx_channel)
-               if (dml_hw_init(host, host->mmc->parent->of_node))
-                       variant->qcom_dml = false;
+       if (host->ops && host->ops->dma_setup)
+               host->ops->dma_setup(host);
 }
 
 /*
index f2eff0cc6934a981fcaad5263d6957326320d58d..517591d219e933fc233c636adcbff268f4bb621e 100644 (file)
@@ -273,6 +273,7 @@ struct variant_data {
 
 /* mmci variant callbacks */
 struct mmci_host_ops {
+       void (*dma_setup)(struct mmci_host *host);
 };
 
 struct mmci_host_next {
index 00750c9d35145ddc291904f7a0c9a4a261f3f48c..be3fab5db83fc7bc68e03ba4c87ef748ba7ec2d8 100644 (file)
@@ -119,17 +119,20 @@ static int of_get_dml_pipe_index(struct device_node *np, const char *name)
 }
 
 /* Initialize the dml hardware connected to SD Card controller */
-int dml_hw_init(struct mmci_host *host, struct device_node *np)
+static void 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;
 
        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)
-               return -ENODEV;
+       if (producer_id < 0 || consumer_id < 0) {
+               host->variant->qcom_dml = false;
+               return;
+       }
 
        base = host->base + DML_OFFSET;
 
@@ -172,6 +175,13 @@ int dml_hw_init(struct mmci_host *host, struct device_node *np)
 
        /* Make sure dml initialization is finished */
        mb();
+}
 
-       return 0;
+static struct mmci_host_ops qcom_variant_ops = {
+       .dma_setup = qcom_dma_setup,
+};
+
+void qcom_variant_init(struct mmci_host *host)
+{
+       host->ops = &qcom_variant_ops;
 }
index 6e405d09d534709bc8e4e9cded31eeb310725b57..fa16f6f4d4adb499abb24a6c171041d544fdea1b 100644 (file)
 #define __MMC_QCOM_DML_H__
 
 #ifdef CONFIG_MMC_QCOM_DML
-int dml_hw_init(struct mmci_host *host, struct device_node *np);
+void qcom_variant_init(struct mmci_host *host);
 void dml_start_xfer(struct mmci_host *host, struct mmc_data *data);
 #else
-static inline int dml_hw_init(struct mmci_host *host, struct device_node *np)
+static inline void qcom_variant_init(struct mmci_host *host)
 {
-       return -ENOSYS;
 }
 static inline void dml_start_xfer(struct mmci_host *host, struct mmc_data *data)
 {