All of lore.kernel.org
 help / color / mirror / Atom feed
From: Daniel Campello <campello@chromium.org>
To: LKML <devicetree@vger.kernel.org>, LKML <linux-kernel@vger.kernel.org>
Cc: Jonathan Cameron <jic23@kernel.org>,
	Daniel Campello <campello@chromium.org>,
	Andy Shevchenko <andy.shevchenko@gmail.com>,
	Douglas Anderson <dianders@chromium.org>,
	Enrico Granata <egranata@chromium.org>,
	Hartmut Knaack <knaack.h@gmx.de>,
	Lars-Peter Clausen <lars@metafoo.de>,
	Peter Meerwald-Stadler <pmeerw@pmeerw.net>,
	Stephen Boyd <swboyd@chromium.org>,
	linux-iio@vger.kernel.org
Subject: [PATCH v2 07/14] iio: sx9310: Use long instead of int for channel bitmaps
Date: Tue, 28 Jul 2020 17:05:13 -0600	[thread overview]
Message-ID: <20200728170317.v2.7.Iecaa50e469918a385b3e5dab375e442540ea2ad4@changeid> (raw)
In-Reply-To: <20200728230520.2011240-1-campello@chromium.org>

Uses for_each_set_bit() macro to loop over channel bitmaps.

Signed-off-by: Daniel Campello <campello@chromium.org>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
---

Changes in v2:
 - Changed prox_stat to chan_prox_stat bitmap.

 drivers/iio/proximity/sx9310.c | 38 ++++++++++++++++++----------------
 1 file changed, 20 insertions(+), 18 deletions(-)

diff --git a/drivers/iio/proximity/sx9310.c b/drivers/iio/proximity/sx9310.c
index 75e85dcd6b3572..1f04ab8507ec62 100644
--- a/drivers/iio/proximity/sx9310.c
+++ b/drivers/iio/proximity/sx9310.c
@@ -130,14 +130,15 @@ struct sx9310_data {
 	 * Last reading of the proximity status for each channel.
 	 * We only send an event to user space when this changes.
 	 */
-	bool prox_stat[SX9310_NUM_CHANNELS];
+	unsigned long chan_prox_stat;
 	bool trigger_enabled;
 	/* 64-bit data + 64-bit timestamp buffer */
 	__be16 buffer[SX9310_NUM_CHANNELS + 4] __aligned(8);
 	/* Remember enabled channels and sample rate during suspend. */
 	unsigned int suspend_ctrl0;
 	struct completion completion;
-	unsigned int chan_read, chan_event;
+	unsigned long chan_read;
+	unsigned long chan_event;
 	int channel_users[SX9310_NUM_CHANNELS];
 	unsigned int whoami;
 };
@@ -280,15 +281,16 @@ static const struct regmap_config sx9310_regmap_config = {
 };
 
 static int sx9310_update_chan_en(struct sx9310_data *data,
-				 unsigned int chan_read,
-				 unsigned int chan_event)
+				 unsigned long chan_read,
+				 unsigned long chan_event)
 {
 	int ret;
+	unsigned long channels = chan_read | chan_event;
 
-	if ((data->chan_read | data->chan_event) != (chan_read | chan_event)) {
+	if ((data->chan_read | data->chan_event) != channels) {
 		ret = regmap_update_bits(data->regmap, SX9310_REG_PROX_CTRL0,
 					 SX9310_REG_PROX_CTRL0_SENSOREN_MASK,
-					 chan_read | chan_event);
+					 channels);
 		if (ret)
 			return ret;
 	}
@@ -531,6 +533,7 @@ static void sx9310_push_events(struct iio_dev *indio_dev)
 	unsigned int val, chan;
 	struct sx9310_data *data = iio_priv(indio_dev);
 	s64 timestamp = iio_get_time_ns(indio_dev);
+	unsigned long prox_changed;
 
 	/* Read proximity state on all channels */
 	ret = regmap_read(data->regmap, SX9310_REG_STAT0, &val);
@@ -539,24 +542,23 @@ static void sx9310_push_events(struct iio_dev *indio_dev)
 		return;
 	}
 
