* [PATCH] CRIS: Fix I/O macros
@ 2012-07-09 20:22 minyard
2012-08-04 17:25 ` Corey Minyard
0 siblings, 1 reply; 3+ messages in thread
From: minyard @ 2012-07-09 20:22 UTC (permalink / raw)
To: linux-kernel, linux-cris-kernel, starvik, jesper.nilsson; +Cc: Corey Minyard
From: Corey Minyard <cminyard@mvista.com>
The inb/outb macros for CRIS are broken from a number of points of
view, missing () around parameters and they have an unprotected if
statement in them. This was breaking the compile of IPMI on CRIS
and thus I was being annoyed by build regressions, so I fixed them.
Plus I don't think they would have worked at all, since the data
values were missing "&" and the outsl had a "3" instead of a "4"
for the size. From what I can tell, this stuff is not used at all,
so this can't be any more broken than it was before, anyway.
Signed-off-by: Corey Minyard <cminyard@mvista.com>
---
arch/cris/include/asm/io.h | 39 +++++++++++++++++++++++++++++++++------
1 files changed, 33 insertions(+), 6 deletions(-)
diff --git a/arch/cris/include/asm/io.h b/arch/cris/include/asm/io.h
index 32567bc..ac12ae2 100644
--- a/arch/cris/include/asm/io.h
+++ b/arch/cris/include/asm/io.h
@@ -133,12 +133,39 @@ static inline void writel(unsigned int b, volatile void __iomem *addr)
#define insb(port,addr,count) (cris_iops ? cris_iops->read_io(port,addr,1,count) : 0)
#define insw(port,addr,count) (cris_iops ? cris_iops->read_io(port,addr,2,count) : 0)
#define insl(port,addr,count) (cris_iops ? cris_iops->read_io(port,addr,4,count) : 0)
-#define outb(data,port) if (cris_iops) cris_iops->write_io(port,(void*)(unsigned)data,1,1)
-#define outw(data,port) if (cris_iops) cris_iops->write_io(port,(void*)(unsigned)data,2,1)
-#define outl(data,port) if (cris_iops) cris_iops->write_io(port,(void*)(unsigned)data,4,1)
-#define outsb(port,addr,count) if(cris_iops) cris_iops->write_io(port,(void*)addr,1,count)
-#define outsw(port,addr,count) if(cris_iops) cris_iops->write_io(port,(void*)addr,2,count)
-#define outsl(port,addr,count) if(cris_iops) cris_iops->write_io(port,(void*)addr,3,count)
+static inline void outb(unsigned char data, unsigned int port)
+{
+ if (cris_iops)
+ cris_iops->write_io(port, (void *) &data, 1, 1);
+}
+static inline void outw(unsigned short data, unsigned int port)
+{
+ if (cris_iops)
+ cris_iops->write_io(port, (void *) &data, 2, 1);
+}
+static inline void outl(unsigned int data, unsigned int port)
+{
+ if (cris_iops)
+ cris_iops->write_io(port, (void *) &data, 4, 1);
+}
+static inline void outsb(unsigned int port, const void *addr,
+ unsigned long count)
+{
+ if (cris_iops)
+ cris_iops->write_io(port, (void *)addr, 1, count);
+}
+static inline void outsw(unsigned int port, const void *addr,
+ unsigned long count)
+{
+ if (cris_iops)
+ cris_iops->write_io(port, (void *)addr, 2, count);
+}
+static inline void outsl(unsigned int port, const void *addr,
+ unsigned long count)
+{
+ if (cris_iops)
+ cris_iops->write_io(port, (void *)addr, 4, count);
+}
/*
* Convert a physical pointer to a virtual kernel pointer for /dev/mem
--
1.7.4.1
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH] CRIS: Fix I/O macros
2012-07-09 20:22 [PATCH] CRIS: Fix I/O macros minyard
@ 2012-08-04 17:25 ` Corey Minyard
2012-08-04 19:13 ` Geert Uytterhoeven
0 siblings, 1 reply; 3+ messages in thread
From: Corey Minyard @ 2012-08-04 17:25 UTC (permalink / raw)
To: linux-kernel, linux-cris-kernel, starvik, jesper.nilsson; +Cc: Corey Minyard
Can we get something like this in? It would fix a lot of build regressions.
-corey
On 07/09/2012 03:22 PM, minyard@acm.org wrote:
> From: Corey Minyard <cminyard@mvista.com>
>
> The inb/outb macros for CRIS are broken from a number of points of
> view, missing () around parameters and they have an unprotected if
> statement in them. This was breaking the compile of IPMI on CRIS
> and thus I was being annoyed by build regressions, so I fixed them.
>
> Plus I don't think they would have worked at all, since the data
> values were missing "&" and the outsl had a "3" instead of a "4"
> for the size. From what I can tell, this stuff is not used at all,
> so this can't be any more broken than it was before, anyway.
>
> Signed-off-by: Corey Minyard <cminyard@mvista.com>
> ---
> arch/cris/include/asm/io.h | 39 +++++++++++++++++++++++++++++++++------
> 1 files changed, 33 insertions(+), 6 deletions(-)
>
> diff --git a/arch/cris/include/asm/io.h b/arch/cris/include/asm/io.h
> index 32567bc..ac12ae2 100644
> --- a/arch/cris/include/asm/io.h
> +++ b/arch/cris/include/asm/io.h
> @@ -133,12 +133,39 @@ static inline void writel(unsigned int b, volatile void __iomem *addr)
> #define insb(port,addr,count) (cris_iops ? cris_iops->read_io(port,addr,1,count) : 0)
> #define insw(port,addr,count) (cris_iops ? cris_iops->read_io(port,addr,2,count) : 0)
> #define insl(port,addr,count) (cris_iops ? cris_iops->read_io(port,addr,4,count) : 0)
> -#define outb(data,port) if (cris_iops) cris_iops->write_io(port,(void*)(unsigned)data,1,1)
> -#define outw(data,port) if (cris_iops) cris_iops->write_io(port,(void*)(unsigned)data,2,1)
> -#define outl(data,port) if (cris_iops) cris_iops->write_io(port,(void*)(unsigned)data,4,1)
> -#define outsb(port,addr,count) if(cris_iops) cris_iops->write_io(port,(void*)addr,1,count)
> -#define outsw(port,addr,count) if(cris_iops) cris_iops->write_io(port,(void*)addr,2,count)
> -#define outsl(port,addr,count) if(cris_iops) cris_iops->write_io(port,(void*)addr,3,count)
> +static inline void outb(unsigned char data, unsigned int port)
> +{
> + if (cris_iops)
> + cris_iops->write_io(port, (void *) &data, 1, 1);
> +}
> +static inline void outw(unsigned short data, unsigned int port)
> +{
> + if (cris_iops)
> + cris_iops->write_io(port, (void *) &data, 2, 1);
> +}
> +static inline void outl(unsigned int data, unsigned int port)
> +{
> + if (cris_iops)
> + cris_iops->write_io(port, (void *) &data, 4, 1);
> +}
> +static inline void outsb(unsigned int port, const void *addr,
> + unsigned long count)
> +{
> + if (cris_iops)
> + cris_iops->write_io(port, (void *)addr, 1, count);
> +}
> +static inline void outsw(unsigned int port, const void *addr,
> + unsigned long count)
> +{
> + if (cris_iops)
> + cris_iops->write_io(port, (void *)addr, 2, count);
> +}
> +static inline void outsl(unsigned int port, const void *addr,
> + unsigned long count)
> +{
> + if (cris_iops)
> + cris_iops->write_io(port, (void *)addr, 4, count);
> +}
>
> /*
> * Convert a physical pointer to a virtual kernel pointer for /dev/mem
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] CRIS: Fix I/O macros
2012-08-04 17:25 ` Corey Minyard
@ 2012-08-04 19:13 ` Geert Uytterhoeven
0 siblings, 0 replies; 3+ messages in thread
From: Geert Uytterhoeven @ 2012-08-04 19:13 UTC (permalink / raw)
To: minyard
Cc: linux-kernel, linux-cris-kernel, starvik, jesper.nilsson,
Corey Minyard, Andrew Morton
Hi Corey,
On Sat, Aug 4, 2012 at 7:25 PM, Corey Minyard <tcminyard@gmail.com> wrote:
> Can we get something like this in? It would fix a lot of build regressions.
Yes, would be nice.
I also noticed these issues, causing obscure errors like:
drivers/block/paride/bpck.c: In function 'bpck_read_regr':
drivers/block/paride/bpck.c:56:140: error: invalid operands to binary
& (have 'void *' and 'int')
drivers/block/paride/bpck.c:62:140: error: invalid operands to binary
& (have 'void *' and 'int')
and
drivers/char/ipmi/ipmi_si_intf.c: In function 'port_outw':
drivers/char/ipmi/ipmi_si_intf.c:1373:153: error: invalid operands to
binary << (have 'void *' and 'int')
drivers/char/ipmi/ipmi_si_intf.c: In function 'port_outl':
drivers/char/ipmi/ipmi_si_intf.c:1388:151: error: invalid operands to
binary << (have 'void *' and 'int')
I wanted to fix them, but due to my vacation that hasn't happen yet.
Fortunately, as I hadn't noticed your patch before ;-)
And FWIW, indeed no one ever sets a non-zero cris_iops.
Acked-by: Geert Uytterhoeven <geert@linux-m68k.org>
> On 07/09/2012 03:22 PM, minyard@acm.org wrote:
>>
>> From: Corey Minyard <cminyard@mvista.com>
>>
>> The inb/outb macros for CRIS are broken from a number of points of
>> view, missing () around parameters and they have an unprotected if
>> statement in them. This was breaking the compile of IPMI on CRIS
>> and thus I was being annoyed by build regressions, so I fixed them.
>>
>> Plus I don't think they would have worked at all, since the data
>> values were missing "&" and the outsl had a "3" instead of a "4"
>> for the size. From what I can tell, this stuff is not used at all,
>> so this can't be any more broken than it was before, anyway.
>>
>> Signed-off-by: Corey Minyard <cminyard@mvista.com>
>> ---
>> arch/cris/include/asm/io.h | 39
>> +++++++++++++++++++++++++++++++++------
>> 1 files changed, 33 insertions(+), 6 deletions(-)
>>
>> diff --git a/arch/cris/include/asm/io.h b/arch/cris/include/asm/io.h
>> index 32567bc..ac12ae2 100644
>> --- a/arch/cris/include/asm/io.h
>> +++ b/arch/cris/include/asm/io.h
>> @@ -133,12 +133,39 @@ static inline void writel(unsigned int b, volatile
>> void __iomem *addr)
>> #define insb(port,addr,count) (cris_iops ?
>> cris_iops->read_io(port,addr,1,count) : 0)
>> #define insw(port,addr,count) (cris_iops ?
>> cris_iops->read_io(port,addr,2,count) : 0)
>> #define insl(port,addr,count) (cris_iops ?
>> cris_iops->read_io(port,addr,4,count) : 0)
>> -#define outb(data,port) if (cris_iops)
>> cris_iops->write_io(port,(void*)(unsigned)data,1,1)
>> -#define outw(data,port) if (cris_iops)
>> cris_iops->write_io(port,(void*)(unsigned)data,2,1)
>> -#define outl(data,port) if (cris_iops)
>> cris_iops->write_io(port,(void*)(unsigned)data,4,1)
>> -#define outsb(port,addr,count) if(cris_iops)
>> cris_iops->write_io(port,(void*)addr,1,count)
>> -#define outsw(port,addr,count) if(cris_iops)
>> cris_iops->write_io(port,(void*)addr,2,count)
>> -#define outsl(port,addr,count) if(cris_iops)
>> cris_iops->write_io(port,(void*)addr,3,count)
>> +static inline void outb(unsigned char data, unsigned int port)
>> +{
>> + if (cris_iops)
>> + cris_iops->write_io(port, (void *) &data, 1, 1);
>> +}
>> +static inline void outw(unsigned short data, unsigned int port)
>> +{
>> + if (cris_iops)
>> + cris_iops->write_io(port, (void *) &data, 2, 1);
>> +}
>> +static inline void outl(unsigned int data, unsigned int port)
>> +{
>> + if (cris_iops)
>> + cris_iops->write_io(port, (void *) &data, 4, 1);
>> +}
>> +static inline void outsb(unsigned int port, const void *addr,
>> + unsigned long count)
>> +{
>> + if (cris_iops)
>> + cris_iops->write_io(port, (void *)addr, 1, count);
>> +}
>> +static inline void outsw(unsigned int port, const void *addr,
>> + unsigned long count)
>> +{
>> + if (cris_iops)
>> + cris_iops->write_io(port, (void *)addr, 2, count);
>> +}
>> +static inline void outsl(unsigned int port, const void *addr,
>> + unsigned long count)
>> +{
>> + if (cris_iops)
>> + cris_iops->write_io(port, (void *)addr, 4, count);
>> +}
>> /*
>> * Convert a physical pointer to a virtual kernel pointer for /dev/mem
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org
In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2012-08-04 19:13 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-07-09 20:22 [PATCH] CRIS: Fix I/O macros minyard
2012-08-04 17:25 ` Corey Minyard
2012-08-04 19:13 ` Geert Uytterhoeven
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox