ARM: tegra: usb: disable pmc after disabling vbus
[linux-2.6.git] / arch / arm / mach-tegra / tegra_usb_phy.h
1 /*
2  * arch/arm/mach-tegra/include/mach/tegra_usb_phy.h
3  *
4  * Copyright (c) 2012-2013, NVIDIA CORPORATION.  All rights reserved.
5  *
6  * This software is licensed under the terms of the GNU General Public
7  * License version 2, as published by the Free Software Foundation, and
8  * may be copied, distributed, and modified under those terms.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  */
16
17 #ifndef __MACH_TEGRA_USB_PHY_H
18 #define __MACH_TEGRA_USB_PHY_H
19
20 #include <linux/usb/otg.h>
21
22 /**
23  * defines USB port speeds supported in USB2.0
24  */
25 enum usb_phy_port_speed {
26         USB_PHY_PORT_SPEED_FULL = 0,
27         USB_PHY_PORT_SPEED_LOW,
28         USB_PHY_PORT_SPEED_HIGH,
29         USB_PHY_PORT_SPEED_UNKNOWN,
30 };
31
32 /**
33  * defines structure for oscillator dependent parameters
34  */
35 struct tegra_xtal_freq {
36         int freq;
37         u8 enable_delay;
38         u8 stable_count;
39         u8 active_delay;
40         u16 xtal_freq_count;
41         u16 debounce;
42         u8 pdtrk_count;
43 };
44
45 /**
46  * pre decleration of the usb phy data structure
47  */
48 struct tegra_usb_phy;
49
50 /**
51  * defines function pointers used for differnt phy interfaces
52  */
53 struct tegra_usb_phy_ops {
54         int (*open)(struct tegra_usb_phy *phy);
55         void (*close)(struct tegra_usb_phy *phy);
56         int (*irq)(struct tegra_usb_phy *phy);
57         int (*init)(struct tegra_usb_phy *phy);
58         int (*reset)(struct tegra_usb_phy *phy);
59         int (*pre_suspend)(struct tegra_usb_phy *phy);
60         int (*suspend)(struct tegra_usb_phy *phy);
61         int (*post_suspend)(struct tegra_usb_phy *phy);
62         int (*pre_resume)(struct tegra_usb_phy *phy, bool remote_wakeup);
63         int (*resume)(struct tegra_usb_phy *phy);
64         int (*post_resume)(struct tegra_usb_phy *phy);
65         int (*port_power)(struct tegra_usb_phy *phy);
66         int (*bus_reset)(struct tegra_usb_phy *phy);
67         int (*power_off)(struct tegra_usb_phy *phy);
68         int (*power_on)(struct tegra_usb_phy *phy);
69         bool (*charger_detect)(struct tegra_usb_phy *phy);
70         bool (*nv_charger_detect)(struct tegra_usb_phy *phy);
71         void (*pmc_disable) (struct tegra_usb_phy *phy);
72 };
73
74 /**
75  * defines usb phy data structure
76  */
77 struct tegra_usb_phy {
78         /* Don't move below variable 'phy', from first place*/
79         struct usb_phy phy;
80         struct platform_device *pdev;
81         struct tegra_usb_platform_data *pdata;
82         struct clk *pllu_clk;
83         struct clk *ctrlr_clk;
84         struct clk *ulpi_clk;
85         struct clk *utmi_pad_clk;
86         struct clk *emc_clk;
87         struct clk *sys_clk;
88         struct regulator *vdd_reg;
89         struct regulator *hsic_reg;
90         struct regulator *vbus_reg;
91         struct regulator *pllu_reg;
92         struct tegra_usb_phy_ops *ops;
93         struct tegra_xtal_freq *freq;
94         struct usb_phy *ulpi_vp;
95         enum usb_phy_port_speed port_speed;
96         signed char utmi_xcvr_setup;
97         void __iomem *regs;
98         int inst;
99         bool phy_clk_on;
100         bool ctrl_clk_on;
101         bool vdd_reg_on;
102         bool phy_power_on;
103         bool pmc_remote_wakeup;
104         bool pmc_hotplug_wakeup;
105         bool hw_accessible;
106         bool ulpi_clk_padout_ena;
107         bool pmc_sleepwalk;
108         bool bus_reseting;
109         bool linkphy_init;
110         bool hot_plug;
111         bool ctrlr_suspended;
112 };
113
114 int usb_phy_reg_status_wait(void __iomem *reg, u32 mask,
115                 u32 result, u32 timeout);
116
117 int tegra3_usb_phy_init_ops(struct tegra_usb_phy *phy);
118 int tegra2_usb_phy_init_ops(struct tegra_usb_phy *phy);
119 int tegra11x_usb_phy_init_ops(struct tegra_usb_phy *phy);
120
121
122 #endif /* __MACH_TEGRA_USB_PHY_H */