2014-07-09 10:19:49

by Antoine Tenart

[permalink] [raw]
Subject: [PATCH 0/4] usb: add support for the generic PHY framework

Hi all,

This is an attempt to add more common USB code aware of the generic PHY
framework, while keeping the compatibility for the USB PHY one. It does
not add the full support, some USB PHY specific functions not being
available currently in the generic PHY subsystem (e.g. usb_phy_set_power()).
But it allows to use the generic PHY framework in other cases, and might
help others to convert their USB PHY drivers.

A little background: I submitted a series to support USB on Berlin SoCs[1].
One patch added a new PHY driver in drivers/usb/phy and Felipe asked it to
be in the generic PHY framework instead[2]. This PHY being used by a ChipIdea
driver, changes were needed in ChipIdea, OTG and HCD.

This is done in 3 steps:
1. moving the OTG state from the USB PHY structure to the OTG one
2. renaming the field 'phy' to 'usb_phy'
3. adding a field for the generic framework PHY and dissociating its
use from the USB PHY one

Step 1 is in the first patch. Steps 2 and 3 are done in OTG, HCD and CHipIdea
subsystems in patches 2 to 4 (one per subsystem).

I tested it by using the ChipIdea driver I introduced, both with an USB PHY
and a PHY driver successfully. I also compiled a multi_v7 kernel, with every
driver I could enable in the USB section.

I'd like more people to test and your inputs and suggestions on these changes.

Feel free to add Ccs if others might be interested in this. If needed patches
can be squashed or divided, I tried there to group modifications by USB
framework parts (OTG, HCD, ChipIdea).

Patches can also be found at:
git://git.free-electrons.com:users/antoine-tenart/linux.git usb-phy

Thanks a lot!

Antoine

[1] http://lists.infradead.org/pipermail/linux-arm-kernel/2014-June/265888.html
[2] http://lists.infradead.org/pipermail/linux-arm-kernel/2014-June/267981.html

Antoine Ténart (4):
usb: move the OTG state from the USB PHY to the OTG structure
usb: add support to the PHY framework for OTG
usb: add support to the PHY framework for HCD
usb: chipidea: add support to the PHY framework for ChipIdea

drivers/phy/phy-omap-usb2.c | 14 ++----
drivers/usb/chipidea/ci.h | 4 +-
drivers/usb/chipidea/ci_hdrc_imx.c | 2 +-
drivers/usb/chipidea/ci_hdrc_msm.c | 6 +--
drivers/usb/chipidea/core.c | 67 +++++++++++++++++++++-----
drivers/usb/chipidea/debug.c | 5 +-
drivers/usb/chipidea/host.c | 17 ++++---
drivers/usb/chipidea/otg_fsm.c | 18 +++----
drivers/usb/chipidea/udc.c | 4 +-
drivers/usb/common/usb-otg-fsm.c | 8 ++--
drivers/usb/core/hcd.c | 61 +++++++++++++++++-------
drivers/usb/core/hub.c | 8 ++--
drivers/usb/host/ehci-fsl.c | 16 +++----
drivers/usb/host/ehci-hub.c | 2 +-
drivers/usb/host/ehci-msm.c | 4 +-
drivers/usb/host/ehci-tegra.c | 16 +++----
drivers/usb/host/ohci-omap.c | 20 ++++----
drivers/usb/musb/am35x.c | 28 +++++------
drivers/usb/musb/blackfin.c | 18 +++----
drivers/usb/musb/da8xx.c | 28 +++++------
drivers/usb/musb/davinci.c | 18 +++----
drivers/usb/musb/musb_core.c | 94 ++++++++++++++++++-------------------
drivers/usb/musb/musb_dsps.c | 26 +++++-----
drivers/usb/musb/musb_gadget.c | 36 +++++++-------
drivers/usb/musb/musb_host.c | 8 ++--
drivers/usb/musb/musb_virthub.c | 22 ++++-----
drivers/usb/musb/omap2430.c | 30 ++++++------
drivers/usb/musb/tusb6010.c | 40 ++++++++--------
drivers/usb/musb/ux500.c | 10 ++--
drivers/usb/phy/phy-ab8500-usb.c | 16 +++----
drivers/usb/phy/phy-fsl-usb.c | 22 ++++-----
drivers/usb/phy/phy-generic.c | 6 +--
drivers/usb/phy/phy-gpio-vbus-usb.c | 12 ++---
drivers/usb/phy/phy-isp1301-omap.c | 10 ++--
drivers/usb/phy/phy-msm-usb.c | 93 ++++++++++++++++++------------------
drivers/usb/phy/phy-mv-usb.c | 50 ++++++++++----------
drivers/usb/phy/phy-samsung-usb2.c | 2 +-
drivers/usb/phy/phy-tahvo.c | 8 ++--
drivers/usb/phy/phy-ulpi.c | 6 +--
include/linux/usb/chipidea.h | 4 +-
include/linux/usb/hcd.h | 5 +-
include/linux/usb/otg.h | 7 ++-
include/linux/usb/phy.h | 1 -
43 files changed, 481 insertions(+), 391 deletions(-)

--
1.9.1


2014-07-09 10:19:59

by Antoine Tenart

[permalink] [raw]
Subject: [PATCH 3/4] usb: add support to the PHY framework for HCD

This patch adds the support to PHY framework in HCD code while keeping
the USB PHY compatibility. Changes are done in both the HCD common code
and in the drivers accessing its PHY. This is done in two steps:
renaming 'phy' into 'usb_phy' and adding a new 'phy' member into the
usb_hcd structure.

Signed-off-by: Antoine Ténart <[email protected]>
---
drivers/usb/chipidea/host.c | 2 +-
drivers/usb/core/hcd.c | 61 +++++++++++++++++++++++++++++++------------
drivers/usb/core/hub.c | 8 +++---
drivers/usb/host/ehci-fsl.c | 16 ++++++------
drivers/usb/host/ehci-hub.c | 2 +-
drivers/usb/host/ehci-msm.c | 4 +--
drivers/usb/host/ehci-tegra.c | 16 ++++++------
drivers/usb/host/ohci-omap.c | 20 +++++++-------
include/linux/usb/hcd.h | 5 +++-
9 files changed, 82 insertions(+), 52 deletions(-)

diff --git a/drivers/usb/chipidea/host.c b/drivers/usb/chipidea/host.c
index a93d950e9468..fc7541c906a2 100644
--- a/drivers/usb/chipidea/host.c
+++ b/drivers/usb/chipidea/host.c
@@ -59,7 +59,7 @@ static int host_start(struct ci_hdrc *ci)
hcd->has_tt = 1;

hcd->power_budget = ci->platdata->power_budget;
- hcd->phy = ci->transceiver;
+ hcd->usb_phy = ci->transceiver;

ehci = hcd_to_ehci(hcd);
ehci->caps = ci->hw_bank.cap;
diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
index bec31e2efb88..b985af5b167c 100644
--- a/drivers/usb/core/hcd.c
+++ b/drivers/usb/core/hcd.c
@@ -42,6 +42,7 @@
#include <linux/pm_runtime.h>
#include <linux/types.h>

+#include <linux/phy/phy.h>
#include <linux/usb.h>
#include <linux/usb/hcd.h>
#include <linux/usb/phy.h>
@@ -2631,21 +2632,35 @@ int usb_add_hcd(struct usb_hcd *hcd,
int retval;
struct usb_device *rhdev;

- if (IS_ENABLED(CONFIG_USB_PHY) && !hcd->phy) {
- struct usb_phy *phy = usb_get_phy_dev(hcd->self.controller, 0);
+ if (IS_ENABLED(CONFIG_USB_PHY) && !hcd->phy && !hcd->usb_phy) {
+ struct phy *phy = of_phy_get(hcd->self.controller->of_node, 0);

- if (IS_ERR(phy)) {
- retval = PTR_ERR(phy);
- if (retval == -EPROBE_DEFER)
- return retval;
- } else {
- retval = usb_phy_init(phy);
+ if (!IS_ERR(phy)) {
+ retval = phy_init(hcd->phy);
if (retval) {
- usb_put_phy(phy);
+ phy_exit(hcd->phy);
return retval;
}
+ retval = phy_power_on(hcd->phy);
hcd->phy = phy;
hcd->remove_phy = 1;
+ } else {
+ struct usb_phy *phy =
+ usb_get_phy_dev(hcd->self.controller, 0);
+
+ if (IS_ERR(phy)) {
+ retval = PTR_ERR(phy);
+ if (retval == -EPROBE_DEFER)
+ return retval;
+ } else {
+ retval = usb_phy_init(phy);
+ if (retval) {
+ usb_put_phy(phy);
+ return retval;
+ }
+ hcd->usb_phy = phy;
+ hcd->remove_phy = 1;
+ }
}
}

@@ -2792,10 +2807,16 @@ err_allocate_root_hub:
err_register_bus:
hcd_buffer_destroy(hcd);
err_remove_phy:
- if (hcd->remove_phy && hcd->phy) {
- usb_phy_shutdown(hcd->phy);
- usb_put_phy(hcd->phy);
- hcd->phy = NULL;
+ if (hcd->remove_phy) {
+ if (hcd->phy) {
+ phy_power_off(hcd->phy);
+ phy_exit(hcd->phy);
+ hcd->phy = NULL;
+ } else if (hcd->usb_phy) {
+ usb_phy_shutdown(hcd->usb_phy);
+ usb_put_phy(hcd->usb_phy);
+ hcd->usb_phy = NULL;
+ }
}
return retval;
}
@@ -2868,10 +2889,16 @@ void usb_remove_hcd(struct usb_hcd *hcd)

usb_deregister_bus(&hcd->self);
hcd_buffer_destroy(hcd);
- if (hcd->remove_phy && hcd->phy) {
- usb_phy_shutdown(hcd->phy);
- usb_put_phy(hcd->phy);
- hcd->phy = NULL;
+ if (hcd->remove_phy) {
+ if (hcd->phy) {
+ phy_power_off(hcd->phy);
+ phy_exit(hcd->phy);
+ hcd->phy = NULL;
+ } else if (hcd->usb_phy) {
+ usb_phy_shutdown(hcd->usb_phy);
+ usb_put_phy(hcd->usb_phy);
+ hcd->usb_phy = NULL;
+ }
}

usb_put_invalidate_rhdev(hcd);
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index 21b99b4b4082..cf49c03b74a9 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -4379,8 +4379,8 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1,
if (retval)
goto fail;

- if (hcd->phy && !hdev->parent)
- usb_phy_notify_connect(hcd->phy, udev->speed);
+ if (hcd->usb_phy && !hdev->parent)
+ usb_phy_notify_connect(hcd->usb_phy, udev->speed);

/*
* Some superspeed devices have finished the link training process
@@ -4534,9 +4534,9 @@ static void hub_port_connect(struct usb_hub *hub, int port1, u16 portstatus,

/* Disconnect any existing devices under this port */
if (udev) {
- if (hcd->phy && !hdev->parent &&
+ if (hcd->usb_phy && !hdev->parent &&
!(portstatus & USB_PORT_STAT_CONNECTION))
- usb_phy_notify_disconnect(hcd->phy, udev->speed);
+ usb_phy_notify_disconnect(hcd->usb_phy, udev->speed);
usb_disconnect(&port_dev->child);
}

diff --git a/drivers/usb/host/ehci-fsl.c b/drivers/usb/host/ehci-fsl.c
index cf2734b532a7..4bdcd3439d47 100644
--- a/drivers/usb/host/ehci-fsl.c
+++ b/drivers/usb/host/ehci-fsl.c
@@ -136,15 +136,15 @@ static int usb_hcd_fsl_probe(const struct hc_driver *driver,
if (pdata->operating_mode == FSL_USB2_DR_OTG) {
struct ehci_hcd *ehci = hcd_to_ehci(hcd);

- hcd->phy = usb_get_phy(USB_PHY_TYPE_USB2);
+ hcd->usb_phy = usb_get_phy(USB_PHY_TYPE_USB2);
dev_dbg(&pdev->dev, "hcd=0x%p ehci=0x%p, phy=0x%p\n",
- hcd, ehci, hcd->phy);
+ hcd, ehci, hcd->usb_phy);

- if (!IS_ERR_OR_NULL(hcd->phy)) {
- retval = otg_set_host(hcd->phy->otg,
+ if (!IS_ERR_OR_NULL(hcd->usb_phy)) {
+ retval = otg_set_host(hcd->usb_phy->otg,
&ehci_to_hcd(ehci)->self);
if (retval) {
- usb_put_phy(hcd->phy);
+ usb_put_phy(hcd->usb_phy);
goto err2;
}
} else {
@@ -181,9 +181,9 @@ static void usb_hcd_fsl_remove(struct usb_hcd *hcd,
{
struct fsl_usb2_platform_data *pdata = dev_get_platdata(&pdev->dev);

- if (!IS_ERR_OR_NULL(hcd->phy)) {
- otg_set_host(hcd->phy->otg, NULL);
- usb_put_phy(hcd->phy);
+ if (!IS_ERR_OR_NULL(hcd->usb_phy)) {
+ otg_set_host(hcd->usb_phy->otg, NULL);
+ usb_put_phy(hcd->usb_phy);
}

usb_remove_hcd(hcd);
diff --git a/drivers/usb/host/ehci-hub.c b/drivers/usb/host/ehci-hub.c
index cc305c71ac3d..619d2e051e8c 100644
--- a/drivers/usb/host/ehci-hub.c
+++ b/drivers/usb/host/ehci-hub.c
@@ -922,7 +922,7 @@ int ehci_hub_control(
#ifdef CONFIG_USB_OTG
if ((hcd->self.otg_port == (wIndex + 1))
&& hcd->self.b_hnp_enable) {
- otg_start_hnp(hcd->phy->otg);
+ otg_start_hnp(hcd->usb_phy->otg);
break;
}
#endif
diff --git a/drivers/usb/host/ehci-msm.c b/drivers/usb/host/ehci-msm.c
index 982c09bebe0f..df474aa2acb6 100644
--- a/drivers/usb/host/ehci-msm.c
+++ b/drivers/usb/host/ehci-msm.c
@@ -124,7 +124,7 @@ static int ehci_msm_probe(struct platform_device *pdev)
goto put_hcd;
}

- hcd->phy = phy;
+ hcd->usb_phy = phy;
device_init_wakeup(&pdev->dev, 1);
/*
* OTG device parent of HCD takes care of putting
@@ -151,7 +151,7 @@ static int ehci_msm_remove(struct platform_device *pdev)
pm_runtime_disable(&pdev->dev);
pm_runtime_set_suspended(&pdev->dev);

- otg_set_host(hcd->phy->otg, NULL);
+ otg_set_host(hcd->usb_phy->otg, NULL);

/* FIXME: need to call usb_remove_hcd() here? */

diff --git a/drivers/usb/host/ehci-tegra.c b/drivers/usb/host/ehci-tegra.c
index 6fdcb8ad2296..a134eac561c2 100644
--- a/drivers/usb/host/ehci-tegra.c
+++ b/drivers/usb/host/ehci-tegra.c
@@ -150,7 +150,7 @@ static int tegra_ehci_hub_control(
if (tegra->port_resuming && !(temp & PORT_SUSPEND)) {
/* Resume completed, re-enable disconnect detection */
tegra->port_resuming = 0;
- tegra_usb_phy_postresume(hcd->phy);
+ tegra_usb_phy_postresume(hcd->usb_phy);
}
}

@@ -203,7 +203,7 @@ static int tegra_ehci_hub_control(
goto done;

/* Disable disconnect detection during port resume */
- tegra_usb_phy_preresume(hcd->phy);
+ tegra_usb_phy_preresume(hcd->usb_phy);

ehci->reset_done[wIndex-1] = jiffies + msecs_to_jiffies(25);

@@ -398,7 +398,7 @@ static int tegra_ehci_probe(struct platform_device *pdev)
err = PTR_ERR(u_phy);
goto cleanup_clk_en;
}
- hcd->phy = u_phy;
+ hcd->usb_phy = u_phy;

tegra->needs_double_reset = of_property_read_bool(pdev->dev.of_node,
"nvidia,needs-double-reset");
@@ -419,7 +419,7 @@ static int tegra_ehci_probe(struct platform_device *pdev)
ehci->caps = hcd->regs + 0x100;
ehci->has_hostpc = soc_config->has_hostpc;

- err = usb_phy_init(hcd->phy);
+ err = usb_phy_init(hcd->usb_phy);
if (err) {
dev_err(&pdev->dev, "Failed to initialize phy\n");
goto cleanup_clk_en;
@@ -434,7 +434,7 @@ static int tegra_ehci_probe(struct platform_device *pdev)
}
u_phy->otg->host = hcd_to_bus(hcd);

- err = usb_phy_set_suspend(hcd->phy, 0);
+ err = usb_phy_set_suspend(hcd->usb_phy, 0);
if (err) {
dev_err(&pdev->dev, "Failed to power on the phy\n");
goto cleanup_phy;
@@ -461,7 +461,7 @@ static int tegra_ehci_probe(struct platform_device *pdev)
cleanup_otg_set_host:
otg_set_host(u_phy->otg, NULL);
cleanup_phy:
- usb_phy_shutdown(hcd->phy);
+ usb_phy_shutdown(hcd->usb_phy);
cleanup_clk_en:
clk_disable_unprepare(tegra->clk);
cleanup_hcd_create:
@@ -475,9 +475,9 @@ static int tegra_ehci_remove(struct platform_device *pdev)
struct tegra_ehci_hcd *tegra =
(struct tegra_ehci_hcd *)hcd_to_ehci(hcd)->priv;

- otg_set_host(hcd->phy->otg, NULL);
+ otg_set_host(hcd->usb_phy->otg, NULL);

- usb_phy_shutdown(hcd->phy);
+ usb_phy_shutdown(hcd->usb_phy);
usb_remove_hcd(hcd);
usb_put_hcd(hcd);

diff --git a/drivers/usb/host/ohci-omap.c b/drivers/usb/host/ohci-omap.c
index 61967405b56d..4629dd7db728 100644
--- a/drivers/usb/host/ohci-omap.c
+++ b/drivers/usb/host/ohci-omap.c
@@ -180,10 +180,10 @@ static void start_hnp(struct ohci_hcd *ohci)
unsigned long flags;
u32 l;

- otg_start_hnp(hcd->phy->otg);
+ otg_start_hnp(hcd->usb_phy->otg);

local_irq_save(flags);
- hcd->phy->otg.state = OTG_STATE_A_SUSPEND;
+ hcd->usb_phy->otg.state = OTG_STATE_A_SUSPEND;
writel (RH_PS_PSS, &ohci->regs->roothub.portstatus [port]);
l = omap_readl(OTG_CTRL);
l &= ~OTG_A_BUSREQ;
@@ -220,14 +220,14 @@ static int ohci_omap_reset(struct usb_hcd *hcd)

#ifdef CONFIG_USB_OTG
if (need_transceiver) {
- hcd->phy = usb_get_phy(USB_PHY_TYPE_USB2);
- if (!IS_ERR_OR_NULL(hcd->phy)) {
- int status = otg_set_host(hcd->phy->otg,
+ hcd->usb_phy = usb_get_phy(USB_PHY_TYPE_USB2);
+ if (!IS_ERR_OR_NULL(hcd->usb_phy)) {
+ int status = otg_set_host(hcd->usb_phy->otg,
&ohci_to_hcd(ohci)->self);
dev_dbg(hcd->self.controller, "init %s phy, status %d\n",
- hcd->phy->label, status);
+ hcd->usb_phy->label, status);
if (status) {
- usb_put_phy(hcd->phy);
+ usb_put_phy(hcd->usb_phy);
return status;
}
} else {
@@ -399,9 +399,9 @@ usb_hcd_omap_remove (struct usb_hcd *hcd, struct platform_device *pdev)
dev_dbg(hcd->self.controller, "stopping USB Controller\n");
usb_remove_hcd(hcd);
omap_ohci_clock_power(0);
- if (!IS_ERR_OR_NULL(hcd->phy)) {
- (void) otg_set_host(hcd->phy->otg, 0);
- usb_put_phy(hcd->phy);
+ if (!IS_ERR_OR_NULL(hcd->usb_phy)) {
+ (void) otg_set_host(hcd->usb_phy->otg, 0);
+ usb_put_phy(hcd->usb_phy);
}
if (machine_is_omap_osk())
gpio_free(9);
diff --git a/include/linux/usb/hcd.h b/include/linux/usb/hcd.h
index 485cd5e2100c..99aaa8644074 100644
--- a/include/linux/usb/hcd.h
+++ b/include/linux/usb/hcd.h
@@ -105,8 +105,11 @@ struct usb_hcd {
/*
* OTG and some Host controllers need software interaction with phys;
* other external phys should be software-transparent
+ *
+ * Keep the usb_phy for compatibility reasons, for now
*/
- struct usb_phy *phy;
+ struct phy *phy;
+ struct usb_phy *usb_phy;

/* Flags that need to be manipulated atomically because they can
* change while the host controller is running. Always use
--
1.9.1

2014-07-09 10:19:57

by Antoine Tenart

[permalink] [raw]
Subject: [PATCH 1/4] usb: move the OTG state from the USB PHY to the OTG structure

Before using the PHY framework instead of the USB PHY one, we need to
move the OTG state into another place, since it won't be available when
USB PHY isn't used. This patch moves the OTG state into the OTG
structure, and makes all the needed modifications in the drivers
using the OTG state.

Signed-off-by: Antoine Ténart <[email protected]>
---
drivers/phy/phy-omap-usb2.c | 8 +---
drivers/usb/chipidea/debug.c | 3 +-
drivers/usb/chipidea/otg_fsm.c | 12 ++---
drivers/usb/common/usb-otg-fsm.c | 8 ++--
drivers/usb/host/ohci-omap.c | 2 +-
drivers/usb/musb/am35x.c | 28 +++++------
drivers/usb/musb/blackfin.c | 18 +++----
drivers/usb/musb/da8xx.c | 28 +++++------
drivers/usb/musb/davinci.c | 18 +++----
drivers/usb/musb/musb_core.c | 94 ++++++++++++++++++-------------------
drivers/usb/musb/musb_dsps.c | 26 +++++-----
drivers/usb/musb/musb_gadget.c | 36 +++++++-------
drivers/usb/musb/musb_host.c | 8 ++--
drivers/usb/musb/musb_virthub.c | 22 ++++-----
drivers/usb/musb/omap2430.c | 30 ++++++------
drivers/usb/musb/tusb6010.c | 40 ++++++++--------
drivers/usb/musb/ux500.c | 10 ++--
drivers/usb/phy/phy-ab8500-usb.c | 10 ++--
drivers/usb/phy/phy-fsl-usb.c | 10 ++--
drivers/usb/phy/phy-generic.c | 4 +-
drivers/usb/phy/phy-gpio-vbus-usb.c | 10 ++--
drivers/usb/phy/phy-msm-usb.c | 34 +++++++-------
drivers/usb/phy/phy-mv-usb.c | 46 +++++++++---------
include/linux/usb/otg.h | 2 +
include/linux/usb/phy.h | 1 -
25 files changed, 252 insertions(+), 256 deletions(-)

diff --git a/drivers/phy/phy-omap-usb2.c b/drivers/phy/phy-omap-usb2.c
index 7007c11fe07d..1f444f91ed7d 100644
--- a/drivers/phy/phy-omap-usb2.c
+++ b/drivers/phy/phy-omap-usb2.c
@@ -80,11 +80,9 @@ static int omap_usb_start_srp(struct usb_otg *otg)

static int omap_usb_set_host(struct usb_otg *otg, struct usb_bus *host)
{
- struct usb_phy *phy = otg->phy;
-
otg->host = host;
if (!host)
- phy->state = OTG_STATE_UNDEFINED;
+ otg->state = OTG_STATE_UNDEFINED;

return 0;
}
@@ -92,11 +90,9 @@ static int omap_usb_set_host(struct usb_otg *otg, struct usb_bus *host)
static int omap_usb_set_peripheral(struct usb_otg *otg,
struct usb_gadget *gadget)
{
- struct usb_phy *phy = otg->phy;
-
otg->gadget = gadget;
if (!gadget)
- phy->state = OTG_STATE_UNDEFINED;
+ otg->state = OTG_STATE_UNDEFINED;

return 0;
}
diff --git a/drivers/usb/chipidea/debug.c b/drivers/usb/chipidea/debug.c
index 7cccab6ff308..9a9702773e43 100644
--- a/drivers/usb/chipidea/debug.c
+++ b/drivers/usb/chipidea/debug.c
@@ -219,8 +219,7 @@ int ci_otg_show(struct seq_file *s, void *unused)
fsm = &ci->fsm;

/* ------ State ----- */
- seq_printf(s, "OTG state: %s\n\n",
- usb_otg_state_string(ci->transceiver->state));
+ usb_otg_state_string(ci->transceiver->otg.state));

/* ------ State Machine Variables ----- */
seq_printf(s, "a_bus_drop: %d\n", fsm->a_bus_drop);
diff --git a/drivers/usb/chipidea/otg_fsm.c b/drivers/usb/chipidea/otg_fsm.c
index caaabc58021e..8cb2508a6b71 100644
--- a/drivers/usb/chipidea/otg_fsm.c
+++ b/drivers/usb/chipidea/otg_fsm.c
@@ -328,7 +328,7 @@ static void b_ssend_srp_tmout_func(void *ptr, unsigned long indicator)
set_tmout(ci, indicator);

/* only vbus fall below B_sess_vld in b_idle state */
- if (ci->transceiver->state == OTG_STATE_B_IDLE)
+ if (ci->fsm.otg->state == OTG_STATE_B_IDLE)
ci_otg_queue_work(ci);
}

@@ -582,11 +582,11 @@ int ci_otg_fsm_work(struct ci_hdrc *ci)
* when there is no gadget class driver
*/
if (ci->fsm.id && !(ci->driver) &&
- ci->transceiver->state < OTG_STATE_A_IDLE)
+ ci->fsm.otg->state < OTG_STATE_A_IDLE)
return 0;

if (otg_statemachine(&ci->fsm)) {
- if (ci->transceiver->state == OTG_STATE_A_IDLE) {
+ if (ci->fsm.otg->state == OTG_STATE_A_IDLE) {
/*
* Further state change for cases:
* a_idle to b_idle; or
@@ -600,7 +600,7 @@ int ci_otg_fsm_work(struct ci_hdrc *ci)
ci_otg_queue_work(ci);
if (ci->id_event)
ci->id_event = false;
- } else if (ci->transceiver->state == OTG_STATE_B_IDLE) {
+ } else if (ci->fsm.otg->state == OTG_STATE_B_IDLE) {
if (ci->fsm.b_sess_vld) {
ci->fsm.power_up = 0;
/*
@@ -627,7 +627,7 @@ static void ci_otg_fsm_event(struct ci_hdrc *ci)
otg_bsess_vld = hw_read_otgsc(ci, OTGSC_BSV);
port_conn = hw_read(ci, OP_PORTSC, PORTSC_CCS);

- switch (ci->transceiver->state) {
+ switch (ci->fsm.otg->state) {
case OTG_STATE_A_WAIT_BCON:
if (port_conn) {
fsm->b_conn = 1;
@@ -794,7 +794,7 @@ int ci_hdrc_otg_fsm_init(struct ci_hdrc *ci)
ci->transceiver->otg = ci->fsm.otg;
ci->fsm.power_up = 1;
ci->fsm.id = hw_read_otgsc(ci, OTGSC_ID) ? 1 : 0;
- ci->transceiver->state = OTG_STATE_UNDEFINED;
+ ci->fsm.otg->state = OTG_STATE_UNDEFINED;
ci->fsm.ops = &ci_otg_ops;

mutex_init(&ci->fsm.lock);
diff --git a/drivers/usb/common/usb-otg-fsm.c b/drivers/usb/common/usb-otg-fsm.c
index 98e8340a5bb1..c6b35b77dab7 100644
--- a/drivers/usb/common/usb-otg-fsm.c
+++ b/drivers/usb/common/usb-otg-fsm.c
@@ -124,10 +124,10 @@ static void otg_leave_state(struct otg_fsm *fsm, enum usb_otg_state old_state)
static int otg_set_state(struct otg_fsm *fsm, enum usb_otg_state new_state)
{
state_changed = 1;
- if (fsm->otg->phy->state == new_state)
+ if (fsm->otg->state == new_state)
return 0;
VDBG("Set state: %s\n", usb_otg_state_string(new_state));
- otg_leave_state(fsm, fsm->otg->phy->state);
+ otg_leave_state(fsm, fsm->otg->state);
switch (new_state) {
case OTG_STATE_B_IDLE:
otg_drv_vbus(fsm, 0);
@@ -236,7 +236,7 @@ static int otg_set_state(struct otg_fsm *fsm, enum usb_otg_state new_state)
break;
}

- fsm->otg->phy->state = new_state;
+ fsm->otg->state = new_state;
return 0;
}

@@ -247,7 +247,7 @@ int otg_statemachine(struct otg_fsm *fsm)

mutex_lock(&fsm->lock);

- state = fsm->otg->phy->state;
+ state = fsm->otg->state;
state_changed = 0;
/* State machine state change judgement */

diff --git a/drivers/usb/host/ohci-omap.c b/drivers/usb/host/ohci-omap.c
index c923cafcaca7..61967405b56d 100644
--- a/drivers/usb/host/ohci-omap.c
+++ b/drivers/usb/host/ohci-omap.c
@@ -183,7 +183,7 @@ static void start_hnp(struct ohci_hcd *ohci)
otg_start_hnp(hcd->phy->otg);

local_irq_save(flags);
- hcd->phy->state = OTG_STATE_A_SUSPEND;
+ hcd->phy->otg.state = OTG_STATE_A_SUSPEND;
writel (RH_PS_PSS, &ohci->regs->roothub.portstatus [port]);
l = omap_readl(OTG_CTRL);
l &= ~OTG_A_BUSREQ;
diff --git a/drivers/usb/musb/am35x.c b/drivers/usb/musb/am35x.c
index 0a34dd859555..aef4a46399ce 100644
--- a/drivers/usb/musb/am35x.c
+++ b/drivers/usb/musb/am35x.c
@@ -148,25 +148,25 @@ static void otg_timer(unsigned long _musb)
*/
devctl = musb_readb(mregs, MUSB_DEVCTL);
dev_dbg(musb->controller, "Poll devctl %02x (%s)\n", devctl,
- usb_otg_state_string(musb->xceiv->state));
+ usb_otg_state_string(musb->xceiv->otg->state));

spin_lock_irqsave(&musb->lock, flags);
- switch (musb->xceiv->state) {
+ switch (musb->xceiv->otg->state) {
case OTG_STATE_A_WAIT_BCON:
devctl &= ~MUSB_DEVCTL_SESSION;
musb_writeb(musb->mregs, MUSB_DEVCTL, devctl);

devctl = musb_readb(musb->mregs, MUSB_DEVCTL);
if (devctl & MUSB_DEVCTL_BDEVICE) {
- musb->xceiv->state = OTG_STATE_B_IDLE;
+ musb->xceiv->otg->state = OTG_STATE_B_IDLE;
MUSB_DEV_MODE(musb);
} else {
- musb->xceiv->state = OTG_STATE_A_IDLE;
+ musb->xceiv->otg->state = OTG_STATE_A_IDLE;
MUSB_HST_MODE(musb);
}
break;
case OTG_STATE_A_WAIT_VFALL:
- musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
+ musb->xceiv->otg->state = OTG_STATE_A_WAIT_VRISE;
musb_writel(musb->ctrl_base, CORE_INTR_SRC_SET_REG,
MUSB_INTR_VBUSERROR << AM35X_INTR_USB_SHIFT);
break;
@@ -175,7 +175,7 @@ static void otg_timer(unsigned long _musb)
if (devctl & MUSB_DEVCTL_BDEVICE)
mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
else
- musb->xceiv->state = OTG_STATE_A_IDLE;
+ musb->xceiv->otg->state = OTG_STATE_A_IDLE;
break;
default:
break;
@@ -192,9 +192,9 @@ static void am35x_musb_try_idle(struct musb *musb, unsigned long timeout)

/* Never idle if active, or when VBUS timeout is not set as host */
if (musb->is_active || (musb->a_wait_bcon == 0 &&
- musb->xceiv->state == OTG_STATE_A_WAIT_BCON)) {
+ musb->xceiv->otg->state == OTG_STATE_A_WAIT_BCON)) {
dev_dbg(musb->controller, "%s active, deleting timer\n",
- usb_otg_state_string(musb->xceiv->state));
+ usb_otg_state_string(musb->xceiv->otg->state));
del_timer(&otg_workaround);
last_timer = jiffies;
return;
@@ -207,7 +207,7 @@ static void am35x_musb_try_idle(struct musb *musb, unsigned long timeout)
last_timer = timeout;

dev_dbg(musb->controller, "%s inactive, starting idle timer for %u ms\n",
- usb_otg_state_string(musb->xceiv->state),
+ usb_otg_state_string(musb->xceiv->otg->state),
jiffies_to_msecs(timeout - jiffies));
mod_timer(&otg_workaround, timeout);
}
@@ -277,27 +277,27 @@ static irqreturn_t am35x_musb_interrupt(int irq, void *hci)
* devctl.
*/
musb->int_usb &= ~MUSB_INTR_VBUSERROR;
- musb->xceiv->state = OTG_STATE_A_WAIT_VFALL;
+ musb->xceiv->otg->state = OTG_STATE_A_WAIT_VFALL;
mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
WARNING("VBUS error workaround (delay coming)\n");
} else if (drvvbus) {
MUSB_HST_MODE(musb);
otg->default_a = 1;
- musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
+ musb->xceiv->otg->state = OTG_STATE_A_WAIT_VRISE;
portstate(musb->port1_status |= USB_PORT_STAT_POWER);
del_timer(&otg_workaround);
} else {
musb->is_active = 0;
MUSB_DEV_MODE(musb);
otg->default_a = 0;
- musb->xceiv->state = OTG_STATE_B_IDLE;
+ musb->xceiv->otg->state = OTG_STATE_B_IDLE;
portstate(musb->port1_status &= ~USB_PORT_STAT_POWER);
}

/* NOTE: this must complete power-on within 100 ms. */
dev_dbg(musb->controller, "VBUS %s (%s)%s, devctl %02x\n",
drvvbus ? "on" : "off",
- usb_otg_state_string(musb->xceiv->state),
+ usb_otg_state_string(musb->xceiv->otg->state),
err ? " ERROR" : "",
devctl);
ret = IRQ_HANDLED;
@@ -323,7 +323,7 @@ eoi:
}

/* Poll for ID change */
- if (musb->xceiv->state == OTG_STATE_B_IDLE)
+ if (musb->xceiv->otg->state == OTG_STATE_B_IDLE)
mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);

spin_unlock_irqrestore(&musb->lock, flags);
diff --git a/drivers/usb/musb/blackfin.c b/drivers/usb/musb/blackfin.c
index d40d5f0b5528..a241a14e255f 100644
--- a/drivers/usb/musb/blackfin.c
+++ b/drivers/usb/musb/blackfin.c
@@ -185,8 +185,8 @@ static irqreturn_t blackfin_interrupt(int irq, void *__hci)
}

/* Start sampling ID pin, when plug is removed from MUSB */
- if ((musb->xceiv->state == OTG_STATE_B_IDLE
- || musb->xceiv->state == OTG_STATE_A_WAIT_BCON) ||
+ if ((musb->xceiv->otg->state == OTG_STATE_B_IDLE
+ || musb->xceiv->otg->state == OTG_STATE_A_WAIT_BCON) ||
(musb->int_usb & MUSB_INTR_DISCONNECT && is_host_active(musb))) {
mod_timer(&musb_conn_timer, jiffies + TIMER_DELAY);
musb->a_wait_bcon = TIMER_DELAY;
@@ -205,7 +205,7 @@ static void musb_conn_timer_handler(unsigned long _musb)
static u8 toggle;

spin_lock_irqsave(&musb->lock, flags);
- switch (musb->xceiv->state) {
+ switch (musb->xceiv->otg->state) {
case OTG_STATE_A_IDLE:
case OTG_STATE_A_WAIT_BCON:
/* Start a new session */
@@ -219,7 +219,7 @@ static void musb_conn_timer_handler(unsigned long _musb)

if (!(val & MUSB_DEVCTL_BDEVICE)) {
gpio_set_value(musb->config->gpio_vrsel, 1);
- musb->xceiv->state = OTG_STATE_A_WAIT_BCON;
+ musb->xceiv->otg->state = OTG_STATE_A_WAIT_BCON;
} else {
gpio_set_value(musb->config->gpio_vrsel, 0);
/* Ignore VBUSERROR and SUSPEND IRQ */
@@ -229,7 +229,7 @@ static void musb_conn_timer_handler(unsigned long _musb)

val = MUSB_INTR_SUSPEND | MUSB_INTR_VBUSERROR;
musb_writeb(musb->mregs, MUSB_INTRUSB, val);
- musb->xceiv->state = OTG_STATE_B_IDLE;
+ musb->xceiv->otg->state = OTG_STATE_B_IDLE;
}
mod_timer(&musb_conn_timer, jiffies + TIMER_DELAY);
break;
@@ -245,7 +245,7 @@ static void musb_conn_timer_handler(unsigned long _musb)

if (!(val & MUSB_DEVCTL_BDEVICE)) {
gpio_set_value(musb->config->gpio_vrsel, 1);
- musb->xceiv->state = OTG_STATE_A_WAIT_BCON;
+ musb->xceiv->otg->state = OTG_STATE_A_WAIT_BCON;
} else {
gpio_set_value(musb->config->gpio_vrsel, 0);

@@ -280,13 +280,13 @@ static void musb_conn_timer_handler(unsigned long _musb)
break;
default:
dev_dbg(musb->controller, "%s state not handled\n",
- usb_otg_state_string(musb->xceiv->state));
+ usb_otg_state_string(musb->xceiv->otg->state));
break;
}
spin_unlock_irqrestore(&musb->lock, flags);

dev_dbg(musb->controller, "state is %s\n",
- usb_otg_state_string(musb->xceiv->state));
+ usb_otg_state_string(musb->xceiv->otg->state));
}

static void bfin_musb_enable(struct musb *musb)
@@ -307,7 +307,7 @@ static void bfin_musb_set_vbus(struct musb *musb, int is_on)

dev_dbg(musb->controller, "VBUS %s, devctl %02x "
/* otg %3x conf %08x prcm %08x */ "\n",
- usb_otg_state_string(musb->xceiv->state),
+ usb_otg_state_string(musb->xceiv->otg->state),
musb_readb(musb->mregs, MUSB_DEVCTL));
}

diff --git a/drivers/usb/musb/da8xx.c b/drivers/usb/musb/da8xx.c
index 058775e647ad..527c7fe60ece 100644
--- a/drivers/usb/musb/da8xx.c
+++ b/drivers/usb/musb/da8xx.c
@@ -198,20 +198,20 @@ static void otg_timer(unsigned long _musb)
*/
devctl = musb_readb(mregs, MUSB_DEVCTL);
dev_dbg(musb->controller, "Poll devctl %02x (%s)\n", devctl,
- usb_otg_state_string(musb->xceiv->state));
+ usb_otg_state_string(musb->xceiv->otg->state));

spin_lock_irqsave(&musb->lock, flags);
- switch (musb->xceiv->state) {
+ switch (musb->xceiv->otg->state) {
case OTG_STATE_A_WAIT_BCON:
devctl &= ~MUSB_DEVCTL_SESSION;
musb_writeb(musb->mregs, MUSB_DEVCTL, devctl);

devctl = musb_readb(musb->mregs, MUSB_DEVCTL);
if (devctl & MUSB_DEVCTL_BDEVICE) {
- musb->xceiv->state = OTG_STATE_B_IDLE;
+ musb->xceiv->otg->state = OTG_STATE_B_IDLE;
MUSB_DEV_MODE(musb);
} else {
- musb->xceiv->state = OTG_STATE_A_IDLE;
+ musb->xceiv->otg->state = OTG_STATE_A_IDLE;
MUSB_HST_MODE(musb);
}
break;
@@ -226,7 +226,7 @@ static void otg_timer(unsigned long _musb)
mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
break;
}
- musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
+ musb->xceiv->otg->state = OTG_STATE_A_WAIT_VRISE;
musb_writel(musb->ctrl_base, DA8XX_USB_INTR_SRC_SET_REG,
MUSB_INTR_VBUSERROR << DA8XX_INTR_USB_SHIFT);
break;
@@ -248,7 +248,7 @@ static void otg_timer(unsigned long _musb)
if (devctl & MUSB_DEVCTL_BDEVICE)
mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
else
- musb->xceiv->state = OTG_STATE_A_IDLE;
+ musb->xceiv->otg->state = OTG_STATE_A_IDLE;
break;
default:
break;
@@ -265,9 +265,9 @@ static void da8xx_musb_try_idle(struct musb *musb, unsigned long timeout)

/* Never idle if active, or when VBUS timeout is not set as host */
if (musb->is_active || (musb->a_wait_bcon == 0 &&
- musb->xceiv->state == OTG_STATE_A_WAIT_BCON)) {
+ musb->xceiv->otg->state == OTG_STATE_A_WAIT_BCON)) {
dev_dbg(musb->controller, "%s active, deleting timer\n",
- usb_otg_state_string(musb->xceiv->state));
+ usb_otg_state_string(musb->xceiv->otg->state));
del_timer(&otg_workaround);
last_timer = jiffies;
return;
@@ -280,7 +280,7 @@ static void da8xx_musb_try_idle(struct musb *musb, unsigned long timeout)
last_timer = timeout;

dev_dbg(musb->controller, "%s inactive, starting idle timer for %u ms\n",
- usb_otg_state_string(musb->xceiv->state),
+ usb_otg_state_string(musb->xceiv->otg->state),
jiffies_to_msecs(timeout - jiffies));
mod_timer(&otg_workaround, timeout);
}
@@ -341,26 +341,26 @@ static irqreturn_t da8xx_musb_interrupt(int irq, void *hci)
* devctl.
*/
musb->int_usb &= ~MUSB_INTR_VBUSERROR;
- musb->xceiv->state = OTG_STATE_A_WAIT_VFALL;
+ musb->xceiv->otg->state = OTG_STATE_A_WAIT_VFALL;
mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
WARNING("VBUS error workaround (delay coming)\n");
} else if (drvvbus) {
MUSB_HST_MODE(musb);
otg->default_a = 1;
- musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
+ musb->xceiv->otg->state = OTG_STATE_A_WAIT_VRISE;
portstate(musb->port1_status |= USB_PORT_STAT_POWER);
del_timer(&otg_workaround);
} else {
musb->is_active = 0;
MUSB_DEV_MODE(musb);
otg->default_a = 0;
- musb->xceiv->state = OTG_STATE_B_IDLE;
+ musb->xceiv->otg->state = OTG_STATE_B_IDLE;
portstate(musb->port1_status &= ~USB_PORT_STAT_POWER);
}

dev_dbg(musb->controller, "VBUS %s (%s)%s, devctl %02x\n",
drvvbus ? "on" : "off",
- usb_otg_state_string(musb->xceiv->state),
+ usb_otg_state_string(musb->xceiv->otg->state),
err ? " ERROR" : "",
devctl);
ret = IRQ_HANDLED;
@@ -375,7 +375,7 @@ static irqreturn_t da8xx_musb_interrupt(int irq, void *hci)
musb_writel(reg_base, DA8XX_USB_END_OF_INTR_REG, 0);

/* Poll for ID change */
- if (musb->xceiv->state == OTG_STATE_B_IDLE)
+ if (musb->xceiv->otg->state == OTG_STATE_B_IDLE)
mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);

spin_unlock_irqrestore(&musb->lock, flags);
diff --git a/drivers/usb/musb/davinci.c b/drivers/usb/musb/davinci.c
index de8492b06e46..c9b3fdb1bb8b 100644
--- a/drivers/usb/musb/davinci.c
+++ b/drivers/usb/musb/davinci.c
@@ -214,10 +214,10 @@ static void otg_timer(unsigned long _musb)
*/
devctl = musb_readb(mregs, MUSB_DEVCTL);
dev_dbg(musb->controller, "poll devctl %02x (%s)\n", devctl,
- usb_otg_state_string(musb->xceiv->state));
+ usb_otg_state_string(musb->xceiv->otg->state));

spin_lock_irqsave(&musb->lock, flags);
- switch (musb->xceiv->state) {
+ switch (musb->xceiv->otg->state) {
case OTG_STATE_A_WAIT_VFALL:
/* Wait till VBUS falls below SessionEnd (~0.2V); the 1.3 RTL
* seems to mis-handle session "start" otherwise (or in our
@@ -228,7 +228,7 @@ static void otg_timer(unsigned long _musb)
mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
break;
}
- musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
+ musb->xceiv->otg->state = OTG_STATE_A_WAIT_VRISE;
musb_writel(musb->ctrl_base, DAVINCI_USB_INT_SET_REG,
MUSB_INTR_VBUSERROR << DAVINCI_USB_USBINT_SHIFT);
break;
@@ -251,7 +251,7 @@ static void otg_timer(unsigned long _musb)
if (devctl & MUSB_DEVCTL_BDEVICE)
mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
else
- musb->xceiv->state = OTG_STATE_A_IDLE;
+ musb->xceiv->otg->state = OTG_STATE_A_IDLE;
break;
default:
break;
@@ -325,20 +325,20 @@ static irqreturn_t davinci_musb_interrupt(int irq, void *__hci)
* to stop registering in devctl.
*/
musb->int_usb &= ~MUSB_INTR_VBUSERROR;
- musb->xceiv->state = OTG_STATE_A_WAIT_VFALL;
+ musb->xceiv->otg->state = OTG_STATE_A_WAIT_VFALL;
mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
WARNING("VBUS error workaround (delay coming)\n");
} else if (drvvbus) {
MUSB_HST_MODE(musb);
otg->default_a = 1;
- musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
+ musb->xceiv->otg->state = OTG_STATE_A_WAIT_VRISE;
portstate(musb->port1_status |= USB_PORT_STAT_POWER);
del_timer(&otg_workaround);
} else {
musb->is_active = 0;
MUSB_DEV_MODE(musb);
otg->default_a = 0;
- musb->xceiv->state = OTG_STATE_B_IDLE;
+ musb->xceiv->otg->state = OTG_STATE_B_IDLE;
portstate(musb->port1_status &= ~USB_PORT_STAT_POWER);
}

@@ -348,7 +348,7 @@ static irqreturn_t davinci_musb_interrupt(int irq, void *__hci)
davinci_musb_source_power(musb, drvvbus, 0);
dev_dbg(musb->controller, "VBUS %s (%s)%s, devctl %02x\n",
drvvbus ? "on" : "off",
- usb_otg_state_string(musb->xceiv->state),
+ usb_otg_state_string(musb->xceiv->otg->state),
err ? " ERROR" : "",
devctl);
retval = IRQ_HANDLED;
@@ -361,7 +361,7 @@ static irqreturn_t davinci_musb_interrupt(int irq, void *__hci)
musb_writel(tibase, DAVINCI_USB_EOI_REG, 0);

/* poll for ID change */
- if (musb->xceiv->state == OTG_STATE_B_IDLE)
+ if (musb->xceiv->otg->state == OTG_STATE_B_IDLE)
mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);

spin_unlock_irqrestore(&musb->lock, flags);
diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c
index eff3c5cf84f4..b8296ff103a1 100644
--- a/drivers/usb/musb/musb_core.c
+++ b/drivers/usb/musb/musb_core.c
@@ -360,23 +360,23 @@ static void musb_otg_timer_func(unsigned long data)
unsigned long flags;

spin_lock_irqsave(&musb->lock, flags);
- switch (musb->xceiv->state) {
+ switch (musb->xceiv->otg->state) {
case OTG_STATE_B_WAIT_ACON:
dev_dbg(musb->controller, "HNP: b_wait_acon timeout; back to b_peripheral\n");
musb_g_disconnect(musb);
- musb->xceiv->state = OTG_STATE_B_PERIPHERAL;
+ musb->xceiv->otg->state = OTG_STATE_B_PERIPHERAL;
musb->is_active = 0;
break;
case OTG_STATE_A_SUSPEND:
case OTG_STATE_A_WAIT_BCON:
dev_dbg(musb->controller, "HNP: %s timeout\n",
- usb_otg_state_string(musb->xceiv->state));
+ usb_otg_state_string(musb->xceiv->otg->state));
musb_platform_set_vbus(musb, 0);
- musb->xceiv->state = OTG_STATE_A_WAIT_VFALL;
+ musb->xceiv->otg->state = OTG_STATE_A_WAIT_VFALL;
break;
default:
dev_dbg(musb->controller, "HNP: Unhandled mode %s\n",
- usb_otg_state_string(musb->xceiv->state));
+ usb_otg_state_string(musb->xceiv->otg->state));
}
spin_unlock_irqrestore(&musb->lock, flags);
}
@@ -391,19 +391,19 @@ void musb_hnp_stop(struct musb *musb)
u8 reg;

dev_dbg(musb->controller, "HNP: stop from %s\n",
- usb_otg_state_string(musb->xceiv->state));
+ usb_otg_state_string(musb->xceiv->otg->state));

- switch (musb->xceiv->state) {
+ switch (musb->xceiv->otg->state) {
case OTG_STATE_A_PERIPHERAL:
musb_g_disconnect(musb);
dev_dbg(musb->controller, "HNP: back to %s\n",
- usb_otg_state_string(musb->xceiv->state));
+ usb_otg_state_string(musb->xceiv->otg->state));
break;
case OTG_STATE_B_HOST:
dev_dbg(musb->controller, "HNP: Disabling HR\n");
if (hcd)
hcd->self.is_b_host = 0;
- musb->xceiv->state = OTG_STATE_B_PERIPHERAL;
+ musb->xceiv->otg->state = OTG_STATE_B_PERIPHERAL;
MUSB_DEV_MODE(musb);
reg = musb_readb(mbase, MUSB_POWER);
reg |= MUSB_POWER_SUSPENDM;
@@ -412,7 +412,7 @@ void musb_hnp_stop(struct musb *musb)
break;
default:
dev_dbg(musb->controller, "HNP: Stopping in unknown state %s\n",
- usb_otg_state_string(musb->xceiv->state));
+ usb_otg_state_string(musb->xceiv->otg->state));
}

/*
@@ -449,13 +449,13 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,
*/
if (int_usb & MUSB_INTR_RESUME) {
handled = IRQ_HANDLED;
- dev_dbg(musb->controller, "RESUME (%s)\n", usb_otg_state_string(musb->xceiv->state));
+ dev_dbg(musb->controller, "RESUME (%s)\n", usb_otg_state_string(musb->xceiv->otg->state));

if (devctl & MUSB_DEVCTL_HM) {
void __iomem *mbase = musb->mregs;
u8 power;

- switch (musb->xceiv->state) {
+ switch (musb->xceiv->otg->state) {
case OTG_STATE_A_SUSPEND:
/* remote wakeup? later, GetPortStatus
* will stop RESUME signaling
@@ -482,25 +482,25 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,
&musb->finish_resume_work,
msecs_to_jiffies(20));

- musb->xceiv->state = OTG_STATE_A_HOST;
+ musb->xceiv->otg->state = OTG_STATE_A_HOST;
musb->is_active = 1;
musb_host_resume_root_hub(musb);
break;
case OTG_STATE_B_WAIT_ACON:
- musb->xceiv->state = OTG_STATE_B_PERIPHERAL;
+ musb->xceiv->otg->state = OTG_STATE_B_PERIPHERAL;
musb->is_active = 1;
MUSB_DEV_MODE(musb);
break;
default:
WARNING("bogus %s RESUME (%s)\n",
"host",
- usb_otg_state_string(musb->xceiv->state));
+ usb_otg_state_string(musb->xceiv->otg->state));
}
} else {
- switch (musb->xceiv->state) {
+ switch (musb->xceiv->otg->state) {
case OTG_STATE_A_SUSPEND:
/* possibly DISCONNECT is upcoming */
- musb->xceiv->state = OTG_STATE_A_HOST;
+ musb->xceiv->otg->state = OTG_STATE_A_HOST;
musb_host_resume_root_hub(musb);
break;
case OTG_STATE_B_WAIT_ACON:
@@ -523,7 +523,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,
default:
WARNING("bogus %s RESUME (%s)\n",
"peripheral",
- usb_otg_state_string(musb->xceiv->state));
+ usb_otg_state_string(musb->xceiv->otg->state));
}
}
}
@@ -539,7 +539,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,
}

dev_dbg(musb->controller, "SESSION_REQUEST (%s)\n",
- usb_otg_state_string(musb->xceiv->state));
+ usb_otg_state_string(musb->xceiv->otg->state));

/* IRQ arrives from ID pin sense or (later, if VBUS power
* is removed) SRP. responses are time critical:
@@ -550,7 +550,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,
*/
musb_writeb(mbase, MUSB_DEVCTL, MUSB_DEVCTL_SESSION);
musb->ep0_stage = MUSB_EP0_START;
- musb->xceiv->state = OTG_STATE_A_IDLE;
+ musb->xceiv->otg->state = OTG_STATE_A_IDLE;
MUSB_HST_MODE(musb);
musb_platform_set_vbus(musb, 1);

@@ -576,7 +576,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,
* REVISIT: do delays from lots of DEBUG_KERNEL checks
* make trouble here, keeping VBUS < 4.4V ?
*/
- switch (musb->xceiv->state) {
+ switch (musb->xceiv->otg->state) {
case OTG_STATE_A_HOST:
/* recovery is dicey once we've gotten past the
* initial stages of enumeration, but if VBUS
@@ -605,7 +605,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,

dev_printk(ignore ? KERN_DEBUG : KERN_ERR, musb->controller,
"VBUS_ERROR in %s (%02x, %s), retry #%d, port1 %08x\n",
- usb_otg_state_string(musb->xceiv->state),
+ usb_otg_state_string(musb->xceiv->otg->state),
devctl,
({ char *s;
switch (devctl & MUSB_DEVCTL_VBUS) {
@@ -630,10 +630,10 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,

if (int_usb & MUSB_INTR_SUSPEND) {
dev_dbg(musb->controller, "SUSPEND (%s) devctl %02x\n",
- usb_otg_state_string(musb->xceiv->state), devctl);
+ usb_otg_state_string(musb->xceiv->otg->state), devctl);
handled = IRQ_HANDLED;

- switch (musb->xceiv->state) {
+ switch (musb->xceiv->otg->state) {
case OTG_STATE_A_PERIPHERAL:
/* We also come here if the cable is removed, since
* this silicon doesn't report ID-no-longer-grounded.
@@ -657,7 +657,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,
musb_g_suspend(musb);
musb->is_active = musb->g.b_hnp_enable;
if (musb->is_active) {
- musb->xceiv->state = OTG_STATE_B_WAIT_ACON;
+ musb->xceiv->otg->state = OTG_STATE_B_WAIT_ACON;
dev_dbg(musb->controller, "HNP: Setting timer for b_ase0_brst\n");
mod_timer(&musb->otg_timer, jiffies
+ msecs_to_jiffies(
@@ -670,7 +670,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,
+ msecs_to_jiffies(musb->a_wait_bcon));
break;
case OTG_STATE_A_HOST:
- musb->xceiv->state = OTG_STATE_A_SUSPEND;
+ musb->xceiv->otg->state = OTG_STATE_A_SUSPEND;
musb->is_active = musb->hcd->self.b_hnp_enable;
break;
case OTG_STATE_B_HOST:
@@ -713,7 +713,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,
musb->port1_status |= USB_PORT_STAT_LOW_SPEED;

/* indicate new connection to OTG machine */
- switch (musb->xceiv->state) {
+ switch (musb->xceiv->otg->state) {
case OTG_STATE_B_PERIPHERAL:
if (int_usb & MUSB_INTR_SUSPEND) {
dev_dbg(musb->controller, "HNP: SUSPEND+CONNECT, now b_host\n");
@@ -725,7 +725,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,
case OTG_STATE_B_WAIT_ACON:
dev_dbg(musb->controller, "HNP: CONNECT, now b_host\n");
b_host:
- musb->xceiv->state = OTG_STATE_B_HOST;
+ musb->xceiv->otg->state = OTG_STATE_B_HOST;
if (musb->hcd)
musb->hcd->self.is_b_host = 1;
del_timer(&musb->otg_timer);
@@ -733,7 +733,7 @@ b_host:
default:
if ((devctl & MUSB_DEVCTL_VBUS)
== (3 << MUSB_DEVCTL_VBUS_SHIFT)) {
- musb->xceiv->state = OTG_STATE_A_HOST;
+ musb->xceiv->otg->state = OTG_STATE_A_HOST;
if (hcd)
hcd->self.is_b_host = 0;
}
@@ -743,16 +743,16 @@ b_host:
musb_host_poke_root_hub(musb);

dev_dbg(musb->controller, "CONNECT (%s) devctl %02x\n",
- usb_otg_state_string(musb->xceiv->state), devctl);
+ usb_otg_state_string(musb->xceiv->otg->state), devctl);
}

if (int_usb & MUSB_INTR_DISCONNECT) {
dev_dbg(musb->controller, "DISCONNECT (%s) as %s, devctl %02x\n",
- usb_otg_state_string(musb->xceiv->state),
+ usb_otg_state_string(musb->xceiv->otg->state),
MUSB_MODE(musb), devctl);
handled = IRQ_HANDLED;

- switch (musb->xceiv->state) {
+ switch (musb->xceiv->otg->state) {
case OTG_STATE_A_HOST:
case OTG_STATE_A_SUSPEND:
musb_host_resume_root_hub(musb);
@@ -770,7 +770,7 @@ b_host:
musb_root_disconnect(musb);
if (musb->hcd)
musb->hcd->self.is_b_host = 0;
- musb->xceiv->state = OTG_STATE_B_PERIPHERAL;
+ musb->xceiv->otg->state = OTG_STATE_B_PERIPHERAL;
MUSB_DEV_MODE(musb);
musb_g_disconnect(musb);
break;
@@ -786,7 +786,7 @@ b_host:
break;
default:
WARNING("unhandled DISCONNECT transition (%s)\n",
- usb_otg_state_string(musb->xceiv->state));
+ usb_otg_state_string(musb->xceiv->otg->state));
break;
}
}
@@ -812,15 +812,15 @@ b_host:
}
} else {
dev_dbg(musb->controller, "BUS RESET as %s\n",
- usb_otg_state_string(musb->xceiv->state));
- switch (musb->xceiv->state) {
+ usb_otg_state_string(musb->xceiv->otg->state));
+ switch (musb->xceiv->otg->state) {
case OTG_STATE_A_SUSPEND:
musb_g_reset(musb);
/* FALLTHROUGH */
case OTG_STATE_A_WAIT_BCON: /* OPT TD.4.7-900ms */
/* never use invalid T(a_wait_bcon) */
dev_dbg(musb->controller, "HNP: in %s, %d msec timeout\n",
- usb_otg_state_string(musb->xceiv->state),
+ usb_otg_state_string(musb->xceiv->otg->state),
TA_WAIT_BCON(musb));
mod_timer(&musb->otg_timer, jiffies
+ msecs_to_jiffies(TA_WAIT_BCON(musb)));
@@ -831,19 +831,19 @@ b_host:
break;
case OTG_STATE_B_WAIT_ACON:
dev_dbg(musb->controller, "HNP: RESET (%s), to b_peripheral\n",
- usb_otg_state_string(musb->xceiv->state));
- musb->xceiv->state = OTG_STATE_B_PERIPHERAL;
+ usb_otg_state_string(musb->xceiv->otg->state));
+ musb->xceiv->otg->state = OTG_STATE_B_PERIPHERAL;
musb_g_reset(musb);
break;
case OTG_STATE_B_IDLE:
- musb->xceiv->state = OTG_STATE_B_PERIPHERAL;
+ musb->xceiv->otg->state = OTG_STATE_B_PERIPHERAL;
/* FALLTHROUGH */
case OTG_STATE_B_PERIPHERAL:
musb_g_reset(musb);
break;
default:
dev_dbg(musb->controller, "Unhandled BUS RESET as %s\n",
- usb_otg_state_string(musb->xceiv->state));
+ usb_otg_state_string(musb->xceiv->otg->state));
}
}
}
@@ -1631,7 +1631,7 @@ musb_mode_show(struct device *dev, struct device_attribute *attr, char *buf)
int ret = -EINVAL;

