From: Jonathan Cameron <jic23@kernel.org>
To: Tiberiu Breana <tiberiu.a.breana@intel.com>, linux-iio@vger.kernel.org
Subject: Re: [PATCH v5 2/2] iio: accel: Add sampling rate support for STK8312
Date: Sun, 05 Jul 2015 14:44:46 +0100 [thread overview]
Message-ID: <559934CE.3070109@kernel.org> (raw)
In-Reply-To: <1435154509-16865-2-git-send-email-tiberiu.a.breana@intel.com>
On 24/06/15 15:01, Tiberiu Breana wrote:
> Added support for setting the STK8312 accelerometer's
> sampling rate.
>
> Signed-off-by: Tiberiu Breana <tiberiu.a.breana@intel.com>
Applied
> ---
> v5: no new changes
> v4: no new changes
> v3: no new changes
> v2: replaced stk8312_samp_freq_table with a struct for better readability
> ---
> drivers/iio/accel/stk8312.c | 96 ++++++++++++++++++++++++++++++++++++++-------
> 1 file changed, 82 insertions(+), 14 deletions(-)
>
> diff --git a/drivers/iio/accel/stk8312.c b/drivers/iio/accel/stk8312.c
> index be58d66..c2bd144 100644
> --- a/drivers/iio/accel/stk8312.c
> +++ b/drivers/iio/accel/stk8312.c
> @@ -29,6 +29,7 @@
> #define STK8312_REG_ZOUT 0x02
> #define STK8312_REG_INTSU 0x06
> #define STK8312_REG_MODE 0x07
> +#define STK8312_REG_SR 0x08
> #define STK8312_REG_STH 0x13
> #define STK8312_REG_RESET 0x20
> #define STK8312_REG_AFECTRL 0x24
> @@ -41,6 +42,8 @@
> #define STK8312_DREADY_BIT 0x10
> #define STK8312_INT_MODE 0xC0
> #define STK8312_RNG_MASK 0xC0
> +#define STK8312_SR_MASK 0x07
> +#define STK8312_SR_400HZ_IDX 0
> #define STK8312_RNG_SHIFT 6
> #define STK8312_READ_RETRIES 16
> #define STK8312_ALL_CHANNEL_MASK 7
> @@ -65,20 +68,29 @@ static const int stk8312_scale_table[][2] = {
> {0, 461600}, {1, 231100}
> };
>
> -#define STK8312_ACCEL_CHANNEL(index, reg, axis) { \
> - .type = IIO_ACCEL, \
> - .address = reg, \
> - .modified = 1, \
> - .channel2 = IIO_MOD_##axis, \
> - .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
> - .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \
> - .scan_index = index, \
> - .scan_type = { \
> - .sign = 's', \
> - .realbits = 8, \
> - .storagebits = 8, \
> - .endianness = IIO_CPU, \
> - }, \
> +static const struct {
> + u16 val;
> + u32 val2;
> +} stk8312_samp_freq_table[] = {
> + {400, 0}, {200, 0}, {100, 0}, {50, 0}, {25, 0},
> + {12, 500000}, {6, 250000}, {3, 125000}
> +};
> +
> +#define STK8312_ACCEL_CHANNEL(index, reg, axis) { \
> + .type = IIO_ACCEL, \
> + .address = reg, \
> + .modified = 1, \
> + .channel2 = IIO_MOD_##axis, \
> + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
> + .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \
> + BIT(IIO_CHAN_INFO_SAMP_FREQ), \
> + .scan_index = index, \
> + .scan_type = { \
> + .sign = 's', \
> + .realbits = 8, \
> + .storagebits = 8, \
> + .endianness = IIO_CPU, \
> + }, \
> }
>
> static const struct iio_chan_spec stk8312_channels[] = {
> @@ -92,6 +104,7 @@ struct stk8312_data {
> struct i2c_client *client;
> struct mutex lock;
> int range;
> + u8 sample_rate_idx;
> u8 mode;
> struct iio_trigger *dready_trig;
> bool dready_trigger_on;
> @@ -100,8 +113,11 @@ struct stk8312_data {
>
> static IIO_CONST_ATTR(in_accel_scale_available, STK8312_SCALE_AVAIL);
>
> +static IIO_CONST_ATTR_SAMP_FREQ_AVAIL("3.125 6.25 12.5 25 50 100 200 400");
> +
> static struct attribute *stk8312_attributes[] = {
> &iio_const_attr_in_accel_scale_available.dev_attr.attr,
> + &iio_const_attr_sampling_frequency_available.dev_attr.attr,
> NULL,
> };
>
> @@ -220,6 +236,39 @@ static const struct iio_trigger_ops stk8312_trigger_ops = {
> .owner = THIS_MODULE,
> };
>
> +static int stk8312_set_sample_rate(struct stk8312_data *data, int rate)
> +{
> + int ret;
> + u8 masked_reg;
> + u8 mode;
> + struct i2c_client *client = data->client;
> +
> + if (rate == data->sample_rate_idx)
> + return 0;
> +
> + mode = data->mode;
> + /* We need to go in standby mode to modify registers */
> + ret = stk8312_set_mode(data, STK8312_MODE_STANDBY);
> + if (ret < 0)
> + return ret;
> +
> + ret = i2c_smbus_read_byte_data(client, STK8312_REG_SR);
> + if (ret < 0) {
> + dev_err(&client->dev, "failed to set sampling rate\n");
> + return ret;
> + }
> +
> + masked_reg = (ret & (~STK8312_SR_MASK)) | rate;
> +
> + ret = i2c_smbus_write_byte_data(client, STK8312_REG_SR, masked_reg);
> + if (ret < 0)
> + dev_err(&client->dev, "failed to set sampling rate\n");
> + else
> + data->sample_rate_idx = rate;
> +
> + return stk8312_set_mode(data, mode);
> +}
> +
> static int stk8312_set_range(struct stk8312_data *data, u8 range)
> {
> int ret;
> @@ -303,6 +352,10 @@ static int stk8312_read_raw(struct iio_dev *indio_dev,
> *val = stk8312_scale_table[data->range - 1][0];
> *val2 = stk8312_scale_table[data->range - 1][1];
> return IIO_VAL_INT_PLUS_MICRO;
> + case IIO_CHAN_INFO_SAMP_FREQ:
> + *val = stk8312_samp_freq_table[data->sample_rate_idx].val;
> + *val2 = stk8312_samp_freq_table[data->sample_rate_idx].val2;
> + return IIO_VAL_INT_PLUS_MICRO;
> }
>
> return -EINVAL;
> @@ -333,6 +386,20 @@ static int stk8312_write_raw(struct iio_dev *indio_dev,
> mutex_unlock(&data->lock);
>
> return ret;
> + case IIO_CHAN_INFO_SAMP_FREQ:
> + for (i = 0; i < ARRAY_SIZE(stk8312_samp_freq_table); i++)
> + if (val == stk8312_samp_freq_table[i].val &&
> + val2 == stk8312_samp_freq_table[i].val2) {
> + index = i;
> + break;
> + }
> + if (index < 0)
> + return -EINVAL;
> + mutex_lock(&data->lock);
> + ret = stk8312_set_sample_rate(data, index);
> + mutex_unlock(&data->lock);
> +
> + return ret;
> }
>
> return -EINVAL;
> @@ -479,6 +546,7 @@ static int stk8312_probe(struct i2c_client *client,
> dev_err(&client->dev, "failed to reset sensor\n");
> return ret;
> }
> + data->sample_rate_idx = STK8312_SR_400HZ_IDX;
> ret = stk8312_set_range(data, 1);
> if (ret < 0)
> return ret;
>
next prev parent reply other threads:[~2015-07-05 13:44 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-06-24 14:01 [PATCH v5 1/2] iio: accel: Add buffer mode for Sensortek STK8312 Tiberiu Breana
2015-06-24 14:01 ` [PATCH v5 2/2] iio: accel: Add sampling rate support for STK8312 Tiberiu Breana
2015-07-05 13:44 ` Jonathan Cameron [this message]
2015-07-05 13:44 ` [PATCH v5 1/2] iio: accel: Add buffer mode for Sensortek STK8312 Jonathan Cameron
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=559934CE.3070109@kernel.org \
--to=jic23@kernel.org \
--cc=linux-iio@vger.kernel.org \
--cc=tiberiu.a.breana@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.