Re: PCMCIA support for 860
From: Marcus Sundberg <hidden>
Date: 2000-04-04 13:23:56
Ruedi Hofer [off-list ref] writes:
Hi Well, I found out that I have to add in kernel/ksyms.c the line EXPORT_SYMBOL(request_irq); Now I'm able to load the different kernel modules, but sh-2.03# sh-2.03# insmod pcmcia_core Linux PCMCIA Card Services 3.1.10 kernel build: 2.2.13 #85 Tue Apr 4 10:26:49 CEST 2000 options: none sh-2.03# insmod m8xx_pcmcia m8xx_pcmcia: Version 0.03, 14-Feb-2000, Magnus Damm m8xx_pcmcia: ADS using SLOT_A with IRQ 13. sh-2.03# insmod ds sh-2.03# insmod ide_cs /lib/modules/2.2.13/pcmcia/ide_cs.o: unresolved symbol ide_unregister /lib/modules/2.2.13/pcmcia/ide_cs.o: unresolved symbol ide_register sh-2.03# ... I can't add the module ide_cs. For that reason, do I have to enable 'Enhanced IDE support' in the kernel options??
Yes, if you want to use ATA flash disks you must do that. Also note that I haven't got the IDE code to run as modules, so you'll have to compile it into the kernel.
If I do so, I get the following compile errors: m8xx_setup.c: In function `m8xx_init_IRQ': m8xx_setup.c:286: warning: implicit declaration of function `cpm_interrupt_init' m8xx_setup.c: In function `m8xx_ide_init_hwif_ports': m8xx_setup.c:390: warning: unused variable `port' m8xx_setup.c: In function `m8xx_init': m8xx_setup.c:522: structure has no member named `ide_request_irq' make[1]: *** [m8xx_setup.o] Error 1 make[1]: Leaving directory `/usr/src/linux-mpc8xx-2.2.13-damm-bossek-fpu-pcmcia/arch/ppc/kernel' make: *** [_dir_arch/ppc/kernel] Error 2
The IDE support in Dan's 2.2.13 isn't uptodate. This first diff puts it in sync with the rest of the kernel: diff -u -r1.1 -r1.2
--- Config.in 2000/01/11 18:13:30 1.1
+++ Config.in 2000/01/11 18:21:02 1.2@@ -21,4 +21,8 @@ bool 'RPX-Lite 823(e) LCD Frame Buffer' CONFIG_RPXLCD +if [ "$CONFIG_BLK_DEV_IDE" = "y" ]; then + bool 'Configure IDE driver for ATA on PCMCIA' CONFIG_IDE_ATA_FLASH +fi + endmenu
diff -u -u -r1.1 -r1.2
--- m8xx_setup.c 2000/01/11 18:13:31 1.1
+++ m8xx_setup.c 2000/01/11 18:28:29 1.2@@ -160,7 +160,7 @@ fp = (binfo->bi_intfreq * 1000000) / 16; freq = fp*60; /* try to make freq/1e6 an integer */ divisor = 60; - printk("time_init: decrementer frequency = %d/%d\n", freq, divisor); + printk("Decrementer frequency: %d/%d\n", freq, divisor); decrementer_count = freq / HZ / divisor; count_period_num = divisor; count_period_den = freq / 1000000;
@@ -300,17 +300,13 @@ #if defined(CONFIG_BLK_DEV_IDE) || defined(CONFIG_BLK_DEV_IDE_MODULE) -/* Define this to make a PCMCIA ATA Flash card work. -*/ -#define ATA_FLASH 1 - /* * IDE stuff. */ void m8xx_ide_insw(ide_ioreg_t port, void *buf, int ns) { -#ifdef ATA_FLASH +#ifdef CONFIG_IDE_ATA_FLASH ide_insw(port, buf, ns); #else ide_insw(port+_IO_BASE, buf, ns);
@@ -320,7 +316,7 @@ void m8xx_ide_outsw(ide_ioreg_t port, void *buf, int ns) { -#ifdef ATA_FLASH +#ifdef CONFIG_IDE_ATA_FLASH ide_outsw(port, buf, ns); #else ide_outsw(port+_IO_BASE, buf, ns);
@@ -330,7 +326,7 @@ int m8xx_ide_default_irq(ide_ioreg_t base) { -#ifdef ATA_FLASH +#ifdef CONFIG_IDE_ATA_FLASH return PCMCIA_INTERRUPT; #else return 14;
@@ -362,20 +358,6 @@ { } -int -m8xx_ide_request_irq(unsigned int irq, - void (*handler)(int, void *, struct pt_regs *), - unsigned long flags, - const char *device, - void *dev_id) -{ -#ifdef ATA_FLASH - return request_8xxirq(irq, handler, flags, device, dev_id); -#else - return request_irq(irq, handler, flags, device, dev_id); -#endif -} - void m8xx_ide_fix_driveid(struct hd_driveid *id) {
@@ -389,11 +371,11 @@ { ide_ioreg_t port = base; int i; -#ifdef ATA_FLASH +#ifdef CONFIG_IDE_ATA_FLASH volatile pcmconf8xx_t *pcmp; #endif -#ifdef ATA_FLASH +#ifdef CONFIG_IDE_ATA_FLASH *p = 0; *irq = 0;
@@ -406,6 +388,14 @@ base = (unsigned long) ioremap(PCMCIA_MEM_ADDR, 0x200); +#if defined(CONFIG_ADS) || defined(CONFIG_FADS) + pcmp->pcmc_pbr0 = PCMCIA_MEM_ADDR; + pcmp->pcmc_por0 = 0xc00ff051; // 16bit access - read CIS + pcmp->pcmc_pgcra = 0; + pcmp->pcmc_pgcrb = 0; + pcmp->pcmc_por0 = 0xc00ff041; // mem-mapped +#endif + /* For the M-Systems ATA card, the first 8 registers map 1:1. * The following register, control/Altstatus, is located at 0x0e. * Following that, the irq offset, is not used, so we place it in
@@ -519,7 +509,6 @@ ppc_ide_md.release_region = m8xx_ide_release_region; ppc_ide_md.fix_driveid = m8xx_ide_fix_driveid; ppc_ide_md.ide_init_hwif = m8xx_ide_init_hwif_ports; - ppc_ide_md.ide_request_irq = m8xx_ide_request_irq; ppc_ide_md.io_base = _IO_BASE; #endif
Note that you must say _no_ to 'Configure IDE driver for ATA on PCMCIA' to use the pcmcia-cs package. This second diff is required to use ATA flash disks, but may break support for normal IDE controllers on some other bus: diff -u -b -u -r1.7 -r1.9
--- m8xx_setup.c 2000/03/17 16:17:44 1.7
+++ m8xx_setup.c 2000/03/29 19:14:17 1.9@@ -379,7 +379,7 @@ /* We can use an external IDE controller or wire the IDE interface to * the internal PCMCIA controller. */ -void __init m8xx_ide_init_hwif_ports(ide_ioreg_t *p, ide_ioreg_t base, int *irq) +void m8xx_ide_init_hwif_ports(ide_ioreg_t *p, ide_ioreg_t base, int *irq) { ide_ioreg_t port = base; int i;
@@ -434,10 +434,23 @@ /* Just a regular IDE drive on some I/O port. */ +#if 1 + if (base < MAX_HWIFS) { + /* Don't try to probe for IDE controllers. */ + *p = 0; + *irq = 0; + return; + } +#endif i = 8; while (i--) *p++ = port++; +#if 1 + *p++ = base + 0x0e; + *p++ = base + 0x0a; +#else *p++ = base + 0x206; +#endif if (irq != NULL) *irq = 0; #endif
//Marcus -- Signature under construction, please come back later. ** Sent via the linuxppc-embedded mail list. See http://lists.linuxppc.org/