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

iio: trigger: stm32-lptimer: add support for stm32mp25

Add support for STM32MP25 SoC. Use newly introduced compatible to handle
this new HW variant. Add new trigger definitions that can be used by the
stm32 analog-to-digital converter. Use compatible data to identify them.

Signed-off-by: Olivier Moysan <olivier.moysan@foss.st.com>
Signed-off-by: Fabrice Gasnier <fabrice.gasnier@foss.st.com>
Link: https://patch.msgid.link/20250314171451.3497789-4-fabrice.gasnier@foss.st.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>

authored by

Olivier Moysan and committed by
Jonathan Cameron
cfed1969 0d0f3bfb

+67 -17
+58 -17
drivers/iio/trigger/stm32-lptimer-trigger.c
··· 16 16 #include <linux/platform_device.h> 17 17 #include <linux/property.h> 18 18 19 - /* List Low-Power Timer triggers */ 20 - static const char * const stm32_lptim_triggers[] = { 21 - LPTIM1_OUT, 22 - LPTIM2_OUT, 23 - LPTIM3_OUT, 19 + /* Maximum triggers + one trailing null entry to indicate the end of array */ 20 + #define MAX_TRIGGERS 3 21 + 22 + struct stm32_lptim_cfg { 23 + const char * const (*triggers)[MAX_TRIGGERS]; 24 + unsigned int nb_triggers; 25 + }; 26 + 27 + /* List Low-Power Timer triggers for H7, MP13, MP15 */ 28 + static const char * const stm32_lptim_triggers[][MAX_TRIGGERS] = { 29 + { LPTIM1_OUT,}, 30 + { LPTIM2_OUT,}, 31 + { LPTIM3_OUT,}, 32 + }; 33 + 34 + /* List Low-Power Timer triggers for STM32MP25 */ 35 + static const char * const stm32mp25_lptim_triggers[][MAX_TRIGGERS] = { 36 + { LPTIM1_CH1, LPTIM1_CH2, }, 37 + { LPTIM2_CH1, LPTIM2_CH2, }, 38 + { LPTIM3_CH1,}, 39 + { LPTIM4_CH1,}, 40 + { LPTIM5_OUT,}, 41 + }; 42 + 43 + static const struct stm32_lptim_cfg stm32mp15_lptim_cfg = { 44 + .triggers = stm32_lptim_triggers, 45 + .nb_triggers = ARRAY_SIZE(stm32_lptim_triggers), 46 + }; 47 + 48 + static const struct stm32_lptim_cfg stm32mp25_lptim_cfg = { 49 + .triggers = stm32mp25_lptim_triggers, 50 + .nb_triggers = ARRAY_SIZE(stm32mp25_lptim_triggers), 24 51 }; 25 52 26 53 struct stm32_lptim_trigger { 27 54 struct device *dev; 28 - const char *trg; 55 + const char * const *triggers; 29 56 }; 30 57 31 58 static int stm32_lptim_validate_device(struct iio_trigger *trig, ··· 83 56 84 57 static int stm32_lptim_setup_trig(struct stm32_lptim_trigger *priv) 85 58 { 86 - struct iio_trigger *trig; 59 + const char * const *cur = priv->triggers; 60 + int ret; 87 61 88 - trig = devm_iio_trigger_alloc(priv->dev, "%s", priv->trg); 89 - if (!trig) 90 - return -ENOMEM; 62 + while (cur && *cur) { 63 + struct iio_trigger *trig; 91 64 92 - trig->dev.parent = priv->dev->parent; 93 - trig->ops = &stm32_lptim_trigger_ops; 94 - iio_trigger_set_drvdata(trig, priv); 65 + trig = devm_iio_trigger_alloc(priv->dev, "%s", *cur); 66 + if (!trig) 67 + return -ENOMEM; 95 68 96 - return devm_iio_trigger_register(priv->dev, trig); 69 + trig->dev.parent = priv->dev->parent; 70 + trig->ops = &stm32_lptim_trigger_ops; 71 + iio_trigger_set_drvdata(trig, priv); 72 + 73 + ret = devm_iio_trigger_register(priv->dev, trig); 74 + if (ret) 75 + return ret; 76 + cur++; 77 + } 78 + 79 + return 0; 97 80 } 98 81 99 82 static int stm32_lptim_trigger_probe(struct platform_device *pdev) 100 83 { 101 84 struct stm32_lptim_trigger *priv; 85 + struct stm32_lptim_cfg const *lptim_cfg; 102 86 u32 index; 103 87 104 88 priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); ··· 119 81 if (device_property_read_u32(&pdev->dev, "reg", &index)) 120 82 return -EINVAL; 121 83 122 - if (index >= ARRAY_SIZE(stm32_lptim_triggers)) 84 + lptim_cfg = device_get_match_data(&pdev->dev); 85 + 86 + if (index >= lptim_cfg->nb_triggers) 123 87 return -EINVAL; 124 88 125 89 priv->dev = &pdev->dev; 126 - priv->trg = stm32_lptim_triggers[index]; 90 + priv->triggers = lptim_cfg->triggers[index]; 127 91 128 92 return stm32_lptim_setup_trig(priv); 129 93 } 130 94 131 95 static const struct of_device_id stm32_lptim_trig_of_match[] = { 132 - { .compatible = "st,stm32-lptimer-trigger", }, 96 + { .compatible = "st,stm32-lptimer-trigger", .data = &stm32mp15_lptim_cfg }, 97 + { .compatible = "st,stm32mp25-lptimer-trigger", .data = &stm32mp25_lptim_cfg}, 133 98 {}, 134 99 }; 135 100 MODULE_DEVICE_TABLE(of, stm32_lptim_trig_of_match);
+9
include/linux/iio/timer/stm32-lptim-trigger.h
··· 14 14 #define LPTIM1_OUT "lptim1_out" 15 15 #define LPTIM2_OUT "lptim2_out" 16 16 #define LPTIM3_OUT "lptim3_out" 17 + #define LPTIM4_OUT "lptim4_out" 18 + #define LPTIM5_OUT "lptim5_out" 19 + 20 + #define LPTIM1_CH1 "lptim1_ch1" 21 + #define LPTIM1_CH2 "lptim1_ch2" 22 + #define LPTIM2_CH1 "lptim2_ch1" 23 + #define LPTIM2_CH2 "lptim2_ch2" 24 + #define LPTIM3_CH1 "lptim3_ch1" 25 + #define LPTIM4_CH1 "lptim4_ch1" 17 26 18 27 #if IS_REACHABLE(CONFIG_IIO_STM32_LPTIMER_TRIGGER) 19 28 bool is_stm32_lptim_trigger(struct iio_trigger *trig);