diff options
| author | Arnd Bergmann <arnd@arndb.de> | 2013-04-23 21:05:40 +0200 | 
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-04-23 12:50:38 -0700 | 
| commit | ee5d5499edb94cd03738a52a7e234b139da8fd72 (patch) | |
| tree | 6c6fe301f894625e86afb19ed283d3e2af39c77d /drivers/usb/phy/phy-tegra-usb.c | |
| parent | 4623245c769662e7cad80e1f9b39dadfbc2ad06d (diff) | |
| download | olio-linux-3.10-ee5d5499edb94cd03738a52a7e234b139da8fd72.tar.xz olio-linux-3.10-ee5d5499edb94cd03738a52a7e234b139da8fd72.zip  | |
usb: phy: tegra: don't call into tegra-ehci directly
Both phy-tegra-usb.c and ehci-tegra.c export symbols used by the other one,
which does not work if one of them or both are loadable modules, resulting
in an error like:
drivers/built-in.o: In function `utmi_phy_clk_disable':
drivers/usb/phy/phy-tegra-usb.c:302: undefined reference to `tegra_ehci_set_phcd'
drivers/built-in.o: In function `utmi_phy_clk_enable':
drivers/usb/phy/phy-tegra-usb.c:324: undefined reference to `tegra_ehci_set_phcd'
drivers/built-in.o: In function `utmi_phy_power_on':
drivers/usb/phy/phy-tegra-usb.c:447: undefined reference to `tegra_ehci_set_pts'
This turns the interface into a one-way dependency by letting the tegra ehci
driver pass two function pointers for callbacks that need to be called by
the phy driver.
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Cc: Venu Byravarasu <vbyravarasu@nvidia.com>
Cc: Alan Stern <stern@rowland.harvard.edu>
Cc: Felipe Balbi <balbi@ti.com>
Cc: Stephen Warren <swarren@nvidia.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/usb/phy/phy-tegra-usb.c')
| -rw-r--r-- | drivers/usb/phy/phy-tegra-usb.c | 13 | 
1 files changed, 9 insertions, 4 deletions
diff --git a/drivers/usb/phy/phy-tegra-usb.c b/drivers/usb/phy/phy-tegra-usb.c index 5487d38481a..17d811292f3 100644 --- a/drivers/usb/phy/phy-tegra-usb.c +++ b/drivers/usb/phy/phy-tegra-usb.c @@ -299,7 +299,7 @@ static void utmi_phy_clk_disable(struct tegra_usb_phy *phy)  		val &= ~USB_SUSP_SET;  		writel(val, base + USB_SUSP_CTRL);  	} else -		tegra_ehci_set_phcd(&phy->u_phy, true); +		phy->set_phcd(&phy->u_phy, true);  	if (utmi_wait_register(base + USB_SUSP_CTRL, USB_PHY_CLK_VALID, 0) < 0)  		pr_err("%s: timeout waiting for phy to stabilize\n", __func__); @@ -321,7 +321,7 @@ static void utmi_phy_clk_enable(struct tegra_usb_phy *phy)  		val &= ~USB_SUSP_CLR;  		writel(val, base + USB_SUSP_CTRL);  	} else -		tegra_ehci_set_phcd(&phy->u_phy, false); +		phy->set_phcd(&phy->u_phy, false);  	if (utmi_wait_register(base + USB_SUSP_CTRL, USB_PHY_CLK_VALID,  						     USB_PHY_CLK_VALID)) @@ -444,7 +444,7 @@ static int utmi_phy_power_on(struct tegra_usb_phy *phy)  	utmi_phy_clk_enable(phy);  	if (!phy->is_legacy_phy) -		tegra_ehci_set_pts(&phy->u_phy, 0); +		phy->set_pts(&phy->u_phy, 0);  	return 0;  } @@ -688,7 +688,10 @@ static int	tegra_usb_phy_suspend(struct usb_phy *x, int suspend)  }  struct tegra_usb_phy *tegra_usb_phy_open(struct device *dev, int instance, -	void __iomem *regs, void *config, enum tegra_usb_phy_mode phy_mode) +	void __iomem *regs, void *config, enum tegra_usb_phy_mode phy_mode, +	void (*set_pts)(struct usb_phy *x, u8 pts_val), +	void (*set_phcd)(struct usb_phy *x, bool enable)) +  {  	struct tegra_usb_phy *phy;  	unsigned long parent_rate; @@ -707,6 +710,8 @@ struct tegra_usb_phy *tegra_usb_phy_open(struct device *dev, int instance,  	phy->dev = dev;  	phy->is_legacy_phy =  		of_property_read_bool(np, "nvidia,has-legacy-mode"); +	phy->set_pts = set_pts; +	phy->set_phcd = set_phcd;  	err = of_property_match_string(np, "phy_type", "ulpi");  	if (err < 0)  		phy->is_ulpi_phy = false;  |