From patchwork Wed Jan 28 10:10:18 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Javier Martinez Canillas X-Patchwork-Id: 5727761 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 52ED39F1D6 for ; Wed, 28 Jan 2015 10:13:35 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 7CF6B2026F for ; Wed, 28 Jan 2015 10:13:34 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 51CF920256 for ; Wed, 28 Jan 2015 10:13:29 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1YGPbG-0004G4-0y; Wed, 28 Jan 2015 10:11:54 +0000 Received: from bhuna.collabora.co.uk ([93.93.135.160]) by bombadil.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1YGPaQ-00038W-UK for linux-arm-kernel@lists.infradead.org; Wed, 28 Jan 2015 10:11:03 +0000 Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: javier) with ESMTPSA id 4D7CA600E81 From: Javier Martinez Canillas To: Ulf Hansson Subject: [PATCH 4/5] mmc: pwrseq_simple: Add optional reference clock support Date: Wed, 28 Jan 2015 11:10:18 +0100 Message-Id: <1422439819-29854-5-git-send-email-javier.martinez@collabora.co.uk> X-Mailer: git-send-email 2.1.3 In-Reply-To: <1422439819-29854-1-git-send-email-javier.martinez@collabora.co.uk> References: <1422439819-29854-1-git-send-email-javier.martinez@collabora.co.uk> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20150128_021103_278742_373B7B0A X-CRM114-Status: GOOD ( 13.62 ) X-Spam-Score: -0.0 (/) Cc: devicetree@vger.kernel.org, linux-samsung-soc@vger.kernel.org, linux-mmc@vger.kernel.org, Doug Anderson , linux-kernel@vger.kernel.org, Kukjin Kim , Olof Johansson , Javier Martinez Canillas , linux-arm-kernel@lists.infradead.org X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Some WLAN chips attached to a SDIO interface, need a reference clock. Since this is very common, extend the prseq_simple driver to support an optional clock that is enabled prior the card power up procedure. Note, the external clock is optional. Thus an error is not returned if the clock is not found. Signed-off-by: Javier Martinez Canillas --- drivers/mmc/core/pwrseq_simple.c | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/drivers/mmc/core/pwrseq_simple.c b/drivers/mmc/core/pwrseq_simple.c index 9e51fe1051c5..5ef6db7323f3 100644 --- a/drivers/mmc/core/pwrseq_simple.c +++ b/drivers/mmc/core/pwrseq_simple.c @@ -7,6 +7,7 @@ * * Simple MMC power sequence management */ +#include #include #include #include @@ -16,12 +17,14 @@ #include +#include "core.h" #include "pwrseq.h" struct mmc_pwrseq_simple { struct mmc_pwrseq pwrseq; struct gpio_desc **reset_gpio; int nr_gpios; + struct clk *ext_clk; }; static void mmc_pwrseq_simple_pre_power_on(struct mmc_host *host) @@ -30,6 +33,9 @@ static void mmc_pwrseq_simple_pre_power_on(struct mmc_host *host) struct mmc_pwrseq_simple, pwrseq); int i; + if (pwrseq->ext_clk) + clk_prepare_enable(pwrseq->ext_clk); + for (i = 0; i < pwrseq->nr_gpios; i++) if (!IS_ERR(pwrseq->reset_gpio[i])) gpiod_set_value_cansleep(pwrseq->reset_gpio[i], 1); @@ -46,12 +52,29 @@ static void mmc_pwrseq_simple_post_power_on(struct mmc_host *host) gpiod_set_value_cansleep(pwrseq->reset_gpio[i], 0); } +static void mmc_pwrseq_simple_power_off(struct mmc_host *host) +{ + struct mmc_pwrseq_simple *pwrseq = container_of(host->pwrseq, + struct mmc_pwrseq_simple, pwrseq); + int i; + + for (i = 0; i < pwrseq->nr_gpios; i++) + if (!IS_ERR(pwrseq->reset_gpio[i])) + gpiod_set_value_cansleep(pwrseq->reset_gpio[i], 1); + + if (pwrseq->ext_clk) + clk_disable_unprepare(pwrseq->ext_clk); +} + static void mmc_pwrseq_simple_free(struct mmc_host *host) { struct mmc_pwrseq_simple *pwrseq = container_of(host->pwrseq, struct mmc_pwrseq_simple, pwrseq); int i; + if (pwrseq->ext_clk) + clk_put(pwrseq->ext_clk); + if (pwrseq->nr_gpios > 0) { for (i = 0; i < pwrseq->nr_gpios; i++) if (!IS_ERR(pwrseq->reset_gpio[i])) @@ -66,7 +89,7 @@ static void mmc_pwrseq_simple_free(struct mmc_host *host) static struct mmc_pwrseq_ops mmc_pwrseq_simple_ops = { .pre_power_on = mmc_pwrseq_simple_pre_power_on, .post_power_on = mmc_pwrseq_simple_post_power_on, - .power_off = mmc_pwrseq_simple_pre_power_on, + .power_off = mmc_pwrseq_simple_power_off, .free = mmc_pwrseq_simple_free, }; @@ -97,6 +120,14 @@ int mmc_pwrseq_simple_alloc(struct mmc_host *host, struct device *dev) } } + pwrseq->ext_clk = clk_get(dev, "ext_clock"); + if (IS_ERR(pwrseq->ext_clk) && + PTR_ERR(pwrseq->ext_clk) != -ENOENT && + PTR_ERR(pwrseq->ext_clk) != -ENOSYS) { + ret = PTR_ERR(pwrseq->ext_clk); + goto free; + } + pwrseq->pwrseq.ops = &mmc_pwrseq_simple_ops; host->pwrseq = &pwrseq->pwrseq;