[{"id":1773554,"web_url":"http://patchwork.ozlabs.org/comment/1773554/","msgid":"<fa66d212-dbfb-08d4-1b2b-aaaa9f9d62de@microchip.com>","list_archive_url":null,"date":"2017-09-22T12:42:37","subject":"Re: [PATCH v2 7/9] pwm: atmel-tcb: Support backup mode","submitter":{"id":71036,"url":"http://patchwork.ozlabs.org/api/people/71036/","name":"Nicolas Ferre","email":"nicolas.ferre@microchip.com"},"content":"On 15/09/2017 at 16:04, Romain Izard wrote:\n> Save and restore registers for the PWM on suspend and resume, which\n> makes hibernation and backup modes possible.\n> \n> Signed-off-by: Romain Izard <romain.izard.pro@gmail.com>\n\nSeems good to me:\nAcked-by: Nicolas Ferre <nicolas.ferre@microchip.com>\n\n> ---\n>  drivers/pwm/pwm-atmel-tcb.c | 63 +++++++++++++++++++++++++++++++++++++++++++--\n>  1 file changed, 61 insertions(+), 2 deletions(-)\n> \n> diff --git a/drivers/pwm/pwm-atmel-tcb.c b/drivers/pwm/pwm-atmel-tcb.c\n> index 75db585a2a94..acd3ce8ecf3f 100644\n> --- a/drivers/pwm/pwm-atmel-tcb.c\n> +++ b/drivers/pwm/pwm-atmel-tcb.c\n> @@ -37,11 +37,20 @@ struct atmel_tcb_pwm_device {\n>  \tunsigned period;\t\t/* PWM period expressed in clk cycles */\n>  };\n>  \n> +struct atmel_tcb_channel {\n> +\tu32 enabled;\n> +\tu32 cmr;\n> +\tu32 ra;\n> +\tu32 rb;\n> +\tu32 rc;\n> +};\n> +\n>  struct atmel_tcb_pwm_chip {\n>  \tstruct pwm_chip chip;\n>  \tspinlock_t lock;\n>  \tstruct atmel_tc *tc;\n>  \tstruct atmel_tcb_pwm_device *pwms[NPWM];\n> +\tstruct atmel_tcb_channel bkup[NPWM / 2];\n>  };\n>  \n>  static inline struct atmel_tcb_pwm_chip *to_tcb_chip(struct pwm_chip *chip)\n> @@ -175,12 +184,15 @@ static void atmel_tcb_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm)\n>  \t * Use software trigger to apply the new setting.\n>  \t * If both PWM devices in this group are disabled we stop the clock.\n>  \t */\n> -\tif (!(cmr & (ATMEL_TC_ACPC | ATMEL_TC_BCPC)))\n> +\tif (!(cmr & (ATMEL_TC_ACPC | ATMEL_TC_BCPC))) {\n>  \t\t__raw_writel(ATMEL_TC_SWTRG | ATMEL_TC_CLKDIS,\n>  \t\t\t     regs + ATMEL_TC_REG(group, CCR));\n> -\telse\n> +\t\ttcbpwmc->bkup[group].enabled = 1;\n> +\t} else {\n>  \t\t__raw_writel(ATMEL_TC_SWTRG, regs +\n>  \t\t\t     ATMEL_TC_REG(group, CCR));\n> +\t\ttcbpwmc->bkup[group].enabled = 0;\n> +\t}\n>  \n>  \tspin_unlock(&tcbpwmc->lock);\n>  }\n> @@ -263,6 +275,7 @@ static int atmel_tcb_pwm_enable(struct pwm_chip *chip, struct pwm_device *pwm)\n>  \t/* Use software trigger to apply the new setting */\n>  \t__raw_writel(ATMEL_TC_CLKEN | ATMEL_TC_SWTRG,\n>  \t\t     regs + ATMEL_TC_REG(group, CCR));\n> +\ttcbpwmc->bkup[group].enabled = 1;\n>  \tspin_unlock(&tcbpwmc->lock);\n>  \treturn 0;\n>  }\n> @@ -445,10 +458,56 @@ static const struct of_device_id atmel_tcb_pwm_dt_ids[] = {\n>  };\n>  MODULE_DEVICE_TABLE(of, atmel_tcb_pwm_dt_ids);\n>  \n> +#ifdef CONFIG_PM_SLEEP\n> +static int atmel_tcb_pwm_suspend(struct device *dev)\n> +{\n> +\tstruct platform_device *pdev = to_platform_device(dev);\n> +\tstruct atmel_tcb_pwm_chip *tcbpwm = platform_get_drvdata(pdev);\n> +\tvoid __iomem *base = tcbpwm->tc->regs;\n> +\tint i;\n> +\n> +\tfor (i = 0; i < (NPWM / 2); i++) {\n> +\t\tstruct atmel_tcb_channel *chan = &tcbpwm->bkup[i];\n> +\n> +\t\tchan->cmr = readl(base + ATMEL_TC_REG(i, CMR));\n> +\t\tchan->ra = readl(base + ATMEL_TC_REG(i, RA));\n> +\t\tchan->rb = readl(base + ATMEL_TC_REG(i, RB));\n> +\t\tchan->rc = readl(base + ATMEL_TC_REG(i, RC));\n> +\t}\n> +\treturn 0;\n> +}\n> +\n> +static int atmel_tcb_pwm_resume(struct device *dev)\n> +{\n> +\tstruct platform_device *pdev = to_platform_device(dev);\n> +\tstruct atmel_tcb_pwm_chip *tcbpwm = platform_get_drvdata(pdev);\n> +\tvoid __iomem *base = tcbpwm->tc->regs;\n> +\tint i;\n> +\n> +\tfor (i = 0; i < (NPWM / 2); i++) {\n> +\t\tstruct atmel_tcb_channel *chan = &tcbpwm->bkup[i];\n> +\n> +\t\twritel(chan->cmr, base + ATMEL_TC_REG(i, CMR));\n> +\t\twritel(chan->ra, base + ATMEL_TC_REG(i, RA));\n> +\t\twritel(chan->rb, base + ATMEL_TC_REG(i, RB));\n> +\t\twritel(chan->rc, base + ATMEL_TC_REG(i, RC));\n> +\t\tif (chan->enabled) {\n> +\t\t\twritel(ATMEL_TC_CLKEN | ATMEL_TC_SWTRG,\n> +\t\t\t\tbase + ATMEL_TC_REG(i, CCR));\n> +\t\t}\n> +\t}\n> +\treturn 0;\n> +}\n> +#endif\n> +\n> +static SIMPLE_DEV_PM_OPS(atmel_tcb_pwm_pm_ops, atmel_tcb_pwm_suspend,\n> +\t\t\t atmel_tcb_pwm_resume);\n> +\n>  static struct platform_driver atmel_tcb_pwm_driver = {\n>  \t.driver = {\n>  \t\t.name = \"atmel-tcb-pwm\",\n>  \t\t.of_match_table = atmel_tcb_pwm_dt_ids,\n> +\t\t.pm = &atmel_tcb_pwm_pm_ops,\n>  \t},\n>  \t.probe = atmel_tcb_pwm_probe,\n>  \t.remove = atmel_tcb_pwm_remove,\n>","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>)","Received":["from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3xzClq2hJDz9sPk\n\tfor <incoming@patchwork.ozlabs.org>;\n\tFri, 22 Sep 2017 22:41:43 +1000 (AEST)","(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S1752479AbdIVMld (ORCPT <rfc822;incoming@patchwork.ozlabs.org>);\n\tFri, 22 Sep 2017 08:41:33 -0400","from esa5.microchip.iphmx.com ([216.71.150.166]:17753 \"EHLO\n\tesa5.microchip.iphmx.com\" rhost-flags-OK-OK-OK-OK) by vger.kernel.org\n\twith ESMTP id S1752162AbdIVMlb (ORCPT\n\t<rfc822; linux-pwm@vger.kernel.org>); Fri, 22 Sep 2017 08:41:31 -0400","from exsmtp01.microchip.com (HELO email.microchip.com)\n\t([198.175.253.37])\n\tby esa5.microchip.iphmx.com with ESMTP/TLS/AES128-SHA;\n\t22 Sep 2017 05:41:31 -0700","from [10.159.245.112] (10.10.76.4) by CHN-SV-EXCH01.mchp-main.com\n\t(10.10.76.37) with Microsoft SMTP Server id 14.3.352.0;\n\tFri, 22 Sep 2017 05:41:29 -0700"],"X-IronPort-AV":"E=Sophos;i=\"5.42,427,1500966000\"; d=\"scan'208\";a=\"4927720\"","Subject":"Re: [PATCH v2 7/9] pwm: atmel-tcb: Support backup mode","To":"Romain Izard <romain.izard.pro@gmail.com>,\n\tAlexandre Belloni <alexandre.belloni@free-electrons.com>,\n\tBoris Brezillon <boris.brezillon@free-electrons.com>,\n\tMichael Turquette <mturquette@baylibre.com>,\n\tStephen Boyd <sboyd@codeaurora.org>,\n\tLudovic Desroches <ludovic.desroches@microchip.com>,\n\tWenyou Yang <wenyou.yang@atmel.com>, Josh Wu <rainyfeeling@outlook.com>,\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\tAlan Stern <stern@rowland.harvard.edu>","CC":"<linux-clk@vger.kernel.org>, <linux-kernel@vger.kernel.org>,\n\t<linux-mtd@lists.infradead.org>, <linux-pwm@vger.kernel.org>,\n\t<linux-serial@vger.kernel.org>, <linux-usb@vger.kernel.org>,\n\t<linux-arm-kernel@lists.infradead.org>","References":"<20170915140411.31716-1-romain.izard.pro@gmail.com>\n\t<20170915140411.31716-8-romain.izard.pro@gmail.com>","From":"Nicolas Ferre <nicolas.ferre@microchip.com>","Organization":"microchip","Message-ID":"<fa66d212-dbfb-08d4-1b2b-aaaa9f9d62de@microchip.com>","Date":"Fri, 22 Sep 2017 14:42:37 +0200","User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101\n\tThunderbird/52.3.0","MIME-Version":"1.0","In-Reply-To":"<20170915140411.31716-8-romain.izard.pro@gmail.com>","Content-Type":"text/plain; charset=\"utf-8\"","Content-Language":"en-US","Content-Transfer-Encoding":"7bit","Sender":"linux-pwm-owner@vger.kernel.org","Precedence":"bulk","List-ID":"<linux-pwm.vger.kernel.org>","X-Mailing-List":"linux-pwm@vger.kernel.org"}}]