From patchwork Thu Oct 19 16:42:07 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Romain Izard X-Patchwork-Id: 10017713 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 A7B7460224 for ; Thu, 19 Oct 2017 16:43:50 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 97ECD28D7B for ; Thu, 19 Oct 2017 16:43:50 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 8ADF728D98; Thu, 19 Oct 2017 16:43:50 +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 1031328D7B for ; Thu, 19 Oct 2017 16:43:49 +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=3Mo7vFwhA2967+In3vwlBrtfG37+yiMflc1blnI0ark=; b=dz2jHClZzg6q6smTKVC7oS5VEa NozE20AmzifJjolhYVDnB6BBL5ZI1tP44cYk5dyANSz2SUXqlfU/7y85eodg/9PGVAvYAnJqG5GPZ B96OkWXauBBw+fNr1EUe9REGzu3EnlbuJzZusq0BDkCsJXBi4sz3kHCeXlYLTUieyZ5ChvJw7icDg mymmJ6ABFKp1/nyRyqrSJOv2QvFrKF1p9gttfkt5WeDIMIIE0nkACMrxlRhYmUAfjpObpot8529W5 kZa/rBTZSQ+iqTMi9cC8l3cNcY13i/7dfS3xjzc5qqoK90J0Lw7FxrVMoAogs+lYbkIXsb5RKikT/ hVUY2Eiw==; 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 1e5DvB-0007RC-9p; Thu, 19 Oct 2017 16:43:49 +0000 Received: from mail-wr0-x243.google.com ([2a00:1450:400c:c0c::243]) by bombadil.infradead.org with esmtps (Exim 4.87 #1 (Red Hat Linux)) id 1e5DuF-0006al-E9 for linux-arm-kernel@lists.infradead.org; Thu, 19 Oct 2017 16:43:03 +0000 Received: by mail-wr0-x243.google.com with SMTP id z55so2908047wrz.1 for ; Thu, 19 Oct 2017 09:42:32 -0700 (PDT) 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=5v5OQvNstnVmbIx9/rItx5KKfRrxeaMxdASdro2SAIU=; b=pdFuy6ZGWbFljh3ga6+j7X0BgVXEoIckKxmbvpGUT+CIddXyFacowVnP1PKt9Qr0ng suupTWdYbaBWqMPbHPsDA5uFI715k3lhisAHMJ60mPORfY/qyv9NqlmKzBJqHX3Eq52P GKO+AKegWyVA0A1dzhUuqcF9gR7erfkJYeAygDsuEN9KMIEWxVGH5UIBdFLfaRxI9KN5 PnEmMWWsVZCiG/5Smxe60lfvofL0nTCtxyRr8nGzstus+GH5ONbS7oD/KSzDH+f5Zx9R rhPLO4iVrycHV3YR/iUoCTXVHkNDeo4obyY+md9KQxlPEfF5NLjRa/mmhUk2KlKQbmVW fVpQ== 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=5v5OQvNstnVmbIx9/rItx5KKfRrxeaMxdASdro2SAIU=; b=bH1U89GEHRSoKgcALc7n7DICLX0v+JiNXU8PkVg6oA9a8gJrNsaex14x6di7Fxtct7 sy0dwsI5nRE7hc1ALTdNFuvVtWlfq8hIdZvu/KYUu+BBXudxi4tIsXBs7zvabSEW0SmV sP1RcT7f/mYkoDCKyTmK8v17E/OdhurYhyHa1NRm/aZtD/YtoqtClssxx4sFwWXcUwi7 tTcwnV2b4DQyu0HgI4XBk3JKi2c2suHxz7JIAORiF7wiAYb63EG5iGS4nmBYf2IuxGOY WgH6B5TgCbVynXwQB0AFVerL7fk2FAOwspr1gnfq8oh/F43rHSSv4T3mtphfA0fwtdz6 oUzg== X-Gm-Message-State: AMCzsaUZtdZbQEOajNy0j/DzgLtK3kZ8Sn6O2MrnEXwCdvT3NJCW9njN +m7f1mhzR5HfwqNRGsEf974= X-Google-Smtp-Source: ABhQp+QeLhke64agUV7bK41VYcu4NMpbXhG4JS7lL5Z8eYb3xljGq+QOHCOIaWTqlk6gCZqmETrDTQ== X-Received: by 10.223.167.154 with SMTP id j26mr2038839wrc.174.1508431351225; Thu, 19 Oct 2017 09:42:31 -0700 (PDT) Received: from localhost.localdomain (146.187.3.109.rev.sfr.net. [109.3.187.146]) by smtp.gmail.com with ESMTPSA id a195sm1458905wme.34.2017.10.19.09.42.30 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 19 Oct 2017 09:42:30 -0700 (PDT) From: Romain Izard To: Boris Brezillon , Michael Turquette , Stephen Boyd , Alexandre Belloni , Nicolas Ferre , Ludovic Desroches Subject: [PATCH v5 3/3] clk: at91: pmc: Support backup for programmable clocks Date: Thu, 19 Oct 2017 18:42:07 +0200 Message-Id: <20171019164207.32717-4-romain.izard.pro@gmail.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20171019164207.32717-1-romain.izard.pro@gmail.com> References: <20171019164207.32717-1-romain.izard.pro@gmail.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20171019_094252_562721_D7DE355C X-CRM114-Status: GOOD ( 16.99 ) 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 , 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 From: Romain Izard 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 --- 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 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_ */