Re: [PATCH] drivers/sound/nm256_audio.c

2001-04-19 Thread Marcus Meissner

On Thu, Apr 19, 2001 at 11:56:01AM -0400, Jeff Garzik wrote:
> Marcus Meissner wrote:
> > 
> > Hi,
> > 
> > This updates the nm256_audio driver to the 2.4 PCI API.
> > 
> > Patch is against 2.4.3-ac9, verified on Sony VAIO Laptop.
> 
> "verified" is the really important part with this driver, since its
> really finicky.  I have a patch I would love to bounce to you in
> private, that I have been searching for a tester for -months- because I
> had no test hardware of my own.

Feel free to send (I have a NM256AV card in that VAIO).

> Your patch looks ok to me and I would say apply it.  But I also think it
> is incomplete.
> 
> * there is no need for a linked list of cards, since
> pci_{get,set}_drvdata is used.  This eliminates the list walk in
> nm256_remove

The problem is with device opens, which just pass numbers, most other
sound drivers still use linked lists.

Hmm, but via8_audio.c doesn't, I will take this as example.

> * the new PCI API has suspend/resume hooks, and those should be used in
> preference to register_pm_...

Ok, will have another look at the other issues.

And I hope my colleague brings his VAIO to work tomorrow ;)

Ciao, Marcus
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/



Re: [PATCH] drivers/sound/nm256_audio.c

2001-04-19 Thread Jeff Garzik

Marcus Meissner wrote:
> 
> Hi,
> 
> This updates the nm256_audio driver to the 2.4 PCI API.
> 
> Patch is against 2.4.3-ac9, verified on Sony VAIO Laptop.

"verified" is the really important part with this driver, since its
really finicky.  I have a patch I would love to bounce to you in
private, that I have been searching for a tester for -months- because I
had no test hardware of my own.

Your patch looks ok to me and I would say apply it.  But I also think it
is incomplete.

* there is no need for a linked list of cards, since
pci_{get,set}_drvdata is used.  This eliminates the list walk in
nm256_remove

* the new PCI API has suspend/resume hooks, and those should be used in
preference to register_pm_...

* there is rarely a need to compare PCI ids manually in a driver.  Do
this implicitly by using the struct pci_device_id::driver_data field. 
In the following code, you could simply pass these two strings as your
driver_data:
> +if (pcidev->device == PCI_DEVICE_ID_NEOMAGIC_NM256AV_AUDIO)
> +   return nm256_install(pcidev, REV_NM256AV, "256AV");
> +if (pcidev->device == PCI_DEVICE_ID_NEOMAGIC_NM256ZX_AUDIO)
> +   return nm256_install(pcidev, REV_NM256ZX, "256ZX");

* typically you don't want to -always- printout the module version when
built into the kernel.  that can get ugly, when you have a bunch of
drivers in the kernel.  you should surround the existing version printk
code with ifdef MODULE, and then add some additional code in your
pci_driver::probe routine which looks something like

#ifndef MODULE
static int printed_version;
if (!printed_version++)
printk(version);
#endif

and further, declare your version string like the following code, so it
can be dropped from the kernel image...

static char version[] __devinitdata =
KERN_INFO "... version ...\n";

Looks good, thanks for the work!  If you spot any other drivers you can
convert, feel free.

Jeff


-- 
Jeff Garzik   | "The universe is like a safe to which there is a
Building 1024 |  combination -- but the combination is locked up
MandrakeSoft  |  in the safe."-- Peter DeVries
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/



[PATCH] drivers/sound/nm256_audio.c

2001-04-19 Thread Marcus Meissner

Hi,

This updates the nm256_audio driver to the 2.4 PCI API.

Patch is against 2.4.3-ac9, verified on Sony VAIO Laptop.

Ciao, Marcus

