From patchwork Mon Aug 28 14:29:07 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jerome Brunet X-Patchwork-Id: 111169 Delivered-To: patch@linaro.org Received: by 10.140.95.78 with SMTP id h72csp4921659qge; Mon, 28 Aug 2017 07:31:40 -0700 (PDT) X-Received: by 10.98.158.215 with SMTP id f84mr763855pfk.246.1503930700366; Mon, 28 Aug 2017 07:31:40 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1503930700; cv=none; d=google.com; s=arc-20160816; b=OwfThjWPFCMRN9SoODWykoCQncdV/uz3cc3QqUV6vA6llYLzox7za5+6uPERBzedgx bf5zBK3XvDEHXPXsrqj56jhYHLhUVMMvMGjpCjlq9iHN+c4yAxoV75kVeAlDQYyc0K7F 8g7Gso4c4ysY2hNZgA30C0tBBiL27ikWzl5CTOvYV+EI14RVs6y4RrjF6bxFWcheZvFK 7j0IW8QrKuLFofTvYam5MnhcQAJAL3IDU5CsYnXKeVmtlaCcVqeZrm4GW8pb7GF06UrD aQzXAX3C09VRt+F/2m2tTMRtKb7XuFdGFUr0+PX8NwfeDgHPXpO7CyqJuSpPSCoERuCA s8uQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature:arc-authentication-results; bh=JubhEjdiy4vTDvuz6Ny9wsxGx4qGeVQtJJv/xR7LeOs=; b=w+SngQMCpkafV0DkUrs6hgtoT6g4FjC7rFJQJ8kHdvqVL3cEoN8M+UecJHNNFwRd0Y br2YIcKJIjQe2IwV6DIT19CvEtZvnv6fSY3BJyyQ8+/UoF7SZKTOxjawZC3lx+EP8wcD DAKo3Vw4FVniIAqKBEnbOKfrqEV+ajgMJJsfStcVxb/RxXLvuKXLZtblgOyjLQo3aNN0 dtMRCgfC+uAI4ukeT6pxwNfMF4XrRYHNf5WcuCnLlruUALtS49qaBzCZgCcUXr62oxlo WRigxSaIt160ovJYfesn+e5t5aE2oDSdBchwsgm8uqOru474pZNyLVNWHxlEWbSb/rpE yKSQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@baylibre-com.20150623.gappssmtp.com header.s=20150623 header.b=QlVTTZD2; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id q75si421485pfj.6.2017.08.28.07.31.39; Mon, 28 Aug 2017 07:31:40 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@baylibre-com.20150623.gappssmtp.com header.s=20150623 header.b=QlVTTZD2; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751727AbdH1Obg (ORCPT + 26 others); Mon, 28 Aug 2017 10:31:36 -0400 Received: from mail-wr0-f169.google.com ([209.85.128.169]:35349 "EHLO mail-wr0-f169.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751326AbdH1O3Z (ORCPT ); Mon, 28 Aug 2017 10:29:25 -0400 Received: by mail-wr0-f169.google.com with SMTP id j29so1308549wre.2 for ; Mon, 28 Aug 2017 07:29:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=JubhEjdiy4vTDvuz6Ny9wsxGx4qGeVQtJJv/xR7LeOs=; b=QlVTTZD2+rNVK9diOr9tmCX3Om6+CzRo8ksONeZm7+ML7lLWeK+JciZ0p0FN31eVSF 9hNShAABOGhxg9CkgQEG245NbP03/hYLcYy2MiSyfANB4L6pIKFhYkVkkp7Izb/sa8Vu hL4ugG1TVfgcFjHM3hp/ivLUSZGUsa8ox1Fe7D3KxUZrlOTWBuSsPR32DOQvANx76mcN KOChM6mxx8VoZKGPGcM5undgihonyJxr1XRb92/gAlEdu4P4Zs/cwzE2FQZIr8vuVS9x +/M0RcjWU+aNidORnCTRBgg1PYPZ8ur/aILdJoeMgPZVctroKamPMzasxfJeahd79W9U 2Q2w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=JubhEjdiy4vTDvuz6Ny9wsxGx4qGeVQtJJv/xR7LeOs=; b=FGoC8DZ+XVu6B2nxHEP+kznM/xWuOGufDsfmhU6A/viNSVyJUEHx9fYPwIHCZfSfXf OHSd6zEX7OWuw5khzTJGb3UvrTTCWyYBFDTFcuZOW+2NE7dPLBsr9dTydvHhLeQG+1hV j0dOMXLxhwARWgLVpFvs4Z6/vK80mDeLLcfHYAiLVgKCPkGKwIub/ng5JNFBGjM0veIE 9J7ztXAhlMl+I0QNszxZeR68N3tj5qlcYtV1waNLkHmyso0i6B0dn2RTOPyT6sLzxvYF /hCM6QZZ97N8nKHz4Ay/fSGX7PHni/RTrYnD6MjPvVsr10Bp/oy0ZS5VuTwqkVoyGzT8 Fctg== X-Gm-Message-State: AHYfb5jMyS7LicAIWcYA3Q9nASNe6jIlTh+72PEk6KE91y0n6pZD3WBm cXLxmgkZvk9RUc7M X-Received: by 10.223.158.72 with SMTP id v8mr482857wre.273.1503930564394; Mon, 28 Aug 2017 07:29:24 -0700 (PDT) Received: from localhost.localdomain (uluru.liltaz.com. [163.172.81.188]) by smtp.googlemail.com with ESMTPSA id z39sm604792wrz.61.2017.08.28.07.29.23 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 28 Aug 2017 07:29:23 -0700 (PDT) From: Jerome Brunet To: Ulf Hansson , Kevin Hilman , Carlo Caione Cc: Jerome Brunet , linux-mmc@vger.kernel.org, linux-amlogic@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH v3 05/13] mmc: meson-gx: rework clock init function Date: Mon, 28 Aug 2017 16:29:07 +0200 Message-Id: <20170828142915.27020-6-jbrunet@baylibre.com> X-Mailer: git-send-email 2.9.5 In-Reply-To: <20170828142915.27020-1-jbrunet@baylibre.com> References: <20170828142915.27020-1-jbrunet@baylibre.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Thanks to devm, carrying the clock structure around after init is not necessary. Rework the function to remove these from the controller host data. Finally, set initial mmc clock rate before enabling it, simplifying the exit condition. Reviewed-by: Kevin Hilman Signed-off-by: Jerome Brunet --- drivers/mmc/host/meson-gx-mmc.c | 94 ++++++++++++++++++++--------------------- 1 file changed, 46 insertions(+), 48 deletions(-) -- 2.9.5 diff --git a/drivers/mmc/host/meson-gx-mmc.c b/drivers/mmc/host/meson-gx-mmc.c index cd5964aa4f58..7800a7ace2de 100644 --- a/drivers/mmc/host/meson-gx-mmc.c +++ b/drivers/mmc/host/meson-gx-mmc.c @@ -42,10 +42,7 @@ #define SD_EMMC_CLOCK 0x0 #define CLK_DIV_MASK GENMASK(5, 0) -#define CLK_DIV_MAX 63 #define CLK_SRC_MASK GENMASK(7, 6) -#define CLK_SRC_XTAL 0 /* external crystal */ -#define CLK_SRC_PLL 1 /* FCLK_DIV2 */ #define CLK_CORE_PHASE_MASK GENMASK(9, 8) #define CLK_TX_PHASE_MASK GENMASK(11, 10) #define CLK_RX_PHASE_MASK GENMASK(13, 12) @@ -137,13 +134,9 @@ struct meson_host { spinlock_t lock; void __iomem *regs; struct clk *core_clk; - struct clk_mux mux; - struct clk *mux_clk; + struct clk *mmc_clk; unsigned long req_rate; - struct clk_divider cfg_div; - struct clk *cfg_div_clk; - unsigned int bounce_buf_size; void *bounce_buf; dma_addr_t bounce_dma_addr; @@ -291,7 +284,7 @@ static int meson_mmc_clk_set(struct meson_host *host, unsigned long clk_rate) return 0; } - ret = clk_set_rate(host->cfg_div_clk, clk_rate); + ret = clk_set_rate(host->mmc_clk, clk_rate); if (ret) { dev_err(host->dev, "Unable to set cfg_div_clk to %lu. ret=%d\n", clk_rate, ret); @@ -299,7 +292,7 @@ static int meson_mmc_clk_set(struct meson_host *host, unsigned long clk_rate) } host->req_rate = clk_rate; - mmc->actual_clock = clk_get_rate(host->cfg_div_clk); + mmc->actual_clock = clk_get_rate(host->mmc_clk); dev_dbg(host->dev, "clk rate: %u Hz\n", mmc->actual_clock); if (clk_rate != mmc->actual_clock) @@ -321,10 +314,13 @@ static int meson_mmc_clk_set(struct meson_host *host, unsigned long clk_rate) static int meson_mmc_clk_init(struct meson_host *host) { struct clk_init_data init; + struct clk_mux *mux; + struct clk_divider *div; + struct clk *clk; char clk_name[32]; int i, ret = 0; const char *mux_parent_names[MUX_CLK_NUM_PARENTS]; - const char *clk_div_parents[1]; + const char *clk_parent[1]; u32 clk_reg; /* init SD_EMMC_CLOCK to sane defaults w/min clock rate */ @@ -353,55 +349,57 @@ static int meson_mmc_clk_init(struct meson_host *host) } /* create the mux */ + mux = devm_kzalloc(host->dev, sizeof(*mux), GFP_KERNEL); + if (!mux) + return -ENOMEM; + snprintf(clk_name, sizeof(clk_name), "%s#mux", dev_name(host->dev)); init.name = clk_name; init.ops = &clk_mux_ops; init.flags = 0; init.parent_names = mux_parent_names; init.num_parents = MUX_CLK_NUM_PARENTS; - host->mux.reg = host->regs + SD_EMMC_CLOCK; - host->mux.shift = __bf_shf(CLK_SRC_MASK); - host->mux.mask = CLK_SRC_MASK >> host->mux.shift; - host->mux.flags = 0; - host->mux.table = NULL; - host->mux.hw.init = &init; - host->mux_clk = devm_clk_register(host->dev, &host->mux.hw); - if (WARN_ON(IS_ERR(host->mux_clk))) - return PTR_ERR(host->mux_clk); + mux->reg = host->regs + SD_EMMC_CLOCK; + mux->shift = __bf_shf(CLK_SRC_MASK); + mux->mask = CLK_SRC_MASK >> mux->shift; + mux->hw.init = &init; + + clk = devm_clk_register(host->dev, &mux->hw); + if (WARN_ON(IS_ERR(clk))) + return PTR_ERR(clk); /* create the divider */ + div = devm_kzalloc(host->dev, sizeof(*div), GFP_KERNEL); + if (!div) + return -ENOMEM; + snprintf(clk_name, sizeof(clk_name), "%s#div", dev_name(host->dev)); init.name = clk_name; init.ops = &clk_divider_ops; init.flags = CLK_SET_RATE_PARENT; - clk_div_parents[0] = __clk_get_name(host->mux_clk); - init.parent_names = clk_div_parents; - init.num_parents = ARRAY_SIZE(clk_div_parents); - - host->cfg_div.reg = host->regs + SD_EMMC_CLOCK; - host->cfg_div.shift = __bf_shf(CLK_DIV_MASK); - host->cfg_div.width = __builtin_popcountl(CLK_DIV_MASK); - host->cfg_div.hw.init = &init; - host->cfg_div.flags = CLK_DIVIDER_ONE_BASED | - CLK_DIVIDER_ROUND_CLOSEST; - - host->cfg_div_clk = devm_clk_register(host->dev, &host->cfg_div.hw); - if (WARN_ON(PTR_ERR_OR_ZERO(host->cfg_div_clk))) - return PTR_ERR(host->cfg_div_clk); - - ret = clk_prepare_enable(host->cfg_div_clk); - if (ret) - return ret; + clk_parent[0] = __clk_get_name(clk); + init.parent_names = clk_parent; + init.num_parents = 1; + + div->reg = host->regs + SD_EMMC_CLOCK; + div->shift = __bf_shf(CLK_DIV_MASK); + div->width = __builtin_popcountl(CLK_DIV_MASK); + div->hw.init = &init; + div->flags = (CLK_DIVIDER_ONE_BASED | + CLK_DIVIDER_ROUND_CLOSEST); - /* Get the nearest minimum clock to 400KHz */ - host->mmc->f_min = clk_round_rate(host->cfg_div_clk, 400000); + host->mmc_clk = devm_clk_register(host->dev, &div->hw); + if (WARN_ON(PTR_ERR_OR_ZERO(host->mmc_clk))) + return PTR_ERR(host->mmc_clk); - ret = meson_mmc_clk_set(host, host->mmc->f_min); + /* init SD_EMMC_CLOCK to sane defaults w/min clock rate */ + host->mmc->f_min = clk_round_rate(host->mmc_clk, 400000); + ret = clk_set_rate(host->mmc_clk, host->mmc->f_min); if (ret) - clk_disable_unprepare(host->cfg_div_clk); + return ret; - return ret; + return clk_prepare_enable(host->mmc_clk); } static void meson_mmc_set_tuning_params(struct mmc_host *mmc) @@ -949,7 +947,7 @@ static int meson_mmc_probe(struct platform_device *pdev) meson_mmc_irq_thread, IRQF_SHARED, NULL, host); if (ret) - goto err_div_clk; + goto err_init_clk; mmc->caps |= MMC_CAP_CMD23; mmc->max_blk_count = CMD_CFG_LENGTH_MASK; @@ -965,7 +963,7 @@ static int meson_mmc_probe(struct platform_device *pdev) if (host->bounce_buf == NULL) { dev_err(host->dev, "Unable to map allocate DMA bounce buffer.\n"); ret = -ENOMEM; - goto err_div_clk; + goto err_init_clk; } host->descs = dma_alloc_coherent(host->dev, SD_EMMC_DESC_BUF_LEN, @@ -984,8 +982,8 @@ static int meson_mmc_probe(struct platform_device *pdev) err_bounce_buf: dma_free_coherent(host->dev, host->bounce_buf_size, host->bounce_buf, host->bounce_dma_addr); -err_div_clk: - clk_disable_unprepare(host->cfg_div_clk); +err_init_clk: + clk_disable_unprepare(host->mmc_clk); err_core_clk: clk_disable_unprepare(host->core_clk); free_host: @@ -1007,7 +1005,7 @@ static int meson_mmc_remove(struct platform_device *pdev) dma_free_coherent(host->dev, host->bounce_buf_size, host->bounce_buf, host->bounce_dma_addr); - clk_disable_unprepare(host->cfg_div_clk); + clk_disable_unprepare(host->mmc_clk); clk_disable_unprepare(host->core_clk); mmc_free_host(host->mmc);