aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/phy
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/phy')
-rw-r--r--drivers/phy/phy-sun4i-usb.c42
1 files changed, 18 insertions, 24 deletions
diff --git a/drivers/phy/phy-sun4i-usb.c b/drivers/phy/phy-sun4i-usb.c
index e6e6c4ba7145..66a87d50512b 100644
--- a/drivers/phy/phy-sun4i-usb.c
+++ b/drivers/phy/phy-sun4i-usb.c
@@ -224,13 +224,8 @@ static int sun4i_usb_phy_probe(struct platform_device *pdev)
224 struct sun4i_usb_phy_data *data; 224 struct sun4i_usb_phy_data *data;
225 struct device *dev = &pdev->dev; 225 struct device *dev = &pdev->dev;
226 struct device_node *np = dev->of_node; 226 struct device_node *np = dev->of_node;
227 void __iomem *pmu = NULL;
228 struct phy_provider *phy_provider; 227 struct phy_provider *phy_provider;
229 struct reset_control *reset;
230 struct regulator *vbus;
231 struct resource *res; 228 struct resource *res;
232 struct phy *phy;
233 char name[16];
234 int i; 229 int i;
235 230
236 data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL); 231 data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
@@ -262,42 +257,41 @@ static int sun4i_usb_phy_probe(struct platform_device *pdev)
262 257
263 /* Skip 0, 0 is the phy for otg which is not yet supported. */ 258 /* Skip 0, 0 is the phy for otg which is not yet supported. */
264 for (i = 1; i < data->num_phys; i++) { 259 for (i = 1; i < data->num_phys; i++) {
260 struct sun4i_usb_phy *phy = data->phys + i;
261 char name[16];
262
265 snprintf(name, sizeof(name), "usb%d_vbus", i); 263 snprintf(name, sizeof(name), "usb%d_vbus", i);
266 vbus = devm_regulator_get_optional(dev, name); 264 phy->vbus = devm_regulator_get_optional(dev, name);
267 if (IS_ERR(vbus)) { 265 if (IS_ERR(phy->vbus)) {
268 if (PTR_ERR(vbus) == -EPROBE_DEFER) 266 if (PTR_ERR(phy->vbus) == -EPROBE_DEFER)
269 return -EPROBE_DEFER; 267 return -EPROBE_DEFER;
270 vbus = NULL; 268 phy->vbus = NULL;
271 } 269 }
272 270
273 snprintf(name, sizeof(name), "usb%d_reset", i); 271 snprintf(name, sizeof(name), "usb%d_reset", i);
274 reset = devm_reset_control_get(dev, name); 272 phy->reset = devm_reset_control_get(dev, name);
275 if (IS_ERR(reset)) { 273 if (IS_ERR(phy->reset)) {
276 dev_err(dev, "failed to get reset %s\n", name); 274 dev_err(dev, "failed to get reset %s\n", name);
277 return PTR_ERR(reset); 275 return PTR_ERR(phy->reset);
278 } 276 }
279 277
280 if (i) { /* No pmu for usbc0 */ 278 if (i) { /* No pmu for usbc0 */
281 snprintf(name, sizeof(name), "pmu%d", i); 279 snprintf(name, sizeof(name), "pmu%d", i);
282 res = platform_get_resource_byname(pdev, 280 res = platform_get_resource_byname(pdev,
283 IORESOURCE_MEM, name); 281 IORESOURCE_MEM, name);
284 pmu = devm_ioremap_resource(dev, res); 282 phy->pmu = devm_ioremap_resource(dev, res);
285 if (IS_ERR(pmu)) 283 if (IS_ERR(phy->pmu))
286 return PTR_ERR(pmu); 284 return PTR_ERR(phy->pmu);
287 } 285 }
288 286
289 phy = devm_phy_create(dev, &sun4i_usb_phy_ops, NULL); 287 phy->phy = devm_phy_create(dev, &sun4i_usb_phy_ops, NULL);
290 if (IS_ERR(phy)) { 288 if (IS_ERR(phy->phy)) {
291 dev_err(dev, "failed to create PHY %d\n", i); 289 dev_err(dev, "failed to create PHY %d\n", i);
292 return PTR_ERR(phy); 290 return PTR_ERR(phy->phy);
293 } 291 }
294 292
295 data->phys[i].phy = phy; 293 phy->index = i;
296 data->phys[i].pmu = pmu; 294 phy_set_drvdata(phy->phy, &data->phys[i]);
297 data->phys[i].vbus = vbus;
298 data->phys[i].reset = reset;
299 data->phys[i].index = i;
300 phy_set_drvdata(phy, &data->phys[i]);
301 } 295 }
302 296
303 dev_set_drvdata(dev, data); 297 dev_set_drvdata(dev, data);