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

bitops: Provide generic sign_extend32 function

This patch moves code out from wireless drivers where two different
functions are defined in three code locations for the same purpose and
provides a common function to sign extend a 32-bit value.

Signed-off-by: Andreas Herrmann <andreas.herrmann3@amd.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>

authored by

Andreas Herrmann and committed by
John W. Linville
7919a57b e4b3fdb8

+30 -47
+1 -7
drivers/net/wireless/ath/ath5k/phy.c
··· 1102 1102 PHY calibration 1103 1103 \*****************/ 1104 1104 1105 - static int sign_extend(int val, const int nbits) 1106 - { 1107 - int order = BIT(nbits-1); 1108 - return (val ^ order) - order; 1109 - } 1110 - 1111 1105 static s32 ath5k_hw_read_measured_noise_floor(struct ath5k_hw *ah) 1112 1106 { 1113 1107 s32 val; 1114 1108 1115 1109 val = ath5k_hw_reg_read(ah, AR5K_PHY_NF); 1116 - return sign_extend(AR5K_REG_MS(val, AR5K_PHY_NF_MINCCA_PWR), 9); 1110 + return sign_extend32(AR5K_REG_MS(val, AR5K_PHY_NF_MINCCA_PWR), 8); 1117 1111 } 1118 1112 1119 1113 void ath5k_hw_init_nfcal_hist(struct ath5k_hw *ah)
+6 -6
drivers/net/wireless/ath/ath9k/ar5008_phy.c
··· 1490 1490 int16_t nf; 1491 1491 1492 1492 nf = MS(REG_READ(ah, AR_PHY_CCA), AR_PHY_MINCCA_PWR); 1493 - nfarray[0] = sign_extend(nf, 9); 1493 + nfarray[0] = sign_extend32(nf, 8); 1494 1494 1495 1495 nf = MS(REG_READ(ah, AR_PHY_CH1_CCA), AR_PHY_CH1_MINCCA_PWR); 1496 - nfarray[1] = sign_extend(nf, 9); 1496 + nfarray[1] = sign_extend32(nf, 8); 1497 1497 1498 1498 nf = MS(REG_READ(ah, AR_PHY_CH2_CCA), AR_PHY_CH2_MINCCA_PWR); 1499 - nfarray[2] = sign_extend(nf, 9); 1499 + nfarray[2] = sign_extend32(nf, 8); 1500 1500 1501 1501 if (!IS_CHAN_HT40(ah->curchan)) 1502 1502 return; 1503 1503 1504 1504 nf = MS(REG_READ(ah, AR_PHY_EXT_CCA), AR_PHY_EXT_MINCCA_PWR); 1505 - nfarray[3] = sign_extend(nf, 9); 1505 + nfarray[3] = sign_extend32(nf, 8); 1506 1506 1507 1507 nf = MS(REG_READ(ah, AR_PHY_CH1_EXT_CCA), AR_PHY_CH1_EXT_MINCCA_PWR); 1508 - nfarray[4] = sign_extend(nf, 9); 1508 + nfarray[4] = sign_extend32(nf, 8); 1509 1509 1510 1510 nf = MS(REG_READ(ah, AR_PHY_CH2_EXT_CCA), AR_PHY_CH2_EXT_MINCCA_PWR); 1511 - nfarray[5] = sign_extend(nf, 9); 1511 + nfarray[5] = sign_extend32(nf, 8); 1512 1512 } 1513 1513 1514 1514 /*
+4 -4
drivers/net/wireless/ath/ath9k/ar9002_phy.c
··· 473 473 int16_t nf; 474 474 475 475 nf = MS(REG_READ(ah, AR_PHY_CCA), AR9280_PHY_MINCCA_PWR); 476 - nfarray[0] = sign_extend(nf, 9); 476 + nfarray[0] = sign_extend32(nf, 8); 477 477 478 478 nf = MS(REG_READ(ah, AR_PHY_EXT_CCA), AR9280_PHY_EXT_MINCCA_PWR); 479 479 if (IS_CHAN_HT40(ah->curchan)) 480 - nfarray[3] = sign_extend(nf, 9); 480 + nfarray[3] = sign_extend32(nf, 8); 481 481 482 482 if (AR_SREV_9285(ah) || AR_SREV_9271(ah)) 483 483 return; 484 484 485 485 nf = MS(REG_READ(ah, AR_PHY_CH1_CCA), AR9280_PHY_CH1_MINCCA_PWR); 486 - nfarray[1] = sign_extend(nf, 9); 486 + nfarray[1] = sign_extend32(nf, 8); 487 487 488 488 nf = MS(REG_READ(ah, AR_PHY_CH1_EXT_CCA), AR9280_PHY_CH1_EXT_MINCCA_PWR); 489 489 if (IS_CHAN_HT40(ah->curchan)) 490 - nfarray[4] = sign_extend(nf, 9); 490 + nfarray[4] = sign_extend32(nf, 8); 491 491 } 492 492 493 493 static void ar9002_hw_set_nf_limits(struct ath_hw *ah)
+6 -6
drivers/net/wireless/ath/ath9k/ar9003_phy.c
··· 1023 1023 int16_t nf; 1024 1024 1025 1025 nf = MS(REG_READ(ah, AR_PHY_CCA_0), AR_PHY_MINCCA_PWR); 1026 - nfarray[0] = sign_extend(nf, 9); 1026 + nfarray[0] = sign_extend32(nf, 8); 1027 1027 1028 1028 nf = MS(REG_READ(ah, AR_PHY_CCA_1), AR_PHY_CH1_MINCCA_PWR); 1029 - nfarray[1] = sign_extend(nf, 9); 1029 + nfarray[1] = sign_extend32(nf, 8); 1030 1030 1031 1031 nf = MS(REG_READ(ah, AR_PHY_CCA_2), AR_PHY_CH2_MINCCA_PWR); 1032 - nfarray[2] = sign_extend(nf, 9); 1032 + nfarray[2] = sign_extend32(nf, 8); 1033 1033 1034 1034 if (!IS_CHAN_HT40(ah->curchan)) 1035 1035 return; 1036 1036 1037 1037 nf = MS(REG_READ(ah, AR_PHY_EXT_CCA), AR_PHY_EXT_MINCCA_PWR); 1038 - nfarray[3] = sign_extend(nf, 9); 1038 + nfarray[3] = sign_extend32(nf, 8); 1039 1039 1040 1040 nf = MS(REG_READ(ah, AR_PHY_EXT_CCA_1), AR_PHY_CH1_EXT_MINCCA_PWR); 1041 - nfarray[4] = sign_extend(nf, 9); 1041 + nfarray[4] = sign_extend32(nf, 8); 1042 1042 1043 1043 nf = MS(REG_READ(ah, AR_PHY_EXT_CCA_2), AR_PHY_CH2_EXT_MINCCA_PWR); 1044 - nfarray[5] = sign_extend(nf, 9); 1044 + nfarray[5] = sign_extend32(nf, 8); 1045 1045 } 1046 1046 1047 1047 static void ar9003_hw_set_nf_limits(struct ath_hw *ah)
-6
drivers/net/wireless/ath/ath9k/hw.h
··· 825 825 return &ah->ops; 826 826 } 827 827 828 - static inline int sign_extend(int val, const int nbits) 829 - { 830 - int order = BIT(nbits-1); 831 - return (val ^ order) - order; 832 - } 833 - 834 828 /* Initialization, Detach, Reset */ 835 829 const char *ath9k_hw_probe(u16 vendorid, u16 devid); 836 830 void ath9k_hw_deinit(struct ath_hw *ah);
+2 -18
drivers/net/wireless/iwlwifi/iwl-4965.c
··· 1687 1687 } 1688 1688 1689 1689 /** 1690 - * sign_extend - Sign extend a value using specified bit as sign-bit 1691 - * 1692 - * Example: sign_extend(9, 3) would return -7 as bit3 of 1001b is 1 1693 - * and bit0..2 is 001b which when sign extended to 1111111111111001b is -7. 1694 - * 1695 - * @param oper value to sign extend 1696 - * @param index 0 based bit index (0<=index<32) to sign bit 1697 - */ 1698 - static s32 sign_extend(u32 oper, int index) 1699 - { 1700 - u8 shift = 31 - index; 1701 - 1702 - return (s32)(oper << shift) >> shift; 1703 - } 1704 - 1705 - /** 1706 1690 * iwl4965_hw_get_temperature - return the calibrated temperature (in Kelvin) 1707 1691 * @statistics: Provides the temperature reading from the uCode 1708 1692 * ··· 1723 1739 * "initialize" ALIVE response. 1724 1740 */ 1725 1741 if (!test_bit(STATUS_TEMPERATURE, &priv->status)) 1726 - vt = sign_extend(R4, 23); 1742 + vt = sign_extend32(R4, 23); 1727 1743 else 1728 - vt = sign_extend(le32_to_cpu(priv->_agn.statistics. 1744 + vt = sign_extend32(le32_to_cpu(priv->_agn.statistics. 1729 1745 general.common.temperature), 23); 1730 1746 1731 1747 IWL_DEBUG_TEMP(priv, "Calib values R[1-3]: %d %d %d R4: %d\n", R1, R2, R3, vt);
+11
include/linux/bitops.h
··· 109 109 return (word >> shift) | (word << (8 - shift)); 110 110 } 111 111 112 + /** 113 + * sign_extend32 - sign extend a 32-bit value using specified bit as sign-bit 114 + * @value: value to sign extend 115 + * @index: 0 based bit index (0<=index<32) to sign bit 116 + */ 117 + static inline __s32 sign_extend32(__u32 value, int index) 118 + { 119 + __u8 shift = 31 - index; 120 + return (__s32)(value << shift) >> shift; 121 + } 122 + 112 123 static inline unsigned fls_long(unsigned long l) 113 124 { 114 125 if (sizeof(l) == 4)