diff options
author | Benjamin Gaignard <benjamin.gaignard@linaro.org> | 2017-04-27 09:29:16 -0400 |
---|---|---|
committer | Jonathan Cameron <jic23@kernel.org> | 2017-06-11 10:59:05 -0400 |
commit | 9eba381bf83b42b312cbae8050e357138782ba9a (patch) | |
tree | a742a62eb779eb3e0fd5e72009a7c16924ce2e2f /drivers/iio/trigger/stm32-timer-trigger.c | |
parent | d89e119a088ec83881eda5645307ae252ecea33a (diff) |
iio: make stm32 trigger driver use INDIO_HARDWARE_TRIGGERED mode
Add validate function to be use to use the correct trigger.
Add an attribute to configure device mode like for quadrature and
enable modes
Signed-off-by: Benjamin Gaignard <benjamin.gaignard@st.com>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
Diffstat (limited to 'drivers/iio/trigger/stm32-timer-trigger.c')
-rw-r--r-- | drivers/iio/trigger/stm32-timer-trigger.c | 61 |
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 | ||
420 | static 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 | |||
420 | static const struct iio_info stm32_trigger_info = { | 444 | static 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 | ||
451 | static const char *const stm32_trigger_modes[] = { | ||
452 | "trigger", | ||
453 | }; | ||
454 | |||
455 | static 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 | |||
466 | static 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 | |||
477 | static 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 | |||
426 | static const char *const stm32_enable_modes[] = { | 484 | static 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; |