Lines Matching +full:stm32 +full:- +full:lptimer
1 // SPDX-License-Identifier: GPL-2.0
3 * STM32 Low-Power Timer Encoder and Counter driver
9 * Inspired by 104-quad-8 and stm32-timer-trigger drivers.
15 #include <linux/mfd/stm32-lptimer.h>
33 ret = regmap_read(priv->regmap, STM32_LPTIM_CR, &val); in stm32_lptim_is_enabled()
47 ret = regmap_write(priv->regmap, STM32_LPTIM_CR, val); in stm32_lptim_set_enable_state()
52 clk_disable(priv->clk); in stm32_lptim_set_enable_state()
57 ret = regmap_write(priv->regmap, STM32_LPTIM_ARR, priv->preset); in stm32_lptim_set_enable_state()
61 ret = regmap_write(priv->regmap, STM32_LPTIM_CMP, 0); in stm32_lptim_set_enable_state()
66 ret = regmap_read_poll_timeout(priv->regmap, STM32_LPTIM_ISR, val, in stm32_lptim_set_enable_state()
72 ret = regmap_write(priv->regmap, STM32_LPTIM_ICR, in stm32_lptim_set_enable_state()
77 ret = clk_enable(priv->clk); in stm32_lptim_set_enable_state()
79 regmap_write(priv->regmap, STM32_LPTIM_CR, 0); in stm32_lptim_set_enable_state()
84 return regmap_update_bits(priv->regmap, STM32_LPTIM_CR, in stm32_lptim_set_enable_state()
95 if (priv->quadrature_mode) in stm32_lptim_setup()
99 val |= FIELD_PREP(STM32_LPTIM_CKPOL, enable ? priv->polarity : 0); in stm32_lptim_setup()
101 return regmap_update_bits(priv->regmap, STM32_LPTIM_CFGR, mask, val); in stm32_lptim_setup()
114 return -EINVAL; in stm32_lptim_write_raw()
121 return -EBUSY; in stm32_lptim_write_raw()
129 return -EINVAL; in stm32_lptim_write_raw()
143 ret = regmap_read(priv->regmap, STM32_LPTIM_CNT, &dat); in stm32_lptim_read_raw()
157 /* Non-quadrature mode: scale = 1 */ in stm32_lptim_read_raw()
160 if (priv->quadrature_mode) { in stm32_lptim_read_raw()
163 * - both edges, quarter cycle, scale is 0.25 in stm32_lptim_read_raw()
164 * - either rising/falling edge scale is 0.5 in stm32_lptim_read_raw()
166 if (priv->polarity > 1) in stm32_lptim_read_raw()
174 return -EINVAL; in stm32_lptim_read_raw()
184 "non-quadrature",
193 return priv->quadrature_mode; in stm32_lptim_get_quadrature_mode()
203 return -EBUSY; in stm32_lptim_set_quadrature_mode()
205 priv->quadrature_mode = type; in stm32_lptim_set_quadrature_mode()
218 "rising-edge", "falling-edge", "both-edges",
226 return priv->polarity; in stm32_lptim_cnt_get_polarity()
236 return -EBUSY; in stm32_lptim_cnt_set_polarity()
238 priv->polarity = type; in stm32_lptim_cnt_set_polarity()
257 return snprintf(buf, PAGE_SIZE, "%u\n", priv->preset); in stm32_lptim_cnt_get_preset()
269 return -EBUSY; in stm32_lptim_cnt_set_preset()
271 ret = kstrtouint(buf, 0, &priv->preset); in stm32_lptim_cnt_set_preset()
275 if (priv->preset > STM32_LPTIM_MAX_ARR) in stm32_lptim_cnt_set_preset()
276 return -EINVAL; in stm32_lptim_cnt_set_preset()
332 struct stm32_lptimer *ddata = dev_get_drvdata(pdev->dev.parent); in stm32_lptim_cnt_probe()
337 return -EINVAL; in stm32_lptim_cnt_probe()
339 indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*priv)); in stm32_lptim_cnt_probe()
341 return -ENOMEM; in stm32_lptim_cnt_probe()
344 priv->dev = &pdev->dev; in stm32_lptim_cnt_probe()
345 priv->regmap = ddata->regmap; in stm32_lptim_cnt_probe()
346 priv->clk = ddata->clk; in stm32_lptim_cnt_probe()
347 priv->preset = STM32_LPTIM_MAX_ARR; in stm32_lptim_cnt_probe()
349 indio_dev->name = dev_name(&pdev->dev); in stm32_lptim_cnt_probe()
350 indio_dev->dev.parent = &pdev->dev; in stm32_lptim_cnt_probe()
351 indio_dev->dev.of_node = pdev->dev.of_node; in stm32_lptim_cnt_probe()
352 indio_dev->info = &stm32_lptim_cnt_iio_info; in stm32_lptim_cnt_probe()
353 if (ddata->has_encoder) in stm32_lptim_cnt_probe()
354 indio_dev->channels = &stm32_lptim_enc_channels; in stm32_lptim_cnt_probe()
356 indio_dev->channels = &stm32_lptim_cnt_channels; in stm32_lptim_cnt_probe()
357 indio_dev->num_channels = 1; in stm32_lptim_cnt_probe()
361 return devm_iio_device_register(&pdev->dev, indio_dev); in stm32_lptim_cnt_probe()
365 { .compatible = "st,stm32-lptimer-counter", },
373 .name = "stm32-lptimer-counter",
380 MODULE_ALIAS("platform:stm32-lptimer-counter");
381 MODULE_DESCRIPTION("STMicroelectronics STM32 LPTIM counter driver");