Lines Matching +full:stm32 +full:- +full:timer +full:- +full:counter
1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (C) STMicroelectronics 2019 - All Rights Reserved
11 #include <linux/mfd/stm32-lptimer.h>
42 regmap_write(priv->reg, STM32_LPTIM_CR, 0); in stm32_clkevent_lp_shutdown()
43 regmap_write(priv->reg, STM32_LPTIM_IER, 0); in stm32_clkevent_lp_shutdown()
45 regmap_write(priv->reg, STM32_LPTIM_ICR, STM32_LPTIM_ARRMCF); in stm32_clkevent_lp_shutdown()
57 regmap_write(priv->reg, STM32_LPTIM_CR, 0); in stm32_clkevent_lp_set_timer()
59 regmap_write(priv->reg, STM32_LPTIM_IER, STM32_LPTIM_ARRMIE); in stm32_clkevent_lp_set_timer()
61 regmap_write(priv->reg, STM32_LPTIM_CR, STM32_LPTIM_ENABLE); in stm32_clkevent_lp_set_timer()
62 /* set next event counter */ in stm32_clkevent_lp_set_timer()
63 regmap_write(priv->reg, STM32_LPTIM_ARR, evt); in stm32_clkevent_lp_set_timer()
65 /* start counter */ in stm32_clkevent_lp_set_timer()
67 regmap_write(priv->reg, STM32_LPTIM_CR, in stm32_clkevent_lp_set_timer()
70 regmap_write(priv->reg, STM32_LPTIM_CR, in stm32_clkevent_lp_set_timer()
87 return stm32_clkevent_lp_set_timer(priv->period, clkevt, true); in stm32_clkevent_lp_set_periodic()
94 return stm32_clkevent_lp_set_timer(priv->period, clkevt, false); in stm32_clkevent_lp_set_oneshot()
102 regmap_write(priv->reg, STM32_LPTIM_ICR, STM32_LPTIM_ARRMCF); in stm32_clkevent_lp_irq_handler()
104 if (clkevt->event_handler) in stm32_clkevent_lp_irq_handler()
105 clkevt->event_handler(clkevt); in stm32_clkevent_lp_irq_handler()
120 regmap_write(priv->reg, STM32_LPTIM_CFGR, i << CFGR_PSC_OFFSET); in stm32_clkevent_lp_set_prescaler()
124 priv->period = DIV_ROUND_UP(*rate, HZ); in stm32_clkevent_lp_set_prescaler()
125 priv->psc = i; in stm32_clkevent_lp_set_prescaler()
135 clk_disable_unprepare(priv->clk); in stm32_clkevent_lp_suspend()
142 clk_prepare_enable(priv->clk); in stm32_clkevent_lp_resume()
145 regmap_write(priv->reg, STM32_LPTIM_CFGR, priv->psc << CFGR_PSC_OFFSET); in stm32_clkevent_lp_resume()
151 priv->clkevt.name = np->full_name; in stm32_clkevent_lp_init()
152 priv->clkevt.cpumask = cpu_possible_mask; in stm32_clkevent_lp_init()
153 priv->clkevt.features = CLOCK_EVT_FEAT_PERIODIC | in stm32_clkevent_lp_init()
155 priv->clkevt.set_state_shutdown = stm32_clkevent_lp_shutdown; in stm32_clkevent_lp_init()
156 priv->clkevt.set_state_periodic = stm32_clkevent_lp_set_periodic; in stm32_clkevent_lp_init()
157 priv->clkevt.set_state_oneshot = stm32_clkevent_lp_set_oneshot; in stm32_clkevent_lp_init()
158 priv->clkevt.set_next_event = stm32_clkevent_lp_set_next_event; in stm32_clkevent_lp_init()
159 priv->clkevt.rating = STM32_LP_RATING; in stm32_clkevent_lp_init()
160 priv->clkevt.suspend = stm32_clkevent_lp_suspend; in stm32_clkevent_lp_init()
161 priv->clkevt.resume = stm32_clkevent_lp_resume; in stm32_clkevent_lp_init()
163 clockevents_config_and_register(&priv->clkevt, rate, 0x1, in stm32_clkevent_lp_init()
169 struct stm32_lptimer *ddata = dev_get_drvdata(pdev->dev.parent); in stm32_clkevent_lp_probe()
174 priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); in stm32_clkevent_lp_probe()
176 return -ENOMEM; in stm32_clkevent_lp_probe()
178 priv->reg = ddata->regmap; in stm32_clkevent_lp_probe()
179 priv->clk = ddata->clk; in stm32_clkevent_lp_probe()
180 ret = clk_prepare_enable(priv->clk); in stm32_clkevent_lp_probe()
182 return -EINVAL; in stm32_clkevent_lp_probe()
184 rate = clk_get_rate(priv->clk); in stm32_clkevent_lp_probe()
186 ret = -EINVAL; in stm32_clkevent_lp_probe()
190 irq = platform_get_irq(to_platform_device(pdev->dev.parent), 0); in stm32_clkevent_lp_probe()
196 if (of_property_read_bool(pdev->dev.parent->of_node, "wakeup-source")) { in stm32_clkevent_lp_probe()
197 device_set_wakeup_capable(&pdev->dev, true); in stm32_clkevent_lp_probe()
199 ret = dev_pm_set_wake_irq(&pdev->dev, irq); in stm32_clkevent_lp_probe()
204 ret = devm_request_irq(&pdev->dev, irq, stm32_clkevent_lp_irq_handler, in stm32_clkevent_lp_probe()
205 IRQF_TIMER, pdev->name, &priv->clkevt); in stm32_clkevent_lp_probe()
211 stm32_clkevent_lp_init(priv, pdev->dev.parent->of_node, rate); in stm32_clkevent_lp_probe()
213 priv->dev = &pdev->dev; in stm32_clkevent_lp_probe()
218 clk_disable_unprepare(priv->clk); in stm32_clkevent_lp_probe()
223 { .compatible = "st,stm32-lptimer-timer", },
231 .name = "stm32-lptimer-timer",
238 MODULE_ALIAS("platform:stm32-lptimer-timer");
239 MODULE_DESCRIPTION("STMicroelectronics STM32 clockevent low power driver");