aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/iio/trigger/stm32-timer-trigger.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/iio/trigger/stm32-timer-trigger.c')
-rw-r--r--drivers/iio/trigger/stm32-timer-trigger.c61
1 files changed, 61 insertions, 0 deletions
diff --git a/drivers/iio/trigger/stm32-timer-trigger.c b/drivers/iio/trigger/stm32-timer-trigger.c
index 0797f2fe584f..d22bc56dd9fc 100644
--- a/drivers/iio/trigger/stm32-timer-trigger.c
+++ b/drivers/iio/trigger/stm32-timer-trigger.c
@@ -417,12 +417,70 @@ static int stm32_counter_write_raw(struct iio_dev *indio_dev,
417 return -EINVAL; 417 return -EINVAL;
418} 418}
419 419
420static int stm32_counter_validate_trigger(struct iio_dev *indio_dev,
421 struct iio_trigger *trig)
422{
423 struct stm32_timer_trigger *priv = iio_priv(indio_dev);
424 const char * const *cur = priv->valids;
425 unsigned int i = 0;
426
427 if (!is_stm32_timer_trigger(trig))
428 return -EINVAL;
429
430 while (cur && *cur) {
431 if (!strncmp(trig->name, *cur, strlen(trig->name))) {
432 regmap_update_bits(priv->regmap,
433 TIM_SMCR, TIM_SMCR_TS,
434 i << TIM_SMCR_TS_SHIFT);
435 return 0;
436 }
437 cur++;
438 i++;
439 }
440
441 return -EINVAL;
442}
443
420static const struct iio_info stm32_trigger_info = { 444static const struct iio_info stm32_trigger_info = {
421 .driver_module = THIS_MODULE, 445 .driver_module = THIS_MODULE,
446 .validate_trigger = stm32_counter_validate_trigger,
422 .read_raw = stm32_counter_read_raw, 447 .read_raw = stm32_counter_read_raw,
423 .write_raw = stm32_counter_write_raw 448 .write_raw = stm32_counter_write_raw
424}; 449};
425 450
451static const char *const stm32_trigger_modes[] = {
452 "trigger",
453};
454
455static int stm32_set_trigger_mode(struct iio_dev *indio_dev,
456 const struct iio_chan_spec *chan,
457 unsigned int mode)
458{
459 struct stm32_timer_trigger *priv = iio_priv(indio_dev);
460
461 regmap_update_bits(priv->regmap, TIM_SMCR, TIM_SMCR_SMS, TIM_SMCR_SMS);
462
463 return 0;
464}
465
466static int stm32_get_trigger_mode(struct iio_dev *indio_dev,
467 const struct iio_chan_spec *chan)
468{
469 struct stm32_timer_trigger *priv = iio_priv(indio_dev);
470 u32 smcr;
471
472 regmap_read(priv->regmap, TIM_SMCR, &smcr);
473
474 return smcr == TIM_SMCR_SMS ? 0 : -EINVAL;
475}
476
477static const struct iio_enum stm32_trigger_mode_enum = {
478 .items = stm32_trigger_modes,
479 .num_items = ARRAY_SIZE(stm32_trigger_modes),
480 .set = stm32_set_trigger_mode,
481 .get = stm32_get_trigger_mode
482};
483
426static const char *const stm32_enable_modes[] = { 484static const char *const stm32_enable_modes[] = {
427 "always", 485 "always",
428 "gated", 486 "gated",
@@ -606,6 +664,8 @@ static const struct iio_chan_spec_ext_info stm32_trigger_count_info[] = {
606 IIO_ENUM_AVAILABLE("quadrature_mode", &stm32_quadrature_mode_enum), 664 IIO_ENUM_AVAILABLE("quadrature_mode", &stm32_quadrature_mode_enum),
607 IIO_ENUM("enable_mode", IIO_SEPARATE, &stm32_enable_mode_enum), 665 IIO_ENUM("enable_mode", IIO_SEPARATE, &stm32_enable_mode_enum),
608 IIO_ENUM_AVAILABLE("enable_mode", &stm32_enable_mode_enum), 666 IIO_ENUM_AVAILABLE("enable_mode", &stm32_enable_mode_enum),
667 IIO_ENUM("trigger_mode", IIO_SEPARATE, &stm32_trigger_mode_enum),
668 IIO_ENUM_AVAILABLE("trigger_mode", &stm32_trigger_mode_enum),
609 {} 669 {}
610}; 670};
611 671
@@ -630,6 +690,7 @@ static struct stm32_timer_trigger *stm32_setup_counter_device(struct device *dev
630 indio_dev->name = dev_name(dev); 690 indio_dev->name = dev_name(dev);
631 indio_dev->dev.parent = dev; 691 indio_dev->dev.parent = dev;
632 indio_dev->info = &stm32_trigger_info; 692 indio_dev->info = &stm32_trigger_info;
693 indio_dev->modes = INDIO_HARDWARE_TRIGGERED;
633 indio_dev->num_channels = 1; 694 indio_dev->num_channels = 1;
634 indio_dev->channels = &stm32_trigger_channel; 695 indio_dev->channels = &stm32_trigger_channel;
635 indio_dev->dev.of_node = dev->of_node; 696 indio_dev->dev.of_node = dev->of_node;