diff -ru linux-2.4.17.ori/drivers/sound/es1371.c linux-2.4.17/drivers/sound/es1371.c --- linux-2.4.17.ori/drivers/sound/es1371.c Sun Sep 30 16:26:08 2001 +++ linux-2.4.17/drivers/sound/es1371.c Wed Jan 9 20:53:58 2002 @@ -110,6 +110,8 @@ * 31.01.2001 0.30 Register/Unregister gameport * Fix SETTRIGGER non OSS API conformity * 14.07.2001 0.31 Add list of laptops needing amplifier control + * 08.01.2002 0.32 Add /proc/driver/es1371/{card}/ac97 entry + * Salvador E. Tropea */ /*****************************************************************************/ @@ -2794,6 +2796,9 @@ }; +static char driver_str[] = "driver/es1371"; +static char ac97_str[] = "/ac97"; + static int __devinit es1371_probe(struct pci_dev *pcidev, const struct pci_device_id *pciid) { struct es1371_state *s; @@ -2803,6 +2808,8 @@ unsigned long tmo; signed long tmo2; unsigned int cssr; + char *proc_str; + int proc_success = 0; if ((res=pci_enable_device(pcidev))) return res; @@ -2961,6 +2968,22 @@ val = initvol[i].vol; mixdev_ioctl(&s->codec, initvol[i].mixch, (unsigned long)&val); } + + /* create a proc entry to inform about the codec facilities */ + proc_str = (char *)vmalloc(sizeof(driver_str) + sizeof(ac97_str) + + strlen(s->dev->slot_name)); + if (proc_mkdir(driver_str, 0)) { + sprintf(proc_str, "%s/%s", driver_str, s->dev->slot_name); + if (proc_mkdir(proc_str, 0)) { + strcat(proc_str, ac97_str); + if (create_proc_read_entry(proc_str, 0, 0, ac97_read_proc, &s->codec)) + proc_success = 1; + } + } + vfree(proc_str); + if (!proc_success) + printk(KERN_WARNING PFX "cannot create /proc entry\n"); + /* mute master and PCM when in S/PDIF mode */ if (s->spdif_volume != -1) { val = 0x0000; @@ -3003,6 +3026,7 @@ static void __devinit es1371_remove(struct pci_dev *dev) { struct es1371_state *s = pci_get_drvdata(dev); + char *proc_str; if (!s) return; @@ -3011,6 +3035,17 @@ if (s->ps) remove_proc_entry("es1371", NULL); #endif /* ES1371_DEBUG */ + + /* remove the proc entry */ + proc_str = (char *)vmalloc(sizeof(driver_str) + sizeof(ac97_str) + + strlen(s->dev->slot_name)); + sprintf(proc_str, "%s/%s%s", driver_str, s->dev->slot_name, ac97_str); + remove_proc_entry(proc_str, NULL); + sprintf(proc_str, "%s/%s", driver_str, s->dev->slot_name); + remove_proc_entry(proc_str, NULL); + remove_proc_entry(driver_str, NULL); + vfree(proc_str); + outl(0, s->io+ES1371_REG_CONTROL); /* switch everything off */ outl(0, s->io+ES1371_REG_SERIAL_CONTROL); /* clear serial interrupts */ synchronize_irq();