Message ID | 20250314171451.3497789-4-fabrice.gasnier@foss.st.com (mailing list archive) |
---|---|
State | Handled Elsewhere |
Headers | show |
Series | Add STM32MP25 LPTIM support: MFD, PWM, IIO, counter, clocksource | expand |
On Fri, 14 Mar 2025 18:14:46 +0100 Fabrice Gasnier <fabrice.gasnier@foss.st.com> wrote: > From: Olivier Moysan <olivier.moysan@foss.st.com> > > 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> How do you want this to merge? If it's going through mfd because of dependencies, then Acked-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> I haven't checked if there are any dependencies so shout if I should pick this up directly for next cycle. Thanks, Jonathan > --- > Changes in v4: > - Jonathan's comment: simplify infrastructure by keeping > devm_iio_trigger_register. Don't need to cast compatible data. > --- > drivers/iio/trigger/stm32-lptimer-trigger.c | 75 ++++++++++++++----- > include/linux/iio/timer/stm32-lptim-trigger.h | 9 +++ > 2 files changed, 67 insertions(+), 17 deletions(-) > > diff --git a/drivers/iio/trigger/stm32-lptimer-trigger.c b/drivers/iio/trigger/stm32-lptimer-trigger.c > index f1e18913236a..3dcc8d2fe093 100644 > --- a/drivers/iio/trigger/stm32-lptimer-trigger.c > +++ b/drivers/iio/trigger/stm32-lptimer-trigger.c > @@ -16,16 +16,43 @@ > #include <linux/platform_device.h> > #include <linux/property.h> > > -/* List Low-Power Timer triggers */ > -static const char * const stm32_lptim_triggers[] = { > - LPTIM1_OUT, > - LPTIM2_OUT, > - LPTIM3_OUT, > +/* Maximum triggers + one trailing null entry to indicate the end of array */ > +#define MAX_TRIGGERS 3 > + > +struct stm32_lptim_cfg { > + const char * const (*triggers)[MAX_TRIGGERS]; > + unsigned int nb_triggers; > +}; > + > +/* List Low-Power Timer triggers for H7, MP13, MP15 */ > +static const char * const stm32_lptim_triggers[][MAX_TRIGGERS] = { > + { LPTIM1_OUT,}, > + { LPTIM2_OUT,}, > + { LPTIM3_OUT,}, > +}; > + > +/* List Low-Power Timer triggers for STM32MP25 */ > +static const char * const stm32mp25_lptim_triggers[][MAX_TRIGGERS] = { > + { LPTIM1_CH1, LPTIM1_CH2, }, > + { LPTIM2_CH1, LPTIM2_CH2, }, > + { LPTIM3_CH1,}, > + { LPTIM4_CH1,}, > + { LPTIM5_OUT,}, > +}; > + > +static const struct stm32_lptim_cfg stm32mp15_lptim_cfg = { > + .triggers = stm32_lptim_triggers, > + .nb_triggers = ARRAY_SIZE(stm32_lptim_triggers), > +}; > + > +static const struct stm32_lptim_cfg stm32mp25_lptim_cfg = { > + .triggers = stm32mp25_lptim_triggers, > + .nb_triggers = ARRAY_SIZE(stm32mp25_lptim_triggers), > }; > > struct stm32_lptim_trigger { > struct device *dev; > - const char *trg; > + const char * const *triggers; > }; > > static int stm32_lptim_validate_device(struct iio_trigger *trig, > @@ -56,22 +83,33 @@ EXPORT_SYMBOL(is_stm32_lptim_trigger); > > static int stm32_lptim_setup_trig(struct stm32_lptim_trigger *priv) > { > - struct iio_trigger *trig; > + const char * const *cur = priv->triggers; > + int ret; > > - trig = devm_iio_trigger_alloc(priv->dev, "%s", priv->trg); > - if (!trig) > - return -ENOMEM; > + while (cur && *cur) { > + struct iio_trigger *trig; > > - trig->dev.parent = priv->dev->parent; > - trig->ops = &stm32_lptim_trigger_ops; > - iio_trigger_set_drvdata(trig, priv); > + trig = devm_iio_trigger_alloc(priv->dev, "%s", *cur); > + if (!trig) > + return -ENOMEM; > > - return devm_iio_trigger_register(priv->dev, trig); > + trig->dev.parent = priv->dev->parent; > + trig->ops = &stm32_lptim_trigger_ops; > + iio_trigger_set_drvdata(trig, priv); > + > + ret = devm_iio_trigger_register(priv->dev, trig); > + if (ret) > + return ret; > + cur++; > + } > + > + return 0; > } > > static int stm32_lptim_trigger_probe(struct platform_device *pdev) > { > struct stm32_lptim_trigger *priv; > + struct stm32_lptim_cfg const *lptim_cfg; > u32 index; > > priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); > @@ -81,17 +119,20 @@ static int stm32_lptim_trigger_probe(struct platform_device *pdev) > if (device_property_read_u32(&pdev->dev, "reg", &index)) > return -EINVAL; > > - if (index >= ARRAY_SIZE(stm32_lptim_triggers)) > + lptim_cfg = device_get_match_data(&pdev->dev); > + > + if (index >= lptim_cfg->nb_triggers) > return -EINVAL; > > priv->dev = &pdev->dev; > - priv->trg = stm32_lptim_triggers[index]; > + priv->triggers = lptim_cfg->triggers[index]; > > return stm32_lptim_setup_trig(priv); > } > > static const struct of_device_id stm32_lptim_trig_of_match[] = { > - { .compatible = "st,stm32-lptimer-trigger", }, > + { .compatible = "st,stm32-lptimer-trigger", .data = &stm32mp15_lptim_cfg }, > + { .compatible = "st,stm32mp25-lptimer-trigger", .data = &stm32mp25_lptim_cfg}, > {}, > }; > MODULE_DEVICE_TABLE(of, stm32_lptim_trig_of_match); > diff --git a/include/linux/iio/timer/stm32-lptim-trigger.h b/include/linux/iio/timer/stm32-lptim-trigger.h > index a34dcf6a6001..ce3cf0addb2e 100644 > --- a/include/linux/iio/timer/stm32-lptim-trigger.h > +++ b/include/linux/iio/timer/stm32-lptim-trigger.h > @@ -14,6 +14,15 @@ > #define LPTIM1_OUT "lptim1_out" > #define LPTIM2_OUT "lptim2_out" > #define LPTIM3_OUT "lptim3_out" > +#define LPTIM4_OUT "lptim4_out" > +#define LPTIM5_OUT "lptim5_out" > + > +#define LPTIM1_CH1 "lptim1_ch1" > +#define LPTIM1_CH2 "lptim1_ch2" > +#define LPTIM2_CH1 "lptim2_ch1" > +#define LPTIM2_CH2 "lptim2_ch2" > +#define LPTIM3_CH1 "lptim3_ch1" > +#define LPTIM4_CH1 "lptim4_ch1" > > #if IS_REACHABLE(CONFIG_IIO_STM32_LPTIMER_TRIGGER) > bool is_stm32_lptim_trigger(struct iio_trigger *trig);
On 3/15/25 13:56, Jonathan Cameron wrote: > On Fri, 14 Mar 2025 18:14:46 +0100 > Fabrice Gasnier <fabrice.gasnier@foss.st.com> wrote: > >> From: Olivier Moysan <olivier.moysan@foss.st.com> >> >> 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> > > How do you want this to merge? If it's going through mfd because > of dependencies, then > Acked-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> > > I haven't checked if there are any dependencies so shout if I should > pick this up directly for next cycle. Hi Jonathan, Lee, There's no build dependency, but the dt-bindings that adds the compatible string. Perhaps Lee can pick it up along with the mfd bindings and driver ? I'm not sure what the most suitable option is. Best Regards, Fabrice > > Thanks, > > Jonathan > > >> --- >> Changes in v4: >> - Jonathan's comment: simplify infrastructure by keeping >> devm_iio_trigger_register. Don't need to cast compatible data. >> --- >> drivers/iio/trigger/stm32-lptimer-trigger.c | 75 ++++++++++++++----- >> include/linux/iio/timer/stm32-lptim-trigger.h | 9 +++ >> 2 files changed, 67 insertions(+), 17 deletions(-) >> >> diff --git a/drivers/iio/trigger/stm32-lptimer-trigger.c b/drivers/iio/trigger/stm32-lptimer-trigger.c >> index f1e18913236a..3dcc8d2fe093 100644 >> --- a/drivers/iio/trigger/stm32-lptimer-trigger.c >> +++ b/drivers/iio/trigger/stm32-lptimer-trigger.c >> @@ -16,16 +16,43 @@ >> #include <linux/platform_device.h> >> #include <linux/property.h> >> >> -/* List Low-Power Timer triggers */ >> -static const char * const stm32_lptim_triggers[] = { >> - LPTIM1_OUT, >> - LPTIM2_OUT, >> - LPTIM3_OUT, >> +/* Maximum triggers + one trailing null entry to indicate the end of array */ >> +#define MAX_TRIGGERS 3 >> + >> +struct stm32_lptim_cfg { >> + const char * const (*triggers)[MAX_TRIGGERS]; >> + unsigned int nb_triggers; >> +}; >> + >> +/* List Low-Power Timer triggers for H7, MP13, MP15 */ >> +static const char * const stm32_lptim_triggers[][MAX_TRIGGERS] = { >> + { LPTIM1_OUT,}, >> + { LPTIM2_OUT,}, >> + { LPTIM3_OUT,}, >> +}; >> + >> +/* List Low-Power Timer triggers for STM32MP25 */ >> +static const char * const stm32mp25_lptim_triggers[][MAX_TRIGGERS] = { >> + { LPTIM1_CH1, LPTIM1_CH2, }, >> + { LPTIM2_CH1, LPTIM2_CH2, }, >> + { LPTIM3_CH1,}, >> + { LPTIM4_CH1,}, >> + { LPTIM5_OUT,}, >> +}; >> + >> +static const struct stm32_lptim_cfg stm32mp15_lptim_cfg = { >> + .triggers = stm32_lptim_triggers, >> + .nb_triggers = ARRAY_SIZE(stm32_lptim_triggers), >> +}; >> + >> +static const struct stm32_lptim_cfg stm32mp25_lptim_cfg = { >> + .triggers = stm32mp25_lptim_triggers, >> + .nb_triggers = ARRAY_SIZE(stm32mp25_lptim_triggers), >> }; >> >> struct stm32_lptim_trigger { >> struct device *dev; >> - const char *trg; >> + const char * const *triggers; >> }; >> >> static int stm32_lptim_validate_device(struct iio_trigger *trig, >> @@ -56,22 +83,33 @@ EXPORT_SYMBOL(is_stm32_lptim_trigger); >> >> static int stm32_lptim_setup_trig(struct stm32_lptim_trigger *priv) >> { >> - struct iio_trigger *trig; >> + const char * const *cur = priv->triggers; >> + int ret; >> >> - trig = devm_iio_trigger_alloc(priv->dev, "%s", priv->trg); >> - if (!trig) >> - return -ENOMEM; >> + while (cur && *cur) { >> + struct iio_trigger *trig; >> >> - trig->dev.parent = priv->dev->parent; >> - trig->ops = &stm32_lptim_trigger_ops; >> - iio_trigger_set_drvdata(trig, priv); >> + trig = devm_iio_trigger_alloc(priv->dev, "%s", *cur); >> + if (!trig) >> + return -ENOMEM; >> >> - return devm_iio_trigger_register(priv->dev, trig); >> + trig->dev.parent = priv->dev->parent; >> + trig->ops = &stm32_lptim_trigger_ops; >> + iio_trigger_set_drvdata(trig, priv); >> + >> + ret = devm_iio_trigger_register(priv->dev, trig); >> + if (ret) >> + return ret; >> + cur++; >> + } >> + >> + return 0; >> } >> >> static int stm32_lptim_trigger_probe(struct platform_device *pdev) >> { >> struct stm32_lptim_trigger *priv; >> + struct stm32_lptim_cfg const *lptim_cfg; >> u32 index; >> >> priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); >> @@ -81,17 +119,20 @@ static int stm32_lptim_trigger_probe(struct platform_device *pdev) >> if (device_property_read_u32(&pdev->dev, "reg", &index)) >> return -EINVAL; >> >> - if (index >= ARRAY_SIZE(stm32_lptim_triggers)) >> + lptim_cfg = device_get_match_data(&pdev->dev); >> + >> + if (index >= lptim_cfg->nb_triggers) >> return -EINVAL; >> >> priv->dev = &pdev->dev; >> - priv->trg = stm32_lptim_triggers[index]; >> + priv->triggers = lptim_cfg->triggers[index]; >> >> return stm32_lptim_setup_trig(priv); >> } >> >> static const struct of_device_id stm32_lptim_trig_of_match[] = { >> - { .compatible = "st,stm32-lptimer-trigger", }, >> + { .compatible = "st,stm32-lptimer-trigger", .data = &stm32mp15_lptim_cfg }, >> + { .compatible = "st,stm32mp25-lptimer-trigger", .data = &stm32mp25_lptim_cfg}, >> {}, >> }; >> MODULE_DEVICE_TABLE(of, stm32_lptim_trig_of_match); >> diff --git a/include/linux/iio/timer/stm32-lptim-trigger.h b/include/linux/iio/timer/stm32-lptim-trigger.h >> index a34dcf6a6001..ce3cf0addb2e 100644 >> --- a/include/linux/iio/timer/stm32-lptim-trigger.h >> +++ b/include/linux/iio/timer/stm32-lptim-trigger.h >> @@ -14,6 +14,15 @@ >> #define LPTIM1_OUT "lptim1_out" >> #define LPTIM2_OUT "lptim2_out" >> #define LPTIM3_OUT "lptim3_out" >> +#define LPTIM4_OUT "lptim4_out" >> +#define LPTIM5_OUT "lptim5_out" >> + >> +#define LPTIM1_CH1 "lptim1_ch1" >> +#define LPTIM1_CH2 "lptim1_ch2" >> +#define LPTIM2_CH1 "lptim2_ch1" >> +#define LPTIM2_CH2 "lptim2_ch2" >> +#define LPTIM3_CH1 "lptim3_ch1" >> +#define LPTIM4_CH1 "lptim4_ch1" >> >> #if IS_REACHABLE(CONFIG_IIO_STM32_LPTIMER_TRIGGER) >> bool is_stm32_lptim_trigger(struct iio_trigger *trig); >
On Thu, 27 Mar 2025 17:36:00 +0100 Fabrice Gasnier <fabrice.gasnier@foss.st.com> wrote: > On 3/15/25 13:56, Jonathan Cameron wrote: > > On Fri, 14 Mar 2025 18:14:46 +0100 > > Fabrice Gasnier <fabrice.gasnier@foss.st.com> wrote: > > > >> From: Olivier Moysan <olivier.moysan@foss.st.com> > >> > >> 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> > > > > How do you want this to merge? If it's going through mfd because > > of dependencies, then > > Acked-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> > > > > I haven't checked if there are any dependencies so shout if I should > > pick this up directly for next cycle. > > Hi Jonathan, Lee, > > There's no build dependency, but the dt-bindings that adds the > compatible string. > > Perhaps Lee can pick it up along with the mfd bindings and driver ? > > I'm not sure what the most suitable option is. We don't normally worry if bindings and driver end up going through different trees. Applied this patch to the testing branch of iio.git. I'll rebase on rc1 once available and push out as normal togreg branch. Thanks, Jonathan > > Best Regards, > Fabrice > > > > Thanks, > > > > Jonathan > > > > > >> --- > >> Changes in v4: > >> - Jonathan's comment: simplify infrastructure by keeping > >> devm_iio_trigger_register. Don't need to cast compatible data. > >> --- > >> drivers/iio/trigger/stm32-lptimer-trigger.c | 75 ++++++++++++++----- > >> include/linux/iio/timer/stm32-lptim-trigger.h | 9 +++ > >> 2 files changed, 67 insertions(+), 17 deletions(-) > >> > >> diff --git a/drivers/iio/trigger/stm32-lptimer-trigger.c b/drivers/iio/trigger/stm32-lptimer-trigger.c > >> index f1e18913236a..3dcc8d2fe093 100644 > >> --- a/drivers/iio/trigger/stm32-lptimer-trigger.c > >> +++ b/drivers/iio/trigger/stm32-lptimer-trigger.c > >> @@ -16,16 +16,43 @@ > >> #include <linux/platform_device.h> > >> #include <linux/property.h> > >> > >> -/* List Low-Power Timer triggers */ > >> -static const char * const stm32_lptim_triggers[] = { > >> - LPTIM1_OUT, > >> - LPTIM2_OUT, > >> - LPTIM3_OUT, > >> +/* Maximum triggers + one trailing null entry to indicate the end of array */ > >> +#define MAX_TRIGGERS 3 > >> + > >> +struct stm32_lptim_cfg { > >> + const char * const (*triggers)[MAX_TRIGGERS]; > >> + unsigned int nb_triggers; > >> +}; > >> + > >> +/* List Low-Power Timer triggers for H7, MP13, MP15 */ > >> +static const char * const stm32_lptim_triggers[][MAX_TRIGGERS] = { > >> + { LPTIM1_OUT,}, > >> + { LPTIM2_OUT,}, > >> + { LPTIM3_OUT,}, > >> +}; > >> + > >> +/* List Low-Power Timer triggers for STM32MP25 */ > >> +static const char * const stm32mp25_lptim_triggers[][MAX_TRIGGERS] = { > >> + { LPTIM1_CH1, LPTIM1_CH2, }, > >> + { LPTIM2_CH1, LPTIM2_CH2, }, > >> + { LPTIM3_CH1,}, > >> + { LPTIM4_CH1,}, > >> + { LPTIM5_OUT,}, > >> +}; > >> + > >> +static const struct stm32_lptim_cfg stm32mp15_lptim_cfg = { > >> + .triggers = stm32_lptim_triggers, > >> + .nb_triggers = ARRAY_SIZE(stm32_lptim_triggers), > >> +}; > >> + > >> +static const struct stm32_lptim_cfg stm32mp25_lptim_cfg = { > >> + .triggers = stm32mp25_lptim_triggers, > >> + .nb_triggers = ARRAY_SIZE(stm32mp25_lptim_triggers), > >> }; > >> > >> struct stm32_lptim_trigger { > >> struct device *dev; > >> - const char *trg; > >> + const char * const *triggers; > >> }; > >> > >> static int stm32_lptim_validate_device(struct iio_trigger *trig, > >> @@ -56,22 +83,33 @@ EXPORT_SYMBOL(is_stm32_lptim_trigger); > >> > >> static int stm32_lptim_setup_trig(struct stm32_lptim_trigger *priv) > >> { > >> - struct iio_trigger *trig; > >> + const char * const *cur = priv->triggers; > >> + int ret; > >> > >> - trig = devm_iio_trigger_alloc(priv->dev, "%s", priv->trg); > >> - if (!trig) > >> - return -ENOMEM; > >> + while (cur && *cur) { > >> + struct iio_trigger *trig; > >> > >> - trig->dev.parent = priv->dev->parent; > >> - trig->ops = &stm32_lptim_trigger_ops; > >> - iio_trigger_set_drvdata(trig, priv); > >> + trig = devm_iio_trigger_alloc(priv->dev, "%s", *cur); > >> + if (!trig) > >> + return -ENOMEM; > >> > >> - return devm_iio_trigger_register(priv->dev, trig); > >> + trig->dev.parent = priv->dev->parent; > >> + trig->ops = &stm32_lptim_trigger_ops; > >> + iio_trigger_set_drvdata(trig, priv); > >> + > >> + ret = devm_iio_trigger_register(priv->dev, trig); > >> + if (ret) > >> + return ret; > >> + cur++; > >> + } > >> + > >> + return 0; > >> } > >> > >> static int stm32_lptim_trigger_probe(struct platform_device *pdev) > >> { > >> struct stm32_lptim_trigger *priv; > >> + struct stm32_lptim_cfg const *lptim_cfg; > >> u32 index; > >> > >> priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); > >> @@ -81,17 +119,20 @@ static int stm32_lptim_trigger_probe(struct platform_device *pdev) > >> if (device_property_read_u32(&pdev->dev, "reg", &index)) > >> return -EINVAL; > >> > >> - if (index >= ARRAY_SIZE(stm32_lptim_triggers)) > >> + lptim_cfg = device_get_match_data(&pdev->dev); > >> + > >> + if (index >= lptim_cfg->nb_triggers) > >> return -EINVAL; > >> > >> priv->dev = &pdev->dev; > >> - priv->trg = stm32_lptim_triggers[index]; > >> + priv->triggers = lptim_cfg->triggers[index]; > >> > >> return stm32_lptim_setup_trig(priv); > >> } > >> > >> static const struct of_device_id stm32_lptim_trig_of_match[] = { > >> - { .compatible = "st,stm32-lptimer-trigger", }, > >> + { .compatible = "st,stm32-lptimer-trigger", .data = &stm32mp15_lptim_cfg }, > >> + { .compatible = "st,stm32mp25-lptimer-trigger", .data = &stm32mp25_lptim_cfg}, > >> {}, > >> }; > >> MODULE_DEVICE_TABLE(of, stm32_lptim_trig_of_match); > >> diff --git a/include/linux/iio/timer/stm32-lptim-trigger.h b/include/linux/iio/timer/stm32-lptim-trigger.h > >> index a34dcf6a6001..ce3cf0addb2e 100644 > >> --- a/include/linux/iio/timer/stm32-lptim-trigger.h > >> +++ b/include/linux/iio/timer/stm32-lptim-trigger.h > >> @@ -14,6 +14,15 @@ > >> #define LPTIM1_OUT "lptim1_out" > >> #define LPTIM2_OUT "lptim2_out" > >> #define LPTIM3_OUT "lptim3_out" > >> +#define LPTIM4_OUT "lptim4_out" > >> +#define LPTIM5_OUT "lptim5_out" > >> + > >> +#define LPTIM1_CH1 "lptim1_ch1" > >> +#define LPTIM1_CH2 "lptim1_ch2" > >> +#define LPTIM2_CH1 "lptim2_ch1" > >> +#define LPTIM2_CH2 "lptim2_ch2" > >> +#define LPTIM3_CH1 "lptim3_ch1" > >> +#define LPTIM4_CH1 "lptim4_ch1" > >> > >> #if IS_REACHABLE(CONFIG_IIO_STM32_LPTIMER_TRIGGER) > >> bool is_stm32_lptim_trigger(struct iio_trigger *trig); > >
diff --git a/drivers/iio/trigger/stm32-lptimer-trigger.c b/drivers/iio/trigger/stm32-lptimer-trigger.c index f1e18913236a..3dcc8d2fe093 100644 --- a/drivers/iio/trigger/stm32-lptimer-trigger.c +++ b/drivers/iio/trigger/stm32-lptimer-trigger.c @@ -16,16 +16,43 @@ #include <linux/platform_device.h> #include <linux/property.h> -/* List Low-Power Timer triggers */ -static const char * const stm32_lptim_triggers[] = { - LPTIM1_OUT, - LPTIM2_OUT, - LPTIM3_OUT, +/* Maximum triggers + one trailing null entry to indicate the end of array */ +#define MAX_TRIGGERS 3 + +struct stm32_lptim_cfg { + const char * const (*triggers)[MAX_TRIGGERS]; + unsigned int nb_triggers; +}; + +/* List Low-Power Timer triggers for H7, MP13, MP15 */ +static const char * const stm32_lptim_triggers[][MAX_TRIGGERS] = { + { LPTIM1_OUT,}, + { LPTIM2_OUT,}, + { LPTIM3_OUT,}, +}; + +/* List Low-Power Timer triggers for STM32MP25 */ +static const char * const stm32mp25_lptim_triggers[][MAX_TRIGGERS] = { + { LPTIM1_CH1, LPTIM1_CH2, }, + { LPTIM2_CH1, LPTIM2_CH2, }, + { LPTIM3_CH1,}, + { LPTIM4_CH1,}, + { LPTIM5_OUT,}, +}; + +static const struct stm32_lptim_cfg stm32mp15_lptim_cfg = { + .triggers = stm32_lptim_triggers, + .nb_triggers = ARRAY_SIZE(stm32_lptim_triggers), +}; + +static const struct stm32_lptim_cfg stm32mp25_lptim_cfg = { + .triggers = stm32mp25_lptim_triggers, + .nb_triggers = ARRAY_SIZE(stm32mp25_lptim_triggers), }; struct stm32_lptim_trigger { struct device *dev; - const char *trg; + const char * const *triggers; }; static int stm32_lptim_validate_device(struct iio_trigger *trig, @@ -56,22 +83,33 @@ EXPORT_SYMBOL(is_stm32_lptim_trigger); static int stm32_lptim_setup_trig(struct stm32_lptim_trigger *priv) { - struct iio_trigger *trig; + const char * const *cur = priv->triggers; + int ret; - trig = devm_iio_trigger_alloc(priv->dev, "%s", priv->trg); - if (!trig) - return -ENOMEM; + while (cur && *cur) { + struct iio_trigger *trig; - trig->dev.parent = priv->dev->parent; - trig->ops = &stm32_lptim_trigger_ops; - iio_trigger_set_drvdata(trig, priv); + trig = devm_iio_trigger_alloc(priv->dev, "%s", *cur); + if (!trig) + return -ENOMEM; - return devm_iio_trigger_register(priv->dev, trig); + trig->dev.parent = priv->dev->parent; + trig->ops = &stm32_lptim_trigger_ops; + iio_trigger_set_drvdata(trig, priv); + + ret = devm_iio_trigger_register(priv->dev, trig); + if (ret) + return ret; + cur++; + } + + return 0; } static int stm32_lptim_trigger_probe(struct platform_device *pdev) { struct stm32_lptim_trigger *priv; + struct stm32_lptim_cfg const *lptim_cfg; u32 index; priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); @@ -81,17 +119,20 @@ static int stm32_lptim_trigger_probe(struct platform_device *pdev) if (device_property_read_u32(&pdev->dev, "reg", &index)) return -EINVAL; - if (index >= ARRAY_SIZE(stm32_lptim_triggers)) + lptim_cfg = device_get_match_data(&pdev->dev); + + if (index >= lptim_cfg->nb_triggers) return -EINVAL; priv->dev = &pdev->dev; - priv->trg = stm32_lptim_triggers[index]; + priv->triggers = lptim_cfg->triggers[index]; return stm32_lptim_setup_trig(priv); } static const struct of_device_id stm32_lptim_trig_of_match[] = { - { .compatible = "st,stm32-lptimer-trigger", }, + { .compatible = "st,stm32-lptimer-trigger", .data = &stm32mp15_lptim_cfg }, + { .compatible = "st,stm32mp25-lptimer-trigger", .data = &stm32mp25_lptim_cfg}, {}, }; MODULE_DEVICE_TABLE(of, stm32_lptim_trig_of_match); diff --git a/include/linux/iio/timer/stm32-lptim-trigger.h b/include/linux/iio/timer/stm32-lptim-trigger.h index a34dcf6a6001..ce3cf0addb2e 100644 --- a/include/linux/iio/timer/stm32-lptim-trigger.h +++ b/include/linux/iio/timer/stm32-lptim-trigger.h @@ -14,6 +14,15 @@ #define LPTIM1_OUT "lptim1_out" #define LPTIM2_OUT "lptim2_out" #define LPTIM3_OUT "lptim3_out" +#define LPTIM4_OUT "lptim4_out" +#define LPTIM5_OUT "lptim5_out" + +#define LPTIM1_CH1 "lptim1_ch1" +#define LPTIM1_CH2 "lptim1_ch2" +#define LPTIM2_CH1 "lptim2_ch1" +#define LPTIM2_CH2 "lptim2_ch2" +#define LPTIM3_CH1 "lptim3_ch1" +#define LPTIM4_CH1 "lptim4_ch1" #if IS_REACHABLE(CONFIG_IIO_STM32_LPTIMER_TRIGGER) bool is_stm32_lptim_trigger(struct iio_trigger *trig);