spin_lock_irqsave(&musb->lock, flags);
- ret = sprintf(buf, "%s\n", usb_otg_state_string(musb->xceiv->state));
+ ret = sprintf(buf, "%s\n", usb_otg_state_string(musb->xceiv->otg->state));
spin_unlock_irqrestore(&musb->lock, flags);

return ret;
@@ -1676,7 +1676,7 @@ musb_vbus_store(struct device *dev, struct device_attribute *attr,
spin_lock_irqsave(&musb->lock, flags);
/* force T(a_wait_bcon) to be zero/unlimited *OR* valid */
musb->a_wait_bcon = val ? max_t(int, val, OTG_TIME_A_WAIT_BCON) : 0 ;
- if (musb->xceiv->state == OTG_STATE_A_WAIT_BCON)
+ if (musb->xceiv->otg->state == OTG_STATE_A_WAIT_BCON)
musb->is_active = 0;
musb_platform_try_idle(musb, jiffies + msecs_to_jiffies(val));
spin_unlock_irqrestore(&musb->lock, flags);
@@ -1744,8 +1744,8 @@ static void musb_irq_work(struct work_struct *data)
{
struct musb *musb = container_of(data, struct musb, irq_work);

- if (musb->xceiv->state != musb->xceiv_old_state) {
- musb->xceiv_old_state = musb->xceiv->state;
+ if (musb->xceiv->otg->state != musb->xceiv_old_state) {
+ musb->xceiv_old_state = musb->xceiv->otg->state;
sysfs_notify(&musb->controller->kobj, NULL, "mode");
}
}
@@ -1982,10 +1982,10 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl)

if (musb->xceiv->otg->default_a) {
MUSB_HST_MODE(musb);
- musb->xceiv->state = OTG_STATE_A_IDLE;
+ musb->xceiv->otg->state = OTG_STATE_A_IDLE;
} else {
MUSB_DEV_MODE(musb);
- musb->xceiv->state = OTG_STATE_B_IDLE;
+ musb->xceiv->otg->state = OTG_STATE_B_IDLE;
}

switch (musb->port_mode) {
diff --git a/drivers/usb/musb/musb_dsps.c b/drivers/usb/musb/musb_dsps.c
index 09529f94e72d..8e98d8eee3cf 100644
--- a/drivers/usb/musb/musb_dsps.c
+++ b/drivers/usb/musb/musb_dsps.c
@@ -170,9 +170,9 @@ static void dsps_musb_try_idle(struct musb *musb, unsigned long timeout)

/* Never idle if active, or when VBUS timeout is not set as host */
if (musb->is_active || (musb->a_wait_bcon == 0 &&
- musb->xceiv->state == OTG_STATE_A_WAIT_BCON)) {
+ musb->xceiv->otg->state == OTG_STATE_A_WAIT_BCON)) {
dev_dbg(musb->controller, "%s active, deleting timer\n",
- usb_otg_state_string(musb->xceiv->state));
+ usb_otg_state_string(musb->xceiv->otg->state));
del_timer(&glue->timer);
glue->last_timer = jiffies;
return;
@@ -192,7 +192,7 @@ static void dsps_musb_try_idle(struct musb *musb, unsigned long timeout)
glue->last_timer = timeout;

dev_dbg(musb->controller, "%s inactive, starting idle timer for %u ms\n",
- usb_otg_state_string(musb->xceiv->state),
+ usb_otg_state_string(musb->xceiv->otg->state),
jiffies_to_msecs(timeout - jiffies));
mod_timer(&glue->timer, timeout);
}
@@ -256,10 +256,10 @@ static void otg_timer(unsigned long _musb)
*/
devctl = dsps_readb(mregs, MUSB_DEVCTL);
dev_dbg(musb->controller, "Poll devctl %02x (%s)\n", devctl,
- usb_otg_state_string(musb->xceiv->state));
+ usb_otg_state_string(musb->xceiv->otg->state));

