Skip to content

Commit cd85c8b

Browse files
Bitterblue SmithKalle Valo
authored andcommitted
wifi: rtl8xxxu: Add rtl8xxxu_write{8,16,32}_{set,clear}
Also add rtl8xxxu_write32_mask, rtl8xxxu_write_rfreg_mask. These helper functions make it easier to modify only parts of a register by eliminating the call to the register reading function and the bit manipulations. Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com> Reviewed-by: Ping-Ke Shih <pkshih@realtek.com> Signed-off-by: Kalle Valo <kvalo@kernel.org> Link: https://lore.kernel.org/r/9430b841-1048-b27c-14ec-fca447dc32af@gmail.com
1 parent af8678e commit cd85c8b

2 files changed

Lines changed: 91 additions & 0 deletions

File tree

drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1953,10 +1953,22 @@ u32 rtl8xxxu_read32(struct rtl8xxxu_priv *priv, u16 addr);
19531953
int rtl8xxxu_write8(struct rtl8xxxu_priv *priv, u16 addr, u8 val);
19541954
int rtl8xxxu_write16(struct rtl8xxxu_priv *priv, u16 addr, u16 val);
19551955
int rtl8xxxu_write32(struct rtl8xxxu_priv *priv, u16 addr, u32 val);
1956+
int rtl8xxxu_write8_set(struct rtl8xxxu_priv *priv, u16 addr, u8 bits);
1957+
int rtl8xxxu_write8_clear(struct rtl8xxxu_priv *priv, u16 addr, u8 bits);
1958+
int rtl8xxxu_write16_set(struct rtl8xxxu_priv *priv, u16 addr, u16 bits);
1959+
int rtl8xxxu_write16_clear(struct rtl8xxxu_priv *priv, u16 addr, u16 bits);
1960+
int rtl8xxxu_write32_set(struct rtl8xxxu_priv *priv, u16 addr, u32 bits);
1961+
int rtl8xxxu_write32_clear(struct rtl8xxxu_priv *priv, u16 addr, u32 bits);
1962+
int rtl8xxxu_write32_mask(struct rtl8xxxu_priv *priv, u16 addr,
1963+
u32 mask, u32 val);
1964+
19561965
u32 rtl8xxxu_read_rfreg(struct rtl8xxxu_priv *priv,
19571966
enum rtl8xxxu_rfpath path, u8 reg);
19581967
int rtl8xxxu_write_rfreg(struct rtl8xxxu_priv *priv,
19591968
enum rtl8xxxu_rfpath path, u8 reg, u32 data);
1969+
int rtl8xxxu_write_rfreg_mask(struct rtl8xxxu_priv *priv,
1970+
enum rtl8xxxu_rfpath path, u8 reg,
1971+
u32 mask, u32 val);
19601972
void rtl8xxxu_save_regs(struct rtl8xxxu_priv *priv, const u32 *regs,
19611973
u32 *backup, int count);
19621974
void rtl8xxxu_restore_regs(struct rtl8xxxu_priv *priv, const u32 *regs,

drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -786,6 +786,85 @@ int rtl8xxxu_write32(struct rtl8xxxu_priv *priv, u16 addr, u32 val)
786786
return ret;
787787
}
788788

789+
int rtl8xxxu_write8_set(struct rtl8xxxu_priv *priv, u16 addr, u8 bits)
790+
{
791+
u8 val8;
792+
793+
val8 = rtl8xxxu_read8(priv, addr);
794+
val8 |= bits;
795+
return rtl8xxxu_write8(priv, addr, val8);
796+
}
797+
798+
int rtl8xxxu_write8_clear(struct rtl8xxxu_priv *priv, u16 addr, u8 bits)
799+
{
800+
u8 val8;
801+
802+
val8 = rtl8xxxu_read8(priv, addr);
803+
val8 &= ~bits;
804+
return rtl8xxxu_write8(priv, addr, val8);
805+
}
806+
807+
int rtl8xxxu_write16_set(struct rtl8xxxu_priv *priv, u16 addr, u16 bits)
808+
{
809+
u16 val16;
810+
811+
val16 = rtl8xxxu_read16(priv, addr);
812+
val16 |= bits;
813+
return rtl8xxxu_write16(priv, addr, val16);
814+
}
815+
816+
int rtl8xxxu_write16_clear(struct rtl8xxxu_priv *priv, u16 addr, u16 bits)
817+
{
818+
u16 val16;
819+
820+
val16 = rtl8xxxu_read16(priv, addr);
821+
val16 &= ~bits;
822+
return rtl8xxxu_write16(priv, addr, val16);
823+
}
824+
825+
int rtl8xxxu_write32_set(struct rtl8xxxu_priv *priv, u16 addr, u32 bits)
826+
{
827+
u32 val32;
828+
829+
val32 = rtl8xxxu_read32(priv, addr);
830+
val32 |= bits;
831+
return rtl8xxxu_write32(priv, addr, val32);
832+
}
833+
834+
int rtl8xxxu_write32_clear(struct rtl8xxxu_priv *priv, u16 addr, u32 bits)
835+
{
836+
u32 val32;
837+
838+
val32 = rtl8xxxu_read32(priv, addr);
839+
val32 &= ~bits;
840+
return rtl8xxxu_write32(priv, addr, val32);
841+
}
842+
843+
int rtl8xxxu_write32_mask(struct rtl8xxxu_priv *priv, u16 addr,
844+
u32 mask, u32 val)
845+
{
846+
u32 orig, new, shift;
847+
848+
shift = __ffs(mask);
849+
850+
orig = rtl8xxxu_read32(priv, addr);
851+
new = (orig & ~mask) | ((val << shift) & mask);
852+
return rtl8xxxu_write32(priv, addr, new);
853+
}
854+
855+
int rtl8xxxu_write_rfreg_mask(struct rtl8xxxu_priv *priv,
856+
enum rtl8xxxu_rfpath path, u8 reg,
857+
u32 mask, u32 val)
858+
{
859+
u32 orig, new, shift;
860+
861+
shift = __ffs(mask);
862+
863+
orig = rtl8xxxu_read_rfreg(priv, path, reg);
864+
new = (orig & ~mask) | ((val << shift) & mask);
865+
return rtl8xxxu_write_rfreg(priv, path, reg, new);
866+
}
867+
789868
static int
790869
rtl8xxxu_writeN(struct rtl8xxxu_priv *priv, u16 addr, u8 *buf, u16 len)
791870
{

0 commit comments

Comments
 (0)