static void __exit twl4030_usb_exit(void) { struct twl4030_usb *twl = the_transceiver; int val; usb_irq_disable(); free_irq(twl->irq, twl); /* set transceiver mode to power on defaults */ twl4030_usb_set_mode(twl, -1); /* autogate 60MHz ULPI clock, * clear dpll clock request for i2c access, * disable 32KHz */ val = twl4030_usb_read(PHY_CLK_CTRL); if (val >= 0) { val |= PHY_CLK_CTRL_CLOCKGATING_EN; val &= ~(PHY_CLK_CTRL_CLK32K_EN | REQ_PHY_DPLL_CLK); twl4030_usb_write(PHY_CLK_CTRL, (u8)val); } /* disable complete OTG block */ twl4030_usb_clear_bits(twl, POWER_CTRL, POWER_CTRL_OTG_ENAB); twl4030_phy_power(twl, 0); kfree(twl); }
int usb_event_disable(maxusb_event_t event) { if (event >= MAXUSB_NUM_EVENTS) { return -1; } usb_irq_disable(event); callback[event].func = NULL; callback[event].cbdata = NULL; return 0; }
static int __init twl4030_usb_init(void) { struct twl4030_usb *twl; int status; if (the_transceiver) return 0; twl = kzalloc(sizeof *twl, GFP_KERNEL); if (!twl) return 0; the_transceiver = twl; twl->irq = TWL4030_PWRIRQ_USB_PRES; twl->otg.set_host = twl4030_set_host; twl->otg.set_peripheral = twl4030_set_peripheral; twl->otg.set_suspend = twl4030_set_suspend; usb_irq_disable(); status = request_irq(twl->irq, twl4030_usb_irq, 0, "twl4030_usb", twl); if (status < 0) { printk(KERN_DEBUG "can't get IRQ %d, err %d\n", twl->irq, status); kfree(twl); return -ENODEV; } #if defined(CONFIG_TWL4030_USB_HS_ULPI) hs_usb_init(twl); #endif twl4030_usb_ldo_init(twl); twl4030_phy_power(twl, 1); twl4030_i2c_access(1); twl4030_usb_set_mode(twl, twl->usb_mode); if (twl->usb_mode == T2_USB_MODE_ULPI) twl4030_i2c_access(0); twl->asleep = 0; if (twl->usb_mode == T2_USB_MODE_ULPI) twl4030_phy_suspend(1); otg_set_transceiver(&twl->otg); printk(KERN_INFO "Initialized TWL4030 USB module\n"); return 0; }
static void twl4030_phy_suspend(int controller_off) { struct twl4030_usb *twl = the_transceiver; if (controller_off) usb_irq_disable(); if (twl->asleep) return; if (!controller_off) /* enable rising edge interrupt to detect cable attach */ usb_irq_enable(1, 0); twl4030_phy_power(twl, 0); twl->asleep = 1; return; }