spin_lock_irqsave(&musb->lock, flags);
- switch (musb->xceiv->state) {
+ switch (musb->xceiv->otg->state) {
case OTG_STATE_A_WAIT_BCON:
dsps_writeb(musb->mregs, MUSB_DEVCTL, 0);
skip_session = 1;
@@ -268,10 +268,10 @@ static void otg_timer(unsigned long _musb)
case OTG_STATE_A_IDLE:
case OTG_STATE_B_IDLE:
if (devctl & MUSB_DEVCTL_BDEVICE) {
- musb->xceiv->state = OTG_STATE_B_IDLE;
+ musb->xceiv->otg->state = OTG_STATE_B_IDLE;
MUSB_DEV_MODE(musb);
} else {
- musb->xceiv->state = OTG_STATE_A_IDLE;
+ musb->xceiv->otg->state = OTG_STATE_A_IDLE;
MUSB_HST_MODE(musb);
}
if (!(devctl & MUSB_DEVCTL_SESSION) && !skip_session)
@@ -279,7 +279,7 @@ static void otg_timer(unsigned long _musb)
mod_timer(&glue->timer, jiffies + wrp->poll_seconds * HZ);
break;
case OTG_STATE_A_WAIT_VFALL:
- musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
+ musb->xceiv->otg->state = OTG_STATE_A_WAIT_VRISE;
dsps_writel(musb->ctrl_base, wrp->coreintr_set,
MUSB_INTR_VBUSERROR << wrp->usb_shift);
break;
@@ -364,26 +364,26 @@ static irqreturn_t dsps_interrupt(int irq, void *hci)
* devctl.
*/
musb->int_usb &= ~MUSB_INTR_VBUSERROR;
- musb->xceiv->state = OTG_STATE_A_WAIT_VFALL;
+ musb->xceiv->otg->state = OTG_STATE_A_WAIT_VFALL;
mod_timer(&glue->timer,
jiffies + wrp->poll_seconds * HZ);
WARNING("VBUS error workaround (delay coming)\n");
} else if (drvvbus) {
MUSB_HST_MODE(musb);
musb->xceiv->otg->default_a = 1;
- musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
+ musb->xceiv->otg->state = OTG_STATE_A_WAIT_VRISE;
del_timer(&glue->timer);
} else {
musb->is_active = 0;
MUSB_DEV_MODE(musb);
musb->xceiv->otg->default_a = 0;
- musb->xceiv->state = OTG_STATE_B_IDLE;
+ musb->xceiv->otg->state = OTG_STATE_B_IDLE;
}

/* NOTE: this must complete power-on within 100 ms. */
dev_dbg(musb->controller, "VBUS %s (%s)%s, devctl %02x\n",
drvvbus ? "on" : "off",
- usb_otg_state_string(musb->xceiv->state),
+ usb_otg_state_string(musb->xceiv->otg->state),
err ? " ERROR" : "",
devctl);
ret = IRQ_HANDLED;
@@ -393,7 +393,7 @@ static irqreturn_t dsps_interrupt(int irq, void *hci)
ret |= musb_interrupt(musb);

/* Poll for ID change in OTG port mode */
- if (musb->xceiv->state == OTG_STATE_B_IDLE &&
+ if (musb->xceiv->otg->state == OTG_STATE_B_IDLE &&
musb->port_mode == MUSB_PORT_MODE_DUAL_ROLE)
mod_timer(&glue->timer, jiffies + wrp->poll_seconds * HZ);
out:
diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c
index d4aa779339f1..b811a5e9ce4f 100644
--- a/drivers/usb/musb/musb_gadget.c
+++ b/drivers/usb/musb/musb_gadget.c
@@ -1546,7 +1546,7 @@ static int musb_gadget_wakeup(struct usb_gadget *gadget)

spin_lock_irqsave(&musb->lock, flags);

- switch (musb->xceiv->state) {
+ switch (musb->xceiv->otg->state) {
case OTG_STATE_B_PERIPHERAL:
/* NOTE: OTG state machine doesn't include B_SUSPENDED;
* that's part of the standard usb 1.1 state machine, and
@@ -1587,7 +1587,7 @@ static int musb_gadget_wakeup(struct usb_gadget *gadget)
goto done;
default:
dev_dbg(musb->controller, "Unhandled wake: %s\n",
- usb_otg_state_string(musb->xceiv->state));
+ usb_otg_state_string(musb->xceiv->otg->state));
goto done;
}

@@ -1792,7 +1792,7 @@ int musb_gadget_setup(struct musb *musb)

MUSB_DEV_MODE(musb);
musb->xceiv->otg->default_a = 0;
- musb->xceiv->state = OTG_STATE_B_IDLE;
+ musb->xceiv->otg->state = OTG_STATE_B_IDLE;

/* this "gadget" abstracts/virtualizes the controller */
musb->g.name = musb_driver_name;
@@ -1860,7 +1860,7 @@ static int musb_gadget_start(struct usb_gadget *g,
musb->is_active = 1;

otg_set_peripheral(otg, &musb->g);
- musb->xceiv->state = OTG_STATE_B_IDLE;
+ musb->xceiv->otg->state = OTG_STATE_B_IDLE;
spin_unlock_irqrestore(&musb->lock, flags);

musb_start(musb);
@@ -1945,7 +1945,7 @@ static int musb_gadget_stop(struct usb_gadget *g,

(void) musb_gadget_vbus_draw(&musb->g, 0);

- musb->xceiv->state = OTG_STATE_UNDEFINED;
+ musb->xceiv->otg->state = OTG_STATE_UNDEFINED;
stop_activity(musb, driver);
otg_set_peripheral(musb->xceiv->otg, NULL);

@@ -1975,7 +1975,7 @@ static int musb_gadget_stop(struct usb_gadget *g,
void musb_g_resume(struct musb *musb)
{
musb->is_suspended = 0;
- switch (musb->xceiv->state) {
+ switch (musb->xceiv->otg->state) {
case OTG_STATE_B_IDLE:
break;
case OTG_STATE_B_WAIT_ACON:
@@ -1989,7 +1989,7 @@ void musb_g_resume(struct musb *musb)
break;
default:
WARNING("unhandled RESUME transition (%s)\n",
- usb_otg_state_string(musb->xceiv->state));
+ usb_otg_state_string(musb->xceiv->otg->state));
}
}

@@ -2001,10 +2001,10 @@ void musb_g_suspend(struct musb *musb)
devctl = musb_readb(musb->mregs, MUSB_DEVCTL);
dev_dbg(musb->controller, "devctl %02x\n", devctl);

- switch (musb->xceiv->state) {
+ switch (musb->xceiv->otg->state) {
case OTG_STATE_B_IDLE:
if ((devctl & MUSB_DEVCTL_VBUS) == MUSB_DEVCTL_VBUS)
- musb->xceiv->state = OTG_STATE_B_PERIPHERAL;
+ musb->xceiv->otg->state = OTG_STATE_B_PERIPHERAL;
break;
case OTG_STATE_B_PERIPHERAL:
musb->is_suspended = 1;
@@ -2019,7 +2019,7 @@ void musb_g_suspend(struct musb *musb)
* A_PERIPHERAL may need care too
*/
WARNING("unhandled SUSPEND transition (%s)\n",
- usb_otg_state_string(musb->xceiv->state));
+ usb_otg_state_string(musb->xceiv->otg->state));
}
}

@@ -2050,22 +2050,22 @@ void musb_g_disconnect(struct musb *musb)
spin_lock(&musb->lock);
}

- switch (musb->xceiv->state) {
+ switch (musb->xceiv->otg->state) {
default:
dev_dbg(musb->controller, "Unhandled disconnect %s, setting a_idle\n",
- usb_otg_state_string(musb->xceiv->state));
- musb->xceiv->state = OTG_STATE_A_IDLE;
+ usb_otg_state_string(musb->xceiv->otg->state));
+ musb->xceiv->otg->state = OTG_STATE_A_IDLE;
MUSB_HST_MODE(musb);
break;
case OTG_STATE_A_PERIPHERAL:
- musb->xceiv->state = OTG_STATE_A_WAIT_BCON;
+ musb->xceiv->otg->state = OTG_STATE_A_WAIT_BCON;
MUSB_HST_MODE(musb);
break;
case OTG_STATE_B_WAIT_ACON:
case OTG_STATE_B_HOST:
case OTG_STATE_B_PERIPHERAL:
case OTG_STATE_B_IDLE:
- musb->xceiv->state = OTG_STATE_B_IDLE;
+ musb->xceiv->otg->state = OTG_STATE_B_IDLE;
break;
case OTG_STATE_B_SRP_INIT:
break;
@@ -2125,13 +2125,13 @@ __acquires(musb->lock)
* In that case, do not rely on devctl for setting
* peripheral mode.
*/
- musb->xceiv->state = OTG_STATE_B_PERIPHERAL;
+ musb->xceiv->otg->state = OTG_STATE_B_PERIPHERAL;
musb->g.is_a_peripheral = 0;
} else if (devctl & MUSB_DEVCTL_BDEVICE) {
- musb->xceiv->state = OTG_STATE_B_PERIPHERAL;
+ musb->xceiv->otg->state = OTG_STATE_B_PERIPHERAL;
musb->g.is_a_peripheral = 0;
} else {
- musb->xceiv->state = OTG_STATE_A_PERIPHERAL;
+ musb->xceiv->otg->state = OTG_STATE_A_PERIPHERAL;
musb->g.is_a_peripheral = 1;
}

diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c
index eb06291a40c8..3ccb4d83bcfa 100644
--- a/drivers/usb/musb/musb_host.c
+++ b/drivers/usb/musb/musb_host.c
@@ -2462,7 +2462,7 @@ static int musb_bus_suspend(struct usb_hcd *hcd)
if (!is_host_active(musb))
return 0;

- switch (musb->xceiv->state) {
+ switch (musb->xceiv->otg->state) {
case OTG_STATE_A_SUSPEND:
return 0;
case OTG_STATE_A_WAIT_VRISE:
@@ -2472,7 +2472,7 @@ static int musb_bus_suspend(struct usb_hcd *hcd)
*/
devctl = musb_readb(musb->mregs, MUSB_DEVCTL);
if ((devctl & MUSB_DEVCTL_VBUS) == MUSB_DEVCTL_VBUS)
- musb->xceiv->state = OTG_STATE_A_WAIT_BCON;
+ musb->xceiv->otg->state = OTG_STATE_A_WAIT_BCON;
break;
default:
break;
@@ -2480,7 +2480,7 @@ static int musb_bus_suspend(struct usb_hcd *hcd)

if (musb->is_active) {
WARNING("trying to suspend as %s while active\n",
- usb_otg_state_string(musb->xceiv->state));
+ usb_otg_state_string(musb->xceiv->otg->state));
return -EBUSY;
} else
return 0;
@@ -2677,7 +2677,7 @@ int musb_host_setup(struct musb *musb, int power_budget)

MUSB_HST_MODE(musb);
musb->xceiv->otg->default_a = 1;
- musb->xceiv->state = OTG_STATE_A_IDLE;
+ musb->xceiv->otg->state = OTG_STATE_A_IDLE;

otg_set_host(musb->xceiv->otg, &hcd->self);
hcd->self.otg_port = 1;
diff --git a/drivers/usb/musb/musb_virthub.c b/drivers/usb/musb/musb_virthub.c
index e2d2d8c9891b..a133bd8c5dc7 100644
--- a/drivers/usb/musb/musb_virthub.c
+++ b/drivers/usb/musb/musb_virthub.c
@@ -69,7 +69,7 @@ void musb_host_finish_resume(struct work_struct *work)
musb->port1_status |= USB_PORT_STAT_C_SUSPEND << 16;
usb_hcd_poll_rh_status(musb->hcd);
/* NOTE: it might really be A_WAIT_BCON ... */
- musb->xceiv->state = OTG_STATE_A_HOST;
+ musb->xceiv->otg->state = OTG_STATE_A_HOST;

spin_unlock_irqrestore(&musb->lock, flags);
}
@@ -107,9 +107,9 @@ void musb_port_suspend(struct musb *musb, bool do_suspend)
dev_dbg(musb->controller, "Root port suspended, power %02x\n", power);

musb->port1_status |= USB_PORT_STAT_SUSPEND;
- switch (musb->xceiv->state) {
+ switch (musb->xceiv->otg->state) {
case OTG_STATE_A_HOST:
- musb->xceiv->state = OTG_STATE_A_SUSPEND;
+ musb->xceiv->otg->state = OTG_STATE_A_SUSPEND;
musb->is_active = otg->host->b_hnp_enable;
if (musb->is_active)
mod_timer(&musb->otg_timer, jiffies
@@ -118,13 +118,13 @@ void musb_port_suspend(struct musb *musb, bool do_suspend)
musb_platform_try_idle(musb, 0);
break;
case OTG_STATE_B_HOST:
- musb->xceiv->state = OTG_STATE_B_WAIT_ACON;
+ musb->xceiv->otg->state = OTG_STATE_B_WAIT_ACON;
musb->is_active = otg->host->b_hnp_enable;
musb_platform_try_idle(musb, 0);
break;
default:
dev_dbg(musb->controller, "bogus rh suspend? %s\n",
- usb_otg_state_string(musb->xceiv->state));
+ usb_otg_state_string(musb->xceiv->otg->state));
}
} else if (power & MUSB_POWER_SUSPENDM) {
power &= ~MUSB_POWER_SUSPENDM;
@@ -145,7 +145,7 @@ void musb_port_reset(struct musb *musb, bool do_reset)
u8 power;
void __iomem *mbase = musb->mregs;

- if (musb->xceiv->state == OTG_STATE_B_IDLE) {
+ if (musb->xceiv->otg->state == OTG_STATE_B_IDLE) {
dev_dbg(musb->controller, "HNP: Returning from HNP; no hub reset from b_idle\n");
musb->port1_status &= ~USB_PORT_STAT_RESET;
return;
@@ -224,24 +224,24 @@ void musb_root_disconnect(struct musb *musb)
usb_hcd_poll_rh_status(musb->hcd);
musb->is_active = 0;

- switch (musb->xceiv->state) {
+ switch (musb->xceiv->otg->state) {
case OTG_STATE_A_SUSPEND:
if (otg->host->b_hnp_enable) {
- musb->xceiv->state = OTG_STATE_A_PERIPHERAL;
+ musb->xceiv->otg->state = OTG_STATE_A_PERIPHERAL;
musb->g.is_a_peripheral = 1;
break;
}
/* FALLTHROUGH */
case OTG_STATE_A_HOST:
- musb->xceiv->state = OTG_STATE_A_WAIT_BCON;
+ musb->xceiv->otg->state = OTG_STATE_A_WAIT_BCON;
musb->is_active = 0;
break;
case OTG_STATE_A_WAIT_VFALL:
- musb->xceiv->state = OTG_STATE_B_IDLE;
+ musb->xceiv->otg->state = OTG_STATE_B_IDLE;
break;
default:
dev_dbg(musb->controller, "host disconnect (%s)\n",
- usb_otg_state_string(musb->xceiv->state));
+ usb_otg_state_string(musb->xceiv->otg->state));
}
}

diff --git a/drivers/usb/musb/omap2430.c b/drivers/usb/musb/omap2430.c
index d369bf1f3936..d1b08349f056 100644
--- a/drivers/usb/musb/omap2430.c
+++ b/drivers/usb/musb/omap2430.c
@@ -65,15 +65,15 @@ static void musb_do_idle(unsigned long _musb)

spin_lock_irqsave(&musb->lock, flags);

- switch (musb->xceiv->state) {
+ switch (musb->xceiv->otg->state) {
case OTG_STATE_A_WAIT_BCON:

devctl = musb_readb(musb->mregs, MUSB_DEVCTL);
if (devctl & MUSB_DEVCTL_BDEVICE) {
- musb->xceiv->state = OTG_STATE_B_IDLE;
+ musb->xceiv->otg->state = OTG_STATE_B_IDLE;
MUSB_DEV_MODE(musb);
} else {
- musb->xceiv->state = OTG_STATE_A_IDLE;
+ musb->xceiv->otg->state = OTG_STATE_A_IDLE;
MUSB_HST_MODE(musb);
}
break;
@@ -90,15 +90,15 @@ static void musb_do_idle(unsigned long _musb)
musb->port1_status |= USB_PORT_STAT_C_SUSPEND << 16;
usb_hcd_poll_rh_status(musb->hcd);
/* NOTE: it might really be A_WAIT_BCON ... */
- musb->xceiv->state = OTG_STATE_A_HOST;
+ musb->xceiv->otg->state = OTG_STATE_A_HOST;
}
break;
case OTG_STATE_A_HOST:
devctl = musb_readb(musb->mregs, MUSB_DEVCTL);
if (devctl & MUSB_DEVCTL_BDEVICE)
- musb->xceiv->state = OTG_STATE_B_IDLE;
+ musb->xceiv->otg->state = OTG_STATE_B_IDLE;
else
- musb->xceiv->state = OTG_STATE_A_WAIT_BCON;
+ musb->xceiv->otg->state = OTG_STATE_A_WAIT_BCON;
default:
break;
}
@@ -116,9 +116,9 @@ static void omap2430_musb_try_idle(struct musb *musb, unsigned long timeout)

/* Never idle if active, or when VBUS timeout is not set as host */
if (musb->is_active || ((musb->a_wait_bcon == 0)
- && (musb->xceiv->state == OTG_STATE_A_WAIT_BCON))) {
+ && (musb->xceiv->otg->state == OTG_STATE_A_WAIT_BCON))) {
dev_dbg(musb->controller, "%s active, deleting timer\n",
- usb_otg_state_string(musb->xceiv->state));
+ usb_otg_state_string(musb->xceiv->otg->state));
del_timer(&musb_idle_timer);
last_timer = jiffies;
return;
@@ -135,7 +135,7 @@ static void omap2430_musb_try_idle(struct musb *musb, unsigned long timeout)
last_timer = timeout;

dev_dbg(musb->controller, "%s inactive, for idle timer for %lu ms\n",
- usb_otg_state_string(musb->xceiv->state),
+ usb_otg_state_string(musb->xceiv->otg->state),
(unsigned long)jiffies_to_msecs(timeout - jiffies));
mod_timer(&musb_idle_timer, timeout);
}
@@ -153,7 +153,7 @@ static void omap2430_musb_set_vbus(struct musb *musb, int is_on)
devctl = musb_readb(musb->mregs, MUSB_DEVCTL);

if (is_on) {
- if (musb->xceiv->state == OTG_STATE_A_IDLE) {
+ if (musb->xceiv->otg->state == OTG_STATE_A_IDLE) {
int loops = 100;
/* start the session */
devctl |= MUSB_DEVCTL_SESSION;
@@ -179,7 +179,7 @@ static void omap2430_musb_set_vbus(struct musb *musb, int is_on)
} else {
musb->is_active = 1;
otg->default_a = 1;
- musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
+ musb->xceiv->otg->state = OTG_STATE_A_WAIT_VRISE;
devctl |= MUSB_DEVCTL_SESSION;
MUSB_HST_MODE(musb);
}
@@ -191,7 +191,7 @@ static void omap2430_musb_set_vbus(struct musb *musb, int is_on)
*/

otg->default_a = 0;
- musb->xceiv->state = OTG_STATE_B_IDLE;
+ musb->xceiv->otg->state = OTG_STATE_B_IDLE;
devctl &= ~MUSB_DEVCTL_SESSION;

MUSB_DEV_MODE(musb);
@@ -200,7 +200,7 @@ static void omap2430_musb_set_vbus(struct musb *musb, int is_on)

dev_dbg(musb->controller, "VBUS %s, devctl %02x "
/* otg %3x conf %08x prcm %08x */ "\n",
- usb_otg_state_string(musb->xceiv->state),
+ usb_otg_state_string(musb->xceiv->otg->state),
musb_readb(musb->mregs, MUSB_DEVCTL));
}

@@ -265,7 +265,7 @@ static void omap_musb_set_mailbox(struct omap2430_glue *glue)
dev_dbg(dev, "ID GND\n");

otg->default_a = true;
- musb->xceiv->state = OTG_STATE_A_IDLE;
+ musb->xceiv->otg->state = OTG_STATE_A_IDLE;
musb->xceiv->last_event = USB_EVENT_ID;
if (musb->gadget_driver) {
pm_runtime_get_sync(dev);
@@ -279,7 +279,7 @@ static void omap_musb_set_mailbox(struct omap2430_glue *glue)
dev_dbg(dev, "VBUS Connect\n");

otg->default_a = false;
- musb->xceiv->state = OTG_STATE_B_IDLE;
+ musb->xceiv->otg->state = OTG_STATE_B_IDLE;
musb->xceiv->last_event = USB_EVENT_VBUS;
if (musb->gadget_driver)
pm_runtime_get_sync(dev);
diff --git a/drivers/usb/musb/tusb6010.c b/drivers/usb/musb/tusb6010.c
index 159ef4be1ef2..df4513e151a5 100644
--- a/drivers/usb/musb/tusb6010.c
+++ b/drivers/usb/musb/tusb6010.c
@@ -414,13 +414,13 @@ static void musb_do_idle(unsigned long _musb)

spin_lock_irqsave(&musb->lock, flags);

- switch (musb->xceiv->state) {
+ switch (musb->xceiv->otg->state) {
case OTG_STATE_A_WAIT_BCON:
if ((musb->a_wait_bcon != 0)
&& (musb->idle_timeout == 0
|| time_after(jiffies, musb->idle_timeout))) {
dev_dbg(musb->controller, "Nothing connected %s, turning off VBUS\n",
- usb_otg_state_string(musb->xceiv->state));
+ usb_otg_state_string(musb->xceiv->otg->state));
}
/* FALLTHROUGH */
case OTG_STATE_A_IDLE:
@@ -473,9 +473,9 @@ static void tusb_musb_try_idle(struct musb *musb, unsigned long timeout)

/* Never idle if active, or when VBUS timeout is not set as host */
if (musb->is_active || ((musb->a_wait_bcon == 0)
- && (musb->xceiv->state == OTG_STATE_A_WAIT_BCON))) {
+ && (musb->xceiv->otg->state == OTG_STATE_A_WAIT_BCON))) {
dev_dbg(musb->controller, "%s active, deleting timer\n",
- usb_otg_state_string(musb->xceiv->state));
+ usb_otg_state_string(musb->xceiv->otg->state));
del_timer(&musb_idle_timer);
last_timer = jiffies;
return;
@@ -492,7 +492,7 @@ static void tusb_musb_try_idle(struct musb *musb, unsigned long timeout)
last_timer = timeout;

dev_dbg(musb->controller, "%s inactive, for idle timer for %lu ms\n",
- usb_otg_state_string(musb->xceiv->state),
+ usb_otg_state_string(musb->xceiv->otg->state),
(unsigned long)jiffies_to_msecs(timeout - jiffies));
mod_timer(&musb_idle_timer, timeout);
}
@@ -523,7 +523,7 @@ static void tusb_musb_set_vbus(struct musb *musb, int is_on)
if (is_on) {
timer = OTG_TIMER_MS(OTG_TIME_A_WAIT_VRISE);
otg->default_a = 1;
- musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
+ musb->xceiv->otg->state = OTG_STATE_A_WAIT_VRISE;
devctl |= MUSB_DEVCTL_SESSION;

conf |= TUSB_DEV_CONF_USB_HOST_MODE;
@@ -536,16 +536,16 @@ static void tusb_musb_set_vbus(struct musb *musb, int is_on)
/* If ID pin is grounded, we want to be a_idle */
otg_stat = musb_readl(tbase, TUSB_DEV_OTG_STAT);
if (!(otg_stat & TUSB_DEV_OTG_STAT_ID_STATUS)) {
- switch (musb->xceiv->state) {
+ switch (musb->xceiv->otg->state) {
case OTG_STATE_A_WAIT_VRISE:
case OTG_STATE_A_WAIT_BCON:
- musb->xceiv->state = OTG_STATE_A_WAIT_VFALL;
+ musb->xceiv->otg->state = OTG_STATE_A_WAIT_VFALL;
break;
case OTG_STATE_A_WAIT_VFALL:
- musb->xceiv->state = OTG_STATE_A_IDLE;
+ musb->xceiv->otg->state = OTG_STATE_A_IDLE;
break;
default:
- musb->xceiv->state = OTG_STATE_A_IDLE;
+ musb->xceiv->otg->state = OTG_STATE_A_IDLE;
}
musb->is_active = 0;
otg->default_a = 1;
@@ -553,7 +553,7 @@ static void tusb_musb_set_vbus(struct musb *musb, int is_on)
} else {
musb->is_active = 0;
otg->default_a = 0;
- musb->xceiv->state = OTG_STATE_B_IDLE;
+ musb->xceiv->otg->state = OTG_STATE_B_IDLE;
MUSB_DEV_MODE(musb);
}

@@ -568,7 +568,7 @@ static void tusb_musb_set_vbus(struct musb *musb, int is_on)
musb_writeb(musb->mregs, MUSB_DEVCTL, devctl);

dev_dbg(musb->controller, "VBUS %s, devctl %02x otg %3x conf %08x prcm %08x\n",
- usb_otg_state_string(musb->xceiv->state),
+ usb_otg_state_string(musb->xceiv->otg->state),
musb_readb(musb->mregs, MUSB_DEVCTL),
musb_readl(tbase, TUSB_DEV_OTG_STAT),
conf, prcm);
@@ -667,23 +667,23 @@ tusb_otg_ints(struct musb *musb, u32 int_src, void __iomem *tbase)

if (otg_stat & TUSB_DEV_OTG_STAT_SESS_END) {
dev_dbg(musb->controller, "Forcing disconnect (no interrupt)\n");
- if (musb->xceiv->state != OTG_STATE_B_IDLE) {
+ if (musb->xceiv->otg->state != OTG_STATE_B_IDLE) {
/* INTR_DISCONNECT can hide... */
- musb->xceiv->state = OTG_STATE_B_IDLE;
+ musb->xceiv->otg->state = OTG_STATE_B_IDLE;
musb->int_usb |= MUSB_INTR_DISCONNECT;
}
musb->is_active = 0;
}
dev_dbg(musb->controller, "vbus change, %s, otg %03x\n",
- usb_otg_state_string(musb->xceiv->state), otg_stat);
+ usb_otg_state_string(musb->xceiv->otg->state), otg_stat);
idle_timeout = jiffies + (1 * HZ);
schedule_work(&musb->irq_work);

} else /* A-dev state machine */ {
dev_dbg(musb->controller, "vbus change, %s, otg %03x\n",
- usb_otg_state_string(musb->xceiv->state), otg_stat);
+ usb_otg_state_string(musb->xceiv->otg->state), otg_stat);

- switch (musb->xceiv->state) {
+ switch (musb->xceiv->otg->state) {
case OTG_STATE_A_IDLE:
dev_dbg(musb->controller, "Got SRP, turning on VBUS\n");
musb_platform_set_vbus(musb, 1);
@@ -730,9 +730,9 @@ tusb_otg_ints(struct musb *musb, u32 int_src, void __iomem *tbase)
u8 devctl;

dev_dbg(musb->controller, "%s timer, %03x\n",
- usb_otg_state_string(musb->xceiv->state), otg_stat);
+ usb_otg_state_string(musb->xceiv->otg->state), otg_stat);

- switch (musb->xceiv->state) {
+ switch (musb->xceiv->otg->state) {
case OTG_STATE_A_WAIT_VRISE:
/* VBUS has probably been valid for a while now,
* but may well have bounced out of range a bit
@@ -744,7 +744,7 @@ tusb_otg_ints(struct musb *musb, u32 int_src, void __iomem *tbase)
dev_dbg(musb->controller, "devctl %02x\n", devctl);
break;
}
- musb->xceiv->state = OTG_STATE_A_WAIT_BCON;
+ musb->xceiv->otg->state = OTG_STATE_A_WAIT_BCON;
musb->is_active = 0;
idle_timeout = jiffies
+ msecs_to_jiffies(musb->a_wait_bcon);
diff --git a/drivers/usb/musb/ux500.c b/drivers/usb/musb/ux500.c
index f202e5088461..71231bcbd178 100644
--- a/drivers/usb/musb/ux500.c
+++ b/drivers/usb/musb/ux500.c
@@ -56,7 +56,7 @@ static void ux500_musb_set_vbus(struct musb *musb, int is_on)
devctl = musb_readb(musb->mregs, MUSB_DEVCTL);

if (is_on) {
- if (musb->xceiv->state == OTG_STATE_A_IDLE) {
+ if (musb->xceiv->otg->state == OTG_STATE_A_IDLE) {
/* start the session */
devctl |= MUSB_DEVCTL_SESSION;
musb_writeb(musb->mregs, MUSB_DEVCTL, devctl);
@@ -76,7 +76,7 @@ static void ux500_musb_set_vbus(struct musb *musb, int is_on)
} else {
musb->is_active = 1;
musb->xceiv->otg->default_a = 1;
- musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
+ musb->xceiv->otg->state = OTG_STATE_A_WAIT_VRISE;
devctl |= MUSB_DEVCTL_SESSION;
MUSB_HST_MODE(musb);
}
@@ -102,7 +102,7 @@ static void ux500_musb_set_vbus(struct musb *musb, int is_on)
mdelay(200);

dev_dbg(musb->controller, "VBUS %s, devctl %02x\n",
- usb_otg_state_string(musb->xceiv->state),
+ usb_otg_state_string(musb->xceiv->otg->state),
musb_readb(musb->mregs, MUSB_DEVCTL));
}

@@ -112,7 +112,7 @@ static int musb_otg_notifications(struct notifier_block *nb,
struct musb *musb = container_of(nb, struct musb, nb);

dev_dbg(musb->controller, "musb_otg_notifications %ld %s\n",
- event, usb_otg_state_string(musb->xceiv->state));
+ event, usb_otg_state_string(musb->xceiv->otg->state));

switch (event) {
case UX500_MUSB_ID:
@@ -127,7 +127,7 @@ static int musb_otg_notifications(struct notifier_block *nb,
if (is_host_active(musb))
ux500_musb_set_vbus(musb, 0);
else
- musb->xceiv->state = OTG_STATE_B_IDLE;
+ musb->xceiv->otg->state = OTG_STATE_B_IDLE;
break;
default:
dev_dbg(musb->controller, "ID float\n");
diff --git a/drivers/usb/phy/phy-ab8500-usb.c b/drivers/usb/phy/phy-ab8500-usb.c
index 11ab2c45e462..2d5250143ce1 100644
--- a/drivers/usb/phy/phy-ab8500-usb.c
+++ b/drivers/usb/phy/phy-ab8500-usb.c
@@ -446,7 +446,7 @@ static int ab9540_usb_link_status_update(struct ab8500_usb *ab,
if (event != UX500_MUSB_RIDB)
event = UX500_MUSB_NONE;
/* Fallback to default B_IDLE as nothing is connected. */
- ab->phy.state = OTG_STATE_B_IDLE;
+ ab->phy.otg->state = OTG_STATE_B_IDLE;
break;

case USB_LINK_ACA_RID_C_NM_9540:
@@ -584,7 +584,7 @@ static int ab8540_usb_link_status_update(struct ab8500_usb *ab,
* Fallback to default B_IDLE as nothing
* is connected
*/
- ab->phy.state = OTG_STATE_B_IDLE;
+ ab->phy.otg->state = OTG_STATE_B_IDLE;
break;

case USB_LINK_ACA_RID_C_NM_8540:
@@ -693,7 +693,7 @@ static int ab8505_usb_link_status_update(struct ab8500_usb *ab,
* Fallback to default B_IDLE as nothing
* is connected
*/
- ab->phy.state = OTG_STATE_B_IDLE;
+ ab->phy.otg->state = OTG_STATE_B_IDLE;
break;

case USB_LINK_ACA_RID_C_NM_8505:
@@ -776,7 +776,7 @@ static int ab8500_usb_link_status_update(struct ab8500_usb *ab,
if (event != UX500_MUSB_RIDB)
event = UX500_MUSB_NONE;
/* Fallback to default B_IDLE as nothing is connected */
- ab->phy.state = OTG_STATE_B_IDLE;
+ ab->phy.otg->state = OTG_STATE_B_IDLE;
break;

case USB_LINK_ACA_RID_C_NM_8500:
@@ -1380,7 +1380,7 @@ static int ab8500_usb_probe(struct platform_device *pdev)
ab->phy.label = "ab8500";
ab->phy.set_suspend = ab8500_usb_set_suspend;
ab->phy.set_power = ab8500_usb_set_power;
- ab->phy.state = OTG_STATE_UNDEFINED;
+ ab->phy.otg->state = OTG_STATE_UNDEFINED;

otg->phy = &ab->phy;
otg->set_host = ab8500_usb_set_host;
diff --git a/drivers/usb/phy/phy-fsl-usb.c b/drivers/usb/phy/phy-fsl-usb.c
index 2b0f968d9325..a22f88fb8176 100644
--- a/drivers/usb/phy/phy-fsl-usb.c
+++ b/drivers/usb/phy/phy-fsl-usb.c
@@ -623,7 +623,7 @@ static int fsl_otg_set_host(struct usb_otg *otg, struct usb_bus *host)
/* Mini-A cable connected */
struct otg_fsm *fsm = &otg_dev->fsm;

- otg->phy->state = OTG_STATE_UNDEFINED;
+ otg.state = OTG_STATE_UNDEFINED;
fsm->protocol = PROTO_UNDEF;
}
}
@@ -681,7 +681,7 @@ static int fsl_otg_set_power(struct usb_phy *phy, unsigned mA)
{
if (!fsl_otg_dev)
return -ENODEV;
- if (phy->state == OTG_STATE_B_PERIPHERAL)
+ if (phy->otg.state == OTG_STATE_B_PERIPHERAL)
pr_info("FSL OTG: Draw %d mA\n", mA);

return 0;
@@ -714,7 +714,7 @@ static int fsl_otg_start_srp(struct usb_otg *otg)
{
struct fsl_otg *otg_dev;

- if (!otg || otg->phy->state != OTG_STATE_B_IDLE)
+ if (!otg || otg.state != OTG_STATE_B_IDLE)
return -ENODEV;

otg_dev = container_of(otg->phy, struct fsl_otg, phy);
@@ -989,10 +989,10 @@ int usb_otg_start(struct platform_device *pdev)
* Also: record initial state of ID pin
*/
if (fsl_readl(&p_otg->dr_mem_map->otgsc) & OTGSC_STS_USB_ID) {
- p_otg->phy.state = OTG_STATE_UNDEFINED;
+ p_otg->phy->otg.state = OTG_STATE_UNDEFINED;
p_otg->fsm.id = 1;
} else {
- p_otg->phy.state = OTG_STATE_A_IDLE;
+ p_otg->phy->otg.state = OTG_STATE_A_IDLE;
p_otg->fsm.id = 0;
}

diff --git a/drivers/usb/phy/phy-generic.c b/drivers/usb/phy/phy-generic.c
index 7594e5069ae5..280a3458ff6b 100644
--- a/drivers/usb/phy/phy-generic.c
+++ b/drivers/usb/phy/phy-generic.c
@@ -123,7 +123,7 @@ static int nop_set_peripheral(struct usb_otg *otg, struct usb_gadget *gadget)
}

otg->gadget = gadget;
- otg->phy->state = OTG_STATE_B_IDLE;
+ otg->state = OTG_STATE_B_IDLE;
return 0;
}

@@ -225,9 +225,9 @@ int usb_phy_gen_create_phy(struct device *dev, struct usb_phy_generic *nop,
nop->phy.dev = nop->dev;
nop->phy.label = "nop-xceiv";
nop->phy.set_suspend = nop_set_suspend;
- nop->phy.state = OTG_STATE_UNDEFINED;
nop->phy.type = type;

+ nop->phy.otg->state = OTG_STATE_UNDEFINED;
nop->phy.otg->phy = &nop->phy;
nop->phy.otg->set_host = nop_set_host;
nop->phy.otg->set_peripheral = nop_set_peripheral;
diff --git a/drivers/usb/phy/phy-gpio-vbus-usb.c b/drivers/usb/phy/phy-gpio-vbus-usb.c
index 69462e09d014..a4e88a28199a 100644
--- a/drivers/usb/phy/phy-gpio-vbus-usb.c
+++ b/drivers/usb/phy/phy-gpio-vbus-usb.c
@@ -121,7 +121,7 @@ static void gpio_vbus_work(struct work_struct *work)

if (vbus) {
status = USB_EVENT_VBUS;
- gpio_vbus->phy.state = OTG_STATE_B_PERIPHERAL;
+ gpio_vbus->phy.otg->state = OTG_STATE_B_PERIPHERAL;
gpio_vbus->phy.last_event = status;
usb_gadget_vbus_connect(gpio_vbus->phy.otg->gadget);

@@ -143,7 +143,7 @@ static void gpio_vbus_work(struct work_struct *work)

usb_gadget_vbus_disconnect(gpio_vbus->phy.otg->gadget);
status = USB_EVENT_NONE;
- gpio_vbus->phy.state = OTG_STATE_B_IDLE;
+ gpio_vbus->phy.otg->state = OTG_STATE_B_IDLE;
gpio_vbus->phy.last_event = status;

atomic_notifier_call_chain(&gpio_vbus->phy.notifier,
@@ -196,7 +196,7 @@ static int gpio_vbus_set_peripheral(struct usb_otg *otg,
set_vbus_draw(gpio_vbus, 0);

usb_gadget_vbus_disconnect(otg->gadget);
- otg->phy->state = OTG_STATE_UNDEFINED;
+ otg->state = OTG_STATE_UNDEFINED;

otg->gadget = NULL;
return 0;
@@ -218,7 +218,7 @@ static int gpio_vbus_set_power(struct usb_phy *phy, unsigned mA)

gpio_vbus = container_of(phy, struct gpio_vbus_data, phy);

- if (phy->state == OTG_STATE_B_PERIPHERAL)
+ if (phy->otg->state == OTG_STATE_B_PERIPHERAL)
set_vbus_draw(gpio_vbus, mA);
return 0;
}
@@ -269,8 +269,8 @@ static int gpio_vbus_probe(struct platform_device *pdev)
gpio_vbus->phy.dev = gpio_vbus->dev;
gpio_vbus->phy.set_power = gpio_vbus_set_power;
gpio_vbus->phy.set_suspend = gpio_vbus_set_suspend;
- gpio_vbus->phy.state = OTG_STATE_UNDEFINED;

+ gpio_vbus->phy.otg->state = OTG_STATE_UNDEFINED;
gpio_vbus->phy.otg->phy = &gpio_vbus->phy;
gpio_vbus->phy.otg->set_peripheral = gpio_vbus_set_peripheral;

diff --git a/drivers/usb/phy/phy-msm-usb.c b/drivers/usb/phy/phy-msm-usb.c
index c929370cdaa6..4394397b1370 100644
--- a/drivers/usb/phy/phy-msm-usb.c
+++ b/drivers/usb/phy/phy-msm-usb.c
@@ -721,11 +721,11 @@ static int msm_otg_set_host(struct usb_otg *otg, struct usb_bus *host)
}

if (!host) {
- if (otg->phy->state == OTG_STATE_A_HOST) {
+ if (otg->state == OTG_STATE_A_HOST) {
pm_runtime_get_sync(otg->phy->dev);
msm_otg_start_host(otg->phy, 0);
otg->host = NULL;
- otg->phy->state = OTG_STATE_UNDEFINED;
+ otg->state = OTG_STATE_UNDEFINED;
schedule_work(&motg->sm_work);
} else {
otg->host = NULL;
@@ -794,11 +794,11 @@ static int msm_otg_set_peripheral(struct usb_otg *otg,
}

if (!gadget) {
- if (otg->phy->state == OTG_STATE_B_PERIPHERAL) {
+ if (otg->state == OTG_STATE_B_PERIPHERAL) {
pm_runtime_get_sync(otg->phy->dev);
msm_otg_start_peripheral(otg->phy, 0);
otg->gadget = NULL;
- otg->phy->state = OTG_STATE_UNDEFINED;
+ otg->state = OTG_STATE_UNDEFINED;
schedule_work(&motg->sm_work);
} else {
otg->gadget = NULL;
@@ -1170,12 +1170,12 @@ static void msm_otg_sm_work(struct work_struct *w)
struct msm_otg *motg = container_of(w, struct msm_otg, sm_work);
struct usb_otg *otg = motg->phy.otg;

- switch (otg->phy->state) {
+ switch (otg->state) {
case OTG_STATE_UNDEFINED:
dev_dbg(otg->phy->dev, "OTG_STATE_UNDEFINED state\n");
msm_otg_reset(otg->phy);
msm_otg_init_sm(motg);
- otg->phy->state = OTG_STATE_B_IDLE;
+ otg->state = OTG_STATE_B_IDLE;
/* FALL THROUGH */
case OTG_STATE_B_IDLE:
dev_dbg(otg->phy->dev, "OTG_STATE_B_IDLE state\n");
@@ -1183,7 +1183,7 @@ static void msm_otg_sm_work(struct work_struct *w)
/* disable BSV bit */
writel(readl(USB_OTGSC) & ~OTGSC_BSVIE, USB_OTGSC);
msm_otg_start_host(otg->phy, 1);
- otg->phy->state = OTG_STATE_A_HOST;
+ otg->state = OTG_STATE_A_HOST;
} else if (test_bit(B_SESS_VLD, &motg->inputs)) {
switch (motg->chg_state) {
case USB_CHG_STATE_UNDEFINED:
@@ -1199,13 +1199,13 @@ static void msm_otg_sm_work(struct work_struct *w)
msm_otg_notify_charger(motg,
IDEV_CHG_MAX);
msm_otg_start_peripheral(otg->phy, 1);
- otg->phy->state
+ otg->state
= OTG_STATE_B_PERIPHERAL;
break;
case USB_SDP_CHARGER:
msm_otg_notify_charger(motg, IUNIT);
msm_otg_start_peripheral(otg->phy, 1);
- otg->phy->state
+ otg->state
= OTG_STATE_B_PERIPHERAL;
break;
default:
@@ -1230,7 +1230,7 @@ static void msm_otg_sm_work(struct work_struct *w)
motg->chg_type = USB_INVALID_CHARGER;
}

- if (otg->phy->state == OTG_STATE_B_IDLE)
+ if (otg->state == OTG_STATE_B_IDLE)
pm_runtime_put_sync(otg->phy->dev);
break;
case OTG_STATE_B_PERIPHERAL:
@@ -1241,7 +1241,7 @@ static void msm_otg_sm_work(struct work_struct *w)
msm_otg_start_peripheral(otg->phy, 0);
motg->chg_state = USB_CHG_STATE_UNDEFINED;
motg->chg_type = USB_INVALID_CHARGER;
- otg->phy->state = OTG_STATE_B_IDLE;
+ otg->state = OTG_STATE_B_IDLE;
msm_otg_reset(otg->phy);
schedule_work(w);
}
@@ -1250,7 +1250,7 @@ static void msm_otg_sm_work(struct work_struct *w)
dev_dbg(otg->phy->dev, "OTG_STATE_A_HOST state\n");
if (test_bit(ID, &motg->inputs)) {
msm_otg_start_host(otg->phy, 0);
- otg->phy->state = OTG_STATE_B_IDLE;
+ otg->state = OTG_STATE_B_IDLE;
msm_otg_reset(otg->phy);
schedule_work(w);
}
@@ -1303,7 +1303,7 @@ static int msm_otg_mode_show(struct seq_file *s, void *unused)
struct msm_otg *motg = s->private;
struct usb_otg *otg = motg->phy.otg;

- switch (otg->phy->state) {
+ switch (otg->state) {
case OTG_STATE_A_HOST:
seq_puts(s, "host\n");
break;
@@ -1353,7 +1353,7 @@ static ssize_t msm_otg_mode_write(struct file *file, const char __user *ubuf,

switch (req_mode) {
case USB_DR_MODE_UNKNOWN:
- switch (otg->phy->state) {
+ switch (otg->state) {
case OTG_STATE_A_HOST:
case OTG_STATE_B_PERIPHERAL:
set_bit(ID, &motg->inputs);
@@ -1364,7 +1364,7 @@ static ssize_t msm_otg_mode_write(struct file *file, const char __user *ubuf,
}
break;
case USB_DR_MODE_PERIPHERAL:
- switch (otg->phy->state) {
+ switch (otg->state) {
case OTG_STATE_B_IDLE:
case OTG_STATE_A_HOST:
set_bit(ID, &motg->inputs);
@@ -1375,7 +1375,7 @@ static ssize_t msm_otg_mode_write(struct file *file, const char __user *ubuf,
}
break;
case USB_DR_MODE_HOST:
- switch (otg->phy->state) {
+ switch (otg->state) {
case OTG_STATE_B_IDLE:
case OTG_STATE_B_PERIPHERAL:
clear_bit(ID, &motg->inputs);
@@ -1772,7 +1772,7 @@ static int msm_otg_runtime_idle(struct device *dev)
* This 1 sec delay also prevents entering into LPM immediately
* after asynchronous interrupt.
*/
- if (otg->phy->state != OTG_STATE_UNDEFINED)
+ if (otg->state != OTG_STATE_UNDEFINED)
pm_schedule_suspend(dev, 1000);

return -EAGAIN;
diff --git a/drivers/usb/phy/phy-mv-usb.c b/drivers/usb/phy/phy-mv-usb.c
index 7d80c54f0ac6..d6b3c473f068 100644
--- a/drivers/usb/phy/phy-mv-usb.c
+++ b/drivers/usb/phy/phy-mv-usb.c
@@ -339,68 +339,68 @@ static void mv_otg_update_state(struct mv_otg *mvotg)
{
struct mv_otg_ctrl *otg_ctrl = &mvotg->otg_ctrl;
struct usb_phy *phy = &mvotg->phy;
- int old_state = phy->state;
+ int old_state = mvotg->phy.otg->state;

switch (old_state) {
case OTG_STATE_UNDEFINED:
- phy->state = OTG_STATE_B_IDLE;
+ mvotg->phy.otg->state = OTG_STATE_B_IDLE;
/* FALL THROUGH */
case OTG_STATE_B_IDLE:
if (otg_ctrl->id == 0)
- phy->state = OTG_STATE_A_IDLE;
+ mvotg->phy.otg->state = OTG_STATE_A_IDLE;
else if (otg_ctrl->b_sess_vld)
- phy->state = OTG_STATE_B_PERIPHERAL;
+ mvotg->phy.otg->state = OTG_STATE_B_PERIPHERAL;
break;
case OTG_STATE_B_PERIPHERAL:
if (!otg_ctrl->b_sess_vld || otg_ctrl->id == 0)
- phy->state = OTG_STATE_B_IDLE;
+ mvotg->phy.otg->state = OTG_STATE_B_IDLE;
break;
case OTG_STATE_A_IDLE:
if (otg_ctrl->id)
- phy->state = OTG_STATE_B_IDLE;
+ mvotg->phy.otg->state = OTG_STATE_B_IDLE;
else if (!(otg_ctrl->a_bus_drop) &&
(otg_ctrl->a_bus_req || otg_ctrl->a_srp_det))
- phy->state = OTG_STATE_A_WAIT_VRISE;
+ mvotg->phy.otg->state = OTG_STATE_A_WAIT_VRISE;
break;
case OTG_STATE_A_WAIT_VRISE:
if (otg_ctrl->a_vbus_vld)
- phy->state = OTG_STATE_A_WAIT_BCON;
+ mvotg->phy.otg->state = OTG_STATE_A_WAIT_BCON;
break;
case OTG_STATE_A_WAIT_BCON:
if (otg_ctrl->id || otg_ctrl->a_bus_drop
|| otg_ctrl->a_wait_bcon_timeout) {
mv_otg_cancel_timer(mvotg, A_WAIT_BCON_TIMER);
mvotg->otg_ctrl.a_wait_bcon_timeout = 0;
- phy->state = OTG_STATE_A_WAIT_VFALL;
+ mvotg->phy.otg->state = OTG_STATE_A_WAIT_VFALL;
otg_ctrl->a_bus_req = 0;
} else if (!otg_ctrl->a_vbus_vld) {
mv_otg_cancel_timer(mvotg, A_WAIT_BCON_TIMER);
mvotg->otg_ctrl.a_wait_bcon_timeout = 0;
- phy->state = OTG_STATE_A_VBUS_ERR;
+ mvotg->phy.otg->state = OTG_STATE_A_VBUS_ERR;
} else if (otg_ctrl->b_conn) {
mv_otg_cancel_timer(mvotg, A_WAIT_BCON_TIMER);
mvotg->otg_ctrl.a_wait_bcon_timeout = 0;
- phy->state = OTG_STATE_A_HOST;
+ mvotg->phy.otg->state = OTG_STATE_A_HOST;
}
break;
case OTG_STATE_A_HOST:
if (otg_ctrl->id || !otg_ctrl->b_conn
|| otg_ctrl->a_bus_drop)
- phy->state = OTG_STATE_A_WAIT_BCON;
+ mvotg->phy.otg->state = OTG_STATE_A_WAIT_BCON;
else if (!otg_ctrl->a_vbus_vld)
- phy->state = OTG_STATE_A_VBUS_ERR;
+ mvotg->phy.otg->state = OTG_STATE_A_VBUS_ERR;
break;
case OTG_STATE_A_WAIT_VFALL:
if (otg_ctrl->id
|| (!otg_ctrl->b_conn && otg_ctrl->a_sess_vld)
|| otg_ctrl->a_bus_req)
- phy->state = OTG_STATE_A_IDLE;
+ mvotg->phy.otg->state = OTG_STATE_A_IDLE;
break;
case OTG_STATE_A_VBUS_ERR:
if (otg_ctrl->id || otg_ctrl->a_clr_err
|| otg_ctrl->a_bus_drop) {
otg_ctrl->a_clr_err = 0;
- phy->state = OTG_STATE_A_WAIT_VFALL;
+ mvotg->phy.otg->state = OTG_STATE_A_WAIT_VFALL;
}
break;
default:
@@ -420,8 +420,8 @@ static void mv_otg_work(struct work_struct *work)
run:
/* work queue is single thread, or we need spin_lock to protect */
phy = &mvotg->phy;
- otg = phy->otg;
- old_state = phy->state;
+ otg = mvotg->phy.otg;
+ old_state = otg->state;

if (!mvotg->active)
return;
@@ -429,12 +429,12 @@ run:
mv_otg_update_inputs(mvotg);
mv_otg_update_state(mvotg);

- if (old_state != phy->state) {
+ if (old_state != mvotg->phy.otg->state) {
dev_info(&mvotg->pdev->dev, "change from state %s to %s\n",
state_string[old_state],
- state_string[phy->state]);
+ state_string[mvotg->phy.otg->state]);

- switch (phy->state) {
+ switch (mvotg->phy.otg->state) {
case OTG_STATE_B_IDLE:
otg->default_a = 0;
if (old_state == OTG_STATE_B_PERIPHERAL)
@@ -545,8 +545,8 @@ set_a_bus_req(struct device *dev, struct device_attribute *attr,
return -1;

/* We will use this interface to change to A device */
- if (mvotg->phy.state != OTG_STATE_B_IDLE
- && mvotg->phy.state != OTG_STATE_A_IDLE)
+ if (mvotg->phy.otg->state != OTG_STATE_B_IDLE
+ && mvotg->phy.otg->state != OTG_STATE_A_IDLE)
return -1;

/* The clock may disabled and we need to set irq for ID detected */
@@ -717,9 +717,9 @@ static int mv_otg_probe(struct platform_device *pdev)
mvotg->phy.dev = &pdev->dev;
mvotg->phy.otg = otg;
mvotg->phy.label = driver_name;
- mvotg->phy.state = OTG_STATE_UNDEFINED;

otg->phy = &mvotg->phy;
+ otg->state = OTG_STATE_UNDEFINED;
otg->set_host = mv_otg_set_host;
otg->set_peripheral = mv_otg_set_peripheral;
otg->set_vbus = mv_otg_set_vbus;
diff --git a/include/linux/usb/otg.h b/include/linux/usb/otg.h
index 154332b7c8c0..33d3480c9cda 100644
--- a/include/linux/usb/otg.h
+++ b/include/linux/usb/otg.h
@@ -18,6 +18,8 @@ struct usb_otg {
struct usb_bus *host;
struct usb_gadget *gadget;

+ enum usb_otg_state state;
+
/* bind/unbind the host controller */
int (*set_host)(struct usb_otg *otg, struct usb_bus *host);

diff --git a/include/linux/usb/phy.h b/include/linux/usb/phy.h
index 353053a33f21..ac7d7913694f 100644
--- a/include/linux/usb/phy.h
+++ b/include/linux/usb/phy.h
@@ -77,7 +77,6 @@ struct usb_phy {
unsigned int flags;

enum usb_phy_type type;
- enum usb_otg_state state;
enum usb_phy_events last_event;

struct usb_otg *otg;
--
1.9.1

2014-07-09 10:19:55

by Antoine Tenart

[permalink] [raw]
Subject: [PATCH 2/4] usb: add support to the PHY framework for OTG

This patch adds the support to PHY framework in OTG code, and keeps the
USB PHY compatibility. This is done in two steps: renaming 'phy' into
'usb_phy' and adding a new 'phy' member into the usb_otg structure.
These modifications are done in all drivers accessing the OTG PHY.

Signed-off-by: Antoine Ténart <[email protected]>
---
drivers/phy/phy-omap-usb2.c | 6 ++--
drivers/usb/chipidea/otg_fsm.c | 2 +-
drivers/usb/phy/phy-ab8500-usb.c | 6 ++--
drivers/usb/phy/phy-fsl-usb.c | 12 ++++----
drivers/usb/phy/phy-generic.c | 2 +-
drivers/usb/phy/phy-gpio-vbus-usb.c | 2 +-
drivers/usb/phy/phy-isp1301-omap.c | 10 +++----
drivers/usb/phy/phy-msm-usb.c | 59 +++++++++++++++++++------------------
drivers/usb/phy/phy-mv-usb.c | 4 +--
drivers/usb/phy/phy-samsung-usb2.c | 2 +-
drivers/usb/phy/phy-tahvo.c | 8 +++--
drivers/usb/phy/phy-ulpi.c | 6 ++--
include/linux/usb/otg.h | 5 +++-
13 files changed, 65 insertions(+), 59 deletions(-)

diff --git a/drivers/phy/phy-omap-usb2.c b/drivers/phy/phy-omap-usb2.c
index 1f444f91ed7d..13d3e36e208b 100644
--- a/drivers/phy/phy-omap-usb2.c
+++ b/drivers/phy/phy-omap-usb2.c
@@ -60,7 +60,7 @@ EXPORT_SYMBOL_GPL(omap_usb2_set_comparator);

static int omap_usb_set_vbus(struct usb_otg *otg, bool enabled)
{
- struct omap_usb *phy = phy_to_omapusb(otg->phy);
+ struct omap_usb *phy = phy_to_omapusb(otg->usb_phy);

if (!phy->comparator)
return -ENODEV;
@@ -70,7 +70,7 @@ static int omap_usb_set_vbus(struct usb_otg *otg, bool enabled)

static int omap_usb_start_srp(struct usb_otg *otg)
{
- struct omap_usb *phy = phy_to_omapusb(otg->phy);
+ struct omap_usb *phy = phy_to_omapusb(otg->usb_phy);

if (!phy->comparator)
return -ENODEV;
@@ -255,7 +255,7 @@ static int omap_usb2_probe(struct platform_device *pdev)
otg->set_vbus = omap_usb_set_vbus;
if (phy_data->flags & OMAP_USB2_HAS_START_SRP)
otg->start_srp = omap_usb_start_srp;
- otg->phy = &phy->phy;
+ otg->usb_phy = &phy->phy;

platform_set_drvdata(pdev, phy);
pm_runtime_enable(phy->dev);
diff --git a/drivers/usb/chipidea/otg_fsm.c b/drivers/usb/chipidea/otg_fsm.c
index 8cb2508a6b71..d8490e758a74 100644
--- a/drivers/usb/chipidea/otg_fsm.c
+++ b/drivers/usb/chipidea/otg_fsm.c
@@ -788,7 +788,7 @@ int ci_hdrc_otg_fsm_init(struct ci_hdrc *ci)
return -ENOMEM;
}

- otg->phy = ci->transceiver;
+ otg->usb_phy = ci->transceiver;
otg->gadget = &ci->gadget;
ci->fsm.otg = otg;
ci->transceiver->otg = ci->fsm.otg;
diff --git a/drivers/usb/phy/phy-ab8500-usb.c b/drivers/usb/phy/phy-ab8500-usb.c
index 2d5250143ce1..3a802fa7dae2 100644
--- a/drivers/usb/phy/phy-ab8500-usb.c
+++ b/drivers/usb/phy/phy-ab8500-usb.c
@@ -1056,7 +1056,7 @@ static int ab8500_usb_set_peripheral(struct usb_otg *otg,
if (!otg)
return -ENODEV;

- ab = phy_to_ab(otg->phy);
+ ab = phy_to_ab(otg->usb_phy);

ab->phy.otg->gadget = gadget;

@@ -1080,7 +1080,7 @@ static int ab8500_usb_set_host(struct usb_otg *otg, struct usb_bus *host)
if (!otg)
return -ENODEV;

- ab = phy_to_ab(otg->phy);
+ ab = phy_to_ab(otg->usb_phy);

ab->phy.otg->host = host;

@@ -1382,7 +1382,7 @@ static int ab8500_usb_probe(struct platform_device *pdev)
ab->phy.set_power = ab8500_usb_set_power;
ab->phy.otg->state = OTG_STATE_UNDEFINED;

- otg->phy = &ab->phy;
+ otg->usb_phy = &ab->phy;
otg->set_host = ab8500_usb_set_host;
otg->set_peripheral = ab8500_usb_set_peripheral;

diff --git a/drivers/usb/phy/phy-fsl-usb.c b/drivers/usb/phy/phy-fsl-usb.c
index a22f88fb8176..548bbc4a89d9 100644
--- a/drivers/usb/phy/phy-fsl-usb.c
+++ b/drivers/usb/phy/phy-fsl-usb.c
@@ -499,7 +499,7 @@ int fsl_otg_start_host(struct otg_fsm *fsm, int on)
{
struct usb_otg *otg = fsm->otg;
struct device *dev;
- struct fsl_otg *otg_dev = container_of(otg->phy, struct fsl_otg, phy);
+ struct fsl_otg *otg_dev = container_of(otg->usb_phy, struct fsl_otg, phy);
u32 retval = 0;

if (!otg->host)
@@ -594,7 +594,7 @@ static int fsl_otg_set_host(struct usb_otg *otg, struct usb_bus *host)
if (!otg)
return -ENODEV;

- otg_dev = container_of(otg->phy, struct fsl_otg, phy);
+ otg_dev = container_of(otg->usb_phy, struct fsl_otg, phy);
if (otg_dev != fsl_otg_dev)
return -ENODEV;

@@ -644,7 +644,7 @@ static int fsl_otg_set_peripheral(struct usb_otg *otg,
if (!otg)
return -ENODEV;

- otg_dev = container_of(otg->phy, struct fsl_otg, phy);
+ otg_dev = container_of(otg->usb_phy, struct fsl_otg, phy);
VDBG("otg_dev 0x%x\n", (int)otg_dev);
VDBG("fsl_otg_dev 0x%x\n", (int)fsl_otg_dev);
if (otg_dev != fsl_otg_dev)
@@ -717,7 +717,7 @@ static int fsl_otg_start_srp(struct usb_otg *otg)
if (!otg || otg.state != OTG_STATE_B_IDLE)
return -ENODEV;

- otg_dev = container_of(otg->phy, struct fsl_otg, phy);
+ otg_dev = container_of(otg->usb_phy, struct fsl_otg, phy);
if (otg_dev != fsl_otg_dev)
return -ENODEV;

@@ -735,7 +735,7 @@ static int fsl_otg_start_hnp(struct usb_otg *otg)
if (!otg)
return -ENODEV;

- otg_dev = container_of(otg->phy, struct fsl_otg, phy);
+ otg_dev = container_of(otg->usb_phy, struct fsl_otg, phy);
if (otg_dev != fsl_otg_dev)
return -ENODEV;

@@ -857,7 +857,7 @@ static int fsl_otg_conf(struct platform_device *pdev)
fsl_otg_tc->phy.dev = &pdev->dev;
fsl_otg_tc->phy.set_power = fsl_otg_set_power;

- fsl_otg_tc->phy.otg->phy = &fsl_otg_tc->phy;
+ fsl_otg_tc->phy.otg->usb_phy = &fsl_otg_tc->phy;
fsl_otg_tc->phy.otg->set_host = fsl_otg_set_host;
fsl_otg_tc->phy.otg->set_peripheral = fsl_otg_set_peripheral;
fsl_otg_tc->phy.otg->start_hnp = fsl_otg_start_hnp;
diff --git a/drivers/usb/phy/phy-generic.c b/drivers/usb/phy/phy-generic.c
index 280a3458ff6b..0c01bd12cabc 100644
--- a/drivers/usb/phy/phy-generic.c
+++ b/drivers/usb/phy/phy-generic.c
@@ -228,7 +228,7 @@ int usb_phy_gen_create_phy(struct device *dev, struct usb_phy_generic *nop,
nop->phy.type = type;

nop->phy.otg->state = OTG_STATE_UNDEFINED;
- nop->phy.otg->phy = &nop->phy;
+ nop->phy.otg->usb_phy = &nop->phy;
nop->phy.otg->set_host = nop_set_host;
nop->phy.otg->set_peripheral = nop_set_peripheral;

diff --git a/drivers/usb/phy/phy-gpio-vbus-usb.c b/drivers/usb/phy/phy-gpio-vbus-usb.c
index a4e88a28199a..0ca42bb2e661 100644
--- a/drivers/usb/phy/phy-gpio-vbus-usb.c
+++ b/drivers/usb/phy/phy-gpio-vbus-usb.c
@@ -271,7 +271,7 @@ static int gpio_vbus_probe(struct platform_device *pdev)
gpio_vbus->phy.set_suspend = gpio_vbus_set_suspend;

gpio_vbus->phy.otg->state = OTG_STATE_UNDEFINED;
- gpio_vbus->phy.otg->phy = &gpio_vbus->phy;
+ gpio_vbus->phy.otg->usb_phy = &gpio_vbus->phy;
gpio_vbus->phy.otg->set_peripheral = gpio_vbus_set_peripheral;

err = gpio_request(gpio, "vbus_detect");
diff --git a/drivers/usb/phy/phy-isp1301-omap.c b/drivers/usb/phy/phy-isp1301-omap.c
index 69e49be8866b..cf0bd694ed1c 100644
--- a/drivers/usb/phy/phy-isp1301-omap.c
+++ b/drivers/usb/phy/phy-isp1301-omap.c
@@ -1275,7 +1275,7 @@ static int isp1301_otg_enable(struct isp1301 *isp)
static int
isp1301_set_host(struct usb_otg *otg, struct usb_bus *host)
{
- struct isp1301 *isp = container_of(otg->phy, struct isp1301, phy);
+ struct isp1301 *isp = container_of(otg->usb_phy, struct isp1301, phy);

if (isp != the_transceiver)
return -ENODEV;
@@ -1331,7 +1331,7 @@ isp1301_set_host(struct usb_otg *otg, struct usb_bus *host)
static int
isp1301_set_peripheral(struct usb_otg *otg, struct usb_gadget *gadget)
{
- struct isp1301 *isp = container_of(otg->phy, struct isp1301, phy);
+ struct isp1301 *isp = container_of(otg->usb_phy, struct isp1301, phy);

if (isp != the_transceiver)
return -ENODEV;
@@ -1411,7 +1411,7 @@ isp1301_set_power(struct usb_phy *dev, unsigned mA)
static int
isp1301_start_srp(struct usb_otg *otg)
{
- struct isp1301 *isp = container_of(otg->phy, struct isp1301, phy);
+ struct isp1301 *isp = container_of(otg->usb_phy, struct isp1301, phy);
u32 otg_ctrl;

if (isp != the_transceiver || isp->phy.state != OTG_STATE_B_IDLE)
@@ -1438,7 +1438,7 @@ static int
isp1301_start_hnp(struct usb_otg *otg)
{
#ifdef CONFIG_USB_OTG
- struct isp1301 *isp = container_of(otg->phy, struct isp1301, phy);
+ struct isp1301 *isp = container_of(otg->usb_phy, struct isp1301, phy);
u32 l;

if (isp != the_transceiver)
@@ -1583,7 +1583,7 @@ isp1301_probe(struct i2c_client *i2c, const struct i2c_device_id *id)
isp->phy.label = DRIVER_NAME;
isp->phy.set_power = isp1301_set_power,

- isp->phy.otg->phy = &isp->phy;
+ isp->phy.otg->usb_phy = &isp->phy;
isp->phy.otg->set_host = isp1301_set_host,
isp->phy.otg->set_peripheral = isp1301_set_peripheral,
isp->phy.otg->start_srp = isp1301_start_srp,
diff --git a/drivers/usb/phy/phy-msm-usb.c b/drivers/usb/phy/phy-msm-usb.c
index 4394397b1370..11e877964173 100644
--- a/drivers/usb/phy/phy-msm-usb.c
+++ b/drivers/usb/phy/phy-msm-usb.c
@@ -708,7 +708,7 @@ static void msm_otg_start_host(struct usb_phy *phy, int on)

static int msm_otg_set_host(struct usb_otg *otg, struct usb_bus *host)
{
- struct msm_otg *motg = container_of(otg->phy, struct msm_otg, phy);
+ struct msm_otg *motg = container_of(otg->usb_phy, struct msm_otg, phy);
struct usb_hcd *hcd;

/*
@@ -716,14 +716,14 @@ static int msm_otg_set_host(struct usb_otg *otg, struct usb_bus *host)
* only peripheral configuration.
*/
if (motg->pdata->mode == USB_DR_MODE_PERIPHERAL) {
- dev_info(otg->phy->dev, "Host mode is not supported\n");
+ dev_info(otg->usb_phy->dev, "Host mode is not supported\n");
return -ENODEV;
}

if (!host) {
if (otg->state == OTG_STATE_A_HOST) {
- pm_runtime_get_sync(otg->phy->dev);
- msm_otg_start_host(otg->phy, 0);
+ pm_runtime_get_sync(otg->usb_phy->dev);
+ msm_otg_start_host(otg->usb_phy, 0);
otg->host = NULL;
otg->state = OTG_STATE_UNDEFINED;
schedule_work(&motg->sm_work);
@@ -738,14 +738,14 @@ static int msm_otg_set_host(struct usb_otg *otg, struct usb_bus *host)
hcd->power_budget = motg->pdata->power_budget;

otg->host = host;
- dev_dbg(otg->phy->dev, "host driver registered w/ tranceiver\n");
+ dev_dbg(otg->usb_phy->dev, "host driver registered w/ tranceiver\n");

/*
* Kick the state machine work, if peripheral is not supported
* or peripheral is already registered with us.
*/
if (motg->pdata->mode == USB_DR_MODE_HOST || otg->gadget) {
- pm_runtime_get_sync(otg->phy->dev);
+ pm_runtime_get_sync(otg->usb_phy->dev);
schedule_work(&motg->sm_work);
}

@@ -782,21 +782,21 @@ static void msm_otg_start_peripheral(struct usb_phy *phy, int on)
static int msm_otg_set_peripheral(struct usb_otg *otg,
struct usb_gadget *gadget)
{
- struct msm_otg *motg = container_of(otg->phy, struct msm_otg, phy);
+ struct msm_otg *motg = container_of(otg->usb_phy, struct msm_otg, phy);

/*
* Fail peripheral registration if this board can support
* only host configuration.
*/
if (motg->pdata->mode == USB_DR_MODE_HOST) {
- dev_info(otg->phy->dev, "Peripheral mode is not supported\n");
+ dev_info(otg->usb_phy->dev, "Peripheral mode is not supported\n");
return -ENODEV;
}

if (!gadget) {
if (otg->state == OTG_STATE_B_PERIPHERAL) {
- pm_runtime_get_sync(otg->phy->dev);
- msm_otg_start_peripheral(otg->phy, 0);
+ pm_runtime_get_sync(otg->usb_phy->dev);
+ msm_otg_start_peripheral(otg->usb_phy, 0);
otg->gadget = NULL;
otg->state = OTG_STATE_UNDEFINED;
schedule_work(&motg->sm_work);
@@ -807,14 +807,15 @@ static int msm_otg_set_peripheral(struct usb_otg *otg,
return 0;
}
otg->gadget = gadget;
- dev_dbg(otg->phy->dev, "peripheral driver registered w/ tranceiver\n");
+ dev_dbg(otg->usb_phy->dev,
+ "peripheral driver registered w/ tranceiver\n");

/*
* Kick the state machine work, if host is not supported
* or host is already registered with us.
*/
if (motg->pdata->mode == USB_DR_MODE_PERIPHERAL || otg->host) {
- pm_runtime_get_sync(otg->phy->dev);
+ pm_runtime_get_sync(otg->usb_phy->dev);
schedule_work(&motg->sm_work);
}

@@ -1172,17 +1173,17 @@ static void msm_otg_sm_work(struct work_struct *w)

switch (otg->state) {
case OTG_STATE_UNDEFINED:
- dev_dbg(otg->phy->dev, "OTG_STATE_UNDEFINED state\n");
- msm_otg_reset(otg->phy);
+ dev_dbg(otg->usb_phy->dev, "OTG_STATE_UNDEFINED state\n");
+ msm_otg_reset(otg->usb_phy);
msm_otg_init_sm(motg);
otg->state = OTG_STATE_B_IDLE;
/* FALL THROUGH */
case OTG_STATE_B_IDLE:
- dev_dbg(otg->phy->dev, "OTG_STATE_B_IDLE state\n");
+ dev_dbg(otg->usb_phy->dev, "OTG_STATE_B_IDLE state\n");
if (!test_bit(ID, &motg->inputs) && otg->host) {
/* disable BSV bit */
writel(readl(USB_OTGSC) & ~OTGSC_BSVIE, USB_OTGSC);
- msm_otg_start_host(otg->phy, 1);
+ msm_otg_start_host(otg->usb_phy, 1);
otg->state = OTG_STATE_A_HOST;
} else if (test_bit(B_SESS_VLD, &motg->inputs)) {
switch (motg->chg_state) {
@@ -1198,13 +1199,13 @@ static void msm_otg_sm_work(struct work_struct *w)
case USB_CDP_CHARGER:
msm_otg_notify_charger(motg,
IDEV_CHG_MAX);
- msm_otg_start_peripheral(otg->phy, 1);
+ msm_otg_start_peripheral(otg->usb_phy, 1);
otg->state
= OTG_STATE_B_PERIPHERAL;
break;
case USB_SDP_CHARGER:
msm_otg_notify_charger(motg, IUNIT);
- msm_otg_start_peripheral(otg->phy, 1);
+ msm_otg_start_peripheral(otg->usb_phy, 1);
otg->state
= OTG_STATE_B_PERIPHERAL;
break;
@@ -1222,8 +1223,8 @@ static void msm_otg_sm_work(struct work_struct *w)
* is incremented in charger detection work.
*/
if (cancel_delayed_work_sync(&motg->chg_work)) {
- pm_runtime_put_sync(otg->phy->dev);
- msm_otg_reset(otg->phy);
+ pm_runtime_put_sync(otg->usb_phy->dev);
+ msm_otg_reset(otg->usb_phy);
}
msm_otg_notify_charger(motg, 0);
motg->chg_state = USB_CHG_STATE_UNDEFINED;
@@ -1231,27 +1232,27 @@ static void msm_otg_sm_work(struct work_struct *w)
}

if (otg->state == OTG_STATE_B_IDLE)
- pm_runtime_put_sync(otg->phy->dev);
+ pm_runtime_put_sync(otg->usb_phy->dev);
break;
case OTG_STATE_B_PERIPHERAL:
- dev_dbg(otg->phy->dev, "OTG_STATE_B_PERIPHERAL state\n");
+ dev_dbg(otg->usb_phy->dev, "OTG_STATE_B_PERIPHERAL state\n");
if (!test_bit(B_SESS_VLD, &motg->inputs) ||
!test_bit(ID, &motg->inputs)) {
msm_otg_notify_charger(motg, 0);
- msm_otg_start_peripheral(otg->phy, 0);
+ msm_otg_start_peripheral(otg->usb_phy, 0);
motg->chg_state = USB_CHG_STATE_UNDEFINED;
motg->chg_type = USB_INVALID_CHARGER;
otg->state = OTG_STATE_B_IDLE;
- msm_otg_reset(otg->phy);
+ msm_otg_reset(otg->usb_phy);
schedule_work(w);
}
break;
case OTG_STATE_A_HOST:
- dev_dbg(otg->phy->dev, "OTG_STATE_A_HOST state\n");
+ dev_dbg(otg->usb_phy->dev, "OTG_STATE_A_HOST state\n");
if (test_bit(ID, &motg->inputs)) {
- msm_otg_start_host(otg->phy, 0);
+ msm_otg_start_host(otg->usb_phy, 0);
otg->state = OTG_STATE_B_IDLE;
- msm_otg_reset(otg->phy);
+ msm_otg_reset(otg->usb_phy);
schedule_work(w);
}
break;
@@ -1388,7 +1389,7 @@ static ssize_t msm_otg_mode_write(struct file *file, const char __user *ubuf,
goto out;
}

- pm_runtime_get_sync(otg->phy->dev);
+ pm_runtime_get_sync(otg->usb_phy->dev);
schedule_work(&motg->sm_work);
out:
return status;
@@ -1671,7 +1672,7 @@ static int msm_otg_probe(struct platform_device *pdev)

phy->io_ops = &msm_otg_io_ops;

- phy->otg->phy = &motg->phy;
+ phy->otg->usb_phy = &motg->phy;
phy->otg->set_host = msm_otg_set_host;
phy->otg->set_peripheral = msm_otg_set_peripheral;

diff --git a/drivers/usb/phy/phy-mv-usb.c b/drivers/usb/phy/phy-mv-usb.c
index d6b3c473f068..d948275d55e5 100644
--- a/drivers/usb/phy/phy-mv-usb.c
+++ b/drivers/usb/phy/phy-mv-usb.c
@@ -56,7 +56,7 @@ static char *state_string[] = {

static int mv_otg_set_vbus(struct usb_otg *otg, bool on)
{
- struct mv_otg *mvotg = container_of(otg->phy, struct mv_otg, phy);
+ struct mv_otg *mvotg = container_of(otg->usb_phy, struct mv_otg, phy);
if (mvotg->pdata->set_vbus == NULL)
return -ENODEV;

@@ -718,8 +718,8 @@ static int mv_otg_probe(struct platform_device *pdev)
mvotg->phy.otg = otg;
mvotg->phy.label = driver_name;

- otg->phy = &mvotg->phy;
otg->state = OTG_STATE_UNDEFINED;
+ otg->usb_phy = &mvotg->phy;
otg->set_host = mv_otg_set_host;
otg->set_peripheral = mv_otg_set_peripheral;
otg->set_vbus = mv_otg_set_vbus;
diff --git a/drivers/usb/phy/phy-samsung-usb2.c b/drivers/usb/phy/phy-samsung-usb2.c
index b3ba86627b72..2a6d8cfa8839 100644
--- a/drivers/usb/phy/phy-samsung-usb2.c
+++ b/drivers/usb/phy/phy-samsung-usb2.c
@@ -420,7 +420,7 @@ static int samsung_usb2phy_probe(struct platform_device *pdev)
return -EINVAL;

sphy->phy.otg = otg;
- sphy->phy.otg->phy = &sphy->phy;
+ sphy->phy.otg->usb_phy = &sphy->phy;
sphy->phy.otg->set_host = samsung_usbphy_set_host;

spin_lock_init(&sphy->lock);
diff --git a/drivers/usb/phy/phy-tahvo.c b/drivers/usb/phy/phy-tahvo.c
index cc61ee44b911..402e6af29c65 100644
--- a/drivers/usb/phy/phy-tahvo.c
+++ b/drivers/usb/phy/phy-tahvo.c
@@ -196,7 +196,8 @@ static int tahvo_usb_set_suspend(struct usb_phy *dev, int suspend)

static int tahvo_usb_set_host(struct usb_otg *otg, struct usb_bus *host)
{
- struct tahvo_usb *tu = container_of(otg->phy, struct tahvo_usb, phy);
+ struct tahvo_usb *tu = container_of(otg->usb_phy, struct tahvo_usb,
+ phy);

dev_dbg(&tu->pt_dev->dev, "%s %p\n", __func__, host);

@@ -225,7 +226,8 @@ static int tahvo_usb_set_host(struct usb_otg *otg, struct usb_bus *host)
static int tahvo_usb_set_peripheral(struct usb_otg *otg,
struct usb_gadget *gadget)
{
- struct tahvo_usb *tu = container_of(otg->phy, struct tahvo_usb, phy);
+ struct tahvo_usb *tu = container_of(otg->usb_phy, struct tahvo_usb,
+ phy);

dev_dbg(&tu->pt_dev->dev, "%s %p\n", __func__, gadget);

@@ -383,7 +385,7 @@ static int tahvo_usb_probe(struct platform_device *pdev)
tu->phy.label = DRIVER_NAME;
tu->phy.set_suspend = tahvo_usb_set_suspend;

- tu->phy.otg->phy = &tu->phy;
+ tu->phy.otg->usb_phy = &tu->phy;
tu->phy.otg->set_host = tahvo_usb_set_host;
tu->phy.otg->set_peripheral = tahvo_usb_set_peripheral;

diff --git a/drivers/usb/phy/phy-ulpi.c b/drivers/usb/phy/phy-ulpi.c
index 4e3877c329f2..f48a7a21e3c2 100644
--- a/drivers/usb/phy/phy-ulpi.c
+++ b/drivers/usb/phy/phy-ulpi.c
@@ -211,7 +211,7 @@ static int ulpi_init(struct usb_phy *phy)

static int ulpi_set_host(struct usb_otg *otg, struct usb_bus *host)
{
- struct usb_phy *phy = otg->phy;
+ struct usb_phy *phy = otg->usb_phy;
unsigned int flags = usb_phy_io_read(phy, ULPI_IFC_CTRL);

if (!host) {
@@ -237,7 +237,7 @@ static int ulpi_set_host(struct usb_otg *otg, struct usb_bus *host)

static int ulpi_set_vbus(struct usb_otg *otg, bool on)
{
- struct usb_phy *phy = otg->phy;
+ struct usb_phy *phy = otg->usb_phy;
unsigned int flags = usb_phy_io_read(phy, ULPI_OTG_CTRL);

flags &= ~(ULPI_OTG_CTRL_DRVVBUS | ULPI_OTG_CTRL_DRVVBUS_EXT);
@@ -276,7 +276,7 @@ otg_ulpi_create(struct usb_phy_io_ops *ops,
phy->otg = otg;
phy->init = ulpi_init;

- otg->phy = phy;
+ otg->usb_phy = phy;
otg->set_host = ulpi_set_host;
otg->set_vbus = ulpi_set_vbus;

diff --git a/include/linux/usb/otg.h b/include/linux/usb/otg.h
index 33d3480c9cda..52661c5da690 100644
--- a/include/linux/usb/otg.h
+++ b/include/linux/usb/otg.h
@@ -9,12 +9,15 @@
#ifndef __LINUX_USB_OTG_H
#define __LINUX_USB_OTG_H

+#include <linux/phy/phy.h>
#include <linux/usb/phy.h>

struct usb_otg {
u8 default_a;

- struct usb_phy *phy;
+ struct phy *phy;
+ /* old usb_phy interface */
+ struct usb_phy *usb_phy;
struct usb_bus *host;
struct usb_gadget *gadget;

--
1.9.1

2014-07-09 10:21:56

by Antoine Tenart

[permalink] [raw]
Subject: [PATCH 4/4] usb: chipidea: add support to the PHY framework for ChipIdea

This patch adds the support to the PHY framework for ChipIdea drivers
while keeping the USB PHY compatibility. Changes are done in both the
ChipIdea common code and in the drivers accessing the PHY. This is done
by renaming 'phy' into 'usb_phy' and adding a new 'phy' member into the
ci_hdrc structre.

Signed-off-by: Antoine Ténart <[email protected]>
---
drivers/usb/chipidea/ci.h | 4 ++-
drivers/usb/chipidea/ci_hdrc_imx.c | 2 +-
drivers/usb/chipidea/ci_hdrc_msm.c | 6 ++--
drivers/usb/chipidea/core.c | 67 +++++++++++++++++++++++++++++++-------
drivers/usb/chipidea/debug.c | 4 ++-
drivers/usb/chipidea/host.c | 17 ++++++----
drivers/usb/chipidea/otg_fsm.c | 6 ++--
drivers/usb/chipidea/udc.c | 4 +--
include/linux/usb/chipidea.h | 4 ++-
9 files changed, 86 insertions(+), 28 deletions(-)

diff --git a/drivers/usb/chipidea/ci.h b/drivers/usb/chipidea/ci.h
index 9563cb56d564..139589c8ab90 100644
--- a/drivers/usb/chipidea/ci.h
+++ b/drivers/usb/chipidea/ci.h
@@ -201,7 +201,9 @@ struct ci_hdrc {

struct ci_hdrc_platform_data *platdata;
int vbus_active;
- struct usb_phy *transceiver;
+ struct phy *transceiver;
+ /* old usb_phy interface */
+ struct usb_phy *usb_transceiver;
struct usb_hcd *hcd;
struct dentry *debugfs;
bool id_event;
diff --git a/drivers/usb/chipidea/ci_hdrc_imx.c b/drivers/usb/chipidea/ci_hdrc_imx.c
index 2e58f8dfd311..33b982dddac5 100644
--- a/drivers/usb/chipidea/ci_hdrc_imx.c
+++ b/drivers/usb/chipidea/ci_hdrc_imx.c
@@ -136,7 +136,7 @@ static int ci_hdrc_imx_probe(struct platform_device *pdev)
goto err_clk;
}

- pdata.phy = data->phy;
+ pdata.usb_phy = data->phy;

if (imx_platform_flag->flags & CI_HDRC_IMX_IMX28_WRITE_FIX)
pdata.flags |= CI_HDRC_IMX28_WRITE_FIX;
diff --git a/drivers/usb/chipidea/ci_hdrc_msm.c b/drivers/usb/chipidea/ci_hdrc_msm.c
index d72b9d2de2c5..07b85674d208 100644
--- a/drivers/usb/chipidea/ci_hdrc_msm.c
+++ b/drivers/usb/chipidea/ci_hdrc_msm.c
@@ -34,10 +34,10 @@ static void ci_hdrc_msm_notify_event(struct ci_hdrc *ci, unsigned event)
* Put the transceiver in non-driving mode. Otherwise host
* may not detect soft-disconnection.
*/
- val = usb_phy_io_read(ci->transceiver, ULPI_FUNC_CTRL);
+ val = usb_phy_io_read(ci->usb_transceiver, ULPI_FUNC_CTRL);
val &= ~ULPI_FUNC_CTRL_OPMODE_MASK;
val |= ULPI_FUNC_CTRL_OPMODE_NONDRIVING;
- usb_phy_io_write(ci->transceiver, val, ULPI_FUNC_CTRL);
+ usb_phy_io_write(ci->usb_transceiver, val, ULPI_FUNC_CTRL);
break;
default:
dev_dbg(dev, "unknown ci_hdrc event\n");
@@ -71,7 +71,7 @@ static int ci_hdrc_msm_probe(struct platform_device *pdev)
if (IS_ERR(phy))
return PTR_ERR(phy);

- ci_hdrc_msm_platdata.phy = phy;
+ ci_hdrc_msm_platdata.usb_phy = phy;

plat_ci = ci_hdrc_add_device(&pdev->dev,
pdev->resource, pdev->num_resources,
diff --git a/drivers/usb/chipidea/core.c b/drivers/usb/chipidea/core.c
index 619d13e29995..4b93e2d6fe89 100644
--- a/drivers/usb/chipidea/core.c
+++ b/drivers/usb/chipidea/core.c
@@ -47,6 +47,7 @@
#include <linux/delay.h>
#include <linux/device.h>
#include <linux/dma-mapping.h>
+#include <linux/phy/phy.h>
#include <linux/platform_device.h>
#include <linux/module.h>
#include <linux/idr.h>
@@ -293,6 +294,46 @@ static void hw_phymode_configure(struct ci_hdrc *ci)
}

/**
+ * _ci_usb_phy_init: initialize phy taking in account both phy and usb_phy
+ * interfaces
+ * @ci: the controller
+ *
+ * This function returns an error code if the phy failed to init
+ */
+static int _ci_usb_phy_init(struct ci_hdrc *ci)
+{
+ int ret;
+
+ if (ci->transceiver) {
+ ret = phy_init(ci->transceiver);
+ if (ret) {
+ phy_exit(ci->transceiver);
+ return ret;
+ }
+ ret = phy_power_on(ci->transceiver);
+ } else {
+ ret = usb_phy_init(ci->usb_transceiver);
+ }
+
+ return ret;
+}
+
+/**
+ * _ci_usb_phy_exit: deinitialize phy taking in account both phy and usb_phy
+ * interfaces
+ * @ci: the controller
+ */
+static void ci_usb_phy_exit(struct ci_hdrc *ci)
+{
+ if (ci->transceiver) {
+ phy_power_off(ci->transceiver);
+ phy_exit(ci->transceiver);
+ } else {
+ usb_phy_shutdown(ci->usb_transceiver);
+ }
+}
+
+/**
* ci_usb_phy_init: initialize phy according to different phy type
* @ci: the controller
*
@@ -306,7 +347,7 @@ static int ci_usb_phy_init(struct ci_hdrc *ci)
case USBPHY_INTERFACE_MODE_UTMI:
case USBPHY_INTERFACE_MODE_UTMIW:
case USBPHY_INTERFACE_MODE_HSIC:
- ret = usb_phy_init(ci->transceiver);
+ ret = _ci_usb_phy_init(ci);
if (ret)
return ret;
hw_phymode_configure(ci);
@@ -314,12 +355,12 @@ static int ci_usb_phy_init(struct ci_hdrc *ci)
case USBPHY_INTERFACE_MODE_ULPI:
case USBPHY_INTERFACE_MODE_SERIAL:
hw_phymode_configure(ci);
- ret = usb_phy_init(ci->transceiver);
+ ret = _ci_usb_phy_init(ci);
if (ret)
return ret;
break;
default:
- ret = usb_phy_init(ci->transceiver);
+ ret = _ci_usb_phy_init(ci);
}

return ret;
@@ -597,21 +638,25 @@ static int ci_hdrc_probe(struct platform_device *pdev)

if (ci->platdata->phy)
ci->transceiver = ci->platdata->phy;
+ else if (ci->platdata->usb_phy)
+ ci->usb_transceiver = ci->platdata->usb_phy;
else
- ci->transceiver = devm_usb_get_phy(dev, USB_PHY_TYPE_USB2);
+ ci->transceiver = of_phy_get(dev->of_node, 0);

if (IS_ERR(ci->transceiver)) {
- ret = PTR_ERR(ci->transceiver);
/*
* if -ENXIO is returned, it means PHY layer wasn't
* enabled, so it makes no sense to return -EPROBE_DEFER
* in that case, since no PHY driver will ever probe.
*/
- if (ret == -ENXIO)
- return ret;
+ if (PTR_ERR(ci->transceiver) == -ENXIO)
+ return -ENXIO;

- dev_err(dev, "no usb2 phy configured\n");
- return -EPROBE_DEFER;
+ ci->usb_transceiver = devm_usb_get_phy(dev, USB_PHY_TYPE_USB2);
+ if (IS_ERR(ci->usb_transceiver)) {
+ dev_err(dev, "no usb2 phy configured\n");
+ return -EPROBE_DEFER;
+ }
}

ret = ci_usb_phy_init(ci);
@@ -718,7 +763,7 @@ static int ci_hdrc_probe(struct platform_device *pdev)
stop:
ci_role_destroy(ci);
deinit_phy:
- usb_phy_shutdown(ci->transceiver);
+ ci_usb_phy_exit(ci);

return ret;
}
@@ -731,7 +776,7 @@ static int ci_hdrc_remove(struct platform_device *pdev)
free_irq(ci->irq, ci);
ci_role_destroy(ci);
ci_hdrc_enter_lpm(ci, true);
- usb_phy_shutdown(ci->transceiver);
+ ci_usb_phy_exit(ci);
kfree(ci->hw_bank.regmap);

return 0;
diff --git a/drivers/usb/chipidea/debug.c b/drivers/usb/chipidea/debug.c
index 9a9702773e43..23b3deed34ba 100644
--- a/drivers/usb/chipidea/debug.c
+++ b/drivers/usb/chipidea/debug.c
@@ -219,7 +219,9 @@ int ci_otg_show(struct seq_file *s, void *unused)
fsm = &ci->fsm;

/* ------ State ----- */
- usb_otg_state_string(ci->transceiver->otg.state));
+ if (ci->usb_transceiver)
+ seq_printf(s, "OTG state: %s\n\n",
+ usb_otg_state_string(ci->usb_transceiver->otg->state));

/* ------ State Machine Variables ----- */
seq_printf(s, "a_bus_drop: %d\n", fsm->a_bus_drop);
diff --git a/drivers/usb/chipidea/host.c b/drivers/usb/chipidea/host.c
index fc7541c906a2..29fc4a3ba5a8 100644
--- a/drivers/usb/chipidea/host.c
+++ b/drivers/usb/chipidea/host.c
@@ -59,7 +59,10 @@ static int host_start(struct ci_hdrc *ci)
hcd->has_tt = 1;

hcd->power_budget = ci->platdata->power_budget;
- hcd->usb_phy = ci->transceiver;
+ if (ci->transceiver)
+ hcd->phy = ci->transceiver;
+ else
+ hcd->usb_phy = ci->usb_transceiver;

ehci = hcd_to_ehci(hcd);
ehci->caps = ci->hw_bank.cap;
@@ -85,13 +88,15 @@ static int host_start(struct ci_hdrc *ci)
if (ret) {
goto disable_reg;
} else {
- struct usb_otg *otg = ci->transceiver->otg;
+ if (ci->usb_transceiver) {
+ struct usb_otg *otg = ci->usb_transceiver->otg;
+ if (otg) {
+ otg->host = &hcd->self;
+ hcd->self.otg_port = 1;
+ }
+ }

ci->hcd = hcd;
- if (otg) {
- otg->host = &hcd->self;
- hcd->self.otg_port = 1;
- }
}

if (ci->platdata->flags & CI_HDRC_DISABLE_STREAMING)
diff --git a/drivers/usb/chipidea/otg_fsm.c b/drivers/usb/chipidea/otg_fsm.c
index d8490e758a74..ebf48ed55ac5 100644
--- a/drivers/usb/chipidea/otg_fsm.c
+++ b/drivers/usb/chipidea/otg_fsm.c
@@ -788,10 +788,12 @@ int ci_hdrc_otg_fsm_init(struct ci_hdrc *ci)
return -ENOMEM;
}

- otg->usb_phy = ci->transceiver;
+ if (ci->transceiver)
+ otg->phy = ci->transceiver;
+ else
+ otg->usb_phy = ci->usb_transceiver;
otg->gadget = &ci->gadget;
ci->fsm.otg = otg;
- ci->transceiver->otg = ci->fsm.otg;
ci->fsm.power_up = 1;
ci->fsm.id = hw_read_otgsc(ci, OTGSC_ID) ? 1 : 0;
ci->fsm.otg->state = OTG_STATE_UNDEFINED;
diff --git a/drivers/usb/chipidea/udc.c b/drivers/usb/chipidea/udc.c
index 9d2b673f90e3..a67c58117e42 100644
--- a/drivers/usb/chipidea/udc.c
+++ b/drivers/usb/chipidea/udc.c
@@ -1519,8 +1519,8 @@ static int ci_udc_vbus_draw(struct usb_gadget *_gadget, unsigned ma)
{
struct ci_hdrc *ci = container_of(_gadget, struct ci_hdrc, gadget);

- if (ci->transceiver)
- return usb_phy_set_power(ci->transceiver, ma);
+ if (ci->usb_transceiver)
+ return usb_phy_set_power(ci->usb_transceiver, ma);
return -ENOTSUPP;
}

diff --git a/include/linux/usb/chipidea.h b/include/linux/usb/chipidea.h
index bbe779f640be..a0285623b9c1 100644
--- a/include/linux/usb/chipidea.h
+++ b/include/linux/usb/chipidea.h
@@ -13,7 +13,9 @@ struct ci_hdrc_platform_data {
/* offset of the capability registers */
uintptr_t capoffset;
unsigned power_budget;
- struct usb_phy *phy;
+ struct phy *phy;
+ /* old usb_phy interface */
+ struct usb_phy *usb_phy;
enum usb_phy_interface phy_mode;
unsigned long flags;
#define CI_HDRC_REGS_SHARED BIT(0)
--
1.9.1

2014-07-09 14:41:53

by Alan Stern

[permalink] [raw]
Subject: Re: [PATCH 3/4] usb: add support to the PHY framework for HCD

On Wed, 9 Jul 2014, Antoine Ténart wrote:

> This patch adds the support to PHY framework in HCD code while keeping
> the USB PHY compatibility. Changes are done in both the HCD common code
> and in the drivers accessing its PHY. This is done in two steps:
> renaming 'phy' into 'usb_phy' and adding a new 'phy' member into the
> usb_hcd structure.

Can you split the two steps into two separate patches? It will make
them easier to review.

Alan Stern

2014-07-09 15:08:56

by Antoine Tenart

[permalink] [raw]
Subject: Re: [PATCH 3/4] usb: add support to the PHY framework for HCD

Hi Alan,

On Wed, Jul 09, 2014 at 10:41:50AM -0400, Alan Stern wrote:
> On Wed, 9 Jul 2014, Antoine T?nart wrote:
>
> > This patch adds the support to PHY framework in HCD code while keeping
> > the USB PHY compatibility. Changes are done in both the HCD common code
> > and in the drivers accessing its PHY. This is done in two steps:
> > renaming 'phy' into 'usb_phy' and adding a new 'phy' member into the
> > usb_hcd structure.
>
> Can you split the two steps into two separate patches? It will make
> them easier to review.

Sure, I was not sure how to choose the patch granularity for this
series. I'll wait a bit for people to test if this doesn't break the
existing and I'll separate this into two patches.

Thanks!

Antoine

--
Antoine T?nart, Free Electrons
Embedded Linux, Kernel and Android engineering
http://free-electrons.com

2014-07-10 13:40:41

by Felipe Balbi

[permalink] [raw]
Subject: Re: [PATCH 1/4] usb: move the OTG state from the USB PHY to the OTG structure

On Wed, Jul 09, 2014 at 12:17:13PM +0200, Antoine T?nart wrote:
> Before using the PHY framework instead of the USB PHY one, we need to
> move the OTG state into another place, since it won't be available when
> USB PHY isn't used. This patch moves the OTG state into the OTG
> structure, and makes all the needed modifications in the drivers
> using the OTG state.
>
> Signed-off-by: Antoine T?nart <[email protected]>

This looks good to me. I'm interested in what will be the best way to
merge this series :-)

--
balbi


Attachments:
(No filename) (541.00 B)
signature.asc (819.00 B)
Digital signature
Download all attachments

2014-07-10 13:41:59

by Felipe Balbi

[permalink] [raw]
Subject: Re: [PATCH 2/4] usb: add support to the PHY framework for OTG

Hi,

On Wed, Jul 09, 2014 at 12:17:14PM +0200, Antoine T?nart wrote:
> This patch adds the support to PHY framework in OTG code, and keeps the
> USB PHY compatibility. This is done in two steps: renaming 'phy' into
> 'usb_phy' and adding a new 'phy' member into the usb_otg structure.
> These modifications are done in all drivers accessing the OTG PHY.
>
> Signed-off-by: Antoine T?nart <[email protected]>

looks good to me

> ---
> drivers/phy/phy-omap-usb2.c | 6 ++--
> drivers/usb/chipidea/otg_fsm.c | 2 +-
> drivers/usb/phy/phy-ab8500-usb.c | 6 ++--
> drivers/usb/phy/phy-fsl-usb.c | 12 ++++----
> drivers/usb/phy/phy-generic.c | 2 +-
> drivers/usb/phy/phy-gpio-vbus-usb.c | 2 +-
> drivers/usb/phy/phy-isp1301-omap.c | 10 +++----
> drivers/usb/phy/phy-msm-usb.c | 59 +++++++++++++++++++------------------
> drivers/usb/phy/phy-mv-usb.c | 4 +--
> drivers/usb/phy/phy-samsung-usb2.c | 2 +-
> drivers/usb/phy/phy-tahvo.c | 8 +++--
> drivers/usb/phy/phy-ulpi.c | 6 ++--
> include/linux/usb/otg.h | 5 +++-
> 13 files changed, 65 insertions(+), 59 deletions(-)
>
> diff --git a/drivers/phy/phy-omap-usb2.c b/drivers/phy/phy-omap-usb2.c
> index 1f444f91ed7d..13d3e36e208b 100644
> --- a/drivers/phy/phy-omap-usb2.c
> +++ b/drivers/phy/phy-omap-usb2.c
> @@ -60,7 +60,7 @@ EXPORT_SYMBOL_GPL(omap_usb2_set_comparator);
>
> static int omap_usb_set_vbus(struct usb_otg *otg, bool enabled)
> {
> - struct omap_usb *phy = phy_to_omapusb(otg->phy);
> + struct omap_usb *phy = phy_to_omapusb(otg->usb_phy);
>
> if (!phy->comparator)
> return -ENODEV;
> @@ -70,7 +70,7 @@ static int omap_usb_set_vbus(struct usb_otg *otg, bool enabled)
>
> static int omap_usb_start_srp(struct usb_otg *otg)
> {
> - struct omap_usb *phy = phy_to_omapusb(otg->phy);
> + struct omap_usb *phy = phy_to_omapusb(otg->usb_phy);
>
> if (!phy->comparator)
> return -ENODEV;
> @@ -255,7 +255,7 @@ static int omap_usb2_probe(struct platform_device *pdev)
> otg->set_vbus = omap_usb_set_vbus;
> if (phy_data->flags & OMAP_USB2_HAS_START_SRP)
> otg->start_srp = omap_usb_start_srp;
> - otg->phy = &phy->phy;
> + otg->usb_phy = &phy->phy;
>
> platform_set_drvdata(pdev, phy);
> pm_runtime_enable(phy->dev);
> diff --git a/drivers/usb/chipidea/otg_fsm.c b/drivers/usb/chipidea/otg_fsm.c
> index 8cb2508a6b71..d8490e758a74 100644
> --- a/drivers/usb/chipidea/otg_fsm.c
> +++ b/drivers/usb/chipidea/otg_fsm.c
> @@ -788,7 +788,7 @@ int ci_hdrc_otg_fsm_init(struct ci_hdrc *ci)
> return -ENOMEM;
> }
>
> - otg->phy = ci->transceiver;
> + otg->usb_phy = ci->transceiver;
> otg->gadget = &ci->gadget;
> ci->fsm.otg = otg;
> ci->transceiver->otg = ci->fsm.otg;
> diff --git a/drivers/usb/phy/phy-ab8500-usb.c b/drivers/usb/phy/phy-ab8500-usb.c
> index 2d5250143ce1..3a802fa7dae2 100644
> --- a/drivers/usb/phy/phy-ab8500-usb.c
> +++ b/drivers/usb/phy/phy-ab8500-usb.c
> @@ -1056,7 +1056,7 @@ static int ab8500_usb_set_peripheral(struct usb_otg *otg,
> if (!otg)
> return -ENODEV;
>
> - ab = phy_to_ab(otg->phy);
> + ab = phy_to_ab(otg->usb_phy);
>
> ab->phy.otg->gadget = gadget;
>
> @@ -1080,7 +1080,7 @@ static int ab8500_usb_set_host(struct usb_otg *otg, struct usb_bus *host)
> if (!otg)
> return -ENODEV;
>
> - ab = phy_to_ab(otg->phy);
> + ab = phy_to_ab(otg->usb_phy);
>
> ab->phy.otg->host = host;
>
> @@ -1382,7 +1382,7 @@ static int ab8500_usb_probe(struct platform_device *pdev)
> ab->phy.set_power = ab8500_usb_set_power;
> ab->phy.otg->state = OTG_STATE_UNDEFINED;
>
> - otg->phy = &ab->phy;
> + otg->usb_phy = &ab->phy;
> otg->set_host = ab8500_usb_set_host;
> otg->set_peripheral = ab8500_usb_set_peripheral;
>
> diff --git a/drivers/usb/phy/phy-fsl-usb.c b/drivers/usb/phy/phy-fsl-usb.c
> index a22f88fb8176..548bbc4a89d9 100644
> --- a/drivers/usb/phy/phy-fsl-usb.c
> +++ b/drivers/usb/phy/phy-fsl-usb.c
> @@ -499,7 +499,7 @@ int fsl_otg_start_host(struct otg_fsm *fsm, int on)
> {
> struct usb_otg *otg = fsm->otg;
> struct device *dev;
> - struct fsl_otg *otg_dev = container_of(otg->phy, struct fsl_otg, phy);
> + struct fsl_otg *otg_dev = container_of(otg->usb_phy, struct fsl_otg, phy);
> u32 retval = 0;
>
> if (!otg->host)
> @@ -594,7 +594,7 @@ static int fsl_otg_set_host(struct usb_otg *otg, struct usb_bus *host)
> if (!otg)
> return -ENODEV;
>
> - otg_dev = container_of(otg->phy, struct fsl_otg, phy);
> + otg_dev = container_of(otg->usb_phy, struct fsl_otg, phy);
> if (otg_dev != fsl_otg_dev)
> return -ENODEV;
>
> @@ -644,7 +644,7 @@ static int fsl_otg_set_peripheral(struct usb_otg *otg,
> if (!otg)
> return -ENODEV;
>
> - otg_dev = container_of(otg->phy, struct fsl_otg, phy);
> + otg_dev = container_of(otg->usb_phy, struct fsl_otg, phy);
> VDBG("otg_dev 0x%x\n", (int)otg_dev);
> VDBG("fsl_otg_dev 0x%x\n", (int)fsl_otg_dev);
> if (otg_dev != fsl_otg_dev)
> @@ -717,7 +717,7 @@ static int fsl_otg_start_srp(struct usb_otg *otg)
> if (!otg || otg.state != OTG_STATE_B_IDLE)
> return -ENODEV;
>
> - otg_dev = container_of(otg->phy, struct fsl_otg, phy);
> + otg_dev = container_of(otg->usb_phy, struct fsl_otg, phy);
> if (otg_dev != fsl_otg_dev)
> return -ENODEV;
>
> @@ -735,7 +735,7 @@ static int fsl_otg_start_hnp(struct usb_otg *otg)
> if (!otg)
> return -ENODEV;
>
> - otg_dev = container_of(otg->phy, struct fsl_otg, phy);
> + otg_dev = container_of(otg->usb_phy, struct fsl_otg, phy);
> if (otg_dev != fsl_otg_dev)
> return -ENODEV;
>
> @@ -857,7 +857,7 @@ static int fsl_otg_conf(struct platform_device *pdev)
> fsl_otg_tc->phy.dev = &pdev->dev;
> fsl_otg_tc->phy.set_power = fsl_otg_set_power;
>
> - fsl_otg_tc->phy.otg->phy = &fsl_otg_tc->phy;
> + fsl_otg_tc->phy.otg->usb_phy = &fsl_otg_tc->phy;
> fsl_otg_tc->phy.otg->set_host = fsl_otg_set_host;
> fsl_otg_tc->phy.otg->set_peripheral = fsl_otg_set_peripheral;
> fsl_otg_tc->phy.otg->start_hnp = fsl_otg_start_hnp;
> diff --git a/drivers/usb/phy/phy-generic.c b/drivers/usb/phy/phy-generic.c
> index 280a3458ff6b..0c01bd12cabc 100644
> --- a/drivers/usb/phy/phy-generic.c
> +++ b/drivers/usb/phy/phy-generic.c
> @@ -228,7 +228,7 @@ int usb_phy_gen_create_phy(struct device *dev, struct usb_phy_generic *nop,
> nop->phy.type = type;
>
> nop->phy.otg->state = OTG_STATE_UNDEFINED;
> - nop->phy.otg->phy = &nop->phy;
> + nop->phy.otg->usb_phy = &nop->phy;
> nop->phy.otg->set_host = nop_set_host;
> nop->phy.otg->set_peripheral = nop_set_peripheral;
>
> diff --git a/drivers/usb/phy/phy-gpio-vbus-usb.c b/drivers/usb/phy/phy-gpio-vbus-usb.c
> index a4e88a28199a..0ca42bb2e661 100644
> --- a/drivers/usb/phy/phy-gpio-vbus-usb.c
> +++ b/drivers/usb/phy/phy-gpio-vbus-usb.c
> @@ -271,7 +271,7 @@ static int gpio_vbus_probe(struct platform_device *pdev)
> gpio_vbus->phy.set_suspend = gpio_vbus_set_suspend;
>
> gpio_vbus->phy.otg->state = OTG_STATE_UNDEFINED;
> - gpio_vbus->phy.otg->phy = &gpio_vbus->phy;
> + gpio_vbus->phy.otg->usb_phy = &gpio_vbus->phy;
> gpio_vbus->phy.otg->set_peripheral = gpio_vbus_set_peripheral;
>
> err = gpio_request(gpio, "vbus_detect");
> diff --git a/drivers/usb/phy/phy-isp1301-omap.c b/drivers/usb/phy/phy-isp1301-omap.c
> index 69e49be8866b..cf0bd694ed1c 100644
> --- a/drivers/usb/phy/phy-isp1301-omap.c
> +++ b/drivers/usb/phy/phy-isp1301-omap.c
> @@ -1275,7 +1275,7 @@ static int isp1301_otg_enable(struct isp1301 *isp)
> static int
> isp1301_set_host(struct usb_otg *otg, struct usb_bus *host)
> {
> - struct isp1301 *isp = container_of(otg->phy, struct isp1301, phy);
> + struct isp1301 *isp = container_of(otg->usb_phy, struct isp1301, phy);
>
> if (isp != the_transceiver)
> return -ENODEV;
> @@ -1331,7 +1331,7 @@ isp1301_set_host(struct usb_otg *otg, struct usb_bus *host)
> static int
> isp1301_set_peripheral(struct usb_otg *otg, struct usb_gadget *gadget)
> {
> - struct isp1301 *isp = container_of(otg->phy, struct isp1301, phy);
> + struct isp1301 *isp = container_of(otg->usb_phy, struct isp1301, phy);
>
> if (isp != the_transceiver)
> return -ENODEV;
> @@ -1411,7 +1411,7 @@ isp1301_set_power(struct usb_phy *dev, unsigned mA)
> static int
> isp1301_start_srp(struct usb_otg *otg)
> {
> - struct isp1301 *isp = container_of(otg->phy, struct isp1301, phy);
> + struct isp1301 *isp = container_of(otg->usb_phy, struct isp1301, phy);
> u32 otg_ctrl;
>
> if (isp != the_transceiver || isp->phy.state != OTG_STATE_B_IDLE)
> @@ -1438,7 +1438,7 @@ static int
> isp1301_start_hnp(struct usb_otg *otg)
> {
> #ifdef CONFIG_USB_OTG
> - struct isp1301 *isp = container_of(otg->phy, struct isp1301, phy);
> + struct isp1301 *isp = container_of(otg->usb_phy, struct isp1301, phy);
> u32 l;
>
> if (isp != the_transceiver)
> @@ -1583,7 +1583,7 @@ isp1301_probe(struct i2c_client *i2c, const struct i2c_device_id *id)
> isp->phy.label = DRIVER_NAME;
> isp->phy.set_power = isp1301_set_power,
>
> - isp->phy.otg->phy = &isp->phy;
> + isp->phy.otg->usb_phy = &isp->phy;
> isp->phy.otg->set_host = isp1301_set_host,
> isp->phy.otg->set_peripheral = isp1301_set_peripheral,
> isp->phy.otg->start_srp = isp1301_start_srp,
> diff --git a/drivers/usb/phy/phy-msm-usb.c b/drivers/usb/phy/phy-msm-usb.c
> index 4394397b1370..11e877964173 100644
> --- a/drivers/usb/phy/phy-msm-usb.c
> +++ b/drivers/usb/phy/phy-msm-usb.c
> @@ -708,7 +708,7 @@ static void msm_otg_start_host(struct usb_phy *phy, int on)
>
> static int msm_otg_set_host(struct usb_otg *otg, struct usb_bus *host)
> {
> - struct msm_otg *motg = container_of(otg->phy, struct msm_otg, phy);
> + struct msm_otg *motg = container_of(otg->usb_phy, struct msm_otg, phy);
> struct usb_hcd *hcd;
>
> /*
> @@ -716,14 +716,14 @@ static int msm_otg_set_host(struct usb_otg *otg, struct usb_bus *host)
> * only peripheral configuration.
> */
> if (motg->pdata->mode == USB_DR_MODE_PERIPHERAL) {
> - dev_info(otg->phy->dev, "Host mode is not supported\n");
> + dev_info(otg->usb_phy->dev, "Host mode is not supported\n");
> return -ENODEV;
> }
>
> if (!host) {
> if (otg->state == OTG_STATE_A_HOST) {
> - pm_runtime_get_sync(otg->phy->dev);
> - msm_otg_start_host(otg->phy, 0);
> + pm_runtime_get_sync(otg->usb_phy->dev);
> + msm_otg_start_host(otg->usb_phy, 0);
> otg->host = NULL;
> otg->state = OTG_STATE_UNDEFINED;
> schedule_work(&motg->sm_work);
> @@ -738,14 +738,14 @@ static int msm_otg_set_host(struct usb_otg *otg, struct usb_bus *host)
> hcd->power_budget = motg->pdata->power_budget;
>
> otg->host = host;
> - dev_dbg(otg->phy->dev, "host driver registered w/ tranceiver\n");
> + dev_dbg(otg->usb_phy->dev, "host driver registered w/ tranceiver\n");
>
> /*
> * Kick the state machine work, if peripheral is not supported
> * or peripheral is already registered with us.
> */
> if (motg->pdata->mode == USB_DR_MODE_HOST || otg->gadget) {
> - pm_runtime_get_sync(otg->phy->dev);
> + pm_runtime_get_sync(otg->usb_phy->dev);
> schedule_work(&motg->sm_work);
> }
>
> @@ -782,21 +782,21 @@ static void msm_otg_start_peripheral(struct usb_phy *phy, int on)
> static int msm_otg_set_peripheral(struct usb_otg *otg,
> struct usb_gadget *gadget)
> {
> - struct msm_otg *motg = container_of(otg->phy, struct msm_otg, phy);
> + struct msm_otg *motg = container_of(otg->usb_phy, struct msm_otg, phy);
>
> /*
> * Fail peripheral registration if this board can support
> * only host configuration.
> */
> if (motg->pdata->mode == USB_DR_MODE_HOST) {
> - dev_info(otg->phy->dev, "Peripheral mode is not supported\n");
> + dev_info(otg->usb_phy->dev, "Peripheral mode is not supported\n");
> return -ENODEV;
> }
>
> if (!gadget) {
> if (otg->state == OTG_STATE_B_PERIPHERAL) {
> - pm_runtime_get_sync(otg->phy->dev);
> - msm_otg_start_peripheral(otg->phy, 0);
> + pm_runtime_get_sync(otg->usb_phy->dev);
> + msm_otg_start_peripheral(otg->usb_phy, 0);
> otg->gadget = NULL;
> otg->state = OTG_STATE_UNDEFINED;
> schedule_work(&motg->sm_work);
> @@ -807,14 +807,15 @@ static int msm_otg_set_peripheral(struct usb_otg *otg,
> return 0;
> }
> otg->gadget = gadget;
> - dev_dbg(otg->phy->dev, "peripheral driver registered w/ tranceiver\n");
> + dev_dbg(otg->usb_phy->dev,
> + "peripheral driver registered w/ tranceiver\n");
>
> /*
> * Kick the state machine work, if host is not supported
> * or host is already registered with us.
> */
> if (motg->pdata->mode == USB_DR_MODE_PERIPHERAL || otg->host) {
> - pm_runtime_get_sync(otg->phy->dev);
> + pm_runtime_get_sync(otg->usb_phy->dev);
> schedule_work(&motg->sm_work);
> }
>
> @@ -1172,17 +1173,17 @@ static void msm_otg_sm_work(struct work_struct *w)
>
> switch (otg->state) {
> case OTG_STATE_UNDEFINED:
> - dev_dbg(otg->phy->dev, "OTG_STATE_UNDEFINED state\n");
> - msm_otg_reset(otg->phy);
> + dev_dbg(otg->usb_phy->dev, "OTG_STATE_UNDEFINED state\n");
> + msm_otg_reset(otg->usb_phy);
> msm_otg_init_sm(motg);
> otg->state = OTG_STATE_B_IDLE;
> /* FALL THROUGH */
> case OTG_STATE_B_IDLE:
> - dev_dbg(otg->phy->dev, "OTG_STATE_B_IDLE state\n");
> + dev_dbg(otg->usb_phy->dev, "OTG_STATE_B_IDLE state\n");
> if (!test_bit(ID, &motg->inputs) && otg->host) {
> /* disable BSV bit */
> writel(readl(USB_OTGSC) & ~OTGSC_BSVIE, USB_OTGSC);
> - msm_otg_start_host(otg->phy, 1);
> + msm_otg_start_host(otg->usb_phy, 1);
> otg->state = OTG_STATE_A_HOST;
> } else if (test_bit(B_SESS_VLD, &motg->inputs)) {
> switch (motg->chg_state) {
> @@ -1198,13 +1199,13 @@ static void msm_otg_sm_work(struct work_struct *w)
> case USB_CDP_CHARGER:
> msm_otg_notify_charger(motg,
> IDEV_CHG_MAX);
> - msm_otg_start_peripheral(otg->phy, 1);
> + msm_otg_start_peripheral(otg->usb_phy, 1);
> otg->state
> = OTG_STATE_B_PERIPHERAL;
> break;
> case USB_SDP_CHARGER:
> msm_otg_notify_charger(motg, IUNIT);
> - msm_otg_start_peripheral(otg->phy, 1);
> + msm_otg_start_peripheral(otg->usb_phy, 1);
> otg->state
> = OTG_STATE_B_PERIPHERAL;
> break;
> @@ -1222,8 +1223,8 @@ static void msm_otg_sm_work(struct work_struct *w)
> * is incremented in charger detection work.
> */
> if (cancel_delayed_work_sync(&motg->chg_work)) {
> - pm_runtime_put_sync(otg->phy->dev);
> - msm_otg_reset(otg->phy);
> + pm_runtime_put_sync(otg->usb_phy->dev);
> + msm_otg_reset(otg->usb_phy);
> }
> msm_otg_notify_charger(motg, 0);
> motg->chg_state = USB_CHG_STATE_UNDEFINED;
> @@ -1231,27 +1232,27 @@ static void msm_otg_sm_work(struct work_struct *w)
> }
>
> if (otg->state == OTG_STATE_B_IDLE)
> - pm_runtime_put_sync(otg->phy->dev);
> + pm_runtime_put_sync(otg->usb_phy->dev);
> break;
> case OTG_STATE_B_PERIPHERAL:
> - dev_dbg(otg->phy->dev, "OTG_STATE_B_PERIPHERAL state\n");
> + dev_dbg(otg->usb_phy->dev, "OTG_STATE_B_PERIPHERAL state\n");
> if (!test_bit(B_SESS_VLD, &motg->inputs) ||
> !test_bit(ID, &motg->inputs)) {
> msm_otg_notify_charger(motg, 0);
> - msm_otg_start_peripheral(otg->phy, 0);
> + msm_otg_start_peripheral(otg->usb_phy, 0);
> motg->chg_state = USB_CHG_STATE_UNDEFINED;
> motg->chg_type = USB_INVALID_CHARGER;
> otg->state = OTG_STATE_B_IDLE;
> - msm_otg_reset(otg->phy);
> + msm_otg_reset(otg->usb_phy);
> schedule_work(w);
> }
> break;
> case OTG_STATE_A_HOST:
> - dev_dbg(otg->phy->dev, "OTG_STATE_A_HOST state\n");
> + dev_dbg(otg->usb_phy->dev, "OTG_STATE_A_HOST state\n");
> if (test_bit(ID, &motg->inputs)) {
> - msm_otg_start_host(otg->phy, 0);
> + msm_otg_start_host(otg->usb_phy, 0);
> otg->state = OTG_STATE_B_IDLE;
> - msm_otg_reset(otg->phy);
> + msm_otg_reset(otg->usb_phy);
> schedule_work(w);
> }
> break;
> @@ -1388,7 +1389,7 @@ static ssize_t msm_otg_mode_write(struct file *file, const char __user *ubuf,
> goto out;
> }
>
> - pm_runtime_get_sync(otg->phy->dev);
> + pm_runtime_get_sync(otg->usb_phy->dev);
> schedule_work(&motg->sm_work);
> out:
> return status;
> @@ -1671,7 +1672,7 @@ static int msm_otg_probe(struct platform_device *pdev)
>
> phy->io_ops = &msm_otg_io_ops;
>
> - phy->otg->phy = &motg->phy;
> + phy->otg->usb_phy = &motg->phy;
> phy->otg->set_host = msm_otg_set_host;
> phy->otg->set_peripheral = msm_otg_set_peripheral;
>
> diff --git a/drivers/usb/phy/phy-mv-usb.c b/drivers/usb/phy/phy-mv-usb.c
> index d6b3c473f068..d948275d55e5 100644
> --- a/drivers/usb/phy/phy-mv-usb.c
> +++ b/drivers/usb/phy/phy-mv-usb.c
> @@ -56,7 +56,7 @@ static char *state_string[] = {
>
> static int mv_otg_set_vbus(struct usb_otg *otg, bool on)
> {
> - struct mv_otg *mvotg = container_of(otg->phy, struct mv_otg, phy);
> + struct mv_otg *mvotg = container_of(otg->usb_phy, struct mv_otg, phy);
> if (mvotg->pdata->set_vbus == NULL)
> return -ENODEV;
>
> @@ -718,8 +718,8 @@ static int mv_otg_probe(struct platform_device *pdev)
> mvotg->phy.otg = otg;
> mvotg->phy.label = driver_name;
>
> - otg->phy = &mvotg->phy;
> otg->state = OTG_STATE_UNDEFINED;
> + otg->usb_phy = &mvotg->phy;
> otg->set_host = mv_otg_set_host;
> otg->set_peripheral = mv_otg_set_peripheral;
> otg->set_vbus = mv_otg_set_vbus;
> diff --git a/drivers/usb/phy/phy-samsung-usb2.c b/drivers/usb/phy/phy-samsung-usb2.c
> index b3ba86627b72..2a6d8cfa8839 100644
> --- a/drivers/usb/phy/phy-samsung-usb2.c
> +++ b/drivers/usb/phy/phy-samsung-usb2.c
> @@ -420,7 +420,7 @@ static int samsung_usb2phy_probe(struct platform_device *pdev)
> return -EINVAL;
>
> sphy->phy.otg = otg;
> - sphy->phy.otg->phy = &sphy->phy;
> + sphy->phy.otg->usb_phy = &sphy->phy;
> sphy->phy.otg->set_host = samsung_usbphy_set_host;
>
> spin_lock_init(&sphy->lock);
> diff --git a/drivers/usb/phy/phy-tahvo.c b/drivers/usb/phy/phy-tahvo.c
> index cc61ee44b911..402e6af29c65 100644
> --- a/drivers/usb/phy/phy-tahvo.c
> +++ b/drivers/usb/phy/phy-tahvo.c
> @@ -196,7 +196,8 @@ static int tahvo_usb_set_suspend(struct usb_phy *dev, int suspend)
>
> static int tahvo_usb_set_host(struct usb_otg *otg, struct usb_bus *host)
> {
> - struct tahvo_usb *tu = container_of(otg->phy, struct tahvo_usb, phy);
> + struct tahvo_usb *tu = container_of(otg->usb_phy, struct tahvo_usb,
> + phy);
>
> dev_dbg(&tu->pt_dev->dev, "%s %p\n", __func__, host);
>
> @@ -225,7 +226,8 @@ static int tahvo_usb_set_host(struct usb_otg *otg, struct usb_bus *host)
> static int tahvo_usb_set_peripheral(struct usb_otg *otg,
> struct usb_gadget *gadget)
> {
> - struct tahvo_usb *tu = container_of(otg->phy, struct tahvo_usb, phy);
> + struct tahvo_usb *tu = container_of(otg->usb_phy, struct tahvo_usb,
> + phy);
>
> dev_dbg(&tu->pt_dev->dev, "%s %p\n", __func__, gadget);
>
> @@ -383,7 +385,7 @@ static int tahvo_usb_probe(struct platform_device *pdev)
> tu->phy.label = DRIVER_NAME;
> tu->phy.set_suspend = tahvo_usb_set_suspend;
>
> - tu->phy.otg->phy = &tu->phy;
> + tu->phy.otg->usb_phy = &tu->phy;
> tu->phy.otg->set_host = tahvo_usb_set_host;
> tu->phy.otg->set_peripheral = tahvo_usb_set_peripheral;
>
> diff --git a/drivers/usb/phy/phy-ulpi.c b/drivers/usb/phy/phy-ulpi.c
> index 4e3877c329f2..f48a7a21e3c2 100644
> --- a/drivers/usb/phy/phy-ulpi.c
> +++ b/drivers/usb/phy/phy-ulpi.c
> @@ -211,7 +211,7 @@ static int ulpi_init(struct usb_phy *phy)
>
> static int ulpi_set_host(struct usb_otg *otg, struct usb_bus *host)
> {
> - struct usb_phy *phy = otg->phy;
> + struct usb_phy *phy = otg->usb_phy;
> unsigned int flags = usb_phy_io_read(phy, ULPI_IFC_CTRL);
>
> if (!host) {
> @@ -237,7 +237,7 @@ static int ulpi_set_host(struct usb_otg *otg, struct usb_bus *host)
>
> static int ulpi_set_vbus(struct usb_otg *otg, bool on)
> {
> - struct usb_phy *phy = otg->phy;
> + struct usb_phy *phy = otg->usb_phy;
> unsigned int flags = usb_phy_io_read(phy, ULPI_OTG_CTRL);
>
> flags &= ~(ULPI_OTG_CTRL_DRVVBUS | ULPI_OTG_CTRL_DRVVBUS_EXT);
> @@ -276,7 +276,7 @@ otg_ulpi_create(struct usb_phy_io_ops *ops,
> phy->otg = otg;
> phy->init = ulpi_init;
>
> - otg->phy = phy;
> + otg->usb_phy = phy;
> otg->set_host = ulpi_set_host;
> otg->set_vbus = ulpi_set_vbus;
>
> diff --git a/include/linux/usb/otg.h b/include/linux/usb/otg.h
> index 33d3480c9cda..52661c5da690 100644
> --- a/include/linux/usb/otg.h
> +++ b/include/linux/usb/otg.h
> @@ -9,12 +9,15 @@
> #ifndef __LINUX_USB_OTG_H
> #define __LINUX_USB_OTG_H
>
> +#include <linux/phy/phy.h>
> #include <linux/usb/phy.h>
>
> struct usb_otg {
> u8 default_a;
>
> - struct usb_phy *phy;
> + struct phy *phy;
> + /* old usb_phy interface */
> + struct usb_phy *usb_phy;
> struct usb_bus *host;
> struct usb_gadget *gadget;
>
> --
> 1.9.1
>

--
balbi


Attachments:
(No filename) (20.46 kB)
signature.asc (819.00 B)
Digital signature
Download all attachments

2014-07-10 13:42:44

by Felipe Balbi

[permalink] [raw]
Subject: Re: [PATCH 4/4] usb: chipidea: add support to the PHY framework for ChipIdea

On Wed, Jul 09, 2014 at 12:17:16PM +0200, Antoine T?nart wrote:
> This patch adds the support to the PHY framework for ChipIdea drivers
> while keeping the USB PHY compatibility. Changes are done in both the
> ChipIdea common code and in the drivers accessing the PHY. This is done
> by renaming 'phy' into 'usb_phy' and adding a new 'phy' member into the
> ci_hdrc structre.
>
> Signed-off-by: Antoine T?nart <[email protected]>
> ---
> drivers/usb/chipidea/ci.h | 4 ++-
> drivers/usb/chipidea/ci_hdrc_imx.c | 2 +-
> drivers/usb/chipidea/ci_hdrc_msm.c | 6 ++--
> drivers/usb/chipidea/core.c | 67 +++++++++++++++++++++++++++++++-------
> drivers/usb/chipidea/debug.c | 4 ++-
> drivers/usb/chipidea/host.c | 17 ++++++----
> drivers/usb/chipidea/otg_fsm.c | 6 ++--
> drivers/usb/chipidea/udc.c | 4 +--
> include/linux/usb/chipidea.h | 4 ++-
> 9 files changed, 86 insertions(+), 28 deletions(-)
>
> diff --git a/drivers/usb/chipidea/ci.h b/drivers/usb/chipidea/ci.h
> index 9563cb56d564..139589c8ab90 100644
> --- a/drivers/usb/chipidea/ci.h
> +++ b/drivers/usb/chipidea/ci.h
> @@ -201,7 +201,9 @@ struct ci_hdrc {
>
> struct ci_hdrc_platform_data *platdata;
> int vbus_active;
> - struct usb_phy *transceiver;
> + struct phy *transceiver;
> + /* old usb_phy interface */
> + struct usb_phy *usb_transceiver;

while at that, do you mind calling all struct usb_phy pointers
'usb_phy' ?

--
balbi


Attachments:
(No filename) (1.46 kB)
signature.asc (819.00 B)
Digital signature
Download all attachments

2014-07-10 13:48:05

by Antoine Tenart

[permalink] [raw]
Subject: Re: [PATCH 1/4] usb: move the OTG state from the USB PHY to the OTG structure

Hi Felipe,

On Thu, Jul 10, 2014 at 08:40:23AM -0500, Felipe Balbi wrote:
> On Wed, Jul 09, 2014 at 12:17:13PM +0200, Antoine T?nart wrote:
> > Before using the PHY framework instead of the USB PHY one, we need to
> > move the OTG state into another place, since it won't be available when
> > USB PHY isn't used. This patch moves the OTG state into the OTG
> > structure, and makes all the needed modifications in the drivers
> > using the OTG state.
> >
> > Signed-off-by: Antoine T?nart <[email protected]>
>
> This looks good to me. I'm interested in what will be the best way to
> merge this series :-)

I was asking myself the same question :) If splits or squashes are needed
please ask. At least, I'll split the s/phy/usb_phy/ and the generic PHY
addition in two patches as Alan asked.

Antoine


--
Antoine T?nart, Free Electrons
Embedded Linux, Kernel and Android engineering
http://free-electrons.com

2014-07-10 13:51:30

by Antoine Tenart

[permalink] [raw]
Subject: Re: [PATCH 4/4] usb: chipidea: add support to the PHY framework for ChipIdea

On Thu, Jul 10, 2014 at 08:42:27AM -0500, Felipe Balbi wrote:
> On Wed, Jul 09, 2014 at 12:17:16PM +0200, Antoine T?nart wrote:
> > This patch adds the support to the PHY framework for ChipIdea drivers
> > while keeping the USB PHY compatibility. Changes are done in both the
> > ChipIdea common code and in the drivers accessing the PHY. This is done
> > by renaming 'phy' into 'usb_phy' and adding a new 'phy' member into the
> > ci_hdrc structre.
> >
> > Signed-off-by: Antoine T?nart <[email protected]>
> > ---
> > drivers/usb/chipidea/ci.h | 4 ++-
> > drivers/usb/chipidea/ci_hdrc_imx.c | 2 +-
> > drivers/usb/chipidea/ci_hdrc_msm.c | 6 ++--
> > drivers/usb/chipidea/core.c | 67 +++++++++++++++++++++++++++++++-------
> > drivers/usb/chipidea/debug.c | 4 ++-
> > drivers/usb/chipidea/host.c | 17 ++++++----
> > drivers/usb/chipidea/otg_fsm.c | 6 ++--
> > drivers/usb/chipidea/udc.c | 4 +--
> > include/linux/usb/chipidea.h | 4 ++-
> > 9 files changed, 86 insertions(+), 28 deletions(-)
> >
> > diff --git a/drivers/usb/chipidea/ci.h b/drivers/usb/chipidea/ci.h
> > index 9563cb56d564..139589c8ab90 100644
> > --- a/drivers/usb/chipidea/ci.h
> > +++ b/drivers/usb/chipidea/ci.h
> > @@ -201,7 +201,9 @@ struct ci_hdrc {
> >
> > struct ci_hdrc_platform_data *platdata;
> > int vbus_active;
> > - struct usb_phy *transceiver;
> > + struct phy *transceiver;
> > + /* old usb_phy interface */
> > + struct usb_phy *usb_transceiver;
>
> while at that, do you mind calling all struct usb_phy pointers
> 'usb_phy' ?

Not at all.
With s/usb_transceiver/usb_phy/, what about 'transceiver'?


Antoine

--
Antoine T?nart, Free Electrons
Embedded Linux, Kernel and Android engineering
http://free-electrons.com

2014-07-10 13:56:20

by Felipe Balbi

[permalink] [raw]
Subject: Re: [PATCH 4/4] usb: chipidea: add support to the PHY framework for ChipIdea

On Thu, Jul 10, 2014 at 03:51:24PM +0200, Antoine T?nart wrote:
> On Thu, Jul 10, 2014 at 08:42:27AM -0500, Felipe Balbi wrote:
> > On Wed, Jul 09, 2014 at 12:17:16PM +0200, Antoine T?nart wrote:
> > > This patch adds the support to the PHY framework for ChipIdea drivers
> > > while keeping the USB PHY compatibility. Changes are done in both the
> > > ChipIdea common code and in the drivers accessing the PHY. This is done
> > > by renaming 'phy' into 'usb_phy' and adding a new 'phy' member into the
> > > ci_hdrc structre.
> > >
> > > Signed-off-by: Antoine T?nart <[email protected]>
> > > ---
> > > drivers/usb/chipidea/ci.h | 4 ++-
> > > drivers/usb/chipidea/ci_hdrc_imx.c | 2 +-
> > > drivers/usb/chipidea/ci_hdrc_msm.c | 6 ++--
> > > drivers/usb/chipidea/core.c | 67 +++++++++++++++++++++++++++++++-------
> > > drivers/usb/chipidea/debug.c | 4 ++-
> > > drivers/usb/chipidea/host.c | 17 ++++++----
> > > drivers/usb/chipidea/otg_fsm.c | 6 ++--
> > > drivers/usb/chipidea/udc.c | 4 +--
> > > include/linux/usb/chipidea.h | 4 ++-
> > > 9 files changed, 86 insertions(+), 28 deletions(-)
> > >
> > > diff --git a/drivers/usb/chipidea/ci.h b/drivers/usb/chipidea/ci.h
> > > index 9563cb56d564..139589c8ab90 100644
> > > --- a/drivers/usb/chipidea/ci.h
> > > +++ b/drivers/usb/chipidea/ci.h
> > > @@ -201,7 +201,9 @@ struct ci_hdrc {
> > >
> > > struct ci_hdrc_platform_data *platdata;
> > > int vbus_active;
> > > - struct usb_phy *transceiver;
> > > + struct phy *transceiver;
> > > + /* old usb_phy interface */
> > > + struct usb_phy *usb_transceiver;
> >
> > while at that, do you mind calling all struct usb_phy pointers
> > 'usb_phy' ?
>
> Not at all.
> With s/usb_transceiver/usb_phy/, what about 'transceiver'?

perhaps call it phy ? That way all drivers have similar naming scheme.
Plus, I rather type 3 letters than 11 :-p

--
balbi


Attachments:
(No filename) (1.90 kB)
signature.asc (819.00 B)
Digital signature
Download all attachments

2014-07-10 14:01:14

by Antoine Tenart

[permalink] [raw]
Subject: Re: [PATCH 4/4] usb: chipidea: add support to the PHY framework for ChipIdea

On Thu, Jul 10, 2014 at 08:56:00AM -0500, Felipe Balbi wrote:
> On Thu, Jul 10, 2014 at 03:51:24PM +0200, Antoine T?nart wrote:
> > On Thu, Jul 10, 2014 at 08:42:27AM -0500, Felipe Balbi wrote:
> > > On Wed, Jul 09, 2014 at 12:17:16PM +0200, Antoine T?nart wrote:
> > > > This patch adds the support to the PHY framework for ChipIdea drivers
> > > > while keeping the USB PHY compatibility. Changes are done in both the
> > > > ChipIdea common code and in the drivers accessing the PHY. This is done
> > > > by renaming 'phy' into 'usb_phy' and adding a new 'phy' member into the
> > > > ci_hdrc structre.
> > > >
> > > > Signed-off-by: Antoine T?nart <[email protected]>
> > > > ---
> > > > drivers/usb/chipidea/ci.h | 4 ++-
> > > > drivers/usb/chipidea/ci_hdrc_imx.c | 2 +-
> > > > drivers/usb/chipidea/ci_hdrc_msm.c | 6 ++--
> > > > drivers/usb/chipidea/core.c | 67 +++++++++++++++++++++++++++++++-------
> > > > drivers/usb/chipidea/debug.c | 4 ++-
> > > > drivers/usb/chipidea/host.c | 17 ++++++----
> > > > drivers/usb/chipidea/otg_fsm.c | 6 ++--
> > > > drivers/usb/chipidea/udc.c | 4 +--
> > > > include/linux/usb/chipidea.h | 4 ++-
> > > > 9 files changed, 86 insertions(+), 28 deletions(-)
> > > >
> > > > diff --git a/drivers/usb/chipidea/ci.h b/drivers/usb/chipidea/ci.h
> > > > index 9563cb56d564..139589c8ab90 100644
> > > > --- a/drivers/usb/chipidea/ci.h
> > > > +++ b/drivers/usb/chipidea/ci.h
> > > > @@ -201,7 +201,9 @@ struct ci_hdrc {
> > > >
> > > > struct ci_hdrc_platform_data *platdata;
> > > > int vbus_active;
> > > > - struct usb_phy *transceiver;
> > > > + struct phy *transceiver;
> > > > + /* old usb_phy interface */
> > > > + struct usb_phy *usb_transceiver;
> > >
> > > while at that, do you mind calling all struct usb_phy pointers
> > > 'usb_phy' ?
> >
> > Not at all.
> > With s/usb_transceiver/usb_phy/, what about 'transceiver'?
>
> perhaps call it phy ? That way all drivers have similar naming scheme.
> Plus, I rather type 3 letters than 11 :-p

I'll update then :)


--
Antoine T?nart, Free Electrons
Embedded Linux, Kernel and Android engineering
http://free-electrons.com

2014-07-14 09:08:13

by Vivek Gautam

[permalink] [raw]
Subject: Re: [PATCH 3/4] usb: add support to the PHY framework for HCD

Hi,

CC: Sergei, Yoshihiro

On Wed, Jul 9, 2014 at 3:47 PM, Antoine Ténart
<[email protected]> wrote:
> This patch adds the support to PHY framework in HCD code while keeping
> the USB PHY compatibility. Changes are done in both the HCD common code
> and in the drivers accessing its PHY. This is done in two steps:
> renaming 'phy' into 'usb_phy' and adding a new 'phy' member into the
> usb_hcd structure.
>
> Signed-off-by: Antoine Ténart <[email protected]>
> ---
> drivers/usb/chipidea/host.c | 2 +-
> drivers/usb/core/hcd.c | 61 +++++++++++++++++++++++++++++++------------
> drivers/usb/core/hub.c | 8 +++---
> drivers/usb/host/ehci-fsl.c | 16 ++++++------
> drivers/usb/host/ehci-hub.c | 2 +-
> drivers/usb/host/ehci-msm.c | 4 +--
> drivers/usb/host/ehci-tegra.c | 16 ++++++------
> drivers/usb/host/ohci-omap.c | 20 +++++++-------
> include/linux/usb/hcd.h | 5 +++-
> 9 files changed, 82 insertions(+), 52 deletions(-)
>
> diff --git a/drivers/usb/chipidea/host.c b/drivers/usb/chipidea/host.c
> index a93d950e9468..fc7541c906a2 100644
> --- a/drivers/usb/chipidea/host.c
> +++ b/drivers/usb/chipidea/host.c
> @@ -59,7 +59,7 @@ static int host_start(struct ci_hdrc *ci)
> hcd->has_tt = 1;
>
> hcd->power_budget = ci->platdata->power_budget;
> - hcd->phy = ci->transceiver;
> + hcd->usb_phy = ci->transceiver;
>
> ehci = hcd_to_ehci(hcd);
> ehci->caps = ci->hw_bank.cap;
> diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
> index bec31e2efb88..b985af5b167c 100644
> --- a/drivers/usb/core/hcd.c
> +++ b/drivers/usb/core/hcd.c
> @@ -42,6 +42,7 @@
> #include <linux/pm_runtime.h>
> #include <linux/types.h>
>
> +#include <linux/phy/phy.h>
> #include <linux/usb.h>
> #include <linux/usb/hcd.h>
> #include <linux/usb/phy.h>
> @@ -2631,21 +2632,35 @@ int usb_add_hcd(struct usb_hcd *hcd,
> int retval;
> struct usb_device *rhdev;
>
> - if (IS_ENABLED(CONFIG_USB_PHY) && !hcd->phy) {
> - struct usb_phy *phy = usb_get_phy_dev(hcd->self.controller, 0);
> + if (IS_ENABLED(CONFIG_USB_PHY) && !hcd->phy && !hcd->usb_phy) {
> + struct phy *phy = of_phy_get(hcd->self.controller->of_node, 0);
>
> - if (IS_ERR(phy)) {
> - retval = PTR_ERR(phy);
> - if (retval == -EPROBE_DEFER)
> - return retval;
> - } else {
> - retval = usb_phy_init(phy);
> + if (!IS_ERR(phy)) {
> + retval = phy_init(hcd->phy);
> if (retval) {
> - usb_put_phy(phy);
> + phy_exit(hcd->phy);
> return retval;
> }
> + retval = phy_power_on(hcd->phy);
> hcd->phy = phy;
> hcd->remove_phy = 1;
> + } else {
> + struct usb_phy *phy =
> + usb_get_phy_dev(hcd->self.controller, 0);
> +
> + if (IS_ERR(phy)) {
> + retval = PTR_ERR(phy);
> + if (retval == -EPROBE_DEFER)
> + return retval;
> + } else {
> + retval = usb_phy_init(phy);
> + if (retval) {
> + usb_put_phy(phy);
> + return retval;
> + }
> + hcd->usb_phy = phy;
> + hcd->remove_phy = 1;
> + }
> }
> }

Just a note here:
There had already been a patch for adding the generic phy support in
usb/core/hcd.c in 3.16 cycle by
Sergei and Yoshihiro [1], though structurally a bit different, was not
picked since there wasn't any user of the patch
till then. Do you mind modifying on top of that patch

[1] https://www.mail-archive.com/[email protected]/msg43471.html

>
> @@ -2792,10 +2807,16 @@ err_allocate_root_hub:
> err_register_bus:
> hcd_buffer_destroy(hcd);
> err_remove_phy:
> - if (hcd->remove_phy && hcd->phy) {
> - usb_phy_shutdown(hcd->phy);
> - usb_put_phy(hcd->phy);
> - hcd->phy = NULL;
> + if (hcd->remove_phy) {
> + if (hcd->phy) {
> + phy_power_off(hcd->phy);
> + phy_exit(hcd->phy);
> + hcd->phy = NULL;
> + } else if (hcd->usb_phy) {
> + usb_phy_shutdown(hcd->usb_phy);
> + usb_put_phy(hcd->usb_phy);
> + hcd->usb_phy = NULL;
> + }
> }
> return retval;
> }
> @@ -2868,10 +2889,16 @@ void usb_remove_hcd(struct usb_hcd *hcd)
>
> usb_deregister_bus(&hcd->self);
> hcd_buffer_destroy(hcd);
> - if (hcd->remove_phy && hcd->phy) {
> - usb_phy_shutdown(hcd->phy);
> - usb_put_phy(hcd->phy);
> - hcd->phy = NULL;
> + if (hcd->remove_phy) {
> + if (hcd->phy) {
> + phy_power_off(hcd->phy);
> + phy_exit(hcd->phy);
> + hcd->phy = NULL;
> + } else if (hcd->usb_phy) {
> + usb_phy_shutdown(hcd->usb_phy);
> + usb_put_phy(hcd->usb_phy);
> + hcd->usb_phy = NULL;
> + }
> }
>
> usb_put_invalidate_rhdev(hcd);

[snip]



--
Best Regards
Vivek Gautam
Samsung R&D Institute, Bangalore
India

2014-07-15 09:09:49

by Antoine Tenart

[permalink] [raw]
Subject: Re: [PATCH 3/4] usb: add support to the PHY framework for HCD

Hi Vivek,

On Mon, Jul 14, 2014 at 02:38:03PM +0530, Vivek Gautam wrote:
> On Wed, Jul 9, 2014 at 3:47 PM, Antoine T?nart
> <[email protected]> wrote:
> > diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
> > index bec31e2efb88..b985af5b167c 100644
> > --- a/drivers/usb/core/hcd.c
> > +++ b/drivers/usb/core/hcd.c
> > @@ -42,6 +42,7 @@
> > #include <linux/pm_runtime.h>
> > #include <linux/types.h>
> >
> > +#include <linux/phy/phy.h>
> > #include <linux/usb.h>
> > #include <linux/usb/hcd.h>
> > #include <linux/usb/phy.h>
> > @@ -2631,21 +2632,35 @@ int usb_add_hcd(struct usb_hcd *hcd,
> > int retval;
> > struct usb_device *rhdev;
> >
> > - if (IS_ENABLED(CONFIG_USB_PHY) && !hcd->phy) {
> > - struct usb_phy *phy = usb_get_phy_dev(hcd->self.controller, 0);
> > + if (IS_ENABLED(CONFIG_USB_PHY) && !hcd->phy && !hcd->usb_phy) {
> > + struct phy *phy = of_phy_get(hcd->self.controller->of_node, 0);
> >
> > - if (IS_ERR(phy)) {
> > - retval = PTR_ERR(phy);
> > - if (retval == -EPROBE_DEFER)
> > - return retval;
> > - } else {
> > - retval = usb_phy_init(phy);
> > + if (!IS_ERR(phy)) {
> > + retval = phy_init(hcd->phy);
> > if (retval) {
> > - usb_put_phy(phy);
> > + phy_exit(hcd->phy);
> > return retval;
> > }
> > + retval = phy_power_on(hcd->phy);
> > hcd->phy = phy;
> > hcd->remove_phy = 1;
> > + } else {
> > + struct usb_phy *phy =
> > + usb_get_phy_dev(hcd->self.controller, 0);
> > +
> > + if (IS_ERR(phy)) {
> > + retval = PTR_ERR(phy);
> > + if (retval == -EPROBE_DEFER)
> > + return retval;
> > + } else {
> > + retval = usb_phy_init(phy);
> > + if (retval) {
> > + usb_put_phy(phy);
> > + return retval;
> > + }
> > + hcd->usb_phy = phy;
> > + hcd->remove_phy = 1;
> > + }
> > }
> > }
>
> Just a note here:
> There had already been a patch for adding the generic phy support in
> usb/core/hcd.c in 3.16 cycle by
> Sergei and Yoshihiro [1], though structurally a bit different, was not
> picked since there wasn't any user of the patch
> till then. Do you mind modifying on top of that patch
>
> [1] https://www.mail-archive.com/[email protected]/msg43471.html

Sure, I'll rework my series taking in account this patch. I'll cook a v2
for later today.

Thanks!

Antoine

--
Antoine T?nart, Free Electrons
Embedded Linux, Kernel and Android engineering
http://free-electrons.com

2014-07-15 11:32:43

by Peter Chen

[permalink] [raw]
Subject: Re: [PATCH 1/4] usb: move the OTG state from the USB PHY to the OTG structure

On Wed, Jul 09, 2014 at 12:17:13PM +0200, Antoine T?nart wrote:
> Before using the PHY framework instead of the USB PHY one, we need to
> move the OTG state into another place, since it won't be available when
> USB PHY isn't used. This patch moves the OTG state into the OTG
> structure, and makes all the needed modifications in the drivers
> using the OTG state.
>

Really good job, with this patch, we can split otg from usb_phy easier
next time.

Acked-by: Peter Chen <[email protected]>

> Signed-off-by: Antoine T?nart <[email protected]>
> ---
> drivers/phy/phy-omap-usb2.c | 8 +---
> drivers/usb/chipidea/debug.c | 3 +-
> drivers/usb/chipidea/otg_fsm.c | 12 ++---
> drivers/usb/common/usb-otg-fsm.c | 8 ++--
> drivers/usb/host/ohci-omap.c | 2 +-
> drivers/usb/musb/am35x.c | 28 +++++------
> drivers/usb/musb/blackfin.c | 18 +++----
> drivers/usb/musb/da8xx.c | 28 +++++------
> drivers/usb/musb/davinci.c | 18 +++----
> drivers/usb/musb/musb_core.c | 94 ++++++++++++++++++-------------------
> drivers/usb/musb/musb_dsps.c | 26 +++++-----
> drivers/usb/musb/musb_gadget.c | 36 +++++++-------
> drivers/usb/musb/musb_host.c | 8 ++--
> drivers/usb/musb/musb_virthub.c | 22 ++++-----
> drivers/usb/musb/omap2430.c | 30 ++++++------
> drivers/usb/musb/tusb6010.c | 40 ++++++++--------
> drivers/usb/musb/ux500.c | 10 ++--
> drivers/usb/phy/phy-ab8500-usb.c | 10 ++--
> drivers/usb/phy/phy-fsl-usb.c | 10 ++--
> drivers/usb/phy/phy-generic.c | 4 +-
> drivers/usb/phy/phy-gpio-vbus-usb.c | 10 ++--
> drivers/usb/phy/phy-msm-usb.c | 34 +++++++-------
> drivers/usb/phy/phy-mv-usb.c | 46 +++++++++---------
> include/linux/usb/otg.h | 2 +
> include/linux/usb/phy.h | 1 -
> 25 files changed, 252 insertions(+), 256 deletions(-)
>
> diff --git a/drivers/phy/phy-omap-usb2.c b/drivers/phy/phy-omap-usb2.c
> index 7007c11fe07d..1f444f91ed7d 100644
> --- a/drivers/phy/phy-omap-usb2.c
> +++ b/drivers/phy/phy-omap-usb2.c
> @@ -80,11 +80,9 @@ static int omap_usb_start_srp(struct usb_otg *otg)
>
> static int omap_usb_set_host(struct usb_otg *otg, struct usb_bus *host)
> {
> - struct usb_phy *phy = otg->phy;
> -
> otg->host = host;
> if (!host)
> - phy->state = OTG_STATE_UNDEFINED;
> + otg->state = OTG_STATE_UNDEFINED;
>
> return 0;
> }
> @@ -92,11 +90,9 @@ static int omap_usb_set_host(struct usb_otg *otg, struct usb_bus *host)
> static int omap_usb_set_peripheral(struct usb_otg *otg,
> struct usb_gadget *gadget)
> {
> - struct usb_phy *phy = otg->phy;
> -
> otg->gadget = gadget;
> if (!gadget)
> - phy->state = OTG_STATE_UNDEFINED;
> + otg->state = OTG_STATE_UNDEFINED;
>
> return 0;
> }
> diff --git a/drivers/usb/chipidea/debug.c b/drivers/usb/chipidea/debug.c
> index 7cccab6ff308..9a9702773e43 100644
> --- a/drivers/usb/chipidea/debug.c
> +++ b/drivers/usb/chipidea/debug.c
> @@ -219,8 +219,7 @@ int ci_otg_show(struct seq_file *s, void *unused)
> fsm = &ci->fsm;
>
> /* ------ State ----- */
> - seq_printf(s, "OTG state: %s\n\n",
> - usb_otg_state_string(ci->transceiver->state));
> + usb_otg_state_string(ci->transceiver->otg.state));
>
> /* ------ State Machine Variables ----- */
> seq_printf(s, "a_bus_drop: %d\n", fsm->a_bus_drop);
> diff --git a/drivers/usb/chipidea/otg_fsm.c b/drivers/usb/chipidea/otg_fsm.c
> index caaabc58021e..8cb2508a6b71 100644
> --- a/drivers/usb/chipidea/otg_fsm.c
> +++ b/drivers/usb/chipidea/otg_fsm.c
> @@ -328,7 +328,7 @@ static void b_ssend_srp_tmout_func(void *ptr, unsigned long indicator)
> set_tmout(ci, indicator);
>
> /* only vbus fall below B_sess_vld in b_idle state */
> - if (ci->transceiver->state == OTG_STATE_B_IDLE)
> + if (ci->fsm.otg->state == OTG_STATE_B_IDLE)
> ci_otg_queue_work(ci);
> }
>
> @@ -582,11 +582,11 @@ int ci_otg_fsm_work(struct ci_hdrc *ci)
> * when there is no gadget class driver
> */
> if (ci->fsm.id && !(ci->driver) &&
> - ci->transceiver->state < OTG_STATE_A_IDLE)
> + ci->fsm.otg->state < OTG_STATE_A_IDLE)
> return 0;
>
> if (otg_statemachine(&ci->fsm)) {
> - if (ci->transceiver->state == OTG_STATE_A_IDLE) {
> + if (ci->fsm.otg->state == OTG_STATE_A_IDLE) {
> /*
> * Further state change for cases:
> * a_idle to b_idle; or
> @@ -600,7 +600,7 @@ int ci_otg_fsm_work(struct ci_hdrc *ci)
> ci_otg_queue_work(ci);
> if (ci->id_event)
> ci->id_event = false;
> - } else if (ci->transceiver->state == OTG_STATE_B_IDLE) {
> + } else if (ci->fsm.otg->state == OTG_STATE_B_IDLE) {
> if (ci->fsm.b_sess_vld) {
> ci->fsm.power_up = 0;
> /*
> @@ -627,7 +627,7 @@ static void ci_otg_fsm_event(struct ci_hdrc *ci)
> otg_bsess_vld = hw_read_otgsc(ci, OTGSC_BSV);
> port_conn = hw_read(ci, OP_PORTSC, PORTSC_CCS);
>
> - switch (ci->transceiver->state) {
> + switch (ci->fsm.otg->state) {
> case OTG_STATE_A_WAIT_BCON:
> if (port_conn) {
> fsm->b_conn = 1;
> @@ -794,7 +794,7 @@ int ci_hdrc_otg_fsm_init(struct ci_hdrc *ci)
> ci->transceiver->otg = ci->fsm.otg;
> ci->fsm.power_up = 1;
> ci->fsm.id = hw_read_otgsc(ci, OTGSC_ID) ? 1 : 0;
> - ci->transceiver->state = OTG_STATE_UNDEFINED;
> + ci->fsm.otg->state = OTG_STATE_UNDEFINED;
> ci->fsm.ops = &ci_otg_ops;
>
> mutex_init(&ci->fsm.lock);
> diff --git a/drivers/usb/common/usb-otg-fsm.c b/drivers/usb/common/usb-otg-fsm.c
> index 98e8340a5bb1..c6b35b77dab7 100644
> --- a/drivers/usb/common/usb-otg-fsm.c
> +++ b/drivers/usb/common/usb-otg-fsm.c
> @@ -124,10 +124,10 @@ static void otg_leave_state(struct otg_fsm *fsm, enum usb_otg_state old_state)
> static int otg_set_state(struct otg_fsm *fsm, enum usb_otg_state new_state)
> {
> state_changed = 1;
> - if (fsm->otg->phy->state == new_state)
> + if (fsm->otg->state == new_state)
> return 0;
> VDBG("Set state: %s\n", usb_otg_state_string(new_state));
> - otg_leave_state(fsm, fsm->otg->phy->state);
> + otg_leave_state(fsm, fsm->otg->state);
> switch (new_state) {
> case OTG_STATE_B_IDLE:
> otg_drv_vbus(fsm, 0);
> @@ -236,7 +236,7 @@ static int otg_set_state(struct otg_fsm *fsm, enum usb_otg_state new_state)
> break;
> }
>
> - fsm->otg->phy->state = new_state;
> + fsm->otg->state = new_state;
> return 0;
> }
>
> @@ -247,7 +247,7 @@ int otg_statemachine(struct otg_fsm *fsm)
>
> mutex_lock(&fsm->lock);
>
> - state = fsm->otg->phy->state;
> + state = fsm->otg->state;
> state_changed = 0;
> /* State machine state change judgement */
>
> diff --git a/drivers/usb/host/ohci-omap.c b/drivers/usb/host/ohci-omap.c
> index c923cafcaca7..61967405b56d 100644
> --- a/drivers/usb/host/ohci-omap.c
> +++ b/drivers/usb/host/ohci-omap.c
> @@ -183,7 +183,7 @@ static void start_hnp(struct ohci_hcd *ohci)
> otg_start_hnp(hcd->phy->otg);
>
> local_irq_save(flags);
> - hcd->phy->state = OTG_STATE_A_SUSPEND;
> + hcd->phy->otg.state = OTG_STATE_A_SUSPEND;
> writel (RH_PS_PSS, &ohci->regs->roothub.portstatus [port]);
> l = omap_readl(OTG_CTRL);
> l &= ~OTG_A_BUSREQ;
> diff --git a/drivers/usb/musb/am35x.c b/drivers/usb/musb/am35x.c
> index 0a34dd859555..aef4a46399ce 100644
> --- a/drivers/usb/musb/am35x.c
> +++ b/drivers/usb/musb/am35x.c
> @@ -148,25 +148,25 @@ static void otg_timer(unsigned long _musb)
> */
> devctl = musb_readb(mregs, MUSB_DEVCTL);
> dev_dbg(musb->controller, "Poll devctl %02x (%s)\n", devctl,
> - usb_otg_state_string(musb->xceiv->state));
> + usb_otg_state_string(musb->xceiv->otg->state));
>
> spin_lock_irqsave(&musb->lock, flags);
> - switch (musb->xceiv->state) {
> + switch (musb->xceiv->otg->state) {
> case OTG_STATE_A_WAIT_BCON:
> devctl &= ~MUSB_DEVCTL_SESSION;
> musb_writeb(musb->mregs, MUSB_DEVCTL, devctl);
>
> devctl = musb_readb(musb->mregs, MUSB_DEVCTL);
> if (devctl & MUSB_DEVCTL_BDEVICE) {
> - musb->xceiv->state = OTG_STATE_B_IDLE;
> + musb->xceiv->otg->state = OTG_STATE_B_IDLE;
> MUSB_DEV_MODE(musb);
> } else {
> - musb->xceiv->state = OTG_STATE_A_IDLE;
> + musb->xceiv->otg->state = OTG_STATE_A_IDLE;
> MUSB_HST_MODE(musb);
> }
> break;
> case OTG_STATE_A_WAIT_VFALL:
> - musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
> + musb->xceiv->otg->state = OTG_STATE_A_WAIT_VRISE;
> musb_writel(musb->ctrl_base, CORE_INTR_SRC_SET_REG,
> MUSB_INTR_VBUSERROR << AM35X_INTR_USB_SHIFT);
> break;
> @@ -175,7 +175,7 @@ static void otg_timer(unsigned long _musb)
> if (devctl & MUSB_DEVCTL_BDEVICE)
> mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
> else
> - musb->xceiv->state = OTG_STATE_A_IDLE;
> + musb->xceiv->otg->state = OTG_STATE_A_IDLE;
> break;
> default:
> break;
> @@ -192,9 +192,9 @@ static void am35x_musb_try_idle(struct musb *musb, unsigned long timeout)
>
> /* Never idle if active, or when VBUS timeout is not set as host */
> if (musb->is_active || (musb->a_wait_bcon == 0 &&
> - musb->xceiv->state == OTG_STATE_A_WAIT_BCON)) {
> + musb->xceiv->otg->state == OTG_STATE_A_WAIT_BCON)) {
> dev_dbg(musb->controller, "%s active, deleting timer\n",
> - usb_otg_state_string(musb->xceiv->state));
> + usb_otg_state_string(musb->xceiv->otg->state));
> del_timer(&otg_workaround);
> last_timer = jiffies;
> return;
> @@ -207,7 +207,7 @@ static void am35x_musb_try_idle(struct musb *musb, unsigned long timeout)
> last_timer = timeout;
>
> dev_dbg(musb->controller, "%s inactive, starting idle timer for %u ms\n",
> - usb_otg_state_string(musb->xceiv->state),
> + usb_otg_state_string(musb->xceiv->otg->state),
> jiffies_to_msecs(timeout - jiffies));
> mod_timer(&otg_workaround, timeout);
> }
> @@ -277,27 +277,27 @@ static irqreturn_t am35x_musb_interrupt(int irq, void *hci)
> * devctl.
> */
> musb->int_usb &= ~MUSB_INTR_VBUSERROR;
> - musb->xceiv->state = OTG_STATE_A_WAIT_VFALL;
> + musb->xceiv->otg->state = OTG_STATE_A_WAIT_VFALL;
> mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
> WARNING("VBUS error workaround (delay coming)\n");
> } else if (drvvbus) {
> MUSB_HST_MODE(musb);
> otg->default_a = 1;
> - musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
> + musb->xceiv->otg->state = OTG_STATE_A_WAIT_VRISE;
> portstate(musb->port1_status |= USB_PORT_STAT_POWER);
> del_timer(&otg_workaround);
> } else {
> musb->is_active = 0;
> MUSB_DEV_MODE(musb);
> otg->default_a = 0;
> - musb->xceiv->state = OTG_STATE_B_IDLE;
> + musb->xceiv->otg->state = OTG_STATE_B_IDLE;
> portstate(musb->port1_status &= ~USB_PORT_STAT_POWER);
> }
>
> /* NOTE: this must complete power-on within 100 ms. */
> dev_dbg(musb->controller, "VBUS %s (%s)%s, devctl %02x\n",
> drvvbus ? "on" : "off",
> - usb_otg_state_string(musb->xceiv->state),
> + usb_otg_state_string(musb->xceiv->otg->state),
> err ? " ERROR" : "",
> devctl);
> ret = IRQ_HANDLED;
> @@ -323,7 +323,7 @@ eoi:
> }
>
> /* Poll for ID change */
> - if (musb->xceiv->state == OTG_STATE_B_IDLE)
> + if (musb->xceiv->otg->state == OTG_STATE_B_IDLE)
> mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
>
> spin_unlock_irqrestore(&musb->lock, flags);
> diff --git a/drivers/usb/musb/blackfin.c b/drivers/usb/musb/blackfin.c
> index d40d5f0b5528..a241a14e255f 100644
> --- a/drivers/usb/musb/blackfin.c
> +++ b/drivers/usb/musb/blackfin.c
> @@ -185,8 +185,8 @@ static irqreturn_t blackfin_interrupt(int irq, void *__hci)
> }
>
> /* Start sampling ID pin, when plug is removed from MUSB */
> - if ((musb->xceiv->state == OTG_STATE_B_IDLE
> - || musb->xceiv->state == OTG_STATE_A_WAIT_BCON) ||
> + if ((musb->xceiv->otg->state == OTG_STATE_B_IDLE
> + || musb->xceiv->otg->state == OTG_STATE_A_WAIT_BCON) ||
> (musb->int_usb & MUSB_INTR_DISCONNECT && is_host_active(musb))) {
> mod_timer(&musb_conn_timer, jiffies + TIMER_DELAY);
> musb->a_wait_bcon = TIMER_DELAY;
> @@ -205,7 +205,7 @@ static void musb_conn_timer_handler(unsigned long _musb)
> static u8 toggle;
>
> spin_lock_irqsave(&musb->lock, flags);
> - switch (musb->xceiv->state) {
> + switch (musb->xceiv->otg->state) {
> case OTG_STATE_A_IDLE:
> case OTG_STATE_A_WAIT_BCON:
> /* Start a new session */
> @@ -219,7 +219,7 @@ static void musb_conn_timer_handler(unsigned long _musb)
>
> if (!(val & MUSB_DEVCTL_BDEVICE)) {
> gpio_set_value(musb->config->gpio_vrsel, 1);
> - musb->xceiv->state = OTG_STATE_A_WAIT_BCON;
> + musb->xceiv->otg->state = OTG_STATE_A_WAIT_BCON;
> } else {
> gpio_set_value(musb->config->gpio_vrsel, 0);
> /* Ignore VBUSERROR and SUSPEND IRQ */
> @@ -229,7 +229,7 @@ static void musb_conn_timer_handler(unsigned long _musb)
>
> val = MUSB_INTR_SUSPEND | MUSB_INTR_VBUSERROR;
> musb_writeb(musb->mregs, MUSB_INTRUSB, val);
> - musb->xceiv->state = OTG_STATE_B_IDLE;
> + musb->xceiv->otg->state = OTG_STATE_B_IDLE;
> }
> mod_timer(&musb_conn_timer, jiffies + TIMER_DELAY);
> break;
> @@ -245,7 +245,7 @@ static void musb_conn_timer_handler(unsigned long _musb)
>
> if (!(val & MUSB_DEVCTL_BDEVICE)) {
> gpio_set_value(musb->config->gpio_vrsel, 1);
> - musb->xceiv->state = OTG_STATE_A_WAIT_BCON;
> + musb->xceiv->otg->state = OTG_STATE_A_WAIT_BCON;
> } else {
> gpio_set_value(musb->config->gpio_vrsel, 0);
>
> @@ -280,13 +280,13 @@ static void musb_conn_timer_handler(unsigned long _musb)
> break;
> default:
> dev_dbg(musb->controller, "%s state not handled\n",
> - usb_otg_state_string(musb->xceiv->state));
> + usb_otg_state_string(musb->xceiv->otg->state));
> break;
> }
> spin_unlock_irqrestore(&musb->lock, flags);
>
> dev_dbg(musb->controller, "state is %s\n",
> - usb_otg_state_string(musb->xceiv->state));
> + usb_otg_state_string(musb->xceiv->otg->state));
> }
>
> static void bfin_musb_enable(struct musb *musb)
> @@ -307,7 +307,7 @@ static void bfin_musb_set_vbus(struct musb *musb, int is_on)
>
> dev_dbg(musb->controller, "VBUS %s, devctl %02x "
> /* otg %3x conf %08x prcm %08x */ "\n",
> - usb_otg_state_string(musb->xceiv->state),
> + usb_otg_state_string(musb->xceiv->otg->state),
> musb_readb(musb->mregs, MUSB_DEVCTL));
> }
>
> diff --git a/drivers/usb/musb/da8xx.c b/drivers/usb/musb/da8xx.c
> index 058775e647ad..527c7fe60ece 100644
> --- a/drivers/usb/musb/da8xx.c
> +++ b/drivers/usb/musb/da8xx.c
> @@ -198,20 +198,20 @@ static void otg_timer(unsigned long _musb)
> */
> devctl = musb_readb(mregs, MUSB_DEVCTL);
> dev_dbg(musb->controller, "Poll devctl %02x (%s)\n", devctl,
> - usb_otg_state_string(musb->xceiv->state));
> + usb_otg_state_string(musb->xceiv->otg->state));
>
> spin_lock_irqsave(&musb->lock, flags);
> - switch (musb->xceiv->state) {
> + switch (musb->xceiv->otg->state) {
> case OTG_STATE_A_WAIT_BCON:
> devctl &= ~MUSB_DEVCTL_SESSION;
> musb_writeb(musb->mregs, MUSB_DEVCTL, devctl);
>
> devctl = musb_readb(musb->mregs, MUSB_DEVCTL);
> if (devctl & MUSB_DEVCTL_BDEVICE) {
> - musb->xceiv->state = OTG_STATE_B_IDLE;
> + musb->xceiv->otg->state = OTG_STATE_B_IDLE;
> MUSB_DEV_MODE(musb);
> } else {
> - musb->xceiv->state = OTG_STATE_A_IDLE;
> + musb->xceiv->otg->state = OTG_STATE_A_IDLE;
> MUSB_HST_MODE(musb);
> }
> break;
> @@ -226,7 +226,7 @@ static void otg_timer(unsigned long _musb)
> mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
> break;
> }
> - musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
> + musb->xceiv->otg->state = OTG_STATE_A_WAIT_VRISE;
> musb_writel(musb->ctrl_base, DA8XX_USB_INTR_SRC_SET_REG,
> MUSB_INTR_VBUSERROR << DA8XX_INTR_USB_SHIFT);
> break;
> @@ -248,7 +248,7 @@ static void otg_timer(unsigned long _musb)
> if (devctl & MUSB_DEVCTL_BDEVICE)
> mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
> else
> - musb->xceiv->state = OTG_STATE_A_IDLE;
> + musb->xceiv->otg->state = OTG_STATE_A_IDLE;
> break;
> default:
> break;
> @@ -265,9 +265,9 @@ static void da8xx_musb_try_idle(struct musb *musb, unsigned long timeout)
>
> /* Never idle if active, or when VBUS timeout is not set as host */
> if (musb->is_active || (musb->a_wait_bcon == 0 &&
> - musb->xceiv->state == OTG_STATE_A_WAIT_BCON)) {
> + musb->xceiv->otg->state == OTG_STATE_A_WAIT_BCON)) {
> dev_dbg(musb->controller, "%s active, deleting timer\n",
> - usb_otg_state_string(musb->xceiv->state));
> + usb_otg_state_string(musb->xceiv->otg->state));
> del_timer(&otg_workaround);
> last_timer = jiffies;
> return;
> @@ -280,7 +280,7 @@ static void da8xx_musb_try_idle(struct musb *musb, unsigned long timeout)
> last_timer = timeout;
>
> dev_dbg(musb->controller, "%s inactive, starting idle timer for %u ms\n",
> - usb_otg_state_string(musb->xceiv->state),
> + usb_otg_state_string(musb->xceiv->otg->state),
> jiffies_to_msecs(timeout - jiffies));
> mod_timer(&otg_workaround, timeout);
> }
> @@ -341,26 +341,26 @@ static irqreturn_t da8xx_musb_interrupt(int irq, void *hci)
> * devctl.
> */
> musb->int_usb &= ~MUSB_INTR_VBUSERROR;
> - musb->xceiv->state = OTG_STATE_A_WAIT_VFALL;
> + musb->xceiv->otg->state = OTG_STATE_A_WAIT_VFALL;
> mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
> WARNING("VBUS error workaround (delay coming)\n");
> } else if (drvvbus) {
> MUSB_HST_MODE(musb);
> otg->default_a = 1;
> - musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
> + musb->xceiv->otg->state = OTG_STATE_A_WAIT_VRISE;
> portstate(musb->port1_status |= USB_PORT_STAT_POWER);
> del_timer(&otg_workaround);
> } else {
> musb->is_active = 0;
> MUSB_DEV_MODE(musb);
> otg->default_a = 0;
> - musb->xceiv->state = OTG_STATE_B_IDLE;
> + musb->xceiv->otg->state = OTG_STATE_B_IDLE;
> portstate(musb->port1_status &= ~USB_PORT_STAT_POWER);
> }
>
> dev_dbg(musb->controller, "VBUS %s (%s)%s, devctl %02x\n",
> drvvbus ? "on" : "off",
> - usb_otg_state_string(musb->xceiv->state),
> + usb_otg_state_string(musb->xceiv->otg->state),
> err ? " ERROR" : "",
> devctl);
> ret = IRQ_HANDLED;
> @@ -375,7 +375,7 @@ static irqreturn_t da8xx_musb_interrupt(int irq, void *hci)
> musb_writel(reg_base, DA8XX_USB_END_OF_INTR_REG, 0);
>
> /* Poll for ID change */
> - if (musb->xceiv->state == OTG_STATE_B_IDLE)
> + if (musb->xceiv->otg->state == OTG_STATE_B_IDLE)
> mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
>
> spin_unlock_irqrestore(&musb->lock, flags);
> diff --git a/drivers/usb/musb/davinci.c b/drivers/usb/musb/davinci.c
> index de8492b06e46..c9b3fdb1bb8b 100644
> --- a/drivers/usb/musb/davinci.c
> +++ b/drivers/usb/musb/davinci.c
> @@ -214,10 +214,10 @@ static void otg_timer(unsigned long _musb)
> */
> devctl = musb_readb(mregs, MUSB_DEVCTL);
> dev_dbg(musb->controller, "poll devctl %02x (%s)\n", devctl,
> - usb_otg_state_string(musb->xceiv->state));
> + usb_otg_state_string(musb->xceiv->otg->state));
>
> spin_lock_irqsave(&musb->lock, flags);
> - switch (musb->xceiv->state) {
> + switch (musb->xceiv->otg->state) {
> case OTG_STATE_A_WAIT_VFALL:
> /* Wait till VBUS falls below SessionEnd (~0.2V); the 1.3 RTL
> * seems to mis-handle session "start" otherwise (or in our
> @@ -228,7 +228,7 @@ static void otg_timer(unsigned long _musb)
> mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
> break;
> }
> - musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
> + musb->xceiv->otg->state = OTG_STATE_A_WAIT_VRISE;
> musb_writel(musb->ctrl_base, DAVINCI_USB_INT_SET_REG,
> MUSB_INTR_VBUSERROR << DAVINCI_USB_USBINT_SHIFT);
> break;
> @@ -251,7 +251,7 @@ static void otg_timer(unsigned long _musb)
> if (devctl & MUSB_DEVCTL_BDEVICE)
> mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
> else
> - musb->xceiv->state = OTG_STATE_A_IDLE;
> + musb->xceiv->otg->state = OTG_STATE_A_IDLE;
> break;
> default:
> break;
> @@ -325,20 +325,20 @@ static irqreturn_t davinci_musb_interrupt(int irq, void *__hci)
> * to stop registering in devctl.
> */
> musb->int_usb &= ~MUSB_INTR_VBUSERROR;
> - musb->xceiv->state = OTG_STATE_A_WAIT_VFALL;
> + musb->xceiv->otg->state = OTG_STATE_A_WAIT_VFALL;
> mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
> WARNING("VBUS error workaround (delay coming)\n");
> } else if (drvvbus) {
> MUSB_HST_MODE(musb);
> otg->default_a = 1;
> - musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
> + musb->xceiv->otg->state = OTG_STATE_A_WAIT_VRISE;
> portstate(musb->port1_status |= USB_PORT_STAT_POWER);
> del_timer(&otg_workaround);
> } else {
> musb->is_active = 0;
> MUSB_DEV_MODE(musb);
> otg->default_a = 0;
> - musb->xceiv->state = OTG_STATE_B_IDLE;
> + musb->xceiv->otg->state = OTG_STATE_B_IDLE;
> portstate(musb->port1_status &= ~USB_PORT_STAT_POWER);
> }
>
> @@ -348,7 +348,7 @@ static irqreturn_t davinci_musb_interrupt(int irq, void *__hci)
> davinci_musb_source_power(musb, drvvbus, 0);
> dev_dbg(musb->controller, "VBUS %s (%s)%s, devctl %02x\n",
> drvvbus ? "on" : "off",
> - usb_otg_state_string(musb->xceiv->state),
> + usb_otg_state_string(musb->xceiv->otg->state),
> err ? " ERROR" : "",
> devctl);
> retval = IRQ_HANDLED;
> @@ -361,7 +361,7 @@ static irqreturn_t davinci_musb_interrupt(int irq, void *__hci)
> musb_writel(tibase, DAVINCI_USB_EOI_REG, 0);
>
> /* poll for ID change */
> - if (musb->xceiv->state == OTG_STATE_B_IDLE)
> + if (musb->xceiv->otg->state == OTG_STATE_B_IDLE)
> mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
>
> spin_unlock_irqrestore(&musb->lock, flags);
> diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c
> index eff3c5cf84f4..b8296ff103a1 100644
> --- a/drivers/usb/musb/musb_core.c
> +++ b/drivers/usb/musb/musb_core.c
> @@ -360,23 +360,23 @@ static void musb_otg_timer_func(unsigned long data)
> unsigned long flags;
>
> spin_lock_irqsave(&musb->lock, flags);
> - switch (musb->xceiv->state) {
> + switch (musb->xceiv->otg->state) {
> case OTG_STATE_B_WAIT_ACON:
> dev_dbg(musb->controller, "HNP: b_wait_acon timeout; back to b_peripheral\n");
> musb_g_disconnect(musb);
> - musb->xceiv->state = OTG_STATE_B_PERIPHERAL;
> + musb->xceiv->otg->state = OTG_STATE_B_PERIPHERAL;
> musb->is_active = 0;
> break;
> case OTG_STATE_A_SUSPEND:
> case OTG_STATE_A_WAIT_BCON:
> dev_dbg(musb->controller, "HNP: %s timeout\n",
> - usb_otg_state_string(musb->xceiv->state));
> + usb_otg_state_string(musb->xceiv->otg->state));
> musb_platform_set_vbus(musb, 0);
> - musb->xceiv->state = OTG_STATE_A_WAIT_VFALL;
> + musb->xceiv->otg->state = OTG_STATE_A_WAIT_VFALL;
> break;
> default:
> dev_dbg(musb->controller, "HNP: Unhandled mode %s\n",
> - usb_otg_state_string(musb->xceiv->state));
> + usb_otg_state_string(musb->xceiv->otg->state));
> }
> spin_unlock_irqrestore(&musb->lock, flags);
> }
> @@ -391,19 +391,19 @@ void musb_hnp_stop(struct musb *musb)
> u8 reg;
>
> dev_dbg(musb->controller, "HNP: stop from %s\n",
> - usb_otg_state_string(musb->xceiv->state));
> + usb_otg_state_string(musb->xceiv->otg->state));
>
> - switch (musb->xceiv->state) {
> + switch (musb->xceiv->otg->state) {
> case OTG_STATE_A_PERIPHERAL:
> musb_g_disconnect(musb);
> dev_dbg(musb->controller, "HNP: back to %s\n",
> - usb_otg_state_string(musb->xceiv->state));
> + usb_otg_state_string(musb->xceiv->otg->state));
> break;
> case OTG_STATE_B_HOST:
> dev_dbg(musb->controller, "HNP: Disabling HR\n");
> if (hcd)
> hcd->self.is_b_host = 0;
> - musb->xceiv->state = OTG_STATE_B_PERIPHERAL;
> + musb->xceiv->otg->state = OTG_STATE_B_PERIPHERAL;
> MUSB_DEV_MODE(musb);
> reg = musb_readb(mbase, MUSB_POWER);
> reg |= MUSB_POWER_SUSPENDM;
> @@ -412,7 +412,7 @@ void musb_hnp_stop(struct musb *musb)
> break;
> default:
> dev_dbg(musb->controller, "HNP: Stopping in unknown state %s\n",
> - usb_otg_state_string(musb->xceiv->state));
> + usb_otg_state_string(musb->xceiv->otg->state));
> }
>
> /*
> @@ -449,13 +449,13 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,
> */
> if (int_usb & MUSB_INTR_RESUME) {
> handled = IRQ_HANDLED;
> - dev_dbg(musb->controller, "RESUME (%s)\n", usb_otg_state_string(musb->xceiv->state));
> + dev_dbg(musb->controller, "RESUME (%s)\n", usb_otg_state_string(musb->xceiv->otg->state));
>
> if (devctl & MUSB_DEVCTL_HM) {
> void __iomem *mbase = musb->mregs;
> u8 power;
>
> - switch (musb->xceiv->state) {
> + switch (musb->xceiv->otg->state) {
> case OTG_STATE_A_SUSPEND:
> /* remote wakeup? later, GetPortStatus
> * will stop RESUME signaling
> @@ -482,25 +482,25 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,
> &musb->finish_resume_work,
> msecs_to_jiffies(20));
>
> - musb->xceiv->state = OTG_STATE_A_HOST;
> + musb->xceiv->otg->state = OTG_STATE_A_HOST;
> musb->is_active = 1;
> musb_host_resume_root_hub(musb);
> break;
> case OTG_STATE_B_WAIT_ACON:
> - musb->xceiv->state = OTG_STATE_B_PERIPHERAL;
> + musb->xceiv->otg->state = OTG_STATE_B_PERIPHERAL;
> musb->is_active = 1;
> MUSB_DEV_MODE(musb);
> break;
> default:
> WARNING("bogus %s RESUME (%s)\n",
> "host",
> - usb_otg_state_string(musb->xceiv->state));
> + usb_otg_state_string(musb->xceiv->otg->state));
> }
> } else {
> - switch (musb->xceiv->state) {
> + switch (musb->xceiv->otg->state) {
> case OTG_STATE_A_SUSPEND:
> /* possibly DISCONNECT is upcoming */
> - musb->xceiv->state = OTG_STATE_A_HOST;
> + musb->xceiv->otg->state = OTG_STATE_A_HOST;
> musb_host_resume_root_hub(musb);
> break;
> case OTG_STATE_B_WAIT_ACON:
> @@ -523,7 +523,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,
> default:
> WARNING("bogus %s RESUME (%s)\n",
> "peripheral",
> - usb_otg_state_string(musb->xceiv->state));
> + usb_otg_state_string(musb->xceiv->otg->state));
> }
> }
> }
> @@ -539,7 +539,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,
> }
>
> dev_dbg(musb->controller, "SESSION_REQUEST (%s)\n",
> - usb_otg_state_string(musb->xceiv->state));
> + usb_otg_state_string(musb->xceiv->otg->state));
>
> /* IRQ arrives from ID pin sense or (later, if VBUS power
> * is removed) SRP. responses are time critical:
> @@ -550,7 +550,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,
> */
> musb_writeb(mbase, MUSB_DEVCTL, MUSB_DEVCTL_SESSION);
> musb->ep0_stage = MUSB_EP0_START;
> - musb->xceiv->state = OTG_STATE_A_IDLE;
> + musb->xceiv->otg->state = OTG_STATE_A_IDLE;
> MUSB_HST_MODE(musb);
> musb_platform_set_vbus(musb, 1);
>
> @@ -576,7 +576,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,
> * REVISIT: do delays from lots of DEBUG_KERNEL checks
> * make trouble here, keeping VBUS < 4.4V ?
> */
> - switch (musb->xceiv->state) {
> + switch (musb->xceiv->otg->state) {
> case OTG_STATE_A_HOST:
> /* recovery is dicey once we've gotten past the
> * initial stages of enumeration, but if VBUS
> @@ -605,7 +605,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,
>
> dev_printk(ignore ? KERN_DEBUG : KERN_ERR, musb->controller,
> "VBUS_ERROR in %s (%02x, %s), retry #%d, port1 %08x\n",
> - usb_otg_state_string(musb->xceiv->state),
> + usb_otg_state_string(musb->xceiv->otg->state),
> devctl,
> ({ char *s;
> switch (devctl & MUSB_DEVCTL_VBUS) {
> @@ -630,10 +630,10 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,
>
> if (int_usb & MUSB_INTR_SUSPEND) {
> dev_dbg(musb->controller, "SUSPEND (%s) devctl %02x\n",
> - usb_otg_state_string(musb->xceiv->state), devctl);
> + usb_otg_state_string(musb->xceiv->otg->state), devctl);
> handled = IRQ_HANDLED;
>
> - switch (musb->xceiv->state) {
> + switch (musb->xceiv->otg->state) {
> case OTG_STATE_A_PERIPHERAL:
> /* We also come here if the cable is removed, since
> * this silicon doesn't report ID-no-longer-grounded.
> @@ -657,7 +657,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,
> musb_g_suspend(musb);
> musb->is_active = musb->g.b_hnp_enable;
> if (musb->is_active) {
> - musb->xceiv->state = OTG_STATE_B_WAIT_ACON;
> + musb->xceiv->otg->state = OTG_STATE_B_WAIT_ACON;
> dev_dbg(musb->controller, "HNP: Setting timer for b_ase0_brst\n");
> mod_timer(&musb->otg_timer, jiffies
> + msecs_to_jiffies(
> @@ -670,7 +670,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,
> + msecs_to_jiffies(musb->a_wait_bcon));
> break;
> case OTG_STATE_A_HOST:
> - musb->xceiv->state = OTG_STATE_A_SUSPEND;
> + musb->xceiv->otg->state = OTG_STATE_A_SUSPEND;
> musb->is_active = musb->hcd->self.b_hnp_enable;
> break;
> case OTG_STATE_B_HOST:
> @@ -713,7 +713,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,
> musb->port1_status |= USB_PORT_STAT_LOW_SPEED;
>
> /* indicate new connection to OTG machine */
> - switch (musb->xceiv->state) {
> + switch (musb->xceiv->otg->state) {
> case OTG_STATE_B_PERIPHERAL:
> if (int_usb & MUSB_INTR_SUSPEND) {
> dev_dbg(musb->controller, "HNP: SUSPEND+CONNECT, now b_host\n");
> @@ -725,7 +725,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,
> case OTG_STATE_B_WAIT_ACON:
> dev_dbg(musb->controller, "HNP: CONNECT, now b_host\n");
> b_host:
> - musb->xceiv->state = OTG_STATE_B_HOST;
> + musb->xceiv->otg->state = OTG_STATE_B_HOST;
> if (musb->hcd)
> musb->hcd->self.is_b_host = 1;
> del_timer(&musb->otg_timer);
> @@ -733,7 +733,7 @@ b_host:
> default:
> if ((devctl & MUSB_DEVCTL_VBUS)
> == (3 << MUSB_DEVCTL_VBUS_SHIFT)) {
> - musb->xceiv->state = OTG_STATE_A_HOST;
> + musb->xceiv->otg->state = OTG_STATE_A_HOST;
> if (hcd)
> hcd->self.is_b_host = 0;
> }
> @@ -743,16 +743,16 @@ b_host:
> musb_host_poke_root_hub(musb);
>
> dev_dbg(musb->controller, "CONNECT (%s) devctl %02x\n",
> - usb_otg_state_string(musb->xceiv->state), devctl);
> + usb_otg_state_string(musb->xceiv->otg->state), devctl);
> }
>
> if (int_usb & MUSB_INTR_DISCONNECT) {
> dev_dbg(musb->controller, "DISCONNECT (%s) as %s, devctl %02x\n",
> - usb_otg_state_string(musb->xceiv->state),
> + usb_otg_state_string(musb->xceiv->otg->state),
> MUSB_MODE(musb), devctl);
> handled = IRQ_HANDLED;
>
> - switch (musb->xceiv->state) {
> + switch (musb->xceiv->otg->state) {
> case OTG_STATE_A_HOST:
> case OTG_STATE_A_SUSPEND:
> musb_host_resume_root_hub(musb);
> @@ -770,7 +770,7 @@ b_host:
> musb_root_disconnect(musb);
> if (musb->hcd)
> musb->hcd->self.is_b_host = 0;
> - musb->xceiv->state = OTG_STATE_B_PERIPHERAL;
> + musb->xceiv->otg->state = OTG_STATE_B_PERIPHERAL;
> MUSB_DEV_MODE(musb);
> musb_g_disconnect(musb);
> break;
> @@ -786,7 +786,7 @@ b_host:
> break;
> default:
> WARNING("unhandled DISCONNECT transition (%s)\n",
> - usb_otg_state_string(musb->xceiv->state));
> + usb_otg_state_string(musb->xceiv->otg->state));
> break;
> }
> }
> @@ -812,15 +812,15 @@ b_host:
> }
> } else {
> dev_dbg(musb->controller, "BUS RESET as %s\n",
> - usb_otg_state_string(musb->xceiv->state));
> - switch (musb->xceiv->state) {
> + usb_otg_state_string(musb->xceiv->otg->state));
> + switch (musb->xceiv->otg->state) {
> case OTG_STATE_A_SUSPEND:
> musb_g_reset(musb);
> /* FALLTHROUGH */
> case OTG_STATE_A_WAIT_BCON: /* OPT TD.4.7-900ms */
> /* never use invalid T(a_wait_bcon) */
> dev_dbg(musb->controller, "HNP: in %s, %d msec timeout\n",
> - usb_otg_state_string(musb->xceiv->state),
> + usb_otg_state_string(musb->xceiv->otg->state),
> TA_WAIT_BCON(musb));
> mod_timer(&musb->otg_timer, jiffies
> + msecs_to_jiffies(TA_WAIT_BCON(musb)));
> @@ -831,19 +831,19 @@ b_host:
> break;
> case OTG_STATE_B_WAIT_ACON:
> dev_dbg(musb->controller, "HNP: RESET (%s), to b_peripheral\n",
> - usb_otg_state_string(musb->xceiv->state));
> - musb->xceiv->state = OTG_STATE_B_PERIPHERAL;
> + usb_otg_state_string(musb->xceiv->otg->state));
> + musb->xceiv->otg->state = OTG_STATE_B_PERIPHERAL;
> musb_g_reset(musb);
> break;
> case OTG_STATE_B_IDLE:
> - musb->xceiv->state = OTG_STATE_B_PERIPHERAL;
> + musb->xceiv->otg->state = OTG_STATE_B_PERIPHERAL;
> /* FALLTHROUGH */
> case OTG_STATE_B_PERIPHERAL:
> musb_g_reset(musb);
> break;
> default:
> dev_dbg(musb->controller, "Unhandled BUS RESET as %s\n",
> - usb_otg_state_string(musb->xceiv->state));
> + usb_otg_state_string(musb->xceiv->otg->state));
> }
> }
> }
> @@ -1631,7 +1631,7 @@ musb_mode_show(struct device *dev, struct device_attribute *attr, char *buf)
> int ret = -EINVAL;
>
> spin_lock_irqsave(&musb->lock, flags);
> - ret = sprintf(buf, "%s\n", usb_otg_state_string(musb->xceiv->state));
> + ret = sprintf(buf, "%s\n", usb_otg_state_string(musb->xceiv->otg->state));
> spin_unlock_irqrestore(&musb->lock, flags);
>
> return ret;
> @@ -1676,7 +1676,7 @@ musb_vbus_store(struct device *dev, struct device_attribute *attr,
> spin_lock_irqsave(&musb->lock, flags);
> /* force T(a_wait_bcon) to be zero/unlimited *OR* valid */
> musb->a_wait_bcon = val ? max_t(int, val, OTG_TIME_A_WAIT_BCON) : 0 ;
> - if (musb->xceiv->state == OTG_STATE_A_WAIT_BCON)
> + if (musb->xceiv->otg->state == OTG_STATE_A_WAIT_BCON)
> musb->is_active = 0;
> musb_platform_try_idle(musb, jiffies + msecs_to_jiffies(val));
> spin_unlock_irqrestore(&musb->lock, flags);
> @@ -1744,8 +1744,8 @@ static void musb_irq_work(struct work_struct *data)
> {
> struct musb *musb = container_of(data, struct musb, irq_work);
>
> - if (musb->xceiv->state != musb->xceiv_old_state) {
> - musb->xceiv_old_state = musb->xceiv->state;
> + if (musb->xceiv->otg->state != musb->xceiv_old_state) {
> + musb->xceiv_old_state = musb->xceiv->otg->state;
> sysfs_notify(&musb->controller->kobj, NULL, "mode");
> }
> }
> @@ -1982,10 +1982,10 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl)
>
> if (musb->xceiv->otg->default_a) {
> MUSB_HST_MODE(musb);
> - musb->xceiv->state = OTG_STATE_A_IDLE;
> + musb->xceiv->otg->state = OTG_STATE_A_IDLE;
> } else {
> MUSB_DEV_MODE(musb);
> - musb->xceiv->state = OTG_STATE_B_IDLE;
> + musb->xceiv->otg->state = OTG_STATE_B_IDLE;
> }
>
> switch (musb->port_mode) {
> diff --git a/drivers/usb/musb/musb_dsps.c b/drivers/usb/musb/musb_dsps.c
> index 09529f94e72d..8e98d8eee3cf 100644
> --- a/drivers/usb/musb/musb_dsps.c
> +++ b/drivers/usb/musb/musb_dsps.c
> @@ -170,9 +170,9 @@ static void dsps_musb_try_idle(struct musb *musb, unsigned long timeout)
>
> /* Never idle if active, or when VBUS timeout is not set as host */
> if (musb->is_active || (musb->a_wait_bcon == 0 &&
> - musb->xceiv->state == OTG_STATE_A_WAIT_BCON)) {
> + musb->xceiv->otg->state == OTG_STATE_A_WAIT_BCON)) {
> dev_dbg(musb->controller, "%s active, deleting timer\n",
> - usb_otg_state_string(musb->xceiv->state));
> + usb_otg_state_string(musb->xceiv->otg->state));
> del_timer(&glue->timer);
> glue->last_timer = jiffies;
> return;
> @@ -192,7 +192,7 @@ static void dsps_musb_try_idle(struct musb *musb, unsigned long timeout)
> glue->last_timer = timeout;
>
> dev_dbg(musb->controller, "%s inactive, starting idle timer for %u ms\n",
> - usb_otg_state_string(musb->xceiv->state),
> + usb_otg_state_string(musb->xceiv->otg->state),
> jiffies_to_msecs(timeout - jiffies));
> mod_timer(&glue->timer, timeout);
> }
> @@ -256,10 +256,10 @@ static void otg_timer(unsigned long _musb)
> */
> devctl = dsps_readb(mregs, MUSB_DEVCTL);
> dev_dbg(musb->controller, "Poll devctl %02x (%s)\n", devctl,
> - usb_otg_state_string(musb->xceiv->state));
> + usb_otg_state_string(musb->xceiv->otg->state));
>
> spin_lock_irqsave(&musb->lock, flags);
> - switch (musb->xceiv->state) {
> + switch (musb->xceiv->otg->state) {
> case OTG_STATE_A_WAIT_BCON:
> dsps_writeb(musb->mregs, MUSB_DEVCTL, 0);
> skip_session = 1;
> @@ -268,10 +268,10 @@ static void otg_timer(unsigned long _musb)
> case OTG_STATE_A_IDLE:
> case OTG_STATE_B_IDLE:
> if (devctl & MUSB_DEVCTL_BDEVICE) {
> - musb->xceiv->state = OTG_STATE_B_IDLE;
> + musb->xceiv->otg->state = OTG_STATE_B_IDLE;
> MUSB_DEV_MODE(musb);
> } else {
> - musb->xceiv->state = OTG_STATE_A_IDLE;
> + musb->xceiv->otg->state = OTG_STATE_A_IDLE;
> MUSB_HST_MODE(musb);
> }
> if (!(devctl & MUSB_DEVCTL_SESSION) && !skip_session)
> @@ -279,7 +279,7 @@ static void otg_timer(unsigned long _musb)
> mod_timer(&glue->timer, jiffies + wrp->poll_seconds * HZ);
> break;
> case OTG_STATE_A_WAIT_VFALL:
> - musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
> + musb->xceiv->otg->state = OTG_STATE_A_WAIT_VRISE;
> dsps_writel(musb->ctrl_base, wrp->coreintr_set,
> MUSB_INTR_VBUSERROR << wrp->usb_shift);
> break;
> @@ -364,26 +364,26 @@ static irqreturn_t dsps_interrupt(int irq, void *hci)
> * devctl.
> */
> musb->int_usb &= ~MUSB_INTR_VBUSERROR;
> - musb->xceiv->state = OTG_STATE_A_WAIT_VFALL;
> + musb->xceiv->otg->state = OTG_STATE_A_WAIT_VFALL;
> mod_timer(&glue->timer,
> jiffies + wrp->poll_seconds * HZ);
> WARNING("VBUS error workaround (delay coming)\n");
> } else if (drvvbus) {
> MUSB_HST_MODE(musb);
> musb->xceiv->otg->default_a = 1;
> - musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
> + musb->xceiv->otg->state = OTG_STATE_A_WAIT_VRISE;
> del_timer(&glue->timer);
> } else {
> musb->is_active = 0;
> MUSB_DEV_MODE(musb);
> musb->xceiv->otg->default_a = 0;
> - musb->xceiv->state = OTG_STATE_B_IDLE;
> + musb->xceiv->otg->state = OTG_STATE_B_IDLE;
> }
>
> /* NOTE: this must complete power-on within 100 ms. */
> dev_dbg(musb->controller, "VBUS %s (%s)%s, devctl %02x\n",
> drvvbus ? "on" : "off",
> - usb_otg_state_string(musb->xceiv->state),
> + usb_otg_state_string(musb->xceiv->otg->state),
> err ? " ERROR" : "",
> devctl);
> ret = IRQ_HANDLED;
> @@ -393,7 +393,7 @@ static irqreturn_t dsps_interrupt(int irq, void *hci)
> ret |= musb_interrupt(musb);
>
> /* Poll for ID change in OTG port mode */
> - if (musb->xceiv->state == OTG_STATE_B_IDLE &&
> + if (musb->xceiv->otg->state == OTG_STATE_B_IDLE &&
> musb->port_mode == MUSB_PORT_MODE_DUAL_ROLE)
> mod_timer(&glue->timer, jiffies + wrp->poll_seconds * HZ);
> out:
> diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c
> index d4aa779339f1..b811a5e9ce4f 100644
> --- a/drivers/usb/musb/musb_gadget.c
> +++ b/drivers/usb/musb/musb_gadget.c
> @@ -1546,7 +1546,7 @@ static int musb_gadget_wakeup(struct usb_gadget *gadget)
>
> spin_lock_irqsave(&musb->lock, flags);
>
> - switch (musb->xceiv->state) {
> + switch (musb->xceiv->otg->state) {
> case OTG_STATE_B_PERIPHERAL:
> /* NOTE: OTG state machine doesn't include B_SUSPENDED;
> * that's part of the standard usb 1.1 state machine, and
> @@ -1587,7 +1587,7 @@ static int musb_gadget_wakeup(struct usb_gadget *gadget)
> goto done;
> default:
> dev_dbg(musb->controller, "Unhandled wake: %s\n",
> - usb_otg_state_string(musb->xceiv->state));
> + usb_otg_state_string(musb->xceiv->otg->state));
> goto done;
> }
>
> @@ -1792,7 +1792,7 @@ int musb_gadget_setup(struct musb *musb)
>
> MUSB_DEV_MODE(musb);
> musb->xceiv->otg->default_a = 0;
> - musb->xceiv->state = OTG_STATE_B_IDLE;
> + musb->xceiv->otg->state = OTG_STATE_B_IDLE;
>
> /* this "gadget" abstracts/virtualizes the controller */
> musb->g.name = musb_driver_name;
> @@ -1860,7 +1860,7 @@ static int musb_gadget_start(struct usb_gadget *g,
> musb->is_active = 1;
>
> otg_set_peripheral(otg, &musb->g);
> - musb->xceiv->state = OTG_STATE_B_IDLE;
> + musb->xceiv->otg->state = OTG_STATE_B_IDLE;
> spin_unlock_irqrestore(&musb->lock, flags);
>
> musb_start(musb);
> @@ -1945,7 +1945,7 @@ static int musb_gadget_stop(struct usb_gadget *g,
>
> (void) musb_gadget_vbus_draw(&musb->g, 0);
>
> - musb->xceiv->state = OTG_STATE_UNDEFINED;
> + musb->xceiv->otg->state = OTG_STATE_UNDEFINED;
> stop_activity(musb, driver);
> otg_set_peripheral(musb->xceiv->otg, NULL);
>
> @@ -1975,7 +1975,7 @@ static int musb_gadget_stop(struct usb_gadget *g,
> void musb_g_resume(struct musb *musb)
> {
> musb->is_suspended = 0;
> - switch (musb->xceiv->state) {
> + switch (musb->xceiv->otg->state) {
> case OTG_STATE_B_IDLE:
> break;
> case OTG_STATE_B_WAIT_ACON:
> @@ -1989,7 +1989,7 @@ void musb_g_resume(struct musb *musb)
> break;
> default:
> WARNING("unhandled RESUME transition (%s)\n",
> - usb_otg_state_string(musb->xceiv->state));
> + usb_otg_state_string(musb->xceiv->otg->state));
> }
> }
>
> @@ -2001,10 +2001,10 @@ void musb_g_suspend(struct musb *musb)
> devctl = musb_readb(musb->mregs, MUSB_DEVCTL);
> dev_dbg(musb->controller, "devctl %02x\n", devctl);
>
> - switch (musb->xceiv->state) {
> + switch (musb->xceiv->otg->state) {
> case OTG_STATE_B_IDLE:
> if ((devctl & MUSB_DEVCTL_VBUS) == MUSB_DEVCTL_VBUS)
> - musb->xceiv->state = OTG_STATE_B_PERIPHERAL;
> + musb->xceiv->otg->state = OTG_STATE_B_PERIPHERAL;
> break;
> case OTG_STATE_B_PERIPHERAL:
> musb->is_suspended = 1;
> @@ -2019,7 +2019,7 @@ void musb_g_suspend(struct musb *musb)
> * A_PERIPHERAL may need care too
> */
> WARNING("unhandled SUSPEND transition (%s)\n",
> - usb_otg_state_string(musb->xceiv->state));
> + usb_otg_state_string(musb->xceiv->otg->state));
> }
> }
>
> @@ -2050,22 +2050,22 @@ void musb_g_disconnect(struct musb *musb)
> spin_lock(&musb->lock);
> }
>
> - switch (musb->xceiv->state) {
> + switch (musb->xceiv->otg->state) {
> default:
> dev_dbg(musb->controller, "Unhandled disconnect %s, setting a_idle\n",
> - usb_otg_state_string(musb->xceiv->state));
> - musb->xceiv->state = OTG_STATE_A_IDLE;
> + usb_otg_state_string(musb->xceiv->otg->state));
> + musb->xceiv->otg->state = OTG_STATE_A_IDLE;
> MUSB_HST_MODE(musb);
> break;
> case OTG_STATE_A_PERIPHERAL:
> - musb->xceiv->state = OTG_STATE_A_WAIT_BCON;
> + musb->xceiv->otg->state = OTG_STATE_A_WAIT_BCON;
> MUSB_HST_MODE(musb);
> break;
> case OTG_STATE_B_WAIT_ACON:
> case OTG_STATE_B_HOST:
> case OTG_STATE_B_PERIPHERAL:
> case OTG_STATE_B_IDLE:
> - musb->xceiv->state = OTG_STATE_B_IDLE;
> + musb->xceiv->otg->state = OTG_STATE_B_IDLE;
> break;
> case OTG_STATE_B_SRP_INIT:
> break;
> @@ -2125,13 +2125,13 @@ __acquires(musb->lock)
> * In that case, do not rely on devctl for setting
> * peripheral mode.
> */
> - musb->xceiv->state = OTG_STATE_B_PERIPHERAL;
> + musb->xceiv->otg->state = OTG_STATE_B_PERIPHERAL;
> musb->g.is_a_peripheral = 0;
> } else if (devctl & MUSB_DEVCTL_BDEVICE) {
> - musb->xceiv->state = OTG_STATE_B_PERIPHERAL;
> + musb->xceiv->otg->state = OTG_STATE_B_PERIPHERAL;
> musb->g.is_a_peripheral = 0;
> } else {
> - musb->xceiv->state = OTG_STATE_A_PERIPHERAL;
> + musb->xceiv->otg->state = OTG_STATE_A_PERIPHERAL;
> musb->g.is_a_peripheral = 1;
> }
>
> diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c
> index eb06291a40c8..3ccb4d83bcfa 100644
> --- a/drivers/usb/musb/musb_host.c
> +++ b/drivers/usb/musb/musb_host.c
> @@ -2462,7 +2462,7 @@ static int musb_bus_suspend(struct usb_hcd *hcd)
> if (!is_host_active(musb))
> return 0;
>
> - switch (musb->xceiv->state) {
> + switch (musb->xceiv->otg->state) {
> case OTG_STATE_A_SUSPEND:
> return 0;
> case OTG_STATE_A_WAIT_VRISE:
> @@ -2472,7 +2472,7 @@ static int musb_bus_suspend(struct usb_hcd *hcd)
> */
> devctl = musb_readb(musb->mregs, MUSB_DEVCTL);
> if ((devctl & MUSB_DEVCTL_VBUS) == MUSB_DEVCTL_VBUS)
> - musb->xceiv->state = OTG_STATE_A_WAIT_BCON;
> + musb->xceiv->otg->state = OTG_STATE_A_WAIT_BCON;
> break;
> default:
> break;
> @@ -2480,7 +2480,7 @@ static int musb_bus_suspend(struct usb_hcd *hcd)
>
> if (musb->is_active) {
> WARNING("trying to suspend as %s while active\n",
> - usb_otg_state_string(musb->xceiv->state));
> + usb_otg_state_string(musb->xceiv->otg->state));
> return -EBUSY;
> } else
> return 0;
> @@ -2677,7 +2677,7 @@ int musb_host_setup(struct musb *musb, int power_budget)
>
> MUSB_HST_MODE(musb);
> musb->xceiv->otg->default_a = 1;
> - musb->xceiv->state = OTG_STATE_A_IDLE;
> + musb->xceiv->otg->state = OTG_STATE_A_IDLE;
>
> otg_set_host(musb->xceiv->otg, &hcd->self);
> hcd->self.otg_port = 1;
> diff --git a/drivers/usb/musb/musb_virthub.c b/drivers/usb/musb/musb_virthub.c
> index e2d2d8c9891b..a133bd8c5dc7 100644
> --- a/drivers/usb/musb/musb_virthub.c
> +++ b/drivers/usb/musb/musb_virthub.c
> @@ -69,7 +69,7 @@ void musb_host_finish_resume(struct work_struct *work)
> musb->port1_status |= USB_PORT_STAT_C_SUSPEND << 16;
> usb_hcd_poll_rh_status(musb->hcd);
> /* NOTE: it might really be A_WAIT_BCON ... */
> - musb->xceiv->state = OTG_STATE_A_HOST;
> + musb->xceiv->otg->state = OTG_STATE_A_HOST;
>
> spin_unlock_irqrestore(&musb->lock, flags);
> }
> @@ -107,9 +107,9 @@ void musb_port_suspend(struct musb *musb, bool do_suspend)
> dev_dbg(musb->controller, "Root port suspended, power %02x\n", power);
>
> musb->port1_status |= USB_PORT_STAT_SUSPEND;
> - switch (musb->xceiv->state) {
> + switch (musb->xceiv->otg->state) {
> case OTG_STATE_A_HOST:
> - musb->xceiv->state = OTG_STATE_A_SUSPEND;
> + musb->xceiv->otg->state = OTG_STATE_A_SUSPEND;
> musb->is_active = otg->host->b_hnp_enable;
> if (musb->is_active)
> mod_timer(&musb->otg_timer, jiffies
> @@ -118,13 +118,13 @@ void musb_port_suspend(struct musb *musb, bool do_suspend)
> musb_platform_try_idle(musb, 0);
> break;
> case OTG_STATE_B_HOST:
> - musb->xceiv->state = OTG_STATE_B_WAIT_ACON;
> + musb->xceiv->otg->state = OTG_STATE_B_WAIT_ACON;
> musb->is_active = otg->host->b_hnp_enable;
> musb_platform_try_idle(musb, 0);
> break;
> default:
> dev_dbg(musb->controller, "bogus rh suspend? %s\n",
> - usb_otg_state_string(musb->xceiv->state));
> + usb_otg_state_string(musb->xceiv->otg->state));
> }
> } else if (power & MUSB_POWER_SUSPENDM) {
> power &= ~MUSB_POWER_SUSPENDM;
> @@ -145,7 +145,7 @@ void musb_port_reset(struct musb *musb, bool do_reset)
> u8 power;
> void __iomem *mbase = musb->mregs;
>
> - if (musb->xceiv->state == OTG_STATE_B_IDLE) {
> + if (musb->xceiv->otg->state == OTG_STATE_B_IDLE) {
> dev_dbg(musb->controller, "HNP: Returning from HNP; no hub reset from b_idle\n");
> musb->port1_status &= ~USB_PORT_STAT_RESET;
> return;
> @@ -224,24 +224,24 @@ void musb_root_disconnect(struct musb *musb)
> usb_hcd_poll_rh_status(musb->hcd);
> musb->is_active = 0;
>
> - switch (musb->xceiv->state) {
> + switch (musb->xceiv->otg->state) {
> case OTG_STATE_A_SUSPEND:
> if (otg->host->b_hnp_enable) {
> - musb->xceiv->state = OTG_STATE_A_PERIPHERAL;
> + musb->xceiv->otg->state = OTG_STATE_A_PERIPHERAL;
> musb->g.is_a_peripheral = 1;
> break;
> }
> /* FALLTHROUGH */
> case OTG_STATE_A_HOST:
> - musb->xceiv->state = OTG_STATE_A_WAIT_BCON;
> + musb->xceiv->otg->state = OTG_STATE_A_WAIT_BCON;
> musb->is_active = 0;
> break;
> case OTG_STATE_A_WAIT_VFALL:
> - musb->xceiv->state = OTG_STATE_B_IDLE;
> + musb->xceiv->otg->state = OTG_STATE_B_IDLE;
> break;
> default:
> dev_dbg(musb->controller, "host disconnect (%s)\n",
> - usb_otg_state_string(musb->xceiv->state));
> + usb_otg_state_string(musb->xceiv->otg->state));
> }
> }
>
> diff --git a/drivers/usb/musb/omap2430.c b/drivers/usb/musb/omap2430.c
> index d369bf1f3936..d1b08349f056 100644
> --- a/drivers/usb/musb/omap2430.c
> +++ b/drivers/usb/musb/omap2430.c
> @@ -65,15 +65,15 @@ static void musb_do_idle(unsigned long _musb)
>
> spin_lock_irqsave(&musb->lock, flags);
>
> - switch (musb->xceiv->state) {
> + switch (musb->xceiv->otg->state) {
> case OTG_STATE_A_WAIT_BCON:
>
> devctl = musb_readb(musb->mregs, MUSB_DEVCTL);
> if (devctl & MUSB_DEVCTL_BDEVICE) {
> - musb->xceiv->state = OTG_STATE_B_IDLE;
> + musb->xceiv->otg->state = OTG_STATE_B_IDLE;
> MUSB_DEV_MODE(musb);
> } else {
> - musb->xceiv->state = OTG_STATE_A_IDLE;
> + musb->xceiv->otg->state = OTG_STATE_A_IDLE;
> MUSB_HST_MODE(musb);
> }
> break;
> @@ -90,15 +90,15 @@ static void musb_do_idle(unsigned long _musb)
> musb->port1_status |= USB_PORT_STAT_C_SUSPEND << 16;
> usb_hcd_poll_rh_status(musb->hcd);
> /* NOTE: it might really be A_WAIT_BCON ... */
> - musb->xceiv->state = OTG_STATE_A_HOST;
> + musb->xceiv->otg->state = OTG_STATE_A_HOST;
> }
> break;
> case OTG_STATE_A_HOST:
> devctl = musb_readb(musb->mregs, MUSB_DEVCTL);
> if (devctl & MUSB_DEVCTL_BDEVICE)
> - musb->xceiv->state = OTG_STATE_B_IDLE;
> + musb->xceiv->otg->state = OTG_STATE_B_IDLE;
> else
> - musb->xceiv->state = OTG_STATE_A_WAIT_BCON;
> + musb->xceiv->otg->state = OTG_STATE_A_WAIT_BCON;
> default:
> break;
> }
> @@ -116,9 +116,9 @@ static void omap2430_musb_try_idle(struct musb *musb, unsigned long timeout)
>
> /* Never idle if active, or when VBUS timeout is not set as host */
> if (musb->is_active || ((musb->a_wait_bcon == 0)
> - && (musb->xceiv->state == OTG_STATE_A_WAIT_BCON))) {
> + && (musb->xceiv->otg->state == OTG_STATE_A_WAIT_BCON))) {
> dev_dbg(musb->controller, "%s active, deleting timer\n",
> - usb_otg_state_string(musb->xceiv->state));
> + usb_otg_state_string(musb->xceiv->otg->state));
> del_timer(&musb_idle_timer);
> last_timer = jiffies;
> return;
> @@ -135,7 +135,7 @@ static void omap2430_musb_try_idle(struct musb *musb, unsigned long timeout)
> last_timer = timeout;
>
> dev_dbg(musb->controller, "%s inactive, for idle timer for %lu ms\n",
> - usb_otg_state_string(musb->xceiv->state),
> + usb_otg_state_string(musb->xceiv->otg->state),
> (unsigned long)jiffies_to_msecs(timeout - jiffies));
> mod_timer(&musb_idle_timer, timeout);
> }
> @@ -153,7 +153,7 @@ static void omap2430_musb_set_vbus(struct musb *musb, int is_on)
> devctl = musb_readb(musb->mregs, MUSB_DEVCTL);
>
> if (is_on) {
> - if (musb->xceiv->state == OTG_STATE_A_IDLE) {
> + if (musb->xceiv->otg->state == OTG_STATE_A_IDLE) {
> int loops = 100;
> /* start the session */
> devctl |= MUSB_DEVCTL_SESSION;
> @@ -179,7 +179,7 @@ static void omap2430_musb_set_vbus(struct musb *musb, int is_on)
> } else {
> musb->is_active = 1;
> otg->default_a = 1;
> - musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
> + musb->xceiv->otg->state = OTG_STATE_A_WAIT_VRISE;
> devctl |= MUSB_DEVCTL_SESSION;
> MUSB_HST_MODE(musb);
> }
> @@ -191,7 +191,7 @@ static void omap2430_musb_set_vbus(struct musb *musb, int is_on)
> */
>
> otg->default_a = 0;
> - musb->xceiv->state = OTG_STATE_B_IDLE;
> + musb->xceiv->otg->state = OTG_STATE_B_IDLE;
> devctl &= ~MUSB_DEVCTL_SESSION;
>
> MUSB_DEV_MODE(musb);
> @@ -200,7 +200,7 @@ static void omap2430_musb_set_vbus(struct musb *musb, int is_on)
>
> dev_dbg(musb->controller, "VBUS %s, devctl %02x "
> /* otg %3x conf %08x prcm %08x */ "\n",
> - usb_otg_state_string(musb->xceiv->state),
> + usb_otg_state_string(musb->xceiv->otg->state),
> musb_readb(musb->mregs, MUSB_DEVCTL));
> }
>
> @@ -265,7 +265,7 @@ static void omap_musb_set_mailbox(struct omap2430_glue *glue)
> dev_dbg(dev, "ID GND\n");
>
> otg->default_a = true;
> - musb->xceiv->state = OTG_STATE_A_IDLE;
> + musb->xceiv->otg->state = OTG_STATE_A_IDLE;
> musb->xceiv->last_event = USB_EVENT_ID;
> if (musb->gadget_driver) {
> pm_runtime_get_sync(dev);
> @@ -279,7 +279,7 @@ static void omap_musb_set_mailbox(struct omap2430_glue *glue)
> dev_dbg(dev, "VBUS Connect\n");
>
> otg->default_a = false;
> - musb->xceiv->state = OTG_STATE_B_IDLE;
> + musb->xceiv->otg->state = OTG_STATE_B_IDLE;
> musb->xceiv->last_event = USB_EVENT_VBUS;
> if (musb->gadget_driver)
> pm_runtime_get_sync(dev);
> diff --git a/drivers/usb/musb/tusb6010.c b/drivers/usb/musb/tusb6010.c
> index 159ef4be1ef2..df4513e151a5 100644
> --- a/drivers/usb/musb/tusb6010.c
> +++ b/drivers/usb/musb/tusb6010.c
> @@ -414,13 +414,13 @@ static void musb_do_idle(unsigned long _musb)
>
> spin_lock_irqsave(&musb->lock, flags);
>
> - switch (musb->xceiv->state) {
> + switch (musb->xceiv->otg->state) {
> case OTG_STATE_A_WAIT_BCON:
> if ((musb->a_wait_bcon != 0)
> && (musb->idle_timeout == 0
> || time_after(jiffies, musb->idle_timeout))) {
> dev_dbg(musb->controller, "Nothing connected %s, turning off VBUS\n",
> - usb_otg_state_string(musb->xceiv->state));
> + usb_otg_state_string(musb->xceiv->otg->state));
> }
> /* FALLTHROUGH */
> case OTG_STATE_A_IDLE:
> @@ -473,9 +473,9 @@ static void tusb_musb_try_idle(struct musb *musb, unsigned long timeout)
>
> /* Never idle if active, or when VBUS timeout is not set as host */
> if (musb->is_active || ((musb->a_wait_bcon == 0)
> - && (musb->xceiv->state == OTG_STATE_A_WAIT_BCON))) {
> + && (musb->xceiv->otg->state == OTG_STATE_A_WAIT_BCON))) {
> dev_dbg(musb->controller, "%s active, deleting timer\n",
> - usb_otg_state_string(musb->xceiv->state));
> + usb_otg_state_string(musb->xceiv->otg->state));
> del_timer(&musb_idle_timer);
> last_timer = jiffies;
> return;
> @@ -492,7 +492,7 @@ static void tusb_musb_try_idle(struct musb *musb, unsigned long timeout)
> last_timer = timeout;
>
> dev_dbg(musb->controller, "%s inactive, for idle timer for %lu ms\n",
> - usb_otg_state_string(musb->xceiv->state),
> + usb_otg_state_string(musb->xceiv->otg->state),
> (unsigned long)jiffies_to_msecs(timeout - jiffies));
> mod_timer(&musb_idle_timer, timeout);
> }
> @@ -523,7 +523,7 @@ static void tusb_musb_set_vbus(struct musb *musb, int is_on)
> if (is_on) {
> timer = OTG_TIMER_MS(OTG_TIME_A_WAIT_VRISE);
> otg->default_a = 1;
> - musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
> + musb->xceiv->otg->state = OTG_STATE_A_WAIT_VRISE;
> devctl |= MUSB_DEVCTL_SESSION;
>
> conf |= TUSB_DEV_CONF_USB_HOST_MODE;
> @@ -536,16 +536,16 @@ static void tusb_musb_set_vbus(struct musb *musb, int is_on)
> /* If ID pin is grounded, we want to be a_idle */
> otg_stat = musb_readl(tbase, TUSB_DEV_OTG_STAT);
> if (!(otg_stat & TUSB_DEV_OTG_STAT_ID_STATUS)) {
> - switch (musb->xceiv->state) {
> + switch (musb->xceiv->otg->state) {
> case OTG_STATE_A_WAIT_VRISE:
> case OTG_STATE_A_WAIT_BCON:
> - musb->xceiv->state = OTG_STATE_A_WAIT_VFALL;
> + musb->xceiv->otg->state = OTG_STATE_A_WAIT_VFALL;
> break;
> case OTG_STATE_A_WAIT_VFALL:
> - musb->xceiv->state = OTG_STATE_A_IDLE;
> + musb->xceiv->otg->state = OTG_STATE_A_IDLE;
> break;
> default:
> - musb->xceiv->state = OTG_STATE_A_IDLE;
> + musb->xceiv->otg->state = OTG_STATE_A_IDLE;
> }
> musb->is_active = 0;
> otg->default_a = 1;
> @@ -553,7 +553,7 @@ static void tusb_musb_set_vbus(struct musb *musb, int is_on)
> } else {
> musb->is_active = 0;
> otg->default_a = 0;
> - musb->xceiv->state = OTG_STATE_B_IDLE;
> + musb->xceiv->otg->state = OTG_STATE_B_IDLE;
> MUSB_DEV_MODE(musb);
> }
>
> @@ -568,7 +568,7 @@ static void tusb_musb_set_vbus(struct musb *musb, int is_on)
> musb_writeb(musb->mregs, MUSB_DEVCTL, devctl);
>
> dev_dbg(musb->controller, "VBUS %s, devctl %02x otg %3x conf %08x prcm %08x\n",
> - usb_otg_state_string(musb->xceiv->state),
> + usb_otg_state_string(musb->xceiv->otg->state),
> musb_readb(musb->mregs, MUSB_DEVCTL),
> musb_readl(tbase, TUSB_DEV_OTG_STAT),
> conf, prcm);
> @@ -667,23 +667,23 @@ tusb_otg_ints(struct musb *musb, u32 int_src, void __iomem *tbase)
>
> if (otg_stat & TUSB_DEV_OTG_STAT_SESS_END) {
> dev_dbg(musb->controller, "Forcing disconnect (no interrupt)\n");
> - if (musb->xceiv->state != OTG_STATE_B_IDLE) {
> + if (musb->xceiv->otg->state != OTG_STATE_B_IDLE) {
> /* INTR_DISCONNECT can hide... */
> - musb->xceiv->state = OTG_STATE_B_IDLE;
> + musb->xceiv->otg->state = OTG_STATE_B_IDLE;
> musb->int_usb |= MUSB_INTR_DISCONNECT;
> }
> musb->is_active = 0;
> }
> dev_dbg(musb->controller, "vbus change, %s, otg %03x\n",
> - usb_otg_state_string(musb->xceiv->state), otg_stat);
> + usb_otg_state_string(musb->xceiv->otg->state), otg_stat);
> idle_timeout = jiffies + (1 * HZ);
> schedule_work(&musb->irq_work);
>
> } else /* A-dev state machine */ {
> dev_dbg(musb->controller, "vbus change, %s, otg %03x\n",
> - usb_otg_state_string(musb->xceiv->state), otg_stat);
> + usb_otg_state_string(musb->xceiv->otg->state), otg_stat);
>
> - switch (musb->xceiv->state) {
> + switch (musb->xceiv->otg->state) {
> case OTG_STATE_A_IDLE:
> dev_dbg(musb->controller, "Got SRP, turning on VBUS\n");
> musb_platform_set_vbus(musb, 1);
> @@ -730,9 +730,9 @@ tusb_otg_ints(struct musb *musb, u32 int_src, void __iomem *tbase)
> u8 devctl;
>
> dev_dbg(musb->controller, "%s timer, %03x\n",
> - usb_otg_state_string(musb->xceiv->state), otg_stat);
> + usb_otg_state_string(musb->xceiv->otg->state), otg_stat);
>
> - switch (musb->xceiv->state) {
> + switch (musb->xceiv->otg->state) {
> case OTG_STATE_A_WAIT_VRISE:
> /* VBUS has probably been valid for a while now,
> * but may well have bounced out of range a bit
> @@ -744,7 +744,7 @@ tusb_otg_ints(struct musb *musb, u32 int_src, void __iomem *tbase)
> dev_dbg(musb->controller, "devctl %02x\n", devctl);
> break;
> }
> - musb->xceiv->state = OTG_STATE_A_WAIT_BCON;
> + musb->xceiv->otg->state = OTG_STATE_A_WAIT_BCON;
> musb->is_active = 0;
> idle_timeout = jiffies
> + msecs_to_jiffies(musb->a_wait_bcon);
> diff --git a/drivers/usb/musb/ux500.c b/drivers/usb/musb/ux500.c
> index f202e5088461..71231bcbd178 100644
> --- a/drivers/usb/musb/ux500.c
> +++ b/drivers/usb/musb/ux500.c
> @@ -56,7 +56,7 @@ static void ux500_musb_set_vbus(struct musb *musb, int is_on)
> devctl = musb_readb(musb->mregs, MUSB_DEVCTL);
>
> if (is_on) {
> - if (musb->xceiv->state == OTG_STATE_A_IDLE) {
> + if (musb->xceiv->otg->state == OTG_STATE_A_IDLE) {
> /* start the session */
> devctl |= MUSB_DEVCTL_SESSION;
> musb_writeb(musb->mregs, MUSB_DEVCTL, devctl);
> @@ -76,7 +76,7 @@ static void ux500_musb_set_vbus(struct musb *musb, int is_on)
> } else {
> musb->is_active = 1;
> musb->xceiv->otg->default_a = 1;
> - musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
> + musb->xceiv->otg->state = OTG_STATE_A_WAIT_VRISE;
> devctl |= MUSB_DEVCTL_SESSION;
> MUSB_HST_MODE(musb);
> }
> @@ -102,7 +102,7 @@ static void ux500_musb_set_vbus(struct musb *musb, int is_on)
> mdelay(200);
>
> dev_dbg(musb->controller, "VBUS %s, devctl %02x\n",
> - usb_otg_state_string(musb->xceiv->state),
> + usb_otg_state_string(musb->xceiv->otg->state),
> musb_readb(musb->mregs, MUSB_DEVCTL));
> }
>
> @@ -112,7 +112,7 @@ static int musb_otg_notifications(struct notifier_block *nb,
> struct musb *musb = container_of(nb, struct musb, nb);
>
> dev_dbg(musb->controller, "musb_otg_notifications %ld %s\n",
> - event, usb_otg_state_string(musb->xceiv->state));
> + event, usb_otg_state_string(musb->xceiv->otg->state));
>
> switch (event) {
> case UX500_MUSB_ID:
> @@ -127,7 +127,7 @@ static int musb_otg_notifications(struct notifier_block *nb,
> if (is_host_active(musb))
> ux500_musb_set_vbus(musb, 0);
> else
> - musb->xceiv->state = OTG_STATE_B_IDLE;
> + musb->xceiv->otg->state = OTG_STATE_B_IDLE;
> break;
> default:
> dev_dbg(musb->controller, "ID float\n");
> diff --git a/drivers/usb/phy/phy-ab8500-usb.c b/drivers/usb/phy/phy-ab8500-usb.c
> index 11ab2c45e462..2d5250143ce1 100644
> --- a/drivers/usb/phy/phy-ab8500-usb.c
> +++ b/drivers/usb/phy/phy-ab8500-usb.c
> @@ -446,7 +446,7 @@ static int ab9540_usb_link_status_update(struct ab8500_usb *ab,
> if (event != UX500_MUSB_RIDB)
> event = UX500_MUSB_NONE;
> /* Fallback to default B_IDLE as nothing is connected. */
> - ab->phy.state = OTG_STATE_B_IDLE;
> + ab->phy.otg->state = OTG_STATE_B_IDLE;
> break;
>
> case USB_LINK_ACA_RID_C_NM_9540:
> @@ -584,7 +584,7 @@ static int ab8540_usb_link_status_update(struct ab8500_usb *ab,
> * Fallback to default B_IDLE as nothing
> * is connected
> */
> - ab->phy.state = OTG_STATE_B_IDLE;
> + ab->phy.otg->state = OTG_STATE_B_IDLE;
> break;
>
> case USB_LINK_ACA_RID_C_NM_8540:
> @@ -693,7 +693,7 @@ static int ab8505_usb_link_status_update(struct ab8500_usb *ab,
> * Fallback to default B_IDLE as nothing
> * is connected
> */
> - ab->phy.state = OTG_STATE_B_IDLE;
> + ab->phy.otg->state = OTG_STATE_B_IDLE;
> break;
>
> case USB_LINK_ACA_RID_C_NM_8505:
> @@ -776,7 +776,7 @@ static int ab8500_usb_link_status_update(struct ab8500_usb *ab,
> if (event != UX500_MUSB_RIDB)
> event = UX500_MUSB_NONE;
> /* Fallback to default B_IDLE as nothing is connected */
> - ab->phy.state = OTG_STATE_B_IDLE;
> + ab->phy.otg->state = OTG_STATE_B_IDLE;
> break;
>
> case USB_LINK_ACA_RID_C_NM_8500:
> @@ -1380,7 +1380,7 @@ static int ab8500_usb_probe(struct platform_device *pdev)
> ab->phy.label = "ab8500";
> ab->phy.set_suspend = ab8500_usb_set_suspend;
> ab->phy.set_power = ab8500_usb_set_power;
> - ab->phy.state = OTG_STATE_UNDEFINED;
> + ab->phy.otg->state = OTG_STATE_UNDEFINED;
>
> otg->phy = &ab->phy;
> otg->set_host = ab8500_usb_set_host;
> diff --git a/drivers/usb/phy/phy-fsl-usb.c b/drivers/usb/phy/phy-fsl-usb.c
> index 2b0f968d9325..a22f88fb8176 100644
> --- a/drivers/usb/phy/phy-fsl-usb.c
> +++ b/drivers/usb/phy/phy-fsl-usb.c
> @@ -623,7 +623,7 @@ static int fsl_otg_set_host(struct usb_otg *otg, struct usb_bus *host)
> /* Mini-A cable connected */
> struct otg_fsm *fsm = &otg_dev->fsm;
>
> - otg->phy->state = OTG_STATE_UNDEFINED;
> + otg.state = OTG_STATE_UNDEFINED;
> fsm->protocol = PROTO_UNDEF;
> }
> }
> @@ -681,7 +681,7 @@ static int fsl_otg_set_power(struct usb_phy *phy, unsigned mA)
> {
> if (!fsl_otg_dev)
> return -ENODEV;
> - if (phy->state == OTG_STATE_B_PERIPHERAL)
> + if (phy->otg.state == OTG_STATE_B_PERIPHERAL)
> pr_info("FSL OTG: Draw %d mA\n", mA);
>
> return 0;
> @@ -714,7 +714,7 @@ static int fsl_otg_start_srp(struct usb_otg *otg)
> {
> struct fsl_otg *otg_dev;
>
> - if (!otg || otg->phy->state != OTG_STATE_B_IDLE)
> + if (!otg || otg.state != OTG_STATE_B_IDLE)
> return -ENODEV;
>
> otg_dev = container_of(otg->phy, struct fsl_otg, phy);
> @@ -989,10 +989,10 @@ int usb_otg_start(struct platform_device *pdev)
> * Also: record initial state of ID pin
> */
> if (fsl_readl(&p_otg->dr_mem_map->otgsc) & OTGSC_STS_USB_ID) {
> - p_otg->phy.state = OTG_STATE_UNDEFINED;
> + p_otg->phy->otg.state = OTG_STATE_UNDEFINED;
> p_otg->fsm.id = 1;
> } else {
> - p_otg->phy.state = OTG_STATE_A_IDLE;
> + p_otg->phy->otg.state = OTG_STATE_A_IDLE;
> p_otg->fsm.id = 0;
> }
>
> diff --git a/drivers/usb/phy/phy-generic.c b/drivers/usb/phy/phy-generic.c
> index 7594e5069ae5..280a3458ff6b 100644
> --- a/drivers/usb/phy/phy-generic.c
> +++ b/drivers/usb/phy/phy-generic.c
> @@ -123,7 +123,7 @@ static int nop_set_peripheral(struct usb_otg *otg, struct usb_gadget *gadget)
> }
>
> otg->gadget = gadget;
> - otg->phy->state = OTG_STATE_B_IDLE;
> + otg->state = OTG_STATE_B_IDLE;
> return 0;
> }
>
> @@ -225,9 +225,9 @@ int usb_phy_gen_create_phy(struct device *dev, struct usb_phy_generic *nop,
> nop->phy.dev = nop->dev;
> nop->phy.label = "nop-xceiv";
> nop->phy.set_suspend = nop_set_suspend;
> - nop->phy.state = OTG_STATE_UNDEFINED;
> nop->phy.type = type;
>
> + nop->phy.otg->state = OTG_STATE_UNDEFINED;
> nop->phy.otg->phy = &nop->phy;
> nop->phy.otg->set_host = nop_set_host;
> nop->phy.otg->set_peripheral = nop_set_peripheral;
> diff --git a/drivers/usb/phy/phy-gpio-vbus-usb.c b/drivers/usb/phy/phy-gpio-vbus-usb.c
> index 69462e09d014..a4e88a28199a 100644
> --- a/drivers/usb/phy/phy-gpio-vbus-usb.c
> +++ b/drivers/usb/phy/phy-gpio-vbus-usb.c
> @@ -121,7 +121,7 @@ static void gpio_vbus_work(struct work_struct *work)
>
> if (vbus) {
> status = USB_EVENT_VBUS;
> - gpio_vbus->phy.state = OTG_STATE_B_PERIPHERAL;
> + gpio_vbus->phy.otg->state = OTG_STATE_B_PERIPHERAL;
> gpio_vbus->phy.last_event = status;
> usb_gadget_vbus_connect(gpio_vbus->phy.otg->gadget);
>
> @@ -143,7 +143,7 @@ static void gpio_vbus_work(struct work_struct *work)
>
> usb_gadget_vbus_disconnect(gpio_vbus->phy.otg->gadget);
> status = USB_EVENT_NONE;
> - gpio_vbus->phy.state = OTG_STATE_B_IDLE;
> + gpio_vbus->phy.otg->state = OTG_STATE_B_IDLE;
> gpio_vbus->phy.last_event = status;
>
> atomic_notifier_call_chain(&gpio_vbus->phy.notifier,
> @@ -196,7 +196,7 @@ static int gpio_vbus_set_peripheral(struct usb_otg *otg,
> set_vbus_draw(gpio_vbus, 0);
>
> usb_gadget_vbus_disconnect(otg->gadget);
> - otg->phy->state = OTG_STATE_UNDEFINED;
> + otg->state = OTG_STATE_UNDEFINED;
>
> otg->gadget = NULL;
> return 0;
> @@ -218,7 +218,7 @@ static int gpio_vbus_set_power(struct usb_phy *phy, unsigned mA)
>
> gpio_vbus = container_of(phy, struct gpio_vbus_data, phy);
>
> - if (phy->state == OTG_STATE_B_PERIPHERAL)
> + if (phy->otg->state == OTG_STATE_B_PERIPHERAL)
> set_vbus_draw(gpio_vbus, mA);
> return 0;
> }
> @@ -269,8 +269,8 @@ static int gpio_vbus_probe(struct platform_device *pdev)
> gpio_vbus->phy.dev = gpio_vbus->dev;
> gpio_vbus->phy.set_power = gpio_vbus_set_power;
> gpio_vbus->phy.set_suspend = gpio_vbus_set_suspend;
> - gpio_vbus->phy.state = OTG_STATE_UNDEFINED;
>
> + gpio_vbus->phy.otg->state = OTG_STATE_UNDEFINED;
> gpio_vbus->phy.otg->phy = &gpio_vbus->phy;
> gpio_vbus->phy.otg->set_peripheral = gpio_vbus_set_peripheral;
>
> diff --git a/drivers/usb/phy/phy-msm-usb.c b/drivers/usb/phy/phy-msm-usb.c
> index c929370cdaa6..4394397b1370 100644
> --- a/drivers/usb/phy/phy-msm-usb.c
> +++ b/drivers/usb/phy/phy-msm-usb.c
> @@ -721,11 +721,11 @@ static int msm_otg_set_host(struct usb_otg *otg, struct usb_bus *host)
> }
>
> if (!host) {
> - if (otg->phy->state == OTG_STATE_A_HOST) {
> + if (otg->state == OTG_STATE_A_HOST) {
> pm_runtime_get_sync(otg->phy->dev);
> msm_otg_start_host(otg->phy, 0);
> otg->host = NULL;
> - otg->phy->state = OTG_STATE_UNDEFINED;
> + otg->state = OTG_STATE_UNDEFINED;
> schedule_work(&motg->sm_work);
> } else {
> otg->host = NULL;
> @@ -794,11 +794,11 @@ static int msm_otg_set_peripheral(struct usb_otg *otg,
> }
>
> if (!gadget) {
> - if (otg->phy->state == OTG_STATE_B_PERIPHERAL) {
> + if (otg->state == OTG_STATE_B_PERIPHERAL) {
> pm_runtime_get_sync(otg->phy->dev);
> msm_otg_start_peripheral(otg->phy, 0);
> otg->gadget = NULL;
> - otg->phy->state = OTG_STATE_UNDEFINED;
> + otg->state = OTG_STATE_UNDEFINED;
> schedule_work(&motg->sm_work);
> } else {
> otg->gadget = NULL;
> @@ -1170,12 +1170,12 @@ static void msm_otg_sm_work(struct work_struct *w)
> struct msm_otg *motg = container_of(w, struct msm_otg, sm_work);
> struct usb_otg *otg = motg->phy.otg;
>
> - switch (otg->phy->state) {
> + switch (otg->state) {
> case OTG_STATE_UNDEFINED:
> dev_dbg(otg->phy->dev, "OTG_STATE_UNDEFINED state\n");
> msm_otg_reset(otg->phy);
> msm_otg_init_sm(motg);
> - otg->phy->state = OTG_STATE_B_IDLE;
> + otg->state = OTG_STATE_B_IDLE;
> /* FALL THROUGH */
> case OTG_STATE_B_IDLE:
> dev_dbg(otg->phy->dev, "OTG_STATE_B_IDLE state\n");
> @@ -1183,7 +1183,7 @@ static void msm_otg_sm_work(struct work_struct *w)
> /* disable BSV bit */
> writel(readl(USB_OTGSC) & ~OTGSC_BSVIE, USB_OTGSC);
> msm_otg_start_host(otg->phy, 1);
> - otg->phy->state = OTG_STATE_A_HOST;
> + otg->state = OTG_STATE_A_HOST;
> } else if (test_bit(B_SESS_VLD, &motg->inputs)) {
> switch (motg->chg_state) {
> case USB_CHG_STATE_UNDEFINED:
> @@ -1199,13 +1199,13 @@ static void msm_otg_sm_work(struct work_struct *w)
> msm_otg_notify_charger(motg,
> IDEV_CHG_MAX);
> msm_otg_start_peripheral(otg->phy, 1);
> - otg->phy->state
> + otg->state
> = OTG_STATE_B_PERIPHERAL;
> break;
> case USB_SDP_CHARGER:
> msm_otg_notify_charger(motg, IUNIT);
> msm_otg_start_peripheral(otg->phy, 1);
> - otg->phy->state
> + otg->state
> = OTG_STATE_B_PERIPHERAL;
> break;
> default:
> @@ -1230,7 +1230,7 @@ static void msm_otg_sm_work(struct work_struct *w)
> motg->chg_type = USB_INVALID_CHARGER;
> }
>
> - if (otg->phy->state == OTG_STATE_B_IDLE)
> + if (otg->state == OTG_STATE_B_IDLE)
> pm_runtime_put_sync(otg->phy->dev);
> break;
> case OTG_STATE_B_PERIPHERAL:
> @@ -1241,7 +1241,7 @@ static void msm_otg_sm_work(struct work_struct *w)
> msm_otg_start_peripheral(otg->phy, 0);
> motg->chg_state = USB_CHG_STATE_UNDEFINED;
> motg->chg_type = USB_INVALID_CHARGER;
> - otg->phy->state = OTG_STATE_B_IDLE;
> + otg->state = OTG_STATE_B_IDLE;
> msm_otg_reset(otg->phy);
> schedule_work(w);
> }
> @@ -1250,7 +1250,7 @@ static void msm_otg_sm_work(struct work_struct *w)
> dev_dbg(otg->phy->dev, "OTG_STATE_A_HOST state\n");
> if (test_bit(ID, &motg->inputs)) {
> msm_otg_start_host(otg->phy, 0);
> - otg->phy->state = OTG_STATE_B_IDLE;
> + otg->state = OTG_STATE_B_IDLE;
> msm_otg_reset(otg->phy);
> schedule_work(w);
> }
> @@ -1303,7 +1303,7 @@ static int msm_otg_mode_show(struct seq_file *s, void *unused)
> struct msm_otg *motg = s->private;
> struct usb_otg *otg = motg->phy.otg;
>
> - switch (otg->phy->state) {
> + switch (otg->state) {
> case OTG_STATE_A_HOST:
> seq_puts(s, "host\n");
> break;
> @@ -1353,7 +1353,7 @@ static ssize_t msm_otg_mode_write(struct file *file, const char __user *ubuf,
>
> switch (req_mode) {
> case USB_DR_MODE_UNKNOWN:
> - switch (otg->phy->state) {
> + switch (otg->state) {
> case OTG_STATE_A_HOST:
> case OTG_STATE_B_PERIPHERAL:
> set_bit(ID, &motg->inputs);
> @@ -1364,7 +1364,7 @@ static ssize_t msm_otg_mode_write(struct file *file, const char __user *ubuf,
> }
> break;
> case USB_DR_MODE_PERIPHERAL:
> - switch (otg->phy->state) {
> + switch (otg->state) {
> case OTG_STATE_B_IDLE:
> case OTG_STATE_A_HOST:
> set_bit(ID, &motg->inputs);
> @@ -1375,7 +1375,7 @@ static ssize_t msm_otg_mode_write(struct file *file, const char __user *ubuf,
> }
> break;
> case USB_DR_MODE_HOST:
> - switch (otg->phy->state) {
> + switch (otg->state) {
> case OTG_STATE_B_IDLE:
> case OTG_STATE_B_PERIPHERAL:
> clear_bit(ID, &motg->inputs);
> @@ -1772,7 +1772,7 @@ static int msm_otg_runtime_idle(struct device *dev)
> * This 1 sec delay also prevents entering into LPM immediately
> * after asynchronous interrupt.
> */
> - if (otg->phy->state != OTG_STATE_UNDEFINED)
> + if (otg->state != OTG_STATE_UNDEFINED)
> pm_schedule_suspend(dev, 1000);
>
> return -EAGAIN;
> diff --git a/drivers/usb/phy/phy-mv-usb.c b/drivers/usb/phy/phy-mv-usb.c
> index 7d80c54f0ac6..d6b3c473f068 100644
> --- a/drivers/usb/phy/phy-mv-usb.c
> +++ b/drivers/usb/phy/phy-mv-usb.c
> @@ -339,68 +339,68 @@ static void mv_otg_update_state(struct mv_otg *mvotg)
> {
> struct mv_otg_ctrl *otg_ctrl = &mvotg->otg_ctrl;
> struct usb_phy *phy = &mvotg->phy;
> - int old_state = phy->state;
> + int old_state = mvotg->phy.otg->state;
>
> switch (old_state) {
> case OTG_STATE_UNDEFINED:
> - phy->state = OTG_STATE_B_IDLE;
> + mvotg->phy.otg->state = OTG_STATE_B_IDLE;
> /* FALL THROUGH */
> case OTG_STATE_B_IDLE:
> if (otg_ctrl->id == 0)
> - phy->state = OTG_STATE_A_IDLE;
> + mvotg->phy.otg->state = OTG_STATE_A_IDLE;
> else if (otg_ctrl->b_sess_vld)
> - phy->state = OTG_STATE_B_PERIPHERAL;
> + mvotg->phy.otg->state = OTG_STATE_B_PERIPHERAL;
> break;
> case OTG_STATE_B_PERIPHERAL:
> if (!otg_ctrl->b_sess_vld || otg_ctrl->id == 0)
> - phy->state = OTG_STATE_B_IDLE;
> + mvotg->phy.otg->state = OTG_STATE_B_IDLE;
> break;
> case OTG_STATE_A_IDLE:
> if (otg_ctrl->id)
> - phy->state = OTG_STATE_B_IDLE;
> + mvotg->phy.otg->state = OTG_STATE_B_IDLE;
> else if (!(otg_ctrl->a_bus_drop) &&
> (otg_ctrl->a_bus_req || otg_ctrl->a_srp_det))
> - phy->state = OTG_STATE_A_WAIT_VRISE;
> + mvotg->phy.otg->state = OTG_STATE_A_WAIT_VRISE;
> break;
> case OTG_STATE_A_WAIT_VRISE:
> if (otg_ctrl->a_vbus_vld)
> - phy->state = OTG_STATE_A_WAIT_BCON;
> + mvotg->phy.otg->state = OTG_STATE_A_WAIT_BCON;
> break;
> case OTG_STATE_A_WAIT_BCON:
> if (otg_ctrl->id || otg_ctrl->a_bus_drop
> || otg_ctrl->a_wait_bcon_timeout) {
> mv_otg_cancel_timer(mvotg, A_WAIT_BCON_TIMER);
> mvotg->otg_ctrl.a_wait_bcon_timeout = 0;
> - phy->state = OTG_STATE_A_WAIT_VFALL;
> + mvotg->phy.otg->state = OTG_STATE_A_WAIT_VFALL;
> otg_ctrl->a_bus_req = 0;
> } else if (!otg_ctrl->a_vbus_vld) {
> mv_otg_cancel_timer(mvotg, A_WAIT_BCON_TIMER);
> mvotg->otg_ctrl.a_wait_bcon_timeout = 0;
> - phy->state = OTG_STATE_A_VBUS_ERR;
> + mvotg->phy.otg->state = OTG_STATE_A_VBUS_ERR;
> } else if (otg_ctrl->b_conn) {
> mv_otg_cancel_timer(mvotg, A_WAIT_BCON_TIMER);
> mvotg->otg_ctrl.a_wait_bcon_timeout = 0;
> - phy->state = OTG_STATE_A_HOST;
> + mvotg->phy.otg->state = OTG_STATE_A_HOST;
> }
> break;
> case OTG_STATE_A_HOST:
> if (otg_ctrl->id || !otg_ctrl->b_conn
> || otg_ctrl->a_bus_drop)
> - phy->state = OTG_STATE_A_WAIT_BCON;
> + mvotg->phy.otg->state = OTG_STATE_A_WAIT_BCON;
> else if (!otg_ctrl->a_vbus_vld)
> - phy->state = OTG_STATE_A_VBUS_ERR;
> + mvotg->phy.otg->state = OTG_STATE_A_VBUS_ERR;
> break;
> case OTG_STATE_A_WAIT_VFALL:
> if (otg_ctrl->id
> || (!otg_ctrl->b_conn && otg_ctrl->a_sess_vld)
> || otg_ctrl->a_bus_req)
> - phy->state = OTG_STATE_A_IDLE;
> + mvotg->phy.otg->state = OTG_STATE_A_IDLE;
> break;
> case OTG_STATE_A_VBUS_ERR:
> if (otg_ctrl->id || otg_ctrl->a_clr_err
> || otg_ctrl->a_bus_drop) {
> otg_ctrl->a_clr_err = 0;
> - phy->state = OTG_STATE_A_WAIT_VFALL;
> + mvotg->phy.otg->state = OTG_STATE_A_WAIT_VFALL;
> }
> break;
> default:
> @@ -420,8 +420,8 @@ static void mv_otg_work(struct work_struct *work)
> run:
> /* work queue is single thread, or we need spin_lock to protect */
> phy = &mvotg->phy;
> - otg = phy->otg;
> - old_state = phy->state;
> + otg = mvotg->phy.otg;
> + old_state = otg->state;
>
> if (!mvotg->active)
> return;
> @@ -429,12 +429,12 @@ run:
> mv_otg_update_inputs(mvotg);
> mv_otg_update_state(mvotg);
>
> - if (old_state != phy->state) {
> + if (old_state != mvotg->phy.otg->state) {
> dev_info(&mvotg->pdev->dev, "change from state %s to %s\n",
> state_string[old_state],
> - state_string[phy->state]);
> + state_string[mvotg->phy.otg->state]);
>
> - switch (phy->state) {
> + switch (mvotg->phy.otg->state) {
> case OTG_STATE_B_IDLE:
> otg->default_a = 0;
> if (old_state == OTG_STATE_B_PERIPHERAL)
> @@ -545,8 +545,8 @@ set_a_bus_req(struct device *dev, struct device_attribute *attr,
> return -1;
>
> /* We will use this interface to change to A device */
> - if (mvotg->phy.state != OTG_STATE_B_IDLE
> - && mvotg->phy.state != OTG_STATE_A_IDLE)
> + if (mvotg->phy.otg->state != OTG_STATE_B_IDLE
> + && mvotg->phy.otg->state != OTG_STATE_A_IDLE)
> return -1;
>
> /* The clock may disabled and we need to set irq for ID detected */
> @@ -717,9 +717,9 @@ static int mv_otg_probe(struct platform_device *pdev)
> mvotg->phy.dev = &pdev->dev;
> mvotg->phy.otg = otg;
> mvotg->phy.label = driver_name;
> - mvotg->phy.state = OTG_STATE_UNDEFINED;
>
> otg->phy = &mvotg->phy;
> + otg->state = OTG_STATE_UNDEFINED;
> otg->set_host = mv_otg_set_host;
> otg->set_peripheral = mv_otg_set_peripheral;
> otg->set_vbus = mv_otg_set_vbus;
> diff --git a/include/linux/usb/otg.h b/include/linux/usb/otg.h
> index 154332b7c8c0..33d3480c9cda 100644
> --- a/include/linux/usb/otg.h
> +++ b/include/linux/usb/otg.h
> @@ -18,6 +18,8 @@ struct usb_otg {
> struct usb_bus *host;
> struct usb_gadget *gadget;
>
> + enum usb_otg_state state;
> +
> /* bind/unbind the host controller */
> int (*set_host)(struct usb_otg *otg, struct usb_bus *host);
>
> diff --git a/include/linux/usb/phy.h b/include/linux/usb/phy.h
> index 353053a33f21..ac7d7913694f 100644
> --- a/include/linux/usb/phy.h
> +++ b/include/linux/usb/phy.h
> @@ -77,7 +77,6 @@ struct usb_phy {
> unsigned int flags;
>
> enum usb_phy_type type;
> - enum usb_otg_state state;
> enum usb_phy_events last_event;
>
> struct usb_otg *otg;
> --
> 1.9.1
>

--

Best Regards,
Peter Chen

2014-07-16 15:02:43

by Felipe Balbi

[permalink] [raw]
Subject: Re: [PATCH 1/4] usb: move the OTG state from the USB PHY to the OTG structure

On Thu, Jul 10, 2014 at 03:47:58PM +0200, Antoine T?nart wrote:
> Hi Felipe,
>
> On Thu, Jul 10, 2014 at 08:40:23AM -0500, Felipe Balbi wrote:
> > On Wed, Jul 09, 2014 at 12:17:13PM +0200, Antoine T?nart wrote:
> > > Before using the PHY framework instead of the USB PHY one, we need to
> > > move the OTG state into another place, since it won't be available when
> > > USB PHY isn't used. This patch moves the OTG state into the OTG
> > > structure, and makes all the needed modifications in the drivers
> > > using the OTG state.
> > >
> > > Signed-off-by: Antoine T?nart <[email protected]>
> >
> > This looks good to me. I'm interested in what will be the best way to
> > merge this series :-)
>
> I was asking myself the same question :) If splits or squashes are needed
> please ask. At least, I'll split the s/phy/usb_phy/ and the generic PHY
> addition in two patches as Alan asked.

if I get enough Acks, i'll queue it myself, I guess it's best that way.

--
balbi


Attachments:
(No filename) (996.00 B)
signature.asc (819.00 B)
Digital signature
Download all attachments

2014-07-22 21:33:57

by Bin Liu

[permalink] [raw]
Subject: Re: [PATCH 1/4] usb: move the OTG state from the USB PHY to the OTG structure

Hi,

On Wed, Jul 9, 2014 at 5:17 AM, Antoine Ténart
<[email protected]> wrote:
> Before using the PHY framework instead of the USB PHY one, we need to
> move the OTG state into another place, since it won't be available when
> USB PHY isn't used. This patch moves the OTG state into the OTG
> structure, and makes all the needed modifications in the drivers
> using the OTG state.
>
> Signed-off-by: Antoine Ténart <[email protected]>
> ---
> drivers/phy/phy-omap-usb2.c | 8 +---
> drivers/usb/chipidea/debug.c | 3 +-
> drivers/usb/chipidea/otg_fsm.c | 12 ++---
> drivers/usb/common/usb-otg-fsm.c | 8 ++--
> drivers/usb/host/ohci-omap.c | 2 +-
> drivers/usb/musb/am35x.c | 28 +++++------
> drivers/usb/musb/blackfin.c | 18 +++----
> drivers/usb/musb/da8xx.c | 28 +++++------
> drivers/usb/musb/davinci.c | 18 +++----
> drivers/usb/musb/musb_core.c | 94 ++++++++++++++++++-------------------
> drivers/usb/musb/musb_dsps.c | 26 +++++-----
> drivers/usb/musb/musb_gadget.c | 36 +++++++-------
> drivers/usb/musb/musb_host.c | 8 ++--
> drivers/usb/musb/musb_virthub.c | 22 ++++-----
> drivers/usb/musb/omap2430.c | 30 ++++++------
> drivers/usb/musb/tusb6010.c | 40 ++++++++--------
> drivers/usb/musb/ux500.c | 10 ++--
> drivers/usb/phy/phy-ab8500-usb.c | 10 ++--
> drivers/usb/phy/phy-fsl-usb.c | 10 ++--
> drivers/usb/phy/phy-generic.c | 4 +-
> drivers/usb/phy/phy-gpio-vbus-usb.c | 10 ++--
> drivers/usb/phy/phy-msm-usb.c | 34 +++++++-------
> drivers/usb/phy/phy-mv-usb.c | 46 +++++++++---------
> include/linux/usb/otg.h | 2 +
> include/linux/usb/phy.h | 1 -
> 25 files changed, 252 insertions(+), 256 deletions(-)
>
> diff --git a/drivers/phy/phy-omap-usb2.c b/drivers/phy/phy-omap-usb2.c
> index 7007c11fe07d..1f444f91ed7d 100644
> --- a/drivers/phy/phy-omap-usb2.c
> +++ b/drivers/phy/phy-omap-usb2.c
> @@ -80,11 +80,9 @@ static int omap_usb_start_srp(struct usb_otg *otg)
>
> static int omap_usb_set_host(struct usb_otg *otg, struct usb_bus *host)
> {
> - struct usb_phy *phy = otg->phy;
> -
> otg->host = host;
> if (!host)
> - phy->state = OTG_STATE_UNDEFINED;
> + otg->state = OTG_STATE_UNDEFINED;
>
> return 0;
> }
> @@ -92,11 +90,9 @@ static int omap_usb_set_host(struct usb_otg *otg, struct usb_bus *host)
> static int omap_usb_set_peripheral(struct usb_otg *otg,
> struct usb_gadget *gadget)
> {
> - struct usb_phy *phy = otg->phy;
> -
> otg->gadget = gadget;
> if (!gadget)
> - phy->state = OTG_STATE_UNDEFINED;
> + otg->state = OTG_STATE_UNDEFINED;
>
> return 0;
> }
> diff --git a/drivers/usb/chipidea/debug.c b/drivers/usb/chipidea/debug.c
> index 7cccab6ff308..9a9702773e43 100644
> --- a/drivers/usb/chipidea/debug.c
> +++ b/drivers/usb/chipidea/debug.c
> @@ -219,8 +219,7 @@ int ci_otg_show(struct seq_file *s, void *unused)
> fsm = &ci->fsm;
>
> /* ------ State ----- */
> - seq_printf(s, "OTG state: %s\n\n",

Is this line removed by accident?

> - usb_otg_state_string(ci->transceiver->state));
> + usb_otg_state_string(ci->transceiver->otg.state));
>
> /* ------ State Machine Variables ----- */

<snip>

Regards,
-Bin.

2014-07-23 07:08:37

by Antoine Tenart

[permalink] [raw]
Subject: Re: [PATCH 1/4] usb: move the OTG state from the USB PHY to the OTG structure

Hi,

On Tue, Jul 22, 2014 at 04:33:54PM -0500, Bin Liu wrote:
> On Wed, Jul 9, 2014 at 5:17 AM, Antoine T?nart
> <[email protected]> wrote:
> > diff --git a/drivers/usb/chipidea/debug.c b/drivers/usb/chipidea/debug.c
> > index 7cccab6ff308..9a9702773e43 100644
> > --- a/drivers/usb/chipidea/debug.c
> > +++ b/drivers/usb/chipidea/debug.c
> > @@ -219,8 +219,7 @@ int ci_otg_show(struct seq_file *s, void *unused)
> > fsm = &ci->fsm;
> >
> > /* ------ State ----- */
> > - seq_printf(s, "OTG state: %s\n\n",
>
> Is this line removed by accident?
>
> > - usb_otg_state_string(ci->transceiver->state));
> > + usb_otg_state_string(ci->transceiver->otg.state));
> >
> > /* ------ State Machine Variables ----- */

It is. I'll fix this.

Thanks!

Antoine

--
Antoine T?nart, Free Electrons
Embedded Linux, Kernel and Android engineering
http://free-electrons.com