Skip to content

Commit 5ce0076

Browse files
arndbtiwai
authored andcommitted
ALSA: opti9xx: shut up gcc-10 range warning
gcc-10 points out a few instances of suspicious integer arithmetic leading to value truncation: sound/isa/opti9xx/opti92x-ad1848.c: In function 'snd_opti9xx_configure': sound/isa/opti9xx/opti92x-ad1848.c:322:43: error: overflow in conversion from 'int' to 'unsigned char' changes value from '(int)snd_opti9xx_read(chip, 3) & -256 | 240' to '240' [-Werror=overflow] 322 | (snd_opti9xx_read(chip, reg) & ~(mask)) | ((value) & (mask))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~ sound/isa/opti9xx/opti92x-ad1848.c:351:3: note: in expansion of macro 'snd_opti9xx_write_mask' 351 | snd_opti9xx_write_mask(chip, OPTi9XX_MC_REG(3), 0xf0, 0xff); | ^~~~~~~~~~~~~~~~~~~~~~ sound/isa/opti9xx/miro.c: In function 'snd_miro_configure': sound/isa/opti9xx/miro.c:873:40: error: overflow in conversion from 'int' to 'unsigned char' changes value from '(int)snd_miro_read(chip, 3) & -256 | 240' to '240' [-Werror=overflow] 873 | (snd_miro_read(chip, reg) & ~(mask)) | ((value) & (mask))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~ sound/isa/opti9xx/miro.c:1010:3: note: in expansion of macro 'snd_miro_write_mask' 1010 | snd_miro_write_mask(chip, OPTi9XX_MC_REG(3), 0xf0, 0xff); | ^~~~~~~~~~~~~~~~~~~ These are all harmless here as only the low 8 bit are passed down anyway. Change the macros to inline functions to make the code more readable and also avoid the warning. Strictly speaking those functions also need locking to make the read/write pair atomic, but it seems unlikely that anyone would still run into that issue. Fixes: 1841f61 ("[ALSA] Add snd-miro driver") Signed-off-by: Arnd Bergmann <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Takashi Iwai <[email protected]>
1 parent a2f6472 commit 5ce0076

File tree

2 files changed

+12
-6
lines changed

2 files changed

+12
-6
lines changed

sound/isa/opti9xx/miro.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -867,10 +867,13 @@ static void snd_miro_write(struct snd_miro *chip, unsigned char reg,
867867
spin_unlock_irqrestore(&chip->lock, flags);
868868
}
869869

870+
static inline void snd_miro_write_mask(struct snd_miro *chip,
871+
unsigned char reg, unsigned char value, unsigned char mask)
872+
{
873+
unsigned char oldval = snd_miro_read(chip, reg);
870874

871-
#define snd_miro_write_mask(chip, reg, value, mask) \
872-
snd_miro_write(chip, reg, \
873-
(snd_miro_read(chip, reg) & ~(mask)) | ((value) & (mask)))
875+
snd_miro_write(chip, reg, (oldval & ~mask) | (value & mask));
876+
}
874877

875878
/*
876879
* Proc Interface

sound/isa/opti9xx/opti92x-ad1848.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -317,10 +317,13 @@ static void snd_opti9xx_write(struct snd_opti9xx *chip, unsigned char reg,
317317
}
318318

319319

320-
#define snd_opti9xx_write_mask(chip, reg, value, mask) \
321-
snd_opti9xx_write(chip, reg, \
322-
(snd_opti9xx_read(chip, reg) & ~(mask)) | ((value) & (mask)))
320+
static inline void snd_opti9xx_write_mask(struct snd_opti9xx *chip,
321+
unsigned char reg, unsigned char value, unsigned char mask)
322+
{
323+
unsigned char oldval = snd_opti9xx_read(chip, reg);
323324

325+
snd_opti9xx_write(chip, reg, (oldval & ~mask) | (value & mask));
326+
}
324327

325328
static int snd_opti9xx_configure(struct snd_opti9xx *chip,
326329
long port,

0 commit comments

Comments
 (0)