On Wed, 11 Jul 2007, Atsushi Nemoto wrote: > CKSEG1ADDR() returns unsigned int value on 32bit kernel. Cast it to > unsigned long to get rid of this warning: > > include2/asm/io.h:215:12: warning: cast adds address space to expression (<asn:2>) > > Signed-off-by: Atsushi Nemoto <anemo@xxxxxxxxxxxxx> > --- > diff --git a/include/asm-mips/io.h b/include/asm-mips/io.h > index 12bcc1f..7ba9289 100644 > --- a/include/asm-mips/io.h > +++ b/include/asm-mips/io.h > @@ -212,7 +212,8 @@ static inline void __iomem * __ioremap_mode(phys_t offset, unsigned long size, > */ > if (__IS_LOW512(phys_addr) && __IS_LOW512(last_addr) && > flags == _CACHE_UNCACHED) > - return (void __iomem *)CKSEG1ADDR(phys_addr); > + return (void __iomem *) > + (unsigned long)CKSEG1ADDR(phys_addr); > } It looks like a bug in sparse. The result of CKSEG1ADDR() has the same size as the pointer. Perhaps we could append 'L' to the expansion of KSEG1 et al, but that should not really matter. But -- I have just checked two example calls to this function, one with a 32-bit configuration and another one with a 64-bit one and sparse did not complain. The cpp expansions of the expression in question are: return (void *)((((int)(int)(phys_addr)) & 0x1fffffff) | 0xa0000000); and: return (void *)((((long int)(int)(phys_addr)) & 0x1fffffff) | 0xffffffffa0000000L); respectively, so your cast is definitely redundant in these cases. What sort of configuration are you using? What's the preprocessor output for the problematic case? Maciej