Index: drivers/sound/nm256_audio.c
===
RCS file: /build/mm/work/repository/linux-mm/drivers/sound/nm256_audio.c,v
retrieving revision 1.1
diff -u -r1.1 nm256_audio.c
--- drivers/sound/nm256_audio.c 2001/04/17 14:50:30 1.1
+++ drivers/sound/nm256_audio.c 2001/04/19 15:28:43
@@ -15,6 +16,8 @@
  * Changes:
  * 11-10-2000  Bartlomiej Zolnierkiewicz <[EMAIL PROTECTED]>
  * Added some __init
+ * 19-04-2001  Marcus Meissner <[EMAIL PROTECTED]>
+ * Ported to 2.4 PCI API.
  */
 
 #define __NO_VERSION__
@@ -49,8 +52,6 @@
 #define PCI_DEVICE_ID_NEOMAGIC_NM256AV_AUDIO 0x8005
 #define PCI_DEVICE_ID_NEOMAGIC_NM256ZX_AUDIO 0x8006
 
-#define RSRCADDRESS(dev,num) ((dev)->resource[(num)].start)
-
 /* List of cards.  */
 static struct nm256_info *nmcard_list;
 
@@ -1042,6 +1043,9 @@
 struct pm_dev *pmdev;
 int x;
 
+if (pci_enable_device(pcidev))
+   return 0;
+
 card = kmalloc (sizeof (struct nm256_info), GFP_KERNEL);
 if (card == NULL) {
printk (KERN_ERR "NM256: out of memory!\n");
@@ -1055,7 +1059,7 @@
 
 /* Init the memory port info.  */
 for (x = 0; x < 2; x++) {
-   card->port[x].physaddr = RSRCADDRESS (pcidev, x);
+   card->port[x].physaddr = pci_resource_start (pcidev, x);
card->port[x].ptr = NULL;
card->port[x].start_offset = 0;
card->port[x].end_offset = 0;
@@ -1201,6 +1205,8 @@
}
 }
 
+pci_set_drvdata(pcidev,card);
+
 /* Insert the card in the list.  */
 card->next_card = nmcard_list;
 nmcard_list = card;
@@ -1251,37 +1257,38 @@
 return 0;
 }
 
