ASoC: cs42l43: Refactor to use for_each_set_bit()
authorCharles Keepax <ckeepax@opensource.cirrus.com>
Thu, 25 Jan 2024 10:31:16 +0000 (10:31 +0000)
committerMark Brown <broonie@kernel.org>
Fri, 26 Jan 2024 14:46:59 +0000 (14:46 +0000)
Refactor the code in cs42l43_mask_to_slots() to use for_each_set_bit().

Suggested-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com>
Link: https://msgid.link/r/20240125103117.2622095-6-ckeepax@opensource.cirrus.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/cs42l43.c

index 1852cb072bd0e37cd8c0638ef19ac364d8f65fad..23e9557494afaf7103917841362bfba8e502457e 100644 (file)
@@ -6,10 +6,12 @@
 //                         Cirrus Logic International Semiconductor Ltd.
 
 #include <linux/bitops.h>
+#include <linux/bits.h>
 #include <linux/clk.h>
 #include <linux/device.h>
 #include <linux/err.h>
 #include <linux/errno.h>
+#include <linux/find.h>
 #include <linux/gcd.h>
 #include <linux/irq.h>
 #include <linux/irqdomain.h>
@@ -547,23 +549,22 @@ static int cs42l43_asp_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
        return 0;
 }
 
-static void cs42l43_mask_to_slots(struct cs42l43_codec *priv, unsigned int mask, int *slots)
+static void cs42l43_mask_to_slots(struct cs42l43_codec *priv, unsigned long mask,
+                                 int *slots, unsigned int nslots)
 {
-       int i;
+       int i = 0;
+       int slot;
 
-       for (i = 0; i < CS42L43_ASP_MAX_CHANNELS; ++i) {
-               int slot = ffs(mask) - 1;
-
-               if (slot < 0)
+       for_each_set_bit(slot, &mask, BITS_PER_TYPE(mask)) {
+               if (i == nslots) {
+                       dev_warn(priv->dev, "Too many channels in TDM mask: %lx\n",
+                                mask);
                        return;
+               }
 
-               slots[i] = slot;
-
-               mask &= ~(1 << slot);
+               slots[i++] = slot;
        }
 
-       if (mask)
-               dev_warn(priv->dev, "Too many channels in TDM mask\n");
 }
 
 static int cs42l43_asp_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
@@ -580,8 +581,10 @@ static int cs42l43_asp_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mas
                rx_mask = CS42L43_DEFAULT_SLOTS;
        }
 
-       cs42l43_mask_to_slots(priv, tx_mask, priv->tx_slots);
-       cs42l43_mask_to_slots(priv, rx_mask, priv->rx_slots);
+       cs42l43_mask_to_slots(priv, tx_mask, priv->tx_slots,
+                             ARRAY_SIZE(priv->tx_slots));
+       cs42l43_mask_to_slots(priv, rx_mask, priv->rx_slots,
+                             ARRAY_SIZE(priv->rx_slots));
 
        return 0;
 }
@@ -2098,8 +2101,10 @@ static int cs42l43_component_probe(struct snd_soc_component *component)
 
        snd_soc_component_init_regmap(component, cs42l43->regmap);
 
-       cs42l43_mask_to_slots(priv, CS42L43_DEFAULT_SLOTS, priv->tx_slots);
-       cs42l43_mask_to_slots(priv, CS42L43_DEFAULT_SLOTS, priv->rx_slots);
+       cs42l43_mask_to_slots(priv, CS42L43_DEFAULT_SLOTS, priv->tx_slots,
+                             ARRAY_SIZE(priv->tx_slots));
+       cs42l43_mask_to_slots(priv, CS42L43_DEFAULT_SLOTS, priv->rx_slots,
+                             ARRAY_SIZE(priv->rx_slots));
 
        priv->component = component;
        priv->constraint = cs42l43_constraint;