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

iio: stm32 trigger: Add support for TRGO2 triggers

Add support for TRGO2 trigger that can be found on STM32F7.
Add additional master modes supported by TRGO2.
Register additional "tim[1/8]_trgo2" triggers for timer1 & timer8.
Detect TRGO2 timer capability (master mode selection 2).

Signed-off-by: Fabrice Gasnier <fabrice.gasnier@st.com>
Acked-by: Benjamin Gaignard <benjamin.gaignard@linaro.org>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>

authored by

Fabrice Gasnier and committed by
Jonathan Cameron
6fb34812 f80ac400

+151 -14
+48
Documentation/ABI/testing/sysfs-bus-iio-timer-stm32
··· 16 16 - "OC2REF" : OC2REF signal is used as trigger output. 17 17 - "OC3REF" : OC3REF signal is used as trigger output. 18 18 - "OC4REF" : OC4REF signal is used as trigger output. 19 + Additional modes (on TRGO2 only): 20 + - "OC5REF" : OC5REF signal is used as trigger output. 21 + - "OC6REF" : OC6REF signal is used as trigger output. 22 + - "compare_pulse_OC4REF": 23 + OC4REF rising or falling edges generate pulses. 24 + - "compare_pulse_OC6REF": 25 + OC6REF rising or falling edges generate pulses. 26 + - "compare_pulse_OC4REF_r_or_OC6REF_r": 27 + OC4REF or OC6REF rising edges generate pulses. 28 + - "compare_pulse_OC4REF_r_or_OC6REF_f": 29 + OC4REF rising or OC6REF falling edges generate pulses. 30 + - "compare_pulse_OC5REF_r_or_OC6REF_r": 31 + OC5REF or OC6REF rising edges generate pulses. 32 + - "compare_pulse_OC5REF_r_or_OC6REF_f": 33 + OC5REF rising or OC6REF falling edges generate pulses. 34 + 35 + +-----------+ +-------------+ +---------+ 36 + | Prescaler +-> | Counter | +-> | Master | TRGO(2) 37 + +-----------+ +--+--------+-+ |-> | Control +--> 38 + | | || +---------+ 39 + +--v--------+-+ OCxREF || +---------+ 40 + | Chx compare +----------> | Output | ChX 41 + +-----------+-+ | | Control +--> 42 + . | | +---------+ 43 + . | | . 44 + +-----------v-+ OC6REF | . 45 + | Ch6 compare +---------+> 46 + +-------------+ 47 + 48 + Example with: "compare_pulse_OC4REF_r_or_OC6REF_r": 49 + 50 + X 51 + X X 52 + X . . X 53 + X . . X 54 + X . . X 55 + count X . . . . X 56 + . . . . 57 + . . . . 58 + +---------------+ 59 + OC4REF | . . | 60 + +-+ . . +-+ 61 + . +---+ . 62 + OC6REF . | | . 63 + +-------+ +-------+ 64 + +-+ +-+ 65 + TRGO2 | | | | 66 + +-+ +---+ +---------+ 19 67 20 68 What: /sys/bus/iio/devices/triggerX/master_mode 21 69 KernelVersion: 4.11
+99 -14
drivers/iio/trigger/stm32-timer-trigger.c
··· 14 14 #include <linux/module.h> 15 15 #include <linux/platform_device.h> 16 16 17 - #define MAX_TRIGGERS 6 17 + #define MAX_TRIGGERS 7 18 18 #define MAX_VALIDS 5 19 19 20 20 /* List the triggers created by each timer */ 21 21 static const void *triggers_table[][MAX_TRIGGERS] = { 22 - { TIM1_TRGO, TIM1_CH1, TIM1_CH2, TIM1_CH3, TIM1_CH4,}, 22 + { TIM1_TRGO, TIM1_TRGO2, TIM1_CH1, TIM1_CH2, TIM1_CH3, TIM1_CH4,}, 23 23 { TIM2_TRGO, TIM2_CH1, TIM2_CH2, TIM2_CH3, TIM2_CH4,}, 24 24 { TIM3_TRGO, TIM3_CH1, TIM3_CH2, TIM3_CH3, TIM3_CH4,}, 25 25 { TIM4_TRGO, TIM4_CH1, TIM4_CH2, TIM4_CH3, TIM4_CH4,}, 26 26 { TIM5_TRGO, TIM5_CH1, TIM5_CH2, TIM5_CH3, TIM5_CH4,}, 27 27 { TIM6_TRGO,}, 28 28 { TIM7_TRGO,}, 29 - { TIM8_TRGO, TIM8_CH1, TIM8_CH2, TIM8_CH3, TIM8_CH4,}, 29 + { TIM8_TRGO, TIM8_TRGO2, TIM8_CH1, TIM8_CH2, TIM8_CH3, TIM8_CH4,}, 30 30 { TIM9_TRGO, TIM9_CH1, TIM9_CH2,}, 31 31 { }, /* timer 10 */ 32 32 { }, /* timer 11 */ ··· 56 56 u32 max_arr; 57 57 const void *triggers; 58 58 const void *valids; 59 + bool has_trgo2; 59 60 }; 60 61 62 + static bool stm32_timer_is_trgo2_name(const char *name) 63 + { 64 + return !!strstr(name, "trgo2"); 65 + } 66 + 61 67 static int stm32_timer_start(struct stm32_timer_trigger *priv, 68 + struct iio_trigger *trig, 62 69 unsigned int frequency) 63 70 { 64 71 unsigned long long prd, div; ··· 109 102 regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_ARPE, TIM_CR1_ARPE); 110 103 111 104 /* Force master mode to update mode */ 112 - regmap_update_bits(priv->regmap, TIM_CR2, TIM_CR2_MMS, 0x20); 105 + if (stm32_timer_is_trgo2_name(trig->name)) 106 + regmap_update_bits(priv->regmap, TIM_CR2, TIM_CR2_MMS2, 107 + 0x2 << TIM_CR2_MMS2_SHIFT); 108 + else 109 + regmap_update_bits(priv->regmap, TIM_CR2, TIM_CR2_MMS, 110 + 0x2 << TIM_CR2_MMS_SHIFT); 113 111 114 112 /* Make sure that registers are updated */ 115 113 regmap_update_bits(priv->regmap, TIM_EGR, TIM_EGR_UG, TIM_EGR_UG); ··· 162 150 if (freq == 0) { 163 151 stm32_timer_stop(priv); 164 152 } else { 165 - ret = stm32_timer_start(priv, freq); 153 + ret = stm32_timer_start(priv, trig, freq); 166 154 if (ret) 167 155 return ret; 168 156 } ··· 195 183 stm32_tt_read_frequency, 196 184 stm32_tt_store_frequency); 197 185 186 + #define MASTER_MODE_MAX 7 187 + #define MASTER_MODE2_MAX 15 188 + 198 189 static char *master_mode_table[] = { 199 190 "reset", 200 191 "enable", ··· 206 191 "OC1REF", 207 192 "OC2REF", 208 193 "OC3REF", 209 - "OC4REF" 194 + "OC4REF", 195 + /* Master mode selection 2 only */ 196 + "OC5REF", 197 + "OC6REF", 198 + "compare_pulse_OC4REF", 199 + "compare_pulse_OC6REF", 200 + "compare_pulse_OC4REF_r_or_OC6REF_r", 201 + "compare_pulse_OC4REF_r_or_OC6REF_f", 202 + "compare_pulse_OC5REF_r_or_OC6REF_r", 203 + "compare_pulse_OC5REF_r_or_OC6REF_f", 210 204 }; 211 205 212 206 static ssize_t stm32_tt_show_master_mode(struct device *dev, ··· 223 199 char *buf) 224 200 { 225 201 struct stm32_timer_trigger *priv = dev_get_drvdata(dev); 202 + struct iio_trigger *trig = to_iio_trigger(dev); 226 203 u32 cr2; 227 204 228 205 regmap_read(priv->regmap, TIM_CR2, &cr2); 229 - cr2 = (cr2 & TIM_CR2_MMS) >> TIM_CR2_MMS_SHIFT; 206 + 207 + if (stm32_timer_is_trgo2_name(trig->name)) 208 + cr2 = (cr2 & TIM_CR2_MMS2) >> TIM_CR2_MMS2_SHIFT; 209 + else 210 + cr2 = (cr2 & TIM_CR2_MMS) >> TIM_CR2_MMS_SHIFT; 230 211 231 212 return snprintf(buf, PAGE_SIZE, "%s\n", master_mode_table[cr2]); 232 213 } ··· 241 212 const char *buf, size_t len) 242 213 { 243 214 struct stm32_timer_trigger *priv = dev_get_drvdata(dev); 215 + struct iio_trigger *trig = to_iio_trigger(dev); 216 + u32 mask, shift, master_mode_max; 244 217 int i; 245 218 246 - for (i = 0; i < ARRAY_SIZE(master_mode_table); i++) { 219 + if (stm32_timer_is_trgo2_name(trig->name)) { 220 + mask = TIM_CR2_MMS2; 221 + shift = TIM_CR2_MMS2_SHIFT; 222 + master_mode_max = MASTER_MODE2_MAX; 223 + } else { 224 + mask = TIM_CR2_MMS; 225 + shift = TIM_CR2_MMS_SHIFT; 226 + master_mode_max = MASTER_MODE_MAX; 227 + } 228 + 229 + for (i = 0; i <= master_mode_max; i++) { 247 230 if (!strncmp(master_mode_table[i], buf, 248 231 strlen(master_mode_table[i]))) { 249 - regmap_update_bits(priv->regmap, TIM_CR2, 250 - TIM_CR2_MMS, i << TIM_CR2_MMS_SHIFT); 232 + regmap_update_bits(priv->regmap, TIM_CR2, mask, 233 + i << shift); 251 234 /* Make sure that registers are updated */ 252 235 regmap_update_bits(priv->regmap, TIM_EGR, 253 236 TIM_EGR_UG, TIM_EGR_UG); ··· 270 229 return -EINVAL; 271 230 } 272 231 273 - static IIO_CONST_ATTR(master_mode_available, 274 - "reset enable update compare_pulse OC1REF OC2REF OC3REF OC4REF"); 232 + static ssize_t stm32_tt_show_master_mode_avail(struct device *dev, 233 + struct device_attribute *attr, 234 + char *buf) 235 + { 236 + struct iio_trigger *trig = to_iio_trigger(dev); 237 + unsigned int i, master_mode_max; 238 + size_t len = 0; 239 + 240 + if (stm32_timer_is_trgo2_name(trig->name)) 241 + master_mode_max = MASTER_MODE2_MAX; 242 + else 243 + master_mode_max = MASTER_MODE_MAX; 244 + 245 + for (i = 0; i <= master_mode_max; i++) 246 + len += scnprintf(buf + len, PAGE_SIZE - len, 247 + "%s ", master_mode_table[i]); 248 + 249 + /* replace trailing space by newline */ 250 + buf[len - 1] = '\n'; 251 + 252 + return len; 253 + } 254 + 255 + static IIO_DEVICE_ATTR(master_mode_available, 0444, 256 + stm32_tt_show_master_mode_avail, NULL, 0); 275 257 276 258 static IIO_DEVICE_ATTR(master_mode, 0660, 277 259 stm32_tt_show_master_mode, ··· 304 240 static struct attribute *stm32_trigger_attrs[] = { 305 241 &iio_dev_attr_sampling_frequency.dev_attr.attr, 306 242 &iio_dev_attr_master_mode.dev_attr.attr, 307 - &iio_const_attr_master_mode_available.dev_attr.attr, 243 + &iio_dev_attr_master_mode_available.dev_attr.attr, 308 244 NULL, 309 245 }; 310 246 ··· 328 264 329 265 while (cur && *cur) { 330 266 struct iio_trigger *trig; 267 + bool cur_is_trgo2 = stm32_timer_is_trgo2_name(*cur); 268 + 269 + if (cur_is_trgo2 && !priv->has_trgo2) { 270 + cur++; 271 + continue; 272 + } 331 273 332 274 trig = devm_iio_trigger_alloc(priv->dev, "%s", *cur); 333 275 if (!trig) ··· 347 277 * should only be available on trgo trigger which 348 278 * is always the first in the list. 349 279 */ 350 - if (cur == priv->triggers) 280 + if (cur == priv->triggers || cur_is_trgo2) 351 281 trig->dev.groups = stm32_trigger_attr_groups; 352 282 353 283 iio_trigger_set_drvdata(trig, priv); ··· 654 584 } 655 585 EXPORT_SYMBOL(is_stm32_timer_trigger); 656 586 587 + static void stm32_timer_detect_trgo2(struct stm32_timer_trigger *priv) 588 + { 589 + u32 val; 590 + 591 + /* 592 + * Master mode selection 2 bits can only be written and read back when 593 + * timer supports it. 594 + */ 595 + regmap_update_bits(priv->regmap, TIM_CR2, TIM_CR2_MMS2, TIM_CR2_MMS2); 596 + regmap_read(priv->regmap, TIM_CR2, &val); 597 + regmap_update_bits(priv->regmap, TIM_CR2, TIM_CR2_MMS2, 0); 598 + priv->has_trgo2 = !!val; 599 + } 600 + 657 601 static int stm32_timer_trigger_probe(struct platform_device *pdev) 658 602 { 659 603 struct device *dev = &pdev->dev; ··· 698 614 priv->max_arr = ddata->max_arr; 699 615 priv->triggers = triggers_table[index]; 700 616 priv->valids = valids_table[index]; 617 + stm32_timer_detect_trgo2(priv); 701 618 702 619 ret = stm32_setup_iio_triggers(priv); 703 620 if (ret)
+2
include/linux/iio/timer/stm32-timer-trigger.h
··· 10 10 #define _STM32_TIMER_TRIGGER_H_ 11 11 12 12 #define TIM1_TRGO "tim1_trgo" 13 + #define TIM1_TRGO2 "tim1_trgo2" 13 14 #define TIM1_CH1 "tim1_ch1" 14 15 #define TIM1_CH2 "tim1_ch2" 15 16 #define TIM1_CH3 "tim1_ch3" ··· 45 44 #define TIM7_TRGO "tim7_trgo" 46 45 47 46 #define TIM8_TRGO "tim8_trgo" 47 + #define TIM8_TRGO2 "tim8_trgo2" 48 48 #define TIM8_CH1 "tim8_ch1" 49 49 #define TIM8_CH2 "tim8_ch2" 50 50 #define TIM8_CH3 "tim8_ch3"
+2
include/linux/mfd/stm32-timers.h
··· 34 34 #define TIM_CR1_DIR BIT(4) /* Counter Direction */ 35 35 #define TIM_CR1_ARPE BIT(7) /* Auto-reload Preload Ena */ 36 36 #define TIM_CR2_MMS (BIT(4) | BIT(5) | BIT(6)) /* Master mode selection */ 37 + #define TIM_CR2_MMS2 GENMASK(23, 20) /* Master mode selection 2 */ 37 38 #define TIM_SMCR_SMS (BIT(0) | BIT(1) | BIT(2)) /* Slave mode selection */ 38 39 #define TIM_SMCR_TS (BIT(4) | BIT(5) | BIT(6)) /* Trigger selection */ 39 40 #define TIM_DIER_UIE BIT(0) /* Update interrupt */ ··· 61 60 62 61 #define MAX_TIM_PSC 0xFFFF 63 62 #define TIM_CR2_MMS_SHIFT 4 63 + #define TIM_CR2_MMS2_SHIFT 20 64 64 #define TIM_SMCR_TS_SHIFT 4 65 65 #define TIM_BDTR_BKF_MASK 0xF 66 66 #define TIM_BDTR_BKF_SHIFT 16