/***************************************************************** * * Function Name: hc_found_hci * * This function request IO memory regions, request IRQ, and * allocate all other resources. * * Input: addr = first IO address * addr2 = second IO address * irq = interrupt number * * Return: 0 = success or error condition * *****************************************************************/ static int __devinit hc_found_hci (int addr, int addr2, int irq) { hci_t *hci; hcipriv_t *hp; DBGFUNC ("Enter hc_found_hci\n"); hci = hc_alloc_hci (); if (!hci) { return -ENOMEM; } init_irq (); hp = &hci->hp; if (!request_region (addr, 256, "SL811 USB HOST")) { DBGERR ("request address %d failed", addr); hc_release_hci (hci); return -EBUSY; } hp->hcport = addr; if (!hp->hcport) { DBGERR ("Error mapping SL811 Memory 0x%x", hp->hcport); } if (!request_region (addr2, 256, "SL811 USB HOST")) { DBGERR ("request address %d failed", addr2); hc_release_hci (hci); return -EBUSY; } hp->hcport2 = addr2; if (!hp->hcport2) { DBGERR ("Error mapping SL811 Memory 0x%x", hp->hcport2); } if (hc_alloc_trans_buffer (hci)) { hc_release_hci (hci); return -ENOMEM; } usb_register_bus (hci->bus); if (request_irq (irq, hc_interrupt, 0, "SL811", hci) != 0) { DBGERR ("request interrupt %d failed", irq); hc_release_hci (hci); return -EBUSY; } hp->irq = irq; printk (KERN_INFO __FILE__ ": USB SL811 at %x, addr2 = %x, IRQ %d\n", addr, addr2, irq); hc_reset (hci); if (hc_start (hci) < 0) { DBGERR ("can't start usb-%x", addr); hc_release_hci (hci); return -EBUSY; } return 0; }
/***************************************************************** * * Function Name: hci_hcd_cleanup * * This is a cleanup function, and it is called when module is * unloaded. * * Input: none * * Return: none * *****************************************************************/ static void __exit hci_hcd_cleanup (void) { struct list_head *hci_l; hci_t *hci; DBGFUNC ("Enter hci_hcd_cleanup\n"); for (hci_l = hci_hcd_list.next; hci_l != &hci_hcd_list;) { hci = list_entry (hci_l, hci_t, hci_hcd_list); hci_l = hci_l->next; hc_release_hci (hci); } }
static int hc_isp_suspend(struct device * dev, u32 state, u32 level) { switch(level) { case SUSPEND_POWER_DOWN: WRITE_REG16 (pm_hci, 0, HcDMAConfiguration); WRITE_REG16 (pm_hci, 0, HcuPInterruptEnable); WRITE_REG16(pm_hci, READ_REG16(pm_hci, HcHardwareConfiguration) & ~InterruptPinEnable, HcHardwareConfiguration); hc_release_hci(pm_hci); break; } return 0; }