-	for (chan = 0; chan < SX9310_NUM_CHANNELS; chan++) {
+	/*
+	 * Only iterate over channels with changes on proximity status that have
+	 * events enabled.
+	 */
+	prox_changed = (data->chan_prox_stat ^ val) & data->chan_event;
+
+	for_each_set_bit(chan, &prox_changed, SX9310_NUM_CHANNELS) {
 		int dir;
 		u64 ev;
-		bool new_prox = val & BIT(chan);
-
-		if (!(data->chan_event & BIT(chan)))
-			continue;
-		if (new_prox == data->prox_stat[chan])
-			/* No change on this channel. */
-			continue;
 
-		dir = new_prox ? IIO_EV_DIR_FALLING : IIO_EV_DIR_RISING;
+		dir = val & BIT(chan) ? IIO_EV_DIR_FALLING : IIO_EV_DIR_RISING;
 		ev = IIO_UNMOD_EVENT_CODE(IIO_PROXIMITY, chan,
 					  IIO_EV_TYPE_THRESH, dir);
 
 		iio_push_event(indio_dev, ev, timestamp);
-		data->prox_stat[chan] = new_prox;
 	}
+	data->chan_prox_stat = val;
 }
 
 static irqreturn_t sx9310_irq_thread_handler(int irq, void *private)
