stm32-timer-trigger.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644
  1. /*
  2. * Copyright (C) STMicroelectronics 2016
  3. *
  4. * Author: Benjamin Gaignard <benjamin.gaignard@st.com>
  5. *
  6. * License terms: GNU General Public License (GPL), version 2
  7. */
  8. #include <linux/iio/iio.h>
  9. #include <linux/iio/sysfs.h>
  10. #include <linux/iio/timer/stm32-timer-trigger.h>
  11. #include <linux/iio/trigger.h>
  12. #include <linux/mfd/stm32-timers.h>
  13. #include <linux/module.h>
  14. #include <linux/platform_device.h>
  15. #define MAX_TRIGGERS 6
  16. #define MAX_VALIDS 5
  17. /* List the triggers created by each timer */
  18. static const void *triggers_table[][MAX_TRIGGERS] = {
  19. { TIM1_TRGO, TIM1_CH1, TIM1_CH2, TIM1_CH3, TIM1_CH4,},
  20. { TIM2_TRGO, TIM2_CH1, TIM2_CH2, TIM2_CH3, TIM2_CH4,},
  21. { TIM3_TRGO, TIM3_CH1, TIM3_CH2, TIM3_CH3, TIM3_CH4,},
  22. { TIM4_TRGO, TIM4_CH1, TIM4_CH2, TIM4_CH3, TIM4_CH4,},
  23. { TIM5_TRGO, TIM5_CH1, TIM5_CH2, TIM5_CH3, TIM5_CH4,},
  24. { TIM6_TRGO,},
  25. { TIM7_TRGO,},
  26. { TIM8_TRGO, TIM8_CH1, TIM8_CH2, TIM8_CH3, TIM8_CH4,},
  27. { TIM9_TRGO, TIM9_CH1, TIM9_CH2,},
  28. { }, /* timer 10 */
  29. { }, /* timer 11 */
  30. { TIM12_TRGO, TIM12_CH1, TIM12_CH2,},
  31. };
  32. /* List the triggers accepted by each timer */
  33. static const void *valids_table[][MAX_VALIDS] = {
  34. { TIM5_TRGO, TIM2_TRGO, TIM3_TRGO, TIM4_TRGO,},
  35. { TIM1_TRGO, TIM8_TRGO, TIM3_TRGO, TIM4_TRGO,},
  36. { TIM1_TRGO, TIM2_TRGO, TIM5_TRGO, TIM4_TRGO,},
  37. { TIM1_TRGO, TIM2_TRGO, TIM3_TRGO, TIM8_TRGO,},
  38. { TIM2_TRGO, TIM3_TRGO, TIM4_TRGO, TIM8_TRGO,},
  39. { }, /* timer 6 */
  40. { }, /* timer 7 */
  41. { TIM1_TRGO, TIM2_TRGO, TIM4_TRGO, TIM5_TRGO,},
  42. { TIM2_TRGO, TIM3_TRGO,},
  43. { }, /* timer 10 */
  44. { }, /* timer 11 */
  45. { TIM4_TRGO, TIM5_TRGO,},
  46. };
  47. struct stm32_timer_trigger {
  48. struct device *dev;
  49. struct regmap *regmap;
  50. struct clk *clk;
  51. u32 max_arr;
  52. const void *triggers;
  53. const void *valids;
  54. };
  55. static int stm32_timer_start(struct stm32_timer_trigger *priv,
  56. unsigned int frequency)
  57. {
  58. unsigned long long prd, div;
  59. int prescaler = 0;
  60. u32 ccer, cr1;
  61. /* Period and prescaler values depends of clock rate */
  62. div = (unsigned long long)clk_get_rate(priv->clk);
  63. do_div(div, frequency);
  64. prd = div;
  65. /*
  66. * Increase prescaler value until we get a result that fit
  67. * with auto reload register maximum value.
  68. */
  69. while (div > priv->max_arr) {
  70. prescaler++;
  71. div = prd;
  72. do_div(div, (prescaler + 1));
  73. }
  74. prd = div;
  75. if (prescaler > MAX_TIM_PSC) {
  76. dev_err(priv->dev, "prescaler exceeds the maximum value\n");
  77. return -EINVAL;
  78. }
  79. /* Check if nobody else use the timer */
  80. regmap_read(priv->regmap, TIM_CCER, &ccer);
  81. if (ccer & TIM_CCER_CCXE)
  82. return -EBUSY;
  83. regmap_read(priv->regmap, TIM_CR1, &cr1);
  84. if (!(cr1 & TIM_CR1_CEN))
  85. clk_enable(priv->clk);
  86. regmap_write(priv->regmap, TIM_PSC, prescaler);
  87. regmap_write(priv->regmap, TIM_ARR, prd - 1);
  88. regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_ARPE, TIM_CR1_ARPE);
  89. /* Force master mode to update mode */
  90. regmap_update_bits(priv->regmap, TIM_CR2, TIM_CR2_MMS, 0x20);
  91. /* Make sure that registers are updated */
  92. regmap_update_bits(priv->regmap, TIM_EGR, TIM_EGR_UG, TIM_EGR_UG);
  93. /* Enable controller */
  94. regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_CEN, TIM_CR1_CEN);
  95. return 0;
  96. }
  97. static void stm32_timer_stop(struct stm32_timer_trigger *priv)
  98. {
  99. u32 ccer, cr1;
  100. regmap_read(priv->regmap, TIM_CCER, &ccer);
  101. if (ccer & TIM_CCER_CCXE)
  102. return;
  103. regmap_read(priv->regmap, TIM_CR1, &cr1);
  104. if (cr1 & TIM_CR1_CEN)
  105. clk_disable(priv->clk);
  106. /* Stop timer */
  107. regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_CEN, 0);
  108. regmap_write(priv->regmap, TIM_PSC, 0);
  109. regmap_write(priv->regmap, TIM_ARR, 0);
  110. /* Make sure that registers are updated */
  111. regmap_update_bits(priv->regmap, TIM_EGR, TIM_EGR_UG, TIM_EGR_UG);
  112. }
  113. static ssize_t stm32_tt_store_frequency(struct device *dev,
  114. struct device_attribute *attr,
  115. const char *buf, size_t len)
  116. {
  117. struct iio_trigger *trig = to_iio_trigger(dev);
  118. struct stm32_timer_trigger *priv = iio_trigger_get_drvdata(trig);
  119. unsigned int freq;
  120. int ret;
  121. ret = kstrtouint(buf, 10, &freq);
  122. if (ret)
  123. return ret;
  124. if (freq == 0) {
  125. stm32_timer_stop(priv);
  126. } else {
  127. ret = stm32_timer_start(priv, freq);
  128. if (ret)
  129. return ret;
  130. }
  131. return len;
  132. }
  133. static ssize_t stm32_tt_read_frequency(struct device *dev,
  134. struct device_attribute *attr, char *buf)
  135. {
  136. struct iio_trigger *trig = to_iio_trigger(dev);
  137. struct stm32_timer_trigger *priv = iio_trigger_get_drvdata(trig);
  138. u32 psc, arr, cr1;
  139. unsigned long long freq = 0;
  140. regmap_read(priv->regmap, TIM_CR1, &cr1);
  141. regmap_read(priv->regmap, TIM_PSC, &psc);
  142. regmap_read(priv->regmap, TIM_ARR, &arr);
  143. if (psc && arr && (cr1 & TIM_CR1_CEN)) {
  144. freq = (unsigned long long)clk_get_rate(priv->clk);
  145. do_div(freq, psc);
  146. do_div(freq, arr);
  147. }
  148. return sprintf(buf, "%d\n", (unsigned int)freq);
  149. }
  150. static IIO_DEV_ATTR_SAMP_FREQ(0660,
  151. stm32_tt_read_frequency,
  152. stm32_tt_store_frequency);
  153. static char *master_mode_table[] = {
  154. "reset",
  155. "enable",
  156. "update",
  157. "compare_pulse",
  158. "OC1REF",
  159. "OC2REF",
  160. "OC3REF",
  161. "OC4REF"
  162. };
  163. static ssize_t stm32_tt_show_master_mode(struct device *dev,
  164. struct device_attribute *attr,
  165. char *buf)
  166. {
  167. struct stm32_timer_trigger *priv = dev_get_drvdata(dev);
  168. u32 cr2;
  169. regmap_read(priv->regmap, TIM_CR2, &cr2);
  170. cr2 = (cr2 & TIM_CR2_MMS) >> TIM_CR2_MMS_SHIFT;
  171. return snprintf(buf, PAGE_SIZE, "%s\n", master_mode_table[cr2]);
  172. }
  173. static ssize_t stm32_tt_store_master_mode(struct device *dev,
  174. struct device_attribute *attr,
  175. const char *buf, size_t len)
  176. {
  177. struct stm32_timer_trigger *priv = dev_get_drvdata(dev);
  178. int i;
  179. for (i = 0; i < ARRAY_SIZE(master_mode_table); i++) {
  180. if (!strncmp(master_mode_table[i], buf,
  181. strlen(master_mode_table[i]))) {
  182. regmap_update_bits(priv->regmap, TIM_CR2,
  183. TIM_CR2_MMS, i << TIM_CR2_MMS_SHIFT);
  184. /* Make sure that registers are updated */
  185. regmap_update_bits(priv->regmap, TIM_EGR,
  186. TIM_EGR_UG, TIM_EGR_UG);
  187. return len;
  188. }
  189. }
  190. return -EINVAL;
  191. }
  192. static IIO_CONST_ATTR(master_mode_available,
  193. "reset enable update compare_pulse OC1REF OC2REF OC3REF OC4REF");
  194. static IIO_DEVICE_ATTR(master_mode, 0660,
  195. stm32_tt_show_master_mode,
  196. stm32_tt_store_master_mode,
  197. 0);
  198. static struct attribute *stm32_trigger_attrs[] = {
  199. &iio_dev_attr_sampling_frequency.dev_attr.attr,
  200. &iio_dev_attr_master_mode.dev_attr.attr,
  201. &iio_const_attr_master_mode_available.dev_attr.attr,
  202. NULL,
  203. };
  204. static const struct attribute_group stm32_trigger_attr_group = {
  205. .attrs = stm32_trigger_attrs,
  206. };
  207. static const struct attribute_group *stm32_trigger_attr_groups[] = {
  208. &stm32_trigger_attr_group,
  209. NULL,
  210. };
  211. static const struct iio_trigger_ops timer_trigger_ops = {
  212. .owner = THIS_MODULE,
  213. };
  214. static int stm32_setup_iio_triggers(struct stm32_timer_trigger *priv)
  215. {
  216. int ret;
  217. const char * const *cur = priv->triggers;
  218. while (cur && *cur) {
  219. struct iio_trigger *trig;
  220. trig = devm_iio_trigger_alloc(priv->dev, "%s", *cur);
  221. if (!trig)
  222. return -ENOMEM;
  223. trig->dev.parent = priv->dev->parent;
  224. trig->ops = &timer_trigger_ops;
  225. /*
  226. * sampling frequency and master mode attributes
  227. * should only be available on trgo trigger which
  228. * is always the first in the list.
  229. */
  230. if (cur == priv->triggers)
  231. trig->dev.groups = stm32_trigger_attr_groups;
  232. iio_trigger_set_drvdata(trig, priv);
  233. ret = devm_iio_trigger_register(priv->dev, trig);
  234. if (ret)
  235. return ret;
  236. cur++;
  237. }
  238. return 0;
  239. }
  240. static int stm32_counter_read_raw(struct iio_dev *indio_dev,
  241. struct iio_chan_spec const *chan,
  242. int *val, int *val2, long mask)
  243. {
  244. struct stm32_timer_trigger *priv = iio_priv(indio_dev);
  245. switch (mask) {
  246. case IIO_CHAN_INFO_RAW:
  247. {
  248. u32 cnt;
  249. regmap_read(priv->regmap, TIM_CNT, &cnt);
  250. *val = cnt;
  251. return IIO_VAL_INT;
  252. }
  253. case IIO_CHAN_INFO_SCALE:
  254. {
  255. u32 smcr;
  256. regmap_read(priv->regmap, TIM_SMCR, &smcr);
  257. smcr &= TIM_SMCR_SMS;
  258. *val = 1;
  259. *val2 = 0;
  260. /* in quadrature case scale = 0.25 */
  261. if (smcr == 3)
  262. *val2 = 2;
  263. return IIO_VAL_FRACTIONAL_LOG2;
  264. }
  265. }
  266. return -EINVAL;
  267. }
  268. static int stm32_counter_write_raw(struct iio_dev *indio_dev,
  269. struct iio_chan_spec const *chan,
  270. int val, int val2, long mask)
  271. {
  272. struct stm32_timer_trigger *priv = iio_priv(indio_dev);
  273. switch (mask) {
  274. case IIO_CHAN_INFO_RAW:
  275. regmap_write(priv->regmap, TIM_CNT, val);
  276. return IIO_VAL_INT;
  277. case IIO_CHAN_INFO_SCALE:
  278. /* fixed scale */
  279. return -EINVAL;
  280. }
  281. return -EINVAL;
  282. }
  283. static const struct iio_info stm32_trigger_info = {
  284. .driver_module = THIS_MODULE,
  285. .read_raw = stm32_counter_read_raw,
  286. .write_raw = stm32_counter_write_raw
  287. };
  288. static const char *const stm32_enable_modes[] = {
  289. "always",
  290. "gated",
  291. "triggered",
  292. };
  293. static int stm32_enable_mode2sms(int mode)
  294. {
  295. switch (mode) {
  296. case 0:
  297. return 0;
  298. case 1:
  299. return 5;
  300. case 2:
  301. return 6;
  302. }
  303. return -EINVAL;
  304. }
  305. static int stm32_set_enable_mode(struct iio_dev *indio_dev,
  306. const struct iio_chan_spec *chan,
  307. unsigned int mode)
  308. {
  309. struct stm32_timer_trigger *priv = iio_priv(indio_dev);
  310. int sms = stm32_enable_mode2sms(mode);
  311. if (sms < 0)
  312. return sms;
  313. regmap_update_bits(priv->regmap, TIM_SMCR, TIM_SMCR_SMS, sms);
  314. return 0;
  315. }
  316. static int stm32_sms2enable_mode(int mode)
  317. {
  318. switch (mode) {
  319. case 0:
  320. return 0;
  321. case 5:
  322. return 1;
  323. case 6:
  324. return 2;
  325. }
  326. return -EINVAL;
  327. }
  328. static int stm32_get_enable_mode(struct iio_dev *indio_dev,
  329. const struct iio_chan_spec *chan)
  330. {
  331. struct stm32_timer_trigger *priv = iio_priv(indio_dev);
  332. u32 smcr;
  333. regmap_read(priv->regmap, TIM_SMCR, &smcr);
  334. smcr &= TIM_SMCR_SMS;
  335. return stm32_sms2enable_mode(smcr);
  336. }
  337. static const struct iio_enum stm32_enable_mode_enum = {
  338. .items = stm32_enable_modes,
  339. .num_items = ARRAY_SIZE(stm32_enable_modes),
  340. .set = stm32_set_enable_mode,
  341. .get = stm32_get_enable_mode
  342. };
  343. static const char *const stm32_quadrature_modes[] = {
  344. "channel_A",
  345. "channel_B",
  346. "quadrature",
  347. };
  348. static int stm32_set_quadrature_mode(struct iio_dev *indio_dev,
  349. const struct iio_chan_spec *chan,
  350. unsigned int mode)
  351. {
  352. struct stm32_timer_trigger *priv = iio_priv(indio_dev);
  353. regmap_update_bits(priv->regmap, TIM_SMCR, TIM_SMCR_SMS, mode + 1);
  354. return 0;
  355. }
  356. static int stm32_get_quadrature_mode(struct iio_dev *indio_dev,
  357. const struct iio_chan_spec *chan)
  358. {
  359. struct stm32_timer_trigger *priv = iio_priv(indio_dev);
  360. u32 smcr;
  361. regmap_read(priv->regmap, TIM_SMCR, &smcr);
  362. smcr &= TIM_SMCR_SMS;
  363. return smcr - 1;
  364. }
  365. static const struct iio_enum stm32_quadrature_mode_enum = {
  366. .items = stm32_quadrature_modes,
  367. .num_items = ARRAY_SIZE(stm32_quadrature_modes),
  368. .set = stm32_set_quadrature_mode,
  369. .get = stm32_get_quadrature_mode
  370. };
  371. static const char *const stm32_count_direction_states[] = {
  372. "up",
  373. "down"
  374. };
  375. static int stm32_set_count_direction(struct iio_dev *indio_dev,
  376. const struct iio_chan_spec *chan,
  377. unsigned int mode)
  378. {
  379. struct stm32_timer_trigger *priv = iio_priv(indio_dev);
  380. regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_DIR, mode);
  381. return 0;
  382. }
  383. static int stm32_get_count_direction(struct iio_dev *indio_dev,
  384. const struct iio_chan_spec *chan)
  385. {
  386. struct stm32_timer_trigger *priv = iio_priv(indio_dev);
  387. u32 cr1;
  388. regmap_read(priv->regmap, TIM_CR1, &cr1);
  389. return (cr1 & TIM_CR1_DIR);
  390. }
  391. static const struct iio_enum stm32_count_direction_enum = {
  392. .items = stm32_count_direction_states,
  393. .num_items = ARRAY_SIZE(stm32_count_direction_states),
  394. .set = stm32_set_count_direction,
  395. .get = stm32_get_count_direction
  396. };
  397. static ssize_t stm32_count_get_preset(struct iio_dev *indio_dev,
  398. uintptr_t private,
  399. const struct iio_chan_spec *chan,
  400. char *buf)
  401. {
  402. struct stm32_timer_trigger *priv = iio_priv(indio_dev);
  403. u32 arr;
  404. regmap_read(priv->regmap, TIM_ARR, &arr);
  405. return snprintf(buf, PAGE_SIZE, "%u\n", arr);
  406. }
  407. static ssize_t stm32_count_set_preset(struct iio_dev *indio_dev,
  408. uintptr_t private,
  409. const struct iio_chan_spec *chan,
  410. const char *buf, size_t len)
  411. {
  412. struct stm32_timer_trigger *priv = iio_priv(indio_dev);
  413. unsigned int preset;
  414. int ret;
  415. ret = kstrtouint(buf, 0, &preset);
  416. if (ret)
  417. return ret;
  418. regmap_write(priv->regmap, TIM_ARR, preset);
  419. regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_ARPE, TIM_CR1_ARPE);
  420. return len;
  421. }
  422. static const struct iio_chan_spec_ext_info stm32_trigger_count_info[] = {
  423. {
  424. .name = "preset",
  425. .shared = IIO_SEPARATE,
  426. .read = stm32_count_get_preset,
  427. .write = stm32_count_set_preset
  428. },
  429. IIO_ENUM("count_direction", IIO_SEPARATE, &stm32_count_direction_enum),
  430. IIO_ENUM_AVAILABLE("count_direction", &stm32_count_direction_enum),
  431. IIO_ENUM("quadrature_mode", IIO_SEPARATE, &stm32_quadrature_mode_enum),
  432. IIO_ENUM_AVAILABLE("quadrature_mode", &stm32_quadrature_mode_enum),
  433. IIO_ENUM("enable_mode", IIO_SEPARATE, &stm32_enable_mode_enum),
  434. IIO_ENUM_AVAILABLE("enable_mode", &stm32_enable_mode_enum),
  435. {}
  436. };
  437. static const struct iio_chan_spec stm32_trigger_channel = {
  438. .type = IIO_COUNT,
  439. .channel = 0,
  440. .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
  441. .ext_info = stm32_trigger_count_info,
  442. .indexed = 1
  443. };
  444. static struct stm32_timer_trigger *stm32_setup_counter_device(struct device *dev)
  445. {
  446. struct iio_dev *indio_dev;
  447. int ret;
  448. indio_dev = devm_iio_device_alloc(dev,
  449. sizeof(struct stm32_timer_trigger));
  450. if (!indio_dev)
  451. return NULL;
  452. indio_dev->name = dev_name(dev);
  453. indio_dev->dev.parent = dev;
  454. indio_dev->info = &stm32_trigger_info;
  455. indio_dev->num_channels = 1;
  456. indio_dev->channels = &stm32_trigger_channel;
  457. indio_dev->dev.of_node = dev->of_node;
  458. ret = devm_iio_device_register(dev, indio_dev);
  459. if (ret)
  460. return NULL;
  461. return iio_priv(indio_dev);
  462. }
  463. /**
  464. * is_stm32_timer_trigger
  465. * @trig: trigger to be checked
  466. *
  467. * return true if the trigger is a valid stm32 iio timer trigger
  468. * either return false
  469. */
  470. bool is_stm32_timer_trigger(struct iio_trigger *trig)
  471. {
  472. return (trig->ops == &timer_trigger_ops);
  473. }
  474. EXPORT_SYMBOL(is_stm32_timer_trigger);
  475. static int stm32_timer_trigger_probe(struct platform_device *pdev)
  476. {
  477. struct device *dev = &pdev->dev;
  478. struct stm32_timer_trigger *priv;
  479. struct stm32_timers *ddata = dev_get_drvdata(pdev->dev.parent);
  480. unsigned int index;
  481. int ret;
  482. if (of_property_read_u32(dev->of_node, "reg", &index))
  483. return -EINVAL;
  484. if (index >= ARRAY_SIZE(triggers_table) ||
  485. index >= ARRAY_SIZE(valids_table))
  486. return -EINVAL;
  487. /* Create an IIO device only if we have triggers to be validated */
  488. if (*valids_table[index])
  489. priv = stm32_setup_counter_device(dev);
  490. else
  491. priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
  492. if (!priv)
  493. return -ENOMEM;
  494. priv->dev = dev;
  495. priv->regmap = ddata->regmap;
  496. priv->clk = ddata->clk;
  497. priv->max_arr = ddata->max_arr;
  498. priv->triggers = triggers_table[index];
  499. priv->valids = valids_table[index];
  500. ret = stm32_setup_iio_triggers(priv);
  501. if (ret)
  502. return ret;
  503. platform_set_drvdata(pdev, priv);
  504. return 0;
  505. }
  506. static const struct of_device_id stm32_trig_of_match[] = {
  507. { .compatible = "st,stm32-timer-trigger", },
  508. { /* end node */ },
  509. };
  510. MODULE_DEVICE_TABLE(of, stm32_trig_of_match);
  511. static struct platform_driver stm32_timer_trigger_driver = {
  512. .probe = stm32_timer_trigger_probe,
  513. .driver = {
  514. .name = "stm32-timer-trigger",
  515. .of_match_table = stm32_trig_of_match,
  516. },
  517. };
  518. module_platform_driver(stm32_timer_trigger_driver);
  519. MODULE_ALIAS("platform: stm32-timer-trigger");
  520. MODULE_DESCRIPTION("STMicroelectronics STM32 Timer Trigger driver");
  521. MODULE_LICENSE("GPL v2");