vserver 2.0 rc7
[linux-2.6.git] / sound / oss / trident.c
index 8395501..47537f0 100644 (file)
@@ -441,7 +441,7 @@ struct trident_card {
        struct timer_list timer;
 
        /* Game port support */
-       struct gameport gameport;
+       struct gameport *gameport;
 };
 
 enum dmabuf_mode {
@@ -487,7 +487,7 @@ static struct trident_channel *ali_alloc_rec_pcm_channel(struct trident_card *ca
 static struct trident_channel *ali_alloc_pcm_channel(struct trident_card *card);
 static void ali_restore_regs(struct trident_card *card);
 static void ali_save_regs(struct trident_card *card);
-static int trident_suspend(struct pci_dev *dev, u32 unused);
+static int trident_suspend(struct pci_dev *dev, pm_message_t unused);
 static int trident_resume(struct pci_dev *dev);
 static void ali_free_pcm_channel(struct trident_card *card, unsigned int channel);
 static int ali_setup_multi_channels(struct trident_card *card, int chan_nums);
@@ -3723,7 +3723,7 @@ ali_restore_regs(struct trident_card *card)
 }
 
 static int
-trident_suspend(struct pci_dev *dev, u32 unused)
+trident_suspend(struct pci_dev *dev, pm_message_t unused)
 {
        struct trident_card *card = pci_get_drvdata(dev);
 
@@ -4257,21 +4257,21 @@ trident_ac97_init(struct trident_card *card)
 static unsigned char
 trident_game_read(struct gameport *gameport)
 {
-       struct trident_card *card = gameport->driver;
+       struct trident_card *card = gameport->port_data;
        return inb(TRID_REG(card, T4D_GAME_LEG));
 }
 
 static void
 trident_game_trigger(struct gameport *gameport)
 {
-       struct trident_card *card = gameport->driver;
+       struct trident_card *card = gameport->port_data;
        outb(0xff, TRID_REG(card, T4D_GAME_LEG));
 }
 
 static int
 trident_game_cooked_read(struct gameport *gameport, int *axes, int *buttons)
 {
-       struct trident_card *card = gameport->driver;
+       struct trident_card *card = gameport->port_data;
        int i;
 
        *buttons = (~inb(TRID_REG(card, T4D_GAME_LEG)) >> 4) & 0xf;
@@ -4288,7 +4288,7 @@ trident_game_cooked_read(struct gameport *gameport, int *axes, int *buttons)
 static int
 trident_game_open(struct gameport *gameport, int mode)
 {
-       struct trident_card *card = gameport->driver;
+       struct trident_card *card = gameport->port_data;
 
        switch (mode) {
        case GAMEPORT_MODE_COOKED:
@@ -4305,6 +4305,31 @@ trident_game_open(struct gameport *gameport, int mode)
        return 0;
 }
 
+static int __devinit
+trident_register_gameport(struct trident_card *card)
+{
+       struct gameport *gp;
+
+       card->gameport = gp = gameport_allocate_port();
+       if (!gp) {
+               printk(KERN_ERR "trident: can not allocate memory for gameport\n");
+               return -ENOMEM;
+       }
+
+       gameport_set_name(gp, "Trident 4DWave");
+       gameport_set_phys(gp, "pci%s/gameport0", pci_name(card->pci_dev));
+       gp->read = trident_game_read;
+       gp->trigger = trident_game_trigger;
+       gp->cooked_read = trident_game_cooked_read;
+       gp->open = trident_game_open;
+       gp->fuzz = 64;
+       gp->port_data = card;
+
+       gameport_register_port(gp);
+
+       return 0;
+}
+
 /* install the driver, we do not allocate hardware channel nor DMA buffer */ 
 /* now, they are defered until "ACCESS" time (in prog_dmabuf called by */ 
 /* open/read/write/ioctl/mmap) */
@@ -4368,13 +4393,6 @@ trident_probe(struct pci_dev *pci_dev, const struct pci_device_id *pci_id)
        card->banks[BANK_B].addresses = &bank_b_addrs;
        card->banks[BANK_B].bitmap = 0UL;
 
-       card->gameport.driver = card;
-       card->gameport.fuzz = 64;
-       card->gameport.read = trident_game_read;
-       card->gameport.trigger = trident_game_trigger;
-       card->gameport.cooked_read = trident_game_cooked_read;
-       card->gameport.open = trident_game_open;
-
        init_MUTEX(&card->open_sem);
        spin_lock_init(&card->lock);
        init_timer(&card->timer);
@@ -4508,7 +4526,7 @@ trident_probe(struct pci_dev *pci_dev, const struct pci_device_id *pci_id)
        trident_enable_loop_interrupts(card);
 
        /* Register gameport */
-       gameport_register_port(&card->gameport);
+       trident_register_gameport(card);
 
 out:
        return rc;
@@ -4551,7 +4569,8 @@ trident_remove(struct pci_dev *pci_dev)
        }
 
        /* Unregister gameport */
-       gameport_unregister_port(&card->gameport);
+       if (card->gameport)
+               gameport_unregister_port(card->gameport);
 
        /* Kill interrupts, and SP/DIF */
        trident_disable_loop_interrupts(card);