diff options
author | Quinn Jensen <quinn.jensen@freescale.com> | 2007-10-24 21:23:24 -0600 |
---|---|---|
committer | Quinn Jensen <quinn.jensen@freescale.com> | 2007-10-24 21:23:24 -0600 |
commit | 2eeeb4f3d90beec079c1e758053e53acd9ed1e1b (patch) | |
tree | f68feea1c9dadff5a6d7a65ced8ab7677c5586e9 | |
parent | 4866f27718e82f947bbd5c03cb0751e7619e42e8 (diff) |
USB: check the return value of clk_enable(usb_clk)
Patch to fix Bugzilla 742, 743, 744. USB: check the return value of
clk_enable(usb_clk) and return with an error if it fails.
Applies to linux 2.6.22 kernel for MX platforms.
http://www.bitshrine.org/gpp/linux-2.6.22-mx-USB-check-the-return-value-of-clk_enable-u.patch
-rw-r--r-- | arch/arm/plat-mxc/usb_common.c | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/arch/arm/plat-mxc/usb_common.c b/arch/arm/plat-mxc/usb_common.c index 75b2d0489ce3..5d5dda5948b2 100644 --- a/arch/arm/plat-mxc/usb_common.c +++ b/arch/arm/plat-mxc/usb_common.c @@ -56,7 +56,10 @@ static int fsl_check_usbclk(void) unsigned long freq; usb_ahb_clk = clk_get(NULL, "usb_ahb_clk"); - clk_enable(usb_ahb_clk); + if (clk_enable(usb_ahb_clk)) { + printk(KERN_ERR "clk_enable(usb_ahb_clk) failed\n"); + return -EINVAL; + } clk_put(usb_ahb_clk); usb_clk = clk_get(NULL, "usb_clk"); @@ -314,6 +317,7 @@ static void usbh1_set_serial_xcvr(void) static void usbh2_set_ulpi_xcvr(void) { + pr_debug("%s\n", __FUNCTION__); USBCTRL &= ~(UCTRL_H2SIC_MASK | UCTRL_BPE); /* disable bypass mode */ USBCTRL |= UCTRL_H2WIE | /* wakeup intr enable */ UCTRL_H2UIE | /* ULPI intr enable */ @@ -349,17 +353,20 @@ int fsl_usb_host_init(struct platform_device *pdev) if (fsl_check_usbclk() != 0) return -EINVAL; - pr_debug("%s: grab pins\n", __FUNCTION__); - if (pdata->gpio_usb_active()) - return -EINVAL; - /* request_mem_region and ioremap registers */ if ((rc = fsl_usb_mem_init(pdev))) { pdata->gpio_usb_inactive(); /* release our pins */ return rc; } - clk_enable(usb_clk); + pr_debug("%s: grab pins\n", __FUNCTION__); + if (pdata->gpio_usb_active()) + return -EINVAL; + + if (clk_enable(usb_clk)) { + printk(KERN_ERR "clk_enable(usb_clk) failed\n"); + return -EINVAL; + } if (xops->init) xops->init(xops); @@ -400,6 +407,7 @@ static void otg_set_serial_xcvr(void) { u32 tmp; + pr_debug("%s\n", __FUNCTION__); tmp = UOG_PORTSC1 & ~PORTSC_PTS_MASK; tmp |= PORTSC_PTS_SERIAL; UOG_PORTSC1 = tmp; @@ -407,6 +415,7 @@ static void otg_set_serial_xcvr(void) void otg_set_serial_host(void) { + pr_debug("%s\n", __FUNCTION__); /* set USBCTRL for host operation * disable: bypass mode, * set: single-ended/unidir/6 wire, OTG wakeup intr enable, @@ -463,6 +472,7 @@ static void otg_set_ulpi_xcvr(void) { u32 tmp; + pr_debug("%s\n", __FUNCTION__); USBCTRL &= ~UCTRL_OSIC_MASK; #if defined(CONFIG_ARCH_MX27) || defined(CONFIG_ARCH_MX3) USBCTRL &= ~UCTRL_BPE; @@ -518,7 +528,10 @@ int usbotg_init(struct platform_device *pdev) if (pdata->gpio_usb_active()) return -EINVAL; - clk_enable(usb_clk); + if (clk_enable(usb_clk)) { + printk(KERN_ERR "clk_enable(usb_clk) failed\n"); + return -EINVAL; + } /* request_mem_region and ioremap registers */ if ((rc = fsl_usb_mem_init(pdev))) { |