summaryrefslogtreecommitdiffstats
path: root/drivers/net/ipa/reg.h
diff options
context:
space:
mode:
authorAlex Elder <elder@linaro.org>2023-02-08 14:56:53 -0600
committerDavid S. Miller <davem@davemloft.net>2023-02-10 08:06:32 +0000
commitf1470fd790b04d0f4624a6ade84d10f8db885c39 (patch)
tree278c77f267ea4ee8c0ad91ae546c3313b7505906 /drivers/net/ipa/reg.h
parentfc4cecf70675a7d64b76aad190821283306949d6 (diff)
downloadlinux-stable-f1470fd790b04d0f4624a6ade84d10f8db885c39.tar.gz
linux-stable-f1470fd790b04d0f4624a6ade84d10f8db885c39.tar.bz2
linux-stable-f1470fd790b04d0f4624a6ade84d10f8db885c39.zip
net: ipa: generalize register field functions
Rename functions related to register fields so they don't appear to be IPA-specific, and move their definitions into "reg.h": ipa_reg_fmask() -> reg_fmask() ipa_reg_bit() -> reg_bit() ipa_reg_field_max() -> reg_field_max() ipa_reg_encode() -> reg_encode() ipa_reg_decode() -> reg_decode() Signed-off-by: Alex Elder <elder@linaro.org> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ipa/reg.h')
-rw-r--r--drivers/net/ipa/reg.h51
1 files changed, 51 insertions, 0 deletions
diff --git a/drivers/net/ipa/reg.h b/drivers/net/ipa/reg.h
index 3c09e66b34a1..57b457f39b6e 100644
--- a/drivers/net/ipa/reg.h
+++ b/drivers/net/ipa/reg.h
@@ -67,6 +67,57 @@ static inline const struct reg *reg(const struct regs *regs, u32 reg_id)
return regs->reg[reg_id];
}
+/* Return the field mask for a field in a register, or 0 on error */
+static inline u32 reg_fmask(const struct reg *reg, u32 field_id)
+{
+ if (!reg || WARN_ON(field_id >= reg->fcount))
+ return 0;
+
+ return reg->fmask[field_id];
+}
+
+/* Return the mask for a single-bit field in a register, or 0 on error */
+static inline u32 reg_bit(const struct reg *reg, u32 field_id)
+{
+ u32 fmask = reg_fmask(reg, field_id);
+
+ if (WARN_ON(!is_power_of_2(fmask)))
+ return 0;
+
+ return fmask;
+}
+
+/* Return the maximum value representable by the given field; always 2^n - 1 */
+static inline u32 reg_field_max(const struct reg *reg, u32 field_id)
+{
+ u32 fmask = reg_fmask(reg, field_id);
+
+ return fmask ? fmask >> __ffs(fmask) : 0;
+}
+
+/* Encode a value into the given field of a register */
+static inline u32 reg_encode(const struct reg *reg, u32 field_id, u32 val)
+{
+ u32 fmask = reg_fmask(reg, field_id);
+
+ if (!fmask)
+ return 0;
+
+ val <<= __ffs(fmask);
+ if (WARN_ON(val & ~fmask))
+ return 0;
+
+ return val;
+}
+
+/* Given a register value, decode (extract) the value in the given field */
+static inline u32 reg_decode(const struct reg *reg, u32 field_id, u32 val)
+{
+ u32 fmask = reg_fmask(reg, field_id);
+
+ return fmask ? (val & fmask) >> __ffs(fmask) : 0;
+}
+
/* Returns 0 for NULL reg; warning should have already been issued */
static inline u32 reg_offset(const struct reg *reg)
{