diff options
Diffstat (limited to 'target/linux/omap24xx/patches-2.6.38/596-cbus-tahvo-usb-clk.patch')
-rw-r--r-- | target/linux/omap24xx/patches-2.6.38/596-cbus-tahvo-usb-clk.patch | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/target/linux/omap24xx/patches-2.6.38/596-cbus-tahvo-usb-clk.patch b/target/linux/omap24xx/patches-2.6.38/596-cbus-tahvo-usb-clk.patch new file mode 100644 index 000000000..34279b428 --- /dev/null +++ b/target/linux/omap24xx/patches-2.6.38/596-cbus-tahvo-usb-clk.patch @@ -0,0 +1,78 @@ +Index: linux-2.6.38-rc7/drivers/cbus/tahvo-usb.c +=================================================================== +--- linux-2.6.38-rc7.orig/drivers/cbus/tahvo-usb.c 2011-03-09 18:55:47.177917578 +0100 ++++ linux-2.6.38-rc7/drivers/cbus/tahvo-usb.c 2011-03-09 18:58:35.869996276 +0100 +@@ -98,6 +98,7 @@ struct tahvo_usb { + #ifdef CONFIG_USB_OTG + int tahvo_mode; + #endif ++ struct clk *ick; + }; + static struct tahvo_usb *tahvo_usb_device; + +@@ -673,6 +674,14 @@ static int __init tahvo_usb_probe(struct + INIT_WORK(&tu->irq_work, tahvo_usb_irq_work); + mutex_init(&tu->serialize); + ++ tu->ick = clk_get(NULL, "usb_l4_ick"); ++ if (IS_ERR(tu->ick)) { ++ dev_err(dev, "Failed to get usb_l4_ick\n"); ++ ret = PTR_ERR(tu->ick); ++ goto err_free_tu; ++ } ++ clk_enable(tu->ick); ++ + /* Set initial state, so that we generate kevents only on + * state changes */ + tu->vbus_state = tahvo_read_reg(TAHVO_REG_IDSR) & 0x01; +@@ -681,10 +690,8 @@ static int __init tahvo_usb_probe(struct + ret = tahvo_request_irq(TAHVO_INT_VBUSON, tahvo_usb_vbus_interrupt, + (unsigned long) tu, "vbus_interrupt"); + if (ret != 0) { +- kfree(tu); +- tahvo_usb_device = NULL; + printk(KERN_ERR "Could not register Tahvo interrupt for VBUS\n"); +- return ret; ++ goto err_release_clk; + } + + /* Attributes */ +@@ -709,10 +716,7 @@ static int __init tahvo_usb_probe(struct + ret = otg_set_transceiver(&tu->otg); + if (ret < 0) { + printk(KERN_ERR "Cannot register USB transceiver\n"); +- tahvo_usb_device = NULL; +- kfree(tu); +- tahvo_free_irq(TAHVO_INT_VBUSON); +- return ret; ++ goto err_free_irq; + } + + dev_set_drvdata(dev, tu); +@@ -721,6 +725,17 @@ static int __init tahvo_usb_probe(struct + * may not be generated in addition to this. */ + schedule_work(&tu->irq_work); + return 0; ++ ++err_free_irq: ++ tahvo_free_irq(TAHVO_INT_VBUSON); ++err_release_clk: ++ clk_disable(tu->ick); ++ clk_put(tu->ick); ++err_free_tu: ++ kfree(tu); ++ tahvo_usb_device = NULL; ++ ++ return ret; + } + + static int __exit tahvo_usb_remove(struct platform_device *pdev) +@@ -736,6 +751,8 @@ static int __exit tahvo_usb_remove(struc + #ifdef CONFIG_USB_OTG + device_remove_file(&pdev->dev, &dev_attr_otg_mode); + #endif ++ clk_disable(tu->ick); ++ clk_put(tu->ick); + + kfree(tu); + tahvo_usb_device = NULL; |