0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #include <linux/iio/timer/stm32-lptim-trigger.h>
0013 #include <linux/mfd/stm32-lptimer.h>
0014 #include <linux/mod_devicetable.h>
0015 #include <linux/module.h>
0016 #include <linux/platform_device.h>
0017 #include <linux/property.h>
0018
0019
0020 static const char * const stm32_lptim_triggers[] = {
0021 LPTIM1_OUT,
0022 LPTIM2_OUT,
0023 LPTIM3_OUT,
0024 };
0025
0026 struct stm32_lptim_trigger {
0027 struct device *dev;
0028 const char *trg;
0029 };
0030
0031 static int stm32_lptim_validate_device(struct iio_trigger *trig,
0032 struct iio_dev *indio_dev)
0033 {
0034 if (indio_dev->modes & INDIO_HARDWARE_TRIGGERED)
0035 return 0;
0036
0037 return -EINVAL;
0038 }
0039
0040 static const struct iio_trigger_ops stm32_lptim_trigger_ops = {
0041 .validate_device = stm32_lptim_validate_device,
0042 };
0043
0044
0045
0046
0047
0048
0049
0050
0051 bool is_stm32_lptim_trigger(struct iio_trigger *trig)
0052 {
0053 return (trig->ops == &stm32_lptim_trigger_ops);
0054 }
0055 EXPORT_SYMBOL(is_stm32_lptim_trigger);
0056
0057 static int stm32_lptim_setup_trig(struct stm32_lptim_trigger *priv)
0058 {
0059 struct iio_trigger *trig;
0060
0061 trig = devm_iio_trigger_alloc(priv->dev, "%s", priv->trg);
0062 if (!trig)
0063 return -ENOMEM;
0064
0065 trig->dev.parent = priv->dev->parent;
0066 trig->ops = &stm32_lptim_trigger_ops;
0067 iio_trigger_set_drvdata(trig, priv);
0068
0069 return devm_iio_trigger_register(priv->dev, trig);
0070 }
0071
0072 static int stm32_lptim_trigger_probe(struct platform_device *pdev)
0073 {
0074 struct stm32_lptim_trigger *priv;
0075 u32 index;
0076 int ret;
0077
0078 priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
0079 if (!priv)
0080 return -ENOMEM;
0081
0082 if (device_property_read_u32(&pdev->dev, "reg", &index))
0083 return -EINVAL;
0084
0085 if (index >= ARRAY_SIZE(stm32_lptim_triggers))
0086 return -EINVAL;
0087
0088 priv->dev = &pdev->dev;
0089 priv->trg = stm32_lptim_triggers[index];
0090
0091 ret = stm32_lptim_setup_trig(priv);
0092 if (ret)
0093 return ret;
0094
0095 platform_set_drvdata(pdev, priv);
0096
0097 return 0;
0098 }
0099
0100 static const struct of_device_id stm32_lptim_trig_of_match[] = {
0101 { .compatible = "st,stm32-lptimer-trigger", },
0102 {},
0103 };
0104 MODULE_DEVICE_TABLE(of, stm32_lptim_trig_of_match);
0105
0106 static struct platform_driver stm32_lptim_trigger_driver = {
0107 .probe = stm32_lptim_trigger_probe,
0108 .driver = {
0109 .name = "stm32-lptimer-trigger",
0110 .of_match_table = stm32_lptim_trig_of_match,
0111 },
0112 };
0113 module_platform_driver(stm32_lptim_trigger_driver);
0114
0115 MODULE_AUTHOR("Fabrice Gasnier <fabrice.gasnier@st.com>");
0116 MODULE_ALIAS("platform:stm32-lptimer-trigger");
0117 MODULE_DESCRIPTION("STMicroelectronics STM32 LPTIM trigger driver");
0118 MODULE_LICENSE("GPL v2");