stm32-lptimer-cnt.c 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * STM32 Low-Power Timer Encoder and Counter driver
  4. *
  5. * Copyright (C) STMicroelectronics 2017
  6. *
  7. * Author: Fabrice Gasnier <fabrice.gasnier@st.com>
  8. *
  9. * Inspired by 104-quad-8 and stm32-timer-trigger drivers.
  10. *
  11. */
  12. #include <linux/bitfield.h>
  13. #include <linux/iio/iio.h>
  14. #include <linux/mfd/stm32-lptimer.h>
  15. #include <linux/module.h>
  16. #include <linux/platform_device.h>
  17. struct stm32_lptim_cnt {
  18. struct device *dev;
  19. struct regmap *regmap;
  20. struct clk *clk;
  21. u32 preset;
  22. u32 polarity;
  23. u32 quadrature_mode;
  24. };
  25. static int stm32_lptim_is_enabled(struct stm32_lptim_cnt *priv)
  26. {
  27. u32 val;
  28. int ret;
  29. ret = regmap_read(priv->regmap, STM32_LPTIM_CR, &val);
  30. if (ret)
  31. return ret;
  32. return FIELD_GET(STM32_LPTIM_ENABLE, val);
  33. }
  34. static int stm32_lptim_set_enable_state(struct stm32_lptim_cnt *priv,
  35. int enable)
  36. {
  37. int ret;
  38. u32 val;
  39. val = FIELD_PREP(STM32_LPTIM_ENABLE, enable);
  40. ret = regmap_write(priv->regmap, STM32_LPTIM_CR, val);
  41. if (ret)
  42. return ret;
  43. if (!enable) {
  44. clk_disable(priv->clk);
  45. return 0;
  46. }
  47. /* LP timer must be enabled before writing CMP & ARR */
  48. ret = regmap_write(priv->regmap, STM32_LPTIM_ARR, priv->preset);
  49. if (ret)
  50. return ret;
  51. ret = regmap_write(priv->regmap, STM32_LPTIM_CMP, 0);
  52. if (ret)
  53. return ret;
  54. /* ensure CMP & ARR registers are properly written */
  55. ret = regmap_read_poll_timeout(priv->regmap, STM32_LPTIM_ISR, val,
  56. (val & STM32_LPTIM_CMPOK_ARROK),
  57. 100, 1000);
  58. if (ret)
  59. return ret;
  60. ret = regmap_write(priv->regmap, STM32_LPTIM_ICR,
  61. STM32_LPTIM_CMPOKCF_ARROKCF);
  62. if (ret)
  63. return ret;
  64. ret = clk_enable(priv->clk);
  65. if (ret) {
  66. regmap_write(priv->regmap, STM32_LPTIM_CR, 0);
  67. return ret;
  68. }
  69. /* Start LP timer in continuous mode */
  70. return regmap_update_bits(priv->regmap, STM32_LPTIM_CR,
  71. STM32_LPTIM_CNTSTRT, STM32_LPTIM_CNTSTRT);
  72. }
  73. static int stm32_lptim_setup(struct stm32_lptim_cnt *priv, int enable)
  74. {
  75. u32 mask = STM32_LPTIM_ENC | STM32_LPTIM_COUNTMODE |
  76. STM32_LPTIM_CKPOL | STM32_LPTIM_PRESC;
  77. u32 val;
  78. /* Setup LP timer encoder/counter and polarity, without prescaler */
  79. if (priv->quadrature_mode)
  80. val = enable ? STM32_LPTIM_ENC : 0;
  81. else
  82. val = enable ? STM32_LPTIM_COUNTMODE : 0;
  83. val |= FIELD_PREP(STM32_LPTIM_CKPOL, enable ? priv->polarity : 0);
  84. return regmap_update_bits(priv->regmap, STM32_LPTIM_CFGR, mask, val);
  85. }
  86. static int stm32_lptim_write_raw(struct iio_dev *indio_dev,
  87. struct iio_chan_spec const *chan,
  88. int val, int val2, long mask)
  89. {
  90. struct stm32_lptim_cnt *priv = iio_priv(indio_dev);
  91. int ret;
  92. switch (mask) {
  93. case IIO_CHAN_INFO_ENABLE:
  94. if (val < 0 || val > 1)
  95. return -EINVAL;
  96. /* Check nobody uses the timer, or already disabled/enabled */
  97. ret = stm32_lptim_is_enabled(priv);
  98. if ((ret < 0) || (!ret && !val))
  99. return ret;
  100. if (val && ret)
  101. return -EBUSY;
  102. ret = stm32_lptim_setup(priv, val);
  103. if (ret)
  104. return ret;
  105. return stm32_lptim_set_enable_state(priv, val);
  106. default:
  107. return -EINVAL;
  108. }
  109. }
  110. static int stm32_lptim_read_raw(struct iio_dev *indio_dev,
  111. struct iio_chan_spec const *chan,
  112. int *val, int *val2, long mask)
  113. {
  114. struct stm32_lptim_cnt *priv = iio_priv(indio_dev);
  115. u32 dat;
  116. int ret;
  117. switch (mask) {
  118. case IIO_CHAN_INFO_RAW:
  119. ret = regmap_read(priv->regmap, STM32_LPTIM_CNT, &dat);
  120. if (ret)
  121. return ret;
  122. *val = dat;
  123. return IIO_VAL_INT;
  124. case IIO_CHAN_INFO_ENABLE:
  125. ret = stm32_lptim_is_enabled(priv);
  126. if (ret < 0)
  127. return ret;
  128. *val = ret;
  129. return IIO_VAL_INT;
  130. case IIO_CHAN_INFO_SCALE:
  131. /* Non-quadrature mode: scale = 1 */
  132. *val = 1;
  133. *val2 = 0;
  134. if (priv->quadrature_mode) {
  135. /*
  136. * Quadrature encoder mode:
  137. * - both edges, quarter cycle, scale is 0.25
  138. * - either rising/falling edge scale is 0.5
  139. */
  140. if (priv->polarity > 1)
  141. *val2 = 2;
  142. else
  143. *val2 = 1;
  144. }
  145. return IIO_VAL_FRACTIONAL_LOG2;
  146. default:
  147. return -EINVAL;
  148. }
  149. }
  150. static const struct iio_info stm32_lptim_cnt_iio_info = {
  151. .read_raw = stm32_lptim_read_raw,
  152. .write_raw = stm32_lptim_write_raw,
  153. };
  154. static const char *const stm32_lptim_quadrature_modes[] = {
  155. "non-quadrature",
  156. "quadrature",
  157. };
  158. static int stm32_lptim_get_quadrature_mode(struct iio_dev *indio_dev,
  159. const struct iio_chan_spec *chan)
  160. {
  161. struct stm32_lptim_cnt *priv = iio_priv(indio_dev);
  162. return priv->quadrature_mode;
  163. }
  164. static int stm32_lptim_set_quadrature_mode(struct iio_dev *indio_dev,
  165. const struct iio_chan_spec *chan,
  166. unsigned int type)
  167. {
  168. struct stm32_lptim_cnt *priv = iio_priv(indio_dev);
  169. if (stm32_lptim_is_enabled(priv))
  170. return -EBUSY;
  171. priv->quadrature_mode = type;
  172. return 0;
  173. }
  174. static const struct iio_enum stm32_lptim_quadrature_mode_en = {
  175. .items = stm32_lptim_quadrature_modes,
  176. .num_items = ARRAY_SIZE(stm32_lptim_quadrature_modes),
  177. .get = stm32_lptim_get_quadrature_mode,
  178. .set = stm32_lptim_set_quadrature_mode,
  179. };
  180. static const char * const stm32_lptim_cnt_polarity[] = {
  181. "rising-edge", "falling-edge", "both-edges",
  182. };
  183. static int stm32_lptim_cnt_get_polarity(struct iio_dev *indio_dev,
  184. const struct iio_chan_spec *chan)
  185. {
  186. struct stm32_lptim_cnt *priv = iio_priv(indio_dev);
  187. return priv->polarity;
  188. }
  189. static int stm32_lptim_cnt_set_polarity(struct iio_dev *indio_dev,
  190. const struct iio_chan_spec *chan,
  191. unsigned int type)
  192. {
  193. struct stm32_lptim_cnt *priv = iio_priv(indio_dev);
  194. if (stm32_lptim_is_enabled(priv))
  195. return -EBUSY;
  196. priv->polarity = type;
  197. return 0;
  198. }
  199. static const struct iio_enum stm32_lptim_cnt_polarity_en = {
  200. .items = stm32_lptim_cnt_polarity,
  201. .num_items = ARRAY_SIZE(stm32_lptim_cnt_polarity),
  202. .get = stm32_lptim_cnt_get_polarity,
  203. .set = stm32_lptim_cnt_set_polarity,
  204. };
  205. static ssize_t stm32_lptim_cnt_get_preset(struct iio_dev *indio_dev,
  206. uintptr_t private,
  207. const struct iio_chan_spec *chan,
  208. char *buf)
  209. {
  210. struct stm32_lptim_cnt *priv = iio_priv(indio_dev);
  211. return snprintf(buf, PAGE_SIZE, "%u\n", priv->preset);
  212. }
  213. static ssize_t stm32_lptim_cnt_set_preset(struct iio_dev *indio_dev,
  214. uintptr_t private,
  215. const struct iio_chan_spec *chan,
  216. const char *buf, size_t len)
  217. {
  218. struct stm32_lptim_cnt *priv = iio_priv(indio_dev);
  219. int ret;
  220. if (stm32_lptim_is_enabled(priv))
  221. return -EBUSY;
  222. ret = kstrtouint(buf, 0, &priv->preset);
  223. if (ret)
  224. return ret;
  225. if (priv->preset > STM32_LPTIM_MAX_ARR)
  226. return -EINVAL;
  227. return len;
  228. }
  229. /* LP timer with encoder */
  230. static const struct iio_chan_spec_ext_info stm32_lptim_enc_ext_info[] = {
  231. {
  232. .name = "preset",
  233. .shared = IIO_SEPARATE,
  234. .read = stm32_lptim_cnt_get_preset,
  235. .write = stm32_lptim_cnt_set_preset,
  236. },
  237. IIO_ENUM("polarity", IIO_SEPARATE, &stm32_lptim_cnt_polarity_en),
  238. IIO_ENUM_AVAILABLE("polarity", &stm32_lptim_cnt_polarity_en),
  239. IIO_ENUM("quadrature_mode", IIO_SEPARATE,
  240. &stm32_lptim_quadrature_mode_en),
  241. IIO_ENUM_AVAILABLE("quadrature_mode", &stm32_lptim_quadrature_mode_en),
  242. {}
  243. };
  244. static const struct iio_chan_spec stm32_lptim_enc_channels = {
  245. .type = IIO_COUNT,
  246. .channel = 0,
  247. .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
  248. BIT(IIO_CHAN_INFO_ENABLE) |
  249. BIT(IIO_CHAN_INFO_SCALE),
  250. .ext_info = stm32_lptim_enc_ext_info,
  251. .indexed = 1,
  252. };
  253. /* LP timer without encoder (counter only) */
  254. static const struct iio_chan_spec_ext_info stm32_lptim_cnt_ext_info[] = {
  255. {
  256. .name = "preset",
  257. .shared = IIO_SEPARATE,
  258. .read = stm32_lptim_cnt_get_preset,
  259. .write = stm32_lptim_cnt_set_preset,
  260. },
  261. IIO_ENUM("polarity", IIO_SEPARATE, &stm32_lptim_cnt_polarity_en),
  262. IIO_ENUM_AVAILABLE("polarity", &stm32_lptim_cnt_polarity_en),
  263. {}
  264. };
  265. static const struct iio_chan_spec stm32_lptim_cnt_channels = {
  266. .type = IIO_COUNT,
  267. .channel = 0,
  268. .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
  269. BIT(IIO_CHAN_INFO_ENABLE) |
  270. BIT(IIO_CHAN_INFO_SCALE),
  271. .ext_info = stm32_lptim_cnt_ext_info,
  272. .indexed = 1,
  273. };
  274. static int stm32_lptim_cnt_probe(struct platform_device *pdev)
  275. {
  276. struct stm32_lptimer *ddata = dev_get_drvdata(pdev->dev.parent);
  277. struct stm32_lptim_cnt *priv;
  278. struct iio_dev *indio_dev;
  279. if (IS_ERR_OR_NULL(ddata))
  280. return -EINVAL;
  281. indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*priv));
  282. if (!indio_dev)
  283. return -ENOMEM;
  284. priv = iio_priv(indio_dev);
  285. priv->dev = &pdev->dev;
  286. priv->regmap = ddata->regmap;
  287. priv->clk = ddata->clk;
  288. priv->preset = STM32_LPTIM_MAX_ARR;
  289. indio_dev->name = dev_name(&pdev->dev);
  290. indio_dev->dev.parent = &pdev->dev;
  291. indio_dev->dev.of_node = pdev->dev.of_node;
  292. indio_dev->info = &stm32_lptim_cnt_iio_info;
  293. if (ddata->has_encoder)
  294. indio_dev->channels = &stm32_lptim_enc_channels;
  295. else
  296. indio_dev->channels = &stm32_lptim_cnt_channels;
  297. indio_dev->num_channels = 1;
  298. platform_set_drvdata(pdev, priv);
  299. return devm_iio_device_register(&pdev->dev, indio_dev);
  300. }
  301. static const struct of_device_id stm32_lptim_cnt_of_match[] = {
  302. { .compatible = "st,stm32-lptimer-counter", },
  303. {},
  304. };
  305. MODULE_DEVICE_TABLE(of, stm32_lptim_cnt_of_match);
  306. static struct platform_driver stm32_lptim_cnt_driver = {
  307. .probe = stm32_lptim_cnt_probe,
  308. .driver = {
  309. .name = "stm32-lptimer-counter",
  310. .of_match_table = stm32_lptim_cnt_of_match,
  311. },
  312. };
  313. module_platform_driver(stm32_lptim_cnt_driver);
  314. MODULE_AUTHOR("Fabrice Gasnier <fabrice.gasnier@st.com>");
  315. MODULE_ALIAS("platform:stm32-lptimer-counter");
  316. MODULE_DESCRIPTION("STMicroelectronics STM32 LPTIM counter driver");
  317. MODULE_LICENSE("GPL v2");