/* Driver for FlashMedia controller in these Texas Instruments chips: * PCI6411 * PCI6421 * PCI6611 * PCI6621 * PCI7411 * PCI7421 * PCI7611 * PCI7621 * * Copyright 2005 Ian E. Morgan * */ #include #include #include #include #include #include #define TIFM21_VERSION "0.01" /* 2005/10/31 */ #define PCI_DEVICE_ID_TI_XX21_XX11_FM 0x8033 unsigned long resource0 = 0; unsigned long resource0_length = 0; static struct pci_device_id ids[] = { { PCI_DEVICE(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_XX21_XX11_FM), }, { 0, } }; MODULE_DEVICE_TABLE(pci, ids); static irqreturn_t tifm21_interrupt(int irq, void *dev_instance, struct pt_regs *regs) { /* do nothing */ return IRQ_HANDLED; } static unsigned char skel_get_revision(struct pci_dev *dev) { u8 revision; pci_read_config_byte(dev, PCI_REVISION_ID, &revision); return revision; } static int probe(struct pci_dev *dev, const struct pci_device_id *id) { int retval; /* Possible critera for NOT attaching to this device */ if (skel_get_revision(dev) == 0x42) return -ENODEV; /* discovered the hard way.. this _must_ be done before request_irq()! */ pci_enable_device(dev); /* Request IO regions */ retval = pci_request_regions(dev, "tifm21"); if (retval) { printk(KERN_INFO "tifm21: failed to get memory regions\n"); pci_disable_device(dev); return -ENODEV; } resource0 = pci_resource_start(dev, 0); resource0_length = pci_resource_len(dev, 0); /* Now setup the interrupt handler */ retval = request_irq(dev->irq, tifm21_interrupt, SA_SHIRQ, "tifm21", dev); if (retval) { printk(KERN_INFO "tifm21: failed to get irq\n"); pci_release_regions(dev); pci_disable_device(dev); return -EBUSY; } else { /* Tell the device to enable interrupts! */ /* outb() something something */ } return 0; } static void remove(struct pci_dev *dev) { /* Tell the device to disable interrupts here! */ /* outb() something somthing */ free_irq(dev->irq, dev); /* clean up any allocated resources and stuff here. * like call release_region(); */ pci_release_regions(dev); pci_disable_device(dev); } static struct pci_driver pci_driver = { .name = "tifm21", .id_table = ids, .probe = probe, .remove = remove, }; static int __init pci_skel_init(void) { return pci_register_driver(&pci_driver); } static void __exit pci_skel_exit(void) { pci_unregister_driver(&pci_driver); } MODULE_LICENSE("GPL"); MODULE_AUTHOR("Ian E. Morgan"); MODULE_VERSION(TIFM21_VERSION); module_init(pci_skel_init); module_exit(pci_skel_exit);