-/*
- * This loop walks the PCI configuration database and finds where
- * the sound cards are.
- */
- 
-int __init
-init_nm256(void)
+static int __devinit
+nm256_probe(struct pci_dev *pcidev,const struct pci_device_id *pciid)
 {
-struct pci_dev *pcidev = NULL;
-int count = 0;
-
-if(! pci_present())
-   return -ENODEV;
-
-while((pcidev = pci_find_device(PCI_VENDOR_ID_NEOMAGIC,
-   PCI_DEVICE_ID_NEOMAGIC_NM256AV_AUDIO,
-   pcidev)) != NULL) {
-   count += nm256_install(pcidev, REV_NM256AV, "256AV");
-}
-
-while((pcidev = pci_find_device(PCI_VENDOR_ID_NEOMAGIC,
-   PCI_DEVICE_ID_NEOMAGIC_NM256ZX_AUDIO,
-   pcidev)) != NULL) {
-   count += nm256_install(pcidev, REV_NM256ZX, "256ZX");
+if (pcidev->device == PCI_DEVICE_ID_NEOMAGIC_NM256AV_AUDIO)
+   return nm256_install(pcidev, REV_NM256AV, "256AV");
+if (pcidev->device == PCI_DEVICE_ID_NEOMAGIC_NM256ZX_AUDIO)
+   return nm256_install(pcidev, REV_NM256ZX, "256ZX");
+return -1; /* should not come here ... */
+}
+
+static void __devinit
+nm256_remove(struct pci_dev *pcidev) {
+struct nm256_info *xcard = pci_get_drvdata(pcidev);
+struct nm256_info *card,*next_card = NULL;
+
+for (card = nmcard_list; card != NULL; card = next_card) {
+   next_card = card->next_card;
+   if (card == xcard) {
+   stopPlay (card);
+   stopRecord (card);
+   if (card->has_irq)
+   free_irq (card->irq, card);
+   nm256_release_ports (card);
+   sound_unload_mixerdev (card->mixer_oss_dev);
+   sound_unload_audiodev (card->dev[0]);
+   sound_unload_audiodev (card->dev[1]);
+   kfree (card);
+   break;
+   }
 }
-
-if (count == 0)
-   return -ENODEV;
-
-printk (KERN_INFO "Done installing NM256 audio driver.\n");
-return 0;
+if (nmcard_list == card)
+   nmcard_list = next_card;
 }
 
 /*
@@ -1639,9 +1646,21 @@
 local_qlen:nm256_audio_local_qlen,
 };
 
-EXPORT_SYMBOL(init_nm256);
+static struct pci_device_id nm256_pci_tbl[] __devinitdata = {
+   {PCI_VENDOR_ID_NEOMAGIC, PCI_DEVICE_ID_NEOMAGIC_NM256AV_AUDIO,
+   PCI_ANY_ID, PCI_ANY_ID, 0, 0},
+   {PCI_VENDOR_ID_NEOMAGIC, PCI_DEVICE_ID_NEOMAGIC_NM256ZX_AUDIO,
+   PCI_ANY_ID, PCI_ANY_ID, 0, 0},
+   {0,}
+};
+MODULE_DEVICE_TABLE(pci, nm256_pci_tbl);
 
-static int loaded = 0;
+struct pci_driver nm256_pci_driver = {
+   name:"nm256_audio",
+   id_table:nm256_pci_tbl,
+   probe:nm256_probe,
+   remove:nm256_remove,
+};
 
 MODULE_PARM (usecache, "i");
 MODULE_PARM (buffertop, "i");
@@ -1650,37 +1669,13 @@
 
 static int __init do_init_nm256(void)
 {
-nmcard_list = NULL;
-printk (KERN_INFO "NeoMagic 256AV/256ZX audio driver, version 1.1\n");
-
-if (init_nm256 () == 0) {
-   loaded = 1;
-   return 0;
-}
-else
-   return -ENODEV;
+printk (KERN_INFO "NeoMagic 256AV/256ZX audio driver, version 1.1p\n");
+return pci_module_init(_pci_driver);
 }
 
 static void __exit cleanup_nm256 

[PATCH] drivers/sound/nm256_audio.c

2001-04-19 Thread Marcus Meissner

Hi,

This updates the nm256_audio driver to the 2.4 PCI API.

Patch is against 2.4.3-ac9, verified on Sony VAIO Laptop.

Ciao, Marcus

Index: drivers/sound/nm256_audio.c
===
RCS file: /build/mm/work/repository/linux-mm/drivers/sound/nm256_audio.c,v
retrieving revision 1.1
diff -u -r1.1 nm256_audio.c
--- drivers/sound/nm256_audio.c 2001/04/17 14:50:30 1.1
+++ drivers/sound/nm256_audio.c 2001/04/19 15:28:43
@@ -15,6 +16,8 @@
  * Changes:
  * 11-10-2000  Bartlomiej Zolnierkiewicz [EMAIL PROTECTED]
  * Added some __init
+ * 19-04-2001  Marcus Meissner [EMAIL PROTECTED]
+ * Ported to 2.4 PCI API.
  */
 
 #define __NO_VERSION__
@@ -49,8 +52,6 @@
 #define PCI_DEVICE_ID_NEOMAGIC_NM256AV_AUDIO 0x8005
 #define PCI_DEVICE_ID_NEOMAGIC_NM256ZX_AUDIO 0x8006
 
-#define RSRCADDRESS(dev,num) ((dev)-resource[(num)].start)
-
 /* List of cards.  */
 static struct nm256_info *nmcard_list;
 
@@ -1042,6 +1043,9 @@
 struct pm_dev *pmdev;
 int x;
 
+if (pci_enable_device(pcidev))
+   return 0;
+
 card = kmalloc (sizeof (struct nm256_info), GFP_KERNEL);
 if (card == NULL) {
printk (KERN_ERR "NM256: out of memory!\n");
@@ -1055,7 +1059,7 @@
 
 /* Init the memory port info.  */
 for (x = 0; x  2; x++) {
-   card-port[x].physaddr = RSRCADDRESS (pcidev, x);
+   card-port[x].physaddr = pci_resource_start (pcidev, x);
card-port[x].ptr = NULL;
card-port[x].start_offset = 0;
card-port[x].end_offset = 0;
@@ -1201,6 +1205,8 @@
}
 }
 
+pci_set_drvdata(pcidev,card);
+
 /* Insert the card in the list.  */
 card-next_card = nmcard_list;
 nmcard_list = card;
@@ -1251,37 +1257,38 @@
 return 0;
 }
 
