Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /*
0003  * STM32 Low-Power Timer Trigger driver
0004  *
0005  * Copyright (C) STMicroelectronics 2017
0006  *
0007  * Author: Fabrice Gasnier <fabrice.gasnier@st.com>.
0008  *
0009  * Inspired by Benjamin Gaignard's stm32-timer-trigger driver
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 /* List Low-Power Timer triggers */
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  * is_stm32_lptim_trigger
0046  * @trig: trigger to be checked
0047  *
0048  * return true if the trigger is a valid STM32 IIO Low-Power Timer Trigger
0049  * either return false
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");