All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH][RFC] iio: Move attach/detach of the poll func to the core
@ 2018-06-22 13:53 Alexandru Ardelean
  2018-11-03 18:19 ` Jonathan Cameron
  0 siblings, 1 reply; 5+ messages in thread
From: Alexandru Ardelean @ 2018-06-22 13:53 UTC (permalink / raw)
  To: linux-iio, lars, jic23; +Cc: Alexandru Ardelean

All devices using a triggered buffer need to attach and detach the trigger
to the device in order to properly work. Instead of doing this in each and
every driver by hand move this into the core.

Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
Signed-off-by: Alexandru Ardelean <alexandru.ardelean@analog.com>
---

Note: `Signed-off-by` is also Lars-Peter Clausen because he is the
original author of this patch [on an older kernel].
The patch has been updated since the original patch from Lars.

There has been a (small) discussion about whether such a patch makes
sense to implement (for reducing code duplication), or whether it's too
risky to do it.

The reason for the risky-ness is that there is no consistent way in which
drivers attach/detach the poll function.
i.e.
   1. some drivers call `iio_triggered_buffer_postenable()` before doing HW
      stuff, some after (for attaching the poll func)
   2. similarly, for `iio_triggered_buffer_predisable()` some drivers do it
      before HW stuff, some after (for detaching the poll func)

Common sense would dictate that (in the case of
`iio_triggered_buffer_postenable()`) there would normally be HW setup first
and then attach the poll func.
And the reverse done for `iio_triggered_buffer_predisable()`.

However, it's unclear whether this reasoning is completely sound for all
drivers.

Hence this RFC.

 drivers/iio/accel/bmc150-accel-core.c         |  4 +--
 drivers/iio/accel/kxcjk-1013.c                |  2 --
 drivers/iio/accel/kxsd9.c                     |  2 --
 drivers/iio/accel/st_accel_buffer.c           |  8 ------
 drivers/iio/accel/stk8312.c                   |  2 --
 drivers/iio/accel/stk8ba50.c                  |  2 --
 drivers/iio/adc/ad7266.c                      |  2 --
 drivers/iio/adc/ad7766.c                      |  2 --
 drivers/iio/adc/ad7887.c                      |  2 --
 drivers/iio/adc/ad_sigma_delta.c              |  5 ----
 drivers/iio/adc/at91-sama5d2_adc.c            |  6 +----
 drivers/iio/adc/dln2-adc.c                    |  4 +--
 drivers/iio/adc/mxs-lradc-adc.c               |  2 --
 drivers/iio/adc/stm32-adc.c                   | 11 --------
 drivers/iio/adc/ti-adc084s021.c               |  2 --
 drivers/iio/adc/ti-ads1015.c                  |  2 --
 drivers/iio/adc/vf610_adc.c                   |  6 +----
 drivers/iio/adc/xilinx-xadc-core.c            |  2 --
 .../buffer/industrialio-triggered-buffer.c    | 10 +-------
 drivers/iio/chemical/atlas-ph-sensor.c        |  8 ------
 drivers/iio/dummy/iio_simple_dummy_buffer.c   | 14 -----------
 drivers/iio/gyro/bmg160_core.c                |  2 --
 drivers/iio/gyro/mpu3050-core.c               |  2 --
 drivers/iio/gyro/st_gyro_buffer.c             |  8 ------
 drivers/iio/humidity/hdc100x.c                |  7 +-----
 drivers/iio/humidity/hts221_buffer.c          |  2 --
 drivers/iio/iio_core_trigger.h                | 17 +++++++++++++
 drivers/iio/industrialio-buffer.c             | 13 ++++++++++
 drivers/iio/industrialio-trigger.c            | 22 +++-------------
 drivers/iio/light/gp2ap020a00f.c              | 11 +-------
 drivers/iio/light/isl29125.c                  |  5 ----
 drivers/iio/light/rpr0521.c                   |  2 --
 drivers/iio/light/si1145.c                    |  2 --
 drivers/iio/light/st_uvis25_core.c            |  2 --
 drivers/iio/light/tcs3414.c                   |  5 ----
 drivers/iio/magnetometer/bmc150_magn.c        |  2 --
 drivers/iio/magnetometer/st_magn_buffer.c     | 23 +++--------------
 drivers/iio/potentiostat/lmp91000.c           |  1 -
 drivers/iio/pressure/st_pressure_buffer.c     | 25 +++----------------
 drivers/iio/pressure/zpa2326.c                |  6 -----
 drivers/iio/proximity/sx9500.c                |  3 ---
 drivers/staging/iio/meter/ade7758_ring.c      |  2 --
 include/linux/iio/trigger_consumer.h          |  7 ------
 43 files changed, 50 insertions(+), 217 deletions(-)

diff --git a/drivers/iio/accel/bmc150-accel-core.c b/drivers/iio/accel/bmc150-accel-core.c
index 383c802eb5b8..dcce3e178f10 100644
--- a/drivers/iio/accel/bmc150-accel-core.c
+++ b/drivers/iio/accel/bmc150-accel-core.c
@@ -1403,7 +1403,7 @@ static int bmc150_accel_buffer_postenable(struct iio_dev *indio_dev)
 	int ret = 0;
 
 	if (indio_dev->currentmode == INDIO_BUFFER_TRIGGERED)
-		return iio_triggered_buffer_postenable(indio_dev);
+		return 0;
 
 	mutex_lock(&data->mutex);
 
@@ -1435,7 +1435,7 @@ static int bmc150_accel_buffer_predisable(struct iio_dev *indio_dev)
 	struct bmc150_accel_data *data = iio_priv(indio_dev);
 
 	if (indio_dev->currentmode == INDIO_BUFFER_TRIGGERED)
-		return iio_triggered_buffer_predisable(indio_dev);
+		return 0;
 
 	mutex_lock(&data->mutex);
 
diff --git a/drivers/iio/accel/kxcjk-1013.c b/drivers/iio/accel/kxcjk-1013.c
index af53a1084ee5..62a1c86e5049 100644
--- a/drivers/iio/accel/kxcjk-1013.c
+++ b/drivers/iio/accel/kxcjk-1013.c
@@ -1019,9 +1019,7 @@ static const struct iio_chan_spec kxcjk1013_channels[] = {
 
 static const struct iio_buffer_setup_ops kxcjk1013_buffer_setup_ops = {
 	.preenable		= kxcjk1013_buffer_preenable,
-	.postenable		= iio_triggered_buffer_postenable,
 	.postdisable		= kxcjk1013_buffer_postdisable,
-	.predisable		= iio_triggered_buffer_predisable,
 };
 
 static const struct iio_info kxcjk1013_info = {
diff --git a/drivers/iio/accel/kxsd9.c b/drivers/iio/accel/kxsd9.c
index 0c0df4fce420..9da366bedaa0 100644
--- a/drivers/iio/accel/kxsd9.c
+++ b/drivers/iio/accel/kxsd9.c
@@ -255,8 +255,6 @@ static int kxsd9_buffer_postdisable(struct iio_dev *indio_dev)
 
 static const struct iio_buffer_setup_ops kxsd9_buffer_setup_ops = {
 	.preenable = kxsd9_buffer_preenable,
-	.postenable = iio_triggered_buffer_postenable,
-	.predisable = iio_triggered_buffer_predisable,
 	.postdisable = kxsd9_buffer_postdisable,
 };
 
diff --git a/drivers/iio/accel/st_accel_buffer.c b/drivers/iio/accel/st_accel_buffer.c
index 7fddc137e91e..cfa189774a1a 100644
--- a/drivers/iio/accel/st_accel_buffer.c
+++ b/drivers/iio/accel/st_accel_buffer.c
@@ -51,10 +51,6 @@ static int st_accel_buffer_postenable(struct iio_dev *indio_dev)
 	if (err < 0)
 		goto st_accel_buffer_postenable_error;
 
-	err = iio_triggered_buffer_postenable(indio_dev);
-	if (err < 0)
-		goto st_accel_buffer_postenable_error;
-
 	return err;
 
 st_accel_buffer_postenable_error:
@@ -68,10 +64,6 @@ static int st_accel_buffer_predisable(struct iio_dev *indio_dev)
 	int err;
 	struct st_sensor_data *adata = iio_priv(indio_dev);
 
-	err = iio_triggered_buffer_predisable(indio_dev);
-	if (err < 0)
-		goto st_accel_buffer_predisable_error;
-
 	err = st_sensors_set_axis_enable(indio_dev, ST_SENSORS_ENABLE_ALL_AXIS);
 	if (err < 0)
 		goto st_accel_buffer_predisable_error;
diff --git a/drivers/iio/accel/stk8312.c b/drivers/iio/accel/stk8312.c
index cacc0da2f874..7c05f8b91f1f 100644
--- a/drivers/iio/accel/stk8312.c
+++ b/drivers/iio/accel/stk8312.c
@@ -495,8 +495,6 @@ static int stk8312_buffer_postdisable(struct iio_dev *indio_dev)
 
 static const struct iio_buffer_setup_ops stk8312_buffer_setup_ops = {
 	.preenable   = stk8312_buffer_preenable,
-	.postenable  = iio_triggered_buffer_postenable,
-	.predisable  = iio_triggered_buffer_predisable,
 	.postdisable = stk8312_buffer_postdisable,
 };
 
diff --git a/drivers/iio/accel/stk8ba50.c b/drivers/iio/accel/stk8ba50.c
index 576b6b140f08..4e15da997d96 100644
--- a/drivers/iio/accel/stk8ba50.c
+++ b/drivers/iio/accel/stk8ba50.c
@@ -379,8 +379,6 @@ static int stk8ba50_buffer_postdisable(struct iio_dev *indio_dev)
 
 static const struct iio_buffer_setup_ops stk8ba50_buffer_setup_ops = {
 	.preenable   = stk8ba50_buffer_preenable,
-	.postenable  = iio_triggered_buffer_postenable,
-	.predisable  = iio_triggered_buffer_predisable,
 	.postdisable = stk8ba50_buffer_postdisable,
 };
 
diff --git a/drivers/iio/adc/ad7266.c b/drivers/iio/adc/ad7266.c
index 605eb5e7e829..93b02b28e377 100644
--- a/drivers/iio/adc/ad7266.c
+++ b/drivers/iio/adc/ad7266.c
@@ -75,8 +75,6 @@ static int ad7266_postdisable(struct iio_dev *indio_dev)
 
 static const struct iio_buffer_setup_ops iio_triggered_buffer_setup_ops = {
 	.preenable = &ad7266_preenable,
-	.postenable = &iio_triggered_buffer_postenable,
-	.predisable = &iio_triggered_buffer_predisable,
 	.postdisable = &ad7266_postdisable,
 };
 
diff --git a/drivers/iio/adc/ad7766.c b/drivers/iio/adc/ad7766.c
index 3ae14fc8c649..39e7e4004706 100644
--- a/drivers/iio/adc/ad7766.c
+++ b/drivers/iio/adc/ad7766.c
@@ -179,8 +179,6 @@ static const struct ad7766_chip_info ad7766_chip_info[] = {
 
 static const struct iio_buffer_setup_ops ad7766_buffer_setup_ops = {
 	.preenable = &ad7766_preenable,
-	.postenable = &iio_triggered_buffer_postenable,
-	.predisable = &iio_triggered_buffer_predisable,
 	.postdisable = &ad7766_postdisable,
 };
 
diff --git a/drivers/iio/adc/ad7887.c b/drivers/iio/adc/ad7887.c
index 205c0f1761aa..02e0e75a3a71 100644
--- a/drivers/iio/adc/ad7887.c
+++ b/drivers/iio/adc/ad7887.c
@@ -131,8 +131,6 @@ static irqreturn_t ad7887_trigger_handler(int irq, void *p)
 
 static const struct iio_buffer_setup_ops ad7887_ring_setup_ops = {
 	.preenable = &ad7887_ring_preenable,
-	.postenable = &iio_triggered_buffer_postenable,
-	.predisable = &iio_triggered_buffer_predisable,
 	.postdisable = &ad7887_ring_postdisable,
 };
 
diff --git a/drivers/iio/adc/ad_sigma_delta.c b/drivers/iio/adc/ad_sigma_delta.c
index cf1b048b0665..ef046277bf7b 100644
--- a/drivers/iio/adc/ad_sigma_delta.c
+++ b/drivers/iio/adc/ad_sigma_delta.c
@@ -338,10 +338,6 @@ static int ad_sd_buffer_postenable(struct iio_dev *indio_dev)
 	unsigned int channel;
 	int ret;
 
-	ret = iio_triggered_buffer_postenable(indio_dev);
-	if (ret < 0)
-		return ret;
-
 	channel = find_first_bit(indio_dev->active_scan_mask,
 				 indio_dev->masklength);
 	ret = ad_sigma_delta_set_channel(sigma_delta,
@@ -426,7 +422,6 @@ static irqreturn_t ad_sd_trigger_handler(int irq, void *p)
 
 static const struct iio_buffer_setup_ops ad_sd_buffer_setup_ops = {
 	.postenable = &ad_sd_buffer_postenable,
-	.predisable = &iio_triggered_buffer_predisable,
 	.postdisable = &ad_sd_buffer_postdisable,
 	.validate_scan_mask = &iio_validate_scan_mask_onehot,
 };
diff --git a/drivers/iio/adc/at91-sama5d2_adc.c b/drivers/iio/adc/at91-sama5d2_adc.c
index 4eff8351ce29..9c23d4bbcc47 100644
--- a/drivers/iio/adc/at91-sama5d2_adc.c
+++ b/drivers/iio/adc/at91-sama5d2_adc.c
@@ -500,7 +500,7 @@ static int at91_adc_buffer_postenable(struct iio_dev *indio_dev)
 		return ret;
 	}
 
-	return iio_triggered_buffer_postenable(indio_dev);
+	return 0;
 }
 
 static int at91_adc_buffer_predisable(struct iio_dev *indio_dev)
@@ -509,10 +509,6 @@ static int at91_adc_buffer_predisable(struct iio_dev *indio_dev)
 	int ret;
 	u8 bit;
 
-	ret = iio_triggered_buffer_predisable(indio_dev);
-	if (ret < 0)
-		dev_err(&indio_dev->dev, "buffer predisable failed\n");
-
 	if (!st->dma_st.dma_chan)
 		return ret;
 
diff --git a/drivers/iio/adc/dln2-adc.c b/drivers/iio/adc/dln2-adc.c
index c64c6675cae6..51135e7c0d4f 100644
--- a/drivers/iio/adc/dln2-adc.c
+++ b/drivers/iio/adc/dln2-adc.c
@@ -560,7 +560,7 @@ static int dln2_adc_triggered_buffer_postenable(struct iio_dev *indio_dev)
 		mutex_unlock(&dln2->mutex);
 	}
 
-	return iio_triggered_buffer_postenable(indio_dev);
+	return 0;
 }
 
 static int dln2_adc_triggered_buffer_predisable(struct iio_dev *indio_dev)
@@ -585,7 +585,7 @@ static int dln2_adc_triggered_buffer_predisable(struct iio_dev *indio_dev)
 		return ret;
 	}
 
-	return iio_triggered_buffer_predisable(indio_dev);
+	return 0;
 }
 
 static const struct iio_buffer_setup_ops dln2_adc_buffer_setup_ops = {
diff --git a/drivers/iio/adc/mxs-lradc-adc.c b/drivers/iio/adc/mxs-lradc-adc.c
index c627513d9f0f..4a44d4c787be 100644
--- a/drivers/iio/adc/mxs-lradc-adc.c
+++ b/drivers/iio/adc/mxs-lradc-adc.c
@@ -575,8 +575,6 @@ static bool mxs_lradc_adc_validate_scan_mask(struct iio_dev *iio,
 
 static const struct iio_buffer_setup_ops mxs_lradc_adc_buffer_ops = {
 	.preenable = &mxs_lradc_adc_buffer_preenable,
-	.postenable = &iio_triggered_buffer_postenable,
-	.predisable = &iio_triggered_buffer_predisable,
 	.postdisable = &mxs_lradc_adc_buffer_postdisable,
 	.validate_scan_mask = &mxs_lradc_adc_validate_scan_mask,
 };
diff --git a/drivers/iio/adc/stm32-adc.c b/drivers/iio/adc/stm32-adc.c
index 378411853d75..ce0d17c03d7e 100644
--- a/drivers/iio/adc/stm32-adc.c
+++ b/drivers/iio/adc/stm32-adc.c
@@ -1482,10 +1482,6 @@ static int stm32_adc_buffer_postenable(struct iio_dev *indio_dev)
 		goto err_clr_trig;
 	}
 
-	ret = iio_triggered_buffer_postenable(indio_dev);
-	if (ret < 0)
-		goto err_stop_dma;
-
 	/* Reset adc buffer index */
 	adc->bufi = 0;
 
@@ -1496,9 +1492,6 @@ static int stm32_adc_buffer_postenable(struct iio_dev *indio_dev)
 
 	return 0;
 
-err_stop_dma:
-	if (adc->dma_chan)
-		dmaengine_terminate_all(adc->dma_chan);
 err_clr_trig:
 	stm32_adc_set_trig(indio_dev, NULL);
 err_unprepare:
@@ -1517,10 +1510,6 @@ static int stm32_adc_buffer_predisable(struct iio_dev *indio_dev)
 	if (!adc->dma_chan)
 		stm32_adc_conv_irq_disable(adc);
 
-	ret = iio_triggered_buffer_predisable(indio_dev);
-	if (ret < 0)
-		dev_err(&indio_dev->dev, "predisable failed\n");
-
 	if (adc->dma_chan)
 		dmaengine_terminate_all(adc->dma_chan);
 
diff --git a/drivers/iio/adc/ti-adc084s021.c b/drivers/iio/adc/ti-adc084s021.c
index 25504640e126..b5557ecb667e 100644
--- a/drivers/iio/adc/ti-adc084s021.c
+++ b/drivers/iio/adc/ti-adc084s021.c
@@ -190,8 +190,6 @@ static const struct iio_info adc084s021_info = {
 
 static const struct iio_buffer_setup_ops adc084s021_buffer_setup_ops = {
 	.preenable = adc084s021_buffer_preenable,
-	.postenable = iio_triggered_buffer_postenable,
-	.predisable = iio_triggered_buffer_predisable,
 	.postdisable = adc084s021_buffer_postdisable,
 };
 
diff --git a/drivers/iio/adc/ti-ads1015.c b/drivers/iio/adc/ti-ads1015.c
index 6a114dcb4a3a..2a4725ec68ce 100644
--- a/drivers/iio/adc/ti-ads1015.c
+++ b/drivers/iio/adc/ti-ads1015.c
@@ -784,8 +784,6 @@ static int ads1015_buffer_postdisable(struct iio_dev *indio_dev)
 
 static const struct iio_buffer_setup_ops ads1015_buffer_setup_ops = {
 	.preenable	= ads1015_buffer_preenable,
-	.postenable	= iio_triggered_buffer_postenable,
-	.predisable	= iio_triggered_buffer_predisable,
 	.postdisable	= ads1015_buffer_postdisable,
 	.validate_scan_mask = &iio_validate_scan_mask_onehot,
 };
diff --git a/drivers/iio/adc/vf610_adc.c b/drivers/iio/adc/vf610_adc.c
index bbcb7a4d7edf..3a15b98cfd39 100644
--- a/drivers/iio/adc/vf610_adc.c
+++ b/drivers/iio/adc/vf610_adc.c
@@ -740,10 +740,6 @@ static int vf610_adc_buffer_postenable(struct iio_dev *indio_dev)
 	int ret;
 	int val;
 
-	ret = iio_triggered_buffer_postenable(indio_dev);
-	if (ret)
-		return ret;
-
 	val = readl(info->regs + VF610_REG_ADC_GC);
 	val |= VF610_ADC_ADCON;
 	writel(val, info->regs + VF610_REG_ADC_GC);
@@ -774,7 +770,7 @@ static int vf610_adc_buffer_predisable(struct iio_dev *indio_dev)
 
 	writel(hc_cfg, info->regs + VF610_REG_ADC_HC0);
 
-	return iio_triggered_buffer_predisable(indio_dev);
+	return 0;
 }
 
 static const struct iio_buffer_setup_ops iio_triggered_buffer_setup_ops = {
diff --git a/drivers/iio/adc/xilinx-xadc-core.c b/drivers/iio/adc/xilinx-xadc-core.c
index d4f21d1be6c8..bc5b4f124a15 100644
--- a/drivers/iio/adc/xilinx-xadc-core.c
+++ b/drivers/iio/adc/xilinx-xadc-core.c
@@ -804,8 +804,6 @@ static int xadc_preenable(struct iio_dev *indio_dev)
 
 static const struct iio_buffer_setup_ops xadc_buffer_ops = {
 	.preenable = &xadc_preenable,
-	.postenable = &iio_triggered_buffer_postenable,
-	.predisable = &iio_triggered_buffer_predisable,
 	.postdisable = &xadc_postdisable,
 };
 
diff --git a/drivers/iio/buffer/industrialio-triggered-buffer.c b/drivers/iio/buffer/industrialio-triggered-buffer.c
index d3db1fce54d2..6d2d7e953904 100644
--- a/drivers/iio/buffer/industrialio-triggered-buffer.c
+++ b/drivers/iio/buffer/industrialio-triggered-buffer.c
@@ -16,11 +16,6 @@
 #include <linux/iio/triggered_buffer.h>
 #include <linux/iio/trigger_consumer.h>
 
-static const struct iio_buffer_setup_ops iio_triggered_buffer_setup_ops = {
-	.postenable = &iio_triggered_buffer_postenable,
-	.predisable = &iio_triggered_buffer_predisable,
-};
-
 /**
  * iio_triggered_buffer_setup() - Setup triggered buffer and pollfunc
  * @indio_dev:		IIO device structure
@@ -70,10 +65,7 @@ int iio_triggered_buffer_setup(struct iio_dev *indio_dev,
 	}
 
 	/* Ring buffer functions - here trigger setup related */
-	if (setup_ops)
-		indio_dev->setup_ops = setup_ops;
-	else
-		indio_dev->setup_ops = &iio_triggered_buffer_setup_ops;
+	indio_dev->setup_ops = setup_ops;
 
 	/* Flag that polled ring buffering is possible */
 	indio_dev->modes |= INDIO_BUFFER_TRIGGERED;
diff --git a/drivers/iio/chemical/atlas-ph-sensor.c b/drivers/iio/chemical/atlas-ph-sensor.c
index a406ad31b096..8fed75f9e95d 100644
--- a/drivers/iio/chemical/atlas-ph-sensor.c
+++ b/drivers/iio/chemical/atlas-ph-sensor.c
@@ -305,10 +305,6 @@ static int atlas_buffer_postenable(struct iio_dev *indio_dev)
 	struct atlas_data *data = iio_priv(indio_dev);
 	int ret;
 
-	ret = iio_triggered_buffer_postenable(indio_dev);
-	if (ret)
-		return ret;
-
 	ret = pm_runtime_get_sync(&data->client->dev);
 	if (ret < 0) {
 		pm_runtime_put_noidle(&data->client->dev);
@@ -323,10 +319,6 @@ static int atlas_buffer_predisable(struct iio_dev *indio_dev)
 	struct atlas_data *data = iio_priv(indio_dev);
 	int ret;
 
-	ret = iio_triggered_buffer_predisable(indio_dev);
-	if (ret)
-		return ret;
-
 	ret = atlas_set_interrupt(data, false);
 	if (ret)
 		return ret;
diff --git a/drivers/iio/dummy/iio_simple_dummy_buffer.c b/drivers/iio/dummy/iio_simple_dummy_buffer.c
index 744ca92c3c99..72b0a874d0c6 100644
--- a/drivers/iio/dummy/iio_simple_dummy_buffer.c
+++ b/drivers/iio/dummy/iio_simple_dummy_buffer.c
@@ -102,20 +102,6 @@ static irqreturn_t iio_simple_dummy_trigger_h(int irq, void *p)
 }
 
 static const struct iio_buffer_setup_ops iio_simple_dummy_buffer_setup_ops = {
-	/*
-	 * iio_triggered_buffer_postenable:
-	 * Generic function that simply attaches the pollfunc to the trigger.
-	 * Replace this to mess with hardware state before we attach the
-	 * trigger.
-	 */
-	.postenable = &iio_triggered_buffer_postenable,
-	/*
-	 * iio_triggered_buffer_predisable:
-	 * Generic function that simple detaches the pollfunc from the trigger.
-	 * Replace this to put hardware state back again after the trigger is
-	 * detached but before userspace knows we have disabled the ring.
-	 */
-	.predisable = &iio_triggered_buffer_predisable,
 };
 
 int iio_simple_dummy_configure_buffer(struct iio_dev *indio_dev)
diff --git a/drivers/iio/gyro/bmg160_core.c b/drivers/iio/gyro/bmg160_core.c
index 63ca31628a93..018d5aef9cdf 100644
--- a/drivers/iio/gyro/bmg160_core.c
+++ b/drivers/iio/gyro/bmg160_core.c
@@ -1043,8 +1043,6 @@ static int bmg160_buffer_postdisable(struct iio_dev *indio_dev)
 
 static const struct iio_buffer_setup_ops bmg160_buffer_setup_ops = {
 	.preenable = bmg160_buffer_preenable,
-	.postenable = iio_triggered_buffer_postenable,
-	.predisable = iio_triggered_buffer_predisable,
 	.postdisable = bmg160_buffer_postdisable,
 };
 
diff --git a/drivers/iio/gyro/mpu3050-core.c b/drivers/iio/gyro/mpu3050-core.c
index 77fac81a3adc..159fb7cd6e2e 100644
--- a/drivers/iio/gyro/mpu3050-core.c
+++ b/drivers/iio/gyro/mpu3050-core.c
@@ -660,8 +660,6 @@ static int mpu3050_buffer_postdisable(struct iio_dev *indio_dev)
 
 static const struct iio_buffer_setup_ops mpu3050_buffer_setup_ops = {
 	.preenable = mpu3050_buffer_preenable,
-	.postenable = iio_triggered_buffer_postenable,
-	.predisable = iio_triggered_buffer_predisable,
 	.postdisable = mpu3050_buffer_postdisable,
 };
 
diff --git a/drivers/iio/gyro/st_gyro_buffer.c b/drivers/iio/gyro/st_gyro_buffer.c
index a5377044e42f..21501ffd879e 100644
--- a/drivers/iio/gyro/st_gyro_buffer.c
+++ b/drivers/iio/gyro/st_gyro_buffer.c
@@ -51,10 +51,6 @@ static int st_gyro_buffer_postenable(struct iio_dev *indio_dev)
 	if (err < 0)
 		goto st_gyro_buffer_postenable_error;
 
-	err = iio_triggered_buffer_postenable(indio_dev);
-	if (err < 0)
-		goto st_gyro_buffer_postenable_error;
-
 	return err;
 
 st_gyro_buffer_postenable_error:
@@ -68,10 +64,6 @@ static int st_gyro_buffer_predisable(struct iio_dev *indio_dev)
 	int err;
 	struct st_sensor_data *gdata = iio_priv(indio_dev);
 
-	err = iio_triggered_buffer_predisable(indio_dev);
-	if (err < 0)
-		goto st_gyro_buffer_predisable_error;
-
 	err = st_sensors_set_axis_enable(indio_dev, ST_SENSORS_ENABLE_ALL_AXIS);
 	if (err < 0)
 		goto st_gyro_buffer_predisable_error;
diff --git a/drivers/iio/humidity/hdc100x.c b/drivers/iio/humidity/hdc100x.c
index 066e05f92081..959d7e17d471 100644
--- a/drivers/iio/humidity/hdc100x.c
+++ b/drivers/iio/humidity/hdc100x.c
@@ -286,7 +286,7 @@ static int hdc100x_buffer_postenable(struct iio_dev *indio_dev)
 	if (ret)
 		return ret;
 
-	return iio_triggered_buffer_postenable(indio_dev);
+	return 0;
 }
 
 static int hdc100x_buffer_predisable(struct iio_dev *indio_dev)
@@ -294,11 +294,6 @@ static int hdc100x_buffer_predisable(struct iio_dev *indio_dev)
 	struct hdc100x_data *data = iio_priv(indio_dev);
 	int ret;
 
-	/* First detach poll func, then reset ACQ mode. OK to disable buffer */
-	ret = iio_triggered_buffer_predisable(indio_dev);
-	if (ret)
-		return ret;
-
 	mutex_lock(&data->lock);
 	ret = hdc100x_update_config(data, HDC100X_REG_CONFIG_ACQ_MODE, 0);
 	mutex_unlock(&data->lock);
diff --git a/drivers/iio/humidity/hts221_buffer.c b/drivers/iio/humidity/hts221_buffer.c
index 1a94b0b91721..dc45667b0364 100644
--- a/drivers/iio/humidity/hts221_buffer.c
+++ b/drivers/iio/humidity/hts221_buffer.c
@@ -156,8 +156,6 @@ static int hts221_buffer_postdisable(struct iio_dev *iio_dev)
 
 static const struct iio_buffer_setup_ops hts221_buffer_ops = {
 	.preenable = hts221_buffer_preenable,
-	.postenable = iio_triggered_buffer_postenable,
-	.predisable = iio_triggered_buffer_predisable,
 	.postdisable = hts221_buffer_postdisable,
 };
 
diff --git a/drivers/iio/iio_core_trigger.h b/drivers/iio/iio_core_trigger.h
index 1fdb1e4ea4a5..a6d6e880a8b8 100644
--- a/drivers/iio/iio_core_trigger.h
+++ b/drivers/iio/iio_core_trigger.h
@@ -21,6 +21,12 @@ void iio_device_register_trigger_consumer(struct iio_dev *indio_dev);
  **/
 void iio_device_unregister_trigger_consumer(struct iio_dev *indio_dev);
 
+
+int iio_trigger_attach_poll_func(struct iio_trigger *trig,
+				 struct iio_poll_func *pf);
+int iio_trigger_detach_poll_func(struct iio_trigger *trig,
+				 struct iio_poll_func *pf);
+
 #else
 
 /**
@@ -40,4 +46,15 @@ static void iio_device_unregister_trigger_consumer(struct iio_dev *indio_dev)
 {
 }
 
+static inline int iio_trigger_attach_poll_func(struct iio_trigger *trig,
+					       struct iio_poll_func *pf)
+{
+	return 0;
+}
+static inline int iio_trigger_detach_poll_func(struct iio_trigger *trig,
+					       struct iio_poll_func *pf)
+{
+	return 0;
+}
+
 #endif /* CONFIG_TRIGGER_CONSUMER */
diff --git a/drivers/iio/industrialio-buffer.c b/drivers/iio/industrialio-buffer.c
index cd5bfe39591b..d8eb534a9544 100644
--- a/drivers/iio/industrialio-buffer.c
+++ b/drivers/iio/industrialio-buffer.c
@@ -24,6 +24,7 @@
 
 #include <linux/iio/iio.h>
 #include "iio_core.h"
+#include "iio_core_trigger.h"
 #include <linux/iio/sysfs.h>
 #include <linux/iio/buffer.h>
 #include <linux/iio/buffer_impl.h>
@@ -961,6 +962,13 @@ static int iio_enable_buffers(struct iio_dev *indio_dev,
 		}
 	}
 
+	if (indio_dev->currentmode == INDIO_BUFFER_TRIGGERED) {
+		ret = iio_trigger_attach_poll_func(indio_dev->trig,
+						   indio_dev->pollfunc);
+		if (ret)
+			goto err_disable_buffers;
+	}
+
 	return 0;
 
 err_disable_buffers:
@@ -987,6 +995,11 @@ static int iio_disable_buffers(struct iio_dev *indio_dev)
 	if (list_empty(&indio_dev->buffer_list))
 		return 0;
 
+	if (indio_dev->currentmode == INDIO_BUFFER_TRIGGERED) {
+		iio_trigger_detach_poll_func(indio_dev->trig,
+					     indio_dev->pollfunc);
+	}
+
 	/*
 	 * If things go wrong at some step in disable we still need to continue
 	 * to perform the other steps, otherwise we leave the device in a
diff --git a/drivers/iio/industrialio-trigger.c b/drivers/iio/industrialio-trigger.c
index ce66699c7fcc..a4dacb638a72 100644
--- a/drivers/iio/industrialio-trigger.c
+++ b/drivers/iio/industrialio-trigger.c
@@ -242,8 +242,8 @@ static void iio_trigger_put_irq(struct iio_trigger *trig, int irq)
  * the relevant function is in there may be the best option.
  */
 /* Worth protecting against double additions? */
-static int iio_trigger_attach_poll_func(struct iio_trigger *trig,
-					struct iio_poll_func *pf)
+int iio_trigger_attach_poll_func(struct iio_trigger *trig,
+				 struct iio_poll_func *pf)
 {
 	int ret = 0;
 	bool notinuse
@@ -290,8 +290,8 @@ static int iio_trigger_attach_poll_func(struct iio_trigger *trig,
 	return ret;
 }
 
-static int iio_trigger_detach_poll_func(struct iio_trigger *trig,
-					 struct iio_poll_func *pf)
+int iio_trigger_detach_poll_func(struct iio_trigger *trig,
+				 struct iio_poll_func *pf)
 {
 	int ret = 0;
 	bool no_other_users
@@ -758,17 +758,3 @@ void iio_device_unregister_trigger_consumer(struct iio_dev *indio_dev)
 	if (indio_dev->trig)
 		iio_trigger_put(indio_dev->trig);
 }
-
-int iio_triggered_buffer_postenable(struct iio_dev *indio_dev)
-{
-	return iio_trigger_attach_poll_func(indio_dev->trig,
-					    indio_dev->pollfunc);
-}
-EXPORT_SYMBOL(iio_triggered_buffer_postenable);
-
-int iio_triggered_buffer_predisable(struct iio_dev *indio_dev)
-{
-	return iio_trigger_detach_poll_func(indio_dev->trig,
-					     indio_dev->pollfunc);
-}
-EXPORT_SYMBOL(iio_triggered_buffer_predisable);
diff --git a/drivers/iio/light/gp2ap020a00f.c b/drivers/iio/light/gp2ap020a00f.c
index 44b13fbcd093..24d4a57b41be 100644
--- a/drivers/iio/light/gp2ap020a00f.c
+++ b/drivers/iio/light/gp2ap020a00f.c
@@ -1423,12 +1423,8 @@ static int gp2ap020a00f_buffer_postenable(struct iio_dev *indio_dev)
 		goto error_unlock;
 
 	data->buffer = kmalloc(indio_dev->scan_bytes, GFP_KERNEL);
-	if (!data->buffer) {
+	if (!data->buffer)
 		err = -ENOMEM;
-		goto error_unlock;
-	}
-
-	err = iio_triggered_buffer_postenable(indio_dev);
 
 error_unlock:
 	mutex_unlock(&data->lock);
@@ -1443,10 +1439,6 @@ static int gp2ap020a00f_buffer_predisable(struct iio_dev *indio_dev)
 
 	mutex_lock(&data->lock);
 
-	err = iio_triggered_buffer_predisable(indio_dev);
-	if (err < 0)
-		goto error_unlock;
-
 	for_each_set_bit(i, indio_dev->active_scan_mask,
 		indio_dev->masklength) {
 		switch (i) {
@@ -1468,7 +1460,6 @@ static int gp2ap020a00f_buffer_predisable(struct iio_dev *indio_dev)
 	if (err == 0)
 		kfree(data->buffer);
 
-error_unlock:
 	mutex_unlock(&data->lock);
 
 	return err;
diff --git a/drivers/iio/light/isl29125.c b/drivers/iio/light/isl29125.c
index ed38edcd5efe..5fdfce92019b 100644
--- a/drivers/iio/light/isl29125.c
+++ b/drivers/iio/light/isl29125.c
@@ -230,10 +230,6 @@ static int isl29125_buffer_predisable(struct iio_dev *indio_dev)
 	struct isl29125_data *data = iio_priv(indio_dev);
 	int ret;
 
-	ret = iio_triggered_buffer_predisable(indio_dev);
-	if (ret < 0)
-		return ret;
-
 	data->conf1 &= ~ISL29125_MODE_MASK;
 	data->conf1 |= ISL29125_MODE_PD;
 	return i2c_smbus_write_byte_data(data->client, ISL29125_CONF1,
@@ -242,7 +238,6 @@ static int isl29125_buffer_predisable(struct iio_dev *indio_dev)
 
 static const struct iio_buffer_setup_ops isl29125_buffer_setup_ops = {
 	.preenable = isl29125_buffer_preenable,
-	.postenable = &iio_triggered_buffer_postenable,
 	.predisable = isl29125_buffer_predisable,
 };
 
diff --git a/drivers/iio/light/rpr0521.c b/drivers/iio/light/rpr0521.c
index ffe9ce798ea2..a700f5fed0d8 100644
--- a/drivers/iio/light/rpr0521.c
+++ b/drivers/iio/light/rpr0521.c
@@ -573,8 +573,6 @@ static int rpr0521_buffer_postdisable(struct iio_dev *indio_dev)
 
 static const struct iio_buffer_setup_ops rpr0521_buffer_setup_ops = {
 	.preenable = rpr0521_buffer_preenable,
-	.postenable = iio_triggered_buffer_postenable,
-	.predisable = iio_triggered_buffer_predisable,
 	.postdisable = rpr0521_buffer_postdisable,
 };
 
diff --git a/drivers/iio/light/si1145.c b/drivers/iio/light/si1145.c
index 76f16f9c7616..8019cc93251e 100644
--- a/drivers/iio/light/si1145.c
+++ b/drivers/iio/light/si1145.c
@@ -1175,8 +1175,6 @@ static bool si1145_validate_scan_mask(struct iio_dev *indio_dev,
 
 static const struct iio_buffer_setup_ops si1145_buffer_setup_ops = {
 	.preenable = si1145_buffer_preenable,
-	.postenable = iio_triggered_buffer_postenable,
-	.predisable = iio_triggered_buffer_predisable,
 	.validate_scan_mask = si1145_validate_scan_mask,
 };
 
diff --git a/drivers/iio/light/st_uvis25_core.c b/drivers/iio/light/st_uvis25_core.c
index 302635836e6b..7ef9c8890522 100644
--- a/drivers/iio/light/st_uvis25_core.c
+++ b/drivers/iio/light/st_uvis25_core.c
@@ -228,8 +228,6 @@ static int st_uvis25_buffer_postdisable(struct iio_dev *iio_dev)
 
 static const struct iio_buffer_setup_ops st_uvis25_buffer_ops = {
 	.preenable = st_uvis25_buffer_preenable,
-	.postenable = iio_triggered_buffer_postenable,
-	.predisable = iio_triggered_buffer_predisable,
 	.postdisable = st_uvis25_buffer_postdisable,
 };
 
diff --git a/drivers/iio/light/tcs3414.c b/drivers/iio/light/tcs3414.c
index 205e5659ce6b..c31ed0c640e9 100644
--- a/drivers/iio/light/tcs3414.c
+++ b/drivers/iio/light/tcs3414.c
@@ -257,10 +257,6 @@ static int tcs3414_buffer_predisable(struct iio_dev *indio_dev)
 	struct tcs3414_data *data = iio_priv(indio_dev);
 	int ret;
 
-	ret = iio_triggered_buffer_predisable(indio_dev);
-	if (ret < 0)
-		return ret;
-
 	data->control &= ~TCS3414_CONTROL_ADC_EN;
 	return i2c_smbus_write_byte_data(data->client, TCS3414_CONTROL,
 		data->control);
@@ -268,7 +264,6 @@ static int tcs3414_buffer_predisable(struct iio_dev *indio_dev)
 
 static const struct iio_buffer_setup_ops tcs3414_buffer_setup_ops = {
 	.preenable = tcs3414_buffer_preenable,
-	.postenable = &iio_triggered_buffer_postenable,
 	.predisable = tcs3414_buffer_predisable,
 };
 
diff --git a/drivers/iio/magnetometer/bmc150_magn.c b/drivers/iio/magnetometer/bmc150_magn.c
index d91cb845e3d6..18f5e5013be4 100644
--- a/drivers/iio/magnetometer/bmc150_magn.c
+++ b/drivers/iio/magnetometer/bmc150_magn.c
@@ -828,8 +828,6 @@ static int bmc150_magn_buffer_postdisable(struct iio_dev *indio_dev)
 
 static const struct iio_buffer_setup_ops bmc150_magn_buffer_setup_ops = {
 	.preenable = bmc150_magn_buffer_preenable,
-	.postenable = iio_triggered_buffer_postenable,
-	.predisable = iio_triggered_buffer_predisable,
 	.postdisable = bmc150_magn_buffer_postdisable,
 };
 
diff --git a/drivers/iio/magnetometer/st_magn_buffer.c b/drivers/iio/magnetometer/st_magn_buffer.c
index 0a9e8fadfa9d..8a934b597acc 100644
--- a/drivers/iio/magnetometer/st_magn_buffer.c
+++ b/drivers/iio/magnetometer/st_magn_buffer.c
@@ -37,25 +37,13 @@ static int st_magn_buffer_preenable(struct iio_dev *indio_dev)
 
 static int st_magn_buffer_postenable(struct iio_dev *indio_dev)
 {
-	int err;
 	struct st_sensor_data *mdata = iio_priv(indio_dev);
 
 	mdata->buffer_data = kmalloc(indio_dev->scan_bytes, GFP_KERNEL);
-	if (mdata->buffer_data == NULL) {
-		err = -ENOMEM;
-		goto allocate_memory_error;
-	}
-
-	err = iio_triggered_buffer_postenable(indio_dev);
-	if (err < 0)
-		goto st_magn_buffer_postenable_error;
-
-	return err;
+	if (mdata->buffer_data == NULL)
+		return -ENOMEM;
 
-st_magn_buffer_postenable_error:
-	kfree(mdata->buffer_data);
-allocate_memory_error:
-	return err;
+	return 0;
 }
 
 static int st_magn_buffer_predisable(struct iio_dev *indio_dev)
@@ -63,13 +51,8 @@ static int st_magn_buffer_predisable(struct iio_dev *indio_dev)
 	int err;
 	struct st_sensor_data *mdata = iio_priv(indio_dev);
 
-	err = iio_triggered_buffer_predisable(indio_dev);
-	if (err < 0)
-		goto st_magn_buffer_predisable_error;
-
 	err = st_sensors_set_enable(indio_dev, false);
 
-st_magn_buffer_predisable_error:
 	kfree(mdata->buffer_data);
 	return err;
 }
diff --git a/drivers/iio/potentiostat/lmp91000.c b/drivers/iio/potentiostat/lmp91000.c
index 85714055cc74..84f9105cbb37 100644
--- a/drivers/iio/potentiostat/lmp91000.c
+++ b/drivers/iio/potentiostat/lmp91000.c
@@ -295,7 +295,6 @@ static int lmp91000_buffer_predisable(struct iio_dev *indio_dev)
 
 static const struct iio_buffer_setup_ops lmp91000_buffer_setup_ops = {
 	.preenable = lmp91000_buffer_preenable,
-	.postenable = iio_triggered_buffer_postenable,
 	.predisable = lmp91000_buffer_predisable,
 };
 
diff --git a/drivers/iio/pressure/st_pressure_buffer.c b/drivers/iio/pressure/st_pressure_buffer.c
index 99468d0a64e7..7eff17e3d87c 100644
--- a/drivers/iio/pressure/st_pressure_buffer.c
+++ b/drivers/iio/pressure/st_pressure_buffer.c
@@ -37,25 +37,13 @@ static int st_press_buffer_preenable(struct iio_dev *indio_dev)
 
 static int st_press_buffer_postenable(struct iio_dev *indio_dev)
 {
-	int err;
 	struct st_sensor_data *press_data = iio_priv(indio_dev);
 
 	press_data->buffer_data = kmalloc(indio_dev->scan_bytes, GFP_KERNEL);
-	if (press_data->buffer_data == NULL) {
-		err = -ENOMEM;
-		goto allocate_memory_error;
-	}
-
-	err = iio_triggered_buffer_postenable(indio_dev);
-	if (err < 0)
-		goto st_press_buffer_postenable_error;
-
-	return err;
+	if (press_data->buffer_data == NULL)
+		return -ENOMEM;
 
-st_press_buffer_postenable_error:
-	kfree(press_data->buffer_data);
-allocate_memory_error:
-	return err;
+	return 0;
 }
 
 static int st_press_buffer_predisable(struct iio_dev *indio_dev)
@@ -63,14 +51,9 @@ static int st_press_buffer_predisable(struct iio_dev *indio_dev)
 	int err;
 	struct st_sensor_data *press_data = iio_priv(indio_dev);
 
-	err = iio_triggered_buffer_predisable(indio_dev);
-	if (err < 0)
-		goto st_press_buffer_predisable_error;
-
 	err = st_sensors_set_enable(indio_dev, false);
 
-st_press_buffer_predisable_error:
-	kfree(press_data->buffer_data);
+	kfree(pdata->buffer_data);
 	return err;
 }
 
diff --git a/drivers/iio/pressure/zpa2326.c b/drivers/iio/pressure/zpa2326.c
index 81d8f24eaeb4..2c4295087a36 100644
--- a/drivers/iio/pressure/zpa2326.c
+++ b/drivers/iio/pressure/zpa2326.c
@@ -1271,11 +1271,6 @@ static int zpa2326_postenable_buffer(struct iio_dev *indio_dev)
 			goto err;
 	}
 
-	/* Plug our own trigger event handler. */
-	err = iio_triggered_buffer_postenable(indio_dev);
-	if (err)
-		goto err;
-
 	return 0;
 
 err:
@@ -1294,7 +1289,6 @@ static int zpa2326_postdisable_buffer(struct iio_dev *indio_dev)
 static const struct iio_buffer_setup_ops zpa2326_buffer_setup_ops = {
 	.preenable   = zpa2326_preenable_buffer,
 	.postenable  = zpa2326_postenable_buffer,
-	.predisable  = iio_triggered_buffer_predisable,
 	.postdisable = zpa2326_postdisable_buffer
 };
 
diff --git a/drivers/iio/proximity/sx9500.c b/drivers/iio/proximity/sx9500.c
index ff80409e0c44..73335e61b350 100644
--- a/drivers/iio/proximity/sx9500.c
+++ b/drivers/iio/proximity/sx9500.c
@@ -707,8 +707,6 @@ static int sx9500_buffer_predisable(struct iio_dev *indio_dev)
 	struct sx9500_data *data = iio_priv(indio_dev);
 	int ret = 0, i;
 
-	iio_triggered_buffer_predisable(indio_dev);
-
 	mutex_lock(&data->mutex);
 
 	for (i = 0; i < SX9500_NUM_CHANNELS; i++)
@@ -730,7 +728,6 @@ static int sx9500_buffer_predisable(struct iio_dev *indio_dev)
 
 static const struct iio_buffer_setup_ops sx9500_buffer_setup_ops = {
 	.preenable = sx9500_buffer_preenable,
-	.postenable = iio_triggered_buffer_postenable,
 	.predisable = sx9500_buffer_predisable,
 };
 
diff --git a/drivers/staging/iio/meter/ade7758_ring.c b/drivers/staging/iio/meter/ade7758_ring.c
index 6d7444d6e880..c1423de43587 100644
--- a/drivers/staging/iio/meter/ade7758_ring.c
+++ b/drivers/staging/iio/meter/ade7758_ring.c
@@ -98,8 +98,6 @@ static int ade7758_ring_preenable(struct iio_dev *indio_dev)
 
 static const struct iio_buffer_setup_ops ade7758_ring_setup_ops = {
 	.preenable = &ade7758_ring_preenable,
-	.postenable = &iio_triggered_buffer_postenable,
-	.predisable = &iio_triggered_buffer_predisable,
 	.validate_scan_mask = &iio_validate_scan_mask_onehot,
 };
 
diff --git a/include/linux/iio/trigger_consumer.h b/include/linux/iio/trigger_consumer.h
index c4f8c7409666..1d3be3a19e76 100644
--- a/include/linux/iio/trigger_consumer.h
+++ b/include/linux/iio/trigger_consumer.h
@@ -53,11 +53,4 @@ irqreturn_t iio_pollfunc_store_time(int irq, void *p);
 
 void iio_trigger_notify_done(struct iio_trigger *trig);
 
-/*
- * Two functions for common case where all that happens is a pollfunc
- * is attached and detached from a trigger
- */
-int iio_triggered_buffer_postenable(struct iio_dev *indio_dev);
-int iio_triggered_buffer_predisable(struct iio_dev *indio_dev);
-
 #endif
-- 
2.17.1

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH][RFC] iio: Move attach/detach of the poll func to the core
  2018-06-22 13:53 [PATCH][RFC] iio: Move attach/detach of the poll func to the core Alexandru Ardelean
@ 2018-11-03 18:19 ` Jonathan Cameron
  2018-11-09 10:03   ` Ardelean, Alexandru
  0 siblings, 1 reply; 5+ messages in thread
From: Jonathan Cameron @ 2018-11-03 18:19 UTC (permalink / raw)
  To: Alexandru Ardelean
  Cc: linux-iio, lars, Jack Andersen, Fabrice Gasnier, Matt Ranostay,
	Sanchayan Maity, Bhuvanchandra DV

On Fri, 22 Jun 2018 16:53:22 +0300
Alexandru Ardelean <alexandru.ardelean@analog.com> wrote:

> All devices using a triggered buffer need to attach and detach the trigger
> to the device in order to properly work. Instead of doing this in each and
> every driver by hand move this into the core.
> 
> Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
> Signed-off-by: Alexandru Ardelean <alexandru.ardelean@analog.com>

> ---
> 
> Note: `Signed-off-by` is also Lars-Peter Clausen because he is the
> original author of this patch [on an older kernel].
> The patch has been updated since the original patch from Lars.
> 
> There has been a (small) discussion about whether such a patch makes
> sense to implement (for reducing code duplication), or whether it's too
> risky to do it.
> 
> The reason for the risky-ness is that there is no consistent way in which
> drivers attach/detach the poll function.
> i.e.
>    1. some drivers call `iio_triggered_buffer_postenable()` before doing HW
>       stuff, some after (for attaching the poll func)
>    2. similarly, for `iio_triggered_buffer_predisable()` some drivers do it
>       before HW stuff, some after (for detaching the poll func)
> 
> Common sense would dictate that (in the case of
> `iio_triggered_buffer_postenable()`) there would normally be HW setup first
> and then attach the poll func.
> And the reverse done for `iio_triggered_buffer_predisable()`.
I'm sure I once had the flow around this all well laid out, but I really
can't recall what it was and it was all tied around trying to do the
buffer enable as lockless as possible. Years ago Lars pointed out that
was impossible so a lot of the logic has been messed up since then.

Anyhow, I've put this off long enough (sorry about that - just new it
was going to involve some head scratching!)  Crucially I have another
plan.  Figure out which drivers this actually makes a difference to
and thankfully in most cases the author is still active :)


> 
> However, it's unclear whether this reasoning is completely sound for all
> drivers.
> 
> Hence this RFC.

I've culled the cases that are obvious.  Either just the defaults or
where we do the calls at the end of enable and start of disable.

In those there is no ordering change.

There are some odd ones
gp2ap020a00f does it under a lock. Which makes no difference.
isl29125 totally missbalanced so the preenable does things undone in the
   predisable.  I wonder if anyone has one to allow us to test cleaning
   that up. No flow change due to this patch though so fine.
tcs3414 is much the same as the isl29125.
lmp91000?? Is about all I can say on that.  It detaches a poll function that
was never attached.

Anyhow, so what's left (hopefully we haven't had any crazies since
you posted this patch. I'll check at somepoint)

>  drivers/iio/adc/ad_sigma_delta.c              |  5 ----
I'll assume you are fine with that one ;)

>  drivers/iio/adc/dln2-adc.c                    |  4 +--
+ CC Jack Anderson (worst comes to the worst I have one of these and can
     run basic tests).

>  drivers/iio/adc/stm32-adc.c                   | 11 --------
+ CC Fabrice

>  drivers/iio/adc/vf610_adc.c                   |  6 +----
+ CC Sanchayan who might still have access to one of these
+ Bhuvanchanda who fixed a bug not so long ago...

>  drivers/iio/chemical/atlas-ph-sensor.c        |  8 ------
+ CC Matt who is definitely still contactable as I met him last week ;)

>  drivers/iio/potentiostat/lmp91000.c           |  1 -
Another of Matt's.  On this one, I'm not sure who it attaches
the pollfunc in the first place.  I may be going crazy however, so
over to Matt to point out what I'm missing.

So the actual change that matters is:

> diff --git a/drivers/iio/industrialio-buffer.c b/drivers/iio/industrialio-buffer.c
> index cd5bfe39591b..d8eb534a9544 100644
> --- a/drivers/iio/industrialio-buffer.c
> +++ b/drivers/iio/industrialio-buffer.c
> @@ -24,6 +24,7 @@
>  
>  #include <linux/iio/iio.h>
>  #include "iio_core.h"
> +#include "iio_core_trigger.h"
>  #include <linux/iio/sysfs.h>
>  #include <linux/iio/buffer.h>
>  #include <linux/iio/buffer_impl.h>
> @@ -961,6 +962,13 @@ static int iio_enable_buffers(struct iio_dev *indio_dev,
>  		}
>  	}
>  
> +	if (indio_dev->currentmode == INDIO_BUFFER_TRIGGERED) {
> +		ret = iio_trigger_attach_poll_func(indio_dev->trig,
> +						   indio_dev->pollfunc);
> +		if (ret)
> +			goto err_disable_buffers;
> +	}
> +
This is immediately after the postenable call.

>  	return 0;
>  
>  err_disable_buffers:
> @@ -987,6 +995,11 @@ static int iio_disable_buffers(struct iio_dev *indio_dev)
>  	if (list_empty(&indio_dev->buffer_list))
>  		return 0;
>  

This is immediately before the predisable call.

> +	if (indio_dev->currentmode == INDIO_BUFFER_TRIGGERED) {
> +		iio_trigger_detach_poll_func(indio_dev->trig,
> +					     indio_dev->pollfunc);
> +	}
> +
>  	/*
>  	 * If things go wrong at some step in disable we still need to continue
>  	 * to perform the other steps, otherwise we leave the device in a
> diff --git a/drivers/iio/industrialio-trigger.c b/drivers/iio/industrialio-trigger.c
> index ce66699c7fcc..a4dacb638a72 100644
> --- a/drivers/iio/industrialio-trigger.c
> +++ b/drivers/iio/industrialio-trigger.c
> @@ -242,8 +242,8 @@ static void iio_trigger_put_irq(struct iio_trigger *trig, int irq)
>   * the relevant function is in there may be the best option.
>   */
>  /* Worth protecting against double additions? */
> -static int iio_trigger_attach_poll_func(struct iio_trigger *trig,
> -					struct iio_poll_func *pf)
> +int iio_trigger_attach_poll_func(struct iio_trigger *trig,
> +				 struct iio_poll_func *pf)
>  {
>  	int ret = 0;
>  	bool notinuse
> @@ -290,8 +290,8 @@ static int iio_trigger_attach_poll_func(struct iio_trigger *trig,
>  	return ret;
>  }
>  
> -static int iio_trigger_detach_poll_func(struct iio_trigger *trig,
> -					 struct iio_poll_func *pf)
> +int iio_trigger_detach_poll_func(struct iio_trigger *trig,
> +				 struct iio_poll_func *pf)
>  {
>  	int ret = 0;
>  	bool no_other_users
> @@ -758,17 +758,3 @@ void iio_device_unregister_trigger_consumer(struct iio_dev *indio_dev)
>  	if (indio_dev->trig)
>  		iio_trigger_put(indio_dev->trig);
>  }
> -
> -int iio_triggered_buffer_postenable(struct iio_dev *indio_dev)
> -{
> -	return iio_trigger_attach_poll_func(indio_dev->trig,
> -					    indio_dev->pollfunc);
> -}
> -EXPORT_SYMBOL(iio_triggered_buffer_postenable);
> -
> -int iio_triggered_buffer_predisable(struct iio_dev *indio_dev)
> -{
> -	return iio_trigger_detach_poll_func(indio_dev->trig,
> -					     indio_dev->pollfunc);
> -}
> -EXPORT_SYMBOL(iio_triggered_buffer_predisable);




> diff --git a/drivers/iio/adc/ad_sigma_delta.c b/drivers/iio/adc/ad_sigma_delta.c
> index cf1b048b0665..ef046277bf7b 100644
> --- a/drivers/iio/adc/ad_sigma_delta.c
> +++ b/drivers/iio/adc/ad_sigma_delta.c
> @@ -338,10 +338,6 @@ static int ad_sd_buffer_postenable(struct iio_dev *indio_dev)
>  	unsigned int channel;
>  	int ret;
>  
> -	ret = iio_triggered_buffer_postenable(indio_dev);
> -	if (ret < 0)
> -		return ret;
> -
Here is one where the ordering actually changes. I'm going to hope you concluded
this one was fine ;)

>  	channel = find_first_bit(indio_dev->active_scan_mask,
>  				 indio_dev->masklength);
>  	ret = ad_sigma_delta_set_channel(sigma_delta,
> @@ -426,7 +422,6 @@ static irqreturn_t ad_sd_trigger_handler(int irq, void *p)
>  
>  static const struct iio_buffer_setup_ops ad_sd_buffer_setup_ops = {
>  	.postenable = &ad_sd_buffer_postenable,
> -	.predisable = &iio_triggered_buffer_predisable,
>  	.postdisable = &ad_sd_buffer_postdisable,
>  	.validate_scan_mask = &iio_validate_scan_mask_onehot,
>  };
> diff --git a/drivers/iio/adc/dln2-adc.c b/drivers/iio/adc/dln2-adc.c
> index c64c6675cae6..51135e7c0d4f 100644
> --- a/drivers/iio/adc/dln2-adc.c
> +++ b/drivers/iio/adc/dln2-adc.c
> @@ -560,7 +560,7 @@ static int dln2_adc_triggered_buffer_postenable(struct iio_dev *indio_dev)
>  		mutex_unlock(&dln2->mutex);
>  	}
>  
> -	return iio_triggered_buffer_postenable(indio_dev);
> +	return 0;
>  }
>  
>  static int dln2_adc_triggered_buffer_predisable(struct iio_dev *indio_dev)
> @@ -585,7 +585,7 @@ static int dln2_adc_triggered_buffer_predisable(struct iio_dev *indio_dev)
>  		return ret;
>  	}
>  
> -	return iio_triggered_buffer_predisable(indio_dev);

An unbalanced one.  Postenable is fine but presdisable.  Who knows..

> +	return 0;
>  }
>  
> diff --git a/drivers/iio/adc/stm32-adc.c b/drivers/iio/adc/stm32-adc.c
> index 378411853d75..ce0d17c03d7e 100644
> --- a/drivers/iio/adc/stm32-adc.c
> +++ b/drivers/iio/adc/stm32-adc.c
> @@ -1482,10 +1482,6 @@ static int stm32_adc_buffer_postenable(struct iio_dev *indio_dev)
>  		goto err_clr_trig;
>  	}
>  
> -	ret = iio_triggered_buffer_postenable(indio_dev);
> -	if (ret < 0)
> -		goto err_stop_dma;
> -
>  	/* Reset adc buffer index */
>  	adc->bufi = 0;
>  
> @@ -1496,9 +1492,6 @@ static int stm32_adc_buffer_postenable(struct iio_dev *indio_dev)
>  
>  	return 0;
>  
> -err_stop_dma:
> -	if (adc->dma_chan)
> -		dmaengine_terminate_all(adc->dma_chan);
>  err_clr_trig:
>  	stm32_adc_set_trig(indio_dev, NULL);
>  err_unprepare:
> @@ -1517,10 +1510,6 @@ static int stm32_adc_buffer_predisable(struct iio_dev *indio_dev)
>  	if (!adc->dma_chan)
>  		stm32_adc_conv_irq_disable(adc);
>  
> -	ret = iio_triggered_buffer_predisable(indio_dev);
> -	if (ret < 0)
> -		dev_err(&indio_dev->dev, "predisable failed\n");
> -
>  	if (adc->dma_chan)
>  		dmaengine_terminate_all(adc->dma_chan);
>  

> diff --git a/drivers/iio/adc/vf610_adc.c b/drivers/iio/adc/vf610_adc.c
> index bbcb7a4d7edf..3a15b98cfd39 100644
> --- a/drivers/iio/adc/vf610_adc.c
> +++ b/drivers/iio/adc/vf610_adc.c
> @@ -740,10 +740,6 @@ static int vf610_adc_buffer_postenable(struct iio_dev *indio_dev)
>  	int ret;
>  	int val;
>  
> -	ret = iio_triggered_buffer_postenable(indio_dev);
> -	if (ret)
> -		return ret;
> -
>  	val = readl(info->regs + VF610_REG_ADC_GC);
>  	val |= VF610_ADC_ADCON;
>  	writel(val, info->regs + VF610_REG_ADC_GC);
> @@ -774,7 +770,7 @@ static int vf610_adc_buffer_predisable(struct iio_dev *indio_dev)
>  
>  	writel(hc_cfg, info->regs + VF610_REG_ADC_HC0);
>  
> -	return iio_triggered_buffer_predisable(indio_dev);
> +	return 0;
>  }
>  
>  static const struct iio_buffer_setup_ops iio_triggered_buffer_setup_ops = {


> diff --git a/drivers/iio/chemical/atlas-ph-sensor.c b/drivers/iio/chemical/atlas-ph-sensor.c
> index a406ad31b096..8fed75f9e95d 100644
> --- a/drivers/iio/chemical/atlas-ph-sensor.c
> +++ b/drivers/iio/chemical/atlas-ph-sensor.c
> @@ -305,10 +305,6 @@ static int atlas_buffer_postenable(struct iio_dev *indio_dev)
>  	struct atlas_data *data = iio_priv(indio_dev);
>  	int ret;
>  
> -	ret = iio_triggered_buffer_postenable(indio_dev);
> -	if (ret)
> -		return ret;
> -
>  	ret = pm_runtime_get_sync(&data->client->dev);
>  	if (ret < 0) {
>  		pm_runtime_put_noidle(&data->client->dev);
> @@ -323,10 +319,6 @@ static int atlas_buffer_predisable(struct iio_dev *indio_dev)
>  	struct atlas_data *data = iio_priv(indio_dev);
>  	int ret;
>  
> -	ret = iio_triggered_buffer_predisable(indio_dev);
> -	if (ret)
> -		return ret;
> -
>  	ret = atlas_set_interrupt(data, false);
>  	if (ret)
>  		return ret;

> diff --git a/drivers/iio/potentiostat/lmp91000.c b/drivers/iio/potentiostat/lmp91000.c
> index 85714055cc74..84f9105cbb37 100644
> --- a/drivers/iio/potentiostat/lmp91000.c
> +++ b/drivers/iio/potentiostat/lmp91000.c
> @@ -295,7 +295,6 @@ static int lmp91000_buffer_predisable(struct iio_dev *indio_dev)
>  
>  static const struct iio_buffer_setup_ops lmp91000_buffer_setup_ops = {
>  	.preenable = lmp91000_buffer_preenable,
> -	.postenable = iio_triggered_buffer_postenable,
A resounding ??? 
>  	.predisable = lmp91000_buffer_predisable,
>  };
>  

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH][RFC] iio: Move attach/detach of the poll func to the core
  2018-11-03 18:19 ` Jonathan Cameron
