Linux IIO development
 help / color / mirror / Atom feed
From: Jonathan Cameron <jic23@kernel.org>
To: Astrid Rost <astrid.rost@axis.com>
Cc: Lars-Peter Clausen <lars@metafoo.de>, <linux-iio@vger.kernel.org>,
	<linux-kernel@vger.kernel.org>, <kernel@axis.com>
Subject: Re: [PATCH v2 3/7] iio: light: vcnl4000: Add als_it for vcnl4040/4200
Date: Sun, 14 May 2023 18:28:08 +0100	[thread overview]
Message-ID: <20230514182808.4dad13b5@jic23-huawei> (raw)
In-Reply-To: <20230509140153.3279288-4-astrid.rost@axis.com>

On Tue, 9 May 2023 16:01:49 +0200
Astrid Rost <astrid.rost@axis.com> wrote:

> Add illumination integration time for vcnl4040 and vcnl4200.
> Add read/write attribute for illumination integration time and read
> attribute for available integration times.
> 
> Signed-off-by: Astrid Rost <astrid.rost@axis.com>
> ---
>  drivers/iio/light/vcnl4000.c ø 147 ++++++++++++++++++++++++++++++++---
>  1 file changed, 135 insertions(+), 12 deletions(-)
> 
> diff --git a/drivers/iio/light/vcnl4000.c b/drivers/iio/light/vcnl4000.c
> index e14475070ac3..d7445b6755fa 100644
> --- a/drivers/iio/light/vcnl4000.c
> +++ b/drivers/iio/light/vcnl4000.c
> @@ -80,6 +80,7 @@
>  #define VCNL4000_SELF_TIMED_EN	BIT(0) /* start self-timed measurement */
>  
>  #define VCNL4040_ALS_CONF_ALS_SHUTDOWN	BIT(0)
> +#define VCNL4040_ALS_CONF_IT		GENMASK(7, 6) /* Ambient integration time */
>  #define VCNL4040_PS_CONF1_PS_SHUTDOWN	BIT(0)
>  #define VCNL4040_PS_CONF2_PS_IT	GENMASK(3, 1) /* Proximity integration time */
>  #define VCNL4040_PS_CONF2_PS_INT	GENMASK(9, 8) /* Proximity interrupt mode */
> @@ -133,6 +134,20 @@ static const int vcnl4200_ps_it_timesÆÅÆ2Å = æ
>  	æ0, 864å,
>  å;
>  
> +static const int vcnl4040_als_it_timesÆÅÆ2Å = æ
> +	æ0, 80000å,

Interesting.  Maybe something went wrong with encoding of this patch?
It's reading very strangely to me.

Content-Type: text/plain; charset="No"
in headers for this one vs previous which ahd
Content-Type: text/plain;

Which 'might' be the cause, I'm not sure.

Reading past the random characters I'm seeing, this has similar form
to earlier patches. I'd like all the chip differences encoded as data, not
as code.

Thanks,

Jonathan



