Source
12
12
#include <errno.h>
13
13
#include <generic-phy.h>
14
14
#include <regmap.h>
15
15
#include <syscon.h>
16
16
17
17
#define OMAP_USB2_CALIBRATE_FALSE_DISCONNECT BIT(0)
18
18
19
19
#define OMAP_DEV_PHY_PD BIT(0)
20
20
#define OMAP_USB2_PHY_PD BIT(28)
21
21
22
+
#define AM437X_USB2_PHY_PD BIT(0)
23
+
#define AM437X_USB2_OTG_PD BIT(1)
24
+
#define AM437X_USB2_OTGVDET_EN BIT(19)
25
+
#define AM437X_USB2_OTGSESSEND_EN BIT(20)
26
+
22
27
#define USB2PHY_DISCON_BYP_LATCH BIT(31)
23
28
#define USB2PHY_ANA_CONFIG1 (0x4c)
24
29
25
30
DECLARE_GLOBAL_DATA_PTR;
26
31
27
32
struct omap_usb2_phy {
28
33
struct regmap *pwr_regmap;
29
34
ulong flags;
30
35
void *phy_base;
31
36
u32 pwr_reg_offset;
53
58
.power_off = OMAP_DEV_PHY_PD,
54
59
};
55
60
56
61
static const struct usb_phy_data dra7x_usb2_phy2_data = {
57
62
.label = "dra7x_usb2_phy2",
58
63
.flags = OMAP_USB2_CALIBRATE_FALSE_DISCONNECT,
59
64
.mask = OMAP_USB2_PHY_PD,
60
65
.power_off = OMAP_USB2_PHY_PD,
61
66
};
62
67
68
+
static const struct usb_phy_data am437x_usb2_data = {
69
+
.label = "am437x_usb2",
70
+
.flags = 0,
71
+
.mask = AM437X_USB2_PHY_PD | AM437X_USB2_OTG_PD |
72
+
AM437X_USB2_OTGVDET_EN | AM437X_USB2_OTGSESSEND_EN,
73
+
.power_on = AM437X_USB2_OTGVDET_EN | AM437X_USB2_OTGSESSEND_EN,
74
+
.power_off = AM437X_USB2_PHY_PD | AM437X_USB2_OTG_PD,
75
+
};
76
+
63
77
static const struct udevice_id omap_usb2_id_table[] = {
64
78
{
65
79
.compatible = "ti,omap5-usb2",
66
80
.data = (ulong)&omap5_usb2_data,
67
81
},
68
82
{
69
83
.compatible = "ti,dra7x-usb2",
70
84
.data = (ulong)&dra7x_usb2_data,
71
85
},
72
86
{
73
87
.compatible = "ti,dra7x-usb2-phy2",
74
88
.data = (ulong)&dra7x_usb2_phy2_data,
75
89
},
90
+
{
91
+
.compatible = "ti,am437x-usb2",
92
+
.data = (ulong)&am437x_usb2_data,
93
+
},
76
94
{},
77
95
};
78
96
79
97
static int omap_usb_phy_power(struct phy *usb_phy, bool on)
80
98
{
81
99
struct udevice *dev = usb_phy->dev;
82
100
const struct usb_phy_data *data;
83
101
const struct omap_usb2_phy *phy = dev_get_priv(dev);
84
102
u32 val;
85
103
int rc;
163
181
if (data->flags & OMAP_USB2_CALIBRATE_FALSE_DISCONNECT) {
164
182
u32 base = dev_read_addr(dev);
165
183
166
184
if (base == FDT_ADDR_T_NONE)
167
185
return -EINVAL;
168
186
priv->phy_base = (void *)base;
169
187
priv->flags |= OMAP_USB2_CALIBRATE_FALSE_DISCONNECT;
170
188
}
171
189
172
190
regmap = syscon_regmap_lookup_by_phandle(dev, "syscon-phy-power");
173
-
if (IS_ERR(regmap)) {
174
-
printf("can't get regmap (err %ld)\n", PTR_ERR(regmap));
175
-
return PTR_ERR(regmap);
191
+
if (!IS_ERR(regmap)) {
192
+
priv->pwr_regmap = regmap;
193
+
rc = dev_read_u32_array(dev, "syscon-phy-power", tmp, 2);
194
+
if (rc) {
195
+
printf("couldn't get power reg. offset (err %d)\n", rc);
196
+
return rc;
197
+
}
198
+
priv->pwr_reg_offset = tmp[1];
199
+
return 0;
176
200
}
177
-
priv->pwr_regmap = regmap;
178
-
179
-
rc = dev_read_u32_array(dev, "syscon-phy-power", tmp, 2);
180
-
if (rc) {
181
-
printf("couldn't get power reg. offset (err %d)\n", rc);
182
-
return rc;
201
+
regmap = syscon_regmap_lookup_by_phandle(dev, "ctrl-module");
202
+
if (!IS_ERR(regmap)) {
203
+
priv->pwr_regmap = regmap;
204
+
priv->pwr_reg_offset = 0;
205
+
return 0;
183
206
}
184
-
priv->pwr_reg_offset = tmp[1];
185
207
186
-
return 0;
208
+
printf("can't get regmap (err %ld)\n", PTR_ERR(regmap));
209
+
return PTR_ERR(regmap);
187
210
}
188
211
189
212
U_BOOT_DRIVER(omap_usb2_phy) = {
190
213
.name = "omap_usb2_phy",
191
214
.id = UCLASS_PHY,
192
215
.of_match = omap_usb2_id_table,
193
216
.probe = omap_usb2_phy_probe,
194
217
.ops = &omap_usb2_phy_ops,
195
218
.priv_auto_alloc_size = sizeof(struct omap_usb2_phy),
196
219
};