mmc: mtk-sd: add Inline Crypto Engine clock control
authorMengqi Zhang <mengqi.zhang@mediatek.com>
Sun, 6 Nov 2022 03:39:24 +0000 (11:39 +0800)
committerUlf Hansson <ulf.hansson@linaro.org>
Wed, 7 Dec 2022 12:22:34 +0000 (13:22 +0100)
Add crypto clock control and ungate it before CQHCI init.

Signed-off-by: Mengqi Zhang <mengqi.zhang@mediatek.com>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Link: https://lore.kernel.org/r/20221106033924.9854-2-mengqi.zhang@mediatek.com
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/mmc/host/mtk-sd.c

index 709c648..422817f 100644 (file)
@@ -452,6 +452,7 @@ struct msdc_host {
        struct clk *bus_clk;    /* bus clock which used to access register */
        struct clk *src_clk_cg; /* msdc source clock control gate */
        struct clk *sys_clk_cg; /* msdc subsys clock control gate */
+       struct clk *crypto_clk; /* msdc crypto clock control gate */
        struct clk_bulk_data bulk_clks[MSDC_NR_CLOCKS];
        u32 mclk;               /* mmc subsystem clock frequency */
        u32 src_clk_freq;       /* source clock frequency */
@@ -840,6 +841,7 @@ static void msdc_set_busy_timeout(struct msdc_host *host, u64 ns, u64 clks)
 static void msdc_gate_clock(struct msdc_host *host)
 {
        clk_bulk_disable_unprepare(MSDC_NR_CLOCKS, host->bulk_clks);
+       clk_disable_unprepare(host->crypto_clk);
        clk_disable_unprepare(host->src_clk_cg);
        clk_disable_unprepare(host->src_clk);
        clk_disable_unprepare(host->bus_clk);
@@ -855,6 +857,7 @@ static int msdc_ungate_clock(struct msdc_host *host)
        clk_prepare_enable(host->bus_clk);
        clk_prepare_enable(host->src_clk);
        clk_prepare_enable(host->src_clk_cg);
+       clk_prepare_enable(host->crypto_clk);
        ret = clk_bulk_prepare_enable(MSDC_NR_CLOCKS, host->bulk_clks);
        if (ret) {
                dev_err(host->dev, "Cannot enable pclk/axi/ahb clock gates\n");
@@ -2670,6 +2673,15 @@ static int msdc_drv_probe(struct platform_device *pdev)
                goto host_free;
        }
 
+       /* only eMMC has crypto property */
+       if (!(mmc->caps2 & MMC_CAP2_NO_MMC)) {
+               host->crypto_clk = devm_clk_get_optional(&pdev->dev, "crypto");
+               if (IS_ERR(host->crypto_clk))
+                       host->crypto_clk = NULL;
+               else
+                       mmc->caps2 |= MMC_CAP2_CRYPTO;
+       }
+
        host->irq = platform_get_irq(pdev, 0);
        if (host->irq < 0) {
                ret = -EINVAL;