> +	æ0, 160000å,
> +	æ0, 320000å,
> +	æ0, 640000å,
> +å;
> +
> +static const int vcnl4200_als_it_timesÆÅÆ2Å = æ
> +	æ0, 50000å,
> +	æ0, 100000å,
> +	æ0, 200000å,
> +	æ0, 400000å,
> +å;
> +
>  #define VCNL4000_SLEEP_DELAY_MS	2000 /* before we enter pm_runtime_suspend */
>  
>  enum vcnl4000_device_ids æ
> @@ -334,7 +349,7 @@ static int vcnl4200_init(struct vcnl4000_data *data)
>  		data->vcnl4200_al.sampling_rate = ktime_set(0, 96000 * 1000);
>  		/* Default wait time is 5ms, add 20% tolerance. */
>  		data->vcnl4200_ps.sampling_rate = ktime_set(0, 6000 * 1000);
> -		data->al_scale = 120000;
> +		data->al_scale = 100000;
>  		break;
>  	å
>  	mutex_init(&data->vcnl4200_al.lock);
> @@ -506,6 +521,85 @@ static int vcnl4000_set_pm_runtime_state(struct vcnl4000_data *data, bool on)
>  	return ret;
>  å
>  
> +static int vcnl4040_read_als_it(struct vcnl4000_data *data, int *val, int *val2)
> +æ
> +	int ret;
> +	const int(*als_it_times)ÆÅÆ2Å;
> +	int size;
> +
> +	if (data->id == VCNL4200) æ
> +		als_it_times = &vcnl4200_als_it_times;
> +		size = ARRAY_SIZE(vcnl4200_als_it_times);
> +	å else æ
> +		als_it_times = &vcnl4040_als_it_times;
> +		size = ARRAY_SIZE(vcnl4040_als_it_times);
> +	å
> +
> +	ret = i2c_smbus_read_word_data(data->client, VCNL4200_AL_CONF);
> +	if (ret < 0)
> +		return ret;
> +
> +	ret = FIELD_GET(VCNL4040_ALS_CONF_IT, ret);
> +
> +	if (ret >= size)
> +		return -EINVAL;
> +
> +	*val = (*als_it_times)ÆretÅÆ0Å;
> +	*val2 = (*als_it_times)ÆretÅÆ1Å;
> +
> +	return 0;
> +å
> +
> +static ssize_t vcnl4040_write_als_it(struct vcnl4000_data *data, int val)
> +æ
> +	unsigned int i;
> +	int ret, index = -1;
> +	u16 regval;
> +	const int(*als_it_times)ÆÅÆ2Å;
> +	int size;
> +
> +	if (data->id == VCNL4200) æ
> +		als_it_times = &vcnl4200_als_it_times;
> +		size = ARRAY_SIZE(vcnl4200_als_it_times);
> +	å else æ
> +		als_it_times = &vcnl4040_als_it_times;
> +		size = ARRAY_SIZE(vcnl4040_als_it_times);
> +	å
> +
> +	for (i = 0; i < size; i++) æ
> +		if (val == (*als_it_times)ÆiÅÆ1Å) æ
> +			index = i;
> +			break;
> +		å
> +	å
> +
> +	if (index < 0)
> +		return -EINVAL;
> +
> +	data->vcnl4200_al.sampling_rate = ktime_set(0, val * 1200000);
> +	if (data->id == VCNL4200)
> +		/* 24000 __lux/step * 50000 __s / val  */
> +		data->al_scale = div_u64(1200000000, val);
> +	else
> +		/* 100000 __lux/step * 80000 __s / val */
> +		data->al_scale = div_u64(8000000000, val);
> +
> +	mutex_lock(&data->vcnl4000_lock);
> +
> +	ret = i2c_smbus_read_word_data(data->client, VCNL4200_AL_CONF);
> +	if (ret < 0)
> +		goto out;
> +
> +	regval = (ret & ‾VCNL4040_ALS_CONF_IT) ø
> +	    FIELD_PREP(VCNL4040_ALS_CONF_IT, index);
> +	ret = i2c_smbus_write_word_data(data->client, VCNL4200_AL_CONF,
> +					regval);
> +
> +out:
> +	mutex_unlock(&data->vcnl4000_lock);
> +	return ret;
> +å
> +
>  static int vcnl4040_read_ps_it(struct vcnl4000_data *data, int *val, int *val2)
>  æ
>  	int ret;
> @@ -616,9 +710,16 @@ static int vcnl4000_read_raw(struct iio_dev *indio_dev,
>  		*val2 = data->al_scale;
>  		return IIO_VAL_INT_PLUS_MICRO;
>  	case IIO_CHAN_INFO_INT_TIME:
> -		if (chan->type != IIO_PROXIMITY)
> +		switch (chan->type) æ
> +		case IIO_LIGHT:
> +			ret = vcnl4040_read_als_it(data, val, val2);
> +			break;
> +		case IIO_PROXIMITY:
> +			ret = vcnl4040_read_ps_it(data, val, val2);
> +			break;
> +		default:
>  			return -EINVAL;
> -		ret = vcnl4040_read_ps_it(data, val, val2);
> +		å
>  		if (ret < 0)
>  			return ret;
>  		return IIO_VAL_INT_PLUS_MICRO;
> @@ -637,9 +738,14 @@ static int vcnl4040_write_raw(struct iio_dev *indio_dev,
>  	case IIO_CHAN_INFO_INT_TIME:
>  		if (val != 0)
>  			return -EINVAL;
> -		if (chan->type != IIO_PROXIMITY)
> +		switch (chan->type) æ
> +		case IIO_LIGHT:
> +			return vcnl4040_write_als_it(data, val2);
> +		case IIO_PROXIMITY:
> +			return vcnl4040_write_ps_it(data, val2);
> +		default:
>  			return -EINVAL;
> -		return vcnl4040_write_ps_it(data, val2);
> +		å
>  	default:
>  		return -EINVAL;
>  	å
> @@ -654,12 +760,27 @@ static int vcnl4040_read_avail(struct iio_dev *indio_dev,
>  
>  	switch (mask) æ
>  	case IIO_CHAN_INFO_INT_TIME:
> -		if (data->id == VCNL4200) æ
> -			*vals = (int *)vcnl4200_ps_it_times;
> -			*length = 2 * ARRAY_SIZE(vcnl4200_ps_it_times);
> -		å else æ
> -			*vals = (int *)vcnl4040_ps_it_times;
> -			*length = 2 * ARRAY_SIZE(vcnl4040_ps_it_times);
> +		switch (chan->type) æ
> +		case IIO_LIGHT:
> +			if (data->id == VCNL4200) æ
> +				*vals = (int *)vcnl4200_als_it_times;
> +				*length = 2 * ARRAY_SIZE(vcnl4200_als_it_times);
> +			å else æ
> +				*vals = (int *)vcnl4040_als_it_times;
> +				*length = 2 * ARRAY_SIZE(vcnl4040_als_it_times);
> +			å
> +			break;
> +		case IIO_PROXIMITY:
> +			if (data->id == VCNL4200) æ
> +				*vals = (int *)vcnl4200_ps_it_times;
> +				*length = 2 * ARRAY_SIZE(vcnl4200_ps_it_times);
> +			å else æ
> +				*vals = (int *)vcnl4040_ps_it_times;
> +				*length = 2 * ARRAY_SIZE(vcnl4040_ps_it_times);
> +			å
> +			break;
> +		default:
> +			return -EINVAL;
>  		å
>  		*type = IIO_VAL_INT_PLUS_MICRO;
>  		return IIO_AVAIL_LIST;
> @@ -1289,7 +1410,9 @@ static const struct iio_chan_spec vcnl4040_channelsÆÅ = æ
>  	æ
>  		.type = IIO_LIGHT,
>  		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) ø
> -			BIT(IIO_CHAN_INFO_SCALE),
> +			BIT(IIO_CHAN_INFO_SCALE) ø
> +			BIT(IIO_CHAN_INFO_INT_TIME),
> +		.info_mask_separate_available = BIT(IIO_CHAN_INFO_INT_TIME),
>  	å, æ
>  		.type = IIO_PROXIMITY,
>  		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) ø


  reply	other threads:[~2023-05-14 17:12 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-05-09 14:01 [PATCH v2 0/7] iio: light: vcnl4000: Add features for vncl4040/4200 Astrid Rost
2023-05-09 14:01 ` [PATCH v2 1/7] iio: light: vcnl4000: Add proximity irq for vcnl4200 Astrid Rost
2023-05-13 18:57   ` Jonathan Cameron
2023-05-09 14:01 ` [PATCH v2 2/7] iio: light: vcnl4000: Add proximity ps_it " Astrid Rost
2023-05-14 17:24   ` Jonathan Cameron
2023-05-09 14:01 ` [PATCH v2 3/7] iio: light: vcnl4000: Add als_it for vcnl4040/4200 Astrid Rost
2023-05-14 17:28   ` Jonathan Cameron [this message]
2023-05-09 14:01 ` [PATCH v2 4/7] iio: light: vcnl4000: add illumination irq vcnl4040/4200 Astrid Rost
2023-05-14 17:31   ` Jonathan Cameron
2023-05-09 14:01 ` [PATCH v2 5/7] iio: light: vcnl4000: Add debounce count for vcnl4040/4200 Astrid Rost
2023-05-14 17:37   ` Jonathan Cameron
2023-05-15 15:00     ` Astrid Rost
2023-05-09 14:01 ` [PATCH v2 6/7] iio: light: vcnl4000: Add oversampling_ratio for 4040/4200 Astrid Rost
2023-05-14 17:41   ` Jonathan Cameron
2023-05-15 14:55     ` Astrid Rost
2023-05-09 14:01 ` [PATCH v2 7/7] iio: light: vcnl4000: Add calibration bias " Astrid Rost
2023-05-14 17:44   ` 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=20230514182808.4dad13b5@jic23-huawei \
    --to=jic23@kernel.org \
    --cc=astrid.rost@axis.com \
    --cc=kernel@axis.com \
    --cc=lars@metafoo.de \
    --cc=linux-iio@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox