{"id":819054,"url":"http://patchwork.ozlabs.org/api/patches/819054/?format=json","web_url":"http://patchwork.ozlabs.org/project/linux-pwm/patch/20170927083555.16580-4-romain.izard.pro@gmail.com/","project":{"id":38,"url":"http://patchwork.ozlabs.org/api/projects/38/?format=json","name":"Linux PWM development","link_name":"linux-pwm","list_id":"linux-pwm.vger.kernel.org","list_email":"linux-pwm@vger.kernel.org","web_url":"","scm_url":"","webscm_url":"","list_archive_url":"","list_archive_url_format":"","commit_url_format":""},"msgid":"<20170927083555.16580-4-romain.izard.pro@gmail.com>","list_archive_url":null,"date":"2017-09-27T08:35:50","name":"[v3,3/8] clk: at91: pmc: Support backup for programmable clocks","commit_ref":null,"pull_url":null,"state":"superseded","archived":false,"hash":"004969db4bcac8e19b744f4f17f33eb21cb75e09","submitter":{"id":8236,"url":"http://patchwork.ozlabs.org/api/people/8236/?format=json","name":"Romain Izard","email":"romain.izard.pro@gmail.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/linux-pwm/patch/20170927083555.16580-4-romain.izard.pro@gmail.com/mbox/","series":[{"id":5310,"url":"http://patchwork.ozlabs.org/api/series/5310/?format=json","web_url":"http://patchwork.ozlabs.org/project/linux-pwm/list/?series=5310","date":"2017-09-27T08:35:48","name":"Various patches for SAMA5D2 backup mode","version":3,"mbox":"http://patchwork.ozlabs.org/series/5310/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/819054/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/819054/checks/","tags":{},"related":[],"headers":{"Return-Path":"<linux-pwm-owner@vger.kernel.org>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming@bilbo.ozlabs.org","Authentication-Results":["ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=vger.kernel.org\n\t(client-ip=209.132.180.67; helo=vger.kernel.org;\n\tenvelope-from=linux-pwm-owner@vger.kernel.org;\n\treceiver=<UNKNOWN>)","ozlabs.org;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n\tunprotected) header.d=gmail.com header.i=@gmail.com\n\theader.b=\"NFU/Avt1\"; dkim-atps=neutral"],"Received":["from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3y2B9z2bdWz9t3x\n\tfor <incoming@patchwork.ozlabs.org>;\n\tWed, 27 Sep 2017 18:41:11 +1000 (AEST)","(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S1752539AbdI0IkD (ORCPT <rfc822;incoming@patchwork.ozlabs.org>);\n\tWed, 27 Sep 2017 04:40:03 -0400","from mail-wm0-f67.google.com ([74.125.82.67]:47105 \"EHLO\n\tmail-wm0-f67.google.com\" rhost-flags-OK-OK-OK-OK) by vger.kernel.org\n\twith ESMTP id S1752508AbdI0IgQ (ORCPT\n\t<rfc822; linux-pwm@vger.kernel.org>); Wed, 27 Sep 2017 04:36:16 -0400","by mail-wm0-f67.google.com with SMTP id r136so15422492wmf.2;\n\tWed, 27 Sep 2017 01:36:15 -0700 (PDT)","from localhost.localdomain (146.187.3.109.rev.sfr.net.\n\t[109.3.187.146]) by smtp.gmail.com with ESMTPSA id\n\tr6sm9699900wrg.40.2017.09.27.01.36.13\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);\n\tWed, 27 Sep 2017 01:36:14 -0700 (PDT)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=gmail.com; s=20161025;\n\th=from:to:cc:subject:date:message-id:in-reply-to:references;\n\tbh=iLRDoc1eXp6mQxdaAfv7l1CnPd100UAgbzaexY+m7LI=;\n\tb=NFU/Avt1n2OivYNZJLJsv5/BFn3yG9Ye7CUsC8KWJTGRoH7FplTV/4lv/622XzkiQr\n\t1/HDEiS901deqWZVUU3HqLGJ0pdiTIs8cOXETeiQwqgVDao17DpSTR/ZhZfh3AUIEvgY\n\t2UpX8b5sEqlXds0LoPX1hXidYiCjsquFQFYUlD4rzBXITmaZzROZMWp1V5WaT8slOVuE\n\tUBEdaZOUFcnnisttBEO3E9UIwnrSz+HDhspZvSIYvgRtj9Fd4a9LTP4/GvV7e33FHvF5\n\t06SJDI6fftp7wjieiAYswrSf/kBkC5V4EZoLqPaDr9QVSHe96vdaup2Pbau658i7hTey\n\tB3EQ==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to\n\t:references;\n\tbh=iLRDoc1eXp6mQxdaAfv7l1CnPd100UAgbzaexY+m7LI=;\n\tb=DVPwh0E/w+PywvaebEY9bd0+6j4CsMuNCnUvd7V3I/uE3+RaaM8l+2U/UnhsLch34L\n\tLSGKYwh/2ApYFzYGItuucr0OSlArKJ9sb1RKDsp8La45h0n510lJf1wHB/hCNBUs1wwB\n\tdgpBxvmYnOoaEJCNtDEe38tWZtEGCS/uIGB6LUiaNr2L6GizXnVrOPGH6WvTNcLNOtJq\n\t8ChTjurPO6zrRmQztf7RpACSq20opBNZ9odhImn5xFK1cd1wbRX0aQUY1abvB5FJpsK2\n\tSIpRLv4Ie0rYxVdPF5rGEPDgolZ1HLdJosqvoF+6c+6TR6ml2E91pN4IuHjr5BBObA9I\n\tubJQ==","X-Gm-Message-State":"AHPjjUjK4Lwb9Td5vAV3dTcVP+Qgz/BHBKyVJCpZFedkZz/Lne5uXBUB\n\t8vaYXXiuWxz2ScZR0g7o37Y=","X-Google-Smtp-Source":"AOwi7QCo5Db5eKdgcBtRjxCvyj41jUdYPcSQHpB8h1sF5WFR89Zz3ToMSaD8TfcWXwS+n8jypK3ZOQ==","X-Received":"by 10.28.8.75 with SMTP id 72mr791437wmi.43.1506501374874;\n\tWed, 27 Sep 2017 01:36:14 -0700 (PDT)","From":"Romain Izard <romain.izard.pro@gmail.com>","To":"Boris Brezillon <boris.brezillon@free-electrons.com>,\n\tMichael Turquette <mturquette@baylibre.com>,\n\tStephen Boyd <sboyd@codeaurora.org>, Lee Jones <lee.jones@linaro.org>,\n\tWenyou Yang <wenyou.yang@atmel.com>, Josh Wu <rainyfeeling@outlook.com>,\n\tRichard Weinberger <richard@nod.at>,\n\tDavid Woodhouse <dwmw2@infradead.org>,\n\tBrian Norris <computersforpeace@gmail.com>,\n\tMarek Vasut <marek.vasut@gmail.com>,\n\tCyrille Pitchen <cyrille.pitchen@wedev4u.fr>,\n\tThierry Reding <thierry.reding@gmail.com>,\n\tRichard Genoud <richard.genoud@gmail.com>,\n\tGreg Kroah-Hartman <gregkh@linuxfoundation.org>,\n\tJiri Slaby <jslaby@suse.com>, Alan Stern <stern@rowland.harvard.edu>,\n\tLudovic Desroches <ludovic.desroches@microchip.com>,\n\tNicolas Ferre <nicolas.ferre@microchip.com>,\n\tAlexandre Belloni <alexandre.belloni@free-electrons.com>","Cc":"linux-clk@vger.kernel.org, linux-kernel@vger.kernel.org,\n\tlinux-mtd@lists.infradead.org, linux-pwm@vger.kernel.org,\n\tlinux-serial@vger.kernel.org, linux-usb@vger.kernel.org,\n\tRomain Izard <romain.izard@mobile-devices.fr>,\n\tRomain Izard <romain.izard.pro@gmail.com>","Subject":"[PATCH v3 3/8] clk: at91: pmc: Support backup for programmable\n\tclocks","Date":"Wed, 27 Sep 2017 10:35:50 +0200","Message-Id":"<20170927083555.16580-4-romain.izard.pro@gmail.com>","X-Mailer":"git-send-email 2.11.0","In-Reply-To":"<20170927083555.16580-1-romain.izard.pro@gmail.com>","References":"<20170927083555.16580-1-romain.izard.pro@gmail.com>","Sender":"linux-pwm-owner@vger.kernel.org","Precedence":"bulk","List-ID":"<linux-pwm.vger.kernel.org>","X-Mailing-List":"linux-pwm@vger.kernel.org"},"content":"From: Romain Izard <romain.izard@mobile-devices.fr>\n\nWhen an AT91 programmable clock is declared in the device tree, register\nit into the Power Management Controller driver. On entering suspend mode,\nthe driver saves and restores the Programmable Clock registers to support\nthe backup mode for these clocks.\n\nSigned-off-by: Romain Izard <romain.izard.pro@gmail.com>\nAcked-by: Nicolas Ferre <nicolas.ferre@microchip.com>\n---\nChanges in v2:\n* register PCKs on clock startup\nChnages in v3:\n* improve comments on hanling 0 in pmc_register_id and pmc_register_pck\n* declare local variables earlier for checkpatch\n\n drivers/clk/at91/clk-programmable.c |  2 ++\n drivers/clk/at91/pmc.c              | 35 +++++++++++++++++++++++++++++++++++\n drivers/clk/at91/pmc.h              |  2 ++\n 3 files changed, 39 insertions(+)","diff":"diff --git a/drivers/clk/at91/clk-programmable.c b/drivers/clk/at91/clk-programmable.c\nindex 85a449cf61e3..0e6aab1252fc 100644\n--- a/drivers/clk/at91/clk-programmable.c\n+++ b/drivers/clk/at91/clk-programmable.c\n@@ -204,6 +204,8 @@ at91_clk_register_programmable(struct regmap *regmap,\n \tif (ret) {\n \t\tkfree(prog);\n \t\thw = ERR_PTR(ret);\n+\t} else {\n+\t\tpmc_register_pck(id);\n \t}\n \n \treturn hw;\ndiff --git a/drivers/clk/at91/pmc.c b/drivers/clk/at91/pmc.c\nindex 07dc2861ad3f..1fa27f4ea538 100644\n--- a/drivers/clk/at91/pmc.c\n+++ b/drivers/clk/at91/pmc.c\n@@ -22,6 +22,7 @@\n #include \"pmc.h\"\n \n #define PMC_MAX_IDS 128\n+#define PMC_MAX_PCKS 8\n \n int of_at91_get_clk_range(struct device_node *np, const char *propname,\n \t\t\t  struct clk_range *range)\n@@ -50,6 +51,7 @@ EXPORT_SYMBOL_GPL(of_at91_get_clk_range);\n static struct regmap *pmcreg;\n \n static u8 registered_ids[PMC_MAX_IDS];\n+static u8 registered_pcks[PMC_MAX_PCKS];\n \n static struct\n {\n@@ -66,8 +68,13 @@ static struct\n \tu32 pcr[PMC_MAX_IDS];\n \tu32 audio_pll0;\n \tu32 audio_pll1;\n+\tu32 pckr[PMC_MAX_PCKS];\n } pmc_cache;\n \n+/*\n+ * As Peripheral ID 0 is invalid on AT91 chips, the identifier is stored\n+ * without alteration in the table, and 0 is for unused clocks.\n+ */\n void pmc_register_id(u8 id)\n {\n \tint i;\n@@ -82,9 +89,28 @@ void pmc_register_id(u8 id)\n \t}\n }\n \n+/*\n+ * As Programmable Clock 0 is valid on AT91 chips, there is an offset\n+ * of 1 between the stored value and the real clock ID.\n+ */\n+void pmc_register_pck(u8 pck)\n+{\n+\tint i;\n+\n+\tfor (i = 0; i < PMC_MAX_PCKS; i++) {\n+\t\tif (registered_pcks[i] == 0) {\n+\t\t\tregistered_pcks[i] = pck + 1;\n+\t\t\tbreak;\n+\t\t}\n+\t\tif (registered_pcks[i] == (pck + 1))\n+\t\t\tbreak;\n+\t}\n+}\n+\n static int pmc_suspend(void)\n {\n \tint i;\n+\tu8 num;\n \n \tregmap_read(pmcreg, AT91_PMC_SCSR, &pmc_cache.scsr);\n \tregmap_read(pmcreg, AT91_PMC_PCSR, &pmc_cache.pcsr0);\n@@ -103,6 +129,10 @@ static int pmc_suspend(void)\n \t\tregmap_read(pmcreg, AT91_PMC_PCR,\n \t\t\t    &pmc_cache.pcr[registered_ids[i]]);\n \t}\n+\tfor (i = 0; registered_pcks[i]; i++) {\n+\t\tnum = registered_pcks[i] - 1;\n+\t\tregmap_read(pmcreg, AT91_PMC_PCKR(num), &pmc_cache.pckr[num]);\n+\t}\n \n \treturn 0;\n }\n@@ -119,6 +149,7 @@ static bool pmc_ready(unsigned int mask)\n static void pmc_resume(void)\n {\n \tint i;\n+\tu8 num;\n \tu32 tmp;\n \tu32 mask = AT91_PMC_MCKRDY | AT91_PMC_LOCKA;\n \n@@ -143,6 +174,10 @@ static void pmc_resume(void)\n \t\t\t     pmc_cache.pcr[registered_ids[i]] |\n \t\t\t     AT91_PMC_PCR_CMD);\n \t}\n+\tfor (i = 0; registered_pcks[i]; i++) {\n+\t\tnum = registered_pcks[i] - 1;\n+\t\tregmap_write(pmcreg, AT91_PMC_PCKR(num), pmc_cache.pckr[num]);\n+\t}\n \n \tif (pmc_cache.uckr & AT91_PMC_UPLLEN)\n \t\tmask |= AT91_PMC_LOCKU;\ndiff --git a/drivers/clk/at91/pmc.h b/drivers/clk/at91/pmc.h\nindex 858e8ef7e8db..d22b1fa9ecdc 100644\n--- a/drivers/clk/at91/pmc.h\n+++ b/drivers/clk/at91/pmc.h\n@@ -31,8 +31,10 @@ int of_at91_get_clk_range(struct device_node *np, const char *propname,\n \n #ifdef CONFIG_PM\n void pmc_register_id(u8 id);\n+void pmc_register_pck(u8 pck);\n #else\n static inline void pmc_register_id(u8 id) {}\n+static inline void pmc_register_pck(u8 pck) {}\n #endif\n \n #endif /* __PMC_H_ */\n","prefixes":["v3","3/8"]}