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