2021-07-22 15:37:01

by Ivan Mikhaylov

[permalink] [raw]
Subject: [PATCH v5 0/3] iio: vcnl3020: add periodic mode, threshold options

Add periodic mode enablement, high/low threshold options.

Changes from v1:
1. Remove changes for hwmon driver and changes affecting
vcnl3020 data structure.
2. Add enable/disable periodic mode functions.

Changes from v2:
1. Minor fixes from Jonathan's comments.

Changes from v3:
1. add DMA safe buffer in vcnl3020_data and use it on bulk_read/write
calls
2. put vcnl3020_is_in_periodic_mode in vcnl3020_measure_proximity and
vcnl3020_write_proxy_samp_freq
3. add mutex instead of iio_claim in vcnl3020_write_proxy_samp_freq
4. out_mutex -> err_unlock

Changes from v4:
1. split into 3 patches - DMA safe buffer, periodic mode, change
iio_claim/release on mutex.
2. add dev_err for regmap_read/write

Ivan Mikhaylov (3):
iio: proximity: vcnl3020: add DMA safe buffer
iio: proximity: vcnl3020: add periodic mode
iio: proximity: vcnl3020: remove iio_claim/release_direct

drivers/iio/proximity/vcnl3020.c | 354 +++++++++++++++++++++++++++++--
1 file changed, 338 insertions(+), 16 deletions(-)

--
2.31.1


2021-07-22 15:37:14

by Ivan Mikhaylov

[permalink] [raw]
Subject: [PATCH v5 1/3] iio: proximity: vcnl3020: add DMA safe buffer

Add DMA safe buffer for bulk transfers.