@@ -713,13 +715,13 @@ static irqreturn_t sx9310_trigger_handler(int irq, void *private)
 static int sx9310_buffer_preenable(struct iio_dev *indio_dev)
 {
 	struct sx9310_data *data = iio_priv(indio_dev);
-	unsigned int channels = 0;
+	unsigned long channels = 0;
 	int bit, ret;
 
 	mutex_lock(&data->mutex);
 	for_each_set_bit(bit, indio_dev->active_scan_mask,
 			 indio_dev->masklength)
-		channels |= BIT(indio_dev->channels[bit].channel);
+		__set_bit(indio_dev->channels[bit].channel, &channels);
 
 	ret = sx9310_update_chan_en(data, channels, data->chan_event);
 	mutex_unlock(&data->mutex);
-- 
2.28.0.163.g6104cc2f0b6-goog


  parent reply	other threads:[~2020-07-28 23:06 UTC|newest]

Thread overview: 76+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-07-25  0:40 [PATCH] iio: sx9310: Fixes dropped on initial commit Daniel Campello
2020-07-26  8:10 ` Andy Shevchenko
2020-07-26 11:53 ` Jonathan Cameron
2020-07-28 15:12 ` [PATCH 00/15] sx9310 iio driver updates Daniel Campello
2020-07-28 15:12   ` [PATCH 01/15] dt-bindings: iio: Add bindings for sx9310 sensor Daniel Campello
2020-07-28 22:06     ` Stephen Boyd
2020-07-28 15:12   ` [PATCH 02/15] iio: sx9310: Update macros declarations Daniel Campello
2020-07-28 19:42     ` Stephen Boyd
2020-07-28 15:12   ` [PATCH 03/15] iio: sx9310: Fix irq handling Daniel Campello
2020-07-28 18:08     ` Andy Shevchenko
2020-07-28 20:07       ` Daniel Campello
2020-07-28 20:15         ` Stephen Boyd
2020-07-28 15:12   ` [PATCH 04/15] iio: sx9310: Remove acpi and of table macros Daniel Campello
2020-07-28 18:09     ` Andy Shevchenko
2020-07-28 20:47       ` Daniel Campello
2020-07-28 21:28         ` Stephen Boyd
2020-07-28 15:12   ` [PATCH 05/15] iio: sx9310: Change from .probe to .probe_new Daniel Campello
2020-07-28 18:10     ` Andy Shevchenko
2020-07-28 19:32     ` Stephen Boyd
2020-07-28 15:12   ` [PATCH 06/15] iio: sx9310: Align memory Daniel Campello
2020-07-28 18:11     ` Andy Shevchenko
2020-07-28 21:26       ` Daniel Campello
2020-07-29  6:52         ` Andy Shevchenko
2020-07-28 15:12   ` [PATCH 07/15] iio: sx9310: Use long instead of int for channel bitmaps Daniel Campello
2020-07-28 18:13     ` Andy Shevchenko
2020-07-28 19:37     ` Stephen Boyd
2020-07-28 15:12   ` [PATCH 08/15] iio: sx9310: Use regmap_read_poll_timeout() for compensation Daniel Campello
2020-07-28 18:14     ` Andy Shevchenko
2020-07-28 19:37     ` Stephen Boyd
2020-07-28 15:12   ` [PATCH 09/15] iio: sx9310: Update copyright Daniel Campello
2020-07-28 15:12   ` [PATCH 10/15] iio: sx9310: Simplify error return handling Daniel Campello
2020-07-28 18:15     ` Andy Shevchenko
2020-07-28 19:40     ` Stephen Boyd
2020-07-28 21:23       ` Daniel Campello
2020-07-28 21:32         ` Stephen Boyd
2020-07-28 22:06           ` Daniel Campello
2020-07-28 15:12   ` [PATCH 11/15] iio: sx9310: Use variable to hold &client->dev Daniel Campello
2020-07-28 18:16     ` Andy Shevchenko
2020-07-28 19:41     ` Stephen Boyd
2020-07-28 15:12   ` [PATCH 12/15] iio: sx9310: Miscellaneous format fixes Daniel Campello
2020-07-28 18:16     ` Andy Shevchenko
2020-07-28 19:41     ` Stephen Boyd
2020-07-28 15:12   ` [PATCH 13/15] iio: sx9310: Add newlines to printks Daniel Campello
2020-07-28 18:19     ` Andy Shevchenko
2020-07-28 18:24       ` Joe Perches
2020-07-28 18:32         ` Andy Shevchenko
2020-07-28 15:12   ` [PATCH 14/15] iio: sx9310: Drop channel_users[] Daniel Campello
2020-07-28 18:20     ` Andy Shevchenko
2020-07-28 15:12   ` [PATCH 15/15] iio: sx9310: Enable vdd and svdd regulators at probe Daniel Campello
2020-07-28 18:21     ` Andy Shevchenko
2020-07-28 23:05   ` [PATCH v2 00/14] sx9310 iio driver updates Daniel Campello
2020-07-28 23:05     ` [PATCH v2 01/14] dt-bindings: iio: Add bindings for sx9310 sensor Daniel Campello
2020-07-29  0:52       ` Stephen Boyd
2020-07-28 23:05     ` [PATCH v2 02/14] iio: sx9310: Update macros declarations Daniel Campello
2020-07-28 23:05     ` [PATCH v2 03/14] iio: sx9310: Fix irq handling Daniel Campello
2020-07-29  8:40       ` Stephen Boyd
2020-07-28 23:05     ` [PATCH v2 04/14] iio: sx9310: Remove acpi and of table macros Daniel Campello
2020-07-29  6:54       ` Andy Shevchenko
2020-07-29  8:38       ` Stephen Boyd
2020-07-28 23:05     ` [PATCH v2 05/14] iio: sx9310: Change from .probe to .probe_new Daniel Campello
2020-07-28 23:05     ` [PATCH v2 06/14] iio: sx9310: Fixes various memory handling Daniel Campello
2020-07-28 23:05     ` Daniel Campello [this message]
2020-07-29  1:03       ` [PATCH v2 07/14] iio: sx9310: Use long instead of int for channel bitmaps Stephen Boyd
2020-07-29  7:00         ` Andy Shevchenko
2020-07-31 15:44           ` Daniel Campello
2020-07-31 15:52             ` Andy Shevchenko
2020-07-28 23:05     ` [PATCH v2 08/14] iio: sx9310: Use regmap_read_poll_timeout() for compensation Daniel Campello
2020-07-28 23:05     ` [PATCH v2 09/14] iio: sx9310: Update copyright Daniel Campello
2020-07-28 23:05     ` [PATCH v2 10/14] iio: sx9310: Simplify error return handling Daniel Campello
2020-07-29  8:42       ` Stephen Boyd
2020-07-28 23:05     ` [PATCH v2 11/14] iio: sx9310: Use variable to hold &client->dev Daniel Campello
2020-07-28 23:05     ` [PATCH v2 12/14] iio: sx9310: Miscellaneous format fixes Daniel Campello
2020-07-28 23:05     ` [PATCH v2 13/14] iio: sx9310: Drop channel_users[] Daniel Campello
2020-07-28 23:05     ` [PATCH v2 14/14] iio: sx9310: Enable vdd and svdd regulators at probe Daniel Campello
2020-07-29  0:50     ` [PATCH v2 00/14] sx9310 iio driver updates Stephen Boyd
2020-07-29  9:20     ` Stephen Boyd

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200728170317.v2.7.Iecaa50e469918a385b3e5dab375e442540ea2ad4@changeid \
    --to=campello@chromium.org \
    --cc=andy.shevchenko@gmail.com \
    --cc=devicetree@vger.kernel.org \
    --cc=dianders@chromium.org \
    --cc=egranata@chromium.org \
    --cc=jic23@kernel.org \
    --cc=knaack.h@gmx.de \
    --cc=lars@metafoo.de \
    --cc=linux-iio@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=pmeerw@pmeerw.net \
    --cc=swboyd@chromium.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is 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.