diff -Naur -X ../linux/Documentation/dontdiff linux-2.6.12-rc5-makefiles/arch/arm/boot/compressed/head.S linux-2.6.12-rc5-local/arch/arm/boot/compressed/head.S --- linux-2.6.12-rc5-makefiles/arch/arm/boot/compressed/head.S 2005-06-06 14:29:53.318217935 -0500 +++ linux-2.6.12-rc5-local/arch/arm/boot/compressed/head.S 2005-06-06 14:31:03.728506352 -0500 @@ -721,5 +721,9 @@ reloc_end: .align +#if defined(CONFIG_MACH_POODLE) || defined(CONFIG_PXA_SHARPSL) + .section ".stack", "aw" +#else .section ".stack", "w" +#endif user_stack: .space 4096 diff -Naur -X ../linux/Documentation/dontdiff linux-2.6.12-rc5-makefiles/arch/arm/boot/compressed/vmlinux.lds.in linux-2.6.12-rc5-local/arch/arm/boot/compressed/vmlinux.lds.in --- linux-2.6.12-rc5-makefiles/arch/arm/boot/compressed/vmlinux.lds.in 2005-03-02 01:38:08.000000000 -0600 +++ linux-2.6.12-rc5-local/arch/arm/boot/compressed/vmlinux.lds.in 2005-06-06 14:31:03.728506352 -0500 @@ -42,7 +42,7 @@ .bss : { *(.bss) } _end = .; - .stack (NOLOAD) : { *(.stack) } + .stack : { *(.stack) } .stab 0 : { *(.stab) } .stabstr 0 : { *(.stabstr) } diff -Naur -X ../linux/Documentation/dontdiff linux-2.6.12-rc5-makefiles/arch/arm/mach-pxa/poodle.c linux-2.6.12-rc5-local/arch/arm/mach-pxa/poodle.c --- linux-2.6.12-rc5-makefiles/arch/arm/mach-pxa/poodle.c 2005-06-06 14:29:53.410197411 -0500 +++ linux-2.6.12-rc5-local/arch/arm/mach-pxa/poodle.c 2005-06-06 14:31:03.692514383 -0500 @@ -84,6 +84,8 @@ .resource = locomo_resources, }; +extern void locomolcd_power(int); + /* PXAFB device */ static struct pxafb_mach_info poodle_fb_info __initdata = { .pixclock = 144700, @@ -105,7 +107,7 @@ .lccr3 = 0, .pxafb_backlight_power = NULL, - .pxafb_lcd_power = NULL, + .pxafb_lcd_power = locomolcd_power, }; static struct platform_device *devices[] __initdata = { diff -Naur -X ../linux/Documentation/dontdiff linux-2.6.12-rc5-makefiles/arch/arm/mach-sa1100/collie.c linux-2.6.12-rc5-local/arch/arm/mach-sa1100/collie.c --- linux-2.6.12-rc5-makefiles/arch/arm/mach-sa1100/collie.c 2005-06-06 14:30:11.936063488 -0500 +++ linux-2.6.12-rc5-local/arch/arm/mach-sa1100/collie.c 2005-06-06 14:31:03.705511483 -0500 @@ -120,7 +120,7 @@ } static struct flash_platform_data collie_flash_data = { - .map_name = "cfi_probe", + .map_name = "sharp", .set_vpp = collie_set_vpp, .parts = collie_partitions, .nr_parts = ARRAY_SIZE(collie_partitions), @@ -134,6 +134,14 @@ } }; +static struct resource collie_ucb_resources[] = { + { + .start = COLLIE_IRQ_GPIO_UCB1x00_IRQ, + .end = COLLIE_IRQ_GPIO_UCB1x00_IRQ, + .flags = IORESOURCE_MEM, + }, +}; + static void __init collie_init(void) { int ret = 0; @@ -168,6 +176,12 @@ sa11x0_set_flash_data(&collie_flash_data, collie_flash_resources, ARRAY_SIZE(collie_flash_resources)); + /* set up UCB */ + GAFR &= ~COLLIE_GPIO_UCB1x00_RESET; + GPDR |= COLLIE_GPIO_UCB1x00_RESET; + GPSR |= COLLIE_GPIO_UCB1x00_RESET; + sa1100_ucb_init(collie_ucb_resources, ARRAY_SIZE(collie_ucb_resources), 1); + sharpsl_save_param(); } diff -Naur -X ../linux/Documentation/dontdiff linux-2.6.12-rc5-makefiles/drivers/mtd/chips/sharp.c linux-2.6.12-rc5-local/drivers/mtd/chips/sharp.c --- linux-2.6.12-rc5-makefiles/drivers/mtd/chips/sharp.c 2005-03-02 01:38:10.000000000 -0600 +++ linux-2.6.12-rc5-local/drivers/mtd/chips/sharp.c 2005-06-06 14:31:03.670519291 -0500 @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -59,9 +60,12 @@ #define SR_ERRORS (SR_ERROR_ERASE|SR_ERROR_WRITE|SR_VPP|SR_PROTECT) +#define BLOCK_MASK 0xfffe0000 + /* Configuration options */ -#undef AUTOUNLOCK /* automatically unlocks blocks before erasing */ +//#undef AUTOUNLOCK /* automatically unlocks blocks before erasing */ +#define AUTOUNLOCK struct mtd_info *sharp_probe(struct map_info *); @@ -82,7 +86,7 @@ static int sharp_erase_oneblock(struct map_info *map, struct flchip *chip, unsigned long adr); #ifdef AUTOUNLOCK -static void sharp_unlock_oneblock(struct map_info *map, struct flchip *chip, +static inline void sharp_unlock_oneblock(struct map_info *map, struct flchip *chip, unsigned long adr); #endif @@ -105,6 +109,13 @@ .module = THIS_MODULE }; +static void sharp_udelay(unsigned long i) { + if (in_interrupt()) { + udelay(i); + } else { + schedule(); + } +} struct mtd_info *sharp_probe(struct map_info *map) { @@ -130,6 +141,7 @@ kfree(sharp); return NULL; } + //MSC0 = 0xfff8fff8; mtd->priv = map; mtd->type = MTD_NORFLASH; @@ -143,7 +155,8 @@ mtd->name = map->name; memset(sharp, 0, sizeof(*sharp)); - sharp->chipshift = 23; + //sharp->chipshift = 23; + sharp->chipshift = 24; sharp->numchips = 1; sharp->chips[0].start = 0; sharp->chips[0].state = FL_READY; @@ -159,6 +172,18 @@ return mtd; } +/* yep, this is a very bad hack */ +static inline u32 map_read32(struct map_info *map, unsigned long off) +{ + return __raw_readl(map->virt + off); +} + +static inline void map_write32(struct map_info *map, u32 data, unsigned long off) +{ + __raw_writel(data, map->virt + off); + mb(); +} + static int sharp_probe_map(struct map_info *map,struct mtd_info *mtd) { unsigned long tmp; @@ -172,8 +197,9 @@ read0=map_read32(map, base+0); read4=map_read32(map, base+4); - if(read0 == 0x89898989){ - printk("Looks like sharp flash\n"); + //if(read0 == 0x89898989){ + if (read0 == 0x00b000b0) { + //printk("Looks like sharp flash\n"); switch(read4){ case 0xaaaaaaaa: case 0xa0a0a0a0: @@ -188,6 +214,11 @@ mtd->erasesize = 0x10000 * width; mtd->size = 0x100000 * width; return width; + case 0x00b000b0: + /* a6 - LH28F640BFHE 8 64k * 2 chip blocks*/ + mtd->erasesize = 0x10000 * width / 2; + mtd->size = 0x800000 * width / 2; + return width; #if 0 case 0x00000000: /* unknown */ /* XX - LH28F004SCT 512kx8, 8 64k blocks*/ @@ -214,7 +245,7 @@ /* This function returns with the chip->mutex lock held. */ static int sharp_wait(struct map_info *map, struct flchip *chip) { - __u16 status; + __u32 status; unsigned long timeo = jiffies + HZ; DECLARE_WAITQUEUE(wait, current); int adr = 0; @@ -228,23 +259,35 @@ chip->state = FL_STATUS; case FL_STATUS: status = map_read32(map,adr); + if ((status & SR_READY) == SR_READY) + break; + spin_unlock_bh(chip->mutex); + if (time_after(jiffies, timeo)) { + printk("Waiting for chip to be ready timed out in erase\n"); + return -EIO; + } + sharp_udelay(1); + goto retry; //printk("status=%08x\n",status); - udelay(100); - if((status & SR_READY)!=SR_READY){ + //udelay(100); + //if((status & SR_READY)!=SR_READY){ //printk(".status=%08x\n",status); - udelay(100); - } - break; + // udelay(100); + //} + //break; default: - printk("Waiting for chip\n"); + //printk("Waiting for chip\n"); set_current_state(TASK_INTERRUPTIBLE); add_wait_queue(&chip->wq, &wait); spin_unlock_bh(chip->mutex); - schedule(); + //schedule(); + sharp_udelay(1); + + set_current_state(TASK_RUNNING); remove_wait_queue(&chip->wq, &wait); if(signal_pending(current)) @@ -349,12 +392,13 @@ unsigned long adr, __u32 datum) { int ret; - int timeo; int try; int i; - int status = 0; + u32 status = 0; ret = sharp_wait(map,chip); + if (ret < 0) + return ret; for(try=0;try<10;try++){ map_write32(map,CMD_BYTE_WRITE,adr); @@ -363,14 +407,21 @@ chip->state = FL_WRITING; - timeo = jiffies + (HZ/2); - map_write32(map,CMD_READ_STATUS,adr); for(i=0;i<100;i++){ status = map_read32(map,adr); if((status & SR_READY)==SR_READY) break; } +#ifdef AUTOUNLOCK + if (status & SR_PROTECT) { /* lock block */ + map_write32(map, CMD_CLEAR_STATUS, adr); + sharp_unlock_oneblock(map,chip,adr); + map_write32(map, CMD_CLEAR_STATUS, adr); + map_write32(map, CMD_RESET, adr); + continue; + } +#endif if(i==100){ printk("sharp: timed out writing\n"); } @@ -385,8 +436,7 @@ map_write32(map,CMD_RESET,adr); chip->state = FL_READY; - wake_up(&chip->wq); - spin_unlock_bh(chip->mutex); + sharp_release(chip); return 0; } @@ -414,8 +464,13 @@ ret = sharp_erase_oneblock(map, &sharp->chips[chipnum], adr); if(ret)return ret; - adr += mtd->erasesize; - len -= mtd->erasesize; + if (adr >= 0xfe0000) { + adr += mtd->erasesize / 8; + len -= mtd->erasesize / 8; + } else { + adr += mtd->erasesize; + len -= mtd->erasesize; + } if(adr >> sharp->chipshift){ adr = 0; chipnum++; @@ -430,7 +485,7 @@ return 0; } -static int sharp_do_wait_for_ready(struct map_info *map, struct flchip *chip, +static inline int sharp_do_wait_for_ready(struct map_info *map, struct flchip *chip, unsigned long adr) { int ret; @@ -441,7 +496,7 @@ map_write32(map,CMD_READ_STATUS,adr); status = map_read32(map,adr); - timeo = jiffies + HZ; + timeo = jiffies + HZ * 10; while(time_before(jiffies, timeo)){ map_write32(map,CMD_READ_STATUS,adr); @@ -453,18 +508,22 @@ set_current_state(TASK_INTERRUPTIBLE); add_wait_queue(&chip->wq, &wait); - //spin_unlock_bh(chip->mutex); + spin_unlock_bh(chip->mutex); schedule_timeout(1); schedule(); - remove_wait_queue(&chip->wq, &wait); - //spin_lock_bh(chip->mutex); + spin_lock_bh(chip->mutex); + + remove_wait_queue(&chip->wq, &wait); + set_current_state(TASK_RUNNING); +#if 0 if (signal_pending(current)){ ret = -EINTR; goto out; } +#endif } ret = -ETIME; @@ -477,11 +536,15 @@ { int ret; //int timeo; - int status; + u32 status; //int i; //printk("sharp_erase_oneblock()\n"); + ret = sharp_wait(map,chip); + if (ret < 0) + return ret; + #ifdef AUTOUNLOCK /* This seems like a good place to do an unlock */ sharp_unlock_oneblock(map,chip,adr); @@ -493,7 +556,10 @@ chip->state = FL_ERASING; ret = sharp_do_wait_for_ready(map,chip,adr); - if(ret<0)return ret; + if(ret<0) { + spin_unlock_bh(chip->mutex); + return ret; + } map_write32(map,CMD_READ_STATUS,adr); status = map_read32(map,adr); @@ -501,43 +567,30 @@ if(!(status&SR_ERRORS)){ map_write32(map,CMD_RESET,adr); chip->state = FL_READY; - //spin_unlock_bh(chip->mutex); + spin_unlock_bh(chip->mutex); return 0; } printk("sharp: error erasing block at addr=%08lx status=%08x\n",adr,status); map_write32(map,CMD_CLEAR_STATUS,adr); - //spin_unlock_bh(chip->mutex); + sharp_release(chip); return -EIO; } #ifdef AUTOUNLOCK -static void sharp_unlock_oneblock(struct map_info *map, struct flchip *chip, +static inline void sharp_unlock_oneblock(struct map_info *map, struct flchip *chip, unsigned long adr) { - int i; - int status; + u32 status; - map_write32(map,CMD_CLEAR_BLOCK_LOCKS_1,adr); - map_write32(map,CMD_CLEAR_BLOCK_LOCKS_2,adr); + map_write32(map,CMD_CLEAR_BLOCK_LOCKS_1,adr & BLOCK_MASK); + map_write32(map,CMD_CLEAR_BLOCK_LOCKS_2,adr & BLOCK_MASK); - udelay(100); + sharp_do_wait_for_ready(map,chip,adr); status = map_read32(map,adr); - printk("status=%08x\n",status); - - for(i=0;i<1000;i++){ - //map_write32(map,CMD_READ_STATUS,adr); - status = map_read32(map,adr); - if((status & SR_READY)==SR_READY) - break; - udelay(100); - } - if(i==1000){ - printk("sharp: timed out unlocking block\n"); - } if(!(status&SR_ERRORS)){ map_write32(map,CMD_RESET,adr); @@ -557,20 +610,55 @@ static int sharp_suspend(struct mtd_info *mtd) { - printk("sharp_suspend()\n"); - return -EINVAL; + struct map_info *map = mtd->priv; + struct sharp_info *sharp = map->fldrv_priv; + int i; + struct flchip *chip; + int ret = 0; + + for (i = 0; !ret && i < sharp->numchips; i++) { + chip = &sharp->chips[i]; + ret = sharp_wait(map,chip); + + if (ret) { + ret = -EAGAIN; + } else { + chip->state = FL_PM_SUSPENDED; + spin_unlock_bh(chip->mutex); + } + } + return ret; } static void sharp_resume(struct mtd_info *mtd) { - printk("sharp_resume()\n"); - + struct map_info *map = mtd->priv; + struct sharp_info *sharp = map->fldrv_priv; + int i; + struct flchip *chip; + + for (i = 0; i < sharp->numchips; i++) { + chip = &sharp->chips[i]; + + spin_lock_bh(chip->mutex); + + if (chip->state == FL_PM_SUSPENDED) { + /* We need to force it back to a known state */ + map_write32(map, CMD_RESET, chip->start); + chip->state = FL_READY; + wake_up(&chip->wq); + } + + spin_unlock_bh(chip->mutex); + } } static void sharp_destroy(struct mtd_info *mtd) { - printk("sharp_destroy()\n"); + struct map_info *map = mtd->priv; + struct sharp_info *sharp = map->fldrv_priv; + kfree(sharp); } int __init sharp_probe_init(void) diff -Naur -X ../linux/Documentation/dontdiff linux-2.6.12-rc5-makefiles/drivers/pcmcia/Makefile linux-2.6.12-rc5-local/drivers/pcmcia/Makefile --- linux-2.6.12-rc5-makefiles/drivers/pcmcia/Makefile 2005-03-02 01:38:18.000000000 -0600 +++ linux-2.6.12-rc5-local/drivers/pcmcia/Makefile 2005-06-06 14:31:03.659521745 -0500 @@ -58,6 +58,7 @@ sa1100_cs-$(CONFIG_SA1100_H3600) += sa1100_h3600.o sa1100_cs-$(CONFIG_SA1100_SHANNON) += sa1100_shannon.o sa1100_cs-$(CONFIG_SA1100_SIMPAD) += sa1100_simpad.o +sa1100_cs-$(CONFIG_SA1100_COLLIE) += sa1100_collie.o pxa2xx_cs-$(CONFIG_ARCH_LUBBOCK) += pxa2xx_lubbock.o sa1111_generic.o pxa2xx_cs-$(CONFIG_MACH_MAINSTONE) += pxa2xx_mainstone.o diff -Naur -X ../linux/Documentation/dontdiff linux-2.6.12-rc5-makefiles/drivers/pcmcia/sa1100_collie.c linux-2.6.12-rc5-local/drivers/pcmcia/sa1100_collie.c --- linux-2.6.12-rc5-makefiles/drivers/pcmcia/sa1100_collie.c 1969-12-31 18:00:00.000000000 -0600 +++ linux-2.6.12-rc5-local/drivers/pcmcia/sa1100_collie.c 2005-06-06 14:31:03.659521745 -0500 @@ -0,0 +1,215 @@ +/* + * drivers/pcmcia/sa1100_collie.c + * + * PCMCIA implementation routines for Collie + * + * May be copied or modified under the terms of the GNU General Public + * License. See linux/COPYING for more information. + * + */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "sa1100_generic.h" + +static unsigned short keep_vs[2]; +#define NO_KEEP_VS 0x0001 + +static struct pcmcia_irqs irqs[] = { + { 1, COLLIE_IRQ_GPIO_CF_CD, "CF_CD"}, +}; + +static void collie_pcmcia_init_reset(void) +{ + reset_scoop(); + keep_vs[0] = NO_KEEP_VS; +} + +static int collie_pcmcia_hw_init(struct soc_pcmcia_socket *skt) +{ + int ret; + + /* set COLLIE_GPIO_CF_CD & COLLIE_GPIO_CF_IRQ as inputs */ + GPDR &= ~(COLLIE_GPIO_CF_CD|COLLIE_GPIO_CF_IRQ); + + /* Set transition detect */ + set_irq_type(COLLIE_IRQ_GPIO_CF_IRQ, IRQT_FALLING); + + ret = soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs)); + + if (ret) + return ret; + + /* enable interrupt */ + write_scoop_reg(SCOOP_IMR, 0x00C0); + write_scoop_reg(SCOOP_MCR, 0x0101); + keep_vs[0] = keep_vs[1] = NO_KEEP_VS; + + return 0; +} + +static void collie_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt) +{ + soc_pcmcia_free_irqs(skt, irqs, ARRAY_SIZE(irqs)); + + /* CF_BUS_OFF */ + collie_pcmcia_init_reset(); +} + +static void +collie_pcmcia_socket_state(struct soc_pcmcia_socket *skt, struct pcmcia_state *state) +{ + unsigned short cpr, csr; + + cpr = read_scoop_reg(SCOOP_CPR); + //COLLIE_SCP_REG_CDR = 0x0002; + write_scoop_reg(SCOOP_IRM, 0x00FF); + write_scoop_reg(SCOOP_ISR, 0x0000); + write_scoop_reg(SCOOP_IRM, 0x0000); + csr = read_scoop_reg(SCOOP_CSR); + if( csr & 0x0004 ){ + /* card eject */ + write_scoop_reg(SCOOP_CDR, 0x0000); + keep_vs[0] = NO_KEEP_VS; + } + else if( !(keep_vs[0] & NO_KEEP_VS) ){ + /* keep vs1,vs2 */ + write_scoop_reg(SCOOP_CDR, 0x0000); + csr |= keep_vs[0]; + } + else if( cpr & 0x0003 ){ + /* power on */ + write_scoop_reg(SCOOP_CDR, 0x0000); + keep_vs[0] = (csr & 0x00C0); + } + else{ /* card detect */ + write_scoop_reg(SCOOP_CDR, 0x0002); + } + + state->detect = (csr & 0x0004)? 0:1; + state->ready = (csr & 0x0002)? 1:0; + state->bvd1 = (csr & 0x0010)? 1:0; + state->bvd2 = (csr & 0x0020)? 1:0; + state->wrprot = (csr & 0x0008)? 1:0; + state->vs_3v = (csr & 0x0040)? 0:1; + state->vs_Xv = (csr & 0x0080)? 0:1; + + if( (cpr & 0x0080) && ((cpr & 0x8040) != 0x8040) ){ + printk(KERN_ERR "%s(): CPR=%04X, Low voltage!\n", + __FUNCTION__, cpr); + } + +} + +static int +collie_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, const socket_state_t *state) +{ + unsigned long flags; + unsigned short cpr, ncpr, ccr, nccr, mcr, nmcr, imr, nimr; + + switch( state->Vcc ){ + case 0: break; + case 33: break; + case 50: break; + default: + printk(KERN_ERR "%s(): unrecognized Vcc %u\n", + __FUNCTION__, state->Vcc); + return -1; + } + if( (state->Vpp!=state->Vcc) && (state->Vpp!=0) ){ + printk(KERN_ERR "%s(): CF slot cannot support Vpp %u\n", + __FUNCTION__, state->Vpp); + return -1; + } + + local_irq_save(flags); + + nmcr = (mcr = read_scoop_reg(SCOOP_MCR)) & ~0x0010; + ncpr = (cpr = read_scoop_reg(SCOOP_CPR)) & ~0x0083; + nccr = (ccr = read_scoop_reg(SCOOP_CCR)) & ~0x0080; + nimr = (imr = read_scoop_reg(SCOOP_IMR)) & ~0x003E; + + ncpr |= (state->Vcc == 33) ? 0x0001: + (state->Vcc == 50) ? 0x0002: + 0; + /* the 2.5 tree on linux-cl.bkbits.net had this code + nccr = ((state->flags & SS_RESET) ? (nccr | 0x0080) : (nccr &= ~0x0080)); + ncpr = ((state->flags & SS_OUTPUT_ENA) ? (ncpr | 0x0080) : (ncpr &= ~0x0080)); */ + + nmcr |= (state->flags&SS_IOCARD)? 0x0010: 0; + ncpr |= (state->flags&SS_OUTPUT_ENA)? 0x0080: 0; + nccr |= (state->flags&SS_RESET)? 0x0080: 0; + nimr |= ((skt->status&SS_DETECT) ? 0x0004: 0)| + ((skt->status&SS_READY) ? 0x0002: 0)| + ((skt->status&SS_BATDEAD)? 0x0010: 0)| + ((skt->status&SS_BATWARN)? 0x0020: 0)| + ((skt->status&SS_STSCHG) ? 0x0010: 0)| + ((skt->status&SS_WRPROT) ? 0x0008: 0); + + if (mcr != nmcr) write_scoop_reg(SCOOP_MCR, nmcr); + if (cpr != ncpr) write_scoop_reg(SCOOP_CPR, ncpr); + if (ccr != nccr) write_scoop_reg(SCOOP_CCR, nccr); + if (imr != nimr) write_scoop_reg(SCOOP_IMR, nimr); + + local_irq_restore(flags); + + return 0; +} + +/* + * Enable card status IRQs on (re-)initialisation. This can + * be called at initialisation, power management event, or + * pcmcia event. + */ +static void collie_pcmcia_socket_init(struct soc_pcmcia_socket *skt) +{ + soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs)); + + /* We need to disable SS_OUTPUT_ENA here. */ + write_scoop_reg(SCOOP_CPR, read_scoop_reg(SCOOP_CPR) & ~0x0080) +} + +static void collie_pcmcia_socket_suspend(struct soc_pcmcia_socket *skt) +{ + soc_pcmcia_free_irqs(skt, irqs, ARRAY_SIZE(irqs)); + + /* We need to disable SS_OUTPUT_ENA here. */ + write_scoop_reg(SCOOP_CPR, read_scoop_reg(SCOOP_CPR) & ~0x0080) +} + +struct pcmcia_low_level collie_pcmcia_ops = { + .owner = THIS_MODULE, + + .hw_init = collie_pcmcia_hw_init, + .hw_shutdown = collie_pcmcia_hw_shutdown, + + .socket_state = collie_pcmcia_socket_state, + .configure_socket = collie_pcmcia_configure_socket, + + .socket_init = collie_pcmcia_socket_init, + .socket_suspend = collie_pcmcia_socket_suspend, +}; + + +int __init pcmcia_collie_init(struct device *dev) +{ + int ret = -ENODEV; + + if (machine_is_collie()) + ret = sa11xx_drv_pcmcia_probe(dev, &collie_pcmcia_ops, 1, 1); + + return ret; +} diff -Naur -X ../linux/Documentation/dontdiff linux-2.6.12-rc5-makefiles/drivers/pcmcia/sa1100_generic.c linux-2.6.12-rc5-local/drivers/pcmcia/sa1100_generic.c --- linux-2.6.12-rc5-makefiles/drivers/pcmcia/sa1100_generic.c 2005-06-06 14:29:54.851875710 -0500 +++ linux-2.6.12-rc5-local/drivers/pcmcia/sa1100_generic.c 2005-06-06 14:31:03.659521745 -0500 @@ -48,6 +48,9 @@ #ifdef CONFIG_SA1100_CERF pcmcia_cerf_init, #endif +#ifdef CONFIG_SA1100_COLLIE + pcmcia_collie_init, +#endif #ifdef CONFIG_SA1100_H3600 pcmcia_h3600_init, #endif diff -Naur -X ../linux/Documentation/dontdiff linux-2.6.12-rc5-makefiles/drivers/pcmcia/sa1100_generic.h linux-2.6.12-rc5-local/drivers/pcmcia/sa1100_generic.h --- linux-2.6.12-rc5-makefiles/drivers/pcmcia/sa1100_generic.h 2005-03-02 01:38:10.000000000 -0600 +++ linux-2.6.12-rc5-local/drivers/pcmcia/sa1100_generic.h 2005-06-06 14:31:03.659521745 -0500 @@ -8,6 +8,7 @@ extern int pcmcia_assabet_init(struct device *); extern int pcmcia_badge4_init(struct device *); extern int pcmcia_cerf_init(struct device *); +extern int pcmcia_collie_init(struct device *); extern int pcmcia_flexanet_init(struct device *); extern int pcmcia_freebird_init(struct device *); extern int pcmcia_gcplus_init(struct device *);