Commit 7919a57bc608140aa8614c19eac40c6916fb61d2
Committed by
John W. Linville
1 parent
e4b3fdb800
Exists in
master
and in
39 other branches
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>
Showing 7 changed files with 30 additions and 47 deletions Side-by-side Diff
drivers/net/wireless/ath/ath5k/phy.c
... | ... | @@ -1102,18 +1102,12 @@ |
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) |
drivers/net/wireless/ath/ath9k/ar5008_phy.c
... | ... | @@ -1490,25 +1490,25 @@ |
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 | /* |
drivers/net/wireless/ath/ath9k/ar9002_phy.c
... | ... | @@ -473,21 +473,21 @@ |
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) |
drivers/net/wireless/ath/ath9k/ar9003_phy.c
... | ... | @@ -1023,25 +1023,25 @@ |
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) |
drivers/net/wireless/ath/ath9k/hw.h
... | ... | @@ -825,12 +825,6 @@ |
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); |
drivers/net/wireless/iwlwifi/iwl-4965.c
... | ... | @@ -1687,22 +1687,6 @@ |
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 | * |
1709 | 1693 | |
... | ... | @@ -1739,9 +1723,9 @@ |
1739 | 1723 | * "initialize" ALIVE response. |
1740 | 1724 | */ |
1741 | 1725 | if (!test_bit(STATUS_TEMPERATURE, &priv->status)) |
1742 | - vt = sign_extend(R4, 23); | |
1726 | + vt = sign_extend32(R4, 23); | |
1743 | 1727 | else |
1744 | - vt = sign_extend(le32_to_cpu(priv->_agn.statistics. | |
1728 | + vt = sign_extend32(le32_to_cpu(priv->_agn.statistics. | |
1745 | 1729 | general.common.temperature), 23); |
1746 | 1730 | |
1747 | 1731 | IWL_DEBUG_TEMP(priv, "Calib values R[1-3]: %d %d %d R4: %d\n", R1, R2, R3, vt); |
include/linux/bitops.h
... | ... | @@ -109,6 +109,17 @@ |
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) |