#include #include #include #include #include #include #include #include "mantis_common.h" #include "mantis_dma.h" #include "mantis_i2c.h" #include "mantis_eeprom.h" #include #include #include #include unsigned int verbose = 1; module_param(verbose, int, 0644); MODULE_PARM_DESC(verbose, "verbose startup messages, default is 1 (yes)"); #define PCI_VENDOR_ID_MANTIS 0x1822 #define PCI_DEVICE_ID_MANTIS_R11 0x4e35 #define DRIVER_NAME "Mantis" static struct pci_device_id mantis_pci_table[] = { { PCI_DEVICE(PCI_VENDOR_ID_MANTIS, PCI_DEVICE_ID_MANTIS_R11) }, { 0 }, }; MODULE_DEVICE_TABLE(pci, mantis_pci_table); static irqreturn_t mantis_pci_irq(int irq, void *dev_id, struct pt_regs *regs) { struct mantis_pci *mantis; dprintk(verbose, MANTIS_DEBUG, 1, "Mantis PCI IRQ"); mantis = (struct mantis_pci *) dev_id; if (mantis == NULL) dprintk(verbose, MANTIS_DEBUG, 1, "Aeio, mantis ISR"); return IRQ_NONE; // temporarily } static int mantis_i2c_setup(struct mantis_pci *mantis) { u32 config; // mmwrite(0x80, MANTIS_DMA_CTL); // MCU i2c read config = mmread(MANTIS_DMA_CTL); dprintk(verbose, MANTIS_DEBUG, 1, "Mantis Ctl reg=0x%04x", config); return 0; } static int mantis_reg_dump(struct mantis_pci *mantis) { u32 ctlreg, intstat, intmask, i2cdata; ctlreg = mmread(MANTIS_DMA_CTL); intstat = mmread(MANTIS_INT_STAT); intmask = mmread(MANTIS_INT_MASK); i2cdata = mmread(MANTIS_I2C_DATA); dprintk(verbose, MANTIS_DEBUG, 1, "CTL_REG=0x%04x, INT_STAT=0x%04x, \ INT_MASK=0x%04x, I2C_DATA=0x%04x", ctlreg, intstat, \ intmask, i2cdata); return 0; } static int __devinit mantis_pci_probe(struct pci_dev *pdev, const struct pci_device_id *mantis_pci_table) { u8 revision, latency; struct mantis_pci *mantis; mantis = (struct mantis_pci *) kmalloc(sizeof (struct mantis_pci), GFP_KERNEL); if (mantis == NULL) { dprintk(verbose, MANTIS_ERROR, 1, "Out of memory"); return -ENOMEM; } dprintk(verbose, MANTIS_ERROR, 1, "Got a device"); if (request_irq(pdev->irq, mantis_pci_irq, SA_SHIRQ | SA_INTERRUPT, DRIVER_NAME, mantis) < 0) { dprintk(verbose, MANTIS_ERROR, 1, "Mantis IRQ reg failed"); goto err; } dprintk(verbose, MANTIS_DEBUG, 1, "We got an IRQ"); return 0; err: dprintk(verbose, MANTIS_DEBUG, 1, ""); kfree(mantis); return -ENODEV; } static void __devexit mantis_pci_remove(struct pci_dev *pdev) { free_irq(pdev->irq, pdev); } static struct pci_driver mantis_pci_driver = { .name = "Mantis PCI combo driver", .id_table = mantis_pci_table, .probe = mantis_pci_probe, .remove = mantis_pci_remove, }; static int __devinit mantis_pci_init(void) { return pci_register_driver(&mantis_pci_driver); } static void __devexit mantis_pci_exit(void) { pci_unregister_driver(&mantis_pci_driver); } module_init(mantis_pci_init); module_exit(mantis_pci_exit); MODULE_DESCRIPTION("Mantis PCI DTV bridge driver"); MODULE_AUTHOR("Manu Abraham"); MODULE_LICENSE("GPL");