Commit 7e0ff103 authored by Roger Quadros's avatar Roger Quadros

mfd: omap-usb-tll: Fix channel count detection

Fix channel count detecion for REV2. Also, don't give up
if we don't recognize the IP Revision. We assume the default
number of channels (i.e. 3) for unrecognized IPs.
Signed-off-by: default avatarRoger Quadros <rogerq@ti.com>
Reviewed-by: default avatarFelipe Balbi <balbi@ti.com>
parent 9d9c6ae7
...@@ -98,6 +98,7 @@ ...@@ -98,6 +98,7 @@
struct usbtll_omap { struct usbtll_omap {
struct clk *usbtll_p1_fck; struct clk *usbtll_p1_fck;
struct clk *usbtll_p2_fck; struct clk *usbtll_p2_fck;
int nch; /* num. of channels */
struct usbhs_omap_platform_data *pdata; struct usbhs_omap_platform_data *pdata;
/* secure the register updates */ /* secure the register updates */
spinlock_t lock; spinlock_t lock;
...@@ -210,7 +211,7 @@ static int usbtll_omap_probe(struct platform_device *pdev) ...@@ -210,7 +211,7 @@ static int usbtll_omap_probe(struct platform_device *pdev)
unsigned reg; unsigned reg;
unsigned long flags; unsigned long flags;
int ret = 0; int ret = 0;
int i, ver, count; int i, ver;
dev_dbg(dev, "starting TI HSUSB TLL Controller\n"); dev_dbg(dev, "starting TI HSUSB TLL Controller\n");
...@@ -262,16 +263,18 @@ static int usbtll_omap_probe(struct platform_device *pdev) ...@@ -262,16 +263,18 @@ static int usbtll_omap_probe(struct platform_device *pdev)
ver = usbtll_read(base, OMAP_USBTLL_REVISION); ver = usbtll_read(base, OMAP_USBTLL_REVISION);
switch (ver) { switch (ver) {
case OMAP_USBTLL_REV1: case OMAP_USBTLL_REV1:
case OMAP_USBTLL_REV2: tll->nch = OMAP_TLL_CHANNEL_COUNT;
count = OMAP_TLL_CHANNEL_COUNT;
break; break;
case OMAP_USBTLL_REV2:
case OMAP_USBTLL_REV3: case OMAP_USBTLL_REV3:
count = OMAP_REV2_TLL_CHANNEL_COUNT; tll->nch = OMAP_REV2_TLL_CHANNEL_COUNT;
break; break;
default: default:
dev_err(dev, "TLL version failed\n"); tll->nch = OMAP_TLL_CHANNEL_COUNT;
ret = -ENODEV; dev_dbg(dev,
goto err_ioremap; "USB TLL Rev : 0x%x not recognized, assuming %d channels\n",
ver, tll->nch);
break;
} }
if (is_ehci_tll_mode(pdata->port_mode[0]) || if (is_ehci_tll_mode(pdata->port_mode[0]) ||
...@@ -291,7 +294,7 @@ static int usbtll_omap_probe(struct platform_device *pdev) ...@@ -291,7 +294,7 @@ static int usbtll_omap_probe(struct platform_device *pdev)
usbtll_write(base, OMAP_TLL_SHARED_CONF, reg); usbtll_write(base, OMAP_TLL_SHARED_CONF, reg);
/* Enable channels now */ /* Enable channels now */
for (i = 0; i < count; i++) { for (i = 0; i < tll->nch; i++) {
reg = usbtll_read(base, OMAP_TLL_CHANNEL_CONF(i)); reg = usbtll_read(base, OMAP_TLL_CHANNEL_CONF(i));
if (is_ohci_port(pdata->port_mode[i])) { if (is_ohci_port(pdata->port_mode[i])) {
...@@ -319,7 +322,6 @@ static int usbtll_omap_probe(struct platform_device *pdev) ...@@ -319,7 +322,6 @@ static int usbtll_omap_probe(struct platform_device *pdev)
} }
} }
err_ioremap:
spin_unlock_irqrestore(&tll->lock, flags); spin_unlock_irqrestore(&tll->lock, flags);
iounmap(base); iounmap(base);
pm_runtime_put_sync(dev); pm_runtime_put_sync(dev);
......
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