summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQuinn Jensen <quinn.jensen@freescale.com>2007-10-24 21:23:24 -0600
committerQuinn Jensen <quinn.jensen@freescale.com>2007-10-24 21:23:24 -0600
commit2eeeb4f3d90beec079c1e758053e53acd9ed1e1b (patch)
treef68feea1c9dadff5a6d7a65ced8ab7677c5586e9
parent4866f27718e82f947bbd5c03cb0751e7619e42e8 (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.c27
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))) {