static short __init isp16_c929__detect(void) { u_char ctrl; u_char tmp; isp16_ctrl = ISP16_C929__CTRL; isp16_enable_port = ISP16_C929__ENABLE_PORT; /* read' and write' are a special read and write, respectively */ /* read' ISP16_CTRL_PORT and save */ ctrl = ISP16_IN(ISP16_CTRL_PORT); /* write' zero to the ctrl port and get response */ ISP16_OUT(ISP16_CTRL_PORT, 0); tmp = ISP16_IN(ISP16_CTRL_PORT); if (tmp != 2) /* isp16 with 82C929 not detected */ return -1; /* restore ctrl port value */ ISP16_OUT(ISP16_CTRL_PORT, ctrl); return 2; }
static short isp16_c928__detect(void) { u_char ctrl; u_char enable_cdrom; u_char io; short i = -1; isp16_ctrl = ISP16_C928__CTRL; isp16_enable_port = ISP16_C928__ENABLE_PORT; /* read' and write' are a special read and write, respectively */ /* read' ISP16_CTRL_PORT, clear last two bits and write' back the result */ ctrl = ISP16_IN( ISP16_CTRL_PORT ) & 0xFC; ISP16_OUT( ISP16_CTRL_PORT, ctrl ); /* read' 3,4 and 5-bit from the cdrom enable port */ enable_cdrom = ISP16_IN( ISP16_C928__ENABLE_PORT ) & 0x38; if ( !(enable_cdrom & 0x20) ) { /* 5-bit not set */ /* read' last 2 bits of ISP16_IO_SET_PORT */ io = ISP16_IN( ISP16_IO_SET_PORT ) & 0x03; if ( ((io&0x01)<<1) == (io&0x02) ) { /* bits are the same */ if ( io == 0 ) { /* ...the same and 0 */ i = 0; enable_cdrom |= 0x20; } else { /* ...the same and 1 */ /* my card, first time 'round */ i = 1; enable_cdrom |= 0x28; } ISP16_OUT( ISP16_C928__ENABLE_PORT, enable_cdrom ); } else { /* bits are not the same */ ISP16_OUT( ISP16_CTRL_PORT, ctrl ); return(i); /* -> not detected: possibly incorrect conclusion */ } } else if ( enable_cdrom == 0x20 ) i = 0; else if ( enable_cdrom == 0x28 ) /* my card, already initialised */ i = 1; ISP16_OUT( ISP16_CTRL_PORT, ctrl ); return(i); }
static short __init isp16_cdi_config(int base, u_char drive_type, int irq, int dma) { u_char base_code; u_char irq_code; u_char dma_code; u_char i; if ((drive_type == ISP16_MITSUMI) && (dma != 0)) printk("ISP16: Mitsumi cdrom drive has no dma support.\n"); switch (base) { case 0x340: base_code = ISP16_BASE_340; break; case 0x330: base_code = ISP16_BASE_330; break; case 0x360: base_code = ISP16_BASE_360; break; case 0x320: base_code = ISP16_BASE_320; break; default: printk ("ISP16: base address 0x%03X not supported by cdrom interface.\n", base); return -1; } switch (irq) { case 0: irq_code = ISP16_IRQ_X; break; /* disable irq */ case 5: irq_code = ISP16_IRQ_5; printk("ISP16: irq 5 shouldn't be used by cdrom interface," " due to possible conflicts with the sound card.\n"); break; case 7: irq_code = ISP16_IRQ_7; printk("ISP16: irq 7 shouldn't be used by cdrom interface," " due to possible conflicts with the sound card.\n"); break; case 3: irq_code = ISP16_IRQ_3; break; case 9: irq_code = ISP16_IRQ_9; break; case 10: irq_code = ISP16_IRQ_10; break; case 11: irq_code = ISP16_IRQ_11; break; default: printk("ISP16: irq %d not supported by cdrom interface.\n", irq); return -1; } switch (dma) { case 0: dma_code = ISP16_DMA_X; break; /* disable dma */ case 1: printk("ISP16: dma 1 cannot be used by cdrom interface," " due to conflict with the sound card.\n"); return -1; break; case 3: dma_code = ISP16_DMA_3; break; case 5: dma_code = ISP16_DMA_5; break; case 6: dma_code = ISP16_DMA_6; break; case 7: dma_code = ISP16_DMA_7; break; default: printk("ISP16: dma %d not supported by cdrom interface.\n", dma); return -1; } if (drive_type != ISP16_SONY && drive_type != ISP16_PANASONIC0 && drive_type != ISP16_PANASONIC1 && drive_type != ISP16_SANYO0 && drive_type != ISP16_SANYO1 && drive_type != ISP16_MITSUMI && drive_type != ISP16_DRIVE_X) { printk ("ISP16: drive type (code 0x%02X) not supported by cdrom" " interface.\n", drive_type); return -1; } /* set type of interface */ i = ISP16_IN(ISP16_DRIVE_SET_PORT) & ISP16_DRIVE_SET_MASK; /* clear some bits */ ISP16_OUT(ISP16_DRIVE_SET_PORT, i | drive_type); /* enable cdrom on interface with 82C929 chip */ if (isp16_type > 1) ISP16_OUT(isp16_enable_port, ISP16_ENABLE_CDROM); /* set base address, irq and dma */ i = ISP16_IN(ISP16_IO_SET_PORT) & ISP16_IO_SET_MASK; /* keep some bits */ ISP16_OUT(ISP16_IO_SET_PORT, i | base_code | irq_code | dma_code); return 0; }