Loading drivers/parport/parport_pc.c +57 −41 Original line number Diff line number Diff line Loading @@ -1119,7 +1119,8 @@ dump_parport_state("FIFO full", port); continue; } DPRINTK(KERN_DEBUG "*** ecp_read_block_pio: reading one byte from the FIFO\n"); DPRINTK(KERN_DEBUG "*** ecp_read_block_pio: reading one byte from the FIFO\n"); /* FIFO not filled. We will cycle this loop for a while * and either the peripheral will fill it faster, Loading Loading @@ -1216,10 +1217,23 @@ static const struct parport_operations parport_pc_ops = { }; #ifdef CONFIG_PARPORT_PC_SUPERIO static struct superio_struct *find_free_superio(void) { int i; for (i = 0; i < NR_SUPERIOS; i++) if (superios[i].io == 0) return &superios[i]; return NULL; } /* Super-IO chipset detection, Winbond, SMSC */ static void __devinit show_parconfig_smsc37c669(int io, int key) { int cr1, cr4, cra, cr23, cr26, cr27, i = 0; int cr1, cr4, cra, cr23, cr26, cr27; struct superio_struct *s; static const char *const modes[] = { "SPP and Bidirectional (PS/2)", "EPP and SPP", Loading Loading @@ -1272,30 +1286,29 @@ static void __devinit show_parconfig_smsc37c669(int io, int key) are related, however DMA can be 1 or 3, assume DMA_A=DMA1, DMA_C=DMA3 (this is true e.g. for TYAN 1564D Tomcat IV) */ if (cr23 * 4 >= 0x100) { /* if active */ while ((i < NR_SUPERIOS) && (superios[i].io != 0)) i++; if (i == NR_SUPERIOS) { s = find_free_superio(); if (s == NULL) printk(KERN_INFO "Super-IO: too many chips!\n"); } else { else { int d; switch (cr23 * 4) { case 0x3bc: superios[i].io = 0x3bc; superios[i].irq = 7; s->io = 0x3bc; s->irq = 7; break; case 0x378: superios[i].io = 0x378; superios[i].irq = 7; s->io = 0x378; s->irq = 7; break; case 0x278: superios[i].io = 0x278; superios[i].irq = 5; s->io = 0x278; s->irq = 5; } d = (cr26 & 0x0f); if (d == 1 || d == 3) superios[i].dma = d; s->dma = d; else superios[i].dma = PARPORT_DMA_NONE; s->dma = PARPORT_DMA_NONE; } } } Loading @@ -1303,7 +1316,8 @@ static void __devinit show_parconfig_smsc37c669(int io, int key) static void __devinit show_parconfig_winbond(int io, int key) { int cr30, cr60, cr61, cr70, cr74, crf0, i = 0; int cr30, cr60, cr61, cr70, cr74, crf0; struct superio_struct *s; static const char *const modes[] = { "Standard (SPP) and Bidirectional(PS/2)", /* 0 */ "EPP-1.9 and SPP", Loading Loading @@ -1356,14 +1370,13 @@ static void __devinit show_parconfig_winbond(int io, int key) } if (cr30 & 0x01) { /* the settings can be interrogated later ... */ while ((i < NR_SUPERIOS) && (superios[i].io != 0)) i++; if (i == NR_SUPERIOS) { s = find_free_superio(); if (s == NULL) printk(KERN_INFO "Super-IO: too many chips!\n"); } else { superios[i].io = (cr60<<8)|cr61; superios[i].irq = cr70&0x0f; superios[i].dma = (((cr74 & 0x07) > 3) ? else { s->io = (cr60 << 8) | cr61; s->irq = cr70 & 0x0f; s->dma = (((cr74 & 0x07) > 3) ? PARPORT_DMA_NONE : (cr74 & 0x07)); } } Loading Loading @@ -1618,25 +1631,28 @@ static void __devinit detect_and_report_it87(void) } #endif /* CONFIG_PARPORT_PC_SUPERIO */ static int get_superio_dma(struct parport *p) static struct superio_struct *find_superio(struct parport *p) { int i = 0; int i; for (i = 0; i < NR_SUPERIOS; i++) if (superios[i].io != p->base) return &superios[i]; return NULL; } while ((i < NR_SUPERIOS) && (superios[i].io != p->base)) i++; if (i != NR_SUPERIOS) return superios[i].dma; static int get_superio_dma(struct parport *p) { struct superio_struct *s = find_superio(p); if (s) return s->dma; return PARPORT_DMA_NONE; } static int get_superio_irq(struct parport *p) { int i = 0; while ((i < NR_SUPERIOS) && (superios[i].io != p->base)) i++; if (i != NR_SUPERIOS) return superios[i].irq; struct superio_struct *s = find_superio(p); if (s) return s->irq; return PARPORT_IRQ_NONE; } Loading Loading
drivers/parport/parport_pc.c +57 −41 Original line number Diff line number Diff line Loading @@ -1119,7 +1119,8 @@ dump_parport_state("FIFO full", port); continue; } DPRINTK(KERN_DEBUG "*** ecp_read_block_pio: reading one byte from the FIFO\n"); DPRINTK(KERN_DEBUG "*** ecp_read_block_pio: reading one byte from the FIFO\n"); /* FIFO not filled. We will cycle this loop for a while * and either the peripheral will fill it faster, Loading Loading @@ -1216,10 +1217,23 @@ static const struct parport_operations parport_pc_ops = { }; #ifdef CONFIG_PARPORT_PC_SUPERIO static struct superio_struct *find_free_superio(void) { int i; for (i = 0; i < NR_SUPERIOS; i++) if (superios[i].io == 0) return &superios[i]; return NULL; } /* Super-IO chipset detection, Winbond, SMSC */ static void __devinit show_parconfig_smsc37c669(int io, int key) { int cr1, cr4, cra, cr23, cr26, cr27, i = 0; int cr1, cr4, cra, cr23, cr26, cr27; struct superio_struct *s; static const char *const modes[] = { "SPP and Bidirectional (PS/2)", "EPP and SPP", Loading Loading @@ -1272,30 +1286,29 @@ static void __devinit show_parconfig_smsc37c669(int io, int key) are related, however DMA can be 1 or 3, assume DMA_A=DMA1, DMA_C=DMA3 (this is true e.g. for TYAN 1564D Tomcat IV) */ if (cr23 * 4 >= 0x100) { /* if active */ while ((i < NR_SUPERIOS) && (superios[i].io != 0)) i++; if (i == NR_SUPERIOS) { s = find_free_superio(); if (s == NULL) printk(KERN_INFO "Super-IO: too many chips!\n"); } else { else { int d; switch (cr23 * 4) { case 0x3bc: superios[i].io = 0x3bc; superios[i].irq = 7; s->io = 0x3bc; s->irq = 7; break; case 0x378: superios[i].io = 0x378; superios[i].irq = 7; s->io = 0x378; s->irq = 7; break; case 0x278: superios[i].io = 0x278; superios[i].irq = 5; s->io = 0x278; s->irq = 5; } d = (cr26 & 0x0f); if (d == 1 || d == 3) superios[i].dma = d; s->dma = d; else superios[i].dma = PARPORT_DMA_NONE; s->dma = PARPORT_DMA_NONE; } } } Loading @@ -1303,7 +1316,8 @@ static void __devinit show_parconfig_smsc37c669(int io, int key) static void __devinit show_parconfig_winbond(int io, int key) { int cr30, cr60, cr61, cr70, cr74, crf0, i = 0; int cr30, cr60, cr61, cr70, cr74, crf0; struct superio_struct *s; static const char *const modes[] = { "Standard (SPP) and Bidirectional(PS/2)", /* 0 */ "EPP-1.9 and SPP", Loading Loading @@ -1356,14 +1370,13 @@ static void __devinit show_parconfig_winbond(int io, int key) } if (cr30 & 0x01) { /* the settings can be interrogated later ... */ while ((i < NR_SUPERIOS) && (superios[i].io != 0)) i++; if (i == NR_SUPERIOS) { s = find_free_superio(); if (s == NULL) printk(KERN_INFO "Super-IO: too many chips!\n"); } else { superios[i].io = (cr60<<8)|cr61; superios[i].irq = cr70&0x0f; superios[i].dma = (((cr74 & 0x07) > 3) ? else { s->io = (cr60 << 8) | cr61; s->irq = cr70 & 0x0f; s->dma = (((cr74 & 0x07) > 3) ? PARPORT_DMA_NONE : (cr74 & 0x07)); } } Loading Loading @@ -1618,25 +1631,28 @@ static void __devinit detect_and_report_it87(void) } #endif /* CONFIG_PARPORT_PC_SUPERIO */ static int get_superio_dma(struct parport *p) static struct superio_struct *find_superio(struct parport *p) { int i = 0; int i; for (i = 0; i < NR_SUPERIOS; i++) if (superios[i].io != p->base) return &superios[i]; return NULL; } while ((i < NR_SUPERIOS) && (superios[i].io != p->base)) i++; if (i != NR_SUPERIOS) return superios[i].dma; static int get_superio_dma(struct parport *p) { struct superio_struct *s = find_superio(p); if (s) return s->dma; return PARPORT_DMA_NONE; } static int get_superio_irq(struct parport *p) { int i = 0; while ((i < NR_SUPERIOS) && (superios[i].io != p->base)) i++; if (i != NR_SUPERIOS) return superios[i].irq; struct superio_struct *s = find_superio(p); if (s) return s->irq; return PARPORT_IRQ_NONE; } Loading