* [PATCH v8 00/14] add imx usb driver based on Greg next tree
@ 2012-06-29 9:48 Richard Zhao
2012-06-29 9:48 ` [PATCH v8 01/14] usb: chipidea: remove unneeded NULL check Richard Zhao
` (14 more replies)
0 siblings, 15 replies; 23+ messages in thread
From: Richard Zhao @ 2012-06-29 9:48 UTC (permalink / raw)
To: linux-arm-kernel
The work is based on ci13xxx rework done by Alexander Shishkin.
To let Greg pick up, I also added patches Alex queued that I depends on.
This patch series can also be found at:
https://github.com/riczhao/kernel-imx/commits/topics/usb-driver
Status:
- this version only support host
- usbotg controler works at host role
Changes since last version:
- mxs_phy: fix build warnings
- ci13xxx_imx: add pm_runtime_disable at exit path
Alexander Shishkin (1):
usb: chipidea: remove unneeded NULL check
Felipe Balbi (3):
usb: chipidea: drop useless arch-check
usb: chipidea: msm: add missing section annotation
usb: chipidea: msm: add remove method
Richard Zhao (10):
USB: Chipidea: rename struct ci13xxx_udc_driver to struct
ci13xxx_platform_data
USB: Chipidea: rename struct ci13xxx variables from udc to ci
USB: Chipidea: add unified ci13xxx_{add,remove}_device for platform
drivers
USB: Chipidea: add ci13xxx device id management
usb: chipidea: select USB_EHCI_ROOT_HUB_TT in USB_CHIPIDEA_HOST of
Kconfig
usb: otg: add notify_connect/notify_disconnect callback
USB: notify phy when root hub port connect change
usb: chipidea: permit driver bindings pass phy pointer
usb: otg: add basic mxs phy driver support
usb: chipidea: add imx platform driver
.../devicetree/bindings/usb/ci13xxx-imx.txt | 18 +
Documentation/devicetree/bindings/usb/mxs-phy.txt | 13 +
drivers/usb/chipidea/Kconfig | 1 +
drivers/usb/chipidea/Makefile | 9 +-
drivers/usb/chipidea/ci.h | 32 +-
drivers/usb/chipidea/ci13xxx_imx.c | 198 ++++++
drivers/usb/chipidea/ci13xxx_msm.c | 63 +-
drivers/usb/chipidea/ci13xxx_pci.c | 52 +-
drivers/usb/chipidea/core.c | 70 ++-
drivers/usb/chipidea/debug.c | 146 ++---
drivers/usb/chipidea/host.c | 3 +-
drivers/usb/chipidea/udc.c | 634 ++++++++++----------
drivers/usb/core/hub.c | 8 +
drivers/usb/otg/Kconfig | 10 +
drivers/usb/otg/Makefile | 1 +
drivers/usb/otg/mxs-phy.c | 186 ++++++
include/linux/usb/chipidea.h | 14 +-
include/linux/usb/otg.h | 21 +
18 files changed, 989 insertions(+), 490 deletions(-)
create mode 100644 Documentation/devicetree/bindings/usb/ci13xxx-imx.txt
create mode 100644 Documentation/devicetree/bindings/usb/mxs-phy.txt
create mode 100644 drivers/usb/chipidea/ci13xxx_imx.c
create mode 100644 drivers/usb/otg/mxs-phy.c
--
1.7.9.5
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH v8 01/14] usb: chipidea: remove unneeded NULL check
2012-06-29 9:48 [PATCH v8 00/14] add imx usb driver based on Greg next tree Richard Zhao
@ 2012-06-29 9:48 ` Richard Zhao
2012-06-29 9:48 ` [PATCH v8 02/14] usb: chipidea: drop useless arch-check Richard Zhao
` (13 subsequent siblings)
14 siblings, 0 replies; 23+ messages in thread
From: Richard Zhao @ 2012-06-29 9:48 UTC (permalink / raw)
To: linux-arm-kernel
From: Alexander Shishkin <alexander.shishkin@linux.intel.com>
As reported by Dan Carpenter, there is a NULL check in udc_start() that
follows a dereference of the pointer that's being checked. However, at
that point udc pointer shouldn't ever be NULL and if it is, the dereference
should cause an oops.
Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
Acked-by: Felipe Balbi <balbi@ti.com>
Signed-off-by: Richard Zhao <richard.zhao@freescale.com>
Acked-by: Marek Vasut <marex@denx.de>
---
drivers/usb/chipidea/udc.c | 3 ---
1 file changed, 3 deletions(-)
diff --git a/drivers/usb/chipidea/udc.c b/drivers/usb/chipidea/udc.c
index 51f9694..cdb9212 100644
--- a/drivers/usb/chipidea/udc.c
+++ b/drivers/usb/chipidea/udc.c
@@ -1647,9 +1647,6 @@ static int udc_start(struct ci13xxx *udc)
struct device *dev = udc->dev;
int retval = 0;
- if (!udc)
- return -EINVAL;
-
spin_lock_init(&udc->lock);
udc->gadget.ops = &usb_gadget_ops;
--
1.7.9.5
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH v8 02/14] usb: chipidea: drop useless arch-check
2012-06-29 9:48 [PATCH v8 00/14] add imx usb driver based on Greg next tree Richard Zhao
2012-06-29 9:48 ` [PATCH v8 01/14] usb: chipidea: remove unneeded NULL check Richard Zhao
@ 2012-06-29 9:48 ` Richard Zhao
2012-06-29 9:48 ` [PATCH v8 03/14] usb: chipidea: msm: add missing section annotation Richard Zhao
` (12 subsequent siblings)
14 siblings, 0 replies; 23+ messages in thread
From: Richard Zhao @ 2012-06-29 9:48 UTC (permalink / raw)
To: linux-arm-kernel
From: Felipe Balbi <balbi@ti.com>
msm glue layer compiles on all arches just
fine. Let's drop the unnecessary ARCH check
so we have easier compile tests.
Signed-off-by: Felipe Balbi <balbi@ti.com>
Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Signed-off-by: Richard Zhao <richard.zhao@freescale.com>
Acked-by: Marek Vasut <marex@denx.de>
---
drivers/usb/chipidea/Makefile | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/drivers/usb/chipidea/Makefile b/drivers/usb/chipidea/Makefile
index cc34937..b69900a 100644
--- a/drivers/usb/chipidea/Makefile
+++ b/drivers/usb/chipidea/Makefile
@@ -5,10 +5,12 @@ ci_hdrc-$(CONFIG_USB_CHIPIDEA_UDC) += udc.o
ci_hdrc-$(CONFIG_USB_CHIPIDEA_HOST) += host.o
ci_hdrc-$(CONFIG_USB_CHIPIDEA_DEBUG) += debug.o
+# Glue/Bridge layers go here
+
+obj-$(CONFIG_USB_CHIPIDEA) += ci13xxx_msm.o
+
+# PCI doesn't provide stubs, need to check
ifneq ($(CONFIG_PCI),)
obj-$(CONFIG_USB_CHIPIDEA) += ci13xxx_pci.o
endif
-ifneq ($(CONFIG_ARCH_MSM),)
- obj-$(CONFIG_USB_CHIPIDEA) += ci13xxx_msm.o
-endif
--
1.7.9.5
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH v8 03/14] usb: chipidea: msm: add missing section annotation
2012-06-29 9:48 [PATCH v8 00/14] add imx usb driver based on Greg next tree Richard Zhao
2012-06-29 9:48 ` [PATCH v8 01/14] usb: chipidea: remove unneeded NULL check Richard Zhao
2012-06-29 9:48 ` [PATCH v8 02/14] usb: chipidea: drop useless arch-check Richard Zhao
@ 2012-06-29 9:48 ` Richard Zhao
2012-06-29 9:48 ` [PATCH v8 04/14] usb: chipidea: msm: add remove method Richard Zhao
` (11 subsequent siblings)
14 siblings, 0 replies; 23+ messages in thread
From: Richard Zhao @ 2012-06-29 9:48 UTC (permalink / raw)
To: linux-arm-kernel
From: Felipe Balbi <balbi@ti.com>
No functional changes, it will just free up some
code if we don't have hotplug.
Signed-off-by: Felipe Balbi <balbi@ti.com>
Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Signed-off-by: Richard Zhao <richard.zhao@freescale.com>
Acked-by: Marek Vasut <marex@denx.de>
---
drivers/usb/chipidea/ci13xxx_msm.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/usb/chipidea/ci13xxx_msm.c b/drivers/usb/chipidea/ci13xxx_msm.c
index 958069e..8d438b8 100644
--- a/drivers/usb/chipidea/ci13xxx_msm.c
+++ b/drivers/usb/chipidea/ci13xxx_msm.c
@@ -55,7 +55,7 @@ static struct ci13xxx_udc_driver ci13xxx_msm_udc_driver = {
.notify_event = ci13xxx_msm_notify_event,
};
-static int ci13xxx_msm_probe(struct platform_device *pdev)
+static int __devinit ci13xxx_msm_probe(struct platform_device *pdev)
{
struct platform_device *plat_ci;
int ret;
--
1.7.9.5
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH v8 04/14] usb: chipidea: msm: add remove method
2012-06-29 9:48 [PATCH v8 00/14] add imx usb driver based on Greg next tree Richard Zhao
` (2 preceding siblings ...)
2012-06-29 9:48 ` [PATCH v8 03/14] usb: chipidea: msm: add missing section annotation Richard Zhao
@ 2012-06-29 9:48 ` Richard Zhao
2012-06-29 9:48 ` [PATCH v8 05/14] USB: Chipidea: rename struct ci13xxx_udc_driver to struct ci13xxx_platform_data Richard Zhao
` (10 subsequent siblings)
14 siblings, 0 replies; 23+ messages in thread
From: Richard Zhao @ 2012-06-29 9:48 UTC (permalink / raw)
To: linux-arm-kernel
From: Felipe Balbi <balbi@ti.com>
allow this driver to be removed too.
Signed-off-by: Felipe Balbi <balbi@ti.com>
Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Signed-off-by: Richard Zhao <richard.zhao@freescale.com>
---
drivers/usb/chipidea/ci13xxx_msm.c | 21 +++++++++++++++------
1 file changed, 15 insertions(+), 6 deletions(-)
diff --git a/drivers/usb/chipidea/ci13xxx_msm.c b/drivers/usb/chipidea/ci13xxx_msm.c
index 8d438b8..11a7bef 100644
--- a/drivers/usb/chipidea/ci13xxx_msm.c
+++ b/drivers/usb/chipidea/ci13xxx_msm.c
@@ -84,6 +84,8 @@ static int __devinit ci13xxx_msm_probe(struct platform_device *pdev)
if (ret)
goto put_platform;
+ platform_set_drvdata(pdev, plat_ci);
+
pm_runtime_no_callbacks(&pdev->dev);
pm_runtime_enable(&pdev->dev);
@@ -95,16 +97,23 @@ put_platform:
return ret;
}
+static int __devexit ci13xxx_msm_remove(struct platform_device *pdev)
+{
+ struct platform_device *plat_ci = platform_get_drvdata(pdev);
+
+ pm_runtime_disable(&pdev->dev);
+ platform_device_unregister(plat_ci);
+
+ return 0;
+}
+
static struct platform_driver ci13xxx_msm_driver = {
.probe = ci13xxx_msm_probe,
+ .remove = __devexit_p(ci13xxx_msm_remove),
.driver = { .name = "msm_hsusb", },
};
-MODULE_ALIAS("platform:msm_hsusb");
-static int __init ci13xxx_msm_init(void)
-{
- return platform_driver_register(&ci13xxx_msm_driver);
-}
-module_init(ci13xxx_msm_init);
+module_platform_driver(ci13xxx_msm_driver);
+MODULE_ALIAS("platform:msm_hsusb");
MODULE_LICENSE("GPL v2");
--
1.7.9.5
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH v8 05/14] USB: Chipidea: rename struct ci13xxx_udc_driver to struct ci13xxx_platform_data
2012-06-29 9:48 [PATCH v8 00/14] add imx usb driver based on Greg next tree Richard Zhao
` (3 preceding siblings ...)
2012-06-29 9:48 ` [PATCH v8 04/14] usb: chipidea: msm: add remove method Richard Zhao
@ 2012-06-29 9:48 ` Richard Zhao
2012-06-29 9:48 ` [PATCH v8 06/14] USB: Chipidea: rename struct ci13xxx variables from udc to ci Richard Zhao
` (9 subsequent siblings)
14 siblings, 0 replies; 23+ messages in thread
From: Richard Zhao @ 2012-06-29 9:48 UTC (permalink / raw)
To: linux-arm-kernel
This patch rename struct ci13xxx_udc_driver and var with the type.
ci13xxx_platform_data reflect it's passed from platfrom driver.
Signed-off-by: Richard Zhao <richard.zhao@freescale.com>
Reviewed-by: Felipe Balbi <balbi@ti.com>
Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com>
---
drivers/usb/chipidea/ci.h | 4 ++--
drivers/usb/chipidea/ci13xxx_msm.c | 6 +++---
drivers/usb/chipidea/ci13xxx_pci.c | 20 ++++++++++----------
drivers/usb/chipidea/core.c | 12 ++++++------
drivers/usb/chipidea/host.c | 2 +-
drivers/usb/chipidea/udc.c | 24 ++++++++++++------------
include/linux/usb/chipidea.h | 2 +-
7 files changed, 35 insertions(+), 35 deletions(-)
diff --git a/drivers/usb/chipidea/ci.h b/drivers/usb/chipidea/ci.h
index 50911f8..0b09330 100644
--- a/drivers/usb/chipidea/ci.h
+++ b/drivers/usb/chipidea/ci.h
@@ -125,7 +125,7 @@ struct hw_bank {
* @remote_wakeup: host-enabled remote wakeup
* @suspended: suspended by host
* @test_mode: the selected test mode
- * @udc_driver: platform specific information supplied by parent device
+ * @platdata: platform specific information supplied by parent device
* @vbus_active: is VBUS active
* @transceiver: pointer to USB PHY, if any
* @hcd: pointer to usb_hcd for ehci host driver
@@ -158,7 +158,7 @@ struct ci13xxx {
u8 suspended;
u8 test_mode;
- struct ci13xxx_udc_driver *udc_driver;
+ struct ci13xxx_platform_data *platdata;
int vbus_active;
struct usb_phy *transceiver;
struct usb_hcd *hcd;
diff --git a/drivers/usb/chipidea/ci13xxx_msm.c b/drivers/usb/chipidea/ci13xxx_msm.c
index 11a7bef..12c0dd6 100644
--- a/drivers/usb/chipidea/ci13xxx_msm.c
+++ b/drivers/usb/chipidea/ci13xxx_msm.c
@@ -45,7 +45,7 @@ static void ci13xxx_msm_notify_event(struct ci13xxx *udc, unsigned event)
}
}
-static struct ci13xxx_udc_driver ci13xxx_msm_udc_driver = {
+static struct ci13xxx_platform_data ci13xxx_msm_platdata = {
.name = "ci13xxx_msm",
.flags = CI13XXX_REGS_SHARED |
CI13XXX_REQUIRE_TRANSCEIVER |
@@ -75,8 +75,8 @@ static int __devinit ci13xxx_msm_probe(struct platform_device *pdev)
goto put_platform;
}
- ret = platform_device_add_data(plat_ci, &ci13xxx_msm_udc_driver,
- sizeof(ci13xxx_msm_udc_driver));
+ ret = platform_device_add_data(plat_ci, &ci13xxx_msm_platdata,
+ sizeof(ci13xxx_msm_platdata));
if (ret)
goto put_platform;
diff --git a/drivers/usb/chipidea/ci13xxx_pci.c b/drivers/usb/chipidea/ci13xxx_pci.c
index e3dab27..cdcac3a 100644
--- a/drivers/usb/chipidea/ci13xxx_pci.c
+++ b/drivers/usb/chipidea/ci13xxx_pci.c
@@ -23,17 +23,17 @@
/******************************************************************************
* PCI block
*****************************************************************************/
-struct ci13xxx_udc_driver pci_driver = {
+struct ci13xxx_platform_data pci_platdata = {
.name = UDC_DRIVER_NAME,
.capoffset = DEF_CAPOFFSET,
};
-struct ci13xxx_udc_driver langwell_pci_driver = {
+struct ci13xxx_platform_data langwell_pci_platdata = {
.name = UDC_DRIVER_NAME,
.capoffset = 0,
};
-struct ci13xxx_udc_driver penwell_pci_driver = {
+struct ci13xxx_platform_data penwell_pci_platdata = {
.name = UDC_DRIVER_NAME,
.capoffset = 0,
.power_budget = 200,
@@ -51,12 +51,12 @@ struct ci13xxx_udc_driver penwell_pci_driver = {
static int __devinit ci13xxx_pci_probe(struct pci_dev *pdev,
const struct pci_device_id *id)
{
- struct ci13xxx_udc_driver *driver = (void *)id->driver_data;
+ struct ci13xxx_platform_data *platdata = (void *)id->driver_data;
struct platform_device *plat_ci;
struct resource res[3];
int retval = 0, nres = 2;
- if (!driver) {
+ if (!platdata) {
dev_err(&pdev->dev, "device doesn't provide driver data\n");
return -ENODEV;
}
@@ -95,7 +95,7 @@ static int __devinit ci13xxx_pci_probe(struct pci_dev *pdev,
goto put_platform;
}
- retval = platform_device_add_data(plat_ci, driver, sizeof(*driver));
+ retval = platform_device_add_data(plat_ci, platdata, sizeof(*platdata));
if (retval)
goto put_platform;
@@ -147,19 +147,19 @@ static void __devexit ci13xxx_pci_remove(struct pci_dev *pdev)
static DEFINE_PCI_DEVICE_TABLE(ci13xxx_pci_id_table) = {
{
PCI_DEVICE(0x153F, 0x1004),
- .driver_data = (kernel_ulong_t)&pci_driver,
+ .driver_data = (kernel_ulong_t)&pci_platdata,
},
{
PCI_DEVICE(0x153F, 0x1006),
- .driver_data = (kernel_ulong_t)&pci_driver,
+ .driver_data = (kernel_ulong_t)&pci_platdata,
},
{
PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x0811),
- .driver_data = (kernel_ulong_t)&langwell_pci_driver,
+ .driver_data = (kernel_ulong_t)&langwell_pci_platdata,
},
{
PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x0829),
- .driver_data = (kernel_ulong_t)&penwell_pci_driver,
+ .driver_data = (kernel_ulong_t)&penwell_pci_platdata,
},
{ 0, 0, 0, 0, 0, 0, 0 /* end: all zeroes */ }
};
diff --git a/drivers/usb/chipidea/core.c b/drivers/usb/chipidea/core.c
index 15e03b3..9a883bd 100644
--- a/drivers/usb/chipidea/core.c
+++ b/drivers/usb/chipidea/core.c
@@ -179,7 +179,7 @@ static int hw_device_init(struct ci13xxx *ci, void __iomem *base)
ci->hw_bank.abs = base;
ci->hw_bank.cap = ci->hw_bank.abs;
- ci->hw_bank.cap += ci->udc_driver->capoffset;
+ ci->hw_bank.cap += ci->platdata->capoffset;
ci->hw_bank.op = ci->hw_bank.cap + ioread8(ci->hw_bank.cap);
hw_alloc_regmap(ci, false);
@@ -227,11 +227,11 @@ int hw_device_reset(struct ci13xxx *ci, u32 mode)
udelay(10); /* not RTOS friendly */
- if (ci->udc_driver->notify_event)
- ci->udc_driver->notify_event(ci,
+ if (ci->platdata->notify_event)
+ ci->platdata->notify_event(ci,
CI13XXX_CONTROLLER_RESET_EVENT);
- if (ci->udc_driver->flags & CI13XXX_DISABLE_STREAMING)
+ if (ci->platdata->flags & CI13XXX_DISABLE_STREAMING)
hw_write(ci, OP_USBMODE, USBMODE_CI_SDIS, USBMODE_CI_SDIS);
/* USBMODE should be configured step by step */
@@ -364,7 +364,7 @@ static int __devinit ci_hdrc_probe(struct platform_device *pdev)
}
ci->dev = dev;
- ci->udc_driver = dev->platform_data;
+ ci->platdata = dev->platform_data;
ret = hw_device_init(ci, base);
if (ret < 0) {
@@ -419,7 +419,7 @@ static int __devinit ci_hdrc_probe(struct platform_device *pdev)
}
platform_set_drvdata(pdev, ci);
- ret = request_irq(ci->irq, ci_irq, IRQF_SHARED, ci->udc_driver->name,
+ ret = request_irq(ci->irq, ci_irq, IRQF_SHARED, ci->platdata->name,
ci);
if (ret)
goto stop;
diff --git a/drivers/usb/chipidea/host.c b/drivers/usb/chipidea/host.c
index 9eacd21..4a4fdb8 100644
--- a/drivers/usb/chipidea/host.c
+++ b/drivers/usb/chipidea/host.c
@@ -116,7 +116,7 @@ static int host_start(struct ci13xxx *ci)
hcd->regs = ci->hw_bank.abs;
hcd->has_tt = 1;
- hcd->power_budget = ci->udc_driver->power_budget;
+ hcd->power_budget = ci->platdata->power_budget;
ehci = hcd_to_ehci(hcd);
ehci->caps = ci->hw_bank.cap;
diff --git a/drivers/usb/chipidea/udc.c b/drivers/usb/chipidea/udc.c
index cdb9212..68584bb 100644
--- a/drivers/usb/chipidea/udc.c
+++ b/drivers/usb/chipidea/udc.c
@@ -1362,7 +1362,7 @@ static int ci13xxx_vbus_session(struct usb_gadget *_gadget, int is_active)
unsigned long flags;
int gadget_ready = 0;
- if (!(udc->udc_driver->flags & CI13XXX_PULLUP_ON_VBUS))
+ if (!(udc->platdata->flags & CI13XXX_PULLUP_ON_VBUS))
return -EOPNOTSUPP;
spin_lock_irqsave(&udc->lock, flags);
@@ -1378,8 +1378,8 @@ static int ci13xxx_vbus_session(struct usb_gadget *_gadget, int is_active)
hw_device_state(udc, udc->ep0out->qh.dma);
} else {
hw_device_state(udc, 0);
- if (udc->udc_driver->notify_event)
- udc->udc_driver->notify_event(udc,
+ if (udc->platdata->notify_event)
+ udc->platdata->notify_event(udc,
CI13XXX_CONTROLLER_STOPPED_EVENT);
_gadget_stop_activity(&udc->gadget);
pm_runtime_put_sync(&_gadget->dev);
@@ -1514,9 +1514,9 @@ static int ci13xxx_start(struct usb_gadget *gadget,
udc->driver = driver;
pm_runtime_get_sync(&udc->gadget.dev);
- if (udc->udc_driver->flags & CI13XXX_PULLUP_ON_VBUS) {
+ if (udc->platdata->flags & CI13XXX_PULLUP_ON_VBUS) {
if (udc->vbus_active) {
- if (udc->udc_driver->flags & CI13XXX_REGS_SHARED)
+ if (udc->platdata->flags & CI13XXX_REGS_SHARED)
hw_device_reset(udc, USBMODE_CM_DC);
} else {
pm_runtime_put_sync(&udc->gadget.dev);
@@ -1544,11 +1544,11 @@ static int ci13xxx_stop(struct usb_gadget *gadget,
spin_lock_irqsave(&udc->lock, flags);
- if (!(udc->udc_driver->flags & CI13XXX_PULLUP_ON_VBUS) ||
+ if (!(udc->platdata->flags & CI13XXX_PULLUP_ON_VBUS) ||
udc->vbus_active) {
hw_device_state(udc, 0);
- if (udc->udc_driver->notify_event)
- udc->udc_driver->notify_event(udc,
+ if (udc->platdata->notify_event)
+ udc->platdata->notify_event(udc,
CI13XXX_CONTROLLER_STOPPED_EVENT);
udc->driver = NULL;
spin_unlock_irqrestore(&udc->lock, flags);
@@ -1581,7 +1581,7 @@ static irqreturn_t udc_irq(struct ci13xxx *udc)
spin_lock(&udc->lock);
- if (udc->udc_driver->flags & CI13XXX_REGS_SHARED) {
+ if (udc->platdata->flags & CI13XXX_REGS_SHARED) {
if (hw_read(udc, OP_USBMODE, USBMODE_CM) !=
USBMODE_CM_DC) {
spin_unlock(&udc->lock);
@@ -1653,7 +1653,7 @@ static int udc_start(struct ci13xxx *udc)
udc->gadget.speed = USB_SPEED_UNKNOWN;
udc->gadget.max_speed = USB_SPEED_HIGH;
udc->gadget.is_otg = 0;
- udc->gadget.name = udc->udc_driver->name;
+ udc->gadget.name = udc->platdata->name;
INIT_LIST_HEAD(&udc->gadget.ep_list);
@@ -1686,14 +1686,14 @@ static int udc_start(struct ci13xxx *udc)
udc->transceiver = usb_get_transceiver();
- if (udc->udc_driver->flags & CI13XXX_REQUIRE_TRANSCEIVER) {
+ if (udc->platdata->flags & CI13XXX_REQUIRE_TRANSCEIVER) {
if (udc->transceiver == NULL) {
retval = -ENODEV;
goto free_pools;
}
}
- if (!(udc->udc_driver->flags & CI13XXX_REGS_SHARED)) {
+ if (!(udc->platdata->flags & CI13XXX_REGS_SHARED)) {
retval = hw_device_reset(udc, USBMODE_CM_DC);
if (retval)
goto put_transceiver;
diff --git a/include/linux/usb/chipidea.h b/include/linux/usb/chipidea.h
index edb90d6..d4cf9706 100644
--- a/include/linux/usb/chipidea.h
+++ b/include/linux/usb/chipidea.h
@@ -6,7 +6,7 @@
#define __LINUX_USB_CHIPIDEA_H
struct ci13xxx;
-struct ci13xxx_udc_driver {
+struct ci13xxx_platform_data {
const char *name;
/* offset of the capability registers */
uintptr_t capoffset;
--
1.7.9.5
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH v8 06/14] USB: Chipidea: rename struct ci13xxx variables from udc to ci
2012-06-29 9:48 [PATCH v8 00/14] add imx usb driver based on Greg next tree Richard Zhao
` (4 preceding siblings ...)
2012-06-29 9:48 ` [PATCH v8 05/14] USB: Chipidea: rename struct ci13xxx_udc_driver to struct ci13xxx_platform_data Richard Zhao
@ 2012-06-29 9:48 ` Richard Zhao
2012-07-06 18:07 ` Greg KH
2012-06-29 9:48 ` [PATCH v8 07/14] USB: Chipidea: add unified ci13xxx_{add, remove}_device for platform drivers Richard Zhao
` (8 subsequent siblings)
14 siblings, 1 reply; 23+ messages in thread
From: Richard Zhao @ 2012-06-29 9:48 UTC (permalink / raw)
To: linux-arm-kernel
struct ci13xxx represent the controller, which may be device or host,
so name its variables as ci.
Signed-off-by: Richard Zhao <richard.zhao@freescale.com>
Reviewed-by: Felipe Balbi <balbi@ti.com>
Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Reviewed-by: Marek Vasut <marex@denx.de>
---
drivers/usb/chipidea/ci.h | 26 +-
drivers/usb/chipidea/ci13xxx_msm.c | 12 +-
drivers/usb/chipidea/debug.c | 146 ++++-----
drivers/usb/chipidea/udc.c | 628 ++++++++++++++++++------------------
include/linux/usb/chipidea.h | 2 +-
5 files changed, 407 insertions(+), 407 deletions(-)
diff --git a/drivers/usb/chipidea/ci.h b/drivers/usb/chipidea/ci.h
index 0b09330..9655e35 100644
--- a/drivers/usb/chipidea/ci.h
+++ b/drivers/usb/chipidea/ci.h
@@ -36,7 +36,7 @@
* @name: string description of the endpoint
* @qh: queue head for this endpoint
* @wedge: is the endpoint wedged
- * @udc: pointer to the controller
+ * @ci: pointer to the controller
* @lock: pointer to controller's spinlock
* @td_pool: pointer to controller's TD pool
*/
@@ -54,7 +54,7 @@ struct ci13xxx_ep {
int wedge;
/* global resources */
- struct ci13xxx *udc;
+ struct ci13xxx *ci;
spinlock_t *lock;
struct dma_pool *td_pool;
};
@@ -250,9 +250,9 @@ static inline int ffs_nr(u32 x)
*
* This function returns register contents
*/
-static inline u32 hw_read(struct ci13xxx *udc, enum ci13xxx_regs reg, u32 mask)
+static inline u32 hw_read(struct ci13xxx *ci, enum ci13xxx_regs reg, u32 mask)
{
- return ioread32(udc->hw_bank.regmap[reg]) & mask;
+ return ioread32(ci->hw_bank.regmap[reg]) & mask;
}
/**
@@ -261,14 +261,14 @@ static inline u32 hw_read(struct ci13xxx *udc, enum ci13xxx_regs reg, u32 mask)
* @mask: bitfield mask
* @data: new value
*/
-static inline void hw_write(struct ci13xxx *udc, enum ci13xxx_regs reg,
+static inline void hw_write(struct ci13xxx *ci, enum ci13xxx_regs reg,
u32 mask, u32 data)
{
if (~mask)
- data = (ioread32(udc->hw_bank.regmap[reg]) & ~mask)
+ data = (ioread32(ci->hw_bank.regmap[reg]) & ~mask)
| (data & mask);
- iowrite32(data, udc->hw_bank.regmap[reg]);
+ iowrite32(data, ci->hw_bank.regmap[reg]);
}
/**
@@ -278,12 +278,12 @@ static inline void hw_write(struct ci13xxx *udc, enum ci13xxx_regs reg,
*
* This function returns register contents
*/
-static inline u32 hw_test_and_clear(struct ci13xxx *udc, enum ci13xxx_regs reg,
+static inline u32 hw_test_and_clear(struct ci13xxx *ci, enum ci13xxx_regs reg,
u32 mask)
{
- u32 val = ioread32(udc->hw_bank.regmap[reg]) & mask;
+ u32 val = ioread32(ci->hw_bank.regmap[reg]) & mask;
- iowrite32(val, udc->hw_bank.regmap[reg]);
+ iowrite32(val, ci->hw_bank.regmap[reg]);
return val;
}
@@ -295,12 +295,12 @@ static inline u32 hw_test_and_clear(struct ci13xxx *udc, enum ci13xxx_regs reg,
*
* This function returns register contents
*/
-static inline u32 hw_test_and_write(struct ci13xxx *udc, enum ci13xxx_regs reg,
+static inline u32 hw_test_and_write(struct ci13xxx *ci, enum ci13xxx_regs reg,
u32 mask, u32 data)
{
- u32 val = hw_read(udc, reg, ~0);
+ u32 val = hw_read(ci, reg, ~0);
- hw_write(udc, reg, mask, data);
+ hw_write(ci, reg, mask, data);
return (val & mask) >> ffs_nr(mask);
}
diff --git a/drivers/usb/chipidea/ci13xxx_msm.c b/drivers/usb/chipidea/ci13xxx_msm.c
index 12c0dd6..5a2fe5f 100644
--- a/drivers/usb/chipidea/ci13xxx_msm.c
+++ b/drivers/usb/chipidea/ci13xxx_msm.c
@@ -15,11 +15,11 @@
#include "ci.h"
-#define MSM_USB_BASE (udc->hw_bank.abs)
+#define MSM_USB_BASE (ci->hw_bank.abs)
-static void ci13xxx_msm_notify_event(struct ci13xxx *udc, unsigned event)
+static void ci13xxx_msm_notify_event(struct ci13xxx *ci, unsigned event)
{
- struct device *dev = udc->gadget.dev.parent;
+ struct device *dev = ci->gadget.dev.parent;
int val;
switch (event) {
@@ -34,13 +34,13 @@ static void ci13xxx_msm_notify_event(struct ci13xxx *udc, unsigned event)
* Put the transceiver in non-driving mode. Otherwise host
* may not detect soft-disconnection.
*/
- val = usb_phy_io_read(udc->transceiver, ULPI_FUNC_CTRL);
+ val = usb_phy_io_read(ci->transceiver, ULPI_FUNC_CTRL);
val &= ~ULPI_FUNC_CTRL_OPMODE_MASK;
val |= ULPI_FUNC_CTRL_OPMODE_NONDRIVING;
- usb_phy_io_write(udc->transceiver, val, ULPI_FUNC_CTRL);
+ usb_phy_io_write(ci->transceiver, val, ULPI_FUNC_CTRL);
break;
default:
- dev_dbg(dev, "unknown ci13xxx_udc event\n");
+ dev_dbg(dev, "unknown ci13xxx event\n");
break;
}
}
diff --git a/drivers/usb/chipidea/debug.c b/drivers/usb/chipidea/debug.c
index c4b3e15..c6f50a2 100644
--- a/drivers/usb/chipidea/debug.c
+++ b/drivers/usb/chipidea/debug.c
@@ -68,15 +68,15 @@ void dbg_interrupt(u32 intmask)
*
* This function returns number of registers read
*/
-static size_t hw_register_read(struct ci13xxx *udc, u32 *buf, size_t size)
+static size_t hw_register_read(struct ci13xxx *ci, u32 *buf, size_t size)
{
unsigned i;
- if (size > udc->hw_bank.size)
- size = udc->hw_bank.size;
+ if (size > ci->hw_bank.size)
+ size = ci->hw_bank.size;
for (i = 0; i < size; i++)
- buf[i] = hw_read(udc, i * sizeof(u32), ~0);
+ buf[i] = hw_read(ci, i * sizeof(u32), ~0);
return size;
}
@@ -88,18 +88,18 @@ static size_t hw_register_read(struct ci13xxx *udc, u32 *buf, size_t size)
*
* This function returns an error code
*/
-static int hw_register_write(struct ci13xxx *udc, u16 addr, u32 data)
+static int hw_register_write(struct ci13xxx *ci, u16 addr, u32 data)
{
/* align */
addr /= sizeof(u32);
- if (addr >= udc->hw_bank.size)
+ if (addr >= ci->hw_bank.size)
return -EINVAL;
/* align */
addr *= sizeof(u32);
- hw_write(udc, addr, ~0, data);
+ hw_write(ci, addr, ~0, data);
return 0;
}
@@ -110,13 +110,13 @@ static int hw_register_write(struct ci13xxx *udc, u16 addr, u32 data)
*
* This function returns an error code
*/
-static int hw_intr_clear(struct ci13xxx *udc, int n)
+static int hw_intr_clear(struct ci13xxx *ci, int n)
{
if (n >= REG_BITS)
return -EINVAL;
- hw_write(udc, OP_USBINTR, BIT(n), 0);
- hw_write(udc, OP_USBSTS, BIT(n), BIT(n));
+ hw_write(ci, OP_USBINTR, BIT(n), 0);
+ hw_write(ci, OP_USBSTS, BIT(n), BIT(n));
return 0;
}
@@ -127,15 +127,15 @@ static int hw_intr_clear(struct ci13xxx *udc, int n)
*
* This function returns an error code
*/
-static int hw_intr_force(struct ci13xxx *udc, int n)
+static int hw_intr_force(struct ci13xxx *ci, int n)
{
if (n >= REG_BITS)
return -EINVAL;
- hw_write(udc, CAP_TESTMODE, TESTMODE_FORCE, TESTMODE_FORCE);
- hw_write(udc, OP_USBINTR, BIT(n), BIT(n));
- hw_write(udc, OP_USBSTS, BIT(n), BIT(n));
- hw_write(udc, CAP_TESTMODE, TESTMODE_FORCE, 0);
+ hw_write(ci, CAP_TESTMODE, TESTMODE_FORCE, TESTMODE_FORCE);
+ hw_write(ci, OP_USBINTR, BIT(n), BIT(n));
+ hw_write(ci, OP_USBSTS, BIT(n), BIT(n));
+ hw_write(ci, CAP_TESTMODE, TESTMODE_FORCE, 0);
return 0;
}
@@ -147,12 +147,12 @@ static int hw_intr_force(struct ci13xxx *udc, int n)
static ssize_t show_device(struct device *dev, struct device_attribute *attr,
char *buf)
{
- struct ci13xxx *udc = container_of(dev, struct ci13xxx, gadget.dev);
- struct usb_gadget *gadget = &udc->gadget;
+ struct ci13xxx *ci = container_of(dev, struct ci13xxx, gadget.dev);
+ struct usb_gadget *gadget = &ci->gadget;
int n = 0;
if (attr == NULL || buf == NULL) {
- dev_err(udc->dev, "[%s] EINVAL\n", __func__);
+ dev_err(ci->dev, "[%s] EINVAL\n", __func__);
return 0;
}
@@ -188,8 +188,8 @@ static DEVICE_ATTR(device, S_IRUSR, show_device, NULL);
static ssize_t show_driver(struct device *dev, struct device_attribute *attr,
char *buf)
{
- struct ci13xxx *udc = container_of(dev, struct ci13xxx, gadget.dev);
- struct usb_gadget_driver *driver = udc->driver;
+ struct ci13xxx *ci = container_of(dev, struct ci13xxx, gadget.dev);
+ struct usb_gadget_driver *driver = ci->driver;
int n = 0;
if (attr == NULL || buf == NULL) {
@@ -412,22 +412,22 @@ static DEVICE_ATTR(events, S_IRUSR | S_IWUSR, show_events, store_events);
static ssize_t show_inters(struct device *dev, struct device_attribute *attr,
char *buf)
{
- struct ci13xxx *udc = container_of(dev, struct ci13xxx, gadget.dev);
+ struct ci13xxx *ci = container_of(dev, struct ci13xxx, gadget.dev);
unsigned long flags;
u32 intr;
unsigned i, j, n = 0;
if (attr == NULL || buf == NULL) {
- dev_err(udc->dev, "[%s] EINVAL\n", __func__);
+ dev_err(ci->dev, "[%s] EINVAL\n", __func__);
return 0;
}
- spin_lock_irqsave(&udc->lock, flags);
+ spin_lock_irqsave(&ci->lock, flags);
/*n += scnprintf(buf + n, PAGE_SIZE - n,
- "status = %08x\n", hw_read_intr_status(udc));
+ "status = %08x\n", hw_read_intr_status(ci));
n += scnprintf(buf + n, PAGE_SIZE - n,
- "enable = %08x\n", hw_read_intr_enable(udc));*/
+ "enable = %08x\n", hw_read_intr_enable(ci));*/
n += scnprintf(buf + n, PAGE_SIZE - n, "*test = %d\n",
isr_statistics.test);
@@ -471,7 +471,7 @@ static ssize_t show_inters(struct device *dev, struct device_attribute *attr,
n += scnprintf(buf + n, PAGE_SIZE - n, "\n");
}
- spin_unlock_irqrestore(&udc->lock, flags);
+ spin_unlock_irqrestore(&ci->lock, flags);
return n;
}
@@ -485,31 +485,31 @@ static ssize_t show_inters(struct device *dev, struct device_attribute *attr,
static ssize_t store_inters(struct device *dev, struct device_attribute *attr,
const char *buf, size_t count)
{
- struct ci13xxx *udc = container_of(dev, struct ci13xxx, gadget.dev);
+ struct ci13xxx *ci = container_of(dev, struct ci13xxx, gadget.dev);
unsigned long flags;
unsigned en, bit;
if (attr == NULL || buf == NULL) {
- dev_err(udc->dev, "EINVAL\n");
+ dev_err(ci->dev, "EINVAL\n");
goto done;
}
if (sscanf(buf, "%u %u", &en, &bit) != 2 || en > 1) {
- dev_err(udc->dev, "<1|0> <bit>: enable|disable interrupt\n");
+ dev_err(ci->dev, "<1|0> <bit>: enable|disable interrupt\n");
goto done;
}
- spin_lock_irqsave(&udc->lock, flags);
+ spin_lock_irqsave(&ci->lock, flags);
if (en) {
- if (hw_intr_force(udc, bit))
+ if (hw_intr_force(ci, bit))
dev_err(dev, "invalid bit number\n");
else
isr_statistics.test++;
} else {
- if (hw_intr_clear(udc, bit))
+ if (hw_intr_clear(ci, bit))
dev_err(dev, "invalid bit number\n");
}
- spin_unlock_irqrestore(&udc->lock, flags);
+ spin_unlock_irqrestore(&ci->lock, flags);
done:
return count;
@@ -524,18 +524,18 @@ static DEVICE_ATTR(inters, S_IRUSR | S_IWUSR, show_inters, store_inters);
static ssize_t show_port_test(struct device *dev,
struct device_attribute *attr, char *buf)
{
- struct ci13xxx *udc = container_of(dev, struct ci13xxx, gadget.dev);
+ struct ci13xxx *ci = container_of(dev, struct ci13xxx, gadget.dev);
unsigned long flags;
unsigned mode;
if (attr == NULL || buf == NULL) {
- dev_err(udc->dev, "EINVAL\n");
+ dev_err(ci->dev, "EINVAL\n");
return 0;
}
- spin_lock_irqsave(&udc->lock, flags);
- mode = hw_port_test_get(udc);
- spin_unlock_irqrestore(&udc->lock, flags);
+ spin_lock_irqsave(&ci->lock, flags);
+ mode = hw_port_test_get(ci);
+ spin_unlock_irqrestore(&ci->lock, flags);
return scnprintf(buf, PAGE_SIZE, "mode = %u\n", mode);
}
@@ -549,24 +549,24 @@ static ssize_t store_port_test(struct device *dev,
struct device_attribute *attr,
const char *buf, size_t count)
{
- struct ci13xxx *udc = container_of(dev, struct ci13xxx, gadget.dev);
+ struct ci13xxx *ci = container_of(dev, struct ci13xxx, gadget.dev);
unsigned long flags;
unsigned mode;
if (attr == NULL || buf == NULL) {
- dev_err(udc->dev, "[%s] EINVAL\n", __func__);
+ dev_err(ci->dev, "[%s] EINVAL\n", __func__);
goto done;
}
if (sscanf(buf, "%u", &mode) != 1) {
- dev_err(udc->dev, "<mode>: set port test mode");
+ dev_err(ci->dev, "<mode>: set port test mode");
goto done;
}
- spin_lock_irqsave(&udc->lock, flags);
- if (hw_port_test_set(udc, mode))
- dev_err(udc->dev, "invalid mode\n");
- spin_unlock_irqrestore(&udc->lock, flags);
+ spin_lock_irqsave(&ci->lock, flags);
+ if (hw_port_test_set(ci, mode))
+ dev_err(ci->dev, "invalid mode\n");
+ spin_unlock_irqrestore(&ci->lock, flags);
done:
return count;
@@ -582,20 +582,20 @@ static DEVICE_ATTR(port_test, S_IRUSR | S_IWUSR,
static ssize_t show_qheads(struct device *dev, struct device_attribute *attr,
char *buf)
{
- struct ci13xxx *udc = container_of(dev, struct ci13xxx, gadget.dev);
+ struct ci13xxx *ci = container_of(dev, struct ci13xxx, gadget.dev);
unsigned long flags;
unsigned i, j, n = 0;
if (attr == NULL || buf == NULL) {
- dev_err(udc->dev, "[%s] EINVAL\n", __func__);
+ dev_err(ci->dev, "[%s] EINVAL\n", __func__);
return 0;
}
- spin_lock_irqsave(&udc->lock, flags);
- for (i = 0; i < udc->hw_ep_max/2; i++) {
- struct ci13xxx_ep *mEpRx = &udc->ci13xxx_ep[i];
+ spin_lock_irqsave(&ci->lock, flags);
+ for (i = 0; i < ci->hw_ep_max/2; i++) {
+ struct ci13xxx_ep *mEpRx = &ci->ci13xxx_ep[i];
struct ci13xxx_ep *mEpTx =
- &udc->ci13xxx_ep[i + udc->hw_ep_max/2];
+ &ci->ci13xxx_ep[i + ci->hw_ep_max/2];
n += scnprintf(buf + n, PAGE_SIZE - n,
"EP=%02i: RX=%08X TX=%08X\n",
i, (u32)mEpRx->qh.dma, (u32)mEpTx->qh.dma);
@@ -606,7 +606,7 @@ static ssize_t show_qheads(struct device *dev, struct device_attribute *attr,
*((u32 *)mEpTx->qh.ptr + j));
}
}
- spin_unlock_irqrestore(&udc->lock, flags);
+ spin_unlock_irqrestore(&ci->lock, flags);
return n;
}
@@ -621,25 +621,25 @@ static DEVICE_ATTR(qheads, S_IRUSR, show_qheads, NULL);
static ssize_t show_registers(struct device *dev,
struct device_attribute *attr, char *buf)
{
- struct ci13xxx *udc = container_of(dev, struct ci13xxx, gadget.dev);
+ struct ci13xxx *ci = container_of(dev, struct ci13xxx, gadget.dev);
unsigned long flags;
u32 *dump;
unsigned i, k, n = 0;
if (attr == NULL || buf == NULL) {
- dev_err(udc->dev, "[%s] EINVAL\n", __func__);
+ dev_err(ci->dev, "[%s] EINVAL\n", __func__);
return 0;
}
dump = kmalloc(sizeof(u32) * DUMP_ENTRIES, GFP_KERNEL);
if (!dump) {
- dev_err(udc->dev, "%s: out of memory\n", __func__);
+ dev_err(ci->dev, "%s: out of memory\n", __func__);
return 0;
}
- spin_lock_irqsave(&udc->lock, flags);
- k = hw_register_read(udc, dump, DUMP_ENTRIES);
- spin_unlock_irqrestore(&udc->lock, flags);
+ spin_lock_irqsave(&ci->lock, flags);
+ k = hw_register_read(ci, dump, DUMP_ENTRIES);
+ spin_unlock_irqrestore(&ci->lock, flags);
for (i = 0; i < k; i++) {
n += scnprintf(buf + n, PAGE_SIZE - n,
@@ -660,24 +660,24 @@ static ssize_t store_registers(struct device *dev,
struct device_attribute *attr,
const char *buf, size_t count)
{
- struct ci13xxx *udc = container_of(dev, struct ci13xxx, gadget.dev);
+ struct ci13xxx *ci = container_of(dev, struct ci13xxx, gadget.dev);
unsigned long addr, data, flags;
if (attr == NULL || buf == NULL) {
- dev_err(udc->dev, "[%s] EINVAL\n", __func__);
+ dev_err(ci->dev, "[%s] EINVAL\n", __func__);
goto done;
}
if (sscanf(buf, "%li %li", &addr, &data) != 2) {
- dev_err(udc->dev,
+ dev_err(ci->dev,
"<addr> <data>: write data to register address\n");
goto done;
}
- spin_lock_irqsave(&udc->lock, flags);
- if (hw_register_write(udc, addr, data))
- dev_err(udc->dev, "invalid address range\n");
- spin_unlock_irqrestore(&udc->lock, flags);
+ spin_lock_irqsave(&ci->lock, flags);
+ if (hw_register_write(ci, addr, data))
+ dev_err(ci->dev, "invalid address range\n");
+ spin_unlock_irqrestore(&ci->lock, flags);
done:
return count;
@@ -693,34 +693,34 @@ static DEVICE_ATTR(registers, S_IRUSR | S_IWUSR,
static ssize_t show_requests(struct device *dev, struct device_attribute *attr,
char *buf)
{
- struct ci13xxx *udc = container_of(dev, struct ci13xxx, gadget.dev);
+ struct ci13xxx *ci = container_of(dev, struct ci13xxx, gadget.dev);
unsigned long flags;
struct list_head *ptr = NULL;
struct ci13xxx_req *req = NULL;
unsigned i, j, n = 0, qSize = sizeof(struct ci13xxx_td)/sizeof(u32);
if (attr == NULL || buf == NULL) {
- dev_err(udc->dev, "[%s] EINVAL\n", __func__);
+ dev_err(ci->dev, "[%s] EINVAL\n", __func__);
return 0;
}
- spin_lock_irqsave(&udc->lock, flags);
- for (i = 0; i < udc->hw_ep_max; i++)
- list_for_each(ptr, &udc->ci13xxx_ep[i].qh.queue)
+ spin_lock_irqsave(&ci->lock, flags);
+ for (i = 0; i < ci->hw_ep_max; i++)
+ list_for_each(ptr, &ci->ci13xxx_ep[i].qh.queue)
{
req = list_entry(ptr, struct ci13xxx_req, queue);
n += scnprintf(buf + n, PAGE_SIZE - n,
"EP=%02i: TD=%08X %s\n",
- i % udc->hw_ep_max/2, (u32)req->dma,
- ((i < udc->hw_ep_max/2) ? "RX" : "TX"));
+ i % ci->hw_ep_max/2, (u32)req->dma,
+ ((i < ci->hw_ep_max/2) ? "RX" : "TX"));
for (j = 0; j < qSize; j++)
n += scnprintf(buf + n, PAGE_SIZE - n,
" %04X: %08X\n", j,
*((u32 *)req->ptr + j));
}
- spin_unlock_irqrestore(&udc->lock, flags);
+ spin_unlock_irqrestore(&ci->lock, flags);
return n;
}
diff --git a/drivers/usb/chipidea/udc.c b/drivers/usb/chipidea/udc.c
index 68584bb..93efdcd 100644
--- a/drivers/usb/chipidea/udc.c
+++ b/drivers/usb/chipidea/udc.c
@@ -66,11 +66,11 @@ static inline int hw_ep_bit(int num, int dir)
return num + (dir ? 16 : 0);
}
-static inline int ep_to_bit(struct ci13xxx *udc, int n)
+static inline int ep_to_bit(struct ci13xxx *ci, int n)
{
- int fill = 16 - udc->hw_ep_max / 2;
+ int fill = 16 - ci->hw_ep_max / 2;
- if (n >= udc->hw_ep_max / 2)
+ if (n >= ci->hw_ep_max / 2)
n += fill;
return n;
@@ -83,17 +83,17 @@ static inline int ep_to_bit(struct ci13xxx *udc, int n)
*
* This function returns an error code
*/
-static int hw_device_state(struct ci13xxx *udc, u32 dma)
+static int hw_device_state(struct ci13xxx *ci, u32 dma)
{
if (dma) {
- hw_write(udc, OP_ENDPTLISTADDR, ~0, dma);
+ hw_write(ci, OP_ENDPTLISTADDR, ~0, dma);
/* interrupt, error, port change, reset, sleep/suspend */
- hw_write(udc, OP_USBINTR, ~0,
+ hw_write(ci, OP_USBINTR, ~0,
USBi_UI|USBi_UEI|USBi_PCI|USBi_URI|USBi_SLI);
- hw_write(udc, OP_USBCMD, USBCMD_RS, USBCMD_RS);
+ hw_write(ci, OP_USBCMD, USBCMD_RS, USBCMD_RS);
} else {
- hw_write(udc, OP_USBCMD, USBCMD_RS, 0);
- hw_write(udc, OP_USBINTR, ~0, 0);
+ hw_write(ci, OP_USBCMD, USBCMD_RS, 0);
+ hw_write(ci, OP_USBINTR, ~0, 0);
}
return 0;
}
@@ -105,16 +105,16 @@ static int hw_device_state(struct ci13xxx *udc, u32 dma)
*
* This function returns an error code
*/
-static int hw_ep_flush(struct ci13xxx *udc, int num, int dir)
+static int hw_ep_flush(struct ci13xxx *ci, int num, int dir)
{
int n = hw_ep_bit(num, dir);
do {
/* flush any pending transfer */
- hw_write(udc, OP_ENDPTFLUSH, BIT(n), BIT(n));
- while (hw_read(udc, OP_ENDPTFLUSH, BIT(n)))
+ hw_write(ci, OP_ENDPTFLUSH, BIT(n), BIT(n));
+ while (hw_read(ci, OP_ENDPTFLUSH, BIT(n)))
cpu_relax();
- } while (hw_read(udc, OP_ENDPTSTAT, BIT(n)));
+ } while (hw_read(ci, OP_ENDPTSTAT, BIT(n)));
return 0;
}
@@ -126,10 +126,10 @@ static int hw_ep_flush(struct ci13xxx *udc, int num, int dir)
*
* This function returns an error code
*/
-static int hw_ep_disable(struct ci13xxx *udc, int num, int dir)
+static int hw_ep_disable(struct ci13xxx *ci, int num, int dir)
{
- hw_ep_flush(udc, num, dir);
- hw_write(udc, OP_ENDPTCTRL + num,
+ hw_ep_flush(ci, num, dir);
+ hw_write(ci, OP_ENDPTCTRL + num,
dir ? ENDPTCTRL_TXE : ENDPTCTRL_RXE, 0);
return 0;
}
@@ -142,7 +142,7 @@ static int hw_ep_disable(struct ci13xxx *udc, int num, int dir)
*
* This function returns an error code
*/
-static int hw_ep_enable(struct ci13xxx *udc, int num, int dir, int type)
+static int hw_ep_enable(struct ci13xxx *ci, int num, int dir, int type)
{
u32 mask, data;
@@ -165,7 +165,7 @@ static int hw_ep_enable(struct ci13xxx *udc, int num, int dir, int type)
mask |= ENDPTCTRL_RXE; /* enable */
data |= ENDPTCTRL_RXE;
}
- hw_write(udc, OP_ENDPTCTRL + num, mask, data);
+ hw_write(ci, OP_ENDPTCTRL + num, mask, data);
return 0;
}
@@ -176,11 +176,11 @@ static int hw_ep_enable(struct ci13xxx *udc, int num, int dir, int type)
*
* This function returns 1 if endpoint halted
*/
-static int hw_ep_get_halt(struct ci13xxx *udc, int num, int dir)
+static int hw_ep_get_halt(struct ci13xxx *ci, int num, int dir)
{
u32 mask = dir ? ENDPTCTRL_TXS : ENDPTCTRL_RXS;
- return hw_read(udc, OP_ENDPTCTRL + num, mask) ? 1 : 0;
+ return hw_read(ci, OP_ENDPTCTRL + num, mask) ? 1 : 0;
}
/**
@@ -190,10 +190,10 @@ static int hw_ep_get_halt(struct ci13xxx *udc, int num, int dir)
*
* This function returns setup status
*/
-static int hw_test_and_clear_setup_status(struct ci13xxx *udc, int n)
+static int hw_test_and_clear_setup_status(struct ci13xxx *ci, int n)
{
- n = ep_to_bit(udc, n);
- return hw_test_and_clear(udc, OP_ENDPTSETUPSTAT, BIT(n));
+ n = ep_to_bit(ci, n);
+ return hw_test_and_clear(ci, OP_ENDPTSETUPSTAT, BIT(n));
}
/**
@@ -204,18 +204,18 @@ static int hw_test_and_clear_setup_status(struct ci13xxx *udc, int n)
*
* This function returns an error code
*/
-static int hw_ep_prime(struct ci13xxx *udc, int num, int dir, int is_ctrl)
+static int hw_ep_prime(struct ci13xxx *ci, int num, int dir, int is_ctrl)
{
int n = hw_ep_bit(num, dir);
- if (is_ctrl && dir == RX && hw_read(udc, OP_ENDPTSETUPSTAT, BIT(num)))
+ if (is_ctrl && dir == RX && hw_read(ci, OP_ENDPTSETUPSTAT, BIT(num)))
return -EAGAIN;
- hw_write(udc, OP_ENDPTPRIME, BIT(n), BIT(n));
+ hw_write(ci, OP_ENDPTPRIME, BIT(n), BIT(n));
- while (hw_read(udc, OP_ENDPTPRIME, BIT(n)))
+ while (hw_read(ci, OP_ENDPTPRIME, BIT(n)))
cpu_relax();
- if (is_ctrl && dir == RX && hw_read(udc, OP_ENDPTSETUPSTAT, BIT(num)))
+ if (is_ctrl && dir == RX && hw_read(ci, OP_ENDPTSETUPSTAT, BIT(num)))
return -EAGAIN;
/* status shoult be tested according with manual but it doesn't work */
@@ -231,7 +231,7 @@ static int hw_ep_prime(struct ci13xxx *udc, int num, int dir, int is_ctrl)
*
* This function returns an error code
*/
-static int hw_ep_set_halt(struct ci13xxx *udc, int num, int dir, int value)
+static int hw_ep_set_halt(struct ci13xxx *ci, int num, int dir, int value)
{
if (value != 0 && value != 1)
return -EINVAL;
@@ -242,9 +242,9 @@ static int hw_ep_set_halt(struct ci13xxx *udc, int num, int dir, int value)
u32 mask_xr = dir ? ENDPTCTRL_TXR : ENDPTCTRL_RXR;
/* data toggle - reserved for EP0 but it's in ESS */
- hw_write(udc, reg, mask_xs|mask_xr,
+ hw_write(ci, reg, mask_xs|mask_xr,
value ? mask_xs : mask_xr);
- } while (value != hw_ep_get_halt(udc, num, dir));
+ } while (value != hw_ep_get_halt(ci, num, dir));
return 0;
}
@@ -254,10 +254,10 @@ static int hw_ep_set_halt(struct ci13xxx *udc, int num, int dir, int value)
*
* This function returns true if high speed port
*/
-static int hw_port_is_high_speed(struct ci13xxx *udc)
+static int hw_port_is_high_speed(struct ci13xxx *ci)
{
- return udc->hw_bank.lpm ? hw_read(udc, OP_DEVLC, DEVLC_PSPD) :
- hw_read(udc, OP_PORTSC, PORTSC_HSP);
+ return ci->hw_bank.lpm ? hw_read(ci, OP_DEVLC, DEVLC_PSPD) :
+ hw_read(ci, OP_PORTSC, PORTSC_HSP);
}
/**
@@ -265,9 +265,9 @@ static int hw_port_is_high_speed(struct ci13xxx *udc)
*
* This function returns register data
*/
-static u32 hw_read_intr_enable(struct ci13xxx *udc)
+static u32 hw_read_intr_enable(struct ci13xxx *ci)
{
- return hw_read(udc, OP_USBINTR, ~0);
+ return hw_read(ci, OP_USBINTR, ~0);
}
/**
@@ -275,9 +275,9 @@ static u32 hw_read_intr_enable(struct ci13xxx *udc)
*
* This function returns register data
*/
-static u32 hw_read_intr_status(struct ci13xxx *udc)
+static u32 hw_read_intr_status(struct ci13xxx *ci)
{
- return hw_read(udc, OP_USBSTS, ~0);
+ return hw_read(ci, OP_USBSTS, ~0);
}
/**
@@ -287,10 +287,10 @@ static u32 hw_read_intr_status(struct ci13xxx *udc)
*
* This function returns complete status
*/
-static int hw_test_and_clear_complete(struct ci13xxx *udc, int n)
+static int hw_test_and_clear_complete(struct ci13xxx *ci, int n)
{
- n = ep_to_bit(udc, n);
- return hw_test_and_clear(udc, OP_ENDPTCOMPLETE, BIT(n));
+ n = ep_to_bit(ci, n);
+ return hw_test_and_clear(ci, OP_ENDPTCOMPLETE, BIT(n));
}
/**
@@ -299,11 +299,11 @@ static int hw_test_and_clear_complete(struct ci13xxx *udc, int n)
*
* This function returns active interrutps
*/
-static u32 hw_test_and_clear_intr_active(struct ci13xxx *udc)
+static u32 hw_test_and_clear_intr_active(struct ci13xxx *ci)
{
- u32 reg = hw_read_intr_status(udc) & hw_read_intr_enable(udc);
+ u32 reg = hw_read_intr_status(ci) & hw_read_intr_enable(ci);
- hw_write(udc, OP_USBSTS, ~0, reg);
+ hw_write(ci, OP_USBSTS, ~0, reg);
return reg;
}
@@ -313,9 +313,9 @@ static u32 hw_test_and_clear_intr_active(struct ci13xxx *udc)
*
* This function returns guard value
*/
-static int hw_test_and_clear_setup_guard(struct ci13xxx *udc)
+static int hw_test_and_clear_setup_guard(struct ci13xxx *ci)
{
- return hw_test_and_write(udc, OP_USBCMD, USBCMD_SUTW, 0);
+ return hw_test_and_write(ci, OP_USBCMD, USBCMD_SUTW, 0);
}
/**
@@ -324,9 +324,9 @@ static int hw_test_and_clear_setup_guard(struct ci13xxx *udc)
*
* This function returns guard value
*/
-static int hw_test_and_set_setup_guard(struct ci13xxx *udc)
+static int hw_test_and_set_setup_guard(struct ci13xxx *ci)
{
- return hw_test_and_write(udc, OP_USBCMD, USBCMD_SUTW, USBCMD_SUTW);
+ return hw_test_and_write(ci, OP_USBCMD, USBCMD_SUTW, USBCMD_SUTW);
}
/**
@@ -336,9 +336,9 @@ static int hw_test_and_set_setup_guard(struct ci13xxx *udc)
* This function explicitly sets the address, without the "USBADRA" (advance)
* feature, which is not supported by older versions of the controller.
*/
-static void hw_usb_set_address(struct ci13xxx *udc, u8 value)
+static void hw_usb_set_address(struct ci13xxx *ci, u8 value)
{
- hw_write(udc, OP_DEVICEADDR, DEVICEADDR_USBADR,
+ hw_write(ci, OP_DEVICEADDR, DEVICEADDR_USBADR,
value << ffs_nr(DEVICEADDR_USBADR));
}
@@ -348,21 +348,21 @@ static void hw_usb_set_address(struct ci13xxx *udc, u8 value)
*
* This function returns an error code
*/
-static int hw_usb_reset(struct ci13xxx *udc)
+static int hw_usb_reset(struct ci13xxx *ci)
{
- hw_usb_set_address(udc, 0);
+ hw_usb_set_address(ci, 0);
/* ESS flushes only@end?!? */
- hw_write(udc, OP_ENDPTFLUSH, ~0, ~0);
+ hw_write(ci, OP_ENDPTFLUSH, ~0, ~0);
/* clear setup token semaphores */
- hw_write(udc, OP_ENDPTSETUPSTAT, 0, 0);
+ hw_write(ci, OP_ENDPTSETUPSTAT, 0, 0);
/* clear complete status */
- hw_write(udc, OP_ENDPTCOMPLETE, 0, 0);
+ hw_write(ci, OP_ENDPTCOMPLETE, 0, 0);
/* wait until all bits cleared */
- while (hw_read(udc, OP_ENDPTPRIME, ~0))
+ while (hw_read(ci, OP_ENDPTPRIME, ~0))
udelay(10); /* not RTOS friendly */
/* reset all endpoints ? */
@@ -394,7 +394,7 @@ static inline u8 _usb_addr(struct ci13xxx_ep *ep)
*/
static int _hardware_enqueue(struct ci13xxx_ep *mEp, struct ci13xxx_req *mReq)
{
- struct ci13xxx *udc = mEp->udc;
+ struct ci13xxx *ci = mEp->ci;
unsigned i;
int ret = 0;
unsigned length = mReq->req.length;
@@ -417,7 +417,7 @@ static int _hardware_enqueue(struct ci13xxx_ep *mEp, struct ci13xxx_req *mReq)
if (!mReq->req.no_interrupt)
mReq->zptr->token |= TD_IOC;
}
- ret = usb_gadget_map_request(&udc->gadget, &mReq->req, mEp->dir);
+ ret = usb_gadget_map_request(&ci->gadget, &mReq->req, mEp->dir);
if (ret)
return ret;
@@ -453,13 +453,13 @@ static int _hardware_enqueue(struct ci13xxx_ep *mEp, struct ci13xxx_req *mReq)
else
mReqPrev->ptr->next = mReq->dma & TD_ADDR_MASK;
wmb();
- if (hw_read(udc, OP_ENDPTPRIME, BIT(n)))
+ if (hw_read(ci, OP_ENDPTPRIME, BIT(n)))
goto done;
do {
- hw_write(udc, OP_USBCMD, USBCMD_ATDTW, USBCMD_ATDTW);
- tmp_stat = hw_read(udc, OP_ENDPTSTAT, BIT(n));
- } while (!hw_read(udc, OP_USBCMD, USBCMD_ATDTW));
- hw_write(udc, OP_USBCMD, USBCMD_ATDTW, 0);
+ hw_write(ci, OP_USBCMD, USBCMD_ATDTW, USBCMD_ATDTW);
+ tmp_stat = hw_read(ci, OP_ENDPTSTAT, BIT(n));
+ } while (!hw_read(ci, OP_USBCMD, USBCMD_ATDTW));
+ hw_write(ci, OP_USBCMD, USBCMD_ATDTW, 0);
if (tmp_stat)
goto done;
}
@@ -471,7 +471,7 @@ static int _hardware_enqueue(struct ci13xxx_ep *mEp, struct ci13xxx_req *mReq)
wmb(); /* synchronize before ep prime */
- ret = hw_ep_prime(udc, mEp->num, mEp->dir,
+ ret = hw_ep_prime(ci, mEp->num, mEp->dir,
mEp->type == USB_ENDPOINT_XFER_CONTROL);
done:
return ret;
@@ -501,7 +501,7 @@ static int _hardware_dequeue(struct ci13xxx_ep *mEp, struct ci13xxx_req *mReq)
mReq->req.status = 0;
- usb_gadget_unmap_request(&mEp->udc->gadget, &mReq->req, mEp->dir);
+ usb_gadget_unmap_request(&mEp->ci->gadget, &mReq->req, mEp->dir);
mReq->req.status = mReq->ptr->token & TD_STATUS;
if ((TD_STATUS_HALTED & mReq->req.status) != 0)
@@ -533,7 +533,7 @@ __acquires(mEp->lock)
if (mEp == NULL)
return -EINVAL;
- hw_ep_flush(mEp->udc, mEp->num, mEp->dir);
+ hw_ep_flush(mEp->ci, mEp->num, mEp->dir);
while (!list_empty(&mEp->qh.queue)) {
@@ -562,33 +562,33 @@ __acquires(mEp->lock)
static int _gadget_stop_activity(struct usb_gadget *gadget)
{
struct usb_ep *ep;
- struct ci13xxx *udc = container_of(gadget, struct ci13xxx, gadget);
+ struct ci13xxx *ci = container_of(gadget, struct ci13xxx, gadget);
unsigned long flags;
- spin_lock_irqsave(&udc->lock, flags);
- udc->gadget.speed = USB_SPEED_UNKNOWN;
- udc->remote_wakeup = 0;
- udc->suspended = 0;
- spin_unlock_irqrestore(&udc->lock, flags);
+ spin_lock_irqsave(&ci->lock, flags);
+ ci->gadget.speed = USB_SPEED_UNKNOWN;
+ ci->remote_wakeup = 0;
+ ci->suspended = 0;
+ spin_unlock_irqrestore(&ci->lock, flags);
/* flush all endpoints */
gadget_for_each_ep(ep, gadget) {
usb_ep_fifo_flush(ep);
}
- usb_ep_fifo_flush(&udc->ep0out->ep);
- usb_ep_fifo_flush(&udc->ep0in->ep);
+ usb_ep_fifo_flush(&ci->ep0out->ep);
+ usb_ep_fifo_flush(&ci->ep0in->ep);
- if (udc->driver)
- udc->driver->disconnect(gadget);
+ if (ci->driver)
+ ci->driver->disconnect(gadget);
/* make sure to disable all endpoints */
gadget_for_each_ep(ep, gadget) {
usb_ep_disable(ep);
}
- if (udc->status != NULL) {
- usb_ep_free_request(&udc->ep0in->ep, udc->status);
- udc->status = NULL;
+ if (ci->status != NULL) {
+ usb_ep_free_request(&ci->ep0in->ep, ci->status);
+ ci->status = NULL;
}
return 0;
@@ -599,36 +599,36 @@ static int _gadget_stop_activity(struct usb_gadget *gadget)
*****************************************************************************/
/**
* isr_reset_handler: USB reset interrupt handler
- * @udc: UDC device
+ * @ci: UDC device
*
* This function resets USB engine after a bus reset occurred
*/
-static void isr_reset_handler(struct ci13xxx *udc)
-__releases(udc->lock)
-__acquires(udc->lock)
+static void isr_reset_handler(struct ci13xxx *ci)
+__releases(ci->lock)
+__acquires(ci->lock)
{
int retval;
dbg_event(0xFF, "BUS RST", 0);
- spin_unlock(&udc->lock);
- retval = _gadget_stop_activity(&udc->gadget);
+ spin_unlock(&ci->lock);
+ retval = _gadget_stop_activity(&ci->gadget);
if (retval)
goto done;
- retval = hw_usb_reset(udc);
+ retval = hw_usb_reset(ci);
if (retval)
goto done;
- udc->status = usb_ep_alloc_request(&udc->ep0in->ep, GFP_ATOMIC);
- if (udc->status == NULL)
+ ci->status = usb_ep_alloc_request(&ci->ep0in->ep, GFP_ATOMIC);
+ if (ci->status == NULL)
retval = -ENOMEM;
done:
- spin_lock(&udc->lock);
+ spin_lock(&ci->lock);
if (retval)
- dev_err(udc->dev, "error: %i\n", retval);
+ dev_err(ci->dev, "error: %i\n", retval);
}
/**
@@ -649,17 +649,17 @@ static void isr_get_status_complete(struct usb_ep *ep, struct usb_request *req)
/**
* isr_get_status_response: get_status request response
- * @udc: udc struct
+ * @ci: ci struct
* @setup: setup request packet
*
* This function returns an error code
*/
-static int isr_get_status_response(struct ci13xxx *udc,
+static int isr_get_status_response(struct ci13xxx *ci,
struct usb_ctrlrequest *setup)
__releases(mEp->lock)
__acquires(mEp->lock)
{
- struct ci13xxx_ep *mEp = udc->ep0in;
+ struct ci13xxx_ep *mEp = ci->ep0in;
struct usb_request *req = NULL;
gfp_t gfp_flags = GFP_ATOMIC;
int dir, num, retval;
@@ -683,14 +683,14 @@ __acquires(mEp->lock)
if ((setup->bRequestType & USB_RECIP_MASK) == USB_RECIP_DEVICE) {
/* Assume that device is bus powered for now. */
- *(u16 *)req->buf = udc->remote_wakeup << 1;
+ *(u16 *)req->buf = ci->remote_wakeup << 1;
retval = 0;
} else if ((setup->bRequestType & USB_RECIP_MASK) \
== USB_RECIP_ENDPOINT) {
dir = (le16_to_cpu(setup->wIndex) & USB_ENDPOINT_DIR_MASK) ?
TX : RX;
num = le16_to_cpu(setup->wIndex) & USB_ENDPOINT_NUMBER_MASK;
- *(u16 *)req->buf = hw_ep_get_halt(udc, num, dir);
+ *(u16 *)req->buf = hw_ep_get_halt(ci, num, dir);
}
/* else do nothing; reserved for future use */
@@ -722,39 +722,39 @@ __acquires(mEp->lock)
static void
isr_setup_status_complete(struct usb_ep *ep, struct usb_request *req)
{
- struct ci13xxx *udc = req->context;
+ struct ci13xxx *ci = req->context;
unsigned long flags;
- if (udc->setaddr) {
- hw_usb_set_address(udc, udc->address);
- udc->setaddr = false;
+ if (ci->setaddr) {
+ hw_usb_set_address(ci, ci->address);
+ ci->setaddr = false;
}
- spin_lock_irqsave(&udc->lock, flags);
- if (udc->test_mode)
- hw_port_test_set(udc, udc->test_mode);
- spin_unlock_irqrestore(&udc->lock, flags);
+ spin_lock_irqsave(&ci->lock, flags);
+ if (ci->test_mode)
+ hw_port_test_set(ci, ci->test_mode);
+ spin_unlock_irqrestore(&ci->lock, flags);
}
/**
* isr_setup_status_phase: queues the status phase of a setup transation
- * @udc: udc struct
+ * @ci: ci struct
*
* This function returns an error code
*/
-static int isr_setup_status_phase(struct ci13xxx *udc)
+static int isr_setup_status_phase(struct ci13xxx *ci)
__releases(mEp->lock)
__acquires(mEp->lock)
{
int retval;
struct ci13xxx_ep *mEp;
- mEp = (udc->ep0_dir == TX) ? udc->ep0out : udc->ep0in;
- udc->status->context = udc;
- udc->status->complete = isr_setup_status_complete;
+ mEp = (ci->ep0_dir == TX) ? ci->ep0out : ci->ep0in;
+ ci->status->context = ci;
+ ci->status->complete = isr_setup_status_complete;
spin_unlock(mEp->lock);
- retval = usb_ep_queue(&mEp->ep, udc->status, GFP_ATOMIC);
+ retval = usb_ep_queue(&mEp->ep, ci->status, GFP_ATOMIC);
spin_lock(mEp->lock);
return retval;
@@ -789,7 +789,7 @@ __acquires(mEp->lock)
spin_unlock(mEp->lock);
if ((mEp->type == USB_ENDPOINT_XFER_CONTROL) &&
mReq->req.length)
- mEpTemp = mEp->udc->ep0in;
+ mEpTemp = mEp->ci->ep0in;
mReq->req.complete(&mEpTemp->ep, &mReq->req);
spin_lock(mEp->lock);
}
@@ -805,48 +805,48 @@ __acquires(mEp->lock)
/**
* isr_tr_complete_handler: transaction complete interrupt handler
- * @udc: UDC descriptor
+ * @ci: UDC descriptor
*
* This function handles traffic events
*/
-static void isr_tr_complete_handler(struct ci13xxx *udc)
-__releases(udc->lock)
-__acquires(udc->lock)
+static void isr_tr_complete_handler(struct ci13xxx *ci)
+__releases(ci->lock)
+__acquires(ci->lock)
{
unsigned i;
u8 tmode = 0;
- for (i = 0; i < udc->hw_ep_max; i++) {
- struct ci13xxx_ep *mEp = &udc->ci13xxx_ep[i];
+ for (i = 0; i < ci->hw_ep_max; i++) {
+ struct ci13xxx_ep *mEp = &ci->ci13xxx_ep[i];
int type, num, dir, err = -EINVAL;
struct usb_ctrlrequest req;
if (mEp->ep.desc == NULL)
continue; /* not configured */
- if (hw_test_and_clear_complete(udc, i)) {
+ if (hw_test_and_clear_complete(ci, i)) {
err = isr_tr_complete_low(mEp);
if (mEp->type == USB_ENDPOINT_XFER_CONTROL) {
if (err > 0) /* needs status phase */
- err = isr_setup_status_phase(udc);
+ err = isr_setup_status_phase(ci);
if (err < 0) {
dbg_event(_usb_addr(mEp),
"ERROR", err);
- spin_unlock(&udc->lock);
+ spin_unlock(&ci->lock);
if (usb_ep_set_halt(&mEp->ep))
- dev_err(udc->dev,
+ dev_err(ci->dev,
"error: ep_set_halt\n");
- spin_lock(&udc->lock);
+ spin_lock(&ci->lock);
}
}
}
if (mEp->type != USB_ENDPOINT_XFER_CONTROL ||
- !hw_test_and_clear_setup_status(udc, i))
+ !hw_test_and_clear_setup_status(ci, i))
continue;
if (i != 0) {
- dev_warn(udc->dev, "ctrl traffic at endpoint %d\n", i);
+ dev_warn(ci->dev, "ctrl traffic at endpoint %d\n", i);
continue;
}
@@ -854,18 +854,18 @@ __acquires(udc->lock)
* Flush data and handshake transactions of previous
* setup packet.
*/
- _ep_nuke(udc->ep0out);
- _ep_nuke(udc->ep0in);
+ _ep_nuke(ci->ep0out);
+ _ep_nuke(ci->ep0in);
/* read_setup_packet */
do {
- hw_test_and_set_setup_guard(udc);
+ hw_test_and_set_setup_guard(ci);
memcpy(&req, &mEp->qh.ptr->setup, sizeof(req));
- } while (!hw_test_and_clear_setup_guard(udc));
+ } while (!hw_test_and_clear_setup_guard(ci));
type = req.bRequestType;
- udc->ep0_dir = (type & USB_DIR_IN) ? TX : RX;
+ ci->ep0_dir = (type & USB_DIR_IN) ? TX : RX;
dbg_setup(_usb_addr(mEp), &req);
@@ -880,23 +880,23 @@ __acquires(udc->lock)
dir = num & USB_ENDPOINT_DIR_MASK;
num &= USB_ENDPOINT_NUMBER_MASK;
if (dir) /* TX */
- num += udc->hw_ep_max/2;
- if (!udc->ci13xxx_ep[num].wedge) {
- spin_unlock(&udc->lock);
+ num += ci->hw_ep_max/2;
+ if (!ci->ci13xxx_ep[num].wedge) {
+ spin_unlock(&ci->lock);
err = usb_ep_clear_halt(
- &udc->ci13xxx_ep[num].ep);
- spin_lock(&udc->lock);
+ &ci->ci13xxx_ep[num].ep);
+ spin_lock(&ci->lock);
if (err)
break;
}
- err = isr_setup_status_phase(udc);
+ err = isr_setup_status_phase(ci);
} else if (type == (USB_DIR_OUT|USB_RECIP_DEVICE) &&
le16_to_cpu(req.wValue) ==
USB_DEVICE_REMOTE_WAKEUP) {
if (req.wLength != 0)
break;
- udc->remote_wakeup = 0;
- err = isr_setup_status_phase(udc);
+ ci->remote_wakeup = 0;
+ err = isr_setup_status_phase(ci);
} else {
goto delegate;
}
@@ -909,7 +909,7 @@ __acquires(udc->lock)
if (le16_to_cpu(req.wLength) != 2 ||
le16_to_cpu(req.wValue) != 0)
break;
- err = isr_get_status_response(udc, &req);
+ err = isr_get_status_response(ci, &req);
break;
case USB_REQ_SET_ADDRESS:
if (type != (USB_DIR_OUT|USB_RECIP_DEVICE))
@@ -917,9 +917,9 @@ __acquires(udc->lock)
if (le16_to_cpu(req.wLength) != 0 ||
le16_to_cpu(req.wIndex) != 0)
break;
- udc->address = (u8)le16_to_cpu(req.wValue);
- udc->setaddr = true;
- err = isr_setup_status_phase(udc);
+ ci->address = (u8)le16_to_cpu(req.wValue);
+ ci->setaddr = true;
+ err = isr_setup_status_phase(ci);
break;
case USB_REQ_SET_FEATURE:
if (type == (USB_DIR_OUT|USB_RECIP_ENDPOINT) &&
@@ -931,20 +931,20 @@ __acquires(udc->lock)
dir = num & USB_ENDPOINT_DIR_MASK;
num &= USB_ENDPOINT_NUMBER_MASK;
if (dir) /* TX */
- num += udc->hw_ep_max/2;
+ num += ci->hw_ep_max/2;
- spin_unlock(&udc->lock);
- err = usb_ep_set_halt(&udc->ci13xxx_ep[num].ep);
- spin_lock(&udc->lock);
+ spin_unlock(&ci->lock);
+ err = usb_ep_set_halt(&ci->ci13xxx_ep[num].ep);
+ spin_lock(&ci->lock);
if (!err)
- isr_setup_status_phase(udc);
+ isr_setup_status_phase(ci);
} else if (type == (USB_DIR_OUT|USB_RECIP_DEVICE)) {
if (req.wLength != 0)
break;
switch (le16_to_cpu(req.wValue)) {
case USB_DEVICE_REMOTE_WAKEUP:
- udc->remote_wakeup = 1;
- err = isr_setup_status_phase(udc);
+ ci->remote_wakeup = 1;
+ err = isr_setup_status_phase(ci);
break;
case USB_DEVICE_TEST_MODE:
tmode = le16_to_cpu(req.wIndex) >> 8;
@@ -954,9 +954,9 @@ __acquires(udc->lock)
case TEST_SE0_NAK:
case TEST_PACKET:
case TEST_FORCE_EN:
- udc->test_mode = tmode;
+ ci->test_mode = tmode;
err = isr_setup_status_phase(
- udc);
+ ci);
break;
default:
break;
@@ -971,21 +971,21 @@ __acquires(udc->lock)
default:
delegate:
if (req.wLength == 0) /* no data phase */
- udc->ep0_dir = TX;
+ ci->ep0_dir = TX;
- spin_unlock(&udc->lock);
- err = udc->driver->setup(&udc->gadget, &req);
- spin_lock(&udc->lock);
+ spin_unlock(&ci->lock);
+ err = ci->driver->setup(&ci->gadget, &req);
+ spin_lock(&ci->lock);
break;
}
if (err < 0) {
dbg_event(_usb_addr(mEp), "ERROR", err);
- spin_unlock(&udc->lock);
+ spin_unlock(&ci->lock);
if (usb_ep_set_halt(&mEp->ep))
- dev_err(udc->dev, "error: ep_set_halt\n");
- spin_lock(&udc->lock);
+ dev_err(ci->dev, "error: ep_set_halt\n");
+ spin_lock(&ci->lock);
}
}
}
@@ -1015,7 +1015,7 @@ static int ep_enable(struct usb_ep *ep,
mEp->ep.desc = desc;
if (!list_empty(&mEp->qh.queue))
- dev_warn(mEp->udc->dev, "enabling a non-empty endpoint!\n");
+ dev_warn(mEp->ci->dev, "enabling a non-empty endpoint!\n");
mEp->dir = usb_endpoint_dir_in(desc) ? TX : RX;
mEp->num = usb_endpoint_num(desc);
@@ -1043,7 +1043,7 @@ static int ep_enable(struct usb_ep *ep,
* is always enabled
*/
if (mEp->num)
- retval |= hw_ep_enable(mEp->udc, mEp->num, mEp->dir, mEp->type);
+ retval |= hw_ep_enable(mEp->ci, mEp->num, mEp->dir, mEp->type);
spin_unlock_irqrestore(mEp->lock, flags);
return retval;
@@ -1074,7 +1074,7 @@ static int ep_disable(struct usb_ep *ep)
dbg_event(_usb_addr(mEp), "DISABLE", 0);
retval |= _ep_nuke(mEp);
- retval |= hw_ep_disable(mEp->udc, mEp->num, mEp->dir);
+ retval |= hw_ep_disable(mEp->ci, mEp->num, mEp->dir);
if (mEp->type == USB_ENDPOINT_XFER_CONTROL)
mEp->dir = (mEp->dir == TX) ? RX : TX;
@@ -1131,7 +1131,7 @@ static void ep_free_request(struct usb_ep *ep, struct usb_request *req)
if (ep == NULL || req == NULL) {
return;
} else if (!list_empty(&mReq->queue)) {
- dev_err(mEp->udc->dev, "freeing queued request\n");
+ dev_err(mEp->ci->dev, "freeing queued request\n");
return;
}
@@ -1156,7 +1156,7 @@ static int ep_queue(struct usb_ep *ep, struct usb_request *req,
{
struct ci13xxx_ep *mEp = container_of(ep, struct ci13xxx_ep, ep);
struct ci13xxx_req *mReq = container_of(req, struct ci13xxx_req, req);
- struct ci13xxx *udc = mEp->udc;
+ struct ci13xxx *ci = mEp->ci;
int retval = 0;
unsigned long flags;
@@ -1167,12 +1167,12 @@ static int ep_queue(struct usb_ep *ep, struct usb_request *req,
if (mEp->type == USB_ENDPOINT_XFER_CONTROL) {
if (req->length)
- mEp = (udc->ep0_dir == RX) ?
- udc->ep0out : udc->ep0in;
+ mEp = (ci->ep0_dir == RX) ?
+ ci->ep0out : ci->ep0in;
if (!list_empty(&mEp->qh.queue)) {
_ep_nuke(mEp);
retval = -EOVERFLOW;
- dev_warn(mEp->udc->dev, "endpoint ctrl %X nuked\n",
+ dev_warn(mEp->ci->dev, "endpoint ctrl %X nuked\n",
_usb_addr(mEp));
}
}
@@ -1180,14 +1180,14 @@ static int ep_queue(struct usb_ep *ep, struct usb_request *req,
/* first nuke then test link, e.g. previous status has not sent */
if (!list_empty(&mReq->queue)) {
retval = -EBUSY;
- dev_err(mEp->udc->dev, "request already in queue\n");
+ dev_err(mEp->ci->dev, "request already in queue\n");
goto done;
}
if (req->length > 4 * CI13XXX_PAGE_SIZE) {
req->length = 4 * CI13XXX_PAGE_SIZE;
retval = -EMSGSIZE;
- dev_warn(mEp->udc->dev, "request length truncated\n");
+ dev_warn(mEp->ci->dev, "request length truncated\n");
}
dbg_queue(_usb_addr(mEp), req, retval);
@@ -1230,12 +1230,12 @@ static int ep_dequeue(struct usb_ep *ep, struct usb_request *req)
dbg_event(_usb_addr(mEp), "DEQUEUE", 0);
- hw_ep_flush(mEp->udc, mEp->num, mEp->dir);
+ hw_ep_flush(mEp->ci, mEp->num, mEp->dir);
/* pop request */
list_del_init(&mReq->queue);
- usb_gadget_unmap_request(&mEp->udc->gadget, req, mEp->dir);
+ usb_gadget_unmap_request(&mEp->ci->gadget, req, mEp->dir);
req->status = -ECONNRESET;
@@ -1277,7 +1277,7 @@ static int ep_set_halt(struct usb_ep *ep, int value)
direction = mEp->dir;
do {
dbg_event(_usb_addr(mEp), "HALT", value);
- retval |= hw_ep_set_halt(mEp->udc, mEp->num, mEp->dir, value);
+ retval |= hw_ep_set_halt(mEp->ci, mEp->num, mEp->dir, value);
if (!value)
mEp->wedge = 0;
@@ -1325,14 +1325,14 @@ static void ep_fifo_flush(struct usb_ep *ep)
unsigned long flags;
if (ep == NULL) {
- dev_err(mEp->udc->dev, "%02X: -EINVAL\n", _usb_addr(mEp));
+ dev_err(mEp->ci->dev, "%02X: -EINVAL\n", _usb_addr(mEp));
return;
}
spin_lock_irqsave(mEp->lock, flags);
dbg_event(_usb_addr(mEp), "FFLUSH", 0);
- hw_ep_flush(mEp->udc, mEp->num, mEp->dir);
+ hw_ep_flush(mEp->ci, mEp->num, mEp->dir);
spin_unlock_irqrestore(mEp->lock, flags);
}
@@ -1358,30 +1358,30 @@ static const struct usb_ep_ops usb_ep_ops = {
*****************************************************************************/
static int ci13xxx_vbus_session(struct usb_gadget *_gadget, int is_active)
{
- struct ci13xxx *udc = container_of(_gadget, struct ci13xxx, gadget);
+ struct ci13xxx *ci = container_of(_gadget, struct ci13xxx, gadget);
unsigned long flags;
int gadget_ready = 0;
- if (!(udc->platdata->flags & CI13XXX_PULLUP_ON_VBUS))
+ if (!(ci->platdata->flags & CI13XXX_PULLUP_ON_VBUS))
return -EOPNOTSUPP;
- spin_lock_irqsave(&udc->lock, flags);
- udc->vbus_active = is_active;
- if (udc->driver)
+ spin_lock_irqsave(&ci->lock, flags);
+ ci->vbus_active = is_active;
+ if (ci->driver)
gadget_ready = 1;
- spin_unlock_irqrestore(&udc->lock, flags);
+ spin_unlock_irqrestore(&ci->lock, flags);
if (gadget_ready) {
if (is_active) {
pm_runtime_get_sync(&_gadget->dev);
- hw_device_reset(udc, USBMODE_CM_DC);
- hw_device_state(udc, udc->ep0out->qh.dma);
+ hw_device_reset(ci, USBMODE_CM_DC);
+ hw_device_state(ci, ci->ep0out->qh.dma);
} else {
- hw_device_state(udc, 0);
- if (udc->platdata->notify_event)
- udc->platdata->notify_event(udc,
+ hw_device_state(ci, 0);
+ if (ci->platdata->notify_event)
+ ci->platdata->notify_event(ci,
CI13XXX_CONTROLLER_STOPPED_EVENT);
- _gadget_stop_activity(&udc->gadget);
+ _gadget_stop_activity(&ci->gadget);
pm_runtime_put_sync(&_gadget->dev);
}
}
@@ -1391,31 +1391,31 @@ static int ci13xxx_vbus_session(struct usb_gadget *_gadget, int is_active)
static int ci13xxx_wakeup(struct usb_gadget *_gadget)
{
- struct ci13xxx *udc = container_of(_gadget, struct ci13xxx, gadget);
+ struct ci13xxx *ci = container_of(_gadget, struct ci13xxx, gadget);
unsigned long flags;
int ret = 0;
- spin_lock_irqsave(&udc->lock, flags);
- if (!udc->remote_wakeup) {
+ spin_lock_irqsave(&ci->lock, flags);
+ if (!ci->remote_wakeup) {
ret = -EOPNOTSUPP;
goto out;
}
- if (!hw_read(udc, OP_PORTSC, PORTSC_SUSP)) {
+ if (!hw_read(ci, OP_PORTSC, PORTSC_SUSP)) {
ret = -EINVAL;
goto out;
}
- hw_write(udc, OP_PORTSC, PORTSC_FPR, PORTSC_FPR);
+ hw_write(ci, OP_PORTSC, PORTSC_FPR, PORTSC_FPR);
out:
- spin_unlock_irqrestore(&udc->lock, flags);
+ spin_unlock_irqrestore(&ci->lock, flags);
return ret;
}
static int ci13xxx_vbus_draw(struct usb_gadget *_gadget, unsigned mA)
{
- struct ci13xxx *udc = container_of(_gadget, struct ci13xxx, gadget);
+ struct ci13xxx *ci = container_of(_gadget, struct ci13xxx, gadget);
- if (udc->transceiver)
- return usb_phy_set_power(udc->transceiver, mA);
+ if (ci->transceiver)
+ return usb_phy_set_power(ci->transceiver, mA);
return -ENOTSUPP;
}
@@ -1436,28 +1436,28 @@ static const struct usb_gadget_ops usb_gadget_ops = {
.udc_stop = ci13xxx_stop,
};
-static int init_eps(struct ci13xxx *udc)
+static int init_eps(struct ci13xxx *ci)
{
int retval = 0, i, j;
- for (i = 0; i < udc->hw_ep_max/2; i++)
+ for (i = 0; i < ci->hw_ep_max/2; i++)
for (j = RX; j <= TX; j++) {
- int k = i + j * udc->hw_ep_max/2;
- struct ci13xxx_ep *mEp = &udc->ci13xxx_ep[k];
+ int k = i + j * ci->hw_ep_max/2;
+ struct ci13xxx_ep *mEp = &ci->ci13xxx_ep[k];
scnprintf(mEp->name, sizeof(mEp->name), "ep%i%s", i,
(j == TX) ? "in" : "out");
- mEp->udc = udc;
- mEp->lock = &udc->lock;
- mEp->td_pool = udc->td_pool;
+ mEp->ci = ci;
+ mEp->lock = &ci->lock;
+ mEp->td_pool = ci->td_pool;
mEp->ep.name = mEp->name;
mEp->ep.ops = &usb_ep_ops;
mEp->ep.maxpacket = CTRL_PAYLOAD_MAX;
INIT_LIST_HEAD(&mEp->qh.queue);
- mEp->qh.ptr = dma_pool_alloc(udc->qh_pool, GFP_KERNEL,
+ mEp->qh.ptr = dma_pool_alloc(ci->qh_pool, GFP_KERNEL,
&mEp->qh.dma);
if (mEp->qh.ptr == NULL)
retval = -ENOMEM;
@@ -1470,14 +1470,14 @@ static int init_eps(struct ci13xxx *udc)
*/
if (i == 0) {
if (j == RX)
- udc->ep0out = mEp;
+ ci->ep0out = mEp;
else
- udc->ep0in = mEp;
+ ci->ep0in = mEp;
continue;
}
- list_add_tail(&mEp->ep.ep_list, &udc->gadget.ep_list);
+ list_add_tail(&mEp->ep.ep_list, &ci->gadget.ep_list);
}
return retval;
@@ -1493,7 +1493,7 @@ static int init_eps(struct ci13xxx *udc)
static int ci13xxx_start(struct usb_gadget *gadget,
struct usb_gadget_driver *driver)
{
- struct ci13xxx *udc = container_of(gadget, struct ci13xxx, gadget);
+ struct ci13xxx *ci = container_of(gadget, struct ci13xxx, gadget);
unsigned long flags;
int retval = -ENOMEM;
@@ -1501,35 +1501,35 @@ static int ci13xxx_start(struct usb_gadget *gadget,
return -EINVAL;
- udc->ep0out->ep.desc = &ctrl_endpt_out_desc;
- retval = usb_ep_enable(&udc->ep0out->ep);
+ ci->ep0out->ep.desc = &ctrl_endpt_out_desc;
+ retval = usb_ep_enable(&ci->ep0out->ep);
if (retval)
return retval;
- udc->ep0in->ep.desc = &ctrl_endpt_in_desc;
- retval = usb_ep_enable(&udc->ep0in->ep);
+ ci->ep0in->ep.desc = &ctrl_endpt_in_desc;
+ retval = usb_ep_enable(&ci->ep0in->ep);
if (retval)
return retval;
- spin_lock_irqsave(&udc->lock, flags);
-
- udc->driver = driver;
- pm_runtime_get_sync(&udc->gadget.dev);
- if (udc->platdata->flags & CI13XXX_PULLUP_ON_VBUS) {
- if (udc->vbus_active) {
- if (udc->platdata->flags & CI13XXX_REGS_SHARED)
- hw_device_reset(udc, USBMODE_CM_DC);
+ spin_lock_irqsave(&ci->lock, flags);
+
+ ci->driver = driver;
+ pm_runtime_get_sync(&ci->gadget.dev);
+ if (ci->platdata->flags & CI13XXX_PULLUP_ON_VBUS) {
+ if (ci->vbus_active) {
+ if (ci->platdata->flags & CI13XXX_REGS_SHARED)
+ hw_device_reset(ci, USBMODE_CM_DC);
} else {
- pm_runtime_put_sync(&udc->gadget.dev);
+ pm_runtime_put_sync(&ci->gadget.dev);
goto done;
}
}
- retval = hw_device_state(udc, udc->ep0out->qh.dma);
+ retval = hw_device_state(ci, ci->ep0out->qh.dma);
if (retval)
- pm_runtime_put_sync(&udc->gadget.dev);
+ pm_runtime_put_sync(&ci->gadget.dev);
done:
- spin_unlock_irqrestore(&udc->lock, flags);
+ spin_unlock_irqrestore(&ci->lock, flags);
return retval;
}
@@ -1539,25 +1539,25 @@ static int ci13xxx_start(struct usb_gadget *gadget,
static int ci13xxx_stop(struct usb_gadget *gadget,
struct usb_gadget_driver *driver)
{
- struct ci13xxx *udc = container_of(gadget, struct ci13xxx, gadget);
+ struct ci13xxx *ci = container_of(gadget, struct ci13xxx, gadget);
unsigned long flags;
- spin_lock_irqsave(&udc->lock, flags);
+ spin_lock_irqsave(&ci->lock, flags);
- if (!(udc->platdata->flags & CI13XXX_PULLUP_ON_VBUS) ||
- udc->vbus_active) {
- hw_device_state(udc, 0);
- if (udc->platdata->notify_event)
- udc->platdata->notify_event(udc,
+ if (!(ci->platdata->flags & CI13XXX_PULLUP_ON_VBUS) ||
+ ci->vbus_active) {
+ hw_device_state(ci, 0);
+ if (ci->platdata->notify_event)
+ ci->platdata->notify_event(ci,
CI13XXX_CONTROLLER_STOPPED_EVENT);
- udc->driver = NULL;
- spin_unlock_irqrestore(&udc->lock, flags);
- _gadget_stop_activity(&udc->gadget);
- spin_lock_irqsave(&udc->lock, flags);
- pm_runtime_put(&udc->gadget.dev);
+ ci->driver = NULL;
+ spin_unlock_irqrestore(&ci->lock, flags);
+ _gadget_stop_activity(&ci->gadget);
+ spin_lock_irqsave(&ci->lock, flags);
+ pm_runtime_put(&ci->gadget.dev);
}
- spin_unlock_irqrestore(&udc->lock, flags);
+ spin_unlock_irqrestore(&ci->lock, flags);
return 0;
}
@@ -1566,64 +1566,64 @@ static int ci13xxx_stop(struct usb_gadget *gadget,
* BUS block
*****************************************************************************/
/**
- * udc_irq: udc interrupt handler
+ * udc_irq: ci interrupt handler
*
* This function returns IRQ_HANDLED if the IRQ has been handled
* It locks access to registers
*/
-static irqreturn_t udc_irq(struct ci13xxx *udc)
+static irqreturn_t udc_irq(struct ci13xxx *ci)
{
irqreturn_t retval;
u32 intr;
- if (udc == NULL)
+ if (ci == NULL)
return IRQ_HANDLED;
- spin_lock(&udc->lock);
+ spin_lock(&ci->lock);
- if (udc->platdata->flags & CI13XXX_REGS_SHARED) {
- if (hw_read(udc, OP_USBMODE, USBMODE_CM) !=
+ if (ci->platdata->flags & CI13XXX_REGS_SHARED) {
+ if (hw_read(ci, OP_USBMODE, USBMODE_CM) !=
USBMODE_CM_DC) {
- spin_unlock(&udc->lock);
+ spin_unlock(&ci->lock);
return IRQ_NONE;
}
}
- intr = hw_test_and_clear_intr_active(udc);
+ intr = hw_test_and_clear_intr_active(ci);
dbg_interrupt(intr);
if (intr) {
/* order defines priority - do NOT change it */
if (USBi_URI & intr)
- isr_reset_handler(udc);
+ isr_reset_handler(ci);
if (USBi_PCI & intr) {
- udc->gadget.speed = hw_port_is_high_speed(udc) ?
+ ci->gadget.speed = hw_port_is_high_speed(ci) ?
USB_SPEED_HIGH : USB_SPEED_FULL;
- if (udc->suspended && udc->driver->resume) {
- spin_unlock(&udc->lock);
- udc->driver->resume(&udc->gadget);
- spin_lock(&udc->lock);
- udc->suspended = 0;
+ if (ci->suspended && ci->driver->resume) {
+ spin_unlock(&ci->lock);
+ ci->driver->resume(&ci->gadget);
+ spin_lock(&ci->lock);
+ ci->suspended = 0;
}
}
if (USBi_UI & intr)
- isr_tr_complete_handler(udc);
+ isr_tr_complete_handler(ci);
if (USBi_SLI & intr) {
- if (udc->gadget.speed != USB_SPEED_UNKNOWN &&
- udc->driver->suspend) {
- udc->suspended = 1;
- spin_unlock(&udc->lock);
- udc->driver->suspend(&udc->gadget);
- spin_lock(&udc->lock);
+ if (ci->gadget.speed != USB_SPEED_UNKNOWN &&
+ ci->driver->suspend) {
+ ci->suspended = 1;
+ spin_unlock(&ci->lock);
+ ci->driver->suspend(&ci->gadget);
+ spin_lock(&ci->lock);
}
}
retval = IRQ_HANDLED;
} else {
retval = IRQ_NONE;
}
- spin_unlock(&udc->lock);
+ spin_unlock(&ci->lock);
return retval;
}
@@ -1640,109 +1640,109 @@ static void udc_release(struct device *dev)
/**
* udc_start: initialize gadget role
- * @udc: chipidea controller
+ * @ci: chipidea controller
*/
-static int udc_start(struct ci13xxx *udc)
+static int udc_start(struct ci13xxx *ci)
{
- struct device *dev = udc->dev;
+ struct device *dev = ci->dev;
int retval = 0;
- spin_lock_init(&udc->lock);
+ spin_lock_init(&ci->lock);
- udc->gadget.ops = &usb_gadget_ops;
- udc->gadget.speed = USB_SPEED_UNKNOWN;
- udc->gadget.max_speed = USB_SPEED_HIGH;
- udc->gadget.is_otg = 0;
- udc->gadget.name = udc->platdata->name;
+ ci->gadget.ops = &usb_gadget_ops;
+ ci->gadget.speed = USB_SPEED_UNKNOWN;
+ ci->gadget.max_speed = USB_SPEED_HIGH;
+ ci->gadget.is_otg = 0;
+ ci->gadget.name = ci->platdata->name;
- INIT_LIST_HEAD(&udc->gadget.ep_list);
+ INIT_LIST_HEAD(&ci->gadget.ep_list);
- dev_set_name(&udc->gadget.dev, "gadget");
- udc->gadget.dev.dma_mask = dev->dma_mask;
- udc->gadget.dev.coherent_dma_mask = dev->coherent_dma_mask;
- udc->gadget.dev.parent = dev;
- udc->gadget.dev.release = udc_release;
+ dev_set_name(&ci->gadget.dev, "gadget");
+ ci->gadget.dev.dma_mask = dev->dma_mask;
+ ci->gadget.dev.coherent_dma_mask = dev->coherent_dma_mask;
+ ci->gadget.dev.parent = dev;
+ ci->gadget.dev.release = udc_release;
/* alloc resources */
- udc->qh_pool = dma_pool_create("ci13xxx_qh", dev,
+ ci->qh_pool = dma_pool_create("ci13xxx_qh", dev,
sizeof(struct ci13xxx_qh),
64, CI13XXX_PAGE_SIZE);
- if (udc->qh_pool == NULL)
+ if (ci->qh_pool == NULL)
return -ENOMEM;
- udc->td_pool = dma_pool_create("ci13xxx_td", dev,
+ ci->td_pool = dma_pool_create("ci13xxx_td", dev,
sizeof(struct ci13xxx_td),
64, CI13XXX_PAGE_SIZE);
- if (udc->td_pool == NULL) {
+ if (ci->td_pool == NULL) {
retval = -ENOMEM;
goto free_qh_pool;
}
- retval = init_eps(udc);
+ retval = init_eps(ci);
if (retval)
goto free_pools;
- udc->gadget.ep0 = &udc->ep0in->ep;
+ ci->gadget.ep0 = &ci->ep0in->ep;
- udc->transceiver = usb_get_transceiver();
+ ci->transceiver = usb_get_transceiver();
- if (udc->platdata->flags & CI13XXX_REQUIRE_TRANSCEIVER) {
- if (udc->transceiver == NULL) {
+ if (ci->platdata->flags & CI13XXX_REQUIRE_TRANSCEIVER) {
+ if (ci->transceiver == NULL) {
retval = -ENODEV;
goto free_pools;
}
}
- if (!(udc->platdata->flags & CI13XXX_REGS_SHARED)) {
- retval = hw_device_reset(udc, USBMODE_CM_DC);
+ if (!(ci->platdata->flags & CI13XXX_REGS_SHARED)) {
+ retval = hw_device_reset(ci, USBMODE_CM_DC);
if (retval)
goto put_transceiver;
}
- retval = device_register(&udc->gadget.dev);
+ retval = device_register(&ci->gadget.dev);
if (retval) {
- put_device(&udc->gadget.dev);
+ put_device(&ci->gadget.dev);
goto put_transceiver;
}
- retval = dbg_create_files(&udc->gadget.dev);
+ retval = dbg_create_files(&ci->gadget.dev);
if (retval)
goto unreg_device;
- if (udc->transceiver) {
- retval = otg_set_peripheral(udc->transceiver->otg,
- &udc->gadget);
+ if (ci->transceiver) {
+ retval = otg_set_peripheral(ci->transceiver->otg,
+ &ci->gadget);
if (retval)
goto remove_dbg;
}
- retval = usb_add_gadget_udc(dev, &udc->gadget);
+ retval = usb_add_gadget_udc(dev, &ci->gadget);
if (retval)
goto remove_trans;
- pm_runtime_no_callbacks(&udc->gadget.dev);
- pm_runtime_enable(&udc->gadget.dev);
+ pm_runtime_no_callbacks(&ci->gadget.dev);
+ pm_runtime_enable(&ci->gadget.dev);
return retval;
remove_trans:
- if (udc->transceiver) {
- otg_set_peripheral(udc->transceiver->otg, &udc->gadget);
- usb_put_transceiver(udc->transceiver);
+ if (ci->transceiver) {
+ otg_set_peripheral(ci->transceiver->otg, &ci->gadget);
+ usb_put_transceiver(ci->transceiver);
}
dev_err(dev, "error = %i\n", retval);
remove_dbg:
- dbg_remove_files(&udc->gadget.dev);
+ dbg_remove_files(&ci->gadget.dev);
unreg_device:
- device_unregister(&udc->gadget.dev);
+ device_unregister(&ci->gadget.dev);
put_transceiver:
- if (udc->transceiver)
- usb_put_transceiver(udc->transceiver);
+ if (ci->transceiver)
+ usb_put_transceiver(ci->transceiver);
free_pools:
- dma_pool_destroy(udc->td_pool);
+ dma_pool_destroy(ci->td_pool);
free_qh_pool:
- dma_pool_destroy(udc->qh_pool);
+ dma_pool_destroy(ci->qh_pool);
return retval;
}
@@ -1751,32 +1751,32 @@ free_qh_pool:
*
* No interrupts active, the IRQ has been released
*/
-static void udc_stop(struct ci13xxx *udc)
+static void udc_stop(struct ci13xxx *ci)
{
int i;
- if (udc == NULL)
+ if (ci == NULL)
return;
- usb_del_gadget_udc(&udc->gadget);
+ usb_del_gadget_udc(&ci->gadget);
- for (i = 0; i < udc->hw_ep_max; i++) {
- struct ci13xxx_ep *mEp = &udc->ci13xxx_ep[i];
+ for (i = 0; i < ci->hw_ep_max; i++) {
+ struct ci13xxx_ep *mEp = &ci->ci13xxx_ep[i];
- dma_pool_free(udc->qh_pool, mEp->qh.ptr, mEp->qh.dma);
+ dma_pool_free(ci->qh_pool, mEp->qh.ptr, mEp->qh.dma);
}
- dma_pool_destroy(udc->td_pool);
- dma_pool_destroy(udc->qh_pool);
+ dma_pool_destroy(ci->td_pool);
+ dma_pool_destroy(ci->qh_pool);
- if (udc->transceiver) {
- otg_set_peripheral(udc->transceiver->otg, NULL);
- usb_put_transceiver(udc->transceiver);
+ if (ci->transceiver) {
+ otg_set_peripheral(ci->transceiver->otg, NULL);
+ usb_put_transceiver(ci->transceiver);
}
- dbg_remove_files(&udc->gadget.dev);
- device_unregister(&udc->gadget.dev);
+ dbg_remove_files(&ci->gadget.dev);
+ device_unregister(&ci->gadget.dev);
/* my kobject is dynamic, I swear! */
- memset(&udc->gadget, 0, sizeof(udc->gadget));
+ memset(&ci->gadget, 0, sizeof(ci->gadget));
}
/**
diff --git a/include/linux/usb/chipidea.h b/include/linux/usb/chipidea.h
index d4cf9706..d2f7e49 100644
--- a/include/linux/usb/chipidea.h
+++ b/include/linux/usb/chipidea.h
@@ -19,7 +19,7 @@ struct ci13xxx_platform_data {
#define CI13XXX_CONTROLLER_RESET_EVENT 0
#define CI13XXX_CONTROLLER_STOPPED_EVENT 1
- void (*notify_event) (struct ci13xxx *udc, unsigned event);
+ void (*notify_event) (struct ci13xxx *ci, unsigned event);
};
/* Default offset of capability registers */
--
1.7.9.5
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH v8 07/14] USB: Chipidea: add unified ci13xxx_{add, remove}_device for platform drivers
2012-06-29 9:48 [PATCH v8 00/14] add imx usb driver based on Greg next tree Richard Zhao
` (5 preceding siblings ...)
2012-06-29 9:48 ` [PATCH v8 06/14] USB: Chipidea: rename struct ci13xxx variables from udc to ci Richard Zhao
@ 2012-06-29 9:48 ` Richard Zhao
2012-06-29 9:48 ` [PATCH v8 08/14] USB: Chipidea: add ci13xxx device id management Richard Zhao
` (7 subsequent siblings)
14 siblings, 0 replies; 23+ messages in thread
From: Richard Zhao @ 2012-06-29 9:48 UTC (permalink / raw)
To: linux-arm-kernel
Platform drivers do the similar things to add/remove ci13xxx device, so
create a unified one.
Signed-off-by: Richard Zhao <richard.zhao@freescale.com>
Reviewed-by: Felipe Balbi <balbi@ti.com>
Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com>
---
drivers/usb/chipidea/ci13xxx_msm.c | 34 ++++++----------------------
drivers/usb/chipidea/ci13xxx_pci.c | 34 +++++-----------------------
drivers/usb/chipidea/core.c | 43 ++++++++++++++++++++++++++++++++++++
include/linux/usb/chipidea.h | 7 ++++++
4 files changed, 63 insertions(+), 55 deletions(-)
diff --git a/drivers/usb/chipidea/ci13xxx_msm.c b/drivers/usb/chipidea/ci13xxx_msm.c
index 5a2fe5f..b01feb3 100644
--- a/drivers/usb/chipidea/ci13xxx_msm.c
+++ b/drivers/usb/chipidea/ci13xxx_msm.c
@@ -58,43 +58,23 @@ static struct ci13xxx_platform_data ci13xxx_msm_platdata = {
static int __devinit ci13xxx_msm_probe(struct platform_device *pdev)
{
struct platform_device *plat_ci;
- int ret;
dev_dbg(&pdev->dev, "ci13xxx_msm_probe\n");
- plat_ci = platform_device_alloc("ci_hdrc", -1);
- if (!plat_ci) {
- dev_err(&pdev->dev, "can't allocate ci_hdrc platform device\n");
- return -ENOMEM;
+ plat_ci = ci13xxx_add_device(&pdev->dev,
+ pdev->resource, pdev->num_resources,
+ &ci13xxx_msm_platdata);
+ if (IS_ERR(plat_ci)) {
+ dev_err(&pdev->dev, "ci13xxx_add_device failed!\n");
+ return PTR_ERR(plat_ci);
}
- ret = platform_device_add_resources(plat_ci, pdev->resource,
- pdev->num_resources);
- if (ret) {
- dev_err(&pdev->dev, "can't add resources to platform device\n");
- goto put_platform;
- }
-
- ret = platform_device_add_data(plat_ci, &ci13xxx_msm_platdata,
- sizeof(ci13xxx_msm_platdata));
- if (ret)
- goto put_platform;
-
- ret = platform_device_add(plat_ci);
- if (ret)
- goto put_platform;
-
platform_set_drvdata(pdev, plat_ci);
pm_runtime_no_callbacks(&pdev->dev);
pm_runtime_enable(&pdev->dev);
return 0;
-
-put_platform:
- platform_device_put(plat_ci);
-
- return ret;
}
static int __devexit ci13xxx_msm_remove(struct platform_device *pdev)
@@ -102,7 +82,7 @@ static int __devexit ci13xxx_msm_remove(struct platform_device *pdev)
struct platform_device *plat_ci = platform_get_drvdata(pdev);
pm_runtime_disable(&pdev->dev);
- platform_device_unregister(plat_ci);
+ ci13xxx_remove_device(plat_ci);
return 0;
}
diff --git a/drivers/usb/chipidea/ci13xxx_pci.c b/drivers/usb/chipidea/ci13xxx_pci.c
index cdcac3a..918e149 100644
--- a/drivers/usb/chipidea/ci13xxx_pci.c
+++ b/drivers/usb/chipidea/ci13xxx_pci.c
@@ -75,13 +75,6 @@ static int __devinit ci13xxx_pci_probe(struct pci_dev *pdev,
pci_set_master(pdev);
pci_try_set_mwi(pdev);
- plat_ci = platform_device_alloc("ci_hdrc", -1);
- if (!plat_ci) {
- dev_err(&pdev->dev, "can't allocate ci_hdrc platform device\n");
- retval = -ENOMEM;
- goto disable_device;
- }
-
memset(res, 0, sizeof(res));
res[0].start = pci_resource_start(pdev, 0);
res[0].end = pci_resource_end(pdev, 0);
@@ -89,32 +82,17 @@ static int __devinit ci13xxx_pci_probe(struct pci_dev *pdev,
res[1].start = pdev->irq;
res[1].flags = IORESOURCE_IRQ;
- retval = platform_device_add_resources(plat_ci, res, nres);
- if (retval) {
- dev_err(&pdev->dev, "can't add resources to platform device\n");
- goto put_platform;
+ plat_ci = ci13xxx_add_device(&pdev->dev, res, nres, platdata);
+ if (IS_ERR(plat_ci)) {
+ dev_err(&pdev->dev, "ci13xxx_add_device failed!\n");
+ retval = PTR_ERR(plat_ci);
+ goto disable_device;
}
- retval = platform_device_add_data(plat_ci, platdata, sizeof(*platdata));
- if (retval)
- goto put_platform;
-
- dma_set_coherent_mask(&plat_ci->dev, pdev->dev.coherent_dma_mask);
- plat_ci->dev.dma_mask = pdev->dev.dma_mask;
- plat_ci->dev.dma_parms = pdev->dev.dma_parms;
- plat_ci->dev.parent = &pdev->dev;
-
pci_set_drvdata(pdev, plat_ci);
- retval = platform_device_add(plat_ci);
- if (retval)
- goto put_platform;
-
return 0;
- put_platform:
- pci_set_drvdata(pdev, NULL);
- platform_device_put(plat_ci);
disable_device:
pci_disable_device(pdev);
done:
@@ -133,7 +111,7 @@ static void __devexit ci13xxx_pci_remove(struct pci_dev *pdev)
{
struct platform_device *plat_ci = pci_get_drvdata(pdev);
- platform_device_unregister(plat_ci);
+ ci13xxx_remove_device(plat_ci);
pci_set_drvdata(pdev, NULL);
pci_disable_device(pdev);
}
diff --git a/drivers/usb/chipidea/core.c b/drivers/usb/chipidea/core.c
index 9a883bd..8b9d06f 100644
--- a/drivers/usb/chipidea/core.c
+++ b/drivers/usb/chipidea/core.c
@@ -332,6 +332,49 @@ static irqreturn_t ci_irq(int irq, void *data)
return ci->role == CI_ROLE_END ? ret : ci_role(ci)->irq(ci);
}
+struct platform_device *ci13xxx_add_device(struct device *dev,
+ struct resource *res, int nres,
+ struct ci13xxx_platform_data *platdata)
+{
+ struct platform_device *pdev;
+ int ret;
+
+ /* FIXME: find a way to choose id */
+ pdev = platform_device_alloc("ci_hdrc", -1);
+ if (!pdev)
+ return ERR_PTR(-ENOMEM);
+
+ pdev->dev.parent = dev;
+ pdev->dev.dma_mask = dev->dma_mask;
+ pdev->dev.dma_parms = dev->dma_parms;
+ dma_set_coherent_mask(&pdev->dev, dev->coherent_dma_mask);
+
+ ret = platform_device_add_resources(pdev, res, nres);
+ if (ret)
+ goto err;
+
+ ret = platform_device_add_data(pdev, platdata, sizeof(*platdata));
+ if (ret)
+ goto err;
+
+ ret = platform_device_add(pdev);
+ if (ret)
+ goto err;
+
+ return pdev;
+
+err:
+ platform_device_put(pdev);
+ return ERR_PTR(ret);
+}
+EXPORT_SYMBOL_GPL(ci13xxx_add_device);
+
+void ci13xxx_remove_device(struct platform_device *pdev)
+{
+ platform_device_unregister(pdev);
+}
+EXPORT_SYMBOL_GPL(ci13xxx_remove_device);
+
static int __devinit ci_hdrc_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
diff --git a/include/linux/usb/chipidea.h b/include/linux/usb/chipidea.h
index d2f7e49..be078f0 100644
--- a/include/linux/usb/chipidea.h
+++ b/include/linux/usb/chipidea.h
@@ -25,4 +25,11 @@ struct ci13xxx_platform_data {
/* Default offset of capability registers */
#define DEF_CAPOFFSET 0x100
+/* Add ci13xxx device */
+struct platform_device *ci13xxx_add_device(struct device *dev,
+ struct resource *res, int nres,
+ struct ci13xxx_platform_data *platdata);
+/* Remove ci13xxx device */
+void ci13xxx_remove_device(struct platform_device *pdev);
+
#endif
--
1.7.9.5
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH v8 08/14] USB: Chipidea: add ci13xxx device id management
2012-06-29 9:48 [PATCH v8 00/14] add imx usb driver based on Greg next tree Richard Zhao
` (6 preceding siblings ...)
2012-06-29 9:48 ` [PATCH v8 07/14] USB: Chipidea: add unified ci13xxx_{add, remove}_device for platform drivers Richard Zhao
@ 2012-06-29 9:48 ` Richard Zhao
2012-06-29 9:48 ` [PATCH v8 09/14] usb: chipidea: select USB_EHCI_ROOT_HUB_TT in USB_CHIPIDEA_HOST of Kconfig Richard Zhao
` (6 subsequent siblings)
14 siblings, 0 replies; 23+ messages in thread
From: Richard Zhao @ 2012-06-29 9:48 UTC (permalink / raw)
To: linux-arm-kernel
We use ida_simple_get and ida_simple_remove to manage the ids.
Signed-off-by: Richard Zhao <richard.zhao@freescale.com>
Reviewed-by: Felipe Balbi <balbi@ti.com>
Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com>
---
drivers/usb/chipidea/core.c | 21 ++++++++++++++++-----
1 file changed, 16 insertions(+), 5 deletions(-)
diff --git a/drivers/usb/chipidea/core.c b/drivers/usb/chipidea/core.c
index 8b9d06f..39603d7 100644
--- a/drivers/usb/chipidea/core.c
+++ b/drivers/usb/chipidea/core.c
@@ -56,6 +56,7 @@
#include <linux/init.h>
#include <linux/platform_device.h>
#include <linux/module.h>
+#include <linux/idr.h>
#include <linux/interrupt.h>
#include <linux/io.h>
#include <linux/irq.h>
@@ -332,17 +333,24 @@ static irqreturn_t ci_irq(int irq, void *data)
return ci->role == CI_ROLE_END ? ret : ci_role(ci)->irq(ci);
}
+static DEFINE_IDA(ci_ida);
+
struct platform_device *ci13xxx_add_device(struct device *dev,
struct resource *res, int nres,
struct ci13xxx_platform_data *platdata)
{
struct platform_device *pdev;
- int ret;
+ int id, ret;
- /* FIXME: find a way to choose id */
- pdev = platform_device_alloc("ci_hdrc", -1);
- if (!pdev)
- return ERR_PTR(-ENOMEM);
+ id = ida_simple_get(&ci_ida, 0, 0, GFP_KERNEL);
+ if (id < 0)
+ return ERR_PTR(id);
+
+ pdev = platform_device_alloc("ci_hdrc", id);
+ if (!pdev) {
+ ret = -ENOMEM;
+ goto put_id;
+ }
pdev->dev.parent = dev;
pdev->dev.dma_mask = dev->dma_mask;
@@ -365,6 +373,8 @@ struct platform_device *ci13xxx_add_device(struct device *dev,
err:
platform_device_put(pdev);
+put_id:
+ ida_simple_remove(&ci_ida, id);
return ERR_PTR(ret);
}
EXPORT_SYMBOL_GPL(ci13xxx_add_device);
@@ -372,6 +382,7 @@ EXPORT_SYMBOL_GPL(ci13xxx_add_device);
void ci13xxx_remove_device(struct platform_device *pdev)
{
platform_device_unregister(pdev);
+ ida_simple_remove(&ci_ida, pdev->id);
}
EXPORT_SYMBOL_GPL(ci13xxx_remove_device);
--
1.7.9.5
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH v8 09/14] usb: chipidea: select USB_EHCI_ROOT_HUB_TT in USB_CHIPIDEA_HOST of Kconfig
2012-06-29 9:48 [PATCH v8 00/14] add imx usb driver based on Greg next tree Richard Zhao
` (7 preceding siblings ...)
2012-06-29 9:48 ` [PATCH v8 08/14] USB: Chipidea: add ci13xxx device id management Richard Zhao
@ 2012-06-29 9:48 ` Richard Zhao
2012-06-29 9:48 ` [PATCH v8 10/14] usb: otg: add notify_connect/notify_disconnect callback Richard Zhao
` (5 subsequent siblings)
14 siblings, 0 replies; 23+ messages in thread
From: Richard Zhao @ 2012-06-29 9:48 UTC (permalink / raw)
To: linux-arm-kernel
ci13xxx host needs Root Hub Transaction Translators.
Reported-by: Shawn Guo <shawn.guo@freescale.com>
Signed-off-by: Richard Zhao <richard.zhao@freescale.com>
Acked-by: Felipe Balbi <balbi@ti.com>
Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Acked-by: Marek Vasut <marex@denx.de>
---
drivers/usb/chipidea/Kconfig | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/usb/chipidea/Kconfig b/drivers/usb/chipidea/Kconfig
index fd36dc8..8337fb5 100644
--- a/drivers/usb/chipidea/Kconfig
+++ b/drivers/usb/chipidea/Kconfig
@@ -20,6 +20,7 @@ config USB_CHIPIDEA_UDC
config USB_CHIPIDEA_HOST
bool "ChipIdea host controller"
+ select USB_EHCI_ROOT_HUB_TT
help
Say Y here to enable host controller functionality of the
ChipIdea driver.
--
1.7.9.5
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH v8 10/14] usb: otg: add notify_connect/notify_disconnect callback
2012-06-29 9:48 [PATCH v8 00/14] add imx usb driver based on Greg next tree Richard Zhao
` (8 preceding siblings ...)
2012-06-29 9:48 ` [PATCH v8 09/14] usb: chipidea: select USB_EHCI_ROOT_HUB_TT in USB_CHIPIDEA_HOST of Kconfig Richard Zhao
@ 2012-06-29 9:48 ` Richard Zhao
2012-06-29 9:48 ` [PATCH v8 11/14] USB: notify phy when root hub port connect change Richard Zhao
` (4 subsequent siblings)
14 siblings, 0 replies; 23+ messages in thread
From: Richard Zhao @ 2012-06-29 9:48 UTC (permalink / raw)
To: linux-arm-kernel
This let usb phy driver has a chance to change hw settings when connect
status change.
Signed-off-by: Richard Zhao <richard.zhao@freescale.com>
Acked-by: Felipe Balbi <balbi@ti.com>
Tested-by: Subodh Nijsure <snijsure@grid-net.com>
---
include/linux/usb/otg.h | 21 +++++++++++++++++++++
1 file changed, 21 insertions(+)
diff --git a/include/linux/usb/otg.h b/include/linux/usb/otg.h
index 38ab3f4..6dfdc8d 100644
--- a/include/linux/usb/otg.h
+++ b/include/linux/usb/otg.h
@@ -117,6 +117,9 @@ struct usb_phy {
int (*set_suspend)(struct usb_phy *x,
int suspend);
+ /* notify phy connect status change */
+ int (*notify_connect)(struct usb_phy *x, int port);
+ int (*notify_disconnect)(struct usb_phy *x, int port);
};
@@ -252,6 +255,24 @@ usb_phy_set_suspend(struct usb_phy *x, int suspend)
}
static inline int
+usb_phy_notify_connect(struct usb_phy *x, int port)
+{
+ if (x->notify_connect)
+ return x->notify_connect(x, port);
+ else
+ return 0;
+}
+
+static inline int
+usb_phy_notify_disconnect(struct usb_phy *x, int port)
+{
+ if (x->notify_disconnect)
+ return x->notify_disconnect(x, port);
+ else
+ return 0;
+}
+
+static inline int
otg_start_srp(struct usb_otg *otg)
{
if (otg && otg->start_srp)
--
1.7.9.5
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH v8 11/14] USB: notify phy when root hub port connect change
2012-06-29 9:48 [PATCH v8 00/14] add imx usb driver based on Greg next tree Richard Zhao
` (9 preceding siblings ...)
2012-06-29 9:48 ` [PATCH v8 10/14] usb: otg: add notify_connect/notify_disconnect callback Richard Zhao
@ 2012-06-29 9:48 ` Richard Zhao
2012-06-29 9:49 ` [PATCH v8 12/14] usb: chipidea: permit driver bindings pass phy pointer Richard Zhao
` (3 subsequent siblings)
14 siblings, 0 replies; 23+ messages in thread
From: Richard Zhao @ 2012-06-29 9:48 UTC (permalink / raw)
To: linux-arm-kernel
Phy may need to change settings when port connect change.
Signed-off-by: Richard Zhao <richard.zhao@freescale.com>
Tested-by: Subodh Nijsure <snijsure@grid-net.com>
---
drivers/usb/core/hub.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index 25a7422..6ecfb5e 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -20,6 +20,7 @@
#include <linux/usb.h>
#include <linux/usbdevice_fs.h>
#include <linux/usb/hcd.h>
+#include <linux/usb/otg.h>
#include <linux/usb/quirks.h>
#include <linux/kthread.h>
#include <linux/mutex.h>
@@ -4034,6 +4035,13 @@ static void hub_port_connect_change(struct usb_hub *hub, int port1,
}
}
+ if (unlikely(hcd->phy && !hdev->parent)) {
+ if (portstatus & USB_PORT_STAT_CONNECTION)
+ usb_phy_notify_connect(hcd->phy, port1);
+ else
+ usb_phy_notify_disconnect(hcd->phy, port1);
+ }
+
/* Return now if debouncing failed or nothing is connected or
* the device was "removed".
*/
--
1.7.9.5
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH v8 12/14] usb: chipidea: permit driver bindings pass phy pointer
2012-06-29 9:48 [PATCH v8 00/14] add imx usb driver based on Greg next tree Richard Zhao
` (10 preceding siblings ...)
2012-06-29 9:48 ` [PATCH v8 11/14] USB: notify phy when root hub port connect change Richard Zhao
@ 2012-06-29 9:49 ` Richard Zhao
2012-06-29 9:49 ` [PATCH v8 13/14] usb: otg: add basic mxs phy driver support Richard Zhao
` (2 subsequent siblings)
14 siblings, 0 replies; 23+ messages in thread
From: Richard Zhao @ 2012-06-29 9:49 UTC (permalink / raw)
To: linux-arm-kernel
Sometimes, the driver bindings may know what phy they use.
For example, when using device tree, the usb controller may have a
phandler pointing to usb phy.
Signed-off-by: Richard Zhao <richard.zhao@freescale.com>
Reviewed-by: Marek Vasut <marex@denx.de>
Acked-by: Felipe Balbi <balbi@ti.com>
Tested-by: Subodh Nijsure <snijsure@grid-net.com>
---
drivers/usb/chipidea/ci.h | 2 ++
drivers/usb/chipidea/core.c | 4 ++++
drivers/usb/chipidea/host.c | 1 +
drivers/usb/chipidea/udc.c | 11 +++++++----
include/linux/usb/chipidea.h | 3 +++
5 files changed, 17 insertions(+), 4 deletions(-)
diff --git a/drivers/usb/chipidea/ci.h b/drivers/usb/chipidea/ci.h
index 9655e35..d738603 100644
--- a/drivers/usb/chipidea/ci.h
+++ b/drivers/usb/chipidea/ci.h
@@ -160,6 +160,8 @@ struct ci13xxx {
struct ci13xxx_platform_data *platdata;
int vbus_active;
+ /* FIXME: some day, we'll not use global phy */
+ bool global_phy;
struct usb_phy *transceiver;
struct usb_hcd *hcd;
};
diff --git a/drivers/usb/chipidea/core.c b/drivers/usb/chipidea/core.c
index 39603d7..1083585 100644
--- a/drivers/usb/chipidea/core.c
+++ b/drivers/usb/chipidea/core.c
@@ -419,6 +419,10 @@ static int __devinit ci_hdrc_probe(struct platform_device *pdev)
ci->dev = dev;
ci->platdata = dev->platform_data;
+ if (ci->platdata->phy)
+ ci->transceiver = ci->platdata->phy;
+ else
+ ci->global_phy = true;
ret = hw_device_init(ci, base);
if (ret < 0) {
diff --git a/drivers/usb/chipidea/host.c b/drivers/usb/chipidea/host.c
index 4a4fdb8..ebff9f4 100644
--- a/drivers/usb/chipidea/host.c
+++ b/drivers/usb/chipidea/host.c
@@ -117,6 +117,7 @@ static int host_start(struct ci13xxx *ci)
hcd->has_tt = 1;
hcd->power_budget = ci->platdata->power_budget;
+ hcd->phy = ci->transceiver;
ehci = hcd_to_ehci(hcd);
ehci->caps = ci->hw_bank.cap;
diff --git a/drivers/usb/chipidea/udc.c b/drivers/usb/chipidea/udc.c
index 93efdcd..e8a9f81 100644
--- a/drivers/usb/chipidea/udc.c
+++ b/drivers/usb/chipidea/udc.c
@@ -1684,7 +1684,8 @@ static int udc_start(struct ci13xxx *ci)
ci->gadget.ep0 = &ci->ep0in->ep;
- ci->transceiver = usb_get_transceiver();
+ if (ci->global_phy)
+ ci->transceiver = usb_get_transceiver();
if (ci->platdata->flags & CI13XXX_REQUIRE_TRANSCEIVER) {
if (ci->transceiver == NULL) {
@@ -1728,7 +1729,8 @@ static int udc_start(struct ci13xxx *ci)
remove_trans:
if (ci->transceiver) {
otg_set_peripheral(ci->transceiver->otg, &ci->gadget);
- usb_put_transceiver(ci->transceiver);
+ if (ci->global_phy)
+ usb_put_transceiver(ci->transceiver);
}
dev_err(dev, "error = %i\n", retval);
@@ -1737,7 +1739,7 @@ remove_dbg:
unreg_device:
device_unregister(&ci->gadget.dev);
put_transceiver:
- if (ci->transceiver)
+ if (ci->transceiver && ci->global_phy)
usb_put_transceiver(ci->transceiver);
free_pools:
dma_pool_destroy(ci->td_pool);
@@ -1771,7 +1773,8 @@ static void udc_stop(struct ci13xxx *ci)
if (ci->transceiver) {
otg_set_peripheral(ci->transceiver->otg, NULL);
- usb_put_transceiver(ci->transceiver);
+ if (ci->global_phy)
+ usb_put_transceiver(ci->transceiver);
}
dbg_remove_files(&ci->gadget.dev);
device_unregister(&ci->gadget.dev);
diff --git a/include/linux/usb/chipidea.h b/include/linux/usb/chipidea.h
index be078f0..544825d 100644
--- a/include/linux/usb/chipidea.h
+++ b/include/linux/usb/chipidea.h
@@ -5,12 +5,15 @@
#ifndef __LINUX_USB_CHIPIDEA_H
#define __LINUX_USB_CHIPIDEA_H
+#include <linux/usb/otg.h>
+
struct ci13xxx;
struct ci13xxx_platform_data {
const char *name;
/* offset of the capability registers */
uintptr_t capoffset;
unsigned power_budget;
+ struct usb_phy *phy;
unsigned long flags;
#define CI13XXX_REGS_SHARED BIT(0)
#define CI13XXX_REQUIRE_TRANSCEIVER BIT(1)
--
1.7.9.5
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH v8 13/14] usb: otg: add basic mxs phy driver support
2012-06-29 9:48 [PATCH v8 00/14] add imx usb driver based on Greg next tree Richard Zhao
` (11 preceding siblings ...)
2012-06-29 9:49 ` [PATCH v8 12/14] usb: chipidea: permit driver bindings pass phy pointer Richard Zhao
@ 2012-06-29 9:49 ` Richard Zhao
2012-06-29 9:49 ` [PATCH v8 14/14] usb: chipidea: add imx platform driver Richard Zhao
2012-06-29 10:52 ` [PATCH v9 00/14] add imx usb driver based on Greg next tree Richard Zhao
14 siblings, 0 replies; 23+ messages in thread
From: Richard Zhao @ 2012-06-29 9:49 UTC (permalink / raw)
To: linux-arm-kernel
mxs phy is used in Freescale i.MX SoCs, for example
imx23, imx28, imx6Q. This patch adds the basic host
support.
Signed-off-by: Richard Zhao <richard.zhao@freescale.com>
Signed-off-by: Marek Vasut <marex@denx.de>
Cc: Peter Chen <peter.chen@freescale.com>
Acked-by: Felipe Balbi <balbi@ti.com>
Tested-by: Subodh Nijsure <snijsure@grid-net.com>
---
Documentation/devicetree/bindings/usb/mxs-phy.txt | 13 ++
drivers/usb/otg/Kconfig | 10 ++
drivers/usb/otg/Makefile | 1 +
drivers/usb/otg/mxs-phy.c | 186 +++++++++++++++++++++
4 files changed, 210 insertions(+)
create mode 100644 Documentation/devicetree/bindings/usb/mxs-phy.txt
create mode 100644 drivers/usb/otg/mxs-phy.c
diff --git a/Documentation/devicetree/bindings/usb/mxs-phy.txt b/Documentation/devicetree/bindings/usb/mxs-phy.txt
new file mode 100644
index 0000000..5835b27
--- /dev/null
+++ b/Documentation/devicetree/bindings/usb/mxs-phy.txt
@@ -0,0 +1,13 @@
+* Freescale MXS USB Phy Device
+
+Required properties:
+- compatible: Should be "fsl,imx23-usbphy"
+- reg: Should contain registers location and length
+- interrupts: Should contain phy interrupt
+
+Example:
+usbphy1: usbphy at 020c9000 {
+ compatible = "fsl,imx6q-usbphy", "fsl,imx23-usbphy";
+ reg = <0x020c9000 0x1000>;
+ interrupts = <0 44 0x04>;
+};
diff --git a/drivers/usb/otg/Kconfig b/drivers/usb/otg/Kconfig
index 5c87db0..13fd1ddf 100644
--- a/drivers/usb/otg/Kconfig
+++ b/drivers/usb/otg/Kconfig
@@ -116,6 +116,16 @@ config FSL_USB2_OTG
help
Enable this to support Freescale USB OTG transceiver.
+config USB_MXS_PHY
+ tristate "Freescale MXS USB PHY support"
+ depends on ARCH_MXC || ARCH_MXS
+ select STMP_DEVICE
+ select USB_OTG_UTILS
+ help
+ Enable this to support the Freescale MXS USB PHY.
+
+ MXS Phy is used by some of the i.MX SoCs, for example imx23/28/6x.
+
config USB_MV_OTG
tristate "Marvell USB OTG support"
depends on USB_EHCI_MV && USB_MV_UDC && USB_SUSPEND
diff --git a/drivers/usb/otg/Makefile b/drivers/usb/otg/Makefile
index 41aa509..a844b8d 100644
--- a/drivers/usb/otg/Makefile
+++ b/drivers/usb/otg/Makefile
@@ -20,4 +20,5 @@ obj-$(CONFIG_USB_MSM_OTG) += msm_otg.o
obj-$(CONFIG_AB8500_USB) += ab8500-usb.o
fsl_usb2_otg-objs := fsl_otg.o otg_fsm.o
obj-$(CONFIG_FSL_USB2_OTG) += fsl_usb2_otg.o
+obj-$(CONFIG_USB_MXS_PHY) += mxs-phy.o
obj-$(CONFIG_USB_MV_OTG) += mv_otg.o
diff --git a/drivers/usb/otg/mxs-phy.c b/drivers/usb/otg/mxs-phy.c
new file mode 100644
index 0000000..c1a67cb
--- /dev/null
+++ b/drivers/usb/otg/mxs-phy.c
@@ -0,0 +1,186 @@
+/*
+ * Copyright 2012 Freescale Semiconductor, Inc.
+ * Copyright (C) 2012 Marek Vasut <marex@denx.de>
+ * on behalf of DENX Software Engineering GmbH
+ *
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/platform_device.h>
+#include <linux/clk.h>
+#include <linux/usb/otg.h>
+#include <linux/stmp_device.h>
+#include <linux/delay.h>
+#include <linux/err.h>
+#include <linux/io.h>
+
+#define DRIVER_NAME "mxs_phy"
+
+#define HW_USBPHY_PWD 0x00
+#define HW_USBPHY_CTRL 0x30
+#define HW_USBPHY_CTRL_SET 0x34
+#define HW_USBPHY_CTRL_CLR 0x38
+
+#define BM_USBPHY_CTRL_SFTRST BIT(31)
+#define BM_USBPHY_CTRL_CLKGATE BIT(30)
+#define BM_USBPHY_CTRL_ENUTMILEVEL3 BIT(15)
+#define BM_USBPHY_CTRL_ENUTMILEVEL2 BIT(14)
+#define BM_USBPHY_CTRL_ENHOSTDISCONDETECT BIT(1)
+
+struct mxs_phy {
+ struct usb_phy phy;
+ struct clk *clk;
+};
+
+#define to_mxs_phy(p) container_of((p), struct mxs_phy, phy)
+
+static void mxs_phy_hw_init(struct mxs_phy *mxs_phy)
+{
+ void __iomem *base = mxs_phy->phy.io_priv;
+
+ stmp_reset_block(base + HW_USBPHY_CTRL);
+
+ /* Power up the PHY */
+ writel_relaxed(0, base + HW_USBPHY_PWD);
+
+ /* enable FS/LS device */
+ writel_relaxed(BM_USBPHY_CTRL_ENUTMILEVEL2 |
+ BM_USBPHY_CTRL_ENUTMILEVEL3,
+ base + HW_USBPHY_CTRL_SET);
+}
+
+static int mxs_phy_init(struct usb_phy *phy)
+{
+ struct mxs_phy *mxs_phy = to_mxs_phy(phy);
+
+ clk_prepare_enable(mxs_phy->clk);
+ mxs_phy_hw_init(mxs_phy);
+
+ return 0;
+}
+
+static void mxs_phy_shutdown(struct usb_phy *phy)
+{
+ struct mxs_phy *mxs_phy = to_mxs_phy(phy);
+
+ writel_relaxed(BM_USBPHY_CTRL_CLKGATE,
+ phy->io_priv + HW_USBPHY_CTRL_SET);
+
+ clk_disable_unprepare(mxs_phy->clk);
+}
+
+static int mxs_phy_on_connect(struct usb_phy *phy, int port)
+{
+ dev_dbg(phy->dev, "Connect on port %d\n", port);
+
+ mxs_phy_hw_init(to_mxs_phy(phy));
+ writel_relaxed(BM_USBPHY_CTRL_ENHOSTDISCONDETECT,
+ phy->io_priv + HW_USBPHY_CTRL_SET);
+
+ return 0;
+}
+
+static int mxs_phy_on_disconnect(struct usb_phy *phy, int port)
+{
+ dev_dbg(phy->dev, "Disconnect on port %d\n", port);
+
+ writel_relaxed(BM_USBPHY_CTRL_ENHOSTDISCONDETECT,
+ phy->io_priv + HW_USBPHY_CTRL_CLR);
+
+ return 0;
+}
+
+static int mxs_phy_probe(struct platform_device *pdev)
+{
+ struct resource *res;
+ void __iomem *base;
+ struct clk *clk;
+ struct mxs_phy *mxs_phy;
+
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ if (!res) {
+ dev_err(&pdev->dev, "can't get device resources\n");
+ return -ENOENT;
+ }
+
+ base = devm_request_and_ioremap(&pdev->dev, res);
+ if (!base)
+ return -EBUSY;
+
+ clk = devm_clk_get(&pdev->dev, NULL);
+ if (IS_ERR(clk)) {
+ dev_err(&pdev->dev,
+ "can't get the clock, err=%ld", PTR_ERR(clk));
+ return PTR_ERR(clk);
+ }
+
+ mxs_phy = devm_kzalloc(&pdev->dev, sizeof(*mxs_phy), GFP_KERNEL);
+ if (!mxs_phy) {
+ dev_err(&pdev->dev, "Failed to allocate USB PHY structure!\n");
+ return -ENOMEM;
+ }
+
+ mxs_phy->phy.io_priv = base;
+ mxs_phy->phy.dev = &pdev->dev;
+ mxs_phy->phy.label = DRIVER_NAME;
+ mxs_phy->phy.init = mxs_phy_init;
+ mxs_phy->phy.shutdown = mxs_phy_shutdown;
+ mxs_phy->phy.notify_connect = mxs_phy_on_connect;
+ mxs_phy->phy.notify_disconnect = mxs_phy_on_disconnect;
+
+ ATOMIC_INIT_NOTIFIER_HEAD(&mxs_phy->phy.notifier);
+
+ mxs_phy->clk = clk;
+
+ platform_set_drvdata(pdev, &mxs_phy->phy);
+
+ return 0;
+}
+
+static int __devexit mxs_phy_remove(struct platform_device *pdev)
+{
+ platform_set_drvdata(pdev, NULL);
+
+ return 0;
+}
+
+static const struct of_device_id mxs_phy_dt_ids[] = {
+ { .compatible = "fsl,imx23-usbphy", },
+ { /* sentinel */ }
+};
+MODULE_DEVICE_TABLE(of, mxs_phy_dt_ids);
+
+static struct platform_driver mxs_phy_driver = {
+ .probe = mxs_phy_probe,
+ .remove = __devexit_p(mxs_phy_remove),
+ .driver = {
+ .name = DRIVER_NAME,
+ .owner = THIS_MODULE,
+ .of_match_table = mxs_phy_dt_ids,
+ },
+};
+
+static int __init mxs_phy_module_init(void)
+{
+ return platform_driver_register(&mxs_phy_driver);
+}
+postcore_initcall(mxs_phy_module_init);
+
+static void __exit mxs_phy_module_exit(void)
+{
+ platform_driver_unregister(&mxs_phy_driver);
+}
+module_exit(mxs_phy_module_exit);
+
+MODULE_ALIAS("platform:mxs-usb-phy");
+MODULE_AUTHOR("Marek Vasut <marex@denx.de>");
+MODULE_AUTHOR("Richard Zhao <richard.zhao@freescale.com>");
+MODULE_DESCRIPTION("Freescale MXS USB PHY driver");
+MODULE_LICENSE("GPL");
--
1.7.9.5
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH v8 14/14] usb: chipidea: add imx platform driver
2012-06-29 9:48 [PATCH v8 00/14] add imx usb driver based on Greg next tree Richard Zhao
` (12 preceding siblings ...)
2012-06-29 9:49 ` [PATCH v8 13/14] usb: otg: add basic mxs phy driver support Richard Zhao
@ 2012-06-29 9:49 ` Richard Zhao
2012-06-29 11:15 ` Marc Kleine-Budde
2012-06-29 10:52 ` [PATCH v9 00/14] add imx usb driver based on Greg next tree Richard Zhao
14 siblings, 1 reply; 23+ messages in thread
From: Richard Zhao @ 2012-06-29 9:49 UTC (permalink / raw)
To: linux-arm-kernel
This patch supports only the host-mode functionality so far.
Signed-off-by: Richard Zhao <richard.zhao@freescale.com>
Signed-off-by: Marek Vasut <marex@denx.de>
Cc: Peter Chen <peter.chen@freescale.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Felipe Balbi <balbi@ti.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Tested-by: Subodh Nijsure <snijsure@grid-net.com>
---
.../devicetree/bindings/usb/ci13xxx-imx.txt | 18 ++
drivers/usb/chipidea/Makefile | 3 +
drivers/usb/chipidea/ci13xxx_imx.c | 198 ++++++++++++++++++++
3 files changed, 219 insertions(+)
create mode 100644 Documentation/devicetree/bindings/usb/ci13xxx-imx.txt
create mode 100644 drivers/usb/chipidea/ci13xxx_imx.c
diff --git a/Documentation/devicetree/bindings/usb/ci13xxx-imx.txt b/Documentation/devicetree/bindings/usb/ci13xxx-imx.txt
new file mode 100644
index 0000000..2c29041
--- /dev/null
+++ b/Documentation/devicetree/bindings/usb/ci13xxx-imx.txt
@@ -0,0 +1,18 @@
+* Freescale i.MX ci13xxx usb controllers
+
+Required properties:
+- compatible: Should be "fsl,imx27-usb"
+- reg: Should contain registers location and length
+- interrupts: Should contain controller interrupt
+
+Optional properties:
+- fsl,usbphy: phandler of usb phy that connects to the only one port
+- vbus-supply: regulator for vbus
+
+Examples:
+usb at 02184000 { /* USB OTG */
+ compatible = "fsl,imx6q-usb", "fsl,imx27-usb";
+ reg = <0x02184000 0x200>;
+ interrupts = <0 43 0x04>;
+ fsl,usbphy = <&usbphy1>;
+};
diff --git a/drivers/usb/chipidea/Makefile b/drivers/usb/chipidea/Makefile
index b69900a..5c66d9c 100644
--- a/drivers/usb/chipidea/Makefile
+++ b/drivers/usb/chipidea/Makefile
@@ -14,3 +14,6 @@ ifneq ($(CONFIG_PCI),)
obj-$(CONFIG_USB_CHIPIDEA) += ci13xxx_pci.o
endif
+ifneq ($(CONFIG_OF_DEVICE),)
+ obj-$(CONFIG_USB_CHIPIDEA) += ci13xxx_imx.o
+endif
diff --git a/drivers/usb/chipidea/ci13xxx_imx.c b/drivers/usb/chipidea/ci13xxx_imx.c
new file mode 100644
index 0000000..ef60d06
--- /dev/null
+++ b/drivers/usb/chipidea/ci13xxx_imx.c
@@ -0,0 +1,198 @@
+/*
+ * Copyright 2012 Freescale Semiconductor, Inc.
+ * Copyright (C) 2012 Marek Vasut <marex@denx.de>
+ * on behalf of DENX Software Engineering GmbH
+ *
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+#include <linux/module.h>
+#include <linux/of_platform.h>
+#include <linux/of_gpio.h>
+#include <linux/platform_device.h>
+#include <linux/pm_runtime.h>
+#include <linux/dma-mapping.h>
+#include <linux/usb/chipidea.h>
+#include <linux/clk.h>
+#include <linux/regulator/consumer.h>
+
+#include "ci.h"
+
+#define pdev_to_phy(pdev) \
+ ((struct usb_phy *)platform_get_drvdata(pdev))
+
+struct ci13xxx_imx_data {
+ struct device_node *phy_np;
+ struct usb_phy *phy;
+ struct platform_device *ci_pdev;
+ struct clk *clk;
+ struct regulator *reg_vbus;
+};
+
+static struct ci13xxx_platform_data ci13xxx_imx_platdata __devinitdata = {
+ .name = "ci13xxx_imx",
+ .flags = CI13XXX_REQUIRE_TRANSCEIVER |
+ CI13XXX_PULLUP_ON_VBUS |
+ CI13XXX_DISABLE_STREAMING,
+ .capoffset = DEF_CAPOFFSET,
+};
+
+static int __devinit ci13xxx_imx_probe(struct platform_device *pdev)
+{
+ struct ci13xxx_imx_data *data;
+ struct platform_device *plat_ci, *phy_pdev;
+ struct device_node *phy_np;
+ struct resource *res;
+ struct regulator *reg_vbus;
+ int ret;
+
+ data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
+ if (!data) {
+ dev_err(&pdev->dev, "Failed to allocate CI13xxx-IMX data!\n");
+ return -ENOMEM;
+ }
+
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ if (!res) {
+ dev_err(&pdev->dev, "Can't get device resources!\n");
+ return -ENOENT;
+ }
+
+ data->clk = devm_clk_get(&pdev->dev, NULL);
+ if (IS_ERR(data->clk)) {
+ dev_err(&pdev->dev,
+ "Failed to get clock, err=%ld\n", PTR_ERR(data->clk));
+ return PTR_ERR(data->clk);
+ }
+
+ ret = clk_prepare_enable(data->clk);
+ if (ret) {
+ dev_err(&pdev->dev,
+ "Failed to prepare or enable clock, err=%d\n", ret);
+ return ret;
+ }
+
+ phy_np = of_parse_phandle(pdev->dev.of_node, "fsl,usbphy", 0);
+ if (phy_np) {
+ data->phy_np = phy_np;
+ phy_pdev = of_find_device_by_node(phy_np);
+ if (phy_pdev) {
+ struct usb_phy *phy;
+ phy = pdev_to_phy(phy_pdev);
+ if (phy &&
+ try_module_get(phy_pdev->dev.driver->owner)) {
+ usb_phy_init(phy);
+ data->phy = phy;
+ }
+ }
+ }
+
+ /* we only support host now, so enable vbus here */
+ reg_vbus = devm_regulator_get(&pdev->dev, "vbus");
+ if (!IS_ERR(reg_vbus)) {
+ ret = regulator_enable(reg_vbus);
+ if (ret) {
+ dev_err(&pdev->dev,
+ "Failed to enable vbus regulator, err=%d\n",
+ ret);
+ goto put_np;
+ }
+ data->reg_vbus = reg_vbus;
+ } else {
+ reg_vbus = NULL;
+ }
+
+ ci13xxx_imx_platdata.phy = data->phy;
+
+ if (!pdev->dev.dma_mask) {
+ pdev->dev.dma_mask = devm_kzalloc(&pdev->dev,
+ sizeof(*pdev->dev.dma_mask), GFP_KERNEL);
+ if (!pdev->dev.dma_mask) {
+ ret = -ENOMEM;
+ dev_err(&pdev->dev, "Failed to alloc dma_mask!\n");
+ goto err;
+ }
+ *pdev->dev.dma_mask = DMA_BIT_MASK(32);
+ dma_set_coherent_mask(&pdev->dev, *pdev->dev.dma_mask);
+ }
+ plat_ci = ci13xxx_add_device(&pdev->dev,
+ pdev->resource, pdev->num_resources,
+ &ci13xxx_imx_platdata);
+ if (IS_ERR(plat_ci)) {
+ ret = PTR_ERR(plat_ci);
+ dev_err(&pdev->dev,
+ "Can't register ci_hdrc platform device, err=%d\n",
+ ret);
+ goto err;
+ }
+
+ data->ci_pdev = plat_ci;
+ platform_set_drvdata(pdev, data);
+
+ pm_runtime_no_callbacks(&pdev->dev);
+ pm_runtime_enable(&pdev->dev);
+
+ return 0;
+
+err:
+ if (reg_vbus)
+ regulator_disable(reg_vbus);
+put_np:
+ if (phy_np)
+ of_node_put(phy_np);
+ clk_disable_unprepare(data->clk);
+ return ret;
+}
+
+static int __devexit ci13xxx_imx_remove(struct platform_device *pdev)
+{
+ struct ci13xxx_imx_data *data = platform_get_drvdata(pdev);
+
+ pm_runtime_disable(&pdev->dev);
+ ci13xxx_remove_device(data->ci_pdev);
+
+ if (data->reg_vbus)
+ regulator_disable(data->reg_vbus);
+
+ if (data->phy) {
+ usb_phy_shutdown(data->phy);
+ module_put(data->phy->dev->driver->owner);
+ }
+
+ of_node_put(data->phy_np);
+
+ clk_disable_unprepare(data->clk);
+
+ platform_set_drvdata(pdev, NULL);
+
+ return 0;
+}
+
+static const struct of_device_id ci13xxx_imx_dt_ids[] = {
+ { .compatible = "fsl,imx27-usb", },
+ { /* sentinel */ }
+};
+MODULE_DEVICE_TABLE(of, ci13xxx_imx_dt_ids);
+
+static struct platform_driver ci13xxx_imx_driver = {
+ .probe = ci13xxx_imx_probe,
+ .remove = __devexit_p(ci13xxx_imx_remove),
+ .driver = {
+ .name = "imx_usb",
+ .owner = THIS_MODULE,
+ .of_match_table = ci13xxx_imx_dt_ids,
+ },
+};
+
+module_platform_driver(ci13xxx_imx_driver);
+
+MODULE_ALIAS("platform:imx-usb");
+MODULE_LICENSE("GPL v2");
+MODULE_DESCRIPTION("CI13xxx i.MX USB binding");
+MODULE_AUTHOR("Marek Vasut <marex@denx.de>");
+MODULE_AUTHOR("Richard Zhao <richard.zhao@freescale.com>");
--
1.7.9.5
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH v9 00/14] add imx usb driver based on Greg next tree
2012-06-29 9:48 [PATCH v8 00/14] add imx usb driver based on Greg next tree Richard Zhao
` (13 preceding siblings ...)
2012-06-29 9:49 ` [PATCH v8 14/14] usb: chipidea: add imx platform driver Richard Zhao
@ 2012-06-29 10:52 ` Richard Zhao
2012-07-04 9:20 ` Richard Zhao
14 siblings, 1 reply; 23+ messages in thread
From: Richard Zhao @ 2012-06-29 10:52 UTC (permalink / raw)
To: linux-arm-kernel
It is v9. Sorry for mistake.
--
Sent from my Android phone with K-9 Mail. Please excuse my brevity.
Richard Zhao <richard.zhao@freescale.com> wrote:
The work is based on ci13xxx rework done by Alexander Shishkin.
To let Greg pick up, I also added patches Alex queued that I depends on.
This patch series can also be found at:
https://github.com/riczhao/kernel-imx/commits/topics/usb-driver
Status:
- this version only support host
- usbotg controler works at host role
Changes since last version:
- mxs_phy: fix build warnings
- ci13xxx_imx: add pm_runtime_disable at exit path
Alexander Shishkin (1):
usb: chipidea: remove unneeded NULL check
Felipe Balbi (3):
usb: chipidea: drop useless arch-check
usb: chipidea: msm: add missing section annotation
usb: chipidea: msm: add remove method
Richard Zhao (10):
USB: Chipidea: rename struct ci13xxx_udc_driver to struct
ci13xxx_platform_data
USB: Chipidea: rename struct ci13xxx variables from udc to ci
USB: Chipidea: add unified ci13xxx_{add,remove}_device for platform
drivers
USB: Chipidea: add ci13xxx device id management
usb: chipidea: select USB_EHCI_ROOT_HUB_TT in USB_CHIPIDEA_HOST of
Kconfig
usb: otg: add notify_connect/notify_disconnect callback
USB: notify phy when root hub port connect change
usb: chipidea: permit driver bindings pass phy pointer
usb: otg: add basic mxs phy driver support
usb: chipidea: add imx platform driver
.../devicetree/bindings/usb/ci13xxx-imx.txt | 18 +
Documentation/devicetree/bindings/usb/mxs-phy.txt | 13 +
drivers/usb/chipidea/Kconfig | 1 +
drivers/usb/chipidea/Makefile | 9 +-
drivers/usb/chipidea/ci.h | 32 +-
drivers/usb/chipidea/ci13xxx_imx.c | 198 ++++++
drivers/usb/chipidea/ci13xxx_msm.c | 63 +-
drivers/usb/chipidea/ci13xxx_pci.c | 52 +-
drivers/usb/chipidea/core.c | 70 ++-
drivers/usb/chipidea/debug.c | 146 ++---
drivers/usb/chipidea/host.c | 3 +-
drivers/usb/chipidea/udc.c | 634 ++++++++++----------
drivers/usb/core/hub.c | 8 +
drivers/usb/otg/Kconfig | 10 +
drivers/usb/otg/Makefile | 1 +
drivers/usb/otg/mxs-phy.c | 186 ++++++
include/linux/usb/chipidea.h | 14 +-
include/linux/usb/otg.h | 21 +
18 files changed, 989 insertions(+), 490 deletions(-)
create mode 100644 Documentation/devicetree/bindings/usb/ci13xxx-imx.txt
create mode 100644 Documentation/devicetree/bindings/usb/mxs-phy.txt
create mode 100644 drivers/usb/chipidea/ci13xxx_imx.c
create mode 100644 drivers/usb/otg/mxs-phy.c
--
1.7.9.5
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20120629/d08595a4/attachment-0001.html>
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH v8 14/14] usb: chipidea: add imx platform driver
2012-06-29 9:49 ` [PATCH v8 14/14] usb: chipidea: add imx platform driver Richard Zhao
@ 2012-06-29 11:15 ` Marc Kleine-Budde
2012-06-29 14:53 ` Richard Zhao
0 siblings, 1 reply; 23+ messages in thread
From: Marc Kleine-Budde @ 2012-06-29 11:15 UTC (permalink / raw)
To: linux-arm-kernel
On 06/29/2012 11:49 AM, Richard Zhao wrote:
> This patch supports only the host-mode functionality so far.
>
> Signed-off-by: Richard Zhao <richard.zhao@freescale.com>
> Signed-off-by: Marek Vasut <marex@denx.de>
> Cc: Peter Chen <peter.chen@freescale.com>
> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
> Cc: Felipe Balbi <balbi@ti.com>
> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> Tested-by: Subodh Nijsure <snijsure@grid-net.com>
> ---
> .../devicetree/bindings/usb/ci13xxx-imx.txt | 18 ++
> drivers/usb/chipidea/Makefile | 3 +
> drivers/usb/chipidea/ci13xxx_imx.c | 198 ++++++++++++++++++++
> 3 files changed, 219 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/usb/ci13xxx-imx.txt
> create mode 100644 drivers/usb/chipidea/ci13xxx_imx.c
>
> diff --git a/Documentation/devicetree/bindings/usb/ci13xxx-imx.txt b/Documentation/devicetree/bindings/usb/ci13xxx-imx.txt
> new file mode 100644
> index 0000000..2c29041
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/usb/ci13xxx-imx.txt
> @@ -0,0 +1,18 @@
> +* Freescale i.MX ci13xxx usb controllers
> +
> +Required properties:
> +- compatible: Should be "fsl,imx27-usb"
> +- reg: Should contain registers location and length
> +- interrupts: Should contain controller interrupt
> +
> +Optional properties:
> +- fsl,usbphy: phandler of usb phy that connects to the only one port
> +- vbus-supply: regulator for vbus
> +
> +Examples:
> +usb at 02184000 { /* USB OTG */
> + compatible = "fsl,imx6q-usb", "fsl,imx27-usb";
> + reg = <0x02184000 0x200>;
> + interrupts = <0 43 0x04>;
> + fsl,usbphy = <&usbphy1>;
> +};
> diff --git a/drivers/usb/chipidea/Makefile b/drivers/usb/chipidea/Makefile
> index b69900a..5c66d9c 100644
> --- a/drivers/usb/chipidea/Makefile
> +++ b/drivers/usb/chipidea/Makefile
> @@ -14,3 +14,6 @@ ifneq ($(CONFIG_PCI),)
> obj-$(CONFIG_USB_CHIPIDEA) += ci13xxx_pci.o
> endif
>
> +ifneq ($(CONFIG_OF_DEVICE),)
> + obj-$(CONFIG_USB_CHIPIDEA) += ci13xxx_imx.o
> +endif
> diff --git a/drivers/usb/chipidea/ci13xxx_imx.c b/drivers/usb/chipidea/ci13xxx_imx.c
> new file mode 100644
> index 0000000..ef60d06
> --- /dev/null
> +++ b/drivers/usb/chipidea/ci13xxx_imx.c
> @@ -0,0 +1,198 @@
> +/*
> + * Copyright 2012 Freescale Semiconductor, Inc.
> + * Copyright (C) 2012 Marek Vasut <marex@denx.de>
> + * on behalf of DENX Software Engineering GmbH
> + *
> + * The code contained herein is licensed under the GNU General Public
> + * License. You may obtain a copy of the GNU General Public License
> + * Version 2 or later at the following locations:
> + *
> + * http://www.opensource.org/licenses/gpl-license.html
> + * http://www.gnu.org/copyleft/gpl.html
> + */
> +
> +#include <linux/module.h>
> +#include <linux/of_platform.h>
> +#include <linux/of_gpio.h>
> +#include <linux/platform_device.h>
> +#include <linux/pm_runtime.h>
> +#include <linux/dma-mapping.h>
> +#include <linux/usb/chipidea.h>
> +#include <linux/clk.h>
> +#include <linux/regulator/consumer.h>
> +
> +#include "ci.h"
> +
> +#define pdev_to_phy(pdev) \
> + ((struct usb_phy *)platform_get_drvdata(pdev))
> +
> +struct ci13xxx_imx_data {
> + struct device_node *phy_np;
> + struct usb_phy *phy;
> + struct platform_device *ci_pdev;
> + struct clk *clk;
> + struct regulator *reg_vbus;
> +};
> +
> +static struct ci13xxx_platform_data ci13xxx_imx_platdata __devinitdata = {
> + .name = "ci13xxx_imx",
> + .flags = CI13XXX_REQUIRE_TRANSCEIVER |
> + CI13XXX_PULLUP_ON_VBUS |
> + CI13XXX_DISABLE_STREAMING,
> + .capoffset = DEF_CAPOFFSET,
> +};
> +
> +static int __devinit ci13xxx_imx_probe(struct platform_device *pdev)
> +{
> + struct ci13xxx_imx_data *data;
> + struct platform_device *plat_ci, *phy_pdev;
> + struct device_node *phy_np;
> + struct resource *res;
> + struct regulator *reg_vbus;
> + int ret;
> +
> + data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
> + if (!data) {
> + dev_err(&pdev->dev, "Failed to allocate CI13xxx-IMX data!\n");
> + return -ENOMEM;
> + }
> +
> + res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> + if (!res) {
> + dev_err(&pdev->dev, "Can't get device resources!\n");
> + return -ENOENT;
> + }
> +
> + data->clk = devm_clk_get(&pdev->dev, NULL);
> + if (IS_ERR(data->clk)) {
> + dev_err(&pdev->dev,
> + "Failed to get clock, err=%ld\n", PTR_ERR(data->clk));
> + return PTR_ERR(data->clk);
> + }
> +
> + ret = clk_prepare_enable(data->clk);
> + if (ret) {
> + dev_err(&pdev->dev,
> + "Failed to prepare or enable clock, err=%d\n", ret);
> + return ret;
> + }
> +
> + phy_np = of_parse_phandle(pdev->dev.of_node, "fsl,usbphy", 0);
> + if (phy_np) {
> + data->phy_np = phy_np;
> + phy_pdev = of_find_device_by_node(phy_np);
> + if (phy_pdev) {
> + struct usb_phy *phy;
> + phy = pdev_to_phy(phy_pdev);
> + if (phy &&
> + try_module_get(phy_pdev->dev.driver->owner)) {
> + usb_phy_init(phy);
> + data->phy = phy;
> + }
> + }
> + }
what about using devm_usb_get_phy_by_phandle() as proposed in Kishon's
patch: "drivers: usb: otg: add device tree support to otg library".
Marc
> +
> + /* we only support host now, so enable vbus here */
> + reg_vbus = devm_regulator_get(&pdev->dev, "vbus");
> + if (!IS_ERR(reg_vbus)) {
> + ret = regulator_enable(reg_vbus);
> + if (ret) {
> + dev_err(&pdev->dev,
> + "Failed to enable vbus regulator, err=%d\n",
> + ret);
> + goto put_np;
> + }
> + data->reg_vbus = reg_vbus;
> + } else {
> + reg_vbus = NULL;
> + }
> +
> + ci13xxx_imx_platdata.phy = data->phy;
> +
> + if (!pdev->dev.dma_mask) {
> + pdev->dev.dma_mask = devm_kzalloc(&pdev->dev,
> + sizeof(*pdev->dev.dma_mask), GFP_KERNEL);
> + if (!pdev->dev.dma_mask) {
> + ret = -ENOMEM;
> + dev_err(&pdev->dev, "Failed to alloc dma_mask!\n");
> + goto err;
> + }
> + *pdev->dev.dma_mask = DMA_BIT_MASK(32);
> + dma_set_coherent_mask(&pdev->dev, *pdev->dev.dma_mask);
> + }
> + plat_ci = ci13xxx_add_device(&pdev->dev,
> + pdev->resource, pdev->num_resources,
> + &ci13xxx_imx_platdata);
> + if (IS_ERR(plat_ci)) {
> + ret = PTR_ERR(plat_ci);
> + dev_err(&pdev->dev,
> + "Can't register ci_hdrc platform device, err=%d\n",
> + ret);
> + goto err;
> + }
> +
> + data->ci_pdev = plat_ci;
> + platform_set_drvdata(pdev, data);
> +
> + pm_runtime_no_callbacks(&pdev->dev);
> + pm_runtime_enable(&pdev->dev);
> +
> + return 0;
> +
> +err:
> + if (reg_vbus)
> + regulator_disable(reg_vbus);
> +put_np:
> + if (phy_np)
> + of_node_put(phy_np);
> + clk_disable_unprepare(data->clk);
> + return ret;
> +}
> +
> +static int __devexit ci13xxx_imx_remove(struct platform_device *pdev)
> +{
> + struct ci13xxx_imx_data *data = platform_get_drvdata(pdev);
> +
> + pm_runtime_disable(&pdev->dev);
> + ci13xxx_remove_device(data->ci_pdev);
> +
> + if (data->reg_vbus)
> + regulator_disable(data->reg_vbus);
> +
> + if (data->phy) {
> + usb_phy_shutdown(data->phy);
> + module_put(data->phy->dev->driver->owner);
> + }
> +
> + of_node_put(data->phy_np);
> +
> + clk_disable_unprepare(data->clk);
> +
> + platform_set_drvdata(pdev, NULL);
> +
> + return 0;
> +}
> +
> +static const struct of_device_id ci13xxx_imx_dt_ids[] = {
> + { .compatible = "fsl,imx27-usb", },
> + { /* sentinel */ }
> +};
> +MODULE_DEVICE_TABLE(of, ci13xxx_imx_dt_ids);
> +
> +static struct platform_driver ci13xxx_imx_driver = {
> + .probe = ci13xxx_imx_probe,
> + .remove = __devexit_p(ci13xxx_imx_remove),
> + .driver = {
> + .name = "imx_usb",
> + .owner = THIS_MODULE,
> + .of_match_table = ci13xxx_imx_dt_ids,
> + },
> +};
> +
> +module_platform_driver(ci13xxx_imx_driver);
> +
> +MODULE_ALIAS("platform:imx-usb");
> +MODULE_LICENSE("GPL v2");
> +MODULE_DESCRIPTION("CI13xxx i.MX USB binding");
> +MODULE_AUTHOR("Marek Vasut <marex@denx.de>");
> +MODULE_AUTHOR("Richard Zhao <richard.zhao@freescale.com>");
--
Pengutronix e.K. | Marc Kleine-Budde |
Industrial Linux Solutions | Phone: +49-231-2826-924 |
Vertretung West/Dortmund | Fax: +49-5121-206917-5555 |
Amtsgericht Hildesheim, HRA 2686 | http://www.pengutronix.de |
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 262 bytes
Desc: OpenPGP digital signature
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20120629/3661d899/attachment.sig>
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH v8 14/14] usb: chipidea: add imx platform driver
2012-06-29 11:15 ` Marc Kleine-Budde
@ 2012-06-29 14:53 ` Richard Zhao
0 siblings, 0 replies; 23+ messages in thread
From: Richard Zhao @ 2012-06-29 14:53 UTC (permalink / raw)
To: linux-arm-kernel
On Fri, Jun 29, 2012 at 01:15:14PM +0200, Marc Kleine-Budde wrote:
> On 06/29/2012 11:49 AM, Richard Zhao wrote:
> > This patch supports only the host-mode functionality so far.
> >
> > Signed-off-by: Richard Zhao <richard.zhao@freescale.com>
> > Signed-off-by: Marek Vasut <marex@denx.de>
> > Cc: Peter Chen <peter.chen@freescale.com>
> > Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
> > Cc: Felipe Balbi <balbi@ti.com>
> > Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> > Tested-by: Subodh Nijsure <snijsure@grid-net.com>
> > ---
> > .../devicetree/bindings/usb/ci13xxx-imx.txt | 18 ++
> > drivers/usb/chipidea/Makefile | 3 +
> > drivers/usb/chipidea/ci13xxx_imx.c | 198 ++++++++++++++++++++
> > 3 files changed, 219 insertions(+)
> > create mode 100644 Documentation/devicetree/bindings/usb/ci13xxx-imx.txt
> > create mode 100644 drivers/usb/chipidea/ci13xxx_imx.c
> >
> > diff --git a/Documentation/devicetree/bindings/usb/ci13xxx-imx.txt b/Documentation/devicetree/bindings/usb/ci13xxx-imx.txt
> > new file mode 100644
> > index 0000000..2c29041
> > --- /dev/null
> > +++ b/Documentation/devicetree/bindings/usb/ci13xxx-imx.txt
> > @@ -0,0 +1,18 @@
> > +* Freescale i.MX ci13xxx usb controllers
> > +
> > +Required properties:
> > +- compatible: Should be "fsl,imx27-usb"
> > +- reg: Should contain registers location and length
> > +- interrupts: Should contain controller interrupt
> > +
> > +Optional properties:
> > +- fsl,usbphy: phandler of usb phy that connects to the only one port
> > +- vbus-supply: regulator for vbus
> > +
> > +Examples:
> > +usb at 02184000 { /* USB OTG */
> > + compatible = "fsl,imx6q-usb", "fsl,imx27-usb";
> > + reg = <0x02184000 0x200>;
> > + interrupts = <0 43 0x04>;
> > + fsl,usbphy = <&usbphy1>;
> > +};
> > diff --git a/drivers/usb/chipidea/Makefile b/drivers/usb/chipidea/Makefile
> > index b69900a..5c66d9c 100644
> > --- a/drivers/usb/chipidea/Makefile
> > +++ b/drivers/usb/chipidea/Makefile
> > @@ -14,3 +14,6 @@ ifneq ($(CONFIG_PCI),)
> > obj-$(CONFIG_USB_CHIPIDEA) += ci13xxx_pci.o
> > endif
> >
> > +ifneq ($(CONFIG_OF_DEVICE),)
> > + obj-$(CONFIG_USB_CHIPIDEA) += ci13xxx_imx.o
> > +endif
> > diff --git a/drivers/usb/chipidea/ci13xxx_imx.c b/drivers/usb/chipidea/ci13xxx_imx.c
> > new file mode 100644
> > index 0000000..ef60d06
> > --- /dev/null
> > +++ b/drivers/usb/chipidea/ci13xxx_imx.c
> > @@ -0,0 +1,198 @@
> > +/*
> > + * Copyright 2012 Freescale Semiconductor, Inc.
> > + * Copyright (C) 2012 Marek Vasut <marex@denx.de>
> > + * on behalf of DENX Software Engineering GmbH
> > + *
> > + * The code contained herein is licensed under the GNU General Public
> > + * License. You may obtain a copy of the GNU General Public License
> > + * Version 2 or later at the following locations:
> > + *
> > + * http://www.opensource.org/licenses/gpl-license.html
> > + * http://www.gnu.org/copyleft/gpl.html
> > + */
> > +
> > +#include <linux/module.h>
> > +#include <linux/of_platform.h>
> > +#include <linux/of_gpio.h>
> > +#include <linux/platform_device.h>
> > +#include <linux/pm_runtime.h>
> > +#include <linux/dma-mapping.h>
> > +#include <linux/usb/chipidea.h>
> > +#include <linux/clk.h>
> > +#include <linux/regulator/consumer.h>
> > +
> > +#include "ci.h"
> > +
> > +#define pdev_to_phy(pdev) \
> > + ((struct usb_phy *)platform_get_drvdata(pdev))
> > +
> > +struct ci13xxx_imx_data {
> > + struct device_node *phy_np;
> > + struct usb_phy *phy;
> > + struct platform_device *ci_pdev;
> > + struct clk *clk;
> > + struct regulator *reg_vbus;
> > +};
> > +
> > +static struct ci13xxx_platform_data ci13xxx_imx_platdata __devinitdata = {
> > + .name = "ci13xxx_imx",
> > + .flags = CI13XXX_REQUIRE_TRANSCEIVER |
> > + CI13XXX_PULLUP_ON_VBUS |
> > + CI13XXX_DISABLE_STREAMING,
> > + .capoffset = DEF_CAPOFFSET,
> > +};
> > +
> > +static int __devinit ci13xxx_imx_probe(struct platform_device *pdev)
> > +{
> > + struct ci13xxx_imx_data *data;
> > + struct platform_device *plat_ci, *phy_pdev;
> > + struct device_node *phy_np;
> > + struct resource *res;
> > + struct regulator *reg_vbus;
> > + int ret;
> > +
> > + data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
> > + if (!data) {
> > + dev_err(&pdev->dev, "Failed to allocate CI13xxx-IMX data!\n");
> > + return -ENOMEM;
> > + }
> > +
> > + res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> > + if (!res) {
> > + dev_err(&pdev->dev, "Can't get device resources!\n");
> > + return -ENOENT;
> > + }
> > +
> > + data->clk = devm_clk_get(&pdev->dev, NULL);
> > + if (IS_ERR(data->clk)) {
> > + dev_err(&pdev->dev,
> > + "Failed to get clock, err=%ld\n", PTR_ERR(data->clk));
> > + return PTR_ERR(data->clk);
> > + }
> > +
> > + ret = clk_prepare_enable(data->clk);
> > + if (ret) {
> > + dev_err(&pdev->dev,
> > + "Failed to prepare or enable clock, err=%d\n", ret);
> > + return ret;
> > + }
> > +
> > + phy_np = of_parse_phandle(pdev->dev.of_node, "fsl,usbphy", 0);
> > + if (phy_np) {
> > + data->phy_np = phy_np;
> > + phy_pdev = of_find_device_by_node(phy_np);
> > + if (phy_pdev) {
> > + struct usb_phy *phy;
> > + phy = pdev_to_phy(phy_pdev);
> > + if (phy &&
> > + try_module_get(phy_pdev->dev.driver->owner)) {
> > + usb_phy_init(phy);
> > + data->phy = phy;
> > + }
> > + }
> > + }
>
> what about using devm_usb_get_phy_by_phandle() as proposed in Kishon's
> patch: "drivers: usb: otg: add device tree support to otg library".
I won't use it until it's accepted.
Thanks
Richard
>
> Marc
>
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH v9 00/14] add imx usb driver based on Greg next tree
2012-06-29 10:52 ` [PATCH v9 00/14] add imx usb driver based on Greg next tree Richard Zhao
@ 2012-07-04 9:20 ` Richard Zhao
2012-07-04 14:44 ` Greg KH
0 siblings, 1 reply; 23+ messages in thread
From: Richard Zhao @ 2012-07-04 9:20 UTC (permalink / raw)
To: linux-arm-kernel
On Fri, Jun 29, 2012 at 06:52:54PM +0800, Richard Zhao wrote:
> It is v9. Sorry for mistake.
Hi Greg,
It looks like no more comments. Could you pick it up?
Thanks
Richard
> --
> Sent from my Android phone with K-9 Mail. Please excuse my brevity.
>
> Richard Zhao <richard.zhao@freescale.com> wrote:
>
> The work is based on ci13xxx rework done by Alexander Shishkin.
>
> To let Greg pick up, I also added patches Alex queued that I depends on.
>
> This patch series can also be found at:
> https://github.com/riczhao/kernel-imx/commits/topics/usb-driver
>
> Status:
> - this version only support host
> - usbotg controler works at host role
>
> Changes since last version:
> - mxs_phy: fix build warnings
> - ci13xxx_imx: add pm_runtime_disable at exit path
>
> Alexander Shishkin (1):
> usb: chipidea: remove unneeded NULL check
>
> Felipe Balbi (3):
> usb: chipidea: drop useless arch-check
> usb: chipidea: msm: add missing section annotation
> usb: chipidea: msm: add remove method
>
> Richard Zhao (10):
> USB: Chipidea: rename struct ci13xxx_udc_driver to struct
> ci13xxx_platform_data
> USB: Chipidea: rename struct ci13xxx variables from udc to ci
> USB: Chipidea: add unified ci13xxx_{add,remove}_device for platform
> drivers
> USB: Chipidea: add ci13xxx device id management
> usb: chipidea: select USB_EHCI_ROOT_HUB_TT in USB_CHIPIDEA_HOST of
> Kconfig
> usb: otg: add notify_connect/notify_disconnect callback
> USB: notify phy when root hub port connect change
> usb: chipidea: permit driver bindings pass phy pointer
> usb: otg: add basic mxs phy driver support
> usb: chipidea: add imx platform driver
>
> .../devicetree/bindings/usb/ci13xxx-imx.txt | 18 +
> Documentation/devicetree/bindings/usb/mxs-phy.txt | 13 +
> drivers/usb/chipidea/Kconfig | 1 +
> drivers/usb/chipidea/Makefile | 9 +-
> drivers/usb/chipidea/ci.h | 32 +-
> drivers/usb/chipidea/ci13xxx_imx.c | 198 ++++++
> drivers/usb/chipidea/ci13xxx_msm.c | 63 +-
> drivers/usb/chipidea/ci13xxx_pci.c | 52 +-
> drivers/usb/chipidea/core.c | 70 ++-
> drivers/usb/chipidea/debug.c | 146 ++---
> drivers/usb/chipidea/host.c | 3 +-
> drivers/usb/chipidea/udc.c | 634 ++++++++++----------
> drivers/usb/core/hub.c | 8 +
> drivers/usb/otg/Kconfig | 10 +
> drivers/usb/otg/Makefile | 1 +
> drivers/usb/otg/mxs-phy.c | 186 ++++++
> include/linux/usb/chipidea.h | 14 +-
> include/linux/usb/otg.h | 21 +
> 18 files changed, 989 insertions(+), 490 deletions(-)
> create mode 100644 Documentation/devicetree/bindings/usb/ci13xxx-imx.txt
> create mode 100644 Documentation/devicetree/bindings/usb/mxs-phy.txt
> create mode 100644 drivers/usb/chipidea/ci13xxx_imx.c
> create mode 100644 drivers/usb/otg/mxs-phy.c
>
> --
> 1.7.9.5
>
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-usb" in
> the body of a message to majordomo at vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH v9 00/14] add imx usb driver based on Greg next tree
2012-07-04 9:20 ` Richard Zhao
@ 2012-07-04 14:44 ` Greg KH
0 siblings, 0 replies; 23+ messages in thread
From: Greg KH @ 2012-07-04 14:44 UTC (permalink / raw)
To: linux-arm-kernel
On Wed, Jul 04, 2012 at 05:20:51PM +0800, Richard Zhao wrote:
> On Fri, Jun 29, 2012 at 06:52:54PM +0800, Richard Zhao wrote:
> > It is v9. Sorry for mistake.
> Hi Greg,
>
> It looks like no more comments. Could you pick it up?
Ok, I will look at these next week when I return from vacation.
greg k-h
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH v8 06/14] USB: Chipidea: rename struct ci13xxx variables from udc to ci
2012-06-29 9:48 ` [PATCH v8 06/14] USB: Chipidea: rename struct ci13xxx variables from udc to ci Richard Zhao
@ 2012-07-06 18:07 ` Greg KH
2012-07-07 14:56 ` Richard Zhao
0 siblings, 1 reply; 23+ messages in thread
From: Greg KH @ 2012-07-06 18:07 UTC (permalink / raw)
To: linux-arm-kernel
On Fri, Jun 29, 2012 at 05:48:54PM +0800, Richard Zhao wrote:
> struct ci13xxx represent the controller, which may be device or host,
> so name its variables as ci.
>
> Signed-off-by: Richard Zhao <richard.zhao@freescale.com>
> Reviewed-by: Felipe Balbi <balbi@ti.com>
> Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com>
> Reviewed-by: Marek Vasut <marex@denx.de>
This patch fails to apply (the 5/14 had some fuzz, but I fixed that by
hand.) Odds are it's due to Felipe's other changes now in my tree.
Care to rediff this, and the rest of the series against the usb-next
branch and resend them so that I can apply them?
I've applied the first 5 in this series already, so you don't have to
resend them.
thanks,
greg k-h
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH v8 06/14] USB: Chipidea: rename struct ci13xxx variables from udc to ci
2012-07-06 18:07 ` Greg KH
@ 2012-07-07 14:56 ` Richard Zhao
0 siblings, 0 replies; 23+ messages in thread
From: Richard Zhao @ 2012-07-07 14:56 UTC (permalink / raw)
To: linux-arm-kernel
On Fri, Jul 06, 2012 at 11:07:21AM -0700, Greg KH wrote:
> On Fri, Jun 29, 2012 at 05:48:54PM +0800, Richard Zhao wrote:
> > struct ci13xxx represent the controller, which may be device or host,
> > so name its variables as ci.
> >
> > Signed-off-by: Richard Zhao <richard.zhao@freescale.com>
> > Reviewed-by: Felipe Balbi <balbi@ti.com>
> > Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com>
> > Reviewed-by: Marek Vasut <marex@denx.de>
>
> This patch fails to apply (the 5/14 had some fuzz, but I fixed that by
> hand.
#5 is good. Thanks.
> ) Odds are it's due to Felipe's other changes now in my tree.
> Care to rediff this, and the rest of the series against the usb-next
> branch and resend them so that I can apply them?
I'll send out v9 REBASE.
Thanks
Richard
>
> I've applied the first 5 in this series already, so you don't have to
> resend them.
>
> thanks,
>
> greg k-h
>
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH v8 08/14] USB: Chipidea: add ci13xxx device id management
2012-06-28 3:37 [PATCH v8 " Richard Zhao
@ 2012-06-28 3:37 ` Richard Zhao
0 siblings, 0 replies; 23+ messages in thread
From: Richard Zhao @ 2012-06-28 3:37 UTC (permalink / raw)
To: linux-arm-kernel
We use ida_simple_get and ida_simple_remove to manage the ids.
Signed-off-by: Richard Zhao <richard.zhao@freescale.com>
Reviewed-by: Felipe Balbi <balbi@ti.com>
Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com>
---
drivers/usb/chipidea/core.c | 21 ++++++++++++++++-----
1 file changed, 16 insertions(+), 5 deletions(-)
diff --git a/drivers/usb/chipidea/core.c b/drivers/usb/chipidea/core.c
index 8b9d06f..39603d7 100644
--- a/drivers/usb/chipidea/core.c
+++ b/drivers/usb/chipidea/core.c
@@ -56,6 +56,7 @@
#include <linux/init.h>
#include <linux/platform_device.h>
#include <linux/module.h>
+#include <linux/idr.h>
#include <linux/interrupt.h>
#include <linux/io.h>
#include <linux/irq.h>
@@ -332,17 +333,24 @@ static irqreturn_t ci_irq(int irq, void *data)
return ci->role == CI_ROLE_END ? ret : ci_role(ci)->irq(ci);
}
+static DEFINE_IDA(ci_ida);
+
struct platform_device *ci13xxx_add_device(struct device *dev,
struct resource *res, int nres,
struct ci13xxx_platform_data *platdata)
{
struct platform_device *pdev;
- int ret;
+ int id, ret;
- /* FIXME: find a way to choose id */
- pdev = platform_device_alloc("ci_hdrc", -1);
- if (!pdev)
- return ERR_PTR(-ENOMEM);
+ id = ida_simple_get(&ci_ida, 0, 0, GFP_KERNEL);
+ if (id < 0)
+ return ERR_PTR(id);
+
+ pdev = platform_device_alloc("ci_hdrc", id);
+ if (!pdev) {
+ ret = -ENOMEM;
+ goto put_id;
+ }
pdev->dev.parent = dev;
pdev->dev.dma_mask = dev->dma_mask;
@@ -365,6 +373,8 @@ struct platform_device *ci13xxx_add_device(struct device *dev,
err:
platform_device_put(pdev);
+put_id:
+ ida_simple_remove(&ci_ida, id);
return ERR_PTR(ret);
}
EXPORT_SYMBOL_GPL(ci13xxx_add_device);
@@ -372,6 +382,7 @@ EXPORT_SYMBOL_GPL(ci13xxx_add_device);
void ci13xxx_remove_device(struct platform_device *pdev)
{
platform_device_unregister(pdev);
+ ida_simple_remove(&ci_ida, pdev->id);
}
EXPORT_SYMBOL_GPL(ci13xxx_remove_device);
--
1.7.9.5
^ permalink raw reply related [flat|nested] 23+ messages in thread
end of thread, other threads:[~2012-07-07 14:56 UTC | newest]
Thread overview: 23+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-06-29 9:48 [PATCH v8 00/14] add imx usb driver based on Greg next tree Richard Zhao
2012-06-29 9:48 ` [PATCH v8 01/14] usb: chipidea: remove unneeded NULL check Richard Zhao
2012-06-29 9:48 ` [PATCH v8 02/14] usb: chipidea: drop useless arch-check Richard Zhao
2012-06-29 9:48 ` [PATCH v8 03/14] usb: chipidea: msm: add missing section annotation Richard Zhao
2012-06-29 9:48 ` [PATCH v8 04/14] usb: chipidea: msm: add remove method Richard Zhao
2012-06-29 9:48 ` [PATCH v8 05/14] USB: Chipidea: rename struct ci13xxx_udc_driver to struct ci13xxx_platform_data Richard Zhao
2012-06-29 9:48 ` [PATCH v8 06/14] USB: Chipidea: rename struct ci13xxx variables from udc to ci Richard Zhao
2012-07-06 18:07 ` Greg KH
2012-07-07 14:56 ` Richard Zhao
2012-06-29 9:48 ` [PATCH v8 07/14] USB: Chipidea: add unified ci13xxx_{add, remove}_device for platform drivers Richard Zhao
2012-06-29 9:48 ` [PATCH v8 08/14] USB: Chipidea: add ci13xxx device id management Richard Zhao
2012-06-29 9:48 ` [PATCH v8 09/14] usb: chipidea: select USB_EHCI_ROOT_HUB_TT in USB_CHIPIDEA_HOST of Kconfig Richard Zhao
2012-06-29 9:48 ` [PATCH v8 10/14] usb: otg: add notify_connect/notify_disconnect callback Richard Zhao
2012-06-29 9:48 ` [PATCH v8 11/14] USB: notify phy when root hub port connect change Richard Zhao
2012-06-29 9:49 ` [PATCH v8 12/14] usb: chipidea: permit driver bindings pass phy pointer Richard Zhao
2012-06-29 9:49 ` [PATCH v8 13/14] usb: otg: add basic mxs phy driver support Richard Zhao
2012-06-29 9:49 ` [PATCH v8 14/14] usb: chipidea: add imx platform driver Richard Zhao
2012-06-29 11:15 ` Marc Kleine-Budde
2012-06-29 14:53 ` Richard Zhao
2012-06-29 10:52 ` [PATCH v9 00/14] add imx usb driver based on Greg next tree Richard Zhao
2012-07-04 9:20 ` Richard Zhao
2012-07-04 14:44 ` Greg KH
-- strict thread matches above, loose matches on Subject: below --
2012-06-28 3:37 [PATCH v8 " Richard Zhao
2012-06-28 3:37 ` [PATCH v8 08/14] USB: Chipidea: add ci13xxx device id management Richard Zhao
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).