Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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

authored by

Bitterblue Smith and committed by
Kalle Valo
cd85c8b0 af8678e6

+91
+12
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
··· 1953 1953 int rtl8xxxu_write8(struct rtl8xxxu_priv *priv, u16 addr, u8 val); 1954 1954 int rtl8xxxu_write16(struct rtl8xxxu_priv *priv, u16 addr, u16 val); 1955 1955 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 + 1956 1965 u32 rtl8xxxu_read_rfreg(struct rtl8xxxu_priv *priv, 1957 1966 enum rtl8xxxu_rfpath path, u8 reg); 1958 1967 int rtl8xxxu_write_rfreg(struct rtl8xxxu_priv *priv, 1959 1968 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); 1960 1972 void rtl8xxxu_save_regs(struct rtl8xxxu_priv *priv, const u32 *regs, 1961 1973 u32 *backup, int count); 1962 1974 void rtl8xxxu_restore_regs(struct rtl8xxxu_priv *priv, const u32 *regs,
+79
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
··· 786 786 return ret; 787 787 } 788 788 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 + 789 868 static int 790 869 rtl8xxxu_writeN(struct rtl8xxxu_priv *priv, u16 addr, u8 *buf, u16 len) 791 870 {