diff options
Diffstat (limited to 'drivers/phy')
-rw-r--r-- | drivers/phy/phy-sun4i-usb.c | 42 |
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); |