Commit 6eb6fbbf authored by Keshava Munegowda's avatar Keshava Munegowda Committed by Samuel Ortiz

mfd: Fix omap usbhs crash when rmmoding ehci or ohci

The disabling of clocks and freeing GPIO are changed
to fix the occurrence of the crash of rmmod of ehci and ohci
drivers. The GPIOs should be freed after the spin locks are
unlocked.
Signed-off-by: default avatarKeshava Munegowda <keshava_mgowda@ti.com>
Acked-by: default avatarFelipe Balbi <balbi@ti.com>
Cc: stable@kernel.org
Signed-off-by: default avatarSamuel Ortiz <sameo@linux.intel.com>
parent 13ca4f66
...@@ -994,22 +994,33 @@ static void usbhs_disable(struct device *dev) ...@@ -994,22 +994,33 @@ static void usbhs_disable(struct device *dev)
dev_dbg(dev, "operation timed out\n"); dev_dbg(dev, "operation timed out\n");
} }
if (pdata->ehci_data->phy_reset) { if (is_omap_usbhs_rev2(omap)) {
if (gpio_is_valid(pdata->ehci_data->reset_gpio_port[0])) if (is_ehci_tll_mode(pdata->port_mode[0]))
gpio_free(pdata->ehci_data->reset_gpio_port[0]); clk_enable(omap->usbtll_p1_fck);
if (is_ehci_tll_mode(pdata->port_mode[1]))
if (gpio_is_valid(pdata->ehci_data->reset_gpio_port[1])) clk_enable(omap->usbtll_p2_fck);
gpio_free(pdata->ehci_data->reset_gpio_port[1]);
}
clk_disable(omap->utmi_p2_fck); clk_disable(omap->utmi_p2_fck);
clk_disable(omap->utmi_p1_fck); clk_disable(omap->utmi_p1_fck);
}
clk_disable(omap->usbtll_ick); clk_disable(omap->usbtll_ick);
clk_disable(omap->usbtll_fck); clk_disable(omap->usbtll_fck);
clk_disable(omap->usbhost_fs_fck); clk_disable(omap->usbhost_fs_fck);
clk_disable(omap->usbhost_hs_fck); clk_disable(omap->usbhost_hs_fck);
clk_disable(omap->usbhost_ick); clk_disable(omap->usbhost_ick);
/* The gpio_free migh sleep; so unlock the spinlock */
spin_unlock_irqrestore(&omap->lock, flags);
if (pdata->ehci_data->phy_reset) {
if (gpio_is_valid(pdata->ehci_data->reset_gpio_port[0]))
gpio_free(pdata->ehci_data->reset_gpio_port[0]);
if (gpio_is_valid(pdata->ehci_data->reset_gpio_port[1]))
gpio_free(pdata->ehci_data->reset_gpio_port[1]);
}
return;
end_disble: end_disble:
spin_unlock_irqrestore(&omap->lock, flags); spin_unlock_irqrestore(&omap->lock, flags);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment