]> rtime.felk.cvut.cz Git - hercules2020/nv-tegra/linux-4.4.git/commitdiff
mmc: Add RTPM hooks in CQ driver
authorR Raj Kumar <rrajk@nvidia.com>
Tue, 29 Dec 2015 10:27:56 +0000 (15:57 +0530)
committerR Raj Kumar <rrajk@nvidia.com>
Tue, 5 Jul 2016 10:41:57 +0000 (03:41 -0700)
Added runtime pm hooks in command queue host driver
to support clock gating feature.

Bug 200193440

Change-Id: If531311411670766b64fcafa94cf667682610517
Reviewed-on: http://git-master/r/927440

Signed-off-by: R Raj Kumar <rrajk@nvidia.com>
Change-Id: Ib57f0f7c9625585bac3fc3defeb727496d020d96
Reviewed-on: http://git-master/r/1174999
Reviewed-by: Venu Byravarasu <vbyravarasu@nvidia.com>
drivers/mmc/host/cmdq_hci.c
drivers/mmc/host/sdhci.c
include/linux/mmc/cmdq_hci.h

index 66dcbc9d878ac27166e3181fa9c7239cee17ab4e..cf3bb627cf226b7a1262398f2b6fa67ba94f4c2a 100644 (file)
@@ -483,6 +483,9 @@ static int cmdq_request(struct mmc_host *mmc, struct mmc_request *mrq)
                goto out;
        }
 
+       if (cq_host->ops->runtime_pm_get)
+               cq_host->ops->runtime_pm_get(mmc);
+
        spin_lock_irqsave(&cq_host->cmdq_lock, flags);
 
        if (mrq->cmdq_req->cmdq_req_flags & DCMD) {
@@ -531,6 +534,8 @@ static void cmdq_finish_data(struct mmc_host *mmc, unsigned int tag)
 
        mrq = cq_host->mrq_slot[tag];
        mrq->done(mrq);
+       if (cq_host->ops->runtime_pm_put)
+               cq_host->ops->runtime_pm_put(mmc);
 }
 
 irqreturn_t cmdq_irq(struct mmc_host *mmc, u32 intmask)
index 0a5d37f55f4601fb9bf601bb9a924845eb55f8b2..88aac46f7086972f5eaa99d0673076b3541fbd8f 100644 (file)
@@ -3133,6 +3133,20 @@ static int sdhci_cmdq_init(struct sdhci_host *host, struct mmc_host *mmc,
 {
        return cmdq_init(host->cq_host, mmc, dma64);
 }
+
+static void sdhci_cmdq_runtime_pm_get(struct mmc_host *mmc)
+{
+       struct sdhci_host *host = mmc_priv(mmc);
+
+       sdhci_runtime_pm_get(host);
+}
+
+static void sdhci_cmdq_runtime_pm_put(struct mmc_host *mmc)
+{
+       struct sdhci_host *host = mmc_priv(mmc);
+
+       sdhci_runtime_pm_put(host);
+}
 #else
 static void sdhci_cmdq_clear_set_irqs(struct mmc_host *mmc, u32 clear, u32 set)
 {
@@ -3155,12 +3169,24 @@ static int sdhci_cmdq_init(struct sdhci_host *host, struct mmc_host *mmc,
                return -ENOSYS;
 }
 
+static void sdhci_cmdq_runtime_pm_get(struct mmc_host *mmc)
+{
+
+}
+
+static void sdhci_cmdq_runtime_pm_put(struct mmc_host *mmc)
+{
+
+}
+
 #endif
 
 static const struct cmdq_host_ops sdhci_cmdq_ops = {
        .clear_set_irqs = sdhci_cmdq_clear_set_irqs,
        .set_data_timeout = sdhci_cmdq_set_data_timeout,
        .dump_vendor_regs = sdhci_cmdq_dump_vendor_regs,
+       .runtime_pm_get = sdhci_cmdq_runtime_pm_get,
+       .runtime_pm_put = sdhci_cmdq_runtime_pm_put,
 };
 
 int sdhci_add_host(struct sdhci_host *host)
index 0f4c6b8ae4a992c4ff59c7e59e9d49af7d94ad96..afc98411cd7e454d8584af4a30ead8297463dd23 100644 (file)
@@ -158,6 +158,8 @@ struct cmdq_host_ops {
        void (*dump_vendor_regs)(struct mmc_host *mmc);
        void (*write_l)(struct cmdq_host *host, u32 val, int reg);
        u32 (*read_l)(struct cmdq_host *host, int reg);
+       void (*runtime_pm_get)(struct mmc_host *mmc);
+       void (*runtime_pm_put)(struct mmc_host *mmc);
 };
 
 static inline void cmdq_writel(struct cmdq_host *host, u32 val, int reg)