arm: tegra: usb: Adding phy_restore functions for null ULPI
[linux-2.6.git] / arch / arm / mach-tegra / include / mach / usb_phy.h
1 /*
2  * arch/arm/mach-tegra/include/mach/usb_phy.h
3  *
4  * Copyright (C) 2010 Google, Inc.
5  * Copyright (C) 2011 NVIDIA Corporation.
6  *
7  * This software is licensed under the terms of the GNU General Public
8  * License version 2, as published by the Free Software Foundation, and
9  * may be copied, distributed, and modified under those terms.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  */
17
18 #ifndef __MACH_USB_PHY_H
19 #define __MACH_USB_PHY_H
20
21 #include <linux/clk.h>
22 #include <linux/regulator/consumer.h>
23 #include <linux/usb/otg.h>
24 #include <linux/platform_data/tegra_usb.h>
25
26 struct tegra_utmip_config {
27         u8 hssync_start_delay;
28         u8 elastic_limit;
29         u8 idle_wait_delay;
30         u8 term_range_adj;
31         u8 xcvr_setup;
32         u8 xcvr_setup_offset;
33         u8 xcvr_use_fuses;
34         u8 xcvr_lsfslew;
35         u8 xcvr_lsrslew;
36 };
37
38 struct tegra_ulpi_trimmer {
39         u8 shadow_clk_delay;    /* 0 ~ 31 */
40         u8 clock_out_delay;     /* 0 ~ 31 */
41         u8 data_trimmer;        /* 0 ~ 7 */
42         u8 stpdirnxt_trimmer;   /* 0 ~ 7 */
43 };
44
45 struct tegra_ulpi_config {
46         int enable_gpio;
47         int reset_gpio;
48         const char *clk;
49         const struct tegra_ulpi_trimmer *trimmer;
50         int (*pre_phy_on)(void);
51         int (*post_phy_on)(void);
52         int (*pre_phy_off)(void);
53         int (*post_phy_off)(void);
54         void (*phy_restore_start)(void);
55         void (*phy_restore_end)(void);
56 };
57
58 struct tegra_uhsic_config {
59         int enable_gpio;
60         int reset_gpio;
61         u8 sync_start_delay;
62         u8 idle_wait_delay;
63         u8 term_range_adj;
64         u8 elastic_underrun_limit;
65         u8 elastic_overrun_limit;
66         int (*postsuspend)(void);
67         int (*preresume)(void);
68         int (*usb_phy_ready)(void);
69         int (*post_phy_off)(void);
70 };
71
72 enum tegra_usb_phy_port_speed {
73         TEGRA_USB_PHY_PORT_SPEED_FULL = 0,
74         TEGRA_USB_PHY_PORT_SPEED_LOW,
75         TEGRA_USB_PHY_PORT_SPEED_HIGH,
76 };
77
78 enum tegra_usb_phy_mode {
79         TEGRA_USB_PHY_MODE_DEVICE,
80         TEGRA_USB_PHY_MODE_HOST,
81 };
82
83 struct usb_phy_plat_data {
84         int instance;
85         int vbus_irq;
86         int vbus_gpio;
87         char * vbus_reg_supply;
88 };
89
90 struct tegra_xtal_freq;
91
92 struct tegra_usb_phy {
93         int instance;
94         const struct tegra_xtal_freq *freq;
95         void __iomem *regs;
96         void __iomem *pad_regs;
97         struct clk *clk;
98         struct clk *pll_u;
99         struct clk *pad_clk;
100         enum tegra_usb_phy_mode mode;
101         void *config;
102         struct regulator *reg_vdd;
103         struct regulator *reg_vbus;
104         enum tegra_usb_phy_type usb_phy_type;
105         bool regulator_on;
106         struct otg_transceiver *ulpi;
107         int initialized;
108         bool power_on;
109         bool remote_wakeup;
110 };
111
112 typedef int (*tegra_phy_fp)(struct tegra_usb_phy *phy, bool is_dpd);
113 typedef void (*tegra_phy_restore_start_fp)(struct tegra_usb_phy *phy,
114                                            enum tegra_usb_phy_port_speed);
115 typedef void (*tegra_phy_restore_end_fp)(struct tegra_usb_phy *phy);
116
117 struct tegra_usb_phy *tegra_usb_phy_open(int instance, void __iomem *regs,
118                         void *config, enum tegra_usb_phy_mode phy_mode,
119                         enum tegra_usb_phy_type usb_phy_type);
120
121 int tegra_usb_phy_power_on(struct tegra_usb_phy *phy, bool is_dpd);
122
123 void tegra_usb_phy_clk_disable(struct tegra_usb_phy *phy);
124
125 void tegra_usb_phy_clk_enable(struct tegra_usb_phy *phy);
126
127 void tegra_usb_phy_power_off(struct tegra_usb_phy *phy, bool is_dpd);
128
129 void tegra_usb_phy_postsuspend(struct tegra_usb_phy *phy, bool is_dpd);
130
131 void tegra_usb_phy_preresume(struct tegra_usb_phy *phy, bool is_dpd);
132
133 void tegra_usb_phy_postresume(struct tegra_usb_phy *phy, bool is_dpd);
134
135 void tegra_ehci_pre_reset(struct tegra_usb_phy *phy, bool is_dpd);
136
137 void tegra_ehci_post_reset(struct tegra_usb_phy *phy, bool is_dpd);
138
139 void tegra_ehci_phy_restore_start(struct tegra_usb_phy *phy,
140                                  enum tegra_usb_phy_port_speed port_speed);
141
142 void tegra_ehci_phy_restore_end(struct tegra_usb_phy *phy);
143
144 void tegra_usb_phy_close(struct tegra_usb_phy *phy);
145
146 int tegra_usb_phy_bus_connect(struct tegra_usb_phy *phy);
147
148 int tegra_usb_phy_bus_reset(struct tegra_usb_phy *phy);
149
150 int tegra_usb_phy_bus_idle(struct tegra_usb_phy *phy);
151
152 bool tegra_usb_phy_is_device_connected(struct tegra_usb_phy *phy);
153
154 bool tegra_usb_phy_charger_detect(struct tegra_usb_phy *phy);
155
156 int __init tegra_usb_phy_init(struct usb_phy_plat_data *pdata, int size);
157
158 bool tegra_usb_phy_is_remotewake_detected(struct tegra_usb_phy *phy);
159
160 #endif /* __MACH_USB_PHY_H */