static int stm32_lptim_write_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int val, int val2, long mask) { struct stm32_lptim_cnt *priv = iio_priv(indio_dev); int ret; switch (mask) { case IIO_CHAN_INFO_ENABLE: if (val < 0 || val > 1) return -EINVAL; /* Check nobody uses the timer, or already disabled/enabled */ ret = stm32_lptim_is_enabled(priv); if ((ret < 0) || (!ret && !val)) return ret; if (val && ret) return -EBUSY; ret = stm32_lptim_setup(priv, val); if (ret) return ret; return stm32_lptim_set_enable_state(priv, val); default: return -EINVAL; } }
static int stm32_lptim_cnt_set_polarity(struct iio_dev *indio_dev, const struct iio_chan_spec *chan, unsigned int type) { struct stm32_lptim_cnt *priv = iio_priv(indio_dev); if (stm32_lptim_is_enabled(priv)) return -EBUSY; priv->polarity = type; return 0; }
static int stm32_lptim_set_quadrature_mode(struct iio_dev *indio_dev, const struct iio_chan_spec *chan, unsigned int type) { struct stm32_lptim_cnt *priv = iio_priv(indio_dev); if (stm32_lptim_is_enabled(priv)) return -EBUSY; priv->quadrature_mode = type; return 0; }
static ssize_t stm32_lptim_cnt_set_ceiling(struct stm32_lptim_cnt *priv, const char *buf, size_t len) { int ret; if (stm32_lptim_is_enabled(priv)) return -EBUSY; ret = kstrtouint(buf, 0, &priv->ceiling); if (ret) return ret; if (priv->ceiling > STM32_LPTIM_MAX_ARR) return -EINVAL; return len; }
static int stm32_lptim_read_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int *val, int *val2, long mask) { struct stm32_lptim_cnt *priv = iio_priv(indio_dev); u32 dat; int ret; switch (mask) { case IIO_CHAN_INFO_RAW: ret = regmap_read(priv->regmap, STM32_LPTIM_CNT, &dat); if (ret) return ret; *val = dat; return IIO_VAL_INT; case IIO_CHAN_INFO_ENABLE: ret = stm32_lptim_is_enabled(priv); if (ret < 0) return ret; *val = ret; return IIO_VAL_INT; case IIO_CHAN_INFO_SCALE: /* Non-quadrature mode: scale = 1 */ *val = 1; *val2 = 0; if (priv->quadrature_mode) { /* * Quadrature encoder mode: * - both edges, quarter cycle, scale is 0.25 * - either rising/falling edge scale is 0.5 */ if (priv->polarity > 1) *val2 = 2; else *val2 = 1; } return IIO_VAL_FRACTIONAL_LOG2; default: return -EINVAL; } }