]>
Commit | Line | Data |
---|---|---|
8ecef00f UH |
1 | /* |
2 | * Renesas USB driver R-Car Gen. 2 initialization and power control | |
3 | * | |
4 | * Copyright (C) 2014 Ulrich Hecht | |
5 | * | |
6 | * This program is distributed in the hope that it will be useful, | |
7 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
8 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
9 | * GNU General Public License for more details. | |
10 | * | |
11 | */ | |
12 | ||
13 | #include <linux/gpio.h> | |
14 | #include <linux/of_gpio.h> | |
15 | #include <linux/platform_data/gpio-rcar.h> | |
16 | #include <linux/usb/phy.h> | |
17 | #include "common.h" | |
18 | #include "rcar2.h" | |
19 | ||
20 | static int usbhs_rcar2_hardware_init(struct platform_device *pdev) | |
21 | { | |
22 | struct usbhs_priv *priv = usbhs_pdev_to_priv(pdev); | |
8ecef00f | 23 | |
5f6aea34 YS |
24 | if (IS_ENABLED(CONFIG_USB_PHY)) { |
25 | struct usb_phy *usb_phy = usb_get_phy_dev(&pdev->dev, 0); | |
8ecef00f | 26 | |
5f6aea34 YS |
27 | if (IS_ERR(usb_phy)) |
28 | return PTR_ERR(usb_phy); | |
29 | ||
30 | priv->usb_phy = usb_phy; | |
31 | return 0; | |
32 | } | |
33 | ||
34 | return -ENXIO; | |
8ecef00f UH |
35 | } |
36 | ||
37 | static int usbhs_rcar2_hardware_exit(struct platform_device *pdev) | |
38 | { | |
39 | struct usbhs_priv *priv = usbhs_pdev_to_priv(pdev); | |
40 | ||
5f6aea34 YS |
41 | if (priv->usb_phy) { |
42 | usb_put_phy(priv->usb_phy); | |
43 | priv->usb_phy = NULL; | |
44 | } | |
8ecef00f UH |
45 | |
46 | return 0; | |
47 | } | |
48 | ||
49 | static int usbhs_rcar2_power_ctrl(struct platform_device *pdev, | |
50 | void __iomem *base, int enable) | |
51 | { | |
52 | struct usbhs_priv *priv = usbhs_pdev_to_priv(pdev); | |
5f6aea34 | 53 | int retval = -ENODEV; |
8ecef00f | 54 | |
5f6aea34 YS |
55 | if (priv->usb_phy) { |
56 | if (enable) { | |
57 | retval = usb_phy_init(priv->usb_phy); | |
8ecef00f | 58 | |
5f6aea34 YS |
59 | if (!retval) |
60 | retval = usb_phy_set_suspend(priv->usb_phy, 0); | |
61 | } else { | |
62 | usb_phy_set_suspend(priv->usb_phy, 1); | |
63 | usb_phy_shutdown(priv->usb_phy); | |
64 | retval = 0; | |
65 | } | |
8ecef00f UH |
66 | } |
67 | ||
5f6aea34 | 68 | return retval; |
8ecef00f UH |
69 | } |
70 | ||
71 | static int usbhs_rcar2_get_id(struct platform_device *pdev) | |
72 | { | |
73 | return USBHS_GADGET; | |
74 | } | |
75 | ||
76 | const struct renesas_usbhs_platform_callback usbhs_rcar2_ops = { | |
77 | .hardware_init = usbhs_rcar2_hardware_init, | |
78 | .hardware_exit = usbhs_rcar2_hardware_exit, | |
79 | .power_ctrl = usbhs_rcar2_power_ctrl, | |
80 | .get_id = usbhs_rcar2_get_id, | |
81 | }; |