* [PATCH 02/29] usb: gadget: mv_udc: use devm_xxx for probe
2012-11-22 2:04 [PATCH 01/29] usb: gadget: mv_udc: use udc_start and udc_stop functions Chao Xie
@ 2012-11-22 2:04 ` Chao Xie
2012-11-22 2:04 ` [PATCH 03/29] usb: gadget: mv_udc: fix the clk APIs Chao Xie
` (26 subsequent siblings)
27 siblings, 0 replies; 30+ messages in thread
From: Chao Xie @ 2012-11-22 2:04 UTC (permalink / raw)
To: linux-arm-kernel
From: Chao Xie <chao.xie@marvell.com>
Signed-off-by: Chao Xie <xiechao.mail@gmail.com>
---
drivers/usb/gadget/mv_udc_core.c | 156 ++++++++++++++------------------------
1 files changed, 56 insertions(+), 100 deletions(-)
diff --git a/drivers/usb/gadget/mv_udc_core.c b/drivers/usb/gadget/mv_udc_core.c
index fa4950a..1104327 100644
--- a/drivers/usb/gadget/mv_udc_core.c
+++ b/drivers/usb/gadget/mv_udc_core.c
@@ -2115,12 +2115,11 @@ static void gadget_release(struct device *dev)
complete(udc->done);
}
-static int __devexit mv_udc_remove(struct platform_device *dev)
+static int __devexit mv_udc_remove(struct platform_device *pdev)
{
struct mv_udc *udc;
- int clk_i;
- udc = platform_get_drvdata(dev);
+ udc = platform_get_drvdata(pdev);
usb_del_gadget_udc(&udc->gadget);
@@ -2129,55 +2128,27 @@ static int __devexit mv_udc_remove(struct platform_device *dev)
destroy_workqueue(udc->qwork);
}
- /*
- * If we have transceiver inited,
- * then vbus irq will not be requested in udc driver.
- */
- if (udc->pdata && udc->pdata->vbus
- && udc->clock_gating && IS_ERR_OR_NULL(udc->transceiver))
- free_irq(udc->pdata->vbus->irq, &dev->dev);
-
/* free memory allocated in probe */
if (udc->dtd_pool)
dma_pool_destroy(udc->dtd_pool);
if (udc->ep_dqh)
- dma_free_coherent(&dev->dev, udc->ep_dqh_size,
+ dma_free_coherent(&pdev->dev, udc->ep_dqh_size,
udc->ep_dqh, udc->ep_dqh_dma);
- kfree(udc->eps);
-
- if (udc->irq)
- free_irq(udc->irq, &dev->dev);
-
mv_udc_disable(udc);
- if (udc->cap_regs)
- iounmap(udc->cap_regs);
-
- if (udc->phy_regs)
- iounmap(udc->phy_regs);
-
- if (udc->status_req) {
- kfree(udc->status_req->req.buf);
- kfree(udc->status_req);
- }
-
- for (clk_i = 0; clk_i <= udc->clknum; clk_i++)
- clk_put(udc->clk[clk_i]);
-
device_unregister(&udc->gadget.dev);
/* free dev, wait for the release() finished */
wait_for_completion(udc->done);
- kfree(udc);
return 0;
}
-static int __devinit mv_udc_probe(struct platform_device *dev)
+static int __devinit mv_udc_probe(struct platform_device *pdev)
{
- struct mv_usb_platform_data *pdata = dev->dev.platform_data;
+ struct mv_usb_platform_data *pdata = pdev->dev.platform_data;
struct mv_udc *udc;
int retval = 0;
int clk_i = 0;
@@ -2185,70 +2156,68 @@ static int __devinit mv_udc_probe(struct platform_device *dev)
size_t size;
if (pdata == NULL) {
- dev_err(&dev->dev, "missing platform_data\n");
+ dev_err(&pdev->dev, "missing platform_data\n");
return -ENODEV;
}
size = sizeof(*udc) + sizeof(struct clk *) * pdata->clknum;
- udc = kzalloc(size, GFP_KERNEL);
+ udc = devm_kzalloc(&pdev->dev, size, GFP_KERNEL);
if (udc == NULL) {
- dev_err(&dev->dev, "failed to allocate memory for udc\n");
+ dev_err(&pdev->dev, "failed to allocate memory for udc\n");
return -ENOMEM;
}
udc->done = &release_done;
- udc->pdata = dev->dev.platform_data;
+ udc->pdata = pdev->dev.platform_data;
spin_lock_init(&udc->lock);
- udc->dev = dev;
+ udc->dev = pdev;
#ifdef CONFIG_USB_OTG_UTILS
if (pdata->mode == MV_USB_MODE_OTG)
- udc->transceiver = usb_get_phy(USB_PHY_TYPE_USB2);
+ udc->transceiver = devm_usb_get_phy(&pdev->dev,
+ USB_PHY_TYPE_USB2);
#endif
udc->clknum = pdata->clknum;
for (clk_i = 0; clk_i < udc->clknum; clk_i++) {
- udc->clk[clk_i] = clk_get(&dev->dev, pdata->clkname[clk_i]);
+ udc->clk[clk_i] = devm_clk_get(&pdev->dev,
+ pdata->clkname[clk_i]);
if (IS_ERR(udc->clk[clk_i])) {
retval = PTR_ERR(udc->clk[clk_i]);
- goto err_put_clk;
+ return retval;
}
}
r = platform_get_resource_byname(udc->dev, IORESOURCE_MEM, "capregs");
if (r == NULL) {
- dev_err(&dev->dev, "no I/O memory resource defined\n");
- retval = -ENODEV;
- goto err_put_clk;
+ dev_err(&pdev->dev, "no I/O memory resource defined\n");
+ return -ENODEV;
}
udc->cap_regs = (struct mv_cap_regs __iomem *)
- ioremap(r->start, resource_size(r));
+ devm_ioremap(&pdev->dev, r->start, resource_size(r));
if (udc->cap_regs == NULL) {
- dev_err(&dev->dev, "failed to map I/O memory\n");
- retval = -EBUSY;
- goto err_put_clk;
+ dev_err(&pdev->dev, "failed to map I/O memory\n");
+ return -EBUSY;
}
r = platform_get_resource_byname(udc->dev, IORESOURCE_MEM, "phyregs");
if (r == NULL) {
- dev_err(&dev->dev, "no phy I/O memory resource defined\n");
- retval = -ENODEV;
- goto err_iounmap_capreg;
+ dev_err(&pdev->dev, "no phy I/O memory resource defined\n");
+ return -ENODEV;
}
udc->phy_regs = ioremap(r->start, resource_size(r));
if (udc->phy_regs == NULL) {
- dev_err(&dev->dev, "failed to map phy I/O memory\n");
- retval = -EBUSY;
- goto err_iounmap_capreg;
+ dev_err(&pdev->dev, "failed to map phy I/O memory\n");
+ return -EBUSY;
}
/* we will acces controller register, so enable the clk */
retval = mv_udc_enable_internal(udc);
if (retval)
- goto err_iounmap_phyreg;
+ return retval;
udc->op_regs =
(struct mv_op_regs __iomem *)((unsigned long)udc->cap_regs
@@ -2265,11 +2234,11 @@ static int __devinit mv_udc_probe(struct platform_device *dev)
size = udc->max_eps * sizeof(struct mv_dqh) *2;
size = (size + DQH_ALIGNMENT - 1) & ~(DQH_ALIGNMENT - 1);
- udc->ep_dqh = dma_alloc_coherent(&dev->dev, size,
+ udc->ep_dqh = dma_alloc_coherent(&pdev->dev, size,
&udc->ep_dqh_dma, GFP_KERNEL);
if (udc->ep_dqh == NULL) {
- dev_err(&dev->dev, "allocate dQH memory failed\n");
+ dev_err(&pdev->dev, "allocate dQH memory failed\n");
retval = -ENOMEM;
goto err_disable_clock;
}
@@ -2277,7 +2246,7 @@ static int __devinit mv_udc_probe(struct platform_device *dev)
/* create dTD dma_pool resource */
udc->dtd_pool = dma_pool_create("mv_dtd",
- &dev->dev,
+ &pdev->dev,
sizeof(struct mv_dtd),
DTD_ALIGNMENT,
DMA_BOUNDARY);
@@ -2288,19 +2257,20 @@ static int __devinit mv_udc_probe(struct platform_device *dev)
}
size = udc->max_eps * sizeof(struct mv_ep) *2;
- udc->eps = kzalloc(size, GFP_KERNEL);
+ udc->eps = devm_kzalloc(&pdev->dev, size, GFP_KERNEL);
if (udc->eps == NULL) {
- dev_err(&dev->dev, "allocate ep memory failed\n");
+ dev_err(&pdev->dev, "allocate ep memory failed\n");
retval = -ENOMEM;
goto err_destroy_dma;
}
/* initialize ep0 status request structure */
- udc->status_req = kzalloc(sizeof(struct mv_req), GFP_KERNEL);
+ udc->status_req = devm_kzalloc(&pdev->dev, sizeof(struct mv_req),
+ GFP_KERNEL);
if (!udc->status_req) {
- dev_err(&dev->dev, "allocate status_req memory failed\n");
+ dev_err(&pdev->dev, "allocate status_req memory failed\n");
retval = -ENOMEM;
- goto err_free_eps;
+ goto err_destroy_dma;
}
INIT_LIST_HEAD(&udc->status_req->queue);
@@ -2315,17 +2285,17 @@ static int __devinit mv_udc_probe(struct platform_device *dev)
r = platform_get_resource(udc->dev, IORESOURCE_IRQ, 0);
if (r == NULL) {
- dev_err(&dev->dev, "no IRQ resource defined\n");
+ dev_err(&pdev->dev, "no IRQ resource defined\n");
retval = -ENODEV;
- goto err_free_status_req;
+ goto err_destroy_dma;
}
udc->irq = r->start;
- if (request_irq(udc->irq, mv_udc_irq,
+ if (devm_request_irq(&pdev->dev, udc->irq, mv_udc_irq,
IRQF_SHARED, driver_name, udc)) {
- dev_err(&dev->dev, "Request irq %d for UDC failed\n",
+ dev_err(&pdev->dev, "Request irq %d for UDC failed\n",
udc->irq);
retval = -ENODEV;
- goto err_free_status_req;
+ goto err_destroy_dma;
}
/* initialize gadget structure */
@@ -2337,14 +2307,14 @@ static int __devinit mv_udc_probe(struct platform_device *dev)
/* the "gadget" abstracts/virtualizes the controller */
dev_set_name(&udc->gadget.dev, "gadget");
- udc->gadget.dev.parent = &dev->dev;
- udc->gadget.dev.dma_mask = dev->dev.dma_mask;
+ udc->gadget.dev.parent = &pdev->dev;
+ udc->gadget.dev.dma_mask = pdev->dev.dma_mask;
udc->gadget.dev.release = gadget_release;
udc->gadget.name = driver_name; /* gadget name */
retval = device_register(&udc->gadget.dev);
if (retval)
- goto err_free_irq;
+ goto err_destroy_dma;
eps_init(udc);
@@ -2353,10 +2323,11 @@ static int __devinit mv_udc_probe(struct platform_device *dev)
udc->clock_gating = 1;
else if (pdata->vbus) {
udc->clock_gating = 1;
- retval = request_threaded_irq(pdata->vbus->irq, NULL,
+ retval = devm_request_threaded_irq(&pdev->dev,
+ pdata->vbus->irq, NULL,
mv_udc_vbus_irq, IRQF_ONESHOT, "vbus", udc);
if (retval) {
- dev_info(&dev->dev,
+ dev_info(&pdev->dev,
"Can not request irq for VBUS, "
"disable clock gating\n");
udc->clock_gating = 0;
@@ -2364,7 +2335,7 @@ static int __devinit mv_udc_probe(struct platform_device *dev)
udc->qwork = create_singlethread_workqueue("mv_udc_queue");
if (!udc->qwork) {
- dev_err(&dev->dev, "cannot create workqueue\n");
+ dev_err(&pdev->dev, "cannot create workqueue\n");
retval = -ENOMEM;
goto err_unregister;
}
@@ -2382,43 +2353,28 @@ static int __devinit mv_udc_probe(struct platform_device *dev)
else
udc->vbus_active = 1;
- retval = usb_add_gadget_udc(&dev->dev, &udc->gadget);
+ retval = usb_add_gadget_udc(&pdev->dev, &udc->gadget);
if (retval)
- goto err_unregister;
+ goto err_create_workqueue;
- platform_set_drvdata(dev, udc);
- dev_info(&dev->dev, "successful probe UDC device %s clock gating.\n",
+ platform_set_drvdata(pdev, udc);
+ dev_info(&pdev->dev, "successful probe UDC device %s clock gating.\n",
udc->clock_gating ? "with" : "without");
return 0;
+err_create_workqueue:
+ destroy_workqueue(udc->qwork);
err_unregister:
- if (udc->pdata && udc->pdata->vbus
- && udc->clock_gating && IS_ERR_OR_NULL(udc->transceiver))
- free_irq(pdata->vbus->irq, &dev->dev);
device_unregister(&udc->gadget.dev);
-err_free_irq:
- free_irq(udc->irq, &dev->dev);
-err_free_status_req:
- kfree(udc->status_req->req.buf);
- kfree(udc->status_req);
-err_free_eps:
- kfree(udc->eps);
err_destroy_dma:
dma_pool_destroy(udc->dtd_pool);
err_free_dma:
- dma_free_coherent(&dev->dev, udc->ep_dqh_size,
+ dma_free_coherent(&pdev->dev, udc->ep_dqh_size,
udc->ep_dqh, udc->ep_dqh_dma);
err_disable_clock:
mv_udc_disable_internal(udc);
-err_iounmap_phyreg:
- iounmap(udc->phy_regs);
-err_iounmap_capreg:
- iounmap(udc->cap_regs);
-err_put_clk:
- for (clk_i--; clk_i >= 0; clk_i--)
- clk_put(udc->clk[clk_i]);
- kfree(udc);
+
return retval;
}
@@ -2489,12 +2445,12 @@ static const struct dev_pm_ops mv_udc_pm_ops = {
};
#endif
-static void mv_udc_shutdown(struct platform_device *dev)
+static void mv_udc_shutdown(struct platform_device *pdev)
{
struct mv_udc *udc;
u32 mode;
- udc = platform_get_drvdata(dev);
+ udc = platform_get_drvdata(pdev);
/* reset controller mode to IDLE */
mv_udc_enable(udc);
mode = readl(&udc->op_regs->usbmode);
--
1.7.4.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 03/29] usb: gadget: mv_udc: fix the clk APIs
2012-11-22 2:04 [PATCH 01/29] usb: gadget: mv_udc: use udc_start and udc_stop functions Chao Xie
2012-11-22 2:04 ` [PATCH 02/29] usb: gadget: mv_udc: use devm_xxx for probe Chao Xie
@ 2012-11-22 2:04 ` Chao Xie
2012-11-22 2:04 ` [PATCH 04/29] usb: otg: mv_otg: use devm_xxx for probe Chao Xie
` (25 subsequent siblings)
27 siblings, 0 replies; 30+ messages in thread
From: Chao Xie @ 2012-11-22 2:04 UTC (permalink / raw)
To: linux-arm-kernel
From: Chao Xie <chao.xie@marvell.com>
Signed-off-by: Chao Xie <xiechao.mail@gmail.com>
---
drivers/usb/gadget/mv_udc_core.c | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/usb/gadget/mv_udc_core.c b/drivers/usb/gadget/mv_udc_core.c
index 1104327..c78d52f 100644
--- a/drivers/usb/gadget/mv_udc_core.c
+++ b/drivers/usb/gadget/mv_udc_core.c
@@ -1009,7 +1009,7 @@ static void udc_clock_enable(struct mv_udc *udc)
unsigned int i;
for (i = 0; i < udc->clknum; i++)
- clk_enable(udc->clk[i]);
+ clk_prepare_enable(udc->clk[i]);
}
static void udc_clock_disable(struct mv_udc *udc)
@@ -1017,7 +1017,7 @@ static void udc_clock_disable(struct mv_udc *udc)
unsigned int i;
for (i = 0; i < udc->clknum; i++)
- clk_disable(udc->clk[i]);
+ clk_disable_unprepare(udc->clk[i]);
}
static void udc_stop(struct mv_udc *udc)
--
1.7.4.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 04/29] usb: otg: mv_otg: use devm_xxx for probe
2012-11-22 2:04 [PATCH 01/29] usb: gadget: mv_udc: use udc_start and udc_stop functions Chao Xie
2012-11-22 2:04 ` [PATCH 02/29] usb: gadget: mv_udc: use devm_xxx for probe Chao Xie
2012-11-22 2:04 ` [PATCH 03/29] usb: gadget: mv_udc: fix the clk APIs Chao Xie
@ 2012-11-22 2:04 ` Chao Xie
2012-11-22 2:04 ` [PATCH 05/29] usb: otg: mv_otg: fix the clk APIs Chao Xie
` (24 subsequent siblings)
27 siblings, 0 replies; 30+ messages in thread
From: Chao Xie @ 2012-11-22 2:04 UTC (permalink / raw)
To: linux-arm-kernel
From: Chao Xie <chao.xie@marvell.com>
Signed-off-by: Chao Xie <xiechao.mail@gmail.com>
---
drivers/usb/otg/mv_otg.c | 82 ++++++++++++---------------------------------
1 files changed, 22 insertions(+), 60 deletions(-)
diff --git a/drivers/usb/otg/mv_otg.c b/drivers/usb/otg/mv_otg.c
index 3f124e8..70e222d 100644
--- a/drivers/usb/otg/mv_otg.c
+++ b/drivers/usb/otg/mv_otg.c
@@ -662,18 +662,9 @@ static struct attribute_group inputs_attr_group = {
int mv_otg_remove(struct platform_device *pdev)
{
struct mv_otg *mvotg = platform_get_drvdata(pdev);
- int clk_i;
sysfs_remove_group(&mvotg->pdev->dev.kobj, &inputs_attr_group);
- if (mvotg->irq)
- free_irq(mvotg->irq, mvotg);
-
- if (mvotg->pdata->vbus)
- free_irq(mvotg->pdata->vbus->irq, mvotg);
- if (mvotg->pdata->id)
- free_irq(mvotg->pdata->id->irq, mvotg);
-
if (mvotg->qwork) {
flush_workqueue(mvotg->qwork);
destroy_workqueue(mvotg->qwork);
@@ -681,21 +672,9 @@ int mv_otg_remove(struct platform_device *pdev)
mv_otg_disable(mvotg);
- if (mvotg->cap_regs)
- iounmap(mvotg->cap_regs);
-
- if (mvotg->phy_regs)
- iounmap(mvotg->phy_regs);
-
- for (clk_i = 0; clk_i <= mvotg->clknum; clk_i++)
- clk_put(mvotg->clk[clk_i]);
-
usb_remove_phy(&mvotg->phy);
platform_set_drvdata(pdev, NULL);
- kfree(mvotg->phy.otg);
- kfree(mvotg);
-
return 0;
}
@@ -714,17 +693,15 @@ static int mv_otg_probe(struct platform_device *pdev)
}
size = sizeof(*mvotg) + sizeof(struct clk *) * pdata->clknum;
- mvotg = kzalloc(size, GFP_KERNEL);
+ mvotg = devm_kzalloc(&pdev->dev, size, GFP_KERNEL);
if (!mvotg) {
dev_err(&pdev->dev, "failed to allocate memory!\n");
return -ENOMEM;
}
- otg = kzalloc(sizeof *otg, GFP_KERNEL);
- if (!otg) {
- kfree(mvotg);
+ otg = devm_kzalloc(&pdev->dev, sizeof(*otg), GFP_KERNEL);
+ if (!otg)
return -ENOMEM;
- }
platform_set_drvdata(pdev, mvotg);
@@ -733,18 +710,18 @@ static int mv_otg_probe(struct platform_device *pdev)
mvotg->clknum = pdata->clknum;
for (clk_i = 0; clk_i < mvotg->clknum; clk_i++) {
- mvotg->clk[clk_i] = clk_get(&pdev->dev, pdata->clkname[clk_i]);
+ mvotg->clk[clk_i] = devm_clk_get(&pdev->dev,
+ pdata->clkname[clk_i]);
if (IS_ERR(mvotg->clk[clk_i])) {
retval = PTR_ERR(mvotg->clk[clk_i]);
- goto err_put_clk;
+ return retval;
}
}
mvotg->qwork = create_singlethread_workqueue("mv_otg_queue");
if (!mvotg->qwork) {
dev_dbg(&pdev->dev, "cannot create workqueue for OTG\n");
- retval = -ENOMEM;
- goto err_put_clk;
+ return -ENOMEM;
}
INIT_DELAYED_WORK(&mvotg->work, mv_otg_work);
@@ -772,7 +749,7 @@ static int mv_otg_probe(struct platform_device *pdev)
goto err_destroy_workqueue;
}
- mvotg->phy_regs = ioremap(r->start, resource_size(r));
+ mvotg->phy_regs = devm_ioremap(&pdev->dev, r->start, resource_size(r));
if (mvotg->phy_regs == NULL) {
dev_err(&pdev->dev, "failed to map phy I/O memory\n");
retval = -EFAULT;
@@ -784,21 +761,21 @@ static int mv_otg_probe(struct platform_device *pdev)
if (r == NULL) {
dev_err(&pdev->dev, "no I/O memory resource defined\n");
retval = -ENODEV;
- goto err_unmap_phyreg;
+ goto err_destroy_workqueue;
}
- mvotg->cap_regs = ioremap(r->start, resource_size(r));
+ mvotg->cap_regs = devm_ioremap(&pdev->dev, r->start, resource_size(r));
if (mvotg->cap_regs == NULL) {
dev_err(&pdev->dev, "failed to map I/O memory\n");
retval = -EFAULT;
- goto err_unmap_phyreg;
+ goto err_destroy_workqueue;
}
/* we will acces controller register, so enable the udc controller */
retval = mv_otg_enable_internal(mvotg);
if (retval) {
dev_err(&pdev->dev, "mv otg enable error %d\n", retval);
- goto err_unmap_capreg;
+ goto err_destroy_workqueue;
}
mvotg->op_regs =
@@ -806,9 +783,9 @@ static int mv_otg_probe(struct platform_device *pdev)
+ (readl(mvotg->cap_regs) & CAPLENGTH_MASK));
if (pdata->id) {
- retval = request_threaded_irq(pdata->id->irq, NULL,
- mv_otg_inputs_irq,
- IRQF_ONESHOT, "id", mvotg);
+ retval = devm_request_threaded_irq(&pdev->dev, pdata->id->irq,
+ NULL, mv_otg_inputs_irq,
+ IRQF_ONESHOT, "id", mvotg);
if (retval) {
dev_info(&pdev->dev,
"Failed to request irq for ID\n");
@@ -818,9 +795,9 @@ static int mv_otg_probe(struct platform_device *pdev)
if (pdata->vbus) {
mvotg->clock_gating = 1;
- retval = request_threaded_irq(pdata->vbus->irq, NULL,
- mv_otg_inputs_irq,
- IRQF_ONESHOT, "vbus", mvotg);
+ retval = devm_request_threaded_irq(&pdev->dev, pdata->vbus->irq,
+ NULL, mv_otg_inputs_irq,
+ IRQF_ONESHOT, "vbus", mvotg);
if (retval) {
dev_info(&pdev->dev,
"Failed to request irq for VBUS, "
@@ -844,7 +821,7 @@ static int mv_otg_probe(struct platform_device *pdev)
}
mvotg->irq = r->start;
- if (request_irq(mvotg->irq, mv_otg_irq, IRQF_SHARED,
+ if (devm_request_irq(&pdev->dev, mvotg->irq, mv_otg_irq, IRQF_SHARED,
driver_name, mvotg)) {
dev_err(&pdev->dev, "Request irq %d for OTG failed\n",
mvotg->irq);
@@ -857,14 +834,14 @@ static int mv_otg_probe(struct platform_device *pdev)
if (retval < 0) {
dev_err(&pdev->dev, "can't register transceiver, %d\n",
retval);
- goto err_free_irq;
+ goto err_disable_clk;
}
retval = sysfs_create_group(&pdev->dev.kobj, &inputs_attr_group);
if (retval < 0) {
dev_dbg(&pdev->dev,
"Can't register sysfs attr group: %d\n", retval);
- goto err_set_transceiver;
+ goto err_remove_phy;
}
spin_lock_init(&mvotg->wq_lock);
@@ -879,30 +856,15 @@ static int mv_otg_probe(struct platform_device *pdev)
return 0;
-err_set_transceiver:
+err_remove_phy:
usb_remove_phy(&mvotg->phy);
-err_free_irq:
- free_irq(mvotg->irq, mvotg);
err_disable_clk:
- if (pdata->vbus)
- free_irq(pdata->vbus->irq, mvotg);
- if (pdata->id)
- free_irq(pdata->id->irq, mvotg);
mv_otg_disable_internal(mvotg);
-err_unmap_capreg:
- iounmap(mvotg->cap_regs);
-err_unmap_phyreg:
- iounmap(mvotg->phy_regs);
err_destroy_workqueue:
flush_workqueue(mvotg->qwork);
destroy_workqueue(mvotg->qwork);
-err_put_clk:
- for (clk_i--; clk_i >= 0; clk_i--)
- clk_put(mvotg->clk[clk_i]);
platform_set_drvdata(pdev, NULL);
- kfree(otg);
- kfree(mvotg);
return retval;
}
--
1.7.4.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 05/29] usb: otg: mv_otg: fix the clk APIs
2012-11-22 2:04 [PATCH 01/29] usb: gadget: mv_udc: use udc_start and udc_stop functions Chao Xie
` (2 preceding siblings ...)
2012-11-22 2:04 ` [PATCH 04/29] usb: otg: mv_otg: use devm_xxx for probe Chao Xie
@ 2012-11-22 2:04 ` Chao Xie
2012-11-22 2:04 ` [PATCH 06/29] usb: host: ehci-mv: fix " Chao Xie
` (23 subsequent siblings)
27 siblings, 0 replies; 30+ messages in thread
From: Chao Xie @ 2012-11-22 2:04 UTC (permalink / raw)
To: linux-arm-kernel
From: Chao Xie <chao.xie@marvell.com>
Signed-off-by: Chao Xie <xiechao.mail@gmail.com>
---
drivers/usb/otg/mv_otg.c | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/usb/otg/mv_otg.c b/drivers/usb/otg/mv_otg.c
index 70e222d..ffc0689 100644
--- a/drivers/usb/otg/mv_otg.c
+++ b/drivers/usb/otg/mv_otg.c
@@ -240,7 +240,7 @@ static void otg_clock_enable(struct mv_otg *mvotg)
unsigned int i;
for (i = 0; i < mvotg->clknum; i++)
- clk_enable(mvotg->clk[i]);
+ clk_prepare_enable(mvotg->clk[i]);
}
static void otg_clock_disable(struct mv_otg *mvotg)
@@ -248,7 +248,7 @@ static void otg_clock_disable(struct mv_otg *mvotg)
unsigned int i;
for (i = 0; i < mvotg->clknum; i++)
- clk_disable(mvotg->clk[i]);
+ clk_disable_unprepare(mvotg->clk[i]);
}
static int mv_otg_enable_internal(struct mv_otg *mvotg)
--
1.7.4.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 06/29] usb: host: ehci-mv: fix clk APIs
2012-11-22 2:04 [PATCH 01/29] usb: gadget: mv_udc: use udc_start and udc_stop functions Chao Xie
` (3 preceding siblings ...)
2012-11-22 2:04 ` [PATCH 05/29] usb: otg: mv_otg: fix the clk APIs Chao Xie
@ 2012-11-22 2:04 ` Chao Xie
2012-11-23 16:06 ` Alan Stern
2012-11-22 2:04 ` [PATCH 07/29] usb: host: ehci-mv: remove unused variable Chao Xie
` (22 subsequent siblings)
27 siblings, 1 reply; 30+ messages in thread
From: Chao Xie @ 2012-11-22 2:04 UTC (permalink / raw)
To: linux-arm-kernel
From: Chao Xie <chao.xie@marvell.com>
Signed-off-by: Chao Xie <xiechao.mail@gmail.com>
---
drivers/usb/host/ehci-mv.c | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/usb/host/ehci-mv.c b/drivers/usb/host/ehci-mv.c
index f7bfc0b..6c56297 100644
--- a/drivers/usb/host/ehci-mv.c
+++ b/drivers/usb/host/ehci-mv.c
@@ -43,7 +43,7 @@ static void ehci_clock_enable(struct ehci_hcd_mv *ehci_mv)
unsigned int i;
for (i = 0; i < ehci_mv->clknum; i++)
- clk_enable(ehci_mv->clk[i]);
+ clk_prepare_enable(ehci_mv->clk[i]);
}
static void ehci_clock_disable(struct ehci_hcd_mv *ehci_mv)
@@ -51,7 +51,7 @@ static void ehci_clock_disable(struct ehci_hcd_mv *ehci_mv)
unsigned int i;
for (i = 0; i < ehci_mv->clknum; i++)
- clk_disable(ehci_mv->clk[i]);
+ clk_disable_unprepare(ehci_mv->clk[i]);
}
static int mv_ehci_enable(struct ehci_hcd_mv *ehci_mv)
--
1.7.4.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 07/29] usb: host: ehci-mv: remove unused variable
2012-11-22 2:04 [PATCH 01/29] usb: gadget: mv_udc: use udc_start and udc_stop functions Chao Xie
` (4 preceding siblings ...)
2012-11-22 2:04 ` [PATCH 06/29] usb: host: ehci-mv: fix " Chao Xie
@ 2012-11-22 2:04 ` Chao Xie
2012-11-22 2:04 ` [PATCH 08/29] usb: gadget: mv_udc: fix the value of tranceiver Chao Xie
` (21 subsequent siblings)
27 siblings, 0 replies; 30+ messages in thread
From: Chao Xie @ 2012-11-22 2:04 UTC (permalink / raw)
To: linux-arm-kernel
From: Chao Xie <chao.xie@marvell.com>
Signed-off-by: Chao Xie <xiechao.mail@gmail.com>
---
drivers/usb/host/ehci-mv.c | 1 -
1 files changed, 0 insertions(+), 1 deletions(-)
diff --git a/drivers/usb/host/ehci-mv.c b/drivers/usb/host/ehci-mv.c
index 6c56297..3065809 100644
--- a/drivers/usb/host/ehci-mv.c
+++ b/drivers/usb/host/ehci-mv.c
@@ -302,7 +302,6 @@ static int mv_ehci_remove(struct platform_device *pdev)
{
struct ehci_hcd_mv *ehci_mv = platform_get_drvdata(pdev);
struct usb_hcd *hcd = ehci_mv->hcd;
- int clk_i;
if (hcd->rh_registered)
usb_remove_hcd(hcd);
--
1.7.4.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 08/29] usb: gadget: mv_udc: fix the value of tranceiver
2012-11-22 2:04 [PATCH 01/29] usb: gadget: mv_udc: use udc_start and udc_stop functions Chao Xie
` (5 preceding siblings ...)
2012-11-22 2:04 ` [PATCH 07/29] usb: host: ehci-mv: remove unused variable Chao Xie
@ 2012-11-22 2:04 ` Chao Xie
2012-11-22 2:04 ` [PATCH 09/29] usb: phy: mv_usb2: add PHY driver for marvell usb2 controller Chao Xie
` (20 subsequent siblings)
27 siblings, 0 replies; 30+ messages in thread
From: Chao Xie @ 2012-11-22 2:04 UTC (permalink / raw)
To: linux-arm-kernel
From: Chao Xie <chao.xie@marvell.com>
Signed-off-by: Chao Xie <xiechao.mail@gmail.com>
---
drivers/usb/gadget/mv_udc_core.c | 15 ++++++++++-----
1 files changed, 10 insertions(+), 5 deletions(-)
diff --git a/drivers/usb/gadget/mv_udc_core.c b/drivers/usb/gadget/mv_udc_core.c
index c78d52f..c4adfeb 100644
--- a/drivers/usb/gadget/mv_udc_core.c
+++ b/drivers/usb/gadget/mv_udc_core.c
@@ -1394,7 +1394,7 @@ static int mv_udc_start(struct usb_gadget *gadget,
spin_unlock_irqrestore(&udc->lock, flags);
- if (!IS_ERR_OR_NULL(udc->transceiver)) {
+ if (udc->transceiver) {
retval = otg_set_peripheral(udc->transceiver->otg,
&udc->gadget);
if (retval) {
@@ -2174,9 +2174,14 @@ static int __devinit mv_udc_probe(struct platform_device *pdev)
udc->dev = pdev;
#ifdef CONFIG_USB_OTG_UTILS
- if (pdata->mode == MV_USB_MODE_OTG)
+ if (pdata->mode == MV_USB_MODE_OTG) {
udc->transceiver = devm_usb_get_phy(&pdev->dev,
USB_PHY_TYPE_USB2);
+ if (IS_ERR_OR_NULL(udc->transceiver)) {
+ udc->transceiver = NULL;
+ return -ENODEV;
+ }
+ }
#endif
udc->clknum = pdata->clknum;
@@ -2319,7 +2324,7 @@ static int __devinit mv_udc_probe(struct platform_device *pdev)
eps_init(udc);
/* VBUS detect: we can disable/enable clock on demand.*/
- if (!IS_ERR_OR_NULL(udc->transceiver))
+ if (udc->transceiver)
udc->clock_gating = 1;
else if (pdata->vbus) {
udc->clock_gating = 1;
@@ -2386,7 +2391,7 @@ static int mv_udc_suspend(struct device *dev)
udc = dev_get_drvdata(dev);
/* if OTG is enabled, the following will be done in OTG driver*/
- if (!IS_ERR_OR_NULL(udc->transceiver))
+ if (udc->transceiver)
return 0;
if (udc->pdata->vbus && udc->pdata->vbus->poll)
@@ -2421,7 +2426,7 @@ static int mv_udc_resume(struct device *dev)
udc = dev_get_drvdata(dev);
/* if OTG is enabled, the following will be done in OTG driver*/
- if (!IS_ERR_OR_NULL(udc->transceiver))
+ if (udc->transceiver)
return 0;
if (!udc->clock_gating) {
--
1.7.4.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 09/29] usb: phy: mv_usb2: add PHY driver for marvell usb2 controller
2012-11-22 2:04 [PATCH 01/29] usb: gadget: mv_udc: use udc_start and udc_stop functions Chao Xie
` (6 preceding siblings ...)
2012-11-22 2:04 ` [PATCH 08/29] usb: gadget: mv_udc: fix the value of tranceiver Chao Xie
@ 2012-11-22 2:04 ` Chao Xie
2012-11-22 2:04 ` [PATCH 10/29] usb: gadget: mv_udc: use PHY driver for udc Chao Xie
` (19 subsequent siblings)
27 siblings, 0 replies; 30+ messages in thread
From: Chao Xie @ 2012-11-22 2:04 UTC (permalink / raw)
To: linux-arm-kernel
From: Chao Xie <chao.xie@marvell.com>
The PHY driver will be used by marvell udc/otg/ehci
Signed-off-by: Chao Xie <xiechao.mail@gmail.com>
---
drivers/usb/phy/Kconfig | 7 +
drivers/usb/phy/Makefile | 1 +
drivers/usb/phy/mv_usb2_phy.c | 454 ++++++++++++++++++++++++++++++++++
include/linux/platform_data/mv_usb.h | 9 +-
include/linux/usb/mv_usb2.h | 35 +++
5 files changed, 503 insertions(+), 3 deletions(-)
create mode 100644 drivers/usb/phy/mv_usb2_phy.c
create mode 100644 include/linux/usb/mv_usb2.h
diff --git a/drivers/usb/phy/Kconfig b/drivers/usb/phy/Kconfig
index 63c339b..c28eef1 100644
--- a/drivers/usb/phy/Kconfig
+++ b/drivers/usb/phy/Kconfig
@@ -32,3 +32,10 @@ config MV_U3D_PHY
help
Enable this to support Marvell USB 3.0 phy controller for Marvell
SoC.
+
+config MV_USB2_PHY
+ bool "Marvell USB 2.0 PHY Driver"
+ depends on USB || USB_GADGET
+ help
+ Enable this to support Marvell USB 2.0 phy driver for Marvell
+ SoC.
diff --git a/drivers/usb/phy/Makefile b/drivers/usb/phy/Makefile
index b069f29..c5bae4a 100644
--- a/drivers/usb/phy/Makefile
+++ b/drivers/usb/phy/Makefile
@@ -8,3 +8,4 @@ obj-$(CONFIG_OMAP_USB2) += omap-usb2.o
obj-$(CONFIG_USB_ISP1301) += isp1301.o
obj-$(CONFIG_MV_U3D_PHY) += mv_u3d_phy.o
obj-$(CONFIG_USB_EHCI_TEGRA) += tegra_usb_phy.o
+obj-$(CONFIG_MV_USB2_PHY) += mv_usb2_phy.o
diff --git a/drivers/usb/phy/mv_usb2_phy.c b/drivers/usb/phy/mv_usb2_phy.c
new file mode 100644
index 0000000..ed82bf3
--- /dev/null
+++ b/drivers/usb/phy/mv_usb2_phy.c
@@ -0,0 +1,454 @@
+/*
+ * Copyright (C) 2010 Google, Inc.
+ *
+ * Author:
+ * Chao Xie <xiechao.mail@gmail.com>
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#include <linux/resource.h>
+#include <linux/delay.h>
+#include <linux/slab.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
+#include <linux/io.h>
+#include <linux/err.h>
+#include <linux/clk.h>
+#include <linux/export.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/platform_data/mv_usb.h>
+#include <linux/usb/mv_usb2.h>
+
+/* phy regs */
+#define UTMI_REVISION 0x0
+#define UTMI_CTRL 0x4
+#define UTMI_PLL 0x8
+#define UTMI_TX 0xc
+#define UTMI_RX 0x10
+#define UTMI_IVREF 0x14
+#define UTMI_T0 0x18
+#define UTMI_T1 0x1c
+#define UTMI_T2 0x20
+#define UTMI_T3 0x24
+#define UTMI_T4 0x28
+#define UTMI_T5 0x2c
+#define UTMI_RESERVE 0x30
+#define UTMI_USB_INT 0x34
+#define UTMI_DBG_CTL 0x38
+#define UTMI_OTG_ADDON 0x3c
+
+/* For UTMICTRL Register */
+#define UTMI_CTRL_USB_CLK_EN (1 << 31)
+/* pxa168 */
+#define UTMI_CTRL_SUSPEND_SET1 (1 << 30)
+#define UTMI_CTRL_SUSPEND_SET2 (1 << 29)
+#define UTMI_CTRL_RXBUF_PDWN (1 << 24)
+#define UTMI_CTRL_TXBUF_PDWN (1 << 11)
+
+#define UTMI_CTRL_INPKT_DELAY_SHIFT 30
+#define UTMI_CTRL_INPKT_DELAY_SOF_SHIFT 28
+#define UTMI_CTRL_PU_REF_SHIFT 20
+#define UTMI_CTRL_ARC_PULLDN_SHIFT 12
+#define UTMI_CTRL_PLL_PWR_UP_SHIFT 1
+#define UTMI_CTRL_PWR_UP_SHIFT 0
+
+/* For UTMI_PLL Register */
+#define UTMI_PLL_PLLCALI12_SHIFT 29
+#define UTMI_PLL_PLLCALI12_MASK (0x3 << 29)
+
+#define UTMI_PLL_PLLVDD18_SHIFT 27
+#define UTMI_PLL_PLLVDD18_MASK (0x3 << 27)
+
+#define UTMI_PLL_PLLVDD12_SHIFT 25
+#define UTMI_PLL_PLLVDD12_MASK (0x3 << 25)
+
+#define UTMI_PLL_CLK_BLK_EN_SHIFT 24
+#define CLK_BLK_EN (0x1 << 24)
+#define PLL_READY (0x1 << 23)
+#define KVCO_EXT (0x1 << 22)
+#define VCOCAL_START (0x1 << 21)
+
+#define UTMI_PLL_KVCO_SHIFT 15
+#define UTMI_PLL_KVCO_MASK (0x7 << 15)
+
+#define UTMI_PLL_ICP_SHIFT 12
+#define UTMI_PLL_ICP_MASK (0x7 << 12)
+
+#define UTMI_PLL_FBDIV_SHIFT 4
+#define UTMI_PLL_FBDIV_MASK (0xFF << 4)
+
+#define UTMI_PLL_REFDIV_SHIFT 0
+#define UTMI_PLL_REFDIV_MASK (0xF << 0)
+
+/* For UTMI_TX Register */
+#define UTMI_TX_REG_EXT_FS_RCAL_SHIFT 27
+#define UTMI_TX_REG_EXT_FS_RCAL_MASK (0xf << 27)
+
+#define UTMI_TX_REG_EXT_FS_RCAL_EN_SHIFT 26
+#define UTMI_TX_REG_EXT_FS_RCAL_EN_MASK (0x1 << 26)
+
+#define UTMI_TX_TXVDD12_SHIFT 22
+#define UTMI_TX_TXVDD12_MASK (0x3 << 22)
+
+#define UTMI_TX_CK60_PHSEL_SHIFT 17
+#define UTMI_TX_CK60_PHSEL_MASK (0xf << 17)
+
+#define UTMI_TX_IMPCAL_VTH_SHIFT 14
+#define UTMI_TX_IMPCAL_VTH_MASK (0x7 << 14)
+
+#define REG_RCAL_START (0x1 << 12)
+
+#define UTMI_TX_LOW_VDD_EN_SHIFT 11
+
+#define UTMI_TX_AMP_SHIFT 0
+#define UTMI_TX_AMP_MASK (0x7 << 0)
+
+/* For UTMI_RX Register */
+#define UTMI_REG_SQ_LENGTH_SHIFT 15
+#define UTMI_REG_SQ_LENGTH_MASK (0x3 << 15)
+
+#define UTMI_RX_SQ_THRESH_SHIFT 4
+#define UTMI_RX_SQ_THRESH_MASK (0xf << 4)
+
+#define UTMI_OTG_ADDON_OTG_ON (1 << 0)
+
+enum mv_usb2_phy_type {
+ PXA168_USB,
+ PXA910_USB,
+ MMP2_USB,
+};
+
+static struct mv_usb2_phy *the_phy;
+
+struct mv_usb2_phy *mv_usb2_get_phy(void)
+{
+ return the_phy;
+}
+EXPORT_SYMBOL(mv_usb2_get_phy);
+
+static unsigned int u2o_get(void __iomem *base, unsigned int offset)
+{
+ return readl_relaxed(base + offset);
+}
+
+static void u2o_set(void __iomem *base, unsigned int offset,
+ unsigned int value)
+{
+ u32 reg;
+
+ reg = readl_relaxed(base + offset);
+ reg |= value;
+ writel_relaxed(reg, base + offset);
+ readl_relaxed(base + offset);
+}
+
+static void u2o_clear(void __iomem *base, unsigned int offset,
+ unsigned int value)
+{
+ u32 reg;
+
+ reg = readl_relaxed(base + offset);
+ reg &= ~value;
+ writel_relaxed(reg, base + offset);
+ readl_relaxed(base + offset);
+}
+
+static void u2o_write(void __iomem *base, unsigned int offset,
+ unsigned int value)
+{
+ writel_relaxed(value, base + offset);
+ readl_relaxed(base + offset);
+}
+
+static int _usb_phy_init(struct mv_usb2_phy *mv_phy)
+{
+ struct platform_device *pdev = mv_phy->pdev;
+ unsigned int loops = 0;
+ void __iomem *base = mv_phy->base;
+
+ dev_dbg(&pdev->dev, "phy init\n");
+
+ /* Initialize the USB PHY power */
+ if (mv_phy->type == PXA910_USB) {
+ u2o_set(base, UTMI_CTRL, (1<<UTMI_CTRL_INPKT_DELAY_SOF_SHIFT)
+ | (1<<UTMI_CTRL_PU_REF_SHIFT));
+ }
+
+ u2o_set(base, UTMI_CTRL, 1<<UTMI_CTRL_PLL_PWR_UP_SHIFT);
+ u2o_set(base, UTMI_CTRL, 1<<UTMI_CTRL_PWR_UP_SHIFT);
+
+ /* UTMI_PLL settings */
+ u2o_clear(base, UTMI_PLL, UTMI_PLL_PLLVDD18_MASK
+ | UTMI_PLL_PLLVDD12_MASK | UTMI_PLL_PLLCALI12_MASK
+ | UTMI_PLL_FBDIV_MASK | UTMI_PLL_REFDIV_MASK
+ | UTMI_PLL_ICP_MASK | UTMI_PLL_KVCO_MASK);
+
+ u2o_set(base, UTMI_PLL, 0xee<<UTMI_PLL_FBDIV_SHIFT
+ | 0xb<<UTMI_PLL_REFDIV_SHIFT | 3<<UTMI_PLL_PLLVDD18_SHIFT
+ | 3<<UTMI_PLL_PLLVDD12_SHIFT | 3<<UTMI_PLL_PLLCALI12_SHIFT
+ | 1<<UTMI_PLL_ICP_SHIFT | 3<<UTMI_PLL_KVCO_SHIFT);
+
+ /* UTMI_TX */
+ u2o_clear(base, UTMI_TX, UTMI_TX_REG_EXT_FS_RCAL_EN_MASK
+ | UTMI_TX_TXVDD12_MASK | UTMI_TX_CK60_PHSEL_MASK
+ | UTMI_TX_IMPCAL_VTH_MASK | UTMI_TX_REG_EXT_FS_RCAL_MASK
+ | UTMI_TX_AMP_MASK);
+ u2o_set(base, UTMI_TX, 3<<UTMI_TX_TXVDD12_SHIFT
+ | 4<<UTMI_TX_CK60_PHSEL_SHIFT | 4<<UTMI_TX_IMPCAL_VTH_SHIFT
+ | 8<<UTMI_TX_REG_EXT_FS_RCAL_SHIFT | 3<<UTMI_TX_AMP_SHIFT);
+
+ /* UTMI_RX */
+ u2o_clear(base, UTMI_RX, UTMI_RX_SQ_THRESH_MASK
+ | UTMI_REG_SQ_LENGTH_MASK);
+ u2o_set(base, UTMI_RX, 7<<UTMI_RX_SQ_THRESH_SHIFT
+ | 2<<UTMI_REG_SQ_LENGTH_SHIFT);
+
+ /* UTMI_IVREF */
+ if (mv_phy->type == PXA168_USB)
+ /* fixing Microsoft Altair board interface with NEC hub issue -
+ * Set UTMI_IVREF from 0x4a3 to 0x4bf */
+ u2o_write(base, UTMI_IVREF, 0x4bf);
+
+ /* toggle VCOCAL_START bit of UTMI_PLL */
+ udelay(200);
+ u2o_set(base, UTMI_PLL, VCOCAL_START);
+ udelay(40);
+ u2o_clear(base, UTMI_PLL, VCOCAL_START);
+
+ /* toggle REG_RCAL_START bit of UTMI_TX */
+ udelay(400);
+ u2o_set(base, UTMI_TX, REG_RCAL_START);
+ udelay(40);
+ u2o_clear(base, UTMI_TX, REG_RCAL_START);
+ udelay(400);
+
+ /* Make sure PHY PLL is ready */
+ loops = 0;
+ while ((u2o_get(base, UTMI_PLL) & PLL_READY) == 0) {
+ mdelay(1);
+ loops++;
+ if (loops > 100) {
+ dev_warn(&pdev->dev, "calibrate timeout, UTMI_PLL %x\n",
+ u2o_get(base, UTMI_PLL));
+ break;
+ }
+ }
+
+ if (mv_phy->type == PXA168_USB) {
+ u2o_set(base, UTMI_RESERVE, 1 << 5);
+ /* Turn on UTMI PHY OTG extension */
+ u2o_write(base, UTMI_OTG_ADDON, 1);
+ }
+
+ return 0;
+}
+
+static int _usb_phy_shutdown(struct mv_usb2_phy *mv_phy)
+{
+ void __iomem *base = mv_phy->base;
+
+ if (mv_phy->type == PXA168_USB)
+ u2o_clear(base, UTMI_OTG_ADDON, UTMI_OTG_ADDON_OTG_ON);
+
+ u2o_clear(base, UTMI_CTRL, UTMI_CTRL_RXBUF_PDWN);
+ u2o_clear(base, UTMI_CTRL, UTMI_CTRL_TXBUF_PDWN);
+ u2o_clear(base, UTMI_CTRL, UTMI_CTRL_USB_CLK_EN);
+ u2o_clear(base, UTMI_CTRL, 1<<UTMI_CTRL_PWR_UP_SHIFT);
+ u2o_clear(base, UTMI_CTRL, 1<<UTMI_CTRL_PLL_PWR_UP_SHIFT);
+
+ return 0;
+}
+
+static int usb_phy_init(struct mv_usb2_phy *mv_phy)
+{
+ int i = 0;
+
+ mutex_lock(&mv_phy->phy_lock);
+ if (mv_phy->refcount++ == 0) {
+ for (i = 0; i < mv_phy->clks_num; i++)
+ clk_prepare_enable(mv_phy->clks[i]);
+ _usb_phy_init(mv_phy);
+ }
+ mutex_unlock(&mv_phy->phy_lock);
+ return 0;
+}
+
+static void usb_phy_shutdown(struct mv_usb2_phy *mv_phy)
+{
+ int i = 0;
+
+ mutex_lock(&mv_phy->phy_lock);
+ if (mv_phy->refcount++ == 0) {
+ _usb_phy_shutdown(mv_phy);
+ for (i = 0; i < mv_phy->clks_num; i++)
+ clk_disable_unprepare(mv_phy->clks[i]);
+ }
+ mutex_unlock(&mv_phy->phy_lock);
+}
+
+static struct of_device_id usb_phy_dt_ids[] = {
+ { .compatible = "mrvl,pxa168-usb-phy", .data = (void *)PXA168_USB},
+ { .compatible = "mrvl,pxa910-usb-phy", .data = (void *)PXA910_USB},
+ { .compatible = "mrvl,mmp2-usb-phy", .data = (void *)MMP2_USB},
+ {}
+};
+MODULE_DEVICE_TABLE(of, usb_phy_dt_ids);
+
+static int __devinit usb_phy_parse_dt(struct platform_device *pdev,
+ struct mv_usb2_phy *mv_phy)
+{
+ struct device_node *np = pdev->dev.of_node;
+ const struct of_device_id *of_id =
+ of_match_device(usb_phy_dt_ids, &pdev->dev);
+ unsigned int clks_num;
+ int i, ret;
+ const char *clk_name;
+
+ if (!np)
+ return 1;
+
+ clks_num = of_property_count_strings(np, "clocks");
+ if (clks_num < 0) {
+ dev_err(&pdev->dev, "failed to get clock number\n");
+ return clks_num;
+ }
+
+ mv_phy->clks = devm_kzalloc(&pdev->dev,
+ sizeof(struct clk *) * clks_num, GFP_KERNEL);
+ if (mv_phy->clks == NULL) {
+ dev_err(&pdev->dev,
+ "failed to allocate mempory for clocks");
+ return -ENOMEM;
+ }
+
+ for (i = 0; i < clks_num; i++) {
+ ret = of_property_read_string_index(np, "clocks", i,
+ &clk_name);
+ if (ret) {
+ dev_err(&pdev->dev, "failed to read clocks\n");
+ return ret;
+ }
+ mv_phy->clks[i] = devm_clk_get(&pdev->dev, clk_name);
+ if (IS_ERR(mv_phy->clks[i])) {
+ dev_err(&pdev->dev, "failed to get clock %s\n",
+ clk_name);
+ return PTR_ERR(mv_phy->clks[i]);
+ }
+ }
+
+ mv_phy->clks_num = clks_num;
+ mv_phy->type = (unsigned int)(of_id->data);
+
+ return 0;
+}
+
+static int __devinit usb_phy_probe(struct platform_device *pdev)
+{
+ struct mv_usb2_phy *mv_phy;
+ struct resource *r;
+ int ret, i;
+
+ mv_phy = devm_kzalloc(&pdev->dev, sizeof(*mv_phy), GFP_KERNEL);
+ if (mv_phy == NULL) {
+ dev_err(&pdev->dev, "failed to allocate memory\n");
+ return -ENOMEM;
+ }
+ mutex_init(&mv_phy->phy_lock);
+
+ ret = usb_phy_parse_dt(pdev, mv_phy);
+ /* no CONFIG_OF */
+ if (ret > 0) {
+ struct mv_usb_phy_platform_data *pdata
+ = pdev->dev.platform_data;
+ const struct platform_device_id *id
+ = platform_get_device_id(pdev);
+
+ if (pdata == NULL || id == NULL) {
+ dev_err(&pdev->dev,
+ "missing platform_data or id_entry\n");
+ return -ENODEV;
+ }
+ mv_phy->type = (unsigned int)(id->driver_data);
+ mv_phy->clks_num = pdata->clknum;
+ mv_phy->clks = devm_kzalloc(&pdev->dev,
+ sizeof(struct clk *) * mv_phy->clks_num, GFP_KERNEL);
+ if (mv_phy->clks == NULL) {
+ dev_err(&pdev->dev,
+ "failed to allocate mempory for clocks");
+ return -ENOMEM;
+ }
+ for (i = 0; i < mv_phy->clks_num; i++)
+ mv_phy->clks[i] = devm_clk_get(&pdev->dev,
+ pdata->clkname[i]);
+ if (IS_ERR(mv_phy->clks[i])) {
+ dev_err(&pdev->dev, "failed to get clock %s\n",
+ pdata->clkname[i]);
+ return PTR_ERR(mv_phy->clks[i]);
+ }
+ } else if (ret < 0) {
+ dev_err(&pdev->dev, "error parse dt\n");
+ return ret;
+ }
+ r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ if (r == NULL) {
+ dev_err(&pdev->dev, "no phy I/O memory resource defined\n");
+ return -ENODEV;
+ }
+ mv_phy->base = devm_ioremap(&pdev->dev, r->start, resource_size(r));
+ if (mv_phy->base == NULL) {
+ dev_err(&pdev->dev, "error map register base\n");
+ return -EBUSY;
+ }
+ platform_set_drvdata(pdev, mv_phy);
+ mv_phy->pdev = pdev;
+ mv_phy->init = usb_phy_init;
+ mv_phy->shutdown = usb_phy_shutdown;
+
+ platform_set_drvdata(pdev, mv_phy);
+
+ the_phy = mv_phy;
+
+ dev_info(&pdev->dev, "mv usb2 phy initialized\n");
+
+ return 0;
+}
+
+static int __devexit usb_phy_remove(struct platform_device *pdev)
+{
+ the_phy = NULL;
+
+ return 0;
+}
+
+static struct platform_device_id usb_phy_ids[] = {
+ { .name = "pxa168-usb-phy", .driver_data = PXA168_USB },
+ { .name = "pxa910-usb-phy", .driver_data = PXA910_USB },
+ { .name = "mmp2-usb-phy", .driver_data = MMP2_USB },
+ {}
+};
+
+static struct platform_driver usb_phy_driver = {
+ .probe = usb_phy_probe,
+ .remove = usb_phy_remove,
+ .driver = {
+ .name = "pxa168-usb-phy",
+ .of_match_table = usb_phy_dt_ids,
+ },
+ .id_table = usb_phy_ids,
+};
+
+static int __init mv_usb2_phy_init(void)
+{
+ return platform_driver_register(&usb_phy_driver);
+}
+arch_initcall(mv_usb2_phy_init);
diff --git a/include/linux/platform_data/mv_usb.h b/include/linux/platform_data/mv_usb.h
index 944b01d..fd3d1b4 100644
--- a/include/linux/platform_data/mv_usb.h
+++ b/include/linux/platform_data/mv_usb.h
@@ -47,9 +47,12 @@ struct mv_usb_platform_data {
/* Force a_bus_req to be asserted */
unsigned int otg_force_a_bus_req:1;
- int (*phy_init)(void __iomem *regbase);
- void (*phy_deinit)(void __iomem *regbase);
int (*set_vbus)(unsigned int vbus);
- int (*private_init)(void __iomem *opregs, void __iomem *phyregs);
};
+
+struct mv_usb_phy_platform_data {
+ unsigned int clknum;
+ char **clkname;
+};
+
#endif
diff --git a/include/linux/usb/mv_usb2.h b/include/linux/usb/mv_usb2.h
new file mode 100644
index 0000000..5d3d7bd
--- /dev/null
+++ b/include/linux/usb/mv_usb2.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2012 Marvell Inc.
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#ifndef __MV_USB2_H
+#define __MV_USB2_H
+
+#include <linux/clk.h>
+
+struct mv_usb2_phy {
+ struct platform_device *pdev;
+ struct mutex phy_lock;
+ unsigned int refcount;
+ unsigned int type;
+ void __iomem *base;
+ struct clk **clks;
+ unsigned int clks_num;
+
+ int (*init)(struct mv_usb2_phy *mv_phy);
+ void (*shutdown)(struct mv_usb2_phy *mv_phy);
+};
+
+struct mv_usb2_phy *mv_usb2_get_phy(void);
+
+#endif
--
1.7.4.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 10/29] usb: gadget: mv_udc: use PHY driver for udc
2012-11-22 2:04 [PATCH 01/29] usb: gadget: mv_udc: use udc_start and udc_stop functions Chao Xie
` (7 preceding siblings ...)
2012-11-22 2:04 ` [PATCH 09/29] usb: phy: mv_usb2: add PHY driver for marvell usb2 controller Chao Xie
@ 2012-11-22 2:04 ` Chao Xie
2012-11-22 2:04 ` [PATCH 11/29] usb: ehci: ehci-mv: use PHY driver for ehci Chao Xie
` (18 subsequent siblings)
27 siblings, 0 replies; 30+ messages in thread
From: Chao Xie @ 2012-11-22 2:04 UTC (permalink / raw)
To: linux-arm-kernel
From: Chao Xie <chao.xie@marvell.com>
It will get rid of the callbacks in pdata for phy init/shutdown
Signed-off-by: Chao Xie <xiechao.mail@gmail.com>
---
drivers/usb/gadget/mv_udc.h | 2 +-
drivers/usb/gadget/mv_udc_core.c | 23 ++++++++---------------
2 files changed, 9 insertions(+), 16 deletions(-)
diff --git a/drivers/usb/gadget/mv_udc.h b/drivers/usb/gadget/mv_udc.h
index 9073436..4851b2b 100644
--- a/drivers/usb/gadget/mv_udc.h
+++ b/drivers/usb/gadget/mv_udc.h
@@ -180,7 +180,6 @@ struct mv_udc {
struct mv_cap_regs __iomem *cap_regs;
struct mv_op_regs __iomem *op_regs;
- void __iomem *phy_regs;
unsigned int max_eps;
struct mv_dqh *ep_dqh;
size_t ep_dqh_size;
@@ -217,6 +216,7 @@ struct mv_udc {
struct work_struct vbus_work;
struct workqueue_struct *qwork;
+ struct mv_usb2_phy *phy;
struct usb_phy *transceiver;
struct mv_usb_platform_data *pdata;
diff --git a/drivers/usb/gadget/mv_udc_core.c b/drivers/usb/gadget/mv_udc_core.c
index c4adfeb..6f01d5e 100644
--- a/drivers/usb/gadget/mv_udc_core.c
+++ b/drivers/usb/gadget/mv_udc_core.c
@@ -35,6 +35,7 @@
#include <linux/platform_device.h>
#include <linux/clk.h>
#include <linux/platform_data/mv_usb.h>
+#include <linux/usb/mv_usb2.h>
#include <asm/unaligned.h>
#include "mv_udc.h"
@@ -1121,8 +1122,8 @@ static int mv_udc_enable_internal(struct mv_udc *udc)
dev_dbg(&udc->dev->dev, "enable udc\n");
udc_clock_enable(udc);
- if (udc->pdata->phy_init) {
- retval = udc->pdata->phy_init(udc->phy_regs);
+ if (udc->phy->init) {
+ retval = udc->phy->init(udc->phy);
if (retval) {
dev_err(&udc->dev->dev,
"init phy error %d\n", retval);
@@ -1147,8 +1148,8 @@ static void mv_udc_disable_internal(struct mv_udc *udc)
{
if (udc->active) {
dev_dbg(&udc->dev->dev, "disable udc\n");
- if (udc->pdata->phy_deinit)
- udc->pdata->phy_deinit(udc->phy_regs);
+ if (udc->phy->shutdown)
+ udc->phy->shutdown(udc->phy);
udc_clock_disable(udc);
udc->active = 0;
}
@@ -2194,7 +2195,7 @@ static int __devinit mv_udc_probe(struct platform_device *pdev)
}
}
- r = platform_get_resource_byname(udc->dev, IORESOURCE_MEM, "capregs");
+ r = platform_get_resource(udc->dev, IORESOURCE_MEM, 0);
if (r == NULL) {
dev_err(&pdev->dev, "no I/O memory resource defined\n");
return -ENODEV;
@@ -2207,17 +2208,9 @@ static int __devinit mv_udc_probe(struct platform_device *pdev)
return -EBUSY;
}
- r = platform_get_resource_byname(udc->dev, IORESOURCE_MEM, "phyregs");
- if (r == NULL) {
- dev_err(&pdev->dev, "no phy I/O memory resource defined\n");
+ udc->phy = mv_usb2_get_phy();
+ if (udc->phy == NULL)
return -ENODEV;
- }
-
- udc->phy_regs = ioremap(r->start, resource_size(r));
- if (udc->phy_regs == NULL) {
- dev_err(&pdev->dev, "failed to map phy I/O memory\n");
- return -EBUSY;
- }
/* we will acces controller register, so enable the clk */
retval = mv_udc_enable_internal(udc);
--
1.7.4.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 11/29] usb: ehci: ehci-mv: use PHY driver for ehci
2012-11-22 2:04 [PATCH 01/29] usb: gadget: mv_udc: use udc_start and udc_stop functions Chao Xie
` (8 preceding siblings ...)
2012-11-22 2:04 ` [PATCH 10/29] usb: gadget: mv_udc: use PHY driver for udc Chao Xie
@ 2012-11-22 2:04 ` Chao Xie
2012-11-22 2:04 ` [PATCH 12/29] usb: otg: mv_otg: use PHY driver for otg Chao Xie
` (17 subsequent siblings)
27 siblings, 0 replies; 30+ messages in thread
From: Chao Xie @ 2012-11-22 2:04 UTC (permalink / raw)
To: linux-arm-kernel
From: Chao Xie <chao.xie@marvell.com>
Signed-off-by: Chao Xie <xiechao.mail@gmail.com>
---
drivers/usb/host/ehci-mv.c | 37 +++++++++++++------------------------
1 files changed, 13 insertions(+), 24 deletions(-)
diff --git a/drivers/usb/host/ehci-mv.c b/drivers/usb/host/ehci-mv.c
index 3065809..be504fd 100644
--- a/drivers/usb/host/ehci-mv.c
+++ b/drivers/usb/host/ehci-mv.c
@@ -15,17 +15,18 @@
#include <linux/clk.h>
#include <linux/err.h>
#include <linux/usb/otg.h>
+#include <linux/usb/mv_usb2.h>
#include <linux/platform_data/mv_usb.h>
#define CAPLENGTH_MASK (0xff)
struct ehci_hcd_mv {
struct usb_hcd *hcd;
+ struct mv_usb2_phy *mvphy;
/* Which mode does this ehci running OTG/Host ? */
int mode;
- void __iomem *phy_regs;
void __iomem *cap_regs;
void __iomem *op_regs;
@@ -59,8 +60,8 @@ static int mv_ehci_enable(struct ehci_hcd_mv *ehci_mv)
int retval;
ehci_clock_enable(ehci_mv);
- if (ehci_mv->pdata->phy_init) {
- retval = ehci_mv->pdata->phy_init(ehci_mv->phy_regs);
+ if (ehci_mv->mvphy->init) {
+ retval = ehci_mv->mvphy->init(ehci_mv->mvphy);
if (retval)
return retval;
}
@@ -70,8 +71,8 @@ static int mv_ehci_enable(struct ehci_hcd_mv *ehci_mv)
static void mv_ehci_disable(struct ehci_hcd_mv *ehci_mv)
{
- if (ehci_mv->pdata->phy_deinit)
- ehci_mv->pdata->phy_deinit(ehci_mv->phy_regs);
+ if (ehci_mv->mvphy->shutdown)
+ ehci_mv->mvphy->shutdown(ehci_mv->mvphy);
ehci_clock_disable(ehci_mv);
}
@@ -184,22 +185,7 @@ static int mv_ehci_probe(struct platform_device *pdev)
}
}
- r = platform_get_resource_byname(pdev, IORESOURCE_MEM, "phyregs");
- if (r == NULL) {
- dev_err(&pdev->dev, "no phy I/O memory resource defined\n");
- retval = -ENODEV;
- goto err_clear_drvdata;
- }
-
- ehci_mv->phy_regs = devm_ioremap(&pdev->dev, r->start,
- resource_size(r));
- if (ehci_mv->phy_regs == 0) {
- dev_err(&pdev->dev, "failed to map phy I/O memory\n");
- retval = -EFAULT;
- goto err_clear_drvdata;
- }
-
- r = platform_get_resource_byname(pdev, IORESOURCE_MEM, "capregs");
+ r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!r) {
dev_err(&pdev->dev, "no I/O memory resource defined\n");
retval = -ENODEV;
@@ -214,6 +200,12 @@ static int mv_ehci_probe(struct platform_device *pdev)
goto err_clear_drvdata;
}
+ ehci_mv->mvphy = mv_usb2_get_phy();
+ if (ehci_mv->mvphy == NULL) {
+ retval = -ENODEV;
+ goto err_clear_drvdata;
+ }
+
retval = mv_ehci_enable(ehci_mv);
if (retval) {
dev_err(&pdev->dev, "init phy error %d\n", retval);
@@ -275,9 +267,6 @@ static int mv_ehci_probe(struct platform_device *pdev)
}
}
- if (pdata->private_init)
- pdata->private_init(ehci_mv->op_regs, ehci_mv->phy_regs);
-
dev_info(&pdev->dev,
"successful find EHCI device with regs 0x%p irq %d"
" working in %s mode\n", hcd->regs, hcd->irq,
--
1.7.4.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 12/29] usb: otg: mv_otg: use PHY driver for otg
2012-11-22 2:04 [PATCH 01/29] usb: gadget: mv_udc: use udc_start and udc_stop functions Chao Xie
` (9 preceding siblings ...)
2012-11-22 2:04 ` [PATCH 11/29] usb: ehci: ehci-mv: use PHY driver for ehci Chao Xie
@ 2012-11-22 2:04 ` Chao Xie
2012-11-22 2:04 ` [PATCH 13/29] arm: mmp2: change the defintion of usb devices Chao Xie
` (16 subsequent siblings)
27 siblings, 0 replies; 30+ messages in thread
From: Chao Xie @ 2012-11-22 2:04 UTC (permalink / raw)
To: linux-arm-kernel
From: Chao Xie <chao.xie@marvell.com>
Signed-off-by: Chao Xie <xiechao.mail@gmail.com>
---
drivers/usb/otg/mv_otg.c | 33 ++++++++++++---------------------
drivers/usb/otg/mv_otg.h | 2 +-
2 files changed, 13 insertions(+), 22 deletions(-)
diff --git a/drivers/usb/otg/mv_otg.c b/drivers/usb/otg/mv_otg.c
index ffc0689..344f246 100644
--- a/drivers/usb/otg/mv_otg.c
+++ b/drivers/usb/otg/mv_otg.c
@@ -25,6 +25,7 @@
#include <linux/usb/otg.h>
#include <linux/usb/gadget.h>
#include <linux/usb/hcd.h>
+#include <linux/usb/mv_usb2.h>
#include <linux/platform_data/mv_usb.h>
#include "mv_otg.h"
@@ -261,8 +262,8 @@ static int mv_otg_enable_internal(struct mv_otg *mvotg)
dev_dbg(&mvotg->pdev->dev, "otg enabled\n");
otg_clock_enable(mvotg);
- if (mvotg->pdata->phy_init) {
- retval = mvotg->pdata->phy_init(mvotg->phy_regs);
+ if (mvotg->mvphy->init) {
+ retval = mvotg->mvphy->init(mvotg->mvphy);
if (retval) {
dev_err(&mvotg->pdev->dev,
"init phy error %d\n", retval);
@@ -288,8 +289,8 @@ static void mv_otg_disable_internal(struct mv_otg *mvotg)
{
if (mvotg->active) {
dev_dbg(&mvotg->pdev->dev, "otg disabled\n");
- if (mvotg->pdata->phy_deinit)
- mvotg->pdata->phy_deinit(mvotg->phy_regs);
+ if (mvotg->mvphy->shutdown)
+ mvotg->mvphy->shutdown(mvotg->mvphy);
otg_clock_disable(mvotg);
mvotg->active = 0;
}
@@ -741,23 +742,8 @@ static int mv_otg_probe(struct platform_device *pdev)
for (i = 0; i < OTG_TIMER_NUM; i++)
init_timer(&mvotg->otg_ctrl.timer[i]);
- r = platform_get_resource_byname(mvotg->pdev,
- IORESOURCE_MEM, "phyregs");
- if (r == NULL) {
- dev_err(&pdev->dev, "no phy I/O memory resource defined\n");
- retval = -ENODEV;
- goto err_destroy_workqueue;
- }
-
- mvotg->phy_regs = devm_ioremap(&pdev->dev, r->start, resource_size(r));
- if (mvotg->phy_regs == NULL) {
- dev_err(&pdev->dev, "failed to map phy I/O memory\n");
- retval = -EFAULT;
- goto err_destroy_workqueue;
- }
-
- r = platform_get_resource_byname(mvotg->pdev,
- IORESOURCE_MEM, "capregs");
+ r = platform_get_resource(mvotg->pdev,
+ IORESOURCE_MEM, 0);
if (r == NULL) {
dev_err(&pdev->dev, "no I/O memory resource defined\n");
retval = -ENODEV;
@@ -770,6 +756,11 @@ static int mv_otg_probe(struct platform_device *pdev)
retval = -EFAULT;
goto err_destroy_workqueue;
}
+ mvotg->mvphy = mv_usb2_get_phy();
+ if (mvotg->mvphy == NULL) {
+ retval = -ENODEV;
+ goto err_destroy_workqueue;
+ }
/* we will acces controller register, so enable the udc controller */
retval = mv_otg_enable_internal(mvotg);
diff --git a/drivers/usb/otg/mv_otg.h b/drivers/usb/otg/mv_otg.h
index 8a9e351..7b9629a 100644
--- a/drivers/usb/otg/mv_otg.h
+++ b/drivers/usb/otg/mv_otg.h
@@ -137,10 +137,10 @@ struct mv_otg_regs {
struct mv_otg {
struct usb_phy phy;
+ struct mv_usb2_phy *mvphy;
struct mv_otg_ctrl otg_ctrl;
/* base address */
- void __iomem *phy_regs;
void __iomem *cap_regs;
struct mv_otg_regs __iomem *op_regs;
--
1.7.4.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 13/29] arm: mmp2: change the defintion of usb devices
2012-11-22 2:04 [PATCH 01/29] usb: gadget: mv_udc: use udc_start and udc_stop functions Chao Xie
` (10 preceding siblings ...)
2012-11-22 2:04 ` [PATCH 12/29] usb: otg: mv_otg: use PHY driver for otg Chao Xie
@ 2012-11-22 2:04 ` Chao Xie
2012-11-22 2:04 ` [PATCH 14/29] arm: pxa910: " Chao Xie
` (15 subsequent siblings)
27 siblings, 0 replies; 30+ messages in thread
From: Chao Xie @ 2012-11-22 2:04 UTC (permalink / raw)
To: linux-arm-kernel
From: Chao Xie <chao.xie@marvell.com>
Signed-off-by: Chao Xie <xiechao.mail@gmail.com>
---
arch/arm/mach-mmp/include/mach/mmp2.h | 4 ++++
arch/arm/mach-mmp/mmp2.c | 4 ++++
2 files changed, 8 insertions(+), 0 deletions(-)
diff --git a/arch/arm/mach-mmp/include/mach/mmp2.h b/arch/arm/mach-mmp/include/mach/mmp2.h
index c4ca4d1..58e96b0 100644
--- a/arch/arm/mach-mmp/include/mach/mmp2.h
+++ b/arch/arm/mach-mmp/include/mach/mmp2.h
@@ -31,6 +31,10 @@ extern struct pxa_device_desc mmp2_device_sdh2;
extern struct pxa_device_desc mmp2_device_sdh3;
extern struct pxa_device_desc mmp2_device_asram;
extern struct pxa_device_desc mmp2_device_isram;
+extern struct pxa_device_desc mmp2_device_u2o;
+extern struct pxa_device_desc mmp2_device_u2ootg;
+extern struct pxa_device_desc mmp2_device_u2oehci;
+extern struct pxa_device_desc mmp2_device_u2ophy;
extern struct platform_device mmp2_device_gpio;
diff --git a/arch/arm/mach-mmp/mmp2.c b/arch/arm/mach-mmp/mmp2.c
index 3a3768c..73edbfc 100644
--- a/arch/arm/mach-mmp/mmp2.c
+++ b/arch/arm/mach-mmp/mmp2.c
@@ -153,6 +153,10 @@ MMP2_DEVICE(sdh3, "sdhci-pxav3", 3, MMC4, 0xd4281800, 0x120);
MMP2_DEVICE(asram, "asram", -1, NONE, 0xe0000000, 0x4000);
/* 0xd1000000 ~ 0xd101ffff is reserved for secure processor */
MMP2_DEVICE(isram, "isram", -1, NONE, 0xd1020000, 0x18000);
+MMP2_DEVICE(u2ophy, "mmp2-usb-phy", -1, NONE, 0xd4207000, 0x1ff);
+MMP2_DEVICE(u2o, "mv-udc", -1, USB_OTG, 0xd4208100, 0x1ff);
+MMP2_DEVICE(u2ootg, "mv-otg", -1, USB_OTG, 0xd4208100, 0x1ff);
+MMP2_DEVICE(u2oehci, "mv-ehci", -1, USB_OTG, 0xd4208100, 0x1ff);
struct resource mmp2_resource_gpio[] = {
{
--
1.7.4.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 14/29] arm: pxa910: change the defintion of usb devices
2012-11-22 2:04 [PATCH 01/29] usb: gadget: mv_udc: use udc_start and udc_stop functions Chao Xie
` (11 preceding siblings ...)
2012-11-22 2:04 ` [PATCH 13/29] arm: mmp2: change the defintion of usb devices Chao Xie
@ 2012-11-22 2:04 ` Chao Xie
2012-11-22 2:04 ` [PATCH 15/29] arm: brownstone: add usb support for the board Chao Xie
` (14 subsequent siblings)
27 siblings, 0 replies; 30+ messages in thread
From: Chao Xie @ 2012-11-22 2:04 UTC (permalink / raw)
To: linux-arm-kernel
From: Chao Xie <chao.xie@marvell.com>
Signed-off-by: Chao Xie <xiechao.mail@gmail.com>
---
arch/arm/mach-mmp/include/mach/pxa910.h | 7 ++++---
arch/arm/mach-mmp/pxa910.c | 4 ++++
2 files changed, 8 insertions(+), 3 deletions(-)
diff --git a/arch/arm/mach-mmp/include/mach/pxa910.h b/arch/arm/mach-mmp/include/mach/pxa910.h
index 3b58a3b..26ea4fe 100644
--- a/arch/arm/mach-mmp/include/mach/pxa910.h
+++ b/arch/arm/mach-mmp/include/mach/pxa910.h
@@ -20,9 +20,10 @@ extern struct pxa_device_desc pxa910_device_pwm2;
extern struct pxa_device_desc pxa910_device_pwm3;
extern struct pxa_device_desc pxa910_device_pwm4;
extern struct pxa_device_desc pxa910_device_nand;
-extern struct platform_device pxa168_device_u2o;
-extern struct platform_device pxa168_device_u2ootg;
-extern struct platform_device pxa168_device_u2oehci;
+extern struct pxa_device_desc pxa910_device_u2o;
+extern struct pxa_device_desc pxa910_device_u2ootg;
+extern struct pxa_device_desc pxa910_device_u2oehci;
+extern struct pxa_device_desc pxa910_device_u2ophy;
extern struct platform_device pxa910_device_gpio;
extern struct platform_device pxa910_device_rtc;
diff --git a/arch/arm/mach-mmp/pxa910.c b/arch/arm/mach-mmp/pxa910.c
index 8b1e16f..65174f7 100644
--- a/arch/arm/mach-mmp/pxa910.c
+++ b/arch/arm/mach-mmp/pxa910.c
@@ -138,6 +138,10 @@ PXA910_DEVICE(pwm2, "pxa910-pwm", 1, NONE, 0xd401a400, 0x10);
PXA910_DEVICE(pwm3, "pxa910-pwm", 2, NONE, 0xd401a800, 0x10);
PXA910_DEVICE(pwm4, "pxa910-pwm", 3, NONE, 0xd401ac00, 0x10);
PXA910_DEVICE(nand, "pxa3xx-nand", -1, NAND, 0xd4283000, 0x80, 97, 99);
+PXA910_DEVICE(u2ophy, "pxa910-usb-phy", -1, NONE, 0xd4207000, 0x1ff);
+PXA910_DEVICE(u2o, "mv-udc", -1, USB1, 0xd4208100, 0x1ff);
+PXA910_DEVICE(u2ootg, "mv-otg", -1, USB1, 0xd4208100, 0x1ff);
+PXA910_DEVICE(u2oehci, "mv-ehci", -1, USB1, 0xd4208100, 0x1ff);
struct resource pxa910_resource_gpio[] = {
{
--
1.7.4.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 15/29] arm: brownstone: add usb support for the board
2012-11-22 2:04 [PATCH 01/29] usb: gadget: mv_udc: use udc_start and udc_stop functions Chao Xie
` (12 preceding siblings ...)
2012-11-22 2:04 ` [PATCH 14/29] arm: pxa910: " Chao Xie
@ 2012-11-22 2:04 ` Chao Xie
2012-11-22 2:04 ` [PATCH 16/29] arm: ttc_dkb: add usb support Chao Xie
` (13 subsequent siblings)
27 siblings, 0 replies; 30+ messages in thread
From: Chao Xie @ 2012-11-22 2:04 UTC (permalink / raw)
To: linux-arm-kernel
From: Chao Xie <chao.xie@marvell.com>
Signed-off-by: Chao Xie <xiechao.mail@gmail.com>
---
arch/arm/mach-mmp/brownstone.c | 47 ++++++++++++++++++++++++++++++++++++++++
1 files changed, 47 insertions(+), 0 deletions(-)
diff --git a/arch/arm/mach-mmp/brownstone.c b/arch/arm/mach-mmp/brownstone.c
index 5cb769c..90c0340 100644
--- a/arch/arm/mach-mmp/brownstone.c
+++ b/arch/arm/mach-mmp/brownstone.c
@@ -18,6 +18,7 @@
#include <linux/regulator/max8649.h>
#include <linux/regulator/fixed.h>
#include <linux/mfd/max8925.h>
+#include <linux/platform_data/mv_usb.h>
#include <asm/mach-types.h>
#include <asm/mach/arch.h>
@@ -195,6 +196,31 @@ static struct sram_platdata mmp2_isram_platdata = {
.granularity = SRAM_GRANULARITY,
};
+#ifdef CONFIG_USB_SUPPORT
+
+static char *mmp2_usb_clock_name[] = {
+ [0] = "usb_clk",
+};
+
+static struct mv_usb_phy_platform_data brownstone_usb_phy_pdata = {
+ .clknum = 1,
+ .clkname = mmp2_usb_clock_name,
+};
+
+#if defined(CONFIG_USB_MV_UDC) || defined(CONFIG_USB_EHCI_MV_U2O)
+
+static struct mv_usb_platform_data brownstone_usb_pdata = {
+ .clknum = 1,
+ .clkname = mmp2_usb_clock_name,
+ .vbus = NULL,
+ .mode = MV_USB_MODE_OTG,
+ .otg_force_a_bus_req = 1,
+ .set_vbus = NULL,
+};
+#endif
+#endif
+
+
static void __init brownstone_init(void)
{
mfp_config(ARRAY_AND_SIZE(brownstone_pin_config));
@@ -211,6 +237,27 @@ static void __init brownstone_init(void)
/* enable 5v regulator */
platform_device_register(&brownstone_v_5vp_device);
+
+#ifdef CONFIG_USB_SUPPORT
+ pxa_register_device(&mmp2_device_u2ophy, &brownstone_usb_phy_pdata,
+ sizeof(brownstone_usb_phy_pdata));
+#endif
+
+#ifdef CONFIG_USB_MV_UDC
+ pxa_register_device(&mmp2_device_u2o, &brownstone_usb_pdata,
+ sizeof(brownstone_usb_pdata));
+#endif
+
+#ifdef CONFIG_USB_EHCI_MV_U2O
+ pxa_register_device(&mmp2_device_u2oehci, &brownstone_usb_pdata,
+ sizeof(brownstone_usb_pdata));
+#endif
+
+#ifdef CONFIG_USB_MV_OTG
+ pxa_register_device(&mmp2_device_u2ootg, &brownstone_usb_pdata,
+ sizeof(brownstone_usb_pdata));
+#endif
+
}
MACHINE_START(BROWNSTONE, "Brownstone Development Platform")
--
1.7.4.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 16/29] arm: ttc_dkb: add usb support
2012-11-22 2:04 [PATCH 01/29] usb: gadget: mv_udc: use udc_start and udc_stop functions Chao Xie
` (13 preceding siblings ...)
2012-11-22 2:04 ` [PATCH 15/29] arm: brownstone: add usb support for the board Chao Xie
@ 2012-11-22 2:04 ` Chao Xie
2012-11-22 2:04 ` [PATCH 17/29] arm: mmp: remove the usb phy setting Chao Xie
` (12 subsequent siblings)
27 siblings, 0 replies; 30+ messages in thread
From: Chao Xie @ 2012-11-22 2:04 UTC (permalink / raw)
To: linux-arm-kernel
From: Chao Xie <chao.xie@marvell.com>
Signed-off-by: Chao Xie <xiechao.mail@gmail.com>
---
arch/arm/mach-mmp/ttc_dkb.c | 30 +++++++++++++++++++-----------
1 files changed, 19 insertions(+), 11 deletions(-)
diff --git a/arch/arm/mach-mmp/ttc_dkb.c b/arch/arm/mach-mmp/ttc_dkb.c
index ce55fd8..0962791 100644
--- a/arch/arm/mach-mmp/ttc_dkb.c
+++ b/arch/arm/mach-mmp/ttc_dkb.c
@@ -27,7 +27,6 @@
#include <mach/mfp-pxa910.h>
#include <mach/pxa910.h>
#include <mach/irqs.h>
-#include <mach/regs-usb.h>
#include "common.h"
@@ -158,20 +157,24 @@ static struct i2c_board_info ttc_dkb_i2c_info[] = {
};
#ifdef CONFIG_USB_SUPPORT
-#if defined(CONFIG_USB_MV_UDC) || defined(CONFIG_USB_EHCI_MV_U2O)
static char *pxa910_usb_clock_name[] = {
- [0] = "U2OCLK",
+ [0] = "usb_clk",
+};
+
+static struct mv_usb_phy_platform_data ttc_usb_phy_pdata = {
+ .clknum = 1,
+ .clkname = pxa910_usb_clock_name,
};
+#if defined(CONFIG_USB_MV_UDC) || defined(CONFIG_USB_EHCI_MV_U2O)
+
static struct mv_usb_platform_data ttc_usb_pdata = {
.clknum = 1,
.clkname = pxa910_usb_clock_name,
.vbus = NULL,
.mode = MV_USB_MODE_OTG,
.otg_force_a_bus_req = 1,
- .phy_init = pxa_usb_phy_init,
- .phy_deinit = pxa_usb_phy_deinit,
.set_vbus = NULL,
};
#endif
@@ -198,19 +201,24 @@ static void __init ttc_dkb_init(void)
pxa910_add_twsi(0, NULL, ARRAY_AND_SIZE(ttc_dkb_i2c_info));
platform_add_devices(ARRAY_AND_SIZE(ttc_dkb_devices));
+#ifdef CONFIG_USB_SUPPORT
+ pxa_register_device(&pxa910_device_u2ophy, &ttc_usb_phy_pdata,
+ sizeof(ttc_usb_phy_pdata));
+#endif
+
#ifdef CONFIG_USB_MV_UDC
- pxa168_device_u2o.dev.platform_data = &ttc_usb_pdata;
- platform_device_register(&pxa168_device_u2o);
+ pxa_register_device(&pxa910_device_u2o, &ttc_usb_pdata,
+ sizeof(ttc_usb_pdata));
#endif
#ifdef CONFIG_USB_EHCI_MV_U2O
- pxa168_device_u2oehci.dev.platform_data = &ttc_usb_pdata;
- platform_device_register(&pxa168_device_u2oehci);
+ pxa_register_device(&pxa910_device_u2oehci, &ttc_usb_pdata,
+ sizeof(ttc_usb_pdata));
#endif
#ifdef CONFIG_USB_MV_OTG
- pxa168_device_u2ootg.dev.platform_data = &ttc_usb_pdata;
- platform_device_register(&pxa168_device_u2ootg);
+ pxa_register_device(&pxa910_device_u2ootg, &ttc_usb_pdata,
+ sizeof(ttc_usb_pdata));
#endif
}
--
1.7.4.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 17/29] arm: mmp: remove the usb phy setting
2012-11-22 2:04 [PATCH 01/29] usb: gadget: mv_udc: use udc_start and udc_stop functions Chao Xie
` (14 preceding siblings ...)
2012-11-22 2:04 ` [PATCH 16/29] arm: ttc_dkb: add usb support Chao Xie
@ 2012-11-22 2:04 ` Chao Xie
2012-11-22 2:04 ` [PATCH 18/29] arm: mmp: remove usb devices from pxa168 Chao Xie
` (11 subsequent siblings)
27 siblings, 0 replies; 30+ messages in thread
From: Chao Xie @ 2012-11-22 2:04 UTC (permalink / raw)
To: linux-arm-kernel
From: Chao Xie <chao.xie@marvell.com>
Signed-off-by: Chao Xie <xiechao.mail@gmail.com>
---
arch/arm/mach-mmp/devices.c | 278 -----------------------------
arch/arm/mach-mmp/include/mach/regs-usb.h | 253 --------------------------
2 files changed, 0 insertions(+), 531 deletions(-)
delete mode 100644 arch/arm/mach-mmp/include/mach/regs-usb.h
diff --git a/arch/arm/mach-mmp/devices.c b/arch/arm/mach-mmp/devices.c
index dd2d8b1..af341e5 100644
--- a/arch/arm/mach-mmp/devices.c
+++ b/arch/arm/mach-mmp/devices.c
@@ -15,7 +15,6 @@
#include <mach/irqs.h>
#include <mach/devices.h>
#include <mach/cputype.h>
-#include <mach/regs-usb.h>
int __init pxa_register_device(struct pxa_device_desc *desc,
void *data, size_t size)
@@ -72,280 +71,3 @@ int __init pxa_register_device(struct pxa_device_desc *desc,
return platform_device_add(pdev);
}
-#if defined(CONFIG_USB) || defined(CONFIG_USB_GADGET)
-
-/*****************************************************************************
- * The registers read/write routines
- *****************************************************************************/
-
-static unsigned int u2o_get(void __iomem *base, unsigned int offset)
-{
- return readl_relaxed(base + offset);
-}
-
-static void u2o_set(void __iomem *base, unsigned int offset,
- unsigned int value)
-{
- u32 reg;
-
- reg = readl_relaxed(base + offset);
- reg |= value;
- writel_relaxed(reg, base + offset);
- readl_relaxed(base + offset);
-}
-
-static void u2o_clear(void __iomem *base, unsigned int offset,
- unsigned int value)
-{
- u32 reg;
-
- reg = readl_relaxed(base + offset);
- reg &= ~value;
- writel_relaxed(reg, base + offset);
- readl_relaxed(base + offset);
-}
-
-static void u2o_write(void __iomem *base, unsigned int offset,
- unsigned int value)
-{
- writel_relaxed(value, base + offset);
- readl_relaxed(base + offset);
-}
-
-#if defined(CONFIG_USB_MV_UDC) || defined(CONFIG_USB_EHCI_MV)
-
-#if defined(CONFIG_CPU_PXA910) || defined(CONFIG_CPU_PXA168)
-
-static DEFINE_MUTEX(phy_lock);
-static int phy_init_cnt;
-
-static int usb_phy_init_internal(void __iomem *base)
-{
- int loops;
-
- pr_info("Init usb phy!!!\n");
-
- /* Initialize the USB PHY power */
- if (cpu_is_pxa910()) {
- u2o_set(base, UTMI_CTRL, (1<<UTMI_CTRL_INPKT_DELAY_SOF_SHIFT)
- | (1<<UTMI_CTRL_PU_REF_SHIFT));
- }
-
- u2o_set(base, UTMI_CTRL, 1<<UTMI_CTRL_PLL_PWR_UP_SHIFT);
- u2o_set(base, UTMI_CTRL, 1<<UTMI_CTRL_PWR_UP_SHIFT);
-
- /* UTMI_PLL settings */
- u2o_clear(base, UTMI_PLL, UTMI_PLL_PLLVDD18_MASK
- | UTMI_PLL_PLLVDD12_MASK | UTMI_PLL_PLLCALI12_MASK
- | UTMI_PLL_FBDIV_MASK | UTMI_PLL_REFDIV_MASK
- | UTMI_PLL_ICP_MASK | UTMI_PLL_KVCO_MASK);
-
- u2o_set(base, UTMI_PLL, 0xee<<UTMI_PLL_FBDIV_SHIFT
- | 0xb<<UTMI_PLL_REFDIV_SHIFT | 3<<UTMI_PLL_PLLVDD18_SHIFT
- | 3<<UTMI_PLL_PLLVDD12_SHIFT | 3<<UTMI_PLL_PLLCALI12_SHIFT
- | 1<<UTMI_PLL_ICP_SHIFT | 3<<UTMI_PLL_KVCO_SHIFT);
-
- /* UTMI_TX */
- u2o_clear(base, UTMI_TX, UTMI_TX_REG_EXT_FS_RCAL_EN_MASK
- | UTMI_TX_TXVDD12_MASK | UTMI_TX_CK60_PHSEL_MASK
- | UTMI_TX_IMPCAL_VTH_MASK | UTMI_TX_REG_EXT_FS_RCAL_MASK
- | UTMI_TX_AMP_MASK);
- u2o_set(base, UTMI_TX, 3<<UTMI_TX_TXVDD12_SHIFT
- | 4<<UTMI_TX_CK60_PHSEL_SHIFT | 4<<UTMI_TX_IMPCAL_VTH_SHIFT
- | 8<<UTMI_TX_REG_EXT_FS_RCAL_SHIFT | 3<<UTMI_TX_AMP_SHIFT);
-
- /* UTMI_RX */
- u2o_clear(base, UTMI_RX, UTMI_RX_SQ_THRESH_MASK
- | UTMI_REG_SQ_LENGTH_MASK);
- u2o_set(base, UTMI_RX, 7<<UTMI_RX_SQ_THRESH_SHIFT
- | 2<<UTMI_REG_SQ_LENGTH_SHIFT);
-
- /* UTMI_IVREF */
- if (cpu_is_pxa168())
- /* fixing Microsoft Altair board interface with NEC hub issue -
- * Set UTMI_IVREF from 0x4a3 to 0x4bf */
- u2o_write(base, UTMI_IVREF, 0x4bf);
-
- /* toggle VCOCAL_START bit of UTMI_PLL */
- udelay(200);
- u2o_set(base, UTMI_PLL, VCOCAL_START);
- udelay(40);
- u2o_clear(base, UTMI_PLL, VCOCAL_START);
-
- /* toggle REG_RCAL_START bit of UTMI_TX */
- udelay(400);
- u2o_set(base, UTMI_TX, REG_RCAL_START);
- udelay(40);
- u2o_clear(base, UTMI_TX, REG_RCAL_START);
- udelay(400);
-
- /* Make sure PHY PLL is ready */
- loops = 0;
- while ((u2o_get(base, UTMI_PLL) & PLL_READY) == 0) {
- mdelay(1);
- loops++;
- if (loops > 100) {
- printk(KERN_WARNING "calibrate timeout, UTMI_PLL %x\n",
- u2o_get(base, UTMI_PLL));
- break;
- }
- }
-
- if (cpu_is_pxa168()) {
- u2o_set(base, UTMI_RESERVE, 1 << 5);
- /* Turn on UTMI PHY OTG extension */
- u2o_write(base, UTMI_OTG_ADDON, 1);
- }
-
- return 0;
-}
-
-static int usb_phy_deinit_internal(void __iomem *base)
-{
- pr_info("Deinit usb phy!!!\n");
-
- if (cpu_is_pxa168())
- u2o_clear(base, UTMI_OTG_ADDON, UTMI_OTG_ADDON_OTG_ON);
-
- u2o_clear(base, UTMI_CTRL, UTMI_CTRL_RXBUF_PDWN);
- u2o_clear(base, UTMI_CTRL, UTMI_CTRL_TXBUF_PDWN);
- u2o_clear(base, UTMI_CTRL, UTMI_CTRL_USB_CLK_EN);
- u2o_clear(base, UTMI_CTRL, 1<<UTMI_CTRL_PWR_UP_SHIFT);
- u2o_clear(base, UTMI_CTRL, 1<<UTMI_CTRL_PLL_PWR_UP_SHIFT);
-
- return 0;
-}
-
-int pxa_usb_phy_init(void __iomem *phy_reg)
-{
- mutex_lock(&phy_lock);
- if (phy_init_cnt++ == 0)
- usb_phy_init_internal(phy_reg);
- mutex_unlock(&phy_lock);
- return 0;
-}
-
-void pxa_usb_phy_deinit(void __iomem *phy_reg)
-{
- WARN_ON(phy_init_cnt == 0);
-
- mutex_lock(&phy_lock);
- if (--phy_init_cnt == 0)
- usb_phy_deinit_internal(phy_reg);
- mutex_unlock(&phy_lock);
-}
-#endif
-#endif
-#endif
-
-#ifdef CONFIG_USB_SUPPORT
-static u64 usb_dma_mask = ~(u32)0;
-
-#ifdef CONFIG_USB_MV_UDC
-struct resource pxa168_u2o_resources[] = {
- /* regbase */
- [0] = {
- .start = PXA168_U2O_REGBASE + U2x_CAPREGS_OFFSET,
- .end = PXA168_U2O_REGBASE + USB_REG_RANGE,
- .flags = IORESOURCE_MEM,
- .name = "capregs",
- },
- /* phybase */
- [1] = {
- .start = PXA168_U2O_PHYBASE,
- .end = PXA168_U2O_PHYBASE + USB_PHY_RANGE,
- .flags = IORESOURCE_MEM,
- .name = "phyregs",
- },
- [2] = {
- .start = IRQ_PXA168_USB1,
- .end = IRQ_PXA168_USB1,
- .flags = IORESOURCE_IRQ,
- },
-};
-
-struct platform_device pxa168_device_u2o = {
- .name = "mv-udc",
- .id = -1,
- .resource = pxa168_u2o_resources,
- .num_resources = ARRAY_SIZE(pxa168_u2o_resources),
- .dev = {
- .dma_mask = &usb_dma_mask,
- .coherent_dma_mask = 0xffffffff,
- }
-};
-#endif /* CONFIG_USB_MV_UDC */
-
-#ifdef CONFIG_USB_EHCI_MV_U2O
-struct resource pxa168_u2oehci_resources[] = {
- /* regbase */
- [0] = {
- .start = PXA168_U2O_REGBASE + U2x_CAPREGS_OFFSET,
- .end = PXA168_U2O_REGBASE + USB_REG_RANGE,
- .flags = IORESOURCE_MEM,
- .name = "capregs",
- },
- /* phybase */
- [1] = {
- .start = PXA168_U2O_PHYBASE,
- .end = PXA168_U2O_PHYBASE + USB_PHY_RANGE,
- .flags = IORESOURCE_MEM,
- .name = "phyregs",
- },
- [2] = {
- .start = IRQ_PXA168_USB1,
- .end = IRQ_PXA168_USB1,
- .flags = IORESOURCE_IRQ,
- },
-};
-
-struct platform_device pxa168_device_u2oehci = {
- .name = "pxa-u2oehci",
- .id = -1,
- .dev = {
- .dma_mask = &usb_dma_mask,
- .coherent_dma_mask = 0xffffffff,
- },
-
- .num_resources = ARRAY_SIZE(pxa168_u2oehci_resources),
- .resource = pxa168_u2oehci_resources,
-};
-#endif
-
-#if defined(CONFIG_USB_MV_OTG)
-struct resource pxa168_u2ootg_resources[] = {
- /* regbase */
- [0] = {
- .start = PXA168_U2O_REGBASE + U2x_CAPREGS_OFFSET,
- .end = PXA168_U2O_REGBASE + USB_REG_RANGE,
- .flags = IORESOURCE_MEM,
- .name = "capregs",
- },
- /* phybase */
- [1] = {
- .start = PXA168_U2O_PHYBASE,
- .end = PXA168_U2O_PHYBASE + USB_PHY_RANGE,
- .flags = IORESOURCE_MEM,
- .name = "phyregs",
- },
- [2] = {
- .start = IRQ_PXA168_USB1,
- .end = IRQ_PXA168_USB1,
- .flags = IORESOURCE_IRQ,
- },
-};
-
-struct platform_device pxa168_device_u2ootg = {
- .name = "mv-otg",
- .id = -1,
- .dev = {
- .dma_mask = &usb_dma_mask,
- .coherent_dma_mask = 0xffffffff,
- },
-
- .num_resources = ARRAY_SIZE(pxa168_u2ootg_resources),
- .resource = pxa168_u2ootg_resources,
-};
-#endif /* CONFIG_USB_MV_OTG */
-
-#endif
diff --git a/arch/arm/mach-mmp/include/mach/regs-usb.h b/arch/arm/mach-mmp/include/mach/regs-usb.h
deleted file mode 100644
index b047bf4..0000000
--- a/arch/arm/mach-mmp/include/mach/regs-usb.h
+++ /dev/null
@@ -1,253 +0,0 @@
-/*
- * Copyright (C) 2011 Marvell International Ltd. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- */
-
-#ifndef __ASM_ARCH_REGS_USB_H
-#define __ASM_ARCH_REGS_USB_H
-
-#define PXA168_U2O_REGBASE (0xd4208000)
-#define PXA168_U2O_PHYBASE (0xd4207000)
-
-#define PXA168_U2H_REGBASE (0xd4209000)
-#define PXA168_U2H_PHYBASE (0xd4206000)
-
-#define MMP3_HSIC1_REGBASE (0xf0001000)
-#define MMP3_HSIC1_PHYBASE (0xf0001800)
-
-#define MMP3_HSIC2_REGBASE (0xf0002000)
-#define MMP3_HSIC2_PHYBASE (0xf0002800)
-
-#define MMP3_FSIC_REGBASE (0xf0003000)
-#define MMP3_FSIC_PHYBASE (0xf0003800)
-
-
-#define USB_REG_RANGE (0x1ff)
-#define USB_PHY_RANGE (0xff)
-
-/* registers */
-#define U2x_CAPREGS_OFFSET 0x100
-
-/* phy regs */
-#define UTMI_REVISION 0x0
-#define UTMI_CTRL 0x4
-#define UTMI_PLL 0x8
-#define UTMI_TX 0xc
-#define UTMI_RX 0x10
-#define UTMI_IVREF 0x14
-#define UTMI_T0 0x18
-#define UTMI_T1 0x1c
-#define UTMI_T2 0x20
-#define UTMI_T3 0x24
-#define UTMI_T4 0x28
-#define UTMI_T5 0x2c
-#define UTMI_RESERVE 0x30
-#define UTMI_USB_INT 0x34
-#define UTMI_DBG_CTL 0x38
-#define UTMI_OTG_ADDON 0x3c
-
-/* For UTMICTRL Register */
-#define UTMI_CTRL_USB_CLK_EN (1 << 31)
-/* pxa168 */
-#define UTMI_CTRL_SUSPEND_SET1 (1 << 30)
-#define UTMI_CTRL_SUSPEND_SET2 (1 << 29)
-#define UTMI_CTRL_RXBUF_PDWN (1 << 24)
-#define UTMI_CTRL_TXBUF_PDWN (1 << 11)
-
-#define UTMI_CTRL_INPKT_DELAY_SHIFT 30
-#define UTMI_CTRL_INPKT_DELAY_SOF_SHIFT 28
-#define UTMI_CTRL_PU_REF_SHIFT 20
-#define UTMI_CTRL_ARC_PULLDN_SHIFT 12
-#define UTMI_CTRL_PLL_PWR_UP_SHIFT 1
-#define UTMI_CTRL_PWR_UP_SHIFT 0
-
-/* For UTMI_PLL Register */
-#define UTMI_PLL_PLLCALI12_SHIFT 29
-#define UTMI_PLL_PLLCALI12_MASK (0x3 << 29)
-
-#define UTMI_PLL_PLLVDD18_SHIFT 27
-#define UTMI_PLL_PLLVDD18_MASK (0x3 << 27)
-
-#define UTMI_PLL_PLLVDD12_SHIFT 25
-#define UTMI_PLL_PLLVDD12_MASK (0x3 << 25)
-
-#define UTMI_PLL_CLK_BLK_EN_SHIFT 24
-#define CLK_BLK_EN (0x1 << 24)
-#define PLL_READY (0x1 << 23)
-#define KVCO_EXT (0x1 << 22)
-#define VCOCAL_START (0x1 << 21)
-
-#define UTMI_PLL_KVCO_SHIFT 15
-#define UTMI_PLL_KVCO_MASK (0x7 << 15)
-
-#define UTMI_PLL_ICP_SHIFT 12
-#define UTMI_PLL_ICP_MASK (0x7 << 12)
-
-#define UTMI_PLL_FBDIV_SHIFT 4
-#define UTMI_PLL_FBDIV_MASK (0xFF << 4)
-
-#define UTMI_PLL_REFDIV_SHIFT 0
-#define UTMI_PLL_REFDIV_MASK (0xF << 0)
-
-/* For UTMI_TX Register */
-#define UTMI_TX_REG_EXT_FS_RCAL_SHIFT 27
-#define UTMI_TX_REG_EXT_FS_RCAL_MASK (0xf << 27)
-
-#define UTMI_TX_REG_EXT_FS_RCAL_EN_SHIFT 26
-#define UTMI_TX_REG_EXT_FS_RCAL_EN_MASK (0x1 << 26)
-
-#define UTMI_TX_TXVDD12_SHIFT 22
-#define UTMI_TX_TXVDD12_MASK (0x3 << 22)
-
-#define UTMI_TX_CK60_PHSEL_SHIFT 17
-#define UTMI_TX_CK60_PHSEL_MASK (0xf << 17)
-
-#define UTMI_TX_IMPCAL_VTH_SHIFT 14
-#define UTMI_TX_IMPCAL_VTH_MASK (0x7 << 14)
-
-#define REG_RCAL_START (0x1 << 12)
-
-#define UTMI_TX_LOW_VDD_EN_SHIFT 11
-
-#define UTMI_TX_AMP_SHIFT 0
-#define UTMI_TX_AMP_MASK (0x7 << 0)
-
-/* For UTMI_RX Register */
-#define UTMI_REG_SQ_LENGTH_SHIFT 15
-#define UTMI_REG_SQ_LENGTH_MASK (0x3 << 15)
-
-#define UTMI_RX_SQ_THRESH_SHIFT 4
-#define UTMI_RX_SQ_THRESH_MASK (0xf << 4)
-
-#define UTMI_OTG_ADDON_OTG_ON (1 << 0)
-
-/* For MMP3 USB Phy */
-#define USB2_PLL_REG0 0x4
-#define USB2_PLL_REG1 0x8
-#define USB2_TX_REG0 0x10
-#define USB2_TX_REG1 0x14
-#define USB2_TX_REG2 0x18
-#define USB2_RX_REG0 0x20
-#define USB2_RX_REG1 0x24
-#define USB2_RX_REG2 0x28
-#define USB2_ANA_REG0 0x30
-#define USB2_ANA_REG1 0x34
-#define USB2_ANA_REG2 0x38
-#define USB2_DIG_REG0 0x3C
-#define USB2_DIG_REG1 0x40
-#define USB2_DIG_REG2 0x44
-#define USB2_DIG_REG3 0x48
-#define USB2_TEST_REG0 0x4C
-#define USB2_TEST_REG1 0x50
-#define USB2_TEST_REG2 0x54
-#define USB2_CHARGER_REG0 0x58
-#define USB2_OTG_REG0 0x5C
-#define USB2_PHY_MON0 0x60
-#define USB2_RESETVE_REG0 0x64
-#define USB2_ICID_REG0 0x78
-#define USB2_ICID_REG1 0x7C
-
-/* USB2_PLL_REG0 */
-/* This is for Ax stepping */
-#define USB2_PLL_FBDIV_SHIFT_MMP3 0
-#define USB2_PLL_FBDIV_MASK_MMP3 (0xFF << 0)
-
-#define USB2_PLL_REFDIV_SHIFT_MMP3 8
-#define USB2_PLL_REFDIV_MASK_MMP3 (0xF << 8)
-
-#define USB2_PLL_VDD12_SHIFT_MMP3 12
-#define USB2_PLL_VDD18_SHIFT_MMP3 14
-
-/* This is for B0 stepping */
-#define USB2_PLL_FBDIV_SHIFT_MMP3_B0 0
-#define USB2_PLL_REFDIV_SHIFT_MMP3_B0 9
-#define USB2_PLL_VDD18_SHIFT_MMP3_B0 14
-#define USB2_PLL_FBDIV_MASK_MMP3_B0 0x01FF
-#define USB2_PLL_REFDIV_MASK_MMP3_B0 0x3E00
-
-#define USB2_PLL_CAL12_SHIFT_MMP3 0
-#define USB2_PLL_CALI12_MASK_MMP3 (0x3 << 0)
-
-#define USB2_PLL_VCOCAL_START_SHIFT_MMP3 2
-
-#define USB2_PLL_KVCO_SHIFT_MMP3 4
-#define USB2_PLL_KVCO_MASK_MMP3 (0x7<<4)
-
-#define USB2_PLL_ICP_SHIFT_MMP3 8
-#define USB2_PLL_ICP_MASK_MMP3 (0x7<<8)
-
-#define USB2_PLL_LOCK_BYPASS_SHIFT_MMP3 12
-
-#define USB2_PLL_PU_PLL_SHIFT_MMP3 13
-#define USB2_PLL_PU_PLL_MASK (0x1 << 13)
-
-#define USB2_PLL_READY_MASK_MMP3 (0x1 << 15)
-
-/* USB2_TX_REG0 */
-#define USB2_TX_IMPCAL_VTH_SHIFT_MMP3 8
-#define USB2_TX_IMPCAL_VTH_MASK_MMP3 (0x7 << 8)
-
-#define USB2_TX_RCAL_START_SHIFT_MMP3 13
-
-/* USB2_TX_REG1 */
-#define USB2_TX_CK60_PHSEL_SHIFT_MMP3 0
-#define USB2_TX_CK60_PHSEL_MASK_MMP3 (0xf << 0)
-
-#define USB2_TX_AMP_SHIFT_MMP3 4
-#define USB2_TX_AMP_MASK_MMP3 (0x7 << 4)
-
-#define USB2_TX_VDD12_SHIFT_MMP3 8
-#define USB2_TX_VDD12_MASK_MMP3 (0x3 << 8)
-
-/* USB2_TX_REG2 */
-#define USB2_TX_DRV_SLEWRATE_SHIFT 10
-
-/* USB2_RX_REG0 */
-#define USB2_RX_SQ_THRESH_SHIFT_MMP3 4
-#define USB2_RX_SQ_THRESH_MASK_MMP3 (0xf << 4)
-
-#define USB2_RX_SQ_LENGTH_SHIFT_MMP3 10
-#define USB2_RX_SQ_LENGTH_MASK_MMP3 (0x3 << 10)
-
-/* USB2_ANA_REG1*/
-#define USB2_ANA_PU_ANA_SHIFT_MMP3 14
-
-/* USB2_OTG_REG0 */
-#define USB2_OTG_PU_OTG_SHIFT_MMP3 3
-
-/* fsic registers */
-#define FSIC_MISC 0x4
-#define FSIC_INT 0x28
-#define FSIC_CTRL 0x30
-
-/* HSIC registers */
-#define HSIC_PAD_CTRL 0x4
-
-#define HSIC_CTRL 0x8
-#define HSIC_CTRL_HSIC_ENABLE (1<<7)
-#define HSIC_CTRL_PLL_BYPASS (1<<4)
-
-#define TEST_GRP_0 0xc
-#define TEST_GRP_1 0x10
-
-#define HSIC_INT 0x14
-#define HSIC_INT_READY_INT_EN (1<<10)
-#define HSIC_INT_CONNECT_INT_EN (1<<9)
-#define HSIC_INT_CORE_INT_EN (1<<8)
-#define HSIC_INT_HS_READY (1<<2)
-#define HSIC_INT_CONNECT (1<<1)
-#define HSIC_INT_CORE (1<<0)
-
-#define HSIC_CONFIG 0x18
-#define USBHSIC_CTRL 0x20
-
-#define HSIC_USB_CTRL 0x28
-#define HSIC_USB_CTRL_CLKEN 1
-#define HSIC_USB_CLK_PHY 0x0
-#define HSIC_USB_CLK_PMU 0x1
-
-#endif /* __ASM_ARCH_PXA_U2O_H */
--
1.7.4.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 18/29] arm: mmp: remove usb devices from pxa168
2012-11-22 2:04 [PATCH 01/29] usb: gadget: mv_udc: use udc_start and udc_stop functions Chao Xie
` (15 preceding siblings ...)
2012-11-22 2:04 ` [PATCH 17/29] arm: mmp: remove the usb phy setting Chao Xie
@ 2012-11-22 2:04 ` Chao Xie
2012-11-22 2:05 ` [PATCH 19/29] usb: phy: mv_usb2_phy: add externel chip support Chao Xie
` (10 subsequent siblings)
27 siblings, 0 replies; 30+ messages in thread
From: Chao Xie @ 2012-11-22 2:04 UTC (permalink / raw)
To: linux-arm-kernel
From: Chao Xie <chao.xie@marvell.com>
Signed-off-by: Chao Xie <xiechao.mail@gmail.com>
---
arch/arm/mach-mmp/pxa168.c | 42 ------------------------------------------
1 files changed, 0 insertions(+), 42 deletions(-)
diff --git a/arch/arm/mach-mmp/pxa168.c b/arch/arm/mach-mmp/pxa168.c
index b7f074f..dd3a68b 100644
--- a/arch/arm/mach-mmp/pxa168.c
+++ b/arch/arm/mach-mmp/pxa168.c
@@ -28,7 +28,6 @@
#include <mach/mfp.h>
#include <linux/dma-mapping.h>
#include <mach/pxa168.h>
-#include <mach/regs-usb.h>
#include "common.h"
#include "clock.h"
@@ -135,47 +134,6 @@ struct platform_device pxa168_device_gpio = {
.resource = pxa168_resource_gpio,
};
-struct resource pxa168_usb_host_resources[] = {
- /* USB Host conroller register base */
- [0] = {
- .start = PXA168_U2H_REGBASE + U2x_CAPREGS_OFFSET,
- .end = PXA168_U2H_REGBASE + USB_REG_RANGE,
- .flags = IORESOURCE_MEM,
- .name = "capregs",
- },
- /* USB PHY register base */
- [1] = {
- .start = PXA168_U2H_PHYBASE,
- .end = PXA168_U2H_PHYBASE + USB_PHY_RANGE,
- .flags = IORESOURCE_MEM,
- .name = "phyregs",
- },
- [2] = {
- .start = IRQ_PXA168_USB2,
- .end = IRQ_PXA168_USB2,
- .flags = IORESOURCE_IRQ,
- },
-};
-
-static u64 pxa168_usb_host_dmamask = DMA_BIT_MASK(32);
-struct platform_device pxa168_device_usb_host = {
- .name = "pxa-sph",
- .id = -1,
- .dev = {
- .dma_mask = &pxa168_usb_host_dmamask,
- .coherent_dma_mask = DMA_BIT_MASK(32),
- },
-
- .num_resources = ARRAY_SIZE(pxa168_usb_host_resources),
- .resource = pxa168_usb_host_resources,
-};
-
-int __init pxa168_add_usb_host(struct mv_usb_platform_data *pdata)
-{
- pxa168_device_usb_host.dev.platform_data = pdata;
- return platform_device_register(&pxa168_device_usb_host);
-}
-
void pxa168_restart(char mode, const char *cmd)
{
soft_restart(0xffff0000);
--
1.7.4.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 19/29] usb: phy: mv_usb2_phy: add externel chip support
2012-11-22 2:04 [PATCH 01/29] usb: gadget: mv_udc: use udc_start and udc_stop functions Chao Xie
` (16 preceding siblings ...)
2012-11-22 2:04 ` [PATCH 18/29] arm: mmp: remove usb devices from pxa168 Chao Xie
@ 2012-11-22 2:05 ` Chao Xie
2012-11-22 2:05 ` [PATCH 20/29] usb: gadget: mv_udc: add extern " Chao Xie
` (9 subsequent siblings)
27 siblings, 0 replies; 30+ messages in thread
From: Chao Xie @ 2012-11-22 2:05 UTC (permalink / raw)
To: linux-arm-kernel
From: Chao Xie <chao.xie@marvell.com>
For the vbus and idpin detection. It may be completed by some
external chip.
The controller need clock on and PHY enabled to detect the
vbus/idpin. It will increase the power. So using the external
chip to detect the vbus and idpin can save the power.
Signed-off-by: Chao Xie <xiechao.mail@gmail.com>
---
drivers/usb/phy/mv_usb2_phy.c | 54 +++++++++++++++++++++++++++++
include/linux/platform_data/mv_usb.h | 15 +++-----
include/linux/usb/mv_usb2.h | 62 ++++++++++++++++++++++++++++++++++
3 files changed, 121 insertions(+), 10 deletions(-)
diff --git a/drivers/usb/phy/mv_usb2_phy.c b/drivers/usb/phy/mv_usb2_phy.c
index ed82bf3..0f81dca 100644
--- a/drivers/usb/phy/mv_usb2_phy.c
+++ b/drivers/usb/phy/mv_usb2_phy.c
@@ -136,6 +136,53 @@ struct mv_usb2_phy *mv_usb2_get_phy(void)
}
EXPORT_SYMBOL(mv_usb2_get_phy);
+int mv_usb2_register_notifier(struct mv_usb2_phy *phy,
+ struct notifier_block *nb)
+{
+ int ret;
+
+ if (!phy)
+ return -ENODEV;
+
+ ret = atomic_notifier_chain_register(phy->extern_chip.head, nb);
+ if (ret)
+ return ret;
+
+ return 0;
+}
+EXPORT_SYMBOL(mv_usb2_register_notifier);
+
+int mv_usb2_unregister_notifier(struct mv_usb2_phy *phy,
+ struct notifier_block *nb)
+{
+ int ret;
+
+ if (!phy)
+ return -ENODEV;
+
+ ret = atomic_notifier_chain_unregister(phy->extern_chip.head, nb);
+ if (ret)
+ return ret;
+
+ return 0;
+}
+EXPORT_SYMBOL(mv_usb2_unregister_notifier);
+
+int mv_usb2_notify(struct mv_usb2_phy *phy, unsigned long val, void *v)
+{
+ int ret;
+
+ if (!phy)
+ return -ENODEV;
+
+ ret = atomic_notifier_call_chain(phy->extern_chip.head, val, v);
+ if (ret)
+ return ret;
+
+ return 0;
+}
+EXPORT_SYMBOL(mv_usb2_notify);
+
static unsigned int u2o_get(void __iomem *base, unsigned int offset)
{
return readl_relaxed(base + offset);
@@ -414,6 +461,13 @@ static int __devinit usb_phy_probe(struct platform_device *pdev)
mv_phy->init = usb_phy_init;
mv_phy->shutdown = usb_phy_shutdown;
+ mv_phy->extern_chip.head = devm_kzalloc(&pdev->dev,
+ sizeof(*mv_phy->extern_chip.head),
+ GFP_KERNEL);
+ if (mv_phy->extern_chip.head == NULL)
+ return -ENOMEM;
+ ATOMIC_INIT_NOTIFIER_HEAD(mv_phy->extern_chip.head);
+
platform_set_drvdata(pdev, mv_phy);
the_phy = mv_phy;
diff --git a/include/linux/platform_data/mv_usb.h b/include/linux/platform_data/mv_usb.h
index fd3d1b4..dc25d60 100644
--- a/include/linux/platform_data/mv_usb.h
+++ b/include/linux/platform_data/mv_usb.h
@@ -28,16 +28,13 @@ enum {
VBUS_HIGH = 1 << 0,
};
-struct mv_usb_addon_irq {
- unsigned int irq;
- int (*poll)(void);
-};
-
+#define MV_USB_HAS_VBUS_DETECTION (1 << 0)
+#define MV_USB_HAS_IDPIN_DETECTION (1 << 1)
struct mv_usb_platform_data {
unsigned int clknum;
char **clkname;
- struct mv_usb_addon_irq *id; /* Only valid for OTG. ID pin change*/
- struct mv_usb_addon_irq *vbus; /* valid for OTG/UDC. VBUS change*/
+
+ unsigned int extern_attr;
/* only valid for HCD. OTG or Host only*/
unsigned int mode;
@@ -45,9 +42,7 @@ struct mv_usb_platform_data {
/* This flag is used for that needs id pin checked by otg */
unsigned int disable_otg_clock_gating:1;
/* Force a_bus_req to be asserted */
- unsigned int otg_force_a_bus_req:1;
-
- int (*set_vbus)(unsigned int vbus);
+ unsigned int otg_force_a_bus_req:1;
};
struct mv_usb_phy_platform_data {
diff --git a/include/linux/usb/mv_usb2.h b/include/linux/usb/mv_usb2.h
index 5d3d7bd..3e34b94 100644
--- a/include/linux/usb/mv_usb2.h
+++ b/include/linux/usb/mv_usb2.h
@@ -17,6 +17,33 @@
#include <linux/clk.h>
+enum {
+ EVENT_VBUS,
+ EVENT_ID,
+};
+
+struct pxa_usb_vbus_ops {
+ int (*get_vbus)(unsigned int *level);
+ int (*set_vbus)(unsigned int level);
+ int (*init)(void);
+};
+
+struct pxa_usb_idpin_ops {
+ int (*get_idpin)(unsigned int *level);
+ int (*init)(void);
+};
+
+struct pxa_usb_extern_ops {
+ struct pxa_usb_vbus_ops vbus;
+ struct pxa_usb_idpin_ops idpin;
+};
+
+struct mv_usb2_extern_chip {
+ unsigned int id;
+ struct pxa_usb_extern_ops ops;
+ struct atomic_notifier_head *head;
+};
+
struct mv_usb2_phy {
struct platform_device *pdev;
struct mutex phy_lock;
@@ -26,10 +53,45 @@ struct mv_usb2_phy {
struct clk **clks;
unsigned int clks_num;
+ struct mv_usb2_extern_chip extern_chip;
+
int (*init)(struct mv_usb2_phy *mv_phy);
void (*shutdown)(struct mv_usb2_phy *mv_phy);
};
struct mv_usb2_phy *mv_usb2_get_phy(void);
+#define mv_usb2_has_extern_call(phy, o, f, arg...)( \
+{ \
+ int ret; \
+ ret = (!phy ? 0 : ((phy->extern_chip.ops.o.f) ? \
+ 1 : 0)); \
+ ret; \
+} \
+)
+
+#define mv_usb2_extern_call(phy, o, f, args...)( \
+{ \
+ int ret; \
+ ret = (!phy ? -ENODEV : ((phy->extern_chip.ops.o.f) ? \
+ phy->extern_chip.ops.o.f(args) : -ENOIOCTLCMD));\
+ ret; \
+} \
+)
+
+#define mv_usb2_set_extern_call(phy, o, f, p)( \
+{ \
+ int ret; \
+ ret = !phy ? -ENODEV : ((phy->extern_chip.ops.o.f) ? \
+ -EINVAL : ({phy->extern_chip.ops.o.f = p; 0; })); \
+ ret; \
+} \
+)
+
+extern int mv_usb2_register_notifier(struct mv_usb2_phy *phy,
+ struct notifier_block *nb);
+extern int mv_usb2_unregister_notifier(struct mv_usb2_phy *phy,
+ struct notifier_block *nb);
+extern int mv_usb2_notify(struct mv_usb2_phy *phy, unsigned long val, void *v);
+
#endif
--
1.7.4.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 20/29] usb: gadget: mv_udc: add extern chip support
2012-11-22 2:04 [PATCH 01/29] usb: gadget: mv_udc: use udc_start and udc_stop functions Chao Xie
` (17 preceding siblings ...)
2012-11-22 2:05 ` [PATCH 19/29] usb: phy: mv_usb2_phy: add externel chip support Chao Xie
@ 2012-11-22 2:05 ` Chao Xie
2012-11-22 2:05 ` [PATCH 21/29] usb: ehci: ehci-mv: " Chao Xie
` (8 subsequent siblings)
27 siblings, 0 replies; 30+ messages in thread
From: Chao Xie @ 2012-11-22 2:05 UTC (permalink / raw)
To: linux-arm-kernel
From: Chao Xie <chao.xie@marvell.com>
Signed-off-by: Chao Xie <xiechao.mail@gmail.com>
---
drivers/usb/gadget/mv_udc.h | 3 ++
drivers/usb/gadget/mv_udc_core.c | 45 ++++++++++++++++++++++---------------
2 files changed, 30 insertions(+), 18 deletions(-)
diff --git a/drivers/usb/gadget/mv_udc.h b/drivers/usb/gadget/mv_udc.h
index 4851b2b..50ae7c7 100644
--- a/drivers/usb/gadget/mv_udc.h
+++ b/drivers/usb/gadget/mv_udc.h
@@ -178,6 +178,9 @@ struct mv_udc {
struct platform_device *dev;
int irq;
+ unsigned int extern_attr;
+ struct notifier_block notifier;
+
struct mv_cap_regs __iomem *cap_regs;
struct mv_op_regs __iomem *op_regs;
unsigned int max_eps;
diff --git a/drivers/usb/gadget/mv_udc_core.c b/drivers/usb/gadget/mv_udc_core.c
index 6f01d5e..5571f42 100644
--- a/drivers/usb/gadget/mv_udc_core.c
+++ b/drivers/usb/gadget/mv_udc_core.c
@@ -2077,15 +2077,16 @@ static irqreturn_t mv_udc_irq(int irq, void *dev)
return IRQ_HANDLED;
}
-static irqreturn_t mv_udc_vbus_irq(int irq, void *dev)
+static int mv_udc_vbus_notifier_call(struct notifier_block *nb,
+ unsigned long val, void *v)
{
- struct mv_udc *udc = (struct mv_udc *)dev;
+ struct mv_udc *udc = container_of(nb, struct mv_udc, notifier);
/* polling VBUS and init phy may cause too much time*/
- if (udc->qwork)
+ if (udc->qwork && val == EVENT_VBUS)
queue_work(udc->qwork, &udc->vbus_work);
- return IRQ_HANDLED;
+ return 0;
}
static void mv_udc_vbus_work(struct work_struct *work)
@@ -2094,10 +2095,12 @@ static void mv_udc_vbus_work(struct work_struct *work)
unsigned int vbus;
udc = container_of(work, struct mv_udc, vbus_work);
- if (!udc->pdata->vbus)
+ if (!(udc->extern_attr & MV_USB_HAS_VBUS_DETECTION))
+ return;
+
+ if (mv_usb2_extern_call(udc->phy, vbus, get_vbus, &vbus))
return;
- vbus = udc->pdata->vbus->poll();
dev_info(&udc->dev->dev, "vbus is %d\n", vbus);
if (vbus == VBUS_HIGH)
@@ -2124,6 +2127,9 @@ static int __devexit mv_udc_remove(struct platform_device *pdev)
usb_del_gadget_udc(&udc->gadget);
+ if (udc->extern_attr & MV_USB_HAS_VBUS_DETECTION)
+ mv_usb2_unregister_notifier(udc->phy, &udc->notifier);
+
if (udc->qwork) {
flush_workqueue(udc->qwork);
destroy_workqueue(udc->qwork);
@@ -2169,6 +2175,7 @@ static int __devinit mv_udc_probe(struct platform_device *pdev)
}
udc->done = &release_done;
+ udc->extern_attr = pdata->extern_attr;
udc->pdata = pdev->dev.platform_data;
spin_lock_init(&udc->lock);
@@ -2319,17 +2326,8 @@ static int __devinit mv_udc_probe(struct platform_device *pdev)
/* VBUS detect: we can disable/enable clock on demand.*/
if (udc->transceiver)
udc->clock_gating = 1;
- else if (pdata->vbus) {
+ else if (udc->extern_attr & MV_USB_HAS_VBUS_DETECTION) {
udc->clock_gating = 1;
- retval = devm_request_threaded_irq(&pdev->dev,
- pdata->vbus->irq, NULL,
- mv_udc_vbus_irq, IRQF_ONESHOT, "vbus", udc);
- if (retval) {
- dev_info(&pdev->dev,
- "Can not request irq for VBUS, "
- "disable clock gating\n");
- udc->clock_gating = 0;
- }
udc->qwork = create_singlethread_workqueue("mv_udc_queue");
if (!udc->qwork) {
@@ -2339,6 +2337,8 @@ static int __devinit mv_udc_probe(struct platform_device *pdev)
}
INIT_WORK(&udc->vbus_work, mv_udc_vbus_work);
+ udc->notifier.notifier_call = mv_udc_vbus_notifier_call;
+ mv_usb2_register_notifier(udc->phy, &udc->notifier);
}
/*
@@ -2362,6 +2362,9 @@ static int __devinit mv_udc_probe(struct platform_device *pdev)
return 0;
err_create_workqueue:
+ if (!udc->transceiver
+ && (udc->extern_attr & MV_USB_HAS_VBUS_DETECTION))
+ mv_usb2_unregister_notifier(udc->phy, &udc->notifier);
destroy_workqueue(udc->qwork);
err_unregister:
device_unregister(&udc->gadget.dev);
@@ -2380,6 +2383,7 @@ err_disable_clock:
static int mv_udc_suspend(struct device *dev)
{
struct mv_udc *udc;
+ unsigned int vbus;
udc = dev_get_drvdata(dev);
@@ -2387,11 +2391,16 @@ static int mv_udc_suspend(struct device *dev)
if (udc->transceiver)
return 0;
- if (udc->pdata->vbus && udc->pdata->vbus->poll)
- if (udc->pdata->vbus->poll() == VBUS_HIGH) {
+ if ((udc->extern_attr & MV_USB_HAS_VBUS_DETECTION) &&
+ mv_usb2_has_extern_call(udc->phy, vbus, get_vbus)) {
+ if (mv_usb2_extern_call(udc->phy, vbus, get_vbus, &vbus))
+ return -EAGAIN;
+
+ if (vbus == VBUS_HIGH) {
dev_info(&udc->dev->dev, "USB cable is connected!\n");
return -EAGAIN;
}
+ }
/*
* only cable is unplugged, udc can suspend.
--
1.7.4.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 21/29] usb: ehci: ehci-mv: add extern chip support
2012-11-22 2:04 [PATCH 01/29] usb: gadget: mv_udc: use udc_start and udc_stop functions Chao Xie
` (18 preceding siblings ...)
2012-11-22 2:05 ` [PATCH 20/29] usb: gadget: mv_udc: add extern " Chao Xie
@ 2012-11-22 2:05 ` Chao Xie
2012-11-22 2:05 ` [PATCH 22/29] usb: otg: mv_otg: " Chao Xie
` (7 subsequent siblings)
27 siblings, 0 replies; 30+ messages in thread
From: Chao Xie @ 2012-11-22 2:05 UTC (permalink / raw)
To: linux-arm-kernel
From: Chao Xie <chao.xie@marvell.com>
Signed-off-by: Chao Xie <xiechao.mail@gmail.com>
---
drivers/usb/host/ehci-mv.c | 12 ++++++------
1 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/drivers/usb/host/ehci-mv.c b/drivers/usb/host/ehci-mv.c
index be504fd..171e145 100644
--- a/drivers/usb/host/ehci-mv.c
+++ b/drivers/usb/host/ehci-mv.c
@@ -256,8 +256,8 @@ static int mv_ehci_probe(struct platform_device *pdev)
goto err_disable_clk;
#endif
} else {
- if (pdata->set_vbus)
- pdata->set_vbus(1);
+ if (mv_usb2_has_extern_call(ehci_mv->mvphy, vbus, set_vbus))
+ mv_usb2_extern_call(ehci_mv->mvphy, vbus, set_vbus, 1);
retval = usb_add_hcd(hcd, hcd->irq, IRQF_SHARED);
if (retval) {
@@ -275,8 +275,8 @@ static int mv_ehci_probe(struct platform_device *pdev)
return 0;
err_set_vbus:
- if (pdata->set_vbus)
- pdata->set_vbus(0);
+ if (mv_usb2_has_extern_call(ehci_mv->mvphy, vbus, set_vbus))
+ mv_usb2_extern_call(ehci_mv->mvphy, vbus, set_vbus, 0);
err_disable_clk:
mv_ehci_disable(ehci_mv);
err_clear_drvdata:
@@ -299,8 +299,8 @@ static int mv_ehci_remove(struct platform_device *pdev)
otg_set_host(ehci_mv->otg->otg, NULL);
if (ehci_mv->mode == MV_USB_MODE_HOST) {
- if (ehci_mv->pdata->set_vbus)
- ehci_mv->pdata->set_vbus(0);
+ if (mv_usb2_has_extern_call(ehci_mv->mvphy, vbus, set_vbus))
+ mv_usb2_extern_call(ehci_mv->mvphy, vbus, set_vbus, 1);
mv_ehci_disable(ehci_mv);
}
--
1.7.4.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 22/29] usb: otg: mv_otg: add extern chip support
2012-11-22 2:04 [PATCH 01/29] usb: gadget: mv_udc: use udc_start and udc_stop functions Chao Xie
` (19 preceding siblings ...)
2012-11-22 2:05 ` [PATCH 21/29] usb: ehci: ehci-mv: " Chao Xie
@ 2012-11-22 2:05 ` Chao Xie
2012-11-22 2:05 ` [PATCH 23/29] arm: mmp: add extern chip support for brownstone Chao Xie
` (6 subsequent siblings)
27 siblings, 0 replies; 30+ messages in thread
From: Chao Xie @ 2012-11-22 2:05 UTC (permalink / raw)
To: linux-arm-kernel
From: Chao Xie <chao.xie@marvell.com>
Signed-off-by: Chao Xie <xiechao.mail@gmail.com>
---
drivers/usb/otg/mv_otg.c | 63 ++++++++++++++++++++-------------------------
drivers/usb/otg/mv_otg.h | 3 ++
2 files changed, 31 insertions(+), 35 deletions(-)
diff --git a/drivers/usb/otg/mv_otg.c b/drivers/usb/otg/mv_otg.c
index 344f246..bd6369c 100644
--- a/drivers/usb/otg/mv_otg.c
+++ b/drivers/usb/otg/mv_otg.c
@@ -59,10 +59,10 @@ static char *state_string[] = {
static int mv_otg_set_vbus(struct usb_otg *otg, bool on)
{
struct mv_otg *mvotg = container_of(otg->phy, struct mv_otg, phy);
- if (mvotg->pdata->set_vbus == NULL)
+ if (!mv_usb2_has_extern_call(mvotg->mvphy, vbus, set_vbus))
return -ENODEV;
- return mvotg->pdata->set_vbus(on);
+ return mv_usb2_extern_call(mvotg->mvphy, vbus, set_vbus, on);
}
static int mv_otg_set_host(struct usb_otg *otg,
@@ -184,14 +184,14 @@ static void mv_otg_init_irq(struct mv_otg *mvotg)
mvotg->irq_status = OTGSC_INTSTS_A_SESSION_VALID
| OTGSC_INTSTS_A_VBUS_VALID;
- if (mvotg->pdata->vbus == NULL) {
+ if (!(mvotg->extern_attr & MV_USB_HAS_VBUS_DETECTION)) {
mvotg->irq_en |= OTGSC_INTR_B_SESSION_VALID
| OTGSC_INTR_B_SESSION_END;
mvotg->irq_status |= OTGSC_INTSTS_B_SESSION_VALID
| OTGSC_INTSTS_B_SESSION_END;
}
- if (mvotg->pdata->id == NULL) {
+ if (!(mvotg->extern_attr & MV_USB_HAS_IDPIN_DETECTION)) {
mvotg->irq_en |= OTGSC_INTR_USB_ID;
mvotg->irq_status |= OTGSC_INTSTS_USB_ID;
}
@@ -306,11 +306,14 @@ static void mv_otg_update_inputs(struct mv_otg *mvotg)
{
struct mv_otg_ctrl *otg_ctrl = &mvotg->otg_ctrl;
u32 otgsc;
+ unsigned int vbus, idpin;
otgsc = readl(&mvotg->op_regs->otgsc);
- if (mvotg->pdata->vbus) {
- if (mvotg->pdata->vbus->poll() == VBUS_HIGH) {
+ if (mvotg->extern_attr & MV_USB_HAS_VBUS_DETECTION) {
+ if (mv_usb2_extern_call(mvotg->mvphy, vbus, get_vbus, &vbus))
+ return;
+ if (vbus == VBUS_HIGH) {
otg_ctrl->b_sess_vld = 1;
otg_ctrl->b_sess_end = 0;
} else {
@@ -322,8 +325,11 @@ static void mv_otg_update_inputs(struct mv_otg *mvotg)
otg_ctrl->b_sess_end = !!(otgsc & OTGSC_STS_B_SESSION_END);
}
- if (mvotg->pdata->id)
- otg_ctrl->id = !!mvotg->pdata->id->poll();
+ if (mvotg->extern_attr & MV_USB_HAS_IDPIN_DETECTION) {
+ if (mv_usb2_extern_call(mvotg->mvphy, idpin, get_idpin, &idpin))
+ return;
+ otg_ctrl->id = !!idpin;
+ }
else
otg_ctrl->id = !!(otgsc & OTGSC_STS_USB_ID);
@@ -505,7 +511,7 @@ static irqreturn_t mv_otg_irq(int irq, void *dev)
* if we have vbus, then the vbus detection for B-device
* will be done by mv_otg_inputs_irq().
*/
- if (mvotg->pdata->vbus)
+ if (mvotg->extern_attr & MV_USB_HAS_VBUS_DETECTION)
if ((otgsc & OTGSC_STS_USB_ID) &&
!(otgsc & OTGSC_INTSTS_USB_ID))
return IRQ_NONE;
@@ -518,9 +524,10 @@ static irqreturn_t mv_otg_irq(int irq, void *dev)
return IRQ_HANDLED;
}
-static irqreturn_t mv_otg_inputs_irq(int irq, void *dev)
+static int mv_otg_notifier_call(struct notifier_block *nb,
+ unsigned long val, void *v)
{
- struct mv_otg *mvotg = dev;
+ struct mv_otg *mvotg = container_of(nb, struct mv_otg, notifier);
/* The clock may disabled at this time */
if (!mvotg->active) {
@@ -530,7 +537,7 @@ static irqreturn_t mv_otg_inputs_irq(int irq, void *dev)
mv_otg_run_state_machine(mvotg, 0);
- return IRQ_HANDLED;
+ return 0;
}
static ssize_t
@@ -666,6 +673,10 @@ int mv_otg_remove(struct platform_device *pdev)
sysfs_remove_group(&mvotg->pdev->dev.kobj, &inputs_attr_group);
+ if ((mvotg->extern_attr & MV_USB_HAS_VBUS_DETECTION) ||
+ (mvotg->extern_attr & MV_USB_HAS_IDPIN_DETECTION))
+ mv_usb2_unregister_notifier(mvotg->mvphy, &mvotg->notifier);
+
if (mvotg->qwork) {
flush_workqueue(mvotg->qwork);
destroy_workqueue(mvotg->qwork);
@@ -707,6 +718,7 @@ static int mv_otg_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, mvotg);
mvotg->pdev = pdev;
+ mvotg->extern_attr = pdata->extern_attr;
mvotg->pdata = pdata;
mvotg->clknum = pdata->clknum;
@@ -773,29 +785,10 @@ static int mv_otg_probe(struct platform_device *pdev)
(struct mv_otg_regs __iomem *) ((unsigned long) mvotg->cap_regs
+ (readl(mvotg->cap_regs) & CAPLENGTH_MASK));
- if (pdata->id) {
- retval = devm_request_threaded_irq(&pdev->dev, pdata->id->irq,
- NULL, mv_otg_inputs_irq,
- IRQF_ONESHOT, "id", mvotg);
- if (retval) {
- dev_info(&pdev->dev,
- "Failed to request irq for ID\n");
- pdata->id = NULL;
- }
- }
-
- if (pdata->vbus) {
- mvotg->clock_gating = 1;
- retval = devm_request_threaded_irq(&pdev->dev, pdata->vbus->irq,
- NULL, mv_otg_inputs_irq,
- IRQF_ONESHOT, "vbus", mvotg);
- if (retval) {
- dev_info(&pdev->dev,
- "Failed to request irq for VBUS, "
- "disable clock gating\n");
- mvotg->clock_gating = 0;
- pdata->vbus = NULL;
- }
+ if ((mvotg->extern_attr & MV_USB_HAS_VBUS_DETECTION) ||
+ (mvotg->extern_attr & MV_USB_HAS_IDPIN_DETECTION)) {
+ mvotg->notifier.notifier_call = mv_otg_notifier_call;
+ mv_usb2_register_notifier(mvotg->mvphy, &mvotg->notifier);
}
if (pdata->disable_otg_clock_gating)
diff --git a/drivers/usb/otg/mv_otg.h b/drivers/usb/otg/mv_otg.h
index 7b9629a..f5bc7dd 100644
--- a/drivers/usb/otg/mv_otg.h
+++ b/drivers/usb/otg/mv_otg.h
@@ -149,6 +149,9 @@ struct mv_otg {
u32 irq_status;
u32 irq_en;
+ unsigned int extern_attr;
+ struct notifier_block notifier;
+
struct delayed_work work;
struct workqueue_struct *qwork;
--
1.7.4.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 23/29] arm: mmp: add extern chip support for brownstone
2012-11-22 2:04 [PATCH 01/29] usb: gadget: mv_udc: use udc_start and udc_stop functions Chao Xie
` (20 preceding siblings ...)
2012-11-22 2:05 ` [PATCH 22/29] usb: otg: mv_otg: " Chao Xie
@ 2012-11-22 2:05 ` Chao Xie
2012-11-22 2:05 ` [PATCH 24/29] arm: mmp: add extern chip support for ttc_dkb Chao Xie
` (5 subsequent siblings)
27 siblings, 0 replies; 30+ messages in thread
From: Chao Xie @ 2012-11-22 2:05 UTC (permalink / raw)
To: linux-arm-kernel
From: Chao Xie <chao.xie@marvell.com>
Signed-off-by: Chao Xie <xiechao.mail@gmail.com>
---
arch/arm/mach-mmp/brownstone.c | 2 --
1 files changed, 0 insertions(+), 2 deletions(-)
diff --git a/arch/arm/mach-mmp/brownstone.c b/arch/arm/mach-mmp/brownstone.c
index 90c0340..3dcf38f 100644
--- a/arch/arm/mach-mmp/brownstone.c
+++ b/arch/arm/mach-mmp/brownstone.c
@@ -212,10 +212,8 @@ static struct mv_usb_phy_platform_data brownstone_usb_phy_pdata = {
static struct mv_usb_platform_data brownstone_usb_pdata = {
.clknum = 1,
.clkname = mmp2_usb_clock_name,
- .vbus = NULL,
.mode = MV_USB_MODE_OTG,
.otg_force_a_bus_req = 1,
- .set_vbus = NULL,
};
#endif
#endif
--
1.7.4.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 24/29] arm: mmp: add extern chip support for ttc_dkb
2012-11-22 2:04 [PATCH 01/29] usb: gadget: mv_udc: use udc_start and udc_stop functions Chao Xie
` (21 preceding siblings ...)
2012-11-22 2:05 ` [PATCH 23/29] arm: mmp: add extern chip support for brownstone Chao Xie
@ 2012-11-22 2:05 ` Chao Xie
2012-11-22 2:05 ` [PATCH 25/29] usb: gadget: mv_udc: add device tree support Chao Xie
` (4 subsequent siblings)
27 siblings, 0 replies; 30+ messages in thread
From: Chao Xie @ 2012-11-22 2:05 UTC (permalink / raw)
To: linux-arm-kernel
From: Chao Xie <chao.xie@marvell.com>
Signed-off-by: Chao Xie <xiechao.mail@gmail.com>
---
arch/arm/mach-mmp/ttc_dkb.c | 2 --
1 files changed, 0 insertions(+), 2 deletions(-)
diff --git a/arch/arm/mach-mmp/ttc_dkb.c b/arch/arm/mach-mmp/ttc_dkb.c
index 0962791..eb34608 100644
--- a/arch/arm/mach-mmp/ttc_dkb.c
+++ b/arch/arm/mach-mmp/ttc_dkb.c
@@ -172,10 +172,8 @@ static struct mv_usb_phy_platform_data ttc_usb_phy_pdata = {
static struct mv_usb_platform_data ttc_usb_pdata = {
.clknum = 1,
.clkname = pxa910_usb_clock_name,
- .vbus = NULL,
.mode = MV_USB_MODE_OTG,
.otg_force_a_bus_req = 1,
- .set_vbus = NULL,
};
#endif
#endif
--
1.7.4.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 25/29] usb: gadget: mv_udc: add device tree support
2012-11-22 2:04 [PATCH 01/29] usb: gadget: mv_udc: use udc_start and udc_stop functions Chao Xie
` (22 preceding siblings ...)
2012-11-22 2:05 ` [PATCH 24/29] arm: mmp: add extern chip support for ttc_dkb Chao Xie
@ 2012-11-22 2:05 ` Chao Xie
2012-11-22 2:05 ` [PATCH 26/29] usb: otg: mv_otg: " Chao Xie
` (3 subsequent siblings)
27 siblings, 0 replies; 30+ messages in thread
From: Chao Xie @ 2012-11-22 2:05 UTC (permalink / raw)
To: linux-arm-kernel
From: Chao Xie <chao.xie@marvell.com>
Signed-off-by: Chao Xie <xiechao.mail@gmail.com>
---
drivers/usb/gadget/mv_udc.h | 5 +-
drivers/usb/gadget/mv_udc_core.c | 105 ++++++++++++++++++++++++++++++--------
2 files changed, 85 insertions(+), 25 deletions(-)
diff --git a/drivers/usb/gadget/mv_udc.h b/drivers/usb/gadget/mv_udc.h
index 50ae7c7..de84722 100644
--- a/drivers/usb/gadget/mv_udc.h
+++ b/drivers/usb/gadget/mv_udc.h
@@ -179,6 +179,7 @@ struct mv_udc {
int irq;
unsigned int extern_attr;
+ unsigned int mode;
struct notifier_block notifier;
struct mv_cap_regs __iomem *cap_regs;
@@ -222,11 +223,9 @@ struct mv_udc {
struct mv_usb2_phy *phy;
struct usb_phy *transceiver;
- struct mv_usb_platform_data *pdata;
-
/* some SOC has mutiple clock sources for USB*/
unsigned int clknum;
- struct clk *clk[0];
+ struct clk **clk;
};
/* endpoint data structure */
diff --git a/drivers/usb/gadget/mv_udc_core.c b/drivers/usb/gadget/mv_udc_core.c
index 5571f42..2273a0c 100644
--- a/drivers/usb/gadget/mv_udc_core.c
+++ b/drivers/usb/gadget/mv_udc_core.c
@@ -34,6 +34,7 @@
#include <linux/irq.h>
#include <linux/platform_device.h>
#include <linux/clk.h>
+#include <linux/of.h>
#include <linux/platform_data/mv_usb.h>
#include <linux/usb/mv_usb2.h>
#include <asm/unaligned.h>
@@ -2153,21 +2154,57 @@ static int __devexit mv_udc_remove(struct platform_device *pdev)
return 0;
}
+static int __devinit mv_udc_parse_dt(struct platform_device *pdev,
+ struct mv_udc *udc)
+{
+ struct device_node *np = pdev->dev.of_node;
+ unsigned int clks_num;
+ int i, ret;
+ const char *clk_name;
+
+ if (!np)
+ return 1;
+
+ clks_num = of_property_count_strings(np, "clocks");
+ if (clks_num < 0)
+ return clks_num;
+
+ udc->clk = devm_kzalloc(&pdev->dev,
+ sizeof(struct clk *) * clks_num, GFP_KERNEL);
+ if (udc->clk == NULL)
+ return -ENOMEM;
+
+ for (i = 0; i < clks_num; i++) {
+ ret = of_property_read_string_index(np, "clocks", i,
+ &clk_name);
+ if (ret)
+ return ret;
+ udc->clk[i] = devm_clk_get(&pdev->dev, clk_name);
+ if (IS_ERR(udc->clk[i]))
+ return PTR_ERR(udc->clk[i]);
+ }
+
+ udc->clknum = clks_num;
+
+ ret = of_property_read_u32(np, "extern_attr", &udc->extern_attr);
+ if (ret)
+ return ret;
+
+ ret = of_property_read_u32(np, "mode", &udc->mode);
+ if (ret)
+ return ret;
+
+ return 0;
+}
+
static int __devinit mv_udc_probe(struct platform_device *pdev)
{
- struct mv_usb_platform_data *pdata = pdev->dev.platform_data;
struct mv_udc *udc;
int retval = 0;
- int clk_i = 0;
struct resource *r;
size_t size;
- if (pdata == NULL) {
- dev_err(&pdev->dev, "missing platform_data\n");
- return -ENODEV;
- }
-
- size = sizeof(*udc) + sizeof(struct clk *) * pdata->clknum;
+ size = sizeof(*udc);
udc = devm_kzalloc(&pdev->dev, size, GFP_KERNEL);
if (udc == NULL) {
dev_err(&pdev->dev, "failed to allocate memory for udc\n");
@@ -2175,14 +2212,43 @@ static int __devinit mv_udc_probe(struct platform_device *pdev)
}
udc->done = &release_done;
- udc->extern_attr = pdata->extern_attr;
- udc->pdata = pdev->dev.platform_data;
spin_lock_init(&udc->lock);
udc->dev = pdev;
+ retval = mv_udc_parse_dt(pdev, udc);
+ if (retval > 0) {
+ /* no CONFIG_OF */
+ struct mv_usb_platform_data *pdata = pdev->dev.platform_data;
+ int clk_i = 0;
+
+ if (pdata == NULL) {
+ dev_err(&pdev->dev, "missing platform_data\n");
+ return -ENODEV;
+ }
+ udc->extern_attr = pdata->extern_attr;
+ udc->mode = pdata->mode;
+ udc->clknum = pdata->clknum;
+
+ size = sizeof(struct clk *) * udc->clknum;
+ udc->clk = devm_kzalloc(&pdev->dev, size, GFP_KERNEL);
+ if (udc->clk == NULL)
+ return -ENOMEM;
+ for (clk_i = 0; clk_i < udc->clknum; clk_i++) {
+ udc->clk[clk_i] = devm_clk_get(&pdev->dev,
+ pdata->clkname[clk_i]);
+ if (IS_ERR(udc->clk[clk_i])) {
+ retval = PTR_ERR(udc->clk[clk_i]);
+ return retval;
+ }
+ }
+ } else if (retval < 0) {
+ dev_err(&pdev->dev, "error parse dt\n");
+ return retval;
+ }
+
#ifdef CONFIG_USB_OTG_UTILS
- if (pdata->mode == MV_USB_MODE_OTG) {
+ if (udc->mode == MV_USB_MODE_OTG) {
udc->transceiver = devm_usb_get_phy(&pdev->dev,
USB_PHY_TYPE_USB2);
if (IS_ERR_OR_NULL(udc->transceiver)) {
@@ -2191,17 +2257,6 @@ static int __devinit mv_udc_probe(struct platform_device *pdev)
}
}
#endif
-
- udc->clknum = pdata->clknum;
- for (clk_i = 0; clk_i < udc->clknum; clk_i++) {
- udc->clk[clk_i] = devm_clk_get(&pdev->dev,
- pdata->clkname[clk_i]);
- if (IS_ERR(udc->clk[clk_i])) {
- retval = PTR_ERR(udc->clk[clk_i]);
- return retval;
- }
- }
-
r = platform_get_resource(udc->dev, IORESOURCE_MEM, 0);
if (r == NULL) {
dev_err(&pdev->dev, "no I/O memory resource defined\n");
@@ -2466,6 +2521,11 @@ static void mv_udc_shutdown(struct platform_device *pdev)
mv_udc_disable(udc);
}
+static struct of_device_id mv_udc_dt_ids[] = {
+ { .compatible = "mrvl,mv-udc" },
+};
+MODULE_DEVICE_TABLE(of, mv_udc_dt_ids);
+
static struct platform_driver udc_driver = {
.probe = mv_udc_probe,
.remove = __exit_p(mv_udc_remove),
@@ -2476,6 +2536,7 @@ static struct platform_driver udc_driver = {
#ifdef CONFIG_PM
.pm = &mv_udc_pm_ops,
#endif
+ .of_match_table = mv_udc_dt_ids,
},
};
--
1.7.4.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 26/29] usb: otg: mv_otg: add device tree support
2012-11-22 2:04 [PATCH 01/29] usb: gadget: mv_udc: use udc_start and udc_stop functions Chao Xie
` (23 preceding siblings ...)
2012-11-22 2:05 ` [PATCH 25/29] usb: gadget: mv_udc: add device tree support Chao Xie
@ 2012-11-22 2:05 ` Chao Xie
2012-11-22 2:05 ` [PATCH 27/29] usb: ehci: ehci-mv: " Chao Xie
` (2 subsequent siblings)
27 siblings, 0 replies; 30+ messages in thread
From: Chao Xie @ 2012-11-22 2:05 UTC (permalink / raw)
To: linux-arm-kernel
From: Chao Xie <chao.xie@marvell.com>
Signed-off-by: Chao Xie <xiechao.mail@gmail.com>
---
drivers/usb/otg/mv_otg.c | 127 +++++++++++++++++++++++++++++++++++++--------
drivers/usb/otg/mv_otg.h | 6 +-
2 files changed, 107 insertions(+), 26 deletions(-)
diff --git a/drivers/usb/otg/mv_otg.c b/drivers/usb/otg/mv_otg.c
index bd6369c..887024c 100644
--- a/drivers/usb/otg/mv_otg.c
+++ b/drivers/usb/otg/mv_otg.c
@@ -17,6 +17,7 @@
#include <linux/device.h>
#include <linux/proc_fs.h>
#include <linux/clk.h>
+#include <linux/of.h>
#include <linux/workqueue.h>
#include <linux/platform_device.h>
@@ -333,7 +334,7 @@ static void mv_otg_update_inputs(struct mv_otg *mvotg)
else
otg_ctrl->id = !!(otgsc & OTGSC_STS_USB_ID);
- if (mvotg->pdata->otg_force_a_bus_req && !otg_ctrl->id)
+ if (mvotg->otg_force_a_bus_req && !otg_ctrl->id)
otg_ctrl->a_bus_req = 1;
otg_ctrl->a_sess_vld = !!(otgsc & OTGSC_STS_A_SESSION_VALID);
@@ -690,21 +691,69 @@ int mv_otg_remove(struct platform_device *pdev)
return 0;
}
+static int mv_otg_parse_dt(struct platform_device *pdev,
+ struct mv_otg *mvotg)
+{
+ struct device_node *np = pdev->dev.of_node;
+ unsigned int clks_num;
+ unsigned int val;
+ int i, ret;
+ const char *clk_name;
+
+ if (!np)
+ return 1;
+
+ clks_num = of_property_count_strings(np, "clocks");
+ if (clks_num < 0)
+ return clks_num;
+
+ mvotg->clk = devm_kzalloc(&pdev->dev,
+ sizeof(struct clk *) * clks_num, GFP_KERNEL);
+ if (mvotg->clk == NULL)
+ return -ENOMEM;
+
+ for (i = 0; i < clks_num; i++) {
+ ret = of_property_read_string_index(np, "clocks", i,
+ &clk_name);
+ if (ret)
+ return ret;
+ mvotg->clk[i] = devm_clk_get(&pdev->dev, clk_name);
+ if (IS_ERR(mvotg->clk[i]))
+ return PTR_ERR(mvotg->clk[i]);
+ }
+
+ mvotg->clknum = clks_num;
+
+ ret = of_property_read_u32(np, "extern_attr", &mvotg->extern_attr);
+ if (ret)
+ return ret;
+
+ ret = of_property_read_u32(np, "mode", &mvotg->mode);
+ if (ret)
+ return ret;
+
+ ret = of_property_read_u32(np, "force_a_bus_req", &val);
+ if (ret)
+ return ret;
+ mvotg->otg_force_a_bus_req = !!val;
+
+ ret = of_property_read_u32(np, "disable_clock_gating", &val);
+ if (ret)
+ return ret;
+ mvotg->clock_gating = !val;
+
+ return 0;
+}
+
static int mv_otg_probe(struct platform_device *pdev)
{
- struct mv_usb_platform_data *pdata = pdev->dev.platform_data;
struct mv_otg *mvotg;
struct usb_otg *otg;
struct resource *r;
- int retval = 0, clk_i, i;
+ int retval = 0, i;
size_t size;
- if (pdata == NULL) {
- dev_err(&pdev->dev, "failed to get platform data\n");
- return -ENODEV;
- }
-
- size = sizeof(*mvotg) + sizeof(struct clk *) * pdata->clknum;
+ size = sizeof(*mvotg);
mvotg = devm_kzalloc(&pdev->dev, size, GFP_KERNEL);
if (!mvotg) {
dev_err(&pdev->dev, "failed to allocate memory!\n");
@@ -718,17 +767,45 @@ static int mv_otg_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, mvotg);
mvotg->pdev = pdev;
- mvotg->extern_attr = pdata->extern_attr;
- mvotg->pdata = pdata;
- mvotg->clknum = pdata->clknum;
- for (clk_i = 0; clk_i < mvotg->clknum; clk_i++) {
- mvotg->clk[clk_i] = devm_clk_get(&pdev->dev,
+ retval = mv_otg_parse_dt(pdev, mvotg);
+ if (retval > 0) {
+ struct mv_usb_platform_data *pdata = pdev->dev.platform_data;
+ /* no CONFIG_OF */
+ int clk_i = 0;
+
+ if (pdata == NULL) {
+ dev_err(&pdev->dev, "missing platform_data\n");
+ return -ENODEV;
+ }
+ mvotg->extern_attr = pdata->extern_attr;
+ mvotg->mode = pdata->mode;
+ mvotg->clknum = pdata->clknum;
+ mvotg->otg_force_a_bus_req = pdata->otg_force_a_bus_req;
+ if (pdata->disable_otg_clock_gating)
+ mvotg->clock_gating = 0;
+
+ size = sizeof(struct clk *) * mvotg->clknum;
+ mvotg->clk = devm_kzalloc(&pdev->dev, size, GFP_KERNEL);
+ if (mvotg->clk == NULL) {
+ dev_err(&pdev->dev,
+ "failed to allocate memory for clk\n");
+ return -ENOMEM;
+ }
+
+ for (clk_i = 0; clk_i < mvotg->clknum; clk_i++) {
+ mvotg->clk[clk_i] = devm_clk_get(&pdev->dev,
pdata->clkname[clk_i]);
- if (IS_ERR(mvotg->clk[clk_i])) {
- retval = PTR_ERR(mvotg->clk[clk_i]);
- return retval;
+ if (IS_ERR(mvotg->clk[clk_i])) {
+ dev_err(&pdev->dev, "failed to get clk %s\n",
+ pdata->clkname[clk_i]);
+ retval = PTR_ERR(mvotg->clk[clk_i]);
+ return retval;
+ }
}
+ } else if (retval < 0) {
+ dev_err(&pdev->dev, "error parse dt\n");
+ return retval;
}
mvotg->qwork = create_singlethread_workqueue("mv_otg_queue");
@@ -770,6 +847,7 @@ static int mv_otg_probe(struct platform_device *pdev)
}
mvotg->mvphy = mv_usb2_get_phy();
if (mvotg->mvphy == NULL) {
+ dev_err(&pdev->dev, "failed to get usb phy\n");
retval = -ENODEV;
goto err_destroy_workqueue;
}
@@ -791,9 +869,6 @@ static int mv_otg_probe(struct platform_device *pdev)
mv_usb2_register_notifier(mvotg->mvphy, &mvotg->notifier);
}
- if (pdata->disable_otg_clock_gating)
- mvotg->clock_gating = 0;
-
mv_otg_reset(mvotg);
mv_otg_init_irq(mvotg);
@@ -892,13 +967,19 @@ static int mv_otg_resume(struct platform_device *pdev)
}
#endif
+static struct of_device_id mv_otg_dt_ids[] = {
+ { .compatible = "mrvl,mv-otg" },
+};
+MODULE_DEVICE_TABLE(of, mv_otg_dt_ids);
+
static struct platform_driver mv_otg_driver = {
.probe = mv_otg_probe,
.remove = __exit_p(mv_otg_remove),
.driver = {
- .owner = THIS_MODULE,
- .name = driver_name,
- },
+ .owner = THIS_MODULE,
+ .name = driver_name,
+ .of_match_table = mv_otg_dt_ids,
+ },
#ifdef CONFIG_PM
.suspend = mv_otg_suspend,
.resume = mv_otg_resume,
diff --git a/drivers/usb/otg/mv_otg.h b/drivers/usb/otg/mv_otg.h
index f5bc7dd..3b9356d 100644
--- a/drivers/usb/otg/mv_otg.h
+++ b/drivers/usb/otg/mv_otg.h
@@ -157,12 +157,12 @@ struct mv_otg {
spinlock_t wq_lock;
- struct mv_usb_platform_data *pdata;
-
unsigned int active;
unsigned int clock_gating;
+ unsigned int mode;
+ unsigned int otg_force_a_bus_req;
unsigned int clknum;
- struct clk *clk[0];
+ struct clk **clk;
};
#endif
--
1.7.4.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 27/29] usb: ehci: ehci-mv: add device tree support
2012-11-22 2:04 [PATCH 01/29] usb: gadget: mv_udc: use udc_start and udc_stop functions Chao Xie
` (24 preceding siblings ...)
2012-11-22 2:05 ` [PATCH 26/29] usb: otg: mv_otg: " Chao Xie
@ 2012-11-22 2:05 ` Chao Xie
2012-11-22 2:05 ` [PATCH 28/29] arm: mmp: devicetree: add usb support for mmp2 Chao Xie
2012-11-22 2:05 ` [PATCH 29/29] arm: mmp: devicetree: add usb support for pxa910_dkb Chao Xie
27 siblings, 0 replies; 30+ messages in thread
From: Chao Xie @ 2012-11-22 2:05 UTC (permalink / raw)
To: linux-arm-kernel
From: Chao Xie <chao.xie@marvell.com>
Signed-off-by: Chao Xie <xiechao.mail@gmail.com>
---
drivers/usb/host/ehci-mv.c | 104 +++++++++++++++++++++++++++++++++-----------
1 files changed, 79 insertions(+), 25 deletions(-)
diff --git a/drivers/usb/host/ehci-mv.c b/drivers/usb/host/ehci-mv.c
index 171e145..0e99dac 100644
--- a/drivers/usb/host/ehci-mv.c
+++ b/drivers/usb/host/ehci-mv.c
@@ -13,6 +13,7 @@
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/clk.h>
+#include <linux/of.h>
#include <linux/err.h>
#include <linux/usb/otg.h>
#include <linux/usb/mv_usb2.h>
@@ -32,11 +33,9 @@ struct ehci_hcd_mv {
struct usb_phy *otg;
- struct mv_usb_platform_data *pdata;
-
/* clock source and total clock number */
unsigned int clknum;
- struct clk *clk[0];
+ struct clk **clk;
};
static void ehci_clock_enable(struct ehci_hcd_mv *ehci_mv)
@@ -138,22 +137,55 @@ static const struct hc_driver mv_ehci_hc_driver = {
.bus_resume = ehci_bus_resume,
};
+static int __devinit mv_ehci_parse_dt(struct platform_device *pdev,
+ struct ehci_hcd_mv *ehci_mv)
+{
+ struct device_node *np = pdev->dev.of_node;
+ unsigned int clks_num;
+ int i, ret;
+ const char *clk_name;
+
+ if (!np)
+ return 1;
+
+ clks_num = of_property_count_strings(np, "clocks");
+ if (clks_num < 0)
+ return clks_num;
+
+ ehci_mv->clk = devm_kzalloc(&pdev->dev,
+ sizeof(struct clk *) * clks_num, GFP_KERNEL);
+ if (ehci_mv->clk == NULL)
+ return -ENOMEM;
+
+ for (i = 0; i < clks_num; i++) {
+ ret = of_property_read_string_index(np, "clocks", i,
+ &clk_name);
+ if (ret)
+ return ret;
+ ehci_mv->clk[i] = clk_get(NULL, clk_name);
+ if (IS_ERR(ehci_mv->clk[i]))
+ return PTR_ERR(ehci_mv->clk[i]);
+ }
+
+ ehci_mv->clknum = clks_num;
+
+ ret = of_property_read_u32(np, "mode", &ehci_mv->mode);
+ if (ret)
+ return ret;
+
+ return 0;
+}
+
static int mv_ehci_probe(struct platform_device *pdev)
{
- struct mv_usb_platform_data *pdata = pdev->dev.platform_data;
struct usb_hcd *hcd;
struct ehci_hcd *ehci;
struct ehci_hcd_mv *ehci_mv;
struct resource *r;
- int clk_i, retval = -ENODEV;
+ int retval = -ENODEV;
u32 offset;
size_t size;
- if (!pdata) {
- dev_err(&pdev->dev, "missing platform_data\n");
- return -ENODEV;
- }
-
if (usb_disabled())
return -ENODEV;
@@ -161,7 +193,7 @@ static int mv_ehci_probe(struct platform_device *pdev)
if (!hcd)
return -ENOMEM;
- size = sizeof(*ehci_mv) + sizeof(struct clk *) * pdata->clknum;
+ size = sizeof(*ehci_mv);
ehci_mv = devm_kzalloc(&pdev->dev, size, GFP_KERNEL);
if (ehci_mv == NULL) {
dev_err(&pdev->dev, "cannot allocate ehci_hcd_mv\n");
@@ -170,19 +202,36 @@ static int mv_ehci_probe(struct platform_device *pdev)
}
platform_set_drvdata(pdev, ehci_mv);
- ehci_mv->pdata = pdata;
ehci_mv->hcd = hcd;
- ehci_mv->clknum = pdata->clknum;
- for (clk_i = 0; clk_i < ehci_mv->clknum; clk_i++) {
- ehci_mv->clk[clk_i] =
- devm_clk_get(&pdev->dev, pdata->clkname[clk_i]);
- if (IS_ERR(ehci_mv->clk[clk_i])) {
- dev_err(&pdev->dev, "error get clck \"%s\"\n",
- pdata->clkname[clk_i]);
- retval = PTR_ERR(ehci_mv->clk[clk_i]);
- goto err_clear_drvdata;
+ retval = mv_ehci_parse_dt(pdev, ehci_mv);
+ if (retval > 0) {
+ struct mv_usb_platform_data *pdata = pdev->dev.platform_data;
+ int clk_i = 0;
+
+ /* no CONFIG_OF */
+ if (pdata == NULL) {
+ dev_err(&pdev->dev, "missing platform_data\n");
+ return -ENODEV;
+ }
+ ehci_mv->mode = pdata->mode;
+ ehci_mv->clknum = pdata->clknum;
+
+ size = sizeof(struct clk *) * ehci_mv->clknum;
+ ehci_mv->clk = devm_kzalloc(&pdev->dev, size, GFP_KERNEL);
+ if (ehci_mv->clk == NULL)
+ return -ENOMEM;
+ for (clk_i = 0; clk_i < ehci_mv->clknum; clk_i++) {
+ ehci_mv->clk[clk_i] = devm_clk_get(&pdev->dev,
+ pdata->clkname[clk_i]);
+ if (IS_ERR(ehci_mv->clk[clk_i])) {
+ retval = PTR_ERR(ehci_mv->clk[clk_i]);
+ return retval;
+ }
}
+ } else if (retval < 0) {
+ dev_err(&pdev->dev, "error parse dt\n");
+ return retval;
}
r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
@@ -230,7 +279,6 @@ static int mv_ehci_probe(struct platform_device *pdev)
ehci = hcd_to_ehci(hcd);
ehci->caps = (struct ehci_caps *) ehci_mv->cap_regs;
- ehci_mv->mode = pdata->mode;
if (ehci_mv->mode == MV_USB_MODE_OTG) {
#ifdef CONFIG_USB_OTG_UTILS
ehci_mv->otg = devm_usb_get_phy(&pdev->dev, USB_PHY_TYPE_USB2);
@@ -334,13 +382,19 @@ static void mv_ehci_shutdown(struct platform_device *pdev)
hcd->driver->shutdown(hcd);
}
+static struct of_device_id mv_ehci_dt_ids[] = {
+ { .compatible = "mrvl,mv-ehci" },
+};
+MODULE_DEVICE_TABLE(of, mv_ehci_dt_ids);
+
static struct platform_driver ehci_mv_driver = {
.probe = mv_ehci_probe,
.remove = mv_ehci_remove,
.shutdown = mv_ehci_shutdown,
.driver = {
- .name = "mv-ehci",
- .bus = &platform_bus_type,
- },
+ .name = "mv-ehci",
+ .bus = &platform_bus_type,
+ .of_match_table = mv_ehci_dt_ids,
+ },
.id_table = ehci_id_table,
};
--
1.7.4.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 28/29] arm: mmp: devicetree: add usb support for mmp2
2012-11-22 2:04 [PATCH 01/29] usb: gadget: mv_udc: use udc_start and udc_stop functions Chao Xie
` (25 preceding siblings ...)
2012-11-22 2:05 ` [PATCH 27/29] usb: ehci: ehci-mv: " Chao Xie
@ 2012-11-22 2:05 ` Chao Xie
2012-11-22 2:05 ` [PATCH 29/29] arm: mmp: devicetree: add usb support for pxa910_dkb Chao Xie
27 siblings, 0 replies; 30+ messages in thread
From: Chao Xie @ 2012-11-22 2:05 UTC (permalink / raw)
To: linux-arm-kernel
From: Chao Xie <chao.xie@marvell.com>
Enable usb devices for mmp2 device tree.
Signed-off-by: Chao Xie <xiechao.mail@gmail.com>
---
arch/arm/boot/dts/mmp2.dtsi | 30 ++++++++++++++++++++++++++++++
arch/arm/mach-mmp/mmp2-dt.c | 4 ++++
2 files changed, 34 insertions(+), 0 deletions(-)
diff --git a/arch/arm/boot/dts/mmp2.dtsi b/arch/arm/boot/dts/mmp2.dtsi
index 0514fb4..a645bd3 100644
--- a/arch/arm/boot/dts/mmp2.dtsi
+++ b/arch/arm/boot/dts/mmp2.dtsi
@@ -116,6 +116,36 @@
reg-names = "mux status", "mux mask";
mrvl,intc-nr-irqs = <2>;
};
+ usbphy: usbphy at d4207000 {
+ compatible = "mrvl,mmp2-usb-phy";
+ clocks = "usb_clk";
+ reg = <0xd4207000 0x1ff>;
+ };
+ udc: udc at d4208100 {
+ compatible = "mrvl,mv-udc";
+ clocks = "usb_clk";
+ extern_attr = <0>;
+ mode = <0>;
+ reg = <0xd4208100 0x1ff>;
+ interrupts = <44>;
+ };
+ otg: otg at d4208100 {
+ compatible = "mrvl,mv-otg";
+ clocks = "usb_clk";
+ extern_attr = <0>;
+ mode = <0>;
+ force_a_bus_req = <1>;
+ disable_clock_gating = <1>;
+ reg = <0xd4208100 0x1ff>;
+ interrupts = <44>;
+ };
+ ehci: ehci at d4208100 {
+ compatible = "mrvl,mv-ehci";
+ clocks = "usb_clk";
+ mode = <0>;
+ reg = <0xd4208100 0x1ff>;
+ interrupts = <44>;
+ };
};
apb at d4000000 { /* APB */
diff --git a/arch/arm/mach-mmp/mmp2-dt.c b/arch/arm/mach-mmp/mmp2-dt.c
index 535a5ed..17ec2c4 100644
--- a/arch/arm/mach-mmp/mmp2-dt.c
+++ b/arch/arm/mach-mmp/mmp2-dt.c
@@ -37,6 +37,10 @@ static const struct of_dev_auxdata mmp2_auxdata_lookup[] __initconst = {
OF_DEV_AUXDATA("mrvl,mmp-twsi", 0xd4025000, "pxa2xx-i2c.1", NULL),
OF_DEV_AUXDATA("mrvl,mmp-gpio", 0xd4019000, "pxa-gpio", NULL),
OF_DEV_AUXDATA("mrvl,mmp-rtc", 0xd4010000, "sa1100-rtc", NULL),
+ OF_DEV_AUXDATA("mrvl,mmp2-usb-phy", 0xd4207000, "mmp2-usb-phy", NULL),
+ OF_DEV_AUXDATA("mrvl,mv-udc", 0xd4208100, "mv-udc", NULL),
+ OF_DEV_AUXDATA("mrvl,mv-otg", 0xd4208100, "mv-otg", NULL),
+ OF_DEV_AUXDATA("mrvl,mv-udc", 0xd4208100, "mv-ehci", NULL),
{}
};
--
1.7.4.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 29/29] arm: mmp: devicetree: add usb support for pxa910_dkb
2012-11-22 2:04 [PATCH 01/29] usb: gadget: mv_udc: use udc_start and udc_stop functions Chao Xie
` (26 preceding siblings ...)
2012-11-22 2:05 ` [PATCH 28/29] arm: mmp: devicetree: add usb support for mmp2 Chao Xie
@ 2012-11-22 2:05 ` Chao Xie
27 siblings, 0 replies; 30+ messages in thread
From: Chao Xie @ 2012-11-22 2:05 UTC (permalink / raw)
To: linux-arm-kernel
From: Chao Xie <chao.xie@marvell.com>
Signed-off-by: Chao Xie <chao.xie@marvell.com>
---
arch/arm/boot/dts/pxa910.dtsi | 30 ++++++++++++++++++++++++++++++
arch/arm/mach-mmp/mmp-dt.c | 5 +++++
2 files changed, 35 insertions(+), 0 deletions(-)
diff --git a/arch/arm/boot/dts/pxa910.dtsi b/arch/arm/boot/dts/pxa910.dtsi
index 825aaca..ea6c71a 100644
--- a/arch/arm/boot/dts/pxa910.dtsi
+++ b/arch/arm/boot/dts/pxa910.dtsi
@@ -44,6 +44,36 @@
reg = <0xd4282000 0x1000>;
mrvl,intc-nr-irqs = <64>;
};
+ usbphy: usbphy at d4207000 {
+ compatible = "mrvl,pxa910-usb-phy";
+ clocks = "usb_clk";
+ reg = <0xd4207000 0x1ff>;
+ };
+ udc: udc at d4208100 {
+ compatible = "mrvl,mv-udc";
+ clocks = "usb_clk";
+ extern_attr = <0>;
+ mode = <0>;
+ reg = <0xd4208100 0x1ff>;
+ interrupts = <44>;
+ };
+ otg: otg at d4208100 {
+ compatible = "mrvl,mv-otg";
+ clocks = "usb_clk";
+ extern_attr = <0>;
+ mode = <0>;
+ force_a_bus_req = <1>;
+ disable_clock_gating = <1>;
+ reg = <0xd4208100 0x1ff>;
+ interrupts = <44>;
+ };
+ ehci: ehci at d4208100 {
+ compatible = "mrvl,mv-ehci";
+ clocks = "usb_clk";
+ mode = <0>;
+ reg = <0xd4208100 0x1ff>;
+ interrupts = <44>;
+ };
};
diff --git a/arch/arm/mach-mmp/mmp-dt.c b/arch/arm/mach-mmp/mmp-dt.c
index 033cc31..5044552 100644
--- a/arch/arm/mach-mmp/mmp-dt.c
+++ b/arch/arm/mach-mmp/mmp-dt.c
@@ -45,6 +45,11 @@ static const struct of_dev_auxdata pxa910_auxdata_lookup[] __initconst = {
OF_DEV_AUXDATA("mrvl,mmp-twsi", 0xd4037000, "pxa2xx-i2c.1", NULL),
OF_DEV_AUXDATA("mrvl,mmp-gpio", 0xd4019000, "pxa-gpio", NULL),
OF_DEV_AUXDATA("mrvl,mmp-rtc", 0xd4010000, "sa1100-rtc", NULL),
+ OF_DEV_AUXDATA("mrvl,pxa910-usb-phy", 0xd4207000, "pxa910-usb-phy", NULL),
+ OF_DEV_AUXDATA("mrvl,mv-udc", 0xd4208100, "mv-udc", NULL),
+ OF_DEV_AUXDATA("mrvl,mv-otg", 0xd4208100, "mv-otg", NULL),
+ OF_DEV_AUXDATA("mrvl,mv-udc", 0xd4208100, "mv-ehci", NULL),
+
{}
};
--
1.7.4.1
^ permalink raw reply related [flat|nested] 30+ messages in thread