-/*
- * This loop walks the PCI configuration database and finds where
- * the sound cards are.
- */
- 
-int __init
-init_nm256(void)
+static int __devinit
+nm256_probe(struct pci_dev *pcidev,const struct pci_device_id *pciid)
 {
-struct pci_dev *pcidev = NULL;
-int count = 0;
-
-if(! pci_present())
-   return -ENODEV;
-
-while((pcidev = pci_find_device(PCI_VENDOR_ID_NEOMAGIC,
-   PCI_DEVICE_ID_NEOMAGIC_NM256AV_AUDIO,
-   pcidev)) != NULL) {
-   count += nm256_install(pcidev, REV_NM256AV, "256AV");
-}
-
-while((pcidev = pci_find_device(PCI_VENDOR_ID_NEOMAGIC,
-   PCI_DEVICE_ID_NEOMAGIC_NM256ZX_AUDIO,
-   pcidev)) != NULL) {
-   count += nm256_install(pcidev, REV_NM256ZX, "256ZX");
+if (pcidev-device == PCI_DEVICE_ID_NEOMAGIC_NM256AV_AUDIO)
+   return nm256_install(pcidev, REV_NM256AV, "256AV");
+if (pcidev-device == PCI_DEVICE_ID_NEOMAGIC_NM256ZX_AUDIO)
+   return nm256_install(pcidev, REV_NM256ZX, "256ZX");
+return -1; /* should not come here ... */
+}
+
+static void __devinit
+nm256_remove(struct pci_dev *pcidev) {
+struct nm256_info *xcard = pci_get_drvdata(pcidev);
+struct nm256_info *card,*next_card = NULL;
+
+for (card = nmcard_list; card != NULL; card = next_card) {
+   next_card = card-next_card;
+   if (card == xcard) {
+   stopPlay (card);
+   stopRecord (card);
+   if (card-has_irq)
+   free_irq (card-irq, card);
+   nm256_release_ports (card);
+   sound_unload_mixerdev (card-mixer_oss_dev);
+   sound_unload_audiodev (card-dev[0]);
+   sound_unload_audiodev (card-dev[1]);
+   kfree (card);
+   break;
+   }
 }
-
-if (count == 0)
-   return -ENODEV;
-
-printk (KERN_INFO "Done installing NM256 audio driver.\n");
-return 0;
+if (nmcard_list == card)
+   nmcard_list = next_card;
 }
 
 /*
@@ -1639,9 +1646,21 @@
 local_qlen:nm256_audio_local_qlen,
 };
 
-EXPORT_SYMBOL(init_nm256);
+static struct pci_device_id nm256_pci_tbl[] __devinitdata = {
+   {PCI_VENDOR_ID_NEOMAGIC, PCI_DEVICE_ID_NEOMAGIC_NM256AV_AUDIO,
+   PCI_ANY_ID, PCI_ANY_ID, 0, 0},
+   {PCI_VENDOR_ID_NEOMAGIC, PCI_DEVICE_ID_NEOMAGIC_NM256ZX_AUDIO,
+   PCI_ANY_ID, PCI_ANY_ID, 0, 0},
+   {0,}
+};
+MODULE_DEVICE_TABLE(pci, nm256_pci_tbl);
 
-static int loaded = 0;
+struct pci_driver nm256_pci_driver = {
+   name:"nm256_audio",
+   id_table:nm256_pci_tbl,
+   probe:nm256_probe,
+   remove:nm256_remove,
+};
 
 MODULE_PARM (usecache, "i");
 MODULE_PARM (buffertop, "i");
@@ -1650,37 +1669,13 @@
 
 static int __init do_init_nm256(void)
 {
-nmcard_list = NULL;
-printk (KERN_INFO "NeoMagic 256AV/256ZX audio driver, version 1.1\n");
-
-if (init_nm256 () == 0) {
-   loaded = 1;
-   return 0;
-}
-else
-   return -ENODEV;
+printk (KERN_INFO "NeoMagic 256AV/256ZX audio driver, version 1.1p\n");
+return pci_module_init(nm256_pci_driver);
 }
 
 static void __exit cleanup_nm256 (void)
 {
-

Re: [PATCH] drivers/sound/nm256_audio.c

2001-04-19 Thread Jeff Garzik

Marcus Meissner wrote:
 
 Hi,
 
 This updates the nm256_audio driver to the 2.4 PCI API.
 
 Patch is against 2.4.3-ac9, verified on Sony VAIO Laptop.

"verified" is the really important part with this driver, since its
really finicky.  I have a patch I would love to bounce to you in
private, that I have been searching for a tester for -months- because I
had no test hardware of my own.

Your patch looks ok to me and I would say apply it.  But I also think it
is incomplete.

* there is no need for a linked list of cards, since
pci_{get,set}_drvdata is used.  This eliminates the list walk in
nm256_remove

* the new PCI API has suspend/resume hooks, and those should be used in
preference to register_pm_...

* there is rarely a need to compare PCI ids manually in a driver.  Do
this implicitly by using the struct pci_device_id::driver_data field. 
In the following code, you could simply pass these two strings as your
driver_data:
 +if (pcidev-device == PCI_DEVICE_ID_NEOMAGIC_NM256AV_AUDIO)
 +   return nm256_install(pcidev, REV_NM256AV, "256AV");
 +if (pcidev-device == PCI_DEVICE_ID_NEOMAGIC_NM256ZX_AUDIO)
 +   return nm256_install(pcidev, REV_NM256ZX, "256ZX");

* typically you don't want to -always- printout the module version when
built into the kernel.  that can get ugly, when you have a bunch of
drivers in the kernel.  you should surround the existing version printk
code with ifdef MODULE, and then add some additional code in your
pci_driver::probe routine which looks something like

#ifndef MODULE
static int printed_version;
if (!printed_version++)
printk(version);
#endif

and further, declare your version string like the following code, so it
can be dropped from the kernel image...

static char version[] __devinitdata =
KERN_INFO "... version ...\n";

Looks good, thanks for the work!  If you spot any other drivers you can
convert, feel free.

Jeff


-- 
Jeff Garzik   | "The universe is like a safe to which there is a
Building 1024 |  combination -- but the combination is locked up
MandrakeSoft  |  in the safe."-- Peter DeVries
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/



Re: [PATCH] drivers/sound/nm256_audio.c

2001-04-19 Thread Marcus Meissner

On Thu, Apr 19, 2001 at 11:56:01AM -0400, Jeff Garzik wrote:
 Marcus Meissner wrote:
  
  Hi,
  
  This updates the nm256_audio driver to the 2.4 PCI API.
  
  Patch is against 2.4.3-ac9, verified on Sony VAIO Laptop.
 
 "verified" is the really important part with this driver, since its
 really finicky.  I have a patch I would love to bounce to you in
 private, that I have been searching for a tester for -months- because I
 had no test hardware of my own.

Feel free to send (I have a NM256AV card in that VAIO).

 Your patch looks ok to me and I would say apply it.  But I also think it
 is incomplete.
 
 * there is no need for a linked list of cards, since
 pci_{get,set}_drvdata is used.  This eliminates the list walk in
 nm256_remove

The problem is with device opens, which just pass numbers, most other
sound drivers still use linked lists.

Hmm, but via8_audio.c doesn't, I will take this as example.

 * the new PCI API has suspend/resume hooks, and those should be used in
 preference to register_pm_...

Ok, will have another look at the other issues.

And I hope my colleague brings his VAIO to work tomorrow ;)

Ciao, Marcus
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/