From patchwork Mon Dec 11 16:55:35 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Romain Izard X-Patchwork-Id: 10105575 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 72DC7602A7 for ; Mon, 11 Dec 2017 17:02:47 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 59EBC223A1 for ; Mon, 11 Dec 2017 17:02:47 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 4C7F628753; Mon, 11 Dec 2017 17:02:47 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.2 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, DKIM_VALID, FREEMAIL_FROM, RCVD_IN_DNSWL_MED autolearn=unavailable version=3.3.1 Received: from bombadil.infradead.org (bombadil.infradead.org [65.50.211.133]) (using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id CA035223A1 for ; Mon, 11 Dec 2017 17:02:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:MIME-Version:Cc:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id:References: In-Reply-To:Message-Id:Date:Subject:To:From:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=n+Cyn/l4AC1uLohYFnuP7W9X6k3zBHDOTNm0pR8/j3E=; b=ldUB2+jjfHQyZjvber1PkVoI0s 4TwpzqyXvABhDyhwAYvVgxArwTUPj2vO7PNAmFSB66we49iy+gB5+EZt0TYKu1a2OS4S9hRPoyU+T lzuCQ+K5SM7AMdhSNvElhuT3FDjzDfoE++FwuaskyeagNEmWlV/XhaPx2s/ucR1V99wzyePxNVQ6L /3XwFQT9dh3YkM7W7NwnmxU00yd8BiAT4Cq8hRH7SKNCYKsqj0c7bZicZgUhAxhHrOb/MlFafOcnm Q1qqy2osHUsVzIpW1tLrFde7acNh/LN6q0YkEWQJsnTiA+F2Vwz57I+Y1rxf3HvHOFslC2wc1OQje QpJ39DiQ==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.87 #1 (Red Hat Linux)) id 1eORTa-0002ts-B6; Mon, 11 Dec 2017 17:02:46 +0000 Received: from casper.infradead.org ([2001:8b0:10b:1236::1]) by bombadil.infradead.org with esmtps (Exim 4.87 #1 (Red Hat Linux)) id 1eORTR-00028Z-A3 for linux-arm-kernel@bombadil.infradead.org; Mon, 11 Dec 2017 17:02:37 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.20170209; h=References:In-Reply-To:Message-Id:Date: Subject:Cc:To:From:Sender:Reply-To:MIME-Version:Content-Type: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id: List-Help:List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=zVDV0D9/3sfFVSWtSL3Ld78j0fnpbPXXikLHTd/8MGU=; b=C7lJUMDE9yYY+wbFUch7dLCig HLUcUJwTrIBRGZSOjUEWxLYyDyFwNJvSRU8yGBqabei4aPCnVkKShehypXIaJhw/o7QvB8x2pmfm8 l8P1VqpgA/tIrRroumV6j8P3ZF8ZgTajd3fgXrMrSsuePhtUIAv/X0MjrmUcyDvPUC4T2cuGL7nYG r6CVE7EgpCHqx/4nMWareBhhUFHYQkPtdqk0gIuemkVNi0KFmEDfC9t10kLEFQEmvHyX55tFDYF2m ie/jiLAWR0Yl2l8oW8XoUUv7Ym5jr/dzE7U0BJ1OLrB7Rm/U5nkaVR7cypqrqwqAStT1SgLF+Wdts VoLwTk+Hw==; Received: from mail-wr0-x242.google.com ([2a00:1450:400c:c0c::242]) by casper.infradead.org with esmtps (Exim 4.87 #1 (Red Hat Linux)) id 1eORNU-0003Oe-DS for linux-arm-kernel@lists.infradead.org; Mon, 11 Dec 2017 16:56:30 +0000 Received: by mail-wr0-x242.google.com with SMTP id v105so18307463wrc.3 for ; Mon, 11 Dec 2017 08:56:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=zVDV0D9/3sfFVSWtSL3Ld78j0fnpbPXXikLHTd/8MGU=; b=ib9EVGh53MhDzMwyqrttUZZqdZfYyGlrrHH0jAOBoB2h87Sg8NcXVRikO7IU5YbNX/ LMRseiEJKdSsBeB8sVxVzW6elDMmL9rCzU0mHEDBz3RWrklKy4/W/poPOvAIniTxyMGx z0wojkcxMhnJ014/9wbDxT89rUL9GahTm04omfYM8vylhZ0EqLGO3xz8GhhAGWahLpve uh94lhBv/gKbWVL17O80YAykoWsx2a8F3bsbP8GtlpTwGtGbPvoccgYSA2bPmI663atM Upm8eHNKMBaJ7yp5Tl7IIcbbUIz6KWGWny/oejDYAF4B80bGgZm6Dn0RUCTqW1/VVb44 42Iw== 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=zVDV0D9/3sfFVSWtSL3Ld78j0fnpbPXXikLHTd/8MGU=; b=uUZOFH+r3E5xjHap29J32C4NBdyp2l8lQI5dqbxc9ocIsVnfMlOPuCZQ79WfJyXNnb cFzWldC+ySuaa9y9NGf5MKXDErxZ/ArAqXBcKO7s9r6RJdV7bX8hBNb2EcYlsxMqNNwC 9twft8BDnJKmTIO/gd9d+W1/hhA9PllfZFRPzvZtex5ccpYqhvOsKrs9GkXM5xNkGtzI 5djL7MT9ueTOb4DHwya30qy3qYnIQjHNxXUBnrogubnEaOUrjLvCKyfxjS/yG7J67ARl 1tTS+W4e6Z2EH0quTcldmUuPBHvwozSAxR0NUpjfJ3j4w2IxKzr5LpPwgWmlkMBr8bbz z6Cg== X-Gm-Message-State: AKGB3mK1wOAFEbjSCwfROkythteXre+3apcGGroAw0mNAYnKc6yLCuK3 FKLE+N3sxVeqTs6tY+3HPKw= X-Google-Smtp-Source: ACJfBovueX8xw1K9p/3zidZYiZ7ZdAOWzn+/BvrDaXmDR6nB0x10oFrQH3M8IL474AaY8MJzDEKw2A== X-Received: by 10.223.138.246 with SMTP id z51mr1036453wrz.152.1513011366935; Mon, 11 Dec 2017 08:56:06 -0800 (PST) Received: from localhost.localdomain (146.187.3.109.rev.sfr.net. [109.3.187.146]) by smtp.gmail.com with ESMTPSA id j77sm12699597wmf.36.2017.12.11.08.56.06 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 11 Dec 2017 08:56:06 -0800 (PST) From: Romain Izard To: Boris Brezillon , Michael Turquette , Stephen Boyd , Alexandre Belloni , Nicolas Ferre , Ludovic Desroches Subject: [PATCH v6 3/3] clk: at91: pmc: Support backup for programmable clocks Date: Mon, 11 Dec 2017 17:55:35 +0100 Message-Id: <20171211165535.5126-4-romain.izard.pro@gmail.com> X-Mailer: git-send-email 2.14.1 In-Reply-To: <20171211165535.5126-1-romain.izard.pro@gmail.com> References: <20171211165535.5126-1-romain.izard.pro@gmail.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20171211_165628_483094_6CD93826 X-CRM114-Status: GOOD ( 20.33 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Romain Izard , linux-clk@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Virus-Scanned: ClamAV using ClamSMTP When an AT91 programmable clock is declared in the device tree, register it into the Power Management Controller driver. On entering suspend mode, the driver saves and restores the Programmable Clock registers to support the backup mode for these clocks. Signed-off-by: Romain Izard Acked-by: Nicolas Ferre Acked-by: Alexandre Belloni --- Changes in v2: * register PCKs on clock startup Changes in v3: * improve comments on hanling 0 in pmc_register_id and pmc_register_pck * declare local variables earlier for checkpatch Changes in v6: * Use the correct author email address drivers/clk/at91/clk-programmable.c | 2 ++ drivers/clk/at91/pmc.c | 35 +++++++++++++++++++++++++++++++++++ drivers/clk/at91/pmc.h | 2 ++ 3 files changed, 39 insertions(+) diff --git a/drivers/clk/at91/clk-programmable.c b/drivers/clk/at91/clk-programmable.c index 85a449cf61e3..0e6aab1252fc 100644 --- a/drivers/clk/at91/clk-programmable.c +++ b/drivers/clk/at91/clk-programmable.c @@ -204,6 +204,8 @@ at91_clk_register_programmable(struct regmap *regmap, if (ret) { kfree(prog); hw = ERR_PTR(ret); + } else { + pmc_register_pck(id); } return hw; diff --git a/drivers/clk/at91/pmc.c b/drivers/clk/at91/pmc.c index 07dc2861ad3f..1fa27f4ea538 100644 --- a/drivers/clk/at91/pmc.c +++ b/drivers/clk/at91/pmc.c @@ -22,6 +22,7 @@ #include "pmc.h" #define PMC_MAX_IDS 128 +#define PMC_MAX_PCKS 8 int of_at91_get_clk_range(struct device_node *np, const char *propname, struct clk_range *range) @@ -50,6 +51,7 @@ EXPORT_SYMBOL_GPL(of_at91_get_clk_range); static struct regmap *pmcreg; static u8 registered_ids[PMC_MAX_IDS]; +static u8 registered_pcks[PMC_MAX_PCKS]; static struct { @@ -66,8 +68,13 @@ static struct u32 pcr[PMC_MAX_IDS]; u32 audio_pll0; u32 audio_pll1; + u32 pckr[PMC_MAX_PCKS]; } pmc_cache; +/* + * As Peripheral ID 0 is invalid on AT91 chips, the identifier is stored + * without alteration in the table, and 0 is for unused clocks. + */ void pmc_register_id(u8 id) { int i; @@ -82,9 +89,28 @@ void pmc_register_id(u8 id) } } +/* + * As Programmable Clock 0 is valid on AT91 chips, there is an offset + * of 1 between the stored value and the real clock ID. + */ +void pmc_register_pck(u8 pck) +{ + int i; + + for (i = 0; i < PMC_MAX_PCKS; i++) { + if (registered_pcks[i] == 0) { + registered_pcks[i] = pck + 1; + break; + } + if (registered_pcks[i] == (pck + 1)) + break; + } +} + static int pmc_suspend(void) { int i; + u8 num; regmap_read(pmcreg, AT91_PMC_SCSR, &pmc_cache.scsr); regmap_read(pmcreg, AT91_PMC_PCSR, &pmc_cache.pcsr0); @@ -103,6 +129,10 @@ static int pmc_suspend(void) regmap_read(pmcreg, AT91_PMC_PCR, &pmc_cache.pcr[registered_ids[i]]); } + for (i = 0; registered_pcks[i]; i++) { + num = registered_pcks[i] - 1; + regmap_read(pmcreg, AT91_PMC_PCKR(num), &pmc_cache.pckr[num]); + } return 0; } @@ -119,6 +149,7 @@ static bool pmc_ready(unsigned int mask) static void pmc_resume(void) { int i; + u8 num; u32 tmp; u32 mask = AT91_PMC_MCKRDY | AT91_PMC_LOCKA; @@ -143,6 +174,10 @@ static void pmc_resume(void) pmc_cache.pcr[registered_ids[i]] | AT91_PMC_PCR_CMD); } + for (i = 0; registered_pcks[i]; i++) { + num = registered_pcks[i] - 1; + regmap_write(pmcreg, AT91_PMC_PCKR(num), pmc_cache.pckr[num]); + } if (pmc_cache.uckr & AT91_PMC_UPLLEN) mask |= AT91_PMC_LOCKU; diff --git a/drivers/clk/at91/pmc.h b/drivers/clk/at91/pmc.h index 858e8ef7e8db..d22b1fa9ecdc 100644 --- a/drivers/clk/at91/pmc.h +++ b/drivers/clk/at91/pmc.h @@ -31,8 +31,10 @@ int of_at91_get_clk_range(struct device_node *np, const char *propname, #ifdef CONFIG_PM void pmc_register_id(u8 id); +void pmc_register_pck(u8 pck); #else static inline void pmc_register_id(u8 id) {} +static inline void pmc_register_pck(u8 pck) {} #endif #endif /* __PMC_H_ */