Signed-off-by: Ivan Mikhaylov <[email protected]>
---
drivers/iio/proximity/vcnl3020.c | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/drivers/iio/proximity/vcnl3020.c b/drivers/iio/proximity/vcnl3020.c
index 43817f6b3086..c90f9c6e9e97 100644
--- a/drivers/iio/proximity/vcnl3020.c
+++ b/drivers/iio/proximity/vcnl3020.c
@@ -57,12 +57,14 @@ static const int vcnl3020_prox_sampling_frequency[][2] = {
* @dev: vcnl3020 device.
* @rev: revision id.
* @lock: lock for protecting access to device hardware registers.
+ * @buf: DMA safe __be16 buffer.
*/
struct vcnl3020_data {
struct regmap *regmap;
struct device *dev;
u8 rev;
struct mutex lock;
+ __be16 buf ____cacheline_aligned;
};

/**
@@ -144,7 +146,6 @@ static int vcnl3020_measure_proximity(struct vcnl3020_data *data, int *val)
{
int rc;
unsigned int reg;
- __be16 res;

mutex_lock(&data->lock);

@@ -163,12 +164,12 @@ static int vcnl3020_measure_proximity(struct vcnl3020_data *data, int *val)
}

/* high & low result bytes read */
- rc = regmap_bulk_read(data->regmap, VCNL_PS_RESULT_HI, &res,
- sizeof(res));
+ rc = regmap_bulk_read(data->regmap, VCNL_PS_RESULT_HI, &data->buf,
+ sizeof(data->buf));
if (rc)
goto err_unlock;

- *val = be16_to_cpu(res);
+ *val = be16_to_cpu(data->buf);

err_unlock:
mutex_unlock(&data->lock);
--
2.31.1

2021-07-22 15:39:17

by Ivan Mikhaylov

[permalink] [raw]
Subject: [PATCH v5 3/3] iio: proximity: vcnl3020: remove iio_claim/release_direct

Remove iio_claim/release and change it on mutex accordingly in
vcnl3020_write_proxy_samp_freq.

Signed-off-by: Ivan Mikhaylov <[email protected]>
---
drivers/iio/proximity/vcnl3020.c | 33 ++++++++++++++++++++------------
1 file changed, 21 insertions(+), 12 deletions(-)

diff --git a/drivers/iio/proximity/vcnl3020.c b/drivers/iio/proximity/vcnl3020.c
index 6d724657677a..6a3b59e1a6f6 100644
--- a/drivers/iio/proximity/vcnl3020.c
+++ b/drivers/iio/proximity/vcnl3020.c
@@ -236,10 +236,15 @@ static int vcnl3020_write_proxy_samp_freq(struct vcnl3020_data *data, int val,
{
unsigned int i;
int index = -1;
+ int rc;
+
+ mutex_lock(&data->lock);

/* Protect against event capture. */
- if (vcnl3020_is_in_periodic_mode(data))
- return -EBUSY;
+ if (vcnl3020_is_in_periodic_mode(data)) {
+ rc = -EBUSY;
+ goto err_unlock;
+ }

for (i = 0; i < ARRAY_SIZE(vcnl3020_prox_sampling_frequency); i++) {
if (val == vcnl3020_prox_sampling_frequency[i][0] &&
@@ -249,10 +254,20 @@ static int vcnl3020_write_proxy_samp_freq(struct vcnl3020_data *data, int val,
}
}

- if (index < 0)
- return -EINVAL;
+ if (index < 0) {
+ rc = -EINVAL;
+ goto err_unlock;
+ }

- return regmap_write(data->regmap, VCNL_PROXIMITY_RATE, index);
+ rc = regmap_write(data->regmap, VCNL_PROXIMITY_RATE, index);
+ if (rc)
+ dev_err(data->dev,
+ "Error (%d) writing proximity rate register\n", rc);
+
+err_unlock:
+ mutex_unlock(&data->lock);
+
+ return rc;
}

static bool vcnl3020_is_thr_enabled(struct vcnl3020_data *data)
@@ -513,17 +528,11 @@ static int vcnl3020_write_raw(struct iio_dev *indio_dev,
struct iio_chan_spec const *chan,
int val, int val2, long mask)
{
- int rc;
struct vcnl3020_data *data = iio_priv(indio_dev);

switch (mask) {
case IIO_CHAN_INFO_SAMP_FREQ:
- rc = iio_device_claim_direct_mode(indio_dev);
- if (rc)
- return rc;
- rc = vcnl3020_write_proxy_samp_freq(data, val, val2);
- iio_device_release_direct_mode(indio_dev);
- return rc;
+ return vcnl3020_write_proxy_samp_freq(data, val, val2);
default:
return -EINVAL;
}
--
2.31.1

2021-07-24 15:09:15

by Jonathan Cameron

[permalink] [raw]
Subject: Re: [PATCH v5 0/3] iio: vcnl3020: add periodic mode, threshold options

On Thu, 22 Jul 2021 18:44:17 +0300
Ivan Mikhaylov <[email protected]> wrote:

> Add periodic mode enablement, high/low threshold options.
>
> Changes from v1:
> 1. Remove changes for hwmon driver and changes affecting
> vcnl3020 data structure.
> 2. Add enable/disable periodic mode functions.
>
> Changes from v2:
> 1. Minor fixes from Jonathan's comments.
>
> Changes from v3:
> 1. add DMA safe buffer in vcnl3020_data and use it on bulk_read/write
> calls
> 2. put vcnl3020_is_in_periodic_mode in vcnl3020_measure_proximity and
> vcnl3020_write_proxy_samp_freq
> 3. add mutex instead of iio_claim in vcnl3020_write_proxy_samp_freq
> 4. out_mutex -> err_unlock
>
> Changes from v4:
> 1. split into 3 patches - DMA safe buffer, periodic mode, change
> iio_claim/release on mutex.
> 2. add dev_err for regmap_read/write

Hi Ivan,

Given I only wanted some trivial changes in patch 2, I've made those whilst applying
rather that wasting either of our time with a v6. Please take a quick look to check
I didn't mess anything up!

Applied to the togreg branch of iio.git on kernel.org and pushed out as testing for
0-day to poke at it and see what it can find,

Thanks,

Jonathan

>
> Ivan Mikhaylov (3):
> iio: proximity: vcnl3020: add DMA safe buffer
> iio: proximity: vcnl3020: add periodic mode
> iio: proximity: vcnl3020: remove iio_claim/release_direct
>
> drivers/iio/proximity/vcnl3020.c | 354 +++++++++++++++++++++++++++++--
> 1 file changed, 338 insertions(+), 16 deletions(-)
>