/* Init HSIC AUX GPIO */ static int hsic_aux_gpio_init(void) { int retval = 0; dev_dbg(&pci_dev->dev, "%s---->\n", __func__); hsic.aux_gpio = USH_HSIC_AUX1_GPIO; if (gpio_is_valid(hsic.aux_gpio)) { retval = gpio_request(hsic.aux_gpio, "hsic_aux"); if (retval < 0) { dev_err(&pci_dev->dev, "Request GPIO %d with error %d\n", hsic.aux_gpio, retval); retval = -ENODEV; goto err1; } } else { retval = -ENODEV; goto err1; } pr_debug("%s----> Enable AUX irq\n", __func__); retval = hsic_aux_irq_init(); if (retval) { dev_err(&pci_dev->dev, "unable to request IRQ\n"); goto err2; } dev_dbg(&pci_dev->dev, "%s<----\n", __func__); return retval; err2: gpio_free(hsic.aux_gpio); err1: return retval; }
/* Init HSIC AUX GPIO */ static int hsic_aux_gpio_init(int pin) { int retval = 0; dev_dbg(&pci_dev->dev, "%s----> %d\n", __func__, pin); if (gpio_is_valid(pin)) { retval = gpio_request(pin, "hsic_aux"); if (retval < 0) { dev_err(&pci_dev->dev, "Request GPIO %d with error %d\n", pin, retval); retval = -ENODEV; goto err1; } } else { retval = -ENODEV; goto err1; } pr_debug("%s----> Enable AUX irq\n", __func__); retval = hsic_aux_irq_init(pin); if (retval) { dev_err(&pci_dev->dev, "unable to request IRQ\n"); goto err2; } hsic.aux_gpio = pin; dev_dbg(&pci_dev->dev, "%s<----\n", __func__); return retval; err2: gpio_free(hsic.aux_gpio); err1: return retval; }
/* the root hub will call this callback when device added/removed */ static void hsic_notify(struct usb_device *udev, unsigned action) { int retval; struct pci_dev *pdev = to_pci_dev(udev->bus->controller); /* Ignore and only valid for HSIC. Filter out * the USB devices added by other USB2 host driver */ if (pdev->device != 0x119d) return; /* Ignore USB devices on external hub */ if (udev->parent && udev->parent->parent) return; /* Only valid for hsic port1 */ if (udev->portnum == 2) { pr_debug("%s ignore hsic port2\n", __func__); return; } switch (action) { case USB_DEVICE_ADD: pr_debug("Notify HSIC add device\n"); /* Root hub */ if (!udev->parent) { hsic.rh_dev = udev; pr_debug("%s Enable autosuspend\n", __func__); pm_runtime_set_autosuspend_delay(&udev->dev, hsic.bus_inactivityDuration); hsic.autosuspend_enable = 1; usb_enable_autosuspend(udev); } else { /* Modem devices */ hsic.modem_dev = udev; pm_runtime_set_autosuspend_delay (&udev->dev, hsic.port_inactivityDuration); udev->persist_enabled = 0; if (hsic.remoteWakeup_enable) { pr_debug("%s Modem dev remote wakeup enabled\n", __func__); device_set_wakeup_capable (&hsic.modem_dev->dev, 1); device_set_wakeup_capable (&hsic.rh_dev->dev, 1); } else { pr_debug("%s Modem dev remote wakeup disabled\n", __func__); device_set_wakeup_capable (&hsic.modem_dev->dev, 0); device_set_wakeup_capable (&hsic.rh_dev->dev, 0); } pr_debug("%s Disable autosuspend\n", __func__); usb_disable_autosuspend(hsic.modem_dev); hsic.autosuspend_enable = 0; pr_debug("%s----> Enable AUX irq\n", __func__); retval = hsic_aux_irq_init(); if (retval) dev_err(&pci_dev->dev, "unable to request IRQ\n"); } break; case USB_DEVICE_REMOVE: pr_debug("Notify HSIC delete device\n"); /* Root hub */ if (!udev->parent) { pr_debug("%s rh_dev deleted\n", __func__); hsic.rh_dev = NULL; hsic.autosuspend_enable = 1; } else { /* Modem devices */ pr_debug("%s----> modem dev deleted\n", __func__); hsic.modem_dev = NULL; } s3_wake_unlock(); break; default: pr_debug("Notify action not supported\n"); break ; } return; }