diff options
Diffstat (limited to 'drivers/pcmcia/i82092.c')
| -rw-r--r-- | drivers/pcmcia/i82092.c | 72 |
1 files changed, 25 insertions, 47 deletions
diff --git a/drivers/pcmcia/i82092.c b/drivers/pcmcia/i82092.c index 7979c85df3d..7d47456429a 100644 --- a/drivers/pcmcia/i82092.c +++ b/drivers/pcmcia/i82092.c @@ -5,12 +5,9 @@ * * Author: Arjan Van De Ven <arjanv@redhat.com> * Loosly based on i82365.c from the pcmcia-cs package - * - * $Id: i82092aa.c,v 1.2 2001/10/23 14:43:34 arjanv Exp $ */ #include <linux/kernel.h> -#include <linux/config.h> #include <linux/module.h> #include <linux/pci.h> #include <linux/init.h> @@ -18,11 +15,8 @@ #include <linux/interrupt.h> #include <linux/device.h> -#include <pcmcia/cs_types.h> #include <pcmcia/ss.h> -#include <pcmcia/cs.h> -#include <asm/system.h> #include <asm/io.h> #include "i82092aa.h" @@ -31,34 +25,17 @@ MODULE_LICENSE("GPL"); /* PCI core routines */ -static struct pci_device_id i82092aa_pci_ids[] = { - { - .vendor = PCI_VENDOR_ID_INTEL, - .device = PCI_DEVICE_ID_INTEL_82092AA_0, - .subvendor = PCI_ANY_ID, - .subdevice = PCI_ANY_ID, - }, - {} +static DEFINE_PCI_DEVICE_TABLE(i82092aa_pci_ids) = { + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82092AA_0) }, + { } }; MODULE_DEVICE_TABLE(pci, i82092aa_pci_ids); -static int i82092aa_socket_suspend (struct pci_dev *dev, pm_message_t state) -{ - return pcmcia_socket_dev_suspend(&dev->dev, state); -} - -static int i82092aa_socket_resume (struct pci_dev *dev) -{ - return pcmcia_socket_dev_resume(&dev->dev); -} - -static struct pci_driver i82092aa_pci_drv = { +static struct pci_driver i82092aa_pci_driver = { .name = "i82092aa", .id_table = i82092aa_pci_ids, .probe = i82092aa_pci_probe, - .remove = __devexit_p(i82092aa_pci_remove), - .suspend = i82092aa_socket_suspend, - .resume = i82092aa_socket_resume, + .remove = i82092aa_pci_remove, }; @@ -71,7 +48,7 @@ static struct pccard_operations i82092aa_operations = { .set_mem_map = i82092aa_set_mem_map, }; -/* The card can do upto 4 sockets, allocate a structure for each of them */ +/* The card can do up to 4 sockets, allocate a structure for each of them */ struct socket_info { int number; @@ -79,7 +56,7 @@ struct socket_info { 1 = empty socket, 2 = card but not initialized, 3 = operational card */ - kio_addr_t io_base; /* base io address of the socket */ + unsigned int io_base; /* base io address of the socket */ struct pcmcia_socket socket; struct pci_dev *dev; /* The PCI device for the socket */ @@ -90,7 +67,7 @@ static struct socket_info sockets[MAX_SOCKETS]; static int socket_count; /* shortcut */ -static int __devinit i82092aa_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) +static int i82092aa_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) { unsigned char configbyte; int i, ret; @@ -132,6 +109,7 @@ static int __devinit i82092aa_pci_probe(struct pci_dev *dev, const struct pci_de sockets[i].socket.map_size = 0x1000; sockets[i].socket.irq_mask = 0; sockets[i].socket.pci_irq = dev->irq; + sockets[i].socket.cb_dev = dev; sockets[i].socket.owner = THIS_MODULE; sockets[i].number = i; @@ -150,15 +128,13 @@ static int __devinit i82092aa_pci_probe(struct pci_dev *dev, const struct pci_de /* Register the interrupt handler */ dprintk(KERN_DEBUG "Requesting interrupt %i \n",dev->irq); - if ((ret = request_irq(dev->irq, i82092aa_interrupt, SA_SHIRQ, "i82092aa", i82092aa_interrupt))) { + if ((ret = request_irq(dev->irq, i82092aa_interrupt, IRQF_SHARED, "i82092aa", i82092aa_interrupt))) { printk(KERN_ERR "i82092aa: Failed to register IRQ %d, aborting\n", dev->irq); goto err_out_free_res; } - pci_set_drvdata(dev, &sockets[i].socket); - for (i = 0; i<socket_count; i++) { - sockets[i].socket.dev.dev = &dev->dev; + sockets[i].socket.dev.parent = &dev->dev; sockets[i].socket.ops = &i82092aa_operations; sockets[i].socket.resource_ops = &pccard_nonstatic_ops; ret = pcmcia_register_socket(&sockets[i].socket); @@ -184,16 +160,16 @@ err_out_disable: return ret; } -static void __devexit i82092aa_pci_remove(struct pci_dev *dev) +static void i82092aa_pci_remove(struct pci_dev *dev) { - struct pcmcia_socket *socket = pci_get_drvdata(dev); + int i; enter("i82092aa_pci_remove"); free_irq(dev->irq, i82092aa_interrupt); - if (socket) - pcmcia_unregister_socket(socket); + for (i = 0; i < socket_count; i++) + pcmcia_unregister_socket(&sockets[i].socket); leave("i82092aa_pci_remove"); } @@ -316,7 +292,7 @@ static int to_cycles(int ns) /* Interrupt handler functionality */ -static irqreturn_t i82092aa_interrupt(int irq, void *dev, struct pt_regs *regs) +static irqreturn_t i82092aa_interrupt(int irq, void *dev) { int i; int loopcount = 0; @@ -632,7 +608,7 @@ static int i82092aa_set_mem_map(struct pcmcia_socket *socket, struct pccard_mem_ enter("i82092aa_set_mem_map"); - pcibios_resource_to_bus(sock_info->dev, ®ion, mem->res); + pcibios_resource_to_bus(sock_info->dev->bus, ®ion, mem->res); map = mem->map; if (map > 4) { @@ -644,7 +620,12 @@ static int i82092aa_set_mem_map(struct pcmcia_socket *socket, struct pccard_mem_ if ( (mem->card_start > 0x3ffffff) || (region.start > region.end) || (mem->speed > 1000) ) { leave("i82092aa_set_mem_map: invalid address / speed"); - printk("invalid mem map for socket %i : %lx to %lx with a start of %x \n",sock,region.start, region.end, mem->card_start); + printk("invalid mem map for socket %i: %llx to %llx with a " + "start of %x\n", + sock, + (unsigned long long)region.start, + (unsigned long long)region.end, + mem->card_start); return -EINVAL; } @@ -706,16 +687,13 @@ static int i82092aa_set_mem_map(struct pcmcia_socket *socket, struct pccard_mem_ static int i82092aa_module_init(void) { - enter("i82092aa_module_init"); - pci_register_driver(&i82092aa_pci_drv); - leave("i82092aa_module_init"); - return 0; + return pci_register_driver(&i82092aa_pci_driver); } static void i82092aa_module_exit(void) { enter("i82092aa_module_exit"); - pci_unregister_driver(&i82092aa_pci_drv); + pci_unregister_driver(&i82092aa_pci_driver); if (sockets[0].io_base>0) release_region(sockets[0].io_base, 2); leave("i82092aa_module_exit"); |
