This patch fixes compilation of the Alchemy XSS1500 and PB1x00 PCMCIA drivers. Clean up code while we are at it. Signed-off-by: Florian Fainelli <florian.fainelli@xxxxxxxxxxxxx> --- diff --git a/drivers/pcmcia/au1000_pb1x00.c b/drivers/pcmcia/au1000_pb1x00.c index 86c0808..9bc9739 100644 --- a/drivers/pcmcia/au1000_pb1x00.c +++ b/drivers/pcmcia/au1000_pb1x00.c @@ -22,48 +22,41 @@ * 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. */ #include <linux/module.h> -#include <linux/init.h> -#include <linux/delay.h> -#include <linux/ioport.h> #include <linux/kernel.h> -#include <linux/tqueue.h> -#include <linux/timer.h> -#include <linux/mm.h> -#include <linux/proc_fs.h> -#include <linux/types.h> - -#include <pcmcia/cs_types.h> -#include <pcmcia/cs.h> -#include <pcmcia/ss.h> -#include <pcmcia/bulkmem.h> -#include <pcmcia/cistpl.h> -#include <pcmcia/bus_ops.h> -#include "cs_internal.h" - -#include <asm/io.h> +#include <linux/errno.h> +#include <linux/interrupt.h> +#include <linux/device.h> +#include <linux/init.h> + #include <asm/irq.h> -#include <asm/system.h> +#include <asm/signal.h> +#include <asm/mach-au1x00/au1000.h> -#include <asm/au1000.h> -#include <asm/au1000_pcmcia.h> - -#define debug(fmt, arg...) do { } while (0) +#include "au1000_generic.h" #ifdef CONFIG_MIPS_PB1000 -#include <asm/pb1000.h> +#include <asm/mach-pb1x00/pb1000.h> #define PCMCIA_IRQ AU1000_GPIO_15 #elif defined (CONFIG_MIPS_PB1500) -#include <asm/pb1500.h> +#include <asm/mach-pb1x00/pb1500.h> #define PCMCIA_IRQ AU1500_GPIO_203 #elif defined (CONFIG_MIPS_PB1100) -#include <asm/pb1100.h> +#include <asm/mach-pb1x00/pb1100.h> #define PCMCIA_IRQ AU1000_GPIO_11 #endif -static int pb1x00_pcmcia_init(struct pcmcia_init *init) +#define debug(fmt, arg...) do { } while (0) + +struct au1000_pcmcia_socket au1000_pcmcia_socket[PCMCIA_NUM_SOCKS]; +extern int au1x00_pcmcia_socket_probe(struct device *, struct pcmcia_low_level *, int, int); + +static int pb1x00_pcmcia_init(struct au1000_pcmcia_socket *skt) { -#ifdef CONFIG_MIPS_PB1000 u16 pcr; + + skt->irq = PCMCIA_IRQ; + +#ifdef CONFIG_MIPS_PB1000 pcr = PCR_SLOT_0_RST | PCR_SLOT_1_RST; au_writel(0x8000, PB1000_MDR); /* clear pcmcia interrupt */ @@ -79,17 +72,16 @@ static int pb1x00_pcmcia_init(struct pcmcia_init *init) return PCMCIA_NUM_SOCKS; #else /* fixme -- take care of the Pb1500 at some point */ - - u16 pcr; pcr = au_readw(PCMCIA_BOARD_REG) & ~0xf; /* turn off power */ pcr &= ~(PC_DEASSERT_RST | PC_DRV_EN); au_writew(pcr, PCMCIA_BOARD_REG); au_sync_delay(500); + return PCMCIA_NUM_SOCKS; #endif } -static int pb1x00_pcmcia_shutdown(void) +static int pb1x00_pcmcia_shutdown(struct au1000_pcmcia_socket *skt) { #ifdef CONFIG_MIPS_PB1000 u16 pcr; @@ -109,11 +101,12 @@ static int pb1x00_pcmcia_shutdown(void) #endif } -static int -pb1x00_pcmcia_socket_state(unsigned sock, struct pcmcia_state *state) +static int pb1x00_pcmcia_socket_state(struct au1000_pcmcia_socket *skt, struct pcmcia_state *state) { u32 inserted0, inserted1; u16 vs0, vs1; + + vs1 = 0; #ifdef CONFIG_MIPS_PB1000 vs0 = vs1 = (u16)au_readl(PB1000_ACR1); @@ -136,7 +129,7 @@ pb1x00_pcmcia_socket_state(unsigned sock, struct pcmcia_state *state) state->vs_3v = 0; state->detect = 0; - if (sock == 0) { + if (skt->nr == 0) { if (inserted0) { switch (vs0) { case 0: @@ -179,37 +172,23 @@ pb1x00_pcmcia_socket_state(unsigned sock, struct pcmcia_state *state) state->bvd1=1; state->bvd2=1; - state->wrprot=0; - return 1; -} - - -static int pb1x00_pcmcia_get_irq_info(struct pcmcia_irq_info *info) -{ - - if(info->sock > PCMCIA_MAX_SOCK) return -1; + state->wrprot=0; - /* - * Even in the case of the Pb1000, both sockets are connected - * to the same irq line. - */ - info->irq = PCMCIA_IRQ; - - return 0; + return 1; } -static int -pb1x00_pcmcia_configure_socket(const struct pcmcia_configure *configure) +static int pb1x00_pcmcia_configure_socket(struct au1000_pcmcia_socket *skt, struct socket_state_t *state) { u16 pcr; - if(configure->sock > PCMCIA_MAX_SOCK) return -1; + if (skt->nr > PCMCIA_MAX_SOCK) + return -1; #ifdef CONFIG_MIPS_PB1000 pcr = au_readl(PB1000_PCR); - if (configure->sock == 0) { + if (skt->nr == 0) { pcr &= ~(PCR_SLOT_0_VCC0 | PCR_SLOT_0_VCC1 | PCR_SLOT_0_VPP0 | PCR_SLOT_0_VPP1); } @@ -220,107 +199,107 @@ pb1x00_pcmcia_configure_socket(const struct pcmcia_configure *configure) pcr &= ~PCR_SLOT_0_RST; debug("Vcc %dV Vpp %dV, pcr %x\n", - configure->vcc, configure->vpp, pcr); - switch(configure->vcc){ + state->Vcc, state->Vpp, pcr); + switch(state->Vcc){ case 0: /* Vcc 0 */ - switch(configure->vpp) { + switch(state->Vpp) { case 0: pcr |= SET_VCC_VPP(VCC_HIZ,VPP_GND, - configure->sock); + skt->nr); break; case 12: pcr |= SET_VCC_VPP(VCC_HIZ,VPP_12V, - configure->sock); + skt->nr); break; case 50: pcr |= SET_VCC_VPP(VCC_HIZ,VPP_5V, - configure->sock); + skt->nr); break; case 33: pcr |= SET_VCC_VPP(VCC_HIZ,VPP_3V, - configure->sock); + skt->nr); break; default: pcr |= SET_VCC_VPP(VCC_HIZ,VPP_HIZ, - configure->sock); + skt->nr); printk("%s: bad Vcc/Vpp (%d:%d)\n", __FUNCTION__, - configure->vcc, - configure->vpp); + state->Vcc, + state->Vpp); break; } break; case 50: /* Vcc 5V */ - switch(configure->vpp) { + switch(state->Vpp) { case 0: pcr |= SET_VCC_VPP(VCC_5V,VPP_GND, - configure->sock); + stk->nr); break; case 50: pcr |= SET_VCC_VPP(VCC_5V,VPP_5V, - configure->sock); + skt->nr); break; case 12: pcr |= SET_VCC_VPP(VCC_5V,VPP_12V, - configure->sock); + skt->nr); break; case 33: pcr |= SET_VCC_VPP(VCC_5V,VPP_3V, - configure->sock); + skt->nr); break; default: pcr |= SET_VCC_VPP(VCC_HIZ,VPP_HIZ, - configure->sock); + skt->nr); printk("%s: bad Vcc/Vpp (%d:%d)\n", __FUNCTION__, - configure->vcc, - configure->vpp); + state->Vcc, + state->Vpp); break; } break; case 33: /* Vcc 3.3V */ - switch(configure->vpp) { + switch(state->Vpp) { case 0: pcr |= SET_VCC_VPP(VCC_3V,VPP_GND, - configure->sock); + skt->nr); break; case 50: pcr |= SET_VCC_VPP(VCC_3V,VPP_5V, - configure->sock); + skt->nr); break; case 12: pcr |= SET_VCC_VPP(VCC_3V,VPP_12V, - configure->sock); + skt->nr); break; case 33: pcr |= SET_VCC_VPP(VCC_3V,VPP_3V, - configure->sock); + skt->nr); break; default: pcr |= SET_VCC_VPP(VCC_HIZ,VPP_HIZ, - configure->sock); + skt->nr); printk("%s: bad Vcc/Vpp (%d:%d)\n", __FUNCTION__, - configure->vcc, - configure->vpp); + state->Vcc, + state->Vpp); break; } break; default: /* what's this ? */ - pcr |= SET_VCC_VPP(VCC_HIZ,VPP_HIZ,configure->sock); + pcr |= SET_VCC_VPP(VCC_HIZ,VPP_HIZ,skt->nr); printk(KERN_ERR "%s: bad Vcc %d\n", - __FUNCTION__, configure->vcc); + __FUNCTION__, state->Vcc); break; } - if (configure->sock == 0) { + if (skt->nr == 0) { pcr &= ~(PCR_SLOT_0_RST); - if (configure->reset) - pcr |= PCR_SLOT_0_RST; + if (state->flags & SS_REET) + pcr |= PCR_SLOT_0_RST; } else { pcr &= ~(PCR_SLOT_1_RST); - if (configure->reset) + if (state->flags & SS_RESET) pcr |= PCR_SLOT_1_RST; } au_writel(pcr, PB1000_PCR); @@ -331,15 +310,15 @@ pb1x00_pcmcia_configure_socket(const struct pcmcia_configure *configure) pcr = au_readw(PCMCIA_BOARD_REG) & ~0xf; debug("Vcc %dV Vpp %dV, pcr %x, reset %d\n", - configure->vcc, configure->vpp, pcr, configure->reset); + state->Vcc, state->Vpp, pcr, state->flags & SS_RESET); - switch(configure->vcc){ + switch(state->Vcc){ case 0: /* Vcc 0 */ pcr |= SET_VCC_VPP(0,0); break; case 50: /* Vcc 5V */ - switch(configure->vpp) { + switch(state->Vpp) { case 0: pcr |= SET_VCC_VPP(2,0); break; @@ -354,13 +333,13 @@ pb1x00_pcmcia_configure_socket(const struct pcmcia_configure *configure) pcr |= SET_VCC_VPP(0,0); printk("%s: bad Vcc/Vpp (%d:%d)\n", __FUNCTION__, - configure->vcc, - configure->vpp); + state->Vcc, + state->Vpp); break; } break; case 33: /* Vcc 3.3V */ - switch(configure->vpp) { + switch(state->Vpp) { case 0: pcr |= SET_VCC_VPP(1,0); break; @@ -375,22 +354,22 @@ pb1x00_pcmcia_configure_socket(const struct pcmcia_configure *configure) pcr |= SET_VCC_VPP(0,0); printk("%s: bad Vcc/Vpp (%d:%d)\n", __FUNCTION__, - configure->vcc, - configure->vpp); + state->Vcc, + state->Vpp); break; } break; default: /* what's this ? */ pcr |= SET_VCC_VPP(0,0); printk(KERN_ERR "%s: bad Vcc %d\n", - __FUNCTION__, configure->vcc); + __FUNCTION__, state->Vcc); break; } au_writew(pcr, PCMCIA_BOARD_REG); au_sync_delay(300); - if (!configure->reset) { + if (!(state->flags & SS_RESET)) { pcr |= PC_DRV_EN; au_writew(pcr, PCMCIA_BOARD_REG); au_sync_delay(100); @@ -408,10 +387,16 @@ pb1x00_pcmcia_configure_socket(const struct pcmcia_configure *configure) } -struct pcmcia_low_level pb1x00_pcmcia_ops = { - pb1x00_pcmcia_init, - pb1x00_pcmcia_shutdown, - pb1x00_pcmcia_socket_state, - pb1x00_pcmcia_get_irq_info, - pb1x00_pcmcia_configure_socket +static struct pcmcia_low_level pb1x00_pcmcia_ops = { + .owner = THIS_MODULE, + + .hw_init = pb1x00_pcmcia_init, + .hw_shutdown = pb1x00_pcmcia_shutdown, + .socket_state = pb1x00_pcmcia_socket_state, + .configure_socket = pb1x00_pcmcia_configure_socket }; + +int au1x_board_init(struct device *dev) +{ + return au1x00_pcmcia_socket_probe(dev, &pb1x00_pcmcia_ops, 0, PCMCIA_MAX_SOCK); +} diff --git a/drivers/pcmcia/au1000_xxs1500.c b/drivers/pcmcia/au1000_xxs1500.c index ce9d5c4..1ca0e3b 100644 --- a/drivers/pcmcia/au1000_xxs1500.c +++ b/drivers/pcmcia/au1000_xxs1500.c @@ -26,47 +26,37 @@ * */ #include <linux/module.h> -#include <linux/init.h> -#include <linux/delay.h> -#include <linux/ioport.h> #include <linux/kernel.h> -#include <linux/tqueue.h> -#include <linux/timer.h> -#include <linux/mm.h> -#include <linux/proc_fs.h> -#include <linux/types.h> - -#include <pcmcia/cs_types.h> -#include <pcmcia/cs.h> -#include <pcmcia/ss.h> -#include <pcmcia/bulkmem.h> -#include <pcmcia/cistpl.h> -#include <pcmcia/bus_ops.h> -#include "cs_internal.h" - -#include <asm/io.h> +#include <linux/errno.h> +#include <linux/interrupt.h> +#include <linux/device.h> +#include <linux/init.h> + #include <asm/irq.h> -#include <asm/system.h> +#include <asm/signal.h> +#include <asm/mach-au1x00/au1000.h> -#include <asm/au1000.h> -#include <asm/au1000_pcmcia.h> +#include "au1000_generic.h" #define PCMCIA_MAX_SOCK 0 #define PCMCIA_NUM_SOCKS (PCMCIA_MAX_SOCK + 1) -#define PCMCIA_IRQ AU1000_GPIO_4 -#if 0 -#define DEBUG(x,args...) printk(__FUNCTION__ ": " x,##args) -#else #define DEBUG(x,args...) -#endif -static int xxs1500_pcmcia_init(struct pcmcia_init *init) +struct au1000_pcmcia_socket au1000_pcmcia_socket[PCMCIA_NUM_SOCKS]; +extern int au1x00_pcmcia_socket_probe(struct device *, struct pcmcia_low_level *, int, int); + +static int xxs1500_pcmcia_init(struct au1000_pcmcia_socket *skt) { + if (skt->nr > PCMCIA_MAX_SOCK) + return -1; + + skt->irq = AU1000_GPIO_4; + return PCMCIA_NUM_SOCKS; } -static int xxs1500_pcmcia_shutdown(void) +static int xxs1500_pcmcia_shutdown(struct au1000_pcmcia_socket *skt) { /* turn off power */ au_writel(au_readl(GPIO2_PINSTATE) | (1<<14)|(1<<30), @@ -82,12 +72,13 @@ static int xxs1500_pcmcia_shutdown(void) static int -xxs1500_pcmcia_socket_state(unsigned sock, struct pcmcia_state *state) +xxs1500_pcmcia_socket_state(struct au1000_pcmcia_socket *skt, struct pcmcia_state *state) { u32 inserted; u32 vs; unsigned long gpio, gpio2; - if(sock > PCMCIA_MAX_SOCK) return -1; + if(skt->nr > PCMCIA_MAX_SOCK) + return -1; gpio = au_readl(SYS_PINSTATERD); gpio2 = au_readl(GPIO2_PINSTATE); @@ -110,9 +101,9 @@ xxs1500_pcmcia_socket_state(unsigned sock, struct pcmcia_state *state) case 3: /* 5V */ default: /* return without setting 'detect' */ - printk(KERN_ERR "au1x00_cs: unsupported VS\n", + printk(KERN_ERR "au1x00_cs: unsupported VS 0x%08x\n", vs); - return; + return -1; } state->detect = 1; } @@ -128,25 +119,16 @@ xxs1500_pcmcia_socket_state(unsigned sock, struct pcmcia_state *state) } -static int xxs1500_pcmcia_get_irq_info(struct pcmcia_irq_info *info) -{ - - if(info->sock > PCMCIA_MAX_SOCK) return -1; - info->irq = PCMCIA_IRQ; - return 0; -} - - static int -xxs1500_pcmcia_configure_socket(const struct pcmcia_configure *configure) +xxs1500_pcmcia_configure_socket(struct au1000_pcmcia_socket *skt, struct socket_state_t *state) { - - if(configure->sock > PCMCIA_MAX_SOCK) return -1; + if(skt->nr > PCMCIA_MAX_SOCK) + return -1; DEBUG("Vcc %dV Vpp %dV, reset %d\n", - configure->vcc, configure->vpp, configure->reset); + state->Vcc, state->vpp, state->flags & SS_RESET); - switch(configure->vcc){ + switch(state->Vcc){ case 33: /* Vcc 3.3V */ /* turn on power */ DEBUG("turn on power\n"); @@ -165,7 +147,7 @@ xxs1500_pcmcia_configure_socket(const struct pcmcia_configure *configure) break; } - if (!configure->reset) { + if (!(state->flags & SS_RESET)) { DEBUG("deassert reset\n"); au_writel((au_readl(GPIO2_PINSTATE) & ~(1<<4))|(1<<20), GPIO2_OUTPUT); @@ -183,9 +165,16 @@ xxs1500_pcmcia_configure_socket(const struct pcmcia_configure *configure) } struct pcmcia_low_level xxs1500_pcmcia_ops = { - xxs1500_pcmcia_init, - xxs1500_pcmcia_shutdown, - xxs1500_pcmcia_socket_state, - xxs1500_pcmcia_get_irq_info, - xxs1500_pcmcia_configure_socket + .owner = THIS_MODULE, + + .hw_init = xxs1500_pcmcia_init, + .hw_shutdown = xxs1500_pcmcia_shutdown, + + .socket_state = xxs1500_pcmcia_socket_state, + .configure_socket = xxs1500_pcmcia_configure_socket }; + +int au1x_board_init(struct device *dev) +{ + return au1x00_pcmcia_socket_probe(dev, &xxs1500_pcmcia_ops, 0, PCMCIA_MAX_SOCK); +}