@ 2018-11-09 10:03   ` Ardelean, Alexandru
  2018-11-09 10:44     ` Fabrice Gasnier
  0 siblings, 1 reply; 5+ messages in thread
From: Ardelean, Alexandru @ 2018-11-09 10:03 UTC (permalink / raw)
  To: jic23
  Cc: lars, jackoalan, linux-iio, fabrice.gasnier, maitysanchayan,
	bhuvanchandra.dv, matt.ranostay

T24gU2F0LCAyMDE4LTExLTAzIGF0IDE4OjE5ICswMDAwLCBKb25hdGhhbiBDYW1lcm9uIHdyb3Rl
Og0KPiBPbiBGcmksIDIyIEp1biAyMDE4IDE2OjUzOjIyICswMzAwDQo+IEFsZXhhbmRydSBBcmRl
bGVhbiA8YWxleGFuZHJ1LmFyZGVsZWFuQGFuYWxvZy5jb20+IHdyb3RlOg0KDQpIZXksDQoNClRo
YW5rcyBmb3IgdGFraW5nIHRoZSB0aW1lIGZvciB0aGlzLCBKb25hdGhhbi4NCg0KPiANCj4gPiBB
bGwgZGV2aWNlcyB1c2luZyBhIHRyaWdnZXJlZCBidWZmZXIgbmVlZCB0byBhdHRhY2ggYW5kIGRl
dGFjaCB0aGUNCj4gPiB0cmlnZ2VyDQo+ID4gdG8gdGhlIGRldmljZSBpbiBvcmRlciB0byBwcm9w
ZXJseSB3b3JrLiBJbnN0ZWFkIG9mIGRvaW5nIHRoaXMgaW4gZWFjaA0KPiA+IGFuZA0KPiA+IGV2
ZXJ5IGRyaXZlciBieSBoYW5kIG1vdmUgdGhpcyBpbnRvIHRoZSBjb3JlLg0KPiA+IA0KPiA+IFNp
Z25lZC1vZmYtYnk6IExhcnMtUGV0ZXIgQ2xhdXNlbiA8bGFyc0BtZXRhZm9vLmRlPg0KPiA+IFNp
Z25lZC1vZmYtYnk6IEFsZXhhbmRydSBBcmRlbGVhbiA8YWxleGFuZHJ1LmFyZGVsZWFuQGFuYWxv
Zy5jb20+DQo+ID4gLS0tDQo+ID4gDQo+ID4gTm90ZTogYFNpZ25lZC1vZmYtYnlgIGlzIGFsc28g
TGFycy1QZXRlciBDbGF1c2VuIGJlY2F1c2UgaGUgaXMgdGhlDQo+ID4gb3JpZ2luYWwgYXV0aG9y
IG9mIHRoaXMgcGF0Y2ggW29uIGFuIG9sZGVyIGtlcm5lbF0uDQo+ID4gVGhlIHBhdGNoIGhhcyBi
ZWVuIHVwZGF0ZWQgc2luY2UgdGhlIG9yaWdpbmFsIHBhdGNoIGZyb20gTGFycy4NCj4gPiANCj4g
PiBUaGVyZSBoYXMgYmVlbiBhIChzbWFsbCkgZGlzY3Vzc2lvbiBhYm91dCB3aGV0aGVyIHN1Y2gg
YSBwYXRjaCBtYWtlcw0KPiA+IHNlbnNlIHRvIGltcGxlbWVudCAoZm9yIHJlZHVjaW5nIGNvZGUg
ZHVwbGljYXRpb24pLCBvciB3aGV0aGVyIGl0J3MgdG9vDQo+ID4gcmlza3kgdG8gZG8gaXQuDQo+
ID4gDQo+ID4gVGhlIHJlYXNvbiBmb3IgdGhlIHJpc2t5LW5lc3MgaXMgdGhhdCB0aGVyZSBpcyBu
byBjb25zaXN0ZW50IHdheSBpbg0KPiA+IHdoaWNoDQo+ID4gZHJpdmVycyBhdHRhY2gvZGV0YWNo
IHRoZSBwb2xsIGZ1bmN0aW9uLg0KPiA+IGkuZS4NCj4gPiAgICAxLiBzb21lIGRyaXZlcnMgY2Fs
bCBgaWlvX3RyaWdnZXJlZF9idWZmZXJfcG9zdGVuYWJsZSgpYCBiZWZvcmUNCj4gPiBkb2luZyBI
Vw0KPiA+ICAgICAgIHN0dWZmLCBzb21lIGFmdGVyIChmb3IgYXR0YWNoaW5nIHRoZSBwb2xsIGZ1
bmMpDQo+ID4gICAgMi4gc2ltaWxhcmx5LCBmb3IgYGlpb190cmlnZ2VyZWRfYnVmZmVyX3ByZWRp
c2FibGUoKWAgc29tZSBkcml2ZXJzDQo+ID4gZG8gaXQNCj4gPiAgICAgICBiZWZvcmUgSFcgc3R1
ZmYsIHNvbWUgYWZ0ZXIgKGZvciBkZXRhY2hpbmcgdGhlIHBvbGwgZnVuYykNCj4gPiANCj4gPiBD
b21tb24gc2Vuc2Ugd291bGQgZGljdGF0ZSB0aGF0IChpbiB0aGUgY2FzZSBvZg0KPiA+IGBpaW9f
dHJpZ2dlcmVkX2J1ZmZlcl9wb3N0ZW5hYmxlKClgKSB0aGVyZSB3b3VsZCBub3JtYWxseSBiZSBI
VyBzZXR1cA0KPiA+IGZpcnN0DQo+ID4gYW5kIHRoZW4gYXR0YWNoIHRoZSBwb2xsIGZ1bmMuDQo+
ID4gQW5kIHRoZSByZXZlcnNlIGRvbmUgZm9yIGBpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9wcmVkaXNh
YmxlKClgLg0KPiANCj4gSSdtIHN1cmUgSSBvbmNlIGhhZCB0aGUgZmxvdyBhcm91bmQgdGhpcyBh
bGwgd2VsbCBsYWlkIG91dCwgYnV0IEkgcmVhbGx5DQo+IGNhbid0IHJlY2FsbCB3aGF0IGl0IHdh
cyBhbmQgaXQgd2FzIGFsbCB0aWVkIGFyb3VuZCB0cnlpbmcgdG8gZG8gdGhlDQo+IGJ1ZmZlciBl
bmFibGUgYXMgbG9ja2xlc3MgYXMgcG9zc2libGUuIFllYXJzIGFnbyBMYXJzIHBvaW50ZWQgb3V0
IHRoYXQNCj4gd2FzIGltcG9zc2libGUgc28gYSBsb3Qgb2YgdGhlIGxvZ2ljIGhhcyBiZWVuIG1l
c3NlZCB1cCBzaW5jZSB0aGVuLg0KPiANCj4gQW55aG93LCBJJ3ZlIHB1dCB0aGlzIG9mZiBsb25n
IGVub3VnaCAoc29ycnkgYWJvdXQgdGhhdCAtIGp1c3QgbmV3IGl0DQo+IHdhcyBnb2luZyB0byBp
bnZvbHZlIHNvbWUgaGVhZCBzY3JhdGNoaW5nISkgIENydWNpYWxseSBJIGhhdmUgYW5vdGhlcg0K
PiBwbGFuLiAgRmlndXJlIG91dCB3aGljaCBkcml2ZXJzIHRoaXMgYWN0dWFsbHkgbWFrZXMgYSBk
aWZmZXJlbmNlIHRvDQo+IGFuZCB0aGFua2Z1bGx5IGluIG1vc3QgY2FzZXMgdGhlIGF1dGhvciBp
cyBzdGlsbCBhY3RpdmUgOikNCj4gDQo+IA0KPiA+IA0KPiA+IEhvd2V2ZXIsIGl0J3MgdW5jbGVh
ciB3aGV0aGVyIHRoaXMgcmVhc29uaW5nIGlzIGNvbXBsZXRlbHkgc291bmQgZm9yDQo+ID4gYWxs
DQo+ID4gZHJpdmVycy4NCj4gPiANCj4gPiBIZW5jZSB0aGlzIFJGQy4NCj4gDQo+IEkndmUgY3Vs
bGVkIHRoZSBjYXNlcyB0aGF0IGFyZSBvYnZpb3VzLiAgRWl0aGVyIGp1c3QgdGhlIGRlZmF1bHRz
IG9yDQo+IHdoZXJlIHdlIGRvIHRoZSBjYWxscyBhdCB0aGUgZW5kIG9mIGVuYWJsZSBhbmQgc3Rh
cnQgb2YgZGlzYWJsZS4NCj4gDQo+IEluIHRob3NlIHRoZXJlIGlzIG5vIG9yZGVyaW5nIGNoYW5n
ZS4NCj4gDQo+IFRoZXJlIGFyZSBzb21lIG9kZCBvbmVzDQo+IGdwMmFwMDIwYTAwZiBkb2VzIGl0
IHVuZGVyIGEgbG9jay4gV2hpY2ggbWFrZXMgbm8gZGlmZmVyZW5jZS4NCj4gaXNsMjkxMjUgdG90
YWxseSBtaXNzYmFsYW5jZWQgc28gdGhlIHByZWVuYWJsZSBkb2VzIHRoaW5ncyB1bmRvbmUgaW4g
dGhlDQo+ICAgIHByZWRpc2FibGUuICBJIHdvbmRlciBpZiBhbnlvbmUgaGFzIG9uZSB0byBhbGxv
dyB1cyB0byB0ZXN0IGNsZWFuaW5nDQo+ICAgIHRoYXQgdXAuIE5vIGZsb3cgY2hhbmdlIGR1ZSB0
byB0aGlzIHBhdGNoIHRob3VnaCBzbyBmaW5lLg0KPiB0Y3MzNDE0IGlzIG11Y2ggdGhlIHNhbWUg
YXMgdGhlIGlzbDI5MTI1Lg0KPiBsbXA5MTAwMD8/IElzIGFib3V0IGFsbCBJIGNhbiBzYXkgb24g
dGhhdC4gIEl0IGRldGFjaGVzIGEgcG9sbCBmdW5jdGlvbg0KPiB0aGF0DQo+IHdhcyBuZXZlciBh
dHRhY2hlZC4NCj4gDQo+IEFueWhvdywgc28gd2hhdCdzIGxlZnQgKGhvcGVmdWxseSB3ZSBoYXZl
bid0IGhhZCBhbnkgY3JhemllcyBzaW5jZQ0KPiB5b3UgcG9zdGVkIHRoaXMgcGF0Y2guIEknbGwg
Y2hlY2sgYXQgc29tZXBvaW50KQ0KPiANCj4gPiAgZHJpdmVycy9paW8vYWRjL2FkX3NpZ21hX2Rl
bHRhLmMgICAgICAgICAgICAgIHwgIDUgLS0tLQ0KPiANCj4gSSdsbCBhc3N1bWUgeW91IGFyZSBm
aW5lIHdpdGggdGhhdCBvbmUgOykNCj4gDQo+ID4gIGRyaXZlcnMvaWlvL2FkYy9kbG4yLWFkYy5j
ICAgICAgICAgICAgICAgICAgICB8ICA0ICstLQ0KPiANCj4gKyBDQyBKYWNrIEFuZGVyc29uICh3
b3JzdCBjb21lcyB0byB0aGUgd29yc3QgSSBoYXZlIG9uZSBvZiB0aGVzZSBhbmQgY2FuDQo+ICAg
ICAgcnVuIGJhc2ljIHRlc3RzKS4NCj4gDQo+ID4gIGRyaXZlcnMvaWlvL2FkYy9zdG0zMi1hZGMu
YyAgICAgICAgICAgICAgICAgICB8IDExIC0tLS0tLS0tDQo+IA0KPiArIENDIEZhYnJpY2UNCj4g
DQo+ID4gIGRyaXZlcnMvaWlvL2FkYy92ZjYxMF9hZGMuYyAgICAgICAgICAgICAgICAgICB8ICA2
ICstLS0tDQo+IA0KPiArIENDIFNhbmNoYXlhbiB3aG8gbWlnaHQgc3RpbGwgaGF2ZSBhY2Nlc3Mg
dG8gb25lIG9mIHRoZXNlDQo+ICsgQmh1dmFuY2hhbmRhIHdobyBmaXhlZCBhIGJ1ZyBub3Qgc28g
bG9uZyBhZ28uLi4NCj4gDQo+ID4gIGRyaXZlcnMvaWlvL2NoZW1pY2FsL2F0bGFzLXBoLXNlbnNv
ci5jICAgICAgICB8ICA4IC0tLS0tLQ0KPiANCj4gKyBDQyBNYXR0IHdobyBpcyBkZWZpbml0ZWx5
IHN0aWxsIGNvbnRhY3RhYmxlIGFzIEkgbWV0IGhpbSBsYXN0IHdlZWsgOykNCj4gDQo+ID4gIGRy
aXZlcnMvaWlvL3BvdGVudGlvc3RhdC9sbXA5MTAwMC5jICAgICAgICAgICB8ICAxIC0NCj4gDQo+
IEFub3RoZXIgb2YgTWF0dCdzLiAgT24gdGhpcyBvbmUsIEknbSBub3Qgc3VyZSB3aG8gaXQgYXR0
YWNoZXMNCj4gdGhlIHBvbGxmdW5jIGluIHRoZSBmaXJzdCBwbGFjZS4gIEkgbWF5IGJlIGdvaW5n
IGNyYXp5IGhvd2V2ZXIsIHNvDQo+IG92ZXIgdG8gTWF0dCB0byBwb2ludCBvdXQgd2hhdCBJJ20g
bWlzc2luZy4NCj4gDQo+IFNvIHRoZSBhY3R1YWwgY2hhbmdlIHRoYXQgbWF0dGVycyBpczoNCj4g
DQo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2luZHVzdHJpYWxpby1idWZmZXIuYw0KPiA+
IGIvZHJpdmVycy9paW8vaW5kdXN0cmlhbGlvLWJ1ZmZlci5jDQo+ID4gaW5kZXggY2Q1YmZlMzk1
OTFiLi5kOGViNTM0YTk1NDQgMTAwNjQ0DQo+ID4gLS0tIGEvZHJpdmVycy9paW8vaW5kdXN0cmlh
bGlvLWJ1ZmZlci5jDQo+ID4gKysrIGIvZHJpdmVycy9paW8vaW5kdXN0cmlhbGlvLWJ1ZmZlci5j
DQo+ID4gQEAgLTI0LDYgKzI0LDcgQEANCj4gPiAgDQo+ID4gICNpbmNsdWRlIDxsaW51eC9paW8v
aWlvLmg+DQo+ID4gICNpbmNsdWRlICJpaW9fY29yZS5oIg0KPiA+ICsjaW5jbHVkZSAiaWlvX2Nv
cmVfdHJpZ2dlci5oIg0KPiA+ICAjaW5jbHVkZSA8bGludXgvaWlvL3N5c2ZzLmg+DQo+ID4gICNp
bmNsdWRlIDxsaW51eC9paW8vYnVmZmVyLmg+DQo+ID4gICNpbmNsdWRlIDxsaW51eC9paW8vYnVm
ZmVyX2ltcGwuaD4NCj4gPiBAQCAtOTYxLDYgKzk2MiwxMyBAQCBzdGF0aWMgaW50IGlpb19lbmFi
bGVfYnVmZmVycyhzdHJ1Y3QgaWlvX2Rldg0KPiA+ICppbmRpb19kZXYsDQo+ID4gIAkJfQ0KPiA+
ICAJfQ0KPiA+ICANCj4gPiArCWlmIChpbmRpb19kZXYtPmN1cnJlbnRtb2RlID09IElORElPX0JV
RkZFUl9UUklHR0VSRUQpIHsNCj4gPiArCQlyZXQgPSBpaW9fdHJpZ2dlcl9hdHRhY2hfcG9sbF9m
dW5jKGluZGlvX2Rldi0+dHJpZywNCj4gPiArCQkJCQkJICAgaW5kaW9fZGV2LT5wb2xsZnVuYyk7
DQo+ID4gKwkJaWYgKHJldCkNCj4gPiArCQkJZ290byBlcnJfZGlzYWJsZV9idWZmZXJzOw0KPiA+
ICsJfQ0KPiA+ICsNCj4gDQo+IFRoaXMgaXMgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHBvc3RlbmFi
bGUgY2FsbC4NCj4gDQoNCkknbSB2YWd1ZSBoZXJlIGFib3V0IHlvdXIgY29tbWVudC4NCkRvIEkg
bmVlZCB0byBjaGFuZ2Ugc29tZXRoaW5nID8NCg0KPiA+ICAJcmV0dXJuIDA7DQo+ID4gIA0KPiA+
ICBlcnJfZGlzYWJsZV9idWZmZXJzOg0KPiA+IEBAIC05ODcsNiArOTk1LDExIEBAIHN0YXRpYyBp
bnQgaWlvX2Rpc2FibGVfYnVmZmVycyhzdHJ1Y3QgaWlvX2Rldg0KPiA+ICppbmRpb19kZXYpDQo+
ID4gIAlpZiAobGlzdF9lbXB0eSgmaW5kaW9fZGV2LT5idWZmZXJfbGlzdCkpDQo+ID4gIAkJcmV0
dXJuIDA7DQo+ID4gIA0KPiANCj4gVGhpcyBpcyBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIHByZWRp
c2FibGUgY2FsbC4NCg0KU2FtZSBoZXJlIGFzIGFib3ZlOg0KYGBgDQpJJ20gdmFndWUgaGVyZSBh
Ym91dCB5b3VyIGNvbW1lbnQuDQpEbyBJIG5lZWQgdG8gY2hhbmdlIHNvbWV0aGluZyA/DQpgYGAN
Cg0KPiANCj4gPiArCWlmIChpbmRpb19kZXYtPmN1cnJlbnRtb2RlID09IElORElPX0JVRkZFUl9U
UklHR0VSRUQpIHsNCj4gPiArCQlpaW9fdHJpZ2dlcl9kZXRhY2hfcG9sbF9mdW5jKGluZGlvX2Rl
di0+dHJpZywNCj4gPiArCQkJCQkgICAgIGluZGlvX2Rldi0+cG9sbGZ1bmMpOw0KPiA+ICsJfQ0K
PiA+ICsNCj4gPiAgCS8qDQo+ID4gIAkgKiBJZiB0aGluZ3MgZ28gd3JvbmcgYXQgc29tZSBzdGVw
IGluIGRpc2FibGUgd2Ugc3RpbGwgbmVlZCB0bw0KPiA+IGNvbnRpbnVlDQo+ID4gIAkgKiB0byBw
ZXJmb3JtIHRoZSBvdGhlciBzdGVwcywgb3RoZXJ3aXNlIHdlIGxlYXZlIHRoZSBkZXZpY2UgaW4g
YQ0KPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9pbmR1c3RyaWFsaW8tdHJpZ2dlci5jDQo+
ID4gYi9kcml2ZXJzL2lpby9pbmR1c3RyaWFsaW8tdHJpZ2dlci5jDQo+ID4gaW5kZXggY2U2NjY5
OWM3ZmNjLi5hNGRhY2I2MzhhNzIgMTAwNjQ0DQo+ID4gLS0tIGEvZHJpdmVycy9paW8vaW5kdXN0
cmlhbGlvLXRyaWdnZXIuYw0KPiA+ICsrKyBiL2RyaXZlcnMvaWlvL2luZHVzdHJpYWxpby10cmln
Z2VyLmMNCj4gPiBAQCAtMjQyLDggKzI0Miw4IEBAIHN0YXRpYyB2b2lkIGlpb190cmlnZ2VyX3B1
dF9pcnEoc3RydWN0IGlpb190cmlnZ2VyDQo+ID4gKnRyaWcsIGludCBpcnEpDQo+ID4gICAqIHRo
ZSByZWxldmFudCBmdW5jdGlvbiBpcyBpbiB0aGVyZSBtYXkgYmUgdGhlIGJlc3Qgb3B0aW9uLg0K
PiA+ICAgKi8NCj4gPiAgLyogV29ydGggcHJvdGVjdGluZyBhZ2FpbnN0IGRvdWJsZSBhZGRpdGlv
bnM/ICovDQo+ID4gLXN0YXRpYyBpbnQgaWlvX3RyaWdnZXJfYXR0YWNoX3BvbGxfZnVuYyhzdHJ1
Y3QgaWlvX3RyaWdnZXIgKnRyaWcsDQo+ID4gLQkJCQkJc3RydWN0IGlpb19wb2xsX2Z1bmMgKnBm
KQ0KPiA+ICtpbnQgaWlvX3RyaWdnZXJfYXR0YWNoX3BvbGxfZnVuYyhzdHJ1Y3QgaWlvX3RyaWdn
ZXIgKnRyaWcsDQo+ID4gKwkJCQkgc3RydWN0IGlpb19wb2xsX2Z1bmMgKnBmKQ0KPiA+ICB7DQo+
ID4gIAlpbnQgcmV0ID0gMDsNCj4gPiAgCWJvb2wgbm90aW51c2UNCj4gPiBAQCAtMjkwLDggKzI5
MCw4IEBAIHN0YXRpYyBpbnQgaWlvX3RyaWdnZXJfYXR0YWNoX3BvbGxfZnVuYyhzdHJ1Y3QNCj4g
PiBpaW9fdHJpZ2dlciAqdHJpZywNCj4gPiAgCXJldHVybiByZXQ7DQo+ID4gIH0NCj4gPiAgDQo+
ID4gLXN0YXRpYyBpbnQgaWlvX3RyaWdnZXJfZGV0YWNoX3BvbGxfZnVuYyhzdHJ1Y3QgaWlvX3Ry
aWdnZXIgKnRyaWcsDQo+ID4gLQkJCQkJIHN0cnVjdCBpaW9fcG9sbF9mdW5jICpwZikNCj4gPiAr
aW50IGlpb190cmlnZ2VyX2RldGFjaF9wb2xsX2Z1bmMoc3RydWN0IGlpb190cmlnZ2VyICp0cmln
LA0KPiA+ICsJCQkJIHN0cnVjdCBpaW9fcG9sbF9mdW5jICpwZikNCj4gPiAgew0KPiA+ICAJaW50
IHJldCA9IDA7DQo+ID4gIAlib29sIG5vX290aGVyX3VzZXJzDQo+ID4gQEAgLTc1OCwxNyArNzU4
LDMgQEAgdm9pZCBpaW9fZGV2aWNlX3VucmVnaXN0ZXJfdHJpZ2dlcl9jb25zdW1lcihzdHJ1Y3QN
Cj4gPiBpaW9fZGV2ICppbmRpb19kZXYpDQo+ID4gIAlpZiAoaW5kaW9fZGV2LT50cmlnKQ0KPiA+
ICAJCWlpb190cmlnZ2VyX3B1dChpbmRpb19kZXYtPnRyaWcpOw0KPiA+ICB9DQo+ID4gLQ0KPiA+
IC1pbnQgaWlvX3RyaWdnZXJlZF9idWZmZXJfcG9zdGVuYWJsZShzdHJ1Y3QgaWlvX2RldiAqaW5k
aW9fZGV2KQ0KPiA+IC17DQo+ID4gLQlyZXR1cm4gaWlvX3RyaWdnZXJfYXR0YWNoX3BvbGxfZnVu
YyhpbmRpb19kZXYtPnRyaWcsDQo+ID4gLQkJCQkJICAgIGluZGlvX2Rldi0+cG9sbGZ1bmMpOw0K
PiA+IC19DQo+ID4gLUVYUE9SVF9TWU1CT0woaWlvX3RyaWdnZXJlZF9idWZmZXJfcG9zdGVuYWJs
ZSk7DQo+ID4gLQ0KPiA+IC1pbnQgaWlvX3RyaWdnZXJlZF9idWZmZXJfcHJlZGlzYWJsZShzdHJ1
Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQ0KPiA+IC17DQo+ID4gLQlyZXR1cm4gaWlvX3RyaWdnZXJf
ZGV0YWNoX3BvbGxfZnVuYyhpbmRpb19kZXYtPnRyaWcsDQo+ID4gLQkJCQkJICAgICBpbmRpb19k
ZXYtPnBvbGxmdW5jKTsNCj4gPiAtfQ0KPiA+IC1FWFBPUlRfU1lNQk9MKGlpb190cmlnZ2VyZWRf
YnVmZmVyX3ByZWRpc2FibGUpOw0KPiANCj4gDQo+IA0KPiANCj4gPiBkaWZmIC0tZ2l0IGEvZHJp
dmVycy9paW8vYWRjL2FkX3NpZ21hX2RlbHRhLmMNCj4gPiBiL2RyaXZlcnMvaWlvL2FkYy9hZF9z
aWdtYV9kZWx0YS5jDQo+ID4gaW5kZXggY2YxYjA0OGIwNjY1Li5lZjA0NjI3N2JmN2IgMTAwNjQ0
DQo+ID4gLS0tIGEvZHJpdmVycy9paW8vYWRjL2FkX3NpZ21hX2RlbHRhLmMNCj4gPiArKysgYi9k
cml2ZXJzL2lpby9hZGMvYWRfc2lnbWFfZGVsdGEuYw0KPiA+IEBAIC0zMzgsMTAgKzMzOCw2IEBA
IHN0YXRpYyBpbnQgYWRfc2RfYnVmZmVyX3Bvc3RlbmFibGUoc3RydWN0IGlpb19kZXYNCj4gPiAq
aW5kaW9fZGV2KQ0KPiA+ICAJdW5zaWduZWQgaW50IGNoYW5uZWw7DQo+ID4gIAlpbnQgcmV0Ow0K
PiA+ICANCj4gPiAtCXJldCA9IGlpb190cmlnZ2VyZWRfYnVmZmVyX3Bvc3RlbmFibGUoaW5kaW9f
ZGV2KTsNCj4gPiAtCWlmIChyZXQgPCAwKQ0KPiA+IC0JCXJldHVybiByZXQ7DQo+ID4gLQ0KPiAN
Cj4gSGVyZSBpcyBvbmUgd2hlcmUgdGhlIG9yZGVyaW5nIGFjdHVhbGx5IGNoYW5nZXMuIEknbSBn
b2luZyB0byBob3BlIHlvdQ0KPiBjb25jbHVkZWQNCj4gdGhpcyBvbmUgd2FzIGZpbmUgOykNCj4g
DQoNClllcCwgdGhpcyBwYXRjaCBzaG91bGQgYmUgZmluZSAoZm9yIHRoZSBhZF9zaWdtYV9kZWx0
YS5jIGNoYW5nZSkuDQpJdCdzIGJlZW4gaW4gb3VyIHRyZWUgZm9yIGEgd2hpbGUuDQoNCj4gPiAg
CWNoYW5uZWwgPSBmaW5kX2ZpcnN0X2JpdChpbmRpb19kZXYtPmFjdGl2ZV9zY2FuX21hc2ssDQo+
ID4gIAkJCQkgaW5kaW9fZGV2LT5tYXNrbGVuZ3RoKTsNCj4gPiAgCXJldCA9IGFkX3NpZ21hX2Rl
bHRhX3NldF9jaGFubmVsKHNpZ21hX2RlbHRhLA0KPiA+IEBAIC00MjYsNyArNDIyLDYgQEAgc3Rh
dGljIGlycXJldHVybl90IGFkX3NkX3RyaWdnZXJfaGFuZGxlcihpbnQgaXJxLA0KPiA+IHZvaWQg
KnApDQo+ID4gIA0KPiA+ICBzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19idWZmZXJfc2V0dXBfb3Bz
IGFkX3NkX2J1ZmZlcl9zZXR1cF9vcHMgPSB7DQo+ID4gIAkucG9zdGVuYWJsZSA9ICZhZF9zZF9i
dWZmZXJfcG9zdGVuYWJsZSwNCj4gPiAtCS5wcmVkaXNhYmxlID0gJmlpb190cmlnZ2VyZWRfYnVm
ZmVyX3ByZWRpc2FibGUsDQo+ID4gIAkucG9zdGRpc2FibGUgPSAmYWRfc2RfYnVmZmVyX3Bvc3Rk
aXNhYmxlLA0KPiA+ICAJLnZhbGlkYXRlX3NjYW5fbWFzayA9ICZpaW9fdmFsaWRhdGVfc2Nhbl9t
YXNrX29uZWhvdCwNCj4gPiAgfTsNCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWRjL2Rs
bjItYWRjLmMgYi9kcml2ZXJzL2lpby9hZGMvZGxuMi1hZGMuYw0KPiA+IGluZGV4IGM2NGM2Njc1
Y2FlNi4uNTExMzVlN2MwZDRmIDEwMDY0NA0KPiA+IC0tLSBhL2RyaXZlcnMvaWlvL2FkYy9kbG4y
LWFkYy5jDQo+ID4gKysrIGIvZHJpdmVycy9paW8vYWRjL2RsbjItYWRjLmMNCj4gPiBAQCAtNTYw
LDcgKzU2MCw3IEBAIHN0YXRpYyBpbnQNCj4gPiBkbG4yX2FkY190cmlnZ2VyZWRfYnVmZmVyX3Bv
c3RlbmFibGUoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikNCj4gPiAgCQltdXRleF91bmxvY2so
JmRsbjItPm11dGV4KTsNCj4gPiAgCX0NCj4gPiAgDQo+ID4gLQlyZXR1cm4gaWlvX3RyaWdnZXJl
ZF9idWZmZXJfcG9zdGVuYWJsZShpbmRpb19kZXYpOw0KPiA+ICsJcmV0dXJuIDA7DQo+ID4gIH0N
Cj4gPiAgDQo+ID4gIHN0YXRpYyBpbnQgZGxuMl9hZGNfdHJpZ2dlcmVkX2J1ZmZlcl9wcmVkaXNh
YmxlKHN0cnVjdCBpaW9fZGV2DQo+ID4gKmluZGlvX2RldikNCj4gPiBAQCAtNTg1LDcgKzU4NSw3
IEBAIHN0YXRpYyBpbnQNCj4gPiBkbG4yX2FkY190cmlnZ2VyZWRfYnVmZmVyX3ByZWRpc2FibGUo
c3RydWN0IGlpb19kZXYgKmluZGlvX2RldikNCj4gPiAgCQlyZXR1cm4gcmV0Ow0KPiA+ICAJfQ0K
PiA+ICANCj4gPiAtCXJldHVybiBpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9wcmVkaXNhYmxlKGluZGlv
X2Rldik7DQo+IA0KPiBBbiB1bmJhbGFuY2VkIG9uZS4gIFBvc3RlbmFibGUgaXMgZmluZSBidXQg
cHJlc2Rpc2FibGUuICBXaG8ga25vd3MuLg0KPiANCj4gPiArCXJldHVybiAwOw0KPiA+ICB9DQo+
ID4gIA0KPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hZGMvc3RtMzItYWRjLmMgYi9kcml2
ZXJzL2lpby9hZGMvc3RtMzItYWRjLmMNCj4gPiBpbmRleCAzNzg0MTE4NTNkNzUuLmNlMGQxN2Mw
M2Q3ZSAxMDA2NDQNCj4gPiAtLS0gYS9kcml2ZXJzL2lpby9hZGMvc3RtMzItYWRjLmMNCj4gPiAr
KysgYi9kcml2ZXJzL2lpby9hZGMvc3RtMzItYWRjLmMNCj4gPiBAQCAtMTQ4MiwxMCArMTQ4Miw2
IEBAIHN0YXRpYyBpbnQgc3RtMzJfYWRjX2J1ZmZlcl9wb3N0ZW5hYmxlKHN0cnVjdA0KPiA+IGlp
b19kZXYgKmluZGlvX2RldikNCj4gPiAgCQlnb3RvIGVycl9jbHJfdHJpZzsNCj4gPiAgCX0NCj4g
PiAgDQo+ID4gLQlyZXQgPSBpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9wb3N0ZW5hYmxlKGluZGlvX2Rl
dik7DQo+ID4gLQlpZiAocmV0IDwgMCkNCj4gPiAtCQlnb3RvIGVycl9zdG9wX2RtYTsNCj4gPiAt
DQo+ID4gIAkvKiBSZXNldCBhZGMgYnVmZmVyIGluZGV4ICovDQo+ID4gIAlhZGMtPmJ1ZmkgPSAw
Ow0KPiA+ICANCj4gPiBAQCAtMTQ5Niw5ICsxNDkyLDYgQEAgc3RhdGljIGludCBzdG0zMl9hZGNf
YnVmZmVyX3Bvc3RlbmFibGUoc3RydWN0DQo+ID4gaWlvX2RldiAqaW5kaW9fZGV2KQ0KPiA+ICAN
Cj4gPiAgCXJldHVybiAwOw0KPiA+ICANCj4gPiAtZXJyX3N0b3BfZG1hOg0KPiA+IC0JaWYgKGFk
Yy0+ZG1hX2NoYW4pDQo+ID4gLQkJZG1hZW5naW5lX3Rlcm1pbmF0ZV9hbGwoYWRjLT5kbWFfY2hh
bik7DQo+ID4gIGVycl9jbHJfdHJpZzoNCj4gPiAgCXN0bTMyX2FkY19zZXRfdHJpZyhpbmRpb19k
ZXYsIE5VTEwpOw0KPiA+ICBlcnJfdW5wcmVwYXJlOg0KPiA+IEBAIC0xNTE3LDEwICsxNTEwLDYg
QEAgc3RhdGljIGludCBzdG0zMl9hZGNfYnVmZmVyX3ByZWRpc2FibGUoc3RydWN0DQo+ID4gaWlv
X2RldiAqaW5kaW9fZGV2KQ0KPiA+ICAJaWYgKCFhZGMtPmRtYV9jaGFuKQ0KPiA+ICAJCXN0bTMy
X2FkY19jb252X2lycV9kaXNhYmxlKGFkYyk7DQo+ID4gIA0KPiA+IC0JcmV0ID0gaWlvX3RyaWdn
ZXJlZF9idWZmZXJfcHJlZGlzYWJsZShpbmRpb19kZXYpOw0KPiA+IC0JaWYgKHJldCA8IDApDQo+
ID4gLQkJZGV2X2VycigmaW5kaW9fZGV2LT5kZXYsICJwcmVkaXNhYmxlIGZhaWxlZFxuIik7DQo+
ID4gLQ0KPiA+ICAJaWYgKGFkYy0+ZG1hX2NoYW4pDQo+ID4gIAkJZG1hZW5naW5lX3Rlcm1pbmF0
ZV9hbGwoYWRjLT5kbWFfY2hhbik7DQo+ID4gIA0KPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2lp
by9hZGMvdmY2MTBfYWRjLmMgYi9kcml2ZXJzL2lpby9hZGMvdmY2MTBfYWRjLmMNCj4gPiBpbmRl
eCBiYmNiN2E0ZDdlZGYuLjNhMTViOThjZmQzOSAxMDA2NDQNCj4gPiAtLS0gYS9kcml2ZXJzL2lp
by9hZGMvdmY2MTBfYWRjLmMNCj4gPiArKysgYi9kcml2ZXJzL2lpby9hZGMvdmY2MTBfYWRjLmMN
Cj4gPiBAQCAtNzQwLDEwICs3NDAsNiBAQCBzdGF0aWMgaW50IHZmNjEwX2FkY19idWZmZXJfcG9z
dGVuYWJsZShzdHJ1Y3QNCj4gPiBpaW9fZGV2ICppbmRpb19kZXYpDQo+ID4gIAlpbnQgcmV0Ow0K
PiA+ICAJaW50IHZhbDsNCj4gPiAgDQo+ID4gLQlyZXQgPSBpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9w
b3N0ZW5hYmxlKGluZGlvX2Rldik7DQo+ID4gLQlpZiAocmV0KQ0KPiA+IC0JCXJldHVybiByZXQ7
DQo+ID4gLQ0KPiA+ICAJdmFsID0gcmVhZGwoaW5mby0+cmVncyArIFZGNjEwX1JFR19BRENfR0Mp
Ow0KPiA+ICAJdmFsIHw9IFZGNjEwX0FEQ19BRENPTjsNCj4gPiAgCXdyaXRlbCh2YWwsIGluZm8t
PnJlZ3MgKyBWRjYxMF9SRUdfQURDX0dDKTsNCj4gPiBAQCAtNzc0LDcgKzc3MCw3IEBAIHN0YXRp
YyBpbnQgdmY2MTBfYWRjX2J1ZmZlcl9wcmVkaXNhYmxlKHN0cnVjdA0KPiA+IGlpb19kZXYgKmlu
ZGlvX2RldikNCj4gPiAgDQo+ID4gIAl3cml0ZWwoaGNfY2ZnLCBpbmZvLT5yZWdzICsgVkY2MTBf
UkVHX0FEQ19IQzApOw0KPiA+ICANCj4gPiAtCXJldHVybiBpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9w
cmVkaXNhYmxlKGluZGlvX2Rldik7DQo+ID4gKwlyZXR1cm4gMDsNCj4gPiAgfQ0KPiA+ICANCj4g
PiAgc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fYnVmZmVyX3NldHVwX29wcw0KPiA+IGlpb190cmln
Z2VyZWRfYnVmZmVyX3NldHVwX29wcyA9IHsNCj4gDQo+IA0KPiA+IGRpZmYgLS1naXQgYS9kcml2
ZXJzL2lpby9jaGVtaWNhbC9hdGxhcy1waC1zZW5zb3IuYw0KPiA+IGIvZHJpdmVycy9paW8vY2hl
bWljYWwvYXRsYXMtcGgtc2Vuc29yLmMNCj4gPiBpbmRleCBhNDA2YWQzMWIwOTYuLjhmZWQ3NWY5
ZTk1ZCAxMDA2NDQNCj4gPiAtLS0gYS9kcml2ZXJzL2lpby9jaGVtaWNhbC9hdGxhcy1waC1zZW5z
b3IuYw0KPiA+ICsrKyBiL2RyaXZlcnMvaWlvL2NoZW1pY2FsL2F0bGFzLXBoLXNlbnNvci5jDQo+
ID4gQEAgLTMwNSwxMCArMzA1LDYgQEAgc3RhdGljIGludCBhdGxhc19idWZmZXJfcG9zdGVuYWJs
ZShzdHJ1Y3QgaWlvX2Rldg0KPiA+ICppbmRpb19kZXYpDQo+ID4gIAlzdHJ1Y3QgYXRsYXNfZGF0
YSAqZGF0YSA9IGlpb19wcml2KGluZGlvX2Rldik7DQo+ID4gIAlpbnQgcmV0Ow0KPiA+ICANCj4g
PiAtCXJldCA9IGlpb190cmlnZ2VyZWRfYnVmZmVyX3Bvc3RlbmFibGUoaW5kaW9fZGV2KTsNCj4g
PiAtCWlmIChyZXQpDQo+ID4gLQkJcmV0dXJuIHJldDsNCj4gPiAtDQo+ID4gIAlyZXQgPSBwbV9y
dW50aW1lX2dldF9zeW5jKCZkYXRhLT5jbGllbnQtPmRldik7DQo+ID4gIAlpZiAocmV0IDwgMCkg
ew0KPiA+ICAJCXBtX3J1bnRpbWVfcHV0X25vaWRsZSgmZGF0YS0+Y2xpZW50LT5kZXYpOw0KPiA+
IEBAIC0zMjMsMTAgKzMxOSw2IEBAIHN0YXRpYyBpbnQgYXRsYXNfYnVmZmVyX3ByZWRpc2FibGUo
c3RydWN0IGlpb19kZXYNCj4gPiAqaW5kaW9fZGV2KQ0KPiA+ICAJc3RydWN0IGF0bGFzX2RhdGEg
KmRhdGEgPSBpaW9fcHJpdihpbmRpb19kZXYpOw0KPiA+ICAJaW50IHJldDsNCj4gPiAgDQo+ID4g
LQlyZXQgPSBpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9wcmVkaXNhYmxlKGluZGlvX2Rldik7DQo+ID4g
LQlpZiAocmV0KQ0KPiA+IC0JCXJldHVybiByZXQ7DQo+ID4gLQ0KPiA+ICAJcmV0ID0gYXRsYXNf
c2V0X2ludGVycnVwdChkYXRhLCBmYWxzZSk7DQo+ID4gIAlpZiAocmV0KQ0KPiA+ICAJCXJldHVy
biByZXQ7DQo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL3BvdGVudGlvc3RhdC9sbXA5MTAw
MC5jDQo+ID4gYi9kcml2ZXJzL2lpby9wb3RlbnRpb3N0YXQvbG1wOTEwMDAuYw0KPiA+IGluZGV4
IDg1NzE0MDU1Y2M3NC4uODRmOTEwNWNiYjM3IDEwMDY0NA0KPiA+IC0tLSBhL2RyaXZlcnMvaWlv
L3BvdGVudGlvc3RhdC9sbXA5MTAwMC5jDQo+ID4gKysrIGIvZHJpdmVycy9paW8vcG90ZW50aW9z
dGF0L2xtcDkxMDAwLmMNCj4gPiBAQCAtMjk1LDcgKzI5NSw2IEBAIHN0YXRpYyBpbnQgbG1wOTEw
MDBfYnVmZmVyX3ByZWRpc2FibGUoc3RydWN0DQo+ID4gaWlvX2RldiAqaW5kaW9fZGV2KQ0KPiA+
ICANCj4gPiAgc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fYnVmZmVyX3NldHVwX29wcyBsbXA5MTAw
MF9idWZmZXJfc2V0dXBfb3BzID0gew0KPiA+ICAJLnByZWVuYWJsZSA9IGxtcDkxMDAwX2J1ZmZl
cl9wcmVlbmFibGUsDQo+ID4gLQkucG9zdGVuYWJsZSA9IGlpb190cmlnZ2VyZWRfYnVmZmVyX3Bv
c3RlbmFibGUsDQo+IA0KPiBBIHJlc291bmRpbmcgPz8/IA0KPiA+ICAJLnByZWRpc2FibGUgPSBs
bXA5MTAwMF9idWZmZXJfcHJlZGlzYWJsZSwNCj4gPiAgfTsNCj4gPiAgDQo+IA0KPiANCg==

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH][RFC] iio: Move attach/detach of the poll func to the core
  2018-11-09 10:03   ` Ardelean, Alexandru
@ 2018-11-09 10:44     ` Fabrice Gasnier
  2018-11-09 11:10       ` Ardelean, Alexandru
  0 siblings, 1 reply; 5+ messages in thread
From: Fabrice Gasnier @ 2018-11-09 10:44 UTC (permalink / raw)
  To: Ardelean, Alexandru, jic23
  Cc: lars, jackoalan, linux-iio, maitysanchayan, bhuvanchandra.dv,
	matt.ranostay

On 11/9/18 11:03 AM, Ardelean, Alexandru wrote:
> On Sat, 2018-11-03 at 18:19 +0000, Jonathan Cameron wrote:
>> On Fri, 22 Jun 2018 16:53:22 +0300
>> Alexandru Ardelean <alexandru.ardelean@analog.com> wrote:
> 
> Hey,
> 
> Thanks for taking the time for this, Jonathan.
> 
>>
>>> All devices using a triggered buffer need to attach and detach the
>>> trigger
>>> to the device in order to properly work. Instead of doing this in each
>>> and
>>> every driver by hand move this into the core.
>>>
>>> Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
>>> Signed-off-by: Alexandru Ardelean <alexandru.ardelean@analog.com>
>>> ---
>>>
>>> Note: `Signed-off-by` is also Lars-Peter Clausen because he is the
>>> original author of this patch [on an older kernel].
>>> The patch has been updated since the original patch from Lars.
>>>
>>> There has been a (small) discussion about whether such a patch makes
>>> sense to implement (for reducing code duplication), or whether it's too
>>> risky to do it.
>>>
>>> The reason for the risky-ness is that there is no consistent way in
>>> which
>>> drivers attach/detach the poll function.
>>> i.e.
>>>    1. some drivers call `iio_triggered_buffer_postenable()` before
>>> doing HW
>>>       stuff, some after (for attaching the poll func)
>>>    2. similarly, for `iio_triggered_buffer_predisable()` some drivers
>>> do it
>>>       before HW stuff, some after (for detaching the poll func)
>>>
>>> Common sense would dictate that (in the case of
>>> `iio_triggered_buffer_postenable()`) there would normally be HW setup
>>> first
>>> and then attach the poll func.
>>> And the reverse done for `iio_triggered_buffer_predisable()`.
>>
>> I'm sure I once had the flow around this all well laid out, but I really
>> can't recall what it was and it was all tied around trying to do the
>> buffer enable as lockless as possible. Years ago Lars pointed out that
>> was impossible so a lot of the logic has been messed up since then.
>>
>> Anyhow, I've put this off long enough (sorry about that - just new it
>> was going to involve some head scratching!)  Crucially I have another
>> plan.  Figure out which drivers this actually makes a difference to
>> and thankfully in most cases the author is still active :)
>>
>>
>>>
>>> However, it's unclear whether this reasoning is completely sound for
>>> all
>>> drivers.
>>>
>>> Hence this RFC.
>>
>> I've culled the cases that are obvious.  Either just the defaults or
>> where we do the calls at the end of enable and start of disable.
>>
>> In those there is no ordering change.
>>
>> There are some odd ones
>> gp2ap020a00f does it under a lock. Which makes no difference.
>> isl29125 totally missbalanced so the preenable does things undone in the
>>    predisable.  I wonder if anyone has one to allow us to test cleaning
>>    that up. No flow change due to this patch though so fine.
>> tcs3414 is much the same as the isl29125.
>> lmp91000?? Is about all I can say on that.  It detaches a poll function
>> that
>> was never attached.
>>
>> Anyhow, so what's left (hopefully we haven't had any crazies since
>> you posted this patch. I'll check at somepoint)
>>
>>>  drivers/iio/adc/ad_sigma_delta.c              |  5 ----
>>
>> I'll assume you are fine with that one ;)
>>
>>>  drivers/iio/adc/dln2-adc.c                    |  4 +--
>>
>> + CC Jack Anderson (worst comes to the worst I have one of these and can
>>      run basic tests).
>>
>>>  drivers/iio/adc/stm32-adc.c                   | 11 --------
>>
>> + CC Fabrice

Hi Ardelean, Jonathan,

Thanks for CC'ing me. Please find my comments here here after.

>>
>>>  drivers/iio/adc/vf610_adc.c                   |  6 +----
>>
>> + CC Sanchayan who might still have access to one of these
>> + Bhuvanchanda who fixed a bug not so long ago...
>>
>>>  drivers/iio/chemical/atlas-ph-sensor.c        |  8 ------
>>
>> + CC Matt who is definitely still contactable as I met him last week ;)
>>
>>>  drivers/iio/potentiostat/lmp91000.c           |  1 -
>>
>> Another of Matt's.  On this one, I'm not sure who it attaches
>> the pollfunc in the first place.  I may be going crazy however, so
>> over to Matt to point out what I'm missing.
>>
>> So the actual change that matters is:
>>
>>> diff --git a/drivers/iio/industrialio-buffer.c
>>> b/drivers/iio/industrialio-buffer.c
>>> index cd5bfe39591b..d8eb534a9544 100644
>>> --- a/drivers/iio/industrialio-buffer.c
>>> +++ b/drivers/iio/industrialio-buffer.c
>>> @@ -24,6 +24,7 @@
>>>  
>>>  #include <linux/iio/iio.h>
>>>  #include "iio_core.h"
>>> +#include "iio_core_trigger.h"
>>>  #include <linux/iio/sysfs.h>
>>>  #include <linux/iio/buffer.h>
>>>  #include <linux/iio/buffer_impl.h>
>>> @@ -961,6 +962,13 @@ static int iio_enable_buffers(struct iio_dev
>>> *indio_dev,
>>>  		}
>>>  	}
>>>  
>>> +	if (indio_dev->currentmode == INDIO_BUFFER_TRIGGERED) {
>>> +		ret = iio_trigger_attach_poll_func(indio_dev->trig,
>>> +						   indio_dev->pollfunc);
>>> +		if (ret)
>>> +			goto err_disable_buffers;
>>> +	}
>>> +
>>
>> This is immediately after the postenable call.
>>
> 
> I'm vague here about your comment.
> Do I need to change something ?
> 

I have some concern about the ordering here as well, regarding
stm32-adc.c: I think this is same case as ad_sigma_delta.c (I haven't
checked the others).

With this patch, in stm32-adc case, the hardware gets started (e.g.
getting data with interrupts or dma) before the handler has been attached:
-> iio_triggered_buffer_postenable
 -> iio_trigger_attach_poll_func
  -> request_threaded_irq

I haven't tested it, but I think this is racy. I feel like
iio_trigger_attach_poll_func should happen before postenable call
(rather than after), see after stm32-adc.c.

>>>  	return 0;
>>>  
>>>  err_disable_buffers:
>>> @@ -987,6 +995,11 @@ static int iio_disable_buffers(struct iio_dev
>>> *indio_dev)
>>>  	if (list_empty(&indio_dev->buffer_list))
>>>  		return 0;
>>>  
>>
>> This is immediately before the predisable call.
> 
> Same here as above:
> ```
> I'm vague here about your comment.
> Do I need to change something ?
> ```
> 

Same here (at least for stm32-adc case): the handler gets unregistered
but the hardware is still running (e.g. getting data with interrupts or
dma).

I'd prefer the other way :-):
- upon enable: attach the poll func, then start the HW
- upon disable: stop the HW, detach the poll func

>>
>>> +	if (indio_dev->currentmode == INDIO_BUFFER_TRIGGERED) {
>>> +		iio_trigger_detach_poll_func(indio_dev->trig,
>>> +					     indio_dev->pollfunc);
>>> +	}
>>> +
>>>  	/*
>>>  	 * If things go wrong at some step in disable we still need to
>>> continue
>>>  	 * to perform the other steps, otherwise we leave the device in a
>>> diff --git a/drivers/iio/industrialio-trigger.c
>>> b/drivers/iio/industrialio-trigger.c
>>> index ce66699c7fcc..a4dacb638a72 100644
>>> --- a/drivers/iio/industrialio-trigger.c
>>> +++ b/drivers/iio/industrialio-trigger.c
>>> @@ -242,8 +242,8 @@ static void iio_trigger_put_irq(struct iio_trigger
>>> *trig, int irq)
>>>   * the relevant function is in there may be the best option.
>>>   */
>>>  /* Worth protecting against double additions? */
>>> -static int iio_trigger_attach_poll_func(struct iio_trigger *trig,
>>> -					struct iio_poll_func *pf)
>>> +int iio_trigger_attach_poll_func(struct iio_trigger *trig,
>>> +				 struct iio_poll_func *pf)
>>>  {
>>>  	int ret = 0;
>>>  	bool notinuse
>>> @@ -290,8 +290,8 @@ static int iio_trigger_attach_poll_func(struct
>>> iio_trigger *trig,
>>>  	return ret;
>>>  }
>>>  
>>> -static int iio_trigger_detach_poll_func(struct iio_trigger *trig,
>>> -					 struct iio_poll_func *pf)
>>> +int iio_trigger_detach_poll_func(struct iio_trigger *trig,
>>> +				 struct iio_poll_func *pf)
>>>  {
>>>  	int ret = 0;
>>>  	bool no_other_users
>>> @@ -758,17 +758,3 @@ void iio_device_unregister_trigger_consumer(struct
>>> iio_dev *indio_dev)
>>>  	if (indio_dev->trig)
>>>  		iio_trigger_put(indio_dev->trig);
>>>  }
>>> -
>>> -int iio_triggered_buffer_postenable(struct iio_dev *indio_dev)
>>> -{
>>> -	return iio_trigger_attach_poll_func(indio_dev->trig,
>>> -					    indio_dev->pollfunc);
>>> -}
>>> -EXPORT_SYMBOL(iio_triggered_buffer_postenable);
>>> -
>>> -int iio_triggered_buffer_predisable(struct iio_dev *indio_dev)
>>> -{
>>> -	return iio_trigger_detach_poll_func(indio_dev->trig,
>>> -					     indio_dev->pollfunc);
>>> -}
>>> -EXPORT_SYMBOL(iio_triggered_buffer_predisable);
>>
>>
>>
>>
>>> diff --git a/drivers/iio/adc/ad_sigma_delta.c
>>> b/drivers/iio/adc/ad_sigma_delta.c
>>> index cf1b048b0665..ef046277bf7b 100644
>>> --- a/drivers/iio/adc/ad_sigma_delta.c
>>> +++ b/drivers/iio/adc/ad_sigma_delta.c
>>> @@ -338,10 +338,6 @@ static int ad_sd_buffer_postenable(struct iio_dev
>>> *indio_dev)
>>>  	unsigned int channel;
>>>  	int ret;
>>>  
>>> -	ret = iio_triggered_buffer_postenable(indio_dev);
>>> -	if (ret < 0)
>>> -		return ret;
>>> -
>>
>> Here is one where the ordering actually changes. I'm going to hope you
>> concluded
>> this one was fine ;)
>>
> 
> Yep, this patch should be fine (for the ad_sigma_delta.c change).
> It's been in our tree for a while.
> 
>>>  	channel = find_first_bit(indio_dev->active_scan_mask,
>>>  				 indio_dev->masklength);
>>>  	ret = ad_sigma_delta_set_channel(sigma_delta,
>>> @@ -426,7 +422,6 @@ static irqreturn_t ad_sd_trigger_handler(int irq,
>>> void *p)
>>>  
>>>  static const struct iio_buffer_setup_ops ad_sd_buffer_setup_ops = {
>>>  	.postenable = &ad_sd_buffer_postenable,
>>> -	.predisable = &iio_triggered_buffer_predisable,
>>>  	.postdisable = &ad_sd_buffer_postdisable,
>>>  	.validate_scan_mask = &iio_validate_scan_mask_onehot,
>>>  };
>>> diff --git a/drivers/iio/adc/dln2-adc.c b/drivers/iio/adc/dln2-adc.c
>>> index c64c6675cae6..51135e7c0d4f 100644
>>> --- a/drivers/iio/adc/dln2-adc.c
>>> +++ b/drivers/iio/adc/dln2-adc.c
>>> @@ -560,7 +560,7 @@ static int
>>> dln2_adc_triggered_buffer_postenable(struct iio_dev *indio_dev)
>>>  		mutex_unlock(&dln2->mutex);
>>>  	}
>>>  
>>> -	return iio_triggered_buffer_postenable(indio_dev);
>>> +	return 0;
>>>  }
>>>  
>>>  static int dln2_adc_triggered_buffer_predisable(struct iio_dev
>>> *indio_dev)
>>> @@ -585,7 +585,7 @@ static int
>>> dln2_adc_triggered_buffer_predisable(struct iio_dev *indio_dev)
>>>  		return ret;
>>>  	}
>>>  
>>> -	return iio_triggered_buffer_predisable(indio_dev);
>>
>> An unbalanced one.  Postenable is fine but presdisable.  Who knows..
>>
>>> +	return 0;
>>>  }
>>>  
>>> diff --git a/drivers/iio/adc/stm32-adc.c b/drivers/iio/adc/stm32-adc.c
>>> index 378411853d75..ce0d17c03d7e 100644
>>> --- a/drivers/iio/adc/stm32-adc.c
>>> +++ b/drivers/iio/adc/stm32-adc.c
>>> @@ -1482,10 +1482,6 @@ static int stm32_adc_buffer_postenable(struct
>>> iio_dev *indio_dev)
>>>  		goto err_clr_trig;
>>>  	}
>>>  
>>> -	ret = iio_triggered_buffer_postenable(indio_dev);
>>> -	if (ret < 0)
>>> -		goto err_stop_dma;
>>> -

This is where the ordering changes.
I'd rather prefer to call "iio_trigger_attach_poll_func" before calling
the .postenable routine, and the reverse order when disabling.

Thanks,
Best regards,
Fabrice

>>>  	/* Reset adc buffer index */
>>>  	adc->bufi = 0;
>>>  
>>> @@ -1496,9 +1492,6 @@ static int stm32_adc_buffer_postenable(struct
>>> iio_dev *indio_dev)
>>>  
>>>  	return 0;
>>>  
>>> -err_stop_dma:
>>> -	if (adc->dma_chan)
>>> -		dmaengine_terminate_all(adc->dma_chan);
>>>  err_clr_trig:
>>>  	stm32_adc_set_trig(indio_dev, NULL);
>>>  err_unprepare:
>>> @@ -1517,10 +1510,6 @@ static int stm32_adc_buffer_predisable(struct
>>> iio_dev *indio_dev)
>>>  	if (!adc->dma_chan)
>>>  		stm32_adc_conv_irq_disable(adc);
>>>  
>>> -	ret = iio_triggered_buffer_predisable(indio_dev);
>>> -	if (ret < 0)
>>> -		dev_err(&indio_dev->dev, "predisable failed\n");
>>> -
>>>  	if (adc->dma_chan)
>>>  		dmaengine_terminate_all(adc->dma_chan);
>>>  
>>> diff --git a/drivers/iio/adc/vf610_adc.c b/drivers/iio/adc/vf610_adc.c
>>> index bbcb7a4d7edf..3a15b98cfd39 100644
>>> --- a/drivers/iio/adc/vf610_adc.c
>>> +++ b/drivers/iio/adc/vf610_adc.c
>>> @@ -740,10 +740,6 @@ static int vf610_adc_buffer_postenable(struct
>>> iio_dev *indio_dev)
>>>  	int ret;
>>>  	int val;
>>>  
>>> -	ret = iio_triggered_buffer_postenable(indio_dev);
>>> -	if (ret)
>>> -		return ret;
>>> -
>>>  	val = readl(info->regs + VF610_REG_ADC_GC);
>>>  	val |= VF610_ADC_ADCON;
>>>  	writel(val, info->regs + VF610_REG_ADC_GC);
>>> @@ -774,7 +770,7 @@ static int vf610_adc_buffer_predisable(struct
>>> iio_dev *indio_dev)
>>>  
>>>  	writel(hc_cfg, info->regs + VF610_REG_ADC_HC0);
>>>  
>>> -	return iio_triggered_buffer_predisable(indio_dev);
>>> +	return 0;
>>>  }
>>>  
>>>  static const struct iio_buffer_setup_ops
>>> iio_triggered_buffer_setup_ops = {
>>
>>
>>> diff --git a/drivers/iio/chemical/atlas-ph-sensor.c
>>> b/drivers/iio/chemical/atlas-ph-sensor.c
>>> index a406ad31b096..8fed75f9e95d 100644
>>> --- a/drivers/iio/chemical/atlas-ph-sensor.c
>>> +++ b/drivers/iio/chemical/atlas-ph-sensor.c
>>> @@ -305,10 +305,6 @@ static int atlas_buffer_postenable(struct iio_dev
>>> *indio_dev)
>>>  	struct atlas_data *data = iio_priv(indio_dev);
>>>  	int ret;
>>>  
>>> -	ret = iio_triggered_buffer_postenable(indio_dev);
>>> -	if (ret)
>>> -		return ret;
>>> -
>>>  	ret = pm_runtime_get_sync(&data->client->dev);
>>>  	if (ret < 0) {
>>>  		pm_runtime_put_noidle(&data->client->dev);
>>> @@ -323,10 +319,6 @@ static int atlas_buffer_predisable(struct iio_dev
>>> *indio_dev)
>>>  	struct atlas_data *data = iio_priv(indio_dev);
>>>  	int ret;
>>>  
>>> -	ret = iio_triggered_buffer_predisable(indio_dev);
>>> -	if (ret)
>>> -		return ret;
>>> -
>>>  	ret = atlas_set_interrupt(data, false);
>>>  	if (ret)
>>>  		return ret;
>>> diff --git a/drivers/iio/potentiostat/lmp91000.c
>>> b/drivers/iio/potentiostat/lmp91000.c
>>> index 85714055cc74..84f9105cbb37 100644
>>> --- a/drivers/iio/potentiostat/lmp91000.c
>>> +++ b/drivers/iio/potentiostat/lmp91000.c
>>> @@ -295,7 +295,6 @@ static int lmp91000_buffer_predisable(struct
>>> iio_dev *indio_dev)
>>>  
>>>  static const struct iio_buffer_setup_ops lmp91000_buffer_setup_ops = {
>>>  	.preenable = lmp91000_buffer_preenable,
>>> -	.postenable = iio_triggered_buffer_postenable,
>>
>> A resounding ??? 
>>>  	.predisable = lmp91000_buffer_predisable,
>>>  };
>>>  
>>
>>

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH][RFC] iio: Move attach/detach of the poll func to the core
  2018-11-09 10:44     ` Fabrice Gasnier
@ 2018-11-09 11:10       ` Ardelean, Alexandru
  0 siblings, 0 replies; 5+ messages in thread
From: Ardelean, Alexandru @ 2018-11-09 11:10 UTC (permalink / raw)
  To: fabrice.gasnier, jic23
  Cc: lars, jackoalan, linux-iio, bhuvanchandra.dv, maitysanchayan,
	matt.ranostay

T24gRnJpLCAyMDE4LTExLTA5IGF0IDExOjQ0ICswMTAwLCBGYWJyaWNlIEdhc25pZXIgd3JvdGU6
DQo+IE9uIDExLzkvMTggMTE6MDMgQU0sIEFyZGVsZWFuLCBBbGV4YW5kcnUgd3JvdGU6DQo+ID4g
T24gU2F0LCAyMDE4LTExLTAzIGF0IDE4OjE5ICswMDAwLCBKb25hdGhhbiBDYW1lcm9uIHdyb3Rl
Og0KPiA+ID4gT24gRnJpLCAyMiBKdW4gMjAxOCAxNjo1MzoyMiArMDMwMA0KPiA+ID4gQWxleGFu
ZHJ1IEFyZGVsZWFuIDxhbGV4YW5kcnUuYXJkZWxlYW5AYW5hbG9nLmNvbT4gd3JvdGU6DQo+ID4g
DQo+ID4gSGV5LA0KPiA+IA0KPiA+IFRoYW5rcyBmb3IgdGFraW5nIHRoZSB0aW1lIGZvciB0aGlz
LCBKb25hdGhhbi4NCj4gPiANCj4gPiA+IA0KPiA+ID4gPiBBbGwgZGV2aWNlcyB1c2luZyBhIHRy
aWdnZXJlZCBidWZmZXIgbmVlZCB0byBhdHRhY2ggYW5kIGRldGFjaCB0aGUNCj4gPiA+ID4gdHJp
Z2dlcg0KPiA+ID4gPiB0byB0aGUgZGV2aWNlIGluIG9yZGVyIHRvIHByb3Blcmx5IHdvcmsuIElu
c3RlYWQgb2YgZG9pbmcgdGhpcyBpbg0KPiA+ID4gPiBlYWNoDQo+ID4gPiA+IGFuZA0KPiA+ID4g
PiBldmVyeSBkcml2ZXIgYnkgaGFuZCBtb3ZlIHRoaXMgaW50byB0aGUgY29yZS4NCj4gPiA+ID4g
DQo+ID4gPiA+IFNpZ25lZC1vZmYtYnk6IExhcnMtUGV0ZXIgQ2xhdXNlbiA8bGFyc0BtZXRhZm9v
LmRlPg0KPiA+ID4gPiBTaWduZWQtb2ZmLWJ5OiBBbGV4YW5kcnUgQXJkZWxlYW4gPGFsZXhhbmRy
dS5hcmRlbGVhbkBhbmFsb2cuY29tPg0KPiA+ID4gPiAtLS0NCj4gPiA+ID4gDQo+ID4gPiA+IE5v
dGU6IGBTaWduZWQtb2ZmLWJ5YCBpcyBhbHNvIExhcnMtUGV0ZXIgQ2xhdXNlbiBiZWNhdXNlIGhl
IGlzIHRoZQ0KPiA+ID4gPiBvcmlnaW5hbCBhdXRob3Igb2YgdGhpcyBwYXRjaCBbb24gYW4gb2xk
ZXIga2VybmVsXS4NCj4gPiA+ID4gVGhlIHBhdGNoIGhhcyBiZWVuIHVwZGF0ZWQgc2luY2UgdGhl
IG9yaWdpbmFsIHBhdGNoIGZyb20gTGFycy4NCj4gPiA+ID4gDQo+ID4gPiA+IFRoZXJlIGhhcyBi
ZWVuIGEgKHNtYWxsKSBkaXNjdXNzaW9uIGFib3V0IHdoZXRoZXIgc3VjaCBhIHBhdGNoDQo+ID4g
PiA+IG1ha2VzDQo+ID4gPiA+IHNlbnNlIHRvIGltcGxlbWVudCAoZm9yIHJlZHVjaW5nIGNvZGUg
ZHVwbGljYXRpb24pLCBvciB3aGV0aGVyIGl0J3MNCj4gPiA+ID4gdG9vDQo+ID4gPiA+IHJpc2t5
IHRvIGRvIGl0Lg0KPiA+ID4gPiANCj4gPiA+ID4gVGhlIHJlYXNvbiBmb3IgdGhlIHJpc2t5LW5l
c3MgaXMgdGhhdCB0aGVyZSBpcyBubyBjb25zaXN0ZW50IHdheSBpbg0KPiA+ID4gPiB3aGljaA0K
PiA+ID4gPiBkcml2ZXJzIGF0dGFjaC9kZXRhY2ggdGhlIHBvbGwgZnVuY3Rpb24uDQo+ID4gPiA+
IGkuZS4NCj4gPiA+ID4gICAgMS4gc29tZSBkcml2ZXJzIGNhbGwgYGlpb190cmlnZ2VyZWRfYnVm
ZmVyX3Bvc3RlbmFibGUoKWAgYmVmb3JlDQo+ID4gPiA+IGRvaW5nIEhXDQo+ID4gPiA+ICAgICAg
IHN0dWZmLCBzb21lIGFmdGVyIChmb3IgYXR0YWNoaW5nIHRoZSBwb2xsIGZ1bmMpDQo+ID4gPiA+
ICAgIDIuIHNpbWlsYXJseSwgZm9yIGBpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9wcmVkaXNhYmxlKClg
IHNvbWUNCj4gPiA+ID4gZHJpdmVycw0KPiA+ID4gPiBkbyBpdA0KPiA+ID4gPiAgICAgICBiZWZv
cmUgSFcgc3R1ZmYsIHNvbWUgYWZ0ZXIgKGZvciBkZXRhY2hpbmcgdGhlIHBvbGwgZnVuYykNCj4g
PiA+ID4gDQo+ID4gPiA+IENvbW1vbiBzZW5zZSB3b3VsZCBkaWN0YXRlIHRoYXQgKGluIHRoZSBj
YXNlIG9mDQo+ID4gPiA+IGBpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9wb3N0ZW5hYmxlKClgKSB0aGVy
ZSB3b3VsZCBub3JtYWxseSBiZSBIVw0KPiA+ID4gPiBzZXR1cA0KPiA+ID4gPiBmaXJzdA0KPiA+
ID4gPiBhbmQgdGhlbiBhdHRhY2ggdGhlIHBvbGwgZnVuYy4NCj4gPiA+ID4gQW5kIHRoZSByZXZl
cnNlIGRvbmUgZm9yIGBpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9wcmVkaXNhYmxlKClgLg0KPiA+ID4g
DQo+ID4gPiBJJ20gc3VyZSBJIG9uY2UgaGFkIHRoZSBmbG93IGFyb3VuZCB0aGlzIGFsbCB3ZWxs
IGxhaWQgb3V0LCBidXQgSQ0KPiA+ID4gcmVhbGx5DQo+ID4gPiBjYW4ndCByZWNhbGwgd2hhdCBp
dCB3YXMgYW5kIGl0IHdhcyBhbGwgdGllZCBhcm91bmQgdHJ5aW5nIHRvIGRvIHRoZQ0KPiA+ID4g
YnVmZmVyIGVuYWJsZSBhcyBsb2NrbGVzcyBhcyBwb3NzaWJsZS4gWWVhcnMgYWdvIExhcnMgcG9p
bnRlZCBvdXQNCj4gPiA+IHRoYXQNCj4gPiA+IHdhcyBpbXBvc3NpYmxlIHNvIGEgbG90IG9mIHRo
ZSBsb2dpYyBoYXMgYmVlbiBtZXNzZWQgdXAgc2luY2UgdGhlbi4NCj4gPiA+IA0KPiA+ID4gQW55
aG93LCBJJ3ZlIHB1dCB0aGlzIG9mZiBsb25nIGVub3VnaCAoc29ycnkgYWJvdXQgdGhhdCAtIGp1
c3QgbmV3IGl0DQo+ID4gPiB3YXMgZ29pbmcgdG8gaW52b2x2ZSBzb21lIGhlYWQgc2NyYXRjaGlu
ZyEpICBDcnVjaWFsbHkgSSBoYXZlIGFub3RoZXINCj4gPiA+IHBsYW4uICBGaWd1cmUgb3V0IHdo
aWNoIGRyaXZlcnMgdGhpcyBhY3R1YWxseSBtYWtlcyBhIGRpZmZlcmVuY2UgdG8NCj4gPiA+IGFu
ZCB0aGFua2Z1bGx5IGluIG1vc3QgY2FzZXMgdGhlIGF1dGhvciBpcyBzdGlsbCBhY3RpdmUgOikN
Cj4gPiA+IA0KPiA+ID4gDQo+ID4gPiA+IA0KPiA+ID4gPiBIb3dldmVyLCBpdCdzIHVuY2xlYXIg
d2hldGhlciB0aGlzIHJlYXNvbmluZyBpcyBjb21wbGV0ZWx5IHNvdW5kDQo+ID4gPiA+IGZvcg0K
PiA+ID4gPiBhbGwNCj4gPiA+ID4gZHJpdmVycy4NCj4gPiA+ID4gDQo+ID4gPiA+IEhlbmNlIHRo
aXMgUkZDLg0KPiA+ID4gDQo+ID4gPiBJJ3ZlIGN1bGxlZCB0aGUgY2FzZXMgdGhhdCBhcmUgb2J2
aW91cy4gIEVpdGhlciBqdXN0IHRoZSBkZWZhdWx0cyBvcg0KPiA+ID4gd2hlcmUgd2UgZG8gdGhl
IGNhbGxzIGF0IHRoZSBlbmQgb2YgZW5hYmxlIGFuZCBzdGFydCBvZiBkaXNhYmxlLg0KPiA+ID4g
DQo+ID4gPiBJbiB0aG9zZSB0aGVyZSBpcyBubyBvcmRlcmluZyBjaGFuZ2UuDQo+ID4gPiANCj4g
PiA+IFRoZXJlIGFyZSBzb21lIG9kZCBvbmVzDQo+ID4gPiBncDJhcDAyMGEwMGYgZG9lcyBpdCB1
bmRlciBhIGxvY2suIFdoaWNoIG1ha2VzIG5vIGRpZmZlcmVuY2UuDQo+ID4gPiBpc2wyOTEyNSB0
b3RhbGx5IG1pc3NiYWxhbmNlZCBzbyB0aGUgcHJlZW5hYmxlIGRvZXMgdGhpbmdzIHVuZG9uZSBp
bg0KPiA+ID4gdGhlDQo+ID4gPiAgICBwcmVkaXNhYmxlLiAgSSB3b25kZXIgaWYgYW55b25lIGhh
cyBvbmUgdG8gYWxsb3cgdXMgdG8gdGVzdA0KPiA+ID4gY2xlYW5pbmcNCj4gPiA+ICAgIHRoYXQg
dXAuIE5vIGZsb3cgY2hhbmdlIGR1ZSB0byB0aGlzIHBhdGNoIHRob3VnaCBzbyBmaW5lLg0KPiA+
ID4gdGNzMzQxNCBpcyBtdWNoIHRoZSBzYW1lIGFzIHRoZSBpc2wyOTEyNS4NCj4gPiA+IGxtcDkx
MDAwPz8gSXMgYWJvdXQgYWxsIEkgY2FuIHNheSBvbiB0aGF0LiAgSXQgZGV0YWNoZXMgYSBwb2xs
DQo+ID4gPiBmdW5jdGlvbg0KPiA+ID4gdGhhdA0KPiA+ID4gd2FzIG5ldmVyIGF0dGFjaGVkLg0K
PiA+ID4gDQo+ID4gPiBBbnlob3csIHNvIHdoYXQncyBsZWZ0IChob3BlZnVsbHkgd2UgaGF2ZW4n
dCBoYWQgYW55IGNyYXppZXMgc2luY2UNCj4gPiA+IHlvdSBwb3N0ZWQgdGhpcyBwYXRjaC4gSSds
bCBjaGVjayBhdCBzb21lcG9pbnQpDQo+ID4gPiANCj4gPiA+ID4gIGRyaXZlcnMvaWlvL2FkYy9h
ZF9zaWdtYV9kZWx0YS5jICAgICAgICAgICAgICB8ICA1IC0tLS0NCj4gPiA+IA0KPiA+ID4gSSds
bCBhc3N1bWUgeW91IGFyZSBmaW5lIHdpdGggdGhhdCBvbmUgOykNCj4gPiA+IA0KPiA+ID4gPiAg
ZHJpdmVycy9paW8vYWRjL2RsbjItYWRjLmMgICAgICAgICAgICAgICAgICAgIHwgIDQgKy0tDQo+
ID4gPiANCj4gPiA+ICsgQ0MgSmFjayBBbmRlcnNvbiAod29yc3QgY29tZXMgdG8gdGhlIHdvcnN0
IEkgaGF2ZSBvbmUgb2YgdGhlc2UgYW5kDQo+ID4gPiBjYW4NCj4gPiA+ICAgICAgcnVuIGJhc2lj
IHRlc3RzKS4NCj4gPiA+IA0KPiA+ID4gPiAgZHJpdmVycy9paW8vYWRjL3N0bTMyLWFkYy5jICAg
ICAgICAgICAgICAgICAgIHwgMTEgLS0tLS0tLS0NCj4gPiA+IA0KPiA+ID4gKyBDQyBGYWJyaWNl
DQo+IA0KPiBIaSBBcmRlbGVhbiwgSm9uYXRoYW4sDQo+IA0KPiBUaGFua3MgZm9yIENDJ2luZyBt
ZS4gUGxlYXNlIGZpbmQgbXkgY29tbWVudHMgaGVyZSBoZXJlIGFmdGVyLg0KPiANCj4gPiA+IA0K
PiA+ID4gPiAgZHJpdmVycy9paW8vYWRjL3ZmNjEwX2FkYy5jICAgICAgICAgICAgICAgICAgIHwg
IDYgKy0tLS0NCj4gPiA+IA0KPiA+ID4gKyBDQyBTYW5jaGF5YW4gd2hvIG1pZ2h0IHN0aWxsIGhh
dmUgYWNjZXNzIHRvIG9uZSBvZiB0aGVzZQ0KPiA+ID4gKyBCaHV2YW5jaGFuZGEgd2hvIGZpeGVk
IGEgYnVnIG5vdCBzbyBsb25nIGFnby4uLg0KPiA+ID4gDQo+ID4gPiA+ICBkcml2ZXJzL2lpby9j
aGVtaWNhbC9hdGxhcy1waC1zZW5zb3IuYyAgICAgICAgfCAgOCAtLS0tLS0NCj4gPiA+IA0KPiA+
ID4gKyBDQyBNYXR0IHdobyBpcyBkZWZpbml0ZWx5IHN0aWxsIGNvbnRhY3RhYmxlIGFzIEkgbWV0
IGhpbSBsYXN0IHdlZWsNCj4gPiA+IDspDQo+ID4gPiANCj4gPiA+ID4gIGRyaXZlcnMvaWlvL3Bv
dGVudGlvc3RhdC9sbXA5MTAwMC5jICAgICAgICAgICB8ICAxIC0NCj4gPiA+IA0KPiA+ID4gQW5v
dGhlciBvZiBNYXR0J3MuICBPbiB0aGlzIG9uZSwgSSdtIG5vdCBzdXJlIHdobyBpdCBhdHRhY2hl
cw0KPiA+ID4gdGhlIHBvbGxmdW5jIGluIHRoZSBmaXJzdCBwbGFjZS4gIEkgbWF5IGJlIGdvaW5n
IGNyYXp5IGhvd2V2ZXIsIHNvDQo+ID4gPiBvdmVyIHRvIE1hdHQgdG8gcG9pbnQgb3V0IHdoYXQg
SSdtIG1pc3NpbmcuDQo+ID4gPiANCj4gPiA+IFNvIHRoZSBhY3R1YWwgY2hhbmdlIHRoYXQgbWF0
dGVycyBpczoNCj4gPiA+IA0KPiA+ID4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vaW5kdXN0
cmlhbGlvLWJ1ZmZlci5jDQo+ID4gPiA+IGIvZHJpdmVycy9paW8vaW5kdXN0cmlhbGlvLWJ1ZmZl
ci5jDQo+ID4gPiA+IGluZGV4IGNkNWJmZTM5NTkxYi4uZDhlYjUzNGE5NTQ0IDEwMDY0NA0KPiA+
ID4gPiAtLS0gYS9kcml2ZXJzL2lpby9pbmR1c3RyaWFsaW8tYnVmZmVyLmMNCj4gPiA+ID4gKysr
IGIvZHJpdmVycy9paW8vaW5kdXN0cmlhbGlvLWJ1ZmZlci5jDQo+ID4gPiA+IEBAIC0yNCw2ICsy
NCw3IEBADQo+ID4gPiA+ICANCj4gPiA+ID4gICNpbmNsdWRlIDxsaW51eC9paW8vaWlvLmg+DQo+
ID4gPiA+ICAjaW5jbHVkZSAiaWlvX2NvcmUuaCINCj4gPiA+ID4gKyNpbmNsdWRlICJpaW9fY29y
ZV90cmlnZ2VyLmgiDQo+ID4gPiA+ICAjaW5jbHVkZSA8bGludXgvaWlvL3N5c2ZzLmg+DQo+ID4g
PiA+ICAjaW5jbHVkZSA8bGludXgvaWlvL2J1ZmZlci5oPg0KPiA+ID4gPiAgI2luY2x1ZGUgPGxp
bnV4L2lpby9idWZmZXJfaW1wbC5oPg0KPiA+ID4gPiBAQCAtOTYxLDYgKzk2MiwxMyBAQCBzdGF0
aWMgaW50IGlpb19lbmFibGVfYnVmZmVycyhzdHJ1Y3QgaWlvX2Rldg0KPiA+ID4gPiAqaW5kaW9f
ZGV2LA0KPiA+ID4gPiAgCQl9DQo+ID4gPiA+ICAJfQ0KPiA+ID4gPiAgDQo+ID4gPiA+ICsJaWYg
KGluZGlvX2Rldi0+Y3VycmVudG1vZGUgPT0gSU5ESU9fQlVGRkVSX1RSSUdHRVJFRCkgew0KPiA+
ID4gPiArCQlyZXQgPSBpaW9fdHJpZ2dlcl9hdHRhY2hfcG9sbF9mdW5jKGluZGlvX2Rldi0+dHJp
ZywNCj4gPiA+ID4gKwkJCQkJCSAgIGluZGlvX2Rldi0NCj4gPiA+ID4gPnBvbGxmdW5jKTsNCj4g
PiA+ID4gKwkJaWYgKHJldCkNCj4gPiA+ID4gKwkJCWdvdG8gZXJyX2Rpc2FibGVfYnVmZmVyczsN
Cj4gPiA+ID4gKwl9DQo+ID4gPiA+ICsNCj4gPiA+IA0KPiA+ID4gVGhpcyBpcyBpbW1lZGlhdGVs
eSBhZnRlciB0aGUgcG9zdGVuYWJsZSBjYWxsLg0KPiA+ID4gDQo+ID4gDQo+ID4gSSdtIHZhZ3Vl
IGhlcmUgYWJvdXQgeW91ciBjb21tZW50Lg0KPiA+IERvIEkgbmVlZCB0byBjaGFuZ2Ugc29tZXRo
aW5nID8NCj4gPiANCj4gDQo+IEkgaGF2ZSBzb21lIGNvbmNlcm4gYWJvdXQgdGhlIG9yZGVyaW5n
IGhlcmUgYXMgd2VsbCwgcmVnYXJkaW5nDQo+IHN0bTMyLWFkYy5jOiBJIHRoaW5rIHRoaXMgaXMg
c2FtZSBjYXNlIGFzIGFkX3NpZ21hX2RlbHRhLmMgKEkgaGF2ZW4ndA0KPiBjaGVja2VkIHRoZSBv
dGhlcnMpLg0KPiANCj4gV2l0aCB0aGlzIHBhdGNoLCBpbiBzdG0zMi1hZGMgY2FzZSwgdGhlIGhh
cmR3YXJlIGdldHMgc3RhcnRlZCAoZS5nLg0KPiBnZXR0aW5nIGRhdGEgd2l0aCBpbnRlcnJ1cHRz
IG9yIGRtYSkgYmVmb3JlIHRoZSBoYW5kbGVyIGhhcyBiZWVuDQo+IGF0dGFjaGVkOg0KPiAtPiBp
aW9fdHJpZ2dlcmVkX2J1ZmZlcl9wb3N0ZW5hYmxlDQo+ICAtPiBpaW9fdHJpZ2dlcl9hdHRhY2hf
cG9sbF9mdW5jDQo+ICAgLT4gcmVxdWVzdF90aHJlYWRlZF9pcnENCj4gDQo+IEkgaGF2ZW4ndCB0
ZXN0ZWQgaXQsIGJ1dCBJIHRoaW5rIHRoaXMgaXMgcmFjeS4gSSBmZWVsIGxpa2UNCj4gaWlvX3Ry
aWdnZXJfYXR0YWNoX3BvbGxfZnVuYyBzaG91bGQgaGFwcGVuIGJlZm9yZSBwb3N0ZW5hYmxlIGNh
bGwNCj4gKHJhdGhlciB0aGFuIGFmdGVyKSwgc2VlIGFmdGVyIHN0bTMyLWFkYy5jLg0KPiANCg0K
SW4gb3VyIGludGVybmFsIHRyZWUgaXQgc2VlbXMgdG8gYmUgZG9uZSBpbiB0aGUgd2F5IHRoYXQg
eW91IG1lbnRpb24uDQooaS5lLiBhdHRhY2ggcG9sbF9mdW5jLCB0aGVuIGNhbGwgcG9zdF9lbmFi
bGUpDQpTZWU6DQoNCmh0dHBzOi8vZ2l0aHViLmNvbS9hbmFsb2dkZXZpY2VzaW5jL2xpbnV4L2Nv
bW1pdC9lZWU5N2QxMjY2NWZlZjhjZjQyOWExZTUwMzViMjNhZTk2OTcwNWI4I2RpZmYtMGE4Nzc0
NGNlOTQ1ZDJjMWM4OWVhMTlmMjFmYjM1YmJSNzIyDQoNCkkgY2FuJ3QgcmVtZW1iZXIgdGhlIGRl
dGFpbHMgb2YgdGhlIGRpc2N1c3Npb24gd2UgaGFkIFtpbnRlcm5hbGx5XSBhYm91dA0KaXQsIGFu
ZCB3aGVuIEkgc2VudCB0aGUgcGF0Y2gsIEkgZGlkIGl0IHRoZSBvdGhlciB3YXkgYXJvdW5kLg0K
SSBndWVzcyBJIHdhcyBjb25mdXNlZCBhYm91dCB0aGlzIGJlaW5nIGRvbmUgb25lIHdheSBvciB0
aGUgb3RoZXIsIGFuZCBJDQpwcm9iYWJseSB0aG91Z2h0IHRoYXQgdGhpcyBtYXkgYmUgdGhlIGdv
b2QgYXBwcm9hY2ggKHdoZW4gSSBzZW50IHRoZSBSRkMNCnBhdGNoKS4NCk1pbmQgeW91LCBJJ20g
bm90IHlldCB0aGF0IGZhbWlsaWFyIHlldCB3aXRoIElJTyBpbnRlcm5hbHMvc3VidGxldGllcy4N
Cg0KQnV0LCB5b3VyIGV4cGxhbmF0aW9uIG1ha2VzIHNlbnNlLiBBbmQgY29uZmlybXMgdGhlIGlu
aXRpYWwgcGF0Y2ggdGhhdCBMYXJzDQpkaWQgaW4gb3VyIHRyZWUuDQoNCk1heWJlIG9uZSB3YXkg
dG8gbG9vayBhdCB0aGlzIGlzIHRoYXQsIHNpbmNlIGl0J3MgYmVlbiB3b3JraW5nIGluIG91ciB0
cmVlDQpmb3IgYSBmZXcgeWVhcnMgbm93LCBpdCBjb3VsZCBiZSB0aGUgZ29vZCBhcHByb2FjaC4N
CkFuZCBpdCdzIGdvb2QgdGhhdCBpdCdzIGNvbmZpcm1lZCBhYm91dCBzb21lb25lIGVsc2UuDQoN
ClRoYW5rcw0KQWxleA0KDQo+ID4gPiA+ICAJcmV0dXJuIDA7DQo+ID4gPiA+ICANCj4gPiA+ID4g
IGVycl9kaXNhYmxlX2J1ZmZlcnM6DQo+ID4gPiA+IEBAIC05ODcsNiArOTk1LDExIEBAIHN0YXRp
YyBpbnQgaWlvX2Rpc2FibGVfYnVmZmVycyhzdHJ1Y3QgaWlvX2Rldg0KPiA+ID4gPiAqaW5kaW9f
ZGV2KQ0KPiA+ID4gPiAgCWlmIChsaXN0X2VtcHR5KCZpbmRpb19kZXYtPmJ1ZmZlcl9saXN0KSkN
Cj4gPiA+ID4gIAkJcmV0dXJuIDA7DQo+ID4gPiA+ICANCj4gPiA+IA0KPiA+ID4gVGhpcyBpcyBp
bW1lZGlhdGVseSBiZWZvcmUgdGhlIHByZWRpc2FibGUgY2FsbC4NCj4gPiANCj4gPiBTYW1lIGhl
cmUgYXMgYWJvdmU6DQo+ID4gYGBgDQo+ID4gSSdtIHZhZ3VlIGhlcmUgYWJvdXQgeW91ciBjb21t
ZW50Lg0KPiA+IERvIEkgbmVlZCB0byBjaGFuZ2Ugc29tZXRoaW5nID8NCj4gPiBgYGANCj4gPiAN
Cj4gDQo+IFNhbWUgaGVyZSAoYXQgbGVhc3QgZm9yIHN0bTMyLWFkYyBjYXNlKTogdGhlIGhhbmRs
ZXIgZ2V0cyB1bnJlZ2lzdGVyZWQNCj4gYnV0IHRoZSBoYXJkd2FyZSBpcyBzdGlsbCBydW5uaW5n
IChlLmcuIGdldHRpbmcgZGF0YSB3aXRoIGludGVycnVwdHMgb3INCj4gZG1hKS4NCj4gDQo+IEkn
ZCBwcmVmZXIgdGhlIG90aGVyIHdheSA6LSk6DQo+IC0gdXBvbiBlbmFibGU6IGF0dGFjaCB0aGUg
cG9sbCBmdW5jLCB0aGVuIHN0YXJ0IHRoZSBIVw0KPiAtIHVwb24gZGlzYWJsZTogc3RvcCB0aGUg
SFcsIGRldGFjaCB0aGUgcG9sbCBmdW5jDQo+IA0KPiA+ID4gDQo+ID4gPiA+ICsJaWYgKGluZGlv
X2Rldi0+Y3VycmVudG1vZGUgPT0gSU5ESU9fQlVGRkVSX1RSSUdHRVJFRCkgew0KPiA+ID4gPiAr
CQlpaW9fdHJpZ2dlcl9kZXRhY2hfcG9sbF9mdW5jKGluZGlvX2Rldi0+dHJpZywNCj4gPiA+ID4g
KwkJCQkJICAgICBpbmRpb19kZXYtPnBvbGxmdW5jKTsNCj4gPiA+ID4gKwl9DQo+ID4gPiA+ICsN
Cj4gPiA+ID4gIAkvKg0KPiA+ID4gPiAgCSAqIElmIHRoaW5ncyBnbyB3cm9uZyBhdCBzb21lIHN0
ZXAgaW4gZGlzYWJsZSB3ZSBzdGlsbCBuZWVkDQo+ID4gPiA+IHRvDQo+ID4gPiA+IGNvbnRpbnVl
DQo+ID4gPiA+ICAJICogdG8gcGVyZm9ybSB0aGUgb3RoZXIgc3RlcHMsIG90aGVyd2lzZSB3ZSBs
ZWF2ZSB0aGUNCj4gPiA+ID4gZGV2aWNlIGluIGENCj4gPiA+ID4gZGlmZiAtLWdpdCBhL2RyaXZl
cnMvaWlvL2luZHVzdHJpYWxpby10cmlnZ2VyLmMNCj4gPiA+ID4gYi9kcml2ZXJzL2lpby9pbmR1
c3RyaWFsaW8tdHJpZ2dlci5jDQo+ID4gPiA+IGluZGV4IGNlNjY2OTljN2ZjYy4uYTRkYWNiNjM4
YTcyIDEwMDY0NA0KPiA+ID4gPiAtLS0gYS9kcml2ZXJzL2lpby9pbmR1c3RyaWFsaW8tdHJpZ2dl
ci5jDQo+ID4gPiA+ICsrKyBiL2RyaXZlcnMvaWlvL2luZHVzdHJpYWxpby10cmlnZ2VyLmMNCj4g
PiA+ID4gQEAgLTI0Miw4ICsyNDIsOCBAQCBzdGF0aWMgdm9pZCBpaW9fdHJpZ2dlcl9wdXRfaXJx
KHN0cnVjdA0KPiA+ID4gPiBpaW9fdHJpZ2dlcg0KPiA+ID4gPiAqdHJpZywgaW50IGlycSkNCj4g
PiA+ID4gICAqIHRoZSByZWxldmFudCBmdW5jdGlvbiBpcyBpbiB0aGVyZSBtYXkgYmUgdGhlIGJl
c3Qgb3B0aW9uLg0KPiA+ID4gPiAgICovDQo+ID4gPiA+ICAvKiBXb3J0aCBwcm90ZWN0aW5nIGFn
YWluc3QgZG91YmxlIGFkZGl0aW9ucz8gKi8NCj4gPiA+ID4gLXN0YXRpYyBpbnQgaWlvX3RyaWdn
ZXJfYXR0YWNoX3BvbGxfZnVuYyhzdHJ1Y3QgaWlvX3RyaWdnZXIgKnRyaWcsDQo+ID4gPiA+IC0J
CQkJCXN0cnVjdCBpaW9fcG9sbF9mdW5jICpwZikNCj4gPiA+ID4gK2ludCBpaW9fdHJpZ2dlcl9h
dHRhY2hfcG9sbF9mdW5jKHN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZywNCj4gPiA+ID4gKwkJCQkg
c3RydWN0IGlpb19wb2xsX2Z1bmMgKnBmKQ0KPiA+ID4gPiAgew0KPiA+ID4gPiAgCWludCByZXQg
PSAwOw0KPiA+ID4gPiAgCWJvb2wgbm90aW51c2UNCj4gPiA+ID4gQEAgLTI5MCw4ICsyOTAsOCBA
QCBzdGF0aWMgaW50IGlpb190cmlnZ2VyX2F0dGFjaF9wb2xsX2Z1bmMoc3RydWN0DQo+ID4gPiA+
IGlpb190cmlnZ2VyICp0cmlnLA0KPiA+ID4gPiAgCXJldHVybiByZXQ7DQo+ID4gPiA+ICB9DQo+
ID4gPiA+ICANCj4gPiA+ID4gLXN0YXRpYyBpbnQgaWlvX3RyaWdnZXJfZGV0YWNoX3BvbGxfZnVu
YyhzdHJ1Y3QgaWlvX3RyaWdnZXIgKnRyaWcsDQo+ID4gPiA+IC0JCQkJCSBzdHJ1Y3QgaWlvX3Bv
bGxfZnVuYyAqcGYpDQo+ID4gPiA+ICtpbnQgaWlvX3RyaWdnZXJfZGV0YWNoX3BvbGxfZnVuYyhz
dHJ1Y3QgaWlvX3RyaWdnZXIgKnRyaWcsDQo+ID4gPiA+ICsJCQkJIHN0cnVjdCBpaW9fcG9sbF9m
dW5jICpwZikNCj4gPiA+ID4gIHsNCj4gPiA+ID4gIAlpbnQgcmV0ID0gMDsNCj4gPiA+ID4gIAli
b29sIG5vX290aGVyX3VzZXJzDQo+ID4gPiA+IEBAIC03NTgsMTcgKzc1OCwzIEBAIHZvaWQNCj4g
PiA+ID4gaWlvX2RldmljZV91bnJlZ2lzdGVyX3RyaWdnZXJfY29uc3VtZXIoc3RydWN0DQo+ID4g
PiA+IGlpb19kZXYgKmluZGlvX2RldikNCj4gPiA+ID4gIAlpZiAoaW5kaW9fZGV2LT50cmlnKQ0K
PiA+ID4gPiAgCQlpaW9fdHJpZ2dlcl9wdXQoaW5kaW9fZGV2LT50cmlnKTsNCj4gPiA+ID4gIH0N
Cj4gPiA+ID4gLQ0KPiA+ID4gPiAtaW50IGlpb190cmlnZ2VyZWRfYnVmZmVyX3Bvc3RlbmFibGUo
c3RydWN0IGlpb19kZXYgKmluZGlvX2RldikNCj4gPiA+ID4gLXsNCj4gPiA+ID4gLQlyZXR1cm4g
aWlvX3RyaWdnZXJfYXR0YWNoX3BvbGxfZnVuYyhpbmRpb19kZXYtPnRyaWcsDQo+ID4gPiA+IC0J
CQkJCSAgICBpbmRpb19kZXYtPnBvbGxmdW5jKTsNCj4gPiA+ID4gLX0NCj4gPiA+ID4gLUVYUE9S
VF9TWU1CT0woaWlvX3RyaWdnZXJlZF9idWZmZXJfcG9zdGVuYWJsZSk7DQo+ID4gPiA+IC0NCj4g
PiA+ID4gLWludCBpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9wcmVkaXNhYmxlKHN0cnVjdCBpaW9fZGV2
ICppbmRpb19kZXYpDQo+ID4gPiA+IC17DQo+ID4gPiA+IC0JcmV0dXJuIGlpb190cmlnZ2VyX2Rl
dGFjaF9wb2xsX2Z1bmMoaW5kaW9fZGV2LT50cmlnLA0KPiA+ID4gPiAtCQkJCQkgICAgIGluZGlv
X2Rldi0+cG9sbGZ1bmMpOw0KPiA+ID4gPiAtfQ0KPiA+ID4gPiAtRVhQT1JUX1NZTUJPTChpaW9f
dHJpZ2dlcmVkX2J1ZmZlcl9wcmVkaXNhYmxlKTsNCj4gPiA+IA0KPiA+ID4gDQo+ID4gPiANCj4g
PiA+IA0KPiA+ID4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWRjL2FkX3NpZ21hX2RlbHRh
LmMNCj4gPiA+ID4gYi9kcml2ZXJzL2lpby9hZGMvYWRfc2lnbWFfZGVsdGEuYw0KPiA+ID4gPiBp
bmRleCBjZjFiMDQ4YjA2NjUuLmVmMDQ2Mjc3YmY3YiAxMDA2NDQNCj4gPiA+ID4gLS0tIGEvZHJp
dmVycy9paW8vYWRjL2FkX3NpZ21hX2RlbHRhLmMNCj4gPiA+ID4gKysrIGIvZHJpdmVycy9paW8v
YWRjL2FkX3NpZ21hX2RlbHRhLmMNCj4gPiA+ID4gQEAgLTMzOCwxMCArMzM4LDYgQEAgc3RhdGlj
IGludCBhZF9zZF9idWZmZXJfcG9zdGVuYWJsZShzdHJ1Y3QNCj4gPiA+ID4gaWlvX2Rldg0KPiA+
ID4gPiAqaW5kaW9fZGV2KQ0KPiA+ID4gPiAgCXVuc2lnbmVkIGludCBjaGFubmVsOw0KPiA+ID4g
PiAgCWludCByZXQ7DQo+ID4gPiA+ICANCj4gPiA+ID4gLQlyZXQgPSBpaW9fdHJpZ2dlcmVkX2J1
ZmZlcl9wb3N0ZW5hYmxlKGluZGlvX2Rldik7DQo+ID4gPiA+IC0JaWYgKHJldCA8IDApDQo+ID4g
PiA+IC0JCXJldHVybiByZXQ7DQo+ID4gPiA+IC0NCj4gPiA+IA0KPiA+ID4gSGVyZSBpcyBvbmUg
d2hlcmUgdGhlIG9yZGVyaW5nIGFjdHVhbGx5IGNoYW5nZXMuIEknbSBnb2luZyB0byBob3BlDQo+
ID4gPiB5b3UNCj4gPiA+IGNvbmNsdWRlZA0KPiA+ID4gdGhpcyBvbmUgd2FzIGZpbmUgOykNCj4g
PiA+IA0KPiA+IA0KPiA+IFllcCwgdGhpcyBwYXRjaCBzaG91bGQgYmUgZmluZSAoZm9yIHRoZSBh
ZF9zaWdtYV9kZWx0YS5jIGNoYW5nZSkuDQo+ID4gSXQncyBiZWVuIGluIG91ciB0cmVlIGZvciBh
IHdoaWxlLg0KPiA+IA0KPiA+ID4gPiAgCWNoYW5uZWwgPSBmaW5kX2ZpcnN0X2JpdChpbmRpb19k
ZXYtPmFjdGl2ZV9zY2FuX21hc2ssDQo+ID4gPiA+ICAJCQkJIGluZGlvX2Rldi0+bWFza2xlbmd0
aCk7DQo+ID4gPiA+ICAJcmV0ID0gYWRfc2lnbWFfZGVsdGFfc2V0X2NoYW5uZWwoc2lnbWFfZGVs
dGEsDQo+ID4gPiA+IEBAIC00MjYsNyArNDIyLDYgQEAgc3RhdGljIGlycXJldHVybl90IGFkX3Nk
X3RyaWdnZXJfaGFuZGxlcihpbnQNCj4gPiA+ID4gaXJxLA0KPiA+ID4gPiB2b2lkICpwKQ0KPiA+
ID4gPiAgDQo+ID4gPiA+ICBzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19idWZmZXJfc2V0dXBfb3Bz
IGFkX3NkX2J1ZmZlcl9zZXR1cF9vcHMgPQ0KPiA+ID4gPiB7DQo+ID4gPiA+ICAJLnBvc3RlbmFi
bGUgPSAmYWRfc2RfYnVmZmVyX3Bvc3RlbmFibGUsDQo+ID4gPiA+IC0JLnByZWRpc2FibGUgPSAm
aWlvX3RyaWdnZXJlZF9idWZmZXJfcHJlZGlzYWJsZSwNCj4gPiA+ID4gIAkucG9zdGRpc2FibGUg
PSAmYWRfc2RfYnVmZmVyX3Bvc3RkaXNhYmxlLA0KPiA+ID4gPiAgCS52YWxpZGF0ZV9zY2FuX21h
c2sgPSAmaWlvX3ZhbGlkYXRlX3NjYW5fbWFza19vbmVob3QsDQo+ID4gPiA+ICB9Ow0KPiA+ID4g
PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWRjL2RsbjItYWRjLmMgYi9kcml2ZXJzL2lpby9h
ZGMvZGxuMi0NCj4gPiA+ID4gYWRjLmMNCj4gPiA+ID4gaW5kZXggYzY0YzY2NzVjYWU2Li41MTEz
NWU3YzBkNGYgMTAwNjQ0DQo+ID4gPiA+IC0tLSBhL2RyaXZlcnMvaWlvL2FkYy9kbG4yLWFkYy5j
DQo+ID4gPiA+ICsrKyBiL2RyaXZlcnMvaWlvL2FkYy9kbG4yLWFkYy5jDQo+ID4gPiA+IEBAIC01
NjAsNyArNTYwLDcgQEAgc3RhdGljIGludA0KPiA+ID4gPiBkbG4yX2FkY190cmlnZ2VyZWRfYnVm
ZmVyX3Bvc3RlbmFibGUoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikNCj4gPiA+ID4gIAkJbXV0
ZXhfdW5sb2NrKCZkbG4yLT5tdXRleCk7DQo+ID4gPiA+ICAJfQ0KPiA+ID4gPiAgDQo+ID4gPiA+
IC0JcmV0dXJuIGlpb190cmlnZ2VyZWRfYnVmZmVyX3Bvc3RlbmFibGUoaW5kaW9fZGV2KTsNCj4g
PiA+ID4gKwlyZXR1cm4gMDsNCj4gPiA+ID4gIH0NCj4gPiA+ID4gIA0KPiA+ID4gPiAgc3RhdGlj
IGludCBkbG4yX2FkY190cmlnZ2VyZWRfYnVmZmVyX3ByZWRpc2FibGUoc3RydWN0IGlpb19kZXYN
Cj4gPiA+ID4gKmluZGlvX2RldikNCj4gPiA+ID4gQEAgLTU4NSw3ICs1ODUsNyBAQCBzdGF0aWMg
aW50DQo+ID4gPiA+IGRsbjJfYWRjX3RyaWdnZXJlZF9idWZmZXJfcHJlZGlzYWJsZShzdHJ1Y3Qg
aWlvX2RldiAqaW5kaW9fZGV2KQ0KPiA+ID4gPiAgCQlyZXR1cm4gcmV0Ow0KPiA+ID4gPiAgCX0N
Cj4gPiA+ID4gIA0KPiA+ID4gPiAtCXJldHVybiBpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9wcmVkaXNh
YmxlKGluZGlvX2Rldik7DQo+ID4gPiANCj4gPiA+IEFuIHVuYmFsYW5jZWQgb25lLiAgUG9zdGVu
YWJsZSBpcyBmaW5lIGJ1dCBwcmVzZGlzYWJsZS4gIFdobyBrbm93cy4uDQo+ID4gPiANCj4gPiA+
ID4gKwlyZXR1cm4gMDsNCj4gPiA+ID4gIH0NCj4gPiA+ID4gIA0KPiA+ID4gPiBkaWZmIC0tZ2l0
IGEvZHJpdmVycy9paW8vYWRjL3N0bTMyLWFkYy5jIGIvZHJpdmVycy9paW8vYWRjL3N0bTMyLQ0K
PiA+ID4gPiBhZGMuYw0KPiA+ID4gPiBpbmRleCAzNzg0MTE4NTNkNzUuLmNlMGQxN2MwM2Q3ZSAx
MDA2NDQNCj4gPiA+ID4gLS0tIGEvZHJpdmVycy9paW8vYWRjL3N0bTMyLWFkYy5jDQo+ID4gPiA+
ICsrKyBiL2RyaXZlcnMvaWlvL2FkYy9zdG0zMi1hZGMuYw0KPiA+ID4gPiBAQCAtMTQ4MiwxMCAr
MTQ4Miw2IEBAIHN0YXRpYyBpbnQNCj4gPiA+ID4gc3RtMzJfYWRjX2J1ZmZlcl9wb3N0ZW5hYmxl
KHN0cnVjdA0KPiA+ID4gPiBpaW9fZGV2ICppbmRpb19kZXYpDQo+ID4gPiA+ICAJCWdvdG8gZXJy
X2Nscl90cmlnOw0KPiA+ID4gPiAgCX0NCj4gPiA+ID4gIA0KPiA+ID4gPiAtCXJldCA9IGlpb190
cmlnZ2VyZWRfYnVmZmVyX3Bvc3RlbmFibGUoaW5kaW9fZGV2KTsNCj4gPiA+ID4gLQlpZiAocmV0
IDwgMCkNCj4gPiA+ID4gLQkJZ290byBlcnJfc3RvcF9kbWE7DQo+ID4gPiA+IC0NCj4gDQo+IFRo
aXMgaXMgd2hlcmUgdGhlIG9yZGVyaW5nIGNoYW5nZXMuDQo+IEknZCByYXRoZXIgcHJlZmVyIHRv
IGNhbGwgImlpb190cmlnZ2VyX2F0dGFjaF9wb2xsX2Z1bmMiIGJlZm9yZSBjYWxsaW5nDQo+IHRo
ZSAucG9zdGVuYWJsZSByb3V0aW5lLCBhbmQgdGhlIHJldmVyc2Ugb3JkZXIgd2hlbiBkaXNhYmxp
bmcuDQo+IA0KPiBUaGFua3MsDQo+IEJlc3QgcmVnYXJkcywNCj4gRmFicmljZQ0KPiANCj4gPiA+
ID4gIAkvKiBSZXNldCBhZGMgYnVmZmVyIGluZGV4ICovDQo+ID4gPiA+ICAJYWRjLT5idWZpID0g
MDsNCj4gPiA+ID4gIA0KPiA+ID4gPiBAQCAtMTQ5Niw5ICsxNDkyLDYgQEAgc3RhdGljIGludCBz
dG0zMl9hZGNfYnVmZmVyX3Bvc3RlbmFibGUoc3RydWN0DQo+ID4gPiA+IGlpb19kZXYgKmluZGlv
X2RldikNCj4gPiA+ID4gIA0KPiA+ID4gPiAgCXJldHVybiAwOw0KPiA+ID4gPiAgDQo+ID4gPiA+
IC1lcnJfc3RvcF9kbWE6DQo+ID4gPiA+IC0JaWYgKGFkYy0+ZG1hX2NoYW4pDQo+ID4gPiA+IC0J
CWRtYWVuZ2luZV90ZXJtaW5hdGVfYWxsKGFkYy0+ZG1hX2NoYW4pOw0KPiA+ID4gPiAgZXJyX2Ns
cl90cmlnOg0KPiA+ID4gPiAgCXN0bTMyX2FkY19zZXRfdHJpZyhpbmRpb19kZXYsIE5VTEwpOw0K
PiA+ID4gPiAgZXJyX3VucHJlcGFyZToNCj4gPiA+ID4gQEAgLTE1MTcsMTAgKzE1MTAsNiBAQCBz
dGF0aWMgaW50DQo+ID4gPiA+IHN0bTMyX2FkY19idWZmZXJfcHJlZGlzYWJsZShzdHJ1Y3QNCj4g
PiA+ID4gaWlvX2RldiAqaW5kaW9fZGV2KQ0KPiA+ID4gPiAgCWlmICghYWRjLT5kbWFfY2hhbikN
Cj4gPiA+ID4gIAkJc3RtMzJfYWRjX2NvbnZfaXJxX2Rpc2FibGUoYWRjKTsNCj4gPiA+ID4gIA0K
PiA+ID4gPiAtCXJldCA9IGlpb190cmlnZ2VyZWRfYnVmZmVyX3ByZWRpc2FibGUoaW5kaW9fZGV2
KTsNCj4gPiA+ID4gLQlpZiAocmV0IDwgMCkNCj4gPiA+ID4gLQkJZGV2X2VycigmaW5kaW9fZGV2
LT5kZXYsICJwcmVkaXNhYmxlIGZhaWxlZFxuIik7DQo+ID4gPiA+IC0NCj4gPiA+ID4gIAlpZiAo
YWRjLT5kbWFfY2hhbikNCj4gPiA+ID4gIAkJZG1hZW5naW5lX3Rlcm1pbmF0ZV9hbGwoYWRjLT5k
bWFfY2hhbik7DQo+ID4gPiA+ICANCj4gPiA+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2Fk
Yy92ZjYxMF9hZGMuYw0KPiA+ID4gPiBiL2RyaXZlcnMvaWlvL2FkYy92ZjYxMF9hZGMuYw0KPiA+
ID4gPiBpbmRleCBiYmNiN2E0ZDdlZGYuLjNhMTViOThjZmQzOSAxMDA2NDQNCj4gPiA+ID4gLS0t
IGEvZHJpdmVycy9paW8vYWRjL3ZmNjEwX2FkYy5jDQo+ID4gPiA+ICsrKyBiL2RyaXZlcnMvaWlv
L2FkYy92ZjYxMF9hZGMuYw0KPiA+ID4gPiBAQCAtNzQwLDEwICs3NDAsNiBAQCBzdGF0aWMgaW50
IHZmNjEwX2FkY19idWZmZXJfcG9zdGVuYWJsZShzdHJ1Y3QNCj4gPiA+ID4gaWlvX2RldiAqaW5k
aW9fZGV2KQ0KPiA+ID4gPiAgCWludCByZXQ7DQo+ID4gPiA+ICAJaW50IHZhbDsNCj4gPiA+ID4g
IA0KPiA+ID4gPiAtCXJldCA9IGlpb190cmlnZ2VyZWRfYnVmZmVyX3Bvc3RlbmFibGUoaW5kaW9f
ZGV2KTsNCj4gPiA+ID4gLQlpZiAocmV0KQ0KPiA+ID4gPiAtCQlyZXR1cm4gcmV0Ow0KPiA+ID4g
PiAtDQo+ID4gPiA+ICAJdmFsID0gcmVhZGwoaW5mby0+cmVncyArIFZGNjEwX1JFR19BRENfR0Mp
Ow0KPiA+ID4gPiAgCXZhbCB8PSBWRjYxMF9BRENfQURDT047DQo+ID4gPiA+ICAJd3JpdGVsKHZh
bCwgaW5mby0+cmVncyArIFZGNjEwX1JFR19BRENfR0MpOw0KPiA+ID4gPiBAQCAtNzc0LDcgKzc3
MCw3IEBAIHN0YXRpYyBpbnQgdmY2MTBfYWRjX2J1ZmZlcl9wcmVkaXNhYmxlKHN0cnVjdA0KPiA+
ID4gPiBpaW9fZGV2ICppbmRpb19kZXYpDQo+ID4gPiA+ICANCj4gPiA+ID4gIAl3cml0ZWwoaGNf
Y2ZnLCBpbmZvLT5yZWdzICsgVkY2MTBfUkVHX0FEQ19IQzApOw0KPiA+ID4gPiAgDQo+ID4gPiA+
IC0JcmV0dXJuIGlpb190cmlnZ2VyZWRfYnVmZmVyX3ByZWRpc2FibGUoaW5kaW9fZGV2KTsNCj4g
PiA+ID4gKwlyZXR1cm4gMDsNCj4gPiA+ID4gIH0NCj4gPiA+ID4gIA0KPiA+ID4gPiAgc3RhdGlj
IGNvbnN0IHN0cnVjdCBpaW9fYnVmZmVyX3NldHVwX29wcw0KPiA+ID4gPiBpaW9fdHJpZ2dlcmVk
X2J1ZmZlcl9zZXR1cF9vcHMgPSB7DQo+ID4gPiANCj4gPiA+IA0KPiA+ID4gPiBkaWZmIC0tZ2l0
IGEvZHJpdmVycy9paW8vY2hlbWljYWwvYXRsYXMtcGgtc2Vuc29yLmMNCj4gPiA+ID4gYi9kcml2
ZXJzL2lpby9jaGVtaWNhbC9hdGxhcy1waC1zZW5zb3IuYw0KPiA+ID4gPiBpbmRleCBhNDA2YWQz
MWIwOTYuLjhmZWQ3NWY5ZTk1ZCAxMDA2NDQNCj4gPiA+ID4gLS0tIGEvZHJpdmVycy9paW8vY2hl
bWljYWwvYXRsYXMtcGgtc2Vuc29yLmMNCj4gPiA+ID4gKysrIGIvZHJpdmVycy9paW8vY2hlbWlj
YWwvYXRsYXMtcGgtc2Vuc29yLmMNCj4gPiA+ID4gQEAgLTMwNSwxMCArMzA1LDYgQEAgc3RhdGlj
IGludCBhdGxhc19idWZmZXJfcG9zdGVuYWJsZShzdHJ1Y3QNCj4gPiA+ID4gaWlvX2Rldg0KPiA+
ID4gPiAqaW5kaW9fZGV2KQ0KPiA+ID4gPiAgCXN0cnVjdCBhdGxhc19kYXRhICpkYXRhID0gaWlv
X3ByaXYoaW5kaW9fZGV2KTsNCj4gPiA+ID4gIAlpbnQgcmV0Ow0KPiA+ID4gPiAgDQo+ID4gPiA+
IC0JcmV0ID0gaWlvX3RyaWdnZXJlZF9idWZmZXJfcG9zdGVuYWJsZShpbmRpb19kZXYpOw0KPiA+
ID4gPiAtCWlmIChyZXQpDQo+ID4gPiA+IC0JCXJldHVybiByZXQ7DQo+ID4gPiA+IC0NCj4gPiA+
ID4gIAlyZXQgPSBwbV9ydW50aW1lX2dldF9zeW5jKCZkYXRhLT5jbGllbnQtPmRldik7DQo+ID4g
PiA+ICAJaWYgKHJldCA8IDApIHsNCj4gPiA+ID4gIAkJcG1fcnVudGltZV9wdXRfbm9pZGxlKCZk
YXRhLT5jbGllbnQtPmRldik7DQo+ID4gPiA+IEBAIC0zMjMsMTAgKzMxOSw2IEBAIHN0YXRpYyBp
bnQgYXRsYXNfYnVmZmVyX3ByZWRpc2FibGUoc3RydWN0DQo+ID4gPiA+IGlpb19kZXYNCj4gPiA+
ID4gKmluZGlvX2RldikNCj4gPiA+ID4gIAlzdHJ1Y3QgYXRsYXNfZGF0YSAqZGF0YSA9IGlpb19w
cml2KGluZGlvX2Rldik7DQo+ID4gPiA+ICAJaW50IHJldDsNCj4gPiA+ID4gIA0KPiA+ID4gPiAt
CXJldCA9IGlpb190cmlnZ2VyZWRfYnVmZmVyX3ByZWRpc2FibGUoaW5kaW9fZGV2KTsNCj4gPiA+
ID4gLQlpZiAocmV0KQ0KPiA+ID4gPiAtCQlyZXR1cm4gcmV0Ow0KPiA+ID4gPiAtDQo+ID4gPiA+
ICAJcmV0ID0gYXRsYXNfc2V0X2ludGVycnVwdChkYXRhLCBmYWxzZSk7DQo+ID4gPiA+ICAJaWYg
KHJldCkNCj4gPiA+ID4gIAkJcmV0dXJuIHJldDsNCj4gPiA+ID4gZGlmZiAtLWdpdCBhL2RyaXZl
cnMvaWlvL3BvdGVudGlvc3RhdC9sbXA5MTAwMC5jDQo+ID4gPiA+IGIvZHJpdmVycy9paW8vcG90
ZW50aW9zdGF0L2xtcDkxMDAwLmMNCj4gPiA+ID4gaW5kZXggODU3MTQwNTVjYzc0Li44NGY5MTA1
Y2JiMzcgMTAwNjQ0DQo+ID4gPiA+IC0tLSBhL2RyaXZlcnMvaWlvL3BvdGVudGlvc3RhdC9sbXA5
MTAwMC5jDQo+ID4gPiA+ICsrKyBiL2RyaXZlcnMvaWlvL3BvdGVudGlvc3RhdC9sbXA5MTAwMC5j
DQo+ID4gPiA+IEBAIC0yOTUsNyArMjk1LDYgQEAgc3RhdGljIGludCBsbXA5MTAwMF9idWZmZXJf
cHJlZGlzYWJsZShzdHJ1Y3QNCj4gPiA+ID4gaWlvX2RldiAqaW5kaW9fZGV2KQ0KPiA+ID4gPiAg
DQo+ID4gPiA+ICBzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19idWZmZXJfc2V0dXBfb3BzIGxtcDkx
MDAwX2J1ZmZlcl9zZXR1cF9vcHMNCj4gPiA+ID4gPSB7DQo+ID4gPiA+ICAJLnByZWVuYWJsZSA9
IGxtcDkxMDAwX2J1ZmZlcl9wcmVlbmFibGUsDQo+ID4gPiA+IC0JLnBvc3RlbmFibGUgPSBpaW9f
dHJpZ2dlcmVkX2J1ZmZlcl9wb3N0ZW5hYmxlLA0KPiA+ID4gDQo+ID4gPiBBIHJlc291bmRpbmcg
Pz8/IA0KPiA+ID4gPiAgCS5wcmVkaXNhYmxlID0gbG1wOTEwMDBfYnVmZmVyX3ByZWRpc2FibGUs
DQo+ID4gPiA+ICB9Ow0KPiA+ID4gPiAgDQo+ID4gPiANCj4gPiA+IA0KPiANCj4gDQo=

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2018-11-09 20:25 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-06-22 13:53 [PATCH][RFC] iio: Move attach/detach of the poll func to the core Alexandru Ardelean
2018-11-03 18:19 ` Jonathan Cameron
2018-11-09 10:03   ` Ardelean, Alexandru
2018-11-09 10:44     ` Fabrice Gasnier
2018-11-09 11:10       ` Ardelean, Alexandru

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.