Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

iio: adc: stm32: add trigger polarity extended attribute

Define extended attribute so that user may choose rising, falling or both
edges for external trigger sources.
Default to rising edge in case it isn't set.

Signed-off-by: Fabrice Gasnier <fabrice.gasnier@st.com>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>

authored by

Fabrice Gasnier and committed by
Jonathan Cameron
732f2dc4 f24a33b3

+63 -1
+18
Documentation/ABI/testing/sysfs-bus-iio-adc-stm32
··· 1 + What: /sys/bus/iio/devices/triggerX/trigger_polarity 2 + KernelVersion: 4.11 3 + Contact: fabrice.gasnier@st.com 4 + Description: 5 + The STM32 ADC can be configured to use external trigger sources 6 + (e.g. timers, pwm or exti gpio). Then, it can be tuned to start 7 + conversions on external trigger by either: 8 + - "rising-edge" 9 + - "falling-edge" 10 + - "both-edges". 11 + Reading returns current trigger polarity. 12 + Writing value before enabling conversions sets trigger polarity. 13 + 14 + What: /sys/bus/iio/devices/triggerX/trigger_polarity_available 15 + KernelVersion: 4.11 16 + Contact: fabrice.gasnier@st.com 17 + Description: 18 + List all available trigger_polarity settings.
+45 -1
drivers/iio/adc/stm32-adc.c
··· 135 135 * @lock: spinlock 136 136 * @bufi: data buffer index 137 137 * @num_conv: expected number of scan conversions 138 + * @trigger_polarity: external trigger polarity (e.g. exten) 138 139 */ 139 140 struct stm32_adc { 140 141 struct stm32_adc_common *common; ··· 147 146 spinlock_t lock; /* interrupt lock */ 148 147 unsigned int bufi; 149 148 unsigned int num_conv; 149 + u32 trigger_polarity; 150 150 }; 151 151 152 152 /** ··· 412 410 413 411 /* set trigger source and polarity (default to rising edge) */ 414 412 extsel = ret; 415 - exten = STM32_EXTEN_HWTRIG_RISING_EDGE; 413 + exten = adc->trigger_polarity + STM32_EXTEN_HWTRIG_RISING_EDGE; 416 414 } 417 415 418 416 spin_lock_irqsave(&adc->lock, flags); ··· 425 423 426 424 return 0; 427 425 } 426 + 427 + static int stm32_adc_set_trig_pol(struct iio_dev *indio_dev, 428 + const struct iio_chan_spec *chan, 429 + unsigned int type) 430 + { 431 + struct stm32_adc *adc = iio_priv(indio_dev); 432 + 433 + adc->trigger_polarity = type; 434 + 435 + return 0; 436 + } 437 + 438 + static int stm32_adc_get_trig_pol(struct iio_dev *indio_dev, 439 + const struct iio_chan_spec *chan) 440 + { 441 + struct stm32_adc *adc = iio_priv(indio_dev); 442 + 443 + return adc->trigger_polarity; 444 + } 445 + 446 + static const char * const stm32_trig_pol_items[] = { 447 + "rising-edge", "falling-edge", "both-edges", 448 + }; 449 + 450 + const struct iio_enum stm32_adc_trig_pol = { 451 + .items = stm32_trig_pol_items, 452 + .num_items = ARRAY_SIZE(stm32_trig_pol_items), 453 + .get = stm32_adc_get_trig_pol, 454 + .set = stm32_adc_set_trig_pol, 455 + }; 428 456 429 457 /** 430 458 * stm32_adc_single_conv() - Performs a single conversion ··· 714 682 return IRQ_HANDLED; 715 683 } 716 684 685 + static const struct iio_chan_spec_ext_info stm32_adc_ext_info[] = { 686 + IIO_ENUM("trigger_polarity", IIO_SHARED_BY_ALL, &stm32_adc_trig_pol), 687 + { 688 + .name = "trigger_polarity_available", 689 + .shared = IIO_SHARED_BY_ALL, 690 + .read = iio_enum_available_read, 691 + .private = (uintptr_t)&stm32_adc_trig_pol, 692 + }, 693 + {}, 694 + }; 695 + 717 696 static void stm32_adc_chan_init_one(struct iio_dev *indio_dev, 718 697 struct iio_chan_spec *chan, 719 698 const struct stm32_adc_chan_spec *channel, ··· 740 697 chan->scan_type.sign = 'u'; 741 698 chan->scan_type.realbits = 12; 742 699 chan->scan_type.storagebits = 16; 700 + chan->ext_info = stm32_adc_ext_info; 743 701 } 744 702 745 703 static int stm32_adc_chan_of_init(struct iio_dev *indio_dev)