Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1732898
| From | Romain Izard <romain.izard.pro@gmail.com> |
|---|---|
| Newsgroups | linux.kernel |
| Subject | [PATCH v2 7/9] pwm: atmel-tcb: Support backup mode |
| Date | 2017-09-15 16:10 +0200 |
| Message-ID | <upZtE-3TS-17@gated-at.bofh.it> (permalink) |
| References | <upZtD-3TS-5@gated-at.bofh.it> |
| Organization | linux.* mail to news gateway |
Save and restore registers for the PWM on suspend and resume, which
makes hibernation and backup modes possible.
Signed-off-by: Romain Izard <romain.izard.pro@gmail.com>
---
drivers/pwm/pwm-atmel-tcb.c | 63 +++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 61 insertions(+), 2 deletions(-)
diff --git a/drivers/pwm/pwm-atmel-tcb.c b/drivers/pwm/pwm-atmel-tcb.c
index 75db585a2a94..acd3ce8ecf3f 100644
--- a/drivers/pwm/pwm-atmel-tcb.c
+++ b/drivers/pwm/pwm-atmel-tcb.c
@@ -37,11 +37,20 @@ struct atmel_tcb_pwm_device {
unsigned period; /* PWM period expressed in clk cycles */
};
+struct atmel_tcb_channel {
+ u32 enabled;
+ u32 cmr;
+ u32 ra;
+ u32 rb;
+ u32 rc;
+};
+
struct atmel_tcb_pwm_chip {
struct pwm_chip chip;
spinlock_t lock;
struct atmel_tc *tc;
struct atmel_tcb_pwm_device *pwms[NPWM];
+ struct atmel_tcb_channel bkup[NPWM / 2];
};
static inline struct atmel_tcb_pwm_chip *to_tcb_chip(struct pwm_chip *chip)
@@ -175,12 +184,15 @@ static void atmel_tcb_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm)
* Use software trigger to apply the new setting.
* If both PWM devices in this group are disabled we stop the clock.
*/
- if (!(cmr & (ATMEL_TC_ACPC | ATMEL_TC_BCPC)))
+ if (!(cmr & (ATMEL_TC_ACPC | ATMEL_TC_BCPC))) {
__raw_writel(ATMEL_TC_SWTRG | ATMEL_TC_CLKDIS,
regs + ATMEL_TC_REG(group, CCR));
- else
+ tcbpwmc->bkup[group].enabled = 1;
+ } else {
__raw_writel(ATMEL_TC_SWTRG, regs +
ATMEL_TC_REG(group, CCR));
+ tcbpwmc->bkup[group].enabled = 0;
+ }
spin_unlock(&tcbpwmc->lock);
}
@@ -263,6 +275,7 @@ static int atmel_tcb_pwm_enable(struct pwm_chip *chip, struct pwm_device *pwm)
/* Use software trigger to apply the new setting */
__raw_writel(ATMEL_TC_CLKEN | ATMEL_TC_SWTRG,
regs + ATMEL_TC_REG(group, CCR));
+ tcbpwmc->bkup[group].enabled = 1;
spin_unlock(&tcbpwmc->lock);
return 0;
}
@@ -445,10 +458,56 @@ static const struct of_device_id atmel_tcb_pwm_dt_ids[] = {
};
MODULE_DEVICE_TABLE(of, atmel_tcb_pwm_dt_ids);
+#ifdef CONFIG_PM_SLEEP
+static int atmel_tcb_pwm_suspend(struct device *dev)
+{
+ struct platform_device *pdev = to_platform_device(dev);
+ struct atmel_tcb_pwm_chip *tcbpwm = platform_get_drvdata(pdev);
+ void __iomem *base = tcbpwm->tc->regs;
+ int i;
+
+ for (i = 0; i < (NPWM / 2); i++) {
+ struct atmel_tcb_channel *chan = &tcbpwm->bkup[i];
+
+ chan->cmr = readl(base + ATMEL_TC_REG(i, CMR));
+ chan->ra = readl(base + ATMEL_TC_REG(i, RA));
+ chan->rb = readl(base + ATMEL_TC_REG(i, RB));
+ chan->rc = readl(base + ATMEL_TC_REG(i, RC));
+ }
+ return 0;
+}
+
+static int atmel_tcb_pwm_resume(struct device *dev)
+{
+ struct platform_device *pdev = to_platform_device(dev);
+ struct atmel_tcb_pwm_chip *tcbpwm = platform_get_drvdata(pdev);
+ void __iomem *base = tcbpwm->tc->regs;
+ int i;
+
+ for (i = 0; i < (NPWM / 2); i++) {
+ struct atmel_tcb_channel *chan = &tcbpwm->bkup[i];
+
+ writel(chan->cmr, base + ATMEL_TC_REG(i, CMR));
+ writel(chan->ra, base + ATMEL_TC_REG(i, RA));
+ writel(chan->rb, base + ATMEL_TC_REG(i, RB));
+ writel(chan->rc, base + ATMEL_TC_REG(i, RC));
+ if (chan->enabled) {
+ writel(ATMEL_TC_CLKEN | ATMEL_TC_SWTRG,
+ base + ATMEL_TC_REG(i, CCR));
+ }
+ }
+ return 0;
+}
+#endif
+
+static SIMPLE_DEV_PM_OPS(atmel_tcb_pwm_pm_ops, atmel_tcb_pwm_suspend,
+ atmel_tcb_pwm_resume);
+
static struct platform_driver atmel_tcb_pwm_driver = {
.driver = {
.name = "atmel-tcb-pwm",
.of_match_table = atmel_tcb_pwm_dt_ids,
+ .pm = &atmel_tcb_pwm_pm_ops,
},
.probe = atmel_tcb_pwm_probe,
.remove = atmel_tcb_pwm_remove,
--
2.11.0
Back to linux.kernel | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
[PATCH v2 0/9] Various patches for SAMA5D2 backup mode Romain Izard <romain.izard.pro@gmail.com> - 2017-09-15 16:10 +0200
[PATCH v2 9/9] tty/serial: atmel: Prevent a warning on suspend Romain Izard <romain.izard.pro@gmail.com> - 2017-09-15 16:10 +0200
Re: [PATCH v2 9/9] tty/serial: atmel: Prevent a warning on suspend Nicolas Ferre <nicolas.ferre@microchip.com> - 2017-09-19 12:20 +0200
Re: [PATCH v2 9/9] tty/serial: atmel: Prevent a warning on suspend Richard Genoud <richard.genoud@gmail.com> - 2017-09-20 16:40 +0200
[PATCH v2 6/9] ehci-atmel: Power down during suspend is normal Romain Izard <romain.izard.pro@gmail.com> - 2017-09-15 16:10 +0200
Re: [PATCH v2 6/9] ehci-atmel: Power down during suspend is normal Nicolas Ferre <nicolas.ferre@microchip.com> - 2017-09-22 14:40 +0200
[PATCH v2 7/9] pwm: atmel-tcb: Support backup mode Romain Izard <romain.izard.pro@gmail.com> - 2017-09-15 16:10 +0200
Re: [PATCH v2 7/9] pwm: atmel-tcb: Support backup mode Nicolas Ferre <nicolas.ferre@microchip.com> - 2017-09-22 14:50 +0200
[PATCH v2 1/9] clk: at91: pmc: Wait for clocks when resuming Romain Izard <romain.izard.pro@gmail.com> - 2017-09-15 16:10 +0200
Re: [PATCH v2 1/9] clk: at91: pmc: Wait for clocks when resuming Ludovic Desroches <ludovic.desroches@microchip.com> - 2017-09-22 14:10 +0200
Re: [PATCH v2 1/9] clk: at91: pmc: Wait for clocks when resuming Nicolas Ferre <nicolas.ferre@microchip.com> - 2017-09-22 14:20 +0200
[PATCH v2 5/9] mtd: nand: atmel: Report PMECC failures as errors Romain Izard <romain.izard.pro@gmail.com> - 2017-09-15 16:10 +0200
Re: [PATCH v2 5/9] mtd: nand: atmel: Report PMECC failures as errors Boris Brezillon <boris.brezillon@free-electrons.com> - 2017-09-18 12:10 +0200
Re: [PATCH v2 5/9] mtd: nand: atmel: Report PMECC failures as errors Romain Izard <romain.izard.pro@gmail.com> - 2017-09-21 11:30 +0200
[PATCH v2 4/9] mtd: nand: atmel: Avoid ECC errors when leaving backup mode Romain Izard <romain.izard.pro@gmail.com> - 2017-09-15 16:10 +0200
Re: [PATCH v2 4/9] mtd: nand: atmel: Avoid ECC errors when leaving backup mode Boris Brezillon <boris.brezillon@free-electrons.com> - 2017-09-18 12:00 +0200
[PATCH v2 2/9] clk: at91: pmc: Save SCSR during suspend Romain Izard <romain.izard.pro@gmail.com> - 2017-09-15 16:10 +0200
[PATCH v2 8/9] atmel_flexcom: Support backup mode Romain Izard <romain.izard.pro@gmail.com> - 2017-09-15 16:10 +0200
Re: [PATCH v2 8/9] atmel_flexcom: Support backup mode Nicolas Ferre <nicolas.ferre@microchip.com> - 2017-09-19 11:30 +0200
Re: [PATCH v2 8/9] atmel_flexcom: Support backup mode Lee Jones <lee.jones@linaro.org> - 2017-09-19 17:30 +0200
Re: [PATCH v2 8/9] atmel_flexcom: Support backup mode Romain Izard <romain.izard.pro@gmail.com> - 2017-09-20 10:40 +0200
Re: [PATCH v2 8/9] atmel_flexcom: Support backup mode Alexandre Belloni <alexandre.belloni@free-electrons.com> - 2017-09-20 11:20 +0200
[PATCH v2 3/9] clk: at91: pmc: Support backup for programmable clocks Romain Izard <romain.izard.pro@gmail.com> - 2017-09-15 16:10 +0200
Re: [PATCH v2 3/9] clk: at91: pmc: Support backup for programmable clocks Nicolas Ferre <nicolas.ferre@microchip.com> - 2017-09-22 12:40 +0200
Re: [PATCH v2 3/9] clk: at91: pmc: Support backup for programmable clocks Romain Izard <romain.izard.pro@gmail.com> - 2017-09-25 10:30 +0200
csiph-web