summaryrefslogtreecommitdiff
path: root/arch/arm/mach-tegra/tegra_usb_phy.h
blob: ff3b979fe814d3bcd64c0a9e0a4ef51995032481 (plain)
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 */